Commit 96bfe277 authored by David Turner's avatar David Turner
Browse files

a fix to the computation of the font "text height" (i.e. the

baseline-to-baseline distance).

Unfortunately, we cannot rely on the OS/2 fields, like
sTypoAscender or usWinAscent to compute it. Rather,
we only look at the horizontal header's content. In case
the "line gap" is set to 0, we compute the text height as
115% of the ascender+descender value..

(this percentage is based on the values found in many
Windows fonts).
parent 312b59b7
......@@ -481,25 +481,65 @@
root->bbox.yMax = face->header.yMax;
root->units_per_EM = face->header.Units_Per_EM;
/* XXXXX: Computing the ascender/descender/height is very different */
/* from what the specification tells you. Apparently, we must */
/* be careful because: */
/* */
/* - not all fonts have an OS/2 table, in this case, we take the */
/* values in the horizontal header. However, these values */
/* very often are not reliable.. */
/* */
/* - otherwise, the correctly typographic values are in the */
/* sTypoAscender, sTypoDescender & sTypoLineGap fields. */
/* */
/* however, certains fonts have these fields set to 0. Rather, */
/* they have usWinAscent & usWinDescent correctly set (but with */
/* different values). */
/* */
/* As an example, Arial Narrow is implemented through four files */
/* ARIALN.TTF, ARIALNI.TTF, ARIALNB.TTF & ARIALNBI.TTF */
/* */
/* Strangely, all fonts have the same values in their sTypoXXX */
/* fields, except ARIALNB which sets them to 0. */
/* */
/* On the other hand, they all have different usWinAscent/Descent */
/* values.. As a conclusion, the OS/2 table cannot be used to */
/* compute the text height reliably !! */
/* */
/* */
/* The ascender/descender/height are computed from the OS/2 table */
/* when found. Otherwise, they're taken from the horizontal */
/* header. */
/* */
if ( face->os2.version != 0xFFFF )
root->ascender = face->horizontal.Ascender;
root->descender = face->horizontal.Descender;
root->height = root->ascender - root->descender +
face->horizontal.Line_Gap;
/* when the line_gap is 0, we add an extra 15 % to the text height */
/* this computation is based on various versions of Times New Roman */
if (face->horizontal.Line_Gap == 0)
root->height = (root->height*115 + 50)/100;
#if 0
/* some fonts have the OS/2 "sTypoAscender", "sTypoDescender" & */
/* "sTypoLineGap" fields set to 0, like ARIALNB.TTF */
if ( face->os2.version != 0xFFFF && root->ascender )
{
FT_Int height;
root->ascender = face->os2.sTypoAscender;
root->descender = -face->os2.sTypoDescender;
root->height = root->ascender + root->descender +
face->os2.sTypoLineGap;
height = root->ascender + root->descender + face->os2.sTypoLineGap;
if (height > root->height)
root->height = height;
}
else
{
root->ascender = face->horizontal.Ascender;
root->descender = face->horizontal.Descender;
root->height = root->ascender + root->descender +
face->horizontal.Line_Gap;
}
#endif
root->max_advance_width = face->horizontal.advance_Width_Max;
root->max_advance_height = face->vertical_info
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment