void createKerningPairs (HDC dc, const float height) { HeapBlock<KERNINGPAIR> rawKerning; const DWORD numKPs = GetKerningPairs (dc, 0, 0); rawKerning.calloc (numKPs); GetKerningPairs (dc, numKPs, rawKerning); kerningPairs.ensureStorageAllocated ((int) numKPs); for (DWORD i = 0; i < numKPs; ++i) { KerningPair kp; kp.glyph1 = getGlyphForChar (dc, rawKerning[i].wFirst); kp.glyph2 = getGlyphForChar (dc, rawKerning[i].wSecond); const int standardWidth = getGlyphWidth (dc, kp.glyph1); kp.kerning = (standardWidth + rawKerning[i].iKernAmount) / height; kerningPairs.add (kp); kp.glyph2 = -1; // add another entry for the standard width version.. kp.kerning = standardWidth / height; kerningPairs.add (kp); } }
WindowsTypeface (const Font& font) : Typeface (font.getTypefaceFamily(), font.getTypefaceStyle()), fontH (0), previousFontH (0), dc (CreateCompatibleDC (0)), ascent (1.0f), defaultGlyph (-1) { loadFont(); if (GetTextMetrics (dc, &tm)) { ascent = tm.tmAscent / (float) tm.tmHeight; defaultGlyph = getGlyphForChar (dc, tm.tmDefaultChar); createKerningPairs (dc, (float) tm.tmHeight); } }
WindowsTypeface (const Font& font) : Typeface (font.getTypefaceName(), font.getTypefaceStyle()), fontH (0), previousFontH (0), dc (CreateCompatibleDC (0)), ascent (1.0f), heightToPointsFactor (1.0f), defaultGlyph (-1) { loadFont(); if (GetTextMetrics (dc, &tm)) { heightToPointsFactor = (72.0f / GetDeviceCaps (dc, LOGPIXELSY)) * heightInPoints / (float) tm.tmHeight; ascent = tm.tmAscent / (float) tm.tmHeight; defaultGlyph = getGlyphForChar (dc, tm.tmDefaultChar); createKerningPairs (dc, (float) tm.tmHeight); } }