added ratio to put commands
[swftools.git] / src / png2swf.c
index e033e93..cc70c61 100644 (file)
@@ -355,6 +355,7 @@ void applyfilter4(int mode, U8*src, U8*old, U8*dest, int width)
            dest[1] = src[0]+(old[1]+lastr)/2;
            dest[2] = src[1]+(old[2]+lastg)/2;
            dest[3] = src[2]+(old[3]+lastb)/2;
+           lasta = dest[0];
            lastr = dest[1];
            lastg = dest[2];
            lastb = dest[3];
@@ -538,6 +539,7 @@ TAG *MovieAddFrame(SWF * swf, TAG * t, char *sname, int id)
        int pos=0;
        int opaque=0;
        int transparent=0;
+       int semitransparent=0;
        /* in case for mode 2, the following also performs 24->32 bit conversion */
        for(y=0;y<header.height;y++) {
            int mode = imagedata[pos++]; //filter mode
@@ -568,7 +570,6 @@ TAG *MovieAddFrame(SWF * swf, TAG * t, char *sname, int id)
                applyfilter3(mode, src, old, dest, header.width);
        }
 
-#ifdef HAVE_LIBJPEG
        /* the image is now compressed and stored in data. Now let's take
           a look at the alpha values to determine which bitmap type we
           should write */
@@ -577,15 +578,21 @@ TAG *MovieAddFrame(SWF * swf, TAG * t, char *sname, int id)
            U8*l = &data2[(y*header.width)*4];
            for(x=0;x<header.width;x++) {
                if(l[x*4+0]==255) transparent++;
-               if(l[x*4+0]==0) opaque++;
+               else if(l[x*4+0]==0) opaque++;
+               else semitransparent++;
            }
        }
        /* mode 6 images which are not fully opaque or fully transparent
           will be stored as definejpeg3 */
        if(header.mode == 6 && transparent != header.width*header.height
-                           && opaque != header.width*header.height) {
-          
+                           && opaque != header.width*header.height)
+#ifndef HAVE_JPEGLIB
+           fprintf(stderr, "Warning: No jpeg lib compiled in- not able to store transparency information\n");
+#else
+       {   
            fprintf(stderr, "Image has transparency information. Storing as DefineBitsJpeg3 Tag (jpeg+alpha)\n");
+           if(VERBOSE(2))
+               printf("Image is semi-transparent\n");
 
            // we always use quality 100, since png2swf is expected to
            // use more or less lossless compression
@@ -677,6 +684,10 @@ 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);
@@ -826,15 +837,13 @@ int args_callback_option(char *arg, char *val)
     return res;
 }
 
-struct options_t options[] = 
-{ 
-{"h", "help"},
-{"o", "output"},
+static struct options_t options[] = {
 {"r", "rate"},
-{"C", "cgi"},
+{"o", "output"},
+{"X", "pixel"},
+{"Y", "pixel"},
 {"v", "verbose"},
-{"X", "width"},
-{"Y", "height"},
+{"C", "cgi"},
 {"V", "version"},
 {0,0}
 };
@@ -865,14 +874,17 @@ int args_callback_command(char *arg, char *next)  // actually used as filename
 
 void args_callback_usage(char *name)
 {
-    printf("Usage: %s  [-options [value]] imagefiles[.png] [...]\n", name);
-    printf("\t-r , --rate <framerate>\t\t\tSet movie framerate (frames per second)\n");
-    printf("\t-o , --output <filename>\t\t\tSet name for SWF output file\n");
-    printf("\t-X , --pixel <width>\t\t\tForce movie width to pixel (default: autodetect)\n");
-    printf("\t-Y , --pixel <height>\t\t\tForce movie height to pixel (default: autodetect)\n");
-    printf("\t-v , --verbose <level>\t\t\t Set verbose level (0=quiet, 1=default, 2=debug)\n");
-    printf("\t-C , --cgi\t\t\t For use as CGI- prepend http header, write to stdout\n");
-    printf("\t-V , --version\t\t\tPrint version information and exit\n");
+    printf("\n");
+    printf("Usage: %s [-X width] [-Y height] [-o file.swf] [-r rate] file1.png [file2.png...]\n", 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("-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");
+    printf("-C , --cgi                     For use as CGI- prepend http header, write to stdout\n");
+    printf("-V , --version                 Print version information and exit\n");
+    printf("\n");
 }
 
 int main(int argc, char **argv)