-
-
Notifications
You must be signed in to change notification settings - Fork 7.9k
FIX: correctly handle generic font families in svg text-as-text mode #23638
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
Conversation
b31ed3f
to
41a1777
Compare
This might require some changes to sort out if CI has the fonts (or just just the "wrong" kind of font to exercise the code). |
I appear to have introduced a memory leak as the runners are getting OOM'd and running the tests with a single worker is using ~2G of ram. |
This seems to cause an 8x increase in memory usage and a 10x slow down in the test suite. |
lib/matplotlib/font_manager.py
Outdated
family, | ||
", ".join(self._expand_aliases(family)) | ||
if family in font_family_aliases: | ||
# deal with the sans/san-serif/sans serif issue |
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.
This and the following line (the start of the for loop) can be just
for fam in self._expand_aliases(family):
if fam in font_family_aliases: continue # is that even possible?
...
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.
This will go into another PR, this change seems to be causing a 10x memory increase and I do not understand why yet.
This is not ready yet and I do not want to hold 3.6 on it. It is possible that the changes will be small enough to backport to a 3.6.x, but I am not optimistic. |
36725ed
to
af2cc4f
Compare
I think this may now be small enough to backport to v3.6.x but I do not think we should block 3.6.0 over it. |
@@ -1151,10 +1151,56 @@ def _draw_text_as_text(self, gc, x, y, s, prop, angle, ismath, mtext=None): | |||
weight = fm.weight_dict[prop.get_weight()] | |||
if weight != 400: | |||
font_parts.append(f'{weight}') | |||
|
|||
def unique_iter(inp): |
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.
That's actually [*dict.fromkeys(inp)]
(or even without the conversion to list which is not needed in this case, iterating over the keys is fine); this is so short that it could even be inlined with a comment, something like dict.fromkeys(s for fam in prop.get_family() for s in _format_font_name(fam))
(or dict.fromkeys(itertools.chain(*map(_format_font_name, prop.get_family())))
for itertools aficionados)
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.
oh, nice!
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 replaced unique_iter
, but didn't do anything fancier.
af2cc4f
to
26345f8
Compare
26345f8
to
3b9dc06
Compare
3b9dc06
to
99aeb16
Compare
This tests: 1. all of the fonts from the generic lists Matplotlib maintains ends up in the svg 2. the generic family is included and un-escaped 3. the specific fonts are escaped 4. glyph fallback will happen in fonts found via generic family names
This: - expands the generic fonts families to the user configured specific fonts in the svg output - ensures that each font family only appears once per text element in the svg output - ensures that generic families are unquoted and specific families are closes matplotlib#22528 closes matplotlib#23492
If the cached function raises it will not be cached and we will continuously pay for cache misses.
99aeb16
to
6e99a52
Compare
I pushed some minor corrections to the comments directly. |
…lies in svg text-as-text mode
…638-on-v3.6.x Backport PR #23638 on branch v3.6.x (FIX: correctly handle generic font families in svg text-as-text mode)
PR Summary
This:
in the svg output
closes #22528
closes #23492
I still need to write a test for this, but interactively this gives things like
PR Checklist
Tests and Styling
pytest
passes).flake8-docstrings
and runflake8 --docstring-convention=all
).