Author: tkreuzer
Date: Thu May 19 21:57:49 2011
New Revision: 51825
URL:
http://svn.reactos.org/svn/reactos?rev=51825&view=rev
Log:
[GDI FONT DRIVER]
- Allow to use non-unicode charsets (Marlett for example only has a symbol charset
embedded)
- Use a char bias when dealing with other charsets
- Fixes Marlett based nonclient buttons, when used as default driver in Windows
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/tttables.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] Thu May
19 21:57:49 2011
@@ -138,7 +138,6 @@
pifi->rclFontBox.top = ftface->bbox.yMax;
pifi->rclFontBox.bottom = ftface->bbox.yMin;
- pifi->cKerningPairs = 0;
pifi->ulPanoseCulture = FM_PANOSE_CULTURE_LATIN;
/* Try to get OS/2 TrueType or OpenType metrics */
@@ -182,8 +181,8 @@
pifi->fwdStrikeoutPosition = pifi->fwdMacAscender / 3;
pifi->fwdAveCharWidth = CalculateAveCharWidth(ftface);
- /* Special characters (first and last char are already enumerated) */
- pifi->wcDefaultChar = 0x0020;
+ /* Special characters */
+ pifi->wcDefaultChar = 0x001F;
pifi->wcBreakChar = 0x0020;
pifi->panose.bFamilyType = PAN_FAMILY_TEXT_DISPLAY;
@@ -199,6 +198,14 @@
*(DWORD*)&pifi->achVendId = 'nknU';
}
+
+ /* Copy unicode values to ansi values */
+ pifi->chDefaultChar = (CHAR)pifi->wcDefaultChar;
+ pifi->chBreakChar = (CHAR)pifi->wcBreakChar;
+ pifi->chFirstChar = (CHAR)pifi->wcFirstChar;
+ if (pifi->wcFirstChar > 0xff) pifi->chFirstChar = 0xff;
+ pifi->chLastChar = (CHAR)pifi->wcLastChar;
+ if (pifi->wcLastChar > 0xff) pifi->chLastChar = 0xff;
/* Try to get type1 info from freetype */
fterror = FT_Get_PS_Font_Info(pface->ftface, &fontinfo);
@@ -334,7 +341,7 @@
{
/* Add a new WCRUN */
cRuns++;
- pGlyphSet->awcrun[cRuns - 1].wcLow = wcCurrent;
+ pGlyphSet->awcrun[cRuns - 1].wcLow = wcCurrent - pface->wcCharBias;
pGlyphSet->awcrun[cRuns - 1].cGlyphs = 1;
pGlyphSet->awcrun[cRuns - 1].phg = &phglyphs[i];
}
@@ -399,9 +406,33 @@
{
PFTFD_FACE pface;
FT_Error fterror;
- ULONG ulAccumCharWidth = 0;
+ ULONG ulEncoding, ulAccumCharWidth = 0;
WCHAR wcCurrent, wcPrev;
FT_UInt index;
+
+ /* Try to load a unicode charmap */
+ ulEncoding = FT_ENCODING_UNICODE;
+ fterror = FT_Select_Charmap(ftface, ulEncoding);
+ if (fterror)
+ {
+ /* Check if we have any charmaps at all */
+ if (ftface->num_charmaps == 0)
+ {
+ WARN("There are no charmaps available!\n");
+ return NULL;
+ }
+
+ /* Load first charmap instead */
+ ulEncoding = ftface->charmaps[0]->encoding;
+ fterror = FT_Select_Charmap(ftface, ulEncoding);
+ if (fterror)
+ {
+ WARN("Could not load a charmap\n");
+ return NULL;
+ }
+
+ TRACE("Loaded charmap with encoding %.4s\n", &ulEncoding);
+ }
pface = EngAllocMem(FL_ZERO_MEMORY, sizeof(FTFD_FACE), 'dftF');
if (!pface)
@@ -415,17 +446,13 @@
pface->iFace = iFace;
pface->ftface = ftface;
pface->cGlyphs = ftface->num_glyphs;
+ pface->ulEncoding = ulEncoding;
+
+ /* Set char bias, FIXME: use lCharBias? other encodings? */
+ pface->wcCharBias = ulEncoding == FT_ENCODING_MS_SYMBOL ? 0xf000 : 0;
/* Get the font format */
pface->ulFontFormat = FtfdGetFontFormat(ftface);
-
- /* Load a unicode charmap */
- fterror = FT_Select_Charmap(ftface, FT_ENCODING_UNICODE);
- if (fterror)
- {
- WARN("Could not load unicode charmap\n");
- return NULL;
- }
/* Start with 0 runs and 0 mappings */
pface->cMappings = 0;
@@ -433,7 +460,7 @@
/* Loop through all character mappings */
wcPrev = wcCurrent = (WCHAR)FT_Get_First_Char(ftface, &index);
- pface->ifiex.ifi.wcFirstChar = wcCurrent;
+ pface->ifiex.ifi.wcFirstChar = wcCurrent - pface->wcCharBias;;
while (index)
{
/* Count the mapping */
@@ -448,7 +475,7 @@
}
/* Save the last character */
- pface->ifiex.ifi.wcLastChar = wcPrev;
+ pface->ifiex.ifi.wcLastChar = wcPrev - pface->wcCharBias;;
/* Initialize IFIMETRICS */
FtfdInitIfiMetrics(pface);
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] Thu May
19 21:57:49 2011
@@ -94,6 +94,8 @@
ULONG cMappings;
ULONG cRuns;
ULONG ulFontRevision;
+ ULONG ulEncoding;
+ WCHAR wcCharBias;
PWCHAR pwcReverseTable;
FD_GLYPHSET *pGlyphSet;
FD_KERNINGPAIR *pKerningPairs;
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] Thu
May 19 21:57:49 2011
@@ -253,13 +253,15 @@
//pifi->fwdUnderscorePosition;
pifi->fwdStrikeoutSize = GETW(&pOs2->yStrikeoutSize);
pifi->fwdStrikeoutPosition = GETW(&pOs2->yStrikeoutPosition);
+ *(DWORD*)pifi->achVendId = *(DWORD*)pOs2->achVendID;
+ //pifi->ulPanoseCulture;
+ pifi->panose = *(PANOSE*)pOs2->panose;
+
+ /* Get special characters */
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;
return TRUE;
}