changeset 21:df405fded717

Modified pycairo to work with Quartz-based cairo surfaces and to be mounted at enso_osx.cairo, added it to the build system, and created an enso_osx.cairo shadow package.
author Atul Varma <varmaa@toolness.com>
date Mon, 25 Feb 2008 19:57:19 -0800
parents 92de49b0276c
children d70c53c55480
files enso_osx/__init__.py enso_osx/cairo/__init__.py src/SConscript src/pycairo/SConscript src/pycairo/cairomodule.c src/pycairo/pycairo-context.c src/pycairo/pycairo-font.c src/pycairo/pycairo-matrix.c src/pycairo/pycairo-path.c src/pycairo/pycairo-pattern.c src/pycairo/pycairo-private.h src/pycairo/pycairo-surface.c src/pycairo/pycairo.h
diffstat 13 files changed, 156 insertions(+), 33 deletions(-) [+]
line wrap: on
line diff
--- a/enso_osx/__init__.py	Mon Feb 25 19:54:19 2008 -0800
+++ b/enso_osx/__init__.py	Mon Feb 25 19:57:19 2008 -0800
@@ -5,5 +5,8 @@
     elif name == "graphics":
         import enso_osx.graphics
         return enso_osx.graphics
+    elif name == "cairo":
+        import enso_osx.cairo
+        return enso_osx.cairo
     else:
         return None
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/enso_osx/cairo/__init__.py	Mon Feb 25 19:57:19 2008 -0800
@@ -0,0 +1,1 @@
+from enso_osx.cairo._cairo import *
--- a/src/SConscript	Mon Feb 25 19:54:19 2008 -0800
+++ b/src/SConscript	Mon Feb 25 19:57:19 2008 -0800
@@ -49,7 +49,7 @@
 qcbEnv = env.Copy()
 
 qcbEnv.Append(
-    CPPPATH=[os.path.join( sys.prefix, "include/pycairo" )],
+    CPPPATH=["pycairo"],
     CCFLAGS=cairoIncludeFlags.split(),
     LINKFLAGS=cairoLibFlags,
     LIBS=["python", "cairo"],
@@ -71,3 +71,14 @@
     )
 
 env.Install( "#bin", keyNotifier )
+
+# Pycairo
+
+pycairoEnv = env.Copy()
+
+pycairoEnv.Append(
+    CCFLAGS=cairoIncludeFlags.split(),
+    LINKFLAGS=cairoLibFlags
+    )
+
+SConscript( "pycairo/SConscript", exports="pycairoEnv" )
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pycairo/SConscript	Mon Feb 25 19:57:19 2008 -0800
@@ -0,0 +1,15 @@
+Import( "pycairoEnv" )
+
+import glob
+
+sourceList = [
+    glob.glob( "*.c" )
+    ]
+
+pycairoLib = pycairoEnv.LoadableModule(
+    target="_cairo.so",
+    source=sourceList,
+    LIBS=["python", "cairo"]
+    )
+
+pycairoEnv.Install( "#enso_osx/cairo", pycairoLib )
--- a/src/pycairo/cairomodule.c	Mon Feb 25 19:54:19 2008 -0800
+++ b/src/pycairo/cairomodule.c	Mon Feb 25 19:57:19 2008 -0800
@@ -125,6 +125,11 @@
 #else
     0,
 #endif
+#ifdef CAIRO_HAS_QUARTZ_SURFACE
+    &PycairoQuartzSurface_Type,
+#else
+    0,
+#endif
                                PycairoSurface_FromSurface,
 
     Pycairo_Check_Status,
@@ -226,8 +231,13 @@
     if (PyType_Ready(&PycairoXlibSurface_Type) < 0)
         return;
 #endif
+#ifdef CAIRO_HAS_QUARTZ_SURFACE
+    PycairoQuartzSurface_Type.tp_base = &PycairoSurface_Type;
+    if (PyType_Ready(&PycairoQuartzSurface_Type) < 0)
+        return;
+#endif
 
-    m = Py_InitModule("cairo._cairo", cairo_functions);
+    m = Py_InitModule("enso_osx.cairo._cairo", cairo_functions);
 
     PyModule_AddStringConstant(m, "version", pycairo_version_string);
     PyModule_AddObject(m, "version_info",
@@ -299,11 +309,17 @@
 		       (PyObject *)&PycairoXlibSurface_Type);
 #endif
 
+#ifdef CAIRO_HAS_QUARTZ_SURFACE
+    Py_INCREF(&PycairoQuartzSurface_Type);
+    PyModule_AddObject(m, "QuartzSurface",
+                       (PyObject *)&PycairoQuartzSurface_Type);
+#endif
+
     PyModule_AddObject(m, "CAPI", PyCObject_FromVoidPtr(&CAPI, NULL));
 
     /* Add 'cairo.Error' to the module */
     if (CairoError == NULL) {
-	CairoError = PyErr_NewException("cairo.Error", NULL, NULL);
+	CairoError = PyErr_NewException("enso_osx.cairo.Error", NULL, NULL);
 	if (CairoError == NULL)
 	    return;
     }
--- a/src/pycairo/pycairo-context.c	Mon Feb 25 19:54:19 2008 -0800
+++ b/src/pycairo/pycairo-context.c	Mon Feb 25 19:57:19 2008 -0800
@@ -1405,7 +1405,7 @@
 PyTypeObject PycairoContext_Type = {
     PyObject_HEAD_INIT(NULL)
     0,                                  /* ob_size */
-    "cairo.Context",                    /* tp_name */
+    "enso_osx.cairo.Context",           /* tp_name */
     sizeof(PycairoContext),             /* tp_basicsize */
     0,                                  /* tp_itemsize */
     (destructor)pycairo_dealloc,        /* tp_dealloc */
--- a/src/pycairo/pycairo-font.c	Mon Feb 25 19:54:19 2008 -0800
+++ b/src/pycairo/pycairo-font.c	Mon Feb 25 19:57:19 2008 -0800
@@ -37,7 +37,7 @@
 #include "pycairo-private.h"
 
 
-/* class cairo.FontFace --------------------------------------------------- */
+/* class enso_osx.cairo.FontFace --------------------------------------------------- */
 
 /* PycairoFontFace_FromFontFace
  * Create a new PycairoFontFace from a cairo_font_face_t
@@ -99,7 +99,7 @@
 PyTypeObject PycairoFontFace_Type = {
     PyObject_HEAD_INIT(NULL)
     0,                                  /* ob_size */
-    "cairo.FontFace",                   /* tp_name */
+    "enso_osx.cairo.FontFace",                   /* tp_name */
     sizeof(PycairoFontFace),            /* tp_basicsize */
     0,                                  /* tp_itemsize */
     (destructor)font_face_dealloc,      /* tp_dealloc */
@@ -142,7 +142,7 @@
 };
 
 
-/* class cairo.ScaledFont ------------------------------------------------- */
+/* class enso_osx.cairo.ScaledFont ------------------------------------------------- */
 
 /* PycairoScaledFont_FromScaledFont
  * Create a new PycairoScaledFont from a cairo_scaled_font_t
@@ -258,7 +258,7 @@
 PyTypeObject PycairoScaledFont_Type = {
     PyObject_HEAD_INIT(NULL)
     0,                                  /* ob_size */
-    "cairo.ScaledFont",                 /* tp_name */
+    "enso_osx.cairo.ScaledFont",                 /* tp_name */
     sizeof(PycairoScaledFont),          /* tp_basicsize */
     0,                                  /* tp_itemsize */
     (destructor)scaled_font_dealloc,    /* tp_dealloc */
@@ -301,7 +301,7 @@
 };
 
 
-/* class cairo.FontOptions ------------------------------------------------ */
+/* class enso_osx.cairo.FontOptions ------------------------------------------------ */
 
 /* PycairoFontOptions_FromFontOptions
  * Create a new PycairoFontOptions from a cairo_font_options_t
@@ -457,7 +457,7 @@
 PyTypeObject PycairoFontOptions_Type = {
     PyObject_HEAD_INIT(NULL)
     0,                                  /* ob_size */
-    "cairo.FontOptions",                /* tp_name */
+    "enso_osx.cairo.FontOptions",                /* tp_name */
     sizeof(PycairoFontOptions),         /* tp_basicsize */
     0,                                  /* tp_itemsize */
     (destructor)font_options_dealloc,   /* tp_dealloc */
--- a/src/pycairo/pycairo-matrix.c	Mon Feb 25 19:54:19 2008 -0800
+++ b/src/pycairo/pycairo-matrix.c	Mon Feb 25 19:57:19 2008 -0800
@@ -112,7 +112,7 @@
 {
     char buf[256];
 
-    PyOS_snprintf(buf, sizeof(buf), "cairo.Matrix(%g, %g, %g, %g, %g, %g)",
+    PyOS_snprintf(buf, sizeof(buf), "enso_osx.cairo.Matrix(%g, %g, %g, %g, %g, %g)",
 		  o->matrix.xx, o->matrix.yx,
 		  o->matrix.xy, o->matrix.yy,
 		  o->matrix.x0, o->matrix.y0);
@@ -283,11 +283,11 @@
 static PyMethodDef matrix_methods[] = {
     /* Do not need to wrap all cairo_matrix_init_*() functions
      * C API Matrix constructors       Python equivalents
-     * cairo_matrix_init()             cairo.Matrix(xx,yx,xy,yy,x0,y0)
-     * cairo_matrix_init_identity()    cairo.Matrix()
-     * cairo_matrix_init_translate()   cairo.Matrix(x0=x0,y0=y0)
-     * cairo_matrix_init_scale()       cairo.Matrix(xx=xx,yy=yy)
-     * cairo_matrix_init_rotate()      cairo.Matrix.init_rotate(radians)
+     * cairo_matrix_init()             enso_osx.cairo.Matrix(xx,yx,xy,yy,x0,y0)
+     * cairo_matrix_init_identity()    enso_osx.cairo.Matrix()
+     * cairo_matrix_init_translate()   enso_osx.cairo.Matrix(x0=x0,y0=y0)
+     * cairo_matrix_init_scale()       enso_osx.cairo.Matrix(xx=xx,yy=yy)
+     * cairo_matrix_init_rotate()      enso_osx.cairo.Matrix.init_rotate(radians)
      */
     {"init_rotate", (PyCFunction)matrix_init_rotate,
                                                    METH_VARARGS | METH_CLASS },
@@ -304,7 +304,7 @@
 PyTypeObject PycairoMatrix_Type = {
     PyObject_HEAD_INIT(NULL)
     0,                                  /* ob_size */
-    "cairo.Matrix",                     /* tp_name */
+    "enso_osx.cairo.Matrix",                     /* tp_name */
     sizeof(PycairoMatrix),              /* tp_basicsize */
     0,                                  /* tp_itemsize */
     (destructor)matrix_dealloc,         /* tp_dealloc */
--- a/src/pycairo/pycairo-path.c	Mon Feb 25 19:54:19 2008 -0800
+++ b/src/pycairo/pycairo-path.c	Mon Feb 25 19:57:19 2008 -0800
@@ -184,7 +184,7 @@
 PyTypeObject PycairoPath_Type = {
     PyObject_HEAD_INIT(NULL)
     0,				        /* ob_size */
-    "cairo.Path",			/* tp_name */
+    "enso_osx.cairo.Path",			/* tp_name */
     sizeof(PycairoPath),		/* tp_basicsize */
     0,					/* tp_itemsize */
     (destructor)path_dealloc,		/* tp_dealloc */
@@ -307,7 +307,7 @@
 PyTypeObject PycairoPathiter_Type = {
     PyObject_HEAD_INIT(NULL)
     0,                                  /* ob_size */
-    "cairo.Pathiter",                   /* tp_name */
+    "enso_osx.cairo.Pathiter",                   /* tp_name */
     sizeof(PycairoPathiter),            /* tp_basicsize */
     0,                                  /* tp_itemsize */
     (destructor)pathiter_dealloc,	/* tp_dealloc */
--- a/src/pycairo/pycairo-pattern.c	Mon Feb 25 19:54:19 2008 -0800
+++ b/src/pycairo/pycairo-pattern.c	Mon Feb 25 19:57:19 2008 -0800
@@ -145,7 +145,7 @@
 PyTypeObject PycairoPattern_Type = {
     PyObject_HEAD_INIT(NULL)
     0,                                  /* ob_size */
-    "cairo.Pattern",                    /* tp_name */
+    "enso_osx.cairo.Pattern",                    /* tp_name */
     sizeof(PycairoPattern),             /* tp_basicsize */
     0,                                  /* tp_itemsize */
     (destructor)pattern_dealloc,        /* tp_dealloc */
@@ -215,7 +215,7 @@
 PyTypeObject PycairoSolidPattern_Type = {
     PyObject_HEAD_INIT(NULL)
     0,                                  /* ob_size */
-    "cairo.SolidPattern",               /* tp_name */
+    "enso_osx.cairo.SolidPattern",               /* tp_name */
     sizeof(PycairoSolidPattern),        /* tp_basicsize */
     0,                                  /* tp_itemsize */
     0,                                  /* tp_dealloc */
@@ -327,7 +327,7 @@
 PyTypeObject PycairoSurfacePattern_Type = {
     PyObject_HEAD_INIT(NULL)
     0,                                  /* ob_size */
-    "cairo.SurfacePattern",             /* tp_name */
+    "enso_osx.cairo.SurfacePattern",             /* tp_name */
     sizeof(PycairoSurfacePattern),      /* tp_basicsize */
     0,                                  /* tp_itemsize */
     0,                                  /* tp_dealloc */
@@ -415,7 +415,7 @@
 PyTypeObject PycairoGradient_Type = {
     PyObject_HEAD_INIT(NULL)
     0,                                  /* ob_size */
-    "cairo.Gradient",                   /* tp_name */
+    "enso_osx.cairo.Gradient",                   /* tp_name */
     sizeof(PycairoGradient),            /* tp_basicsize */
     0,                                  /* tp_itemsize */
     0,                                  /* tp_dealloc */
@@ -487,7 +487,7 @@
 PyTypeObject PycairoLinearGradient_Type = {
     PyObject_HEAD_INIT(NULL)
     0,                                  /* ob_size */
-    "cairo.LinearGradient",             /* tp_name */
+    "enso_osx.cairo.LinearGradient",             /* tp_name */
     sizeof(PycairoLinearGradient),      /* tp_basicsize */
     0,                                  /* tp_itemsize */
     0,                                  /* tp_dealloc */
@@ -560,7 +560,7 @@
 PyTypeObject PycairoRadialGradient_Type = {
     PyObject_HEAD_INIT(NULL)
     0,                                  /* ob_size */
-    "cairo.RadialGradient",             /* tp_name */
+    "enso_osx.cairo.RadialGradient",             /* tp_name */
     sizeof(PycairoRadialGradient),      /* tp_basicsize */
     0,                                  /* tp_itemsize */
     0,                                  /* tp_dealloc */
--- a/src/pycairo/pycairo-private.h	Mon Feb 25 19:54:19 2008 -0800
+++ b/src/pycairo/pycairo-private.h	Mon Feb 25 19:57:19 2008 -0800
@@ -98,6 +98,10 @@
 extern PyTypeObject PycairoXlibSurface_Type;
 #endif
 
+#if CAIRO_HAS_QUARTZ_SURFACE
+extern PyTypeObject PycairoQuartzSurface_Type;
+#endif
+
 PyObject *PycairoSurface_FromSurface (cairo_surface_t *surface,
                                       PyObject *base);
 
--- a/src/pycairo/pycairo-surface.c	Mon Feb 25 19:54:19 2008 -0800
+++ b/src/pycairo/pycairo-surface.c	Mon Feb 25 19:57:19 2008 -0800
@@ -98,6 +98,11 @@
 	type = &PycairoXlibSurface_Type;
 	break;
 #endif
+#if CAIRO_HAS_QUARTZ_SURFACE
+    case CAIRO_SURFACE_TYPE_QUARTZ:
+        type = &PycairoQuartzSurface_Type;
+        break;
+#endif
     default:
 	PyErr_SetString(CairoError, "Unsupported Surface type");
 	return NULL;
@@ -310,7 +315,7 @@
 PyTypeObject PycairoSurface_Type = {
     PyObject_HEAD_INIT(NULL)
     0,                                  /* ob_size */
-    "cairo.Surface",                    /* tp_name */
+    "enso_osx.cairo.Surface",                    /* tp_name */
     sizeof(PycairoSurface),             /* tp_basicsize */
     0,                                  /* tp_itemsize */
     (destructor)surface_dealloc,        /* tp_dealloc */
@@ -580,7 +585,7 @@
 PyTypeObject PycairoImageSurface_Type = {
     PyObject_HEAD_INIT(NULL)
     0,                                  /* ob_size */
-    "cairo.ImageSurface",               /* tp_name */
+    "enso_osx.cairo.ImageSurface",               /* tp_name */
     sizeof(PycairoImageSurface),        /* tp_basicsize */
     0,                                  /* tp_itemsize */
     0,                                  /* tp_dealloc */
@@ -682,7 +687,7 @@
 PyTypeObject PycairoPDFSurface_Type = {
     PyObject_HEAD_INIT(NULL)
     0,                                  /* ob_size */
-    "cairo.PDFSurface",                 /* tp_name */
+    "enso_osx.cairo.PDFSurface",                 /* tp_name */
     sizeof(PycairoPDFSurface),          /* tp_basicsize */
     0,                                  /* tp_itemsize */
     0,                                  /* tp_dealloc */
@@ -816,7 +821,7 @@
 PyTypeObject PycairoPSSurface_Type = {
     PyObject_HEAD_INIT(NULL)
     0,                                  /* ob_size */
-    "cairo.PSSurface",                  /* tp_name */
+    "enso_osx.cairo.PSSurface",                  /* tp_name */
     sizeof(PycairoPSSurface),           /* tp_basicsize */
     0,                                  /* tp_itemsize */
     0,                                  /* tp_dealloc */
@@ -910,7 +915,7 @@
 PyTypeObject PycairoSVGSurface_Type = {
     PyObject_HEAD_INIT(NULL)
     0,                                  /* ob_size */
-    "cairo.SVGSurface",                 /* tp_name */
+    "enso_osx.cairo.SVGSurface",                 /* tp_name */
     sizeof(PycairoSVGSurface),          /* tp_basicsize */
     0,                                  /* tp_itemsize */
     0,                                  /* tp_dealloc */
@@ -976,7 +981,7 @@
 PyTypeObject PycairoWin32Surface_Type = {
     PyObject_HEAD_INIT(NULL)
     0,                                  /* ob_size */
-    "cairo.Win32Surface",               /* tp_name */
+    "enso_osx.cairo.Win32Surface",               /* tp_name */
     sizeof(PycairoWin32Surface),        /* tp_basicsize */
     0,                                  /* tp_itemsize */
     0,                                  /* tp_dealloc */
@@ -1060,7 +1065,7 @@
 PyTypeObject PycairoXlibSurface_Type = {
     PyObject_HEAD_INIT(NULL)
     0,                                  /* ob_size */
-    "cairo.XlibSurface",                /* tp_name */
+    "enso_osx.cairo.XlibSurface",                /* tp_name */
     sizeof(PycairoXlibSurface),         /* tp_basicsize */
     0,                                  /* tp_itemsize */
     0,                                  /* tp_dealloc */
@@ -1102,3 +1107,65 @@
     0,                                  /* tp_bases */
 };
 #endif  /* CAIRO_HAS_XLIB_SURFACE */
+
+/* Class QuartzSurface(Surface) -------------------------------------------- */
+#if CAIRO_HAS_QUARTZ_SURFACE
+#include <cairo-quartz.h>
+
+static PyObject *
+quartz_surface_new (PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+    PyErr_SetString(PyExc_TypeError,
+		    "The QuartzSurface type cannot be directly instantiated");
+    return NULL;
+}
+
+static PyMethodDef quartz_surface_methods[] = {
+    {NULL, NULL, 0, NULL},
+};
+
+PyTypeObject PycairoQuartzSurface_Type = {
+    PyObject_HEAD_INIT(NULL)
+    0,                                  /* ob_size */
+    "enso_osx.cairo.QuartzSurface",               /* tp_name */
+    sizeof(PycairoQuartzSurface),        /* tp_basicsize */
+    0,                                  /* tp_itemsize */
+    0,                                  /* 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 */
+    quartz_surface_methods,              /* tp_methods */
+    0,                                  /* tp_members */
+    0,                                  /* tp_getset */
+    0, /* &PycairoSurface_Type, */      /* tp_base */
+    0,                                  /* tp_dict */
+    0,                                  /* tp_descr_get */
+    0,                                  /* tp_descr_set */
+    0,                                  /* tp_dictoffset */
+    0,                                  /* tp_init */
+    0,                                  /* tp_alloc */
+    (newfunc)quartz_surface_new,         /* tp_new */
+    0,                                  /* tp_free */
+    0,                                  /* tp_is_gc */
+    0,                                  /* tp_bases */
+};
+#endif  /* CAIRO_HAS_QUARTZ_SURFACE */
--- a/src/pycairo/pycairo.h	Mon Feb 25 19:54:19 2008 -0800
+++ b/src/pycairo/pycairo.h	Mon Feb 25 19:57:19 2008 -0800
@@ -90,6 +90,7 @@
 #define PycairoSVGSurface   PycairoSurface
 #define PycairoWin32Surface PycairoSurface
 #define PycairoXlibSurface  PycairoSurface
+#define PycairoQuartzSurface PycairoSurface
 
 /* get C object out of the Python wrapper */
 #define PycairoContext_GET(obj)    (((PycairoContext *)(obj))->ctx)
@@ -128,6 +129,7 @@
     PyTypeObject *SVGSurface_Type;
     PyTypeObject *Win32Surface_Type;
     PyTypeObject *XlibSurface_Type;
+    PyTypeObject *QuartzSurface_Type;
     PyObject *(*Surface_FromSurface)(cairo_surface_t *surface, PyObject *base);
 
     /* misc functions */
@@ -185,6 +187,10 @@
 #define PycairoXlibSurface_Type     *(Pycairo_CAPI->XlibSurface_Type)
 #endif
 
+#if CAIRO_HAS_QUARTZ_SURFACE
+#define PycairoQuartzSurface_Type   *(Pycairo_CAPI->QuartzSurface_Type)
+#endif
+
 #define PycairoSurface_FromSurface   (Pycairo_CAPI->Surface_FromSurface)
 
 #define Pycairo_Check_Status         (Pycairo_CAPI->Check_Status)
@@ -196,7 +202,7 @@
  * 2) Add 'Pycairo_IMPORT;' to the init<module> function
  */
 #define Pycairo_IMPORT \
-        Pycairo_CAPI = (Pycairo_CAPI_t*) PyCObject_Import("cairo", "CAPI")
+        Pycairo_CAPI = (Pycairo_CAPI_t*) PyCObject_Import("enso_osx.cairo", "CAPI")
 
 #endif /* ifndef _INSIDE_PYCAIRO_ */