You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
LayerMut::embolden computed the winding from all points in a layer as one polygon. With disconnected contours, this adds nonexistent edges between contours to the area calculation and can reverse the winding. As a result, synthetic bold could shrink some glyphs, such as Monaco's i reported in #134.
This change computes the area for each contour separately and sums the results before determining the winding. Then the resulting global winding is used for all contours preserving the correct behavior for inner counter contours.
I verified this change with Monaco text on my app as follows. The existing tests and doc tests pass.
Ran into this independently (Monaco i looking thin under embolden) and ended up writing the same fix before finding this PR.
What we measured, as confirmation: the i is two separate loops — the stem and the dot. To know which way is "outward," the code adds up area as if all the points were one shape, so the imaginary edges between the loops get counted too. For Monaco's i the real loops measure -280 and -47, but those fake edges drag the total to +21 — opposite sign. So embolden squeezes the letter instead of thickening it: at 44px, embolden(0.27) takes the stem from 4.0px down to 3.45px.
Fourteen glyphs in Monaco and sixteen in JetBrains Mono fail the same way — every one is a letter with a detached piece, like dots and accents. Letters with holes are still fine when you sum the loops one at a time: o measures -970 outside and +446 for the hole, and the answer doesn't change.
We're carrying this patch vendored until it lands. Thanks for the fix.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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.
Fix #134
LayerMut::emboldencomputed the winding from all points in a layer as one polygon. With disconnected contours, this adds nonexistent edges between contours to the area calculation and can reverse the winding. As a result, synthetic bold could shrink some glyphs, such as Monaco'sireported in #134.This change computes the area for each contour separately and sums the results before determining the winding. Then the resulting global winding is used for all contours preserving the correct behavior for inner counter contours.
I verified this change with Monaco text on my app as follows. The existing tests and doc tests pass.