aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python/matplotlib/py2/src/_backend_gdk.c
diff options
context:
space:
mode:
authorAlexander Smirnov <alex@ydb.tech>2025-05-14 00:51:55 +0000
committerAlexander Smirnov <alex@ydb.tech>2025-05-14 00:51:55 +0000
commitb2d03716ee053cd32dccb8dd189d0b4bc3540d90 (patch)
treed329b3f92d5f80b8a76cac17d9e30bd1c8dc4b06 /contrib/python/matplotlib/py2/src/_backend_gdk.c
parent645c59acc8ced6d89eb8559e26a7405d42ae9fb4 (diff)
parent0bf9db6399352012396e7791bcfd762e944b33c2 (diff)
downloadydb-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.c72
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");
+}