X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fpython%2Fprimitives.c;h=e70f28d8ace0bddb5cb3cf82e41e66976136fd3b;hb=dbf4023f60d7e0627bdc81941e4dddcbd9e77986;hp=aba757e23fa6421764c915aff3369afaa489d7b9;hpb=a18cdd835cad27c679d6a9659836f035fc3a0b5c;p=swftools.git diff --git a/lib/python/primitives.c b/lib/python/primitives.c index aba757e..e70f28d 100644 --- a/lib/python/primitives.c +++ b/lib/python/primitives.c @@ -41,6 +41,7 @@ PyObject* f_Color(PyObject* self, PyObject* args, PyObject* kwargs) if (!PyArg_ParseTupleAndKeywords(args, kwargs, "iii|i", kwlist, &r,&g,&b,&a)) return NULL; color = PyObject_New(ColorObject, &ColorClass); + mylog("+%08x(%d) color_new(%d,%d,%d,%d)\n", (int)color, color->ob_refcnt, r,g,b,a); color->rgba.r = r; color->rgba.g = g; color->rgba.b = b; @@ -92,6 +93,11 @@ RGBA color_getRGBA(PyObject*self) } return color->rgba; } +void color_dealloc(PyObject* self) +{ + mylog("-%08x(%d) color_dealloc\n", (int)self, self->ob_refcnt); + PyObject_Del(self); +} PyTypeObject ColorClass = { PyObject_HEAD_INIT(NULL) @@ -99,7 +105,7 @@ PyTypeObject ColorClass = tp_name: "Color", tp_basicsize: sizeof(ColorObject), tp_itemsize: 0, - tp_dealloc: dummy_dealloc, + tp_dealloc: color_dealloc, tp_print: 0, tp_getattr: color_getattr, tp_setattr: color_setattr, @@ -109,18 +115,34 @@ typedef struct { PyObject_HEAD SRECT bbox; } BBoxObject; +//void swf_ExpandRect(SRECT*src, SPOINT add); +//void swf_ExpandRect2(SRECT*src, SRECT*add); PyObject* f_BBox(PyObject* self, PyObject* args, PyObject* kwargs) { static char *kwlist[] = {"xmin", "ymin", "xmax", "ymax", NULL}; BBoxObject* bbox; + float xmin,ymin,xmax,ymax; + if(!kwargs) { + if (!PyArg_ParseTuple(args, "ffff", &xmin, &ymin, &xmax, &ymax)) + return NULL; + } else { + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ffff", kwlist, &xmin, &ymin, &xmax, &ymax)) + return NULL; + } SRECT box; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "iiii", kwlist, - &box.xmin, - &box.ymin, - &box.xmax, - &box.ymax)); - return NULL; + box.xmin = (int)(xmin*20); + box.ymin = (int)(ymin*20); + box.xmax = (int)(xmax*20); + box.ymax = (int)(ymax*20); + 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); + bbox = PyObject_New(BBoxObject, &BBoxClass); + bbox->bbox = box; + return (PyObject*)bbox; +} +PyObject* f_BBox2(SRECT box) +{ + BBoxObject* bbox; bbox = PyObject_New(BBoxObject, &BBoxClass); bbox->bbox = box; return (PyObject*)bbox; @@ -129,13 +151,13 @@ static PyObject* bbox_getattr(PyObject * self, char* a) { BBoxObject*bbox = (BBoxObject*)self; if(!strcmp(a, "xmin")) { - return Py_BuildValue("i", bbox->bbox.xmin); + return Py_BuildValue("f", bbox->bbox.xmin/20.0); } else if(!strcmp(a, "ymin")) { - return Py_BuildValue("i", bbox->bbox.ymin); + return Py_BuildValue("f", bbox->bbox.ymin/20.0); } else if(!strcmp(a, "xmax")) { - return Py_BuildValue("i", bbox->bbox.xmax); + return Py_BuildValue("f", bbox->bbox.xmax/20.0); } else if(!strcmp(a, "ymax")) { - return Py_BuildValue("i", bbox->bbox.ymax); + return Py_BuildValue("f", bbox->bbox.ymax/20.0); } return NULL; } @@ -143,23 +165,36 @@ static int bbox_setattr(PyObject * self, char* a, PyObject* o) { BBoxObject*bbox= (BBoxObject*)self; if(!strcmp(a, "xmin")) { - if (!PyArg_Parse(o, "i", &bbox->bbox.xmin)) goto err; + float xmin; + if (!PyArg_Parse(o, "i", &xmin)) goto err; + bbox->bbox.xmin = (int)(xmin*20); return 0; } else if(!strcmp(a, "ymin")) { - if (!PyArg_Parse(o, "i", &bbox->bbox.ymin)) goto err; + float ymin; + if (!PyArg_Parse(o, "i", &ymin)) goto err; + bbox->bbox.ymin = (int)(ymin*20); return 0; } else if(!strcmp(a, "xmax")) { - if (!PyArg_Parse(o, "i", &bbox->bbox.xmax)) goto err; + float xmax; + if (!PyArg_Parse(o, "i", &xmax)) goto err; + bbox->bbox.xmax = (int)(xmax*20); return 0; } else if(!strcmp(a, "ymax")) { - if (!PyArg_Parse(o, "i", &bbox->bbox.ymax)) goto err; + float ymax; + if (!PyArg_Parse(o, "i", &ymax)) goto err; + bbox->bbox.ymax = (int)(ymax*20); return 0; } err: mylog("swf_setattr %08x(%d) %s = ? (%08x)\n", (int)self, self->ob_refcnt, a, o); return 1; } -SRECT bbox_getBBox(PyObject*self) +void bbox_dealloc(PyObject* self) +{ + mylog("-%08x(%d) bbox_dealloc\n", (int)self, self->ob_refcnt); + PyObject_Del(self); +} +SRECT bbox_getSRECT(PyObject*self) { BBoxObject*bbox= 0; if (!PyArg_Parse(self, "O!", &BBoxClass, &bbox)) { @@ -177,7 +212,7 @@ PyTypeObject BBoxClass = tp_name: "BBox", tp_basicsize: sizeof(BBoxObject), tp_itemsize: 0, - tp_dealloc: dummy_dealloc, + tp_dealloc: bbox_dealloc, tp_print: 0, tp_getattr: bbox_getattr, tp_setattr: bbox_setattr, @@ -189,29 +224,66 @@ typedef struct { MATRIX matrix; } MatrixObject; -PyObject* f_Matrix(PyObject* self, PyObject* args, PyObject* kwargs) +PyObject* f_Matrix(PyObject* _self, PyObject* args, PyObject* kwargs) { - return NULL; + PyObject*self = (PyObject*)PyObject_New(MatrixObject, &MatrixClass); + MatrixObject*matrix = (MatrixObject*)self; + mylog("+%08x(%d) f_Matrix", self, self->ob_refcnt); + static char *kwlist[] = {"x", "y", "scale", "rotate", "pivotx", "pivoty", NULL}; + float x=0,y=0,scale=1.0,rotate=0,pivotx,pivoty; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|ffffff", kwlist, &x,&y,&scale,&rotate,&pivotx,&pivoty)) + return NULL; + mylog(" %08x(%d) f_Matrix: x=%f y=%f scale=%f rotate=%f", self, self->ob_refcnt, x,y,scale,rotate); + swf_GetMatrix(0, &matrix->matrix); + + matrix->matrix.tx = (int)(x*20); + matrix->matrix.ty = (int)(y*20); + + if(!rotate) { + matrix->matrix.sx = (int)(scale*65536); + matrix->matrix.sy = (int)(scale*65536); + } else { + matrix->matrix.sx = (int)(scale*cos(rotate)*65536); + matrix->matrix.sy = (int)(scale*cos(rotate)*65536); + matrix->matrix.r0 = (int)(scale*sin(rotate)*65536); + matrix->matrix.r1 = (int)(-scale*sin(rotate)*65536); + } + if(pivotx || pivoty) { + SPOINT p,d; + p.x = (int)(pivotx*20); + p.y = (int)(pivoty*20); + p = swf_TurnPoint(p, &matrix->matrix); + matrix->matrix.tx += matrix->matrix.tx-p.x; + matrix->matrix.ty += matrix->matrix.ty-p.y; + } + + /* TODO: rotate */ + return self; } static PyObject* matrix_getattr(PyObject * self, char* a) { + PY_ASSERT_TYPE(self,&MatrixClass); return NULL; } static int matrix_setattr(PyObject * self, char* a, PyObject* o) { + PY_ASSERT_TYPE(self,&MatrixClass); return 0; } MATRIX matrix_getMatrix(PyObject*self) { - MatrixObject*matrix= 0; - if (!PyArg_Parse(self, "O!", &MatrixClass, &matrix)) { - MATRIX dummy; - memset(&dummy, 0, sizeof(dummy)); - mylog("Error: wrong type for function color_getRGBA"); - return dummy; - } + mylog(" %08x(%d) matrix_getMatrix", self, self->ob_refcnt); + PY_ASSERT_TYPE(self,&MatrixClass); + MatrixObject*matrix = (MatrixObject*)self; return matrix->matrix; } +void matrix_dealloc(PyObject* self) +{ + mylog("-%08x(%d) matrix_dealloc", self, self->ob_refcnt); + PyObject_Del(self); +} +//SPOINT swf_TurnPoint(SPOINT p, MATRIX* m); +//SRECT swf_TurnRect(SRECT r, MATRIX* m); PyTypeObject MatrixClass = { PyObject_HEAD_INIT(NULL) @@ -219,7 +291,7 @@ PyTypeObject MatrixClass = tp_name: "Matrix", tp_basicsize: sizeof(MatrixObject), tp_itemsize: 0, - tp_dealloc: dummy_dealloc, + tp_dealloc: matrix_dealloc, tp_print: 0, tp_getattr: matrix_getattr, tp_setattr: matrix_setattr, @@ -261,6 +333,11 @@ CXFORM colortransform_getCXForm(PyObject*self) } return cxform->cxform; } +void colortransform_dealloc(PyObject* self) +{ + mylog("-%08x(%d) colortransform_dealloc", self, self->ob_refcnt); + PyObject_Del(self); +} PyTypeObject CXFormClass = { PyObject_HEAD_INIT(NULL) @@ -268,7 +345,7 @@ PyTypeObject CXFormClass = tp_name: "ColorTransform", tp_basicsize: sizeof(CXFormObject), tp_itemsize: 0, - tp_dealloc: dummy_dealloc, + tp_dealloc: colortransform_dealloc, tp_print: 0, tp_getattr: colortransform_getattr, tp_setattr: colortransform_setattr, @@ -291,7 +368,7 @@ static int gradient_setattr(PyObject * self, char* a, PyObject* o) { return 0; } -GRADIENT colortransform_getGradient(PyObject*self) +GRADIENT gradient_getGradient(PyObject*self) { GradientObject*gradient = 0; if (!PyArg_Parse(self, "O!", &gradient, &gradient)) { @@ -302,6 +379,11 @@ GRADIENT colortransform_getGradient(PyObject*self) } return gradient->gradient; } +void gradient_dealloc(PyObject* self) +{ + mylog("-%08x(%d) gradient_dealloc", self, self->ob_refcnt); + PyObject_Del(self); +} PyTypeObject GradientClass = { PyObject_HEAD_INIT(NULL) @@ -309,7 +391,7 @@ PyTypeObject GradientClass = tp_name: "Gradient", tp_basicsize: sizeof(GradientObject), tp_itemsize: 0, - tp_dealloc: dummy_dealloc, + tp_dealloc: gradient_dealloc, tp_print: 0, tp_getattr: gradient_getattr, tp_setattr: gradient_setattr,