source: svn/trunk/zas_dstar/build/bmpbin2src/png2src.cpp @ 2

Last change on this file since 2 was 2, checked in by jglee, 11 years ago

first commit

File size: 14.1 KB
Line 
1// Compiled as :
2// cl /DWIN32 sample.cpp yspng.cpp kernel32.lib user32.lib gdi32.lib advapi32.lib opengl32.lib glu32.lib glaux.lib
3
4// PNG ÆÄÀÏÀ» 16ºñÆ® ARGB Çü½ÄÀ¸·Î º¯È¯ÇÏ´Â ÄÚµå
5// ¸ðµå 0¹ø 8ºñÆ® ÆÈ·¹Æ® ¹æ½Ä
6// ¸ðµå 1¹ø ¾ÐÃàµÈ 8ºñÆ® ÆÈ·¹Æ® ¹æ½Ä
7// ¸ðµå 2¹ø 16ºñÆ® ³ë ÆÈ·¹Æ® ¹æ½Ä (*)
8// ¸ðµå 4¹ø 32ºñÆ® ³ë ÆÈ·¹Æ® ¹æ½Ä (*)
9
10// 0¹øÂ° ¹ÙÀÌÆ® 0x02
11// 1,2 ¹øÂ° ¹ÙÀÌÆ® width
12// 3,4 ¹øÂ° ¹ÙÀÌÆ® height
13// 8¹øÂ°ºÎÅÍ À̹ÌÁö ¿¬¼Ó...
14
15#include "yspng.cpp"
16#include <string.h>
17#include <stdio.h>
18#include <stdlib.h>
19
20YsRawPngDecoder png;
21
22#define OSD_PIXEL_BPP   32
23#define LOCAL_LITTLE_ENDIAN   0
24#define LOCAL_BIG_ENDIAN      1
25#define TARGET_ENDIAN           LOCAL_LITTLE_ENDIAN
26
27static unsigned char pallette8[1024*100][4];
28static unsigned char pallette7[1024*100][4];
29static unsigned char pallette6[1024*100][4];
30static unsigned char pallette[1024*100][4];
31
32#if (OSD_PIXEL_BPP == 32) // 32ºñÆ®·Î ó¸®ÇÒ °æ¿ì
33
34void PrintNoCompress()
35{
36        // return;
37        // ±×¸² Á¤º¸
38        printf("\t0x%02X,\n", 4);
39        printf("\t0x%02X, 0x%02X,\n", png.wid / 256, png.wid % 256);
40        printf("\t0x%02X, 0x%02X,\n", png.hei / 256, png.hei % 256);
41        printf("\t0x%02X,\n", 0);
42        printf("\t0x%02X, 0x%02X,\n", 0, 0);
43        // À̹ÌÁö Á¤º¸
44        for (int i = 0; i < png.wid * png.hei; i++)
45        {
46                if (i%4 == 0) printf("\n\t");
47                unsigned r = png.rgba[i*4];
48                unsigned g = png.rgba[i*4+1];
49                unsigned b = png.rgba[i*4+2];
50                unsigned a = png.rgba[i*4+3];
51#if (TARGET_ENDIAN == LOCAL_LITTLE_ENDIAN)
52                printf("0x%02X, 0x%02X, 0x%02X, 0x%02X, ", b,g,r,a);
53#else
54                printf("0x%02X, 0x%02X, 0x%02X, 0x%02X, ", a,r,g,b);
55#endif
56        }
57}
58
59void PrintCompress(int nColorCount)
60{
61        // ±×¸² Á¤º¸
62        printf("\t0x%02X,\n", 5);
63        printf("\t0x%02X, 0x%02X,\n", png.wid / 256, png.wid % 256);
64        printf("\t0x%02X, 0x%02X,\n", png.hei / 256, png.hei % 256);
65        printf("\t0x%02X,\n", 0);
66        printf("\t0x%02X, 0x%02X,\n", nColorCount / 256, nColorCount % 256);
67        // ÆÈ·¹Æ®
68        // return;
69        for (int i = 0; i < nColorCount; i++)
70        {
71                unsigned char r = pallette[i][0];
72                unsigned char g = pallette[i][1];
73                unsigned char b = pallette[i][2];
74                unsigned char a = pallette[i][3];
75#if (TARGET_ENDIAN == LOCAL_LITTLE_ENDIAN)
76                printf("\n\t0x%02X, 0x%02X, 0x%02X, 0x%02X,", b,g,r,a);
77#else
78                printf("\n\t0x%02X, 0x%02X, 0x%02X, 0x%02X,", a,r,g,b);
79#endif
80        }
81        printf("\n");
82        // return;
83        // 2¹ÙÀÌÆ® À̹ÌÁö
84        if (nColorCount > 256)
85        {
86                for (int i = 0; i < png.wid * png.hei; i++)
87                {
88                        if (i%8 == 0) printf("\n\t");
89                        unsigned char r = png.rgba[i*4];
90                        unsigned char g = png.rgba[i*4+1];
91                        unsigned char b = png.rgba[i*4+2];
92                        unsigned char a = png.rgba[i*4+3];
93                        for (int j =0; j < nColorCount; j++)
94                        {
95                                if (r != pallette[j][0]) continue;
96                                if (g != pallette[j][1]) continue;
97                                if (b != pallette[j][2]) continue;
98                                if (a != pallette[j][3]) continue;
99#if (TARGET_ENDIAN == LOCAL_LITTLE_ENDIAN)
100                                printf("0x%02X, 0x%02X, ", j % 256, j / 256);
101#else
102                                printf("0x%02X, 0x%02X, ", j / 256, j % 256);
103#endif
104                                break;
105                        }
106                }
107        }
108        else if (nColorCount > 1) // 1¹ÙÀÌÆ® À̹ÌÁö
109        {
110                for (int i = 0; i < png.wid * png.hei; i++)
111                {
112                        if (i%16 == 0) printf("\n\t");
113                        unsigned char r = png.rgba[i*4];
114                        unsigned char g = png.rgba[i*4+1];
115                        unsigned char b = png.rgba[i*4+2];
116                        unsigned char a = png.rgba[i*4+3];
117                        for (int j =0; j < nColorCount; j++)
118                        {
119                                if (r != pallette[j][0]) continue;
120                                if (g != pallette[j][1]) continue;
121                                if (b != pallette[j][2]) continue;
122                                if (a != pallette[j][3]) continue;
123                                printf("0x%02X, ", j);
124                                break;
125                        }
126                }               
127        }       
128}
129
130int main(int ac,char *av[])
131{
132        printf("/*\n");
133        png.Decode(av[1]);
134        printf("\n*/\n");
135       
136        printf("// png.wid = %d\n", png.wid);
137        printf("// png.hei = %d\n", png.hei);
138       
139        // ¹è¿­ À̸§À» °áÁ¤ÇÑ´Ù.
140        int nNameStart = 0;
141        int i = 0;
142        int nStrLen = (int)strlen(av[1]);
143        for (i = 0 ; i < nStrLen; i++)
144        {
145                if (av[1][i] == '/') nNameStart =i+1;
146                if (av[1][i] == '.') av[1][i] = 0;
147        }
148        printf("unsigned char %s[] = {\n", &av[1][nNameStart]);
149
150        // alpha°¡ 0À̸é RGBµµ 0À¸·Î ¼³Á¤ÇÑ´Ù.
151        for (int i = 0; i < png.wid * png.hei; i++)
152        {
153                if (png.rgba[i*4+3] == 0) // a
154                {
155                        png.rgba[i*4+0]=0; // r
156                        png.rgba[i*4+1]=0; // g
157                        png.rgba[i*4+2]=0; // b
158                }
159        }
160
161        int nOriginal_Size = png.wid * png.hei * 4;
162        printf("// nOriginal_Size = %d\n",  nOriginal_Size);
163       
164        // ÆÈ·¹Æ® »ý¼º
165        int nColorCount8 = 0;
166        for (int i = 0; i < png.wid * png.hei; i++)
167        {
168                unsigned char r = png.rgba[i*4];
169                unsigned char g = png.rgba[i*4+1];
170                unsigned char b = png.rgba[i*4+2];
171                unsigned char a = png.rgba[i*4+3];
172                bool bFind = false;
173                for (int j = 0; j < nColorCount8; j++)
174                {
175                        if (r != pallette8[j][0]) continue;
176                        if (g != pallette8[j][1]) continue;
177                        if (b != pallette8[j][2]) continue;
178                        if (a != pallette8[j][3]) continue;
179                        bFind = true;
180                        break;
181                }
182                if (bFind == false) 
183                {
184                        pallette8[nColorCount8][0] = r;
185                        pallette8[nColorCount8][1] = g;
186                        pallette8[nColorCount8][2] = b;
187                        pallette8[nColorCount8][3] = a;
188                        nColorCount8++;
189                }
190        }
191        int nIndexed8_Size = nColorCount8 * 4 + (nColorCount8 > 256 ? (png.wid * png.hei*2) : (png.wid * png.hei));
192        printf("// nColorCount8 = %d nIndexed8_Size = %d\n",  nColorCount8, nIndexed8_Size);
193       
194        // ÆÈ·¹Æ® »ý¼º
195        int nColorCount7 = 0;
196        for (int i = 0; i < nColorCount8; i++)
197        {
198                unsigned char r = (pallette8[i][0]/2)*2;
199                unsigned char g = (pallette8[i][1]/2)*2;
200                unsigned char b = (pallette8[i][2]/2)*2;
201                unsigned char a = (pallette8[i][3]/2)*2;
202                bool bFind = false;
203                for (int j = 0; j < nColorCount7; j++)
204                {
205                        if (r != pallette7[j][0]) continue;
206                        if (g != pallette7[j][1]) continue;
207                        if (b != pallette7[j][2]) continue;
208                        if (a != pallette7[j][3]) continue;
209                        bFind = true;
210                        break;
211                }
212                if (bFind == false) 
213                {
214                        pallette7[nColorCount7][0] = r;
215                        pallette7[nColorCount7][1] = g;
216                        pallette7[nColorCount7][2] = b;
217                        pallette7[nColorCount7][3] = a;
218                        nColorCount7++;
219                }
220        }
221       
222        int nIndexed7_Size = nColorCount7 * 4 + (nColorCount8 > 256 ? (png.wid * png.hei*2) : (png.wid * png.hei));
223        printf("// nColorCount7 = %d nIndexed7_Size = %d\n",  nColorCount7, nIndexed7_Size);
224       
225        // ÆÈ·¹Æ® »ý¼º
226        int nColorCount6 = 0;
227        for (int i = 0; i < nColorCount7; i++)
228        {
229                unsigned char r = (pallette7[i][0]/4)*4;
230                unsigned char g = (pallette7[i][1]/4)*4;
231                unsigned char b = (pallette7[i][2]/4)*4;
232                unsigned char a = (pallette7[i][3]/4)*4;
233                bool bFind = false;
234                for (int j = 0; j < nColorCount6; j++)
235                {
236                        if (r != pallette6[j][0]) continue;
237                        if (g != pallette6[j][1]) continue;
238                        if (b != pallette6[j][2]) continue;
239                        if (a != pallette6[j][3]) continue;
240                        bFind = true;
241                        break;
242                }
243                if (bFind == false) 
244                {
245                        pallette6[nColorCount6][0] = r;
246                        pallette6[nColorCount6][1] = g;
247                        pallette6[nColorCount6][2] = b;
248                        pallette6[nColorCount6][3] = a;
249                        nColorCount6++;
250                }
251        }
252
253        int nIndexed6_Size = nColorCount6 * 4 + (nColorCount8 > 256 ? (png.wid * png.hei*2) : (png.wid * png.hei));
254        printf("// nColorCount6 = %d nIndexed6_Size = %d\n",  nColorCount6, nIndexed6_Size);
255       
256        //return 0;
257       
258        if (nOriginal_Size <= nIndexed8_Size)
259        {
260                printf("// PrintNoCompress\n");
261                PrintNoCompress();
262        }
263        else
264        {
265                if (nColorCount8 <= 256)
266                {
267                        printf("// PrintCompress 8\n");
268                        memcpy(pallette, pallette8, sizeof(pallette)); 
269                        PrintCompress(nColorCount8);
270                }
271                else
272                {
273                        if (nColorCount7 <= 256)
274                        {
275                                // ÇÏÀ§ 1ºñÆ®¸¦ ¹ö¸°´Ù.
276                                for (int i = 0; i < png.wid * png.hei; i++)
277                                {
278                                        png.rgba[i*4+0] = (png.rgba[i*4+0]/2)*2;
279                                        png.rgba[i*4+1] = (png.rgba[i*4+1]/2)*2;
280                                        png.rgba[i*4+2] = (png.rgba[i*4+2]/2)*2;
281                                        png.rgba[i*4+3] = (png.rgba[i*4+3]/2)*2;
282                                }
283                                printf("// PrintCompress 7\n");
284                                memcpy(pallette, pallette7, sizeof(pallette)); 
285                                PrintCompress(nColorCount7);
286                        }
287                        else
288                        {
289                                if (nColorCount6 <= 256)
290                                {
291                                        // ÇÏÀ§ 2ºñÆ®¸¦ ¹ö¸°´Ù.
292                                        for (int i = 0; i < png.wid * png.hei; i++)
293                                        {
294                                                png.rgba[i*4+0] = (png.rgba[i*4+0]/4)*4;
295                                                png.rgba[i*4+1] = (png.rgba[i*4+1]/4)*4;
296                                                png.rgba[i*4+2] = (png.rgba[i*4+2]/4)*4;
297                                                png.rgba[i*4+3] = (png.rgba[i*4+3]/4)*4;
298                                        }
299                                        printf("// PrintCompress 6\n");
300                                        memcpy(pallette, pallette6, sizeof(pallette)); 
301                                        PrintCompress(nColorCount6);
302                                }
303                                else
304                                {
305                                        printf("// PrintCompress 8 16bit\n");
306                                        memcpy(pallette, pallette8, sizeof(pallette)); 
307                                        PrintCompress(nColorCount8); // 16ºñÆ® À̹ÌÁö·Î Ãâ·Â
308                                }
309                        }
310                }
311        }
312        printf("\n};\n");
313        return 0;
314}
315
316#else // 16ºñÆ®·Î ó¸®ÇÒ °æ¿ì
317
318int main(int ac,char *av[])
319{
320        printf("/*\n");
321        png.Decode(av[1]);
322        printf("\n*/\n");
323       
324        printf("// png.wid = %d\n", png.wid);
325        printf("// png.hei = %d\n", png.hei);
326       
327        // ¹è¿­ À̸§À» °áÁ¤ÇÑ´Ù.
328        int nNameStart = 0;
329        int i = 0;
330        int nStrLen = (int)strlen(av[1]);
331        for (i = 0 ; i < nStrLen; i++)
332        {
333                if (av[1][i] == '/') nNameStart =i+1;
334                if (av[1][i] == '.') av[1][i] = 0;
335        }
336        printf("unsigned char %s[] = {\n", &av[1][nNameStart]);
337        // alpha°¡ 0À̸é RGBµµ 0À¸·Î ¼³Á¤ÇÑ´Ù.
338        for (int i = 0; i < png.wid * png.hei; i++)
339        {
340                if (png.rgba[i*4+3] == 0) // a
341                {
342                        png.rgba[i*4+0]=0; // r
343                        png.rgba[i*4+1]=0; // g
344                        png.rgba[i*4+0]=0; // b
345                }
346        }
347        // 16À¸·Î ³ª´«´Ù. ¾Æ·¡ 4ºñÆ®´Â Àǹ̰¡ ¾ø´Ù
348        for (int i = 0; i < png.wid * png.hei; i++)
349        {
350                png.rgba[i*4+0]/=16;
351                png.rgba[i*4+1]/=16;
352                png.rgba[i*4+2]/=16;
353                png.rgba[i*4+3]/=16;
354        }
355        // ÆÈ·¹Æ® °¹¼ö¸¦ ±¸ÇÑ´Ù.
356        int nColorCount = 0;
357        for (int i = 0; i < png.wid * png.hei; i++)
358        {
359                char r = png.rgba[i*4];
360                char g = png.rgba[i*4+1];
361                char b = png.rgba[i*4+2];
362                char a = png.rgba[i*4+3];
363               
364                bool bFind = false;
365                for (int j =0; j < i; j++)
366                {
367                        char r2 = png.rgba[j*4];
368                        char g2 = png.rgba[j*4+1];
369                        char b2 = png.rgba[j*4+2];
370                        char a2 = png.rgba[j*4+3];
371                        if (r == r2 && g == g2 && b == b2 && a == a2)
372                        {
373                                bFind = true;
374                                break;
375                        }
376                }
377                if (bFind == false) nColorCount++;
378        }
379       
380        // Original Size
381        int nOriginal_Size = png.wid * png.hei * 2;
382        int nIndexed_Size = 2 + nColorCount * 2 + (png.wid * png.hei);
383        printf("// Original Size = %d\n",  nOriginal_Size);
384        printf("//  Indexed Size = %d\n",  nIndexed_Size);
385       
386        if (nIndexed_Size < nOriginal_Size && nColorCount <=16)
387        {
388                // ÆÈ·¹Æ® ¹è¿­¿¡ Áý¾î³Ö´Â´Ù
389                char *pallette = (char*)calloc(nColorCount,4);
390                int nPos = 0;
391                for (int i = 0; i < png.wid * png.hei; i++)
392                {
393                        char r = png.rgba[i*4];
394                        char g = png.rgba[i*4+1];
395                        char b = png.rgba[i*4+2];
396                        char a = png.rgba[i*4+3];
397                       
398                        bool bFind = false;
399                        for (int j =0; j < i; j++)
400                        {
401                                char r2 = png.rgba[j*4];
402                                char g2 = png.rgba[j*4+1];
403                                char b2 = png.rgba[j*4+2];
404                                char a2 = png.rgba[j*4+3];
405                                if (r == r2 && g == g2 && b == b2 && a == a2)
406                                {
407                                        bFind = true;
408                                        break;
409                                }
410                        }
411                        if (bFind == false)
412                        {
413                                pallette[nPos*4+0] = r;
414                                pallette[nPos*4+1] = g;
415                                pallette[nPos*4+2] = b;
416                                pallette[nPos*4+3] = a;
417                                nPos++;
418                        }
419                }
420
421                printf("\t0x%02X, \n", 6);
422                printf("\t0x%02X, 0x%02X, \n", png.wid / 256, png.wid % 256);
423                printf("\t0x%02X, 0x%02X, \n", png.hei / 256, png.hei % 256);
424                printf("\t0x%02X, \n", nColorCount-1);
425
426                for (int i = 0; i < nColorCount; i++)
427                {
428                        char r = pallette[i*4+0];
429                        char g = pallette[i*4+1];
430                        char b = pallette[i*4+2];
431                        char a = pallette[i*4+3];
432#if (TARGET_ENDIAN == LOCAL_LITTLE_ENDIAN)
433                printf("\n\t0x%01X%01X, 0x%01X%01X,", g,b,a,r);
434#else
435                printf("\n\t0x%01X%01X, 0x%01X%01X,", a,r,g,b);
436#endif
437                }
438                printf("\n");
439                int data[2] = {0,0};
440                for (int i = 0; i < png.wid * png.hei; i++)
441                {
442                        int value = 0;
443                        if (i%16 == 0) printf("\n\t");
444                        char r = png.rgba[i*4];
445                        char g = png.rgba[i*4+1];
446                        char b = png.rgba[i*4+2];
447                        char a = png.rgba[i*4+3];
448                        for (int j =0; j < nColorCount; j++)
449                        {
450                                char r2 = pallette[j*4+0];
451                                char g2 = pallette[j*4+1];
452                                char b2 = pallette[j*4+2];
453                                char a2 = pallette[j*4+3];
454                                if (r == r2 && g == g2 && b == b2 && a == a2)
455                                {
456                                        // printf("0x%02X, ", j);
457                                        value = j;
458                                        break;
459                                }
460                        }
461                        if (i%2 == 0)
462                        {
463                                data[0] = value;
464                                data[1] = -1;
465                        }
466                        else
467                        {
468                                data[1] = value;
469                                printf("0x%02X, ", data[0]*16 + data[1]);
470                        }
471                }
472                if (data[1] == -1)      printf("0x%02X, ", data[0]*16); 
473                free(pallette);
474        }
475        else if (nIndexed_Size < nOriginal_Size && nColorCount <=256)
476        {
477                // ÆÈ·¹Æ® ¹è¿­¿¡ Áý¾î³Ö´Â´Ù
478                char *pallette = (char*)calloc(nColorCount,4);
479                int nPos = 0;
480                for (int i = 0; i < png.wid * png.hei; i++)
481                {
482                        char r = png.rgba[i*4];
483                        char g = png.rgba[i*4+1];
484                        char b = png.rgba[i*4+2];
485                        char a = png.rgba[i*4+3];
486                       
487                        bool bFind = false;
488                        for (int j =0; j < i; j++)
489                        {
490                                char r2 = png.rgba[j*4];
491                                char g2 = png.rgba[j*4+1];
492                                char b2 = png.rgba[j*4+2];
493                                char a2 = png.rgba[j*4+3];
494                                if (r == r2 && g == g2 && b == b2 && a == a2)
495                                {
496                                        bFind = true;
497                                        break;
498                                }
499                        }
500                        if (bFind == false)
501                        {
502                                pallette[nPos*4+0] = r;
503                                pallette[nPos*4+1] = g;
504                                pallette[nPos*4+2] = b;
505                                pallette[nPos*4+3] = a;
506                                nPos++;
507                        }
508                }
509
510                printf("\t0x%02X, \n", 6);
511                printf("\t0x%02X, 0x%02X, \n", png.wid / 256, png.wid % 256);
512                printf("\t0x%02X, 0x%02X, \n", png.hei / 256, png.hei % 256);
513                printf("\t0x%02X, \n", nColorCount-1);
514
515                for (int i = 0; i < nColorCount; i++)
516                {
517                        char r = pallette[i*4+0];
518                        char g = pallette[i*4+1];
519                        char b = pallette[i*4+2];
520                        char a = pallette[i*4+3];
521#if (TARGET_ENDIAN == LOCAL_LITTLE_ENDIAN)
522                printf("\n\t0x%01X%01X, 0x%01X%01X,", g,b,a,r);
523#else
524                printf("\n\t0x%01X%01X, 0x%01X%01X,", a,r,g,b);
525#endif
526                }
527                printf("\n");
528                for (int i = 0; i < png.wid * png.hei; i++)
529                {
530                        if (i%16 == 0) printf("\n\t");
531                        char r = png.rgba[i*4];
532                        char g = png.rgba[i*4+1];
533                        char b = png.rgba[i*4+2];
534                        char a = png.rgba[i*4+3];
535                        for (int j =0; j < nColorCount; j++)
536                        {
537                                char r2 = pallette[j*4+0];
538                                char g2 = pallette[j*4+1];
539                                char b2 = pallette[j*4+2];
540                                char a2 = pallette[j*4+3];
541                                if (r == r2 && g == g2 && b == b2 && a == a2)
542                                {
543                                        printf("0x%02X, ", j);
544                                        break;
545                                }
546                        }
547                }               
548                free(pallette);
549        }
550        else
551        {
552                printf("\t0x%02X, \n", 2);
553                printf("\t0x%02X, 0x%02X, \n", png.wid / 256, png.wid % 256);
554                printf("\t0x%02X, 0x%02X, \n", png.hei / 256, png.hei % 256);
555                printf("\t0x%02X, \n", 0);
556
557                for (int i = 0; i < png.wid * png.hei; i++)
558                {
559                        if (i%4 == 0) printf("\n\t");
560                        unsigned r = png.rgba[i*4];
561                        unsigned g = png.rgba[i*4+1];
562                        unsigned b = png.rgba[i*4+2];
563                        unsigned a = png.rgba[i*4+3];
564#if (TARGET_ENDIAN == LOCAL_LITTLE_ENDIAN)
565                        //printf("\n\t0x%01X%01X, 0x%01X%01X,", b,g,r,a);
566                        printf("\n\t0x%01X%01X, 0x%01X%01X,", g,b,a,r);
567#else
568                        printf("\n\t0x%01X%01X, 0x%01X%01X,", a,r,g,b);
569#endif
570                }
571        }
572        printf("\n};\n");
573        return 0;
574}
575#endif
Note: See TracBrowser for help on using the repository browser.