Blob Blame History Raw
From 89443af3d84317177f400da1e814fbe845e000e5 Mon Sep 17 00:00:00 2001
From: John (J5) Palmieri <johnp@redhat.com>
Date: Mon, 25 Oct 2010 17:49:57 -0400
Subject: [PATCH] wrap cairo_rectangle_int_t

https://bugs.freedesktop.org/show_bug.cgi?id=31111
---
 src/cairomodule.c |    9 +++
 src/private.h     |    3 +
 src/py3cairo.h    |   11 +++
 src/rectangle.c   |  203 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/wscript       |    1 +
 test/api_test.py  |   11 +++
 6 files changed, 238 insertions(+), 0 deletions(-)
 create mode 100644 src/rectangle.c

diff --git a/src/cairomodule.c b/src/cairomodule.c
index 58e665c..39cd1cb 100644
--- a/src/cairomodule.c
+++ b/src/cairomodule.c
@@ -97,6 +97,9 @@ static Pycairo_CAPI_t CAPI = {
   &PycairoRadialGradient_Type,
   PycairoPattern_FromPattern,
 
+  &PycairoRectangleInt_Type,
+  PycairoRectangleInt_FromRectangleInt,
+
   &PycairoScaledFont_Type,
   PycairoScaledFont_FromScaledFont,
 
@@ -266,6 +269,8 @@ PyInit__cairo(void)
     return NULL;
 #endif
 
+  if (PyType_Ready(&PycairoRectangleInt_Type) < 0)
+    return NULL;
 
   PyObject *m = PyModule_Create(&cairomodule);
   //PyObject *m;
@@ -335,6 +340,10 @@ PyInit__cairo(void)
   Py_INCREF(&PycairoSurface_Type);
   PyModule_AddObject(m, "Surface", (PyObject *)&PycairoSurface_Type);
 
+  Py_INCREF(&PycairoRectangleInt_Type);
+  PyModule_AddObject(m, "RectangleInt",
+                     (PyObject *)&PycairoRectangleInt_Type);  
+
 #ifdef CAIRO_HAS_IMAGE_SURFACE
   Py_INCREF(&PycairoImageSurface_Type);
   PyModule_AddObject(m, "ImageSurface",
diff --git a/src/private.h b/src/private.h
index ba59daf..3fba518 100644
--- a/src/private.h
+++ b/src/private.h
@@ -61,6 +61,9 @@ extern PyTypeObject PycairoRadialGradient_Type;
 PyObject *PycairoPattern_FromPattern (cairo_pattern_t *pattern,
 				      PyObject *base);
 
+extern PyTypeObject PycairoRectangleInt_Type;
+PyObject *PycairoRectangleInt_FromRectangleInt (cairo_rectangle_int_t *rectangle_int);
+
 extern PyTypeObject PycairoScaledFont_Type;
 PyObject *PycairoScaledFont_FromScaledFont (cairo_scaled_font_t *scaled_font);
 
diff --git a/src/py3cairo.h b/src/py3cairo.h
index 35b4240..7d86b84 100644
--- a/src/py3cairo.h
+++ b/src/py3cairo.h
@@ -67,6 +67,11 @@ typedef struct {
 
 typedef struct {
   PyObject_HEAD
+  cairo_rectangle_int_t *rectangle_int;
+} PycairoRectangleInt;
+
+typedef struct {
+  PyObject_HEAD
   cairo_scaled_font_t *scaled_font;
 } PycairoScaledFont;
 
@@ -113,6 +118,9 @@ typedef struct {
   PyTypeObject *RadialGradient_Type;
   PyObject *(*Pattern_FromPattern)(cairo_pattern_t *pattern, PyObject *base);
 
+  PyTypeObject *RectangleInt_Type;
+  PyObject *(*RectangleInt_FromRectangleInt)(cairo_rectangle_int_t *rectangle_int);
+
   PyTypeObject *ScaledFont_Type;
   PyObject *(*ScaledFont_FromScaledFont)(cairo_scaled_font_t *scaled_font);
 
@@ -156,6 +164,9 @@ typedef struct {
 #define PycairoRadialGradient_Type  *(Pycairo_CAPI->RadialGradient_Type)
 #define PycairoPattern_FromPattern   (Pycairo_CAPI->Pattern_FromPattern)
 
+#define PycairoRectangleInt_Type  *(Pycairo_CAPI->RectangleInt_Type)
+#define PycairoRectangleInt_FromRectangleInt (Pycairo_CAPI->RectangleInt_FromRectangleInt)
+
 #define PycairoScaledFont_Type      *(Pycairo_CAPI->ScaledFont_Type)
 #define PycairoScaledFont_FromScaledFont \
                                      (Pycairo_CAPI->ScaledFont_FromScaledFont)
diff --git a/src/rectangle.c b/src/rectangle.c
new file mode 100644
index 0000000..903e903
--- /dev/null
+++ b/src/rectangle.c
@@ -0,0 +1,203 @@
+/* -*- mode: C; c-basic-offset: 2 -*-
+ *
+ * Copyright © 2005,2010 Steve Chaplin, John (J5) Palmieri
+ *
+ * This file is part of pycairo.
+ *
+ * Pycairo is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License version 3 as published
+ * by the Free Software Foundation.
+ *
+ * Pycairo is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with pycairo. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#define PY_SSIZE_T_CLEAN
+#include <Python.h>
+#include <string.h>
+
+#include "config.h"
+#include "private.h"
+
+/* PycairoRectangleInt object
+ */
+
+static PyObject *
+rectangle_int_new(PyTypeObject *type, PyObject *args, PyObject *kwds) {
+  PycairoRectangleInt *ri_obj;
+  PyObject *obj = type->tp_alloc(type, 0);
+  if (!obj)
+      return NULL;
+  
+  ri_obj = (PycairoRectangleInt *)obj;
+  ri_obj->rectangle_int = malloc(sizeof(cairo_rectangle_int_t));
+  if (!ri_obj) {
+    Py_DECREF(obj);
+    PyErr_NoMemory();
+    return NULL;
+  }
+
+  return obj;
+
+}
+
+/* PycairoRectangleInt_FromRectangleInt
+ * Create a new PycairoRectangleInt from a cairo_rectangle_int_t
+ * rectangle_int - a cairo_rectangle_int_t to 'wrap' into a Python object.
+ *        rectangle_int is unreferenced if the PycairoRectangleInt creation 
+ *        fails, or if rectangle_int is in an error status.
+ * Return value: New reference or NULL on failure
+ */
+PyObject *
+PycairoRectangleInt_FromRectangleInt (cairo_rectangle_int_t *rectangle_int) {
+  PyObject *o;
+
+  assert (rectangle_int != NULL);
+
+  o = rectangle_int_new(&PycairoRectangleInt_Type, NULL, NULL);
+  if (o) {
+    memcpy(((PycairoRectangleInt *)o)->rectangle_int, 
+           rectangle_int, 
+           sizeof(cairo_rectangle_int_t));
+  }
+
+  return o;
+}
+
+static void
+rectangle_int_dealloc(PycairoRectangleInt *o) {
+#ifdef DEBUG
+  printf("rectangle_int_dealloc start\n");
+#endif
+  if (o->rectangle_int) {
+    free(o->rectangle_int);
+    o->rectangle_int = NULL;
+  }
+  Py_TYPE(o)->tp_free(o);
+#ifdef DEBUG
+  printf("rectangle_int_dealloc end\n");
+#endif
+}
+
+static PyObject *
+rectangle_int_get_x(PycairoRectangleInt *self, void *closure) {
+    return PyLong_FromLong(self->rectangle_int->x);
+}
+
+static int
+rectangle_int_set_x(PycairoRectangleInt *self, PyObject *value, void *closure) {
+    if (!PyLong_Check(value)) {
+        PyErr_SetString(PyExc_TypeError, "type mismatch: the 'x' member must be set to an integer");
+        return -1;
+    }
+
+    self->rectangle_int->x = PyLong_AsLong(value);
+
+    return 0;
+}
+
+static PyObject *
+rectangle_int_get_y(PycairoRectangleInt *self, void *closure) {
+    return PyLong_FromLong(self->rectangle_int->y);
+}
+
+static int
+rectangle_int_set_y(PycairoRectangleInt *self, PyObject *value, void *closure) {
+    if (!PyLong_Check(value)) {
+        PyErr_SetString(PyExc_TypeError, "type mismatch: the 'y' member must be set to an integer");
+        return -1;
+    }
+
+    self->rectangle_int->y = PyLong_AsLong(value);
+
+    return 0;
+}
+
+static PyObject *
+rectangle_int_get_height(PycairoRectangleInt *self, void *closure) {
+    return PyLong_FromLong(self->rectangle_int->height);
+}
+
+static int
+rectangle_int_set_height(PycairoRectangleInt *self, PyObject *value, void *closure) {
+    if (!PyLong_Check(value)) {
+        PyErr_SetString(PyExc_TypeError, "type mismatch: the 'height' member must be set to an integer");
+        return -1;
+    }
+
+    self->rectangle_int->height = PyLong_AsLong(value);
+
+    return 0;
+}
+
+
+static PyObject *
+rectangle_int_get_width(PycairoRectangleInt *self, void *closure) {
+    return PyLong_FromLong(self->rectangle_int->width);
+}
+
+static int
+rectangle_int_set_width(PycairoRectangleInt *self, PyObject *value, void *closure) {
+    if (!PyLong_Check(value)) {
+        PyErr_SetString(PyExc_TypeError, "type mismatch: the 'width' member must be set to an integer");
+        return -1;
+    }
+
+    self->rectangle_int->width = PyLong_AsLong(value);
+
+    return 0;
+}
+
+static PyGetSetDef rectangle_int_getset_funcs[] = {
+    { "x", (getter)rectangle_int_get_x, (setter)rectangle_int_set_x }, 
+    { "y", (getter)rectangle_int_get_y, (setter)rectangle_int_set_y }, 
+    { "height", (getter)rectangle_int_get_height, (setter)rectangle_int_set_height },
+    { "width", (getter)rectangle_int_get_width, (setter)rectangle_int_set_width },
+    { NULL, 0, 0 } 
+};
+
+PyTypeObject PycairoRectangleInt_Type = {
+  PyVarObject_HEAD_INIT(&PyType_Type, 0)
+  "cairo.RectangleInt",			/* tp_name */
+  sizeof(PycairoRectangleInt),		/* tp_basicsize */
+  0,					/* tp_itemsize */
+  (destructor)rectangle_int_dealloc,	/* tp_dealloc */
+  0,					/* tp_print */
+  0,					/* tp_getattr */
+  0,					/* tp_setattr */
+  0,					/* tp_compare */
+  0,		                	/* tp_repr */
+  0,					/* tp_as_number */
+  0,              			/* tp_as_sequence */
+  0,					/* tp_as_mapping */
+  0,					/* tp_hash */
+  0,					/* tp_call */
+  0,					/* tp_str */
+  0,	                        	/* tp_getattro */
+  0,					/* tp_setattro */
+  0,					/* tp_as_buffer */
+  Py_TPFLAGS_DEFAULT,			/* tp_flags */
+  0,      				/* tp_doc */
+  0,					/* tp_traverse */
+  0,					/* tp_clear */
+  0,					/* tp_richcompare */
+  0,					/* tp_weaklistoffset */
+  0,			   		/* tp_iter */
+  0,					/* tp_iternext */
+  0,			        	/* tp_methods */
+  0,					/* tp_members */
+  rectangle_int_getset_funcs,		/* tp_getset */
+  0,                                    /* tp_base */
+  0,					/* tp_dict */
+  0,					/* tp_descr_get */
+  0,					/* tp_descr_set */
+  0,					/* tp_dictoffset */
+  0,					/* tp_init */
+  0,					/* tp_alloc */
+  (newfunc)rectangle_int_new,      	/* tp_new */
+};
diff --git a/src/wscript b/src/wscript
index d30c6ad..01d79ff 100644
--- a/src/wscript
+++ b/src/wscript
@@ -27,6 +27,7 @@ def build(ctx):
                     'pattern.c',
                     'matrix.c',
                     'surface.c',
+                    'rectangle.c',
                     ],
     target       = '_cairo',
     includes     = '.',
diff --git a/test/api_test.py b/test/api_test.py
index c83bf99..343531d 100644
--- a/test/api_test.py
+++ b/test/api_test.py
@@ -81,6 +81,17 @@ def test_surface():
     f, w, h = tfi.TemporaryFile(mode='w+b'), 100, 100
     s = cairo.SVGSurface(f, w, h)
 
+def test_rectangle_int():
+    ri = cairo.RectangleInt()
+    ri.x = 5
+    ri.y = 14
+    ri.height = 764
+    ri.width = 1080
+
+    assert ri.x == 5
+    assert ri.y == 14
+    assert ri.height = 764
+    assert ri.width = 1080
 
 def test_text():
   pass
-- 
1.7.2.3