16
16
_log = logging .getLogger (__name__ )
17
17
18
18
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
-
26
19
class TextToPath (object ):
27
20
"""A class that converts strings to paths."""
28
21
@@ -291,12 +284,8 @@ def get_texmanager(self):
291
284
292
285
def get_glyphs_tex (self , prop , s , glyph_map = None ,
293
286
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.
300
289
301
290
dvifile = self .get_texmanager ().make_dvi (s , self .FONT_SCALE )
302
291
with dviread .Dvi (dvifile , self .DPI ) as dvi :
@@ -321,21 +310,20 @@ def get_glyphs_tex(self, prop, s, glyph_map=None,
321
310
if char_id not in glyph_map :
322
311
font .clear ()
323
312
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 )
332
324
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 )
339
327
glyph_map_new [char_id ] = font .get_path ()
340
328
341
329
glyph_ids .append (char_id )
<
1241
tr class="diff-line-row">@@ -363,31 +351,41 @@ def _get_ps_font_and_encoding(texname):
363
351
font_bunch = tex_font_map [texname ]
364
352
if font_bunch .filename is None :
365
353
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." )
369
356
370
357
font = get_font (font_bunch .filename )
371
358
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 )
380
368
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
391
389
392
390
return font , enc
393
391
0 commit comments