Pillow/src/outline.c
Axel Huebl f79379ed7c Imaging.h: confusion with system
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.
2020-09-17 18:06:45 +10:00

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*/
};