Imported Upstream version 3.3.1
[platform/upstream/pygobject2.git] / gi / pygi-foreign-cairo.c
index 682cee2..4e12df3 100644 (file)
  * IN THE SOFTWARE.
  */
 
-#include <Python.h>
 #include <cairo.h>
+#include <Python.h>
 
 #if PY_VERSION_HEX < 0x03000000
 #include <pycairo.h>
-static Pycairo_CAPI_t *Pycairo_CAPI;
 #else
-#include <py3cairo.h>
+#include <pycairo/py3cairo.h>
 #endif
 
-#include <cairo-gobject.h>
+static Pycairo_CAPI_t *Pycairo_CAPI;
 
-/* Limit includes from PyGI to APIs which do not have link dependencies
- * (pygobject.h and pygi-foreign-api.h) since _gi_cairo is built as a separate
- * shared library that interacts with PyGI through a PyCapsule API at runtime.
- */
-#include <pygi-foreign-api.h>
-#include <pyglib-python-compat.h>
+#include "pygi-foreign.h"
 
-/*
- * cairo_t marshaling
- */
+#include <pyglib-python-compat.h>
 
-static PyObject *
+PyObject *
 cairo_context_to_arg (PyObject        *value,
                       GIInterfaceInfo *interface_info,
                       GITransfer       transfer,
@@ -63,21 +55,17 @@ cairo_context_to_arg (PyObject        *value,
     Py_RETURN_NONE;
 }
 
-static PyObject *
-cairo_context_from_arg (GIInterfaceInfo *interface_info,
-                        GITransfer       transfer,
-                        gpointer         data)
+PyObject *
+cairo_context_from_arg (GIInterfaceInfo *interface_info, gpointer data)
 {
     cairo_t *context = (cairo_t*) data;
 
-    if (transfer == GI_TRANSFER_NOTHING)
-        cairo_reference (context);
+    cairo_reference (context);
 
     return PycairoContext_FromContext (context, &PycairoContext_Type, NULL);
 }
 
-
-static PyObject *
+PyObject *
 cairo_context_release (GIBaseInfo *base_info,
                        gpointer    struct_)
 {
@@ -85,38 +73,8 @@ cairo_context_release (GIBaseInfo *base_info,
     Py_RETURN_NONE;
 }
 
-static int
-cairo_context_to_gvalue (GValue *value, PyObject *obj)
-{
-    cairo_t *cr = PycairoContext_GET (obj);
-    if (!cr) {
-        return -1;
-    }
-
-    /* PycairoContext_GET returns a borrowed reference, use set_boxed
-     * to add new ref to the context which will be managed by the GValue. */
-    g_value_set_boxed (value, cr);
-    return 0;
-}
-
-static PyObject *
-cairo_context_from_gvalue (const GValue *value)
-{
-    /* PycairoContext_FromContext steals a ref, so we dup it out of the GValue. */
-    cairo_t *cr = g_value_dup_boxed (value);
-    if (!cr) {
-        return NULL;
-    }
-
-    return PycairoContext_FromContext (cr, &PycairoContext_Type, NULL);
-}
-
-
-/*
- * cairo_surface_t marshaling
- */
 
-static PyObject *
+PyObject *
 cairo_surface_to_arg (PyObject        *value,
                       GIInterfaceInfo *interface_info,
                       GITransfer       transfer,
@@ -136,20 +94,17 @@ cairo_surface_to_arg (PyObject        *value,
     Py_RETURN_NONE;
 }
 
-static PyObject *
-cairo_surface_from_arg (GIInterfaceInfo *interface_info,
-                        GITransfer       transfer,
-                        gpointer         data)
+PyObject *
+cairo_surface_from_arg (GIInterfaceInfo *interface_info, gpointer data)
 {
     cairo_surface_t *surface = (cairo_surface_t*) data;
 
-    if (transfer == GI_TRANSFER_NOTHING)
-        cairo_surface_reference (surface);
+    cairo_surface_reference (surface);
 
     return PycairoSurface_FromSurface (surface, NULL);
 }
 
-static PyObject *
+PyObject *
 cairo_surface_release (GIBaseInfo *base_info,
                        gpointer    struct_)
 {
@@ -157,274 +112,18 @@ cairo_surface_release (GIBaseInfo *base_info,
     Py_RETURN_NONE;
 }
 
-static int
-cairo_surface_to_gvalue (GValue *value, PyObject *obj)
-{
-    cairo_surface_t *surface = ((PycairoSurface*) obj)->surface;
-    if (!surface) {
-        return -1;
-    }
-
-    /* surface is a borrowed reference, use set_boxed
-     * to add new ref to the context which will be managed by the GValue. */
-    g_value_set_boxed (value, surface);
-    return 0;
-}
-
-static PyObject *
-cairo_surface_from_gvalue (const GValue *value)
-{
-    /* PycairoSurface_FromSurface steals a ref, so we dup it out of the GValue. */
-    cairo_surface_t *surface = g_value_dup_boxed (value);
-    if (!surface) {
-        return NULL;
-    }
-
-    return PycairoSurface_FromSurface (surface, NULL);
-}
-
-
-/*
- * cairo_path_t marshaling
- */
-
-static PyObject *
-cairo_path_to_arg (PyObject        *value,
-                   GIInterfaceInfo *interface_info,
-                   GITransfer       transfer,
-                   GIArgument      *arg)
-{
-    cairo_path_t *path;
-
-    g_assert (transfer == GI_TRANSFER_NOTHING);
-
-    path = ( (PycairoPath*) value)->path;
-    if (!path) {
-        PyErr_SetString (PyExc_ValueError, "Path instance wrapping a NULL path");
-        return NULL;
-    }
-
-    arg->v_pointer = path;
-    Py_RETURN_NONE;
-}
-
-static PyObject *
-cairo_path_from_arg (GIInterfaceInfo *interface_info,
-                     GITransfer       transfer,
-                     gpointer         data)
-{
-    cairo_path_t *path = (cairo_path_t*) data;
-
-    if (transfer == GI_TRANSFER_NOTHING) {
-        PyErr_SetString(PyExc_TypeError, "Unsupported annotation (transfer none) for cairo.Path return");
-        return NULL;
-    }
-
-    return PycairoPath_FromPath (path);
-}
-
-static PyObject *
-cairo_path_release (GIBaseInfo *base_info,
-                    gpointer    struct_)
-{
-    cairo_path_destroy ( (cairo_path_t*) struct_);
-    Py_RETURN_NONE;
-}
-
-
-/*
- * cairo_font_face_t marshaling
- */
-
-static int
-cairo_font_face_to_gvalue (GValue *value, PyObject *obj)
-{
-    cairo_font_face_t *font_face = ((PycairoFontFace*) obj)->font_face;
-    if (!font_face) {
-        return -1;
-    }
-
-    g_value_set_boxed (value, font_face);
-    return 0;
-}
-
-static PyObject *
-cairo_font_face_from_gvalue (const GValue *value)
-{
-    cairo_font_face_t *font_face = g_value_dup_boxed (value);
-    if (!font_face) {
-        return NULL;
-    }
-
-    return PycairoFontFace_FromFontFace (font_face);
-}
-
-
-/*
- * cairo_font_options_t marshaling
- */
-
-static PyObject *
-cairo_font_options_to_arg (PyObject        *value,
-                           GIInterfaceInfo *interface_info,
-                           GITransfer       transfer,
-                           GIArgument      *arg)
-{
-    cairo_font_options_t *font_options;
-
-    g_assert (transfer == GI_TRANSFER_NOTHING);
-
-    font_options = ( (PycairoFontOptions*) value)->font_options;
-    if (!font_options) {
-        PyErr_SetString (PyExc_ValueError, "FontOptions instance wrapping a NULL font_options");
-        return NULL;
-    }
-
-    arg->v_pointer = font_options;
-    Py_RETURN_NONE;
-}
-
-static PyObject *
-cairo_font_options_from_arg (GIInterfaceInfo *interface_info,
-                             GITransfer       transfer,
-                             gpointer         data)
-{
-    cairo_font_options_t *font_options = (cairo_font_options_t*) data;
-
-    if (transfer == GI_TRANSFER_NOTHING)
-        font_options = cairo_font_options_copy (font_options);
-
-    return PycairoFontOptions_FromFontOptions (font_options);
-}
-
-static PyObject *
-cairo_font_options_release (GIBaseInfo *base_info,
-                            gpointer    struct_)
-{
-    cairo_font_options_destroy ( (cairo_font_options_t*) struct_);
-    Py_RETURN_NONE;
-}
-
-
-/*
- * scaled_font_t marshaling
- */
-
-static int
-cairo_scaled_font_to_gvalue (GValue *value, PyObject *obj)
-{
-    cairo_scaled_font_t *scaled_font = ((PycairoScaledFont*) obj)->scaled_font;
-    if (!scaled_font) {
-        return -1;
-    }
-
-    /* scaled_font is a borrowed reference, use set_boxed
-     * to add new ref to the context which will be managed by the GValue. */
-    g_value_set_boxed (value, scaled_font);
-    return 0;
-}
-
-static PyObject *
-cairo_scaled_font_from_gvalue (const GValue *value)
-{
-    /* PycairoScaledFont_FromScaledFont steals a ref, so we dup it out of the GValue. */
-    cairo_scaled_font_t *scaled_font = g_value_dup_boxed (value);
-    if (!scaled_font) {
-        return NULL;
-    }
-
-    return PycairoScaledFont_FromScaledFont (scaled_font);
-}
-
-
-/*
- * cairo_pattern_t marshaling
- */
-
-static int
-cairo_pattern_to_gvalue (GValue *value, PyObject *obj)
-{
-    cairo_pattern_t *pattern = ((PycairoPattern*) obj)->pattern;
-    if (!pattern) {
-        return -1;
-    }
-
-    /* pattern is a borrowed reference, use set_boxed
-     * to add new ref to the context which will be managed by the GValue. */
-    g_value_set_boxed (value, pattern);
-    return 0;
-}
-
-static PyObject *
-cairo_pattern_from_gvalue (const GValue *value)
-{
-    /* PycairoPattern_FromPattern steals a ref, so we dup it out of the GValue. */
-    cairo_pattern_t *pattern = g_value_dup_boxed (value);
-    if (!pattern) {
-        return NULL;
-    }
-
-    return PycairoPattern_FromPattern (pattern, NULL);
-}
-
-#if 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")
 {
 #if PY_VERSION_HEX < 0x03000000
     Pycairo_IMPORT;
 #else
-    import_cairo();
+    Pycairo_CAPI = (Pycairo_CAPI_t*) PyCapsule_Import("cairo.CAPI", 0);
 #endif
 
     if (Pycairo_CAPI == NULL)
         return PYGLIB_MODULE_ERROR_RETURN;
 
-    pygobject_init (3, 13, 2);
-
     pygi_register_foreign_struct ("cairo",
                                   "Context",
                                   cairo_context_to_arg,
@@ -436,46 +135,5 @@ PYGLIB_MODULE_START(_gi_cairo, "_gi_cairo")
                                   cairo_surface_to_arg,
                                   cairo_surface_from_arg,
                                   cairo_surface_release);
-
-    pygi_register_foreign_struct ("cairo",
-                                  "Path",
-                                  cairo_path_to_arg,
-                                  cairo_path_from_arg,
-                                  cairo_path_release);
-
-    pygi_register_foreign_struct ("cairo",
-                                  "FontOptions",
-                                  cairo_font_options_to_arg,
-                                  cairo_font_options_from_arg,
-                                  cairo_font_options_release);
-
-#if 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);
-
-    pyg_register_gtype_custom (CAIRO_GOBJECT_TYPE_SURFACE,
-                               cairo_surface_from_gvalue,
-                               cairo_surface_to_gvalue);
-
-    pyg_register_gtype_custom (CAIRO_GOBJECT_TYPE_FONT_FACE,
-                               cairo_font_face_from_gvalue,
-                               cairo_font_face_to_gvalue);
-
-    pyg_register_gtype_custom (CAIRO_GOBJECT_TYPE_SCALED_FONT,
-                               cairo_scaled_font_from_gvalue,
-                               cairo_scaled_font_to_gvalue);
-
-    pyg_register_gtype_custom (CAIRO_GOBJECT_TYPE_PATTERN,
-                               cairo_pattern_from_gvalue,
-                               cairo_pattern_to_gvalue);
-
 }
 PYGLIB_MODULE_END;