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