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