1 //------------------------------------------------------------------------
2 // HQ2X : High-Quality 2x Graphics Resizing
3 //------------------------------------------------------------------------
4 //
5 // Copyright (c) 2007 The EDGE Team.
6 //
7 // This program is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU General Public License
9 // as published by the Free Software Foundation; either version 2
10 // of the License, or (at your option) any later version.
11 //
12 // This program is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 // GNU General Public License for more details.
16 //
17 //------------------------------------------------------------------------
18 //
19 // Based heavily on the code (C) 2003 Maxim Stepin, which is
20 // under the GNU LGPL (Lesser General Public License).
21 //
22 // For more information, see: http://hiend3d.com/hq2x.html
23 //
24 //------------------------------------------------------------------------
25 //
26 // -AJA- Modified to use a palettised input image, allowing the
27 // YUV table to be used with full precision (because the
28 // intermediate conversion to 16-bit RGB isn't needed).
29 //
30 // Changed the YUV calculation to something more standard.
31 // The LerpColor method and support for transparent pixels
32 // was copied from the Doomsday engine by Jaakko Ker�nen.
33 //
34
35 #include "epi.h"
36 #include "image_hq2x.h"
37
38 namespace epi
39 {
40 namespace Hq2x
41 {
42
43 u32_t PixelRGB[256];
44 u32_t PixelYUV[256];
45
46 const u32_t Amask = 0xFF000000;
47 const u32_t Ymask = 0x00FF0000;
48 const u32_t Umask = 0x0000FF00;
49 const u32_t Vmask = 0x000000FF;
50
51 const u32_t trY = 0x00300000;
52 const u32_t trU = 0x00000700;
53 const u32_t trV = 0x00000007; // -AJA- changed (was 6)
54
GET_R(u32_t col)55 inline u32_t GET_R(u32_t col) { return (col >> 16) & 0xFF; }
GET_G(u32_t col)56 inline u32_t GET_G(u32_t col) { return (col >> 8) & 0xFF; }
GET_B(u32_t col)57 inline u32_t GET_B(u32_t col) { return (col ) & 0xFF; }
GET_A(u32_t col)58 inline u32_t GET_A(u32_t col) { return (col >> 24) & 0xFF; }
59
LerpColor(u8_t * dest,u32_t c1,u32_t c2,u32_t c3,u32_t f1,u32_t f2,u32_t f3,u32_t shift)60 inline void LerpColor(u8_t * dest, u32_t c1, u32_t c2, u32_t c3,
61 u32_t f1, u32_t f2, u32_t f3, u32_t shift)
62 {
63 dest[0] = (GET_R(c1) * f1 + GET_R(c2) * f2 + GET_R(c3) * f3) >> shift;
64 dest[1] = (GET_G(c1) * f1 + GET_G(c2) * f2 + GET_G(c3) * f3) >> shift;
65 dest[2] = (GET_B(c1) * f1 + GET_B(c2) * f2 + GET_B(c3) * f3) >> shift;
66 dest[3] = (GET_A(c1) * f1 + GET_A(c2) * f2 + GET_A(c3) * f3) >> shift;
67 }
68
Interp0(u8_t * dest,u32_t c1)69 void Interp0(u8_t * dest, u32_t c1)
70 {
71 // *dest = c1
72 dest[0] = GET_R(c1);
73 dest[1] = GET_G(c1);
74 dest[2] = GET_B(c1);
75 dest[3] = GET_A(c1);
76 }
77
Interp1(u8_t * dest,u32_t c1,u32_t c2)78 void Interp1(u8_t * dest, u32_t c1, u32_t c2)
79 {
80 // *dest = (c1*3+c2) >> 2;
81 LerpColor(dest, c1, c2, 0, 3,1,0, 2);
82 }
83
Interp2(u8_t * dest,u32_t c1,u32_t c2,u32_t c3)84 void Interp2(u8_t * dest, u32_t c1, u32_t c2, u32_t c3)
85 {
86 // *dest = (c1*2+c2+c3) >> 2;
87 LerpColor(dest, c1, c2, c3, 2,1,1, 2);
88 }
89
Interp5(u8_t * dest,u32_t c1,u32_t c2)90 void Interp5(u8_t * dest, u32_t c1, u32_t c2)
91 {
92 // *dest = (c1+c2) >> 1;
93 LerpColor(dest, c1, c2, 0, 1,1,0, 1);
94 }
95
Interp6(u8_t * dest,u32_t c1,u32_t c2,u32_t c3)96 void Interp6(u8_t * dest, u32_t c1, u32_t c2, u32_t c3)
97 {
98 // *dest = (c1*5+c2*2+c3)/8;
99 LerpColor(dest, c1, c2, c3, 5,2,1, 3);
100 }
101
Interp7(u8_t * dest,u32_t c1,u32_t c2,u32_t c3)102 void Interp7(u8_t * dest, u32_t c1, u32_t c2, u32_t c3)
103 {
104 // *dest = (c1*6+c2+c3)/8;
105 LerpColor(dest, c1, c2, c3, 6,1,1, 3);
106 }
107
Interp9(u8_t * dest,u32_t c1,u32_t c2,u32_t c3)108 void Interp9(u8_t * dest, u32_t c1, u32_t c2, u32_t c3)
109 {
110 // *dest = (c1*2+(c2+c3)*3)/8;
111 LerpColor(dest, c1, c2, c3, 2,3,3, 3);
112 }
113
Interp10(u8_t * dest,u32_t c1,u32_t c2,u32_t c3)114 void Interp10(u8_t * dest, u32_t c1, u32_t c2, u32_t c3)
115 {
116 // *dest = (c1*14+c2+c3)/16;
117 LerpColor(dest, c1, c2, c3, 14,1,1, 4);
118 }
119
120 #define PIXEL00_0 Interp0(dest, c[5]);
121 #define PIXEL00_10 Interp1(dest, c[5], c[1]);
122 #define PIXEL00_11 Interp1(dest, c[5], c[4]);
123 #define PIXEL00_12 Interp1(dest, c[5], c[2]);
124 #define PIXEL00_20 Interp2(dest, c[5], c[4], c[2]);
125 #define PIXEL00_21 Interp2(dest, c[5], c[1], c[2]);
126 #define PIXEL00_22 Interp2(dest, c[5], c[1], c[4]);
127 #define PIXEL00_60 Interp6(dest, c[5], c[2], c[4]);
128 #define PIXEL00_61 Interp6(dest, c[5], c[4], c[2]);
129 #define PIXEL00_70 Interp7(dest, c[5], c[4], c[2]);
130 #define PIXEL00_90 Interp9(dest, c[5], c[4], c[2]);
131 #define PIXEL00_100 Interp10(dest, c[5], c[4], c[2]);
132
133 #define PIXEL01_0 Interp0(dest+4, c[5]);
134 #define PIXEL01_10 Interp1(dest+4, c[5], c[3]);
135 #define PIXEL01_11 Interp1(dest+4, c[5], c[2]);
136 #define PIXEL01_12 Interp1(dest+4, c[5], c[6]);
137 #define PIXEL01_20 Interp2(dest+4, c[5], c[2], c[6]);
138 #define PIXEL01_21 Interp2(dest+4, c[5], c[3], c[6]);
139 #define PIXEL01_22 Interp2(dest+4, c[5], c[3], c[2]);
140 #define PIXEL01_60 Interp6(dest+4, c[5], c[6], c[2]);
141 #define PIXEL01_61 Interp6(dest+4, c[5], c[2], c[6]);
142 #define PIXEL01_70 Interp7(dest+4, c[5], c[2], c[6]);
143 #define PIXEL01_90 Interp9(dest+4, c[5], c[2], c[6]);
144 #define PIXEL01_100 Interp10(dest+4, c[5], c[2], c[6]);
145
146 #define PIXEL10_0 Interp0(dest+BpL, c[5]);
147 #define PIXEL10_10 Interp1(dest+BpL, c[5], c[7]);
148 #define PIXEL10_11 Interp1(dest+BpL, c[5], c[8]);
149 #define PIXEL10_12 Interp1(dest+BpL, c[5], c[4]);
150 #define PIXEL10_20 Interp2(dest+BpL, c[5], c[8], c[4]);
151 #define PIXEL10_21 Interp2(dest+BpL, c[5], c[7], c[4]);
152 #define PIXEL10_22 Interp2(dest+BpL, c[5], c[7], c[8]);
153 #define PIXEL10_60 Interp6(dest+BpL, c[5], c[4], c[8]);
154 #define PIXEL10_61 Interp6(dest+BpL, c[5], c[8], c[4]);
155 #define PIXEL10_70 Interp7(dest+BpL, c[5], c[8], c[4]);
156 #define PIXEL10_90 Interp9(dest+BpL, c[5], c[8], c[4]);
157 #define PIXEL10_100 Interp10(dest+BpL, c[5], c[8], c[4]);
158
159 #define PIXEL11_0 Interp0(dest+BpL+4, c[5]);
160 #define PIXEL11_10 Interp1(dest+BpL+4, c[5], c[9]);
161 #define PIXEL11_11 Interp1(dest+BpL+4, c[5], c[6]);
162 #define PIXEL11_12 Interp1(dest+BpL+4, c[5], c[8]);
163 #define PIXEL11_20 Interp2(dest+BpL+4, c[5], c[6], c[8]);
164 #define PIXEL11_21 Interp2(dest+BpL+4, c[5], c[9], c[8]);
165 #define PIXEL11_22 Interp2(dest+BpL+4, c[5], c[9], c[6]);
166 #define PIXEL11_60 Interp6(dest+BpL+4, c[5], c[8], c[6]);
167 #define PIXEL11_61 Interp6(dest+BpL+4, c[5], c[6], c[8]);
168 #define PIXEL11_70 Interp7(dest+BpL+4, c[5], c[6], c[8]);
169 #define PIXEL11_90 Interp9(dest+BpL+4, c[5], c[6], c[8]);
170 #define PIXEL11_100 Interp10(dest+BpL+4, c[5], c[6], c[8]);
171
UDiff(u32_t u1,u32_t u2)172 static inline u32_t UDiff(u32_t u1, u32_t u2)
173 {
174 return (u1 >= u2) ? u1 - u2 : u2 - u1;
175 }
176
Diff(const u8_t p1,const u8_t p2)177 inline bool Diff(const u8_t p1, const u8_t p2)
178 {
179 u32_t YUV1 = PixelYUV[p1];
180 u32_t YUV2 = PixelYUV[p2];
181
182 return (YUV1 & Amask) != (YUV2 & Amask) ||
183 UDiff((YUV1 & Ymask), (YUV2 & Ymask)) > trY ||
184 UDiff((YUV1 & Umask), (YUV2 & Umask)) > trU ||
185 UDiff((YUV1 & Vmask), (YUV2 & Vmask)) > trV;
186 }
187
Setup(const u8_t * palette,int trans_pixel)188 void Setup(const u8_t *palette, int trans_pixel)
189 {
190 for (int c = 0; c < 256; c++)
191 {
192 int r = palette[c*3 + 0];
193 int g = palette[c*3 + 1];
194 int b = palette[c*3 + 2];
195 int A = 255;
196
197 if (c == trans_pixel)
198 r = g = b = A = 0;
199
200 PixelRGB[c] = ((A << 24) + (r << 16) + (g << 8) + b);
201
202 // -AJA- changed to better formulas (based on Wikipedia article)
203 int Y = (r * 77 + g * 150 + b * 29) >> 8;
204 int u = 128 + ((-r * 38 - g * 74 + b * 111) >> 9);
205 int v = 128 + (( r * 157 - g * 132 - b * 26) >> 9);
206
207 #if 0 // DEBUGGING
208 fprintf(stderr, "[%d] #%02x%02x%02x -> YUV #%02x%02x%02x\n", c, r,g,b, Y,u,v);
209 #endif
210 PixelYUV[c] = ((A << 24) + (Y << 16) + (u << 8) + v);
211 }
212 }
213
ConvertLine(int y,int w,int h,bool invert,u8_t * dest,const u8_t * src)214 void ConvertLine(int y, int w, int h, bool invert, u8_t *dest, const u8_t *src)
215 {
216 int prevline = (y > 0) ? -w : 0;
217 int nextline = (y < h-1) ? w : 0;
218
219 // Bytes per Line (destination)
220 int BpL = (w * 8);
221
222 if (invert)
223 {
224 dest += BpL;
225 BpL = 0 - BpL;
226 }
227
228 u8_t p[10]; // palette pixels
229 u32_t c[10]; // RGBA pixels
230
231 // +----+----+----+
232 // | | | |
233 // | p1 | p2 | p3 |
234 // +----+----+----+
235 // | | | |
236 // | p4 | p5 | p6 |
237 // +----+----+----+
238 // | | | |
239 // | p7 | p8 | p9 |
240 // +----+----+----+
241
242 for (int x = 0; x < w; x++, src++, dest += 8 /* RGBA */)
243 {
244 p[2] = src[prevline];
245 p[5] = src[0];
246 p[8] = src[nextline];
247
248 if (x > 0)
249 {
250 p[1] = src[prevline-1];
251 p[4] = src[-1];
252 p[7] = src[nextline-1];
253 }
254 else
255 {
256 p[1] = p[2];
257 p[4] = p[5];
258 p[7] = p[8];
259 }
260
261 if (x < w-1)
262 {
263 p[3] = src[prevline+1];
264 p[6] = src[1];
265 p[9] = src[nextline+1];
266 }
267 else
268 {
269 p[3] = p[2];
270 p[6] = p[5];
271 p[9] = p[8];
272 }
273
274 for (int k=1; k <= 9; k++)
275 c[k] = PixelRGB[p[k]];
276
277 u8_t pattern = 0;
278
279 if (Diff(p[5], p[1])) pattern |= 0x01;
280 if (Diff(p[5], p[2])) pattern |= 0x02;
281 if (Diff(p[5], p[3])) pattern |= 0x04;
282 if (Diff(p[5], p[4])) pattern |= 0x08;
283 if (Diff(p[5], p[6])) pattern |= 0x10;
284 if (Diff(p[5], p[7])) pattern |= 0x20;
285 if (Diff(p[5], p[8])) pattern |= 0x40;
286 if (Diff(p[5], p[9])) pattern |= 0x80;
287
288 switch (pattern)
289 {
290 case 0:
291 case 1:
292 case 4:
293 case 32:
294 case 128:
295 case 5:
296 case 132:
297 case 160:
298 case 33:
299 case 129:
300 case 36:
301 case 133:
302 case 164:
303 case 161:
304 case 37:
305 case 165:
306 {
307 PIXEL00_20
308 PIXEL01_20
309 PIXEL10_20
310 PIXEL11_20
311 break;
312 }
313 case 2:
314 case 34:
315 case 130:
316 case 162:
317 {
318 PIXEL00_22
319 PIXEL01_21
320 PIXEL10_20
321 PIXEL11_20
322 break;
323 }
324 case 16:
325 case 17:
326 case 48:
327 case 49:
328 {
329 PIXEL00_20
330 PIXEL01_22
331 PIXEL10_20
332 PIXEL11_21
333 break;
334 }
335 case 64:
336 case 65:
337 case 68:
338 case 69:
339 {
340 PIXEL00_20
341 PIXEL01_20
342 PIXEL10_21
343 PIXEL11_22
344 break;
345 }
346 case 8:
347 case 12:
348 case 136:
349 case 140:
350 {
351 PIXEL00_21
352 PIXEL01_20
353 PIXEL10_22
354 PIXEL11_20
355 break;
356 }
357 case 3:
358 case 35:
359 case 131:
360 case 163:
361 {
362 PIXEL00_11
363 PIXEL01_21
364 PIXEL10_20
365 PIXEL11_20
366 break;
367 }
368 case 6:
369 case 38:
370 case 134:
371 case 166:
372 {
373 PIXEL00_22
374 PIXEL01_12
375 PIXEL10_20
376 PIXEL11_20
377 break;
378 }
379 case 20:
380 case 21:
381 case 52:
382 case 53:
383 {
384 PIXEL00_20
385 PIXEL01_11
386 PIXEL10_20
387 PIXEL11_21
388 break;
389 }
390 case 144:
391 case 145:
392 case 176:
393 case 177:
394 {
395 PIXEL00_20
396 PIXEL01_22
397 PIXEL10_20
398 PIXEL11_12
399 break;
400 }
401 case 192:
402 case 193:
403 case 196:
404 case 197:
405 {
406 PIXEL00_20
407 PIXEL01_20
408 PIXEL10_21
409 PIXEL11_11
410 break;
411 }
412 case 96:
413 case 97:
414 case 100:
415 case 101:
416 {
417 PIXEL00_20
418 PIXEL01_20
419 PIXEL10_12
420 PIXEL11_22
421 break;
422 }
423 case 40:
424 case 44:
425 case 168:
426 case 172:
427 {
428 PIXEL00_21
429 PIXEL01_20
430 PIXEL10_11
431 PIXEL11_20
432 break;
433 }
434 case 9:
435 case 13:
436 case 137:
437 case 141:
438 {
439 PIXEL00_12
440 PIXEL01_20
441 PIXEL10_22
442 PIXEL11_20
443 break;
444 }
445 case 18:
446 case 50:
447 {
448 PIXEL00_22
449 if (Diff(p[2], p[6]))
450 {
451 PIXEL01_10
452 }
453 else
454 {
455 PIXEL01_20
456 }
457 PIXEL10_20
458 PIXEL11_21
459 break;
460 }
461 case 80:
462 case 81:
463 {
464 PIXEL00_20
465 PIXEL01_22
466 PIXEL10_21
467 if (Diff(p[6], p[8]))
468 {
469 PIXEL11_10
470 }
471 else
472 {
473 PIXEL11_20
474 }
475 break;
476 }
477 case 72:
478 case 76:
479 {
480 PIXEL00_21
481 PIXEL01_20
482 if (Diff(p[8], p[4]))
483 {
484 PIXEL10_10
485 }
486 else
487 {
488 PIXEL10_20
489 }
490 PIXEL11_22
491 break;
492 }
493 case 10:
494 case 138:
495 {
496 if (Diff(p[4], p[2]))
497 {
498 PIXEL00_10
499 }
500 else
501 {
502 PIXEL00_20
503 }
504 PIXEL01_21
505 PIXEL10_22
506 PIXEL11_20
507 break;
508 }
509 case 66:
510 {
511 PIXEL00_22
512 PIXEL01_21
513 PIXEL10_21
514 PIXEL11_22
515 break;
516 }
517 case 24:
518 {
519 PIXEL00_21
520 PIXEL01_22
521 PIXEL10_22
522 PIXEL11_21
523 break;
524 }
525 case 7:
526 case 39:
527 case 135:
528 {
529 PIXEL00_11
530 PIXEL01_12
531 PIXEL10_20
532 PIXEL11_20
533 break;
534 }
535 case 148:
536 case 149:
537 case 180:
538 {
539 PIXEL00_20
540 PIXEL01_11
541 PIXEL10_20
542 PIXEL11_12
543 break;
544 }
545 case 224:
546 case 228:
547 case 225:
548 {
549 PIXEL00_20
550 PIXEL01_20
551 PIXEL10_12
552 PIXEL11_11
553 break;
554 }
555 case 41:
556 case 169:
557 case 45:
558 {
559 PIXEL00_12
560 PIXEL01_20
561 PIXEL10_11
562 PIXEL11_20
563 break;
564 }
565 case 22:
566 case 54:
567 {
568 PIXEL00_22
569 if (Diff(p[2], p[6]))
570 {
571 PIXEL01_0
572 }
573 else
574 {
575 PIXEL01_20
576 }
577 PIXEL10_20
578 PIXEL11_21
579 break;
580 }
581 case 208:
582 case 209:
583 {
584 PIXEL00_20
585 PIXEL01_22
586 PIXEL10_21
587 if (Diff(p[6], p[8]))
588 {
589 PIXEL11_0
590 }
591 else
592 {
593 PIXEL11_20
594 }
595 break;
596 }
597 case 104:
598 case 108:
599 {
600 PIXEL00_21
601 PIXEL01_20
602 if (Diff(p[8], p[4]))
603 {
604 PIXEL10_0
605 }
606 else
607 {
608 PIXEL10_20
609 }
610 PIXEL11_22
611 break;
612 }
613 case 11:
614 case 139:
615 {
616 if (Diff(p[4], p[2]))
617 {
618 PIXEL00_0
619 }
620 else
621 {
622 PIXEL00_20
623 }
624 PIXEL01_21
625 PIXEL10_22
626 PIXEL11_20
627 break;
628 }
629 case 19:
630 case 51:
631 {
632 if (Diff(p[2], p[6]))
633 {
634 PIXEL00_11
635 PIXEL01_10
636 }
637 else
638 {
639 PIXEL00_60
640 PIXEL01_90
641 }
642 PIXEL10_20
643 PIXEL11_21
644 break;
645 }
646 case 146:
647 case 178:
648 {
649 PIXEL00_22
650 if (Diff(p[2], p[6]))
651 {
652 PIXEL01_10
653 PIXEL11_12
654 }
655 else
656 {
657 PIXEL01_90
658 PIXEL11_61
659 }
660 PIXEL10_20
661 break;
662 }
663 case 84:
664 case 85:
665 {
666 PIXEL00_20
667 if (Diff(p[6], p[8]))
668 {
669 PIXEL01_11
670 PIXEL11_10
671 }
672 else
673 {
674 PIXEL01_60
675 PIXEL11_90
676 }
677 PIXEL10_21
678 break;
679 }
680 case 112:
681 case 113:
682 {
683 PIXEL00_20
684 PIXEL01_22
685 if (Diff(p[6], p[8]))
686 {
687 PIXEL10_12
688 PIXEL11_10
689 }
690 else
691 {
692 PIXEL10_61
693 PIXEL11_90
694 }
695 break;
696 }
697 case 200:
698 case 204:
699 {
700 PIXEL00_21
701 PIXEL01_20
702 if (Diff(p[8], p[4]))
703 {
704 PIXEL10_10
705 PIXEL11_11
706 }
707 else
708 {
709 PIXEL10_90
710 PIXEL11_60
711 }
712 break;
713 }
714 case 73:
715 case 77:
716 {
717 if (Diff(p[8], p[4]))
718 {
719 PIXEL00_12
720 PIXEL10_10
721 }
722 else
723 {
724 PIXEL00_61
725 PIXEL10_90
726 }
727 PIXEL01_20
728 PIXEL11_22
729 break;
730 }
731 case 42:
732 case 170:
733 {
734 if (Diff(p[4], p[2]))
735 {
736 PIXEL00_10
737 PIXEL10_11
738 }
739 else
740 {
741 PIXEL00_90
742 PIXEL10_60
743 }
744 PIXEL01_21
745 PIXEL11_20
746 break;
747 }
748 case 14:
749 case 142:
750 {
751 if (Diff(p[4], p[2]))
752 {
753 PIXEL00_10
754 PIXEL01_12
755 }
756 else
757 {
758 PIXEL00_90
759 PIXEL01_61
760 }
761 PIXEL10_22
762 PIXEL11_20
763 break;
764 }
765 case 67:
766 {
767 PIXEL00_11
768 PIXEL01_21
769 PIXEL10_21
770 PIXEL11_22
771 break;
772 }
773 case 70:
774 {
775 PIXEL00_22
776 PIXEL01_12
777 PIXEL10_21
778 PIXEL11_22
779 break;
780 }
781 case 28:
782 {
783 PIXEL00_21
784 PIXEL01_11
785 PIXEL10_22
786 PIXEL11_21
787 break;
788 }
789 case 152:
790 {
791 PIXEL00_21
792 PIXEL01_22
793 PIXEL10_22
794 PIXEL11_12
795 break;
796 }
797 case 194:
798 {
799 PIXEL00_22
800 PIXEL01_21
801 PIXEL10_21
802 PIXEL11_11
803 break;
804 }
805 case 98:
806 {
807 PIXEL00_22
808 PIXEL01_21
809 PIXEL10_12
810 PIXEL11_22
811 break;
812 }
813 case 56:
814 {
815 PIXEL00_21
816 PIXEL01_22
817 PIXEL10_11
818 PIXEL11_21
819 break;
820 }
821 case 25:
822 {
823 PIXEL00_12
824 PIXEL01_22
825 PIXEL10_22
826 PIXEL11_21
827 break;
828 }
829 case 26:
830 case 31:
831 {
832 if (Diff(p[4], p[2]))
833 {
834 PIXEL00_0
835 }
836 else
837 {
838 PIXEL00_20
839 }
840 if (Diff(p[2], p[6]))
841 {
842 PIXEL01_0
843 }
844 else
845 {
846 PIXEL01_20
847 }
848 PIXEL10_22
849 PIXEL11_21
850 break;
851 }
852 case 82:
853 case 214:
854 {
855 PIXEL00_22
856 if (Diff(p[2], p[6]))
857 {
858 PIXEL01_0
859 }
860 else
861 {
862 PIXEL01_20
863 }
864 PIXEL10_21
865 if (Diff(p[6], p[8]))
866 {
867 PIXEL11_0
868 }
869 else
870 {
871 PIXEL11_20
872 }
873 break;
874 }
875 case 88:
876 case 248:
877 {
878 PIXEL00_21
879 PIXEL01_22
880 if (Diff(p[8], p[4]))
881 {
882 PIXEL10_0
883 }
884 else
885 {
886 PIXEL10_20
887 }
888 if (Diff(p[6], p[8]))
889 {
890 PIXEL11_0
891 }
892 else
893 {
894 PIXEL11_20
895 }
896 break;
897 }
898 case 74:
899 case 107:
900 {
901 if (Diff(p[4], p[2]))
902 {
903 PIXEL00_0
904 }
905 else
906 {
907 PIXEL00_20
908 }
909 PIXEL01_21
910 if (Diff(p[8], p[4]))
911 {
912 PIXEL10_0
913 }
914 else
915 {
916 PIXEL10_20
917 }
918 PIXEL11_22
919 break;
920 }
921 case 27:
922 {
923 if (Diff(p[4], p[2]))
924 {
925 PIXEL00_0
926 }
927 else
928 {
929 PIXEL00_20
930 }
931 PIXEL01_10
932 PIXEL10_22
933 PIXEL11_21
934 break;
935 }
936 case 86:
937 {
938 PIXEL00_22
939 if (Diff(p[2], p[6]))
940 {
941 PIXEL01_0
942 }
943 else
944 {
945 PIXEL01_20
946 }
947 PIXEL10_21
948 PIXEL11_10
949 break;
950 }
951 case 216:
952 {
953 PIXEL00_21
954 PIXEL01_22
955 PIXEL10_10
956 if (Diff(p[6], p[8]))
957 {
958 PIXEL11_0
959 }
960 else
961 {
962 PIXEL11_20
963 }
964 break;
965 }
966 case 106:
967 {
968 PIXEL00_10
969 PIXEL01_21
970 if (Diff(p[8], p[4]))
971 {
972 PIXEL10_0
973 }
974 else
975 {
976 PIXEL10_20
977 }
978 PIXEL11_22
979 break;
980 }
981 case 30:
982 {
983 PIXEL00_10
984 if (Diff(p[2], p[6]))
985 {
986 PIXEL01_0
987 }
988 else
989 {
990 PIXEL01_20
991 }
992 PIXEL10_22
993 PIXEL11_21
994 break;
995 }
996 case 210:
997 {
998 PIXEL00_22
999 PIXEL01_10
1000 PIXEL10_21
1001 if (Diff(p[6], p[8]))
1002 {
1003 PIXEL11_0
1004 }
1005 else
1006 {
1007 PIXEL11_20
1008 }
1009 break;
1010 }
1011 case 120:
1012 {
1013 PIXEL00_21
1014 PIXEL01_22
1015 if (Diff(p[8], p[4]))
1016 {
1017 PIXEL10_0
1018 }
1019 else
1020 {
1021 PIXEL10_20
1022 }
1023 PIXEL11_10
1024 break;
1025 }
1026 case 75:
1027 {
1028 if (Diff(p[4], p[2]))
1029 {
1030 PIXEL00_0
1031 }
1032 else
1033 {
1034 PIXEL00_20
1035 }
1036 PIXEL01_21
1037 PIXEL10_10
1038 PIXEL11_22
1039 break;
1040 }
1041 case 29:
1042 {
1043 PIXEL00_12
1044 PIXEL01_11
1045 PIXEL10_22
1046 PIXEL11_21
1047 break;
1048 }
1049 case 198:
1050 {
1051 PIXEL00_22
1052 PIXEL01_12
1053 PIXEL10_21
1054 PIXEL11_11
1055 break;
1056 }
1057 case 184:
1058 {
1059 PIXEL00_21
1060 PIXEL01_22
1061 PIXEL10_11
1062 PIXEL11_12
1063 break;
1064 }
1065 case 99:
1066 {
1067 PIXEL00_11
1068 PIXEL01_21
1069 PIXEL10_12
1070 PIXEL11_22
1071 break;
1072 }
1073 case 57:
1074 {
1075 PIXEL00_12
1076 PIXEL01_22
1077 PIXEL10_11
1078 PIXEL11_21
1079 break;
1080 }
1081 case 71:
1082 {
1083 PIXEL00_11
1084 PIXEL01_12
1085 PIXEL10_21
1086 PIXEL11_22
1087 break;
1088 }
1089 case 156:
1090 {
1091 PIXEL00_21
1092 PIXEL01_11
1093 PIXEL10_22
1094 PIXEL11_12
1095 break;
1096 }
1097 case 226:
1098 {
1099 PIXEL00_22
1100 PIXEL01_21
1101 PIXEL10_12
1102 PIXEL11_11
1103 break;
1104 }
1105 case 60:
1106 {
1107 PIXEL00_21
1108 PIXEL01_11
1109 PIXEL10_11
1110 PIXEL11_21
1111 break;
1112 }
1113 case 195:
1114 {
1115 PIXEL00_11
1116 PIXEL01_21
1117 PIXEL10_21
1118 PIXEL11_11
1119 break;
1120 }
1121 case 102:
1122 {
1123 PIXEL00_22
1124 PIXEL01_12
1125 PIXEL10_12
1126 PIXEL11_22
1127 break;
1128 }
1129 case 153:
1130 {
1131 PIXEL00_12
1132 PIXEL01_22
1133 PIXEL10_22
1134 PIXEL11_12
1135 break;
1136 }
1137 case 58:
1138 {
1139 if (Diff(p[4], p[2]))
1140 {
1141 PIXEL00_10
1142 }
1143 else
1144 {
1145 PIXEL00_70
1146 }
1147 if (Diff(p[2], p[6]))
1148 {
1149 PIXEL01_10
1150 }
1151 else
1152 {
1153 PIXEL01_70
1154 }
1155 PIXEL10_11
1156 PIXEL11_21
1157 break;
1158 }
1159 case 83:
1160 {
1161 PIXEL00_11
1162 if (Diff(p[2], p[6]))
1163 {
1164 PIXEL01_10
1165 }
1166 else
1167 {
1168 PIXEL01_70
1169 }
1170 PIXEL10_21
1171 if (Diff(p[6], p[8]))
1172 {
1173 PIXEL11_10
1174 }
1175 else
1176 {
1177 PIXEL11_70
1178 }
1179 break;
1180 }
1181 case 92:
1182 {
1183 PIXEL00_21
1184 PIXEL01_11
1185 if (Diff(p[8], p[4]))
1186 {
1187 PIXEL10_10
1188 }
1189 else
1190 {
1191 PIXEL10_70
1192 }
1193 if (Diff(p[6], p[8]))
1194 {
1195 PIXEL11_10
1196 }
1197 else
1198 {
1199 PIXEL11_70
1200 }
1201 break;
1202 }
1203 case 202:
1204 {
1205 if (Diff(p[4], p[2]))
1206 {
1207 PIXEL00_10
1208 }
1209 else
1210 {
1211 PIXEL00_70
1212 }
1213 PIXEL01_21
1214 if (Diff(p[8], p[4]))
1215 {
1216 PIXEL10_10
1217 }
1218 else
1219 {
1220 PIXEL10_70
1221 }
1222 PIXEL11_11
1223 break;
1224 }
1225 case 78:
1226 {
1227 if (Diff(p[4], p[2]))
1228 {
1229 PIXEL00_10
1230 }
1231 else
1232 {
1233 PIXEL00_70
1234 }
1235 PIXEL01_12
1236 if (Diff(p[8], p[4]))
1237 {
1238 PIXEL10_10
1239 }
1240 else
1241 {
1242 PIXEL10_70
1243 }
1244 PIXEL11_22
1245 break;
1246 }
1247 case 154:
1248 {
1249 if (Diff(p[4], p[2]))
1250 {
1251 PIXEL00_10
1252 }
1253 else
1254 {
1255 PIXEL00_70
1256 }
1257 if (Diff(p[2], p[6]))
1258 {
1259 PIXEL01_10
1260 }
1261 else
1262 {
1263 PIXEL01_70
1264 }
1265 PIXEL10_22
1266 PIXEL11_12
1267 break;
1268 }
1269 case 114:
1270 {
1271 PIXEL00_22
1272 if (Diff(p[2], p[6]))
1273 {
1274 PIXEL01_10
1275 }
1276 else
1277 {
1278 PIXEL01_70
1279 }
1280 PIXEL10_12
1281 if (Diff(p[6], p[8]))
1282 {
1283 PIXEL11_10
1284 }
1285 else
1286 {
1287 PIXEL11_70
1288 }
1289 break;
1290 }
1291 case 89:
1292 {
1293 PIXEL00_12
1294 PIXEL01_22
1295 if (Diff(p[8], p[4]))
1296 {
1297 PIXEL10_10
1298 }
1299 else
1300 {
1301 PIXEL10_70
1302 }
1303 if (Diff(p[6], p[8]))
1304 {
1305 PIXEL11_10
1306 }
1307 else
1308 {
1309 PIXEL11_70
1310 }
1311 break;
1312 }
1313 case 90:
1314 {
1315 if (Diff(p[4], p[2]))
1316 {
1317 PIXEL00_10
1318 }
1319 else
1320 {
1321 PIXEL00_70
1322 }
1323 if (Diff(p[2], p[6]))
1324 {
1325 PIXEL01_10
1326 }
1327 else
1328 {
1329 PIXEL01_70
1330 }
1331 if (Diff(p[8], p[4]))
1332 {
1333 PIXEL10_10
1334 }
1335 else
1336 {
1337 PIXEL10_70
1338 }
1339 if (Diff(p[6], p[8]))
1340 {
1341 PIXEL11_10
1342 }
1343 else
1344 {
1345 PIXEL11_70
1346 }
1347 break;
1348 }
1349 case 55:
1350 case 23:
1351 {
1352 if (Diff(p[2], p[6]))
1353 {
1354 PIXEL00_11
1355 PIXEL01_0
1356 }
1357 else
1358 {
1359 PIXEL00_60
1360 PIXEL01_90
1361 }
1362 PIXEL10_20
1363 PIXEL11_21
1364 break;
1365 }
1366 case 182:
1367 case 150:
1368 {
1369 PIXEL00_22
1370 if (Diff(p[2], p[6]))
1371 {
1372 PIXEL01_0
1373 PIXEL11_12
1374 }
1375 else
1376 {
1377 PIXEL01_90
1378 PIXEL11_61
1379 }
1380 PIXEL10_20
1381 break;
1382 }
1383 case 213:
1384 case 212:
1385 {
1386 PIXEL00_20
1387 if (Diff(p[6], p[8]))
1388 {
1389 PIXEL01_11
1390 PIXEL11_0
1391 }
1392 else
1393 {
1394 PIXEL01_60
1395 PIXEL11_90
1396 }
1397 PIXEL10_21
1398 break;
1399 }
1400 case 241:
1401 case 240:
1402 {
1403 PIXEL00_20
1404 PIXEL01_22
1405 if (Diff(p[6], p[8]))
1406 {
1407 PIXEL10_12
1408 PIXEL11_0
1409 }
1410 else
1411 {
1412 PIXEL10_61
1413 PIXEL11_90
1414 }
1415 break;
1416 }
1417 case 236:
1418 case 232:
1419 {
1420 PIXEL00_21
1421 PIXEL01_20
1422 if (Diff(p[8], p[4]))
1423 {
1424 PIXEL10_0
1425 PIXEL11_11
1426 }
1427 else
1428 {
1429 PIXEL10_90
1430 PIXEL11_60
1431 }
1432 break;
1433 }
1434 case 109:
1435 case 105:
1436 {
1437 if (Diff(p[8], p[4]))
1438 {
1439 PIXEL00_12
1440 PIXEL10_0
1441 }
1442 else
1443 {
1444 PIXEL00_61
1445 PIXEL10_90
1446 }
1447 PIXEL01_20
1448 PIXEL11_22
1449 break;
1450 }
1451 case 171:
1452 case 43:
1453 {
1454 if (Diff(p[4], p[2]))
1455 {
1456 PIXEL00_0
1457 PIXEL10_11
1458 }
1459 else
1460 {
1461 PIXEL00_90
1462 PIXEL10_60
1463 }
1464 PIXEL01_21
1465 PIXEL11_20
1466 break;
1467 }
1468 case 143:
1469 case 15:
1470 {
1471 if (Diff(p[4], p[2]))
1472 {
1473 PIXEL00_0
1474 PIXEL01_12
1475 }
1476 else
1477 {
1478 PIXEL00_90
1479 PIXEL01_61
1480 }
1481 PIXEL10_22
1482 PIXEL11_20
1483 break;
1484 }
1485 case 124:
1486 {
1487 PIXEL00_21
1488 PIXEL01_11
1489 if (Diff(p[8], p[4]))
1490 {
1491 PIXEL10_0
1492 }
1493 else
1494 {
1495 PIXEL10_20
1496 }
1497 PIXEL11_10
1498 break;
1499 }
1500 case 203:
1501 {
1502 if (Diff(p[4], p[2]))
1503 {
1504 PIXEL00_0
1505 }
1506 else
1507 {
1508 PIXEL00_20
1509 }
1510 PIXEL01_21
1511 PIXEL10_10
1512 PIXEL11_11
1513 break;
1514 }
1515 case 62:
1516 {
1517 PIXEL00_10
1518 if (Diff(p[2], p[6]))
1519 {
1520 PIXEL01_0
1521 }
1522 else
1523 {
1524 PIXEL01_20
1525 }
1526 PIXEL10_11
1527 PIXEL11_21
1528 break;
1529 }
1530 case 211:
1531 {
1532 PIXEL00_11
1533 PIXEL01_10
1534 PIXEL10_21
1535 if (Diff(p[6], p[8]))
1536 {
1537 PIXEL11_0
1538 }
1539 else
1540 {
1541 PIXEL11_20
1542 }
1543 break;
1544 }
1545 case 118:
1546 {
1547 PIXEL00_22
1548 if (Diff(p[2], p[6]))
1549 {
1550 PIXEL01_0
1551 }
1552 else
1553 {
1554 PIXEL01_20
1555 }
1556 PIXEL10_12
1557 PIXEL11_10
1558 break;
1559 }
1560 case 217:
1561 {
1562 PIXEL00_12
1563 PIXEL01_22
1564 PIXEL10_10
1565 if (Diff(p[6], p[8]))
1566 {
1567 PIXEL11_0
1568 }
1569 else
1570 {
1571 PIXEL11_20
1572 }
1573 break;
1574 }
1575 case 110:
1576 {
1577 PIXEL00_10
1578 PIXEL01_12
1579 if (Diff(p[8], p[4]))
1580 {
1581 PIXEL10_0
1582 }
1583 else
1584 {
1585 PIXEL10_20
1586 }
1587 PIXEL11_22
1588 break;
1589 }
1590 case 155:
1591 {
1592 if (Diff(p[4], p[2]))
1593 {
1594 PIXEL00_0
1595 }
1596 else
1597 {
1598 PIXEL00_20
1599 }
1600 PIXEL01_10
1601 PIXEL10_22
1602 PIXEL11_12
1603 break;
1604 }
1605 case 188:
1606 {
1607 PIXEL00_21
1608 PIXEL01_11
1609 PIXEL10_11
1610 PIXEL11_12
1611 break;
1612 }
1613 case 185:
1614 {
1615 PIXEL00_12
1616 PIXEL01_22
1617 PIXEL10_11
1618 PIXEL11_12
1619 break;
1620 }
1621 case 61:
1622 {
1623 PIXEL00_12
1624 PIXEL01_11
1625 PIXEL10_11
1626 PIXEL11_21
1627 break;
1628 }
1629 case 157:
1630 {
1631 PIXEL00_12
1632 PIXEL01_11
1633 PIXEL10_22
1634 PIXEL11_12
1635 break;
1636 }
1637 case 103:
1638 {
1639 PIXEL00_11
1640 PIXEL01_12
1641 PIXEL10_12
1642 PIXEL11_22
1643 break;
1644 }
1645 case 227:
1646 {
1647 PIXEL00_11
1648 PIXEL01_21
1649 PIXEL10_12
1650 PIXEL11_11
1651 break;
1652 }
1653 case 230:
1654 {
1655 PIXEL00_22
1656 PIXEL01_12
1657 PIXEL10_12
1658 PIXEL11_11
1659 break;
1660 }
1661 case 199:
1662 {
1663 PIXEL00_11
1664 PIXEL01_12
1665 PIXEL10_21
1666 PIXEL11_11
1667 break;
1668 }
1669 case 220:
1670 {
1671 PIXEL00_21
1672 PIXEL01_11
1673 if (Diff(p[8], p[4]))
1674 {
1675 PIXEL10_10
1676 }
1677 else
1678 {
1679 PIXEL10_70
1680 }
1681 if (Diff(p[6], p[8]))
1682 {
1683 PIXEL11_0
1684 }
1685 else
1686 {
1687 PIXEL11_20
1688 }
1689 break;
1690 }
1691 case 158:
1692 {
1693 if (Diff(p[4], p[2]))
1694 {
1695 PIXEL00_10
1696 }
1697 else
1698 {
1699 PIXEL00_70
1700 }
1701 if (Diff(p[2], p[6]))
1702 {
1703 PIXEL01_0
1704 }
1705 else
1706 {
1707 PIXEL01_20
1708 }
1709 PIXEL10_22
1710 PIXEL11_12
1711 break;
1712 }
1713 case 234:
1714 {
1715 if (Diff(p[4], p[2]))
1716 {
1717 PIXEL00_10
1718 }
1719 else
1720 {
1721 PIXEL00_70
1722 }
1723 PIXEL01_21
1724 if (Diff(p[8], p[4]))
1725 {
1726 PIXEL10_0
1727 }
1728 else
1729 {
1730 PIXEL10_20
1731 }
1732 PIXEL11_11
1733 break;
1734 }
1735 case 242:
1736 {
1737 PIXEL00_22
1738 if (Diff(p[2], p[6]))
1739 {
1740 PIXEL01_10
1741 }
1742 else
1743 {
1744 PIXEL01_70
1745 }
1746 PIXEL10_12
1747 if (Diff(p[6], p[8]))
1748 {
1749 PIXEL11_0
1750 }
1751 else
1752 {
1753 PIXEL11_20
1754 }
1755 break;
1756 }
1757 case 59:
1758 {
1759 if (Diff(p[4], p[2]))
1760 {
1761 PIXEL00_0
1762 }
1763 else
1764 {
1765 PIXEL00_20
1766 }
1767 if (Diff(p[2], p[6]))
1768 {
1769 PIXEL01_10
1770 }
1771 else
1772 {
1773 PIXEL01_70
1774 }
1775 PIXEL10_11
1776 PIXEL11_21
1777 break;
1778 }
1779 case 121:
1780 {
1781 PIXEL00_12
1782 PIXEL01_22
1783 if (Diff(p[8], p[4]))
1784 {
1785 PIXEL10_0
1786 }
1787 else
1788 {
1789 PIXEL10_20
1790 }
1791 if (Diff(p[6], p[8]))
1792 {
1793 PIXEL11_10
1794 }
1795 else
1796 {
1797 PIXEL11_70
1798 }
1799 break;
1800 }
1801 case 87:
1802 {
1803 PIXEL00_11
1804 if (Diff(p[2], p[6]))
1805 {
1806 PIXEL01_0
1807 }
1808 else
1809 {
1810 PIXEL01_20
1811 }
1812 PIXEL10_21
1813 if (Diff(p[6], p[8]))
1814 {
1815 PIXEL11_10
1816 }
1817 else
1818 {
1819 PIXEL11_70
1820 }
1821 break;
1822 }
1823 case 79:
1824 {
1825 if (Diff(p[4], p[2]))
1826 {
1827 PIXEL00_0
1828 }
1829 else
1830 {
1831 PIXEL00_20
1832 }
1833 PIXEL01_12
1834 if (Diff(p[8], p[4]))
1835 {
1836 PIXEL10_10
1837 }
1838 else
1839 {
1840 PIXEL10_70
1841 }
1842 PIXEL11_22
1843 break;
1844 }
1845 case 122:
1846 {
1847 if (Diff(p[4], p[2]))
1848 {
1849 PIXEL00_10
1850 }
1851 else
1852 {
1853 PIXEL00_70
1854 }
1855 if (Diff(p[2], p[6]))
1856 {
1857 PIXEL01_10
1858 }
1859 else
1860 {
1861 PIXEL01_70
1862 }
1863 if (Diff(p[8], p[4]))
1864 {
1865 PIXEL10_0
1866 }
1867 else
1868 {
1869 PIXEL10_20
1870 }
1871 if (Diff(p[6], p[8]))
1872 {
1873 PIXEL11_10
1874 }
1875 else
1876 {
1877 PIXEL11_70
1878 }
1879 break;
1880 }
1881 case 94:
1882 {
1883 if (Diff(p[4], p[2]))
1884 {
1885 PIXEL00_10
1886 }
1887 else
1888 {
1889 PIXEL00_70
1890 }
1891 if (Diff(p[2], p[6]))
1892 {
1893 PIXEL01_0
1894 }
1895 else
1896 {
1897 PIXEL01_20
1898 }
1899 if (Diff(p[8], p[4]))
1900 {
1901 PIXEL10_10
1902 }
1903 else
1904 {
1905 PIXEL10_70
1906 }
1907 if (Diff(p[6], p[8]))
1908 {
1909 PIXEL11_10
1910 }
1911 else
1912 {
1913 PIXEL11_70
1914 }
1915 break;
1916 }
1917 case 218:
1918 {
1919 if (Diff(p[4], p[2]))
1920 {
1921 PIXEL00_10
1922 }
1923 else
1924 {
1925 PIXEL00_70
1926 }
1927 if (Diff(p[2], p[6]))
1928 {
1929 PIXEL01_10
1930 }
1931 else
1932 {
1933 PIXEL01_70
1934 }
1935 if (Diff(p[8], p[4]))
1936 {
1937 PIXEL10_10
1938 }
1939 else
1940 {
1941 PIXEL10_70
1942 }
1943 if (Diff(p[6], p[8]))
1944 {
1945 PIXEL11_0
1946 }
1947 else
1948 {
1949 PIXEL11_20
1950 }
1951 break;
1952 }
1953 case 91:
1954 {
1955 if (Diff(p[4], p[2]))
1956 {
1957 PIXEL00_0
1958 }
1959 else
1960 {
1961 PIXEL00_20
1962 }
1963 if (Diff(p[2], p[6]))
1964 {
1965 PIXEL01_10
1966 }
1967 else
1968 {
1969 PIXEL01_70
1970 }
1971 if (Diff(p[8], p[4]))
1972 {
1973 PIXEL10_10
1974 }
1975 else
1976 {
1977 PIXEL10_70
1978 }
1979 if (Diff(p[6], p[8]))
1980 {
1981 PIXEL11_10
1982 }
1983 else
1984 {
1985 PIXEL11_70
1986 }
1987 break;
1988 }
1989 case 229:
1990 {
1991 PIXEL00_20
1992 PIXEL01_20
1993 PIXEL10_12
1994 PIXEL11_11
1995 break;
1996 }
1997 case 167:
1998 {
1999 PIXEL00_11
2000 PIXEL01_12
2001 PIXEL10_20
2002 PIXEL11_20
2003 break;
2004 }
2005 case 173:
2006 {
2007 PIXEL00_12
2008 PIXEL01_20
2009 PIXEL10_11
2010 PIXEL11_20
2011 break;
2012 }
2013 case 181:
2014 {
2015 PIXEL00_20
2016 PIXEL01_11
2017 PIXEL10_20
2018 PIXEL11_12
2019 break;
2020 }
2021 case 186:
2022 {
2023 if (Diff(p[4], p[2]))
2024 {
2025 PIXEL00_10
2026 }
2027 else
2028 {
2029 PIXEL00_70
2030 }
2031 if (Diff(p[2], p[6]))
2032 {
2033 PIXEL01_10
2034 }
2035 else
2036 {
2037 PIXEL01_70
2038 }
2039 PIXEL10_11
2040 PIXEL11_12
2041 break;
2042 }
2043 case 115:
2044 {
2045 PIXEL00_11
2046 if (Diff(p[2], p[6]))
2047 {
2048 PIXEL01_10
2049 }
2050 else
2051 {
2052 PIXEL01_70
2053 }
2054 PIXEL10_12
2055 if (Diff(p[6], p[8]))
2056 {
2057 PIXEL11_10
2058 }
2059 else
2060 {
2061 PIXEL11_70
2062 }
2063 break;
2064 }
2065 case 93:
2066 {
2067 PIXEL00_12
2068 PIXEL01_11
2069 if (Diff(p[8], p[4]))
2070 {
2071 PIXEL10_10
2072 }
2073 else
2074 {
2075 PIXEL10_70
2076 }
2077 if (Diff(p[6], p[8]))
2078 {
2079 PIXEL11_10
2080 }
2081 else
2082 {
2083 PIXEL11_70
2084 }
2085 break;
2086 }
2087 case 206:
2088 {
2089 if (Diff(p[4], p[2]))
2090 {
2091 PIXEL00_10
2092 }
2093 else
2094 {
2095 PIXEL00_70
2096 }
2097 PIXEL01_12
2098 if (Diff(p[8], p[4]))
2099 {
2100 PIXEL10_10
2101 }
2102 else
2103 {
2104 PIXEL10_70
2105 }
2106 PIXEL11_11
2107 break;
2108 }
2109 case 205:
2110 case 201:
2111 {
2112 PIXEL00_12
2113 PIXEL01_20
2114 if (Diff(p[8], p[4]))
2115 {
2116 PIXEL10_10
2117 }
2118 else
2119 {
2120 PIXEL10_70
2121 }
2122 PIXEL11_11
2123 break;
2124 }
2125 case 174:
2126 case 46:
2127 {
2128 if (Diff(p[4], p[2]))
2129 {
2130 PIXEL00_10
2131 }
2132 else
2133 {
2134 PIXEL00_70
2135 }
2136 PIXEL01_12
2137 PIXEL10_11
2138 PIXEL11_20
2139 break;
2140 }
2141 case 179:
2142 case 147:
2143 {
2144 PIXEL00_11
2145 if (Diff(p[2], p[6]))
2146 {
2147 PIXEL01_10
2148 }
2149 else
2150 {
2151 PIXEL01_70
2152 }
2153 PIXEL10_20
2154 PIXEL11_12
2155 break;
2156 }
2157 case 117:
2158 case 116:
2159 {
2160 PIXEL00_20
2161 PIXEL01_11
2162 PIXEL10_12
2163 if (Diff(p[6], p[8]))
2164 {
2165 PIXEL11_10
2166 }
2167 else
2168 {
2169 PIXEL11_70
2170 }
2171 break;
2172 }
2173 case 189:
2174 {
2175 PIXEL00_12
2176 PIXEL01_11
2177 PIXEL10_11
2178 PIXEL11_12
2179 break;
2180 }
2181 case 231:
2182 {
2183 PIXEL00_11
2184 PIXEL01_12
2185 PIXEL10_12
2186 PIXEL11_11
2187 break;
2188 }
2189 case 126:
2190 {
2191 PIXEL00_10
2192 if (Diff(p[2], p[6]))
2193 {
2194 PIXEL01_0
2195 }
2196 else
2197 {
2198 PIXEL01_20
2199 }
2200 if (Diff(p[8], p[4]))
2201 {
2202 PIXEL10_0
2203 }
2204 else
2205 {
2206 PIXEL10_20
2207 }
2208 PIXEL11_10
2209 break;
2210 }
2211 case 219:
2212 {
2213 if (Diff(p[4], p[2]))
2214 {
2215 PIXEL00_0
2216 }
2217 else
2218 {
2219 PIXEL00_20
2220 }
2221 PIXEL01_10
2222 PIXEL10_10
2223 if (Diff(p[6], p[8]))
2224 {
2225 PIXEL11_0
2226 }
2227 else
2228 {
2229 PIXEL11_20
2230 }
2231 break;
2232 }
2233 case 125:
2234 {
2235 if (Diff(p[8], p[4]))
2236 {
2237 PIXEL00_12
2238 PIXEL10_0
2239 }
2240 else
2241 {
2242 PIXEL00_61
2243 PIXEL10_90
2244 }
2245 PIXEL01_11
2246 PIXEL11_10
2247 break;
2248 }
2249 case 221:
2250 {
2251 PIXEL00_12
2252 if (Diff(p[6], p[8]))
2253 {
2254 PIXEL01_11
2255 PIXEL11_0
2256 }
2257 else
2258 {
2259 PIXEL01_60
2260 PIXEL11_90
2261 }
2262 PIXEL10_10
2263 break;
2264 }
2265 case 207:
2266 {
2267 if (Diff(p[4], p[2]))
2268 {
2269 PIXEL00_0
2270 PIXEL01_12
2271 }
2272 else
2273 {
2274 PIXEL00_90
2275 PIXEL01_61
2276 }
2277 PIXEL10_10
2278 PIXEL11_11
2279 break;
2280 }
2281 case 238:
2282 {
2283 PIXEL00_10
2284 PIXEL01_12
2285 if (Diff(p[8], p[4]))
2286 {
2287 PIXEL10_0
2288 PIXEL11_11
2289 }
2290 else
2291 {
2292 PIXEL10_90
2293 PIXEL11_60
2294 }
2295 break;
2296 }
2297 case 190:
2298 {
2299 PIXEL00_10
2300 if (Diff(p[2], p[6]))
2301 {
2302 PIXEL01_0
2303 PIXEL11_12
2304 }
2305 else
2306 {
2307 PIXEL01_90
2308 PIXEL11_61
2309 }
2310 PIXEL10_11
2311 break;
2312 }
2313 case 187:
2314 {
2315 if (Diff(p[4], p[2]))
2316 {
2317 PIXEL00_0
2318 PIXEL10_11
2319 }
2320 else
2321 {
2322 PIXEL00_90
2323 PIXEL10_60
2324 }
2325 PIXEL01_10
2326 PIXEL11_12
2327 break;
2328 }
2329 case 243:
2330 {
2331 PIXEL00_11
2332 PIXEL01_10
2333 if (Diff(p[6], p[8]))
2334 {
2335 PIXEL10_12
2336 PIXEL11_0
2337 }
2338 else
2339 {
2340 PIXEL10_61
2341 PIXEL11_90
2342 }
2343 break;
2344 }
2345 case 119:
2346 {
2347 if (Diff(p[2], p[6]))
2348 {
2349 PIXEL00_11
2350 PIXEL01_0
2351 }
2352 else
2353 {
2354 PIXEL00_60
2355 PIXEL01_90
2356 }
2357 PIXEL10_12
2358 PIXEL11_10
2359 break;
2360 }
2361 case 237:
2362 case 233:
2363 {
2364 PIXEL00_12
2365 PIXEL01_20
2366 if (Diff(p[8], p[4]))
2367 {
2368 PIXEL10_0
2369 }
2370 else
2371 {
2372 PIXEL10_100
2373 }
2374 PIXEL11_11
2375 break;
2376 }
2377 case 175:
2378 case 47:
2379 {
2380 if (Diff(p[4], p[2]))
2381 {
2382 PIXEL00_0
2383 }
2384 else
2385 {
2386 PIXEL00_100
2387 }
2388 PIXEL01_12
2389 PIXEL10_11
2390 PIXEL11_20
2391 break;
2392 }
2393 case 183:
2394 case 151:
2395 {
2396 PIXEL00_11
2397 if (Diff(p[2], p[6]))
2398 {
2399 PIXEL01_0
2400 }
2401 else
2402 {
2403 PIXEL01_100
2404 }
2405 PIXEL10_20
2406 PIXEL11_12
2407 break;
2408 }
2409 case 245:
2410 case 244:
2411 {
2412 PIXEL00_20
2413 PIXEL01_11
2414 PIXEL10_12
2415 if (Diff(p[6], p[8]))
2416 {
2417 PIXEL11_0
2418 }
2419 else
2420 {
2421 PIXEL11_100
2422 }
2423 break;
2424 }
2425 case 250:
2426 {
2427 PIXEL00_10
2428 PIXEL01_10
2429 if (Diff(p[8], p[4]))
2430 {
2431 PIXEL10_0
2432 }
2433 else
2434 {
2435 PIXEL10_20
2436 }
2437 if (Diff(p[6], p[8]))
2438 {
2439 PIXEL11_0
2440 }
2441 else
2442 {
2443 PIXEL11_20
2444 }
2445 break;
2446 }
2447 case 123:
2448 {
2449 if (Diff(p[4], p[2]))
2450 {
2451 PIXEL00_0
2452 }
2453 else
2454 {
2455 PIXEL00_20
2456 }
2457 PIXEL01_10
2458 if (Diff(p[8], p[4]))
2459 {
2460 PIXEL10_0
2461 }
2462 else
2463 {
2464 PIXEL10_20
2465 }
2466 PIXEL11_10
2467 break;
2468 }
2469 case 95:
2470 {
2471 if (Diff(p[4], p[2]))
2472 {
2473 PIXEL00_0
2474 }
2475 else
2476 {
2477 PIXEL00_20
2478 }
2479 if (Diff(p[2], p[6]))
2480 {
2481 PIXEL01_0
2482 }
2483 else
2484 {
2485 PIXEL01_20
2486 }
2487 PIXEL10_10
2488 PIXEL11_10
2489 break;
2490 }
2491 case 222:
2492 {
2493 PIXEL00_10
2494 if (Diff(p[2], p[6]))
2495 {
2496 PIXEL01_0
2497 }
2498 else
2499 {
2500 PIXEL01_20
2501 }
2502 PIXEL10_10
2503 if (Diff(p[6], p[8]))
2504 {
2505 PIXEL11_0
2506 }
2507 else
2508 {
2509 PIXEL11_20
2510 }
2511 break;
2512 }
2513 case 252:
2514 {
2515 PIXEL00_21
2516 PIXEL01_11
2517 if (Diff(p[8], p[4]))
2518 {
2519 PIXEL10_0
2520 }
2521 else
2522 {
2523 PIXEL10_20
2524 }
2525 if (Diff(p[6], p[8]))
2526 {
2527 PIXEL11_0
2528 }
2529 else
2530 {
2531 PIXEL11_100
2532 }
2533 break;
2534 }
2535 case 249:
2536 {
2537 PIXEL00_12
2538 PIXEL01_22
2539 if (Diff(p[8], p[4]))
2540 {
2541 PIXEL10_0
2542 }
2543 else
2544 {
2545 PIXEL10_100
2546 }
2547 if (Diff(p[6], p[8]))
2548 {
2549 PIXEL11_0
2550 }
2551 else
2552 {
2553 PIXEL11_20
2554 }
2555 break;
2556 }
2557 case 235:
2558 {
2559 if (Diff(p[4], p[2]))
2560 {
2561 PIXEL00_0
2562 }
2563 else
2564 {
2565 PIXEL00_20
2566 }
2567 PIXEL01_21
2568 if (Diff(p[8], p[4]))
2569 {
2570 PIXEL10_0
2571 }
2572 else
2573 {
2574 PIXEL10_100
2575 }
2576 PIXEL11_11
2577 break;
2578 }
2579 case 111:
2580 {
2581 if (Diff(p[4], p[2]))
2582 {
2583 PIXEL00_0
2584 }
2585 else
2586 {
2587 PIXEL00_100
2588 }
2589 PIXEL01_12
2590 if (Diff(p[8], p[4]))
2591 {
2592 PIXEL10_0
2593 }
2594 else
2595 {
2596 PIXEL10_20
2597 }
2598 PIXEL11_22
2599 break;
2600 }
2601 case 63:
2602 {
2603 if (Diff(p[4], p[2]))
2604 {
2605 PIXEL00_0
2606 }
2607 else
2608 {
2609 PIXEL00_100
2610 }
2611 if (Diff(p[2], p[6]))
2612 {
2613 PIXEL01_0
2614 }
2615 else
2616 {
2617 PIXEL01_20
2618 }
2619 PIXEL10_11
2620 PIXEL11_21
2621 break;
2622 }
2623 case 159:
2624 {
2625 if (Diff(p[4], p[2]))
2626 {
2627 PIXEL00_0
2628 }
2629 else
2630 {
2631 PIXEL00_20
2632 }
2633 if (Diff(p[2], p[6]))
2634 {
2635 PIXEL01_0
2636 }
2637 else
2638 {
2639 PIXEL01_100
2640 }
2641 PIXEL10_22
2642 PIXEL11_12
2643 break;
2644 }
2645 case 215:
2646 {
2647 PIXEL00_11
2648 if (Diff(p[2], p[6]))
2649 {
2650 PIXEL01_0
2651 }
2652 else
2653 {
2654 PIXEL01_100
2655 }
2656 PIXEL10_21
2657 if (Diff(p[6], p[8]))
2658 {
2659 PIXEL11_0
2660 }
2661 else
2662 {
2663 PIXEL11_20
2664 }
2665 break;
2666 }
2667 case 246:
2668 {
2669 PIXEL00_22
2670 if (Diff(p[2], p[6]))
2671 {
2672 PIXEL01_0
2673 }
2674 else
2675 {
2676 PIXEL01_20
2677 }
2678 PIXEL10_12
2679 if (Diff(p[6], p[8]))
2680 {
2681 PIXEL11_0
2682 }
2683 else
2684 {
2685 PIXEL11_100
2686 }
2687 break;
2688 }
2689 case 254:
2690 {
2691 PIXEL00_10
2692 if (Diff(p[2], p[6]))
2693 {
2694 PIXEL01_0
2695 }
2696 else
2697 {
2698 PIXEL01_20
2699 }
2700 if (Diff(p[8], p[4]))
2701 {
2702 PIXEL10_0
2703 }
2704 else
2705 {
2706 PIXEL10_20
2707 }
2708 if (Diff(p[6], p[8]))
2709 {
2710 PIXEL11_0
2711 }
2712 else
2713 {
2714 PIXEL11_100
2715 }
2716 break;
2717 }
2718 case 253:
2719 {
2720 PIXEL00_12
2721 PIXEL01_11
2722 if (Diff(p[8], p[4]))
2723 {
2724 PIXEL10_0
2725 }
2726 else
2727 {
2728 PIXEL10_100
2729 }
2730 if (Diff(p[6], p[8]))
2731 {
2732 PIXEL11_0
2733 }
2734 else
2735 {
2736 PIXEL11_100
2737 }
2738 break;
2739 }
2740 case 251:
2741 {
2742 if (Diff(p[4], p[2]))
2743 {
2744 PIXEL00_0
2745 }
2746 else
2747 {
2748 PIXEL00_20
2749 }
2750 PIXEL01_10
2751 if (Diff(p[8], p[4]))
2752 {
2753 PIXEL10_0
2754 }
2755 else
2756 {
2757 PIXEL10_100
2758 }
2759 if (Diff(p[6], p[8]))
2760 {
2761 PIXEL11_0
2762 }
2763 else
2764 {
2765 PIXEL11_20
2766 }
2767 break;
2768 }
2769 case 239:
2770 {
2771 if (Diff(p[4], p[2]))
2772 {
2773 PIXEL00_0
2774 }
2775 else
2776 {
2777 PIXEL00_100
2778 }
2779 PIXEL01_12
2780 if (Diff(p[8], p[4]))
2781 {
2782 PIXEL10_0
2783 }
2784 else
2785 {
2786 PIXEL10_100
2787 }
2788 PIXEL11_11
2789 break;
2790 }
2791 case 127:
2792 {
2793 if (Diff(p[4], p[2]))
2794 {
2795 PIXEL00_0
2796 }
2797 else
2798 {
2799 PIXEL00_100
2800 }
2801 if (Diff(p[2], p[6]))
2802 {
2803 PIXEL01_0
2804 }
2805 else
2806 {
2807 PIXEL01_20
2808 }
2809 if (Diff(p[8], p[4]))
2810 {
2811 PIXEL10_0
2812 }
2813 else
2814 {
2815 PIXEL10_20
2816 }
2817 PIXEL11_10
2818 break;
2819 }
2820 case 191:
2821 {
2822 if (Diff(p[4], p[2]))
2823 {
2824 PIXEL00_0
2825 }
2826 else
2827 {
2828 PIXEL00_100
2829 }
2830 if (Diff(p[2], p[6]))
2831 {
2832 PIXEL01_0
2833 }
2834 else
2835 {
2836 PIXEL01_100
2837 }
2838 PIXEL10_11
2839 PIXEL11_12
2840 break;
2841 }
2842 case 223:
2843 {
2844 if (Diff(p[4], p[2]))
2845 {
2846 PIXEL00_0
2847 }
2848 else
2849 {
2850 PIXEL00_20
2851 }
2852 if (Diff(p[2], p[6]))
2853 {
2854 PIXEL01_0
2855 }
2856 else
2857 {
2858 PIXEL01_100
2859 }
2860 PIXEL10_10
2861 if (Diff(p[6], p[8]))
2862 {
2863 PIXEL11_0
2864 }
2865 else
2866 {
2867 PIXEL11_20
2868 }
2869 break;
2870 }
2871 case 247:
2872 {
2873 PIXEL00_11
2874 if (Diff(p[2], p[6]))
2875 {
2876 PIXEL01_0
2877 }
2878 else
2879 {
2880 PIXEL01_100
2881 }
2882 PIXEL10_12
2883 if (Diff(p[6], p[8]))
2884 {
2885 PIXEL11_0
2886 }
2887 else
2888 {
2889 PIXEL11_100
2890 }
2891 break;
2892 }
2893 case 255:
2894 {
2895 if (Diff(p[4], p[2]))
2896 {
2897 PIXEL00_0
2898 }
2899 else
2900 {
2901 PIXEL00_100
2902 }
2903 if (Diff(p[2], p[6]))
2904 {
2905 PIXEL01_0
2906 }
2907 else
2908 {
2909 PIXEL01_100
2910 }
2911 if (Diff(p[8], p[4]))
2912 {
2913 PIXEL10_0
2914 }
2915 else
2916 {
2917 PIXEL10_100
2918 }
2919 if (Diff(p[6], p[8]))
2920 {
2921 PIXEL11_0
2922 }
2923 else
2924 {
2925 PIXEL11_100
2926 }
2927 break;
2928 }
2929 } // switch (pattern)
2930 } // for (x)
2931 }
2932
StripAlpha(u8_t * dest,const u8_t * src,int width)2933 void StripAlpha(u8_t *dest, const u8_t *src, int width)
2934 {
2935 // we don't care about transparent pixels here (on the assumption
2936 // that the original image didn't have any).
2937
2938 const u8_t *src_end = src + width * 8;
2939
2940 for (; src < src_end; src += 4, dest += 3)
2941 {
2942 dest[0] = src[0];
2943 dest[1] = src[1];
2944 dest[2] = src[2];
2945 }
2946 }
2947
Convert(image_data_c * img,bool solid,bool invert)2948 image_data_c *Convert(image_data_c *img, bool solid, bool invert)
2949 {
2950 int w = img->width;
2951 int h = img->height;
2952
2953 image_data_c *result = new image_data_c(w*2, h*2, solid ? 3 : 4);
2954
2955 // for solid mode, we must strip off the alpha channel
2956 u8_t *temp_buffer = NULL;
2957
2958 if (solid)
2959 temp_buffer = new u8_t[w * 16]; // two lines worth
2960
2961 for (int y = 0; y < h; y++)
2962 {
2963 int dst_y = invert ? (h-1 - y) : y;
2964
2965 u8_t *out_buf = solid ? temp_buffer : result->PixelAt(0, dst_y*2);
2966
2967 ConvertLine(y, w, h, invert, out_buf, img->PixelAt(0, y));
2968
2969 if (solid)
2970 StripAlpha(result->PixelAt(0, dst_y*2), temp_buffer, w*2);
2971 }
2972
2973 if (temp_buffer)
2974 delete[] temp_buffer;
2975
2976 return result;
2977 }
2978
2979 } // namespace Hq2x
2980 } // namespace epi
2981
2982 //--- editor settings ---
2983 // vi:ts=4:sw=4:noexpandtab
2984