freetype
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [ft] Working around a bad ascender value?


From: mathog
Subject: Re: [ft] Working around a bad ascender value?
Date: Thu, 14 May 2015 09:29:23 -0700
User-agent: Roundcube Webmail/0.9.5

On 13-May-2015 22:13, Werner LEMBERG wrote:
What FreeType returns are the value present in the font.  From a ttx
dump:

  <hhea>
    ...
    <ascent value="750"/>
    <descent value="-170"/>
    <lineGap value="9"/>
    ...

  <OS_2>
    ...
    <sTypoAscender value="750"/>
    <sTypoDescender value="-170"/>
    <sTypoLineGap value="30"/>
    <usWinAscent value="3080"/>
    <usWinDescent value="885"/>
    ...

<SNIP>


How does one retrieve information from the OS/2 table (assuming one
is present)?

  TT_OS2* os2;

  os2 = (TT_OS2*)FT_Get_Sfnt_Table(face, FT_SFNT_OS2);

Ah good, that is not hard.


Is there some other common workaround for this sort of problem?

Unfortunately, the answer is no.  It's definitely a font bug, or
rather a font conversion bug, since it seems that the converter only
scaled the `usWin*' fields from 1000 (PostScript) units per EM to the
actually used 4096 upem, failing to do it for the other values.

I guess you have to implement some heuristics that compares the three
`metric systems' (i.e., `usWin*' from `OS/2', `sTypo*' from `OS/2',
and the `hhea' values), using the one that appears most sensible.

I don't have a lot of experience with font bugs, so it isn't entirely clear to me what the "most sensible" choice would be. Here the choices are two values for ascender which are less than half of yMax, which is very suspect, or yMax itself. yMax is always the fall back, the trick is figuring out which of the other 3 is "most right", and if any are "right enough". I guess the largest of the 3 would normally be "most right" so long as it isn't larger than ~yMax. Unless of course the largest one is something like 0.2*yMax.

Perhaps something like this:

   ascender = MAXIMUM_OF(all 3 ascender values);
   ascender = (ascender > yMax ? yMax : ascender);
   factor = 0.5; // a guess, perhaps 0.6 would be better
   ascender = (ascender < yMax*factor ? yMax : ascender);

For descender that isn't going to work at all, fonts often have little
or no descender. Perhaps use the descender value that is drawn from the same source as the ascender? That is, if sTypoAscender is used, then also use sTypoDescender

Thanks,

David Mathog
address@hidden
Manager, Sequence Analysis Facility, Biology Division, Caltech



reply via email to

[Prev in Thread] Current Thread [Next in Thread]