applied patch from Daichi Shinozaki.
[swftools.git] / lib / python / SWF.c
index 5f03825..0c8fd6f 100644 (file)
 #include "../rfxswf.h"
 #include "../log.h"
 #include "./pyutils.h"
-#include "./tag.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)
@@ -123,6 +131,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) {
@@ -162,8 +171,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
     {
@@ -198,7 +208,7 @@ static PyObject * swf_save(PyObject* self, PyObject* args, PyObject* kwargs)
     }
     close(fi);
 
-    //swf_FreeTags(swf);
+    swf_FreeTags(swf);
     /*{ TAG * t = swf->firstTag;
       while (t)
       { 
@@ -216,6 +226,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;
 }
 //----------------------------------------------------------------------------
@@ -271,7 +283,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;
@@ -286,18 +298,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);
@@ -333,15 +351,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;
@@ -398,7 +417,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);
 
@@ -416,7 +435,7 @@ 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();
 
@@ -434,4 +453,3 @@ void initSWF(void)
        to keep it around */
     // free(all_methods) 
 }
-