@@ -1371,8 +1371,13 @@ def _findfont_cached(self, prop, fontext, directory, fallback_to_default,
1371
1371
if rebuild_if_missing :
1372
1372
_log .info (
1373
1373
'findfont: Found a missing font file. Rebuilding cache.' )
1374
- _rebuild ()
1375
- return fontManager .findfont (
1374
+ new_fm = _load_fontmanager (try_read_cache = False )
1375
+ # Replace self by the new fontmanager, because users may have
1376
+ # a reference to this specific instance.
1377
+ # TODO: _load_fontmanager should really be (used by) a method
1378
+ # modifying the instance in place.
1379
+ vars (self ).update (vars (new_fm ))
1380
+ return self .findfont (
1376
1381
prop , fontext , directory , rebuild_if_missing = False )
1377
1382
else :
1378
1383
raise ValueError ("No valid font could be found" )
@@ -1394,11 +1399,6 @@ def is_opentype_cff_font(filename):
1394
1399
return False
1395
1400
1396
1401
1397
- _fmcache = os .path .join (
1398
- mpl .get_cachedir (), 'fontlist-v{}.json' .format (FontManager .__version__ ))
1399
- fontManager = None
1400
-
1401
-
1402
1402
_get_font = lru_cache (64 )(ft2font .FT2Font )
1403
1403
# FT2Font objects cannot be used across fork()s because they reference the same
1404
1404
# FT_Library object. While invalidating *all* existing FT2Fonts after a fork
@@ -1418,22 +1418,23 @@ def get_font(filename, hinting_factor=None):
1418
1418
_kerning_factor = rcParams ['text.kerning_factor' ])
1419
1419
1420
1420
1421
- def _rebuild ( ):
1422
- global fontManager
1423
- _log . info ( "Generating new fontManager, this may take some time... " )
1424
- fontManager = FontManager ()
1425
- json_dump ( fontManager , _fmcache )
1426
-
1427
-
1428
- try :
1429
- fontManager = json_load ( _fmcache )
1430
- except Exception :
1431
- _rebuild ( )
1432
- else :
1433
- if getattr ( fontManager , '_version' , object ()) ! = FontManager . __version__ :
1434
- _rebuild ( )
1435
- else :
1436
- _log . debug ( "Using fontManager instance from %s" , _fmcache )
1421
+ def _load_fontmanager ( * , try_read_cache = True ):
1422
+ fm_path = Path (
1423
+ mpl . get_cachedir (), f"fontlist-v { FontManager . __version__ } .json " )
1424
+ if try_read_cache :
1425
+ try :
1426
+ fm = json_load ( fm_path )
1427
+ except Exception as exc :
1428
+ pass
1429
+ else :
1430
+ if getattr ( fm , "_version" , object ()) == FontManager . __version__ :
1431
+ _log . debug ( "Using fontManager instance from %s" , fm_path )
1432
+ return fm
1433
+ fm = FontManager ()
1434
+ json_dump ( fm , fm_path )
1435
+ _log . info ( "generated new fontManager" )
1436
+ return fm
1437
1437
1438
1438
1439
+ fontManager = _load_fontmanager ()
1439
1440
findfont = fontManager .findfont
0 commit comments