Author: tkreuzer Date: Tue May 17 22:54:19 2011 New Revision: 51817
URL: http://svn.reactos.org/svn/reactos?rev=51817&view=rev Log: [GDI FONT DRIVER] - Calculate some fallback metrics differently - set default vendor id to 'Unkn' - Calculate the windows family from the PANOSE data instead of from the class ids (remove GetWinFamily) - Implement enumeration of char sets
Modified: branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/font.c branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/todo.txt branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/tttables.c branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/tttables.h
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] Tue May 17 22:54:19 2011 @@ -96,10 +96,6 @@
pifi->lEmbedId = 0; pifi->lCharBias = 0; - - /* Set pitch */ - pifi->jWinPitchAndFamily = FT_IS_FIXED_WIDTH(ftface) ? FIXED_PITCH : - VARIABLE_PITCH;
/* Feature flags */ pifi->flInfo = FM_INFO_RETURNS_BITMAPS | FM_INFO_1BPP | FM_INFO_4BPP; @@ -127,14 +123,12 @@ pifi->fwdMacLineGap = 0; pifi->fwdMaxCharInc = ftface->max_advance_width; pifi->fwdUnderscoreSize = ftface->underline_thickness; - pifi->fwdUnderscorePosition = ftface->underline_position; // FIXME: off by 10 - pifi->fwdStrikeoutSize = pifi->fwdUnitsPerEm / 20; - pifi->fwdStrikeoutPosition = pifi->fwdUnitsPerEm / 4; + pifi->fwdUnderscorePosition = ftface->underline_position;
pifi->ptlBaseline.x = 1; // FIXME pifi->ptlBaseline.y = 0; // FIXME - pifi->ptlAspect.x = 0x3e9; // FIXME - pifi->ptlAspect.y = 0x3e9; // FIXME + pifi->ptlAspect.x = 1; + pifi->ptlAspect.y = 1; pifi->ptlCaret.x = 0; // FIXME pifi->ptlCaret.y = 1; // FIXME
@@ -173,9 +167,9 @@ pifi->fwdWinDescender = -(ftface->descender * 213) / 170; pifi->fwdTypoAscender = ftface->ascender; pifi->fwdTypoDescender = ftface->descender; - pifi->fwdTypoLineGap = ftface->units_per_EM / 10; - pifi->fwdCapHeight = 0; - pifi->fwdXHeight = 0; + pifi->fwdTypoLineGap = pifi->fwdUnitsPerEm / 10; + pifi->fwdCapHeight = pifi->fwdUnitsPerEm / 2; + pifi->fwdXHeight = pifi->fwdUnitsPerEm / 4; pifi->fwdSubscriptXSize = 0; pifi->fwdSubscriptYSize = 0; pifi->fwdSubscriptXOffset = 0; @@ -184,6 +178,8 @@ pifi->fwdSuperscriptYSize = 0; pifi->fwdSuperscriptXOffset = 0; pifi->fwdSuperscriptYOffset = 0; + pifi->fwdStrikeoutSize = pifi->fwdUnderscoreSize; + pifi->fwdStrikeoutPosition = pifi->fwdMacAscender / 3; pifi->fwdAveCharWidth = CalculateAveCharWidth(ftface);
/* Special characters (first and last char are already enumerated) */ @@ -201,7 +197,7 @@ pifi->panose.bMidline = PAN_ANY; pifi->panose.bXHeight = PAN_ANY;
- *(DWORD*)&pifi->achVendId = '0000'; + *(DWORD*)&pifi->achVendId = 'nknU'; }
/* Try to get type1 info from freetype */ @@ -216,6 +212,22 @@ /* Set fallback values */ pifi->lItalicAngle = 0; } + + /* Get the win family */ + if (pifi->panose.bFamilyType == PAN_FAMILY_SCRIPT) + pifi->jWinPitchAndFamily = FF_SCRIPT; + else if (pifi->panose.bFamilyType == PAN_FAMILY_DECORATIVE) + pifi->jWinPitchAndFamily = FF_DECORATIVE; + else if (pifi->panose.bProportion == PAN_PROP_MODERN) + pifi->jWinPitchAndFamily = FF_MODERN; + else if (pifi->panose.bSerifStyle <= PAN_SERIF_ROUNDED) + pifi->jWinPitchAndFamily = FF_SWISS; + else + pifi->jWinPitchAndFamily = FF_ROMAN; + + /* Set pitch */ + pifi->jWinPitchAndFamily |= FT_IS_FIXED_WIDTH(ftface) ? FIXED_PITCH : + VARIABLE_PITCH;
/* Convert the special characters from unicode to ansi */ EngUnicodeToMultiByteN(&pifi->chFirstChar, 4, NULL, &pifi->wcFirstChar, 8);
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] Tue May 17 22:54:19 2011 @@ -36,16 +36,15 @@ - dpwszUniqueName: get from 'name' table - dpFontSim: implement - dpCharSets: implement - - fwdMacLineGap: implement + - fwdMacLineGap: from hhea table - fwdMaxCharInc: check/fix - fwdCapHeight: check/fix - fwdUnderscorePosition: fix - chFirstChar, chLastChar, chDefaultChar, chBreakChar: fix - wcDefaultChar, wcBreakChar: fix - ptlBaseline: fix - - ptlAspect: fix - - ptlCaret: fix - - jWinPitchandFamily: check, improve (Apolonia: 0,0->0x12) + - ptlCaret: use hhea table caretSlopeRun, caretSlopeRise + - Put most important charset into slot 0
- FtfdInitGlyphSet: 100% done - FtfdInitKerningPairs: 90% done
Modified: branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/tttables.c URL: http://svn.reactos.org/svn/reactos/branches/GSoC_2011/GdiFontDriver/drivers/... ============================================================================== --- branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/tttables.c [iso-8859-1] (original) +++ branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/tttables.c [iso-8859-1] Tue May 17 22:54:19 2011 @@ -149,170 +149,30 @@ return NULL; }
-/*! \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 -GetWinFamily(BYTE jClassId, BYTE jSubclassId) -{ - switch (jClassId) - { - case 0: // Class ID = 0 No Classification - return FF_ROMAN;//FF_SWISS; - - 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; - } - - WARN("Unhandled class: jClassId=%d, jSubclassId=%d\n", jClassId, jSubclassId); -//__debugbreak(); - return FF_SWISS; -} +static BYTE +gajlCodePage1[32] = +{ + /* 0 */ ANSI_CHARSET, + /* 1 */ EASTEUROPE_CHARSET, + /* 2 */ RUSSIAN_CHARSET, + /* 3 */ GREEK_CHARSET, + /* 4 */ TURKISH_CHARSET, + /* 5 */ HEBREW_CHARSET, + /* 6 */ ARABIC_CHARSET, + /* 7 */ BALTIC_CHARSET, + /* 8 */ VIETNAMESE_CHARSET, + /* 9-15 */ 0, 0, 0, 0, 0, 0, 0, + /* 16 */ THAI_CHARSET, + /* 17 */ SHIFTJIS_CHARSET, + /* 18 */ GB2312_CHARSET, + /* 19 */ HANGEUL_CHARSET, // Korean Wansung, is this correct? + /* 20 */ CHINESEBIG5_CHARSET, + /* 21 */ JOHAB_CHARSET, + /* 22-28 */ 0, 0, 0, 0, 0, 0, 0, + /* 29 */ MAC_CHARSET, + /* 30 */ OEM_CHARSET, + /* 31 */ SYMBOL_CHARSET, +};
BOOL NTAPI @@ -324,6 +184,8 @@ PVOID pvView = pfile->pvView; PTT_TABLE_OS2 pOs2; PTT_TABLE_HEAD pHead; + PBYTE pjCharset; + ULONG ulCharset, ulBit, ulCodePageRange1;
/* Get the head table for the face */ pHead = FtfdFindTrueTypeTable(pvView, pfile->cjView, pface->iFace, 'daeh', NULL); @@ -345,10 +207,26 @@ return FALSE; }
+ /* Get a pointer to the charsets */ + pjCharset = (PBYTE)pifi + pifi->dpCharSets; + + /* Loop bits of ulCodePageRange1 */ + ulCodePageRange1 = GETD(&pOs2->ulCodePageRange1); + for (ulBit = 0, ulCharset = 0; ulBit < 32 && ulCharset < 15; ulBit++) + { + /* Check if the unicode range is present */ + if (ulCodePageRange1 & (1 << ulBit)) + { + /* Save the win charset */ + pjCharset[ulCharset++] = gajlCodePage1[ulBit]; + } + } + + /* Copy the first charset */ + pifi->jWinCharSet = pjCharset[0]; + //pifi->lEmbedId; //pifi->lCharBias; - //pifi->jWinCharSet; - pifi->jWinPitchAndFamily |= GetWinFamily(pOs2->jClassId, pOs2->jSubClassId); pifi->usWinWeight = GETW(&pOs2->usWeightClass); pifi->fsSelection = GETW(&pOs2->fsSelection); pifi->fsType = GETW(&pOs2->fsType);
Modified: 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 [iso-8859-1] (original) +++ branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/tttables.h [iso-8859-1] Tue May 17 22:54:19 2011 @@ -92,21 +92,21 @@ }; 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; + BYTE panose[10]; // 0x20 + ULONG ulUnicodeRange1; // 0x2A Bits 0-31 + ULONG ulUnicodeRange2; // 0x2E Bits 32-63 + ULONG ulUnicodeRange3; // 0x32 Bits 64-95 + ULONG ulUnicodeRange4; // 0x36 Bits 96-127 + CHAR achVendID[4]; // 0x3a + USHORT fsSelection; // 0x3e + USHORT usFirstCharIndex; // 0x40 + USHORT usLastCharIndex; // 0x42 + SHORT sTypoAscender; // 0x44 SHORT sTypoDescender; SHORT sTypoLineGap; USHORT usWinAscent; USHORT usWinDescent; - ULONG ulCodePageRange1; // Bits 0-31 + ULONG ulCodePageRange1; // 0x4e Bits 0-31 ULONG ulCodePageRange2; // Bits 32-63 SHORT sxHeight; SHORT sCapHeight;