1 //ref: http://vba-rerecording.googlecode.com/svn/trunk/src/2xsai.cpp
2 
3 typedef unsigned char u8;
4 typedef unsigned short u16;
5 typedef unsigned int u32;
6 typedef int s32;
7 
8 static u32 colorMask = 0xF7DEF7DE;
9 static u32 lowPixelMask = 0x08210821;
10 static u32 qcolorMask = 0xE79CE79C;
11 static u32 qlowpixelMask = 0x18631863;
12 static u32 redblueMask = 0xF81F;
13 static u32 greenMask = 0x7E0;
14 
Init_2xSaI(u32 BitFormat,u32 systemColorDepth)15 int Init_2xSaI(u32 BitFormat, u32 systemColorDepth)
16 {
17   if(systemColorDepth == 16) {
18     if (BitFormat == 565) {
19       colorMask = 0xF7DEF7DE;
20       lowPixelMask = 0x08210821;
21       qcolorMask = 0xE79CE79C;
22       qlowpixelMask = 0x18631863;
23       redblueMask = 0xF81F;
24       greenMask = 0x7E0;
25     } else if (BitFormat == 555) {
26       colorMask = 0x7BDE7BDE;
27       lowPixelMask = 0x04210421;
28       qcolorMask = 0x739C739C;
29       qlowpixelMask = 0x0C630C63;
30       redblueMask = 0x7C1F;
31       greenMask = 0x3E0;
32     } else {
33       return 0;
34     }
35   } else if(systemColorDepth == 32) {
36     colorMask = 0xfefefe;
37     lowPixelMask = 0x010101;
38     qcolorMask = 0xfcfcfc;
39     qlowpixelMask = 0x030303;
40   } else
41     return 0;
42 
43   return 1;
44 }
45 
GetResult1(u32 A,u32 B,u32 C,u32 D,u32)46 static inline int GetResult1 (u32 A, u32 B, u32 C, u32 D,
47                               u32 /* E */)
48 {
49     int x = 0;
50     int y = 0;
51     int r = 0;
52 
53     if (A == C)
54       x += 1;
55     else if (B == C)
56       y += 1;
57     if (A == D)
58       x += 1;
59     else if (B == D)
60       y += 1;
61     if (x <= 1)
62       r += 1;
63     if (y <= 1)
64       r -= 1;
65     return r;
66 }
67 
GetResult2(u32 A,u32 B,u32 C,u32 D,u32)68 static inline int GetResult2 (u32 A, u32 B, u32 C, u32 D,
69                               u32 /* E */)
70 {
71   int x = 0;
72   int y = 0;
73   int r = 0;
74 
75   if (A == C)
76     x += 1;
77   else if (B == C)
78     y += 1;
79   if (A == D)
80     x += 1;
81   else if (B == D)
82     y += 1;
83   if (x <= 1)
84     r -= 1;
85   if (y <= 1)
86     r += 1;
87   return r;
88 }
89 
GetResult(u32 A,u32 B,u32 C,u32 D)90 static inline int GetResult (u32 A, u32 B, u32 C, u32 D)
91 {
92   int x = 0;
93   int y = 0;
94   int r = 0;
95 
96   if (A == C)
97     x += 1;
98   else if (B == C)
99     y += 1;
100   if (A == D)
101     x += 1;
102   else if (B == D)
103     y += 1;
104   if (x <= 1)
105     r += 1;
106   if (y <= 1)
107     r -= 1;
108   return r;
109 }
110 
INTERPOLATE(u32 A,u32 B)111 static inline u32 INTERPOLATE (u32 A, u32 B)
112 {
113   if (A != B) {
114     return (((A & colorMask) >> 1) + ((B & colorMask) >> 1) +
115             (A & B & lowPixelMask));
116   } else
117     return A;
118 }
119 
Q_INTERPOLATE(u32 A,u32 B,u32 C,u32 D)120 static inline u32 Q_INTERPOLATE (u32 A, u32 B, u32 C, u32 D)
121 {
122   register u32 x = ((A & qcolorMask) >> 2) +
123     ((B & qcolorMask) >> 2) +
124     ((C & qcolorMask) >> 2) + ((D & qcolorMask) >> 2);
125   register u32 y = (A & qlowpixelMask) +
126     (B & qlowpixelMask) + (C & qlowpixelMask) + (D & qlowpixelMask);
127 
128   y = (y >> 2) & qlowpixelMask;
129   return x + y;
130 }
131 
GetResult1_32(u32 A,u32 B,u32 C,u32 D,u32)132 static inline int GetResult1_32 (u32 A, u32 B, u32 C, u32 D,
133                                  u32 /* E */)
134 {
135     int x = 0;
136     int y = 0;
137     int r = 0;
138 
139     if (A == C)
140       x += 1;
141     else if (B == C)
142       y += 1;
143     if (A == D)
144       x += 1;
145     else if (B == D)
146       y += 1;
147     if (x <= 1)
148       r += 1;
149     if (y <= 1)
150       r -= 1;
151     return r;
152 }
153 
GetResult2_32(u32 A,u32 B,u32 C,u32 D,u32)154 static inline int GetResult2_32 (u32 A, u32 B, u32 C, u32 D,
155                                  u32 /* E */)
156 {
157   int x = 0;
158   int y = 0;
159   int r = 0;
160 
161   if (A == C)
162     x += 1;
163   else if (B == C)
164     y += 1;
165   if (A == D)
166     x += 1;
167   else if (B == D)
168     y += 1;
169   if (x <= 1)
170     r -= 1;
171   if (y <= 1)
172     r += 1;
173   return r;
174 }
175 
176 #define BLUE_MASK565 0x001F001F
177 #define RED_MASK565 0xF800F800
178 #define GREEN_MASK565 0x07E007E0
179 
180 #define BLUE_MASK555 0x001F001F
181 #define RED_MASK555 0x7C007C00
182 #define GREEN_MASK555 0x03E003E0
183 
Super2xSaI(u8 * srcPtr,u32 srcPitch,u8 * deltaPtr,u8 * dstPtr,u32 dstPitch,int width,int height)184 void Super2xSaI (u8 *srcPtr, u32 srcPitch,
185                  u8 *deltaPtr, u8 *dstPtr, u32 dstPitch,
186                  int width, int height)
187 {
188   u16 *bP;
189   u8  *dP;
190   u32 inc_bP;
191   u32 Nextline = srcPitch >> 1;
192 
193     {
194       inc_bP = 1;
195 
196       for (; height; height--) {
197         bP = (u16 *) srcPtr;
198         dP = (u8 *) dstPtr;
199 
200         for (u32 finish = width; finish; finish -= inc_bP) {
201           u32 color4, color5, color6;
202           u32 color1, color2, color3;
203           u32 colorA0, colorA1, colorA2, colorA3,
204             colorB0, colorB1, colorB2, colorB3, colorS1, colorS2;
205           u32 product1a, product1b, product2a, product2b;
206 
207           //---------------------------------------    B1 B2
208           //                                         4  5  6 S2
209           //                                         1  2  3 S1
210           //                                           A1 A2
211 
212           colorB0 = *(bP - Nextline - 1);
213           colorB1 = *(bP - Nextline);
214           colorB2 = *(bP - Nextline + 1);
215           colorB3 = *(bP - Nextline + 2);
216 
217           color4 = *(bP - 1);
218           color5 = *(bP);
219           color6 = *(bP + 1);
220           colorS2 = *(bP + 2);
221 
222           color1 = *(bP + Nextline - 1);
223           color2 = *(bP + Nextline);
224           color3 = *(bP + Nextline + 1);
225           colorS1 = *(bP + Nextline + 2);
226 
227           colorA0 = *(bP + Nextline + Nextline - 1);
228           colorA1 = *(bP + Nextline + Nextline);
229           colorA2 = *(bP + Nextline + Nextline + 1);
230           colorA3 = *(bP + Nextline + Nextline + 2);
231 
232           //--------------------------------------
233           if (color2 == color6 && color5 != color3) {
234             product2b = product1b = color2;
235           } else if (color5 == color3 && color2 != color6) {
236             product2b = product1b = color5;
237           } else if (color5 == color3 && color2 == color6) {
238             register int r = 0;
239 
240             r += GetResult (color6, color5, color1, colorA1);
241             r += GetResult (color6, color5, color4, colorB1);
242             r += GetResult (color6, color5, colorA2, colorS1);
243             r += GetResult (color6, color5, colorB2, colorS2);
244 
245             if (r > 0)
246               product2b = product1b = color6;
247             else if (r < 0)
248               product2b = product1b = color5;
249             else {
250               product2b = product1b = INTERPOLATE (color5, color6);
251             }
252           } else {
253             if (color6 == color3 && color3 == colorA1
254                 && color2 != colorA2 && color3 != colorA0)
255               product2b =
256                 Q_INTERPOLATE (color3, color3, color3, color2);
257             else if (color5 == color2 && color2 == colorA2
258                      && colorA1 != color3 && color2 != colorA3)
259               product2b =
260                 Q_INTERPOLATE (color2, color2, color2, color3);
261             else
262               product2b = INTERPOLATE (color2, color3);
263 
264             if (color6 == color3 && color6 == colorB1
265                 && color5 != colorB2 && color6 != colorB0)
266               product1b =
267                 Q_INTERPOLATE (color6, color6, color6, color5);
268             else if (color5 == color2 && color5 == colorB2
269                      && colorB1 != color6 && color5 != colorB3)
270               product1b =
271                 Q_INTERPOLATE (color6, color5, color5, color5);
272             else
273               product1b = INTERPOLATE (color5, color6);
274           }
275 
276           if (color5 == color3 && color2 != color6 && color4 == color5
277               && color5 != colorA2)
278             product2a = INTERPOLATE (color2, color5);
279           else
280             if (color5 == color1 && color6 == color5
281                 && color4 != color2 && color5 != colorA0)
282               product2a = INTERPOLATE (color2, color5);
283             else
284               product2a = color2;
285 
286           if (color2 == color6 && color5 != color3 && color1 == color2
287               && color2 != colorB2)
288             product1a = INTERPOLATE (color2, color5);
289           else
290             if (color4 == color2 && color3 == color2
291                 && color1 != color5 && color2 != colorB0)
292               product1a = INTERPOLATE (color2, color5);
293             else
294               product1a = color5;
295 
296 #ifdef WORDS_BIGENDIAN
297           product1a = (product1a << 16) | product1b;
298           product2a = (product2a << 16) | product2b;
299 #else
300           product1a = product1a | (product1b << 16);
301           product2a = product2a | (product2b << 16);
302 #endif
303 
304           *((u32 *) dP) = product1a;
305           *((u32 *) (dP + dstPitch)) = product2a;
306 
307           bP += inc_bP;
308           dP += sizeof (u32);
309         }                       // end of for ( finish= width etc..)
310 
311         srcPtr   += srcPitch;
312         dstPtr   += dstPitch << 1;
313         deltaPtr += srcPitch;
314       }                 // endof: for (; height; height--)
315     }
316 }
317 
Super2xSaI32(u8 * srcPtr,u32 srcPitch,u8 *,u8 * dstPtr,u32 dstPitch,int width,int height)318 void Super2xSaI32 (u8 *srcPtr, u32 srcPitch,
319                    u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch,
320                    int width, int height)
321 {
322   u32 *bP;
323   u32 *dP;
324   u32 inc_bP;
325   u32 Nextline = srcPitch >> 2;
326   inc_bP = 1;
327 
328   for (; height; height--) {
329     bP = (u32 *) srcPtr;
330     dP = (u32 *) dstPtr;
331 
332     for (u32 finish = width; finish; finish -= inc_bP) {
333       u32 color4, color5, color6;
334       u32 color1, color2, color3;
335       u32 colorA0, colorA1, colorA2, colorA3,
336         colorB0, colorB1, colorB2, colorB3, colorS1, colorS2;
337       u32 product1a, product1b, product2a, product2b;
338 
339       //---------------------------------------    B1 B2
340       //                                         4  5  6 S2
341       //                                         1  2  3 S1
342       //                                           A1 A2
343 
344       colorB0 = *(bP - Nextline - 1);
345       colorB1 = *(bP - Nextline);
346       colorB2 = *(bP - Nextline + 1);
347       colorB3 = *(bP - Nextline + 2);
348 
349       color4 = *(bP - 1);
350       color5 = *(bP);
351       color6 = *(bP + 1);
352       colorS2 = *(bP + 2);
353 
354       color1 = *(bP + Nextline - 1);
355       color2 = *(bP + Nextline);
356       color3 = *(bP + Nextline + 1);
357       colorS1 = *(bP + Nextline + 2);
358 
359       colorA0 = *(bP + Nextline + Nextline - 1);
360       colorA1 = *(bP + Nextline + Nextline);
361       colorA2 = *(bP + Nextline + Nextline + 1);
362       colorA3 = *(bP + Nextline + Nextline + 2);
363 
364       //--------------------------------------
365       if (color2 == color6 && color5 != color3) {
366         product2b = product1b = color2;
367       } else if (color5 == color3 && color2 != color6) {
368         product2b = product1b = color5;
369       } else if (color5 == color3 && color2 == color6) {
370         register int r = 0;
371 
372         r += GetResult (color6, color5, color1, colorA1);
373         r += GetResult (color6, color5, color4, colorB1);
374         r += GetResult (color6, color5, colorA2, colorS1);
375         r += GetResult (color6, color5, colorB2, colorS2);
376 
377         if (r > 0)
378           product2b = product1b = color6;
379         else if (r < 0)
380           product2b = product1b = color5;
381         else {
382           product2b = product1b = INTERPOLATE (color5, color6);
383         }
384       } else {
385         if (color6 == color3 && color3 == colorA1
386             && color2 != colorA2 && color3 != colorA0)
387           product2b =
388             Q_INTERPOLATE (color3, color3, color3, color2);
389         else if (color5 == color2 && color2 == colorA2
390                  && colorA1 != color3 && color2 != colorA3)
391           product2b =
392             Q_INTERPOLATE (color2, color2, color2, color3);
393         else
394           product2b = INTERPOLATE (color2, color3);
395 
396         if (color6 == color3 && color6 == colorB1
397             && color5 != colorB2 && color6 != colorB0)
398           product1b =
399             Q_INTERPOLATE (color6, color6, color6, color5);
400         else if (color5 == color2 && color5 == colorB2
401                  && colorB1 != color6 && color5 != colorB3)
402           product1b =
403             Q_INTERPOLATE (color6, color5, color5, color5);
404         else
405           product1b = INTERPOLATE (color5, color6);
406       }
407 
408       if (color5 == color3 && color2 != color6 && color4 == color5
409           && color5 != colorA2)
410         product2a = INTERPOLATE (color2, color5);
411       else
412         if (color5 == color1 && color6 == color5
413             && color4 != color2 && color5 != colorA0)
414           product2a = INTERPOLATE (color2, color5);
415         else
416           product2a = color2;
417 
418       if (color2 == color6 && color5 != color3 && color1 == color2
419           && color2 != colorB2)
420         product1a = INTERPOLATE (color2, color5);
421       else
422         if (color4 == color2 && color3 == color2
423             && color1 != color5 && color2 != colorB0)
424           product1a = INTERPOLATE (color2, color5);
425         else
426           product1a = color5;
427       *(dP) = product1a;
428       *(dP+1) = product1b;
429       *(dP + (dstPitch >> 2)) = product2a;
430       *(dP + (dstPitch >> 2) + 1) = product2b;
431 
432       bP += inc_bP;
433       dP += 2;
434     }                       // end of for ( finish= width etc..)
435 
436     srcPtr   += srcPitch;
437     dstPtr   += dstPitch << 1;
438     //        deltaPtr += srcPitch;
439   }                 // endof: for (; height; height--)
440 }
441 
SuperEagle(u8 * srcPtr,u32 srcPitch,u8 * deltaPtr,u8 * dstPtr,u32 dstPitch,int width,int height)442 void SuperEagle (u8 *srcPtr, u32 srcPitch, u8 *deltaPtr,
443                  u8 *dstPtr, u32 dstPitch, int width, int height)
444 {
445   u8  *dP;
446   u16 *bP;
447   u16 *xP;
448   u32 inc_bP;
449 
450   {
451     inc_bP = 1;
452 
453     u32 Nextline = srcPitch >> 1;
454 
455     for (; height; height--) {
456       bP = (u16 *) srcPtr;
457       xP = (u16 *) deltaPtr;
458       dP = dstPtr;
459       for (u32 finish = width; finish; finish -= inc_bP) {
460         u32 color4, color5, color6;
461         u32 color1, color2, color3;
462         u32 colorA1, colorA2, colorB1, colorB2, colorS1, colorS2;
463         u32 product1a, product1b, product2a, product2b;
464 
465         colorB1 = *(bP - Nextline);
466         colorB2 = *(bP - Nextline + 1);
467 
468         color4 = *(bP - 1);
469         color5 = *(bP);
470         color6 = *(bP + 1);
471         colorS2 = *(bP + 2);
472 
473         color1 = *(bP + Nextline - 1);
474         color2 = *(bP + Nextline);
475         color3 = *(bP + Nextline + 1);
476         colorS1 = *(bP + Nextline + 2);
477 
478         colorA1 = *(bP + Nextline + Nextline);
479         colorA2 = *(bP + Nextline + Nextline + 1);
480 
481         // --------------------------------------
482         if (color2 == color6 && color5 != color3) {
483           product1b = product2a = color2;
484           if ((color1 == color2) || (color6 == colorB2)) {
485             product1a = INTERPOLATE (color2, color5);
486             product1a = INTERPOLATE (color2, product1a);
487             //                       product1a = color2;
488           } else {
489             product1a = INTERPOLATE (color5, color6);
490           }
491 
492           if ((color6 == colorS2) || (color2 == colorA1)) {
493             product2b = INTERPOLATE (color2, color3);
494             product2b = INTERPOLATE (color2, product2b);
495             //                       product2b = color2;
496           } else {
497             product2b = INTERPOLATE (color2, color3);
498           }
499         } else if (color5 == color3 && color2 != color6) {
500           product2b = product1a = color5;
501 
502           if ((colorB1 == color5) || (color3 == colorS1)) {
503             product1b = INTERPOLATE (color5, color6);
504             product1b = INTERPOLATE (color5, product1b);
505             //                       product1b = color5;
506           } else {
507             product1b = INTERPOLATE (color5, color6);
508           }
509 
510           if ((color3 == colorA2) || (color4 == color5)) {
511             product2a = INTERPOLATE (color5, color2);
512             product2a = INTERPOLATE (color5, product2a);
513             //                       product2a = color5;
514           } else {
515             product2a = INTERPOLATE (color2, color3);
516           }
517 
518         } else if (color5 == color3 && color2 == color6) {
519           register int r = 0;
520 
521           r += GetResult (color6, color5, color1, colorA1);
522           r += GetResult (color6, color5, color4, colorB1);
523           r += GetResult (color6, color5, colorA2, colorS1);
524           r += GetResult (color6, color5, colorB2, colorS2);
525 
526           if (r > 0) {
527             product1b = product2a = color2;
528             product1a = product2b = INTERPOLATE (color5, color6);
529           } else if (r < 0) {
530             product2b = product1a = color5;
531             product1b = product2a = INTERPOLATE (color5, color6);
532           } else {
533             product2b = product1a = color5;
534             product1b = product2a = color2;
535           }
536         } else {
537           product2b = product1a = INTERPOLATE (color2, color6);
538           product2b =
539             Q_INTERPOLATE (color3, color3, color3, product2b);
540           product1a =
541             Q_INTERPOLATE (color5, color5, color5, product1a);
542 
543           product2a = product1b = INTERPOLATE (color5, color3);
544           product2a =
545             Q_INTERPOLATE (color2, color2, color2, product2a);
546           product1b =
547             Q_INTERPOLATE (color6, color6, color6, product1b);
548 
549           //                    product1a = color5;
550           //                    product1b = color6;
551           //                    product2a = color2;
552           //                    product2b = color3;
553         }
554 #ifdef WORDS_BIGENDIAN
555         product1a = (product1a << 16) | product1b;
556         product2a = (product2a << 16) | product2b;
557 #else
558         product1a = product1a | (product1b << 16);
559         product2a = product2a | (product2b << 16);
560 #endif
561 
562         *((u32 *) dP) = product1a;
563         *((u32 *) (dP + dstPitch)) = product2a;
564         *xP = color5;
565 
566         bP += inc_bP;
567         xP += inc_bP;
568         dP += sizeof (u32);
569       }                 // end of for ( finish= width etc..)
570 
571       srcPtr += srcPitch;
572       dstPtr += dstPitch << 1;
573       deltaPtr += srcPitch;
574     }                   // endof: for (height; height; height--)
575   }
576 }
577 
SuperEagle32(u8 * srcPtr,u32 srcPitch,u8 *,u8 * dstPtr,u32 dstPitch,int width,int height)578 void SuperEagle32 (u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */,
579                    u8 *dstPtr, u32 dstPitch, int width, int height)
580 {
581   u32  *dP;
582   u32 *bP;
583 //  u32 *xP;
584   u32 inc_bP;
585 
586   inc_bP = 1;
587 
588   u32 Nextline = srcPitch >> 2;
589 
590   for (; height; height--) {
591     bP = (u32 *) srcPtr;
592 //    xP = (u32 *) deltaPtr;
593     dP = (u32 *)dstPtr;
594     for (u32 finish = width; finish; finish -= inc_bP) {
595       u32 color4, color5, color6;
596       u32 color1, color2, color3;
597       u32 colorA1, colorA2, colorB1, colorB2, colorS1, colorS2;
598       u32 product1a, product1b, product2a, product2b;
599 
600       colorB1 = *(bP - Nextline);
601       colorB2 = *(bP - Nextline + 1);
602 
603       color4 = *(bP - 1);
604       color5 = *(bP);
605       color6 = *(bP + 1);
606       colorS2 = *(bP + 2);
607 
608       color1 = *(bP + Nextline - 1);
609       color2 = *(bP + Nextline);
610       color3 = *(bP + Nextline + 1);
611       colorS1 = *(bP + Nextline + 2);
612 
613       colorA1 = *(bP + Nextline + Nextline);
614       colorA2 = *(bP + Nextline + Nextline + 1);
615 
616       // --------------------------------------
617       if (color2 == color6 && color5 != color3) {
618         product1b = product2a = color2;
619         if ((color1 == color2) || (color6 == colorB2)) {
620           product1a = INTERPOLATE (color2, color5);
621           product1a = INTERPOLATE (color2, product1a);
622           //                       product1a = color2;
623         } else {
624           product1a = INTERPOLATE (color5, color6);
625         }
626 
627         if ((color6 == colorS2) || (color2 == colorA1)) {
628           product2b = INTERPOLATE (color2, color3);
629           product2b = INTERPOLATE (color2, product2b);
630           //                       product2b = color2;
631         } else {
632           product2b = INTERPOLATE (color2, color3);
633         }
634       } else if (color5 == color3 && color2 != color6) {
635         product2b = product1a = color5;
636 
637         if ((colorB1 == color5) || (color3 == colorS1)) {
638           product1b = INTERPOLATE (color5, color6);
639           product1b = INTERPOLATE (color5, product1b);
640           //                       product1b = color5;
641         } else {
642           product1b = INTERPOLATE (color5, color6);
643         }
644 
645         if ((color3 == colorA2) || (color4 == color5)) {
646           product2a = INTERPOLATE (color5, color2);
647           product2a = INTERPOLATE (color5, product2a);
648           //                       product2a = color5;
649         } else {
650           product2a = INTERPOLATE (color2, color3);
651         }
652 
653       } else if (color5 == color3 && color2 == color6) {
654         register int r = 0;
655 
656         r += GetResult (color6, color5, color1, colorA1);
657         r += GetResult (color6, color5, color4, colorB1);
658         r += GetResult (color6, color5, colorA2, colorS1);
659         r += GetResult (color6, color5, colorB2, colorS2);
660 
661         if (r > 0) {
662           product1b = product2a = color2;
663           product1a = product2b = INTERPOLATE (color5, color6);
664         } else if (r < 0) {
665           product2b = product1a = color5;
666           product1b = product2a = INTERPOLATE (color5, color6);
667         } else {
668           product2b = product1a = color5;
669           product1b = product2a = color2;
670         }
671       } else {
672         product2b = product1a = INTERPOLATE (color2, color6);
673         product2b =
674           Q_INTERPOLATE (color3, color3, color3, product2b);
675         product1a =
676           Q_INTERPOLATE (color5, color5, color5, product1a);
677 
678         product2a = product1b = INTERPOLATE (color5, color3);
679         product2a =
680           Q_INTERPOLATE (color2, color2, color2, product2a);
681         product1b =
682           Q_INTERPOLATE (color6, color6, color6, product1b);
683 
684         //                    product1a = color5;
685         //                    product1b = color6;
686         //                    product2a = color2;
687         //                    product2b = color3;
688       }
689       *(dP) = product1a;
690       *(dP+1) = product1b;
691       *(dP + (dstPitch >> 2)) = product2a;
692       *(dP + (dstPitch >> 2) +1) = product2b;
693 //      *xP = color5;
694 
695       bP += inc_bP;
696 //      xP += inc_bP;
697       dP += 2;
698     }                 // end of for ( finish= width etc..)
699 
700     srcPtr += srcPitch;
701     dstPtr += dstPitch << 1;
702 //    deltaPtr += srcPitch;
703   }                   // endof: for (height; height; height--)
704 }
705 
_2xSaI(u8 * srcPtr,u32 srcPitch,u8 * deltaPtr,u8 * dstPtr,u32 dstPitch,int width,int height)706 void _2xSaI (u8 *srcPtr, u32 srcPitch, u8 *deltaPtr,
707              u8 *dstPtr, u32 dstPitch, int width, int height)
708 {
709   u8  *dP;
710   u16 *bP;
711   u32 inc_bP;
712 
713   {
714     inc_bP = 1;
715 
716     u32 Nextline = srcPitch >> 1;
717 
718     for (; height; height--) {
719       bP = (u16 *) srcPtr;
720       dP = dstPtr;
721 
722       for (u32 finish = width; finish; finish -= inc_bP) {
723 
724         register u32 colorA, colorB;
725         u32 colorC, colorD,
726           colorE, colorF, colorG, colorH,
727           colorI, colorJ, colorK, colorL,
728 
729           colorM, colorN, colorO, colorP;
730         u32 product, product1, product2;
731 
732         //---------------------------------------
733         // Map of the pixels:                    I|E F|J
734         //                                       G|A B|K
735         //                                       H|C D|L
736         //                                       M|N O|P
737         colorI = *(bP - Nextline - 1);
738         colorE = *(bP - Nextline);
739         colorF = *(bP - Nextline + 1);
740         colorJ = *(bP - Nextline + 2);
741 
742         colorG = *(bP - 1);
743         colorA = *(bP);
744         colorB = *(bP + 1);
745         colorK = *(bP + 2);
746 
747         colorH = *(bP + Nextline - 1);
748         colorC = *(bP + Nextline);
749         colorD = *(bP + Nextline + 1);
750         colorL = *(bP + Nextline + 2);
751 
752         colorM = *(bP + Nextline + Nextline - 1);
753         colorN = *(bP + Nextline + Nextline);
754         colorO = *(bP + Nextline + Nextline + 1);
755         colorP = *(bP + Nextline + Nextline + 2);
756 
757         if ((colorA == colorD) && (colorB != colorC)) {
758           if (((colorA == colorE) && (colorB == colorL)) ||
759               ((colorA == colorC) && (colorA == colorF)
760                && (colorB != colorE) && (colorB == colorJ))) {
761             product = colorA;
762           } else {
763             product = INTERPOLATE (colorA, colorB);
764           }
765 
766           if (((colorA == colorG) && (colorC == colorO)) ||
767               ((colorA == colorB) && (colorA == colorH)
768                && (colorG != colorC) && (colorC == colorM))) {
769             product1 = colorA;
770           } else {
771             product1 = INTERPOLATE (colorA, colorC);
772           }
773           product2 = colorA;
774         } else if ((colorB == colorC) && (colorA != colorD)) {
775           if (((colorB == colorF) && (colorA == colorH)) ||
776               ((colorB == colorE) && (colorB == colorD)
777                && (colorA != colorF) && (colorA == colorI))) {
778             product = colorB;
779           } else {
780             product = INTERPOLATE (colorA, colorB);
781           }
782 
783           if (((colorC == colorH) && (colorA == colorF)) ||
784               ((colorC == colorG) && (colorC == colorD)
785                && (colorA != colorH) && (colorA == colorI))) {
786             product1 = colorC;
787           } else {
788             product1 = INTERPOLATE (colorA, colorC);
789           }
790           product2 = colorB;
791         } else if ((colorA == colorD) && (colorB == colorC)) {
792           if (colorA == colorB) {
793             product = colorA;
794             product1 = colorA;
795             product2 = colorA;
796           } else {
797             register int r = 0;
798 
799             product1 = INTERPOLATE (colorA, colorC);
800             product = INTERPOLATE (colorA, colorB);
801 
802             r +=
803               GetResult1 (colorA, colorB, colorG, colorE,
804                           colorI);
805             r +=
806               GetResult2 (colorB, colorA, colorK, colorF,
807                           colorJ);
808             r +=
809               GetResult2 (colorB, colorA, colorH, colorN,
810                           colorM);
811             r +=
812               GetResult1 (colorA, colorB, colorL, colorO,
813                           colorP);
814 
815             if (r > 0)
816               product2 = colorA;
817             else if (r < 0)
818               product2 = colorB;
819             else {
820               product2 =
821                 Q_INTERPOLATE (colorA, colorB, colorC,
822                                colorD);
823             }
824           }
825         } else {
826           product2 = Q_INTERPOLATE (colorA, colorB, colorC, colorD);
827 
828           if ((colorA == colorC) && (colorA == colorF)
829               && (colorB != colorE) && (colorB == colorJ)) {
830             product = colorA;
831           } else if ((colorB == colorE) && (colorB == colorD)
832                      && (colorA != colorF) && (colorA == colorI)) {
833             product = colorB;
834           } else {
835             product = INTERPOLATE (colorA, colorB);
836           }
837 
838           if ((colorA == colorB) && (colorA == colorH)
839               && (colorG != colorC) && (colorC == colorM)) {
840             product1 = colorA;
841           } else if ((colorC == colorG) && (colorC == colorD)
842                      && (colorA != colorH) && (colorA == colorI)) {
843             product1 = colorC;
844           } else {
845             product1 = INTERPOLATE (colorA, colorC);
846           }
847         }
848 
849 #ifdef WORDS_BIGENDIAN
850         product = (colorA << 16) | product ;
851         product1 = (product1 << 16) | product2 ;
852 #else
853         product = colorA | (product << 16);
854         product1 = product1 | (product2 << 16);
855 #endif
856         *((s32 *) dP) = product;
857         *((u32 *) (dP + dstPitch)) = product1;
858 
859         bP += inc_bP;
860         dP += sizeof (u32);
861       }                 // end of for ( finish= width etc..)
862 
863       srcPtr += srcPitch;
864       dstPtr += dstPitch << 1;
865       deltaPtr += srcPitch;
866     }                   // endof: for (height; height; height--)
867   }
868 }
869 
_2xSaI32(u8 * srcPtr,u32 srcPitch,u8 *,u8 * dstPtr,u32 dstPitch,int width,int height)870 void _2xSaI32 (u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */,
871                u8 *dstPtr, u32 dstPitch, int width, int height)
872 {
873   u32  *dP;
874   u32 *bP;
875   u32 inc_bP = 1;
876 
877   u32 Nextline = srcPitch >> 2;
878 
879   for (; height; height--) {
880     bP = (u32 *) srcPtr;
881     dP = (u32 *) dstPtr;
882 
883     for (u32 finish = width; finish; finish -= inc_bP) {
884       register u32 colorA, colorB;
885       u32 colorC, colorD,
886         colorE, colorF, colorG, colorH,
887         colorI, colorJ, colorK, colorL,
888 
889         colorM, colorN, colorO, colorP;
890       u32 product, product1, product2;
891 
892       //---------------------------------------
893       // Map of the pixels:                    I|E F|J
894       //                                       G|A B|K
895       //                                       H|C D|L
896       //                                       M|N O|P
897       colorI = *(bP - Nextline - 1);
898       colorE = *(bP - Nextline);
899       colorF = *(bP - Nextline + 1);
900       colorJ = *(bP - Nextline + 2);
901 
902       colorG = *(bP - 1);
903       colorA = *(bP);
904       colorB = *(bP + 1);
905       colorK = *(bP + 2);
906 
907       colorH = *(bP + Nextline - 1);
908       colorC = *(bP + Nextline);
909       colorD = *(bP + Nextline + 1);
910       colorL = *(bP + Nextline + 2);
911 
912       colorM = *(bP + Nextline + Nextline - 1);
913       colorN = *(bP + Nextline + Nextline);
914       colorO = *(bP + Nextline + Nextline + 1);
915       colorP = *(bP + Nextline + Nextline + 2);
916 
917       if ((colorA == colorD) && (colorB != colorC)) {
918         if (((colorA == colorE) && (colorB == colorL)) ||
919             ((colorA == colorC) && (colorA == colorF)
920              && (colorB != colorE) && (colorB == colorJ))) {
921           product = colorA;
922         } else {
923           product = INTERPOLATE (colorA, colorB);
924         }
925 
926         if (((colorA == colorG) && (colorC == colorO)) ||
927             ((colorA == colorB) && (colorA == colorH)
928              && (colorG != colorC) && (colorC == colorM))) {
929           product1 = colorA;
930         } else {
931           product1 = INTERPOLATE (colorA, colorC);
932         }
933         product2 = colorA;
934       } else if ((colorB == colorC) && (colorA != colorD)) {
935         if (((colorB == colorF) && (colorA == colorH)) ||
936             ((colorB == colorE) && (colorB == colorD)
937              && (colorA != colorF) && (colorA == colorI))) {
938           product = colorB;
939         } else {
940           product = INTERPOLATE (colorA, colorB);
941         }
942 
943         if (((colorC == colorH) && (colorA == colorF)) ||
944             ((colorC == colorG) && (colorC == colorD)
945              && (colorA != colorH) && (colorA == colorI))) {
946           product1 = colorC;
947         } else {
948           product1 = INTERPOLATE (colorA, colorC);
949         }
950         product2 = colorB;
951       } else if ((colorA == colorD) && (colorB == colorC)) {
952         if (colorA == colorB) {
953           product = colorA;
954           product1 = colorA;
955           product2 = colorA;
956         } else {
957           register int r = 0;
958 
959           product1 = INTERPOLATE (colorA, colorC);
960           product = INTERPOLATE (colorA, colorB);
961 
962           r +=
963             GetResult1 (colorA, colorB, colorG, colorE,
964                         colorI);
965           r +=
966             GetResult2 (colorB, colorA, colorK, colorF,
967                         colorJ);
968           r +=
969             GetResult2 (colorB, colorA, colorH, colorN,
970                            colorM);
971           r +=
972             GetResult1 (colorA, colorB, colorL, colorO,
973                            colorP);
974 
975           if (r > 0)
976             product2 = colorA;
977           else if (r < 0)
978             product2 = colorB;
979           else {
980             product2 =
981               Q_INTERPOLATE (colorA, colorB, colorC,
982                                colorD);
983             }
984         }
985       } else {
986         product2 = Q_INTERPOLATE (colorA, colorB, colorC, colorD);
987 
988         if ((colorA == colorC) && (colorA == colorF)
989             && (colorB != colorE) && (colorB == colorJ)) {
990           product = colorA;
991         } else if ((colorB == colorE) && (colorB == colorD)
992                    && (colorA != colorF) && (colorA == colorI)) {
993           product = colorB;
994         } else {
995           product = INTERPOLATE (colorA, colorB);
996         }
997 
998         if ((colorA == colorB) && (colorA == colorH)
999             && (colorG != colorC) && (colorC == colorM)) {
1000           product1 = colorA;
1001         } else if ((colorC == colorG) && (colorC == colorD)
1002                    && (colorA != colorH) && (colorA == colorI)) {
1003           product1 = colorC;
1004         } else {
1005           product1 = INTERPOLATE (colorA, colorC);
1006         }
1007       }
1008       *(dP) = colorA;
1009       *(dP + 1) = product;
1010       *(dP + (dstPitch >> 2)) = product1;
1011       *(dP + (dstPitch >> 2) + 1) = product2;
1012 
1013       bP += inc_bP;
1014       dP += 2;
1015     }                 // end of for ( finish= width etc..)
1016 
1017     srcPtr += srcPitch;
1018     dstPtr += dstPitch << 1;
1019     //    deltaPtr += srcPitch;
1020   }                   // endof: for (height; height; height--)
1021 }
1022 
Bilinear(u32 A,u32 B,u32 x)1023 static u32 Bilinear (u32 A, u32 B, u32 x)
1024 {
1025   unsigned long areaA, areaB;
1026   unsigned long result;
1027 
1028   if (A == B)
1029     return A;
1030 
1031   areaB = (x >> 11) & 0x1f;     // reduce 16 bit fraction to 5 bits
1032   areaA = 0x20 - areaB;
1033 
1034   A = (A & redblueMask) | ((A & greenMask) << 16);
1035   B = (B & redblueMask) | ((B & greenMask) << 16);
1036 
1037   result = ((areaA * A) + (areaB * B)) >> 5;
1038 
1039   return (result & redblueMask) | ((result >> 16) & greenMask);
1040 }
1041 
Bilinear4(u32 A,u32 B,u32 C,u32 D,u32 x,u32 y)1042 static u32 Bilinear4 (u32 A, u32 B, u32 C, u32 D, u32 x,
1043                          u32 y)
1044 {
1045   unsigned long areaA, areaB, areaC, areaD;
1046   unsigned long result, xy;
1047 
1048   x = (x >> 11) & 0x1f;
1049   y = (y >> 11) & 0x1f;
1050   xy = (x * y) >> 5;
1051 
1052   A = (A & redblueMask) | ((A & greenMask) << 16);
1053   B = (B & redblueMask) | ((B & greenMask) << 16);
1054   C = (C & redblueMask) | ((C & greenMask) << 16);
1055   D = (D & redblueMask) | ((D & greenMask) << 16);
1056 
1057   areaA = 0x20 + xy - x - y;
1058   areaB = x - xy;
1059   areaC = y - xy;
1060   areaD = xy;
1061 
1062   result = ((areaA * A) + (areaB * B) + (areaC * C) + (areaD * D)) >> 5;
1063 
1064   return (result & redblueMask) | ((result >> 16) & greenMask);
1065 }
1066 
Scale_2xSaI(u8 * srcPtr,u32 srcPitch,u8 *,u8 * dstPtr,u32 dstPitch,u32 dstWidth,u32 dstHeight,int width,int height)1067 void Scale_2xSaI (u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */,
1068                   u8 *dstPtr, u32 dstPitch,
1069                   u32 dstWidth, u32 dstHeight, int width, int height)
1070 {
1071   u8  *dP;
1072   u16 *bP;
1073 
1074   u32 w;
1075   u32 h;
1076   u32 dw;
1077   u32 dh;
1078   u32 hfinish;
1079   u32 wfinish;
1080 
1081   u32 Nextline = srcPitch >> 1;
1082 
1083   wfinish = (width - 1) << 16;  // convert to fixed point
1084   dw = wfinish / (dstWidth - 1);
1085   hfinish = (height - 1) << 16; // convert to fixed point
1086   dh = hfinish / (dstHeight - 1);
1087 
1088   for (h = 0; h < hfinish; h += dh) {
1089     u32 y1, y2;
1090 
1091     y1 = h & 0xffff;    // fraction part of fixed point
1092     bP = (u16 *) (srcPtr + ((h >> 16) * srcPitch));
1093     dP = dstPtr;
1094     y2 = 0x10000 - y1;
1095 
1096     w = 0;
1097 
1098     for (; w < wfinish;) {
1099       u32 A, B, C, D;
1100       u32 E, F, G, H;
1101       u32 I, J, K, L;
1102       u32 x1, x2, a1, f1, f2;
1103       u32 position, product1 = 0;
1104 
1105       position = w >> 16;
1106       A = bP[position]; // current pixel
1107       B = bP[position + 1];     // next pixel
1108       C = bP[position + Nextline];
1109       D = bP[position + Nextline + 1];
1110       E = bP[position - Nextline];
1111       F = bP[position - Nextline + 1];
1112       G = bP[position - 1];
1113       H = bP[position + Nextline - 1];
1114       I = bP[position + 2];
1115       J = bP[position + Nextline + 2];
1116       K = bP[position + Nextline + Nextline];
1117       L = bP[position + Nextline + Nextline + 1];
1118 
1119       x1 = w & 0xffff;  // fraction part of fixed point
1120       x2 = 0x10000 - x1;
1121 
1122       /*0*/
1123       if (A == B && C == D && A == C)
1124         product1 = A;
1125       else /*1*/ if (A == D && B != C) {
1126         f1 = (x1 >> 1) + (0x10000 >> 2);
1127         f2 = (y1 >> 1) + (0x10000 >> 2);
1128         if (y1 <= f1 && A == J && A != E)       // close to B
1129           {
1130             a1 = f1 - y1;
1131             product1 = Bilinear (A, B, a1);
1132           } else if (y1 >= f1 && A == G && A != L)      // close to C
1133             {
1134               a1 = y1 - f1;
1135               product1 = Bilinear (A, C, a1);
1136             }
1137         else if (x1 >= f2 && A == E && A != J)  // close to B
1138           {
1139             a1 = x1 - f2;
1140             product1 = Bilinear (A, B, a1);
1141           }
1142         else if (x1 <= f2 && A == L && A != G)  // close to C
1143           {
1144             a1 = f2 - x1;
1145             product1 = Bilinear (A, C, a1);
1146           }
1147         else if (y1 >= x1)      // close to C
1148           {
1149             a1 = y1 - x1;
1150             product1 = Bilinear (A, C, a1);
1151           }
1152         else if (y1 <= x1)      // close to B
1153           {
1154             a1 = x1 - y1;
1155             product1 = Bilinear (A, B, a1);
1156           }
1157       }
1158       else
1159         /*2*/
1160         if (B == C && A != D)
1161           {
1162             f1 = (x1 >> 1) + (0x10000 >> 2);
1163             f2 = (y1 >> 1) + (0x10000 >> 2);
1164             if (y2 >= f1 && B == H && B != F)   // close to A
1165               {
1166                 a1 = y2 - f1;
1167                 product1 = Bilinear (B, A, a1);
1168               }
1169             else if (y2 <= f1 && B == I && B != K)      // close to D
1170               {
1171                 a1 = f1 - y2;
1172                 product1 = Bilinear (B, D, a1);
1173               }
1174             else if (x2 >= f2 && B == F && B != H)      // close to A
1175               {
1176                 a1 = x2 - f2;
1177                 product1 = Bilinear (B, A, a1);
1178               }
1179             else if (x2 <= f2 && B == K && B != I)      // close to D
1180               {
1181                 a1 = f2 - x2;
1182                 product1 = Bilinear (B, D, a1);
1183               }
1184             else if (y2 >= x1)  // close to A
1185               {
1186                 a1 = y2 - x1;
1187                 product1 = Bilinear (B, A, a1);
1188               }
1189             else if (y2 <= x1)  // close to D
1190               {
1191                 a1 = x1 - y2;
1192                 product1 = Bilinear (B, D, a1);
1193               }
1194           }
1195       /*3*/
1196         else
1197           {
1198             product1 = Bilinear4 (A, B, C, D, x1, y1);
1199           }
1200 
1201       //end First Pixel
1202       *(u32 *) dP = product1;
1203       dP += 2;
1204       w += dw;
1205     }
1206     dstPtr += dstPitch;
1207   }
1208 }
1209