Author: tkreuzer Date: Thu Aug 18 13:09:36 2011 New Revision: 53297
URL: http://svn.reactos.org/svn/reactos?rev=53297&view=rev Log: [GDI FONT DRIVER] - Calculate fxMaxAscender/fcMaxDescender from the font bounding box, instead of the WinAscender/WinDescender values - Round these values to 16 (pixel accuracy), which fixes inconsistent height of marked text and the rest of the row in list boxes. This is most likely a Windows rounding bug.
Modified: branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/glyph.c
Modified: branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/glyph.c URL: http://svn.reactos.org/svn/reactos/branches/GSoC_2011/GdiFontDriver/drivers/... ============================================================================== --- branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/glyph.c [iso-8859-1] (original) +++ branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/glyph.c [iso-8859-1] Thu Aug 18 13:09:36 2011 @@ -152,17 +152,17 @@
/* Calculate maximum ascender and descender */ efTemp = efScaleY; - FLOATOBJ_MulLong(&efTemp, pface->ifiex.ifi.fwdWinAscender << 4); + FLOATOBJ_MulLong(&efTemp, ftface->bbox.yMax << 4); pfont->metrics.fxMaxAscender = FLOATOBJ_GetLong(&efTemp); efTemp = efScaleY; - FLOATOBJ_MulLong(&efTemp, pface->ifiex.ifi.fwdWinDescender << 4); + FLOATOBJ_MulLong(&efTemp, (-ftface->bbox.yMin) << 4); pfont->metrics.fxMaxDescender = FLOATOBJ_GetLong(&efTemp);
/* The coordinate transformation given by Windows transforms from font * space to device space. Since we use FT_Set_Char_Size, which allows * higher precision than FT_Set_Pixel_Sizes, we need to convert into - * points. So we multiply our scaling coefficients with 72 divided by - * the device resolution. We also need a 26.6 fixpoint value, so we + * points. So we multiply our scaling coefficients with 72 and divide + * by the device resolution. We also need a 26.6 fixpoint value, so we * multiply with 64. */ FLOATOBJ_MulLong(&efScaleX, 64 * pface->ifiex.ifi.fwdUnitsPerEm * 72); FLOATOBJ_DivLong(&efScaleX, pfo->sizLogResPpi.cx); @@ -386,8 +386,8 @@ }
/* Copy some values from the font structure */ - pfddm->fxMaxAscender = pfont->metrics.fxMaxAscender; - pfddm->fxMaxDescender = pfont->metrics.fxMaxDescender; + pfddm->fxMaxAscender = (pfont->metrics.fxMaxAscender + 15) & ~0x0f; + pfddm->fxMaxDescender = (pfont->metrics.fxMaxDescender + 15) & ~0x0f; pfddm->ptlUnderline1 = pfont->metrics.ptlUnderline1; pfddm->ptlStrikeout = pfont->metrics.ptlStrikeout; pfddm->ptlULThickness = pfont->metrics.ptlULThickness; @@ -606,11 +606,9 @@ }
/* Return the size for a bitmap at least 1x1 pixels */ - cx = pfont->ftface->glyph->bitmap.width; - cy = pfont->ftface->glyph->bitmap.rows; - return GLYPHBITS_SIZE(cx > 0 ? cx : 1, - cy > 0 ? cy : 1, - pfont->jBpp); + cx = max(1, pfont->ftface->glyph->bitmap.width); + cy = max(1, pfont->ftface->glyph->bitmap.rows); + return GLYPHBITS_SIZE(cx, cy, pfont->jBpp);
case QFD_GLYPHANDOUTLINE: TRACE("QFD_GLYPHANDOUTLINE\n");