BOOL PSDRV_GetFontMetrics(void) { if (PSDRV_GlyphListInit() != 0) return FALSE; if (PSDRV_GetType1Metrics() == FALSE) return FALSE; #ifdef HAVE_FREETYPE if (PSDRV_GetTrueTypeMetrics() == FALSE) return FALSE; #endif if (AddBuiltinAFMs() == FALSE) return FALSE; PSDRV_IndexGlyphList(); /* Enable fast searching of glyph names */ PSDRV_DumpFontList(); return TRUE; }
static VOID Unicodify(AFM *afm, OLD_AFMMETRICS *metrics) { INT i; if (strcmp(afm->EncodingScheme, "FontSpecific") == 0) { for (i = 0; i < afm->NumofMetrics; ++i) { if (metrics[i].C >= 0x20 && metrics[i].C <= 0xff) { metrics[i].UV = metrics[i].C | 0xf000L; } else { TRACE("Unencoded glyph '%s'\n", metrics[i].N->sz); metrics[i].UV = -1L; } } afm->WinMetrics.sAscender = (SHORT)Round(afm->FontBBox.ury); afm->WinMetrics.sDescender = (SHORT)Round(afm->FontBBox.lly); } else /* non-FontSpecific encoding */ { UNICODEGLYPH ug, *p_ug; PSDRV_IndexGlyphList(); /* for fast searching of glyph names */ afm->WinMetrics.sAscender = afm->WinMetrics.sDescender = 0; for (i = 0; i < afm->NumofMetrics; ++i) { ug.name = metrics[i].N; p_ug = bsearch(&ug, PSDRV_AGLbyName, PSDRV_AGLbyNameSize, sizeof(ug), UnicodeGlyphByNameIndex); if (p_ug == NULL) { TRACE("Glyph '%s' not in Adobe Glyph List\n", ug.name->sz); metrics[i].UV = -1L; } else { metrics[i].UV = p_ug->UV; if (IsWinANSI(p_ug->UV)) { SHORT ury = (SHORT)Round(metrics[i].B.ury); SHORT lly = (SHORT)Round(metrics[i].B.lly); if (ury > afm->WinMetrics.sAscender) afm->WinMetrics.sAscender = ury; if (lly < afm->WinMetrics.sDescender) afm->WinMetrics.sDescender = lly; } } } if (afm->WinMetrics.sAscender == 0) afm->WinMetrics.sAscender = (SHORT)Round(afm->FontBBox.ury); if (afm->WinMetrics.sDescender == 0) afm->WinMetrics.sDescender = (SHORT)Round(afm->FontBBox.lly); } afm->WinMetrics.sLineGap = 1150 - (afm->WinMetrics.sAscender - afm->WinMetrics.sDescender); if (afm->WinMetrics.sLineGap < 0) afm->WinMetrics.sLineGap = 0; afm->WinMetrics.usWinAscent = (afm->WinMetrics.sAscender > 0) ? afm->WinMetrics.sAscender : 0; afm->WinMetrics.usWinDescent = (afm->WinMetrics.sDescender < 0) ? -(afm->WinMetrics.sDescender) : 0; }