Both kinds of bounding box for arc, chord and pieslice.

This commit is contained in:
hugovk 2014-05-27 16:58:26 +03:00
parent 8f92562ec3
commit ae37743ac7
2 changed files with 86 additions and 29 deletions

View File

@ -62,7 +62,7 @@ def helper_arc(bbox):
def test_arc1(): def test_arc1():
assert_exception(TypeError, lambda: helper_arc(bbox1)) helper_arc(bbox1)
def test_arc2(): def test_arc2():
@ -97,7 +97,7 @@ def helper_chord(bbox):
def test_chord1(): def test_chord1():
assert_exception(TypeError, lambda: helper_chord(bbox1)) helper_chord(bbox1)
def test_chord2(): def test_chord2():
@ -160,7 +160,7 @@ def helper_pieslice(bbox):
def test_pieslice1(): def test_pieslice1():
assert_exception(TypeError, lambda: helper_pieslice(bbox1)) helper_pieslice(bbox1)
def test_pieslice2(): def test_pieslice2():

View File

@ -2252,17 +2252,17 @@ void _font_text_asBytes(PyObject* encoded_string, unsigned char** text){
if (bytes) { if (bytes) {
*text = (unsigned char*)PyBytes_AsString(bytes); *text = (unsigned char*)PyBytes_AsString(bytes);
return; return;
} }
#if PY_VERSION_HEX < 0x03000000 #if PY_VERSION_HEX < 0x03000000
/* likely case here is py2.x with an ordinary string. /* likely case here is py2.x with an ordinary string.
but this isn't defined in Py3.x */ but this isn't defined in Py3.x */
if (PyString_Check(encoded_string)) { if (PyString_Check(encoded_string)) {
*text = (unsigned char *)PyString_AsString(encoded_string); *text = (unsigned char *)PyString_AsString(encoded_string);
} }
#endif #endif
} }
static PyObject* static PyObject*
_font_getmask(ImagingFontObject* self, PyObject* args) _font_getmask(ImagingFontObject* self, PyObject* args)
@ -2336,7 +2336,7 @@ _font_getsize(ImagingFontObject* self, PyObject* args)
return NULL; return NULL;
} }
return Py_BuildValue("ii", textwidth(self, text), self->ysize); return Py_BuildValue("ii", textwidth(self, text), self->ysize);
} }
static struct PyMethodDef _font_methods[] = { static struct PyMethodDef _font_methods[] = {
@ -2399,17 +2399,35 @@ _draw_ink(ImagingDrawObject* self, PyObject* args)
static PyObject* static PyObject*
_draw_arc(ImagingDrawObject* self, PyObject* args) _draw_arc(ImagingDrawObject* self, PyObject* args)
{ {
int x0, y0, x1, y1; double* xy;
int n;
PyObject* data;
int ink; int ink;
int start, end; int start, end;
int op = 0; int op = 0;
if (!PyArg_ParseTuple(args, "(iiii)iii|i", if (!PyArg_ParseTuple(args, "Oiii|i", &data, &start, &end, &ink))
&x0, &y0, &x1, &y1,
&start, &end, &ink))
return NULL; return NULL;
if (ImagingDrawArc(self->image->image, x0, y0, x1, y1, start, end, n = PyPath_Flatten(data, &xy);
&ink, op) < 0) if (n < 0)
return NULL;
if (n != 2) {
PyErr_SetString(PyExc_TypeError,
"coordinate list must contain exactly 2 coordinates"
);
return NULL;
}
n = ImagingDrawArc(self->image->image,
(int) xy[0], (int) xy[1],
(int) xy[2], (int) xy[3],
start, end, &ink, op
);
free(xy);
if (n < 0)
return NULL; return NULL;
Py_INCREF(Py_None); Py_INCREF(Py_None);
@ -2455,15 +2473,35 @@ _draw_bitmap(ImagingDrawObject* self, PyObject* args)
static PyObject* static PyObject*
_draw_chord(ImagingDrawObject* self, PyObject* args) _draw_chord(ImagingDrawObject* self, PyObject* args)
{ {
int x0, y0, x1, y1; double* xy;
int n;
PyObject* data;
int ink, fill; int ink, fill;
int start, end; int start, end;
if (!PyArg_ParseTuple(args, "(iiii)iiii", if (!PyArg_ParseTuple(args, "Oiiii",
&x0, &y0, &x1, &y1, &start, &end, &ink, &fill)) &data, &start, &end, &ink, &fill))
return NULL; return NULL;
if (ImagingDrawChord(self->image->image, x0, y0, x1, y1, n = PyPath_Flatten(data, &xy);
start, end, &ink, fill, self->blend) < 0) if (n < 0)
return NULL;
if (n != 2) {
PyErr_SetString(PyExc_TypeError,
"coordinate list must contain exactly 2 coordinates"
);
return NULL;
}
n = ImagingDrawChord(self->image->image,
(int) xy[0], (int) xy[1],
(int) xy[2], (int) xy[3],
start, end, &ink, fill, self->blend
);
free(xy);
if (n < 0)
return NULL; return NULL;
Py_INCREF(Py_None); Py_INCREF(Py_None);
@ -2492,8 +2530,8 @@ _draw_ellipse(ImagingDrawObject* self, PyObject* args)
return NULL; return NULL;
} }
n = ImagingDrawEllipse(self->image->image, n = ImagingDrawEllipse(self->image->image,
(int) xy[0], (int) xy[1], (int) xy[0], (int) xy[1],
(int) xy[2], (int) xy[3], (int) xy[2], (int) xy[3],
&ink, fill, self->blend &ink, fill, self->blend
); );
@ -2656,15 +2694,34 @@ _draw_outline(ImagingDrawObject* self, PyObject* args)
static PyObject* static PyObject*
_draw_pieslice(ImagingDrawObject* self, PyObject* args) _draw_pieslice(ImagingDrawObject* self, PyObject* args)
{ {
int x0, y0, x1, y1; double* xy;
int n;
PyObject* data;
int ink, fill; int ink, fill;
int start, end; int start, end;
if (!PyArg_ParseTuple(args, "(iiii)iiii", if (!PyArg_ParseTuple(args, "Oiiii", &data, &start, &end, &ink, &fill))
&x0, &y0, &x1, &y1, &start, &end, &ink, &fill))
return NULL; return NULL;
if (ImagingDrawPieslice(self->image->image, x0, y0, x1, y1, n = PyPath_Flatten(data, &xy);
start, end, &ink, fill, self->blend) < 0) if (n < 0)
return NULL;
if (n != 2) {
PyErr_SetString(PyExc_TypeError,
"coordinate list must contain exactly 2 coordinates"
);
return NULL;
}
n = ImagingDrawPieslice(self->image->image,
(int) xy[0], (int) xy[1],
(int) xy[2], (int) xy[3],
start, end, &ink, fill, self->blend
);
free(xy);
if (n < 0)
return NULL; return NULL;
Py_INCREF(Py_None); Py_INCREF(Py_None);
@ -2738,9 +2795,9 @@ _draw_rectangle(ImagingDrawObject* self, PyObject* args)
return NULL; return NULL;
} }
n = ImagingDrawRectangle(self->image->image, n = ImagingDrawRectangle(self->image->image,
(int) xy[0], (int) xy[1], (int) xy[0], (int) xy[1],
(int) xy[2], (int) xy[3], (int) xy[2], (int) xy[3],
&ink, fill, self->blend &ink, fill, self->blend
); );
@ -3117,8 +3174,8 @@ _getattr_ptr(ImagingObject* self, void* closure)
static PyObject* static PyObject*
_getattr_unsafe_ptrs(ImagingObject* self, void* closure) _getattr_unsafe_ptrs(ImagingObject* self, void* closure)
{ {
return Py_BuildValue("(ss)(si)(si)(si)(si)(si)(sn)(sn)(sn)(sn)(sn)(si)(si)(sn)", return Py_BuildValue("(ss)(si)(si)(si)(si)(si)(sn)(sn)(sn)(sn)(sn)(si)(si)(sn)",
"mode", self->image->mode, "mode", self->image->mode,
"type", self->image->type, "type", self->image->type,
"depth", self->image->depth, "depth", self->image->depth,
"bands", self->image->bands, "bands", self->image->bands,