diff options
author | Alexander Smirnov <alex@ydb.tech> | 2025-05-14 00:51:55 +0000 |
---|---|---|
committer | Alexander Smirnov <alex@ydb.tech> | 2025-05-14 00:51:55 +0000 |
commit | b2d03716ee053cd32dccb8dd189d0b4bc3540d90 (patch) | |
tree | d329b3f92d5f80b8a76cac17d9e30bd1c8dc4b06 /contrib/python/matplotlib/py2/src/_backend_gdk.c | |
parent | 645c59acc8ced6d89eb8559e26a7405d42ae9fb4 (diff) | |
parent | 0bf9db6399352012396e7791bcfd762e944b33c2 (diff) | |
download | ydb-b2d03716ee053cd32dccb8dd189d0b4bc3540d90.tar.gz |
Merge branch 'rightlib' into merge-libs-250514-0050
Diffstat (limited to 'contrib/python/matplotlib/py2/src/_backend_gdk.c')
-rw-r--r-- | contrib/python/matplotlib/py2/src/_backend_gdk.c | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/contrib/python/matplotlib/py2/src/_backend_gdk.c b/contrib/python/matplotlib/py2/src/_backend_gdk.c new file mode 100644 index 00000000000..8314219cca2 --- /dev/null +++ b/contrib/python/matplotlib/py2/src/_backend_gdk.c @@ -0,0 +1,72 @@ +/* -*- mode: C; c-basic-offset: 4 -*- + * C extensions for backend_gdk + */ + +#include "Python.h" +#include "numpy/arrayobject.h" + +#include <pygtk/pygtk.h> + +static PyTypeObject *_PyGdkPixbuf_Type; +#define PyGdkPixbuf_Type (*_PyGdkPixbuf_Type) + +static PyObject *pixbuf_get_pixels_array(PyObject *self, PyObject *args) +{ + /* 1) read in Python pixbuf, get the underlying gdk_pixbuf */ + PyGObject *py_pixbuf; + GdkPixbuf *gdk_pixbuf; + PyArrayObject *array; + npy_intp dims[3] = { 0, 0, 3 }; + npy_intp strides[3]; + + if (!PyArg_ParseTuple(args, "O!:pixbuf_get_pixels_array", &PyGdkPixbuf_Type, &py_pixbuf)) + return NULL; + + gdk_pixbuf = GDK_PIXBUF(py_pixbuf->obj); + + /* 2) same as pygtk/gtk/gdk.c _wrap_gdk_pixbuf_get_pixels_array() + * with 'self' changed to py_pixbuf + */ + + dims[0] = gdk_pixbuf_get_height(gdk_pixbuf); + dims[1] = gdk_pixbuf_get_width(gdk_pixbuf); + if (gdk_pixbuf_get_has_alpha(gdk_pixbuf)) + dims[2] = 4; + + strides[0] = gdk_pixbuf_get_rowstride(gdk_pixbuf); + strides[1] = dims[2]; + strides[2] = 1; + + array = (PyArrayObject*) + PyArray_New(&PyArray_Type, 3, dims, NPY_UBYTE, strides, + (void*)gdk_pixbuf_get_pixels(gdk_pixbuf), 1, + NPY_ARRAY_WRITEABLE, NULL); + + if (array == NULL) + return NULL; + + /* the array holds a ref to the pixbuf pixels through this wrapper*/ + Py_INCREF(py_pixbuf); + if (PyArray_SetBaseObject(array, (PyObject *)py_pixbuf) == -1) { + Py_DECREF(py_pixbuf); + Py_DECREF(array); + return NULL; + } + return PyArray_Return(array); +} + +static PyMethodDef _backend_gdk_functions[] = { + { "pixbuf_get_pixels_array", (PyCFunction)pixbuf_get_pixels_array, METH_VARARGS }, + { NULL, NULL, 0 } +}; + +PyMODINIT_FUNC init_backend_gdk(void) +{ + PyObject *mod; + mod = Py_InitModule("matplotlib.backends._backend_gdk", _backend_gdk_functions); + import_array(); + init_pygtk(); + + mod = PyImport_ImportModule("gtk.gdk"); + _PyGdkPixbuf_Type = (PyTypeObject *)PyObject_GetAttrString(mod, "Pixbuf"); +} |