X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fswfrender.c;h=b78255573dadaa87e99fd52391267a0c2cff2b55;hb=8a72635ad068c485c42a794429e8242f9241b12b;hp=ba87dbdf79bb6dbf601776a50a44eedba29fd1a9;hpb=3aeed2339b751b5c2974481683c5cc9e0ff05347;p=swftools.git diff --git a/src/swfrender.c b/src/swfrender.c index ba87dbd..b782555 100644 --- a/src/swfrender.c +++ b/src/swfrender.c @@ -5,90 +5,136 @@ #include #include #include "../lib/rfxswf.h" +#include "../lib/png.h" +#include "../lib/args.h" +#include "../lib/gfxsource.h" +#include "../lib/readers/swf.h" +#include "../lib/devices/render.h" -// swfrender.c +static struct options_t options[] = { +{"h", "help"}, +{"o", "output"}, +{"l", "legacy"}, +{"V", "version"}, +{0,0} +}; -typedef struct RENDERBUF -{ - int width; - int height; - void*internal; -} RENDERBUF; +static int ng = 1; +static char*filename = 0; +static char*outputname = "output.png"; +static int quantize = 0; -typedef struct heap_t +int args_callback_option(char*name,char*val) { -}; + if(!strcmp(name, "V")) { + printf("swfrender - part of %s %s\n", PACKAGE, VERSION); + exit(0); + } else if(!strcmp(name, "o")) { + outputname = strdup(val); + return 1; + } else if(!strcmp(name, "l")) { + ng = 0; + return 0; + } else if(!strcmp(name, "q")) { + quantize = 1; + return 0; + } else { + printf("Unknown option: -%s\n", name); + exit(1); + } -typedef struct _renderbuf_internal + return 0; +} +int args_callback_longoption(char*name,char*val) { - heap_t* lines; -} renderbuf_internal; - - -void swf_RenderShape(RENDERBUF*dest, SHAPE2*shape) + return args_long2shortoption(options, name, val); +} +void args_callback_usage(char *name) { - renderbuf_internal*i = (renderbuf_internal)dest->internal; - - SHAPELINE*line = shape->lines; - int x=0,y=0; - - while(line) - { - if(line->type == moveTo) { - /* max 31 bits + sign */ - x = line->x; - y = line->y; - } else if(line->type == lineTo) { - /* max 17 bits + sign */ - int diffx = line->x - x; - int diffy = line->y - y; - int stepx,posx=0,posy=0; - if(diffy<0) { - x = line->x; - y = line->y; - diffx = -diffx; - diffy = -diffy; - } - stepx = (diffx*0x1000) / diffy; - - while(posyx; - y = line->y; - } else if(line->type == splineTo) { - } - - line = line->next; + printf("\n"); + printf("Usage: %s file.swf [-o output.png]\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("\n"); +} +int args_callback_command(char*name,char*val) +{ + if(filename) { + fprintf(stderr, "Only one file allowed. You supplied at least two. (%s and %s)\n", + filename, name); } + filename = name; + return 0; } -int main() + + +int main(int argn, char*argv[]) { - char*filename = "output.swf"; - fi = open(filename, O_RDONLY|O_BINARY); - if (fi<=0) { - fprintf(stderr,"Couldn't open %s\n", filename); - perror(argv[1]); - exit(1); - } + SWF swf; + int fi; + + processargs(argn, argv); - if(swf_ReadSWF(fi,&swf)<0) { - fprintf(stderr,"%s is not a valid SWF file or contains errors.\n",argv[1]); - close(fi); + if(!filename) { + fprintf(stderr, "You must supply a filename.\n"); + return 1; } - tag = swf.firstTag; - while(tag) { - if(tag.id == ST_DEFINESHAPE3) { - SHAPE2 shape; - swf_ParseDefineShape(tag, &shape); - swf_RenderShape(tag, MATRIX m); + if(!ng) { + fi = open(filename, O_RDONLY|O_BINARY); + if (fi<=0) { + fprintf(stderr,"Couldn't open %s\n", filename); + perror(argv[1]); + 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); + } + 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) + writePalettePNG(outputname, (unsigned char*)img, buf.width, buf.height); + else + writePNG(outputname, (unsigned char*)img, buf.width, buf.height); + swf_Render_Delete(&buf); + } else { + gfxsource_t*src = gfxsource_swf_create(); + gfxdocument_t*doc = src->open(src, filename); + if(!doc) { + fprintf(stderr,"Couldn't open %s\n", filename); + exit(1); + } + gfxdevice_t dev2,*dev=&dev2; + gfxdevice_render_init(dev); + if(quantize) { + dev->setparameter(dev, "palette", "1"); } + + int t; + for(t=1;t<=doc->num_pages;t++) { + 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); } + return 0; } +