FIX: correctly handle generic font families in svg text-as-text mode#23638
FIX: correctly handle generic font families in svg text-as-text mode#23638tacaswell merged 3 commits intomatplotlib:mainfrom
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.
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.
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. |
| if weight != 400: | ||
| font_parts.append(f'{weight}') | ||
|
|
||
| def unique_iter(inp): |
There was a problem hiding this comment.
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.
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
pytestpasses).flake8-docstringsand runflake8 --docstring-convention=all).