Example #1
0
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;
}
Example #2
0
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;
}