added comments.
[swftools.git] / src / png2swf.c
index 6e04212..b1827ed 100644 (file)
@@ -39,6 +39,7 @@ struct {
     int nfiles;
     int verbose;
     int do_cgi;
+    int version;
     char *outfile;
 } global;
 
@@ -53,7 +54,7 @@ TAG *MovieStart(SWF * swf, float framerate, int dx, int dy)
 
     memset(swf, 0x00, sizeof(SWF));
 
-    swf->fileVersion = 5;
+    swf->fileVersion = global.version;
     swf->frameRate = (int)(256.0 * framerate);
     swf->movieSize.xmax = dx * 20;
     swf->movieSize.ymax = dy * 20;
@@ -83,7 +84,13 @@ int MovieFinish(SWF * swf, TAG * t, char *sname)
     if(global.do_cgi) {
        if FAILED(swf_WriteCGI(swf)) fprintf(stderr,"WriteCGI() failed.\n");
     } else {
-       if FAILED(swf_WriteSWF(f,swf)) fprintf(stderr,"WriteSWF() failed.\n");
+       if(global.version >= 6) {
+           if (swf_WriteSWC(f, swf)<0) 
+                   fprintf(stderr, "Unable to write output file: %s\n", sname);
+       } else {
+           if (swf_WriteSWF(f, swf)<0) 
+                   fprintf(stderr, "Unable to write output file: %s\n", sname);
+       }
        if (f != so)
            close(f);
     }
@@ -308,11 +315,11 @@ void applyfilter4(int mode, U8*src, U8*old, U8*dest, int width)
     unsigned char lastr=0;
     unsigned char lastg=0;
     unsigned char lastb=0;
-    unsigned char lasta=0;
+    unsigned char lasta=0; //TODO: 255?
     unsigned char upperlastr=0;
     unsigned char upperlastg=0;
     unsigned char upperlastb=0;
-    unsigned char upperlasta=0;
+    unsigned char upperlasta=0; //TODO: 255?
 
     if(mode==0) {
        for(x=0;x<width;x++) {
@@ -563,7 +570,7 @@ TAG *MovieAddFrame(SWF * swf, TAG * t, char *sname, int id)
 
            if(!y) {
                old = firstline;
-               memset(old, 0, header.width*4);
+               memset(old, 0, header.width*4); //TODO: fill alpha with 255?
            } else {
                old = &data2[(y-1)*header.width*4];
            }
@@ -628,12 +635,13 @@ TAG *MovieAddFrame(SWF * swf, TAG * t, char *sname, int id)
                }
            }
        } else {
-           palettelen = 256;
+            int mult = (0x1ff>>header.bpp);
+           palettelen = 1<<header.bpp;
            rgba = (RGBA*)malloc(palettelen*sizeof(RGBA));
-           for(i=0;i<256;i++) {
-               rgba[i].r = i;
-               rgba[i].g = i;
-               rgba[i].b = i;
+           for(i=0;i<palettelen;i++) {
+               rgba[i].r = i*mult;
+               rgba[i].g = i*mult;
+               rgba[i].b = i*mult;
            }
        }
 
@@ -674,10 +682,6 @@ TAG *MovieAddFrame(SWF * swf, TAG * t, char *sname, int id)
        free(data2);
     }
 
-    while(t->len < 64) {
-       swf_SetU8(t, 0); //fix for flash player bug- see ../lib/modules/swfbits.c
-    }
-
     t = swf_InsertTag(t, ST_DEFINESHAPE3);
 
     swf_ShapeNew(&s);
@@ -787,6 +791,11 @@ int args_callback_option(char *arg, char *val)
            res = 1;
            break;
 
+       case 'z':
+           global.version = 6;
+           res = 0;
+           break;
+
        case 'C':
            global.do_cgi = 1;
            break;
@@ -830,6 +839,7 @@ int args_callback_option(char *arg, char *val)
 static struct options_t options[] = {
 {"r", "rate"},
 {"o", "output"},
+{"z", "zlib"},
 {"X", "pixel"},
 {"Y", "pixel"},
 {"v", "verbose"},
@@ -869,6 +879,7 @@ void args_callback_usage(char *name)
     printf("\n");
     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("-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");
@@ -886,11 +897,14 @@ int main(int argc, char **argv)
 
     global.framerate = 1.0;
     global.verbose = 1;
+    global.version = 4;
 
     processargs(argc, argv);
-
-    if(global.nfiles<=0)
+    
+    if(global.nfiles<=0) {
+       fprintf(stderr, "No png files found in arguments\n");
        return 1;
+    }
 
     if (VERBOSE(2))
        fprintf(stderr, "Processing %i file(s)...\n", global.nfiles);