FIX: do not append None to stream in ps#23910
Closed
tacaswell wants to merge 1 commit intomatplotlib:mainfrom
Closed
FIX: do not append None to stream in ps#23910tacaswell wants to merge 1 commit intomatplotlib:mainfrom
tacaswell wants to merge 1 commit intomatplotlib:mainfrom
Conversation
This was reported as an issue and this seems like the problem, but we do not have a good test yet.
Contributor
|
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. |
Member
|
Gah! I knew that I've seen this... Closes #23964 (although that has a test...). |
2 tasks
Member
Author
|
Closing in favor of #23964 |
1 task
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
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.
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
pytestpasses).flake8-docstringsand runflake8 --docstring-convention=all).