Merge pull request #1577 from radarhere/float

Changed arcs, chords and pie slices to use floats
This commit is contained in:
Hugo 2015-12-09 11:16:43 +02:00
commit 6e16168567
4 changed files with 41 additions and 28 deletions

View File

@ -58,13 +58,13 @@ class TestImageDraw(PillowTestCase):
self.assertRaises(ValueError, self.assertRaises(ValueError,
lambda: ImageDraw.ImageDraw(im, mode="L")) lambda: ImageDraw.ImageDraw(im, mode="L"))
def helper_arc(self, bbox): def helper_arc(self, bbox, start, end):
# Arrange # Arrange
im = Image.new("RGB", (W, H)) im = Image.new("RGB", (W, H))
draw = ImageDraw.Draw(im) draw = ImageDraw.Draw(im)
# Act # Act
draw.arc(bbox, 0, 180) draw.arc(bbox, start, end)
del draw del draw
# Assert # Assert
@ -72,10 +72,12 @@ class TestImageDraw(PillowTestCase):
im, Image.open("Tests/images/imagedraw_arc.png"), 1) im, Image.open("Tests/images/imagedraw_arc.png"), 1)
def test_arc1(self): def test_arc1(self):
self.helper_arc(BBOX1) self.helper_arc(BBOX1, 0, 180)
self.helper_arc(BBOX1, 0.5, 180.4)
def test_arc2(self): def test_arc2(self):
self.helper_arc(BBOX2) self.helper_arc(BBOX2, 0, 180)
self.helper_arc(BBOX2, 0.5, 180.4)
def test_bitmap(self): def test_bitmap(self):
# Arrange # Arrange
@ -91,13 +93,13 @@ class TestImageDraw(PillowTestCase):
self.assert_image_equal( self.assert_image_equal(
im, Image.open("Tests/images/imagedraw_bitmap.png")) im, Image.open("Tests/images/imagedraw_bitmap.png"))
def helper_chord(self, bbox): def helper_chord(self, bbox, start, end):
# Arrange # Arrange
im = Image.new("RGB", (W, H)) im = Image.new("RGB", (W, H))
draw = ImageDraw.Draw(im) draw = ImageDraw.Draw(im)
# Act # Act
draw.chord(bbox, 0, 180, fill="red", outline="yellow") draw.chord(bbox, start, end, fill="red", outline="yellow")
del draw del draw
# Assert # Assert
@ -105,10 +107,12 @@ class TestImageDraw(PillowTestCase):
im, Image.open("Tests/images/imagedraw_chord.png"), 1) im, Image.open("Tests/images/imagedraw_chord.png"), 1)
def test_chord1(self): def test_chord1(self):
self.helper_chord(BBOX1) self.helper_chord(BBOX1, 0, 180)
self.helper_chord(BBOX1, 0.5, 180.4)
def test_chord2(self): def test_chord2(self):
self.helper_chord(BBOX2) self.helper_chord(BBOX2, 0, 180)
self.helper_chord(BBOX2, 0.5, 180.4)
def helper_ellipse(self, bbox): def helper_ellipse(self, bbox):
# Arrange # Arrange
@ -161,13 +165,13 @@ class TestImageDraw(PillowTestCase):
def test_line2(self): def test_line2(self):
self.helper_line(POINTS2) self.helper_line(POINTS2)
def helper_pieslice(self, bbox): def helper_pieslice(self, bbox, start, end):
# Arrange # Arrange
im = Image.new("RGB", (W, H)) im = Image.new("RGB", (W, H))
draw = ImageDraw.Draw(im) draw = ImageDraw.Draw(im)
# Act # Act
draw.pieslice(bbox, -90, 45, fill="white", outline="blue") draw.pieslice(bbox, start, end, fill="white", outline="blue")
del draw del draw
# Assert # Assert
@ -175,10 +179,12 @@ class TestImageDraw(PillowTestCase):
im, Image.open("Tests/images/imagedraw_pieslice.png"), 1) im, Image.open("Tests/images/imagedraw_pieslice.png"), 1)
def test_pieslice1(self): def test_pieslice1(self):
self.helper_pieslice(BBOX1) self.helper_pieslice(BBOX1, -90, 45)
self.helper_pieslice(BBOX1, -90.5, 45.4)
def test_pieslice2(self): def test_pieslice2(self):
self.helper_pieslice(BBOX2) self.helper_pieslice(BBOX2, -90, 45)
self.helper_pieslice(BBOX2, -90.5, 45.4)
def helper_point(self, points): def helper_point(self, points):
# Arrange # Arrange

View File

@ -2382,9 +2382,9 @@ _draw_arc(ImagingDrawObject* self, PyObject* args)
PyObject* data; PyObject* data;
int ink; int ink;
int start, end; float start, end;
int op = 0; int op = 0;
if (!PyArg_ParseTuple(args, "Oiii|i", &data, &start, &end, &ink)) if (!PyArg_ParseTuple(args, "Offi|i", &data, &start, &end, &ink))
return NULL; return NULL;
n = PyPath_Flatten(data, &xy); n = PyPath_Flatten(data, &xy);
@ -2456,8 +2456,8 @@ _draw_chord(ImagingDrawObject* self, PyObject* args)
PyObject* data; PyObject* data;
int ink, fill; int ink, fill;
int start, end; float start, end;
if (!PyArg_ParseTuple(args, "Oiiii", if (!PyArg_ParseTuple(args, "Offii",
&data, &start, &end, &ink, &fill)) &data, &start, &end, &ink, &fill))
return NULL; return NULL;
@ -2677,8 +2677,8 @@ _draw_pieslice(ImagingDrawObject* self, PyObject* args)
PyObject* data; PyObject* data;
int ink, fill; int ink, fill;
int start, end; float start, end;
if (!PyArg_ParseTuple(args, "Oiiii", &data, &start, &end, &ink, &fill)) if (!PyArg_ParseTuple(args, "Offii", &data, &start, &end, &ink, &fill))
return NULL; return NULL;
n = PyPath_Flatten(data, &xy); n = PyPath_Flatten(data, &xy);

View File

@ -743,10 +743,11 @@ ImagingDrawBitmap(Imaging im, int x0, int y0, Imaging bitmap, const void* ink,
static int static int
ellipse(Imaging im, int x0, int y0, int x1, int y1, ellipse(Imaging im, int x0, int y0, int x1, int y1,
int start, int end, const void* ink_, int fill, float start, float end, const void* ink_, int fill,
int mode, int op) int mode, int op)
{ {
int i, n; float i;
int n;
int cx, cy; int cx, cy;
int w, h; int w, h;
int x = 0, y = 0; int x = 0, y = 0;
@ -779,7 +780,10 @@ ellipse(Imaging im, int x0, int y0, int x1, int y1,
n = 0; n = 0;
for (i = start; i <= end; i++) { for (i = start; i < end+1; i++) {
if (i > end) {
i = end;
}
x = FLOOR((cos(i*M_PI/180) * w/2) + cx + 0.5); x = FLOOR((cos(i*M_PI/180) * w/2) + cx + 0.5);
y = FLOOR((sin(i*M_PI/180) * h/2) + cy + 0.5); y = FLOOR((sin(i*M_PI/180) * h/2) + cy + 0.5);
if (i != start) if (i != start)
@ -807,7 +811,10 @@ ellipse(Imaging im, int x0, int y0, int x1, int y1,
} else { } else {
for (i = start; i <= end; i++) { for (i = start; i < end+1; i++) {
if (i > end) {
i = end;
}
x = FLOOR((cos(i*M_PI/180) * w/2) + cx + 0.5); x = FLOOR((cos(i*M_PI/180) * w/2) + cx + 0.5);
y = FLOOR((sin(i*M_PI/180) * h/2) + cy + 0.5); y = FLOOR((sin(i*M_PI/180) * h/2) + cy + 0.5);
if (i != start) if (i != start)
@ -835,14 +842,14 @@ ellipse(Imaging im, int x0, int y0, int x1, int y1,
int int
ImagingDrawArc(Imaging im, int x0, int y0, int x1, int y1, ImagingDrawArc(Imaging im, int x0, int y0, int x1, int y1,
int start, int end, const void* ink, int op) float start, float end, const void* ink, int op)
{ {
return ellipse(im, x0, y0, x1, y1, start, end, ink, 0, ARC, op); return ellipse(im, x0, y0, x1, y1, start, end, ink, 0, ARC, op);
} }
int int
ImagingDrawChord(Imaging im, int x0, int y0, int x1, int y1, ImagingDrawChord(Imaging im, int x0, int y0, int x1, int y1,
int start, int end, const void* ink, int fill, int op) float start, float end, const void* ink, int fill, int op)
{ {
return ellipse(im, x0, y0, x1, y1, start, end, ink, fill, CHORD, op); return ellipse(im, x0, y0, x1, y1, start, end, ink, fill, CHORD, op);
} }
@ -856,7 +863,7 @@ ImagingDrawEllipse(Imaging im, int x0, int y0, int x1, int y1,
int int
ImagingDrawPieslice(Imaging im, int x0, int y0, int x1, int y1, ImagingDrawPieslice(Imaging im, int x0, int y0, int x1, int y1,
int start, int end, const void* ink, int fill, int op) float start, float end, const void* ink, int fill, int op)
{ {
return ellipse(im, x0, y0, x1, y1, start, end, ink, fill, PIESLICE, op); return ellipse(im, x0, y0, x1, y1, start, end, ink, fill, PIESLICE, op);
} }

View File

@ -345,11 +345,11 @@ struct ImagingAffineMatrixInstance {
typedef struct ImagingAffineMatrixInstance *ImagingAffineMatrix; typedef struct ImagingAffineMatrixInstance *ImagingAffineMatrix;
extern int ImagingDrawArc(Imaging im, int x0, int y0, int x1, int y1, extern int ImagingDrawArc(Imaging im, int x0, int y0, int x1, int y1,
int start, int end, const void* ink, int op); float start, float end, const void* ink, int op);
extern int ImagingDrawBitmap(Imaging im, int x0, int y0, Imaging bitmap, extern int ImagingDrawBitmap(Imaging im, int x0, int y0, Imaging bitmap,
const void* ink, int op); const void* ink, int op);
extern int ImagingDrawChord(Imaging im, int x0, int y0, int x1, int y1, extern int ImagingDrawChord(Imaging im, int x0, int y0, int x1, int y1,
int start, int end, const void* ink, int fill, float start, float end, const void* ink, int fill,
int op); int op);
extern int ImagingDrawEllipse(Imaging im, int x0, int y0, int x1, int y1, extern int ImagingDrawEllipse(Imaging im, int x0, int y0, int x1, int y1,
const void* ink, int fill, int op); const void* ink, int fill, int op);
@ -358,7 +358,7 @@ extern int ImagingDrawLine(Imaging im, int x0, int y0, int x1, int y1,
extern int ImagingDrawWideLine(Imaging im, int x0, int y0, int x1, int y1, extern int ImagingDrawWideLine(Imaging im, int x0, int y0, int x1, int y1,
const void* ink, int width, int op); const void* ink, int width, int op);
extern int ImagingDrawPieslice(Imaging im, int x0, int y0, int x1, int y1, extern int ImagingDrawPieslice(Imaging im, int x0, int y0, int x1, int y1,
int start, int end, const void* ink, int fill, float start, float end, const void* ink, int fill,
int op); int op);
extern int ImagingDrawPoint(Imaging im, int x, int y, const void* ink, int op); extern int ImagingDrawPoint(Imaging im, int x, int y, const void* ink, int op);
extern int ImagingDrawPolygon(Imaging im, int points, int *xy, extern int ImagingDrawPolygon(Imaging im, int points, int *xy,