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 mylog("+%08x(%d) f_load\n", (int)swf, swf->ob_refcnt);
108 memset(&swf->swf, 0, sizeof(SWF));
109 swf->filename = strdup(filename);
112 PyErr_SetString(PyExc_Exception, setError("Couldn't open file %s", filename));
115 fi = open(filename,O_RDONLY|O_BINARY);
117 PyErr_SetString(PyExc_Exception, setError("Couldn't open file %s", filename));
120 if(swf_ReadSWF(fi,&swf->swf)<0) {
122 PyErr_SetString(PyExc_Exception, setError("%s is not a valid SWF file or contains errors",filename));
127 swf->taglist = taglist_new2(swf->swf.firstTag);
128 if(swf->taglist == NULL) {
132 swf_FreeTags(&swf->swf);
133 swf->swf.firstTag = 0;
135 return (PyObject*)swf;
137 //----------------------------------------------------------------------------
138 static PyObject * swf_save(PyObject* self, PyObject* args, PyObject* kwargs)
140 static char *kwlist[] = {"name", "compress", NULL};
150 swfo = (SWFObject*)self;
153 filename = swfo->filename;
155 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|si", kwlist, &filename, &compress))
158 mylog(" %08x(%d) f_save filename=%s compress=%d\n", (int)self, self->ob_refcnt, filename, compress);
160 // keyword arg compress (=1) forces compression
164 swf->firstTag = taglist_getTAGs(swfo->taglist);
168 // fix the file, in case it is empty or not terminated properly
170 TAG*tag = swf->firstTag;
172 tag = swf->firstTag = swf_InsertTag(0,ST_END);
173 while(tag && tag->next) {
176 if(tag->id != ST_END) {
177 tag = swf_InsertTag(tag,ST_END);
181 fi = open(filename, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644);
183 PyErr_SetString(PyExc_Exception, setError("couldn't create output file %s", filename));
186 if(swf->compressed) {
187 if(swf_WriteSWC(fi, swf)<0) {
189 PyErr_SetString(PyExc_Exception, setError("WriteSWC() failed."));
193 if(swf_WriteSWF(fi, swf)<0) {
195 PyErr_SetString(PyExc_Exception, setError("WriteSWC() failed."));
201 /* TODO: why is this segfaulting?? */
202 /* swf_FreeTags(swf);
207 //----------------------------------------------------------------------------
208 static PyObject * swf_writeCGI(PyObject* self, PyObject* args)
210 SWFObject*swf = (SWFObject*)self;
211 if(!self || !PyArg_ParseTuple(args,""))
213 swf->swf.firstTag = taglist_getTAGs(swf->taglist);
214 if(!swf->swf.firstTag)
216 swf_WriteCGI(&swf->swf);
217 swf->swf.firstTag = 0;
220 //----------------------------------------------------------------------------
222 //TODO: void swf_Relocate(SWF*swf, char*bitmap); // bitmap is 65536 bytes, bitmap[a]==0 means id a is free
224 static PyMethodDef swf_functions[] =
225 {{"save", (PyCFunction)swf_save, METH_KEYWORDS, "Save SWF to disk"},
226 {"writeCGI", (PyCFunction)swf_writeCGI, METH_VARARGS, "print SWF as CGI to stdout"},
227 {NULL, NULL, 0, NULL}
230 //----------------------------------------------------------------------------
231 static void swf_dealloc(PyObject* self)
233 mylog("-%08x(%d) swf_dealloc\n", (int)self, self->ob_refcnt);
236 swfo = (SWFObject*)self;
239 free(swfo->filename);
242 Py_DECREF(swfo->taglist);
246 //----------------------------------------------------------------------------
247 static int swf_print(PyObject * self, FILE *fi, int flags) //flags&Py_PRINT_RAW
249 mylog(" %08x(%d) print \n", (int)self, self->ob_refcnt);
250 SWFObject*swf = (SWFObject*)self;
251 swf_DumpHeader(fi, &swf->swf);
252 //void swf_DumpSWF(FILE * f,SWF*swf);
255 //----------------------------------------------------------------------------
256 static PyObject* swf_getattr(PyObject * self, char* a)
258 SWFObject*swf = (SWFObject*)self;
261 if(!strcmp(a, "fps")) {
262 double fps = swf->swf.frameRate/256.0;
263 mylog(" %08x(%d) swf_getattr %s = %f\n", (int)self, self->ob_refcnt, a, fps);
264 return Py_BuildValue("d", fps);
265 } else if(!strcmp(a, "version")) {
266 int version = swf->swf.fileVersion;;
267 mylog(" %08x(%d) swf_getattr %s = %d\n", (int)self, self->ob_refcnt, a, version);
268 return Py_BuildValue("i", version);
269 } else if(!strcmp(a, "name")) {
270 char*filename = swf->filename;
271 mylog(" %08x(%d) swf_getattr %s = %s\n", (int)self, self->ob_refcnt, a, filename);
272 return Py_BuildValue("s", filename);
273 } else if(!strcmp(a, "bbox")) {
274 int xmin,ymin,xmax,ymax;
275 xmin = swf->swf.movieSize.xmin;
276 ymin = swf->swf.movieSize.ymin;
277 xmax = swf->swf.movieSize.xmax;
278 ymax = swf->swf.movieSize.ymax;
279 mylog(" %08x(%d) swf_getattr %s = (%d,%d,%d,%d)\n", (int)self, self->ob_refcnt, a, xmin,ymin,xmax,ymax);
280 return Py_BuildValue("(iiii)", xmin, ymin, xmax, ymax);
281 } else if(!strcmp(a, "tags")) {
282 PyObject*ret = (PyObject*)(swf->taglist);
284 mylog(" %08x(%d) swf_getattr %s = %08x(%d)\n", (int)self, self->ob_refcnt, a, ret, ret->ob_refcnt);
288 ret = Py_FindMethod(swf_functions, self, a);
289 mylog(" %08x(%d) swf_getattr %s: %08x\n", (int)self, self->ob_refcnt, a, ret);
292 //----------------------------------------------------------------------------
293 static int swf_setattr(PyObject * self, char* a, PyObject * o)
295 SWFObject*swf = (SWFObject*)self;
296 if(!strcmp(a, "fps")) {
298 if (!PyArg_Parse(o, "d", &fps))
300 swf->swf.frameRate = (int)(fps*0x100);
301 mylog(" %08x(%d) swf_setattr %s = %f\n", (int)self, self->ob_refcnt, a, fps);
303 } else if(!strcmp(a, "version")) {
305 if (!PyArg_Parse(o, "i", &version))
307 swf->swf.fileVersion = version;
308 mylog(" %08x(%d) swf_setattr %s = %d\n", (int)self, self->ob_refcnt, a, version);
310 } else if(!strcmp(a, "name")) {
312 if (!PyArg_Parse(o, "s", &filename))
315 free(swf->filename);swf->filename=0;
317 swf->filename = strdup(filename);
318 mylog(" %08x(%d) swf_setattr %s = %s\n", (int)self, self->ob_refcnt, a, filename);
320 } else if(!strcmp(a, "bbox")) {
321 int xmin=0,ymin=0,xmax=0,ymax=0;
322 if (!PyArg_Parse(o, "(iiii)", &xmin, &ymin, &xmax, &ymax))
325 swf->swf.movieSize.xmin = xmin;
326 swf->swf.movieSize.ymin = ymin;
327 swf->swf.movieSize.xmax = xmax;
328 swf->swf.movieSize.ymax = ymax;
329 mylog(" %08x(%d) swf_setattr %s = (%d,%d,%d,%d)\n", (int)self, self->ob_refcnt, a, xmin,ymin,xmax,ymax);
331 } else if(!strcmp(a, "tags")) {
333 /*if (!PyArg_Parse(o, "O!", &TagListClass, &taglist));
335 // TODO: check if it's really a taglist
337 Py_DECREF(swf->taglist);
338 swf->taglist = taglist;
339 Py_INCREF(swf->taglist);
340 mylog(" %08x(%d) swf_setattr %s = %08x\n", (int)self, self->ob_refcnt, a, swf->taglist);
344 mylog(" %08x(%d) swf_setattr %s = ? (%08x)\n", (int)self, self->ob_refcnt, a, o);
348 //----------------------------------------------------------------------------
349 static PyTypeObject SWFClass =
351 PyObject_HEAD_INIT(NULL)
354 tp_basicsize: sizeof(SWFObject),
356 tp_dealloc: swf_dealloc,
358 tp_getattr: swf_getattr,
359 tp_setattr: swf_setattr,
361 //----------------------------------------------------------------------------
363 static PyMethodDef SWFMethods[] =
366 {"load", f_load, METH_VARARGS, "Load a SWF from disc."},
367 {"create", (PyCFunction)f_create, METH_KEYWORDS, "Create a new SWF from scratch."},
369 // save is a member function
371 PyMethodDef* swf_getMethods()
373 SWFClass.ob_type = &PyType_Type;
377 // =============================================================================
379 #include "primitives.h"
384 static PyObject* module_verbose(PyObject* self, PyObject* args, PyObject* kwargs)
387 static char *kwlist[] = {"verbosity", NULL};
388 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &verbose))
390 setVerbosity(_verbose);
392 return Py_BuildValue("s", 0);
395 static PyMethodDef LoggingMethods[] =
397 /* Module functions */
398 {"verbose", (PyCFunction)module_verbose, METH_KEYWORDS, "Set the module verbosity"},
405 PyMethodDef* primitive_methods = primitive_getMethods();
406 PyMethodDef* tag_methods = tag_getMethods();
407 PyMethodDef* action_methods = action_getMethods();
408 PyMethodDef* swf_methods = swf_getMethods();
410 PyMethodDef* all_methods = 0;
411 all_methods = addMethods(all_methods, primitive_methods);
412 all_methods = addMethods(all_methods, tag_methods);
413 all_methods = addMethods(all_methods, action_methods);
414 all_methods = addMethods(all_methods, swf_methods);
416 all_methods = addMethods(all_methods, LoggingMethods);
418 module = Py_InitModule("SWF", all_methods);