Author: tkreuzer
Date: Fri May 6 10:38:36 2011
New Revision: 51605
URL:
http://svn.reactos.org/svn/reactos?rev=51605&view=rev
Log:
[GDI FONT DRIVER]
- Don't return FM_INFO_RETURNS_OUTLINES, we don't support it yet
- In FtfdCreateFontInstance distinguish between scaling transformation and generic
transformations, handle the former
- Calculate font size and a number of other coordinates in device space when instantiating
a font
- Return these transformed coordinates in FtfdQueryMaxExtents
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
branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/todo.txt
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] Fri May
6 10:38:36 2011
@@ -107,7 +107,7 @@
if (pface->cRuns > 1)
pifi->flInfo |= FM_INFO_NOT_CONTIGUOUS;
if (pface->ulFontFormat != FMT_FNT)
- pifi->flInfo |= FM_INFO_RETURNS_OUTLINES | FM_INFO_ARB_XFORMS;
+ pifi->flInfo |= /*FM_INFO_RETURNS_OUTLINES |*/ FM_INFO_ARB_XFORMS;
pifi->flInfo |= FM_INFO_RIGHT_HANDED; // FIXME: how to determine?
/* Font style */
@@ -734,7 +734,6 @@
if (ppjTable) *ppjTable = pjTable;
if (pcjTable) *pcjTable = cjTable;
-
/* Check if we shall copy data */
if (pjBuf)
{
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] Fri May
6 10:38:36 2011
@@ -80,12 +80,30 @@
PFTFD_FACE apface[1];
} FTFD_FILE, *PFTFD_FILE;
+typedef union _FTFD_DEVICEMETRICS
+{
+ POINTL aptl[7];
+ struct
+ {
+ POINTFIX ptfxMaxAscender;
+ POINTFIX ptfxMaxDescender;
+ POINTL ptlUnderline1;
+ POINTL ptlStrikeout;
+ POINTL ptlULThickness;
+ POINTL ptlSOThickness;
+ SIZEL sizlMax;
+ };
+} FTFD_DEVICEMETRICS;
+
typedef struct
{
FONTOBJ *pfo;
PFTFD_FILE pfile;
+ PFTFD_FACE pface;
ULONG iFace;
FT_Face ftface;
+ FD_XFORM fdxQuantized;
+ FTFD_DEVICEMETRICS metrics;
HGLYPH hgSelected;
ULONG cjSelected;
} FTFD_FONT, *PFTFD_FONT;
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] Fri May
6 10:38:36 2011
@@ -9,6 +9,8 @@
/** Private Interface *********************************************************/
+#define FLOATL_1 0x3f800000
+
#define GLYPHBITS_SIZE(cx, cy, bpp) \
(FIELD_OFFSET(GLYPHBITS, aj) + ((((cx * bpp) + 31) >> 5) * cy * 4))
@@ -18,10 +20,17 @@
FONTOBJ *pfo)
{
PFTFD_FILE pfile = (PFTFD_FILE)pfo->iFile;
+ PFTFD_FACE pface = pfile->apface[pfo->iFace - 1];
PFTFD_FONT pfont;
XFORMOBJ* pxo;
+ XFORML xform;
+ FLOATOBJ_XFORM foxform;
FT_Error fterror;
FT_Face ftface;
+ FT_Matrix ftmatrix;
+ ULONG iComplexity;
+ LONG xScale, yScale;
+ FTFD_DEVICEMETRICS *pmetrics;
/* Allocate a font structure */
pfont = EngAllocMem(0, sizeof(FTFD_FONT), 0);
@@ -34,6 +43,7 @@
pfont->pfo = pfo;
pfont->pfile = pfile;
pfont->iFace = pfo->iFace;
+ pfont->pface = pface;
pfont->hgSelected = -1;
/* Create a freetype face */
@@ -53,24 +63,108 @@
pfont->ftface = ftface;
pxo = FONTOBJ_pxoGetXform(pfo);
-
- // divide into scaling and rotation / shearing
-
- fterror = FT_Set_Char_Size(ftface,
- 0,
- 16 * 64,
- pfo->sizLogResPpi.cx,
- pfo->sizLogResPpi.cy);
- if (fterror)
- {
- /* Failure! */
- DbgPrint("Error setting face size\n");
- return NULL;
- }
-
- /* Set non-orthogonal transformation */
- // FT_Set_Transform
-
+ if (!pxo)
+ {
+ // unhandled yet
+ __debugbreak();
+ }
+
+ /* Get a FLOATOBJ_XFORM matrix */
+ iComplexity = XFORMOBJ_iGetFloatObjXform(pxo, &foxform);
+ if (iComplexity == DDI_ERROR)
+ {
+ __debugbreak();
+ }
+
+ /* Check if there is rotation / shearing (cannot use iComplexity!?) */
+ if (foxform.eM12.ul1 != 0 || foxform.eM12.ul2 != 0 ||
+ foxform.eM21.ul1 != 0 || foxform.eM21.ul2 != 0)
+ {
+ __debugbreak();
+ // FIXME: need to calculate scaling
+
+ /* initialize a matrix */
+ ftmatrix.xx = 0x10000 * pface->ifiex.ifi.fwdUnitsPerEm * 72 /
+ pfo->sizLogResPpi.cx;
+ ftmatrix.xy = 0x00000000;
+ ftmatrix.yx = 0x00000000;
+ ftmatrix.yy = 0x10000 * pface->ifiex.ifi.fwdUnitsPerEm * 72 /
+ pfo->sizLogResPpi.cy;
+
+ /* Apply the XFORMOBJ to the matrix */
+ XFORMOBJ_bApplyXform(pxo, XF_LTOL, 2, &ftmatrix, &ftmatrix);
+
+ /* Set non-orthogonal transformation */
+ // FT_Set_Transform
+
+ }
+ else
+ {
+ /* The font sizes are calculated from the em height, multiplied with
+ * the diagonal matrix coefficients. Since the given xform translates
+ * into pixels and we need points (FT_Set_Char_Size allows higher
+ * precision than FT_Set_Pixel_Sizes), we multiply with 72 / dpi.
+ * The value is multiplied with 64 to yield a 26.6 fixed float. */
+ xScale = 64 * pface->ifiex.ifi.fwdUnitsPerEm * 72 / pfo->sizLogResPpi.cx;
+ FLOATOBJ_MulLong(&foxform.eM11, xScale);
+ yScale = 64 * pface->ifiex.ifi.fwdUnitsPerEm * 72 / pfo->sizLogResPpi.cy;
+ FLOATOBJ_MulLong(&foxform.eM22, yScale);
+
+ /* Get the final scaling values in 26.6 fixed float format */
+ xScale = FLOATOBJ_GetLong(&foxform.eM11);
+ yScale = FLOATOBJ_GetLong(&foxform.eM22);
+
+ /* Set the x and y character size for the font */
+ fterror = FT_Set_Char_Size(ftface,
+ xScale,
+ yScale,
+ pfo->sizLogResPpi.cx,
+ pfo->sizLogResPpi.cy);
+ if (fterror)
+ {
+ /* Failure! */
+ DbgPrint("Error setting face size\n");
+ return NULL;
+ }
+
+ }
+
+ // FIXME: quantize to 16.16 fixpoint
+ XFORMOBJ_iGetXform(pxo, &xform);
+ pfont->fdxQuantized.eXX = xform.eM11;
+ pfont->fdxQuantized.eXY = xform.eM12;
+ pfont->fdxQuantized.eYX = xform.eM21;
+ pfont->fdxQuantized.eYY = xform.eM22;
+
+ /* Prepare required coordinates in font space */
+ pmetrics = &pfont->metrics;
+ pmetrics->ptfxMaxAscender.x = 0;
+ pmetrics->ptfxMaxAscender.y = ftface->bbox.yMax << 4; // FIXME: not
exact
+ pmetrics->ptfxMaxDescender.x = 0;
+ pmetrics->ptfxMaxDescender.y = -ftface->bbox.yMin << 4; // FIXME: not
exact
+ pmetrics->ptlUnderline1.x = 0;
+ pmetrics->ptlUnderline1.y = -pface->ifiex.ifi.fwdUnderscorePosition;
+ pmetrics->ptlStrikeout.x = 0;
+ pmetrics->ptlStrikeout.y = -pface->ifiex.ifi.fwdStrikeoutPosition;;
+ pmetrics->ptlULThickness.x = 0;
+ pmetrics->ptlULThickness.y = pface->ifiex.ifi.fwdUnderscoreSize;
+ pmetrics->ptlSOThickness.x = 0;
+ pmetrics->ptlSOThickness.y = pface->ifiex.ifi.fwdStrikeoutSize;
+ pmetrics->sizlMax.cx = ftface->bbox.xMax - ftface->bbox.xMin;
+ pmetrics->sizlMax.cy = ftface->bbox.yMax - ftface->bbox.yMin;
+
+ /* Transform all coordinates into device space */
+ if (!XFORMOBJ_bApplyXform(pxo, XF_LTOL, 7, pmetrics->aptl, pmetrics->aptl))
+ {
+ __debugbreak();
+ }
+
+ /* Fixup some minimum values */
+ if (pmetrics->ptlULThickness.y <= 0) pmetrics->ptlULThickness.y = 1;
+ if (pmetrics->ptlSOThickness.y <= 0) pmetrics->ptlSOThickness.y = 1;
+
+DbgPrint("Created font with %ld (%ld)\n", yScale, yScale/64);
+//__debugbreak();
/* Set the pvProducer member of the fontobj */
pfo->pvProducer = pfont;
@@ -93,8 +187,6 @@
return pfont;
}
-#define FLOATL_1 0x3f800000
-
ULONG
NTAPI
FtfdQueryMaxExtents(
@@ -103,7 +195,10 @@
ULONG cjSize)
{
PFTFD_FONT pfont = FtfdGetFontInstance(pfo);
+ PFTFD_FACE pface = pfont->pface;
+ FT_Face ftface = pfont->ftface;
ULONG cjMaxWidth, cjMaxBitmapSize;
+ XFORMOBJ *pxo;
DbgPrint("FtfdQueryMaxExtents\n");
@@ -116,57 +211,60 @@
return FD_ERROR;
}
- //xScale = pfont->xScale;
- //yScale = pfont->yScale;
-
- /* Fill FD_DEVICEMETRICS */
+ /* Get the XFORMOBJ */
+ pxo = FONTOBJ_pxoGetXform(pfo);
+
+ /* Accelerator flags (ignored atm) */
pfddm->flRealizedType = 0;
+
+ /* Baseline vectors */
pfddm->pteBase.x = FLOATL_1;
pfddm->pteBase.y = 0;
pfddm->pteSide.x = 0;
- pfddm->pteSide.y = FLOATL_1;
- pfddm->ptlUnderline1.x = 0;
- pfddm->ptlUnderline1.y = 1;
- pfddm->ptlStrikeout.x = 0;
- pfddm->ptlStrikeout.y = -4;
- pfddm->ptlULThickness.x = 0;
- pfddm->ptlULThickness.y = 1;
- pfddm->ptlSOThickness.x = 0;
- pfddm->ptlSOThickness.y = 1;
+ pfddm->pteSide.y = 0xbf800000; //-FLOATL_1;
+
+ /* Transform the baseline vectors */
+ //XFORMOBJ_bApplyXformToFloat(pxo, 2, &pfddm->pteBase);
+
+ /* Fixed width advance */
+ if (ftface->face_flags & FT_FACE_FLAG_FIXED_WIDTH)
+ pfddm->lD = ftface->max_advance_width;
+ else
+ pfddm->lD = 0;
+
+ /* Copy the values from the font structure */
+ pfddm->fxMaxAscender = pfont->metrics.ptfxMaxAscender.y;
+ pfddm->fxMaxDescender = pfont->metrics.ptfxMaxDescender.y;
+ pfddm->ptlUnderline1 = pfont->metrics.ptlUnderline1;
+ pfddm->ptlStrikeout = pfont->metrics.ptlStrikeout;
+ pfddm->ptlULThickness = pfont->metrics.ptlULThickness;
+ pfddm->ptlSOThickness = pfont->metrics.ptlSOThickness;
+ pfddm->cxMax = pfont->metrics.sizlMax.cx;
+ pfddm->cyMax = pfont->metrics.sizlMax.cy;
+
+ /* Calculate Width in bytes */
+ cjMaxWidth = ((pfddm->cxMax + 7) >> 3);
+
+ /* Calculate size of the bitmap, rounded to DWORDs */
+ cjMaxBitmapSize = ((cjMaxWidth * pfddm->cyMax) + 3) & ~3;
+
+ /* cjGlyphMax is the full size of the GLYPHBITS structure */
+ pfddm->cjGlyphMax = FIELD_OFFSET(GLYPHBITS, aj) + cjMaxBitmapSize;
+
+ /* Copy the quantized matrix from the font structure */
+ pfddm->fdxQuantized = pfont->fdxQuantized;
+
+ pfddm->lNonLinearExtLeading = 0x00000000;
+ pfddm->lNonLinearIntLeading = 0x00000010;
+ pfddm->lNonLinearMaxCharWidth = 0x80000000;
+ pfddm->lNonLinearAvgCharWidth = 0x80000000;
+
pfddm->lMinA = 0;
pfddm->lMinC = 0;
pfddm->lMinD = 0;
-
-#if 0
- if (pfont->ulAngle == 90 || pfont->ulAngle == 270)
- {
- pfddm->cxMax = xScale * GETVAL(pFontInfo->dfPixHeight);
- pfddm->cyMax = yScale * GETVAL(pFontInfo->dfMaxWidth);
- pfddm->fxMaxAscender = yScale * GETVAL(pFontInfo->dfAscent) <<
4;
- pfddm->fxMaxDescender = (pfddm->cyMax << 4) -
pfddm->fxMaxAscender;
- }
- else
- {
- pfddm->cxMax = xScale * GETVAL(pFontInfo->dfMaxWidth);
- pfddm->cyMax = yScale * GETVAL(pFontInfo->dfPixHeight);
- pfddm->fxMaxAscender = yScale * GETVAL(pFontInfo->dfAscent) <<
4;
- pfddm->fxMaxDescender = (pfddm->cyMax << 4) -
pfddm->fxMaxAscender;
- }
-#endif
-
- pfddm->lD = pfddm->cxMax;
-
- /* Calculate Width in bytes */
- cjMaxWidth = ((pfddm->cxMax + 7) >> 3);
-
- /* Calculate size of the bitmap, rounded to DWORDs */
- cjMaxBitmapSize = ((cjMaxWidth * pfddm->cyMax) + 3) & ~3;
-
- /* cjGlyphMax is the full size of the GLYPHBITS structure */
- pfddm->cjGlyphMax = FIELD_OFFSET(GLYPHBITS, aj) + cjMaxBitmapSize;
-
- /* NOTE: fdxQuantized and NonLinear... stay unchanged */
- }
+ }
+
+__debugbreak();
/* Return the size of the structure */
return sizeof(FD_DEVICEMETRICS);
@@ -211,8 +309,6 @@
PFTFD_FONT pfont = pfo->pvProducer;
FT_GlyphSlot ftglyph = pfont->ftface->glyph;
-if (hg > 1) __debugbreak();
-
pgd->gdf.pgb = pvGlyphData;
pgd->hg = hg;
@@ -247,9 +343,6 @@
//pgd->ptqD.x.QuadPart = 0;
//pgd->ptqD.y.QuadPart = 0;
-
-if (hg > 1) __debugbreak();
-
}
VOID
@@ -261,15 +354,14 @@
{
PFTFD_FONT pfont = pfo->pvProducer;
FT_GlyphSlot ftglyph = pfont->ftface->glyph;
-
-if (hg > 1) __debugbreak();
pgb->ptlOrigin.x = 0;
pgb->ptlOrigin.y = 0;
pgb->sizlBitmap.cx = ftglyph->bitmap.width;
pgb->sizlBitmap.cy = ftglyph->bitmap.rows;
-if (hg > 1) __debugbreak();
+ DbgPrint("QueryGlyphBits for hg=%lx, cjSize=%ld\n", hg, cjSize);
+
}
VOID
@@ -425,7 +517,7 @@
}
else
{
- DbgPrint("Got advance width: hg=%lx, adv=%d\n", phg[i], advance
>> 12);
+ //DbgPrint("Got advance width: hg=%lx, adv=%d\n", phg[i], advance
>> 12);
pusWidths[i] = (USHORT)advance >> 12;
}
}
Modified: branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/todo.txt
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/GdiFontDriver/drivers…
==============================================================================
--- branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/todo.txt [iso-8859-1]
(original)
+++ branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/todo.txt [iso-8859-1] Fri May
6 10:38:36 2011
@@ -45,7 +45,7 @@
- FtfdCreateFontInstance: 80%
- handle XFORM (create a matrix and set freetype xform)
- FtfdGetFontInstance: 100% done
-- FtfdQueryMaxExtents: 10% done
+- FtfdQueryMaxExtents: 80% done
- FtfdLoadGlyph: 80% done
- hande accelerator flags for bitmap / outline