ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/utils/cfhq2xa.C
Revision: 1.2
Committed: Mon May 28 21:21:42 2007 UTC (16 years, 11 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.1: +24 -19 lines
Log Message:
update copyrights in common/*.C and util/*.C

File Contents

# User Rev Content
1 root 1.2 /*
2     * This file is part of Crossfire TRT, the Multiplayer Online Role Playing Game.
3     *
4     * Copyright (©) 2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team
5     * Copyright (©) 2003,2007 MaxSt <maxst@hiend3d.com>
6     *
7     * Crossfire TRT is free software; you can redistribute it and/or modify it
8     * under the terms of the GNU General Public License as published by the Free
9     * Software Foundation; either version 2 of the License, or (at your option)
10     * any later version.
11     *
12     * This program is distributed in the hope that it will be useful, but
13     * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14     * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15     * for more details.
16     *
17     * You should have received a copy of the GNU General Public License along
18     * with Crossfire TRT; if not, write to the Free Software Foundation, Inc. 51
19     * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20     *
21     * The authors can be reached via e-mail to <crossfire@schmorp.de>
22     */
23    
24     // note: the original code was released under the LGPL version 2.1
25 root 1.1
26     #include <cstdio>
27     #include <cstring>
28     #include <stdlib.h>
29     #include <stdint.h>
30     #include <endian.h>
31    
32     using namespace std;
33    
34     #if __BYTE_ORDER == __BIG_ENDIAN
35     # define Rshift 24
36     # define Gshift 16
37     # define Bshift 8
38     # define Ashift 0
39     #else
40     # define Rshift 0
41     # define Gshift 8
42     # define Bshift 16
43     # define Ashift 24
44     #endif
45    
46     #define Cmask 0xffUL
47     #define Amask (Cmask << Ashift)
48    
49     typedef uint32_t pixel;
50    
51     // hq2xa
52    
53     # define trY 0x30
54     # define trU 0x11
55     # define trV 0x10
56     # define trA 0x40
57    
58     static inline pixel lerp (pixel c1, int w1, pixel c2, int w2, pixel c3, int w3, int shift)
59     {
60     #if 0
61     if (!(c1 >> Ashift) & Cmask) w1 = 0;
62     if (!(c2 >> Ashift) & Cmask) w2 = 0;
63     if (!(c3 >> Ashift) & Cmask) w3 = 0;
64     #endif
65    
66     int w = w1 + w2 + w3;
67    
68     return ((((c1 >> shift) & Cmask) * w1 + ((c2 >> shift) & Cmask) * w2 + ((c3 >> shift) & Cmask) * w3 + w / 2) / w) << shift;
69     }
70    
71     inline void lerp (unsigned char *pc, pixel c1, int w1, pixel c2, int w2, pixel c3 = 0, int w3 = 0)
72     {
73     *(pixel *)pc = lerp (c1, w1, c2, w2, c3, w3, Rshift)
74     | lerp (c1, w1, c2, w2, c3, w3, Gshift)
75     | lerp (c1, w1, c2, w2, c3, w3, Bshift)
76     | lerp (c1, w1, c2, w2, c3, w3, Ashift);
77     }
78    
79     inline void Interp1 (unsigned char *pc, pixel c1, pixel c2)
80     {
81     lerp (pc, c1, 3, c2, 1);
82     }
83    
84     inline void Interp2 (unsigned char *pc, pixel c1, pixel c2, pixel c3)
85     {
86     lerp (pc, c1, 2, c2, 1, c3, 1);
87     }
88    
89     inline void Interp5 (unsigned char *pc, pixel c1, pixel c2)
90     {
91     lerp (pc, c1, 1, c2, 1);
92     }
93    
94     inline void Interp6 (unsigned char *pc, pixel c1, pixel c2, pixel c3)
95     {
96     lerp (pc, c1, 5, c2, 2, c3, 1);
97     }
98    
99     inline void Interp7 (unsigned char *pc, pixel c1, pixel c2, pixel c3)
100     {
101     lerp (pc, c1, 6, c2, 1, c3, 1);
102     }
103    
104     inline void Interp9 (unsigned char *pc, pixel c1, pixel c2, pixel c3)
105     {
106     lerp (pc, c1, 2, c2, 3, c2, 3);
107     }
108    
109     inline void Interp10 (unsigned char *pc, pixel c1, pixel c2, pixel c3)
110     {
111     lerp (pc, c1, 14, c2, 1, c3, 1);
112     }
113    
114     #define PIXEL00_0 *((pixel *)(pOut)) = w[5];
115     #define PIXEL00_10 Interp1(pOut, w[5], w[1]);
116     #define PIXEL00_11 Interp1(pOut, w[5], w[4]);
117     #define PIXEL00_12 Interp1(pOut, w[5], w[2]);
118     #define PIXEL00_20 Interp2(pOut, w[5], w[4], w[2]);
119     #define PIXEL00_21 Interp2(pOut, w[5], w[1], w[2]);
120     #define PIXEL00_22 Interp2(pOut, w[5], w[1], w[4]);
121     #define PIXEL00_60 Interp6(pOut, w[5], w[2], w[4]);
122     #define PIXEL00_61 Interp6(pOut, w[5], w[4], w[2]);
123     #define PIXEL00_70 Interp7(pOut, w[5], w[4], w[2]);
124     #define PIXEL00_90 Interp9(pOut, w[5], w[4], w[2]);
125     #define PIXEL00_100 Interp10(pOut, w[5], w[4], w[2]);
126     #define PIXEL01_0 *((pixel *)(pOut + sizeof (pixel))) = w[5];
127     #define PIXEL01_10 Interp1(pOut + sizeof (pixel), w[5], w[3]);
128     #define PIXEL01_11 Interp1(pOut + sizeof (pixel), w[5], w[2]);
129     #define PIXEL01_12 Interp1(pOut + sizeof (pixel), w[5], w[6]);
130     #define PIXEL01_20 Interp2(pOut + sizeof (pixel), w[5], w[2], w[6]);
131     #define PIXEL01_21 Interp2(pOut + sizeof (pixel), w[5], w[3], w[6]);
132     #define PIXEL01_22 Interp2(pOut + sizeof (pixel), w[5], w[3], w[2]);
133     #define PIXEL01_60 Interp6(pOut + sizeof (pixel), w[5], w[6], w[2]);
134     #define PIXEL01_61 Interp6(pOut + sizeof (pixel), w[5], w[2], w[6]);
135     #define PIXEL01_70 Interp7(pOut + sizeof (pixel), w[5], w[2], w[6]);
136     #define PIXEL01_90 Interp9(pOut + sizeof (pixel), w[5], w[2], w[6]);
137     #define PIXEL01_100 Interp10(pOut + sizeof (pixel), w[5], w[2], w[6]);
138     #define PIXEL10_0 *((pixel *)(pOut+BpL)) = w[5];
139     #define PIXEL10_10 Interp1(pOut+BpL, w[5], w[7]);
140     #define PIXEL10_11 Interp1(pOut+BpL, w[5], w[8]);
141     #define PIXEL10_12 Interp1(pOut+BpL, w[5], w[4]);
142     #define PIXEL10_20 Interp2(pOut+BpL, w[5], w[8], w[4]);
143     #define PIXEL10_21 Interp2(pOut+BpL, w[5], w[7], w[4]);
144     #define PIXEL10_22 Interp2(pOut+BpL, w[5], w[7], w[8]);
145     #define PIXEL10_60 Interp6(pOut+BpL, w[5], w[4], w[8]);
146     #define PIXEL10_61 Interp6(pOut+BpL, w[5], w[8], w[4]);
147     #define PIXEL10_70 Interp7(pOut+BpL, w[5], w[8], w[4]);
148     #define PIXEL10_90 Interp9(pOut+BpL, w[5], w[8], w[4]);
149     #define PIXEL10_100 Interp10(pOut+BpL, w[5], w[8], w[4]);
150     #define PIXEL11_0 *((pixel *)(pOut+BpL + sizeof (pixel))) = w[5];
151     #define PIXEL11_10 Interp1(pOut+BpL + sizeof (pixel), w[5], w[9]);
152     #define PIXEL11_11 Interp1(pOut+BpL + sizeof (pixel), w[5], w[6]);
153     #define PIXEL11_12 Interp1(pOut+BpL + sizeof (pixel), w[5], w[8]);
154     #define PIXEL11_20 Interp2(pOut+BpL + sizeof (pixel), w[5], w[6], w[8]);
155     #define PIXEL11_21 Interp2(pOut+BpL + sizeof (pixel), w[5], w[9], w[8]);
156     #define PIXEL11_22 Interp2(pOut+BpL + sizeof (pixel), w[5], w[9], w[6]);
157     #define PIXEL11_60 Interp6(pOut+BpL + sizeof (pixel), w[5], w[8], w[6]);
158     #define PIXEL11_61 Interp6(pOut+BpL + sizeof (pixel), w[5], w[6], w[8]);
159     #define PIXEL11_70 Interp7(pOut+BpL + sizeof (pixel), w[5], w[6], w[8]);
160     #define PIXEL11_90 Interp9(pOut+BpL + sizeof (pixel), w[5], w[6], w[8]);
161     #define PIXEL11_100 Interp10(pOut+BpL + sizeof (pixel), w[5], w[6], w[8]);
162    
163     inline pixel RGBAtoYUVA (pixel w)
164     {
165     int r = (w >> Rshift) & Cmask;
166     int g = (w >> Gshift) & Cmask;
167     int b = (w >> Bshift) & Cmask;
168     int a = (w >> Ashift) & Cmask;
169    
170     int Y = (r + g + b) / 4;
171     int u = 128 + (r - b) / 4;
172     int v = 128 + (2 * g - r - b) / 8;
173    
174     return (Y << Rshift)
175     | (u << Gshift)
176     | (v << Bshift)
177     | (a << Ashift);
178     }
179    
180     inline bool Diff (pixel w1, pixel w2)
181     {
182     pixel YUV1 = RGBAtoYUVA (w1);
183     pixel YUV2 = RGBAtoYUVA (w2);
184    
185     return ((abs (((YUV1 >> Rshift) & Cmask) - ((YUV2 >> Rshift) & Cmask)) > trY) ||
186     (abs (((YUV1 >> Gshift) & Cmask) - ((YUV2 >> Gshift) & Cmask)) > trU) ||
187     (abs (((YUV1 >> Bshift) & Cmask) - ((YUV2 >> Bshift) & Cmask)) > trV) ||
188     (abs (((YUV1 >> Ashift) & Cmask) - ((YUV2 >> Ashift) & Cmask)) > trA) );
189     }
190    
191     void
192     hq2x_32 (unsigned char *pIn, unsigned char *pOut, int Xres, int Yres, int BpL, bool wrap)
193     {
194     int i, j, k;
195     int prevline, nextline;
196     pixel w[10];
197    
198     // +----+----+----+
199     // | | | |
200     // | w1 | w2 | w3 |
201     // +----+----+----+
202     // | | | |
203     // | w4 | w5 | w6 |
204     // +----+----+----+
205     // | | | |
206     // | w7 | w8 | w9 |
207     // +----+----+----+
208    
209     for (j = 0; j < Yres; j++)
210     {
211     if (j > 0)
212     prevline = -Xres * sizeof (pixel);
213     else
214     prevline = wrap ? -(Yres - 1) * Xres * sizeof (pixel) : 0;
215    
216     if (j < Yres - 1)
217     nextline = Xres * sizeof (pixel);
218     else
219     nextline = wrap ? -(Yres - 1) * Xres * sizeof (pixel) : 0;
220    
221     for (i = 0; i < Xres; i++)
222     {
223     w[2] = *((pixel *) (pIn + prevline));
224     w[5] = *((pixel *) pIn);
225     w[8] = *((pixel *) (pIn + nextline));
226    
227     if (i > 0)
228     {
229     w[1] = *((pixel *) (pIn + prevline - sizeof (pixel)));
230     w[4] = *((pixel *) (pIn - sizeof (pixel)));
231     w[7] = *((pixel *) (pIn + nextline - sizeof (pixel)));
232     }
233     else if (wrap)
234     {
235     w[1] = *((pixel *) (pIn + prevline + (Xres - 1) * sizeof (pixel)));
236     w[4] = *((pixel *) (pIn + (Xres - 1) * sizeof (pixel)));
237     w[7] = *((pixel *) (pIn + nextline + (Xres - 1) * sizeof (pixel)));
238     }
239     else
240     {
241     w[1] = w[2];
242     w[4] = w[5];
243     w[7] = w[8];
244     }
245    
246     if (i < Xres - 1)
247     {
248     w[3] = *((pixel *) (pIn + prevline + sizeof (pixel)));
249     w[6] = *((pixel *) (pIn + sizeof (pixel)));
250     w[9] = *((pixel *) (pIn + nextline + sizeof (pixel)));
251     }
252     else
253     {
254     w[3] = w[2];
255     w[6] = w[5];
256     w[9] = w[8];
257     }
258    
259     int pattern = 0;
260     int flag = 1;
261    
262     for (k = 1; k <= 9; k++)
263     {
264     if (k == 5)
265     continue;
266    
267     if (Diff (w[5], w[k]))
268     pattern |= flag;
269    
270     flag <<= 1;
271     }
272    
273     switch (pattern)
274     {
275     case 0:
276     case 1:
277     case 4:
278     case 32:
279     case 128:
280     case 5:
281     case 132:
282     case 160:
283     case 33:
284     case 129:
285     case 36:
286     case 133:
287     case 164:
288     case 161:
289     case 37:
290     case 165:
291     {
292     PIXEL00_20 PIXEL01_20 PIXEL10_20 PIXEL11_20 break;
293     }
294     case 2:
295     case 34:
296     case 130:
297     case 162:
298     {
299     PIXEL00_22 PIXEL01_21 PIXEL10_20 PIXEL11_20 break;
300     }
301     case 16:
302     case 17:
303     case 48:
304     case 49:
305     {
306     PIXEL00_20 PIXEL01_22 PIXEL10_20 PIXEL11_21 break;
307     }
308     case 64:
309     case 65:
310     case 68:
311     case 69:
312     {
313     PIXEL00_20 PIXEL01_20 PIXEL10_21 PIXEL11_22 break;
314     }
315     case 8:
316     case 12:
317     case 136:
318     case 140:
319     {
320     PIXEL00_21 PIXEL01_20 PIXEL10_22 PIXEL11_20 break;
321     }
322     case 3:
323     case 35:
324     case 131:
325     case 163:
326     {
327     PIXEL00_11 PIXEL01_21 PIXEL10_20 PIXEL11_20 break;
328     }
329     case 6:
330     case 38:
331     case 134:
332     case 166:
333     {
334     PIXEL00_22 PIXEL01_12 PIXEL10_20 PIXEL11_20 break;
335     }
336     case 20:
337     case 21:
338     case 52:
339     case 53:
340     {
341     PIXEL00_20 PIXEL01_11 PIXEL10_20 PIXEL11_21 break;
342     }
343     case 144:
344     case 145:
345     case 176:
346     case 177:
347     {
348     PIXEL00_20 PIXEL01_22 PIXEL10_20 PIXEL11_12 break;
349     }
350     case 192:
351     case 193:
352     case 196:
353     case 197:
354     {
355     PIXEL00_20 PIXEL01_20 PIXEL10_21 PIXEL11_11 break;
356     }
357     case 96:
358     case 97:
359     case 100:
360     case 101:
361     {
362     PIXEL00_20 PIXEL01_20 PIXEL10_12 PIXEL11_22 break;
363     }
364     case 40:
365     case 44:
366     case 168:
367     case 172:
368     {
369     PIXEL00_21 PIXEL01_20 PIXEL10_11 PIXEL11_20 break;
370     }
371     case 9:
372     case 13:
373     case 137:
374     case 141:
375     {
376     PIXEL00_12 PIXEL01_20 PIXEL10_22 PIXEL11_20 break;
377     }
378     case 18:
379     case 50:
380     {
381     PIXEL00_22 if (Diff (w[2], w[6]))
382     {
383     PIXEL01_10}
384     else
385     {
386     PIXEL01_20}
387     PIXEL10_20 PIXEL11_21 break;
388     }
389     case 80:
390     case 81:
391     {
392     PIXEL00_20 PIXEL01_22 PIXEL10_21 if (Diff (w[6], w[8]))
393     {
394     PIXEL11_10}
395     else
396     {
397     PIXEL11_20}
398     break;
399     }
400     case 72:
401     case 76:
402     {
403     PIXEL00_21 PIXEL01_20 if (Diff (w[8], w[4]))
404     {
405     PIXEL10_10}
406     else
407     {
408     PIXEL10_20}
409     PIXEL11_22 break;
410     }
411     case 10:
412     case 138:
413     {
414     if (Diff (w[4], w[2]))
415     {
416     PIXEL00_10}
417     else
418     {
419     PIXEL00_20}
420     PIXEL01_21 PIXEL10_22 PIXEL11_20 break;
421     }
422     case 66:
423     {
424     PIXEL00_22 PIXEL01_21 PIXEL10_21 PIXEL11_22 break;
425     }
426     case 24:
427     {
428     PIXEL00_21 PIXEL01_22 PIXEL10_22 PIXEL11_21 break;
429     }
430     case 7:
431     case 39:
432     case 135:
433     {
434     PIXEL00_11 PIXEL01_12 PIXEL10_20 PIXEL11_20 break;
435     }
436     case 148:
437     case 149:
438     case 180:
439     {
440     PIXEL00_20 PIXEL01_11 PIXEL10_20 PIXEL11_12 break;
441     }
442     case 224:
443     case 228:
444     case 225:
445     {
446     PIXEL00_20 PIXEL01_20 PIXEL10_12 PIXEL11_11 break;
447     }
448     case 41:
449     case 169:
450     case 45:
451     {
452     PIXEL00_12 PIXEL01_20 PIXEL10_11 PIXEL11_20 break;
453     }
454     case 22:
455     case 54:
456     {
457     PIXEL00_22 if (Diff (w[2], w[6]))
458     {
459     PIXEL01_0}
460     else
461     {
462     PIXEL01_20}
463     PIXEL10_20 PIXEL11_21 break;
464     }
465     case 208:
466     case 209:
467     {
468     PIXEL00_20 PIXEL01_22 PIXEL10_21 if (Diff (w[6], w[8]))
469     {
470     PIXEL11_0}
471     else
472     {
473     PIXEL11_20}
474     break;
475     }
476     case 104:
477     case 108:
478     {
479     PIXEL00_21 PIXEL01_20 if (Diff (w[8], w[4]))
480     {
481     PIXEL10_0}
482     else
483     {
484     PIXEL10_20}
485     PIXEL11_22 break;
486     }
487     case 11:
488     case 139:
489     {
490     if (Diff (w[4], w[2]))
491     {
492     PIXEL00_0}
493     else
494     {
495     PIXEL00_20}
496     PIXEL01_21 PIXEL10_22 PIXEL11_20 break;
497     }
498     case 19:
499     case 51:
500     {
501     if (Diff (w[2], w[6]))
502     {
503     PIXEL00_11 PIXEL01_10}
504     else
505     {
506     PIXEL00_60 PIXEL01_90}
507     PIXEL10_20 PIXEL11_21 break;
508     }
509     case 146:
510     case 178:
511     {
512     PIXEL00_22 if (Diff (w[2], w[6]))
513     {
514     PIXEL01_10 PIXEL11_12}
515     else
516     {
517     PIXEL01_90 PIXEL11_61}
518     PIXEL10_20 break;
519     }
520     case 84:
521     case 85:
522     {
523     PIXEL00_20 if (Diff (w[6], w[8]))
524     {
525     PIXEL01_11 PIXEL11_10}
526     else
527     {
528     PIXEL01_60 PIXEL11_90}
529     PIXEL10_21 break;
530     }
531     case 112:
532     case 113:
533     {
534     PIXEL00_20 PIXEL01_22 if (Diff (w[6], w[8]))
535     {
536     PIXEL10_12 PIXEL11_10}
537     else
538     {
539     PIXEL10_61 PIXEL11_90}
540     break;
541     }
542     case 200:
543     case 204:
544     {
545     PIXEL00_21 PIXEL01_20 if (Diff (w[8], w[4]))
546     {
547     PIXEL10_10 PIXEL11_11}
548     else
549     {
550     PIXEL10_90 PIXEL11_60}
551     break;
552     }
553     case 73:
554     case 77:
555     {
556     if (Diff (w[8], w[4]))
557     {
558     PIXEL00_12 PIXEL10_10}
559     else
560     {
561     PIXEL00_61 PIXEL10_90}
562     PIXEL01_20 PIXEL11_22 break;
563     }
564     case 42:
565     case 170:
566     {
567     if (Diff (w[4], w[2]))
568     {
569     PIXEL00_10 PIXEL10_11}
570     else
571     {
572     PIXEL00_90 PIXEL10_60}
573     PIXEL01_21 PIXEL11_20 break;
574     }
575     case 14:
576     case 142:
577     {
578     if (Diff (w[4], w[2]))
579     {
580     PIXEL00_10 PIXEL01_12}
581     else
582     {
583     PIXEL00_90 PIXEL01_61}
584     PIXEL10_22 PIXEL11_20 break;
585     }
586     case 67:
587     {
588     PIXEL00_11 PIXEL01_21 PIXEL10_21 PIXEL11_22 break;
589     }
590     case 70:
591     {
592     PIXEL00_22 PIXEL01_12 PIXEL10_21 PIXEL11_22 break;
593     }
594     case 28:
595     {
596     PIXEL00_21 PIXEL01_11 PIXEL10_22 PIXEL11_21 break;
597     }
598     case 152:
599     {
600     PIXEL00_21 PIXEL01_22 PIXEL10_22 PIXEL11_12 break;
601     }
602     case 194:
603     {
604     PIXEL00_22 PIXEL01_21 PIXEL10_21 PIXEL11_11 break;
605     }
606     case 98:
607     {
608     PIXEL00_22 PIXEL01_21 PIXEL10_12 PIXEL11_22 break;
609     }
610     case 56:
611     {
612     PIXEL00_21 PIXEL01_22 PIXEL10_11 PIXEL11_21 break;
613     }
614     case 25:
615     {
616     PIXEL00_12 PIXEL01_22 PIXEL10_22 PIXEL11_21 break;
617     }
618     case 26:
619     case 31:
620     {
621     if (Diff (w[4], w[2]))
622     {
623     PIXEL00_0}
624     else
625     {
626     PIXEL00_20}
627     if (Diff (w[2], w[6]))
628     {
629     PIXEL01_0}
630     else
631     {
632     PIXEL01_20}
633     PIXEL10_22 PIXEL11_21 break;
634     }
635     case 82:
636     case 214:
637     {
638     PIXEL00_22 if (Diff (w[2], w[6]))
639     {
640     PIXEL01_0}
641     else
642     {
643     PIXEL01_20}
644     PIXEL10_21 if (Diff (w[6], w[8]))
645     {
646     PIXEL11_0}
647     else
648     {
649     PIXEL11_20}
650     break;
651     }
652     case 88:
653     case 248:
654     {
655     PIXEL00_21 PIXEL01_22 if (Diff (w[8], w[4]))
656     {
657     PIXEL10_0}
658     else
659     {
660     PIXEL10_20}
661     if (Diff (w[6], w[8]))
662     {
663     PIXEL11_0}
664     else
665     {
666     PIXEL11_20}
667     break;
668     }
669     case 74:
670     case 107:
671     {
672     if (Diff (w[4], w[2]))
673     {
674     PIXEL00_0}
675     else
676     {
677     PIXEL00_20}
678     PIXEL01_21 if (Diff (w[8], w[4]))
679     {
680     PIXEL10_0}
681     else
682     {
683     PIXEL10_20}
684     PIXEL11_22 break;
685     }
686     case 27:
687     {
688     if (Diff (w[4], w[2]))
689     {
690     PIXEL00_0}
691     else
692     {
693     PIXEL00_20}
694     PIXEL01_10 PIXEL10_22 PIXEL11_21 break;
695     }
696     case 86:
697     {
698     PIXEL00_22 if (Diff (w[2], w[6]))
699     {
700     PIXEL01_0}
701     else
702     {
703     PIXEL01_20}
704     PIXEL10_21 PIXEL11_10 break;
705     }
706     case 216:
707     {
708     PIXEL00_21 PIXEL01_22 PIXEL10_10 if (Diff (w[6], w[8]))
709     {
710     PIXEL11_0}
711     else
712     {
713     PIXEL11_20}
714     break;
715     }
716     case 106:
717     {
718     PIXEL00_10 PIXEL01_21 if (Diff (w[8], w[4]))
719     {
720     PIXEL10_0}
721     else
722     {
723     PIXEL10_20}
724     PIXEL11_22 break;
725     }
726     case 30:
727     {
728     PIXEL00_10 if (Diff (w[2], w[6]))
729     {
730     PIXEL01_0}
731     else
732     {
733     PIXEL01_20}
734     PIXEL10_22 PIXEL11_21 break;
735     }
736     case 210:
737     {
738     PIXEL00_22 PIXEL01_10 PIXEL10_21 if (Diff (w[6], w[8]))
739     {
740     PIXEL11_0}
741     else
742     {
743     PIXEL11_20}
744     break;
745     }
746     case 120:
747     {
748     PIXEL00_21 PIXEL01_22 if (Diff (w[8], w[4]))
749     {
750     PIXEL10_0}
751     else
752     {
753     PIXEL10_20}
754     PIXEL11_10 break;
755     }
756     case 75:
757     {
758     if (Diff (w[4], w[2]))
759     {
760     PIXEL00_0}
761     else
762     {
763     PIXEL00_20}
764     PIXEL01_21 PIXEL10_10 PIXEL11_22 break;
765     }
766     case 29:
767     {
768     PIXEL00_12 PIXEL01_11 PIXEL10_22 PIXEL11_21 break;
769     }
770     case 198:
771     {
772     PIXEL00_22 PIXEL01_12 PIXEL10_21 PIXEL11_11 break;
773     }
774     case 184:
775     {
776     PIXEL00_21 PIXEL01_22 PIXEL10_11 PIXEL11_12 break;
777     }
778     case 99:
779     {
780     PIXEL00_11 PIXEL01_21 PIXEL10_12 PIXEL11_22 break;
781     }
782     case 57:
783     {
784     PIXEL00_12 PIXEL01_22 PIXEL10_11 PIXEL11_21 break;
785     }
786     case 71:
787     {
788     PIXEL00_11 PIXEL01_12 PIXEL10_21 PIXEL11_22 break;
789     }
790     case 156:
791     {
792     PIXEL00_21 PIXEL01_11 PIXEL10_22 PIXEL11_12 break;
793     }
794     case 226:
795     {
796     PIXEL00_22 PIXEL01_21 PIXEL10_12 PIXEL11_11 break;
797     }
798     case 60:
799     {
800     PIXEL00_21 PIXEL01_11 PIXEL10_11 PIXEL11_21 break;
801     }
802     case 195:
803     {
804     PIXEL00_11 PIXEL01_21 PIXEL10_21 PIXEL11_11 break;
805     }
806     case 102:
807     {
808     PIXEL00_22 PIXEL01_12 PIXEL10_12 PIXEL11_22 break;
809     }
810     case 153:
811     {
812     PIXEL00_12 PIXEL01_22 PIXEL10_22 PIXEL11_12 break;
813     }
814     case 58:
815     {
816     if (Diff (w[4], w[2]))
817     {
818     PIXEL00_10}
819     else
820     {
821     PIXEL00_70}
822     if (Diff (w[2], w[6]))
823     {
824     PIXEL01_10}
825     else
826     {
827     PIXEL01_70}
828     PIXEL10_11 PIXEL11_21 break;
829     }
830     case 83:
831     {
832     PIXEL00_11 if (Diff (w[2], w[6]))
833     {
834     PIXEL01_10}
835     else
836     {
837     PIXEL01_70}
838     PIXEL10_21 if (Diff (w[6], w[8]))
839     {
840     PIXEL11_10}
841     else
842     {
843     PIXEL11_70}
844     break;
845     }
846     case 92:
847     {
848     PIXEL00_21 PIXEL01_11 if (Diff (w[8], w[4]))
849     {
850     PIXEL10_10}
851     else
852     {
853     PIXEL10_70}
854     if (Diff (w[6], w[8]))
855     {
856     PIXEL11_10}
857     else
858     {
859     PIXEL11_70}
860     break;
861     }
862     case 202:
863     {
864     if (Diff (w[4], w[2]))
865     {
866     PIXEL00_10}
867     else
868     {
869     PIXEL00_70}
870     PIXEL01_21 if (Diff (w[8], w[4]))
871     {
872     PIXEL10_10}
873     else
874     {
875     PIXEL10_70}
876     PIXEL11_11 break;
877     }
878     case 78:
879     {
880     if (Diff (w[4], w[2]))
881     {
882     PIXEL00_10}
883     else
884     {
885     PIXEL00_70}
886     PIXEL01_12 if (Diff (w[8], w[4]))
887     {
888     PIXEL10_10}
889     else
890     {
891     PIXEL10_70}
892     PIXEL11_22 break;
893     }
894     case 154:
895     {
896     if (Diff (w[4], w[2]))
897     {
898     PIXEL00_10}
899     else
900     {
901     PIXEL00_70}
902     if (Diff (w[2], w[6]))
903     {
904     PIXEL01_10}
905     else
906     {
907     PIXEL01_70}
908     PIXEL10_22 PIXEL11_12 break;
909     }
910     case 114:
911     {
912     PIXEL00_22 if (Diff (w[2], w[6]))
913     {
914     PIXEL01_10}
915     else
916     {
917     PIXEL01_70}
918     PIXEL10_12 if (Diff (w[6], w[8]))
919     {
920     PIXEL11_10}
921     else
922     {
923     PIXEL11_70}
924     break;
925     }
926     case 89:
927     {
928     PIXEL00_12 PIXEL01_22 if (Diff (w[8], w[4]))
929     {
930     PIXEL10_10}
931     else
932     {
933     PIXEL10_70}
934     if (Diff (w[6], w[8]))
935     {
936     PIXEL11_10}
937     else
938     {
939     PIXEL11_70}
940     break;
941     }
942     case 90:
943     {
944     if (Diff (w[4], w[2]))
945     {
946     PIXEL00_10}
947     else
948     {
949     PIXEL00_70}
950     if (Diff (w[2], w[6]))
951     {
952     PIXEL01_10}
953     else
954     {
955     PIXEL01_70}
956     if (Diff (w[8], w[4]))
957     {
958     PIXEL10_10}
959     else
960     {
961     PIXEL10_70}
962     if (Diff (w[6], w[8]))
963     {
964     PIXEL11_10}
965     else
966     {
967     PIXEL11_70}
968     break;
969     }
970     case 55:
971     case 23:
972     {
973     if (Diff (w[2], w[6]))
974     {
975     PIXEL00_11 PIXEL01_0}
976     else
977     {
978     PIXEL00_60 PIXEL01_90}
979     PIXEL10_20 PIXEL11_21 break;
980     }
981     case 182:
982     case 150:
983     {
984     PIXEL00_22 if (Diff (w[2], w[6]))
985     {
986     PIXEL01_0 PIXEL11_12}
987     else
988     {
989     PIXEL01_90 PIXEL11_61}
990     PIXEL10_20 break;
991     }
992     case 213:
993     case 212:
994     {
995     PIXEL00_20 if (Diff (w[6], w[8]))
996     {
997     PIXEL01_11 PIXEL11_0}
998     else
999     {
1000     PIXEL01_60 PIXEL11_90}
1001     PIXEL10_21 break;
1002     }
1003     case 241:
1004     case 240:
1005     {
1006     PIXEL00_20 PIXEL01_22 if (Diff (w[6], w[8]))
1007     {
1008     PIXEL10_12 PIXEL11_0}
1009     else
1010     {
1011     PIXEL10_61 PIXEL11_90}
1012     break;
1013     }
1014     case 236:
1015     case 232:
1016     {
1017     PIXEL00_21 PIXEL01_20 if (Diff (w[8], w[4]))
1018     {
1019     PIXEL10_0 PIXEL11_11}
1020     else
1021     {
1022     PIXEL10_90 PIXEL11_60}
1023     break;
1024     }
1025     case 109:
1026     case 105:
1027     {
1028     if (Diff (w[8], w[4]))
1029     {
1030     PIXEL00_12 PIXEL10_0}
1031     else
1032     {
1033     PIXEL00_61 PIXEL10_90}
1034     PIXEL01_20 PIXEL11_22 break;
1035     }
1036     case 171:
1037     case 43:
1038     {
1039     if (Diff (w[4], w[2]))
1040     {
1041     PIXEL00_0 PIXEL10_11}
1042     else
1043     {
1044     PIXEL00_90 PIXEL10_60}
1045     PIXEL01_21 PIXEL11_20 break;
1046     }
1047     case 143:
1048     case 15:
1049     {
1050     if (Diff (w[4], w[2]))
1051     {
1052     PIXEL00_0 PIXEL01_12}
1053     else
1054     {
1055     PIXEL00_90 PIXEL01_61}
1056     PIXEL10_22 PIXEL11_20 break;
1057     }
1058     case 124:
1059     {
1060     PIXEL00_21 PIXEL01_11 if (Diff (w[8], w[4]))
1061     {
1062     PIXEL10_0}
1063     else
1064     {
1065     PIXEL10_20}
1066     PIXEL11_10 break;
1067     }
1068     case 203:
1069     {
1070     if (Diff (w[4], w[2]))
1071     {
1072     PIXEL00_0}
1073     else
1074     {
1075     PIXEL00_20}
1076     PIXEL01_21 PIXEL10_10 PIXEL11_11 break;
1077     }
1078     case 62:
1079     {
1080     PIXEL00_10 if (Diff (w[2], w[6]))
1081     {
1082     PIXEL01_0}
1083     else
1084     {
1085     PIXEL01_20}
1086     PIXEL10_11 PIXEL11_21 break;
1087     }
1088     case 211:
1089     {
1090     PIXEL00_11 PIXEL01_10 PIXEL10_21 if (Diff (w[6], w[8]))
1091     {
1092     PIXEL11_0}
1093     else
1094     {
1095     PIXEL11_20}
1096     break;
1097     }
1098     case 118:
1099     {
1100     PIXEL00_22 if (Diff (w[2], w[6]))
1101     {
1102     PIXEL01_0}
1103     else
1104     {
1105     PIXEL01_20}
1106     PIXEL10_12 PIXEL11_10 break;
1107     }
1108     case 217:
1109     {
1110     PIXEL00_12 PIXEL01_22 PIXEL10_10 if (Diff (w[6], w[8]))
1111     {
1112     PIXEL11_0}
1113     else
1114     {
1115     PIXEL11_20}
1116     break;
1117     }
1118     case 110:
1119     {
1120     PIXEL00_10 PIXEL01_12 if (Diff (w[8], w[4]))
1121     {
1122     PIXEL10_0}
1123     else
1124     {
1125     PIXEL10_20}
1126     PIXEL11_22 break;
1127     }
1128     case 155:
1129     {
1130     if (Diff (w[4], w[2]))
1131     {
1132     PIXEL00_0}
1133     else
1134     {
1135     PIXEL00_20}
1136     PIXEL01_10 PIXEL10_22 PIXEL11_12 break;
1137     }
1138     case 188:
1139     {
1140     PIXEL00_21 PIXEL01_11 PIXEL10_11 PIXEL11_12 break;
1141     }
1142     case 185:
1143     {
1144     PIXEL00_12 PIXEL01_22 PIXEL10_11 PIXEL11_12 break;
1145     }
1146     case 61:
1147     {
1148     PIXEL00_12 PIXEL01_11 PIXEL10_11 PIXEL11_21 break;
1149     }
1150     case 157:
1151     {
1152     PIXEL00_12 PIXEL01_11 PIXEL10_22 PIXEL11_12 break;
1153     }
1154     case 103:
1155     {
1156     PIXEL00_11 PIXEL01_12 PIXEL10_12 PIXEL11_22 break;
1157     }
1158     case 227:
1159     {
1160     PIXEL00_11 PIXEL01_21 PIXEL10_12 PIXEL11_11 break;
1161     }
1162     case 230:
1163     {
1164     PIXEL00_22 PIXEL01_12 PIXEL10_12 PIXEL11_11 break;
1165     }
1166     case 199:
1167     {
1168     PIXEL00_11 PIXEL01_12 PIXEL10_21 PIXEL11_11 break;
1169     }
1170     case 220:
1171     {
1172     PIXEL00_21 PIXEL01_11 if (Diff (w[8], w[4]))
1173     {
1174     PIXEL10_10}
1175     else
1176     {
1177     PIXEL10_70}
1178     if (Diff (w[6], w[8]))
1179     {
1180     PIXEL11_0}
1181     else
1182     {
1183     PIXEL11_20}
1184     break;
1185     }
1186     case 158:
1187     {
1188     if (Diff (w[4], w[2]))
1189     {
1190     PIXEL00_10}
1191     else
1192     {
1193     PIXEL00_70}
1194     if (Diff (w[2], w[6]))
1195     {
1196     PIXEL01_0}
1197     else
1198     {
1199     PIXEL01_20}
1200     PIXEL10_22 PIXEL11_12 break;
1201     }
1202     case 234:
1203     {
1204     if (Diff (w[4], w[2]))
1205     {
1206     PIXEL00_10}
1207     else
1208     {
1209     PIXEL00_70}
1210     PIXEL01_21 if (Diff (w[8], w[4]))
1211     {
1212     PIXEL10_0}
1213     else
1214     {
1215     PIXEL10_20}
1216     PIXEL11_11 break;
1217     }
1218     case 242:
1219     {
1220     PIXEL00_22 if (Diff (w[2], w[6]))
1221     {
1222     PIXEL01_10}
1223     else
1224     {
1225     PIXEL01_70}
1226     PIXEL10_12 if (Diff (w[6], w[8]))
1227     {
1228     PIXEL11_0}
1229     else
1230     {
1231     PIXEL11_20}
1232     break;
1233     }
1234     case 59:
1235     {
1236     if (Diff (w[4], w[2]))
1237     {
1238     PIXEL00_0}
1239     else
1240     {
1241     PIXEL00_20}
1242     if (Diff (w[2], w[6]))
1243     {
1244     PIXEL01_10}
1245     else
1246     {
1247     PIXEL01_70}
1248     PIXEL10_11 PIXEL11_21 break;
1249     }
1250     case 121:
1251     {
1252     PIXEL00_12 PIXEL01_22 if (Diff (w[8], w[4]))
1253     {
1254     PIXEL10_0}
1255     else
1256     {
1257     PIXEL10_20}
1258     if (Diff (w[6], w[8]))
1259     {
1260     PIXEL11_10}
1261     else
1262     {
1263     PIXEL11_70}
1264     break;
1265     }
1266     case 87:
1267     {
1268     PIXEL00_11 if (Diff (w[2], w[6]))
1269     {
1270     PIXEL01_0}
1271     else
1272     {
1273     PIXEL01_20}
1274     PIXEL10_21 if (Diff (w[6], w[8]))
1275     {
1276     PIXEL11_10}
1277     else
1278     {
1279     PIXEL11_70}
1280     break;
1281     }
1282     case 79:
1283     {
1284     if (Diff (w[4], w[2]))
1285     {
1286     PIXEL00_0}
1287     else
1288     {
1289     PIXEL00_20}
1290     PIXEL01_12 if (Diff (w[8], w[4]))
1291     {
1292     PIXEL10_10}
1293     else
1294     {
1295     PIXEL10_70}
1296     PIXEL11_22 break;
1297     }
1298     case 122:
1299     {
1300     if (Diff (w[4], w[2]))
1301     {
1302     PIXEL00_10}
1303     else
1304     {
1305     PIXEL00_70}
1306     if (Diff (w[2], w[6]))
1307     {
1308     PIXEL01_10}
1309     else
1310     {
1311     PIXEL01_70}
1312     if (Diff (w[8], w[4]))
1313     {
1314     PIXEL10_0}
1315     else
1316     {
1317     PIXEL10_20}
1318     if (Diff (w[6], w[8]))
1319     {
1320     PIXEL11_10}
1321     else
1322     {
1323     PIXEL11_70}
1324     break;
1325     }
1326     case 94:
1327     {
1328     if (Diff (w[4], w[2]))
1329     {
1330     PIXEL00_10}
1331     else
1332     {
1333     PIXEL00_70}
1334     if (Diff (w[2], w[6]))
1335     {
1336     PIXEL01_0}
1337     else
1338     {
1339     PIXEL01_20}
1340     if (Diff (w[8], w[4]))
1341     {
1342     PIXEL10_10}
1343     else
1344     {
1345     PIXEL10_70}
1346     if (Diff (w[6], w[8]))
1347     {
1348     PIXEL11_10}
1349     else
1350     {
1351     PIXEL11_70}
1352     break;
1353     }
1354     case 218:
1355     {
1356     if (Diff (w[4], w[2]))
1357     {
1358     PIXEL00_10}
1359     else
1360     {
1361     PIXEL00_70}
1362     if (Diff (w[2], w[6]))
1363     {
1364     PIXEL01_10}
1365     else
1366     {
1367     PIXEL01_70}
1368     if (Diff (w[8], w[4]))
1369     {
1370     PIXEL10_10}
1371     else
1372     {
1373     PIXEL10_70}
1374     if (Diff (w[6], w[8]))
1375     {
1376     PIXEL11_0}
1377     else
1378     {
1379     PIXEL11_20}
1380     break;
1381     }
1382     case 91:
1383     {
1384     if (Diff (w[4], w[2]))
1385     {
1386     PIXEL00_0}
1387     else
1388     {
1389     PIXEL00_20}
1390     if (Diff (w[2], w[6]))
1391     {
1392     PIXEL01_10}
1393     else
1394     {
1395     PIXEL01_70}
1396     if (Diff (w[8], w[4]))
1397     {
1398     PIXEL10_10}
1399     else
1400     {
1401     PIXEL10_70}
1402     if (Diff (w[6], w[8]))
1403     {
1404     PIXEL11_10}
1405     else
1406     {
1407     PIXEL11_70}
1408     break;
1409     }
1410     case 229:
1411     {
1412     PIXEL00_20 PIXEL01_20 PIXEL10_12 PIXEL11_11 break;
1413     }
1414     case 167:
1415     {
1416     PIXEL00_11 PIXEL01_12 PIXEL10_20 PIXEL11_20 break;
1417     }
1418     case 173:
1419     {
1420     PIXEL00_12 PIXEL01_20 PIXEL10_11 PIXEL11_20 break;
1421     }
1422     case 181:
1423     {
1424     PIXEL00_20 PIXEL01_11 PIXEL10_20 PIXEL11_12 break;
1425     }
1426     case 186:
1427     {
1428     if (Diff (w[4], w[2]))
1429     {
1430     PIXEL00_10}
1431     else
1432     {
1433     PIXEL00_70}
1434     if (Diff (w[2], w[6]))
1435     {
1436     PIXEL01_10}
1437     else
1438     {
1439     PIXEL01_70}
1440     PIXEL10_11 PIXEL11_12 break;
1441     }
1442     case 115:
1443     {
1444     PIXEL00_11 if (Diff (w[2], w[6]))
1445     {
1446     PIXEL01_10}
1447     else
1448     {
1449     PIXEL01_70}
1450     PIXEL10_12 if (Diff (w[6], w[8]))
1451     {
1452     PIXEL11_10}
1453     else
1454     {
1455     PIXEL11_70}
1456     break;
1457     }
1458     case 93:
1459     {
1460     PIXEL00_12 PIXEL01_11 if (Diff (w[8], w[4]))
1461     {
1462     PIXEL10_10}
1463     else
1464     {
1465     PIXEL10_70}
1466     if (Diff (w[6], w[8]))
1467     {
1468     PIXEL11_10}
1469     else
1470     {
1471     PIXEL11_70}
1472     break;
1473     }
1474     case 206:
1475     {
1476     if (Diff (w[4], w[2]))
1477     {
1478     PIXEL00_10}
1479     else
1480     {
1481     PIXEL00_70}
1482     PIXEL01_12 if (Diff (w[8], w[4]))
1483     {
1484     PIXEL10_10}
1485     else
1486     {
1487     PIXEL10_70}
1488     PIXEL11_11 break;
1489     }
1490     case 205:
1491     case 201:
1492     {
1493     PIXEL00_12 PIXEL01_20 if (Diff (w[8], w[4]))
1494     {
1495     PIXEL10_10}
1496     else
1497     {
1498     PIXEL10_70}
1499     PIXEL11_11 break;
1500     }
1501     case 174:
1502     case 46:
1503     {
1504     if (Diff (w[4], w[2]))
1505     {
1506     PIXEL00_10}
1507     else
1508     {
1509     PIXEL00_70}
1510     PIXEL01_12 PIXEL10_11 PIXEL11_20 break;
1511     }
1512     case 179:
1513     case 147:
1514     {
1515     PIXEL00_11 if (Diff (w[2], w[6]))
1516     {
1517     PIXEL01_10}
1518     else
1519     {
1520     PIXEL01_70}
1521     PIXEL10_20 PIXEL11_12 break;
1522     }
1523     case 117:
1524     case 116:
1525     {
1526     PIXEL00_20 PIXEL01_11 PIXEL10_12 if (Diff (w[6], w[8]))
1527     {
1528     PIXEL11_10}
1529     else
1530     {
1531     PIXEL11_70}
1532     break;
1533     }
1534     case 189:
1535     {
1536     PIXEL00_12 PIXEL01_11 PIXEL10_11 PIXEL11_12 break;
1537     }
1538     case 231:
1539     {
1540     PIXEL00_11 PIXEL01_12 PIXEL10_12 PIXEL11_11 break;
1541     }
1542     case 126:
1543     {
1544     PIXEL00_10 if (Diff (w[2], w[6]))
1545     {
1546     PIXEL01_0}
1547     else
1548     {
1549     PIXEL01_20}
1550     if (Diff (w[8], w[4]))
1551     {
1552     PIXEL10_0}
1553     else
1554     {
1555     PIXEL10_20}
1556     PIXEL11_10 break;
1557     }
1558     case 219:
1559     {
1560     if (Diff (w[4], w[2]))
1561     {
1562     PIXEL00_0}
1563     else
1564     {
1565     PIXEL00_20}
1566     PIXEL01_10 PIXEL10_10 if (Diff (w[6], w[8]))
1567     {
1568     PIXEL11_0}
1569     else
1570     {
1571     PIXEL11_20}
1572     break;
1573     }
1574     case 125:
1575     {
1576     if (Diff (w[8], w[4]))
1577     {
1578     PIXEL00_12 PIXEL10_0}
1579     else
1580     {
1581     PIXEL00_61 PIXEL10_90}
1582     PIXEL01_11 PIXEL11_10 break;
1583     }
1584     case 221:
1585     {
1586     PIXEL00_12 if (Diff (w[6], w[8]))
1587     {
1588     PIXEL01_11 PIXEL11_0}
1589     else
1590     {
1591     PIXEL01_60 PIXEL11_90}
1592     PIXEL10_10 break;
1593     }
1594     case 207:
1595     {
1596     if (Diff (w[4], w[2]))
1597     {
1598     PIXEL00_0 PIXEL01_12}
1599     else
1600     {
1601     PIXEL00_90 PIXEL01_61}
1602     PIXEL10_10 PIXEL11_11 break;
1603     }
1604     case 238:
1605     {
1606     PIXEL00_10 PIXEL01_12 if (Diff (w[8], w[4]))
1607     {
1608     PIXEL10_0 PIXEL11_11}
1609     else
1610     {
1611     PIXEL10_90 PIXEL11_60}
1612     break;
1613     }
1614     case 190:
1615     {
1616     PIXEL00_10 if (Diff (w[2], w[6]))
1617     {
1618     PIXEL01_0 PIXEL11_12}
1619     else
1620     {
1621     PIXEL01_90 PIXEL11_61}
1622     PIXEL10_11 break;
1623     }
1624     case 187:
1625     {
1626     if (Diff (w[4], w[2]))
1627     {
1628     PIXEL00_0 PIXEL10_11}
1629     else
1630     {
1631     PIXEL00_90 PIXEL10_60}
1632     PIXEL01_10 PIXEL11_12 break;
1633     }
1634     case 243:
1635     {
1636     PIXEL00_11 PIXEL01_10 if (Diff (w[6], w[8]))
1637     {
1638     PIXEL10_12 PIXEL11_0}
1639     else
1640     {
1641     PIXEL10_61 PIXEL11_90}
1642     break;
1643     }
1644     case 119:
1645     {
1646     if (Diff (w[2], w[6]))
1647     {
1648     PIXEL00_11 PIXEL01_0}
1649     else
1650     {
1651     PIXEL00_60 PIXEL01_90}
1652     PIXEL10_12 PIXEL11_10 break;
1653     }
1654     case 237:
1655     case 233:
1656     {
1657     PIXEL00_12 PIXEL01_20 if (Diff (w[8], w[4]))
1658     {
1659     PIXEL10_0}
1660     else
1661     {
1662     PIXEL10_100}
1663     PIXEL11_11 break;
1664     }
1665     case 175:
1666     case 47:
1667     {
1668     if (Diff (w[4], w[2]))
1669     {
1670     PIXEL00_0}
1671     else
1672     {
1673     PIXEL00_100}
1674     PIXEL01_12 PIXEL10_11 PIXEL11_20 break;
1675     }
1676     case 183:
1677     case 151:
1678     {
1679     PIXEL00_11 if (Diff (w[2], w[6]))
1680     {
1681     PIXEL01_0}
1682     else
1683     {
1684     PIXEL01_100}
1685     PIXEL10_20 PIXEL11_12 break;
1686     }
1687     case 245:
1688     case 244:
1689     {
1690     PIXEL00_20 PIXEL01_11 PIXEL10_12 if (Diff (w[6], w[8]))
1691     {
1692     PIXEL11_0}
1693     else
1694     {
1695     PIXEL11_100}
1696     break;
1697     }
1698     case 250:
1699     {
1700     PIXEL00_10 PIXEL01_10 if (Diff (w[8], w[4]))
1701     {
1702     PIXEL10_0}
1703     else
1704     {
1705     PIXEL10_20}
1706     if (Diff (w[6], w[8]))
1707     {
1708     PIXEL11_0}
1709     else
1710     {
1711     PIXEL11_20}
1712     break;
1713     }
1714     case 123:
1715     {
1716     if (Diff (w[4], w[2]))
1717     {
1718     PIXEL00_0}
1719     else
1720     {
1721     PIXEL00_20}
1722     PIXEL01_10 if (Diff (w[8], w[4]))
1723     {
1724     PIXEL10_0}
1725     else
1726     {
1727     PIXEL10_20}
1728     PIXEL11_10 break;
1729     }
1730     case 95:
1731     {
1732     if (Diff (w[4], w[2]))
1733     {
1734     PIXEL00_0}
1735     else
1736     {
1737     PIXEL00_20}
1738     if (Diff (w[2], w[6]))
1739     {
1740     PIXEL01_0}
1741     else
1742     {
1743     PIXEL01_20}
1744     PIXEL10_10 PIXEL11_10 break;
1745     }
1746     case 222:
1747     {
1748     PIXEL00_10 if (Diff (w[2], w[6]))
1749     {
1750     PIXEL01_0}
1751     else
1752     {
1753     PIXEL01_20}
1754     PIXEL10_10 if (Diff (w[6], w[8]))
1755     {
1756     PIXEL11_0}
1757     else
1758     {
1759     PIXEL11_20}
1760     break;
1761     }
1762     case 252:
1763     {
1764     PIXEL00_21 PIXEL01_11 if (Diff (w[8], w[4]))
1765     {
1766     PIXEL10_0}
1767     else
1768     {
1769     PIXEL10_20}
1770     if (Diff (w[6], w[8]))
1771     {
1772     PIXEL11_0}
1773     else
1774     {
1775     PIXEL11_100}
1776     break;
1777     }
1778     case 249:
1779     {
1780     PIXEL00_12 PIXEL01_22 if (Diff (w[8], w[4]))
1781     {
1782     PIXEL10_0}
1783     else
1784     {
1785     PIXEL10_100}
1786     if (Diff (w[6], w[8]))
1787     {
1788     PIXEL11_0}
1789     else
1790     {
1791     PIXEL11_20}
1792     break;
1793     }
1794     case 235:
1795     {
1796     if (Diff (w[4], w[2]))
1797     {
1798     PIXEL00_0}
1799     else
1800     {
1801     PIXEL00_20}
1802     PIXEL01_21 if (Diff (w[8], w[4]))
1803     {
1804     PIXEL10_0}
1805     else
1806     {
1807     PIXEL10_100}
1808     PIXEL11_11 break;
1809     }
1810     case 111:
1811     {
1812     if (Diff (w[4], w[2]))
1813     {
1814     PIXEL00_0}
1815     else
1816     {
1817     PIXEL00_100}
1818     PIXEL01_12 if (Diff (w[8], w[4]))
1819     {
1820     PIXEL10_0}
1821     else
1822     {
1823     PIXEL10_20}
1824     PIXEL11_22 break;
1825     }
1826     case 63:
1827     {
1828     if (Diff (w[4], w[2]))
1829     {
1830     PIXEL00_0}
1831     else
1832     {
1833     PIXEL00_100}
1834     if (Diff (w[2], w[6]))
1835     {
1836     PIXEL01_0}
1837     else
1838     {
1839     PIXEL01_20}
1840     PIXEL10_11 PIXEL11_21 break;
1841     }
1842     case 159:
1843     {
1844     if (Diff (w[4], w[2]))
1845     {
1846     PIXEL00_0}
1847     else
1848     {
1849     PIXEL00_20}
1850     if (Diff (w[2], w[6]))
1851     {
1852     PIXEL01_0}
1853     else
1854     {
1855     PIXEL01_100}
1856     PIXEL10_22 PIXEL11_12 break;
1857     }
1858     case 215:
1859     {
1860     PIXEL00_11 if (Diff (w[2], w[6]))
1861     {
1862     PIXEL01_0}
1863     else
1864     {
1865     PIXEL01_100}
1866     PIXEL10_21 if (Diff (w[6], w[8]))
1867     {
1868     PIXEL11_0}
1869     else
1870     {
1871     PIXEL11_20}
1872     break;
1873     }
1874     case 246:
1875     {
1876     PIXEL00_22 if (Diff (w[2], w[6]))
1877     {
1878     PIXEL01_0}
1879     else
1880     {
1881     PIXEL01_20}
1882     PIXEL10_12 if (Diff (w[6], w[8]))
1883     {
1884     PIXEL11_0}
1885     else
1886     {
1887     PIXEL11_100}
1888     break;
1889     }
1890     case 254:
1891     {
1892     PIXEL00_10 if (Diff (w[2], w[6]))
1893     {
1894     PIXEL01_0}
1895     else
1896     {
1897     PIXEL01_20}
1898     if (Diff (w[8], w[4]))
1899     {
1900     PIXEL10_0}
1901     else
1902     {
1903     PIXEL10_20}
1904     if (Diff (w[6], w[8]))
1905     {
1906     PIXEL11_0}
1907     else
1908     {
1909     PIXEL11_100}
1910     break;
1911     }
1912     case 253:
1913     {
1914     PIXEL00_12 PIXEL01_11 if (Diff (w[8], w[4]))
1915     {
1916     PIXEL10_0}
1917     else
1918     {
1919     PIXEL10_100}
1920     if (Diff (w[6], w[8]))
1921     {
1922     PIXEL11_0}
1923     else
1924     {
1925     PIXEL11_100}
1926     break;
1927     }
1928     case 251:
1929     {
1930     if (Diff (w[4], w[2]))
1931     {
1932     PIXEL00_0}
1933     else
1934     {
1935     PIXEL00_20}
1936     PIXEL01_10 if (Diff (w[8], w[4]))
1937     {
1938     PIXEL10_0}
1939     else
1940     {
1941     PIXEL10_100}
1942     if (Diff (w[6], w[8]))
1943     {
1944     PIXEL11_0}
1945     else
1946     {
1947     PIXEL11_20}
1948     break;
1949     }
1950     case 239:
1951     {
1952     if (Diff (w[4], w[2]))
1953     {
1954     PIXEL00_0}
1955     else
1956     {
1957     PIXEL00_100}
1958     PIXEL01_12 if (Diff (w[8], w[4]))
1959     {
1960     PIXEL10_0}
1961     else
1962     {
1963     PIXEL10_100}
1964     PIXEL11_11 break;
1965     }
1966     case 127:
1967     {
1968     if (Diff (w[4], w[2]))
1969     {
1970     PIXEL00_0}
1971     else
1972     {
1973     PIXEL00_100}
1974     if (Diff (w[2], w[6]))
1975     {
1976     PIXEL01_0}
1977     else
1978     {
1979     PIXEL01_20}
1980     if (Diff (w[8], w[4]))
1981     {
1982     PIXEL10_0}
1983     else
1984     {
1985     PIXEL10_20}
1986     PIXEL11_10 break;
1987     }
1988     case 191:
1989     {
1990     if (Diff (w[4], w[2]))
1991     {
1992     PIXEL00_0}
1993     else
1994     {
1995     PIXEL00_100}
1996     if (Diff (w[2], w[6]))
1997     {
1998     PIXEL01_0}
1999     else
2000     {
2001     PIXEL01_100}
2002     PIXEL10_11 PIXEL11_12 break;
2003     }
2004     case 223:
2005     {
2006     if (Diff (w[4], w[2]))
2007     {
2008     PIXEL00_0}
2009     else
2010     {
2011     PIXEL00_20}
2012     if (Diff (w[2], w[6]))
2013     {
2014     PIXEL01_0}
2015     else
2016     {
2017     PIXEL01_100}
2018     PIXEL10_10 if (Diff (w[6], w[8]))
2019     {
2020     PIXEL11_0}
2021     else
2022     {
2023     PIXEL11_20}
2024     break;
2025     }
2026     case 247:
2027     {
2028     PIXEL00_11 if (Diff (w[2], w[6]))
2029     {
2030     PIXEL01_0}
2031     else
2032     {
2033     PIXEL01_100}
2034     PIXEL10_12 if (Diff (w[6], w[8]))
2035     {
2036     PIXEL11_0}
2037     else
2038     {
2039     PIXEL11_100}
2040     break;
2041     }
2042     case 255:
2043     {
2044     if (Diff (w[4], w[2]))
2045     {
2046     PIXEL00_0}
2047     else
2048     {
2049     PIXEL00_100}
2050     if (Diff (w[2], w[6]))
2051     {
2052     PIXEL01_0}
2053     else
2054     {
2055     PIXEL01_100}
2056     if (Diff (w[8], w[4]))
2057     {
2058     PIXEL10_0}
2059     else
2060     {
2061     PIXEL10_100}
2062     if (Diff (w[6], w[8]))
2063     {
2064     PIXEL11_0}
2065     else
2066     {
2067     PIXEL11_100}
2068     break;
2069     }
2070     }
2071     pIn += sizeof (pixel);
2072     pOut += sizeof (pixel) * 2;
2073     }
2074    
2075     pOut += BpL;
2076     }
2077     }
2078    
2079     // filla
2080    
2081     static inline void gather (pixel *img, char *flag, int x, int y, int w, int h, int &c, int &r, int &g, int &b)
2082     {
2083     if (x < 0 || x >= w)
2084     return;
2085    
2086     if (y < 0 || y >= h)
2087     return;
2088    
2089     int p = img [y * w + x];
2090    
2091     int weight = (p >> Ashift) & Cmask;
2092     if (!weight)
2093     weight = !!flag [y * w + x];
2094    
2095     if (!weight)
2096     return;
2097    
2098     c += weight;
2099    
2100     r += ((p >> Rshift) & Cmask) * weight;
2101     g += ((p >> Gshift) & Cmask) * weight;
2102     b += ((p >> Bshift) & Cmask) * weight;
2103     }
2104    
2105     static void filla (pixel *img, int w, int h)
2106     {
2107     char *flag = (char *)calloc (w * h, 1);
2108     char *flag2 = (char *)calloc (w * h, 1);
2109     pixel *dst = new pixel [w * h];
2110    
2111     for (int iter = 3; --iter; )
2112     {
2113     for (int x = 0; x < w; x++)
2114     for (int y = 0; y < h; y++)
2115     {
2116     int o = y * w + x;
2117    
2118     if ((img [o] & Amask) || flag [o])
2119     dst [o] = img [o];
2120     else
2121     {
2122     int weight = 0, r = 0, g = 0, b = 0;
2123    
2124     gather (img, flag, x - 1, y - 1, w, h, weight, r, g, b);
2125     gather (img, flag, x , y - 1, w, h, weight, r, g, b);
2126     gather (img, flag, x + 1, y - 1, w, h, weight, r, g, b);
2127     gather (img, flag, x - 1, y , w, h, weight, r, g, b);
2128     gather (img, flag, x + 1, y , w, h, weight, r, g, b);
2129     gather (img, flag, x - 1, y + 1, w, h, weight, r, g, b);
2130     gather (img, flag, x , y + 1, w, h, weight, r, g, b);
2131     gather (img, flag, x + 1, y + 1, w, h, weight, r, g, b);
2132    
2133     if (weight)
2134     {
2135     flag2 [o] = 1;
2136     dst [o] = ((r + weight / 2) / weight) << Rshift
2137     | ((g + weight / 2) / weight) << Gshift
2138     | ((b + weight / 2) / weight) << Bshift;
2139     }
2140     else
2141     dst [o] = img [o]; // not yet here
2142     }
2143     }
2144    
2145     memcpy (img, dst, w * h * sizeof (pixel));
2146     memcpy (flag, flag2, w * h);
2147     }
2148    
2149     for (int o = w * h; o--; )
2150     if (!(img [o] & Amask || flag [o]))
2151     img [o] = 0;
2152    
2153     delete [] dst;
2154     free (flag);
2155     free (flag2);
2156     }
2157    
2158     static void cleara (pixel *img, int w, int h)
2159     {
2160     for (int o = 0; o < w * h; o++)
2161     {
2162     pixel pix = img [o];
2163     if (!((pix >> Ashift) & Cmask))
2164     img [o] = 0;
2165     }
2166     }
2167    
2168     int main (int argc, char* argv[])
2169     {
2170     if (argc <= 3)
2171     {
2172     printf("\nUsage: hq2xa w h wrap <input.rgba >output.rgba\n");
2173     printf("input file must be 32 bit rgba w*h.\n");
2174     return 1;
2175     }
2176    
2177     int w = atoi (argv [1]);
2178     int h = atoi (argv [2]);
2179     bool wrap = !!atoi (argv [3]);
2180    
2181     int size = w * h * sizeof (pixel);
2182    
2183     unsigned char *in = new unsigned char [size];
2184     unsigned char *out = new unsigned char [size * 4];
2185    
2186     if (fread (in, size, 1, stdin) != 1)
2187     {
2188     perror ("unable to read input file\n");
2189     exit (1);
2190     }
2191    
2192     filla ((pixel *)in, w, h);
2193     hq2x_32 (in, out, w, h, w * sizeof (pixel) * 2, wrap);
2194     cleara ((pixel *)out, w * 2, h * 2);
2195    
2196     if (fwrite (out, size * 4, 1, stdout) != 1)
2197     {
2198     perror ("unable to read output file\n");
2199     exit (1);
2200     }
2201    
2202     return 0;
2203     }
2204