3 Python wrapper for librfxswf- module core.
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 "../rfxswf.h"
27 #include "./pyutils.h"
29 #include "./taglist.h"
33 1) taglist is rfxswflib's linked list. It should maybe implemented as Python
34 list, which would, however, mean that we would have to convert the list
35 back and forth for the following functions:
36 load, save, writeCGI, unfoldAll, foldAll, optimizeOrder
37 2) taglist should have an ID handler. Every time a tag is inserted, it's ID
38 is stored in a lookup list.
42 //-------------------------- Types -------------------------------------------
44 staticforward PyTypeObject SWFClass;
50 SWF swf; //swf.firstTag ist not used
56 //----------------------------------------------------------------------------
57 static PyObject* f_create(PyObject* self, PyObject* args, PyObject* kwargs)
59 static char *kwlist[] = {"version", "fps", "bbox", "name", NULL};
62 double framerate = 25;
64 SRECT bbox = {0,0,0,0};
67 swf = PyObject_New(SWFObject, &SWFClass);
68 mylog("+%08x(%d) create\n", (int)swf, swf->ob_refcnt);
70 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|idOs",
71 kwlist, &version, &framerate,
75 if (!PyArg_Parse(obbox, "(iiii)", &bbox.xmin, &bbox.ymin, &bbox.xmax, &bbox.ymax))
78 memset(&swf->swf, 0, sizeof(SWF));
80 swf->filename = strdup(filename);
84 swf->swf.fileVersion = version;
85 swf->swf.frameRate = (int)(framerate*0x100);
86 swf->swf.movieSize = bbox;
87 swf->taglist = taglist_new();
89 if(swf->swf.fileVersion>=6)
90 swf->swf.compressed = 1;
92 mylog(" %08x(%d) create: done\n", (int)swf, swf->ob_refcnt);
93 return (PyObject*)swf;
95 //----------------------------------------------------------------------------
96 static PyObject* f_load(PyObject* self, PyObject* args)
102 if (!PyArg_ParseTuple(args,"s:load", &filename))
105 swf = PyObject_New(SWFObject, &SWFClass);
106 memset(&swf->swf, 0, sizeof(SWF));
107 swf->filename = strdup(filename);
110 PyErr_SetString(PyExc_Exception, setError("Couldn't open file %s", filename));
113 fi = open(filename,O_RDONLY|O_BINARY);
115 PyErr_SetString(PyExc_Exception, setError("Couldn't open file %s", filename));
118 if(swf_ReadSWF(fi,&swf->swf)<0) {
120 PyErr_SetString(PyExc_Exception, setError("%s is not a valid SWF file or contains errors",filename));
124 swf->swf.firstTag = 0;
126 swf->taglist = taglist_new2(swf->swf.firstTag);
128 mylog("+%08x(%d) load\n", (int)self, self->ob_refcnt);
129 return (PyObject*)swf;
131 //----------------------------------------------------------------------------
132 static PyObject * swf_save(PyObject* self, PyObject* args, PyObject* kwargs)
134 static char *kwlist[] = {"name", "compress", NULL};
144 swfo = (SWFObject*)self;
147 filename = swfo->filename;
149 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|si", kwlist, &filename, &compress))
152 // keyword arg compress (=1) forces compression
156 swf->firstTag = taglist_getTAGs(swfo->taglist);
158 // fix the file, in case it is empty or not terminated properly
160 TAG*tag = swf->firstTag;
162 tag = swf->firstTag = swf_InsertTag(0,ST_END);
163 while(tag && tag->next)
165 if(tag->id != ST_END) {
166 tag = swf_InsertTag(tag,ST_END);
170 fi = open(filename, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644);
172 PyErr_SetString(PyExc_Exception, setError("couldn't create output file %s", filename));
175 if(swf->compressed) {
176 if(swf_WriteSWC(fi, swf)<0) {
178 PyErr_SetString(PyExc_Exception, setError("WriteSWC() failed."));
182 if(swf_WriteSWF(fi, swf)<0) {
184 PyErr_SetString(PyExc_Exception, setError("WriteSWC() failed."));
194 //----------------------------------------------------------------------------
195 static PyObject * swf_writeCGI(PyObject* self, PyObject* args)
197 SWFObject*swf = (SWFObject*)self;
198 if(!self || !PyArg_ParseTuple(args,""))
200 swf->swf.firstTag = taglist_getTAGs(swf->taglist);
201 swf_WriteCGI(&swf->swf);
202 swf->swf.firstTag = 0;
205 //----------------------------------------------------------------------------
207 //TODO: void swf_Relocate(SWF*swf, char*bitmap); // bitmap is 65536 bytes, bitmap[a]==0 means id a is free
209 static PyMethodDef swf_functions[] =
210 {{"save", (PyCFunction)swf_save, METH_KEYWORDS, "Save SWF to disk"},
211 {"writeCGI", (PyCFunction)swf_writeCGI, METH_VARARGS, "print SWF as CGI to stdout"},
212 {NULL, NULL, 0, NULL}
215 //----------------------------------------------------------------------------
216 static void swf_dealloc(PyObject* self)
218 mylog("-%08x(%d) swf_dealloc\n", (int)self, self->ob_refcnt);
221 swfo = (SWFObject*)self;
224 free(swfo->filename);
227 Py_DECREF(swfo->taglist);
231 //----------------------------------------------------------------------------
232 static int swf_print(PyObject * self, FILE *fi, int flags) //flags&Py_PRINT_RAW
234 mylog(" %08x(%d) print \n", (int)self, self->ob_refcnt);
235 SWFObject*swf = (SWFObject*)self;
236 swf_DumpHeader(fi, &swf->swf);
237 //void swf_DumpSWF(FILE * f,SWF*swf);
240 //----------------------------------------------------------------------------
241 static PyObject* swf_getattr(PyObject * self, char* a)
243 SWFObject*swf = (SWFObject*)self;
246 if(!strcmp(a, "fps")) {
247 double fps = swf->swf.frameRate/256.0;
248 mylog(" %08x(%d) swf_getattr %s = %f\n", (int)self, self->ob_refcnt, a, fps);
249 return Py_BuildValue("d", fps);
250 } else if(!strcmp(a, "version")) {
251 int version = swf->swf.fileVersion;;
252 mylog(" %08x(%d) swf_getattr %s = %d\n", (int)self, self->ob_refcnt, a, version);
253 return Py_BuildValue("i", version);
254 } else if(!strcmp(a, "name")) {
255 char*filename = swf->filename;
256 mylog(" %08x(%d) swf_getattr %s = %s\n", (int)self, self->ob_refcnt, a, filename);
257 return Py_BuildValue("s", filename);
258 } else if(!strcmp(a, "bbox")) {
259 int xmin,ymin,xmax,ymax;
260 xmin = swf->swf.movieSize.xmin;
261 ymin = swf->swf.movieSize.ymin;
262 xmax = swf->swf.movieSize.xmax;
263 ymax = swf->swf.movieSize.ymax;
264 mylog(" %08x(%d) swf_getattr %s = (%d,%d,%d,%d)\n", (int)self, self->ob_refcnt, a, xmin,ymin,xmax,ymax);
265 return Py_BuildValue("(iiii)", xmin, ymin, xmax, ymax);
266 } else if(!strcmp(a, "tags")) {
267 PyObject*ret = (PyObject*)(swf->taglist);
269 mylog(" %08x(%d) swf_getattr %s = %08x(%d)\n", (int)self, self->ob_refcnt, a, ret, ret->ob_refcnt);
273 ret = Py_FindMethod(swf_functions, self, a);
274 mylog(" %08x(%d) swf_getattr %s: %08x\n", (int)self, self->ob_refcnt, a, ret);
277 //----------------------------------------------------------------------------
278 static int swf_setattr(PyObject * self, char* a, PyObject * o)
280 SWFObject*swf = (SWFObject*)self;
281 if(!strcmp(a, "fps")) {
283 if (!PyArg_Parse(o, "d", &fps))
285 swf->swf.frameRate = (int)(fps*0x100);
286 mylog(" %08x(%d) swf_setattr %s = %f\n", (int)self, self->ob_refcnt, a, fps);
288 } else if(!strcmp(a, "version")) {
290 if (!PyArg_Parse(o, "i", &version))
292 swf->swf.fileVersion = version;
293 mylog(" %08x(%d) swf_setattr %s = %d\n", (int)self, self->ob_refcnt, a, version);
295 } else if(!strcmp(a, "name")) {
297 if (!PyArg_Parse(o, "s", &filename))
300 free(swf->filename);swf->filename=0;
302 swf->filename = strdup(filename);
303 mylog(" %08x(%d) swf_setattr %s = %s\n", (int)self, self->ob_refcnt, a, filename);
305 } else if(!strcmp(a, "bbox")) {
306 int xmin=0,ymin=0,xmax=0,ymax=0;
307 if (!PyArg_Parse(o, "(iiii)", &xmin, &ymin, &xmax, &ymax))
310 swf->swf.movieSize.xmin = xmin;
311 swf->swf.movieSize.ymin = ymin;
312 swf->swf.movieSize.xmax = xmax;
313 swf->swf.movieSize.ymax = ymax;
314 mylog(" %08x(%d) swf_setattr %s = (%d,%d,%d,%d)\n", (int)self, self->ob_refcnt, a, xmin,ymin,xmax,ymax);
316 } else if(!strcmp(a, "tags")) {
318 /*if (!PyArg_Parse(o, "O!", &TagListClass, &taglist));
320 // TODO: check if it's really a taglist
322 Py_DECREF(swf->taglist);
323 swf->taglist = taglist;
324 Py_INCREF(swf->taglist);
325 mylog(" %08x(%d) swf_setattr %s = %08x\n", (int)self, self->ob_refcnt, a, swf->taglist);
329 mylog(" %08x(%d) swf_setattr %s = ? (%08x)\n", (int)self, self->ob_refcnt, a, o);
333 //----------------------------------------------------------------------------
334 static PyTypeObject SWFClass =
336 PyObject_HEAD_INIT(NULL)
339 tp_basicsize: sizeof(SWFObject),
341 tp_dealloc: swf_dealloc,
343 tp_getattr: swf_getattr,
344 tp_setattr: swf_setattr,
346 //----------------------------------------------------------------------------
348 static PyMethodDef SWFMethods[] =
351 {"load", f_load, METH_VARARGS, "Load a SWF from disc."},
352 {"create", (PyCFunction)f_create, METH_KEYWORDS, "Create a new SWF from scratch."},
354 // save is a member function
356 PyMethodDef* swf_getMethods()
358 SWFClass.ob_type = &PyType_Type;
362 // =============================================================================
364 #include "primitives.h"
369 static PyObject* module_verbose(PyObject* self, PyObject* args, PyObject* kwargs)
372 static char *kwlist[] = {"verbosity", NULL};
373 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &verbose))
375 setVerbosity(_verbose);
377 return Py_BuildValue("s", 0);
380 static PyMethodDef LoggingMethods[] =
382 /* Module functions */
383 {"verbose", (PyCFunction)module_verbose, METH_KEYWORDS, "Set the module verbosity"},
390 PyMethodDef* primitive_methods = primitive_getMethods();
391 PyMethodDef* tag_methods = tag_getMethods();
392 PyMethodDef* action_methods = action_getMethods();
393 PyMethodDef* swf_methods = swf_getMethods();
395 PyMethodDef* all_methods = 0;
396 all_methods = addMethods(all_methods, primitive_methods);
397 all_methods = addMethods(all_methods, tag_methods);
398 all_methods = addMethods(all_methods, action_methods);
399 all_methods = addMethods(all_methods, swf_methods);
401 all_methods = addMethods(all_methods, LoggingMethods);
403 module = Py_InitModule("SWF", all_methods);