Switch to using alphabetic baseline #30
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
The "middle" baseline was convenient for placing the glyph in the middle of the canvas when we didn't know the metrics, but for fonts with especially large ascenders or descenders, the middle baseline could shift significantly compared to the "alphabetic" baseline we'd normally expect. Extracting metrics gives us all the information we need to correctly place the glyph on the canvas even when we're using the alphabetic baseline, so this PR switches to alphabetic whenever metrics are available.
Here's an overlay of the Meiryo and YaHei fonts, showing how the alphabetic baseline matches expectations (Meiryo "broke" earlier assumption because it has a very large font descender):
The "top" metric now means "distance from alphabetic baseline to top of glyph" which seems pretty intuitive but notably different from what https://github.com/mapbox/sdf-glyph-foundry generates. GL JS can adjust to bring the two metrics mostly into line.
I did some sanity testing of the resulting glyphs and metrics for the legacy "no metrics" pathway, although I don't think the most recent GL JS runs on any browser that will require going down that pathway. It'll be a nice simplification to remove.
Here are some cross browser/font/platform test results (it would be great to figure out a good way to automate this):
Chrome MacOS Meiryo : Server Arial












Chrome macOS Meiryo:Meiryo
Chrome MacOS san-serif all
Chrome MacOS sans-serif: server Arial
Chrome Windows 10 : sans-serif all
Chrome Windows 10 sans-serif : Server Arial
Edge Windows 10 sans-serif : Server Arial
Edge Windows 10 sans-serif all
Firefox MacOS san-serif : Server Arial
Firefox MacOS sans-serif all
Firefox Windows 10 sans-serif : Server Arial Unicode
Firefox Windows 10 sans-serif all
@mourner