-
-
Notifications
You must be signed in to change notification settings - Fork 7.9k
Improve usability of dviread.Text by third parties. #22609
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Conversation
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
oscargus
reviewed
Mar 6, 2022
FWIW, to me, it seems to make sense. But since I generally do not have that strong opinions (knowledge) about proper API, I wait with approval... |
oscargus
approved these changes
Mar 13, 2022
tacaswell
reviewed
Mar 22, 2022
timhoffm
reviewed
Apr 18, 2022
timhoffm
reviewed
Apr 18, 2022
timhoffm
approved these changes
Apr 18, 2022
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Anybody can merge after CI pass.
dviread.Text specifies individual glyphs in parsed dvi files; this is used by the pdf and svg backends (via textpath, for svg) to parse the result of usetex-compiled strings and embed the right glyphs at the right places in the output file (as a reminder, agg currenly uses dvipng to rasterize the dvi file, and the ps backend relies on pstricks). Unfortunately, if third-party backends (e.g. mplcairo) want to do use the same strategy as pdf/svg, then they need to jump through a few hoops (e.g. understand PsfontsMap and find_tex_font) and use some private APIs (_parse_enc), as explained below. Try to improve the situation, by adding some methods on the Text class (which may later allow deprecating PsfontsMap and find_tex_font as public API). First, the actual font to be used is speficied via the `.font` attribute, which itself has a `.texname` which itself must be used as a key into `PsfontsMap(find_tex_font("pdftex.map"))` to get the actual font path (and some other info). Instead, just provide a `.font_path` property. pdftex.map can also require that the font be "slanted" or "extended" (that's some of the "other info), lift that as well to `.font_effects`. The `.font` attribute has a `.size`; also we can lift up to `.font_size`. Altogether, this will allow making `.font` private (later) -- except for the fact that Text is a namedtuple so deprecating fields is rather annoying. The trickiest part is actually specifying what glyph to select from the font. dvi just gives us an integer, whose interpretation depends again on pdftex.map. If pdftex.map specifies "no encoding" for the font, then the integer is the "native glyph index" of the font, and should be passed as-is to FreeType's FT_Load_Char (after selecting the native charmap). If pdftex.map does specify an encoding, then that's a file that needs to be separately loaded, parsed (with _parse_enc), and ultimately converts the index into a glyph name (which can be passed to FreeType's FT_Load_Glyph). Altogether, from the PoV of the end user, the "glyph specification" is thus either an int (a native charmap index) or a str (a glyph name); thus, provide `.glyph_name_or_index` which is that API. As an example of using that API, see the changes to textpath.py.
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.
dviread.Text specifies individual glyphs in parsed dvi files; this is
used by the pdf and svg backends (via textpath, for svg) to parse the
result of usetex-compiled strings and embed the right glyphs at the
right places in the output file (as a reminder, agg currenly uses dvipng
to rasterize the dvi file, and the ps backend relies on pstricks).
Unfortunately, if third-party backends (e.g. mplcairo) want to do use
the same strategy as pdf/svg, then they need to jump through a few hoops
(e.g. understand PsfontsMap and find_tex_font) and use some private APIs
(_parse_enc), as explained below. Try to improve the situation, by
adding some methods on the Text class (which may later allow deprecating
PsfontsMap and find_tex_font as public API).
First, the actual font to be used is speficied via the
.font
attribute, which itself has a
.texname
which itself must be used asa key into
PsfontsMap(find_tex_font("pdftex.map"))
to get the actualfont path (and some other info). Instead, just provide a
.font_path
property. pdftex.map can also require that the font be "slanted" or
"extended" (that's some of the "other info), lift that as well to
.font_effects
. The.font
attribute has a.size
; also we can liftup to
.font_size
. Altogether, this will allow making.font
private(later) -- except for the fact that Text is a namedtuple so deprecating
fields is rather annoying.
The trickiest part is actually specifying what glyph to select from the
font. dvi just gives us an integer, whose interpretation depends again
on pdftex.map. If pdftex.map specifies "no encoding" for the font, then
the integer is the "native glyph index" of the font, and should be
passed as-is to FreeType's FT_Load_Char (after selecting the native
charmap). If pdftex.map does specify an encoding, then that's a file
that needs to be separately loaded, parsed (with _parse_enc), and
ultimately converts the index into a glyph name (which can be passed to
FreeType's FT_Load_Glyph). Altogether, from the PoV of the end user,
the "glyph specification" is thus either an int (a native charmap index)
or a str (a glyph name); thus, provide
.glyph_spec
which is that API.As an example of using that API, see the changes to textpath.py.
I probably won't have too much time to hash out the best API here (well, I'm OK with the one I wrote, but perhaps better choices are possible) in the coming days, but just posting this out in response to #22127, as this is, I think, the way towards tightening the dviread public API while consolidating the useful functionality for third parties.
PR Summary
PR Checklist
Tests and Styling
pytest
passes).flake8-docstrings
and runflake8 --docstring-convention=all
).Documentation
doc/users/next_whats_new/
(follow instructions in README.rst there).doc/api/next_api_changes/
(follow instructions in README.rst there).