-
-
Notifications
You must be signed in to change notification settings - Fork 7.9k
FIX: do not append None to stream in ps #23910
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
This was reported as an issue and this seems like the problem, but we do not have a good test yet.
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.
Seems reasonable.
Seems good, but perhaps simpler to use a groupby here? Something like (untested) diff --git a/lib/matplotlib/backends/backend_ps.py b/lib/matplotlib/backends/backend_ps.py
index f209e811f1..4d31fd881a 100644
--- a/lib/matplotlib/backends/backend_ps.py
+++ b/lib/matplotlib/backends/backend_ps.py
@@ -7,6 +7,7 @@ import datetime
from enum import Enum
import functools
from io import StringIO
+import itertools
import logging
import os
import pathlib
@@ -626,10 +627,13 @@ grestore
if ismath:
return self.draw_mathtext(gc, x, y, s, prop, angle)
+ stream = [] # list of (ps_name, x, char_name)
+
if mpl.rcParams['ps.useafm']:
font = self._get_font_afm(prop)
+ ps_name = (font.postscript_name
+ .encode("ascii", "replace").decode("ascii"))
scale = 0.001 * prop.get_size_in_points()
- stream = []
thisx = 0
last_name = None # kerns returns 0 for None.
xs_names = []
@@ -643,37 +647,24 @@ grestore
kern = font.get_kern_dist_from_name(last_name, name)
last_name = name
thisx += kern * scale
- xs_names.append((thisx, name))
+ xs_names.append((ps_name, thisx, name))
thisx += width * scale
- ps_name = (font.postscript_name
- .encode("ascii", "replace").decode("ascii"))
- stream.append((ps_name, xs_names))
else:
font = self._get_font_ttf(prop)
self._character_tracker.track(font, s)
- stream = []
- prev_font = curr_stream = None
for item in _text_helpers.layout(s, font):
ps_name = (item.ft_object.postscript_name
.encode("ascii", "replace").decode("ascii"))
- if item.ft_object is not prev_font:
- if curr_stream:
- stream.append(curr_stream)
- prev_font = item.ft_object
- curr_stream = [ps_name, []]
- curr_stream[1].append(
- (item.x, item.ft_object.get_glyph_name(item.glyph_idx))
- )
- # append the last entry
- stream.append(curr_stream)
+ glyph_name = item.ft_object.get_glyph_name(item.glyph_idx)
+ stream.append((ps_name, item.x, glyph_name))
self.set_color(*gc.get_rgb())
- for ps_name, xs_names in stream:
+ for ps_name, group in itertools.groupby(stream, lambda entry: entry[0]):
self.set_font(ps_name, prop.get_size_in_points(), False)
thetext = "\n".join(f"{x:g} 0 m /{name:s} glyphshow"
- for x, name in xs_names)
+ for _, x, name in group)
self._pswriter.write(f"""\
gsave
{self._get_clip_cmd(gc)} Edit: In fact set_font itself already checks if the font has already been set previously and skips redundant setfont calls, so we could just entirely get rid of the groupby logic too. |
Gah! I knew that I've seen this... Closes #23964 (although that has a test...). |
Closing in favor of #23964 |
PR Summary
This was reported as an issue and this seems like the problem, but we do not have a good test yet.
Closes #23954
Closes #23964 (although that has a test...).
PR Checklist
Tests and Styling
pytest
passes).flake8-docstrings
and runflake8 --docstring-convention=all
).