GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — Fix auto-sized glyphs with BaKoMa fonts by QuLogic · Pull Request #29936 · matplotlib/matplotlib

Conversation

@QuLogic

@QuLogic QuLogic commented Apr 18, 2025 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Member

PR summary

If the larger glyphs for an auto-sized character in cmex10 uses a character that is in the latex_to_bakoma table, then it will be mapped an extra time into cmr10 (usually). Thus we end up with a large version of a "normal" character, such as an exclamation point.

Instead map these glyphs through the latex_to_bakoma table by using their glyph names as "commands". This ensures they don't get double-mapped to the wrong font and fixes the following issues:

  • slash (/) uses a comma at the larger sizes mathtext_cm_85
  • right parenthesis uses an exclamation point at the largest size mathtext_cm_84
  • left and right braces use parentheses at the largest size mathtext_cm_87
  • right floor uses a percentage sign at the largest size mathtext_cm_88
  • left ceiling uses an ampersand at the largest size mathtext_cm_89

It also found the missing [ size, so it and the corresponding ] are now available again (causing the one test image change.)

In the future, it may make sense to only use the glyph names (using FT2Font.get_name_index instead of FT2Font.get_char_index), and not have a mapping to character codes in our code. Unfortunately, TruetypeFonts._get_glyph expects a font+character code, so this would be a much larger refactor than this bugfix.

I'm turning the above images into tests, but I'm finding that characters that have a "regular" glyph may not be able to select the smallest "big" glyph, because it's actually smaller that the regular one. I'm not yet sure if that's a bug in the selection logic from AutoHeightChar or whether regular glyphs shouldn't count. Since I'll be adding some test images, this PR can wait until after the FreeType 2.13 change.

Fixes #5210 (and #18740 and #29886)

PR checklist

  • "closes #0000" is in the body of the PR description to link the related issue
  • new and changed code is tested
  • [n/a] Plotting related features are demonstrated in an example
  • [n/a] New Features and API Changes are noted with a directive and release note
  • [n/a] Documentation complies with general and docstring guidelines

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@QuLogic QuLogic added the status: needs tests label Apr 18, 2025
@github-actions github-actions Bot added the topic: text/mathtext label Apr 18, 2025
@QuLogic QuLogic mentioned this pull request Apr 18, 2025
Fix glyphs for angle brackets #26518
Closed
1 of 5 tasks
@anntzer

anntzer commented Apr 18, 2025

Copy link
Copy Markdown
Contributor

In the future, it may make sense to only use the glyph names (using FT2Font.get_name_index instead of FT2Font.get_char_index), and not have a mapping to character codes in our code. Unfortunately, TruetypeFonts._get_glyph expects a font+character code, so this would be a much larger refactor than this bugfix.

I don't remember the exact semantics of _get_glyph off the top of my head, but from a quick look at it, did you mean "returns" instead of "expects" (emphasis mine in the quote above)?

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@QuLogic

QuLogic commented Apr 18, 2025

Copy link
Copy Markdown
Member Author

In the future, it may make sense to only use the glyph names (using FT2Font.get_name_index instead of FT2Font.get_char_index), and not have a mapping to character codes in our code. Unfortunately, TruetypeFonts._get_glyph expects a font+character code, so this would be a much larger refactor than this bugfix.

I don't remember the exact semantics of _get_glyph off the top of my head, but from a quick look at it, did you mean "returns" instead of "expects" (emphasis mine in the quote above)?

Right yes. In fact, I meant that its callers expect the character codes (they use FT2Font.load_char, not FT2Font.load_glyph), though I actually found an unrelated bug there: 6c7b9d0 that I tacked on to #29816.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@QuLogic QuLogic mentioned this pull request Apr 18, 2025
Update FreeType to 2.13.3 #29816
Merged
5 tasks
@tacaswell tacaswell added this to the v3.11.0 milestone Apr 18, 2025
@QuLogic
QuLogic force-pushed the bakoma-sizes branch 2 times, most recently from b019f76 to 2b0fd80 Compare April 24, 2025 08:05
@QuLogic

QuLogic commented Apr 24, 2025

Copy link
Copy Markdown
Member Author

After a bit of checking, I've found that for 12pt@100dpi, the multi-sized glyphs are 20, 30, 40, and 50 pixels, with regular text size being 16.671875 pixels (if available). So the text in the tests should look for an interior of 8.915625, 18.320833333333333, 25.156041666666667, 32.16734375, 42.03599479166666, which should hit all sizes of glyphs.

Also, removed the regular sized braces {} because they seem to be the same glyph as the first 'big' size.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@QuLogic QuLogic removed the status: needs tests label Apr 24, 2025
@QuLogic
QuLogic force-pushed the bakoma-sizes branch from 2b0fd80 to dfec6de Compare April 24, 2025 08:25
@anntzer

anntzer commented Apr 24, 2025

Copy link
Copy Markdown
Contributor

I like the new implementation a lot, it's very clear (well, relative to the complexity of the task).
Only a few minor points:

  • Perhaps use \__parenleftbig__ instead of \parenleftbig to make it clearer that this is an internal (intermediate) construct that's not a valid mathtext string. There's precedent in doing so for \__sqrt__.
  • Perhaps start adding some code that interprets Char("\__foo__") as performing a (cached) glyph name lookup if we want to move towards using glyph names instead of glyph indices? (Note that \__sqrt__ will also need a change.)
All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

anntzer
anntzer reviewed Apr 24, 2025
View reviewed changes
Comment thread lib/matplotlib/_mathtext.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

@QuLogic
QuLogic force-pushed the bakoma-sizes branch 2 times, most recently from fd3409d to c2a5501 Compare April 25, 2025 02:32
anntzer
anntzer approved these changes Apr 28, 2025
View reviewed changes

@anntzer anntzer left a comment

Copy link
Copy Markdown
Contributor

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.

I guess it would be OK to test only one of the output formats, as we only care that the right glyphs are selected?

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@QuLogic

QuLogic commented Apr 28, 2025

Copy link
Copy Markdown
Member Author

I guess it would be OK to test only one of the output formats, as we only care that the right glyphs are selected?

Do we have anything for that yet? There's lightweight_math_tests, but it only checks DejaVu Sans, which is not the font we really want to check here.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@anntzer

anntzer commented Apr 28, 2025

Copy link
Copy Markdown
Contributor

There's svgastext?

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@QuLogic QuLogic added this to Font and text overhaul Jun 5, 2025
@github-project-automation github-project-automation Bot moved this to Waiting for other PR in Font and text overhaul Jun 5, 2025
@github-actions github-actions Bot added the status: needs rebase label Jul 25, 2025
@QuLogic
QuLogic force-pushed the bakoma-sizes branch from c2a5501 to 6651a45 Compare August 27, 2025 03:36
@github-actions github-actions Bot added topic: mpl_toolkit topic: rcparams backend: agg topic: path handling backend: ps backend: pdf and removed status: needs rebase labels Aug 27, 2025
@github-actions github-actions Bot added topic: styles CI: Run cibuildwheel Run wheel building tests on a PR labels Aug 27, 2025
@QuLogic
QuLogic changed the base branch from main to text-overhaul August 27, 2025 03:36
@QuLogic
QuLogic force-pushed the bakoma-sizes branch from 6651a45 to 7c7f5ed Compare August 27, 2025 03:37
@github-actions github-actions Bot removed topic: mpl_toolkit topic: rcparams backend: agg topic: path handling backend: ps backend: pdf topic: text/fonts topic: styles CI: Run cibuildwheel Run wheel building tests on a PR status: needs rebase labels Aug 27, 2025
@QuLogic QuLogic moved this from Waiting for other PR to Ready for Review in Font and text overhaul Aug 27, 2025
@QuLogic
QuLogic force-pushed the bakoma-sizes branch from 7c7f5ed to b3fd7d5 Compare August 27, 2025 04:23
@QuLogic

QuLogic commented Aug 27, 2025 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Member Author

Since FreeType and the related PRs are merged in the text-overhaul branch, I've rebased this PR onto it. I've also moved the tests to svgastext.

Image changes are in a separate last commit so they can be stripped before merging.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

QuLogic
QuLogic commented Aug 27, 2025
View reviewed changes
Comment thread lib/matplotlib/tests/test_mathtext.py
fig = plt.figure(figsize=(5.25, 0.75))
fig.patch.set(visible=False) # Minimize image size.
fig.text(0.5, 0.5, text,
fig.text(0.5, 0.5, text, fontsize=16,

@QuLogic QuLogic Aug 27, 2025

Copy link
Copy Markdown
Member Author

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.

Note, I increased the size here because the existing test with dashes is quite small when converted to PNG (maybe half a pixel high, which is antialiased to two grey pixels).

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@QuLogic
QuLogic force-pushed the bakoma-sizes branch from b3fd7d5 to 26a7d54 Compare September 3, 2025 03:48
tacaswell
tacaswell approved these changes Sep 25, 2025
View reviewed changes
QuLogic added 2 commits September 25, 2025 17:32
@QuLogic
Remove dead code from Auto{Height,Width}Char
e422def
@QuLogic
Fix auto-sized glyphs with BaKoMa fonts
3ba2c13
If the larger glyphs for an auto-sized character in `cmex10` uses a
character that is in the `latex_to_bakoma` table, then it will be mapped
an extra time into `cmr10` (usually). Thus we end up with a large
version of a "normal" character, such as an exclamation point.

Instead map these glyphs through the `latex_to_bakoma` table by using
their glyph names as "commands". This ensures they don't get
double-mapped to the wrong font and fixes the following issues:

- slash (/) uses a comma at the larger sizes
- right parenthesis uses an exclamation point at the largest size
- left and right braces use parentheses at the largest size
- right floor uses a percentage sign at the largest size
- left ceiling uses an ampersand at the largest size

Also, drop the regular size braces, as they are the same as the first
`big`-sized version.
@QuLogic
QuLogic force-pushed the bakoma-sizes branch from 26a7d54 to 3ba2c13 Compare September 25, 2025 21:32
@QuLogic

QuLogic commented Sep 25, 2025

Copy link
Copy Markdown
Member Author

Rebased without test images (which were moved to the text-overhaul-figures branch) in preparation for merging.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@QuLogic
QuLogic merged commit b6be596 into matplotlib:text-overhaul Sep 25, 2025
3 checks passed

Uh oh!

There was an error while loading. Please reload this page.

@github-project-automation github-project-automation Bot moved this from Ready for Review to Done in Font and text overhaul Sep 25, 2025
@QuLogic
QuLogic deleted the bakoma-sizes branch September 25, 2025 23:04
wavebyrd pushed a commit to wavebyrd/matplotlib that referenced this pull request Mar 13, 2026
@QuLogic
Merge pull request matplotlib#29936 from QuLogic/bakoma-sizes
9626d4d
Fix auto-sized glyphs with BaKoMa fonts
QuLogic added a commit to QuLogic/matplotlib that referenced this pull request Apr 10, 2026
@QuLogic
Update test images for font/text overhaul
12d2a4d
This includes images changes for the following pull requests / commits:

* [Fix center of rotation with
  rotation_mode='anchor'](matplotlib#29199)
  (c44db77)
* [Remove ttconv backwards-compatibility
  code](matplotlib#30145)
  (8caff88)
* [Remove kerning_factor from
  tests](matplotlib#29816)
  (7b4d725)
* [Set text hinting to
  defaults](matplotlib#29816)
  (8255ae2)
* [Update FreeType to
  2.13.3](matplotlib#29816)
  (89c054d)
* [Implement text shaping with
  libraqm](matplotlib#30000)
  (b0ded3a,
  9813523)
* [Add language parameter to Text
  objects](matplotlib#29794)
  (7ce8eae)
* [Fix auto-sized glyphs with BaKoMa
  fonts](matplotlib#29936)
  (3ba2c13)
* [pdf: Improve text with characters outside embedded font
  limits](matplotlib#30512)
  (b70fb88,
  6cedcf7)
* [Prepare `CharacterTracker` for advanced font
  features](matplotlib#30608)
  (8274e17,
  70dc388,
  df670cf,
  ed5e074)
* [Add font feature API to
  Text](matplotlib#29695)
  (972a688)
* [Fix spacing in r"$\max
  f$"](matplotlib#30715)
  (4a99a83)
* [Implement libraqm for vector
  outputs](matplotlib#30607)
  (bd17cd4)
* [Drop the FT2Font intermediate
  buffer](matplotlib#30059)
  (9d7d7b4)
* [Rasterize dvi files without
  dvipng](matplotlib#30039)
  (7627118)
* [Update bundled FreeType and HarfBuzz
  libraries](matplotlib#30938)
  (a161658,
  9619bcc)
* [Fix positioning of wide mathtext
  accents](matplotlib#31069)
  (c2fa7ba)
* [Refactor RendererAgg.draw_{mathtext,text,tex} to use same base
  algorithm](matplotlib#31085)
  (931bcf3)
* [Implement TeX's fraction and script
  alignment](matplotlib#31046)
  (94ff452,
  4bfa0f9,
  1cd8510)
* [Fix confusion between text height and ascent in metrics
  calculations](matplotlib#31107)
  (60f2310)
* [mathtext: Fetch quad width & axis height from font
  metrics](matplotlib#31110)
  (692df3f,
  383028b)
* [mathtext: add mathnormal and distinguish between normal and italic
  family](matplotlib#31121)
  (a6913f3)
* [ENH: Ignore empty text for
  tightbbox](matplotlib#31285)
  (d772043)
* [Drop axis_artist tickdir image compat, due to text-overhaul
  merge](matplotlib#31281)
  (2057583)
* [text: Use font metrics to determine line
  heights](matplotlib#31291)
  (3ab6a27,
  d961462,
  97f4943)
* [ps/pdf: Override font height metrics to support AFM
  files](matplotlib#31371)
  (e0913d4)
* [TST: Cleanup back-compat code in tests touched by text
  overhaul](matplotlib#31295)
  (7c33379)
* [TST: Set tests touched by text overhaul to mpl20
  style](matplotlib#31300)
  (41c4d8d)
@QuLogic QuLogic mentioned this pull request Apr 10, 2026
Font and text overhaul #30161
Merged
4 tasks done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

@tacaswell tacaswell tacaswell approved these changes
@anntzer anntzer anntzer approved these changes

Uh oh!

There was an error while loading. Please reload this page.

Assignees

No one assigned

Labels

topic: text/mathtext

Projects

Font and text overhaul
Status: Done

Milestone

v3.11.0

Development

Successfully merging this pull request may close these issues.

Unexpected replacement of \right) with exclamation point in MathTextParser output

Uh oh!

There was an error while loading. Please reload this page.

3 participants

@QuLogic @anntzer @tacaswell
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.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.