fixed a bug which appeared when the first line was encoded using
[swftools.git] / src / png2swf.c
index 2f0c606..989e3ba 100644 (file)
@@ -418,6 +418,7 @@ void applyfilter1(int mode, U8*src, U8*old, U8*dest, int width)
     else if(mode==3) {
        for(x=0;x<width;x++) {
            *dest = *src+(*old+last)/2;
+           last = *dest;
            dest++;
            old++;
            src++;
@@ -541,6 +542,8 @@ TAG *MovieAddFrame(SWF * swf, TAG * t, char *sname, int id)
        int transparent=0;
        int semitransparent=0;
        /* in case for mode 2, the following also performs 24->32 bit conversion */
+       unsigned char* firstline = malloc(header.width*4);
+
        for(y=0;y<header.height;y++) {
            int mode = imagedata[pos++]; //filter mode
            U8*src;
@@ -559,8 +562,8 @@ TAG *MovieAddFrame(SWF * swf, TAG * t, char *sname, int id)
            }
 
            if(!y) {
-               memset(data2,0,header.width*4);
-               old = &data2[y*header.width*4];
+               old = firstline;
+               memset(old, 0, header.width*4);
            } else {
                old = &data2[(y-1)*header.width*4];
            }
@@ -569,6 +572,7 @@ TAG *MovieAddFrame(SWF * swf, TAG * t, char *sname, int id)
            else if(header.mode==2)
                applyfilter3(mode, src, old, dest, header.width);
        }
+       free(firstline);
 
        /* 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
@@ -837,15 +841,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}
 };
@@ -876,14 +878,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)