mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-03-16 08:12:12 +03:00
The file `libImaging/Imaging.h` gets installed flat on Ubuntus into the public Python includes. When building a newer version of Pillow from source and hinting the Python includes "too early" in includes, e.g. in package managers, this can confuse the two files and pick up the external file over the internal one. With different versions, this mismatch can lead to build errors, e.g. undefined macros. The most robust way to avoid this is to pre-fix the internal include accordingly, so that the relative path to the including file has to match as well.
202 lines
5.0 KiB
C
202 lines
5.0 KiB
C
/*
|
|
* THIS IS WORK IN PROGRESS.
|
|
*
|
|
* The Python Imaging Library.
|
|
*
|
|
* "arrow" outline stuff. the contents of this module
|
|
* will be merged with the path module and the rest of
|
|
* the arrow graphics package, but not before PIL 1.1.
|
|
* use at your own risk.
|
|
*
|
|
* history:
|
|
* 99-01-10 fl Added to PIL (experimental)
|
|
*
|
|
* Copyright (c) Secret Labs AB 1999.
|
|
* Copyright (c) Fredrik Lundh 1999.
|
|
*
|
|
* See the README file for information on usage and redistribution.
|
|
*/
|
|
|
|
#include "Python.h"
|
|
|
|
#include "libImaging/Imaging.h"
|
|
|
|
|
|
/* -------------------------------------------------------------------- */
|
|
/* Class */
|
|
|
|
typedef struct {
|
|
PyObject_HEAD
|
|
ImagingOutline outline;
|
|
} OutlineObject;
|
|
|
|
static PyTypeObject OutlineType;
|
|
|
|
#define PyOutline_Check(op) (Py_TYPE(op) == &OutlineType)
|
|
|
|
static OutlineObject*
|
|
_outline_new(void)
|
|
{
|
|
OutlineObject *self;
|
|
|
|
if (PyType_Ready(&OutlineType) < 0) {
|
|
return NULL;
|
|
}
|
|
|
|
self = PyObject_New(OutlineObject, &OutlineType);
|
|
if (self == NULL) {
|
|
return NULL;
|
|
}
|
|
|
|
self->outline = ImagingOutlineNew();
|
|
|
|
return self;
|
|
}
|
|
|
|
static void
|
|
_outline_dealloc(OutlineObject* self)
|
|
{
|
|
ImagingOutlineDelete(self->outline);
|
|
PyObject_Del(self);
|
|
}
|
|
|
|
ImagingOutline
|
|
PyOutline_AsOutline(PyObject* outline)
|
|
{
|
|
if (PyOutline_Check(outline)) {
|
|
return ((OutlineObject*) outline)->outline;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
|
|
/* -------------------------------------------------------------------- */
|
|
/* Factories */
|
|
|
|
PyObject*
|
|
PyOutline_Create(PyObject* self, PyObject* args)
|
|
{
|
|
if (!PyArg_ParseTuple(args, ":outline")) {
|
|
return NULL;
|
|
}
|
|
|
|
return (PyObject*) _outline_new();
|
|
}
|
|
|
|
|
|
/* -------------------------------------------------------------------- */
|
|
/* Methods */
|
|
|
|
static PyObject*
|
|
_outline_move(OutlineObject* self, PyObject* args)
|
|
{
|
|
float x0, y0;
|
|
if (!PyArg_ParseTuple(args, "ff", &x0, &y0)) {
|
|
return NULL;
|
|
}
|
|
|
|
ImagingOutlineMove(self->outline, x0, y0);
|
|
|
|
Py_INCREF(Py_None);
|
|
return Py_None;
|
|
}
|
|
|
|
static PyObject*
|
|
_outline_line(OutlineObject* self, PyObject* args)
|
|
{
|
|
float x1, y1;
|
|
if (!PyArg_ParseTuple(args, "ff", &x1, &y1)) {
|
|
return NULL;
|
|
}
|
|
|
|
ImagingOutlineLine(self->outline, x1, y1);
|
|
|
|
Py_INCREF(Py_None);
|
|
return Py_None;
|
|
}
|
|
|
|
static PyObject*
|
|
_outline_curve(OutlineObject* self, PyObject* args)
|
|
{
|
|
float x1, y1, x2, y2, x3, y3;
|
|
if (!PyArg_ParseTuple(args, "ffffff", &x1, &y1, &x2, &y2, &x3, &y3)) {
|
|
return NULL;
|
|
}
|
|
|
|
ImagingOutlineCurve(self->outline, x1, y1, x2, y2, x3, y3);
|
|
|
|
Py_INCREF(Py_None);
|
|
return Py_None;
|
|
}
|
|
|
|
static PyObject*
|
|
_outline_close(OutlineObject* self, PyObject* args)
|
|
{
|
|
if (!PyArg_ParseTuple(args, ":close")) {
|
|
return NULL;
|
|
}
|
|
|
|
ImagingOutlineClose(self->outline);
|
|
|
|
Py_INCREF(Py_None);
|
|
return Py_None;
|
|
}
|
|
|
|
static PyObject*
|
|
_outline_transform(OutlineObject* self, PyObject* args)
|
|
{
|
|
double a[6];
|
|
if (!PyArg_ParseTuple(args, "(dddddd)", a+0, a+1, a+2, a+3, a+4, a+5)) {
|
|
return NULL;
|
|
}
|
|
|
|
ImagingOutlineTransform(self->outline, a);
|
|
|
|
Py_INCREF(Py_None);
|
|
return Py_None;
|
|
}
|
|
|
|
static struct PyMethodDef _outline_methods[] = {
|
|
{"line", (PyCFunction)_outline_line, 1},
|
|
{"curve", (PyCFunction)_outline_curve, 1},
|
|
{"move", (PyCFunction)_outline_move, 1},
|
|
{"close", (PyCFunction)_outline_close, 1},
|
|
{"transform", (PyCFunction)_outline_transform, 1},
|
|
{NULL, NULL} /* sentinel */
|
|
};
|
|
|
|
static PyTypeObject OutlineType = {
|
|
PyVarObject_HEAD_INIT(NULL, 0)
|
|
"Outline", /*tp_name*/
|
|
sizeof(OutlineObject), /*tp_size*/
|
|
0, /*tp_itemsize*/
|
|
/* methods */
|
|
(destructor)_outline_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, /*tp_flags*/
|
|
0, /*tp_doc*/
|
|
0, /*tp_traverse*/
|
|
0, /*tp_clear*/
|
|
0, /*tp_richcompare*/
|
|
0, /*tp_weaklistoffset*/
|
|
0, /*tp_iter*/
|
|
0, /*tp_iternext*/
|
|
_outline_methods, /*tp_methods*/
|
|
0, /*tp_members*/
|
|
0, /*tp_getset*/
|
|
};
|