Fix rendered characters have been chipped for some TrueType fonts

ImageFont ignores descender value of TrueType fonts (uses ascender only),
then some fonts which use descender is chipped on rendering.
This commit is contained in:
Takeshi KOMIYA 2013-01-31 14:52:15 +09:00
parent 8fc5fbc6c1
commit 103cf49c91

View File

@ -282,7 +282,7 @@ font_render(FontObject* self, PyObject* args)
{ {
int i, x, y; int i, x, y;
Imaging im; Imaging im;
int index, error, ascender; int index, error, ascender, descender;
int load_flags; int load_flags;
unsigned char *source; unsigned char *source;
FT_ULong ch; FT_ULong ch;
@ -332,6 +332,7 @@ font_render(FontObject* self, PyObject* args)
int xx, x0, x1; int xx, x0, x1;
source = (unsigned char*) glyph->bitmap.buffer; source = (unsigned char*) glyph->bitmap.buffer;
ascender = PIXEL(self->face->size->metrics.ascender); ascender = PIXEL(self->face->size->metrics.ascender);
descender = PIXEL(self->face->size->metrics.descender);
xx = x + glyph->bitmap_left; xx = x + glyph->bitmap_left;
x0 = 0; x0 = 0;
x1 = glyph->bitmap.width; x1 = glyph->bitmap.width;
@ -340,7 +341,7 @@ font_render(FontObject* self, PyObject* args)
if (xx + x1 > im->xsize) if (xx + x1 > im->xsize)
x1 = im->xsize - xx; x1 = im->xsize - xx;
for (y = 0; y < glyph->bitmap.rows; y++) { for (y = 0; y < glyph->bitmap.rows; y++) {
int yy = y + ascender - glyph->bitmap_top; int yy = y + ascender + descender - glyph->bitmap_top;
if (yy >= 0 && yy < im->ysize) { if (yy >= 0 && yy < im->ysize) {
/* blend this glyph into the buffer */ /* blend this glyph into the buffer */
unsigned char *target = im->image8[yy] + xx; unsigned char *target = im->image8[yy] + xx;
@ -361,6 +362,7 @@ font_render(FontObject* self, PyObject* args)
int xx, x0, x1; int xx, x0, x1;
source = (unsigned char*) glyph->bitmap.buffer; source = (unsigned char*) glyph->bitmap.buffer;
ascender = PIXEL(self->face->size->metrics.ascender); ascender = PIXEL(self->face->size->metrics.ascender);
descender = PIXEL(self->face->size->metrics.descender);
xx = x + glyph->bitmap_left; xx = x + glyph->bitmap_left;
x0 = 0; x0 = 0;
x1 = glyph->bitmap.width; x1 = glyph->bitmap.width;
@ -369,7 +371,7 @@ font_render(FontObject* self, PyObject* args)
if (xx + x1 > im->xsize) if (xx + x1 > im->xsize)
x1 = im->xsize - xx; x1 = im->xsize - xx;
for (y = 0; y < glyph->bitmap.rows; y++) { for (y = 0; y < glyph->bitmap.rows; y++) {
int yy = y + ascender - glyph->bitmap_top; int yy = y + ascender + descender - glyph->bitmap_top;
if (yy >= 0 && yy < im->ysize) { if (yy >= 0 && yy < im->ysize) {
/* blend this glyph into the buffer */ /* blend this glyph into the buffer */
int i; int i;