X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=src%2Fpdf2swf.c;h=3b67bccbfd22341470273c7eb7966c70c3e66fbf;hp=edc9bbc31687e93b5bd35b994151600552fa615f;hb=f32de5188d6ec5a3b70ced18669e27e0b250bf50;hpb=2fb94db6898305c25e25dae192b3f73e47a062a7 diff --git a/src/pdf2swf.c b/src/pdf2swf.c index edc9bbc..3b67bcc 100644 --- a/src/pdf2swf.c +++ b/src/pdf2swf.c @@ -23,26 +23,36 @@ #include #include #include +#include #include #include "../config.h" +#ifdef HAVE_SIGNAL_H +#include +#endif #ifdef HAVE_DIRENT_H #include #endif -#ifdef HAVE_SYS_STAT_H -#include +#ifdef HAVE_MALLOC_H +#include #endif + #include "../lib/args.h" #include "../lib/os.h" #include "../lib/rfxswf.h" #include "../lib/devices/swf.h" -#include "../lib/devices/arts.h" +#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" #define SWFDIR concatPaths(getInstallationPath(), "swfs") -gfxsource_t*driver; +static gfxsource_t*driver = 0; +static gfxdevice_t*out = 0; + +static int maxwidth=0, maxheight=0; static char * outputname = 0; static int loglevel = 3; @@ -58,8 +68,12 @@ static int ynup = 1; static int info_only = 0; +static int max_time = 0; + static int flatten = 0; +static char* filters = 0; + char* fontpaths[256]; int fontpathpos = 0; @@ -77,7 +91,7 @@ int systemf(const char* format, ...) int ret; va_list arglist; va_start(arglist, format); - vsprintf(buf, format, arglist); + vsnprintf(buf, sizeof(buf)-1, format, arglist); va_end(arglist); if(!system_quiet) { @@ -92,6 +106,57 @@ int systemf(const char* format, ...) return ret; } +#ifdef HAVE_SIGNAL_H +void sigalarm(int signal) +{ + msg(" Aborting rendering after %d seconds", max_time); +#if 0 && defined(HAVE_SYS_TIME_H) && defined(HAVE_SYS_RESOURCE_H) && defined(HAVE_GETRUSAGE) + struct rusage usage; + getrusage(RUSAGE_CHILDREN, &usage); + msg(" Memory used: %d,%d,%d", usage.ru_maxrss, usage.ru_idrss, usage.ru_isrss); +#endif +#if defined(HAVE_MALLINFO) && defined(HAVE_MALLOC_H) + struct mallinfo info = mallinfo(); + msg(" Memory used: %d Mb (%d bytes)", info.uordblks/1048576, info.uordblks); +#endif + exit(1); +} +#endif + +typedef struct _parameter { + struct _parameter*next; + const char*name; + const char*value; +} parameter_t; + +static parameter_t* device_config = 0; +static parameter_t* device_config_next = 0; +static void store_parameter(const char*name, const char*value) +{ + parameter_t*o = device_config; + while(o) { + if(!strcmp(name, o->name)) { + /* overwrite old value */ + free((void*)o->value); + o->value = strdup(value); + return; + } + o = o->next; + } + parameter_t*p = (parameter_t*)malloc(sizeof(parameter_t)); + p->name = strdup(name); + p->value = strdup(value); + p->next = 0; + + if(device_config_next) { + device_config_next->next = p; + device_config_next = p; + } else { + device_config = p; + device_config_next = p; + } +} + int args_callback_option(char*name,char*val) { if (!strcmp(name, "o")) { @@ -122,6 +187,16 @@ int args_callback_option(char*name,char*val) { ynup = 3; return 0; } + else if (!strcmp(name, "X")) + { + maxwidth = atoi(val); + return 1; + } + else if (!strcmp(name, "Y")) + { + maxheight = atoi(val); + return 1; + } else if (!strcmp(name, "q")) { loglevel --; @@ -157,7 +232,7 @@ int args_callback_option(char*name,char*val) { char*x2 = strtok(0, ":"); char*y2 = strtok(0, ":"); if(!(x1 && y1 && x2 && y2)) { - fprintf(stderr, "-m option requires four arguments, :::\n"); + fprintf(stderr, "-c option requires four arguments, :::\n"); exit(1); } custom_clip = 1; @@ -185,36 +260,56 @@ 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; c++; - driver->set_parameter(s,c); + store_parameter(s,c); + } else if(!strcmp(s,"help")) { + printf("PDF Parameters:\n"); + gfxsource_t*pdf = gfxsource_pdf_create(); + pdf->setparameter(pdf, "help", ""); + gfxdevice_t swf; + gfxdevice_swf_init(&swf); + printf("SWF Parameters:\n"); + swf.setparameter(&swf, "help", ""); + exit(0); + } else { + store_parameter(s,"1"); } - else - driver->set_parameter(s,"1"); return 1; } else if (!strcmp(name, "S")) { - driver->set_parameter("drawonlyshapes", "1"); + store_parameter("drawonlyshapes", "1"); return 0; } else if (!strcmp(name, "i")) { - driver->set_parameter("ignoredraworder", "1"); + store_parameter("ignoredraworder", "1"); return 0; } +#ifndef WIN32 + else if (!strcmp(name, "Q")) + { + max_time = atoi(val); + alarm(max_time); +# ifdef HAVE_SIGNAL_H + signal(SIGALRM, sigalarm); +# endif + return 1; + } +#endif else if (!strcmp(name, "z")) { - driver->set_parameter("enablezlib", "1"); + store_parameter("enablezlib", "1"); zlib = 1; return 0; } else if (!strcmp(name, "n")) { - driver->set_parameter("opennewwindow", "1"); + store_parameter("opennewwindow", "1"); return 0; } else if (!strcmp(name, "I")) @@ -224,30 +319,62 @@ int args_callback_option(char*name,char*val) { } else if (!strcmp(name, "t")) { - driver->set_parameter("insertstop", "1"); + store_parameter("insertstop", "1"); return 0; } else if (!strcmp(name, "T")) { if(!strcasecmp(val, "mx")) - driver->set_parameter("flashversion", "6"); + store_parameter("flashversion", "6"); else - driver->set_parameter("flashversion", val); + store_parameter("flashversion", val); return 1; } else if (!strcmp(name, "f")) { - driver->set_parameter("storeallcharacters", "1"); + store_parameter("storeallcharacters", "1"); + 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")) { - driver->set_parameter("linksopennewwindow", "0"); + store_parameter("linksopennewwindow", "0"); return 0; } + else if (!strcmp(name, "O")) + { + int level = 1; + int ret=0; + if(val&& val[0] && val[1]==0 && isdigit(val[0])) { + level = atoi(val); + ret=1; + } + if(level>=1) + store_parameter("poly2bitmap", "1"); + if(level>=2) + store_parameter("bitmapfonts", "1"); + if(level>=3) + store_parameter("ignoredraworder", "1"); + return ret; + } else if (!strcmp(name, "G")) { + //store_parameter("optimize_polygons", "1"); flatten = 1; return 0; } @@ -309,10 +436,10 @@ int args_callback_option(char*name,char*val) { else if (!strcmp(name, "j")) { if(name[1]) { - driver->set_parameter("jpegquality", &name[1]); + store_parameter("jpegquality", &name[1]); return 0; } else { - driver->set_parameter("jpegquality", val); + store_parameter("jpegquality", val); return 1; } } @@ -329,45 +456,35 @@ int args_callback_option(char*name,char*val) { return 0; } -/*struct docoptions_t options[] = -{{"o","output","filename::Specify output file"}, - {"V","version","Print program version"}, - {"i","ignore","Ignore draw order (makes the SWF file smaller, but may produce graphic errors)"}, - {"z","zlib","Use Flash 6 (MX) zlib compression (Needs at least Flash 6 Plugin to play)"}, - {"s","shapes","Don't use SWF Fonts, but store everything as shape"}, - {"j","jpegquality","Set quality of embedded jpeg pictures (default: 85)"}, - {"p","pages","Convert only pages in range. (E.g. 3-85)"}, - {"w","samewindow","Don't open a new browser window for links in the SWF"}, - {"f","fonts","Stroe full fonts in SWF. (Don't reduce to used characters)"}, - {"F","fontpath","path::Add directory to font search path"}, - {"B","viewer","name::Link viewer \"name\" to the pdf"}, - {"L","preloader","file.swf::Link preloader \"file.swf\" to the pdf"}, - {"b","defaultviewer","Link default viewer to the pdf"}, - {"l","defaultpreloader","Link default preloader to the pdf"} - {0,0} -};*/ -struct options_t options[] = -{{"o","output"}, - {"q","quiet"}, - {"V","version"}, - {"i","ignore"}, - {"I","info"}, - {"z","zlib"}, - {"s","set"}, - {"S","shapes"}, - {"j","jpegquality"}, - {"p","pages"}, - {"w","samewindow"}, - {"f","fonts"}, - {"F","fontdir"}, - {"B","viewer"}, - {"G","flatten"}, - {"L","preloader"}, - {"b","defaultviewer"}, - {"l","defaultpreloader"}, - {"t","stop"}, - {"T","flashversion"}, - {0,0} +static struct options_t options[] = { +{"h", "help"}, +{"V", "version"}, +{"o", "output"}, +{"p", "pages"}, +{"P", "password"}, +{"v", "verbose"}, +{"z", "zlib"}, +{"i", "ignore"}, +{"j", "jpegquality"}, +{"s", "set"}, +{"w", "samewindow"}, +{"t", "stop"}, +{"T", "flashversion"}, +{"F", "fontdir"}, +{"ff", "filter"}, +{"b", "defaultviewer"}, +{"l", "defaultloader"}, +{"B", "viewer"}, +{"L", "preloader"}, +{"q", "quiet"}, +{"S", "shapes"}, +{"f", "fonts"}, +{"G", "flatten"}, +{"I", "info"}, +{"Q", "maxtime"}, +{"X", "width"}, +{"Y", "height"}, +{0,0} }; int args_callback_longoption(char*name,char*val) { @@ -389,42 +506,36 @@ int args_callback_command(char*name, char*val) { return 0; } -void args_callback_usage(char*name) +void args_callback_usage(char *name) { - printf("Usage: %s [Options] input.pdf [-o output.swf]\n", name); - printf("\nBasic options:\n"); - printf("-p --pages=range Convert only pages in range\n"); - printf("-P --password=password Use password for deciphering the pdf\n"); - printf("-v --verbose Be verbose. Use more than one -v for greater effect\n"); - printf("-q --quiet Suppress normal messages. Use -qq to suppress warnings, also.\n"); -#ifdef HAVE_DIRENT_H - printf("-F --fontdir directory Add directory to font search path\n"); -#endif - printf("-V --version Print program version\n"); - printf("\nEnhanced conversion options:\n"); - printf("-S --shapes Don't use SWF Fonts, but store everything as shape\n"); - printf("-z --zlib Use Flash 6 (MX) zlib compression (Needs at least Flash 6 Plugin to play)\n"); - printf("-w --samewindow Don't open a new Browser Window for Links in the SWF\n"); - printf("-f --fonts Store full fonts in SWF. (Don't reduce to used characters)\n"); - printf("-T --flashversion=num Set the flash version in the header to num (default: 4)\n"); - printf("-s insertstop Insert a \"Stop\" Tag in every frame (don't turn pages automatically)\n"); - printf("-s zoom=factor Scale result, default: 72\n"); - printf("-s jpegquality=quality Set quality of embedded jpeg pictures (default:85)\n"); - printf("-s caplinewidth=value Set the minimum line width to trigger cap style handling to value. (3)\n"); - printf("-s splinequality=value Set the quality of spline convertion to value (0-100, default: 100).\n"); - printf("-s fontquality=value Set the quality of font convertion to value (0-100, default: 100).\n"); - printf("-s ignoredraworder Ignore draw order (makes the SWF file smaller and faster, but may produce\n" - " graphic errors)\n"); - printf("-s filloverlap Make intersecting shapes overlap, instead of canceling each\n" - " other out. (Needed for some Powerpoint PDFs)\n"); - //deliberately undocumented (for now) - //printf("-2 Put 2 pages into each frame.\n"); - //printf("-4 Put 4 pages into each frame.\n"); - printf("Postprocessing options:\n"); - printf("-b --defaultviewer Link default viewer to the pdf (%s)\n", concatPaths(SWFDIR, "default_viewer.swf")); - printf("-l --defaultpreloader Link default preloader the pdf (%s)\n", concatPaths(SWFDIR, "default_loader.swf")); - printf("-B --viewer=filename Link viewer \"name\" to the pdf (\"%s -B\" for list)\n", name); - printf("-L --preloader=filename Link preloader \"name\" to the pdf (\"%s -L\" for list)\n",name); + printf("\n"); + printf("Usage: %s [-options] file.pdf -o file.swf\n", name); + printf("\n"); + printf("-h , --help Print short help message and exit\n"); + printf("-V , --version Print version info and exit\n"); + printf("-o , --output file.swf Direct output to file.swf. If file.swf contains '%%' (file%%.swf), then each page goes to a seperate file.\n"); + printf("-p , --pages range Convert only pages in range with range e.g. 1-20 or 1,4,6,9-11 or\n"); + printf("-P , --password password Use password for deciphering the pdf.\n"); + printf("-v , --verbose Be verbose. Use more than one -v for greater effect.\n"); + printf("-z , --zlib Use Flash 6 (MX) zlib compression.\n"); + printf("-i , --ignore Allows pdf2swf to change the draw order of the pdf. This may make the generated\n"); + printf("-j , --jpegquality quality Set quality of embedded jpeg pictures to quality. 0 is worst (small), 100 is best (big). (default:85)\n"); + printf("-s , --set param=value Set a SWF encoder specific parameter. See pdf2swf -s help for more information.\n"); + printf("-w , --samewindow When converting pdf hyperlinks, don't make the links open a new window. \n"); + printf("-t , --stop Insert a stop() command in each page. \n"); + printf("-T , --flashversion num Set Flash Version in the SWF header to num.\n"); + printf("-F , --fontdir directory Add directory to the font search path.\n"); + printf("-b , --defaultviewer Link a standard viewer to the swf file. \n"); + printf("-l , --defaultloader Link a standard preloader to the swf file which will be displayed while the main swf is loading.\n"); + printf("-B , --viewer filename Link viewer filename to the swf file. \n"); + printf("-L , --preloader filename Link preloader filename to the swf file. \n"); + printf("-q , --quiet Suppress normal messages. Use -qq to suppress warnings, also.\n"); + printf("-S , --shapes Don't use SWF Fonts, but store everything as shape.\n"); + printf("-f , --fonts Store full fonts in SWF. (Don't reduce to used characters).\n"); + printf("-G , --flatten Remove as many clip layers from file as possible. \n"); + printf("-I , --info Don't do actual conversion, just display a list of all pages in the PDF.\n"); + printf("-Q , --maxtime n Abort conversion after n seconds. Only available on Unix.\n"); + printf("\n"); } float getRate(char*filename) @@ -450,7 +561,7 @@ float getRate(char*filename) void show_info(gfxsource_t*driver, char*filename) { - gfxdocument_t* pdf = driver->open(filename); + gfxdocument_t* pdf = driver->open(driver, filename); int pagenr; FILE*fo=0; if(!pdf) { @@ -476,6 +587,44 @@ void show_info(gfxsource_t*driver, char*filename) pdf->destroy(pdf); } + +static gfxdevice_t swf,wrap,rescale; +gfxdevice_t*create_output_device() +{ + gfxdevice_swf_init(&swf); + + /* set up filter chain */ + + out = &swf; + if(flatten) { + gfxdevice_removeclippings_init(&wrap, &swf); + out = &wrap; + } + + if(maxwidth || maxheight) { + gfxdevice_rescale_init(&rescale, out, maxwidth, maxheight, 0); + 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) { + out->setparameter(out, p->name, p->value); + p = p->next; + } + return out; +} + int main(int argn, char *argv[]) { int ret; @@ -485,25 +634,14 @@ int main(int argn, char *argv[]) char t1searchpath[1024]; int nup_pos = 0; int x,y; - char* installPath = getInstallationPath(); - char* fontdir = 0; + int one_file_per_page = 0; initLog(0,-1,0,0,-1,loglevel); -#if defined(WIN32) && defined(HAVE_STAT) && defined(HAVE_SYS_STAT_H) - if(installPath) { - fontdir = concatPaths(installPath, "fonts"); - FILE*test = fopen(concatPaths(fontdir,"\\d050000l.afm"), "rb"); - if(!test) { - fprintf(stderr, "Couldn't find file %s - pdf2swf not installed properly? OS says:\n", concatPaths(fontdir, "\\d050000l.afm")); - perror("open"); - exit(1); - } - fclose(test); - } -#else - fontdir = concatPaths(installPath, "fonts"); -#endif + /* not needed anymore since fonts are embedded + if(installPath) { + fontpaths[fontpathpos++] = concatPaths(installPath, "fonts"); + }*/ #ifdef HAVE_SRAND48 srand48(time(0)); @@ -512,75 +650,99 @@ int main(int argn, char *argv[]) srand(time(0)); #endif #endif - driver = gfxsource_pdf_create(); processargs(argn, argv); + driver = gfxsource_pdf_create(); + + /* pass global parameters to PDF driver*/ + parameter_t*p = device_config; + while(p) { + driver->setparameter(driver, p->name, p->value); + p = p->next; + } + if(!filename) { fprintf(stderr, "Please specify an input file\n"); exit(1); } - if(info_only) { - show_info(driver, filename); - return 0; - } - - if(!outputname) - { - if(filename) { - outputname = stripFilename(filename, ".swf"); - msg(" Output filename not given. Writing to %s", outputname); - } - } - - if(!outputname) - { - fprintf(stderr, "Please use -o to specify an output file\n"); - exit(1); + if (!info_only) { + if(!outputname) + { + if(filename) { + outputname = stripFilename(filename, ".swf"); + msg(" Output filename not given. Writing to %s", outputname); + } + } + + if(!outputname) + { + fprintf(stderr, "Please use -o to specify an output file\n"); + exit(1); + } } // test if the page range is o.k. is_in_range(0x7fffffff, pagerange); - if(pagerange) - driver->set_parameter("pages", pagerange); - if (!filename) { args_callback_usage(argv[0]); exit(0); } + + char fullname[256]; + if(password && *password) { + sprintf(fullname, "%s|%s", filename, password); + filename = fullname; + } + + if(pagerange) + driver->setparameter(driver, "pages", pagerange); /* add fonts */ - if(fontdir) { - driver->set_parameter("fontdir", fontdir); - } for(t=0;tset_parameter("fontdir", fontpaths[t]); + driver->setparameter(driver, "fontdir", fontpaths[t]); } - char fullname[256]; - if(password && *password) { - sprintf(fullname, "%s|%s", filename, password); - filename = fullname; + if(info_only) { + show_info(driver, filename); + return 0; } - gfxdocument_t* pdf = driver->open(filename); + char*u = 0; + if((u = strchr(outputname, '%'))) { + if(strchr(u+1, '%') || + strchr(outputname, '%')!=u) { + msg(" only one %% allowed in filename\n"); + return 1; + } + if(preloader || viewer) { + msg(" -b/-l/-B/-L not supported together with %% in filename\n"); + return 1; + } + msg(" outputting one file per page"); + one_file_per_page = 1; + char*pattern = (char*)malloc(strlen(outputname)+2); + /* convert % to %d */ + int l = u-outputname+1; + memcpy(pattern, outputname, l); + pattern[l]='d'; + strcpy(pattern+l+1, outputname+l); + outputname = pattern; + } + + gfxdocument_t* pdf = driver->open(driver, filename); if(!pdf) { msg(" Couldn't open %s", filename); exit(1); } - - gfxdevice_t swf,wrap; - gfxdevice_swf_init(&swf); - gfxdevice_t*out; - - if(flatten) { - gfxdevice_removeclippings_init(&wrap, &swf); - out = &wrap; - } else { - out = &swf; + /* pass global parameters document */ + p = device_config; + while(p) { + pdf->setparameter(pdf, p->name, p->value); + p = p->next; } struct mypage_t { @@ -598,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)) { @@ -606,9 +768,16 @@ int main(int argn, char *argv[]) frame++; } } + if(pagerange && !pagenum && frame==1) { + fprintf(stderr, "No pages in range %s", pagerange); + exit(1); + } 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)) { @@ -670,44 +839,84 @@ int main(int argn, char *argv[]) pages[t].page->destroy(pages[t].page); } pagenum = 0; + + if(one_file_per_page) { + gfxresult_t*result = out->finish(out);out=0; + char buf[1024]; + sprintf(buf, outputname, pagenr); + if(result->save(result, buf) < 0) { + return 1; + } + result->destroy(result);result=0; + out = create_output_device();; + msg(" Writing SWF file %s", buf); + } } } - - gfxresult_t*result = out->finish(out); - - if(result->save(result, outputname) < 0) { - exit(1); + + if(one_file_per_page) { + // remove empty device + gfxresult_t*result = out->finish(out);out=0; + result->destroy(result);result=0; + } else { + gfxresult_t*result = out->finish(out); + msg(" Writing SWF file %s", outputname); + if(result->save(result, outputname) < 0) { + exit(1); + } + int width = (int)(ptroff_t)result->get(result, "width"); + int height = (int)(ptroff_t)result->get(result, "height"); + result->destroy(result);result=0; + + if(preloader || viewer) { + const char*zip = ""; + if(zlib) { + zip = "-z"; + } + if(!preloader && viewer) { + systemf("swfcombine %s -X %d -Y %d \"%s\" viewport=\"%s\" -o \"%s\"",zip,width,height, + viewer, outputname, outputname); + if(!system_quiet) + printf("\n"); + } + if(preloader && !viewer) { + msg(" --preloader option without --viewer option doesn't make very much sense."); + ret = systemf("swfcombine %s -Y %d -X %d %s/PreLoaderTemplate.swf loader=\"%s\" movie=\"%s\" -o \"%s\"",zip,width,height, + SWFDIR, preloader, outputname, outputname); + if(!system_quiet) + printf("\n"); + } + if(preloader && viewer) { +#ifdef HAVE_MKSTEMP + char tmpname[] = "__swf__XXXXXX"; + mkstemp(tmpname); +#else + char*tmpname = "__tmp__.swf"; +#endif + systemf("swfcombine \"%s\" viewport=%s -o %s", + viewer, outputname, tmpname); + systemf("swfcombine %s -X %d -Y %d -r %f %s/PreLoaderTemplate.swf loader=%s movie=%s -o \"%s\"",zip,width,height, + getRate(preloader), SWFDIR, preloader, tmpname, outputname); + systemf("rm %s", tmpname); + } + } } - int width = (int)result->get(result, "width"); - int height = (int)result->get(result, "height"); - msg(" SWF written"); - - result->destroy(result); - pdf->destroy(pdf); + driver->destroy(driver); - char*zip = ""; - if(zlib) { - zip = "-z"; - systemf("swfcombine %s -X %d -Y %d \"%s\" viewport=\"%s\" -o \"%s\"",zip,width,height, - viewer, outputname, outputname); - if(!system_quiet) - printf("\n"); - } - if(preloader && !viewer) { - msg(" --preloader option without --viewer option doesn't make very much sense."); - ret = systemf("swfcombine %s -Y %d -X %d %s/PreLoaderTemplate.swf loader=\"%s\" movie=\"%s\" -o \"%s\"",zip,width,height, - SWFDIR, preloader, outputname, outputname); - if(!system_quiet) - printf("\n"); - } - if(preloader && viewer) { - systemf("swfcombine \"%s\" viewport=%s -o __tmp__.swf", - viewer, outputname); - systemf("swfcombine %s -X %d -Y %d -r %f %s/PreLoaderTemplate.swf loader=%s movie=__tmp__.swf -o \"%s\"",zip,width,height, - getRate(preloader), SWFDIR, preloader, outputname); - systemf("rm __tmp__.swf"); + + /* free global parameters */ + p = device_config; + while(p) { + parameter_t*next = p->next; + if(p->name) free((void*)p->name);p->name = 0; + if(p->value) free((void*)p->value);p->value =0; + p->next = 0;free(p); + p = next; + } + if(filters) { + free(filters); } return 0;