X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=src%2Fswfrender.c;h=e9df12d2cacb7a6a408726df57b859337719355e;hp=9362fded585fb103d395e80d4efc935d6abd4d8c;hb=c1c865b58f4fbc9c97f92110306e277665ad9c81;hpb=f9dce1cb6c3810ff91601016ae3cba172ca7f903 diff --git a/src/swfrender.c b/src/swfrender.c index 9362fde..e9df12d 100644 --- a/src/swfrender.c +++ b/src/swfrender.c @@ -10,10 +10,12 @@ #include "../lib/gfxsource.h" #include "../lib/readers/swf.h" #include "../lib/devices/render.h" +#include "../lib/devices/rescale.h" static struct options_t options[] = { {"h", "help"}, {"o", "output"}, +{"p", "pages"}, {"l", "legacy"}, {"V", "version"}, {"X", "width"}, @@ -25,10 +27,19 @@ static int ng = 1; static char*filename = 0; static char*outputname = "output.png"; static int quantize = 0; +static char*pagerange = 0; static int width = 0; static int height = 0; +typedef struct _parameter { + const char*name; + const char*value; + struct _parameter*next; +} parameter_t; + +parameter_t*params = 0; + int args_callback_option(char*name,char*val) { if(!strcmp(name, "V")) { @@ -43,6 +54,25 @@ int args_callback_option(char*name,char*val) } else if(!strcmp(name, "q")) { quantize = 1; return 0; + } else if(!strcmp(name, "p")) { + pagerange = val; + return 1; + } else if(!strcmp(name, "s")) { + char*s = strdup(val); + char*c = strchr(s, '='); + parameter_t*p = malloc(sizeof(parameter_t)); + p->next = params; + params = p; + if(c && *c && c[1]) { + *c = 0; + c++; + p->name = s; + p->value = s; + } else { + p->name = s; + p->value = "1"; + } + return 1; } else if(!strcmp(name, "X")) { width = atoi(val); return 1; @@ -98,13 +128,14 @@ int main(int argn, char*argv[]) fi = open(filename, O_RDONLY|O_BINARY); if (fi<=0) { fprintf(stderr,"Couldn't open %s\n", filename); - perror(argv[1]); + perror(filename); exit(1); } if(swf_ReadSWF(fi,&swf)<0) { fprintf(stderr,"%s is not a valid SWF file or contains errors.\n",argv[1]); close(fi); } + assert(swf.movieSize.xmax > swf.movieSize.xmin && swf.movieSize.ymax > swf.movieSize.ymin); RENDERBUF buf; swf_Render_Init(&buf, 0,0, (swf.movieSize.xmax - swf.movieSize.xmin) / 20, (swf.movieSize.ymax - swf.movieSize.ymin) / 20, 2, 1); @@ -116,23 +147,37 @@ int main(int argn, char*argv[]) writePNG(outputname, (unsigned char*)img, buf.width, buf.height); swf_Render_Delete(&buf); } else { + parameter_t*p; + gfxsource_t*src = gfxsource_swf_create(); + for(p=params;p;p=p->next) { + src->setparameter(src, p->name, p->value); + } gfxdocument_t*doc = src->open(src, filename); + for(p=params;p;p=p->next) { + doc->setparameter(doc, p->name, p->value); + } if(!doc) { fprintf(stderr,"Couldn't open %s\n", filename); exit(1); } gfxdevice_t dev2,*dev=&dev2; gfxdevice_render_init(dev); + dev->setparameter(dev, "antialise", "4"); if(quantize) { dev->setparameter(dev, "palette", "1"); } if(width || height) { dev = gfxdevice_rescale_new(dev, width, height, 0); } + for(p=params;p;p=p->next) { + dev->setparameter(dev, p->name, p->value); + } int t; for(t=1;t<=doc->num_pages;t++) { + if(!is_in_range(t, pagerange)) + continue; gfxpage_t* page = doc->getpage(doc, t); dev->startpage(dev, page->width, page->height); page->render(page, dev);