enhanced alpha handling
[swftools.git] / lib / png.c
index 53da2c4..f114e91 100644 (file)
--- a/lib/png.c
+++ b/lib/png.c
@@ -33,7 +33,7 @@ typedef struct _COL {
 int png_read_chunk(char (*head)[4], int*destlen, U8**destdata, FILE*fi)
 {
     unsigned int len;
-    unsigned char blen;
+    unsigned char blen[4];
     if(destlen) *destlen=0;
     if(destdata) *destdata=0;
     if(!fread(&blen, 4, 1, fi)) {
@@ -66,7 +66,7 @@ int png_read_chunk(char (*head)[4], int*destlen, U8**destdata, FILE*fi)
 unsigned int png_get_dword(FILE*fi)
 {
     unsigned int a;
-    unsigned char b;
+    unsigned char b[4];
     fread(&b,4,1,fi);
     return b[0]<<24|b[1]<<16|b[2]<<8|b[3];
 }
@@ -463,6 +463,8 @@ int getPNG(char*sname, int*destwidth, int*destheight, unsigned char**destdata)
     struct png_header header;
     int bypp;
     U8*data2 = 0;
+    U8 alphacolor[3];
+    int hasalphacolor=0;
 
     FILE *fi;
     U8 *scanline;
@@ -509,6 +511,16 @@ int getPNG(char*sname, int*destwidth, int*destheight, unsigned char**destdata)
                alphapalettelen = len;
                data = 0; //don't free data
                //printf("found %d alpha colors\n", alphapalettelen);
+           } else if(header.mode == 0 || header.mode == 2) {
+               int t;
+               if(header.mode == 2) {
+                   alphacolor[0] = data[1];
+                   alphacolor[1] = data[3];
+                   alphacolor[2] = data[5];
+               } else {
+                   alphacolor[0] = alphacolor[1] = alphacolor[2] = data[1];
+               }
+               hasalphacolor = 1;
            }
        }
        if(!strncmp(tagid, "IDAT", 4)) {
@@ -643,6 +655,10 @@ int getPNG(char*sname, int*destwidth, int*destheight, unsigned char**destdata)
                rgba[i].r = i*mult;
                rgba[i].g = i*mult;
                rgba[i].b = i*mult;
+               if(hasalphacolor) {
+                   if(rgba[i].r == alphacolor[0])
+                       rgba[i].a = 0;
+               }
            }
        } else {
            if(!palette) {
@@ -663,6 +679,12 @@ int getPNG(char*sname, int*destwidth, int*destheight, unsigned char**destdata)
                } else {
                    rgba[i].a = 255;
                }
+               if(hasalphacolor) {
+                   if(rgba[i].r == alphacolor[0] &&
+                      rgba[i].g == alphacolor[1] &&
+                      rgba[i].b == alphacolor[2])
+                       rgba[i].a = 0;
+               }
            }
        }