mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-01-13 02:36:17 +03:00
Merge pull request #2706 from wiredfool/issue_2666
Fix for crash drawing empty strings
This commit is contained in:
commit
39df75bd07
|
@ -394,10 +394,24 @@ class TestImageFont(PillowTestCase):
|
||||||
self.assert_image_equal(im, target_img)
|
self.assert_image_equal(im, target_img)
|
||||||
|
|
||||||
def test_getsize_empty(self):
|
def test_getsize_empty(self):
|
||||||
|
# issue #2614
|
||||||
font = self.get_font()
|
font = self.get_font()
|
||||||
# should not crash.
|
# should not crash.
|
||||||
self.assertEqual((0, 0), font.getsize(''))
|
self.assertEqual((0, 0), font.getsize(''))
|
||||||
|
|
||||||
|
def test_render_empty(self):
|
||||||
|
# issue 2666
|
||||||
|
font = self.get_font()
|
||||||
|
im = Image.new(mode='RGB', size=(300, 100))
|
||||||
|
target = im.copy()
|
||||||
|
draw = ImageDraw.Draw(im)
|
||||||
|
#should not crash here.
|
||||||
|
draw.text((10, 10), '', font=font)
|
||||||
|
self.assert_image_equal(im, target)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def _test_fake_loading_font(self, path_to_fake, fontname):
|
def _test_fake_loading_font(self, path_to_fake, fontname):
|
||||||
# Make a copy of FreeTypeFont so we can patch the original
|
# Make a copy of FreeTypeFont so we can patch the original
|
||||||
free_type_font = copy.deepcopy(ImageFont.FreeTypeFont)
|
free_type_font = copy.deepcopy(ImageFont.FreeTypeFont)
|
||||||
|
|
17
_imagingft.c
17
_imagingft.c
|
@ -225,6 +225,11 @@ text_layout_raqm(PyObject* string, FontObject* self, const char* dir,
|
||||||
if (PyUnicode_Check(string)) {
|
if (PyUnicode_Check(string)) {
|
||||||
Py_UNICODE *text = PyUnicode_AS_UNICODE(string);
|
Py_UNICODE *text = PyUnicode_AS_UNICODE(string);
|
||||||
Py_ssize_t size = PyUnicode_GET_SIZE(string);
|
Py_ssize_t size = PyUnicode_GET_SIZE(string);
|
||||||
|
if (! size) {
|
||||||
|
/* return 0 and clean up, no glyphs==no size,
|
||||||
|
and raqm fails with empty strings */
|
||||||
|
goto failed;
|
||||||
|
}
|
||||||
if (!raqm_set_text(rq, (const uint32_t *)(text), size)) {
|
if (!raqm_set_text(rq, (const uint32_t *)(text), size)) {
|
||||||
PyErr_SetString(PyExc_ValueError, "raqm_set_text() failed");
|
PyErr_SetString(PyExc_ValueError, "raqm_set_text() failed");
|
||||||
goto failed;
|
goto failed;
|
||||||
|
@ -234,6 +239,9 @@ text_layout_raqm(PyObject* string, FontObject* self, const char* dir,
|
||||||
else if (PyString_Check(string)) {
|
else if (PyString_Check(string)) {
|
||||||
char *text = PyString_AS_STRING(string);
|
char *text = PyString_AS_STRING(string);
|
||||||
int size = PyString_GET_SIZE(string);
|
int size = PyString_GET_SIZE(string);
|
||||||
|
if (! size) {
|
||||||
|
goto failed;
|
||||||
|
}
|
||||||
if (!raqm_set_text_utf8(rq, text, size)) {
|
if (!raqm_set_text_utf8(rq, text, size)) {
|
||||||
PyErr_SetString(PyExc_ValueError, "raqm_set_text_utf8() failed");
|
PyErr_SetString(PyExc_ValueError, "raqm_set_text_utf8() failed");
|
||||||
goto failed;
|
goto failed;
|
||||||
|
@ -450,6 +458,10 @@ font_getsize(FontObject* self, PyObject* args)
|
||||||
y_max = y_min = 0;
|
y_max = y_min = 0;
|
||||||
|
|
||||||
count = text_layout(string, self, dir, features, &glyph_info, 0);
|
count = text_layout(string, self, dir, features, &glyph_info, 0);
|
||||||
|
if (PyErr_Occurred()) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
for (x = i = 0; i < count; i++) {
|
for (x = i = 0; i < count; i++) {
|
||||||
int index, error;
|
int index, error;
|
||||||
|
@ -589,9 +601,12 @@ font_render(FontObject* self, PyObject* args)
|
||||||
|
|
||||||
glyph_info = NULL;
|
glyph_info = NULL;
|
||||||
count = text_layout(string, self, dir, features, &glyph_info, mask);
|
count = text_layout(string, self, dir, features, &glyph_info, mask);
|
||||||
if (count == 0) {
|
if (PyErr_Occurred()) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
if (count == 0) {
|
||||||
|
Py_RETURN_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
im = (Imaging) id;
|
im = (Imaging) id;
|
||||||
/* Note: bitmap fonts within ttf fonts do not work, see #891/pr#960 */
|
/* Note: bitmap fonts within ttf fonts do not work, see #891/pr#960 */
|
||||||
|
|
Loading…
Reference in New Issue
Block a user