MCPcopy Create free account
hub / github.com/cogentcore/core / Font

Method Font

paint/fontlib.go:122–182  ·  view source on GitHub ↗

Font gets a particular font, specified by the official regularized font name (see FontsAvail list), at given dots size (integer), using a cache of loaded fonts.

(fontnm string, size int)

Source from the content-addressed store, hash-verified

120// name (see FontsAvail list), at given dots size (integer), using a cache of
121// loaded fonts.
122func (fl *FontLib) Font(fontnm string, size int) (*styles.FontFace, error) {
123 fontnm = strings.ToLower(fontnm)
124 fl.Init()
125 loadFontMu.RLock()
126 if facemap := fl.Faces[fontnm]; facemap != nil {
127 if face := facemap[size]; face != nil {
128 // fmt.Printf("Got font face from cache: %v %v\n", fontnm, size)
129 loadFontMu.RUnlock()
130 return face, nil
131 }
132 }
133
134 path := fl.FontsAvail[fontnm]
135 if path == "" {
136 loadFontMu.RUnlock()
137 return nil, fmt.Errorf("girl/paint.FontLib: Font named: %v not found in list of available fonts; try adding to FontPaths in girl/paint.FontLibrary; searched FontLib.FontsFS and paths: %v", fontnm, fl.FontPaths)
138 }
139
140 var bytes []byte
141
142 if strings.HasPrefix(path, "fs://") {
143 b, err := fs.ReadFile(fl.FontsFS, strings.TrimPrefix(path, "fs://"))
144 if err != nil {
145 err = fmt.Errorf("error opening font file for font %q in FontsFS: %w", fontnm, err)
146 slog.Error(err.Error())
147 return nil, err
148 }
149 bytes = b
150 } else {
151 b, err := os.ReadFile(path)
152 if err != nil {
153 err = fmt.Errorf("error opening font file for font %q with path %q: %w", fontnm, path, err)
154 slog.Error(err.Error())
155 return nil, err
156 }
157 bytes = b
158 }
159
160 loadFontMu.RUnlock()
161 loadFontMu.Lock()
162 face, err := OpenFontFace(bytes, fontnm, path, size, 0)
163 if err != nil || face == nil {
164 if err == nil {
165 err = fmt.Errorf("girl/paint.FontLib: nil face with no error for: %v", fontnm)
166 }
167 slog.Error("girl/paint.FontLib: error loading font, removed from list", "fontName", fontnm)
168 loadFontMu.Unlock()
169 fl.DeleteFont(fontnm)
170 return nil, err
171 }
172 facemap := fl.Faces[fontnm]
173 if facemap == nil {
174 facemap = make(map[int]*styles.FontFace)
175 fl.Faces[fontnm] = facemap
176 }
177 facemap[size] = face
178 // fmt.Printf("Opened font face: %v %v\n", fontnm, size)
179 loadFontMu.Unlock()

Callers 2

OpenAllFontsMethod · 0.95
OpenFontFunction · 0.80

Calls 8

InitMethod · 0.95
DeleteFontMethod · 0.95
OpenFontFaceFunction · 0.85
ReadFileMethod · 0.80
ErrorfMethod · 0.65
ErrorMethod · 0.65
LockMethod · 0.65
UnlockMethod · 0.65

Tested by

no test coverage detected