fixed mem leaks
[swftools.git] / src / pdf2swf.c
index 4344187..3b67bcc 100644 (file)
@@ -43,6 +43,7 @@
 #include "../lib/devices/polyops.h"
 #include "../lib/devices/record.h"
 #include "../lib/devices/rescale.h"
+#include "../lib/gfxfilter.h"
 #include "../lib/pdf/pdf.h"
 #include "../lib/log.h"
 
@@ -71,6 +72,8 @@ static int max_time = 0;
 
 static int flatten = 0;
 
+static char* filters = 0;
+
 char* fontpaths[256];
 int fontpathpos = 0;
 
@@ -257,7 +260,7 @@ int args_callback_option(char*name,char*val) {
     }
     else if (!strcmp(name, "s"))
     {
-       char*s = strdup(val);
+       char*s = val;
        char*c = strchr(s, '=');
        if(c && *c && c[1])  {
            *c = 0;
@@ -266,7 +269,7 @@ int args_callback_option(char*name,char*val) {
        } else if(!strcmp(s,"help")) {
            printf("PDF Parameters:\n");
            gfxsource_t*pdf = gfxsource_pdf_create();
-           pdf->set_parameter(pdf, "help", "");
+           pdf->setparameter(pdf, "help", "");
            gfxdevice_t swf;
            gfxdevice_swf_init(&swf);
            printf("SWF Parameters:\n");
@@ -334,6 +337,20 @@ int args_callback_option(char*name,char*val) {
        store_parameter("extrafontdata", "1");
        return 0;
     }
+    else if (!strcmp(name, "ff"))
+    {
+       if(filters) {
+           // append this to the current filter expression (we allow more than one --filter)
+           int l = strlen(filters);
+           int new_len = l + strlen(val) + 2;
+           filters = (char*)realloc(filters, new_len);
+           filters[l] = ':';
+           strcpy(filters+l+1, val);
+       } else {
+           filters = strdup(val);
+       }
+       return 1;
+    }
     else if (!strcmp(name, "w"))
     {
        store_parameter("linksopennewwindow", "0");
@@ -454,6 +471,7 @@ static struct options_t options[] = {
 {"t", "stop"},
 {"T", "flashversion"},
 {"F", "fontdir"},
+{"ff", "filter"},
 {"b", "defaultviewer"},
 {"l", "defaultloader"},
 {"B", "viewer"},
@@ -588,6 +606,16 @@ gfxdevice_t*create_output_device()
         out = &rescale;
     }
 
+    if(filters) {
+       gfxfilterchain_t*chain = gfxfilterchain_parse(filters);
+       if(!chain) {
+           fprintf(stderr, "Unable to parse filters: %s\n", filters);
+           exit(1);
+       }
+       out = gfxfilterchain_apply(chain, out);
+       gfxfilterchain_destroy(chain);
+    }
+
     /* pass global parameters to output device */
     parameter_t*p = device_config;
     while(p) {
@@ -630,7 +658,7 @@ int main(int argn, char *argv[])
     /* pass global parameters to PDF driver*/
     parameter_t*p = device_config;
     while(p) {
-       driver->set_parameter(driver, p->name, p->value);
+       driver->setparameter(driver, p->name, p->value);
        p = p->next;
     }
 
@@ -671,11 +699,11 @@ int main(int argn, char *argv[])
     }
     
     if(pagerange)
-       driver->set_parameter(driver, "pages", pagerange);
+       driver->setparameter(driver, "pages", pagerange);
 
     /* add fonts */
     for(t=0;t<fontpathpos;t++) {
-       driver->set_parameter(driver, "fontdir", fontpaths[t]);
+       driver->setparameter(driver, "fontdir", fontpaths[t]);
     }
 
     if(info_only) {
@@ -713,7 +741,7 @@ int main(int argn, char *argv[])
     /* pass global parameters document */
     p = device_config;
     while(p) {
-       pdf->set_parameter(pdf, p->name, p->value);
+       pdf->setparameter(pdf, p->name, p->value);
        p = p->next;
     }
 
@@ -732,7 +760,7 @@ int main(int argn, char *argv[])
        if(is_in_range(pagenr, pagerange)) {
            char mapping[80];
            sprintf(mapping, "%d:%d", pagenr, frame);
-           pdf->set_parameter(pdf, "pagemap", mapping);
+           pdf->setparameter(pdf, "pagemap", mapping);
            pagenum++;
        }
        if(pagenum == xnup*ynup || (pagenr == pdf->num_pages && pagenum>1)) {
@@ -748,6 +776,8 @@ int main(int argn, char *argv[])
     pagenum = 0;
 
     gfxdevice_t*out = create_output_device();;
+    pdf->prepare(pdf, out);
+
     for(pagenr = 1; pagenr <= pdf->num_pages; pagenr++) 
     {
        if(is_in_range(pagenr, pagerange)) {
@@ -885,6 +915,9 @@ int main(int argn, char *argv[])
        p->next = 0;free(p);
        p = next;
     }
+    if(filters) {
+       free(filters);
+    }
 
     return 0;
 }