1616_log = logging .getLogger (__name__ )
1717
1818
19- @functools .lru_cache (1 )
20- def _get_adobe_standard_encoding ():
21- enc_name = dviread .find_tex_file ('8a.enc' )
22- enc = dviread .Encoding (enc_name )
23- return {c : i for i , c in enumerate (enc .encoding )}
24-
25-
2619class TextToPath (object ):
2720 """A class that converts strings to paths."""
2821
@@ -291,12 +284,8 @@ def get_texmanager(self):
291284
292285 def get_glyphs_tex (self , prop , s , glyph_map = None ,
293286 return_new_glyphs_only = False ):
294- """
295- Process string *s* with usetex and convert it to a (vertices, codes)
296- pair.
297- """
298-
299- # Implementation mostly borrowed from pdf backend.
287+ """Convert the string *s* to vertices and codes using usetex mode."""
288+ # Mostly borrowed from pdf backend.
300289
301290 dvifile = self .get_texmanager ().make_dvi (s , self .FONT_SCALE )
302291 with dviread .Dvi (dvifile , self .DPI ) as dvi :
@@ -321,21 +310,20 @@ def get_glyphs_tex(self, prop, s, glyph_map=None,
321310 if char_id not in glyph_map :
322311 font .clear ()
323312 font .set_size (self .FONT_SCALE , self .DPI )
324- if enc :
325- charcode = enc .get (glyph , None )
326- else :
327- charcode = glyph
328-
329- ft2font_flag = LOAD_TARGET_LIGHT
330- if charcode is not None :
331- glyph0 = font .load_char (charcode , flags = ft2font_flag )
313+ # See comments in _get_ps_font_and_encoding.
314+ if enc is not None :
315+ if glyph not in enc :
316+ _log .warning (
317+ "The glyph %d of font %s cannot be converted with "
318+ "the encoding; glyph may be wrong." ,
319+ glyph , font .fname )
320+ font .load_char (glyph , flags = LOAD_TARGET_LIGHT )
321+ else :
322+ index = font .get_name_index (enc [glyph ])
323+ font .load_glyph (index , flags = LOAD_TARGET_LIGHT )
332324 else :
333- _log .warning ("The glyph (%d) of font (%s) cannot be "
334- "converted with the encoding. Glyph may "
335- "be wrong." , glyph , font .fname )
336-
337- glyph0 = font .load_char (glyph , flags = ft2font_flag )
338-
325+ index = glyph
326+ font .load_char (index , flags = LOAD_TARGET_LIGHT )
339327 glyph_map_new [char_id ] = font .get_path ()
340328
341329 glyph_ids .append (char_id )
@@ -363,31 +351,41 @@ def _get_ps_font_and_encoding(texname):
363351 font_bunch = tex_font_map [texname ]
364352 if font_bunch .filename is None :
365353 raise ValueError (
366- ("No usable font file found for %s (%s). "
367- "The font may lack a Type-1 version." )
368- % (font_bunch .psname , texname ))
354+ f"No usable font file found for { font_bunch .psname } "
355+ f"({ texname } ). The font may lack a Type-1 version." )
369356
370357 font = get_font (font_bunch .filename )
371358
372- for charmap_name , charmap_code in [("ADOBE_CUSTOM" , 1094992451 ),
373- ("ADOBE_STANDARD" , 1094995778 )]:
374- try :
375- font .select_charmap (charmap_code )
376- except (ValueError , RuntimeError ):
377- pass
378- else :
379- break
359+ if font_bunch .encoding :
360+ # If psfonts.map specifies an encoding, use it: it gives us a
361+ # mapping of glyph indices to Adobe glyph names; use it to convert
362+ # dvi indices to glyph names and use the FreeType-synthesized
363+ # unicode charmap to convert glyph names to glyph indices (with
364+ # FT_Get_Name_Index/get_name_index), and load the glyph using
365+ # FT_Load_Glyph/load_glyph. (That charmap has a coverage at least
366+ # as good as, and possibly better than, the native charmaps.)
367+ enc = dviread ._parse_enc (font_bunch .encoding )
380368 else :
381- charmap_name = ""
382- _log .warning ("No supported encoding in font (%s)." ,
383- font_bunch .filename )
384-
385- if charmap_name == "ADOBE_STANDARD" and font_bunch .encoding :
386- enc0 = dviread .Encoding (font_bunch .encoding )
387- enc = {i : _get_adobe_standard_encoding ().get (c , None )
388- for i , c in enumerate (enc0 .encoding )}
389- else :
390- enc = {}
369+ # If psfonts.map specifies no encoding, the indices directly
370+ # map to the font's "native" charmap; so don't use the
371+ # FreeType-synthesized charmap but the native ones (we can't
372+ # directly identify it but it's typically an Adobe charmap), and
373+ # directly load the dvi glyph indices using FT_Load_Char/load_char.
374+ for charmap_name , charmap_code in [
375+ ("ADOBE_CUSTOM" , 1094992451 ),
376+ ("ADOBE_STANDARD" , 1094995778 ),
377+ ]:
378+ try :
379+ font .select_charmap (charmap_code )
380+ except (ValueError , RuntimeError ):
381+ pass
382+ else :
383+ break
384+ else :
385+ charmap_name = ""
386+ _log .warning ("No supported encoding in font (%s)." ,
387+ font_bunch .filename )
388+ enc = None
391389
392390 return font , enc
393391
0 commit comments