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