3 Python wrapper for librfxswf- primitive objects (implementation)
5 Part of the swftools package.
7 Copyright (c) 2003 Matthias Kramm <kramm@quiss.org>
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
25 #include "../rfxswf.h"
27 #include "./pyutils.h"
28 #include "primitives.h"
30 //----------------------------------------------------------------------------
36 PyObject* f_Color(PyObject* self, PyObject* args, PyObject* kwargs)
38 static char *kwlist[] = {"r", "g", "b", "a", NULL};
40 int r=0,g=0,b=0,a=255;
41 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "iii|i", kwlist, &r,&g,&b,&a))
43 color = PyObject_New(ColorObject, &ColorClass);
44 mylog("+%08x(%d) color_new(%d,%d,%d,%d)\n", (int)color, color->ob_refcnt, r,g,b,a);
49 return (PyObject*)color;
51 static PyObject* color_getattr(PyObject * self, char* a)
53 ColorObject*color = (ColorObject*)self;
55 return Py_BuildValue("r", color->rgba.r);
56 } else if(!strcmp(a, "g")) {
57 return Py_BuildValue("g", color->rgba.g);
58 } else if(!strcmp(a, "b")) {
59 return Py_BuildValue("b", color->rgba.b);
60 } else if(!strcmp(a, "a")) {
61 return Py_BuildValue("a", color->rgba.a);
65 static int color_setattr(PyObject * self, char* attr, PyObject* o)
67 ColorObject*color = (ColorObject*)self;
68 if(!strcmp(attr, "r")) {
69 if (!PyArg_Parse(o, "d", &color->rgba.r)) goto err;
71 } else if(!strcmp(attr, "g")) {
72 if (!PyArg_Parse(o, "d", &color->rgba.g)) goto err;
74 } else if(!strcmp(attr, "b")) {
75 if (!PyArg_Parse(o, "d", &color->rgba.b)) goto err;
77 } else if(!strcmp(attr, "a")) {
78 if (!PyArg_Parse(o, "d", &color->rgba.a)) goto err;
82 mylog("swf_setattr %08x(%d) %s = ? (%08x)\n", (int)self, self->ob_refcnt, attr, o);
85 RGBA color_getRGBA(PyObject*self)
87 ColorObject*color = 0;
88 if (!PyArg_Parse(self, "O!", &ColorClass, &color)) {
90 memset(&dummy, 0, sizeof(dummy));
91 mylog("Error: wrong type for function color_getRGBA");
96 void color_dealloc(PyObject* self)
98 mylog("-%08x(%d) color_dealloc\n", (int)self, self->ob_refcnt);
101 PyTypeObject ColorClass =
103 PyObject_HEAD_INIT(NULL)
106 tp_basicsize: sizeof(ColorObject),
108 tp_dealloc: color_dealloc,
110 tp_getattr: color_getattr,
111 tp_setattr: color_setattr,
113 //----------------------------------------------------------------------------
118 //void swf_ExpandRect(SRECT*src, SPOINT add);
119 //void swf_ExpandRect2(SRECT*src, SRECT*add);
121 PyObject* f_BBox(PyObject* self, PyObject* args, PyObject* kwargs)
123 static char *kwlist[] = {"xmin", "ymin", "xmax", "ymax", NULL};
125 float xmin,ymin,xmax,ymax;
127 if (!PyArg_ParseTuple(args, "ffff", &xmin, &ymin, &xmax, &ymax))
130 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ffff", kwlist, &xmin, &ymin, &xmax, &ymax))
134 box.xmin = (int)(xmin*20);
135 box.ymin = (int)(ymin*20);
136 box.xmax = (int)(xmax*20);
137 box.ymax = (int)(ymax*20);
138 mylog("+%08x(%d) bbox_new(%d,%d,%d,%d)\n", (int)self, self?self->ob_refcnt:0, box.xmin, box.ymin, box.xmax,box.ymax);
139 bbox = PyObject_New(BBoxObject, &BBoxClass);
141 return (PyObject*)bbox;
143 PyObject* f_BBox2(SRECT box)
146 bbox = PyObject_New(BBoxObject, &BBoxClass);
148 return (PyObject*)bbox;
150 static PyObject* bbox_getattr(PyObject * self, char* a)
152 BBoxObject*bbox = (BBoxObject*)self;
153 if(!strcmp(a, "xmin")) {
154 return Py_BuildValue("f", bbox->bbox.xmin/20.0);
155 } else if(!strcmp(a, "ymin")) {
156 return Py_BuildValue("f", bbox->bbox.ymin/20.0);
157 } else if(!strcmp(a, "xmax")) {
158 return Py_BuildValue("f", bbox->bbox.xmax/20.0);
159 } else if(!strcmp(a, "ymax")) {
160 return Py_BuildValue("f", bbox->bbox.ymax/20.0);
164 static int bbox_setattr(PyObject * self, char* a, PyObject* o)
166 BBoxObject*bbox= (BBoxObject*)self;
167 if(!strcmp(a, "xmin")) {
169 if (!PyArg_Parse(o, "i", &xmin)) goto err;
170 bbox->bbox.xmin = (int)(xmin*20);
172 } else if(!strcmp(a, "ymin")) {
174 if (!PyArg_Parse(o, "i", &ymin)) goto err;
175 bbox->bbox.ymin = (int)(ymin*20);
177 } else if(!strcmp(a, "xmax")) {
179 if (!PyArg_Parse(o, "i", &xmax)) goto err;
180 bbox->bbox.xmax = (int)(xmax*20);
182 } else if(!strcmp(a, "ymax")) {
184 if (!PyArg_Parse(o, "i", &ymax)) goto err;
185 bbox->bbox.ymax = (int)(ymax*20);
189 mylog("swf_setattr %08x(%d) %s = ? (%08x)\n", (int)self, self->ob_refcnt, a, o);
192 void bbox_dealloc(PyObject* self)
194 mylog("-%08x(%d) bbox_dealloc\n", (int)self, self->ob_refcnt);
197 SRECT bbox_getSRECT(PyObject*self)
200 if (!PyArg_Parse(self, "O!", &BBoxClass, &bbox)) {
202 memset(&dummy, 0, sizeof(dummy));
203 mylog("Error: wrong type for function color_getRGBA");
208 PyTypeObject BBoxClass =
210 PyObject_HEAD_INIT(NULL)
213 tp_basicsize: sizeof(BBoxObject),
215 tp_dealloc: bbox_dealloc,
217 tp_getattr: bbox_getattr,
218 tp_setattr: bbox_setattr,
220 SRECT bbox_getBBox(PyObject*self);
221 //----------------------------------------------------------------------------
227 PyObject* f_Matrix(PyObject* _self, PyObject* args, PyObject* kwargs)
229 PyObject*self = (PyObject*)PyObject_New(MatrixObject, &MatrixClass);
230 MatrixObject*matrix = (MatrixObject*)self;
231 mylog("+%08x(%d) f_Matrix", self, self->ob_refcnt);
232 static char *kwlist[] = {"x", "y", "scale", "rotate", "pivotx", "pivoty", NULL};
233 float x=0,y=0,scale=1.0,rotate=0,pivotx=0,pivoty=0;
234 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|ffffff", kwlist, &x,&y,&scale,&rotate,&pivotx,&pivoty))
236 mylog(" %08x(%d) f_Matrix: x=%f y=%f scale=%f rotate=%f", self, self->ob_refcnt, x,y,scale,rotate);
237 swf_GetMatrix(0, &matrix->matrix);
239 matrix->matrix.tx = (int)(x*20);
240 matrix->matrix.ty = (int)(y*20);
243 matrix->matrix.sx = (int)(scale*65536);
244 matrix->matrix.sy = (int)(scale*65536);
246 matrix->matrix.sx = (int)(scale*cos(rotate)*65536);
247 matrix->matrix.sy = (int)(scale*cos(rotate)*65536);
248 matrix->matrix.r0 = (int)(scale*sin(rotate)*65536);
249 matrix->matrix.r1 = (int)(-scale*sin(rotate)*65536);
251 if(pivotx || pivoty) {
253 p.x = (int)(pivotx*20);
254 p.y = (int)(pivoty*20);
255 p = swf_TurnPoint(p, &matrix->matrix);
256 matrix->matrix.tx += matrix->matrix.tx-p.x;
257 matrix->matrix.ty += matrix->matrix.ty-p.y;
263 static PyObject* matrix_getattr(PyObject * self, char* a)
265 PY_ASSERT_TYPE(self,&MatrixClass);
268 static int matrix_setattr(PyObject * self, char* a, PyObject* o)
270 PY_ASSERT_TYPE(self,&MatrixClass);
273 MATRIX matrix_getMatrix(PyObject*self)
275 mylog(" %08x(%d) matrix_getMatrix", self, self->ob_refcnt);
276 PY_ASSERT_TYPE(self,&MatrixClass);
277 MatrixObject*matrix = (MatrixObject*)self;
278 return matrix->matrix;
280 void matrix_dealloc(PyObject* self)
282 mylog("-%08x(%d) matrix_dealloc", self, self->ob_refcnt);
285 //SPOINT swf_TurnPoint(SPOINT p, MATRIX* m);
286 //SRECT swf_TurnRect(SRECT r, MATRIX* m);
287 PyTypeObject MatrixClass =
289 PyObject_HEAD_INIT(NULL)
292 tp_basicsize: sizeof(MatrixObject),
294 tp_dealloc: matrix_dealloc,
296 tp_getattr: matrix_getattr,
297 tp_setattr: matrix_setattr,
303 tp_hash: 0, // dict(x)
307 //----------------------------------------------------------------------------
313 PyObject* f_ColorTransform(PyObject* self, PyObject* args, PyObject* kwargs)
317 static PyObject* colortransform_getattr(PyObject * self, char* a)
321 static int colortransform_setattr(PyObject * self, char* a, PyObject* o)
325 CXFORM colortransform_getCXForm(PyObject*self)
327 CXFormObject*cxform= 0;
328 if (!PyArg_Parse(self, "O!", &CXFormClass, &cxform)) {
330 memset(&dummy, 0, sizeof(dummy));
331 mylog("Error: wrong type for function color_getRGBA");
334 return cxform->cxform;
336 void colortransform_dealloc(PyObject* self)
338 mylog("-%08x(%d) colortransform_dealloc", self, self->ob_refcnt);
341 PyTypeObject CXFormClass =
343 PyObject_HEAD_INIT(NULL)
345 tp_name: "ColorTransform",
346 tp_basicsize: sizeof(CXFormObject),
348 tp_dealloc: colortransform_dealloc,
350 tp_getattr: colortransform_getattr,
351 tp_setattr: colortransform_setattr,
353 //----------------------------------------------------------------------------
359 PyObject* f_Gradient(PyObject* self, PyObject* args, PyObject* kwargs)
363 static PyObject* gradient_getattr(PyObject * self, char* a)
367 static int gradient_setattr(PyObject * self, char* a, PyObject* o)
371 GRADIENT gradient_getGradient(PyObject*self)
373 GradientObject*gradient = 0;
374 if (!PyArg_Parse(self, "O!", &gradient, &gradient)) {
376 memset(&dummy, 0, sizeof(dummy));
377 mylog("Error: wrong type for function color_getRGBA");
380 return gradient->gradient;
382 void gradient_dealloc(PyObject* self)
384 mylog("-%08x(%d) gradient_dealloc", self, self->ob_refcnt);
387 PyTypeObject GradientClass =
389 PyObject_HEAD_INIT(NULL)
392 tp_basicsize: sizeof(GradientObject),
394 tp_dealloc: gradient_dealloc,
396 tp_getattr: gradient_getattr,
397 tp_setattr: gradient_setattr,
399 //----------------------------------------------------------------------------
401 static PyMethodDef primitive_methods[] =
403 {"Color", (PyCFunction)f_Color, METH_KEYWORDS, "Create a new color object."},
404 {"Gradient", (PyCFunction)f_Gradient, METH_KEYWORDS, "Create a new gradient object."},
405 {"ColorTransform", (PyCFunction)f_ColorTransform, METH_KEYWORDS, "Create a new colortransform object."},
406 {"Matrix", (PyCFunction)f_Matrix, METH_KEYWORDS, "Create a new matrix object."},
407 {"BBox", (PyCFunction)f_BBox, METH_KEYWORDS, "Create a new bounding box object."},
408 {NULL, NULL, 0, NULL}
411 PyMethodDef* primitive_getMethods()
413 GradientClass.ob_type = &PyType_Type;
414 CXFormClass.ob_type = &PyType_Type;
415 BBoxClass.ob_type = &PyType_Type;
416 MatrixClass.ob_type = &PyType_Type;
417 return primitive_methods;