From 1bc99cd3d69ea4c685b92aac5006c320c4743c9e 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/2] 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 b3e08f52c035..8d90f5ab3472 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 @@ -627,8 +629,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( @@ -650,7 +651,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() @@ -681,8 +687,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) @@ -690,7 +695,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): @@ -745,7 +750,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') @@ -755,11 +760,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( @@ -768,13 +825,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 eb9d217c932c..1ecd390f132b 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(fontdictObject, fontdict) + self.writeObject(widthsObject, widths) 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 + } + + def createType1Descriptor(self, t1font, fontfile): # Create and write the font descriptor and the font file # of a Type-1 font @@ -1078,6 +1102,14 @@ def createType1Descriptor(self, t1font, fontfile): ft2font = get_font(fontfile) + 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']), @@ -1091,6 +1123,7 @@ def createType1Descriptor(self, t1font, fontfile): '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 } @@ -2268,6 +2301,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 zcma)j1yoh-)-E7QgCZd+u;~!kY`VK!Is_y(-Q6G((j_Sk(w%~ov~);!cZbqI1dpBdU);rgn?~G@zmoXU6rce+OqlYlCpi&ggf(q+VAs|MOwZ0iD4-W{e>}mrA zfra%P^en86L0|oG2a`2)#dfgpau>g_TNiU z7YA`A2R#QUh~>9JLC?VfYG(yvg)LFRN+x=SrdGxvwm(nptPPZ)4j?TctcVzp3e?2` z1eUY}QV{xc75;OT1Zn>x9mxMI0G2l_dpjtQ-S70licouNM>_+c9$5a0Ah0ad&{R*z z+69Qn2>h_Jvw>KcnLyg8U}2yrz|$VY`P)*^%E}s8L11S8Yy|A_-_FTEt&AN^K#)Jt z#7r%KT0vkj3!niaPy=g2C@f`r2Ro>qC8|rZe`L8_n*e$M#pE>((dfJ0Dd*XX&K!RU zLQ}SOIMb(j)A`t*`1299Z(B?eX!1UMJHDy8yQ14TIopwLYls%_-d60lZuBpbJx^Et=p-gO$zr%LlbeK*H zK<2LG`Z(wI?<6sTzJFu41vjnC$Y9qP3-- z)jcxC_8=D2dsCs`b3hMagMjFnnAt!O2q!a$lZ_deG_WM_HkcX+S{YkFfw*8ndjr^5 z!5)HPAz=%c4=^`+HWE-%V-p8pR2TtE^*<|C*aDUjFcnY`E?Ff%WWwcL%HwHUJxfjlf2xU?U5# z5isCjYbz+&-ayaJ+6wGoVh4qS9h|Mfj)taCJE*;>Jq_x=-{bp4{aj^jABj##aANGC%YkQBYDGhkn@0e;c~nvv9a{3$$MhXy;RS5e0(LQ z+P?N3ZCzWW2gnOv-^t091IO3FE|5kbQUS#Wdln^qYaas+89`tf8vy|u#JDZ?5{evY zFGLziZNTo+REmTHhj2{^Z_+kLxcHd;qt5(X8~*<4;)iQ{I5C{NTNd?uPiPedA9QZk0 zTVs0pz$5g8=vSN^+c;L-C`tQpzkIvlSLWy_?vkPYnv;w$0}kqJP5p8`Kx&blzO}cL zAo$n^^<^wM_P*iO6*+>aU%^X+V8qFW-+B*ZCS))o;=tMZ2xoXxd*Q=UiOh8leQt{pzP<_(;j;19J2%e^7n?-Qse4u(8lW-!9FugH6_mE>_{EnoFt)@~AO zka~&3+0@=;DGw?BY70LU(zrPa(#O8e1;2*>@itwt%>J^A2964G4VOIhGD`HU{Vc*B zQnCe_%>Dp&uPPCPzM#7n62m|3n$PqrMfbiNm|JLBGS0Ft0BWliXPb7SZ zq~JwwyB@@i-r zjk^tBxZ6Qbxa%3N!@F8F3b2}*?1vXU2MZ3z;g30JukPBOEw8U`U)@<)A>PD1%FW@P z#aO;va8n^iWL2wRMEda-&Irl>E7!O5>3!r} z{;M`5?8kRtdNUPE?Y9bu2q1*ZEWb?E#f3L_TR+n1e0nH@?Rt)R?qmez(&Q%ySyk`K zMglm#MS2tIBX|>EZ3ypyi{J(KR+W4b;hKHmkf9$guXhHP`5S0kE#~%;-(u$NJ%$%p zwD|yj2Nx`*p#E$zqMj=Q+XdB!PxLd!YG57NYhySfoo?f1_T9lD5-I~i8{7V<%i5{H7xivWgT+dCI2)w{W zbJR1qyhD6!@hy-y*~fu(Yd_T9b1)*dfGG55^Wwqd+kjRfI8ZAdf;j8BE|Z`j4m{%R zR}=3bFQk3whTpVY`#~3j)OB;OjKHC@_3G+u8p8F3KpyAfQ^XKB0gx@Dz#GKt-Gvvz z7CR3Ev+!02M=}G}bSLLgSmPBomGbD1T8qBY*P?bfcI<>WmnY9-Evh&ZTUNb?jAieG z>Am5bian2S#9wE2)ufQ_94ZZc-n{bU%73G4e+Ks#t=i#!V-{zQ;H__h;dz+Dok-<%Do-`%*0Tpt1UI z7LIXAP@ZJ5-1oyahO1+zDwqs|m-Yoal--921UmEGdaUKr)D=Z;G`=K!$62DvJ70+w zLt48oR}(GLcHaFWIMN-8Yvr&q(tpGtsyQHEI(xOTbftA`xSN1jj^krco>Uv1PbptY zByE2f)4AAL;S`D0sgJH7L9B&il#8VlU}66liP4W9?uv)zqOYKCpykJp-C%fioaV!? z&1a>37YR=z9c`gC-cv~{+hQxDwZHt!3ZE)fHc4Me^)!yob{8k3V`0M&v2<@#eD=Qj zWm4=O;nfYf82_wZWvuu`3+L*VuIVXZ;B8xATs!#%%M^qaTSZt)=}h0*_`6o=_OV4i zZht6JZO$_(yp$IC4-n0x>p4nXN_m!RRiY8c1ixb>sfW%vrt?M*(jq(q_+-m$=x2iI zr0^D>=+a>^4Onby#X}tYMmTytqA5TvlPb_en3HlXR)yZ1C{YEN>rItE^_mQyA~Zru@_GYB|iEl{>cNQPPG&Go|5R=P<@x^=s+(d^zBi?G7pj zNpIV;ob%6FQIE*ZFLEDdl0VYc=0mvU-rYD;rvMLl+K%X-J_?Ymlf8N0W8T!jU4-5u z#icK<`c|DrV>c~l)0~;S{_9+vqq#Yy9oU6HY9+0sGPDfTrMz8UO)i&gp7VX+qAkXP zNMjoX`$>HVZoE{|K0b|hcdxfcf%R}na*9)C=^Ae2ay*EM;$laV#dnp?woBg#t%X)z zS{YUAj)>=F-An9qP4U-s;ZSQ_mzeC_)T1hnZ{+8hR8^&C@#_hq@29sE&Zmu19-tS| zRxM7<$7wzIQWb--sN{aAgSPX;A&fQiYX|3SOXbNL*mX2;57}tTnKQJOs@6B2uw=b`(*LsUksU5K|kuW+X9T8%{2xdZZ^w z4-<-edqR82a;jWzh`YIt+PIxY)$d(ZOe zW`jP#&2aCBP?nDVx#3&4`KRx-tNS)~Z44QB*^St}y-E?H4Q?wd%RfBe{i;aaEG4qp z$0YiS$;VX?$1g>3!kVqb_@({}-*+b$hlL;OA6$KtBIz_g>dx1mu9DY)zusQyTyG<3 zCN-*R2xyiNxP+AljeSHa{bHNpq*q$BvaA_hS?7HCdNNnr#|oI2WDUDxubv zaHi7I)Lje3v24cinB>_}lT~R%?WBU4Ku3$de(dII-A&R1nmebb$adnr*X88F4$&LO zvJzZ2#)|#cEm?cK^G02o!(pKB^(5z@XJGY=p``8Qil{a+&+@xCj~nA;Z`7_K%w5rw zurOtOfwmiQoTnBpD%I7|+bR48X=xizlW^B$JH$Tko>atBEzGLd$}Dh)m8pkNXB{*f zqJ0I8aXi+Xt~qtnRVX6cmwpph`Ejj+|6+W}AnzA83d6?G+(g9L!!hlm4Ec*HqJg^> zI`$!AyPt|Y?ZWTeD%i>Vw^-IjTp^acKVsa)f04T}~5^~*jlZY?*Y=cAIfXfwVX z8%|S=a7u!f>kn8<`UeI1M)#3Od`Bj*>NGxAlp3KgZv@0?5~1n`AhW(<==p3$^yq?@ zl;V4Q#Ku0aDmPO@Tbm||sq&K;d4vHbOX9sqCUP*J8s;=d&8mbrskyCJ9V75@+-5Zyb0LK%evkKf~FA`BWLmqxCW9HGpy3600%dz$!Dtr~iD zT9@%`ac#OSB3SH1py;7s=%{cQHBC+=Xcg&!Q}QW&r_taVRb)!hvZW=bk=}h(=k>2^ zJ_Oe-3_~5*PCfWfP%4%|LEKy8J>BWQlBz6UmYd9s^A!zP5gM`7A14sc#b}*A!|TO# zd=?jRDJIq0Kvc(NMEpkDFh_8!T&Dck)6qdZLF>>x;mz&GK$)2HNDtY8$vlDXPAhKh zN%%|FhUd<>UI(6|MfxAlxk`q2ve?~PDoaqT82NC`BM5`G^{qhoug(J7=#Ou^mQNgx z5KkN1m^pW5s*2w)Q&i~__0z>a*X0NiPSj-Ii(_CCohSSWNqd<#=S#<4@5Ga;@QSA7 zynD-s`MHcjARUp*#4_2B`8h2Y?E1GAk8{Ir8@qZD51=)x%>jX#3qbu$a4-dqO% zDzr?m8y(gDV+(QcT72fsfD52`B7;;C9iS0LLsrM1RlpDO8MKlHei%yEqqd6?%gPG{_?d_6?!{jOg z0=hV(*$0m(Owp?)}+f7mBKMu4szo`j~#MqTQOO2)8@Ryc0NfG@PT>Z5X? zSK%3yE6I0~Fl_h9#f+wEjJTm&&a@PXP-_I-RY>nIzv{0=>E>E)@(AVg30Jb8OqdXO zoQg^e8|O|Z9A_Jp4UULDxcjlyAd~P?J=jl|3<+*?n$fU85LS(F%ygDUP$$xV*N)#` zcb!l{fzz5}q!qgUC`>AbV6H;bLnLIN5*+72F4o+;3h}Eyf9CY#njCK0S;P)gsqx1g zrN3*C#o>$N#z;-V-SjX1vAvAnwMMa!g1rY5KTXXqJJ-)lKJpx_Et)nztl?Kjj*xJ{ zH|v-)v54|_QTX)0<7Y|PKHB=r@vufN!er1!n0U(zlB6n9URpUXD3-{xZBMrNr}QsM zX-Ps0nFbUl-VjkfS$eQ8`csbG2{CzZoC6 zJh?D;66cB|s@06_D(tZ|=gIl=jMiq;^}~^NpA@C*mClk$$INGI-dy)q!${=?tS87| z(e*M7e5?LAmx2jMt;Hd2ruNX5k#e)+iG03>MLVwL?J-fex4jaZ%533sY`JHWVLwHs z-7l(ku`mx;q=%{0w_fZbTZ+LM(@|-wiv1~S{`?&ce$@}BiIsmGPz9iWmXH9uz#-48 zLt;gdSf?j6Zr;}IM26a=-Jxb1-|T|KUP|GQnDR%iSUoq#FS9G)G=w*b$?RdQe;I=K z(Mi#;-%Gs4U`pU5a=ozM@>2w#j5bqPrfASxiGA;91CxuVKh$fQ)q-AB$hK3MM|}On zhbFGYJFJ0T#x9~&=#o~3AkSej?uA*Jq{SIUM{K$&NiLn(8^Ze#iNl|&B6$-5f8NS` zS$3?IUuZ1o49ZftX1TXdZT>?j0+iqJi66rUjOO0?WdbvNK$Oggo0TurWwZUWoRwz% z<<|LWOkJsPRseVNqV5!t?sxz+yH?e$9l3r9Tdc+0e0u8Bj{yXZ=g7Zbw+wZM|C?h`71}yBqlX?;uZThIRaGUSkJ78#Xv=`e zYn|El{04Js+t<6EDZ{EZ%XkL;r-719uNtc>8J;s#)vpLEfuHieL<*RlJzSNsns4ga z*G)6NQk2hC_Fg{c&*|}{iPZj~N@X3ALHrPNBaR3$8+*cK!0;`xLPvo%YVW7G(E<^_ zum%>&cc$yE<{vZ;%plpsETnmdJy{r`^V;#(aBHv9<15*i5UI83*HVfmQtj9Dy~0^W zl59EYFO=(ggcrsM(MZBmY+Z@Nxw#as?N4w0%vvrrLpnN}aC%RIHl8Ye=*4p7|IqW2 zN_CtabKk+lq1iURDqF-^%*`>*ScB{Xo^~6m@pa?ocxj&Xa0u|fkys&4%+yJvnByf6 za^&W)koeR5cnqEot$mpZ#C%ya)d^LiX%G6Ij8xeTem*Kk-p0P9U5eTBq0egX?hP&M z>P*E^D^JT*@@F1-<>JzLkkkl%IFeN%(@@@e5^61^OI z;~3=+gBe#-<+o?iHqcUdoUvW@rOG3d)+f&8tWF(WD;7>2GLP-c9I100GQ9GyQ=4jR z*Kx|KGFN<9e2zl4KgDzOm+E$Oi1(J@diUDaSm!6)DS=gX+NJmIi1FGJuDQ%m527;^1={n)S z%lYbEj9KozQOTMDy!RNcYI)lHPM<9GJN2;EvkspJUBca*eistrU7z(DxE#;^c=%jV zh<+=-=Uc`sRTJZ=^!R&w(&pHF^2h5d!}X(jp{7Kn40q@_>>sUmvA*;Wu_&vY#LG`u>|&IoKLmu}$(_6WKP zPS>g#B36!e>*?!Y7gOoYWfxHmnoVm;{EUA-(qNo=DJP6g-ru{MRo2`}*wBL5ydbtu zw}R6P|7~=pzGLjCx8c=yX=+jrb-yj-xEvx)$>X@4ldt$uKTqjg2au1gQ}a!22G?{& zX~-lyTGG9qxacknb-fj9pz!e$4?QLz)Ud@fzs!nFI zviy{9X9wAI$c~Zvl4FHl|7%n@6;kxt_n_h{pSLs}e_3jykt_;l7HUFkPs6YBZ2qSn z=*8>m3nU+~ss-<`<7^O(pg~nj_~{<|_-Aw9uhU0X%vq!69Gv@~^01Ocm|4kjdg7s& zdGs@`2R2g<p$MGCdCn0W?+s`$P-U2XMcjvjnxMt^+hb1Jef51lc%_$BvRe7U(m{hF=K7+*H z?itEDAzC$Y=FH$D*))}3Yt*_Vh5U#yI|tuIC%K>U_J|*BaX#H9z=lJ`F?b`B46U`Y z^RRjMSj}@Wxeq0Lh(7n@DeLlz`L8Lwhm5Ny&~3!e7_J@YOHaHHR@}tn8?JHn<4)j6 zvwtEQdNCji#M~wEE*Rw{;mqBnx;g5{oYL*8WWI=D7Cgi{Os@2paIY|=Y~(zA^+?;YBg1@8MY=ge=zXE>^r z-Z#hgbQ_tKJBp4gaHu4eCnSX4g<@;JM$aN%$0~yNuRP8_6kp*b%8YU+7#y95y4Q(#_Uu5@Y6gN? zxQVS%tuSqCS;CIbCN8;MCnsd(EN;SMzkr|0;)T-hwFgbAQTG-N;ZLg>QNp8<`Q%+h zMas8pf?0(ou=nKhmm*jnPc@>4kyzK2`Sh8mk2|S;Dm_j3hOa7nhEjKdQi1fbdL#9D z#l`5Qe#`ApuH%H4wFrUKr(iT4yq5W|I6B2Et2)hO)7sV>4Pmx3EJm*tT=RD40`8<} z!)(kHDMII*J_U$W_N*yVGiOVG$Q>w}f#VD$VOW;;BX_5dqroB#>KM^}Kx0Ix%{)5M z?9FF*h9~sxQwEbZ8^eZ_IZdTyv0YgvOMooM*S>Gbz)ZQ<}7YdW$2|kXu-! z`K$Z{apojzkZ-*R&NzO|7|nV3d(B>T9#sL-ZE-nx!x>F`J|oIZbzbaYtX?D6He$#} zXAjmlsm0|Vi6Wy2E#(qqzgQ|Jc|Z1wo`EnQrvIFXjMBFd#@UTYar9Dv#`?pb}`G5V)I$*5;?=y@&O~7C}{LCmLhMg#98>Sv@qRXBC?A@ zZ;|}?xhcAF>t%TNn2H5N#`zc0j%}FJG;^_{MWgfyA6a5!hEu3-BO_lJ3}=pJbh?{k z62KL@VD;;LBA$;-Y{bLjd|qVNP5LxU)$AB**T^ z9qzV`&&(y5k5RD2;poPvj@Z89NM#?=Keee9yeZ<8W;W?K%;F;GNmK_f)0iUaH$?jIr&SVWmb?qEnXM{5$n zG|v!AY13(f7Qr-vYTogw^E18)5o1RyE7k)4Szx%nhk zzPlK^#SlKd#_m*ee!gqTc7j~%9j2y#@U|(RIEsc#688sbEp6Pjh~>&NgPZJxk-;J$(ea8tMHhWdq0&Pe20yAzmZqU{0`am1;y(hppohDO4V7 znLf?^OU^QWuUYVc)t5pUz&4iaB&h`UAjKk5ped@dC>WOMPpvZXCKxKnG74cR9LOMuX<{5Ab+f+4Vsx${#_zx#OrbKesxs?KcuYW;iQEoJWQ#miZ>@ zhaFC^@7IHKX}-@e?eKinnY{*qQUX28EuCuXpIr(w9ZhEjEeXCsR#AKtrgT-{nlV%A zWUNMX64M>V?jX%y-bBw&E*rb~702ZpCQfITa|$lM+gSoLYLL;p&o%P$o;PD@Ny%yr z7WS%BEY%yog7*4<{@}wFow{s&62QIOFB~-yCQ>mO{%}2e;G*o>SvPc8 z-N%yr6rr@pWAn4Cgt&ghvVVQ3SOFfF=P%{u@TxF#DI=XMoell!d2;j8gDd%A8##&> zxXMdj;Bv7AD;Ap2jxS^}44nd}!Lrq(63K=M@V}eIFk25yXNzOCXzXxlK%* zpN(STb^15=hpF2EUr^!?H$oc*C4O`<($-!aKPqdJ zs`7&zgDioewW4e-tJtdLd)7DTpj}>GYJ}r{nj9CiOhcaqNY|DfySj@%6RJ5{Dcukpt#-XvswGvX#ah z*dEITmUcq+FDfW_7FVvfI482k&wf6$-QBCh5hNtOe>^*q!huAuL`3$EA+{{EcQEEO$s5n*+B zPA8#)eX|0J^}E%6qVc*`S#110VqQawZ?v5n)5P2R53j~WOfSz2Fvg`fk8HGM{G2z7 z!}BCnG-C`xi5Op8>I)Z6P)E;|@_)EuR%+musZd?K<{CH=zUoDJ^vgiKjLtG{RmIJ| z-7y;1Go?u-_PpfaOCH%dbmwL-K<$zhN0ahb61HTaFFTCp%X-9c0&hQGuhXqyf-jle~SV6MQJBvdu^Ozz2i zrsbZKa5;I1;U+Y2nCTF+x%DZ<;Q&_)t6sjZ*TdX%xUy|JQW2v3v1h2oc0gMahqK7- zX{hd@BxtQaA=oQdbjwJxQ+{mH??o4>(~cmKA{r|LWW9!jKKNDJ=hGK9FOW58J$e-D zKH*wJcmNb~v4RTRRhHV^w63d0Vol?pg#sI4BkC$*r5~L2G@s za{xnH%S94-95&CmC33^_*`Cg5bZja00*A>{G#94E>Y*U{u_DU>lV?xw@MJmQJR4~u z4{zn^E6J>j`YICEKBI;8&+c`LTzAzjTOIDm%UB=2W&cbb#+QWXC(EaR!s4?jgpeGZ zRqVKE2mkU3UK#fLSb6;HHNjUsJy~mcM?+E@W&RuRPmt@V%lgh;&oI2jeeKo!2mPxj z6QkeQ?2MreIEIwMwK+oZO@o-8GF0LR)isQl>+@pG6h3DX~WG}KY}a?cXg9hUIc4aT@vVIuf3J<>lO&MsyvsPsI$d1 z3O735d?(@IJ%jWpNuEH8O-HNp0ICvYeUd5kf^)$ zb+U77U2B z4C=|QtF`5HHcD~|-fmkr-UiJ1B7qYnu^ny4l(Gku2VcIrT;TD+xr$a=cE8+-NLko` zxPQ6g=OJZL{a+}BFxJ{%j@!Sff&jbDQQzU7>6FC%jo^RXJtYKi&_B$PZ*c=-yGV%DpatDsgV&tzO#Z+PqkpaMy7yRfLJ&|FtQ#9 zM$iL(!MJ*W9-#1n*jNFUA&?Tl#04mZAWn7=SPul&2Z0ShU_*dg2-^b{!pZ{rL-YeN zF#&tsGXg-4^&nFD3~7`gagFM1l#v_Pwx8y_`-5#0j~GtP*_p0B3T)M z0)Zr0Sb!@V5R4Oo%FF}{1|$QlVU1)027(pBe&2Y2cnRp)?|oQVfdD|_%m5(FoIsI4 zfvjwtz#c&IK!aHsnNeZ)Fi>Cx!(zg&zu|&Ga-RXvMiyYE{*@NY3?>jJrr!-_0vf={ z$^0K6!aQKY%K66_#(0H!aRAA~l7TsK07=8bz&gNqkM$qCP}vy&VE4!C-V;^=tVb*W z@f0ZK9y34(d&Ue*_`MG3Kl9&N1X{+z!E!$j_cnl@1;Fy&AGn8M#qp=~dz@id|ChjQ zVA#Xh-+-Y0x!&Ur!~U!q)%fvHz1! zEeQGNA@(l{KUi20Z~`0Xfgms*J6MqE|7r#trhm--LDGkDp8p)f|2}8_9y7qH`EMm` zV*ZCEj8*@ir}*!$CV-_)4PmG1{dWKqVPtJ#Ye(P^zfbZnTl|0B(ZvpG1PnBU0~HwD zKOf-WWo2ds8G-(#gB^{q56J3|4#EU`nf_bH1e}uptz!nz{%;)%F!ldK$MnD0u>d*4 zKL3gf+yjTef9sfmsrzpo8|+)tzl^0e<4HC%E%h{!*IU< 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 60169a38c972..079ef16128bb 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__).with_name("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 c7658c4f42ac..809da9d2783b 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 7ec8b45219a39938b658d5c0f0f42aa5d05db8d8 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Thu, 15 May 2025 16:44:48 -0400 Subject: [PATCH 2/2] 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 809da9d2783b..62588b00e7f5 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