ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/util/enlarge/hq2xa.C
Revision: 1.5
Committed: Sun Mar 4 18:43:14 2007 UTC (17 years, 4 months ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: rel-2_0, STABLE
Changes since 1.4: +1 -1 lines
Log Message:
*** empty log message ***

File Contents

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