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