X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fpython%2FSWF.c;h=75f876caf346d63a8089cfdb8334a95228707fc2;hb=d384bf026261535d5bdddcc36d2e58325ac9e795;hp=fd7c4231c33f7df8b78fc6af1d52634c2b0f5150;hpb=84245258e84d865fb1b5a0a6a781c099946398df;p=swftools.git diff --git a/lib/python/SWF.c b/lib/python/SWF.c index fd7c423..75f876c 100644 --- a/lib/python/SWF.c +++ b/lib/python/SWF.c @@ -25,8 +25,9 @@ #include "../rfxswf.h" #include "../log.h" #include "./pyutils.h" -#include "./tag.h" +#include "./tags.h" #include "./taglist.h" +#include "./primitives.h" /* TODO: @@ -69,11 +70,15 @@ static PyObject* f_create(PyObject* self, PyObject* args, PyObject* kwargs) if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|idOs", kwlist, &version, &framerate, - &obbox, filename)) + &obbox, &filename)) return NULL; - if (!PyArg_Parse(obbox, "(iiii)", &bbox.xmin, &bbox.ymin, &bbox.xmax, &bbox.ymax)) - return NULL; + if (!PY_CHECK_TYPE(obbox, &BBoxClass)) { + obbox = f_BBox(0, obbox, 0); + if(!obbox) + return NULL; + } + bbox = bbox_getSRECT(obbox); memset(&swf->swf, 0, sizeof(SWF)); if(filename) @@ -106,12 +111,12 @@ static PyObject* f_load(PyObject* self, PyObject* args) mylog("+%08x(%d) f_load\n", (int)swf, swf->ob_refcnt); memset(&swf->swf, 0, sizeof(SWF)); - swf->filename = strdup(filename); if(!filename) { PyErr_SetString(PyExc_Exception, setError("Couldn't open file %s", filename)); return 0; } + swf->filename = strdup(filename); fi = open(filename,O_RDONLY|O_BINARY); if (fi<0) { PyErr_SetString(PyExc_Exception, setError("Couldn't open file %s", filename)); @@ -123,6 +128,7 @@ static PyObject* f_load(PyObject* self, PyObject* args) return 0; } close(fi); + swf_FoldAll(&swf->swf); swf->taglist = taglist_new2(swf->swf.firstTag); if(swf->taglist == NULL) { @@ -143,7 +149,7 @@ static PyObject * swf_save(PyObject* self, PyObject* args, PyObject* kwargs) int fi; char*filename = 0; int compress = 0; - + if(!self) return NULL; @@ -198,9 +204,25 @@ static PyObject * swf_save(PyObject* self, PyObject* args, PyObject* kwargs) } close(fi); - /* TODO: why is this segfaulting?? */ - /* swf_FreeTags(swf); - swf->firstTag = 0;*/ + swf_FreeTags(swf); + /*{ TAG * t = swf->firstTag; + while (t) + { + mylog("tag: %08x\n",t); + mylog(" id: %d (%s)\n", t->id, swf_TagGetName(t)); + mylog(" data: %08x (%d bytes)\n", t->data, t->len); + mylog(" next: %08x\n", t->next); + TAG * tnew = t->next; + mylog("->free data\n"); + if (t->data) free(t->data); + mylog("->free tag\n"); + free(t); + t = tnew; + } + }*/ + swf->firstTag = 0; + + mylog(" %08x(%d) f_save filename=%s done\n", (int)self, self->ob_refcnt, filename); return PY_NONE; } @@ -214,6 +236,7 @@ static PyObject * swf_writeCGI(PyObject* self, PyObject* args) if(!swf->swf.firstTag) return NULL; swf_WriteCGI(&swf->swf); + swf_FreeTags(&swf->swf); swf->swf.firstTag = 0; return PY_NONE; } @@ -271,13 +294,7 @@ static PyObject* swf_getattr(PyObject * self, char* a) mylog(" %08x(%d) swf_getattr %s = %s\n", (int)self, self->ob_refcnt, a, filename); return Py_BuildValue("s", filename); } else if(!strcmp(a, "bbox")) { - int xmin,ymin,xmax,ymax; - xmin = swf->swf.movieSize.xmin; - ymin = swf->swf.movieSize.ymin; - xmax = swf->swf.movieSize.xmax; - ymax = swf->swf.movieSize.ymax; - mylog(" %08x(%d) swf_getattr %s = (%d,%d,%d,%d)\n", (int)self, self->ob_refcnt, a, xmin,ymin,xmax,ymax); - return Py_BuildValue("(iiii)", xmin, ymin, xmax, ymax); + return f_BBox2(swf->swf.movieSize); } else if(!strcmp(a, "tags")) { PyObject*ret = (PyObject*)(swf->taglist); Py_INCREF(ret); @@ -318,22 +335,21 @@ static int swf_setattr(PyObject * self, char* a, PyObject * o) mylog(" %08x(%d) swf_setattr %s = %s\n", (int)self, self->ob_refcnt, a, filename); return 0; } else if(!strcmp(a, "bbox")) { - int xmin=0,ymin=0,xmax=0,ymax=0; - if (!PyArg_Parse(o, "(iiii)", &xmin, &ymin, &xmax, &ymax)) - goto err; + PyObject *obbox = o; + if (!PY_CHECK_TYPE(obbox, &BBoxClass)) { + obbox = f_BBox(0, o, 0); + if(!obbox) + return 1; + } + SRECT bbox = bbox_getSRECT(obbox); - swf->swf.movieSize.xmin = xmin; - swf->swf.movieSize.ymin = ymin; - swf->swf.movieSize.xmax = xmax; - swf->swf.movieSize.ymax = ymax; - mylog(" %08x(%d) swf_setattr %s = (%d,%d,%d,%d)\n", (int)self, self->ob_refcnt, a, xmin,ymin,xmax,ymax); + swf->swf.movieSize = bbox; + mylog(" %08x(%d) swf_setattr %s = (%d,%d,%d,%d)\n", (int)self, self->ob_refcnt, a, bbox.xmin,bbox.ymin,bbox.xmax,bbox.ymax); return 0; } else if(!strcmp(a, "tags")) { PyObject* taglist; - /*if (!PyArg_Parse(o, "O!", &TagListClass, &taglist)); - goto err;*/ - // TODO: check if it's really a taglist taglist = o; + PY_ASSERT_TYPE(taglist,&TagListClass); Py_DECREF(swf->taglist); swf->taglist = taglist; Py_INCREF(swf->taglist); @@ -385,7 +401,7 @@ static PyObject* module_verbose(PyObject* self, PyObject* args, PyObject* kwargs { int _verbose = 0; static char *kwlist[] = {"verbosity", NULL}; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &verbose)) + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &_verbose)) return NULL; setVerbosity(_verbose); @@ -398,12 +414,12 @@ static PyMethodDef LoggingMethods[] = {"verbose", (PyCFunction)module_verbose, METH_KEYWORDS, "Set the module verbosity"}, {0,0,0,0} }; - + void initSWF(void) { PyObject*module; PyMethodDef* primitive_methods = primitive_getMethods(); - PyMethodDef* tag_methods = tag_getMethods(); + PyMethodDef* tag_methods = tags_getMethods(); PyMethodDef* action_methods = action_getMethods(); PyMethodDef* swf_methods = swf_getMethods(); @@ -416,4 +432,9 @@ void initSWF(void) all_methods = addMethods(all_methods, LoggingMethods); module = Py_InitModule("SWF", all_methods); + + /* Python doesn't copy the PyMethodDef struct, so we need + to keep it around */ + // free(all_methods) } +