On 04/23/2013 02:04 AM, Ken Thomases wrote:
Hmm. I assumed that ascent+descent+leading equals the distance between baselines. In a Mac-native text editor, the strokes of one line of Zapfino can extend into the lines above or below, which is why I figured they exceeded the ascent and descent values. Notepad doesn't let the lines get that close, though. So, something else must be going on. I guess this isn't relevant to the question at issue with your patch. Never mind. ;) -Ken

Apple and Microsoft have different definitions of "ascent" and "descent" - so you may very well be right about how Apple does it, but the OS/2 table contains "typo" ascent/descent and "win" ascent/descent... I think "typo" ascent/descent is used similar to what you described, but "win" ascent/descent (which is what is retrieved through GetTextMetrics on Windows) is for maximum/minimum glyph size. I may be wrong, so if there are any typography experts reading this, please speak up. :)

Regardless, we see this in freetype.c:
if(font->yMax) {
    TM.tmAscent = font->yMax;
    TM.tmDescent = -font->yMin;
    TM.tmInternalLeading = (TM.tmAscent + TM.tmDescent) - ft_face->size->metrics.y_ppem;
} else {
    TM.tmAscent = SCALE_Y(ascent);
    TM.tmDescent = SCALE_Y(descent);
    TM.tmInternalLeading = SCALE_Y(ascent + descent - ft_face->units_per_EM);
}

So it's clearly the intent of tmAscent and tmDescent to contain yMax and -yMin (if available) and so I feel that it's safe to clip the fonts, because it should only affect improperly-made fonts in the first place, and it's Windows's native behavior to clip accordingly.

(My head is spinning from all of this typography work ...)

And yeah, Wine's Notepad does keep the lines spaced well apart. I don't (and can't) know if that's the case on Windows or not, but it might be worth looking into later.

Thanks,
Sam