From a3d9d6bc6a7e50ecbb436ad300562e26701f6ed9 Mon Sep 17 00:00:00 2001 From: timw Date: Wed, 27 Jun 2012 10:11:41 +1200 Subject: [PATCH] Allow swfrender to output multiple page ranges, using the existing page range support, but allowing multiple pages to be selected and suffixing the output filename for each page. Also documented the arguments. --- src/swfrender.c | 169 ++++++++++++++++++++++++++++++++----------------------- 1 files changed, 98 insertions(+), 71 deletions(-) diff --git a/src/swfrender.c b/src/swfrender.c index afdb9ee..58c7eb8 100644 --- a/src/swfrender.c +++ b/src/swfrender.c @@ -93,13 +93,14 @@ int args_callback_longoption(char*name,char*val) void args_callback_usage(char *name) { printf("\n"); - printf("Usage: %s file.swf [-o output.png]\n", name); + printf("Usage: %s file.swf [-options]\n", name); printf("\n"); printf("-h , --help Print short help message and exit\n"); printf("-l , --legacy Use old rendering framework\n"); - printf("-o , --output Output file (default: output.png)\n"); - printf("-X , --width Width of resulting image\n"); - printf("-Y , --height Height of resulting image\n"); + printf("-o , --output Output file, suffixed for multiple pages (default: output.png)\n"); + printf("-p , --pages range Render pages in specified range e.g. 9 or 1-20 or 1,4-6,9-11 (default: all pages)\n"); + printf("-X , --width width Scale output to specific width (proportional unless height specified)\n"); + printf("-Y , --height height Scale output to specific height (proportional unless width specified)\n"); printf("\n"); } int args_callback_command(char*name,char*val) @@ -122,79 +123,105 @@ int main(int argn, char*argv[]) processargs(argn, argv); if(!filename) { - fprintf(stderr, "You must supply a filename.\n"); - return 1; + fprintf(stderr, "You must supply a filename.\n"); + return 1; } if(!ng) { - fi = open(filename, O_RDONLY|O_BINARY); - if (fi<=0) { - fprintf(stderr,"Couldn't open %s\n", filename); - 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); - swf_RenderSWF(&buf, &swf); - RGBA* img = swf_Render(&buf); - if(quantize) - png_write_palette_based_2(outputname, (unsigned char*)img, buf.width, buf.height); - else - png_write(outputname, (unsigned char*)img, buf.width, buf.height); - swf_Render_Delete(&buf); + fi = open(filename, O_RDONLY|O_BINARY); + if (fi<=0) { + fprintf(stderr,"Couldn't open %s\n", filename); + 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); + swf_RenderSWF(&buf, &swf); + RGBA* img = swf_Render(&buf); + if(quantize) + png_write_palette_based_2(outputname, (unsigned char*)img, buf.width, buf.height); + else + png_write(outputname, (unsigned char*)img, buf.width, buf.height); + swf_Render_Delete(&buf); } else { - parameter_t*p; + 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"); + gfxsource_t*src = gfxsource_swf_create(); + for(p=params;p;p=p->next) { + src->setparameter(src, p->name, p->value); } - 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); - dev->endpage(dev); - page->destroy(page); - break; - } - gfxresult_t*result = dev->finish(dev); - if(result) { - if(result->save(result, outputname) < 0) { - exit(1); - } - result->destroy(result); - } - doc->destroy(doc); + 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); + } + int t; + int count = 0; + char to_output[doc->num_pages]; + for(t=1;t<=doc->num_pages;t++) { + to_output[t-1] = 0; + if(is_in_range(t, pagerange)) { + to_output[t-1] = 1; + count++; + } + } + if (count == 0) { + fprintf(stderr,"No pages selected for output. Available pages are 1..%d\n", doc->num_pages); + exit(1); + } + for(t=1;t<=sizeof(to_output);t++) { + if (to_output[t-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); + } + + gfxpage_t* page = doc->getpage(doc, t); + dev->startpage(dev, page->width, page->height); + page->render(page, dev); + dev->endpage(dev); + page->destroy(page); + + gfxresult_t* result = dev->finish(dev); + if(result) { + char* effective_outputname = outputname; + char suffixed_outputname[1000]; + if (count > 1) { + effective_outputname = suffixed_outputname; + char* ext = strrchr(outputname, '.'); + if (ext) { + strncpy(suffixed_outputname, outputname, (ext - outputname)); + sprintf(suffixed_outputname + (ext-outputname), "-%d.%s", t, (ext+1)); + } else { + sprintf(suffixed_outputname, "%s-%d", outputname, t); + } + } + if(result->save(result, effective_outputname) < 0) { + fprintf(stderr,"Error writing page %d to %s\n", t, outputname); + exit(1); + } + result->destroy(result); + } + } + } + doc->destroy(doc); } return 0; } -- 1.7.9