moved clockwise checker to gfxfillToSVP()
[swftools.git] / src / png2swf.c
index 9980e5a..609deca 100644 (file)
@@ -179,7 +179,7 @@ int png_read_header(FILE*fi, struct png_header*header)
            header->width = REVERSESWAP32(*(U32*)&data[0]);
            header->height = REVERSESWAP32(*(U32*)&data[4]);
            a = data[8];      // should be 8
-           b = data[9];      // should be 3(indexed) or 2(rgb)
+           b = data[9];      // should be 3(indexed), 2(rgb), 0(grayscale) or 6(truecolor+alpha)
 
            c = data[10];     // compression mode (0)
            f = data[11];     // filter mode (0)
@@ -513,7 +513,7 @@ TAG *MovieAddFrame(SWF * swf, TAG * t, char *sname, int id)
        }
        if(!strncmp(tagid, "PLTE", 4)) {
            palette = data;
-           palettelen = len/bypp;
+           palettelen = len/3;
            data = 0; //don't free data
            if(VERBOSE(2))
                printf("%d colors in palette\n", palettelen);
@@ -525,9 +525,9 @@ TAG *MovieAddFrame(SWF * swf, TAG * t, char *sname, int id)
                data = 0; //don't free data
                if(VERBOSE(2))
                    printf("found %d alpha colors\n", alphapalettelen);
-           } else if(header.mode == 0) {
+           } else if(header.mode == 0 || header.mode == 2) {
                int t;
-               if(header.mode == 3) { // palette or grayscale?
+               if(header.mode == 2) { // palette or grayscale?
                    alphacolor[0] = data[1];
                    alphacolor[1] = data[3];
                    alphacolor[2] = data[5];
@@ -605,10 +605,22 @@ TAG *MovieAddFrame(SWF * swf, TAG * t, char *sname, int id)
            } else {
                old = &data2[(y-1)*header.width*4];
            }
-           if(header.mode==6)
+           if(header.mode==6) {
                applyfilter4(mode, src, old, dest, header.width);
-           else if(header.mode==2)
+           } else if(header.mode==2) {
                applyfilter3(mode, src, old, dest, header.width);
+               /* replace alpha color */
+               if(hasalphacolor) {
+                   int x;
+                   for(x=0;x<header.width;x++) {
+                       if(dest[x*4+1] == alphacolor[0] &&
+                          dest[x*4+2] == alphacolor[1] &&
+                          dest[x*4+3] == alphacolor[2]) {
+                           *(U32*)&dest[x*4] = 0;
+                       }
+                   }
+               }
+           }
        }
        free(firstline);
 
@@ -667,8 +679,12 @@ TAG *MovieAddFrame(SWF * swf, TAG * t, char *sname, int id)
                if(hasalphacolor) {
                    if(rgba[i].r == alphacolor[0] &&
                       rgba[i].g == alphacolor[1] &&
-                      rgba[i].b == alphacolor[2])
+                      rgba[i].b == alphacolor[2]) {
+                       rgba[i].r = 0;
+                       rgba[i].g = 0;
+                       rgba[i].b = 0;
                        rgba[i].a = 0;
+                   }
                }
            }
        } else {
@@ -681,8 +697,12 @@ TAG *MovieAddFrame(SWF * swf, TAG * t, char *sname, int id)
                rgba[i].b = i*mult;
                rgba[i].a = 255;
                if(hasalphacolor) {
-                   if(rgba[i].r == alphacolor[0])
+                   if(rgba[i].r == alphacolor[0]) {
+                       rgba[i].r = 0;
+                       rgba[i].g = 0;
+                       rgba[i].b = 0;
                        rgba[i].a = 0;
+                   }
                }
            }
        }
@@ -852,7 +872,8 @@ int args_callback_option(char *arg, char *val)
            break;
 
        case 'z':
-           global.version = 6;
+           if(global.version<6)
+               global.version = 6;
            res = 0;
            break;
 
@@ -888,7 +909,7 @@ int args_callback_option(char *arg, char *val)
                global.force_height = atoi(val);
            res = 1;
            break;
-
+       
        case 'V':
            printf("png2swf - part of %s %s\n", PACKAGE, VERSION);
            exit(0);
@@ -949,6 +970,7 @@ static struct options_t options[] = {
 {"r", "rate"},
 {"o", "output"},
 {"z", "zlib"},
+{"T", "flashversion"},
 {"X", "pixel"},
 {"Y", "pixel"},
 {"v", "verbose"},
@@ -991,6 +1013,7 @@ void args_callback_usage(char *name)
     printf("-r , --rate <framerate>        Set movie framerate (frames per second)\n");
     printf("-o , --output <filename>       Set name for SWF output file.\n");
     printf("-z , --zlib <zlib>             Enable Flash 6 (MX) Zlib Compression\n");
+    printf("-T , --flashversion            Set the flash version to generate\n");
     printf("-X , --pixel <width>           Force movie width to <width> (default: autodetect)\n");
     printf("-Y , --pixel <height>          Force movie height to <height> (default: autodetect)\n");
     printf("-v , --verbose <level>         Set verbose level (0=quiet, 1=default, 2=debug)\n");