Author: tkreuzer Date: Sat May 7 13:36:02 2011 New Revision: 51618
URL: http://svn.reactos.org/svn/reactos?rev=51618&view=rev Log: [GDI FONT DRIVER] - Make use of debugging macros (TRACE, WARN, ASSERT) - Handle unaligned data in the TrueType tables (arm for example doesn't like accessing unaligned data) - Handle ulFont in FtfdQueryTrueTypeTable - some interface cleanup
Added: branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/tttables.c - copied, changed from r51589, branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/opentype.c branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/tttables.h (with props) Removed: branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/opentype.c Modified: branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/CMakeLists.txt branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/enable.c 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/CMakeLists.txt URL: http://svn.reactos.org/svn/reactos/branches/GSoC_2011/GdiFontDriver/drivers/... ============================================================================== --- branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/CMakeLists.txt [iso-8859-1] (original) +++ branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/CMakeLists.txt [iso-8859-1] Sat May 7 13:36:02 2011 @@ -7,7 +7,7 @@ enable.c font.c glyph.c - opentype.c + tttables.c rosglue.c ${CMAKE_CURRENT_BINARY_DIR}/ftfd.def)
Modified: branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/enable.c URL: http://svn.reactos.org/svn/reactos/branches/GSoC_2011/GdiFontDriver/drivers/... ============================================================================== --- branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/enable.c [iso-8859-1] (original) +++ branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/enable.c [iso-8859-1] Sat May 7 13:36:02 2011 @@ -41,7 +41,7 @@ { FT_Error fterror;
- DbgPrint("FtfdEnableDriver()\n"); + TRACE("FtfdEnableDriver()\n");
/* Check parameter */ if (cj < sizeof(DRVENABLEDATA)) @@ -53,7 +53,7 @@ fterror = FT_Init_FreeType(&gftlibrary); if (fterror) { - DbgPrint("an error occurred during library initialization: %ld.\n", fterror); + WARN("Failed to initialize freetype library: %ld.\n", fterror); return FALSE; }
@@ -82,7 +82,7 @@ IN LPWSTR pwszDeviceName, IN HANDLE hDriver) { - DbgPrint("FtfdEnablePDEV(hdev=%p)\n", hdev); + TRACE("FtfdEnablePDEV(hdev=%p)\n", hdev);
/* Return a dummy DHPDEV */ return (PVOID)1; @@ -95,7 +95,7 @@ IN DHPDEV dhpdev, IN HDEV hdev) { - DbgPrint("FtfdCompletePDEV()\n"); + TRACE("FtfdCompletePDEV()\n"); /* Nothing to do */ }
@@ -105,7 +105,7 @@ FtfdDisablePDEV( IN DHPDEV dhpdev) { - DbgPrint("FtfdDisablePDEV()\n"); + TRACE("FtfdDisablePDEV()\n"); /* Nothing to do */ }
@@ -119,7 +119,7 @@ ULONG cjOut, PVOID pvOut) { - DbgPrint("FtfdEscape\n"); + TRACE("FtfdEscape\n"); __debugbreak(); return 0; }
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] Sat May 7 13:36:02 2011 @@ -30,7 +30,7 @@ goto done;
allglyphs: - DbgPrint("using all glyphs\n"); + TRACE("using all glyphs\n");
/* Start over */ ulAccumCharWidth = 0; @@ -60,9 +60,11 @@ PFTFD_IFIMETRICS pifiex; PIFIMETRICS pifi; FT_Face ftface; + FT_Error fterror; + PS_FontInfoRec fontinfo; ULONG i;
- DbgPrint("FtfdInitIfiMetrics()\n"); + TRACE("FtfdInitIfiMetrics()\n");
/* Get the freetype face pointer */ ftface = pface->ftface; @@ -90,9 +92,7 @@ }
pifi->lEmbedId = 0; - pifi->lItalicAngle = 0; pifi->lCharBias = 0; - pifi->jWinPitchAndFamily = 0; // FIXME: generic way to get this?
/* Set flags */ pifi->flInfo = FM_INFO_RETURNS_BITMAPS | FM_INFO_1BPP | FM_INFO_4BPP; @@ -138,9 +138,9 @@ pifi->fwdMacDescender = ftface->descender; pifi->fwdMacLineGap = 0; pifi->fwdAveCharWidth = 0; - pifi->fwdTypoAscender = pifi->fwdMacAscender; - pifi->fwdTypoDescender = pifi->fwdMacDescender; - pifi->fwdTypoLineGap = 0; + pifi->fwdTypoAscender = ftface->ascender; + pifi->fwdTypoDescender = ftface->descender; + pifi->fwdTypoLineGap = ftface->units_per_EM / 10; pifi->fwdMaxCharInc = ftface->max_advance_width; pifi->fwdCapHeight = 0; pifi->fwdXHeight = 0; @@ -195,6 +195,26 @@ pifi->panose.bMidline = PAN_ANY; pifi->panose.bXHeight = PAN_ANY;
+ /* Try to get type1 info from freetype */ + fterror = FT_Get_PS_Font_Info(pface->ftface, &fontinfo); + if (fterror == 0) + { + /* Set italic angle */ + pifi->lItalicAngle = fontinfo.italic_angle; + + /* Set pitch */ + if (fontinfo.is_fixed_pitch) + pifi->jWinPitchAndFamily = FIXED_PITCH; + else + pifi->jWinPitchAndFamily = VARIABLE_PITCH; + } + else + { + /* Set fallback values */ + pifi->lItalicAngle = 0; + pifi->jWinPitchAndFamily = 0; + } + EngMultiByteToUnicodeN(pifiex->awcFamilyName, LF_FACESIZE, NULL, @@ -214,7 +234,7 @@ strnlen(ftface->family_name, MAX_PATH));
/* Use OS/2 TrueType or OpenType tables */ - OtfGetIfiMetrics(pface, pifi); + FtfdGetWinMetrics(pface, pifi);
if (pifi->fwdAveCharWidth == 0) pifi->fwdAveCharWidth = CalculateAveCharWidth(ftface); @@ -231,7 +251,7 @@ 4);
- DbgPrint("Finished with the ifi: %p\n", pifi); + TRACE("Finished with the ifi: %p\n", pifi); //__debugbreak();
return TRUE; @@ -249,7 +269,7 @@ HGLYPH * phglyphs; WCHAR wcCurrent, wcPrev;
- DbgPrint("FtfdInitGlyphSet()\n"); + TRACE("FtfdInitGlyphSet()\n");
/* Calculate FD_GLYPHSET size (incl. HGLYPH array!) */ cjSize = FIELD_OFFSET(FD_GLYPHSET, awcrun) @@ -260,7 +280,7 @@ pGlyphSet = EngAllocMem(0, cjSize, TAG_GLYPHSET); if (!pGlyphSet) { - DbgPrint("EngAllocMem() failed.\n"); + WARN("EngAllocMem() failed.\n"); return NULL; }
@@ -293,7 +313,7 @@ pGlyphSet->awcrun[cRuns - 1].wcLow = wcCurrent; pGlyphSet->awcrun[cRuns - 1].cGlyphs = 1; pGlyphSet->awcrun[cRuns - 1].phg = &phglyphs[i]; - //DbgPrint("adding new run i=%ld, cRuns=%ld, wc=%x\n", i, cRuns, wcCurrent); + //TRACE("adding new run i=%ld, cRuns=%ld, wc=%x\n", i, cRuns, wcCurrent); }
/* Get the next charcode and index */ @@ -301,7 +321,7 @@ wcCurrent = (WCHAR)FT_Get_Next_Char(ftface, wcCurrent, &index); }
- DbgPrint("Done with font tree, %d runs\n", pGlyphSet->cRuns); + TRACE("Done with font tree, %d runs\n", pGlyphSet->cRuns); pface->pGlyphSet = pGlyphSet; return pGlyphSet; } @@ -310,7 +330,7 @@ FtfdInitKerningPairs( PFTFD_FACE pface) { - //DbgPrint("unimplemented\n"); + //WARN("unimplemented\n"); }
static @@ -354,6 +374,7 @@ NTAPI FtfdCreateFace( PFTFD_FILE pfile, + ULONG iFace, FT_Face ftface) { PFTFD_FACE pface; @@ -365,11 +386,12 @@ pface = EngAllocMem(FL_ZERO_MEMORY, sizeof(FTFD_FACE), 'dftF'); if (!pface) { - DbgPrint("Couldn't allcate a face\n"); + WARN("Couldn't allcate a face\n"); return NULL; }
pface->pfile = pfile; + pface->iFace = iFace; pface->ftface = ftface; pface->cGlyphs = ftface->num_glyphs;
@@ -380,7 +402,7 @@ fterror = FT_Select_Charmap(ftface, FT_ENCODING_UNICODE); if (fterror) { - DbgPrint("ERROR: Could not load unicode charmap\n"); + WARN("Could not load unicode charmap\n"); return NULL; }
@@ -456,19 +478,19 @@ FT_Face ftface; PFTFD_FILE pfile = NULL;
- DbgPrint("FtfdLoadFontFile()\n"); + TRACE("FtfdLoadFontFile()\n");
/* Check parameters */ if (cFiles != 1) { - DbgPrint("ERROR: Only 1 File is allowed, got %ld!\n", cFiles); + WARN("Only 1 File is allowed, got %ld!\n", cFiles); return HFF_INVALID; }
/* Map the font file */ if (!EngMapFontFileFD(*piFile, (PULONG*)&pvView, &cjView)) { - DbgPrint("ERROR: Could not map font file!\n"); + WARN("Could not map font file!\n"); return HFF_INVALID; }
@@ -477,7 +499,7 @@ if (fterror) { /* Failure! */ - DbgPrint("ERROR: No faces found in file\n"); + WARN("No faces found in file\n"); goto error; }
@@ -490,7 +512,7 @@ if (!pfile) { /* Failure! */ - DbgPrint("ERROR: EngAllocMem() failed.\n"); + WARN("EngAllocMem() failed.\n"); goto error; }
@@ -502,10 +524,10 @@ pfile->ulFastCheckSum = ulFastCheckSum;
/* Create a face */ - pfile->apface[0] = FtfdCreateFace(pfile, ftface); + pfile->apface[0] = FtfdCreateFace(pfile, 1, ftface); if (!pfile->apface[0]) { - DbgPrint("ERROR: FtfdCreateFace() failed.\n"); + WARN("FtfdCreateFace() failed.\n"); goto error; }
@@ -519,16 +541,16 @@ fterror = FT_New_Memory_Face(gftlibrary, *ppvView, *pcjView, i, &ftface); if (fterror) { - DbgPrint("error\n"); + WARN("error\n"); __debugbreak(); goto error; }
/* Store the face in the file structure */ - pfile->apface[i] = FtfdCreateFace(pfile, ftface); - } - - DbgPrint("Success! Returning %ld faces\n", cNumFaces); + pfile->apface[i] = FtfdCreateFace(pfile, i + 1, ftface); + } + + TRACE("Success! Returning %ld faces\n", cNumFaces); return (ULONG_PTR)pfile;
error: @@ -552,12 +574,12 @@ PFTFD_FILE pfile = (PFTFD_FILE)diFile; PFTFD_FACE pface = pfile->apface[iFace - 1];
- DbgPrint("FtfdQueryFont()\n"); + TRACE("FtfdQueryFont()\n");
/* Validate parameters */ if (iFace > pfile->cNumFaces || !pid) { - DbgPrint("ERROR: iFace > pfile->cNumFaces || !pid\n"); + WARN("iFace > pfile->cNumFaces || !pid\n"); return NULL; }
@@ -580,12 +602,12 @@ PFTFD_FILE pfile = (PFTFD_FILE)diFile; PFTFD_FACE pface;
- DbgPrint("FtfdQueryFontTree(iMode=%ld)\n", iMode); + TRACE("FtfdQueryFontTree(iMode=%ld)\n", iMode);
/* Validate parameters */ if (iFace > pfile->cNumFaces || !pid) { - DbgPrint("ERROR: iFace > pfile->cNumFaces || !pid\n"); + WARN("iFace > pfile->cNumFaces || !pid\n"); return NULL; }
@@ -603,7 +625,7 @@ return pface->pKerningPairs;
default: - DbgPrint("ERROR: invalid iMode: %ld\n", iMode); + WARN("Invalid iMode: %ld\n", iMode); }
return NULL; @@ -617,7 +639,7 @@ PFTFD_FILE pfile = (PFTFD_FILE)diFile; ULONG i;
- DbgPrint("FtfdUnloadFontFile()\n"); + TRACE("FtfdUnloadFontFile()\n");
/* Cleanup faces */ for (i = 0; i < pfile->cNumFaces; i++) @@ -633,7 +655,6 @@
return TRUE; } -
LONG APIENTRY @@ -645,7 +666,7 @@ { PFTFD_FILE pfile = (PFTFD_FILE)diFile;
- DbgPrint("FtfdQueryFontFile(ulMode=%ld)\n", ulMode); + TRACE("FtfdQueryFontFile(ulMode=%ld)\n", ulMode);
switch (ulMode) { @@ -669,7 +690,7 @@ ULONG culCaps, ULONG *pulCaps) { - DbgPrint("FtfdQueryFontCaps()\n"); + TRACE("FtfdQueryFontCaps()\n");
/* We need room for 2 ULONGs */ if (culCaps < 2) @@ -684,101 +705,6 @@ return 2; }
-LONG -APIENTRY -FtfdQueryTrueTypeTable( - ULONG_PTR diFile, - ULONG ulFont, - ULONG ulTag, - PTRDIFF dpStart, - ULONG cjBuf, - BYTE *pjBuf, - PBYTE *ppjTable, - ULONG *pcjTable) -{ - PFTFD_FILE pfile = (PFTFD_FILE)diFile; - PBYTE pjTable; - ULONG cjTable; - - DbgPrint("FtfdQueryTrueTypeTable\n"); - - /* Check if this file supports TrueType tables */ - if (pfile->ulFileFormat != FILEFMT_TTF && - pfile->ulFileFormat != FILEFMT_OTF) - { - DbgPrint("File format doesn't support true type tables\n"); - return FD_ERROR; - } - - // FIXME: handle ulFont - - /* Check if the whole file is requested */ - if (ulTag == 0) - { - /* Requested the whole file */ - pjTable = pfile->pvView; - cjTable = pfile->cjView; - } - else - { - /* Search for the table */ - pjTable = OtfFindTable(pfile->pvView, pfile->cjView, ulTag, &cjTable); - if (!pjTable) - { - DbgPrint("Couldn't find table '%.4s'\n", (char*)&ulTag); - return FD_ERROR; - } - } - - /* Return requested pointers */ - if (ppjTable) *ppjTable = pjTable; - if (pcjTable) *pcjTable = cjTable; - - /* Check if we shall copy data */ - if (pjBuf) - { - /* Check if the offset is inside the table */ - if (dpStart < 0 || (ULONG_PTR)dpStart >= cjTable) - { - DbgPrint("dpStart outside the table: %p\n", dpStart); - return FD_ERROR; - } - - /* Don't copy beyond the table end */ - cjTable -= dpStart; - - /* Don't copy more then the buffer can hold */ - if (cjBuf < cjTable) cjTable = cjBuf; - - /* Copy the data to the buffer */ - RtlCopyMemory(pjBuf, pjTable + dpStart, cjTable); - } - - return cjTable; -} - -PVOID -APIENTRY -FtfdGetTrueTypeFile( - ULONG_PTR diFile, - ULONG *pcj) -{ - PFTFD_FILE pfile = (PFTFD_FILE)diFile; - - DbgPrint("FtfdGetTrueTypeFile\n"); - - /* Check if this file is TrueType */ - if (pfile->ulFileFormat != FILEFMT_TTF && - pfile->ulFileFormat != FILEFMT_OTF) - { - DbgPrint("File format is not TrueType or Opentype\n"); - return NULL; - } - - /* Return the pointer and size */ - if (pcj) *pcj = pfile->cjView; - return pfile->pvView; -}
#if 0 // not needed atm VOID @@ -787,7 +713,7 @@ PVOID pv, ULONG_PTR id) { - DbgPrint("FtfdFree()\n"); + TRACE("FtfdFree()\n"); EngFreeMem(pv); } #endif
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] Sat May 7 13:36:02 2011 @@ -11,14 +11,32 @@ #include <winddi.h>
#include <ft2build.h> +#include FT_FREETYPE_H #include <freetype/ftadvanc.h> #include <freetype/ftxf86.h> -#include FT_FREETYPE_H +#include <freetype/t1tables.h>
extern FT_Library gftlibrary;
#define TAG_GLYPHSET 'GlSt' #define TAG_IFIMETRICS 'Ifim' + +#if 1// DBG +#define ASSERT(x) \ + if(!(x)) \ + { \ + DbgPrint("Assertion '%s' failed at %s:%i\n", #x, __FILE__, __LINE__); \ + __debugbreak(); \ + } +#define TRACE DbgPrint +#define WARN DbgPrint +#define FATAL DbgPrint +#else +#define ASSERT(x) +#define TRACE(...) +#define WARN(...) +#define FATAL(...) +#endif
/** Driver specific types *****************************************************/
@@ -60,6 +78,7 @@ { struct _FTFD_FILE *pfile; FT_Face ftface; + ULONG iFace; ULONG ulFontFormat; ULONG cGlyphs; ULONG cMappings; @@ -276,16 +295,19 @@ ULONG_PTR iFile, ULONG *pcj);
-VOID +/* Private interface */ + +PVOID NTAPI -OtfGetIfiMetrics( +FtfdFindTrueTypeTable( + PVOID pvView, + ULONG cjView, + ULONG iFace, + ULONG ulTag, + PULONG pulLength); + +VOID +NTAPI +FtfdGetWinMetrics( PFTFD_FACE pface, PIFIMETRICS pifi); - -PVOID -NTAPI -OtfFindTable( - PVOID pvView, - ULONG cjView, - ULONG ulTag, - PULONG pulLength);
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] Sat May 7 13:36:02 2011 @@ -58,7 +58,7 @@ if (fterror) { /* Failure! */ - DbgPrint("Error creating face\n"); + WARN("Error creating face\n"); EngFreeMem(pfont); return NULL; } @@ -127,7 +127,7 @@ if (fterror) { /* Failure! */ - DbgPrint("Error setting face size\n"); + WARN("Error setting face size\n"); return NULL; }
@@ -167,7 +167,7 @@ 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+32)/64); +TRACE("Created font with %ld (%ld)\n", yScale, (yScale+32)/64); //__debugbreak();
/* Set the pvProducer member of the fontobj */ @@ -203,14 +203,14 @@ FT_Face ftface = pfont->ftface; XFORMOBJ *pxo;
- DbgPrint("FtfdQueryMaxExtents\n"); + TRACE("FtfdQueryMaxExtents\n");
if (pfddm) { if (cjSize < sizeof(FD_DEVICEMETRICS)) { /* Not enough space, fail */ - DbgPrint("ERROR: cjSize = %ld\n", cjSize); + WARN("cjSize = %ld\n", cjSize); return FD_ERROR; }
@@ -283,7 +283,7 @@ fterror = FT_Load_Glyph(pfont->ftface, hg, 0); if (fterror) { - DbgPrint("FtfdLoadGlyph: couldn't load glyph 0x%lx\n", hg); + WARN("Couldn't load glyph 0x%lx\n", hg); pfont->hgSelected = -1; return FALSE; } @@ -400,7 +400,7 @@ cjBitmapSize = BITMAP_SIZE(pgb->sizlBitmap.cx, pgb->sizlBitmap.cy, 4); if (cjBitmapSize + FIELD_OFFSET(GLYPHBITS, aj) > cjSize) { - DbgPrint("ERROR: buffer too small, got %ld, need %ld\n", + WARN("Buffer too small, got %ld, need %ld\n", cjSize, cjBitmapSize + FIELD_OFFSET(GLYPHBITS, aj)); __debugbreak(); return; @@ -411,9 +411,9 @@
//RtlCopyMemory(pgb->aj, ftglyph->bitmap.buffer, cjBitmapSize);
- DbgPrint("QueryGlyphBits hg=%lx, (%ld,%ld) cjSize=%ld, need %ld\n", - hg, pgb->sizlBitmap.cx, pgb->sizlBitmap.cy, cjSize, - GLYPHBITS_SIZE(pgb->sizlBitmap.cx, pgb->sizlBitmap.cy, 4)); + TRACE("QueryGlyphBits hg=%lx, (%ld,%ld) cjSize=%ld, need %ld\n", + hg, pgb->sizlBitmap.cx, pgb->sizlBitmap.cy, cjSize, + GLYPHBITS_SIZE(pgb->sizlBitmap.cx, pgb->sizlBitmap.cy, 4));
}
@@ -436,7 +436,7 @@ fterror = FT_Render_Glyph(pfont->ftface->glyph, FT_RENDER_MODE_NORMAL); if (fterror) { - DbgPrint("cound't render glyph\n"); + WARN("Cound't render glyph\n"); return FALSE; }
@@ -458,13 +458,13 @@ { PFTFD_FONT pfont = FtfdGetFontInstance(pfo);
- DbgPrint("FtfdQueryFontData, iMode=%ld, hg=%lx, pgd=%p, pv=%p, cjSize=%ld\n", - iMode, hg, pgd, pv, cjSize); + TRACE("FtfdQueryFontData, iMode=%ld, hg=%lx, pgd=%p, pv=%p, cjSize=%ld\n", + iMode, hg, pgd, pv, cjSize);
switch (iMode) { case QFD_GLYPHANDBITMAP: - DbgPrint("QFD_GLYPHANDBITMAP\n"); + TRACE("QFD_GLYPHANDBITMAP\n");
/* Load the requested glyph */ if (!FtfdLoadGlyph(pfont, hg, 0)) return FD_ERROR; @@ -485,7 +485,7 @@ 4);
case QFD_GLYPHANDOUTLINE: - DbgPrint("QFD_GLYPHANDOUTLINE\n"); + TRACE("QFD_GLYPHANDOUTLINE\n");
/* Load the requested glyph */ if (!FtfdLoadGlyph(pfont, hg, 1)) return FD_ERROR; @@ -505,19 +505,19 @@ return FtfdQueryMaxExtents(pfo, pv, cjSize);
case QFD_TT_GRAY1_BITMAP: - DbgPrint("QFD_TT_GRAY1_BITMAP\n"); + TRACE("QFD_TT_GRAY1_BITMAP\n"); break; case QFD_TT_GRAY2_BITMAP: - DbgPrint("QFD_TT_GRAY2_BITMAP\n"); + TRACE("QFD_TT_GRAY2_BITMAP\n"); break; case QFD_TT_GRAY4_BITMAP: - DbgPrint("QFD_TT_GRAY4_BITMAP\n"); + TRACE("QFD_TT_GRAY4_BITMAP\n"); break; case QFD_TT_GRAY8_BITMAP: - DbgPrint("QFD_TT_GRAY8_BITMAP\n"); + TRACE("QFD_TT_GRAY8_BITMAP\n"); break; default: - DbgPrint("ERROR: Invalid iMode value: %lx\n", iMode); + WARN("Invalid iMode value: %lx\n", iMode); EngSetLastError(ERROR_INVALID_PARAMETER); return FD_ERROR; } @@ -534,12 +534,12 @@ FONTOBJ *pfo, ULONG iMode) { - DbgPrint("FtfdQueryGlyphAttrs\n"); + TRACE("FtfdQueryGlyphAttrs\n");
/* Verify parameters */ if (!pfo || iMode != FO_ATTR_MODE_ROTATE) { - DbgPrint("ERROR: invalid parameters: %p, %ld\n", pfo, iMode); + WARN("Invalid parameters: %p, %ld\n", pfo, iMode); return NULL; }
@@ -567,7 +567,7 @@ FT_Error fterror; FT_Fixed advance;
- DbgPrint("FtfdQueryAdvanceWidths\n"); + TRACE("FtfdQueryAdvanceWidths\n");
// FIXME: layout horizontal/vertical fl = (iMode == QAW_GETEASYWIDTHS) ? FT_ADVANCE_FLAG_FAST_ONLY : 0; @@ -581,7 +581,7 @@ fterror = FT_Get_Advance(ftface, (FT_UInt)phg[i], fl, &advance); if (fterror || advance > 0x0FFFF000) { - DbgPrint("ERROR: failed to query advance width hg=%lx, fl=0x%lx\n", + WARN("Failed to query advance width hg=%lx, fl=0x%lx\n", phg[i], fl); pusWidths[i] = 0xffff; bResult = FALSE; @@ -590,7 +590,7 @@ { /* Transform from 16.16 points to 28.4 pixels */ pusWidths[i] = (USHORT)((advance * 72 / pfo->sizLogResPpi.cx) >> 12); - //DbgPrint("Got advance width: hg=%lx, adv=%lx->%ld\n", phg[i], advance, pt.x); + //TRACE("Got advance width: hg=%lx, adv=%lx->%ld\n", phg[i], advance, pt.x); } }
@@ -609,7 +609,7 @@ ULONG cjBuf, TTPOLYGONHEADER *ppoly) { - DbgPrint("FtfdQueryTrueTypeOutline\n"); + TRACE("FtfdQueryTrueTypeOutline\n"); __debugbreak(); return 0; } @@ -625,7 +625,7 @@ ULONG cjOut, PVOID pvOut) { - DbgPrint("FtfdFontManagement\n"); + TRACE("FtfdFontManagement\n"); __debugbreak(); return 0; } @@ -635,7 +635,7 @@ FtfdDestroyFont( FONTOBJ *pfo) { - DbgPrint("FtfdDestroyFont()\n"); + TRACE("FtfdDestroyFont()\n"); __debugbreak(); }
Removed: branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/opentype.c URL: http://svn.reactos.org/svn/reactos/branches/GSoC_2011/GdiFontDriver/drivers/... ============================================================================== --- branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/opentype.c [iso-8859-1] (original) +++ branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/opentype.c (removed) @@ -1,440 +1,0 @@ -/* - * PROJECT: ReactOS win32 subsystem - * LICENSE: GPL - See COPYING in the top level directory - * PURPOSE: OpenType support for GDI font driver based on freetype - * PROGRAMMER: Timo Kreuzer (timo.kreuzer@reactos.org) - * REFERENCES: http://www.microsoft.com/typography/otspec/ - * http://www.microsoft.com/typography/otspec/os2.htm - */ - -#include "ftfd.h" -#include <freetype/t1tables.h> - -// FIXME: we can have unaligned memory access, use: -#define GETW(px) = (((PUCHAR)px)[1] | ((PUCHAR)px)[0] << 8) -#define GETD(px) = (GETW((PUCHAR)px + 2) | GETW(px) << 16) - -#define SWAPW(x) _byteswap_ushort(x) -#define SWAPD(x) _byteswap_ulong(x) - -typedef struct _OTF_TABLE_ENTRY -{ - ULONG ulTag; - ULONG ulCheckSum; - ULONG ulOffset; - ULONG ulLength; -} OTF_TABLE_ENTRY, *POTF_TABLE_ENTRY; - -typedef struct _OTF_FILE_HEADER -{ - ULONG ulIdentifier; - USHORT usNumTables; - USHORT usSearchRange; - USHORT usEntrySelector; - USHORT usRangeshift; - - OTF_TABLE_ENTRY aTableEntries[1]; - -} OTF_FILE_HEADER, *POTF_FILE_HEADER; - -#include <pshpack1.h> -typedef struct _OTF_OS2_DATA -{ - USHORT version; // 0x0004 - SHORT xAvgCharWidth; - USHORT usWeightClass; - USHORT usWidthClass; - USHORT fsType; - SHORT ySubscriptXSize; - SHORT ySubscriptYSize; - SHORT ySubscriptXOffset; - SHORT ySubscriptYOffset; - SHORT ySuperscriptXSize; - SHORT ySuperscriptYSize; - SHORT ySuperscriptXOffset; - SHORT ySuperscriptYOffset; - SHORT yStrikeoutSize; - SHORT yStrikeoutPosition; - union // 0x30 - { - struct - { - BYTE jClassId; - BYTE jSubClassId; - }; - SHORT sFamilyClass; - }; - BYTE panose[10]; - ULONG ulUnicodeRange1; // Bits 0-31 - ULONG ulUnicodeRange2; // Bits 32-63 - ULONG ulUnicodeRange3; // Bits 64-95 - ULONG ulUnicodeRange4; // Bits 96-127 - CHAR achVendID[4]; - USHORT fsSelection; - USHORT usFirstCharIndex; - USHORT usLastCharIndex; - SHORT sTypoAscender; - SHORT sTypoDescender; - SHORT sTypoLineGap; - USHORT usWinAscent; - USHORT usWinDescent; - ULONG ulCodePageRange1; // Bits 0-31 - ULONG ulCodePageRange2; // Bits 32-63 - SHORT sxHeight; - SHORT sCapHeight; - USHORT usDefaultChar; - USHORT usBreakChar; - USHORT usMaxContext; -} OTF_OS2_DATA, *POTF_OS2_DATA; -#include <poppack.h> - -ULONG -CalcTableChecksum(PVOID pvTable, ULONG cjTable) -{ - PULONG pul = pvTable, pulEnd; - ULONG ulCheckSum = 0L; - - pulEnd = (PULONG)pvTable + (cjTable + 3) / sizeof(ULONG); - - while (pul < pulEnd) ulCheckSum += SWAPD(*pul++); - - return ulCheckSum; -} - -BOOL -OtfGetType1FontInfo( - PFTFD_FACE pface, - PIFIMETRICS pifi) -{ - FT_Error fterror; - PS_FontInfoRec fontinfo; - - fterror = FT_Get_PS_Font_Info(pface->ftface, &fontinfo); - if (fterror) - { - DbgPrint("ERROR: Failed to retrieve font info\n"); - return FALSE; - } - - /* Try to find the font weight */ - if (strncpy(fontinfo.weight, "Normal", 7) == 0) - pifi->usWinWeight = FW_NORMAL; - // else if (..) - else - pifi->usWinWeight = FW_REGULAR; - - pifi->lItalicAngle = fontinfo.italic_angle; - - /* Clear lower 2 bits and set FIXED_PITCH or VARIABLE_PITCH */ - pifi->jWinPitchAndFamily &= ~3; - if (fontinfo.is_fixed_pitch) - pifi->jWinPitchAndFamily |= FIXED_PITCH; - else - pifi->jWinPitchAndFamily |= VARIABLE_PITCH; - - return TRUE; -} - -/*! \name OtfFindTable - * \brief Searches for a specific table in TrueType and OpenType font files - * \param pvView - The address where the font file is mapped - * \param vjView - Size of the mapped font file - * \param ulTag - Identifier tag of the table to search - * \param pulLength - Pointer to an ULONG that recieves the table length, - * Can be NULL; - * \return Pointer to the table if successful, NULL if unsuccessful. - */ -PVOID -NTAPI -OtfFindTable( - PVOID pvView, - ULONG cjView, - ULONG ulTag, - PULONG pulLength) -{ - POTF_FILE_HEADER pFileHeader = pvView; - ULONG i, ulOffset, ulLength, ulNumTables, ulCheckSum; - - /* Verify the file header */ - if (pFileHeader->ulIdentifier != 'OTTO' && - pFileHeader->ulIdentifier != 'fctt' && - pFileHeader->ulIdentifier != 0x00000100) - { - DbgPrint("ERROR: Couldn't verify identifier: 0x%lx\n", - pFileHeader->ulIdentifier); - return NULL; - } - - /* Check if number of tables is ok */ - ulNumTables = SWAPW(pFileHeader->usNumTables); - ulLength = ulNumTables * sizeof(OTF_TABLE_ENTRY); - if (ulLength + sizeof(OTF_FILE_HEADER) > cjView) - { - DbgPrint("ERROR: Too many tables (%ld)\n", ulNumTables); - return NULL; - } - - /* Loop all tables */ - for (i = 0; i < ulNumTables; i++) - { - /* Compare the tag */ - if (pFileHeader->aTableEntries[i].ulTag == ulTag) - { - /* Get table offset and length */ - ulOffset = SWAPD(pFileHeader->aTableEntries[i].ulOffset); - ulLength = SWAPD(pFileHeader->aTableEntries[i].ulLength); - - /* Check if this is inside the file */ - if (ulOffset + ulLength > cjView || - ulOffset + ulLength < ulOffset) - { - DbgPrint("invalid table entry. %ld, %ld \n", ulOffset, ulLength); - return NULL; - } - - ulCheckSum = CalcTableChecksum((PUCHAR)pvView + ulOffset, ulLength); - if (ulCheckSum != SWAPD(pFileHeader->aTableEntries[i].ulCheckSum)) - { - DbgPrint("Checksum mitmatch! %ld, %ld \n", ulOffset, ulLength); - return NULL; - } - - if (pulLength) *pulLength = ulLength; - return (PUCHAR)pvView + ulOffset; - } - } - - /* Not found */ - return NULL; -} - -/*! \name OtfGetWinFamily - * \brief Translates IBM font class IDs into a Windows family bitfield - * \param jClassId - * \param jSubclassId - * \ref http://www.microsoft.com/typography/otspec/ibmfc.htm - */ -BYTE -OtfGetWinFamily(BYTE jClassId, BYTE jSubclassId) -{ - switch (jClassId) - { - case 0: // Class ID = 0 No Classification - break; - - case 1: // Class ID = 1 Oldstyle Serifs - switch (jSubclassId) - { - case 0: // Subclass ID = 0 : No Classification - case 1: // Subclass ID = 1 : IBM Rounded Legibility - case 2: // Subclass ID = 2 : Garalde - case 3: // Subclass ID = 3 : Venetian - case 4: // Subclass ID = 4 : Modified Venetian - case 5: // Subclass ID = 5 : Dutch Modern - case 6: // Subclass ID = 6 : Dutch Traditional - case 7: // Subclass ID = 7 : Contemporary - case 8: // Subclass ID = 8 : Calligraphic - case 15: // Subclass ID = 15 : Miscellaneous - default: // Subclass ID = 9-14 : (reserved for future use) - break; - } - - case 2: // Class ID = 2 Transitional Serifs - switch (jSubclassId) - { - case 15: return FF_ROMAN; // 15: Miscellaneous - case 0: // Subclass ID = 0 : No Classification - case 1: // Subclass ID = 1 : Direct Line - case 2: // Subclass ID = 2 : Script - default: // Subclass ID = 3-14 : (reserved for future use) - break; - } - - case 3: // Class ID = 3 Modern Serifs - switch (jSubclassId) - { - case 0: // Subclass ID = 0 : No Classification - case 1: // Subclass ID = 1 : Italian - case 2: // Subclass ID = 2 : Script - case 15: // Subclass ID = 15 : Miscellaneous - default: // Subclass ID = 3-14 : (reserved for future use) - break; - } - - case 4: // Class ID = 4 Clarendon Serifs - switch (jSubclassId) - { - case 0: // Subclass ID = 0 : No Classification - case 1: // Subclass ID = 1 : Clarendon - case 2: // Subclass ID = 2 : Modern - case 3: // Subclass ID = 3 : Traditional - case 4: // Subclass ID = 4 : Newspaper - case 5: // Subclass ID = 5 : Stub Serif - case 6: // Subclass ID = 6 : Monotone - case 7: // Subclass ID = 7 : Typewriter - case 15: // Subclass ID = 15 : Miscellaneous - default: // Subclass ID = 8-14: (reserved for future use) - break; - } - - case 5: // Class ID = 5 Slab Serifs - switch (jSubclassId) - { - case 0: // Subclass ID = 0 : No Classification - case 1: // Subclass ID = 1 : Monotone - case 2: // Subclass ID = 2 : Humanist - case 3: // Subclass ID = 3 : Geometric - case 4: // Subclass ID = 4 : Swiss - case 5: // Subclass ID = 5 : Typewriter - case 15: // Subclass ID = 15 : Miscellaneous - default: // Subclass ID = 6-14 : (reserved for future use) - break; - } - - case 7: // Class ID = 7 Freeform Serifs - switch (jSubclassId) - { - case 0: // Subclass ID = 0 : No Classification - case 1: // Subclass ID = 1 : Modern - case 15: // Subclass ID = 15 : Miscellaneous - default: // Subclass ID = 2-14 : (reserved for future use) - break; - } - - case 8: // Class ID = 8 Sans Serif - switch (jSubclassId) - { - case 0: return FF_SWISS; // 0: No Classification - case 5: return FF_SWISS; // 5: Neo-grotesque Gothic - case 15: return FF_SWISS|FF_ROMAN; // 15: Miscellaneous - - case 1: // Subclass ID = 1 : IBM Neo-grotesque Gothic - case 2: // Subclass ID = 2 : Humanist - case 3: // Subclass ID = 3 : Low-x Round Geometric - case 4: // Subclass ID = 4 : High-x Round Geometric - case 6: // Subclass ID = 6 : Modified Neo-grotesque Gothic - case 9: // Subclass ID = 9 : Typewriter Gothic - case 10: // Subclass ID = 10 : Matrix - default: // Subclass ID = 7-8, 11-14 : (reserved for future use) - break; - } - - case 9: // Class ID = 9 Ornamentals - switch (jSubclassId) - { - case 0: // Subclass ID = 0 : No Classification - case 1: // Subclass ID = 1 : Engraver - case 2: // Subclass ID = 2 : Black Letter - case 3: // Subclass ID = 3 : Decorative - case 4: // Subclass ID = 4 : Three Dimensional - case 15: // Subclass ID = 15 : Miscellaneous - default: // Subclass ID = 5-14 : (reserved for future use) - break; - } - - case 10: // Class ID = 10 Scripts - switch (jSubclassId) - { - case 0: // Subclass ID = 0 : No Classification - case 1: // Subclass ID = 1 : Uncial - case 2: // Subclass ID = 2 : Brush Joined - case 3: // Subclass ID = 3 : Formal Joined - case 4: // Subclass ID = 4 : Monotone Joined - case 5: // Subclass ID = 5 : Calligraphic - case 6: // Subclass ID = 6 : Brush Unjoined - case 7: // Subclass ID = 7 : Formal Unjoined - case 8: // Subclass ID = 8 : Monotone Unjoined - case 15: // Subclass ID = 15 : Miscellaneous - default: // Subclass ID = 9-14 : (reserved for future use) - break; - } - - case 12: // Class ID = 12 Symbolic - switch (jSubclassId) - { - case 0: // Subclass ID = 0 : No Classification - case 3: // Subclass ID = 3 : Mixed Serif - case 6: // Subclass ID = 6 : Oldstyle Serif - case 7: // Subclass ID = 7 : Neo-grotesque Sans Serif - case 15: // Subclass ID = 15 : Miscellaneous - default: // Subclass ID = 1-2,4-5,8-14 : (reserved for future use) - break; - } - - case 13: // Class ID = 13 Reserved - case 14: // Class ID = 14 Reserved - default: // Class ID = 6,11 (reserved for future use) - break; - } - -__debugbreak(); - return 0; -} - -VOID -NTAPI -OtfGetIfiMetrics( - PFTFD_FACE pface, - PIFIMETRICS pifi) -{ - PFTFD_FILE pfile = pface->pfile; - PVOID pvView = pfile->pvView; - POTF_OS2_DATA pOs2; - - /* Try to get type 1 info */ - OtfGetType1FontInfo(pface, pifi); - - /* Get the OS/2 table for the face */ - // FIXME: get the right table for the face, when multiple faces - pOs2 = OtfFindTable(pvView, pfile->cjView, '2/SO', NULL); - if (!pOs2) - { - DbgPrint("Couldn't find OS/2 table\n"); - return; - } - - //pifi->lEmbedId; - //pifi->lItalicAngle; - //pifi->lCharBias; - //pifi->jWinCharSet; - pifi->jWinPitchAndFamily &= 3; - pifi->jWinPitchAndFamily |= OtfGetWinFamily(pOs2->jClassId, pOs2->jSubClassId); - pifi->usWinWeight = SWAPW(pOs2->usWeightClass); - pifi->fsSelection = SWAPW(pOs2->fsSelection); - pifi->fsType = SWAPW(pOs2->fsType); - pifi->fwdWinAscender = SWAPW(pOs2->usWinAscent); - pifi->fwdWinDescender = SWAPW(pOs2->usWinDescent); - //pifi->fwdMacAscender; - //pifi->fwdMacDescender; - //pifi->fwdMacLineGap; - pifi->fwdTypoAscender = SWAPW(pOs2->sTypoAscender); - pifi->fwdTypoDescender = SWAPW(pOs2->sTypoDescender); - pifi->fwdTypoLineGap = SWAPW(pOs2->sTypoLineGap); - pifi->fwdAveCharWidth = SWAPW(pOs2->xAvgCharWidth); - pifi->fwdCapHeight = SWAPW(pOs2->sCapHeight); - pifi->fwdXHeight = SWAPW(pOs2->sxHeight); - pifi->fwdSubscriptXSize = SWAPW(pOs2->ySubscriptXSize); - pifi->fwdSubscriptYSize = SWAPW(pOs2->ySubscriptYSize); - pifi->fwdSubscriptXOffset = SWAPW(pOs2->ySubscriptXOffset); - pifi->fwdSubscriptYOffset = SWAPW(pOs2->ySubscriptYOffset); - pifi->fwdSuperscriptXSize = SWAPW(pOs2->ySuperscriptXSize); - pifi->fwdSuperscriptYSize = SWAPW(pOs2->ySuperscriptYSize); - pifi->fwdSuperscriptXOffset = SWAPW(pOs2->ySuperscriptXOffset); - pifi->fwdSuperscriptYOffset = SWAPW(pOs2->ySuperscriptYOffset); - //pifi->fwdUnderscoreSize; - //pifi->fwdUnderscorePosition; - pifi->fwdStrikeoutSize = SWAPW(pOs2->yStrikeoutSize); - pifi->fwdStrikeoutPosition = SWAPW(pOs2->yStrikeoutPosition); - pifi->wcFirstChar = SWAPW(pOs2->usFirstCharIndex); - pifi->wcLastChar = SWAPW(pOs2->usLastCharIndex); - pifi->wcDefaultChar = SWAPW(pOs2->usDefaultChar); - pifi->wcBreakChar = SWAPW(pOs2->usBreakChar); - *(DWORD*)pifi->achVendId = *(DWORD*)pOs2->achVendID; - //pifi->ulPanoseCulture; - pifi->panose = *(PANOSE*)pOs2->panose; - - /* Convert the special characters from unicode to ansi */ - EngUnicodeToMultiByteN(&pifi->chFirstChar, 4, NULL, &pifi->wcFirstChar, 3); - -} -
Copied: branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/tttables.c (from r51589, branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/opentype.c) URL: http://svn.reactos.org/svn/reactos/branches/GSoC_2011/GdiFontDriver/drivers/... ============================================================================== --- branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/opentype.c [iso-8859-1] (original) +++ branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/tttables.c [iso-8859-1] Sat May 7 13:36:02 2011 @@ -8,169 +8,98 @@ */
#include "ftfd.h" -#include <freetype/t1tables.h> - -// FIXME: we can have unaligned memory access, use: -#define GETW(px) = (((PUCHAR)px)[1] | ((PUCHAR)px)[0] << 8) -#define GETD(px) = (GETW((PUCHAR)px + 2) | GETW(px) << 16) - -#define SWAPW(x) _byteswap_ushort(x) -#define SWAPD(x) _byteswap_ulong(x) - -typedef struct _OTF_TABLE_ENTRY -{ - ULONG ulTag; - ULONG ulCheckSum; - ULONG ulOffset; - ULONG ulLength; -} OTF_TABLE_ENTRY, *POTF_TABLE_ENTRY; - -typedef struct _OTF_FILE_HEADER -{ - ULONG ulIdentifier; - USHORT usNumTables; - USHORT usSearchRange; - USHORT usEntrySelector; - USHORT usRangeshift; - - OTF_TABLE_ENTRY aTableEntries[1]; - -} OTF_FILE_HEADER, *POTF_FILE_HEADER; - -#include <pshpack1.h> -typedef struct _OTF_OS2_DATA -{ - USHORT version; // 0x0004 - SHORT xAvgCharWidth; - USHORT usWeightClass; - USHORT usWidthClass; - USHORT fsType; - SHORT ySubscriptXSize; - SHORT ySubscriptYSize; - SHORT ySubscriptXOffset; - SHORT ySubscriptYOffset; - SHORT ySuperscriptXSize; - SHORT ySuperscriptYSize; - SHORT ySuperscriptXOffset; - SHORT ySuperscriptYOffset; - SHORT yStrikeoutSize; - SHORT yStrikeoutPosition; - union // 0x30 - { - struct - { - BYTE jClassId; - BYTE jSubClassId; - }; - SHORT sFamilyClass; - }; - BYTE panose[10]; - ULONG ulUnicodeRange1; // Bits 0-31 - ULONG ulUnicodeRange2; // Bits 32-63 - ULONG ulUnicodeRange3; // Bits 64-95 - ULONG ulUnicodeRange4; // Bits 96-127 - CHAR achVendID[4]; - USHORT fsSelection; - USHORT usFirstCharIndex; - USHORT usLastCharIndex; - SHORT sTypoAscender; - SHORT sTypoDescender; - SHORT sTypoLineGap; - USHORT usWinAscent; - USHORT usWinDescent; - ULONG ulCodePageRange1; // Bits 0-31 - ULONG ulCodePageRange2; // Bits 32-63 - SHORT sxHeight; - SHORT sCapHeight; - USHORT usDefaultChar; - USHORT usBreakChar; - USHORT usMaxContext; -} OTF_OS2_DATA, *POTF_OS2_DATA; -#include <poppack.h> - +#include "tttables.h" + +ULONG test_GETD(PVOID pv) +{ + PUSHORT pus = pv; + return (ULONG)_byteswap_ushort(pus[0]) << 16 | _byteswap_ushort(pus[1]); +} + +static ULONG CalcTableChecksum(PVOID pvTable, ULONG cjTable) { PULONG pul = pvTable, pulEnd; ULONG ulCheckSum = 0L; + ASSERT(!((ULONG_PTR)pvTable & 3));
pulEnd = (PULONG)pvTable + (cjTable + 3) / sizeof(ULONG);
- while (pul < pulEnd) ulCheckSum += SWAPD(*pul++); + while (pul < pulEnd) ulCheckSum += GETD(pul++);
return ulCheckSum; }
-BOOL -OtfGetType1FontInfo( - PFTFD_FACE pface, - PIFIMETRICS pifi) -{ - FT_Error fterror; - PS_FontInfoRec fontinfo; - - fterror = FT_Get_PS_Font_Info(pface->ftface, &fontinfo); - if (fterror) - { - DbgPrint("ERROR: Failed to retrieve font info\n"); - return FALSE; - } - - /* Try to find the font weight */ - if (strncpy(fontinfo.weight, "Normal", 7) == 0) - pifi->usWinWeight = FW_NORMAL; - // else if (..) - else - pifi->usWinWeight = FW_REGULAR; - - pifi->lItalicAngle = fontinfo.italic_angle; - - /* Clear lower 2 bits and set FIXED_PITCH or VARIABLE_PITCH */ - pifi->jWinPitchAndFamily &= ~3; - if (fontinfo.is_fixed_pitch) - pifi->jWinPitchAndFamily |= FIXED_PITCH; - else - pifi->jWinPitchAndFamily |= VARIABLE_PITCH; - - return TRUE; -} - -/*! \name OtfFindTable +/*! \name FtfdFindTrueTypeTable * \brief Searches for a specific table in TrueType and OpenType font files * \param pvView - The address where the font file is mapped - * \param vjView - Size of the mapped font file + * \param cjView - Size of the mapped font file + * \param iFace - 1-based index of the font in the font file. * \param ulTag - Identifier tag of the table to search * \param pulLength - Pointer to an ULONG that recieves the table length, - * Can be NULL; + * Can be NULL. * \return Pointer to the table if successful, NULL if unsuccessful. */ PVOID NTAPI -OtfFindTable( +FtfdFindTrueTypeTable( PVOID pvView, ULONG cjView, + ULONG ulFont, ULONG ulTag, PULONG pulLength) { - POTF_FILE_HEADER pFileHeader = pvView; + POTF_FILE_HEADER pFontHeader; + PTT_COLLECTION pCollection; ULONG i, ulOffset, ulLength, ulNumTables, ulCheckSum; - - /* Verify the file header */ - if (pFileHeader->ulIdentifier != 'OTTO' && - pFileHeader->ulIdentifier != 'fctt' && - pFileHeader->ulIdentifier != 0x00000100) - { - DbgPrint("ERROR: Couldn't verify identifier: 0x%lx\n", - pFileHeader->ulIdentifier); + ASSERT(ulFont > 0); + + /* Check if this is a font collection */ + pCollection = pvView; + if (pCollection->ulTTCTag == 'fctt') + { + /* Check if we have enough fonts in the file */ + if (ulFont > GETD(&pCollection->ulNumFonts)) + { + WARN("ulFont too big: %ld\n", ulFont); + return NULL; + } + + /* Get the offset of the font we want */ + ulOffset = GETD(&pCollection->aulOffsetTable[ulFont - 1]); + if (ulOffset >= cjView) + { + WARN("Font %ld is not inside the mapped region\n", ulFont); + return NULL; + } + + /* Update the font position and remaining view size */ + pvView = (PUCHAR)pvView + ulOffset; + cjView -= ulOffset; + } + else if (ulFont > 1) + { + // Shouldn't happen + __debugbreak(); + } + + /* Verify the font header */ + pFontHeader = pvView; + if (pFontHeader->ulIdentifier != 'OTTO' && + pFontHeader->ulIdentifier != 0x00000100) + { + WARN("Bad font header: 0x%lx\n", + pFontHeader->ulIdentifier); return NULL; }
/* Check if number of tables is ok */ - ulNumTables = SWAPW(pFileHeader->usNumTables); + ulNumTables = GETW(&pFontHeader->usNumTables); ulLength = ulNumTables * sizeof(OTF_TABLE_ENTRY); if (ulLength + sizeof(OTF_FILE_HEADER) > cjView) { - DbgPrint("ERROR: Too many tables (%ld)\n", ulNumTables); + WARN("Too many tables (%ld)\n", ulNumTables); return NULL; }
@@ -178,27 +107,29 @@ for (i = 0; i < ulNumTables; i++) { /* Compare the tag */ - if (pFileHeader->aTableEntries[i].ulTag == ulTag) + if (pFontHeader->aTableEntries[i].ulTag == ulTag) { /* Get table offset and length */ - ulOffset = SWAPD(pFileHeader->aTableEntries[i].ulOffset); - ulLength = SWAPD(pFileHeader->aTableEntries[i].ulLength); + ulOffset = GETD(&pFontHeader->aTableEntries[i].ulOffset); + ulLength = GETD(&pFontHeader->aTableEntries[i].ulLength);
/* Check if this is inside the file */ if (ulOffset + ulLength > cjView || ulOffset + ulLength < ulOffset) { - DbgPrint("invalid table entry. %ld, %ld \n", ulOffset, ulLength); + WARN("Invalid table entry. %ld, %ld \n", ulOffset, ulLength); return NULL; }
+ /* Check the table's checksum */ ulCheckSum = CalcTableChecksum((PUCHAR)pvView + ulOffset, ulLength); - if (ulCheckSum != SWAPD(pFileHeader->aTableEntries[i].ulCheckSum)) - { - DbgPrint("Checksum mitmatch! %ld, %ld \n", ulOffset, ulLength); + if (ulCheckSum != GETD(&pFontHeader->aTableEntries[i].ulCheckSum)) + { + WARN("Checksum mitmatch! %ld, %ld \n", ulOffset, ulLength); return NULL; }
+ /* Return size and pointer to the table */ if (pulLength) *pulLength = ulLength; return (PUCHAR)pvView + ulOffset; } @@ -208,14 +139,15 @@ return NULL; }
-/*! \name OtfGetWinFamily +/*! \name GetWinFamily * \brief Translates IBM font class IDs into a Windows family bitfield * \param jClassId * \param jSubclassId * \ref http://www.microsoft.com/typography/otspec/ibmfc.htm */ +static BYTE -OtfGetWinFamily(BYTE jClassId, BYTE jSubclassId) +GetWinFamily(BYTE jClassId, BYTE jSubclassId) { switch (jClassId) { @@ -373,7 +305,7 @@
VOID NTAPI -OtfGetIfiMetrics( +FtfdGetWinMetrics( PFTFD_FACE pface, PIFIMETRICS pifi) { @@ -381,15 +313,12 @@ PVOID pvView = pfile->pvView; POTF_OS2_DATA pOs2;
- /* Try to get type 1 info */ - OtfGetType1FontInfo(pface, pifi); - /* Get the OS/2 table for the face */ // FIXME: get the right table for the face, when multiple faces - pOs2 = OtfFindTable(pvView, pfile->cjView, '2/SO', NULL); + pOs2 = FtfdFindTrueTypeTable(pvView, pfile->cjView, pface->iFace, '2/SO', NULL); if (!pOs2) { - DbgPrint("Couldn't find OS/2 table\n"); + WARN("Couldn't find OS/2 table\n"); return; }
@@ -398,37 +327,37 @@ //pifi->lCharBias; //pifi->jWinCharSet; pifi->jWinPitchAndFamily &= 3; - pifi->jWinPitchAndFamily |= OtfGetWinFamily(pOs2->jClassId, pOs2->jSubClassId); - pifi->usWinWeight = SWAPW(pOs2->usWeightClass); - pifi->fsSelection = SWAPW(pOs2->fsSelection); - pifi->fsType = SWAPW(pOs2->fsType); - pifi->fwdWinAscender = SWAPW(pOs2->usWinAscent); - pifi->fwdWinDescender = SWAPW(pOs2->usWinDescent); + pifi->jWinPitchAndFamily |= GetWinFamily(pOs2->jClassId, pOs2->jSubClassId); + pifi->usWinWeight = GETW(&pOs2->usWeightClass); + pifi->fsSelection = GETW(&pOs2->fsSelection); + pifi->fsType = GETW(&pOs2->fsType); + pifi->fwdWinAscender = GETW(&pOs2->usWinAscent); + pifi->fwdWinDescender = GETW(&pOs2->usWinDescent); //pifi->fwdMacAscender; //pifi->fwdMacDescender; //pifi->fwdMacLineGap; - pifi->fwdTypoAscender = SWAPW(pOs2->sTypoAscender); - pifi->fwdTypoDescender = SWAPW(pOs2->sTypoDescender); - pifi->fwdTypoLineGap = SWAPW(pOs2->sTypoLineGap); - pifi->fwdAveCharWidth = SWAPW(pOs2->xAvgCharWidth); - pifi->fwdCapHeight = SWAPW(pOs2->sCapHeight); - pifi->fwdXHeight = SWAPW(pOs2->sxHeight); - pifi->fwdSubscriptXSize = SWAPW(pOs2->ySubscriptXSize); - pifi->fwdSubscriptYSize = SWAPW(pOs2->ySubscriptYSize); - pifi->fwdSubscriptXOffset = SWAPW(pOs2->ySubscriptXOffset); - pifi->fwdSubscriptYOffset = SWAPW(pOs2->ySubscriptYOffset); - pifi->fwdSuperscriptXSize = SWAPW(pOs2->ySuperscriptXSize); - pifi->fwdSuperscriptYSize = SWAPW(pOs2->ySuperscriptYSize); - pifi->fwdSuperscriptXOffset = SWAPW(pOs2->ySuperscriptXOffset); - pifi->fwdSuperscriptYOffset = SWAPW(pOs2->ySuperscriptYOffset); + pifi->fwdTypoAscender = GETW(&pOs2->sTypoAscender); + pifi->fwdTypoDescender = GETW(&pOs2->sTypoDescender); + pifi->fwdTypoLineGap = GETW(&pOs2->sTypoLineGap); + pifi->fwdAveCharWidth = GETW(&pOs2->xAvgCharWidth); + pifi->fwdCapHeight = GETW(&pOs2->sCapHeight); + pifi->fwdXHeight = GETW(&pOs2->sxHeight); + pifi->fwdSubscriptXSize = GETW(&pOs2->ySubscriptXSize); + pifi->fwdSubscriptYSize = GETW(&pOs2->ySubscriptYSize); + pifi->fwdSubscriptXOffset = GETW(&pOs2->ySubscriptXOffset); + pifi->fwdSubscriptYOffset = GETW(&pOs2->ySubscriptYOffset); + pifi->fwdSuperscriptXSize = GETW(&pOs2->ySuperscriptXSize); + pifi->fwdSuperscriptYSize = GETW(&pOs2->ySuperscriptYSize); + pifi->fwdSuperscriptXOffset = GETW(&pOs2->ySuperscriptXOffset); + pifi->fwdSuperscriptYOffset = GETW(&pOs2->ySuperscriptYOffset); //pifi->fwdUnderscoreSize; //pifi->fwdUnderscorePosition; - pifi->fwdStrikeoutSize = SWAPW(pOs2->yStrikeoutSize); - pifi->fwdStrikeoutPosition = SWAPW(pOs2->yStrikeoutPosition); - pifi->wcFirstChar = SWAPW(pOs2->usFirstCharIndex); - pifi->wcLastChar = SWAPW(pOs2->usLastCharIndex); - pifi->wcDefaultChar = SWAPW(pOs2->usDefaultChar); - pifi->wcBreakChar = SWAPW(pOs2->usBreakChar); + pifi->fwdStrikeoutSize = GETW(&pOs2->yStrikeoutSize); + pifi->fwdStrikeoutPosition = GETW(&pOs2->yStrikeoutPosition); + pifi->wcFirstChar = GETW(&pOs2->usFirstCharIndex); + pifi->wcLastChar = GETW(&pOs2->usLastCharIndex); + pifi->wcDefaultChar = GETW(&pOs2->usDefaultChar); + pifi->wcBreakChar = GETW(&pOs2->usBreakChar); *(DWORD*)pifi->achVendId = *(DWORD*)pOs2->achVendID; //pifi->ulPanoseCulture; pifi->panose = *(PANOSE*)pOs2->panose; @@ -438,3 +367,104 @@
}
+ +/** Public Interface **********************************************************/ + +LONG +APIENTRY +FtfdQueryTrueTypeTable( + ULONG_PTR diFile, + ULONG ulFont, + ULONG ulTag, + PTRDIFF dpStart, + ULONG cjBuf, + BYTE *pjBuf, + PBYTE *ppjTable, + ULONG *pcjTable) +{ + PFTFD_FILE pfile = (PFTFD_FILE)diFile; + PBYTE pjTable; + ULONG cjTable; + + TRACE("FtfdQueryTrueTypeTable\n"); + + /* Check if this file supports TrueType tables */ + if (pfile->ulFileFormat != FILEFMT_TTF && + pfile->ulFileFormat != FILEFMT_OTF) + { + WARN("File format doesn't support true type tables\n"); + return FD_ERROR; + } + + /* Check if the whole file is requested */ + if (ulTag == 0) + { + /* Requested the whole file */ + pjTable = pfile->pvView; + cjTable = pfile->cjView; + } + else + { + /* Search for the table */ + pjTable = FtfdFindTrueTypeTable(pfile->pvView, + pfile->cjView, + ulFont, + ulTag, + &cjTable); + if (!pjTable) + { + WARN("Couldn't find table '%.4s'\n", (char*)&ulTag); + return FD_ERROR; + } + } + + /* Return requested pointers */ + if (ppjTable) *ppjTable = pjTable; + if (pcjTable) *pcjTable = cjTable; + + /* Check if we shall copy data */ + if (pjBuf) + { + /* Check if the offset is inside the table */ + if (dpStart < 0 || (ULONG_PTR)dpStart >= cjTable) + { + WARN("dpStart outside the table: %p\n", dpStart); + return FD_ERROR; + } + + /* Don't copy beyond the table end */ + cjTable -= dpStart; + + /* Don't copy more then the buffer can hold */ + if (cjBuf < cjTable) cjTable = cjBuf; + + /* Copy the data to the buffer */ + RtlCopyMemory(pjBuf, pjTable + dpStart, cjTable); + } + + return cjTable; +} + +PVOID +APIENTRY +FtfdGetTrueTypeFile( + ULONG_PTR diFile, + ULONG *pcj) +{ + PFTFD_FILE pfile = (PFTFD_FILE)diFile; + + TRACE("FtfdGetTrueTypeFile\n"); + + /* Check if this file is TrueType */ + if (pfile->ulFileFormat != FILEFMT_TTF && + pfile->ulFileFormat != FILEFMT_OTF) + { + WARN("File format is not TrueType or Opentype\n"); + return NULL; + } + + /* Return the pointer and size */ + if (pcj) *pcj = pfile->cjView; + return pfile->pvView; +} +
Added: branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/tttables.h URL: http://svn.reactos.org/svn/reactos/branches/GSoC_2011/GdiFontDriver/drivers/... ============================================================================== --- branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/tttables.h (added) +++ branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/tttables.h [iso-8859-1] Sat May 7 13:36:02 2011 @@ -1,0 +1,95 @@ + +/* We need these to access unaligned big endian data */ +FORCEINLINE +USHORT GETW(PVOID pv) +{ + PBYTE pj = pv; + return (((USHORT)pj[0]) << 8) | ((USHORT)pj[1]); +} + +FORCEINLINE +ULONG GETD(PVOID pv) +{ + PBYTE pj = pv; + return (((ULONG)pj[0]) << 24) | (((ULONG)pj[1]) << 16) | + (((ULONG)pj[2]) << 8) | ((ULONG)pj[3]); +} + +typedef struct _TT_COLLECTION +{ + ULONG ulTTCTag; + ULONG ulVersion; + ULONG ulNumFonts; + ULONG aulOffsetTable[1]; +} TT_COLLECTION, *PTT_COLLECTION; + +typedef struct _OTF_TABLE_ENTRY +{ + ULONG ulTag; + ULONG ulCheckSum; + ULONG ulOffset; + ULONG ulLength; +} OTF_TABLE_ENTRY, *POTF_TABLE_ENTRY; + +typedef struct _OTF_FILE_HEADER +{ + ULONG ulIdentifier; + USHORT usNumTables; + USHORT usSearchRange; + USHORT usEntrySelector; + USHORT usRangeshift; + + OTF_TABLE_ENTRY aTableEntries[1]; + +} OTF_FILE_HEADER, *POTF_FILE_HEADER; + +#include <pshpack1.h> +typedef struct _OTF_OS2_DATA +{ + USHORT version; // 0x0004 + SHORT xAvgCharWidth; + USHORT usWeightClass; + USHORT usWidthClass; + USHORT fsType; + SHORT ySubscriptXSize; + SHORT ySubscriptYSize; + SHORT ySubscriptXOffset; + SHORT ySubscriptYOffset; + SHORT ySuperscriptXSize; + SHORT ySuperscriptYSize; + SHORT ySuperscriptXOffset; + SHORT ySuperscriptYOffset; + SHORT yStrikeoutSize; + SHORT yStrikeoutPosition; + union // 0x30 + { + struct + { + BYTE jClassId; + BYTE jSubClassId; + }; + SHORT sFamilyClass; + }; + BYTE panose[10]; + ULONG ulUnicodeRange1; // Bits 0-31 + ULONG ulUnicodeRange2; // Bits 32-63 + ULONG ulUnicodeRange3; // Bits 64-95 + ULONG ulUnicodeRange4; // Bits 96-127 + CHAR achVendID[4]; + USHORT fsSelection; + USHORT usFirstCharIndex; + USHORT usLastCharIndex; + SHORT sTypoAscender; + SHORT sTypoDescender; + SHORT sTypoLineGap; + USHORT usWinAscent; + USHORT usWinDescent; + ULONG ulCodePageRange1; // Bits 0-31 + ULONG ulCodePageRange2; // Bits 32-63 + SHORT sxHeight; + SHORT sCapHeight; + USHORT usDefaultChar; + USHORT usBreakChar; + USHORT usMaxContext; +} OTF_OS2_DATA, *POTF_OS2_DATA; +#include <poppack.h>
Propchange: branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/tttables.h ------------------------------------------------------------------------------ svn:eol-style = native