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) {
131 swf->swf.firstTag = 0;
133 return (PyObject*)swf;
135 //----------------------------------------------------------------------------
136 static PyObject * swf_save(PyObject* self, PyObject* args, PyObject* kwargs)
138 static char *kwlist[] = {"name", "compress", NULL};
148 swfo = (SWFObject*)self;
151 filename = swfo->filename;
153 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|si", kwlist, &filename, &compress))
156 mylog(" %08x(%d) f_save filename=%s compress=%d\n", (int)self, self->ob_refcnt, filename, compress);
158 // keyword arg compress (=1) forces compression
162 swf->firstTag = taglist_getTAGs(swfo->taglist);
164 // fix the file, in case it is empty or not terminated properly
166 TAG*tag = swf->firstTag;
168 tag = swf->firstTag = swf_InsertTag(0,ST_END);
169 while(tag && tag->next) {
170 mylog(" tag:%08x\n", tag);
173 if(tag->id != ST_END) {
174 tag = swf_InsertTag(tag,ST_END);
178 fi = open(filename, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644);
180 PyErr_SetString(PyExc_Exception, setError("couldn't create output file %s", filename));
183 if(swf->compressed) {
184 if(swf_WriteSWC(fi, swf)<0) {
186 PyErr_SetString(PyExc_Exception, setError("WriteSWC() failed."));
190 if(swf_WriteSWF(fi, swf)<0) {
192 PyErr_SetString(PyExc_Exception, setError("WriteSWC() failed."));
202 //----------------------------------------------------------------------------
203 static PyObject * swf_writeCGI(PyObject* self, PyObject* args)
205 SWFObject*swf = (SWFObject*)self;
206 if(!self || !PyArg_ParseTuple(args,""))
208 swf->swf.firstTag = taglist_getTAGs(swf->taglist);
209 swf_WriteCGI(&swf->swf);
210 swf->swf.firstTag = 0;
213 //----------------------------------------------------------------------------
215 //TODO: void swf_Relocate(SWF*swf, char*bitmap); // bitmap is 65536 bytes, bitmap[a]==0 means id a is free
217 static PyMethodDef swf_functions[] =
218 {{"save", (PyCFunction)swf_save, METH_KEYWORDS, "Save SWF to disk"},
219 {"writeCGI", (PyCFunction)swf_writeCGI, METH_VARARGS, "print SWF as CGI to stdout"},
220 {NULL, NULL, 0, NULL}
223 //----------------------------------------------------------------------------
224 static void swf_dealloc(PyObject* self)
226 mylog("-%08x(%d) swf_dealloc\n", (int)self, self->ob_refcnt);
229 swfo = (SWFObject*)self;
232 free(swfo->filename);
235 Py_DECREF(swfo->taglist);
239 //----------------------------------------------------------------------------
240 static int swf_print(PyObject * self, FILE *fi, int flags) //flags&Py_PRINT_RAW
242 mylog(" %08x(%d) print \n", (int)self, self->ob_refcnt);
243 SWFObject*swf = (SWFObject*)self;
244 swf_DumpHeader(fi, &swf->swf);
245 //void swf_DumpSWF(FILE * f,SWF*swf);
248 //----------------------------------------------------------------------------
249 static PyObject* swf_getattr(PyObject * self, char* a)
251 SWFObject*swf = (SWFObject*)self;
254 if(!strcmp(a, "fps")) {
255 double fps = swf->swf.frameRate/256.0;
256 mylog(" %08x(%d) swf_getattr %s = %f\n", (int)self, self->ob_refcnt, a, fps);
257 return Py_BuildValue("d", fps);
258 } else if(!strcmp(a, "version")) {
259 int version = swf->swf.fileVersion;;
260 mylog(" %08x(%d) swf_getattr %s = %d\n", (int)self, self->ob_refcnt, a, version);
261 return Py_BuildValue("i", version);
262 } else if(!strcmp(a, "name")) {
263 char*filename = swf->filename;
264 mylog(" %08x(%d) swf_getattr %s = %s\n", (int)self, self->ob_refcnt, a, filename);
265 return Py_BuildValue("s", filename);
266 } else if(!strcmp(a, "bbox")) {
267 int xmin,ymin,xmax,ymax;
268 xmin = swf->swf.movieSize.xmin;
269 ymin = swf->swf.movieSize.ymin;
270 xmax = swf->swf.movieSize.xmax;
271 ymax = swf->swf.movieSize.ymax;
272 mylog(" %08x(%d) swf_getattr %s = (%d,%d,%d,%d)\n", (int)self, self->ob_refcnt, a, xmin,ymin,xmax,ymax);
273 return Py_BuildValue("(iiii)", xmin, ymin, xmax, ymax);
274 } else if(!strcmp(a, "tags")) {
275 PyObject*ret = (PyObject*)(swf->taglist);
277 mylog(" %08x(%d) swf_getattr %s = %08x(%d)\n", (int)self, self->ob_refcnt, a, ret, ret->ob_refcnt);
281 ret = Py_FindMethod(swf_functions, self, a);
282 mylog(" %08x(%d) swf_getattr %s: %08x\n", (int)self, self->ob_refcnt, a, ret);
285 //----------------------------------------------------------------------------
286 static int swf_setattr(PyObject * self, char* a, PyObject * o)
288 SWFObject*swf = (SWFObject*)self;
289 if(!strcmp(a, "fps")) {
291 if (!PyArg_Parse(o, "d", &fps))
293 swf->swf.frameRate = (int)(fps*0x100);
294 mylog(" %08x(%d) swf_setattr %s = %f\n", (int)self, self->ob_refcnt, a, fps);
296 } else if(!strcmp(a, "version")) {
298 if (!PyArg_Parse(o, "i", &version))
300 swf->swf.fileVersion = version;
301 mylog(" %08x(%d) swf_setattr %s = %d\n", (int)self, self->ob_refcnt, a, version);
303 } else if(!strcmp(a, "name")) {
305 if (!PyArg_Parse(o, "s", &filename))
308 free(swf->filename);swf->filename=0;
310 swf->filename = strdup(filename);
311 mylog(" %08x(%d) swf_setattr %s = %s\n", (int)self, self->ob_refcnt, a, filename);
313 } else if(!strcmp(a, "bbox")) {
314 int xmin=0,ymin=0,xmax=0,ymax=0;
315 if (!PyArg_Parse(o, "(iiii)", &xmin, &ymin, &xmax, &ymax))
318 swf->swf.movieSize.xmin = xmin;
319 swf->swf.movieSize.ymin = ymin;
320 swf->swf.movieSize.xmax = xmax;
321 swf->swf.movieSize.ymax = ymax;
322 mylog(" %08x(%d) swf_setattr %s = (%d,%d,%d,%d)\n", (int)self, self->ob_refcnt, a, xmin,ymin,xmax,ymax);
324 } else if(!strcmp(a, "tags")) {
326 /*if (!PyArg_Parse(o, "O!", &TagListClass, &taglist));
328 // TODO: check if it's really a taglist
330 Py_DECREF(swf->taglist);
331 swf->taglist = taglist;
332 Py_INCREF(swf->taglist);
333 mylog(" %08x(%d) swf_setattr %s = %08x\n", (int)self, self->ob_refcnt, a, swf->taglist);
337 mylog(" %08x(%d) swf_setattr %s = ? (%08x)\n", (int)self, self->ob_refcnt, a, o);
341 //----------------------------------------------------------------------------
342 static PyTypeObject SWFClass =
344 PyObject_HEAD_INIT(NULL)
347 tp_basicsize: sizeof(SWFObject),
349 tp_dealloc: swf_dealloc,
351 tp_getattr: swf_getattr,
352 tp_setattr: swf_setattr,
354 //----------------------------------------------------------------------------
356 static PyMethodDef SWFMethods[] =
359 {"load", f_load, METH_VARARGS, "Load a SWF from disc."},
360 {"create", (PyCFunction)f_create, METH_KEYWORDS, "Create a new SWF from scratch."},
362 // save is a member function
364 PyMethodDef* swf_getMethods()
366 SWFClass.ob_type = &PyType_Type;
370 // =============================================================================
372 #include "primitives.h"
377 static PyObject* module_verbose(PyObject* self, PyObject* args, PyObject* kwargs)
380 static char *kwlist[] = {"verbosity", NULL};
381 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &verbose))
383 setVerbosity(_verbose);
385 return Py_BuildValue("s", 0);
388 static PyMethodDef LoggingMethods[] =
390 /* Module functions */
391 {"verbose", (PyCFunction)module_verbose, METH_KEYWORDS, "Set the module verbosity"},
398 PyMethodDef* primitive_methods = primitive_getMethods();
399 PyMethodDef* tag_methods = tag_getMethods();
400 PyMethodDef* action_methods = action_getMethods();
401 PyMethodDef* swf_methods = swf_getMethods();
403 PyMethodDef* all_methods = 0;
404 all_methods = addMethods(all_methods, primitive_methods);
405 all_methods = addMethods(all_methods, tag_methods);
406 all_methods = addMethods(all_methods, action_methods);
407 all_methods = addMethods(all_methods, swf_methods);
409 all_methods = addMethods(all_methods, LoggingMethods);
411 module = Py_InitModule("SWF", all_methods);