ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/utils/cfhq2xa.C
Revision: 1.1
Committed: Sun Apr 1 00:36:35 2007 UTC (17 years, 1 month ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: rel-2_1
Log Message:
- add cfhq2xa to the installed binaries
- cfutil: autogenerate 64x64 versions out of existing 32x32 versions
  if required (--cache is highly recommended).
- rename faces to facedata to avoid clashes with the old file.
- add the 64x64 tiles to faceset 1 in the server (unused)

TODO: protocol to split faces (they are too large)
TODO: devise a faceset protocol incompatible enough with gcfclient so it
      doesn't puke.

File Contents

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