new option --ng
[swftools.git] / src / swfrender.c
1 #include "../config.h"
2 #include <stdio.h>
3 #include <stdarg.h>
4 #include <assert.h>
5 #include <unistd.h>
6 #include <fcntl.h>
7 #include "../lib/rfxswf.h"
8 #include "../lib/png.h"
9 #include "../lib/args.h"
10 #include "../lib/gfxsource.h"
11 #include "../lib/swf/swf.h"
12
13 static struct options_t options[] = {
14 {"h", "help"},
15 {"o", "output"},
16 {"n", "ng"},
17 {"V", "version"},
18 {0,0}
19 };
20
21 static int ng = 0;
22 static char*filename = 0;
23 static char*outputname = "output.png";
24
25 int args_callback_option(char*name,char*val)
26 {
27     if(!strcmp(name, "V")) {
28         printf("swfrender - part of %s %s\n", PACKAGE, VERSION);
29         exit(0);
30     } else if(!strcmp(name, "o")) {
31         outputname = strdup(val);
32         return 1;
33     } else if(!strcmp(name, "n")) {
34         ng = 1;
35         return 0;
36     } else {
37         printf("Unknown option: -%s\n", name);
38         exit(1);
39     }
40
41     return 0;
42 }
43 int args_callback_longoption(char*name,char*val)
44 {
45     return args_long2shortoption(options, name, val);
46 }
47 void args_callback_usage(char *name)
48 {
49     printf("\n");
50     printf("Usage: %s file.swf [-o output.png]\n", name);
51     printf("\n");
52     printf("-h , --help                    Print short help message and exit\n");
53     printf("-n , --ng                      Use next generation renderer (based on gfxdevice)\n");
54     printf("-o , --output                  Output file (default: output.png)\n");
55     printf("\n");
56 }
57 int args_callback_command(char*name,char*val)
58 {
59     if(filename) {
60         fprintf(stderr, "Only one file allowed. You supplied at least two. (%s and %s)\n",
61                  filename, name);
62     }
63     filename = name;
64     return 0;
65 }
66
67
68
69 int main(int argn, char*argv[])
70 {
71     SWF swf;
72     int fi;
73
74     processargs(argn, argv);
75
76     if(!filename) {
77         fprintf(stderr, "You must supply a filename.\n");
78         return 1;
79     }
80
81     if(!ng) {
82         fi = open(filename, O_RDONLY|O_BINARY);
83         if (fi<=0) { 
84             fprintf(stderr,"Couldn't open %s\n", filename);
85             perror(argv[1]);
86             exit(1);
87         }
88         if(swf_ReadSWF(fi,&swf)<0) { 
89             fprintf(stderr,"%s is not a valid SWF file or contains errors.\n",argv[1]);
90             close(fi);
91         }
92         RENDERBUF buf;
93         swf_Render_Init(&buf, 0,0, (swf.movieSize.xmax - swf.movieSize.xmin) / 20,
94                                    (swf.movieSize.ymax - swf.movieSize.ymin) / 20, 2, 1);
95         swf_RenderSWF(&buf, &swf);
96         RGBA* img = swf_Render(&buf);
97         writePNG(outputname, (unsigned char*)img, buf.width, buf.height);
98         swf_Render_Delete(&buf);
99     } else {
100         gfxsource_t*src = gfxsource_swf_create();
101         gfxdocument_t*doc = src->open(filename);
102         if(!doc) {
103             fprintf(stderr,"Couldn't open %s\n", filename);
104             exit(1);
105         }
106         gfxdevice_t dev2,*dev=&dev2;
107         gfxdevice_render_init(dev);
108
109         int t;
110         for(t=1;t<=doc->num_pages;t++) {
111             gfxpage_t* page = doc->getpage(doc, t);
112             dev->startpage(dev, page->width, page->height);
113             page->render(page, dev);
114             dev->endpage(dev);
115             page->destroy(page);
116             break;
117         }
118         gfxresult_t*result = dev->finish(dev);
119         if(result) {
120             if(result->save(result, outputname) < 0) {
121                 exit(1);
122             }
123             result->destroy(result);
124         }
125         doc->destroy(doc);
126     }
127     return 0;
128 }
129