From 3a0a7734466db95809e72d7912d7a075b0ee4d12 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Tue, 3 Jun 2025 18:59:00 -0400 Subject: [PATCH 1/3] TYP: Make glyph indices distinct from character codes Previously, these were both typed as `int`, which means you could mix and match them erroneously. While the character code can't be made a distinct type (because it's used for `chr`/`ord`), typing glyph indices as a distinct type means these can't be fully swapped. Unfortunately, you can still go back to the base type, so glyph indices still work as character codes. But this is still sufficient to catch errors such as the wrong call to `FT2Font.get_kerning` in `_mathtext.py`. --- .../next_api_changes/development/30143-ES.rst | 7 +++++ lib/matplotlib/_afm.py | 19 +++++++------ lib/matplotlib/_mathtext.py | 28 +++++++++---------- lib/matplotlib/_mathtext_data.py | 18 +++++++----- lib/matplotlib/_text_helpers.py | 4 +-- lib/matplotlib/dviread.pyi | 7 +++-- lib/matplotlib/ft2font.pyi | 22 +++++++++------ lib/matplotlib/tests/test_ft2font.py | 5 ++-- src/ft2font_wrapper.cpp | 3 ++ 9 files changed, 70 insertions(+), 43 deletions(-) create mode 100644 doc/api/next_api_changes/development/30143-ES.rst diff --git a/doc/api/next_api_changes/development/30143-ES.rst b/doc/api/next_api_changes/development/30143-ES.rst new file mode 100644 index 000000000000..2d79ad6bbe9d --- /dev/null +++ b/doc/api/next_api_changes/development/30143-ES.rst @@ -0,0 +1,7 @@ +Glyph indices now typed distinctly from character codes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Previously, character codes and glyph indices were both typed as `int`, which means you +could mix and match them erroneously. While the character code can't be made a distinct +type (because it's used for `chr`/`ord`), typing glyph indices as a distinct type means +these can't be fully swapped. diff --git a/lib/matplotlib/_afm.py b/lib/matplotlib/_afm.py index 352d3c42247e..3d7f7a44baca 100644 --- a/lib/matplotlib/_afm.py +++ b/lib/matplotlib/_afm.py @@ -30,9 +30,10 @@ import inspect import logging import re -from typing import BinaryIO, NamedTuple, TypedDict +from typing import BinaryIO, NamedTuple, TypedDict, cast from ._mathtext_data import uni2type1 +from .ft2font import CharacterCodeType, GlyphIndexType _log = logging.getLogger(__name__) @@ -197,7 +198,7 @@ class CharMetrics(NamedTuple): The bbox of the character (B) as a tuple (*llx*, *lly*, *urx*, *ury*).""" -def _parse_char_metrics(fh: BinaryIO) -> tuple[dict[int, CharMetrics], +def _parse_char_metrics(fh: BinaryIO) -> tuple[dict[CharacterCodeType, CharMetrics], dict[str, CharMetrics]]: """ Parse the given filehandle for character metrics information. @@ -218,7 +219,7 @@ def _parse_char_metrics(fh: BinaryIO) -> tuple[dict[int, CharMetrics], """ required_keys = {'C', 'WX', 'N', 'B'} - ascii_d: dict[int, CharMetrics] = {} + ascii_d: dict[CharacterCodeType, CharMetrics] = {} name_d: dict[str, CharMetrics] = {} for bline in fh: # We are defensively letting values be utf8. The spec requires @@ -409,19 +410,21 @@ def get_str_bbox_and_descent(self, s: str) -> tuple[int, int, float, int, int]: return left, miny, total_width, maxy - miny, -miny - def get_glyph_name(self, glyph_ind: int) -> str: # For consistency with FT2Font. + def get_glyph_name(self, # For consistency with FT2Font. + glyph_ind: GlyphIndexType) -> str: """Get the name of the glyph, i.e., ord(';') is 'semicolon'.""" - return self._metrics[glyph_ind].name + return self._metrics[cast(CharacterCodeType, glyph_ind)].name - def get_char_index(self, c: int) -> int: # For consistency with FT2Font. + def get_char_index(self, # For consistency with FT2Font. + c: CharacterCodeType) -> GlyphIndexType: """ Return the glyph index corresponding to a character code point. Note, for AFM fonts, we treat the glyph index the same as the codepoint. """ - return c + return cast(GlyphIndexType, c) - def get_width_char(self, c: int) -> float: + def get_width_char(self, c: CharacterCodeType) -> float: """Get the width of the character code from the character metric WX field.""" return self._metrics[c].width diff --git a/lib/matplotlib/_mathtext.py b/lib/matplotlib/_mathtext.py index 19ddbb6d0883..afaa9ade6018 100644 --- a/lib/matplotlib/_mathtext.py +++ b/lib/matplotlib/_mathtext.py @@ -37,7 +37,8 @@ if T.TYPE_CHECKING: from collections.abc import Iterable - from .ft2font import Glyph + from .ft2font import CharacterCodeType, Glyph + ParserElement.enable_packrat() _log = logging.getLogger("matplotlib.mathtext") @@ -47,7 +48,7 @@ # FONTS -def get_unicode_index(symbol: str) -> int: # Publicly exported. +def get_unicode_index(symbol: str) -> CharacterCodeType: # Publicly exported. r""" Return the integer index (from the Unicode table) of *symbol*. @@ -85,7 +86,7 @@ class VectorParse(NamedTuple): width: float height: float depth: float - glyphs: list[tuple[FT2Font, float, int, float, float]] + glyphs: list[tuple[FT2Font, float, CharacterCodeType, float, float]] rects: list[tuple[float, float, float, float]] VectorParse.__module__ = "matplotlib.mathtext" @@ -212,7 +213,7 @@ class FontInfo(NamedTuple): fontsize: float postscript_name: str metrics: FontMetrics - num: int + num: CharacterCodeType glyph: Glyph offset: float @@ -365,7 +366,7 @@ def _get_offset(self, font: FT2Font, glyph: Glyph, fontsize: float, return 0. def _get_glyph(self, fontname: str, font_class: str, - sym: str) -> tuple[FT2Font, int, bool]: + sym: str) -> tuple[FT2Font, CharacterCodeType, bool]: raise NotImplementedError # The return value of _get_info is cached per-instance. @@ -459,7 +460,7 @@ def __init__(self, default_font_prop: FontProperties, load_glyph_flags: LoadFlag _slanted_symbols = set(r"\int \oint".split()) def _get_glyph(self, fontname: str, font_class: str, - sym: str) -> tuple[FT2Font, int, bool]: + sym: str) -> tuple[FT2Font, CharacterCodeType, bool]: font = None if fontname in self.fontmap and sym in latex_to_bakoma: basename, num = latex_to_bakoma[sym] @@ -551,7 +552,7 @@ class UnicodeFonts(TruetypeFonts): # Some glyphs are not present in the `cmr10` font, and must be brought in # from `cmsy10`. Map the Unicode indices of those glyphs to the indices at # which they are found in `cmsy10`. - _cmr10_substitutions = { + _cmr10_substitutions: dict[CharacterCodeType, CharacterCodeType] = { 0x00D7: 0x00A3, # Multiplication sign. 0x2212: 0x00A1, # Minus sign. } @@ -594,11 +595,11 @@ def __init__(self, default_font_prop: FontProperties, load_glyph_flags: LoadFlag _slanted_symbols = set(r"\int \oint".split()) def _map_virtual_font(self, fontname: str, font_class: str, - uniindex: int) -> tuple[str, int]: + uniindex: CharacterCodeType) -> tuple[str, CharacterCodeType]: return fontname, uniindex def _get_glyph(self, fontname: str, font_class: str, - sym: str) -> tuple[FT2Font, int, bool]: + sym: str) -> tuple[FT2Font, CharacterCodeType, bool]: try: uniindex = get_unicode_index(sym) found_symbol = True @@ -607,8 +608,7 @@ def _get_glyph(self, fontname: str, font_class: str, found_symbol = False _log.warning("No TeX to Unicode mapping for %a.", sym) - fontname, uniindex = self._map_virtual_font( - fontname, font_class, uniindex) + fontname, uniindex = self._map_virtual_font(fontname, font_class, uniindex) new_fontname = fontname @@ -693,7 +693,7 @@ def __init__(self, default_font_prop: FontProperties, load_glyph_flags: LoadFlag self.fontmap[name] = fullpath def _get_glyph(self, fontname: str, font_class: str, - sym: str) -> tuple[FT2Font, int, bool]: + sym: str) -> tuple[FT2Font, CharacterCodeType, bool]: # Override prime symbol to use Bakoma. if sym == r'\prime': return self.bakoma._get_glyph(fontname, font_class, sym) @@ -783,7 +783,7 @@ def __init__(self, default_font_prop: FontProperties, load_glyph_flags: LoadFlag self.fontmap[name] = fullpath def _map_virtual_font(self, fontname: str, font_class: str, - uniindex: int) -> tuple[str, int]: + uniindex: CharacterCodeType) -> tuple[str, CharacterCodeType]: # Handle these "fonts" that are actually embedded in # other fonts. font_mapping = stix_virtual_fonts.get(fontname) @@ -1170,7 +1170,7 @@ def __init__(self, elements: T.Sequence[Node]): self.glue_sign = 0 # 0: normal, -1: shrinking, 1: stretching self.glue_order = 0 # The order of infinity (0 - 3) for the glue - def __repr__(self): + def __repr__(self) -> str: return "{}[{}]".format( super().__repr__(), self.width, self.height, diff --git a/lib/matplotlib/_mathtext_data.py b/lib/matplotlib/_mathtext_data.py index 5819ee743044..0451791e9f26 100644 --- a/lib/matplotlib/_mathtext_data.py +++ b/lib/matplotlib/_mathtext_data.py @@ -3,9 +3,12 @@ """ from __future__ import annotations -from typing import overload +from typing import TypeAlias, overload -latex_to_bakoma = { +from .ft2font import CharacterCodeType + + +latex_to_bakoma: dict[str, tuple[str, CharacterCodeType]] = { '\\__sqrt__' : ('cmex10', 0x70), '\\bigcap' : ('cmex10', 0x5c), '\\bigcup' : ('cmex10', 0x5b), @@ -241,7 +244,7 @@ # Automatically generated. -type12uni = { +type12uni: dict[str, CharacterCodeType] = { 'aring' : 229, 'quotedblright' : 8221, 'V' : 86, @@ -475,7 +478,7 @@ # for key in sd: # print("{0:24} : {1: dict[str, float]: ... @property - def index(self) -> int: ... # type: ignore[override] + def index(self) -> GlyphIndexType: ... # type: ignore[override] @property - def glyph_name_or_index(self) -> int | str: ... + def glyph_name_or_index(self) -> GlyphIndexType | str: ... class Dvi: file: io.BufferedReader diff --git a/lib/matplotlib/ft2font.pyi b/lib/matplotlib/ft2font.pyi index 5257893b380a..a4ddc84358c1 100644 --- a/lib/matplotlib/ft2font.pyi +++ b/lib/matplotlib/ft2font.pyi @@ -1,6 +1,6 @@ from enum import Enum, Flag import sys -from typing import BinaryIO, Literal, TypedDict, final, overload, cast +from typing import BinaryIO, Literal, NewType, TypeAlias, TypedDict, cast, final, overload from typing_extensions import Buffer # < Py 3.12 import numpy as np @@ -9,6 +9,12 @@ from numpy.typing import NDArray __freetype_build_type__: str __freetype_version__: str +# We can't change the type hints for standard library chr/ord, so character codes are a +# simple type alias. +CharacterCodeType: TypeAlias = int +# But glyph indices are internal, so use a distinct type hint. +GlyphIndexType = NewType('GlyphIndexType', int) + class FaceFlags(Flag): SCALABLE = cast(int, ...) FIXED_SIZES = cast(int, ...) @@ -202,13 +208,13 @@ class FT2Font(Buffer): ) -> None: ... def draw_glyphs_to_bitmap(self, antialiased: bool = ...) -> None: ... def get_bitmap_offset(self) -> tuple[int, int]: ... - def get_char_index(self, codepoint: int) -> int: ... - def get_charmap(self) -> dict[int, int]: ... + def get_char_index(self, codepoint: CharacterCodeType) -> GlyphIndexType: ... + def get_charmap(self) -> dict[CharacterCodeType, GlyphIndexType]: ... def get_descent(self) -> int: ... - def get_glyph_name(self, index: int) -> str: ... + def get_glyph_name(self, index: GlyphIndexType) -> str: ... def get_image(self) -> NDArray[np.uint8]: ... - def get_kerning(self, left: int, right: int, mode: Kerning) -> int: ... - def get_name_index(self, name: str) -> int: ... + def get_kerning(self, left: GlyphIndexType, right: GlyphIndexType, mode: Kerning) -> int: ... + def get_name_index(self, name: str) -> GlyphIndexType: ... def get_num_glyphs(self) -> int: ... def get_path(self) -> tuple[NDArray[np.float64], NDArray[np.int8]]: ... def get_ps_font_info( @@ -230,8 +236,8 @@ class FT2Font(Buffer): @overload def get_sfnt_table(self, name: Literal["pclt"]) -> _SfntPcltDict | None: ... def get_width_height(self) -> tuple[int, int]: ... - def load_char(self, charcode: int, flags: LoadFlags = ...) -> Glyph: ... - def load_glyph(self, glyphindex: int, flags: LoadFlags = ...) -> Glyph: ... + def load_char(self, charcode: CharacterCodeType, flags: LoadFlags = ...) -> Glyph: ... + def load_glyph(self, glyphindex: GlyphIndexType, flags: LoadFlags = ...) -> Glyph: ... def select_charmap(self, i: int) -> None: ... def set_charmap(self, i: int) -> None: ... def set_size(self, ptsize: float, dpi: float) -> None: ... diff --git a/lib/matplotlib/tests/test_ft2font.py b/lib/matplotlib/tests/test_ft2font.py index 5dd96ce9cafe..6b405287e5d7 100644 --- a/lib/matplotlib/tests/test_ft2font.py +++ b/lib/matplotlib/tests/test_ft2font.py @@ -1,6 +1,7 @@ import itertools import io from pathlib import Path +from typing import cast import numpy as np import pytest @@ -241,7 +242,7 @@ def enc(name): assert unic == after # This is just a random sample from FontForge. - glyph_names = { + glyph_names = cast(dict[str, ft2font.GlyphIndexType], { 'non-existent-glyph-name': 0, 'plusminus': 115, 'Racute': 278, @@ -253,7 +254,7 @@ def enc(name): 'uni2A02': 4464, 'u1D305': 5410, 'u1F0A1': 5784, - } + }) for name, index in glyph_names.items(): assert font.get_name_index(name) == index if name == 'non-existent-glyph-name': diff --git a/src/ft2font_wrapper.cpp b/src/ft2font_wrapper.cpp index 5ba4bec36874..31202f018e42 100644 --- a/src/ft2font_wrapper.cpp +++ b/src/ft2font_wrapper.cpp @@ -1774,5 +1774,8 @@ PYBIND11_MODULE(ft2font, m, py::mod_gil_not_used()) m.attr("__freetype_version__") = version_string; m.attr("__freetype_build_type__") = FREETYPE_BUILD_TYPE; + auto py_int = py::module_::import("builtins").attr("int"); + m.attr("CharacterCodeType") = py_int; + m.attr("GlyphIndexType") = py_int; m.def("__getattr__", ft2font__getattr__); } From c6e690489637b25e8bd883cc9299751462a1da96 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Thu, 5 Jun 2025 23:18:52 -0400 Subject: [PATCH 2/3] Fix kerning of mathtext The `FontInfo.num` value returned by `TruetypeFonts._get_info` is a character code, but `FT2Font.get_kerning` takes *glyph indices*, meaning that kerning was likely off in most cases. --- lib/matplotlib/_mathtext.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/_mathtext.py b/lib/matplotlib/_mathtext.py index afaa9ade6018..78f8913cd65a 100644 --- a/lib/matplotlib/_mathtext.py +++ b/lib/matplotlib/_mathtext.py @@ -426,7 +426,9 @@ def get_kern(self, font1: str, fontclass1: str, sym1: str, fontsize1: float, info1 = self._get_info(font1, fontclass1, sym1, fontsize1, dpi) info2 = self._get_info(font2, fontclass2, sym2, fontsize2, dpi) font = info1.font - return font.get_kerning(info1.num, info2.num, Kerning.DEFAULT) / 64 + return font.get_kerning(font.get_char_index(info1.num), + font.get_char_index(info2.num), + Kerning.DEFAULT) / 64 return super().get_kern(font1, fontclass1, sym1, fontsize1, font2, fontclass2, sym2, fontsize2, dpi) From 733cd7d99a3534be25dd46cd2c05b93749ec1b39 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Thu, 24 Jul 2025 15:46:13 -0400 Subject: [PATCH 3/3] Update test images for previous changes --- .../test_mathtext/mathtext_cm_21.svg | 1476 +++++++++-------- .../test_mathtext/mathtext_cm_23.png | Bin 3144 -> 2823 bytes .../test_mathtext/mathtext_cm_23.svg | 599 +++---- .../test_mathtext/mathtext_dejavusans_21.svg | 907 +++++----- .../test_mathtext/mathtext_dejavusans_23.png | Bin 3122 -> 2822 bytes .../test_mathtext/mathtext_dejavusans_23.svg | 537 +++--- .../test_mathtext/mathtext_dejavusans_27.svg | 383 +++-- .../test_mathtext/mathtext_dejavusans_46.svg | 229 +-- .../test_mathtext/mathtext_dejavusans_49.svg | 211 +-- .../test_mathtext/mathtext_dejavusans_60.svg | 418 ++--- .../test_mathtext/mathtext_dejavuserif_21.svg | 1020 ++++++------ .../test_mathtext/mathtext_dejavuserif_23.png | Bin 3125 -> 2853 bytes .../test_mathtext/mathtext_dejavuserif_23.svg | 559 ++++--- .../test_mathtext/mathtext_dejavuserif_60.svg | 444 ++--- .../test_mathtext/mathtext_stix_21.svg | 1096 ++++++------ .../test_mathtext/mathtext_stix_23.png | Bin 3135 -> 2826 bytes .../test_mathtext/mathtext_stix_23.svg | 573 ++++--- .../test_mathtext/mathtext_stixsans_21.svg | 904 +++++----- .../test_mathtext/mathtext_stixsans_23.png | Bin 3099 -> 2808 bytes .../test_mathtext/mathtext_stixsans_23.svg | 539 +++--- 20 files changed, 5180 insertions(+), 4715 deletions(-) diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_21.svg b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_21.svg index 6967f80a1186..a7195c665c14 100644 --- a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_21.svg +++ b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_21.svg @@ -1,12 +1,23 @@ - - + + + + + + 2025-07-24T15:42:36.846948 + image/svg+xml + + + Matplotlib v3.11.0.dev1119+gc6e6904896.d20250724, https://matplotlib.org/ + + + + + - + @@ -15,721 +26,752 @@ L 378 54 L 378 0 L 0 0 z -" style="fill:#ffffff;"/> +" style="fill: #ffffff"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_23.png b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_23.png index 0317cb99e1c00d2d126a11b341ffe67100702976..c2076843da4aa5e8c399a405e432f818e61b17b9 100644 GIT binary patch literal 2823 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 VBU01<;(}=nVq@uGK{CI3`ybYCRIUI3 literal 3144 zcmdUy`9Dv>%#&Jt}5<3w;m5Ck(d zF|>xD12AxG&T$Crmt(4afbO6_%G8Dfw1*rRJUBn>YjVvWf_Pl_H`MQk2%Hke;ET;U0_&2D<#HoCt6^MM;ep4o~KbIV3GDZT+Qt z{|+-@1Q;XMALsR@2rm* zV=%|JwzpY{j#gF??d>KXoJzyqwUH3y(Y=`U(NLb`mW zYw{~tou9qE$rYb(oU<9mt&i9@1S_Ag$WWTWde?~72Q9XiyR|9dwgNIb-JL%8 zvfR6O&%XMu2nvO2nBzI78FjXa$p>s+p6N8OwG~uD5Xg0>1EnJ`>+T2`CyKAGoZ!Tw z1X?t_hfhKnGEv86QZd~;H!n|CUATT4qxN%6tqQgLx{dJhb}ez(=^)O->>5O3Yg}%f+1`RSCofFX)vH&D%JE;N5rkG+ zbbUpIHPlWoYg!N)DtC+ZAUT9=%@(kh78e%sLVrKAO9Z!S-1{|EbIwZ1)#KHx+Zr!! z{meK0IX1Q^(m^H*HM%S=mj#C9=H^b-(um7qi46nlYHAyO32Taal60UrY(J^0iUS&K z2w5)FnIXSC3;c%E@$~dO7+yspZ8jdN8B(BAN}kCWC*Z$f{zkp*aT*+AJTUk0C~RQ< z?XVkJOr4mRnA+W5To)m?w=ac^qfJbbHa3F&>PK8iAt53A3;v*9=XYJl*e!(L7;YUX z)^hT3lE8}XJA0Pc=7_pFP3Y5W^Yr&#R7D_@E$wbQN5}ZAEU}ihHaDOdJc00abD8G1 zFnr-o+txLL%z`rtn|%O<0b2%(DmC;sipdqfo%7jGSJj?L+vwRCYwsHjj$NlhK^ zJU7+?-~vH%mx(J{HRa{-%*;$-F|igfUCO#DDz8UUPL3UjeqYS31W{L#Lz$+JuP-ly z!FaSdp6X^`U~v8s^E{9~j%aRQfjJx#6Vpwh2>Onsu8Tn6^401~0lgFZ)}$#qKM_%N z--pK;yHZ1E=VM~ru~gP1$kNs}W@6&z6pc2yNqcD=9DKgYLBZwWpNr?S(JupKq@`1~ z*y|P)YKA8Q-}TPkP(v8+FrfMo?(~l6Wg6LSZ+8bttE{Ln+Nm~hauVa?<6D}qBu|vL ziPz6Pj^FL;>w8sE!Kd|L{?jj#7a(Oh<{O`lo!unG(PveQM%LXs2w4!d2WeS79xIyS z!ouPBjm9w9KQjo@IZo7TY>s+0&yk=I2|oF8FJ=amTU()n#bhdp?HE>*09(IlQV$ z&0an&yi`F-iUpvEL?R7*#D(hl8v_&y96g#-SjeHHqeEP>w6U40q`|MevCy}-7rv|U zf?Rv1?H?lNFYlpK&t;?K5C}x+t!=}- z5Rk8-g*v+8aXC3RKxSUJ_MaAhq=n*qIo}60Bj{(DM06xmU4HbDTpp_fmy+7 zv4aSD%+7PDs;0D55#$Orb@iOQJl4j>#sT0IZgFk=#dtx&h4p^B>(L|L##pQ-lDTAX zcckv9h=_<%rUmqS)d}V2rwqQ#RpW)<{D5**O^sXUbM=jd`bA48r}<47cYj@Ot~7It zUbdfc`#q!kJukYtN-4TD2zT$sd23E?37_bJVVYxL2lN0XnMB=3%nv} z?~&7{rlvPFUg!kMjNSLu%tm@`Y`Yu0qHCzDn_@8e1-r!1h2*uhHRVt|{^8Cl^=V4V zR3^I~*P+MSf7@l;M$^B4H@jBpP5>o?$?e;;43gd20)vs7pMRWeca+7%!~`!OAb@Wk z7xq_xCpU(!o87-(K|3cqilr-DtMShEP(%3DI=PSpFQEW;=*GGcB z-cSmjOFMgAQC3!#xpt6Eoxl-hm~E2UF^vih)tY~xHPe+HAIC43&`~FId5gY^1$MFb z6$1}9?W~D@X>Nw|^Rqtw?Aw1q;{^;PE)EzBR!GH9MifL`NJ0?f7hC1vKj|*m!*ptyMB5n|PBaL*faagG0UsFEL;Le}b)mB~ z138Zf%Io?2FRSaCqYNY5JS1~PDT%tf__B{%oX*b9-LnBEXta^7EhTXKx^dh|rT;56 j{j&d;>eK&MKJT)JjTLCb@*9)DuK;9v5p7tCx)J#wnY-od diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_23.svg b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_23.svg index 9d57faac5f18..09dd81f56563 100644 --- a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_23.svg +++ b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_23.svg @@ -1,12 +1,23 @@ - - + + + + + + 2025-07-24T15:42:33.031781 + image/svg+xml + + + Matplotlib v3.11.0.dev1119+gc6e6904896.d20250724, https://matplotlib.org/ + + + + + - + @@ -15,297 +26,317 @@ L 378 54 L 378 0 L 0 0 z -" style="fill:#ffffff;"/> +" style="fill: #ffffff"/> - - + + - + - - - + - + - - + - - - - + - - - - - - - - - - - - - - - - - - - - - +" transform="scale(0.015625)"/> + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_21.svg b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_21.svg index 90f9b2cec969..b6236288603d 100644 --- a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_21.svg +++ b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_21.svg @@ -1,12 +1,23 @@ - - + + + + + + 2025-07-24T15:42:40.551077 + image/svg+xml + + + Matplotlib v3.11.0.dev1119+gc6e6904896.d20250724, https://matplotlib.org/ + + + + + - + @@ -15,437 +26,467 @@ L 378 54 L 378 0 L 0 0 z -" style="fill:#ffffff;"/> +" style="fill: #ffffff"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_23.png b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_23.png index d6802f84bfda1b1eb62f0b43e1655f44b1b690b2..5a615d92e166a98248600a46f67c6770f06c47e8 100644 GIT binary patch literal 2822 zcmd6p`8(VB7RO^u+bPql_M(`nQn7>}TKh$*rKr7Ci6wTG*q5kqi*}~fs#K*7s+G3Z z#F`cr%ycTY;@V;jYESGDl;VDRf4I+c|AG75AHLu3=lMM6`&rI;z0WznU$eh*Newz}*Df&6d^jBS594&L0mwO!zIJ=)@Wv@#wV)sdGtB7v`s>sfEzIsHLO!OHg!lc$B_|M%aJ; zhhZZFHO_mI&VoHohFjf;f5qZK_?Lbzw8|6YG_dR(;<~Tnj?A8gnf(B_NK4mhU!h|(p$UMOuw8@ z`5gkX?LxU7R(L-%Pl4U7%<&`*rl5SZS5>^R?$J~fYk_;1SMvwTU?D0x18xZpr0|mz z=NJT%l6=C99|EZ~3j%X)KLOvg2)yD0KKWG#OsJ*-H+iS`f?@e-X<#k>KQ+FTsf!s` zW<(5(j~lY1nB_MVz<6kAJDCH|YicsCpTLNViRJCEB=6)K#C1fRb#-%l#B)l4n+LVj zZMP|8DyykoRaaLx4IQE)RT&YrXvQOM!#lyxugvcajE$Au#MJwj6Myi|I4!M7RYx|s zBqb&7Es`_u3}t6$E5l&+OG`@&D{8w?pPSp5DKIzt2Jv`8qG}ECPXe7*Dy9Dd&pEH~FH`2%kTHR8&$bt*pG3e83|P z(sAp5oIr$)*7}6rMS0!4nVX~GMcv(vPrrAM)4-wjYxfwEx3{;2_ral-x((J`;^XV6 z4Qv(q*ZEx29r5MKX0MTv5t3m-^*H7|reR5ma`QdR+kUKp%?_D}VIuK#K7fTfs_{CE zXsf8Gh@U|sk)w?XHGTd4;*yd@<>hKpXuphqwzQ;3OH1p-t$NPQ%>{SnsPl0p#Ke@L zQ0o&yaxM`O5xs|j+Stg*YGAds@_w?kq{Mn>JStOPU;obbrO4Ue2v45GtWTLH9q^d! z)(yPt(&V~uWVr(4-O10z8k~Tl*-nIPn!V-LO4SdU^UR4Z}9Z-8jyaA4)(C*^mvfC;bKgFjV+;=`|bJn_f)W0)FirDE-%FVsv8h3QCle@SW z)ZgDf<4(-V67H2bgN^TlRu3kpT8 zt<^zBwkzTp^WFJnhllv@!Y-v27Mj%rd?t*oY?pPmw@VGu_>U~oj{n^$AmA-vKdC|) zzqfQ@W#WVT0||AfprGROOX-rR-cF6?a&c9+;;Je~pl_h$3m2{=gK)LvITzW}*hZrX zWHPzulEm^6c5!vp4NzfYYb!1-twQWnBzC@e{P;BT_QofI&KJ2<07AVd%&x$Af=xP} zwDC#O#=(L4K%=P`ND7(68^mpo1m0U=PE4p*Fw0b_b?2srd#eC5&Zr7^P&)W%spzn< zu%Vb#dg=t)yHP<0LhytUCDc96XEMnAC;qmpyEV74upeT4xQm`drGg-U?W_eFPDX@t zXRIs@u%V$GDF&?h+otx=mCKiv4Glf(>+9JZj&pKy^WOeGLQ`{U%(g0Iu+)cn-PxHe zgQ+tW78Z76>U_^;1-CbU2ZEa2h_8*`@CA6;N6mMg#M%4#y$0&W@2|X1L7OwqojW%h z`yrJjY7O#CHC1NW$WvDHg|Ku=e~#LXbBqWVPtS6@TwSQ5q6HI`Nb&mI%b26lXr&a2 z(E^M7JZ|h=7~Vu)KiZ1N<2AXTGS_=V24Jp?(rokd^8;zd;HI;)vo-qe1T%B<7=ZNm zWF;t}b}c4`mH{_q<`M{n)z#H08V2vMlXBO9KzB;Z%dY~V;2BNdHf__>(v%U17?+rm zl9EwcC=r*Kc)$h`>)G4;$B}>;f4GOQZ(%@pUdcn5i=}ir(v}G08NA5Pr+m)6$jQYv zImX4kk6mL?0F<6kD0E>Uu9iE*WQO*?wbM`7e7(IgR`iv-5ZaLq^{9{Z@0BZaqc~Yv z{ida@O-tOtqhBcy(*dy8*n(>*7`@GvZf}K ztgI{!M1OG{4wkSC_-14T~hSI$-*KXFy4v_ZmAR39}g0@uCW8B}E!2P$;C(g<5-4Ijs|Efv)?_Os`DUfA_Oys00@HL+_?mbj42)vB=*f5 zd)7Mm`8*@i;@g@$Y;judXwW4}OBpU7k)RnZDk*Wb$-&b4LP_?VyffQ&WV1aYNn-$x zJiwAqXS=x7ek8w@c!IcE&Mx$Kn@VILW zy%BYAdL@vPL&!DMN23+cXmnS|tT$nwXdSMBXdwE@%kj6Vws3T74-+FM$%jqMoOeXCsVIqde^ zL))~fs(dOHe)*~ThTZhInKd_e=5||;$yu+tfl?@H7i`~p7`?t;?xDkGyj>bM5JOE7P(Nbg}IrTiNC+j>({TZT)X!D zz}`=todR3Nj*y9+-NDSPEWhookeRjng)d(!Dl4~6p33Tq@1s~L>FP?_79Y4sMm^|t zZ%LLjTwLikE&vW3KIs!@Nf9erU}m546KqeGi^Wqf1_l~PYdRJYy9~0#AHwC^8XF;( zTeniPvyYJr%dR zGW~zFwCpz8U`f&{D{pRZZM?BpuOYG}Fc{1mk3N;SxVRcGtLLYpwdm`DmK4d(46Tb7 zF6_}mCUw(~SE6IAjQLU;8XBBo>~0fM%+Pp!s8E!wQP|Ke#+1LgwRL)7VPVbS?A)AC z6hPJ7!a}NISRG=$ZAYz~swyfngUqg8O?B5pK1xV`&1j6EL9)0!e zWtS5&uEXVS64KHtdt%Rmq#3(MzfB@ZNlRZcGb4diHZwJiiHncFL?qI-)+fn*9Gt&@ zx$EuQmJX9%K5lL=KWFM+{?VPQrDj)_-kNwY(YE-HgoFguP$znr!vOV$7IehGz*brd zub!HkS{}{|6i`r7QbI2eGI4l(4zwS*8#Eq5fl^jiiHDHL<(XI4=ZF|(HMPr7NB;Rl z*WUc|<<3ol)M0EBDK9$adSqn7jyIN;$?f-XxHKrGyj+Jn!tSF?@fI3_j00;O%e@9Q z1r%~4w`)Vgms`&m8R735WRXaZlad~h77h-W@W$^AI{9iJ!ecTykz^JWRITn%jJ}n3jdZw3iQv{psZn zCC;B{G)URBva&MO(BJW1AtAM)rTO`$0Kj%JE{E|>DC+&@Y%!-U76wlMv1yl&94nxB zdV6@hf>OBSq22Yiwzfa?vyRDV>s{%ouvgc)^F{U$3KdA5VzEegDtFU^k z^`8Kw4at-39Xp;D_#3d63_QZRlVO4Z}H1=3rY}8)5dFDiDAWM%o)61_r>NS5Tnz zV&r3;8dnDT`t@siSr$;E!-}di-eWZgF==&^kdWW1yhr0RGm&6tah&+*bJM9VX;^* zXf!DXgK>&50il(Y-rj89L#{g$`pdcVsYX#r$*Mh*9?sM6g429`eW~qSWw5`!;^Kc- zjry!O`062Vo{&k&%mlPei0bb4taJf_ARrHe?$@I>Ha0rCyW1NZqYO{8rl&)l77Bsn zqt(^-g4OWd{O~S!JyYu70Kw z{JDStUH^c9Ge%!wP;+xLDIsCm-q4>VyaxuOdIY`*pPQXMjT#&n5L}EHb$Mc2+!_lv zBDJ+$SY2BaBKn|Xo<4mV#mrn(MxzA{1AjKo_7_va46y~h6VWhKBjDBJygWtjW=~HF z?|O7YnOFa7oAsX+-6t@Z+1|-!xN+R@-L|hUFYkISE+TT))AKkIi9AgY>0=Y~>GbW) zGEkZtdrWpuaNaFkxOPnfFbalfDj*xp+N3>s5|fZ1DtqR>6ray`cXw|DS#mnUEka*# zo(I6stE)pc{IhKcCS3fi+pVCeD3Ep1_m^QoQIYVzhr13N+%>`BBqMn9C!e1QmDbnS zAEJ4rF(>Ql>Q3nC5pDAFK#7!26iP};nqjk>CMFa-y}XvXPBNX>X8Um{-g2i_vrn~> zhK9I&*rLF%1tu9t<+HBa5P_L-<;s<)?d=GAb!kvs@+vAMtxhlP1|%_*l9CDz zM?@G!Y)l;3*i%UM3J&3`g$Ue8E*uih)-W8_#-nvx)%1sczo;$9Vot=&QvLCTATTDHo zt=$_g3+>2c&pG%8BMneVK*8JFyN|>CBLD`2DT5FASI1gQ-93|u{sdu zmoE87=C&O6eXj`WU_K~VezlIAIuLa-|Jj+)DyahpHh#Xk&I1fdY;qK zV2g;}MQ6I`j$QW-e?uyuCA0@9XE%_0N#6~s| zt*N;$;K%2s(Q}o7!ND?jzC4c}zI%a4T(!y7?d{s>1AWYHMDq2o;cyHxTn@84u{CBo zCv@Mt!1>H3T_sUGXc&p-zOsomlgWlVtBsH2cai}VO)L)Ar_a1-inV+ApJ_@$ H&N2T6^r6IS diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_23.svg b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_23.svg index 77ded780c3f1..4d7fdcc30954 100644 --- a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_23.svg +++ b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_23.svg @@ -1,12 +1,23 @@ - - + + + + + + 2025-07-24T15:42:40.658346 + image/svg+xml + + + Matplotlib v3.11.0.dev1119+gc6e6904896.d20250724, https://matplotlib.org/ + + + + + - + @@ -15,268 +26,288 @@ L 378 54 L 378 0 L 0 0 z -" style="fill:#ffffff;"/> +" style="fill: #ffffff"/> - - + + - + - - - + - - + - - + - - + - + - - - - - - - - - - - - - - - - - - - - - +" transform="scale(0.015625)"/> + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_27.svg b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_27.svg index 7a7b7ec42c25..e73b1c5e872b 100644 --- a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_27.svg +++ b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_27.svg @@ -1,12 +1,23 @@ - - + + + + + + 2025-07-24T15:42:39.585869 + image/svg+xml + + + Matplotlib v3.11.0.dev1119+gc6e6904896.d20250724, https://matplotlib.org/ + + + + + - + @@ -15,190 +26,202 @@ L 378 54 L 378 0 L 0 0 z -" style="fill:#ffffff;"/> +" style="fill: #ffffff"/> - - + + - - + - - - + - - - + - - - - - - - - - - - - - - +" transform="scale(0.015625)"/> + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_46.svg b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_46.svg index 0846b552246a..ca0439485b08 100644 --- a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_46.svg +++ b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_46.svg @@ -1,12 +1,23 @@ - - + + + + + + 2025-07-24T15:42:40.642097 + image/svg+xml + + + Matplotlib v3.11.0.dev1119+gc6e6904896.d20250724, https://matplotlib.org/ + + + + + - + @@ -15,115 +26,121 @@ L 378 54 L 378 0 L 0 0 z -" style="fill:#ffffff;"/> +" style="fill: #ffffff"/> - - + + - - - + - - - - - - +M 1381 2969 +Q 1594 3256 1914 3420 +Q 2234 3584 2584 3584 +Q 3122 3584 3439 3221 +Q 3756 2859 3756 2241 +Q 3756 1734 3570 1259 +Q 3384 784 3041 416 +Q 2816 172 2522 40 +Q 2228 -91 1906 -91 +Q 1566 -91 1316 65 +Q 1066 222 909 531 +L 806 0 +L 231 0 +L 1178 4863 +L 1753 4863 +L 1381 2969 +z +" transform="scale(0.015625)"/> + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_49.svg b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_49.svg index 24db824fd37c..8287a2338258 100644 --- a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_49.svg +++ b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_49.svg @@ -1,12 +1,23 @@ - - + + + + + + 2025-07-24T15:42:40.896681 + image/svg+xml + + + Matplotlib v3.11.0.dev1119+gc6e6904896.d20250724, https://matplotlib.org/ + + + + + - + @@ -15,103 +26,109 @@ L 378 54 L 378 0 L 0 0 z -" style="fill:#ffffff;"/> +" style="fill: #ffffff"/> - - - - + + - + - - - - - - - - - - +" transform="scale(0.015625)"/> + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_60.svg b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_60.svg index 189491319c10..0bbef213526f 100644 --- a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_60.svg +++ b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_60.svg @@ -1,12 +1,23 @@ - - + + + + + + 2025-07-24T15:42:39.508765 + image/svg+xml + + + Matplotlib v3.11.0.dev1119+gc6e6904896.d20250724, https://matplotlib.org/ + + + + + - + @@ -15,209 +26,220 @@ L 378 54 L 378 0 L 0 0 z -" style="fill:#ffffff;"/> +" style="fill: #ffffff"/> - - + + - + + - + - - - + - - + - - - - - - - - - - - - - +M 1959 2075 +Q 2384 2075 2632 2365 +Q 2881 2656 2881 3163 +Q 2881 3666 2632 3958 +Q 2384 4250 1959 4250 +Q 1534 4250 1286 3958 +Q 1038 3666 1038 3163 +Q 1038 2656 1286 2365 +Q 1534 2075 1959 2075 +z +" transform="scale(0.015625)"/> + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_21.svg b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_21.svg index e0721c9e47a4..3e7c6dc1c42c 100644 --- a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_21.svg +++ b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_21.svg @@ -1,12 +1,23 @@ - - + + + + + + 2025-07-24T15:42:40.642033 + image/svg+xml + + + Matplotlib v3.11.0.dev1119+gc6e6904896.d20250724, https://matplotlib.org/ + + + + + - + @@ -15,493 +26,524 @@ L 378 54 L 378 0 L 0 0 z -" style="fill:#ffffff;"/> +" style="fill: #ffffff"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_23.png b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_23.png index b405dd438309c2f44abc7e9ee3bbf115dd84c202..c8bae48383aa5503ea433fd5f57972daf62d20ef 100644 GIT binary patch literal 2853 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 F@L%p)Jz)R< literal 3125 zcmd5;`9D-`8$ZNEwkSP}HL?`tiLs1jh_UyWvJ<04sE3KjHZt~oPgEFDqQpG1jxfoV zD5jAiGb4sELS$)VeNXS_{R7_L-uM2TbMA9K*E#pO?(4d~-|L%t!Ol|X5cCiL07BMQ zNP7U_76R{W`5@qREvaD;oOpswtsVKm5yj`70zUHxTDb)SfXJ2KCs&nmhi9Y(mwk5LzANFQ@JB3JXJM&E@6X7cX86Bzo+RNnZJyuPt<4!Ktc z?|p^akM?J@NqR;7==r^>>Bdef##d12XoHUb7yyj5W1A)JNEU#RdYPqxjc~>+SO83@?@q6{)yzZqIN%(nwQNGw0ExZ=Z*5Hcrp<-*auo$hcp+6vQ4r zE|F>B|D}PSw6~@9Wn!W(a^ogDq&23u{R{btWzgoz74}Bt42yO3=i;~xw#mIlFYqg{ zwY{C2lM_Ruc_btz{xzndt}aL<5|4~#Hj-*<&%ktbnQs#X_(Vkdb~%&T>+2!sA8KBw z{h(oV5xeUS(#Fx!TD~6>#{GLMYzv3Ux$=oLR@M(TRM@2;iw~39dt@#tOmB0T>b#$9663K{MIL#%mQ?%6DcNhF+ z&*eYgfj%p#tDhHy#E(#^*l#-@jw{&P+bbMDeq2ma@}%-TYg02br88&jqW6ByogM0% zz1?4Kp5E=PY3=U*C1Gy<*7tAUZh{+48!U!96rAxq6+HJ*yvAAWSo(EZU9AUELBx3H zA0Q_of#;z?SZ#NA_q*OqDc%^5j;Qha-nck!E_u-B+e1biKA?YaFh4eyi_l&*0xz-a z@9!4{G<`oxKh*Ng8hoTZ;EOK5+&ye^u7*HB{q{*iW2m~FNOS|l zoxw}DiQWsNHQXkM{heUcHoIs$j#r@jW@B2)yOouHQZ{i8LLoE|2reH>3{(^pc6WF4 z^70fw5PzDSG-gT5;dbhP92c*CD)>8nC3Bm9cvV-Fe4)) zHH)%LtE;P99lMqt!4emRhkY*w%g={aXTiDTj*pMWH?_4H zk{31*`|cbSWn~L|1WR&ggI(llW)_cHaxLZN(ZmD<)VO%s+NJ|JB?e(x@V-1H+Y@m3 zxNp{@M^G+#85tR7t&*muz0NI$;nX8S$;48qt)E|2+varok)Q3(rlxU*>%(SY`6*Qg<)U)RV&i0QB|LrHe5DJbCoMek z`7;-=x3h*?oM;vS@qo}>|2#UXprUdxH8u5t5mslK$qf22ZSK($*y&6A@!h(`S)Tc< zvJ&g5aj8krz2+EL;L&}ul9HWu*ZLk)<}aYpS+8Dc=HI_Rm8r{kldEV60F`zn(BJ^y zA-p*bXMF6m`_s14i_lC691d62(CBNuvv9%9jlcS{{uPp%OYP(OddjjSnyzDLm~lkK zPF_*5Ypx?fT+R7%c(?=@3~(#hULYqox2!dweB#)@w*tZ+EHMEmCnr^Pb)=`KjI?kv zRVW9z;Ov|I}5h4g&zl%VSLeQXsR$pT5-eW-0Vq zPnvjDZEde-7=5;R$P2g23$!q^45H9l&`i9sh>*}Zx!{b4vP?!#L zgiO`3l?8r39FH2in0kDCz%g!B$>Fhk$-P;@4C}S9Y7^I^lmT(AdYb%nl z(2nJBuk3!gn(tiQ^TMfmcw{7j!C=HtsiUKid;PE}X6`8kMa8-s6lHaV9`eYB{!~6R6 zG9pouw7+LySBl7NZPkD2R_{aGXl!b_I`uY@+StrspdWnjfoW@(y?!mFQzV4teD49* zO`jbo%%0%fcR|O}F_sn<5X8=k+2WT*0T8DtSy>QZsGYy3r-!|;5Dzw$AIv`T_;_k1 zKJw5cZr>;^J>7^zDsy)MGgt3BRQ~ue;9M;Z9=yD~Em6N#@04(n1FqZO>N?Sy=s(%v z30T?Kq)k#$#d^m<*m9cyDP+HV&)1>W_V#(8b0|97LD;U6;wy+l>G0@d931W;&CMge z$%TLAnqOR$4igs5C6M;qK_)fa1yVXM=UB={cn@mTjr(((yzS~zQd9f;tyWtors#vR zwY4?APn^rj$|_}MZZ5rR>Oo*z{6P_$+qYlM=_)az*8Yl^uP8)5A*T$?u8z2=A0ucz z)W7p0zo1|%qtc!8(O?-|e`Tb`^R=^$jm_pd53f-sAI_@8>i)p2sjsifVyFR_=IrMV zm3Hr2o`h{LY($<=R))Y_!oqZ;x0iH5g(iRIj4&jA%A%mQ+o%3_)D_}3H^UQ>lf5{u z*@!LG=$#*yJF5d4=p_*1Y&JUvERw5N6+lX6HIr`AzkZdsE74D6v;DezdOSIisTdVd z_=OB?v5Icx6cn(CjOJT%gFag5@F`w@dg~oA7mK6Cpj>1ZR8ZyvK}DvBK*$;y8R^~K zf`KhFjm2U~brdF~aQA`AviW6c^cKI@-3{?bEVhg?pHp0%vADQc^plh&cJcCmL?=`K h|4(%OSDJW7 - - + + + + + + 2025-07-24T15:42:40.725227 + image/svg+xml + + + Matplotlib v3.11.0.dev1119+gc6e6904896.d20250724, https://matplotlib.org/ + + + + + - + @@ -15,278 +26,298 @@ L 378 54 L 378 0 L 0 0 z -" style="fill:#ffffff;"/> +" style="fill: #ffffff"/> - - + + - + - - - + - + - + - - - + - - + - - - - - - - - - - - - - - - - - - - - - +M 3022 2063 +Q 3016 2534 2758 2815 +Q 2500 3097 2075 3097 +Q 1594 3097 1305 2825 +Q 1016 2553 972 2059 +L 3022 2063 +z +" transform="scale(0.015625)"/> + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_60.svg b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_60.svg index a4fb4be582a4..cd7dfc34183b 100644 --- a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_60.svg +++ b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_60.svg @@ -1,12 +1,23 @@ - - + + + + + + 2025-07-24T15:42:42.172241 + image/svg+xml + + + Matplotlib v3.11.0.dev1119+gc6e6904896.d20250724, https://matplotlib.org/ + + + + + - + @@ -15,223 +26,234 @@ L 378 54 L 378 0 L 0 0 z -" style="fill:#ffffff;"/> +" style="fill: #ffffff"/> - - + + - + - + - - - + - - + - + - - - - - - - - - - - - +" transform="scale(0.015625)"/> + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_21.svg b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_21.svg index 4623754e2963..045cc829e0cf 100644 --- a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_21.svg +++ b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_21.svg @@ -1,12 +1,23 @@ - - + + + + + + 2025-07-24T15:42:38.874726 + image/svg+xml + + + Matplotlib v3.11.0.dev1119+gc6e6904896.d20250724, https://matplotlib.org/ + + + + + - + @@ -15,531 +26,562 @@ L 378 54 L 378 0 L 0 0 z -" style="fill:#ffffff;"/> +" style="fill: #ffffff"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_23.png b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_23.png index 1923648b80a3d4e1b4098614faa2b8b4fd08c3ad..d0233a4ee7a0136ab93656d81e101a97dfb49807 100644 GIT binary patch literal 2826 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 V?H43i=Rn&AF*iots5ZQv@E=cIIIsW! literal 3135 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 he?&|Fi#1P2Z4VcyJD7HQfj - - + + + + + + 2025-07-24T15:42:38.959357 + image/svg+xml + + + Matplotlib v3.11.0.dev1119+gc6e6904896.d20250724, https://matplotlib.org/ + + + + + - + @@ -15,284 +26,304 @@ L 378 54 L 378 0 L 0 0 z -" style="fill:#ffffff;"/> +" style="fill: #ffffff"/> - - + + - + - - - + - - + - - + - - - + - - - - - - - - - - - - - - - - - - - - - +" transform="scale(0.015625)"/> + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_21.svg b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_21.svg index d61317816ad6..c3dd8722b044 100644 --- a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_21.svg +++ b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_21.svg @@ -1,12 +1,23 @@ - - + + + + + + 2025-07-24T15:42:38.040182 + image/svg+xml + + + Matplotlib v3.11.0.dev1119+gc6e6904896.d20250724, https://matplotlib.org/ + + + + + - + @@ -15,435 +26,466 @@ L 378 54 L 378 0 L 0 0 z -" style="fill:#ffffff;"/> +" style="fill: #ffffff"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_23.png b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_23.png index a86119004e62ecf23497cd90cf563911bc3679d9..6f816c2ee723ac761b49e407d6a8eea1e088d8df 100644 GIT binary patch literal 2808 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 CAyDc7 literal 3099 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 B_&ERo diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_23.svg b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_23.svg index 4e129aa6c87d..50bdb38d37b1 100644 --- a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_23.svg +++ b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_23.svg @@ -1,12 +1,23 @@ - - + + + + + + 2025-07-24T15:42:38.119948 + image/svg+xml + + + Matplotlib v3.11.0.dev1119+gc6e6904896.d20250724, https://matplotlib.org/ + + + + + - + @@ -15,269 +26,289 @@ L 378 54 L 378 0 L 0 0 z -" style="fill:#ffffff;"/> +" style="fill: #ffffff"/> - - + + - + - - - + - + - - + - - - + - - + - - - - - - - - - - - - - - - - - - - - +" transform="scale(0.015625)"/> + + + + + + + + + + + + + + + + + + + + + + + + +