summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShyouzou Sugitani <shy@users.sourceforge.jp>2016-06-06 12:26:44 +0200
committerChristoph Reiter <creiter@src.gnome.org>2017-03-20 17:02:57 +0100
commit7a3e4c005a6677ed7bf3ef807cd1a8487b0465de (patch)
treebb85499cb0c20e4db00f3039333a21c689ab0212
parentbb5aa249f1ab6be81f88fdcfb56cee8b3ae2465d (diff)
downloadpygobject-7a3e4c005a6677ed7bf3ef807cd1a8487b0465de.tar.gz
Add a foreign type for cairo_region_t.
Based on the patch at https://bugzilla.gnome.org/show_bug.cgi?id=667959#c7 * Rebased on master * Fixes the cairo_region_from_arg signature * Add check for pycairo region support (only in pycairo master) * Add some tests Co-Authored-By: Martin Pitt <martin.pitt@ubuntu.com> Co-Authored-By: Christoph Reiter <creiter@src.gnome.org> https://bugzilla.gnome.org/show_bug.cgi?id=667959
-rw-r--r--gi/pygi-foreign-cairo.c51
-rw-r--r--tests/test_cairo.py28
2 files changed, 77 insertions, 2 deletions
diff --git a/gi/pygi-foreign-cairo.c b/gi/pygi-foreign-cairo.c
index 8e765298..3ad3a990 100644
--- a/gi/pygi-foreign-cairo.c
+++ b/gi/pygi-foreign-cairo.c
@@ -367,6 +367,49 @@ cairo_pattern_from_gvalue (const GValue *value)
return PycairoPattern_FromPattern (pattern, NULL);
}
+#if PY_VERSION_HEX >= 0x03000000 && defined(PycairoRegion_Type)
+
+static PyObject *
+cairo_region_to_arg (PyObject *value,
+ GIInterfaceInfo *interface_info,
+ GITransfer transfer,
+ GIArgument *arg)
+{
+ cairo_region_t *region;
+
+ g_assert (transfer == GI_TRANSFER_NOTHING);
+
+ region = ( (PycairoRegion*) value)->region;
+ if (!region) {
+ PyErr_SetString (PyExc_ValueError, "Region instance wrapping a NULL region");
+ return NULL;
+ }
+
+ arg->v_pointer = region;
+ Py_RETURN_NONE;
+}
+
+static PyObject *
+cairo_region_from_arg (GIInterfaceInfo *interface_info,
+ GITransfer transfer,
+ gpointer data)
+{
+ cairo_region_t *region = (cairo_region_t*) data;
+
+ if (transfer == GI_TRANSFER_NOTHING)
+ cairo_region_reference (region);
+
+ return PycairoRegion_FromRegion (region);
+}
+
+static PyObject *
+cairo_region_release (GIBaseInfo *base_info,
+ gpointer struct_)
+{
+ cairo_region_destroy ( (cairo_region_t*) struct_);
+ Py_RETURN_NONE;
+}
+#endif
static PyMethodDef _gi_cairo_functions[] = { {0,} };
PYGLIB_MODULE_START(_gi_cairo, "_gi_cairo")
@@ -406,6 +449,14 @@ PYGLIB_MODULE_START(_gi_cairo, "_gi_cairo")
cairo_font_options_from_arg,
cairo_font_options_release);
+#if PY_VERSION_HEX >= 0x03000000 && defined(PycairoRegion_Type)
+ pygi_register_foreign_struct ("cairo",
+ "Region",
+ cairo_region_to_arg,
+ cairo_region_from_arg,
+ cairo_region_release);
+#endif
+
pyg_register_gtype_custom (CAIRO_GOBJECT_TYPE_CONTEXT,
cairo_context_from_gvalue,
cairo_context_to_gvalue);
diff --git a/tests/test_cairo.py b/tests/test_cairo.py
index fdf86a29..02049c08 100644
--- a/tests/test_cairo.py
+++ b/tests/test_cairo.py
@@ -14,11 +14,14 @@ try:
except ImportError:
has_cairo = False
+has_region = has_cairo and hasattr(cairo, "Region")
+
try:
- from gi.repository import Gtk
- Gtk # pyflakes
+ from gi.repository import Gtk, Gdk
+ Gtk, Gdk # pyflakes
except:
Gtk = None
+ Gdk = None
from gi.repository import GObject
@@ -67,6 +70,27 @@ class Test(unittest.TestCase):
@unittest.skipUnless(has_cairo, 'built without cairo support')
+@unittest.skipUnless(has_region, 'built without cairo.Region support')
+@unittest.skipUnless(Gdk, 'Gdk not available')
+class TestRegion(unittest.TestCase):
+
+ def test_region_to_py(self):
+ surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 10, 10)
+ context = cairo.Context(surface)
+ context.paint()
+ region = Gdk.cairo_region_create_from_surface(surface)
+ r = region.get_extents()
+ self.assertEqual((r.height, r.width), (10, 10))
+
+ def test_region_from_py(self):
+ surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 10, 10)
+ context = cairo.Context(surface)
+ region = cairo.Region(cairo.RectangleInt(0, 0, 42, 42))
+ Gdk.cairo_region(context, region)
+ self.assertTrue("42" in repr(list(context.copy_path())))
+
+
+@unittest.skipUnless(has_cairo, 'built without cairo support')
@unittest.skipUnless(Gtk, 'Gtk not available')
class TestPango(unittest.TestCase):
def test_cairo_font_options(self):