@@ -261,6 +261,7 @@ def __init__(self, width, height, svgwriter, basename=None):
261261 self ._hatchd = {}
262262 self ._has_gouraud = False
263263 self ._n_gradients = 0
264+ self ._fonts = {}
264265 self .mathtext_parser = MathTextParser ('SVG' )
265266
266267 RendererBase .__init__ (self )
@@ -277,6 +278,7 @@ def __init__(self, width, height, svgwriter, basename=None):
277278 self ._write_default_style ()
278279
279280 def finalize (self ):
281+ self ._write_svgfonts ()
280282 self .writer .close (self ._start_id )
281283
282284 def _write_default_style (self ):
@@ -422,6 +424,40 @@ def _get_clip(self, gc):
422424 self ._clipd [dictkey ] = oid
423425 return oid
424426
427+ def _write_svgfonts (self ):
428+ if not rcParams ['svg.fonttype' ] == 'svgfont' :
429+ return
430+
431+ writer = self .writer
432+ writer .start ('defs' )
433+ for font_fname , chars in self ._fonts .items ():
434+ font = FT2Font (font_fname )
435+ font .set_size (72 , 72 )
436+ sfnt = font .get_sfnt ()
437+ writer .start ('font' , id = sfnt [(1 , 0 , 0 , 4 )])
438+ writer .element (
439+ 'font-face' ,
440+ attrib = {
441+ 'font-family' : font .family_name ,
442+ 'font-style' : font .style_name ,
443+ 'units-per-em' : '72' ,
444+ 'bbox' : ' ' .join (str (x / 64.0 ) for x in font .bbox )})
445+ for char in chars :
446+ glyph = font .load_char (char , flags = LOAD_NO_HINTING )
447+ verts , codes = font .get_path ()
448+ path = Path (verts , codes )
449+ path_data = self ._convert_path (path , None )
450+ # name = font.get_glyph_name(char)
451+ writer .element (
452+ 'glyph' ,
453+ d = path_data ,
454+ attrib = {
455+ # 'glyph-name': name,
456+ 'unicode' : unichr (char ),
457+ 'horiz-adv-x' : str (glyph .linearHoriAdvance / 65536.0 )})
458+ writer .end ('font' )
459+ writer .end ('defs' )
460+
425461 def open_group (self , s , gid = None ):
426462 """
427463 Open a grouping element with label *s*. If *gid* is given, use
@@ -867,6 +903,11 @@ def _draw_text_as_text(self, gc, x, y, s, prop, angle, ismath):
867903 ('rotate' , (- angle ,))])
868904
869905 writer .element ('text' , s , attrib = attrib )
906+
907+ if rcParams ['svg.fonttype' ] == 'svgfont' :
908+ fontset = self ._fonts .setdefault (font .fname , set ())
909+ for c in s :
910+ fontset .add (ord (c ))
870911 else :
871912 writer .comment (s )
872913
@@ -894,11 +935,17 @@ def _draw_text_as_text(self, gc, x, y, s, prop, angle, ismath):
894935 for font , fontsize , thetext , new_x , new_y , metrics in svg_glyphs :
895936 style = generate_css ({
896937 'font-size' : str (fontsize ),
897- 'font-family' : font .family_name })
938+ 'font-family' : font .family_name ,
939+ 'font-style' : font .style_name })
898940 if thetext == 32 :
899941 thetext = 0xa0 # non-breaking space
900942 spans .setdefault (style , []).append ((new_x , - new_y , thetext ))
901943
944+ if rcParams ['svg.fonttype' ] == 'svgfont' :
945+ for font , fontsize , thetext , new_x , new_y , metrics in svg_glyphs :
946+ fontset = self ._fonts .setdefault (font .fname , set ())
947+ fontset .add (thetext )
948+
902949 for style , chars in spans .items ():
903950 chars .sort ()
904951
@@ -948,7 +995,7 @@ def draw_text(self, gc, x, y, s, prop, angle, ismath):
948995 self .writer .start (
949996 'g' , attrib = {'clip-path' : 'url(#%s)' % clipid })
950997
951- if rcParams ['svg.embed_char_paths' ] :
998+ if rcParams ['svg.fonttype' ] == 'path' :
952999 self ._draw_text_as_path (gc , x , y , s , prop , angle , ismath )
9531000 else :
9541001 self ._draw_text_as_text (gc , x , y , s , prop , angle , ismath )
0 commit comments