/* -*- mode: C; c-basic-offset: 2 -*-
*
* Copyright © 2003 James Henstridge
* Copyright © 2004-2011 Steven Chaplin
*
* 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 .
*/
#define PY_SSIZE_T_CLEAN
#include
#include "config.h"
#include "private.h"
/* Class Surface ---------------------------------------------------------- */
/* PycairoSurface_FromSurface
* Create a new
* PycairoImageSurface,
* PycairoPDFSurface,
* PycairoPSSurface,
* PycairoRecordingSurface,
* PycairoSVGSurface,
* PycairoWin32Surface,
* PycairoWin32PrintingSurface,
* PycairoXCBSurface, or
* PycairoXlibSurface
* from a cairo_surface_t.
* surface - a cairo_surface_t to 'wrap' into a Python object.
* It is unreferenced if the PycairoSurface creation fails, or if the
* cairo_surface_t has an error status.
* base - the base object used to create the surface, or NULL.
* It is referenced to keep it alive while the cairo_surface_t is being used.
* Return value: New reference or NULL on failure
*/
PyObject *
PycairoSurface_FromSurface (cairo_surface_t *surface, PyObject *base) {
PyTypeObject *type = NULL;
PyObject *o;
assert (surface != NULL);
if (Pycairo_Check_Status (cairo_surface_status (surface))) {
cairo_surface_destroy (surface);
return NULL;
}
switch (cairo_surface_get_type (surface)) {
#if CAIRO_HAS_IMAGE_SURFACE
case CAIRO_SURFACE_TYPE_IMAGE:
type = &PycairoImageSurface_Type;
break;
#endif
#if CAIRO_HAS_PDF_SURFACE
case CAIRO_SURFACE_TYPE_PDF:
type = &PycairoPDFSurface_Type;
break;
#endif
#if CAIRO_HAS_PS_SURFACE
case CAIRO_SURFACE_TYPE_PS:
type = &PycairoPSSurface_Type;
break;
#endif
#if CAIRO_HAS_RECORDING_SURFACE
case CAIRO_SURFACE_TYPE_RECORDING:
type = &PycairoRecordingSurface_Type;
break;
#endif
#if CAIRO_HAS_SVG_SURFACE
case CAIRO_SURFACE_TYPE_SVG:
type = &PycairoSVGSurface_Type;
break;
#endif
#if CAIRO_HAS_WIN32_SURFACE
case CAIRO_SURFACE_TYPE_WIN32:
type = &PycairoWin32Surface_Type;
break;
case CAIRO_SURFACE_TYPE_WIN32_PRINTING:
type = &PycairoWin32PrintingSurface_Type;
break;
#endif
#if CAIRO_HAS_XCB_SURFACE
case CAIRO_SURFACE_TYPE_XCB:
type = &PycairoXCBSurface_Type;
break;
#endif
#if CAIRO_HAS_XLIB_SURFACE
case CAIRO_SURFACE_TYPE_XLIB:
type = &PycairoXlibSurface_Type;
break;
#endif
default:
type = &PycairoSurface_Type;
break;
}
o = type->tp_alloc (type, 0);
if (o == NULL) {
cairo_surface_destroy (surface);
} else {
((PycairoSurface *)o)->surface = surface;
Py_XINCREF(base);
((PycairoSurface *)o)->base = base;
((PycairoSurface *)o)->buffer.buf = NULL;
}
return o;
}
/* for use with
* cairo_surface_write_to_png_stream()
* cairo_pdf/ps_surface_create_for_stream()
*/
static cairo_status_t
_write_bytes_func (void *closure, const unsigned char *data, unsigned int length) {
PyGILState_STATE gstate = PyGILState_Ensure();
PyObject *res = PyObject_CallMethod ((PyObject *)closure, "write", "(y#)",
data, (Py_ssize_t)length);
if (res == NULL) {
/* an exception has occurred, it will be picked up later by
* Pycairo_Check_Status()
*/
PyGILState_Release(gstate);
return CAIRO_STATUS_WRITE_ERROR;
}
Py_DECREF(res);
PyGILState_Release(gstate);
return CAIRO_STATUS_SUCCESS;
}
/* for use with
* cairo_svg_surface_create_for_stream()
*/
static cairo_status_t
_write_str_func (void *closure, const unsigned char *data, unsigned int length) {
PyGILState_STATE gstate = PyGILState_Ensure();
PyObject *res = PyObject_CallMethod ((PyObject *)closure, "write", "(s#)",
data, (Py_ssize_t)length);
if (res == NULL) {
/* an exception has occurred, it will be picked up later by
* Pycairo_Check_Status()
*/
PyGILState_Release(gstate);
return CAIRO_STATUS_WRITE_ERROR;
}
Py_DECREF(res);
PyGILState_Release(gstate);
return CAIRO_STATUS_SUCCESS;
}
static void
surface_dealloc (PycairoSurface *o) {
if (o->surface) {
cairo_surface_destroy(o->surface);
o->surface = NULL;
}
Py_CLEAR(o->base);
PyBuffer_Release(&o->buffer);
Py_TYPE(o)->tp_free(o);
}
static PyObject *
surface_new (PyTypeObject *type, PyObject *args, PyObject *kwds) {
PyErr_SetString(PyExc_TypeError,
"The Surface type cannot be instantiated");
return NULL;
}
static PyObject *
surface_copy_page (PycairoSurface *o) {
Py_BEGIN_ALLOW_THREADS;
cairo_surface_copy_page (o->surface);
Py_END_ALLOW_THREADS;
RETURN_NULL_IF_CAIRO_SURFACE_ERROR(o->surface);
Py_RETURN_NONE;
}
static PyObject *
surface_create_similar (PycairoSurface *o, PyObject *args) {
cairo_content_t content;
int width, height;
if (!PyArg_ParseTuple (args, "iii:Surface.create_similar",
&content, &width, &height))
return NULL;
return PycairoSurface_FromSurface (
cairo_surface_create_similar (o->surface, content, width, height),
NULL);
}
static PyObject *
surface_finish (PycairoSurface *o) {
cairo_surface_finish (o->surface);
Py_CLEAR(o->base);
RETURN_NULL_IF_CAIRO_SURFACE_ERROR(o->surface);
Py_RETURN_NONE;
}
static PyObject *
surface_flush (PycairoSurface *o) {
Py_BEGIN_ALLOW_THREADS;
cairo_surface_flush (o->surface);
Py_END_ALLOW_THREADS;
RETURN_NULL_IF_CAIRO_SURFACE_ERROR(o->surface);
Py_RETURN_NONE;
}
static PyObject *
surface_get_content (PycairoSurface *o) {
return PyLong_FromLong (cairo_surface_get_content (o->surface));
}
static PyObject *
surface_get_device_offset (PycairoSurface *o) {
double x_offset, y_offset;
cairo_surface_get_device_offset (o->surface, &x_offset, &y_offset);
return Py_BuildValue("(dd)", x_offset, y_offset);
}
static PyObject *
surface_get_fallback_resolution (PycairoSurface *o) {
double x_ppi, y_ppi;
cairo_surface_get_fallback_resolution (o->surface, &x_ppi, &y_ppi);
return Py_BuildValue("(dd)", x_ppi, y_ppi);
}
static PyObject *
surface_get_font_options (PycairoSurface *o) {
cairo_font_options_t *options = cairo_font_options_create();
cairo_surface_get_font_options (o->surface, options);
/* there is no reference fn */
return PycairoFontOptions_FromFontOptions (options);
}
static PyObject *
surface_mark_dirty (PycairoSurface *o) {
cairo_surface_mark_dirty (o->surface);
RETURN_NULL_IF_CAIRO_SURFACE_ERROR(o->surface);
Py_RETURN_NONE;
}
static PyObject *
surface_mark_dirty_rectangle (PycairoSurface *o, PyObject *args) {
int x, y, width, height;
if (!PyArg_ParseTuple(args, "iiii:Surface.mark_dirty_rectangle",
&x, &y, &width, &height))
return NULL;
cairo_surface_mark_dirty_rectangle (o->surface, x, y, width, height);
RETURN_NULL_IF_CAIRO_SURFACE_ERROR(o->surface);
Py_RETURN_NONE;
}
static PyObject *
surface_set_device_offset (PycairoSurface *o, PyObject *args) {
double x_offset, y_offset;
if (!PyArg_ParseTuple (args, "dd:Surface.set_device_offset",
&x_offset, &y_offset))
return NULL;
cairo_surface_set_device_offset (o->surface, x_offset, y_offset);
Py_RETURN_NONE;
}
static PyObject *
surface_set_fallback_resolution (PycairoSurface *o, PyObject *args) {
double x_ppi, y_ppi;
if (!PyArg_ParseTuple(args, "dd:Surface.set_fallback_resolution",
&x_ppi, &y_ppi))
return NULL;
cairo_surface_set_fallback_resolution (o->surface, x_ppi, y_ppi);
Py_RETURN_NONE;
}
static PyObject *
surface_show_page (PycairoSurface *o) {
Py_BEGIN_ALLOW_THREADS;
cairo_surface_show_page (o->surface);
Py_END_ALLOW_THREADS;
RETURN_NULL_IF_CAIRO_SURFACE_ERROR(o->surface);
Py_RETURN_NONE;
}
#ifdef CAIRO_HAS_PNG_FUNCTIONS
static PyObject *
surface_write_to_png (PycairoSurface *o, PyObject *args) {
cairo_status_t status;
PyObject *file;
if (!PyArg_ParseTuple(args, "O:Surface.write_to_png", &file))
return NULL;
if (PyObject_TypeCheck (file, &PyUnicode_Type)) {
/* filename (str) argument */
char *name = NULL; // the encoded filename
if (!PyArg_ParseTuple(args, "es:Surface.write_to_png",
Py_FileSystemDefaultEncoding, &name))
return NULL;
Py_BEGIN_ALLOW_THREADS;
status = cairo_surface_write_to_png (o->surface, name);
Py_END_ALLOW_THREADS;
PyMem_Free(name);
} else { /* file or file-like object argument */
PyObject* writer = PyObject_GetAttrString (file, "write");
if (writer == NULL || !PyCallable_Check (writer)) {
Py_XDECREF(writer);
PyErr_SetString(PyExc_TypeError,
"Surface.write_to_png takes one argument which must be a filename (str), file "
"object, or a file-like bytes-mode object which has a \"write\" method");
return NULL;
}
Py_DECREF(writer);
Py_BEGIN_ALLOW_THREADS;
status = cairo_surface_write_to_png_stream (o->surface, _write_bytes_func,
file);
Py_END_ALLOW_THREADS;
}
RETURN_NULL_IF_CAIRO_ERROR(status);
Py_RETURN_NONE;
}
#endif /* CAIRO_HAS_PNG_FUNCTIONS */
static PyMethodDef surface_methods[] = {
/* methods never exposed in a language binding:
* cairo_surface_destroy()
* cairo_surface_get_type()
* cairo_surface_get_user_data()
* cairo_surface_reference()
* cairo_surface_set_user_data()
*/
{"copy_page", (PyCFunction)surface_copy_page, METH_NOARGS},
{"create_similar", (PyCFunction)surface_create_similar, METH_VARARGS},
{"finish", (PyCFunction)surface_finish, METH_NOARGS},
{"flush", (PyCFunction)surface_flush, METH_NOARGS},
{"get_content", (PyCFunction)surface_get_content, METH_NOARGS},
{"get_device_offset",(PyCFunction)surface_get_device_offset,METH_NOARGS},
{"get_fallback_resolution",(PyCFunction)surface_get_fallback_resolution,
METH_NOARGS},
{"get_font_options",(PyCFunction)surface_get_font_options, METH_NOARGS},
{"mark_dirty", (PyCFunction)surface_mark_dirty, METH_NOARGS},
{"mark_dirty_rectangle", (PyCFunction)surface_mark_dirty_rectangle,
METH_VARARGS},
{"set_device_offset",(PyCFunction)surface_set_device_offset,METH_VARARGS},
{"set_fallback_resolution",(PyCFunction)surface_set_fallback_resolution,
METH_VARARGS},
{"show_page", (PyCFunction)surface_show_page, METH_NOARGS},
#ifdef CAIRO_HAS_PNG_FUNCTIONS
{"write_to_png", (PyCFunction)surface_write_to_png, METH_VARARGS},
#endif
{NULL, NULL, 0, NULL},
};
PyTypeObject PycairoSurface_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"cairo.Surface", /* tp_name */
sizeof(PycairoSurface), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)surface_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 | Py_TPFLAGS_BASETYPE,/* tp_flags */
0, /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
surface_methods, /* tp_methods */
0, /* tp_members */
0, /* 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)surface_new, /* tp_new */
0, /* tp_free */
0, /* tp_is_gc */
0, /* tp_bases */
};
/* Class ImageSurface(Surface) -------------------------------------------- */
#ifdef CAIRO_HAS_IMAGE_SURFACE
static PyObject *
image_surface_new (PyTypeObject *type, PyObject *args, PyObject *kwds) {
cairo_format_t format;
int width, height;
if (!PyArg_ParseTuple (args, "iii:ImageSurface.__new__",
&format, &width, &height))
return NULL;
return PycairoSurface_FromSurface (
cairo_image_surface_create (format, width, height),
NULL);
}
static PyObject *
image_surface_create_for_data (PyTypeObject *type, PyObject *args) {
cairo_format_t format;
int width, height, stride = -1;
Py_buffer buffer;
if (!PyArg_ParseTuple(args, "w*iii|i:Surface.create_for_data",
&buffer, &format, &width, &height, &stride))
return NULL;
if (width <= 0) {
PyErr_SetString(PyExc_ValueError, "width must be positive");
return NULL;
}
if (height <= 0) {
PyErr_SetString(PyExc_ValueError, "height must be positive");
return NULL;
}
/* if stride is missing, calculate it from width */
if (stride < 0) {
stride = cairo_format_stride_for_width (format, width);
if (stride == -1){
PyErr_SetString(CairoError,
"format is invalid or the width too large");
return NULL;
}
}
if (height * stride > buffer.len) {
PyErr_SetString(PyExc_TypeError, "buffer is not long enough");
return NULL;
}
cairo_surface_t *surface;
PyObject *o;
Py_BEGIN_ALLOW_THREADS;
surface = cairo_image_surface_create_for_data (buffer.buf, format, width,
height, stride);
Py_END_ALLOW_THREADS;
o = PycairoSurface_FromSurface(surface, NULL);
if (o != NULL) {
((PycairoSurface *)o)->buffer = buffer;
}
return o;
}
#ifdef CAIRO_HAS_PNG_FUNCTIONS
static cairo_status_t
_read_bytes_func (void *closure, unsigned char *data, unsigned int length) {
char *buffer;
Py_ssize_t str_length;
cairo_status_t status = CAIRO_STATUS_READ_ERROR;
PyGILState_STATE gstate = PyGILState_Ensure();
PyObject *pyBytes = PyObject_CallMethod ((PyObject *)closure, "read", "(i)",
length);
if (pyBytes == NULL) {
/* an exception has occurred, it will be picked up later by
* Pycairo_Check_Status()
*/
goto end;
}
int ret = PyBytes_AsStringAndSize(pyBytes, &buffer, &str_length);
if (ret == -1 || str_length < length) {
goto end;
}
/* don't use strncpy() since png data may contain NUL bytes */
memcpy (data, buffer, str_length);
status = CAIRO_STATUS_SUCCESS;
end:
Py_XDECREF(pyBytes);
PyGILState_Release(gstate);
return status;
}
/* METH_CLASS */
static PyObject *
image_surface_create_from_png (PyTypeObject *type, PyObject *args) {
cairo_surface_t *is;
PyObject *reader, *file;
if (!PyArg_ParseTuple(args, "O:ImageSurface.create_from_png", &file))
return NULL;
if (PyObject_TypeCheck (file, &PyUnicode_Type)) {
char *name = NULL; // the encoded filename
if (!PyArg_ParseTuple(args, "es:Surface.create_from_png",
Py_FileSystemDefaultEncoding, &name))
return NULL;
Py_BEGIN_ALLOW_THREADS;
is = cairo_image_surface_create_from_png (name);
Py_END_ALLOW_THREADS;
PyMem_Free(name);
return PycairoSurface_FromSurface (is, NULL);
}
/* file or file-like object argument */
reader = PyObject_GetAttrString (file, "read");
if (reader == NULL || !PyCallable_Check (reader)) {
Py_XDECREF(reader);
PyErr_SetString(PyExc_TypeError,
"ImageSurface.create_from_png argument must be a filename (str), file object, "
"or a file-like bytes-mode object which has a \"read\" method");
return NULL;
}
Py_DECREF(reader);
Py_BEGIN_ALLOW_THREADS;
is = cairo_image_surface_create_from_png_stream (_read_bytes_func, file);
Py_END_ALLOW_THREADS;
return PycairoSurface_FromSurface (is, NULL);
}
#endif /* CAIRO_HAS_PNG_FUNCTIONS */
/* METH_STATIC */
static PyObject *
image_surface_format_stride_for_width (PyObject *self, PyObject *args) {
cairo_format_t format;
int width;
if (!PyArg_ParseTuple(args, "ii:format_stride_for_width", &format, &width))
return NULL;
return PyLong_FromLong (cairo_format_stride_for_width (format, width));
}
static PyObject *
image_surface_get_data (PycairoImageSurface *o) {
return PyMemoryView_FromObject((PyObject*)o);
}
static PyObject *
image_surface_get_format (PycairoImageSurface *o) {
return PyLong_FromLong (cairo_image_surface_get_format (o->surface));
}
static PyObject *
image_surface_get_height (PycairoImageSurface *o) {
return PyLong_FromLong (cairo_image_surface_get_height (o->surface));
}
static PyObject *
image_surface_get_stride (PycairoImageSurface *o) {
return PyLong_FromLong (cairo_image_surface_get_stride (o->surface));
}
static PyObject *
image_surface_get_width (PycairoImageSurface *o) {
return PyLong_FromLong (cairo_image_surface_get_width (o->surface));
}
/* Buffer interface functions
used by ImageSurface.get_data()
PEP 3118 -- Revising the buffer protocol
http://www.python.org/dev/peps/pep-3118/
*/
static int
image_surface_buffer_getbufferproc (PycairoImageSurface *o, Py_buffer *view,
int flags) {
cairo_surface_t *surface = o->surface;
int height, stride;
void *data;
/* buffer does not give ndim, shape or stride information
*/
height = cairo_image_surface_get_height (surface);
stride = cairo_image_surface_get_stride (surface);
data = cairo_image_surface_get_data (surface);
if(!PyBuffer_FillInfo(view, (PyObject *)o, data,
height * stride, 0, PyBUF_CONTIG))
return 0;
return -1;
}
static PyBufferProcs image_surface_as_buffer = {
(getbufferproc) image_surface_buffer_getbufferproc,
(releasebufferproc) NULL,
};
static PyMethodDef image_surface_methods[] = {
{"create_for_data",(PyCFunction)image_surface_create_for_data,
METH_VARARGS | METH_CLASS},
#ifdef CAIRO_HAS_PNG_FUNCTIONS
{"create_from_png", (PyCFunction)image_surface_create_from_png,
METH_VARARGS | METH_CLASS},
#endif
{"format_stride_for_width",
(PyCFunction)image_surface_format_stride_for_width,
METH_VARARGS | METH_STATIC},
{"get_data", (PyCFunction)image_surface_get_data, METH_NOARGS},
{"get_format", (PyCFunction)image_surface_get_format, METH_NOARGS},
{"get_height", (PyCFunction)image_surface_get_height, METH_NOARGS},
{"get_stride", (PyCFunction)image_surface_get_stride, METH_NOARGS},
{"get_width", (PyCFunction)image_surface_get_width, METH_NOARGS},
{NULL, NULL, 0, NULL},
};
PyTypeObject PycairoImageSurface_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"cairo.ImageSurface", /* tp_name */
sizeof(PycairoImageSurface), /* 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 */
&image_surface_as_buffer, /* 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 */
image_surface_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
&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)image_surface_new, /* tp_new */
0, /* tp_free */
0, /* tp_is_gc */
0, /* tp_bases */
};
#endif /* CAIRO_HAS_IMAGE_SURFACE */
/* Class PDFSurface(Surface) ---------------------------------------------- */
#ifdef CAIRO_HAS_PDF_SURFACE
#include
static PyObject *
pdf_surface_new (PyTypeObject *type, PyObject *args, PyObject *kwds) {
double width_in_points, height_in_points;
PyObject *obj, *writer;
cairo_surface_t *sfc;
if (!PyArg_ParseTuple(args, "Odd:PDFSurface.__new__",
&obj, &width_in_points, &height_in_points))
return NULL;
if (obj == Py_None) {
Py_BEGIN_ALLOW_THREADS;
sfc = cairo_pdf_surface_create (NULL, width_in_points, height_in_points);
Py_END_ALLOW_THREADS;
return PycairoSurface_FromSurface (sfc, NULL);
}else if (PyObject_TypeCheck (obj, &PyUnicode_Type)) {
/* filename (str) argument */
char *name = NULL; // the encoded filename
if (!PyArg_ParseTuple(args, "esdd:PDFSurface.__new__",
Py_FileSystemDefaultEncoding,
&name, &width_in_points, &height_in_points))
return NULL;
Py_BEGIN_ALLOW_THREADS;
sfc = cairo_pdf_surface_create (name, width_in_points, height_in_points);
Py_END_ALLOW_THREADS;
PyMem_Free(name);
return PycairoSurface_FromSurface (sfc, NULL);
}
/* file or file-like object argument */
writer = PyObject_GetAttrString (obj, "write");
if (writer == NULL || !PyCallable_Check (writer)) {
Py_XDECREF(writer);
PyErr_SetString(PyExc_TypeError,
"PDFSurface argument 1 must be\n"
" None, or\n"
" a filename (str), or\n"
" a file object, or\n"
" a file-like bytes-mode object which has a \"write\" method."
);
return NULL;
}
Py_DECREF(writer);
Py_BEGIN_ALLOW_THREADS;
sfc = cairo_pdf_surface_create_for_stream (_write_bytes_func, obj,
width_in_points, height_in_points);
Py_END_ALLOW_THREADS;
return PycairoSurface_FromSurface (sfc, obj);
}
static PyObject *
pdf_surface_set_size (PycairoPDFSurface *o, PyObject *args) {
double width_in_points, height_in_points;
if (!PyArg_ParseTuple(args, "dd:PDFSurface.set_size", &width_in_points,
&height_in_points))
return NULL;
cairo_pdf_surface_set_size (o->surface, width_in_points,
height_in_points);
Py_RETURN_NONE;
}
static PyMethodDef pdf_surface_methods[] = {
{"set_size", (PyCFunction)pdf_surface_set_size, METH_VARARGS },
{NULL, NULL, 0, NULL},
};
PyTypeObject PycairoPDFSurface_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"cairo.PDFSurface", /* tp_name */
sizeof(PycairoPDFSurface), /* 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 */
pdf_surface_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
&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)pdf_surface_new, /* tp_new */
0, /* tp_free */
0, /* tp_is_gc */
0, /* tp_bases */
};
#endif /* CAIRO_HAS_PDF_SURFACE */
/* Class PSSurface(Surface) ----------------------------------------------- */
#ifdef CAIRO_HAS_PS_SURFACE
#include
static PyObject *
ps_surface_new (PyTypeObject *type, PyObject *args, PyObject *kwds) {
double width_in_points, height_in_points;
PyObject *obj, *writer;
cairo_surface_t *sfc;
if (!PyArg_ParseTuple(args, "Odd:PSSurface.__new__",
&obj, &width_in_points, &height_in_points))
return NULL;
if (obj == Py_None) {
Py_BEGIN_ALLOW_THREADS;
sfc = cairo_ps_surface_create (NULL, width_in_points, height_in_points);
Py_END_ALLOW_THREADS;
return PycairoSurface_FromSurface (sfc, NULL);
}else if (PyObject_TypeCheck (obj, &PyUnicode_Type)) {
/* filename (str) argument */
char *name = NULL; // the encoded filename
if (!PyArg_ParseTuple(args, "esdd:PSSurface.__new__",
Py_FileSystemDefaultEncoding,
&name, &width_in_points, &height_in_points))
return NULL;
Py_BEGIN_ALLOW_THREADS;
sfc = cairo_ps_surface_create (name, width_in_points, height_in_points);
Py_END_ALLOW_THREADS;
PyMem_Free(name);
return PycairoSurface_FromSurface (sfc, NULL);
}
/* else: file or file-like object argument */
writer = PyObject_GetAttrString (obj, "write");
if (writer == NULL || !PyCallable_Check (writer)) {
Py_XDECREF(writer);
PyErr_SetString(PyExc_TypeError,
"PSSurface argument 1 must be\n"
" None, or\n"
" a filename (str), or\n"
" a file object, or\n"
" a file-like bytes-mode object which has a \"write\" method."
);
return NULL;
}
Py_DECREF(writer);
Py_BEGIN_ALLOW_THREADS;
sfc = cairo_ps_surface_create_for_stream (_write_bytes_func, obj,
width_in_points, height_in_points);
Py_END_ALLOW_THREADS;
return PycairoSurface_FromSurface (sfc, obj);
}
static PyObject *
ps_surface_dsc_begin_page_setup (PycairoPSSurface *o) {
cairo_ps_surface_dsc_begin_page_setup (o->surface);
RETURN_NULL_IF_CAIRO_SURFACE_ERROR(o->surface);
Py_RETURN_NONE;
}
static PyObject *
ps_surface_dsc_begin_setup (PycairoPSSurface *o) {
cairo_ps_surface_dsc_begin_setup (o->surface);
RETURN_NULL_IF_CAIRO_SURFACE_ERROR(o->surface);
Py_RETURN_NONE;
}
static PyObject *
ps_surface_dsc_comment (PycairoPSSurface *o, PyObject *args) {
const char *comment;
if (!PyArg_ParseTuple(args, "s:PSSurface.dsc_comment", &comment))
return NULL;
cairo_ps_surface_dsc_comment (o->surface, comment);
RETURN_NULL_IF_CAIRO_SURFACE_ERROR(o->surface);
Py_RETURN_NONE;
}
static PyObject *
ps_surface_get_eps (PycairoPSSurface *o) {
PyObject *eps = cairo_ps_surface_get_eps (o->surface) ? Py_True : Py_False;
RETURN_NULL_IF_CAIRO_SURFACE_ERROR(o->surface);
Py_INCREF(eps);
return eps;
}
/* METH_STATIC */
static PyObject *
ps_surface_ps_level_to_string (PyObject *self, PyObject *args) {
int level;
if (!PyArg_ParseTuple(args, "i:ps_level_to_string", &level))
return NULL;
const char *s = cairo_ps_level_to_string (level);
if (s == NULL){
PyErr_SetString(CairoError, "ps_level_to_string: "
"invalid level argument");
return NULL;
}
//return PyUnicode_FromString(s);
return PyUnicode_DecodeASCII(s, strlen(s), NULL);
}
static PyObject *
ps_surface_restrict_to_level (PycairoPSSurface *o, PyObject *args) {
int level;
if (!PyArg_ParseTuple(args, "i:PSSurface.restrict_to_level", &level))
return NULL;
cairo_ps_surface_restrict_to_level (o->surface, level);
RETURN_NULL_IF_CAIRO_SURFACE_ERROR(o->surface);
Py_RETURN_NONE;
}
static PyObject *
ps_surface_set_eps (PycairoPSSurface *o, PyObject *args) {
PyObject *py_eps;
if (!PyArg_ParseTuple(args, "O!:PSSurface.set_eps",
&PyBool_Type, &py_eps))
return NULL;
cairo_ps_surface_set_eps (o->surface, (py_eps == Py_True));
RETURN_NULL_IF_CAIRO_SURFACE_ERROR(o->surface);
Py_RETURN_NONE;
}
static PyObject *
ps_surface_set_size (PycairoPSSurface *o, PyObject *args) {
double width_in_points, height_in_points;
if (!PyArg_ParseTuple(args, "dd:PSSurface.set_size",
&width_in_points, &height_in_points))
return NULL;
cairo_ps_surface_set_size (o->surface, width_in_points, height_in_points);
Py_RETURN_NONE;
}
static PyMethodDef ps_surface_methods[] = {
{"dsc_begin_page_setup",
(PyCFunction)ps_surface_dsc_begin_page_setup, METH_NOARGS },
{"dsc_begin_setup", (PyCFunction)ps_surface_dsc_begin_setup, METH_NOARGS },
{"dsc_comment", (PyCFunction)ps_surface_dsc_comment, METH_VARARGS },
{"get_eps", (PyCFunction)ps_surface_get_eps, METH_NOARGS },
/* ps_get_levels - not implemented yet*/
{"ps_level_to_string", (PyCFunction)ps_surface_ps_level_to_string,
METH_VARARGS | METH_STATIC},
{"restrict_to_level", (PyCFunction)ps_surface_restrict_to_level,
METH_VARARGS },
{"set_eps", (PyCFunction)ps_surface_set_eps, METH_VARARGS },
{"set_size", (PyCFunction)ps_surface_set_size, METH_VARARGS },
{NULL, NULL, 0, NULL},
};
PyTypeObject PycairoPSSurface_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"cairo.PSSurface", /* tp_name */
sizeof(PycairoPSSurface), /* 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 */
ps_surface_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
&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)ps_surface_new, /* tp_new */
0, /* tp_free */
0, /* tp_is_gc */
0, /* tp_bases */
};
#endif /* CAIRO_HAS_PS_SURFACE */
/* Class RecordingSurface(Surface) ---------------------------------------- */
#ifdef CAIRO_HAS_RECORDING_SURFACE
static PyObject *
recording_surface_new (PyTypeObject *type, PyObject *args, PyObject *kwds) {
int content;
cairo_rectangle_t extents, *extents_ptr;
cairo_surface_t *sfc;
PyObject *extents_tuple;
if (!PyArg_ParseTuple(args, "iO:RecordingSurface.__new__",
&content, &extents_tuple))
return NULL;
if (extents_tuple == Py_None) {
extents_ptr = NULL;
} else {
if (!PyArg_ParseTuple(extents_tuple, "dddd", &extents.x, &extents.y,
&extents.width, &extents.height)) {
PyErr_SetString(PyExc_TypeError,
"RecordingSurface() argument 2 must be a "
"4-tuple of float");
return NULL;
}
extents_ptr = &extents;
}
Py_BEGIN_ALLOW_THREADS;
sfc = cairo_recording_surface_create (content, extents_ptr);
Py_END_ALLOW_THREADS;
return PycairoSurface_FromSurface (sfc, NULL);
}
static PyObject *
recording_surface_ink_extents (PycairoRecordingSurface *o) {
double x0, y0, width, height;
cairo_recording_surface_ink_extents(o->surface, &x0, &y0, &width, &height);
return Py_BuildValue("(dddd)", x0, y0, width, height);
}
static PyMethodDef recording_surface_methods[] = {
{"ink_extents", (PyCFunction)recording_surface_ink_extents, METH_NOARGS },
{NULL, NULL, 0, NULL},
};
PyTypeObject PycairoRecordingSurface_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"cairo.RecordingSurface", /* tp_name */
sizeof(PycairoRecordingSurface), /* 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 */
recording_surface_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
&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)recording_surface_new, /* tp_new */
0, /* tp_free */
0, /* tp_is_gc */
0, /* tp_bases */
};
#endif /* CAIRO_HAS_RECORDING_SURFACE */
/* Class SVGSurface(Surface) ----------------------------------------------- */
#ifdef CAIRO_HAS_SVG_SURFACE
#include
static PyObject *
svg_surface_new (PyTypeObject *type, PyObject *args, PyObject *kwds) {
double width_in_points, height_in_points;
PyObject *obj, *writer;
cairo_surface_t *sfc;
if (!PyArg_ParseTuple(args, "Odd:SVGSurface.__new__",
&obj, &width_in_points, &height_in_points))
return NULL;
if (obj == Py_None) {
Py_BEGIN_ALLOW_THREADS;
sfc = cairo_svg_surface_create (NULL, width_in_points, height_in_points);
Py_END_ALLOW_THREADS;
return PycairoSurface_FromSurface (sfc, NULL);
}else if (PyObject_TypeCheck (obj, &PyUnicode_Type)) {
/* filename (str) argument */
char *name = NULL; // the encoded filename
if (!PyArg_ParseTuple(args, "esdd:SVGSurface.__new__",
Py_FileSystemDefaultEncoding,
&name, &width_in_points, &height_in_points))
return NULL;
Py_BEGIN_ALLOW_THREADS;
sfc = cairo_svg_surface_create (name, width_in_points, height_in_points);
Py_END_ALLOW_THREADS;
PyMem_Free(name);
return PycairoSurface_FromSurface (sfc, NULL);
}
/* else: file or file-like object argument */
writer = PyObject_GetAttrString (obj, "write");
if (writer == NULL || !PyCallable_Check (writer)) {
Py_XDECREF(writer);
PyErr_SetString(PyExc_TypeError,
"SVGSurface argument 1 must be\n"
" None, or\n"
" a filename (str), or\n"
" a file object, or\n"
" a file-like text-mode object which has a \"write\" method."
);
return NULL;
}
Py_DECREF(writer);
Py_BEGIN_ALLOW_THREADS;
sfc = cairo_svg_surface_create_for_stream (_write_str_func, obj,
width_in_points, height_in_points);
Py_END_ALLOW_THREADS;
return PycairoSurface_FromSurface (sfc, obj);
}
static PyMethodDef svg_surface_methods[] = {
/* TODO
* cairo_svg_surface_restrict_to_version
* cairo_svg_get_versions
* cairo_svg_version_to_string
*/
{NULL, NULL, 0, NULL},
};
PyTypeObject PycairoSVGSurface_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"cairo.SVGSurface", /* tp_name */
sizeof(PycairoSVGSurface), /* 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 */
svg_surface_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
&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)svg_surface_new, /* tp_new */
0, /* tp_free */
0, /* tp_is_gc */
0, /* tp_bases */
};
#endif /* CAIRO_HAS_SVG_SURFACE */
#if CAIRO_HAS_WIN32_SURFACE
#include
/* Class Win32Surface(Surface) -------------------------------------------- */
static PyObject *
win32_surface_new (PyTypeObject *type, PyObject *args, PyObject *kwds) {
int hdc;
if (!PyArg_ParseTuple(args, "i:Win32Surface.__new__", &hdc))
return NULL;
return PycairoSurface_FromSurface (
cairo_win32_surface_create ((HDC)hdc), NULL);
}
static PyMethodDef win32_surface_methods[] = {
{NULL, NULL, 0, NULL},
};
PyTypeObject PycairoWin32Surface_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"cairo.Win32Surface", /* tp_name */
sizeof(PycairoWin32Surface), /* 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 */
win32_surface_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
&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)win32_surface_new, /* tp_new */
0, /* tp_free */
0, /* tp_is_gc */
0, /* tp_bases */
};
/* Class Win32PrintingSurface(Surface) ------------------------------------ */
static PyObject *
win32_printing_surface_new (PyTypeObject *type, PyObject *args,
PyObject *kwds) {
int hdc;
if (!PyArg_ParseTuple(args, "i:Win32PrintingSurface.__new__", &hdc))
return NULL;
return PycairoSurface_FromSurface (
cairo_win32_printing_surface_create ((HDC)hdc), NULL);
}
static PyMethodDef win32_printing_surface_methods[] = {
{NULL, NULL, 0, NULL},
};
PyTypeObject PycairoWin32PrintingSurface_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"cairo.Win32PrintingSurface", /* tp_name */
sizeof(PycairoWin32PrintingSurface), /* 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 */
win32_printing_surface_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
&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)win32_printing_surface_new,/* tp_new */
0, /* tp_free */
0, /* tp_is_gc */
0, /* tp_bases */
};
#endif /* CAIRO_HAS_WIN32_SURFACE */
/* Class XCBSurface(Surface) --------------------------------------------- */
#ifdef CAIRO_HAS_XCB_SURFACE
#include
#ifdef HAVE_XPYB
/** Convert a Python object from xpyb to a C struct matching libxcb type.
* The object must be referenced if you want to keep returned data away from
* garbage collection.
* @param obj The object to convert.
* @param len The size of the object read by Python.
* @return A pointer to that data.
*/
const void *
xpyb2struct(PyObject *obj, Py_ssize_t *len)
{
const void *data;
// buffer function disabled
return NULL;
if (PyObject_AsReadBuffer(obj, &data, len) < 0)
return NULL;
return data;
}
static int
have_xpyb(void)
{
static int have_xpyb = -1;
if(have_xpyb == -1) {
/* Get type from xpyb */
xpyb_IMPORT;
/* Some types are not defined in the CAPI */
PyObject *xpyb_module = PyImport_ImportModule("xcb.xproto");
if (xpyb_module) {
PyObject *dict = PyModule_GetDict(xpyb_module);
xpybVISUALTYPE_type = PyDict_GetItemString(dict, "VISUALTYPE");
Py_DECREF(xpyb_module);
have_xpyb = 1;
}
else
have_xpyb = 0;
}
return have_xpyb;
}
#endif
static PyObject *
xcb_surface_new (PyTypeObject *type, PyObject *args, PyObject *kwds) {
#ifdef HAVE_XPYB
int width, height;
xcb_drawable_t drawable;
PyObject *visual;
xpybConn *conn;
if(!have_xpyb())
return NULL;
if (!PyArg_ParseTuple(args, "O!IO!ii:XCBSurface.__new__",
xpyb_CAPI->xpybConn_type, &conn,
&drawable,
xpybVISUALTYPE_type, &visual,
&width, &height))
return NULL;
/* Convert Python object VISUALTYPE to a xcb_visualtype_t */
Py_ssize_t length;
xcb_visualtype_t *visualtype = (xcb_visualtype_t *) xpyb2struct(visual, &length);
if (length < sizeof(xcb_visualtype_t))
return NULL;
return PycairoSurface_FromSurface (
cairo_xcb_surface_create (conn->conn, drawable, visualtype,
width, height), NULL);
#else
PyErr_SetString(PyExc_TypeError,
"pycairo was not compiled with xpyb support");
return NULL;
#endif
}
#ifdef HAVE_XPYB
static PyObject *
xcb_surface_set_size (PycairoXCBSurface *o, PyObject *args) {
int width, height;
if (!PyArg_ParseTuple(args, "ii:XCBSurface.set_size", &width, &height))
return NULL;
cairo_xcb_surface_set_size (o->surface, width, height);
Py_RETURN_NONE;
}
#endif
static PyMethodDef xcb_surface_methods[] = {
#ifdef HAVE_XPYB
{"set_size", (PyCFunction)xcb_surface_set_size, METH_VARARGS },
#endif
{NULL, NULL, 0, NULL},
};
PyTypeObject PycairoXCBSurface_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"cairo.XCBSurface", /* tp_name */
sizeof(PycairoXCBSurface), /* 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 */
xcb_surface_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
&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)xcb_surface_new, /* tp_new */
0, /* tp_free */
0, /* tp_is_gc */
0, /* tp_bases */
};
#endif /* CAIRO_HAS_XCB_SURFACE */
/* Class XlibSurface(Surface) --------------------------------------------- */
#ifdef CAIRO_HAS_XLIB_SURFACE
#include
static PyObject *
xlib_surface_new (PyTypeObject *type, PyObject *args, PyObject *kwds) {
PyErr_SetString(PyExc_TypeError,
"The XlibSurface type cannot be directly instantiated");
return NULL;
}
static PyObject *
xlib_surface_get_depth (PycairoXlibSurface *o) {
return PyLong_FromLong (cairo_xlib_surface_get_depth (o->surface));
}
static PyObject *
xlib_surface_get_height (PycairoXlibSurface *o) {
return PyLong_FromLong (cairo_xlib_surface_get_height (o->surface));
}
static PyObject *
xlib_surface_get_width (PycairoXlibSurface *o) {
return PyLong_FromLong (cairo_xlib_surface_get_width (o->surface));
}
static PyMethodDef xlib_surface_methods[] = {
{"get_depth", (PyCFunction)xlib_surface_get_depth, METH_NOARGS },
{"get_height",(PyCFunction)xlib_surface_get_height, METH_NOARGS },
{"get_width", (PyCFunction)xlib_surface_get_width, METH_NOARGS },
{NULL, NULL, 0, NULL},
};
PyTypeObject PycairoXlibSurface_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"cairo.XlibSurface", /* tp_name */
sizeof(PycairoXlibSurface), /* 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 */
xlib_surface_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
&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)xlib_surface_new, /* tp_new */
0, /* tp_free */
0, /* tp_is_gc */
0, /* tp_bases */
};
#endif /* CAIRO_HAS_XLIB_SURFACE */