@@ -9,6 +9,37 @@ import (
99 "golang.org/x/image/font"
1010)
1111
12+ type Fonts struct {
13+ fontFinder * sysfont.Finder
14+ families map [string ]* fontFamily
15+ }
16+
17+ func (f * Fonts ) getFamily (familyName string ) * fontFamily {
18+ f .loadFont (familyName )
19+ matchedFont := f .fontFinder .Match (familyName )
20+ return f .families [matchedFont .Family ]
21+ }
22+
23+ func (f * Fonts ) loadFont (familyName string ) {
24+ matchedFont := f .fontFinder .Match (familyName )
25+ if _ , ok := f .families [matchedFont .Family ]; ok {
26+ return
27+ }
28+ ff , err := newFontFamily (f .fontFinder , matchedFont .Family )
29+ if err != nil {
30+ return
31+ }
32+ f .families [matchedFont .Family ] = & ff
33+ }
34+
35+ func NewFonts () * Fonts {
36+ finder := sysfont .NewFinder (nil )
37+ return & Fonts {
38+ fontFinder : finder ,
39+ families : make (map [string ]* fontFamily , 0 ),
40+ }
41+ }
42+
1243type fontFamily struct {
1344 dpi int
1445 fontFinder * sysfont.Finder
@@ -21,14 +52,14 @@ type fontStyle struct {
2152 italic bool
2253}
2354
24- func (f fontFamily ) face (style fontStyle , fontSize int ) (* truetype.Font , fontFace , error ) {
55+ func (f fontFamily ) face (style fontStyle , fontSize int ) (* truetype.Font , * fontFace , error ) {
2556 ft , err := f .getFont (style )
2657 if err != nil {
27- return nil , fontFace {} , err
58+ return nil , nil , err
2859 }
2960 options := truetype.Options {Size : float64 (fontSize ), DPI : float64 (f .dpi )}
3061 face := truetype .NewFace (ft , & options )
31- return ft , fontFace {fontFace : face }, nil
62+ return ft , & fontFace {fontFace : face }, nil
3263}
3364
3465func (f fontFamily ) getFont (style fontStyle ) (* truetype.Font , error ) {
@@ -43,18 +74,14 @@ func (f fontFamily) getQuery(style fontStyle) string {
4374 return f .fontFamily + style .toString ()
4475}
4576
46- func findFontFamily (fontFinder * sysfont.Finder , fontFamily string ) (string , []* sysfont.Font ) {
47- matchedFont := fontFinder .Match (fontFamily )
48- if matchedFont == nil {
49- return "" , []* sysfont.Font {}
50- }
77+ func findFontFamily (fontFinder * sysfont.Finder , family string ) (string , []* sysfont.Font ) {
5178 fonts := make ([]* sysfont.Font , 0 )
5279 for _ , fontInstalled := range fontFinder .List () {
53- if matchedFont . Family == fontInstalled .Family {
80+ if family == fontInstalled .Family {
5481 fonts = append (fonts , fontInstalled )
5582 }
5683 }
57- return matchedFont . Family , fonts
84+ return family , fonts
5885}
5986
6087func loadFonts (fonts []* sysfont.Font ) (map [sysfont.Font ]* truetype.Font , error ) {
@@ -73,11 +100,10 @@ func loadFonts(fonts []*sysfont.Font) (map[sysfont.Font]*truetype.Font, error) {
73100 return parsedFonts , nil
74101}
75102
76- func newFontFamily (fontFamilyName string ) (fontFamily , error ) {
77- finder := sysfont .NewFinder (nil )
78- familyName , fontsInFamily := findFontFamily (finder , fontFamilyName )
103+ func newFontFamily (fontFinder * sysfont.Finder , family string ) (fontFamily , error ) {
104+ familyName , fontsInFamily := findFontFamily (fontFinder , family )
79105 if len (fontsInFamily ) < 1 {
80- return fontFamily {}, fmt .Errorf ("font family not found: %s" , fontFamilyName )
106+ return fontFamily {}, fmt .Errorf ("font family not found: %s" , family )
81107 }
82108
83109 fonts , err := loadFonts (fontsInFamily )
@@ -87,7 +113,7 @@ func newFontFamily(fontFamilyName string) (fontFamily, error) {
87113 return fontFamily {
88114 dpi : 72 ,
89115 fontFamily : familyName ,
90- fontFinder : finder ,
116+ fontFinder : fontFinder ,
91117 fonts : fonts ,
92118 }, nil
93119}
0 commit comments