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 swf->swf.firstTag = 0;
130 return (PyObject*)swf;
132 //----------------------------------------------------------------------------
133 static PyObject * swf_save(PyObject* self, PyObject* args, PyObject* kwargs)
135 static char *kwlist[] = {"name", "compress", NULL};
145 swfo = (SWFObject*)self;
148 filename = swfo->filename;
150 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|si", kwlist, &filename, &compress))
153 mylog(" %08x(%d) f_save filename=%s compress=%d\n", (int)self, self->ob_refcnt, filename, compress);
155 // keyword arg compress (=1) forces compression
159 swf->firstTag = taglist_getTAGs(swfo->taglist);
161 // fix the file, in case it is empty or not terminated properly
163 TAG*tag = swf->firstTag;
165 tag = swf->firstTag = swf_InsertTag(0,ST_END);
166 while(tag && tag->next)
168 if(tag->id != ST_END) {
169 tag = swf_InsertTag(tag,ST_END);
173 fi = open(filename, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644);
175 PyErr_SetString(PyExc_Exception, setError("couldn't create output file %s", filename));
178 if(swf->compressed) {
179 if(swf_WriteSWC(fi, swf)<0) {
181 PyErr_SetString(PyExc_Exception, setError("WriteSWC() failed."));
185 if(swf_WriteSWF(fi, swf)<0) {
187 PyErr_SetString(PyExc_Exception, setError("WriteSWC() failed."));
197 //----------------------------------------------------------------------------
198 static PyObject * swf_writeCGI(PyObject* self, PyObject* args)
200 SWFObject*swf = (SWFObject*)self;
201 if(!self || !PyArg_ParseTuple(args,""))
203 swf->swf.firstTag = taglist_getTAGs(swf->taglist);
204 swf_WriteCGI(&swf->swf);
205 swf->swf.firstTag = 0;
208 //----------------------------------------------------------------------------
210 //TODO: void swf_Relocate(SWF*swf, char*bitmap); // bitmap is 65536 bytes, bitmap[a]==0 means id a is free
212 static PyMethodDef swf_functions[] =
213 {{"save", (PyCFunction)swf_save, METH_KEYWORDS, "Save SWF to disk"},
214 {"writeCGI", (PyCFunction)swf_writeCGI, METH_VARARGS, "print SWF as CGI to stdout"},
215 {NULL, NULL, 0, NULL}
218 //----------------------------------------------------------------------------
219 static void swf_dealloc(PyObject* self)
221 mylog("-%08x(%d) swf_dealloc\n", (int)self, self->ob_refcnt);
224 swfo = (SWFObject*)self;
227 free(swfo->filename);
230 Py_DECREF(swfo->taglist);
234 //----------------------------------------------------------------------------
235 static int swf_print(PyObject * self, FILE *fi, int flags) //flags&Py_PRINT_RAW
237 mylog(" %08x(%d) print \n", (int)self, self->ob_refcnt);
238 SWFObject*swf = (SWFObject*)self;
239 swf_DumpHeader(fi, &swf->swf);
240 //void swf_DumpSWF(FILE * f,SWF*swf);
243 //----------------------------------------------------------------------------
244 static PyObject* swf_getattr(PyObject * self, char* a)
246 SWFObject*swf = (SWFObject*)self;
249 if(!strcmp(a, "fps")) {
250 double fps = swf->swf.frameRate/256.0;
251 mylog(" %08x(%d) swf_getattr %s = %f\n", (int)self, self->ob_refcnt, a, fps);
252 return Py_BuildValue("d", fps);
253 } else if(!strcmp(a, "version")) {
254 int version = swf->swf.fileVersion;;
255 mylog(" %08x(%d) swf_getattr %s = %d\n", (int)self, self->ob_refcnt, a, version);
256 return Py_BuildValue("i", version);
257 } else if(!strcmp(a, "name")) {
258 char*filename = swf->filename;
259 mylog(" %08x(%d) swf_getattr %s = %s\n", (int)self, self->ob_refcnt, a, filename);
260 return Py_BuildValue("s", filename);
261 } else if(!strcmp(a, "bbox")) {
262 int xmin,ymin,xmax,ymax;
263 xmin = swf->swf.movieSize.xmin;
264 ymin = swf->swf.movieSize.ymin;
265 xmax = swf->swf.movieSize.xmax;
266 ymax = swf->swf.movieSize.ymax;
267 mylog(" %08x(%d) swf_getattr %s = (%d,%d,%d,%d)\n", (int)self, self->ob_refcnt, a, xmin,ymin,xmax,ymax);
268 return Py_BuildValue("(iiii)", xmin, ymin, xmax, ymax);
269 } else if(!strcmp(a, "tags")) {
270 PyObject*ret = (PyObject*)(swf->taglist);
272 mylog(" %08x(%d) swf_getattr %s = %08x(%d)\n", (int)self, self->ob_refcnt, a, ret, ret->ob_refcnt);
276 ret = Py_FindMethod(swf_functions, self, a);
277 mylog(" %08x(%d) swf_getattr %s: %08x\n", (int)self, self->ob_refcnt, a, ret);
280 //----------------------------------------------------------------------------
281 static int swf_setattr(PyObject * self, char* a, PyObject * o)
283 SWFObject*swf = (SWFObject*)self;
284 if(!strcmp(a, "fps")) {
286 if (!PyArg_Parse(o, "d", &fps))
288 swf->swf.frameRate = (int)(fps*0x100);
289 mylog(" %08x(%d) swf_setattr %s = %f\n", (int)self, self->ob_refcnt, a, fps);
291 } else if(!strcmp(a, "version")) {
293 if (!PyArg_Parse(o, "i", &version))
295 swf->swf.fileVersion = version;
296 mylog(" %08x(%d) swf_setattr %s = %d\n", (int)self, self->ob_refcnt, a, version);
298 } else if(!strcmp(a, "name")) {
300 if (!PyArg_Parse(o, "s", &filename))
303 free(swf->filename);swf->filename=0;
305 swf->filename = strdup(filename);
306 mylog(" %08x(%d) swf_setattr %s = %s\n", (int)self, self->ob_refcnt, a, filename);
308 } else if(!strcmp(a, "bbox")) {
309 int xmin=0,ymin=0,xmax=0,ymax=0;
310 if (!PyArg_Parse(o, "(iiii)", &xmin, &ymin, &xmax, &ymax))
313 swf->swf.movieSize.xmin = xmin;
314 swf->swf.movieSize.ymin = ymin;
315 swf->swf.movieSize.xmax = xmax;
316 swf->swf.movieSize.ymax = ymax;
317 mylog(" %08x(%d) swf_setattr %s = (%d,%d,%d,%d)\n", (int)self, self->ob_refcnt, a, xmin,ymin,xmax,ymax);
319 } else if(!strcmp(a, "tags")) {
321 /*if (!PyArg_Parse(o, "O!", &TagListClass, &taglist));
323 // TODO: check if it's really a taglist
325 Py_DECREF(swf->taglist);
326 swf->taglist = taglist;
327 Py_INCREF(swf->taglist);
328 mylog(" %08x(%d) swf_setattr %s = %08x\n", (int)self, self->ob_refcnt, a, swf->taglist);
332 mylog(" %08x(%d) swf_setattr %s = ? (%08x)\n", (int)self, self->ob_refcnt, a, o);
336 //----------------------------------------------------------------------------
337 static PyTypeObject SWFClass =
339 PyObject_HEAD_INIT(NULL)
342 tp_basicsize: sizeof(SWFObject),
344 tp_dealloc: swf_dealloc,
346 tp_getattr: swf_getattr,
347 tp_setattr: swf_setattr,
349 //----------------------------------------------------------------------------
351 static PyMethodDef SWFMethods[] =
354 {"load", f_load, METH_VARARGS, "Load a SWF from disc."},
355 {"create", (PyCFunction)f_create, METH_KEYWORDS, "Create a new SWF from scratch."},
357 // save is a member function
359 PyMethodDef* swf_getMethods()
361 SWFClass.ob_type = &PyType_Type;
365 // =============================================================================
367 #include "primitives.h"
372 static PyObject* module_verbose(PyObject* self, PyObject* args, PyObject* kwargs)
375 static char *kwlist[] = {"verbosity", NULL};
376 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &verbose))
378 setVerbosity(_verbose);
380 return Py_BuildValue("s", 0);
383 static PyMethodDef LoggingMethods[] =
385 /* Module functions */
386 {"verbose", (PyCFunction)module_verbose, METH_KEYWORDS, "Set the module verbosity"},
393 PyMethodDef* primitive_methods = primitive_getMethods();
394 PyMethodDef* tag_methods = tag_getMethods();
395 PyMethodDef* action_methods = action_getMethods();
396 PyMethodDef* swf_methods = swf_getMethods();
398 PyMethodDef* all_methods = 0;
399 all_methods = addMethods(all_methods, primitive_methods);
400 all_methods = addMethods(all_methods, tag_methods);
401 all_methods = addMethods(all_methods, action_methods);
402 all_methods = addMethods(all_methods, swf_methods);
404 all_methods = addMethods(all_methods, LoggingMethods);
406 module = Py_InitModule("SWF", all_methods);