From 76d8b3cfdd9247834f25f4c2aacd7f6dc863e5b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Sepp=C3=A4nen?= Date: Thu, 22 Jul 2021 16:26:04 +0300 Subject: [PATCH 1/6] Type-1 subsetting This reduces pdf file sizes when usetex is active, at the cost of some complexity in the code. We implement a charstring bytecode interpreter to keep track of subroutine calls in font programs. Give dviread.DviFont a fake filename attribute and a get_fontmap method for character tracking. In backend_pdf.py, refactor _get_subsetted_psname so it calls a method _get_subset_prefix, and reuse that to create tags for Type-1 fonts. Mark the methods static since they don't use anything from the instance. Recommend merging to main to give people time to test this, not to a 3.10 point release. Closes #127. Co-Authored-By: Elliott Sales de Andrade --- doc/users/next_whats_new/type1_subset.rst | 9 + lib/matplotlib/_type1font.py | 345 +++++++++++++++++- lib/matplotlib/backends/backend_pdf.py | 84 +++-- lib/matplotlib/dviread.py | 23 +- lib/matplotlib/dviread.pyi | 2 + .../font-bitstream-charter.pdf | Bin 0 -> 12990 bytes .../test_backend_pdf/font-dejavusans.pdf | Bin 0 -> 33413 bytes .../test_backend_pdf/font-heuristica.pdf | Bin 0 -> 56185 bytes lib/matplotlib/tests/test_backend_pdf.py | 52 ++- lib/matplotlib/tests/test_usetex.py | 64 ++++ 10 files changed, 536 insertions(+), 43 deletions(-) create mode 100644 doc/users/next_whats_new/type1_subset.rst create mode 100644 lib/matplotlib/tests/baseline_images/test_backend_pdf/font-bitstream-charter.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_backend_pdf/font-dejavusans.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_backend_pdf/font-heuristica.pdf diff --git a/doc/users/next_whats_new/type1_subset.rst b/doc/users/next_whats_new/type1_subset.rst new file mode 100644 index 000000000000..b0ab0a4337e6 --- /dev/null +++ b/doc/users/next_whats_new/type1_subset.rst @@ -0,0 +1,9 @@ +PDF files created with usetex now embed subsets of Type 1 fonts +--------------------------------------------------------------- + +When using the PDF backend with the usetex feature, +Matplotlib calls TeX to render the text and formulas in the figure. +The fonts that get used are usually "Type 1" fonts. +They used to be embedded in full +but are now limited to the glyphs that are actually used in the figure. +This reduces the size of the resulting PDF files. diff --git a/lib/matplotlib/_type1font.py b/lib/matplotlib/_type1font.py index 032b6a42ea63..e6b9148663ef 100644 --- a/lib/matplotlib/_type1font.py +++ b/lib/matplotlib/_type1font.py @@ -3,7 +3,7 @@ This version reads pfa and pfb files and splits them for embedding in pdf files. It also supports SlantFont and ExtendFont transformations, -similarly to pdfTeX and friends. There is no support yet for subsetting. +similarly to pdfTeX and friends. Usage:: @@ -11,6 +11,7 @@ clear_part, encrypted_part, finale = font.parts slanted_font = font.transform({'slant': 0.167}) extended_font = font.transform({'extend': 1.2}) + subset_font = font.subset([ord(c) for c in 'Hello World']) Sources: @@ -25,6 +26,7 @@ import binascii import functools +import itertools import logging import re import string @@ -637,8 +639,7 @@ def _parse_subrs(self, tokens, _data): return array, next(tokens).endpos() - @staticmethod - def _parse_charstrings(tokens, _data): + def _parse_charstrings(self, tokens, _data): count_token = next(tokens) if not count_token.is_number(): raise RuntimeError( @@ -660,7 +661,12 @@ def _parse_charstrings(tokens, _data): f"Token following /{glyphname} in CharStrings definition " f"must be a number, was {nbytes_token}" ) - next(tokens) # usually RD or |- + token = next(tokens) + if not token.is_keyword(self._abbr['RD']): + raise RuntimeError( + f"Token preceding charstring must be {self._abbr['RD']}, " + f"was {token}" + ) binary_token = tokens.send(1+nbytes_token.value()) charstrings[glyphname] = binary_token.value() @@ -691,8 +697,7 @@ def _parse_encoding(tokens, _data): continue encoding[index_token.value()] = name_token.value() - @staticmethod - def _parse_othersubrs(tokens, data): + def _parse_othersubrs(self, tokens, data): init_pos = None while True: token = next(tokens) @@ -700,7 +705,7 @@ def _parse_othersubrs(tokens, data): init_pos = token.pos if token.is_delim(): _expression(token, tokens, data) - elif token.is_keyword('def', 'ND', '|-'): + elif token.is_keyword('def', self._abbr['ND']): return data[init_pos:token.endpos()], token.endpos() def transform(self, effects): @@ -755,7 +760,7 @@ def transform(self, effects): fontmatrix = ( f"[{' '.join(_format_approx(x, 6) for x in array)}]" ) - replacements = ( + newparts = self._replace( [(x, f'/FontName/{fontname} def') for x in self._pos['FontName']] + [(x, f'/ItalicAngle {italicangle} def') @@ -765,11 +770,63 @@ def transform(self, effects): + [(x, '') for x in self._pos.get('UniqueID', [])] ) + return Type1Font(( + newparts[0], + self._encrypt(newparts[1], 'eexec'), + self.parts[2] + )) + + def with_encoding(self, encoding): + """ + Change the encoding of the font. + + Parameters + ---------- + encoding : dict + A dictionary mapping character codes to glyph names. + + Returns + ------- + `Type1Font` + """ + newparts = self._replace( + [(x, '') for x in self._pos.get('UniqueID', [])] + + [(self._pos['Encoding'][0], self._postscript_encoding(encoding))] + ) + return Type1Font(( + newparts[0], + self._encrypt(newparts[1], 'eexec'), + self.parts[2] + )) + + def _replace(self, replacements): + """ + Change the font according to `replacements` + + Parameters + ---------- + replacements : list of ((int, int), str) + Each element is ((pos0, pos1), replacement) where pos0 and + pos1 are indices to the original font data (parts[0] and the + decrypted part concatenated). The data in the interval + pos0:pos1 will be replaced by the replacement text. To + accommodate binary data, the replacement is taken to be in + Latin-1 encoding. + + The case where pos0 is inside parts[0] and pos1 inside + the decrypted part is not supported. + + Returns + ------- + (bytes, bytes) + The new parts[0] and decrypted part (which needs to be + encrypted in the transformed font). + """ data = bytearray(self.parts[0]) data.extend(self.decrypted) len0 = len(self.parts[0]) for (pos0, pos1), value in sorted(replacements, reverse=True): - data[pos0:pos1] = value.encode('ascii', 'replace') + data[pos0:pos1] = value.encode('latin-1') if pos0 < len(self.parts[0]): if pos1 >= len(self.parts[0]): raise RuntimeError( @@ -778,13 +835,275 @@ def transform(self, effects): ) len0 += len(value) - pos1 + pos0 - data = bytes(data) - return Type1Font(( - data[:len0], - self._encrypt(data[len0:], 'eexec'), + return bytes(data[:len0]), bytes(data[len0:]) + + def subset(self, characters, name_prefix): + """ + Return a new font that only defines the given characters. + + Parameters + ---------- + characters : sequence of bytes + The subset of characters to include. These are indices into the + font's encoding array. The encoding array of a Type-1 font can + only include 256 characters, but other glyphs may be accessed + via the seac operator. + name_prefix : str + Prefix to prepend to the font name. + + Returns + ------- + `Type1Font` + """ + characters = frozenset(characters) + if _log.isEnabledFor(logging.DEBUG): + _log.debug( + "Subsetting font %s to characters %s = %s", + self.prop['FontName'], + sorted(characters), + [self.prop['Encoding'].get(code) for code in sorted(characters)], + ) + encoding = {code: glyph + for code, glyph in self.prop['Encoding'].items() + if code in characters} + encoding[0] = '.notdef' + # todo and done include strings (glyph names) + todo = set(encoding.values()) + done = set() + seen_subrs = {0, 1, 2, 3} + while todo: + glyph = todo.pop() + called_glyphs, called_subrs = _CharstringSimulator(self).run(glyph) + todo.update(called_glyphs - done) + seen_subrs.update(called_subrs) + done.add(glyph) + + charstrings = self._subset_charstrings(done) + subrs = self._subset_subrs(seen_subrs) + newparts = self._replace( + [(x, f'/FontName /{name_prefix}{self.prop["FontName"]} def') + for x in self._pos['FontName']] + + [(self._pos['CharStrings'][0], charstrings), + (self._pos['Subrs'][0], subrs), + (self._pos['Encoding'][0], self._postscript_encoding(encoding)) + ] + [(x, '') for x in self._pos.get('UniqueID', [])] + ) + return type(self)(( + newparts[0], + self._encrypt(newparts[1], 'eexec'), self.parts[2] )) + @staticmethod + def _charstring_tokens(data): + """Parse a Type-1 charstring + + Yield opcode names and integer parameters. + """ + data = iter(data) + for byte in data: + if 32 <= byte <= 246: + yield byte - 139 + elif 247 <= byte <= 250: + byte2 = next(data) + yield (byte-247) * 256 + byte2 + 108 + elif 251 <= byte <= 254: + byte2 = next(data) + yield -(byte-251)*256 - byte2 - 108 + elif byte == 255: + bs = bytes(itertools.islice(data, 4)) + yield struct.unpack('>i', bs)[0] + elif byte == 12: + byte1 = next(data) + yield { + 0: 'dotsection', + 1: 'vstem3', + 2: 'hstem3', + 6: 'seac', + 7: 'sbw', + 12: 'div', + 16: 'callothersubr', + 17: 'pop', + 33: 'setcurrentpoint' + }[byte1] + else: + yield { + 1: 'hstem', + 3: 'vstem', + 4: 'vmoveto', + 5: 'rlineto', + 6: 'hlineto', + 7: 'vlineto', + 8: 'rrcurveto', + 9: 'closepath', + 10: 'callsubr', + 11: 'return', + 13: 'hsbw', + 14: 'endchar', + 21: 'rmoveto', + 22: 'hmoveto', + 30: 'vhcurveto', + 31: 'hvcurveto' + }[byte] + + def _postscript_encoding(self, encoding): + """Return a PostScript encoding array for the encoding.""" + return '\n'.join([ + '/Encoding 256 array\n0 1 255 { 1 index exch /.notdef put} for', + *( + f'dup {i} /{glyph} put' + for i, glyph in sorted(encoding.items()) + if glyph != '.notdef' + ), + 'readonly def\n', + ]) + + def _subset_charstrings(self, glyphs): + """Return a PostScript CharStrings array for the glyphs.""" + charstrings = self.prop['CharStrings'] + lenIV = self.prop.get('lenIV', 4) + ordered = sorted(glyphs) + encrypted = [ + self._encrypt(charstrings[glyph], 'charstring', lenIV).decode('latin-1') + for glyph in ordered + ] + RD, ND = self._abbr['RD'], self._abbr['ND'] + return '\n'.join([ + f'/CharStrings {len(ordered)} dict dup begin', + *( + f'/{glyph} {len(enc)} {RD} {enc} {ND}' + for glyph, enc in zip(ordered, encrypted) + ), + 'end\n', + ]) + + def _subset_subrs(self, indices): + """Return a PostScript Subrs array for the subroutines.""" + # we can't remove subroutines, we just replace unused ones with a stub + subrs = self.prop['Subrs'] + n_subrs = len(subrs) + lenIV = self.prop.get('lenIV', 4) + stub = self._encrypt(b'\x0b', 'charstring', lenIV).decode('latin-1') + encrypted = [ + self._encrypt(subrs[i], 'charstring', lenIV).decode('latin-1') + if i in indices + else stub + for i in range(n_subrs) + ] + RD, ND, NP = self._abbr['RD'], self._abbr['ND'], self._abbr['NP'] + return '\n'.join([ + f'/Subrs {n_subrs} array', + *( + f'dup {i} {len(enc)} {RD} {enc} {NP}' + for i, enc in enumerate(encrypted) + ), + ]) + + +class _CharstringSimulator: + __slots__ = ('font', 'buildchar_stack', 'postscript_stack', 'glyphs', 'subrs') + + def __init__(self, font): + self.font = font + self.buildchar_stack = [] + self.postscript_stack = [] + self.glyphs = set() + self.subrs = set() + + def run(self, glyph_or_subr): + """Run the charstring interpreter on a glyph or subroutine. + + This does not actually execute the code but simulates it to find out + which subroutines get called when executing the glyph or subroutine. + + Parameters + ---------- + glyph_or_subr : str or int + The name of the glyph or the index of the subroutine to simulate. + + Returns + ------- + glyphs : set[str] + The set of glyph names called by the glyph or subroutine. + subrs : set[int] + The set of subroutines called by the glyph or subroutine. + """ + if isinstance(glyph_or_subr, str): + program = self.font.prop['CharStrings'][glyph_or_subr] + self.glyphs.add(glyph_or_subr) + else: + program = self.font.prop['Subrs'][glyph_or_subr] + self.subrs.add(glyph_or_subr) + for opcode in self.font._charstring_tokens(program): + if opcode in ('return', 'endchar'): + return self.glyphs, self.subrs + self._step(opcode) + else: + font_name = self.font.prop.get('FontName', '(unknown)') + _log.info( + f"Glyph or subr {glyph_or_subr} in font {font_name} does not end " + "with return or endchar" + ) + return self.glyphs, self.subrs + + def _step(self, opcode): + """Run one step in the charstring interpreter.""" + match opcode: + case _ if isinstance(opcode, int): + self.buildchar_stack.append(opcode) + case ( + 'hsbw' | 'sbw' | 'closepath' | 'hlineto' | 'hmoveto' | 'hcurveto' | + 'hvcurveto' | 'rlineto' | 'rmoveto' | 'rrcurveto' | 'vhcurveto' | + 'vlineto' | 'vmoveto' | 'dotsection' | 'hstem' | 'hstem3' | + 'vstem' | 'vstem3' | 'setcurrentpoint' + ): + self.buildchar_stack.clear() + case 'seac': # Standard Encoding Accented Character + codes = self.buildchar_stack[3:5] + self.glyphs.update(_StandardEncoding[int(x)] for x in codes) + self.buildchar_stack.clear() + case 'div': + num1, num2 = self.buildchar_stack[-2:] + if num2 == 0: + _log.warning( + f"Division by zero in font {self.font.prop['FontName']}" + ) + self.buildchar_stack[-2:] = [0] + else: + self.buildchar_stack[-2:] = [num1/num2] + case 'callothersubr': + n, othersubr = self.buildchar_stack[-2:] + if not isinstance(n, int): + _log.warning( + f"callothersubr {othersubr} with non-integer argument " + f"count in font {self.font.prop['FontName']}" + ) + n = int(n) + args = self.buildchar_stack[-2-n:-2] + if othersubr == 3: + self.postscript_stack.append(args[0]) + else: + self.postscript_stack.extend(args[::-1]) + self.buildchar_stack[-2-n:] = [] + case 'callsubr': + subr = self.buildchar_stack.pop() + if not isinstance(subr, int): + _log.warning( + f"callsubr with non-integer argument {subr} in font " + f"{self.font.prop['FontName']}" + ) + subr = int(subr) + self.run(subr) + case 'pop': + if not self.postscript_stack: + _log.warning( + f"pop with empty stack in font {self.font.prop['FontName']}" + ) + self.postscript_stack.append(0) + self.buildchar_stack.append(self.postscript_stack.pop()) + case _: + raise RuntimeError(f'opcode {opcode}') + _StandardEncoding = { **{ord(letter): letter for letter in string.ascii_letters}, diff --git a/lib/matplotlib/backends/backend_pdf.py b/lib/matplotlib/backends/backend_pdf.py index 073ca05bc172..f61be9b51e8c 100644 --- a/lib/matplotlib/backends/backend_pdf.py +++ b/lib/matplotlib/backends/backend_pdf.py @@ -808,7 +808,14 @@ def newTextnote(self, text, positionRect=[-100, -100, 0, 0]): } self.pageAnnotations.append(theNote) - def _get_subsetted_psname(self, ps_name, charmap): + @staticmethod + def _get_subset_prefix(charset): + """ + Get a prefix for a subsetted font name. + + The prefix is six uppercase letters followed by a plus sign; + see PDF reference section 5.5.3 Font Subsets. + """ def toStr(n, base): if n < base: return string.ascii_uppercase[n] @@ -818,11 +825,15 @@ def toStr(n, base): ) # encode to string using base 26 - hashed = hash(frozenset(charmap.keys())) % ((sys.maxsize + 1) * 2) + hashed = hash(charset) % ((sys.maxsize + 1) * 2) prefix = toStr(hashed, 26) # get first 6 characters from prefix - return prefix[:6] + "+" + ps_name + return prefix[:6] + "+" + + @staticmethod + def _get_subsetted_psname(ps_name, charmap): + return PdfFile._get_subset_prefix(frozenset(charmap.keys())) + ps_name def finalize(self): """Write out the various deferred objects and the pdf end matter.""" @@ -994,39 +1005,29 @@ def _embedTeXFont(self, fontinfo): _log.debug('Embedding TeX font %s - fontinfo=%s', fontinfo.dvifont.texname, fontinfo.__dict__) - # Widths - widthsObject = self.reserveObject('font widths') - tfm = fontinfo.dvifont._tfm - # convert from TeX's 12.20 representation to 1/1000 text space units. - widths = [(1000 * metrics.tex_width) >> 20 - if (metrics := tfm.get_metrics(char)) else 0 - for char in range(max(tfm._glyph_metrics, default=-1) + 1)] - self.writeObject(widthsObject, widths) - # Font dictionary fontdictObject = self.reserveObject('font dictionary') fontdict = { 'Type': Name('Font'), 'Subtype': Name('Type1'), - 'FirstChar': 0, - 'LastChar': len(widths) - 1, - 'Widths': widthsObject, - } - - # Encoding (if needed) - if fontinfo.encodingfile is not None: - fontdict['Encoding'] = { - 'Type': Name('Encoding'), - 'Differences': [ - 0, *map(Name, dviread._parse_enc(fontinfo.encodingfile))], - } + } # We have a font file to embed - read it in and apply any effects t1font = _type1font.Type1Font(fontinfo.fontfile) + if fontinfo.encodingfile is not None: + t1font = t1font.with_encoding( + {i: c for i, c in enumerate(dviread._parse_enc(fontinfo.encodingfile))} + ) + if fontinfo.effects: t1font = t1font.transform(fontinfo.effects) + chars = frozenset(self._character_tracker.used[fontinfo.dvifont.fname]) + t1font = t1font.subset(chars, self._get_subset_prefix(chars)) fontdict['BaseFont'] = Name(t1font.prop['FontName']) - + encoding = t1font.prop['Encoding'] + fc = fontdict['FirstChar'] = min(encoding.keys(), default=0) + lc = fontdict['LastChar'] = max(encoding.keys(), default=255) + fontdict['Encoding'] = self._generate_encoding(encoding) # Font descriptors may be shared between differently encoded # Type-1 fonts, so only create a new descriptor if there is no # existing descriptor for this font. @@ -1038,9 +1039,32 @@ def _embedTeXFont(self, fontinfo): self._type1Descriptors[(fontinfo.fontfile, effects)] = fontdesc fontdict['FontDescriptor'] = fontdesc + # Use TeX Font Metrics file to get glyph widths (TeX uses its 12.20 fixed point + # representation and we want 1/1000 text space units) + tfm = fontinfo.dvifont._tfm + widths = [(1000 * metrics.tex_width) >> 20 + if (metrics := tfm.get_metrics(char)) else 0 + for char in range(fc, lc + 1)] + fontdict['Widths'] = widthsObject = self.reserveObject('glyph widths') + self.writeObject(widthsObject, widths) self.writeObject(fontdictObject, fontdict) return fontdictObject + + def _generate_encoding(self, encoding): + prev = -2 + result = [] + for code, name in sorted(encoding.items()): + if code != prev + 1: + result.append(code) + prev = code + result.append(Name(name)) + return { + 'Type': Name('Encoding'), + 'Differences': result + } + + @_api.delete_parameter("3.11", "fontfile") def createType1Descriptor(self, t1font, fontfile=None): # Create and write the font descriptor and the font file @@ -1077,6 +1101,14 @@ def createType1Descriptor(self, t1font, fontfile=None): if 0: flags |= 1 << 18 + encoding = t1font.prop['Encoding'] + charset = ''.join( + sorted( + f'/{c}' for c in encoding.values() + if c != '.notdef' + ) + ) + descriptor = { 'Type': Name('FontDescriptor'), 'FontName': Name(t1font.prop['FontName']), @@ -1090,6 +1122,7 @@ def createType1Descriptor(self, t1font, fontfile=None): 'FontFile': fontfileObject, 'FontFamily': t1font.prop['FamilyName'], 'StemV': 50, # TODO + 'CharSet': charset, # (see also revision 3874; but not all TeX distros have AFM files!) # 'FontWeight': a number where 400 = Regular, 700 = Bold } @@ -2267,6 +2300,7 @@ def draw_tex(self, gc, x, y, s, prop, angle, *, mtext=None): seq += [['font', pdfname, dvifont.size]] oldfont = dvifont seq += [['text', x1, y1, [bytes([glyph])], x1+width]] + self.file._character_tracker.track(dvifont, chr(glyph)) # Find consecutive text strings with constant y coordinate and # combine into a sequence of strings and kerns, or just one diff --git a/lib/matplotlib/dviread.py b/lib/matplotlib/dviread.py index a588979f5fad..9e8b6a5facf5 100644 --- a/lib/matplotlib/dviread.py +++ b/lib/matplotlib/dviread.py @@ -17,17 +17,17 @@ ... """ -from collections import namedtuple import dataclasses import enum -from functools import cache, lru_cache, partial, wraps import logging import os -from pathlib import Path import re import struct import subprocess import sys +from collections import namedtuple +from functools import cache, lru_cache, partial, wraps +from pathlib import Path import numpy as np @@ -583,6 +583,9 @@ class DviFont: Attributes ---------- texname : bytes + fname : str + Compatibility shim so that DviFont can be used with + ``_backend_pdf_ps.CharacterTracker``; not a real filename. size : float Size of the font in Adobe points, converted from the slightly smaller TeX points. @@ -602,6 +605,18 @@ def __init__(self, scale, tfm, texname, vf): (1000 * self._tfm.width.get(char, 0)) >> 20 for char in range(max(self._tfm.width, default=-1) + 1)])) + @property + def fname(self): + """A fake filename""" + return self.texname.decode('latin-1') + + def _get_fontmap(self, string): + """Get the mapping from characters to the font that includes them. + + Each value maps to self; there is no fallback mechanism for DviFont. + """ + return {char: self for char in string} + def __eq__(self, other): return (type(self) is type(other) and self.texname == other.texname and self.size == other.size) @@ -1161,8 +1176,8 @@ def _fontfile(cls, suffix, texname): if __name__ == '__main__': - from argparse import ArgumentParser import itertools + from argparse import ArgumentParser import fontTools.agl diff --git a/lib/matplotlib/dviread.pyi b/lib/matplotlib/dviread.pyi index 41799c083218..12a9215b5308 100644 --- a/lib/matplotlib/dviread.pyi +++ b/lib/matplotlib/dviread.pyi @@ -66,6 +66,8 @@ class DviFont: def __ne__(self, other: object) -> bool: ... @property def widths(self) -> list[int]: ... + @property + def fname(self) -> str: ... class Vf(Dvi): def __init__(self, filename: str | os.PathLike) -> None: ... diff --git a/lib/matplotlib/tests/baseline_images/test_backend_pdf/font-bitstream-charter.pdf b/lib/matplotlib/tests/baseline_images/test_backend_pdf/font-bitstream-charter.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c8f9411fb3d9256e278e458f49cf0949f48714aa GIT binary patch literal 12990 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 Y=E2?pVC>(+1Z)J*;3+6X<;76{58ap6h5!Hn literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_backend_pdf/font-dejavusans.pdf b/lib/matplotlib/tests/baseline_images/test_backend_pdf/font-dejavusans.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fd907dee6687a4fb28076f05a417096fd8a1fa30 GIT binary patch literal 33413 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_backend_pdf/font-heuristica.pdf b/lib/matplotlib/tests/baseline_images/test_backend_pdf/font-heuristica.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ca9b38d09b894232f1d1fe040974ac6b73169595 GIT binary patch literal 56185 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 AHUIzs literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/test_backend_pdf.py b/lib/matplotlib/tests/test_backend_pdf.py index dc349e8dfa35..f126fb543e78 100644 --- a/lib/matplotlib/tests/test_backend_pdf.py +++ b/lib/matplotlib/tests/test_backend_pdf.py @@ -16,7 +16,7 @@ from matplotlib.backends._backend_pdf_ps import get_glyphs_subset, font_as_file from matplotlib.backends.backend_pdf import PdfPages from matplotlib.patches import Rectangle -from matplotlib.testing import _gen_multi_font_text +from matplotlib.testing import _gen_multi_font_text, _has_tex_package from matplotlib.testing.decorators import check_figures_equal, image_comparison from matplotlib.testing._markers import needs_usetex @@ -428,3 +428,53 @@ def test_truetype_conversion(recwarn): font=Path(__file__).parent / "data/mpltest.ttf", fontsize=80) ax.set_xticks([]) ax.set_yticks([]) + + +@pytest.mark.skipif(not _has_tex_package("heuristica"), + reason="LaTeX lacks heuristica package") +@image_comparison(["font-heuristica.pdf"]) +def test_font_heuristica(): + # Heuristica uses the callothersubr operator for some glyphs + mpl.rcParams['text.latex.preamble'] = '\n'.join(( + r'\usepackage{heuristica}', + r'\usepackage[T1]{fontenc}', + r'\usepackage[utf8]{inputenc}' + )) + fig, ax = plt.subplots() + ax.text(0.1, 0.1, r"BHTem fi ffl 1234", usetex=True, fontsize=50) + ax.set_xticks([]) + ax.set_yticks([]) + + +@pytest.mark.skipif(not _has_tex_package("DejaVuSans"), + reason="LaTeX lacks DejaVuSans package") +@image_comparison(["font-dejavusans.pdf"]) +def test_font_dejavusans(): + # DejaVuSans uses the seac operator to compose characters with diacritics + mpl.rcParams['text.latex.preamble'] = '\n'.join(( + r'\usepackage{DejaVuSans}', + r'\usepackage[T1]{fontenc}', + r'\usepackage[utf8]{inputenc}' + )) + + fig, ax = plt.subplots() + ax.text(0.1, 0.1, r"\textsf{ñäö ABCDabcd}", usetex=True, fontsize=50) + ax.text(0.1, 0.3, r"\textsf{fi ffl 1234}", usetex=True, fontsize=50) + ax.set_xticks([]) + ax.set_yticks([]) + + +@pytest.mark.skipif(not _has_tex_package("charter"), + reason="LaTeX lacks charter package") +@image_comparison(["font-bitstream-charter.pdf"]) +def test_font_bitstream_charter(): + mpl.rcParams['text.latex.preamble'] = '\n'.join(( + r'\usepackage{charter}', + r'\usepackage[T1]{fontenc}', + r'\usepackage[utf8]{inputenc}' + )) + fig, ax = plt.subplots() + ax.text(0.1, 0.1, r"åüš ABCDabcd", usetex=True, fontsize=50) + ax.text(0.1, 0.3, r"fi ffl 1234", usetex=True, fontsize=50) + ax.set_xticks([]) + ax.set_yticks([]) diff --git a/lib/matplotlib/tests/test_usetex.py b/lib/matplotlib/tests/test_usetex.py index 0b6d6d5e5535..e76b9d28297f 100644 --- a/lib/matplotlib/tests/test_usetex.py +++ b/lib/matplotlib/tests/test_usetex.py @@ -1,3 +1,4 @@ +import re from tempfile import TemporaryFile import numpy as np @@ -156,6 +157,69 @@ def test_missing_psfont(fmt, monkeypatch): fig.savefig(tmpfile, format=fmt) +def test_pdf_type1_font_subsetting(): + """Test that fonts in PDF output are properly subsetted""" + pikepdf = pytest.importorskip("pikepdf") + + mpl.rcParams["text.usetex"] = True + mpl.rcParams["text.latex.preamble"] = r"\usepackage{amssymb}" + fig, ax = plt.subplots() + ax.text(0.2, 0.7, r"$\int_{-\infty}^{\aleph}\sqrt{\alpha\beta\gamma}\mathrm{d}x$") + ax.text(0.2, 0.5, r"$\mathfrak{x}\circledcirc\mathfrak{y}\in\mathbb{R}$") + + with TemporaryFile() as tmpfile: + fig.savefig(tmpfile, format="pdf") + tmpfile.seek(0) + pdf = pikepdf.Pdf.open(tmpfile) + + length = {} + page = pdf.pages[0] + for font_name, font in page.Resources.Font.items(): + assert font.Subtype == "/Type1", ( + f"Font {font_name}={font} is not a Type 1 font" + ) + + # Subsetted font names have a 6-character tag followed by a '+' + base_font = str(font["/BaseFont"]).removeprefix("/") + assert re.match(r"^[A-Z]{6}\+", base_font), ( + f"Font {font_name}={base_font} lacks a subset indicator tag" + ) + assert "/FontFile" in font.FontDescriptor, ( + f"Type 1 font {font_name}={base_font} is not embedded" + ) + _, original_name = base_font.split("+", 1) + length[original_name] = len(bytes(font["/FontDescriptor"]["/FontFile"])) + + print("Embedded font stream lengths:", length) + # We should have several fonts, each much smaller than the original. + # I get under 10kB on my system for each font, but allow 15kB in case + # of differences in the font files. + assert { + 'CMEX10', + 'CMMI12', + 'CMR12', + 'CMSY10', + 'CMSY8', + 'EUFM10', + 'MSAM10', + 'MSBM10', + }.issubset(length), "Missing expected fonts in the PDF" + for font_name, length in length.items(): + assert length < 15_000, ( + f"Font {font_name}={length} is larger than expected" + ) + + # For comparison, lengths without subsetting on my system: + # 'CMEX10': 29686 + # 'CMMI12': 36176 + # 'CMR12': 32157 + # 'CMSY10': 32004 + # 'CMSY8': 32061 + # 'EUFM10': 20546 + # 'MSAM10': 31199 + # 'MSBM10': 34129 + + try: _old_gs_version = mpl._get_executable_info('gs').version < parse_version('9.55') except mpl.ExecutableNotFoundError: From 22198e9de2285d76bec1a3013011568076947f8a Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Thu, 15 May 2025 16:44:48 -0400 Subject: [PATCH 2/6] DOC: tweak wording in docstring Co-authored-by: Elliott Sales de Andrade --- lib/matplotlib/tests/test_usetex.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/tests/test_usetex.py b/lib/matplotlib/tests/test_usetex.py index e76b9d28297f..95eb69325622 100644 --- a/lib/matplotlib/tests/test_usetex.py +++ b/lib/matplotlib/tests/test_usetex.py @@ -158,7 +158,7 @@ def test_missing_psfont(fmt, monkeypatch): def test_pdf_type1_font_subsetting(): - """Test that fonts in PDF output are properly subsetted""" + """Test that fonts in PDF output are properly subset.""" pikepdf = pytest.importorskip("pikepdf") mpl.rcParams["text.usetex"] = True From 53355cae4f15bd672cc9829719f6a7c68fb5a8f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Sepp=C3=A4nen?= Date: Fri, 30 May 2025 13:43:13 +0300 Subject: [PATCH 3/6] Simplify match expression Co-authored-by: Elliott Sales de Andrade --- lib/matplotlib/_type1font.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/_type1font.py b/lib/matplotlib/_type1font.py index e6b9148663ef..33b22adbae73 100644 --- a/lib/matplotlib/_type1font.py +++ b/lib/matplotlib/_type1font.py @@ -1049,7 +1049,7 @@ def run(self, glyph_or_subr): def _step(self, opcode): """Run one step in the charstring interpreter.""" match opcode: - case _ if isinstance(opcode, int): + case int(): self.buildchar_stack.append(opcode) case ( 'hsbw' | 'sbw' | 'closepath' | 'hlineto' | 'hmoveto' | 'hcurveto' | From c77a459690da733028a60dce5f0991db3bc5701f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Sepp=C3=A4nen?= Date: Sat, 31 May 2025 07:56:54 +0300 Subject: [PATCH 4/6] Use one font descriptor for each Type-1 font The old optimization where the same font file and descriptor could be shared by multiple differently-encoded fonts is wrong in the presence of subsetting, unless we also take the exact glyph subset into account. It is very unlikely for the exact same subset to be used by different encodings, so just remove the optimization. Rearrange _embedTeXFont in neater blocks. --- lib/matplotlib/backends/backend_pdf.py | 32 +++++++++----------------- 1 file changed, 11 insertions(+), 21 deletions(-) diff --git a/lib/matplotlib/backends/backend_pdf.py b/lib/matplotlib/backends/backend_pdf.py index f61be9b51e8c..c729b27b1b53 100644 --- a/lib/matplotlib/backends/backend_pdf.py +++ b/lib/matplotlib/backends/backend_pdf.py @@ -722,8 +722,6 @@ def __init__(self, filename, metadata=None): self._internal_font_seq = (Name(f'F{i}') for i in itertools.count(1)) self._fontNames = {} # maps filenames to internal font names self._dviFontInfo = {} # maps dvi font names to embedding information - # differently encoded Type-1 fonts may share the same descriptor - self._type1Descriptors = {} self._character_tracker = _backend_pdf_ps.CharacterTracker() self.alphaStates = {} # maps alpha values to graphics state objects @@ -767,8 +765,6 @@ def __init__(self, filename, metadata=None): fontNames = _api.deprecated("3.11")(property(lambda self: self._fontNames)) dviFontInfo = _api.deprecated("3.11")(property(lambda self: self._dviFontInfo)) - type1Descriptors = _api.deprecated("3.11")( - property(lambda self: self._type1Descriptors)) def newPage(self, width, height): self.endStream() @@ -1005,48 +1001,42 @@ def _embedTeXFont(self, fontinfo): _log.debug('Embedding TeX font %s - fontinfo=%s', fontinfo.dvifont.texname, fontinfo.__dict__) - # Font dictionary + # The font dictionary is the top-level object describing a font fontdictObject = self.reserveObject('font dictionary') fontdict = { 'Type': Name('Font'), 'Subtype': Name('Type1'), } - # We have a font file to embed - read it in and apply any effects + # Read the font file and apply any encoding changes and effects t1font = _type1font.Type1Font(fontinfo.fontfile) if fontinfo.encodingfile is not None: t1font = t1font.with_encoding( {i: c for i, c in enumerate(dviread._parse_enc(fontinfo.encodingfile))} ) - if fontinfo.effects: t1font = t1font.transform(fontinfo.effects) + + # Reduce the font to only the glyphs used in the document, get the encoding + # for that subset, and compute various properties based on the encoding. chars = frozenset(self._character_tracker.used[fontinfo.dvifont.fname]) t1font = t1font.subset(chars, self._get_subset_prefix(chars)) fontdict['BaseFont'] = Name(t1font.prop['FontName']) + # createType1Descriptor writes the font data as a side effect + fontdict['FontDescriptor'] = self.createType1Descriptor(t1font) encoding = t1font.prop['Encoding'] + fontdict['Encoding'] = self._generate_encoding(encoding) fc = fontdict['FirstChar'] = min(encoding.keys(), default=0) lc = fontdict['LastChar'] = max(encoding.keys(), default=255) - fontdict['Encoding'] = self._generate_encoding(encoding) - # Font descriptors may be shared between differently encoded - # Type-1 fonts, so only create a new descriptor if there is no - # existing descriptor for this font. - effects = (fontinfo.effects.get('slant', 0.0), - fontinfo.effects.get('extend', 1.0)) - fontdesc = self._type1Descriptors.get((fontinfo.fontfile, effects)) - if fontdesc is None: - fontdesc = self.createType1Descriptor(t1font) - self._type1Descriptors[(fontinfo.fontfile, effects)] = fontdesc - fontdict['FontDescriptor'] = fontdesc - - # Use TeX Font Metrics file to get glyph widths (TeX uses its 12.20 fixed point - # representation and we want 1/1000 text space units) + + # Convert glyph widths from TeX 12.20 fixed point to 1/1000 text space units tfm = fontinfo.dvifont._tfm widths = [(1000 * metrics.tex_width) >> 20 if (metrics := tfm.get_metrics(char)) else 0 for char in range(fc, lc + 1)] fontdict['Widths'] = widthsObject = self.reserveObject('glyph widths') self.writeObject(widthsObject, widths) + self.writeObject(fontdictObject, fontdict) return fontdictObject From 8abab038d76854bd117b65bfc635a5af2c324548 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Sepp=C3=A4nen?= Date: Wed, 4 Jun 2025 20:27:50 +0300 Subject: [PATCH 5/6] Keep a non-functional type1Descriptors --- lib/matplotlib/backends/backend_pdf.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/matplotlib/backends/backend_pdf.py b/lib/matplotlib/backends/backend_pdf.py index c729b27b1b53..6f3cb8afa1ac 100644 --- a/lib/matplotlib/backends/backend_pdf.py +++ b/lib/matplotlib/backends/backend_pdf.py @@ -765,6 +765,7 @@ def __init__(self, filename, metadata=None): fontNames = _api.deprecated("3.11")(property(lambda self: self._fontNames)) dviFontInfo = _api.deprecated("3.11")(property(lambda self: self._dviFontInfo)) + type1Descriptors = _api.deprecated("3.11")(property(lambda _: {})) def newPage(self, width, height): self.endStream() From d5ab3b02bbaf05ee2998803150b3e2444980ca3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Sepp=C3=A4nen?= Date: Thu, 5 Jun 2025 06:46:25 +0300 Subject: [PATCH 6/6] Install extra TeX fonts on one runner only The DejaVu and Heuristica fonts are used by the type-1 font subsetting tests. Heuristica has a Cyrillic encoding and apparently cannot be loaded without installing texlive-lang-cyrillic. --- .github/workflows/tests.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 7a197a9d4aa8..2a48276707ce 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -64,8 +64,10 @@ jobs: python-version: '3.12' # https://github.com/matplotlib/matplotlib/issues/29844 pygobject-ver: '<3.52.0' - - os: ubuntu-22.04 + - name-suffix: "(Extra TeX packages)" + os: ubuntu-22.04 python-version: '3.13' + extra-packages: 'texlive-fonts-extra texlive-lang-cyrillic' # https://github.com/matplotlib/matplotlib/issues/29844 pygobject-ver: '<3.52.0' - name-suffix: "Free-threaded" @@ -142,7 +144,8 @@ jobs: texlive-latex-recommended \ texlive-luatex \ texlive-pictures \ - texlive-xetex + texlive-xetex \ + ${{ matrix.extra-packages }} if [[ "${{ matrix.name-suffix }}" != '(Minimum Versions)' ]]; then sudo apt-get install -yy --no-install-recommends ffmpeg poppler-utils fi