123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- """
- Common functionality between the PDF and PS backends.
- """
- import functools
- import matplotlib as mpl
- from .. import font_manager, ft2font
- from ..afm import AFM
- from ..backend_bases import RendererBase
- @functools.lru_cache(50)
- def _cached_get_afm_from_fname(fname):
- with open(fname, "rb") as fh:
- return AFM(fh)
- class RendererPDFPSBase(RendererBase):
- # The following attributes must be defined by the subclasses:
- # - _afm_font_dir
- # - _use_afm_rc_name
- def flipy(self):
- # docstring inherited
- return False # y increases from bottom to top.
- def option_scale_image(self):
- # docstring inherited
- return True # PDF and PS support arbitrary image scaling.
- def option_image_nocomposite(self):
- # docstring inherited
- # Decide whether to composite image based on rcParam value.
- return not mpl.rcParams["image.composite_image"]
- def get_canvas_width_height(self):
- # docstring inherited
- return self.width * 72.0, self.height * 72.0
- def get_text_width_height_descent(self, s, prop, ismath):
- # docstring inherited
- if mpl.rcParams["text.usetex"]:
- texmanager = self.get_texmanager()
- fontsize = prop.get_size_in_points()
- w, h, d = texmanager.get_text_width_height_descent(
- s, fontsize, renderer=self)
- return w, h, d
- elif ismath:
- parse = self.mathtext_parser.parse(s, 72, prop)
- return parse.width, parse.height, parse.depth
- elif mpl.rcParams[self._use_afm_rc_name]:
- font = self._get_font_afm(prop)
- l, b, w, h, d = font.get_str_bbox_and_descent(s)
- scale = prop.get_size_in_points() / 1000
- w *= scale
- h *= scale
- d *= scale
- return w, h, d
- else:
- font = self._get_font_ttf(prop)
- font.set_text(s, 0.0, flags=ft2font.LOAD_NO_HINTING)
- w, h = font.get_width_height()
- d = font.get_descent()
- scale = 1 / 64
- w *= scale
- h *= scale
- d *= scale
- return w, h, d
- def _get_font_afm(self, prop):
- fname = (
- font_manager.findfont(
- prop, fontext="afm", directory=self._afm_font_dir)
- or font_manager.findfont(
- "Helvetica", fontext="afm", directory=self._afm_font_dir))
- return _cached_get_afm_from_fname(fname)
- def _get_font_ttf(self, prop):
- fname = font_manager.findfont(prop)
- font = font_manager.get_font(fname)
- font.clear()
- font.set_size(prop.get_size_in_points(), 72)
- return font
|