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