1 /*====================================================================*
2 - Copyright (C) 2001 Leptonica. All rights reserved.
3 -
4 - Redistribution and use in source and binary forms, with or without
5 - modification, are permitted provided that the following conditions
6 - are met:
7 - 1. Redistributions of source code must retain the above copyright
8 - notice, this list of conditions and the following disclaimer.
9 - 2. Redistributions in binary form must reproduce the above
10 - copyright notice, this list of conditions and the following
11 - disclaimer in the documentation and/or other materials
12 - provided with the distribution.
13 -
14 - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
15 - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
16 - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
17 - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY
18 - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19 - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21 - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22 - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
23 - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24 - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 *====================================================================*/
26
27
28 /*
29 * blend3_reg.c
30 *
31 * 42 results: 6 input image combinations * 7 blendings
32 */
33
34 #include "allheaders.h"
35
36 #define X 140
37 #define Y 40
38 #define ALL 1
39
40 static PIX *BlendTest(const char *file1, const char *file2, l_float32 fract);
41
main(int argc,char ** argv)42 int main(int argc,
43 char **argv)
44 {
45 PIX *pixt, *pixd;
46 PIXA *pixa;
47 L_REGPARAMS *rp;
48
49 if (regTestSetup(argc, argv, &rp))
50 return 1;
51
52 pixa = pixaCreate(6);
53
54 pixt = BlendTest("marge.jpg", "feyn-word.tif", 0.5);
55 pixaAddPix(pixa, pixt, L_INSERT);
56 regTestWritePixAndCheck(rp, pixt, IFF_JFIF_JPEG); /* 0 */
57 pixDisplayWithTitle(pixt, 0, 0, NULL, rp->display);
58
59 pixt = BlendTest("marge.jpg", "weasel8.png", 0.3);
60 pixaAddPix(pixa, pixt, L_INSERT);
61 regTestWritePixAndCheck(rp, pixt, IFF_JFIF_JPEG); /* 1 */
62 pixDisplayWithTitle(pixt, 0, 200, NULL, rp->display);
63
64 pixt = BlendTest("marge.jpg", "weasel8.240c.png", 0.3);
65 pixaAddPix(pixa, pixt, L_INSERT);
66 regTestWritePixAndCheck(rp, pixt, IFF_JFIF_JPEG); /* 2 */
67 pixDisplayWithTitle(pixt, 0, 400, NULL, rp->display);
68
69 pixt = BlendTest("test8.jpg", "feyn-word.tif", 0.5);
70 pixaAddPix(pixa, pixt, L_INSERT);
71 regTestWritePixAndCheck(rp, pixt, IFF_JFIF_JPEG); /* 3 */
72 pixDisplayWithTitle(pixt, 0, 600, NULL, rp->display);
73
74 pixt = BlendTest("test8.jpg", "weasel8.png", 0.5);
75 pixaAddPix(pixa, pixt, L_INSERT);
76 regTestWritePixAndCheck(rp, pixt, IFF_JFIF_JPEG); /* 4 */
77 pixDisplayWithTitle(pixt, 0, 800, NULL, rp->display);
78
79 pixt = BlendTest("test8.jpg", "weasel8.240c.png", 0.6);
80 pixaAddPix(pixa, pixt, L_INSERT);
81 regTestWritePixAndCheck(rp, pixt, IFF_JFIF_JPEG); /* 5 */
82 pixDisplayWithTitle(pixt, 0, 1000, NULL, rp->display);
83
84 pixd = pixaDisplayTiledInRows(pixa, 32, 1800, 1.0, 0, 20, 2);
85 pixWrite("/tmp/lept/regout/blendall.jpg", pixd, IFF_JFIF_JPEG);
86 pixaDestroy(&pixa);
87 pixDestroy(&pixd);
88
89 return regTestCleanup(rp);
90 }
91
92
93 static PIX *
BlendTest(const char * file1,const char * file2,l_float32 fract)94 BlendTest(const char *file1,
95 const char *file2,
96 l_float32 fract)
97 {
98 l_int32 d1, d2;
99 PIX *pixs1, *pixs2, *pix1, *pix2, *pix3, *pix4, *pix5, *pixd;
100 PIXA *pixa;
101
102 pixs1 = pixRead(file1);
103 pixs2 = pixRead(file2);
104 d1 = pixGetDepth(pixs1);
105 d2 = pixGetDepth(pixs2);
106 pixa = pixaCreate(7);
107
108 #if ALL
109 if (d1 == 1) {
110 pix1 = pixBlend(pixs1, pixs2, X, Y, fract);
111 pix2 = pixBlend(pix1, pixs2, X, Y + 60, fract);
112 pix3 = pixBlend(pix2, pixs2, X, Y + 120, fract);
113 pix4 = pixBlend(pix3, pixs2, X, Y + 180, fract);
114 pix5 = pixBlend(pix4, pixs2, X, Y + 240, fract);
115 pixd = pixBlend(pix5, pixs2, X, Y + 300, fract);
116 pixDestroy(&pix1);
117 pixDestroy(&pix2);
118 pixDestroy(&pix3);
119 pixDestroy(&pix4);
120 pixDestroy(&pix5);
121 } else {
122 pix1 = pixBlend(pixs1, pixs2, X, Y, fract);
123 pix2 = pixBlend(pix1, pixs2, X + 80, Y + 80, fract);
124 pix3 = pixBlend(pix2, pixs2, X + 160, Y + 160, fract);
125 pix4 = pixBlend(pix3, pixs2, X + 240, Y + 240, fract);
126 pix5 = pixBlend(pix4, pixs2, X + 320, Y + 320, fract);
127 pixd = pixBlend(pix5, pixs2, X + 360, Y + 360, fract);
128 pixDestroy(&pix1);
129 pixDestroy(&pix2);
130 pixDestroy(&pix3);
131 pixDestroy(&pix4);
132 pixDestroy(&pix5);
133 }
134 pixaAddPix(pixa, pixd, L_INSERT);
135 #endif
136
137 #if ALL
138 /* Gray blend */
139 if (d2 >= 8)
140 pixSnapColor(pixs2, pixs2, 0xff, 0xff, 50);
141 pixd = pixBlendGray(NULL, pixs1, pixs2, 200, 100, fract,
142 L_BLEND_GRAY, 1, 0xff);
143 pixBlendGray(pixd, pixd, pixs2, 200, 200, fract,
144 L_BLEND_GRAY, 1, 0xff);
145 pixBlendGray(pixd, pixd, pixs2, 200, 260, fract,
146 L_BLEND_GRAY, 1, 0xff);
147 pixBlendGray(pixd, pixd, pixs2, 200, 340, fract,
148 L_BLEND_GRAY, 1, 0xff);
149 pixaAddPix(pixa, pixd, L_INSERT);
150 #endif
151
152 #if ALL /* Gray blend (with inverse) */
153 if (d2 >= 8)
154 pixSnapColor(pixs2, pixs2, 0xff, 0xff, 50);
155 pixd = pixBlendGray(NULL, pixs1, pixs2, 200, 100, fract,
156 L_BLEND_GRAY_WITH_INVERSE, 1, 0xff);
157 pixBlendGray(pixd, pixd, pixs2, 200, 200, fract,
158 L_BLEND_GRAY_WITH_INVERSE, 1, 0xff);
159 pixBlendGray(pixd, pixd, pixs2, 200, 260, fract,
160 L_BLEND_GRAY_WITH_INVERSE, 1, 0xff);
161 pixBlendGray(pixd, pixd, pixs2, 200, 340, fract,
162 L_BLEND_GRAY_WITH_INVERSE, 1, 0xff);
163 pixaAddPix(pixa, pixd, L_INSERT);
164 #endif
165
166 #if ALL /* Blend Gray for robustness */
167 if (d2 >= 8)
168 pixSnapColor(pixs2, pixs2, 0xff, 0xff, 50);
169 pixd = pixBlendGrayInverse(NULL, pixs1, pixs2, 200, 100, fract);
170 pixBlendGrayInverse(pixd, pixd, pixs2, 200, 200, fract);
171 pixBlendGrayInverse(pixd, pixd, pixs2, 200, 260, fract);
172 pixBlendGrayInverse(pixd, pixd, pixs2, 200, 340, fract);
173 pixaAddPix(pixa, pixd, L_INSERT);
174 #endif
175
176 #if ALL /* Blend Gray adapted */
177 if (d2 >= 8)
178 pixSnapColor(pixs2, pixs2, 0xff, 0xff, 50);
179 pixd = pixBlendGrayAdapt(NULL, pixs1, pixs2, 200, 100, fract, 120);
180 pixBlendGrayAdapt(pixd, pixd, pixs2, 200, 200, fract, 120);
181 pixBlendGrayAdapt(pixd, pixd, pixs2, 200, 260, fract, 120);
182 pixBlendGrayAdapt(pixd, pixd, pixs2, 200, 340, fract, 120);
183 pixaAddPix(pixa, pixd, L_INSERT);
184 #endif
185
186 #if ALL /* Blend color */
187 if (d2 >= 8)
188 pixSnapColor(pixs2, pixs2, 0xffffff00, 0xffffff00, 50);
189 pixd = pixBlendColor(NULL, pixs1, pixs2, 200, 100, fract, 1, 0xffffff00);
190 pixBlendColor(pixd, pixd, pixs2, 200, 200, fract, 1, 0xffffff00);
191 pixBlendColor(pixd, pixd, pixs2, 200, 260, fract, 1, 0xffffff00);
192 pixBlendColor(pixd, pixd, pixs2, 200, 340, fract, 1, 0xffffff00);
193 pixaAddPix(pixa, pixd, L_INSERT);
194 #endif
195
196 #if ALL /* Blend color by channel */
197 if (d2 >= 8)
198 pixSnapColor(pixs2, pixs2, 0xffffff00, 0xffffff00, 50);
199 pixd = pixBlendColorByChannel(NULL, pixs1, pixs2, 200, 100, 1.6 * fract,
200 fract, 0.5 * fract, 1, 0xffffff00);
201 pixBlendColorByChannel(pixd, pixd, pixs2, 200, 200, 1.2 * fract,
202 fract, 0.2 * fract, 1, 0xffffff00);
203 pixBlendColorByChannel(pixd, pixd, pixs2, 200, 260, 1.6 * fract,
204 1.8 * fract, 0.3 * fract, 1, 0xffffff00);
205 pixBlendColorByChannel(pixd, pixd, pixs2, 200, 340, 0.4 * fract,
206 1.3 * fract, 1.8 * fract, 1, 0xffffff00);
207 pixaAddPix(pixa, pixd, L_INSERT);
208 #endif
209
210 pixd = pixaDisplayTiledInRows(pixa, 32, 2500, 0.5, 0, 20, 2);
211 pixaDestroy(&pixa);
212 pixDestroy(&pixs1);
213 pixDestroy(&pixs2);
214 return pixd;
215 }
216
217