3 Python wrapper for gfx convert
5 Part of the swftools package.
7 Copyright (c) 2003 Matthias Kramm <kramm@quiss.org>
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
25 #include "../devices/swf.h"
26 #include "../devices/render.h"
27 #include "../devices/rescale.h"
28 #include "../devices/text.h"
29 #include "../pdf/pdf.h"
33 gfxsource_t*pdfdriver;
35 staticforward PyTypeObject OutputClass;
36 staticforward PyTypeObject PageClass;
37 staticforward PyTypeObject DriverClass;
41 gfxdevice_t*output_device;
57 static char* strf(char*format, ...)
62 va_start(arglist, format);
63 vsprintf(buf, format, arglist);
67 #define PY_ERROR(s,args...) (PyErr_SetString(PyExc_Exception, strf(s, ## args)),NULL)
68 #define PY_NONE Py_BuildValue("s", 0)
70 //---------------------------------------------------------------------
71 staticforward PyObject* output_save(PyObject* _self, PyObject* args, PyObject* kwargs);
72 staticforward PyObject* output_startpage(PyObject* _self, PyObject* args, PyObject* kwargs);
73 staticforward PyObject* output_endpage(PyObject* _self, PyObject* args, PyObject* kwargs);
75 static PyMethodDef output_methods[] =
77 /* Output functions */
78 {"save", (PyCFunction)output_save, METH_KEYWORDS, ""},
79 {"startpage", (PyCFunction)output_startpage, METH_KEYWORDS, ""},
80 {"endpage", (PyCFunction)output_endpage, METH_KEYWORDS, ""},
83 static PyObject* output_save(PyObject* _self, PyObject* args, PyObject* kwargs)
85 OutputObject* self = (OutputObject*)_self;
87 static char *kwlist[] = {"filename", NULL};
88 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", kwlist, &filename))
91 gfxresult_t*result = self->output_device->finish(self->output_device);
92 self->output_device = 0;
93 if(result->save(result, filename) < 0) {
94 return PY_ERROR("Couldn't write to %s", filename);
96 result->destroy(result);
99 static PyObject* output_startpage(PyObject* _self, PyObject* args, PyObject* kwargs)
101 OutputObject* self = (OutputObject*)_self;
102 int width=0, height=0;
103 if (!PyArg_ParseTuple(args, "ii", &width, &height))
105 self->output_device->startpage(self->output_device, width, height);
108 static PyObject* output_endpage(PyObject* _self, PyObject* args, PyObject* kwargs)
110 OutputObject* self = (OutputObject*)_self;
111 if (!PyArg_ParseTuple(args, ""))
113 self->output_device->endpage(self->output_device);
116 static PyObject* f_createSWF(PyObject* parent, PyObject* args, PyObject* kwargs)
118 static char *kwlist[] = {NULL};
119 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "", kwlist))
121 OutputObject*self = PyObject_New(OutputObject, &OutputClass);
123 self->output_device = malloc(sizeof(gfxdevice_t));
124 gfxdevice_swf_init(self->output_device);
125 return (PyObject*)self;
127 static PyObject* f_createImageList(PyObject* parent, PyObject* args, PyObject* kwargs)
129 static char *kwlist[] = {NULL};
130 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "", kwlist))
132 OutputObject*self = PyObject_New(OutputObject, &OutputClass);
134 self->output_device = malloc(sizeof(gfxdevice_t));
135 gfxdevice_render_init(self->output_device);
136 return (PyObject*)self;
138 static PyObject* f_createPlainText(PyObject* parent, PyObject* args, PyObject* kwargs)
140 static char *kwlist[] = {NULL};
141 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "", kwlist))
143 OutputObject*self = PyObject_New(OutputObject, &OutputClass);
145 self->output_device = malloc(sizeof(gfxdevice_t));
146 gfxdevice_text_init(self->output_device);
147 return (PyObject*)self;
151 static void output_dealloc(PyObject* _self) {
152 OutputObject* self = (OutputObject*)_self;
154 if(self->output_device) {
155 gfxresult_t*result = self->output_device->finish(self->output_device);
156 result->destroy(result);result=0;
157 self->output_device = 0;
162 static PyObject* output_getattr(PyObject * _self, char* a)
164 OutputObject*self = (OutputObject*)_self;
166 /* if(!strcmp(a, "x1")) {
167 return PyInt_FromLong(self->output_device->x1);
168 } else if(!strcmp(a, "y1")) {
169 return PyInt_FromLong(self->output_device->y1);
170 } else if(!strcmp(a, "x2")) {
171 return PyInt_FromLong(self->output_device->x2);
172 } else if(!strcmp(a, "y2")) {
173 return PyInt_FromLong(self->output_device->y2);
176 return Py_FindMethod(output_methods, _self, a);
178 static int output_setattr(PyObject * _self, char* a, PyObject * o)
180 OutputObject*self = (OutputObject*)_self;
181 if(!PyString_Check(o))
183 char*value = PyString_AsString(o);
184 self->output_device->setparameter(self->output_device, a, value);
187 static int output_print(PyObject * _self, FILE *fi, int flags)
189 OutputObject*self = (OutputObject*)_self;
190 fprintf(fi, "%08x(%d)", (int)_self, _self?_self->ob_refcnt:0);
194 //---------------------------------------------------------------------
195 staticforward PyObject* page_render(PyObject* _self, PyObject* args, PyObject* kwargs);
196 staticforward PyObject* page_asImage(PyObject* _self, PyObject* args, PyObject* kwargs);
198 static PyMethodDef page_methods[] =
201 {"render", (PyCFunction)page_render, METH_KEYWORDS, ""},
202 {"asImage", (PyCFunction)page_asImage, METH_KEYWORDS, ""},
205 static PyObject* page_render(PyObject* _self, PyObject* args, PyObject* kwargs)
207 PageObject* self = (PageObject*)_self;
209 static char *kwlist[] = {"dev", "move", "clip", NULL};
210 OutputObject*output = 0;
213 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!|OO", kwlist, &OutputClass, &output,
219 int cx1=0,cy1=0,cx2=0,cy2=0;
222 if (!PyArg_ParseTuple(move, "ii", &x,&y))
226 if (!PyArg_ParseTuple(clip, "iiii", &cx1,&cy1,&cx2,&cy2))
230 if(x|y|cx1|cx2|cy1|cy2)
231 self->page->rendersection(self->page, output->output_device,x,y,cx1,cy1,cx2,cy2);
233 self->page->render(self->page, output->output_device);
237 static PyObject* page_asImage(PyObject* _self, PyObject* args, PyObject* kwargs)
239 PageObject* self = (PageObject*)_self;
241 static char *kwlist[] = {"width", "height", NULL};
242 int width=0,height=0;
243 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ii", kwlist, &width, &height))
246 if(!width || !height) {
247 return PY_ERROR("invalid dimensions: %dx%d", width,height);
250 gfxdevice_t dev1,dev2;
251 gfxdevice_render_init(&dev1);
252 dev1.setparameter(&dev1, "antialise", "2");
253 gfxdevice_rescale_init(&dev2, &dev1, width, height);
254 dev2.startpage(&dev2, self->page->width, self->page->height);
255 self->page->render(self->page, &dev2);
257 gfxresult_t*result = dev2.finish(&dev2);
258 gfximage_t*img = (gfximage_t*)result->get(result,"page0");
259 int l = img->width*img->height;
260 unsigned char*data = malloc(img->width*img->height*3);
262 for(t=0,s=0;t<l;s+=3,t++) {
263 data[s+0] = img->data[t].r;
264 data[s+1] = img->data[t].g;
265 data[s+2] = img->data[t].b;
267 result->destroy(result);
268 return PyString_FromStringAndSize((char*)data,img->width*img->height*3);
271 static void page_dealloc(PyObject* _self) {
272 PageObject* self = (PageObject*)_self;
274 self->page->destroy(self->page);
278 Py_DECREF(self->parent);
284 static PyObject* page_getattr(PyObject * _self, char* a)
286 PageObject*self = (PageObject*)_self;
288 if(!strcmp(a, "size")) {
289 return Py_BuildValue("(ii)", self->page->width, self->page->height);
290 } if(!strcmp(a, "doc")) {
291 Py_INCREF(self->parent);
293 } if(!strcmp(a, "nr")) {
294 return PyInt_FromLong(self->nr);
295 } else if(!strcmp(a, "width")) {
296 return PyInt_FromLong(self->page->width);
297 } else if(!strcmp(a, "height")) {
298 return PyInt_FromLong(self->page->height);
300 return Py_FindMethod(page_methods, _self, a);
302 static int page_setattr(PyObject * self, char* a, PyObject * o) {
305 static int page_print(PyObject * _self, FILE *fi, int flags)
307 PageObject*self = (PageObject*)_self;
308 fprintf(fi, "%08x(%d)", (int)_self, _self?_self->ob_refcnt:0);
312 //---------------------------------------------------------------------
314 staticforward PyObject* doc_getPage(PyObject* parent, PyObject* args, PyObject* kwargs);
315 staticforward PyObject* doc_getInfo(PyObject* parent, PyObject* args, PyObject* kwargs);
317 static PyMethodDef doc_methods[] =
320 {"getPage", (PyCFunction)doc_getPage, METH_KEYWORDS, ""},
321 {"getInfo", (PyCFunction)doc_getInfo, METH_KEYWORDS, ""},
325 static PyObject* doc_getPage(PyObject* _self, PyObject* args, PyObject* kwargs)
327 DocObject* self = (DocObject*)_self;
329 static char *kwlist[] = {"nr", NULL};
331 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &pagenr))
334 PageObject*page = PyObject_New(PageObject, &PageClass);
335 page->page = self->doc->getpage(self->doc, pagenr);
337 page->parent = _self;
338 Py_INCREF(page->parent);
341 return PY_ERROR("Couldn't extract page %d", pagenr);
343 return (PyObject*)page;
346 static PyObject* doc_getInfo(PyObject* _self, PyObject* args, PyObject* kwargs)
348 DocObject* self = (DocObject*)_self;
350 static char *kwlist[] = {"key", NULL};
352 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", kwlist, &key))
355 char*s = self->doc->getinfo(self->doc, key);
356 return PyString_FromString(s);
359 static PyObject* f_open(PyObject* parent, PyObject* args, PyObject* kwargs)
361 static char *kwlist[] = {"type", "filename", NULL};
364 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ss", kwlist, &type, &filename))
367 DocObject*self = PyObject_New(DocObject, &DriverClass);
369 if(!strcmp(type,"pdf"))
370 self->doc = pdfdriver->open(filename);
372 return PY_ERROR("Unknown type %s", type);
376 return PY_ERROR("Couldn't open %s", filename);
378 self->filename = strdup(filename);
379 return (PyObject*)self;
381 static void doc_dealloc(PyObject* _self) {
382 DocObject* self = (DocObject*)_self;
384 self->doc->destroy(self->doc);
388 free(self->filename);self->filename=0;
392 static PyObject* doc_getattr(PyObject * _self, char* a)
394 DocObject*self = (DocObject*)_self;
395 if(!strcmp(a, "pages")) {
396 return PyInt_FromLong(self->doc->num_pages);
398 if(!strcmp(a, "filename")) {
399 return PyString_FromString(self->filename);
401 return Py_FindMethod(doc_methods, _self, a);
403 static int doc_setattr(PyObject * self, char* a, PyObject * o) {
406 static int doc_print(PyObject * _self, FILE *fi, int flags)
408 DocObject*self = (DocObject*)_self;
409 fprintf(fi, "%08x(%d)", (int)_self, _self?_self->ob_refcnt:0);
413 //---------------------------------------------------------------------
415 static PyTypeObject OutputClass =
417 PyObject_HEAD_INIT(NULL)
420 tp_basicsize: sizeof(OutputObject),
422 tp_dealloc: output_dealloc,
423 tp_print: output_print,
424 tp_getattr: output_getattr,
425 tp_setattr: output_setattr,
427 static PyTypeObject PageClass =
429 PyObject_HEAD_INIT(NULL)
432 tp_basicsize: sizeof(PageObject),
434 tp_dealloc: page_dealloc,
435 tp_print: page_print,
436 tp_getattr: page_getattr,
437 tp_setattr: page_setattr,
439 static PyTypeObject DriverClass =
441 PyObject_HEAD_INIT(NULL)
444 tp_basicsize: sizeof(DocObject),
446 tp_dealloc: doc_dealloc,
448 tp_getattr: doc_getattr,
449 tp_setattr: doc_setattr,
452 //=====================================================================
454 static PyObject* f_setoption(PyObject* self, PyObject* args, PyObject* kwargs)
456 static char *kwlist[] = {"key", "value", NULL};
458 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ss", kwlist, &key, &value))
460 pdfdriver->set_parameter(key,value);
464 static PyObject* f_verbose(PyObject* self, PyObject* args, PyObject* kwargs)
466 static char *kwlist[] = {"val", NULL};
468 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &val))
470 setConsoleLogging(val);
474 static PyObject* f_addfont(PyObject* self, PyObject* args, PyObject* kwargs)
476 static char *kwlist[] = {"filename", NULL};
478 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", kwlist, &filename))
480 pdfdriver->set_parameter("font", filename);
484 static PyObject* f_addfontdir(PyObject* self, PyObject* args, PyObject* kwargs)
486 static char *kwlist[] = {"filename", NULL};
488 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", kwlist, &filename))
490 pdfdriver->set_parameter("fontdir", filename);
494 static PyMethodDef pdf2swf_methods[] =
497 {"open", (PyCFunction)f_open, METH_KEYWORDS, ""},
498 {"addfont", (PyCFunction)f_addfont, METH_KEYWORDS, ""},
499 {"addfontdir", (PyCFunction)f_addfontdir, METH_KEYWORDS, ""},
500 {"setoption", (PyCFunction)f_setoption, METH_KEYWORDS, ""},
501 {"verbose", (PyCFunction)f_verbose, METH_KEYWORDS, ""},
504 {"SWF", (PyCFunction)f_createSWF, METH_KEYWORDS, ""},
505 {"ImageList", (PyCFunction)f_createImageList, METH_KEYWORDS, ""},
506 {"PlainText", (PyCFunction)f_createPlainText, METH_KEYWORDS, ""},
514 initLog(0,0,0,0,0,2);
515 OutputClass.ob_type = &PyType_Type;
516 PageClass.ob_type = &PyType_Type;
517 DriverClass.ob_type = &PyType_Type;
519 pdfdriver = gfxsource_pdf_create();
521 PyObject*module = Py_InitModule("gfx", pdf2swf_methods);