X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fpython%2Ftag.c;h=65e19b35ec1419fa7afb61fc5a964d2621bf124f;hb=2206626c3b7fa0997a2472a28b78f3d42bfd2ae7;hp=ed089311338f5ee3a4e1b02cee4bc2f4ad82de9b;hpb=a18cdd835cad27c679d6a9659836f035fc3a0b5c;p=swftools.git diff --git a/lib/python/tag.c b/lib/python/tag.c index ed08931..65e19b3 100644 --- a/lib/python/tag.c +++ b/lib/python/tag.c @@ -6,10 +6,12 @@ #include "primitives.h" #include "action.h" #include "tag.h" +#include "tagmap.h" //---------------------------------------------------------------------------- typedef struct { PyObject_HEAD + PyObject* tagmap; TAG*tag; /* ST_DEFINEFONT*/ SWFFONT* font; @@ -18,10 +20,14 @@ typedef struct { PyObject* character; } TagObject; +//---------------------------------------------------------------------------- static void tag_dealloc(PyObject * self) { TagObject*tag = (TagObject*)self; - mylog("tag_dealoc %08x(%d)\n", (int)self, self->ob_refcnt); + if(tag->tag) + mylog("-%08x(%d) tag_dealoc [%s]\n", (int)self, self->ob_refcnt, swf_TagGetName(tag->tag)); + else + mylog("-%08x(%d) tag_dealoc [?]\n", (int)self, self->ob_refcnt); if(tag->placeobject) { swf_PlaceObjectFree(tag->placeobject); tag->placeobject = 0; @@ -34,6 +40,12 @@ static void tag_dealloc(PyObject * self) Py_DECREF(tag->character); tag->character = 0; } + if(tag->tag) { + swf_DeleteTag(tag->tag); + tag->tag = 0; + } + Py_DECREF(tag->tagmap); + tag->tagmap = 0; PyObject_Del(self); } //---------------------------------------------------------------------------- @@ -85,24 +97,32 @@ static PyObject* tag_getattr(PyObject * self, char* a) char* name = swf_TagGetName(tag->tag); return Py_BuildValue("s", name); } +/* if(!strcmp(a, "swf")) { + if(tag->swf == 0) + return Py_BuildValue("s", 0); + else { + Py_INCREF(tag->swf); + return tag->swf; + } + }*/ /* ------------ */ /* search for a tag specific function */ for(t=0;tob_refcnt, id); ret = Py_FindMethod(tagfunctions[t].f, self, a); if(!ret) return ret; ret = FindMethodMore(ret, common_tagfunctions, self, a); - mylog("tag_getattr %08x(%d) %s: %08x\n", (int)self, self->ob_refcnt, a, ret); + mylog(" %08x(%d) tag_getattr %s: %08x\n", (int)self, self->ob_refcnt, a, ret); return ret; } } ret = Py_FindMethod(common_tagfunctions, self, a); - mylog("tag_getattr %08x(%d) %s: %08x\n", (int)self, self->ob_refcnt, a, ret); + mylog(" %08x(%d) tag_getattr %s: %08x\n", (int)self, self->ob_refcnt, a, ret); return ret; } //---------------------------------------------------------------------------- @@ -111,19 +131,45 @@ static PyObject* tag_getattr(PyObject * self, char* a) PyObject* tag_new() { TagObject*tag = PyObject_New(TagObject, &TagClass); + mylog("+%08x(%d) tag_new\n", (int)tag, tag->ob_refcnt); tag->font = 0; tag->character = 0; tag->placeobject = 0; tag->tag = 0; + tag->tagmap = tagmap_new(); return (PyObject*)tag; } -PyObject* tag_new2(TAG*_tag) +PyObject* tag_new2(TAG*t, PyObject* tagmap) { TagObject*tag = PyObject_New(TagObject, &TagClass); + mylog("+%08x(%d) tag_new2 tag=%08x id=%d (%s)\n", (int)tag, tag->ob_refcnt, t, t->id, swf_TagGetName(t)); tag->font = 0; tag->character = 0; tag->placeobject = 0; - tag->tag = _tag; + tag->tagmap = tagmap_new(); + // copy tag + tag->tag = swf_InsertTag(0, t->id); + swf_SetBlock(tag->tag, t->data, t->len); + t = tag->tag; + + int num = swf_GetNumUsedIDs(t); + if(num) { // tag has dependencies + int * positions = malloc(num*sizeof(int)); + swf_GetUsedIDs(t, positions); + int i; + for(i=0;idata[positions[i]]); + PyObject*obj = tagmap_id2obj(tagmap, id); + if(obj==NULL) { + PyErr_SetString(PyExc_Exception, setError("TagID %d not defined", id)); + return NULL; + } + //mylog("+%08x(%d) tag_new2 handling id %d at %d/%d\n", (int)tag, tag->ob_refcnt, id, positions[i], t->len); + //mylog("+%08x(%d) tag_new2 add dependency %d to id %d, object %08x(%d)\n", (int)tag, tag->ob_refcnt, i, id, obj, obj->ob_refcnt); + tagmap_addMapping(tag->tagmap, id, obj); + } + free(positions); + } return (PyObject*)tag; } @@ -133,6 +179,8 @@ static PyObject* f_SetBackgroundColor(PyObject* self, PyObject* args, PyObject* int r=0,g=0,b=0; TagObject*tag; PyObject*color; + + tag = (TagObject*)tag_new(); /* 1st try- copy constructor */ if(!PyArg_ParseTupleAndKeywords(args, kwargs, "O!", kwlist, &ColorClass, &color)) { @@ -142,13 +190,12 @@ static PyObject* f_SetBackgroundColor(PyObject* self, PyObject* args, PyObject* if(!color) return NULL; - tag = (TagObject*)tag_new(); tag->tag = swf_InsertTag(0, ST_SETBACKGROUNDCOLOR); RGBA rgba = color_getRGBA(color); swf_SetU8(tag->tag, rgba.r); swf_SetU8(tag->tag, rgba.g); swf_SetU8(tag->tag, rgba.b); - mylog("SetBackgroundColor(%02x,%02x,%02x) %08x -> %08x\n", rgba.r, rgba.g, rgba.b, (int)self, tag); + mylog(" %08x(%d) SetBackgroundColor(%02x,%02x,%02x) (colorobj=%08x(%d))\n", (int)tag, tag->ob_refcnt, rgba.r, rgba.g, rgba.b, color, color->ob_refcnt); return (PyObject*)tag; } //---------------------------------------------------------------------------- @@ -163,7 +210,6 @@ static PyObject* f_DefineFont(PyObject* self, PyObject* args, PyObject* kwargs) return NULL; font = swf_LoadFont(filename); - mylog("font=%08x",font); if(!font) { PyErr_SetString(PyExc_Exception, setError("Could not load %s", filename)); return NULL; @@ -172,11 +218,17 @@ static PyObject* f_DefineFont(PyObject* self, PyObject* args, PyObject* kwargs) tag = (TagObject*)tag_new(); tag->font = font; tag->tag = swf_InsertTag(0, ST_DEFINEFONT2); - tag->font->id = 0xabcd; // swf_SetU16(id); - swf_FontSetDefine2(tag->tag, tag->font); // TODO: should this be done later, in taglist? - mylog("DefineFont %08x -> %08x\n", (int)self, (int)tag); + tag->font->id = 0; + swf_FontSetDefine2(tag->tag, tag->font); + mylog("+%08x(%d) DefineFont\n", (int)tag, tag->ob_refcnt); return (PyObject*)tag; } +static SWFFONT* fonttag_getSWFFONT(PyObject*self) +{ + PY_ASSERT_TYPE(self, &TagClass); + TagObject*font = (TagObject*)self; + return font->font; +} //---------------------------------------------------------------------------- static PyObject* f_Protect(PyObject* self, PyObject* args, PyObject* kwargs) { @@ -192,24 +244,24 @@ static PyObject* f_Protect(PyObject* self, PyObject* args, PyObject* kwargs) if(password) { swf_SetPassword(tag->tag, password); } - mylog("f_Protect %08x -> %08x\n", (int)self, (int)tag); + mylog("+%08x(%d) f_Protect", (int)tag, tag->ob_refcnt); return (PyObject*)tag; } //---------------------------------------------------------------------------- static PyObject* f_DefineText(PyObject* self, PyObject* args, PyObject* kwargs) { static char *kwlist[] = {"font", "text", "size", "color", NULL}; - TagObject*tag; + TagObject*tag = 0; char*text = 0; int textlen = 0; PyObject*unicode16; PyObject*unicode8; int size = 0; - RGBA rgba = {0,0,0,255}; + RGBA rgba = {255,0,0,0}; PyObject*color = 0; - TagObject*font = 0; + PyObject*font = 0; SRECT r; - + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!u#i|O!", kwlist, &TagClass, &font, &text, &textlen, &size, &ColorClass, &color)) return NULL; @@ -223,10 +275,20 @@ static PyObject* f_DefineText(PyObject* self, PyObject* args, PyObject* kwargs) mylog("DefineText: text = %s", text); tag = (TagObject*)tag_new(); + + int font_id = tagmap_add(tag->tagmap, font); // add dependency on font + + fonttag_getSWFFONT(font)->id = font_id; + tag ->tag= swf_InsertTag(0, ST_DEFINETEXT2); swf_SetU16(tag->tag, /*ID*/0); - r = swf_SetDefineText(tag->tag, font->font, &rgba, text, size); - mylog("DefineText %08x -> %08x\n", (int)self, (int)tag); + r = swf_SetDefineText(tag->tag, fonttag_getSWFFONT(font), &rgba, text, size); + mylog("+%08x(%d) DefineText tag=%08x \n", (int)tag, tag->ob_refcnt); + + //Py_DECREF(unicode16); + //Py_DECREF(unicode8); + //free(text); + return (PyObject*)tag; } //---------------------------------------------------------------------------- @@ -257,7 +319,7 @@ static PyObject* f_PlaceObject(PyObject* self, PyObject* args, PyObject* kwargs) &ratio, &name, &clipdepth, - &action + &ActionClass, &action )) return NULL; po->depth = depth; @@ -265,7 +327,8 @@ static PyObject* f_PlaceObject(PyObject* self, PyObject* args, PyObject* kwargs) po->clipdepth = clipdepth; po->ratio = ratio; po->name = name; - if(clipdepth) po->matrix = matrix_getMatrix(matrix); + if(clipdepth) po->clipdepth = clipdepth; + if(matrix) po->matrix = matrix_getMatrix(matrix); if(cxform) po->cxform = colortransform_getCXForm(cxform); if(action) po->actions = action_getAction(action); @@ -274,15 +337,62 @@ static PyObject* f_PlaceObject(PyObject* self, PyObject* args, PyObject* kwargs) Py_INCREF(character); tag->character = (PyObject*)character; tag->tag= swf_InsertTag(0, ST_PLACEOBJECT2); + + po->id = tagmap_add(tag->tagmap,(PyObject*)character); + swf_SetPlaceObject(tag->tag, po); - mylog("PlaceObject %08x -> %08x\n", (int)self, (int)tag); + mylog("+%08x(%d) PlaceObject %08x(%d)\n", (int)tag, tag->ob_refcnt, character, character->ob_refcnt); + return (PyObject*)tag; } -TAG* tag_getTAG(PyObject*self) +/* serialize */ +TAG* tag_getTAG(PyObject*self, TAG*prevTag, PyObject*tagmap) +{ + TagObject*tag = (TagObject*)self; + + mylog(" %08x(%d) tag_getTAG: tag=%08x id=%d (%s)", (int)self, self->ob_refcnt, tag->tag, tag->tag->id, swf_TagGetName(tag->tag)); + + TAG* t = swf_InsertTag(prevTag, tag->tag->id); + swf_SetBlock(t, tag->tag->data, tag->tag->len); + + if(swf_isDefiningTag(t)) { + int newid = tagmap_add(tagmap, self); + swf_SetDefineID(t, newid); + } + + int num = swf_GetNumUsedIDs(t); + if(num) { // tag has dependencies + int * positions = malloc(num*sizeof(int)); + swf_GetUsedIDs(t, positions); + int i; + for(i=0;idata[positions[i]]); + PyObject* obj = tagmap_id2obj(tag->tagmap, id); + if(obj==NULL) { + PyErr_SetString(PyExc_Exception, setError("Internal error: id %d not known in taglist:")); + free(positions); + return 0; + } + int newid = tagmap_obj2id(tagmap, obj); + PUT16(&t->data[positions[i]], newid); + } + free(positions); + } + return t; +} + +PyObject* tag_getDependencies(PyObject*self) +{ + TagObject*tag = (TagObject*)self; + mylog(" %08x(%d) tag_getDependencies id=%d tag=%s\n", (int)self, self->ob_refcnt, tag->tag->id, swf_TagGetName(tag->tag)); + return tagmap_getObjectList(tag->tagmap); +} + +int tag_print (PyObject * self, FILE * fi, int flags) { - // TODO: checking! - return ((TagObject*)self)->tag; + mylog(" %08x(%d) tag_print flags=%08x\n", (int)self, self->ob_refcnt, flags); + return 0; } PyTypeObject TagClass = @@ -293,7 +403,7 @@ PyTypeObject TagClass = tp_basicsize: sizeof(TagObject), tp_itemsize: 0, tp_dealloc: tag_dealloc, - tp_print: 0, + tp_print: tag_print, tp_getattr: tag_getattr, }; static PyMethodDef TagMethods[] =