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