more horizontal refactoring
[swftools.git] / lib / python / SWF.c
index aa2c7f3..050b36a 100644 (file)
@@ -27,6 +27,8 @@
 #include "./pyutils.h"
 #include "./tags.h"
 #include "./taglist.h"
+#include "./primitives.h"
+#include "./action.h"
 
 /*
 TODO:
@@ -47,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;
@@ -69,11 +71,17 @@ 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(obbox) {
+       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)
@@ -93,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("<data> 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);
@@ -163,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
     {
@@ -184,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);
 
@@ -217,6 +236,8 @@ static PyObject * swf_save(PyObject* self, PyObject* args, PyObject* kwargs)
     }*/
     swf->firstTag = 0;
     
+    mylog(" %08x(%d) f_save filename=%s done\n", (int)self, self->ob_refcnt, filename);
+    
     return PY_NONE;
 }
 //----------------------------------------------------------------------------
@@ -272,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;
@@ -287,18 +308,24 @@ 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);
        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);
@@ -334,15 +361,16 @@ 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;
@@ -377,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
@@ -399,7 +427,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);
 
@@ -435,4 +463,3 @@ void initSWF(void)
        to keep it around */
     // free(all_methods) 
 }
-