Author: tkreuzer Date: Sun Aug 14 20:27:26 2011 New Revision: 53238
URL: http://svn.reactos.org/svn/reactos?rev=53238&view=rev Log: [GDI FONT DRIVER] - Set FM_INFO_OPTICALLY_FIXED_PITCH for fixed width fonts - Fix calculation of fixed width. Fixes display of fixed width fonts, like Lucida Console
Modified: branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/font.c branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/ftfd.h branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/glyph.c
Modified: branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/font.c URL: http://svn.reactos.org/svn/reactos/branches/GSoC_2011/GdiFontDriver/drivers/... ============================================================================== --- branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/font.c [iso-8859-1] (original) +++ branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/font.c [iso-8859-1] Sun Aug 14 20:27:26 2011 @@ -111,6 +111,8 @@ pifi->flInfo |= FM_INFO_NOT_CONTIGUOUS; if (pface->ulFontFormat != FMT_FNT) pifi->flInfo |= /*FM_INFO_RETURNS_OUTLINES |*/ FM_INFO_ARB_XFORMS; + if (ftface->face_flags & FT_FACE_FLAG_FIXED_WIDTH) + pifi->flInfo |= FM_INFO_OPTICALLY_FIXED_PITCH; pifi->flInfo |= FM_INFO_RIGHT_HANDED; // FIXME: how to determine?
/* Font resolution */
Modified: branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/ftfd.h URL: http://svn.reactos.org/svn/reactos/branches/GSoC_2011/GdiFontDriver/drivers/... ============================================================================== --- branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/ftfd.h [iso-8859-1] (original) +++ branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/ftfd.h [iso-8859-1] Sun Aug 14 20:27:26 2011 @@ -138,7 +138,7 @@ FLOATOBJ y; } POINTEF, *PPOINTEF;
-typedef struct +typedef struct _FTFD_FONT { FONTOBJ *pfo; PFTFD_FILE pfile;
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] Sun Aug 14 20:27:26 2011 @@ -305,6 +305,34 @@ return pfont; }
+static +BOOL +FtfdLoadGlyph( + PFTFD_FONT pfont, + HGLYPH hg, + ULONG iFormat) // 0 = bitmap, 1 = outline +{ + FT_Error fterror; + + /* Check if the glyph needs to be updated */ + if (pfont->hgSelected != hg) + { + /* Load the glyph into the freetype face slot */ + fterror = FT_Load_Glyph(pfont->ftface, hg, 0); + if (fterror) + { + WARN("Couldn't load glyph 0x%lx\n", hg); + pfont->hgSelected = -1; + return FALSE; + } + + /* Update the selected glyph */ + pfont->hgSelected = hg; + } + + return TRUE; +} + ULONG NTAPI FtfdQueryMaxExtents( @@ -331,11 +359,28 @@ /* Accelerator flags (ignored atm) */ pfddm->flRealizedType = 0;
- /* Set fixed width advance */ + /* Check for fixed width font */ if (FT_IS_FIXED_WIDTH(ftface)) - pfddm->lD = ftface->max_advance_width; + { + /* Make sure a glyph is loaded */ + if ((pfont->hgSelected != -1) || + FtfdLoadGlyph(pfont, 0, 0)) + { + /* Convert advance from 26.6 fixpoint to pixel format */ + pfddm->lD = pface->ftface->glyph->advance.x >> 6; + } + else + { + /* Fall back to dynamic pitch */ + WARN("Couldn't load a glyph\n"); + pfddm->lD = 0; + } + } else + { + /* Variable pitch */ pfddm->lD = 0; + }
/* Copy some values from the font structure */ pfddm->fxMaxAscender = pfont->metrics.fxMaxAscender; @@ -380,33 +425,6 @@ return sizeof(FD_DEVICEMETRICS); }
-static -BOOL -FtfdLoadGlyph( - PFTFD_FONT pfont, - HGLYPH hg, - ULONG iFormat) // 0 = bitmap, 1 = outline -{ - FT_Error fterror; - - /* Check if the glyph needs to be updated */ - if (pfont->hgSelected != hg) - { - /* Load the glyph into the freetype face slot */ - fterror = FT_Load_Glyph(pfont->ftface, hg, 0); - if (fterror) - { - WARN("Couldn't load glyph 0x%lx\n", hg); - pfont->hgSelected = -1; - return FALSE; - } - - /* Update the selected glyph */ - pfont->hgSelected = hg; - } - - return TRUE; -}
static VOID @@ -436,8 +454,8 @@ pgd->fxAB = pgd->fxA + ftglyph->metrics.height; }
- /* D is the glyph advance width */ - pgd->fxD = ftglyph->advance.x / 4; // FIXME: should be projected on the x-axis + /* D is the glyph advance width. Convert it from 26.6 to 28.4 fixpoint format */ + pgd->fxD = ftglyph->advance.x >> 2; // FIXME: should be projected on the x-axis
/* Get the bitnmap size */ sizlBitmap.cx = ftglyph->bitmap.width;