X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fpython%2FSWF.c;h=050b36a43d09f35dab3e96833eff502627a8e56b;hb=879d0eec420fe0fd5ddcd56c8fe62b82a6744edd;hp=2ed67f391d7d9fb2d6daebb7fd7885c2715621dd;hpb=786db6cd5ade7f42b13efb21647a22becb58ce35;p=swftools.git diff --git a/lib/python/SWF.c b/lib/python/SWF.c index 2ed67f3..050b36a 100644 --- a/lib/python/SWF.c +++ b/lib/python/SWF.c @@ -49,7 +49,7 @@ staticforward PyTypeObject SWFClass; typedef struct { PyObject_HEAD - SWF swf; //swf.firstTag ist not used + SWF swf; //swf.firstTag is not used PyObject*taglist; char*filename; } SWFObject; @@ -74,12 +74,14 @@ static PyObject* f_create(PyObject* self, PyObject* args, PyObject* kwargs) &obbox, &filename)) return NULL; - if (!PY_CHECK_TYPE(obbox, &BBoxClass)) { - obbox = f_BBox(0, obbox, 0); - if(!obbox) - return NULL; + if(obbox) { + if (!PY_CHECK_TYPE(obbox, &BBoxClass)) { + obbox = f_BBox(0, obbox, 0); + if(!obbox) + return NULL; + } + bbox = bbox_getSRECT(obbox); } - bbox = bbox_getSRECT(obbox); memset(&swf->swf, 0, sizeof(SWF)); if(filename) @@ -99,36 +101,54 @@ static PyObject* f_create(PyObject* self, PyObject* args, PyObject* kwargs) return (PyObject*)swf; } //---------------------------------------------------------------------------- -static PyObject* f_load(PyObject* self, PyObject* args) +static PyObject* f_load(PyObject* self, PyObject* args, PyObject* kwargs) { - char* filename; + static char *kwlist1[] = {"filename", NULL}; + static char *kwlist2[] = {"data", NULL}; + char* filename = 0; + char* data = 0; + int len = 0; SWFObject* swf; int fi; - if (!PyArg_ParseTuple(args,"s:load", &filename)) - return NULL; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", kwlist1, &filename)) { + PyErr_Clear(); + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s#", kwlist2, &data, &len)) { + PyErr_Clear(); + PyArg_ParseTupleAndKeywords(args, kwargs, "s:load", kwlist1, &filename); + return 0; + } + } swf = PyObject_New(SWFObject, &SWFClass); mylog("+%08x(%d) f_load\n", (int)swf, swf->ob_refcnt); memset(&swf->swf, 0, sizeof(SWF)); - 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)); - return 0; - } - if(swf_ReadSWF(fi,&swf->swf)<0) { - close(fi); - PyErr_SetString(PyExc_Exception, setError("%s is not a valid SWF file or contains errors",filename)); - return 0; + if(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) { + return PY_ERROR("Couldn't open file %s", filename); + } + if(swf_ReadSWF(fi,&swf->swf)<0) { + close(fi); + return PY_ERROR("%s is not a valid SWF file or contains errors",filename); + } + close(fi); + } else { + reader_t r; + reader_init_memreader(&r, data, len); + swf->filename = 0; + if(swf_ReadSWF2(&r, &swf->swf)<0) { + return PY_ERROR(" is not a valid SWF file or contains errors"); + } + r.dealloc(&r); } - close(fi); swf_FoldAll(&swf->swf); swf->taglist = taglist_new2(swf->swf.firstTag); @@ -169,8 +189,9 @@ static PyObject * swf_save(PyObject* self, PyObject* args, PyObject* kwargs) swf->compressed = 1; swf->firstTag = taglist_getTAGs(swfo->taglist); - if(!swf->firstTag) - return NULL; + + /*if(!swf->firstTag) + return NULL;*/ // fix the file, in case it is empty or not terminated properly { @@ -190,18 +211,10 @@ static PyObject * swf_save(PyObject* self, PyObject* args, PyObject* kwargs) PyErr_SetString(PyExc_Exception, setError("couldn't create output file %s", filename)); return 0; } - if(swf->compressed) { - if(swf_WriteSWC(fi, swf)<0) { - close(fi); - PyErr_SetString(PyExc_Exception, setError("WriteSWC() failed.")); - return 0; - } - } else { - if(swf_WriteSWF(fi, swf)<0) { - close(fi); - PyErr_SetString(PyExc_Exception, setError("WriteSWC() failed.")); - return 0; - } + if(swf_WriteSWF(fi, swf)<0) { + close(fi); + PyErr_SetString(PyExc_Exception, setError("WriteSWC() failed.")); + return 0; } close(fi); @@ -280,7 +293,7 @@ static int swf_print(PyObject * self, FILE *fi, int flags) //flags&Py_PRINT_RAW static PyObject* swf_getattr(PyObject * self, char* a) { SWFObject*swf = (SWFObject*)self; - PyObject* ret; + PyObject* ret = 0; if(!strcmp(a, "fps")) { double fps = swf->swf.frameRate/256.0; @@ -301,6 +314,18 @@ static PyObject* swf_getattr(PyObject * self, char* a) Py_INCREF(ret); mylog(" %08x(%d) swf_getattr %s = %08x(%d)\n", (int)self, self->ob_refcnt, a, ret, ret->ob_refcnt); return ret; + } else if(!strcmp(a, "filesize")) { + int s = swf->swf.fileSize; + return Py_BuildValue("i", s); + } else if(!strcmp(a, "width")) { + int w = (swf->swf.movieSize.xmax - swf->swf.movieSize.xmin) / 20; + return Py_BuildValue("i", w); + } else if(!strcmp(a, "height")) { + int h = (swf->swf.movieSize.ymax - swf->swf.movieSize.ymin) / 20; + return Py_BuildValue("i", h); + } else if(!strcmp(a, "framecount")) { + int f = swf->swf.frameCount; + return Py_BuildValue("i", f); } ret = Py_FindMethod(swf_functions, self, a); @@ -380,7 +405,7 @@ static PyTypeObject SWFClass = static PyMethodDef SWFMethods[] = { /* SWF creation*/ - {"load", f_load, METH_VARARGS, "Load a SWF from disc."}, + {"load", (PyCFunction)f_load, METH_KEYWORDS, "Load a SWF from disc."}, {"create", (PyCFunction)f_create, METH_KEYWORDS, "Create a new SWF from scratch."}, {0,0,0,0} // save is a member function @@ -438,4 +463,3 @@ void initSWF(void) to keep it around */ // free(all_methods) } -