Skip to content

Commit

Permalink
Do not presume that the last glyph has the max x value
Browse files Browse the repository at this point in the history
  • Loading branch information
radarhere committed May 23, 2019
1 parent 2c5e1f9 commit c004131
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 18 deletions.
Binary file added Tests/fonts/ArefRuqaa-Regular.ttf
Binary file not shown.
7 changes: 3 additions & 4 deletions Tests/fonts/LICENSE.txt
@@ -1,9 +1,8 @@

NotoNastaliqUrdu-Regular.ttf:
NotoNastaliqUrdu-Regular.ttf (from https://github.com/googlei18n/noto-fonts)
ArefRuqaa-Regular.ttf (from https://github.com/google/fonts/tree/master/ofl/arefruqaa)

(from https://github.com/googlei18n/noto-fonts)

All Noto fonts are published under the SIL Open Font License (OFL) v1.1 (http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL), which allows you to copy, modify, and redistribute them if you need to.
All of the above fonts are published under the SIL Open Font License (OFL) v1.1 (http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL), which allows you to copy, modify, and redistribute them if you need to.


10x20-ISO8859-1.pcf
Expand Down
Binary file added Tests/images/test_x_max_and_y_offset.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 12 additions & 0 deletions Tests/test_imagefontctl.py
Expand Up @@ -143,6 +143,18 @@ def test_arabictext_features(self):

self.assert_image_similar(im, target_img, .5)

def test_x_max_and_y_offset(self):
ttf = ImageFont.truetype("Tests/fonts/ArefRuqaa-Regular.ttf", 40)

im = Image.new(mode='RGB', size=(50, 100))
draw = ImageDraw.Draw(im)
draw.text((0, 0), 'لح', font=ttf, fill=500)

target = 'Tests/images/test_x_max_and_y_offset.png'
target_img = Image.open(target)

self.assert_image_similar(im, target_img, .5)

def test_language(self):
ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE)

Expand Down
27 changes: 13 additions & 14 deletions src/_imagingft.c
Expand Up @@ -604,7 +604,7 @@ text_layout(PyObject* string, FontObject* self, const char* dir, PyObject *featu
static PyObject*
font_getsize(FontObject* self, PyObject* args)
{
int i, x, y_max, y_min;
int i, x, x_max, y_max, y_min;
FT_Face face;
int xoffset, yoffset;
const char *dir = NULL;
Expand All @@ -621,7 +621,7 @@ font_getsize(FontObject* self, PyObject* args)

face = NULL;
xoffset = yoffset = 0;
y_max = y_min = 0;
x_max = y_max = y_min = 0;

count = text_layout(string, self, dir, features, lang, &glyph_info, 0);
if (PyErr_Occurred()) {
Expand All @@ -630,7 +630,7 @@ font_getsize(FontObject* self, PyObject* args)


for (x = i = 0; i < count; i++) {
int index, error;
int index, error, offset, x_advanced;
FT_BBox bbox;
FT_Glyph glyph;
face = self->face;
Expand All @@ -649,15 +649,14 @@ font_getsize(FontObject* self, PyObject* args)

x += glyph_info[i].x_advance;

if (i == count - 1)
{
int offset;
offset = glyph_info[i].x_advance -
face->glyph->metrics.width -
face->glyph->metrics.horiBearingX;
if (offset < 0)
x -= offset;
}
x_advanced = x;
offset = glyph_info[i].x_advance -
face->glyph->metrics.width -
face->glyph->metrics.horiBearingX;
if (offset < 0)
x_advanced -= offset;
if (x_advanced > x_max)
x_max = x_advanced;

FT_Get_Glyph(face->glyph, &glyph);
FT_Glyph_Get_CBox(glyph, FT_GLYPH_BBOX_SUBPIXELS, &bbox);
Expand All @@ -684,7 +683,7 @@ font_getsize(FontObject* self, PyObject* args)

/* left bearing */
if (xoffset < 0)
x -= xoffset;
x_max -= xoffset;
else
xoffset = 0;
/* difference between the font ascender and the distance of
Expand All @@ -694,7 +693,7 @@ font_getsize(FontObject* self, PyObject* args)

return Py_BuildValue(
"(ii)(ii)",
PIXEL(x), PIXEL(y_max - y_min),
PIXEL(x_max), PIXEL(y_max - y_min),
PIXEL(xoffset), yoffset
);
}
Expand Down

0 comments on commit c004131

Please sign in to comment.