From 77266efdd0887f5929ba031dcfd3a6e6ea556637 Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Mon, 21 May 2018 13:47:46 -0400 Subject: [PATCH] Fix font encoding issue in a better way. matplotlib/matplotlib#11277 --- matplotlib/patches/font_name_encoding.patch | 104 ++++++++++++++++---- 1 file changed, 83 insertions(+), 21 deletions(-) diff --git a/matplotlib/patches/font_name_encoding.patch b/matplotlib/patches/font_name_encoding.patch index db117b47d..ec4f84d76 100644 --- a/matplotlib/patches/font_name_encoding.patch +++ b/matplotlib/patches/font_name_encoding.patch @@ -1,23 +1,85 @@ -diff -ur matplotlib-2.2.2/lib/matplotlib/font_manager.py matplotlib-2.2.2/lib/matplotlib/font_manager.py ---- a/lib/matplotlib/font_manager.py 2018-03-17 14:03:23.000000000 -0400 -+++ b/lib/matplotlib/font_manager.py 2018-05-16 16:56:49.399466649 -0400 -@@ -416,11 +419,17 @@ - sfnt2 = sfnt.get((1,0,0,2)) - sfnt4 = sfnt.get((1,0,0,4)) - if sfnt2: +diff --git a/lib/matplotlib/backends/backend_pdf.py b/lib/matplotlib/backends/backend_pdf.py +index 4f248fde9..0fc17ea37 100644 +--- a/lib/matplotlib/backends/backend_pdf.py ++++ b/lib/matplotlib/backends/backend_pdf.py +@@ -1135,15 +1135,7 @@ end""" + + # Beginning of main embedTTF function... + +- # You are lost in a maze of TrueType tables, all different... +- sfnt = font.get_sfnt() +- try: +- ps_name = sfnt[1, 0, 0, 6].decode('mac_roman') # Macintosh scheme +- except KeyError: +- # Microsoft scheme: +- ps_name = sfnt[3, 1, 0x0409, 6].decode('utf-16be') +- # (see freetype/ttnameid.h) +- ps_name = ps_name.encode('ascii', 'replace') ++ ps_name = font.postscript_name.encode('ascii', 'replace') + ps_name = Name(ps_name) + pclt = font.get_sfnt_table('pclt') or {'capHeight': 0, 'xHeight': 0} + post = font.get_sfnt_table('post') or {'italicAngle': (0, 0)} +diff --git a/lib/matplotlib/backends/backend_ps.py b/lib/matplotlib/backends/backend_ps.py +index 1aeee39a2..3d44b6f7f 100644 +--- a/lib/matplotlib/backends/backend_ps.py ++++ b/lib/matplotlib/backends/backend_ps.py +@@ -714,12 +714,8 @@ grestore + self.track_characters(font, s) + + self.set_color(*gc.get_rgb()) +- sfnt = font.get_sfnt() +- try: +- ps_name = sfnt[1, 0, 0, 6].decode('mac_roman') +- except KeyError: +- ps_name = sfnt[3, 1, 0x0409, 6].decode('utf-16be') +- ps_name = ps_name.encode('ascii', 'replace').decode('ascii') ++ ps_name = (font.postscript_name ++ .encode('ascii', 'replace').decode('ascii')) + self.set_font(ps_name, prop.get_size_in_points()) + + lastgind = None +diff --git a/lib/matplotlib/font_manager.py b/lib/matplotlib/font_manager.py +index cdc82edbf..2ea6efc2d 100644 +--- a/lib/matplotlib/font_manager.py ++++ b/lib/matplotlib/font_manager.py +@@ -413,16 +413,11 @@ def ttfFontProperty(font): + # Styles are: italic, oblique, and normal (default) + + sfnt = font.get_sfnt() +- sfnt2 = sfnt.get((1,0,0,2)) +- sfnt4 = sfnt.get((1,0,0,4)) +- if sfnt2: - sfnt2 = sfnt2.decode('mac_roman').lower() -+ try: -+ sfnt2 = sfnt2.decode('mac_roman').lower() -+ except LookupError: -+ sfnt2 = sfnt2.decode('latin1').lower() - else: - sfnt2 = '' - if sfnt4: +- else: +- sfnt2 = '' +- if sfnt4: - sfnt4 = sfnt4.decode('mac_roman').lower() -+ try: -+ sfnt4 = sfnt4.decode('mac_roman').lower() -+ except LookupError: -+ sfnt4 = sfnt4.decode('latin1').lower() - else: - sfnt4 = '' - if sfnt4.find('oblique') >= 0: \ No newline at end of file +- else: +- sfnt4 = '' ++ # These tables are actually mac_roman-encoded, but mac_roman support may be ++ # missing in some alternative Python implementations and we are only going ++ # to look for ASCII substrings, where any ASCII-compatible encoding works. ++ sfnt2 = sfnt.get((1, 0, 0, 2), b'').decode('latin-1').lower() ++ sfnt4 = sfnt.get((1, 0, 0, 4), b'').decode('latin-1').lower() + if sfnt4.find('oblique') >= 0: + style = 'oblique' + elif sfnt4.find('italic') >= 0: +diff --git a/lib/matplotlib/textpath.py b/lib/matplotlib/textpath.py +index 5ee356774..89fcfb79c 100644 +--- a/lib/matplotlib/textpath.py ++++ b/lib/matplotlib/textpath.py +@@ -68,13 +68,7 @@ class TextToPath(object): + """ + Return a unique id for the given font and character-code set. + """ +- sfnt = font.get_sfnt() +- try: +- ps_name = sfnt[1, 0, 0, 6].decode('mac_roman') +- except KeyError: +- ps_name = sfnt[3, 1, 0x0409, 6].decode('utf-16be') +- char_id = urllib_quote('%s-%x' % (ps_name, ccode)) +- return char_id ++ return urllib_quote('%s-%x' % (font.postscript_name, ccode)) + + def _get_char_id_ps(self, font, ccode): + """