6 #include "primitives.h"
11 //----------------------------------------------------------------------------
18 /* ST_PLACEOBJECT, ST_PLACEOBJECT2*/
19 SWFPLACEOBJECT* placeobject;
23 //----------------------------------------------------------------------------
24 static void tag_dealloc(PyObject * self)
26 TagObject*tag = (TagObject*)self;
27 mylog("-%08x(%d) tag_dealoc\n", (int)self, self->ob_refcnt);
28 if(tag->placeobject) {
29 swf_PlaceObjectFree(tag->placeobject);
33 swf_FontFree(tag->font);
37 Py_DECREF(tag->character);
41 swf_DeleteTag(tag->tag);
44 Py_DECREF(tag->tagmap);
48 //----------------------------------------------------------------------------
49 static PyObject* tag_setU8(PyObject * self, PyObject*other)
53 //----------------------------------------------------------------------------
54 static PyObject* tag_setbackgroundcolor_getrgb(PyObject * self, PyObject*other)
56 TagObject*tag = (TagObject*)self;
58 r = tag->tag->data[0];
59 g = tag->tag->data[1];
60 b = tag->tag->data[2];
61 return Py_BuildValue("(iii)", r,g,b);
63 //----------------------------------------------------------------------------
65 static struct tagfunctions {
71 ST_SETBACKGROUNDCOLOR,
72 {{"getRGB", tag_setbackgroundcolor_getrgb, METH_VARARGS, "get's the color set by this tag"},
77 static PyMethodDef common_tagfunctions[] =
78 {{"setU8", tag_setU8, METH_VARARGS, "sets a byte to the tag data"},
82 static PyObject* tag_getattr(PyObject * self, char* a)
84 TagObject*tag = (TagObject*)self;
86 int id = tag->tag->id;
90 if(!strcmp(a, "id")) {
91 return Py_BuildValue("i", id);
93 if(!strcmp(a, "name")) {
94 char* name = swf_TagGetName(tag->tag);
95 return Py_BuildValue("s", name);
97 /* if(!strcmp(a, "swf")) {
99 return Py_BuildValue("s", 0);
107 /* search for a tag specific function */
108 for(t=0;t<sizeof(tagfunctions)/sizeof(tagfunctions[0]);t++)
110 if(id==tagfunctions[t].id) {
111 mylog(" %08x(%d) tag_getattr: id %d found\n", (int)self, self->ob_refcnt, id);
112 ret = Py_FindMethod(tagfunctions[t].f, self, a);
114 ret = FindMethodMore(ret, common_tagfunctions, self, a);
115 mylog(" %08x(%d) tag_getattr %s: %08x\n", (int)self, self->ob_refcnt, a, ret);
120 ret = Py_FindMethod(common_tagfunctions, self, a);
122 mylog(" %08x(%d) tag_getattr %s: %08x\n", (int)self, self->ob_refcnt, a, ret);
125 //----------------------------------------------------------------------------
127 //----------------------------------------------------------------------------
130 TagObject*tag = PyObject_New(TagObject, &TagClass);
131 mylog("+%08x(%d) tag_new\n", (int)tag, tag->ob_refcnt);
134 tag->placeobject = 0;
136 tag->tagmap = tagmap_new();
137 return (PyObject*)tag;
139 PyObject* tag_new2(TAG*t, PyObject* tagmap)
141 TagObject*tag = PyObject_New(TagObject, &TagClass);
142 mylog("+%08x(%d) tag_new tag=%08x\n", (int)tag, tag->ob_refcnt, t);
145 tag->placeobject = 0;
147 tag->tagmap = tagmap_new();
149 int num = swf_GetNumUsedIDs(t);
150 int * positions = malloc(num*sizeof(int));
151 swf_GetUsedIDs(t, positions);
154 int id = GET16(&t->data[positions[i]]);
155 PyObject*obj = tagmap_id2obj(tagmap, id);
157 PyErr_SetString(PyExc_Exception, setError("TagID %d not defined", id));
160 tagmap_addMapping(tag->tagmap, id, obj);
162 return (PyObject*)tag;
165 static PyObject* f_SetBackgroundColor(PyObject* self, PyObject* args, PyObject* kwargs)
167 static char *kwlist[] = {"color", NULL};
172 tag = (TagObject*)tag_new();
174 /* 1st try- copy constructor */
175 if(!PyArg_ParseTupleAndKeywords(args, kwargs, "O!", kwlist, &ColorClass, &color)) {
176 /* 2nd try- color's contructor */
177 color = f_Color(NULL, args, kwargs);
182 tag->tag = swf_InsertTag(0, ST_SETBACKGROUNDCOLOR);
183 RGBA rgba = color_getRGBA(color);
184 swf_SetU8(tag->tag, rgba.r);
185 swf_SetU8(tag->tag, rgba.g);
186 swf_SetU8(tag->tag, rgba.b);
187 mylog(" %08x(%d) SetBackgroundColor(%02x,%02x,%02x)\n", (int)tag, tag->ob_refcnt, rgba.r, rgba.g, rgba.b);
188 return (PyObject*)tag;
190 //----------------------------------------------------------------------------
191 static PyObject* f_DefineFont(PyObject* self, PyObject* args, PyObject* kwargs)
193 static char *kwlist[] = {"filename", NULL};
198 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|s", kwlist, &filename))
201 font = swf_LoadFont(filename);
202 mylog("font=%08x",font);
204 PyErr_SetString(PyExc_Exception, setError("Could not load %s", filename));
208 tag = (TagObject*)tag_new();
210 tag->tag = swf_InsertTag(0, ST_DEFINEFONT2);
212 swf_FontSetDefine2(tag->tag, tag->font);
213 mylog("+%08x(%d) DefineFont\n", (int)tag, tag->ob_refcnt);
214 return (PyObject*)tag;
216 //----------------------------------------------------------------------------
217 static PyObject* f_Protect(PyObject* self, PyObject* args, PyObject* kwargs)
219 static char *kwlist[] = {"password", NULL};
223 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|s", kwlist, &password))
226 tag = (TagObject*)tag_new();
227 tag->tag = swf_InsertTag(0, ST_PROTECT);
229 swf_SetPassword(tag->tag, password);
231 mylog("+%08x(%d) f_Protect", (int)tag, tag->ob_refcnt);
232 return (PyObject*)tag;
234 //----------------------------------------------------------------------------
235 static PyObject* f_DefineText(PyObject* self, PyObject* args, PyObject* kwargs)
237 static char *kwlist[] = {"font", "text", "size", "color", NULL};
244 RGBA rgba = {255,0,0,0};
249 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!u#i|O!", kwlist, &TagClass, &font, &text, &textlen, &size, &ColorClass, &color))
252 unicode16 = PyUnicode_DecodeUTF16(text, textlen*2, NULL, NULL);
253 unicode8 = PyUnicode_AsUTF8String(unicode16);
254 text = PyString_AS_STRING(unicode8);
257 rgba = color_getRGBA(color);
259 mylog("DefineText: text = %s", text);
261 tag = (TagObject*)tag_new();
263 /* notice: we do modify the (passed) font object here,
264 for the swf_SetDefineText call, who will write out the font id. */
265 font->font->id = tagmap_add(tag->tagmap,(PyObject*)font); // add dependency on font
267 tag ->tag= swf_InsertTag(0, ST_DEFINETEXT2);
268 swf_SetU16(tag->tag, /*ID*/0);
269 r = swf_SetDefineText(tag->tag, font->font, &rgba, text, size);
270 mylog("+%08x(%d) DefineText %08x -> %08x\n", (int)tag, tag->ob_refcnt);
272 return (PyObject*)tag;
274 //----------------------------------------------------------------------------
275 static PyObject* f_PlaceObject(PyObject* self, PyObject* args, PyObject* kwargs)
277 static char *kwlist[] = {"character", "depth", "matrix", "colortransform", "ratio", "name", "clipdepth", "action", NULL};
280 TagObject*character = 0;
289 po = malloc(sizeof(SWFPLACEOBJECT));
290 memset(po, 0, sizeof(SWFPLACEOBJECT));
292 swf_GetPlaceObject(0, po);
294 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!i|O!O!isiO!", kwlist,
295 &TagClass, &character,
297 &MatrixClass, &matrix,
298 &CXFormClass, &cxform,
307 po->clipdepth = clipdepth;
310 if(clipdepth) po->clipdepth = clipdepth;
311 if(matrix) po->matrix = matrix_getMatrix(matrix);
312 if(cxform) po->cxform = colortransform_getCXForm(cxform);
313 if(action) po->actions = action_getAction(action);
315 tag = (TagObject*)tag_new();
316 tag->placeobject = po;
317 Py_INCREF(character);
318 tag->character = (PyObject*)character;
319 tag->tag= swf_InsertTag(0, ST_PLACEOBJECT2);
321 po->id = tagmap_add(tag->tagmap,(PyObject*)character);
323 swf_SetPlaceObject(tag->tag, po);
324 mylog("+%08x(%d) PlaceObject %08x\n", (int)tag, tag->ob_refcnt, character);
325 return (PyObject*)tag;
328 TAG* tag_getRAWTAG(PyObject*self)
330 TagObject*tag = (TagObject*)self;
335 TAG* tag_getTAG(PyObject*self, TAG*prevTag, PyObject*tagmap)
337 TagObject*tag = (TagObject*)self;
338 TAG* t = tag_getRAWTAG(self);
339 mylog(" %08x(%d) tag_getTAG tagmap=%08x tag=%08x\n", (int)self, self->ob_refcnt, tagmap, t);
345 int num = swf_GetNumUsedIDs(t);
346 int * positions = malloc(num*sizeof(int));
347 swf_GetUsedIDs(t, positions);
350 int id = GET16(&t->data[positions[i]]);
351 PyObject* obj = tagmap_id2obj(tag->tagmap, id);
352 mylog(" %08x(%d) tag_getTAG: id %d is %08x\n", (int)tag, tag->ob_refcnt, id, obj);
354 TAG*othertag = tag_getRAWTAG(obj);
355 int newid = tagmap_add(tagmap, obj);
356 mylog(" %08x(%d) tag_getTAG: othertag->tagid=%d, new ID: %d\n", (int)tag, tag->ob_refcnt, othertag->id, newid);
358 /* here comes the big hack- we define the *other* tags define ID.
359 This assumes that the other tag is not yet written or processed,
360 and we are, apart from the calling taglist, the only ones who know
362 swf_SetDefineID(othertag, newid);
364 PUT16(&t->data[positions[i]], newid);
369 PyObject* tag_getDependencies(PyObject*self)
371 mylog(" %08x(%d) tag_getDependencies\n", (int)self, self->ob_refcnt);
372 TagObject*tag = (TagObject*)self;
373 return tagmap_getObjectList(tag->tagmap);
376 PyTypeObject TagClass =
378 PyObject_HEAD_INIT(NULL)
381 tp_basicsize: sizeof(TagObject),
383 tp_dealloc: tag_dealloc,
385 tp_getattr: tag_getattr,
387 static PyMethodDef TagMethods[] =
390 {"SetBackgroundColor", (PyCFunction)f_SetBackgroundColor, METH_KEYWORDS, "Create a SetBackGroundColor Tag."},
391 {"Protect", (PyCFunction)f_Protect, METH_KEYWORDS, "Create a Protect Tag."},
392 {"DefineFont", (PyCFunction)f_DefineFont, METH_KEYWORDS, "Create a DefineFont Tag."},
393 {"DefineText", (PyCFunction)f_DefineText, METH_KEYWORDS, "Create a DefineText Tag."},
394 {"PlaceObject", (PyCFunction)f_PlaceObject, METH_KEYWORDS, "Create a PlaceObject Tag."},
395 {NULL, NULL, 0, NULL}
397 PyMethodDef* tag_getMethods()
399 TagClass.ob_type = &PyType_Type;