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*_tag)
141 TagObject*tag = PyObject_New(TagObject, &TagClass);
142 mylog("+%08x(%d) tag_new\n", (int)tag, tag->ob_refcnt);
145 tag->placeobject = 0;
147 tag->tagmap = tagmap_new();
148 return (PyObject*)tag;
151 static PyObject* f_SetBackgroundColor(PyObject* self, PyObject* args, PyObject* kwargs)
153 static char *kwlist[] = {"color", NULL};
158 tag = (TagObject*)tag_new();
160 /* 1st try- copy constructor */
161 if(!PyArg_ParseTupleAndKeywords(args, kwargs, "O!", kwlist, &ColorClass, &color)) {
162 /* 2nd try- color's contructor */
163 color = f_Color(NULL, args, kwargs);
168 tag->tag = swf_InsertTag(0, ST_SETBACKGROUNDCOLOR);
169 RGBA rgba = color_getRGBA(color);
170 swf_SetU8(tag->tag, rgba.r);
171 swf_SetU8(tag->tag, rgba.g);
172 swf_SetU8(tag->tag, rgba.b);
173 mylog(" %08x(%d) SetBackgroundColor(%02x,%02x,%02x)\n", (int)tag, tag->ob_refcnt, rgba.r, rgba.g, rgba.b);
174 return (PyObject*)tag;
176 //----------------------------------------------------------------------------
177 static PyObject* f_DefineFont(PyObject* self, PyObject* args, PyObject* kwargs)
179 static char *kwlist[] = {"filename", NULL};
184 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|s", kwlist, &filename))
187 font = swf_LoadFont(filename);
188 mylog("font=%08x",font);
190 PyErr_SetString(PyExc_Exception, setError("Could not load %s", filename));
194 tag = (TagObject*)tag_new();
196 tag->tag = swf_InsertTag(0, ST_DEFINEFONT2);
198 swf_FontSetDefine2(tag->tag, tag->font);
199 mylog("+%08x(%d) DefineFont\n", (int)tag, tag->ob_refcnt);
200 return (PyObject*)tag;
202 //----------------------------------------------------------------------------
203 static PyObject* f_Protect(PyObject* self, PyObject* args, PyObject* kwargs)
205 static char *kwlist[] = {"password", NULL};
209 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|s", kwlist, &password))
212 tag = (TagObject*)tag_new();
213 tag->tag = swf_InsertTag(0, ST_PROTECT);
215 swf_SetPassword(tag->tag, password);
217 mylog("+%08x(%d) f_Protect", (int)tag, tag->ob_refcnt);
218 return (PyObject*)tag;
220 //----------------------------------------------------------------------------
221 static PyObject* f_DefineText(PyObject* self, PyObject* args, PyObject* kwargs)
223 static char *kwlist[] = {"font", "text", "size", "color", NULL};
230 RGBA rgba = {255,0,0,0};
235 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!u#i|O!", kwlist, &TagClass, &font, &text, &textlen, &size, &ColorClass, &color))
238 unicode16 = PyUnicode_DecodeUTF16(text, textlen*2, NULL, NULL);
239 unicode8 = PyUnicode_AsUTF8String(unicode16);
240 text = PyString_AS_STRING(unicode8);
243 rgba = color_getRGBA(color);
245 mylog("DefineText: text = %s", text);
247 tag = (TagObject*)tag_new();
249 /* notice: we do modify the (passed) font object here,
250 for the swf_SetDefineText call, who will write out the font id. */
251 font->font->id = tagmap_add(tag->tagmap,(PyObject*)font); // add dependency on font
253 tag ->tag= swf_InsertTag(0, ST_DEFINETEXT2);
254 swf_SetU16(tag->tag, /*ID*/0);
255 r = swf_SetDefineText(tag->tag, font->font, &rgba, text, size);
256 mylog("+%08x(%d) DefineText %08x -> %08x\n", (int)tag, tag->ob_refcnt);
258 return (PyObject*)tag;
260 //----------------------------------------------------------------------------
261 static PyObject* f_PlaceObject(PyObject* self, PyObject* args, PyObject* kwargs)
263 static char *kwlist[] = {"character", "depth", "matrix", "colortransform", "ratio", "name", "clipdepth", "action", NULL};
266 TagObject*character = 0;
275 po = malloc(sizeof(SWFPLACEOBJECT));
276 memset(po, 0, sizeof(SWFPLACEOBJECT));
278 swf_GetPlaceObject(0, po);
280 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!i|O!O!isiO!", kwlist,
281 &TagClass, &character,
283 &MatrixClass, &matrix,
284 &CXFormClass, &cxform,
293 po->clipdepth = clipdepth;
296 if(clipdepth) po->clipdepth = clipdepth;
297 if(matrix) po->matrix = matrix_getMatrix(matrix);
298 if(cxform) po->cxform = colortransform_getCXForm(cxform);
299 if(action) po->actions = action_getAction(action);
301 tag = (TagObject*)tag_new();
302 tag->placeobject = po;
303 Py_INCREF(character);
304 tag->character = (PyObject*)character;
305 tag->tag= swf_InsertTag(0, ST_PLACEOBJECT2);
307 po->id = tagmap_add(tag->tagmap,(PyObject*)character);
309 swf_SetPlaceObject(tag->tag, po);
310 mylog("+%08x(%d) PlaceObject %08x\n", (int)tag, tag->ob_refcnt, character);
311 return (PyObject*)tag;
314 TAG* tag_getRAWTAG(PyObject*self)
316 TagObject*tag = (TagObject*)self;
321 TAG* tag_getTAG(PyObject*self, TAG*prevTag, PyObject*tagmap)
323 mylog(" %08x(%d) tag_getTAG tagmap=%08x \n", (int)self, self->ob_refcnt, tagmap);
324 TagObject*tag = (TagObject*)self;
325 TAG* t = tag_getRAWTAG(self);
331 int num = swf_GetNumUsedIDs(t);
332 int * positions = malloc(num*sizeof(int));
333 swf_GetUsedIDs(t, positions);
336 int id = GET16(&t->data[positions[i]]);
337 PyObject* obj = tagmap_id2obj(tag->tagmap, id);
338 mylog(" %08x(%d) tag_getTAG: id %d is %08x\n", (int)tag, tag->ob_refcnt, id, obj);
340 TAG*othertag = tag_getRAWTAG(obj);
341 int newid = tagmap_add(tagmap, obj);
342 mylog(" %08x(%d) tag_getTAG: othertag->tagid=%d, new ID: %d\n", (int)tag, tag->ob_refcnt, othertag->id, newid);
344 /* here comes the big hack- we define the *other* tags define ID.
345 This assumes that the other tag is not yet written or processed,
346 and we are, apart from the calling taglist, the only ones who know
348 swf_SetDefineID(othertag, newid);
350 PUT16(&t->data[positions[i]], newid);
355 PyObject* tag_getDependencies(PyObject*self)
357 mylog("+%08x(%d) tag_getDependencies\n", (int)self, self->ob_refcnt);
358 TagObject*tag = (TagObject*)self;
359 return tagmap_getObjectList(tag->tagmap);
362 PyTypeObject TagClass =
364 PyObject_HEAD_INIT(NULL)
367 tp_basicsize: sizeof(TagObject),
369 tp_dealloc: tag_dealloc,
371 tp_getattr: tag_getattr,
373 static PyMethodDef TagMethods[] =
376 {"SetBackgroundColor", (PyCFunction)f_SetBackgroundColor, METH_KEYWORDS, "Create a SetBackGroundColor Tag."},
377 {"Protect", (PyCFunction)f_Protect, METH_KEYWORDS, "Create a Protect Tag."},
378 {"DefineFont", (PyCFunction)f_DefineFont, METH_KEYWORDS, "Create a DefineFont Tag."},
379 {"DefineText", (PyCFunction)f_DefineText, METH_KEYWORDS, "Create a DefineText Tag."},
380 {"PlaceObject", (PyCFunction)f_PlaceObject, METH_KEYWORDS, "Create a PlaceObject Tag."},
381 {NULL, NULL, 0, NULL}
383 PyMethodDef* tag_getMethods()
385 TagClass.ob_type = &PyType_Type;