Repository navigation
Conversation
CFF1 closes the final contour on endchar, which CFF2 does not have, so the last contour of every CFF2 glyph was left open. Rasterizers that don't close paths themselves (fontdue) fill such glyphs solid; Noto Sans CJK VF glyphs render as filled boxes. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
CFF1 closes the final contour on
endchar. CFF2 has noendchar, socff2::parse_char_stringreturns with the last contour of every glyph still open:close()is only emitted by a followingmoveto.Consumers that close paths themselves don't notice. Ones that don't, like fontdue, fill the open contour as if it ran back to the origin. In practice, every glyph of Haiku's stock
NotoSansMonoCJKjp-VF.otfcame out as a solid block: 你 has 8 contours but only 7close()calls. With this change, fontdue's rasterization of 你 from the variable font matches the staticNotoSansCJK-Regular.ttcpixel for pixel.Change: after the top-level charstring is parsed, close the path if a
movetowas seen. This mirrors what CFF1 does atendchar.Tests:
Z. One of them explicitly documented the open last contour.every_contour_is_closeduses two contours. It fails without the fix (… L 100 200vs… L 100 200 Z).cargo testandcargo test --releasepass.I didn't have
polylocally.cargo fmt --checkon the changed source file is clean.🤖 Generated with Claude Code