From 3e6344cc44425a3f9ae978c59b91039718691cab Mon Sep 17 00:00:00 2001 From: Abhijnan Bajpai Date: Fri, 28 Oct 2022 13:42:26 +0530 Subject: [PATCH 1/4] Switching to a simpler group by logic --- lib/matplotlib/backends/backend_ps.py | 30 ++++++++------------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/lib/matplotlib/backends/backend_ps.py b/lib/matplotlib/backends/backend_ps.py index 8987e5e551e5..e8e82ecdfe54 100644 --- a/lib/matplotlib/backends/backend_ps.py +++ b/lib/matplotlib/backends/backend_ps.py @@ -7,6 +7,7 @@ from enum import Enum import functools from io import StringIO +import itertools import logging import os import pathlib @@ -630,10 +631,12 @@ def draw_text(self, gc, x, y, s, prop, angle, ismath=False, mtext=None): 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 = [] @@ -647,38 +650,23 @@ def draw_text(self, gc, x, y, s, prop, angle, ismath=False, mtext=None): 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 if exists - if curr_stream: - 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)} From 22bad5f7c569482966fe0a0bf58b151ad7fe08b9 Mon Sep 17 00:00:00 2001 From: Abhijnan Bajpai Date: Fri, 28 Oct 2022 13:59:47 +0530 Subject: [PATCH 2/4] Fixed formatting according to flake8 --- lib/matplotlib/backends/backend_ps.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/backends/backend_ps.py b/lib/matplotlib/backends/backend_ps.py index e8e82ecdfe54..433add570b28 100644 --- a/lib/matplotlib/backends/backend_ps.py +++ b/lib/matplotlib/backends/backend_ps.py @@ -635,7 +635,8 @@ def draw_text(self, gc, x, y, s, prop, angle, ismath=False, mtext=None): if mpl.rcParams['ps.useafm']: font = self._get_font_afm(prop) - ps_name = (font.postscript_name.encode("ascii", "replace").decode("ascii")) + ps_name = (font.postscript_name.encode("ascii", "replace") + .decode("ascii")) scale = 0.001 * prop.get_size_in_points() thisx = 0 last_name = None # kerns returns 0 for None. @@ -663,7 +664,8 @@ def draw_text(self, gc, x, y, s, prop, angle, ismath=False, mtext=None): stream.append((ps_name, item.x, glyph_name)) self.set_color(*gc.get_rgb()) - for ps_name, group in itertools.groupby(stream, lambda entry: entry[0]): + 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 group) From 6ec4aae900e4c4fe7a9687d31409671a416e9492 Mon Sep 17 00:00:00 2001 From: Abhijnan Bajpai Date: Fri, 28 Oct 2022 16:55:17 +0530 Subject: [PATCH 3/4] Fixing a stream append --- lib/matplotlib/backends/backend_ps.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/backends/backend_ps.py b/lib/matplotlib/backends/backend_ps.py index 433add570b28..5510ed015e80 100644 --- a/lib/matplotlib/backends/backend_ps.py +++ b/lib/matplotlib/backends/backend_ps.py @@ -651,8 +651,9 @@ def draw_text(self, gc, x, y, s, prop, angle, ismath=False, mtext=None): kern = font.get_kern_dist_from_name(last_name, name) last_name = name thisx += kern * scale - xs_names.append((ps_name, thisx, name)) + xs_names.append((thisx, name)) thisx += width * scale + stream.append((ps_name, xs_names)) else: font = self._get_font_ttf(prop) From 022d51b90b0ffce6f62666412d510a38176403c4 Mon Sep 17 00:00:00 2001 From: Abhijnan Bajpai Date: Fri, 28 Oct 2022 17:29:27 +0530 Subject: [PATCH 4/4] Removing redundant xs_names --- lib/matplotlib/backends/backend_ps.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/matplotlib/backends/backend_ps.py b/lib/matplotlib/backends/backend_ps.py index 5510ed015e80..d2473a209d17 100644 --- a/lib/matplotlib/backends/backend_ps.py +++ b/lib/matplotlib/backends/backend_ps.py @@ -640,7 +640,6 @@ def draw_text(self, gc, x, y, s, prop, angle, ismath=False, mtext=None): scale = 0.001 * prop.get_size_in_points() thisx = 0 last_name = None # kerns returns 0 for None. - xs_names = [] for c in s: name = uni2type1.get(ord(c), f"uni{ord(c):04X}") try: @@ -651,9 +650,8 @@ def draw_text(self, gc, x, y, s, prop, angle, ismath=False, mtext=None): kern = font.get_kern_dist_from_name(last_name, name) last_name = name thisx += kern * scale - xs_names.append((thisx, name)) + stream.append((ps_name, thisx, name)) thisx += width * scale - stream.append((ps_name, xs_names)) else: font = self._get_font_ttf(prop)