X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fpython%2Fgfx.c;h=001ac21a3ab8993279486df44af767e640ef452a;hb=0e0f1a451e3bbcbe3cc1f49273bc03ab8dd22a38;hp=d2c62e2ebde25e6872f9d999da291167ec656c72;hpb=d9c665fc4edd6da0ef91db9bc14cc075fced2184;p=swftools.git diff --git a/lib/python/gfx.c b/lib/python/gfx.c index d2c62e2..001ac21 100644 --- a/lib/python/gfx.c +++ b/lib/python/gfx.c @@ -28,10 +28,14 @@ #include "../devices/rescale.h" #include "../devices/text.h" #include "../pdf/pdf.h" +#include "../readers/swf.h" +#include "../readers/image.h" #include "../log.h" #include "../utf8.h" -gfxsource_t*pdfdriver; +static gfxsource_t*pdfdriver = 0; +static gfxsource_t*swfdriver = 0; +static gfxsource_t*imagedriver = 0; staticforward PyTypeObject OutputClass; staticforward PyTypeObject PageClass; @@ -75,7 +79,10 @@ PyDoc_STRVAR(output_save_doc, \ "Saves the contents of an output device to a file\n" "Depending on what the output device is, the contents\n" "of the file may be plain text, an image, an SWF file,\n" -"etc.\n"); +"etc.\n" +"For the ImageList device, several files (named\n" +"filename.1.png, filename.2.png etc.) might be created)\n" +); static PyObject* output_save(PyObject* _self, PyObject* args, PyObject* kwargs) { OutputObject* self = (OutputObject*)_self; @@ -130,6 +137,20 @@ static PyObject* output_endpage(PyObject* _self, PyObject* args, PyObject* kwarg self->output_device->endpage(self->output_device); return PY_NONE; } +PyDoc_STRVAR(output_setparameter_doc, \ +"setparameter(key, value)\n\n" +"Set a output-device dependent parameter" +); +static PyObject* output_setparameter(PyObject* _self, PyObject* args, PyObject* kwargs) +{ + OutputObject* self = (OutputObject*)_self; + static char *kwlist[] = {"key", "value", NULL}; + char*key=0,*value=0; + if (args && !PyArg_ParseTupleAndKeywords(args, kwargs, "ss", kwlist, &key, &value)) + return NULL; + self->output_device->setparameter(self->output_device, key, value); + return PY_NONE; +} PyDoc_STRVAR(f_createSWF_doc, \ "SWF()\n\n" "Creates a device which renders documents to SWF (Flash) files.\n" @@ -153,9 +174,8 @@ PyDoc_STRVAR(f_createImageList_doc, \ "ImageList()\n\n" "Creates a device which renders documents to bitmaps.\n" "Each page that is rendered will create new bitmap.\n" -"As, right now, the only way to access the bitmaps is\n" -"by using the save() function on the imagelist, you can\n" -"currently only retrieve the first bitmap/page.\n" +"Using save(), you can save the images to a number\n" +"of files\n" ); static PyObject* f_createImageList(PyObject* parent, PyObject* args, PyObject* kwargs) { @@ -350,7 +370,6 @@ PyDoc_STRVAR(f_createPassThrough_doc, \ "to page.render().\n" "device needs to be a class implementing at least the following functions:\n\n" "setparameter(key,value)\n" -"startpage(width,height)\n" "startclip(outline)\n" "endclip()\n" "stroke(outline, width, color, capstyle, jointstyle, miterLimit)\n" @@ -360,7 +379,6 @@ PyDoc_STRVAR(f_createPassThrough_doc, \ "addfont(font)\n" "drawchar(font, glyph, color, matrix)\n" "drawlink(outline, url)\n" -"finish()\n\n" "If any of these functions are not defined, a error message will be printed,\n" "however the rendering process will *not* be aborted.\n" ); @@ -401,6 +419,7 @@ static PyMethodDef output_methods[] = {"save", (PyCFunction)output_save, METH_KEYWORDS, output_save_doc}, {"startpage", (PyCFunction)output_startpage, METH_KEYWORDS, output_startpage_doc}, {"endpage", (PyCFunction)output_endpage, METH_KEYWORDS, output_endpage_doc}, + {"setparameter", (PyCFunction)output_setparameter, METH_KEYWORDS, output_setparameter_doc}, {0,0,0,0} }; @@ -497,7 +516,7 @@ static PyObject* page_render(PyObject* _self, PyObject* args, PyObject* kwargs) PyDoc_STRVAR(page_asImage_doc, \ "asImage(width, height)\n\n" "Creates a bitmap from a page. The bitmap will be returned as a string\n" -"containing RGB triplets. The bitmap will have the specified width and\n" +"containing RGB triplets. The bitmap will be rescaled to the specified width and\n" "height. The aspect ratio of width and height doesn't need to be the same\n" "as the page.\n" ); @@ -642,14 +661,14 @@ static PyObject* doc_getInfo(PyObject* _self, PyObject* args, PyObject* kwargs) return PyString_FromString(s); } -PyDoc_STRVAR(doc_setParameter_doc, -"setParameter(key, value)\n\n" +PyDoc_STRVAR(doc_setparameter_doc, +"setparameter(key, value)\n\n" "Pass a parameter or setting to the document parser. Unlike\n" -"the module level setoption() function, the parameters set\n" -"using setParameter will only be valid for the object itself\n" +"the module level setparameter() function, the parameters set\n" +"using setparameter will only be valid for the object itself\n" "during its lifetime.\n" ); -static PyObject* doc_setParameter(PyObject* _self, PyObject* args, PyObject* kwargs) +static PyObject* doc_setparameter(PyObject* _self, PyObject* args, PyObject* kwargs) { DocObject* self = (DocObject*)_self; @@ -678,19 +697,41 @@ PyDoc_STRVAR(f_open_doc, static PyObject* f_open(PyObject* parent, PyObject* args, PyObject* kwargs) { static char *kwlist[] = {"type", "filename", NULL}; - char*filename; - char*type; + char*filename=0; + char*type=0; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ss", kwlist, &type, &filename)) { - type = "pdf"; + static char *kwlist2[] = {"filename", NULL}; + type = 0; PyErr_Clear(); - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", kwlist, &filename)) + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", kwlist2, &filename)) return NULL; } DocObject*self = PyObject_New(DocObject, &DocClass); + + if(!type) { //autodetect + type = "pdf"; //default + int l = strlen(filename); + if(l>4) { + if(filename[l-4]=='.') { + if(strchr("pP", filename[l-3]) && strchr("dD", filename[l-2]) && strchr("fF", filename[l-1])) + type = "pdf"; + if(strchr("jJ", filename[l-3]) && strchr("pP", filename[l-2]) && strchr("gG", filename[l-1])) + type = "image"; + if(strchr("pP", filename[l-3]) && strchr("nN", filename[l-2]) && strchr("gG", filename[l-1])) + type = "image"; + } else if(filename[l-5]=='.') { + type = "image"; + } + } + } if(!strcmp(type,"pdf")) self->doc = pdfdriver->open(pdfdriver,filename); + else if(!strcmp(type, "image")) + self->doc = imagedriver->open(imagedriver, filename); + else if(!strcmp(type, "swf")) + self->doc = swfdriver->open(imagedriver, filename); else return PY_ERROR("Unknown type %s", type); @@ -707,7 +748,7 @@ static PyMethodDef doc_methods[] = /* PDF functions */ {"getPage", (PyCFunction)doc_getPage, METH_KEYWORDS, doc_getPage_doc}, {"getInfo", (PyCFunction)doc_getInfo, METH_KEYWORDS, doc_getInfo_doc}, - {"setParameter", (PyCFunction)doc_setParameter, METH_KEYWORDS, doc_setParameter_doc}, + {"setparameter", (PyCFunction)doc_setparameter, METH_KEYWORDS, doc_setparameter_doc}, {0,0,0,0} }; @@ -810,8 +851,8 @@ static PyTypeObject DocClass = //===================================================================== -PyDoc_STRVAR(f_setoption_doc, \ -"setoption(key,value)\n\n" +PyDoc_STRVAR(f_setparameter_doc, \ +"setparameter(key,value)\n\n" "Set a parameter in the gfx module (which might affect the PDF\n" "parser or any of the rendering backends). This is a parameter\n" "which would usually be passed with the \"-s\" option to pdf2swf.\n" @@ -821,7 +862,7 @@ PyDoc_STRVAR(f_setoption_doc, \ " pdf2swf somefile.pdf -s help\n" ".\n" ); -static PyObject* f_setoption(PyObject* self, PyObject* args, PyObject* kwargs) +static PyObject* f_setparameter(PyObject* self, PyObject* args, PyObject* kwargs) { static char *kwlist[] = {"key", "value", NULL}; char*key=0,*value=0; @@ -893,7 +934,8 @@ static PyMethodDef pdf2swf_methods[] = {"open", (PyCFunction)f_open, METH_KEYWORDS, f_open_doc}, {"addfont", (PyCFunction)f_addfont, METH_KEYWORDS, f_addfont_doc}, {"addfontdir", (PyCFunction)f_addfontdir, METH_KEYWORDS, f_addfontdir_doc}, - {"setoption", (PyCFunction)f_setoption, METH_KEYWORDS, f_setoption_doc}, + {"setoption", (PyCFunction)f_setparameter, METH_KEYWORDS, f_setparameter_doc}, // for backwards-compatibility + {"setparameter", (PyCFunction)f_setparameter, METH_KEYWORDS, f_setparameter_doc}, {"verbose", (PyCFunction)f_verbose, METH_KEYWORDS, f_verbose_doc}, /* devices */ @@ -924,6 +966,8 @@ void initgfx(void) DocClass.ob_type = &PyType_Type; pdfdriver = gfxsource_pdf_create(); + swfdriver = gfxsource_swf_create(); + imagedriver = gfxsource_image_create(); PyObject*module = Py_InitModule3("gfx", pdf2swf_methods, gfx_doc); PyObject*module_dict = PyModule_GetDict(module);