From 6b255c61da2a163f5afb782a5625ef65661b6213 Mon Sep 17 00:00:00 2001 From: Gavin Nishizawa Date: Tue, 24 Oct 2023 16:09:13 -0700 Subject: [PATCH 1/6] d2fonts.FontEncodings sync.Map --- d2renderers/d2fonts/d2fonts.go | 109 +++++++++++++++++-------- d2renderers/d2svg/appendix/appendix.go | 6 +- 2 files changed, 77 insertions(+), 38 deletions(-) diff --git a/d2renderers/d2fonts/d2fonts.go b/d2renderers/d2fonts/d2fonts.go index 51704db23..38b5cd3d9 100644 --- a/d2renderers/d2fonts/d2fonts.go +++ b/d2renderers/d2fonts/d2fonts.go @@ -51,7 +51,8 @@ func (f Font) GetEncodedSubset(corpus string) string { fontBuf, err := fontlib.Sfnt2Woff(fontBuf) if err != nil { // If subset fails, return full encoding - return FontEncodings[f] + fe, _ := FontEncodings.Load(f) + return fe.(string) } return fmt.Sprintf("data:application/font-woff;base64,%v", base64.StdEncoding.EncodeToString(fontBuf)) @@ -134,66 +135,98 @@ var fuzzyBubblesBoldBase64 string //go:embed ttf/* var fontFacesFS embed.FS -var FontEncodings map[Font]string +// FontEncodings map[Font]string +var FontEncodings sync.Map + +// TODO FontFaces map[Font][]byte var FontFaces map[Font][]byte func init() { - FontEncodings = map[Font]string{ - { + FontEncodings.Store( + Font{ Family: SourceSansPro, Style: FONT_STYLE_REGULAR, - }: sourceSansProRegularBase64, - { + }, + sourceSansProRegularBase64) + + FontEncodings.Store( + Font{ Family: SourceSansPro, Style: FONT_STYLE_BOLD, - }: sourceSansProBoldBase64, - { + }, + sourceSansProBoldBase64) + + FontEncodings.Store( + Font{ Family: SourceSansPro, Style: FONT_STYLE_SEMIBOLD, - }: sourceSansProSemiboldBase64, - { + }, + sourceSansProSemiboldBase64) + + FontEncodings.Store( + Font{ Family: SourceSansPro, Style: FONT_STYLE_ITALIC, - }: sourceSansProItalicBase64, - { + }, + sourceSansProItalicBase64) + + FontEncodings.Store( + Font{ Family: SourceCodePro, Style: FONT_STYLE_REGULAR, - }: sourceCodeProRegularBase64, - { + }, + sourceCodeProRegularBase64) + + FontEncodings.Store( + Font{ Family: SourceCodePro, Style: FONT_STYLE_BOLD, - }: sourceCodeProBoldBase64, - { + }, + sourceCodeProBoldBase64) + + FontEncodings.Store( + Font{ Family: SourceCodePro, Style: FONT_STYLE_SEMIBOLD, - }: sourceCodeProSemiboldBase64, - { + }, + sourceCodeProSemiboldBase64) + + FontEncodings.Store( + Font{ Family: SourceCodePro, Style: FONT_STYLE_ITALIC, - }: sourceCodeProItalicBase64, - { + }, + sourceCodeProItalicBase64) + + FontEncodings.Store( + Font{ Family: HandDrawn, Style: FONT_STYLE_REGULAR, - }: fuzzyBubblesRegularBase64, - { + }, + fuzzyBubblesRegularBase64) + + FontEncodings.Store( + Font{ Family: HandDrawn, Style: FONT_STYLE_ITALIC, // This font has no italic, so just reuse regular - }: fuzzyBubblesRegularBase64, - { + }, fuzzyBubblesRegularBase64) + FontEncodings.Store( + Font{ Family: HandDrawn, Style: FONT_STYLE_BOLD, - }: fuzzyBubblesBoldBase64, - { + }, fuzzyBubblesBoldBase64) + FontEncodings.Store( + Font{ Family: HandDrawn, Style: FONT_STYLE_SEMIBOLD, // This font has no semibold, so just reuse bold - }: fuzzyBubblesBoldBase64, - } + }, fuzzyBubblesBoldBase64) - for k, v := range FontEncodings { - FontEncodings[k] = strings.TrimSuffix(v, "\n") - } + FontEncodings.Range(func(k, v any) bool { + FontEncodings.Swap(k, strings.TrimSuffix(v.(string), "\n")) + return true + }) FontFaces = map[Font][]byte{} b, err := fontFacesFS.ReadFile("ttf/SourceSansPro-Regular.ttf") @@ -308,7 +341,7 @@ func AddFontStyle(font Font, style FontStyle, ttf []byte) error { return fmt.Errorf("failed to encode ttf to woff: %v", err) } encodedWoff := fmt.Sprintf("data:application/font-woff;base64,%v", base64.StdEncoding.EncodeToString(woff)) - FontEncodings[font] = encodedWoff + FontEncodings.Store(font, encodedWoff) return nil } @@ -333,7 +366,8 @@ func AddFontFamily(name string, regularTTF, italicTTF, boldTTF, semiboldTTF []by Style: FONT_STYLE_REGULAR, } FontFaces[regularFont] = FontFaces[fallbackFont] - FontEncodings[regularFont] = FontEncodings[fallbackFont] + fb, _ := FontEncodings.Load(fallbackFont) + FontEncodings.Store(regularFont, fb) } italicFont := Font{ @@ -351,7 +385,8 @@ func AddFontFamily(name string, regularTTF, italicTTF, boldTTF, semiboldTTF []by Style: FONT_STYLE_ITALIC, } FontFaces[italicFont] = FontFaces[fallbackFont] - FontEncodings[italicFont] = FontEncodings[fallbackFont] + fb, _ := FontEncodings.Load(fallbackFont) + FontEncodings.Store(italicFont, fb) } boldFont := Font{ @@ -369,7 +404,8 @@ func AddFontFamily(name string, regularTTF, italicTTF, boldTTF, semiboldTTF []by Style: FONT_STYLE_BOLD, } FontFaces[boldFont] = FontFaces[fallbackFont] - FontEncodings[boldFont] = FontEncodings[fallbackFont] + fb, _ := FontEncodings.Load(fallbackFont) + FontEncodings.Store(boldFont, fb) } semiboldFont := Font{ @@ -387,7 +423,8 @@ func AddFontFamily(name string, regularTTF, italicTTF, boldTTF, semiboldTTF []by Style: FONT_STYLE_SEMIBOLD, } FontFaces[semiboldFont] = FontFaces[fallbackFont] - FontEncodings[semiboldFont] = FontEncodings[fallbackFont] + fb, _ := FontEncodings.Load(fallbackFont) + FontEncodings.Store(semiboldFont, fb) } FontFamilies = append(FontFamilies, customFontFamily) diff --git a/d2renderers/d2svg/appendix/appendix.go b/d2renderers/d2svg/appendix/appendix.go index 0f58ffa82..86c44b9c3 100644 --- a/d2renderers/d2svg/appendix/appendix.go +++ b/d2renderers/d2svg/appendix/appendix.go @@ -121,6 +121,7 @@ func Append(diagram *d2target.Diagram, ruler *textmeasure.Ruler, in []byte) []by } if !strings.Contains(svg, `font-family: "font-regular"`) { + font, _ := d2fonts.FontEncodings.Load(d2fonts.SourceSansPro.Font(0, d2fonts.FONT_STYLE_REGULAR)) appendix += fmt.Sprintf(``, d2fonts.FontEncodings[d2fonts.SourceSansPro.Font(0, d2fonts.FONT_STYLE_REGULAR)]) +]]>`, font.(string)) } if !strings.Contains(svg, `font-family: "font-bold"`) { + font, _ := d2fonts.FontEncodings.Load(d2fonts.SourceSansPro.Font(0, d2fonts.FONT_STYLE_BOLD)) appendix += fmt.Sprintf(``, d2fonts.FontEncodings[d2fonts.SourceSansPro.Font(0, d2fonts.FONT_STYLE_BOLD)]) +]]>`, font.(string)) } closingIndex := strings.LastIndex(svg, "") From a67c186cae50f55b990ed64c23cc406893e50028 Mon Sep 17 00:00:00 2001 From: Gavin Nishizawa Date: Tue, 24 Oct 2023 16:40:56 -0700 Subject: [PATCH 2/6] d2fonts.FontFaces sync.Map --- d2renderers/d2fonts/d2fonts.go | 80 ++++++++++++++++------------- d2renderers/d2fonts/d2fonts_test.go | 9 +++- lib/pdf/pdf.go | 6 ++- lib/textmeasure/textmeasure.go | 5 +- 4 files changed, 58 insertions(+), 42 deletions(-) diff --git a/d2renderers/d2fonts/d2fonts.go b/d2renderers/d2fonts/d2fonts.go index 38b5cd3d9..85bd8b7f0 100644 --- a/d2renderers/d2fonts/d2fonts.go +++ b/d2renderers/d2fonts/d2fonts.go @@ -44,8 +44,13 @@ func (f Font) GetEncodedSubset(corpus string) string { FontFamiliesMu.Lock() defer FontFamiliesMu.Unlock() - fontBuf := make([]byte, len(FontFaces[f])) - copy(fontBuf, FontFaces[f]) + var face []byte + { + ff, _ := FontFaces.Load(f) + face = ff.([]byte) + } + fontBuf := make([]byte, len(face)) + copy(fontBuf, face) fontBuf = font.UTF8CutFont(fontBuf, uniqueChars) fontBuf, err := fontlib.Sfnt2Woff(fontBuf) @@ -138,8 +143,8 @@ var fontFacesFS embed.FS // FontEncodings map[Font]string var FontEncodings sync.Map -// TODO FontFaces map[Font][]byte -var FontFaces map[Font][]byte +// FontFaces map[Font][]byte +var FontFaces sync.Map func init() { FontEncodings.Store( @@ -228,104 +233,103 @@ func init() { return true }) - FontFaces = map[Font][]byte{} b, err := fontFacesFS.ReadFile("ttf/SourceSansPro-Regular.ttf") if err != nil { panic(err) } - FontFaces[Font{ + FontFaces.Store(Font{ Family: SourceSansPro, Style: FONT_STYLE_REGULAR, - }] = b + }, b) b, err = fontFacesFS.ReadFile("ttf/SourceCodePro-Regular.ttf") if err != nil { panic(err) } - FontFaces[Font{ + FontFaces.Store(Font{ Family: SourceCodePro, Style: FONT_STYLE_REGULAR, - }] = b + }, b) b, err = fontFacesFS.ReadFile("ttf/SourceCodePro-Bold.ttf") if err != nil { panic(err) } - FontFaces[Font{ + FontFaces.Store(Font{ Family: SourceCodePro, Style: FONT_STYLE_BOLD, - }] = b + }, b) b, err = fontFacesFS.ReadFile("ttf/SourceCodePro-Semibold.ttf") if err != nil { panic(err) } - FontFaces[Font{ + FontFaces.Store(Font{ Family: SourceCodePro, Style: FONT_STYLE_SEMIBOLD, - }] = b + }, b) b, err = fontFacesFS.ReadFile("ttf/SourceCodePro-Italic.ttf") if err != nil { panic(err) } - FontFaces[Font{ + FontFaces.Store(Font{ Family: SourceCodePro, Style: FONT_STYLE_ITALIC, - }] = b + }, b) b, err = fontFacesFS.ReadFile("ttf/SourceSansPro-Bold.ttf") if err != nil { panic(err) } - FontFaces[Font{ + FontFaces.Store(Font{ Family: SourceSansPro, Style: FONT_STYLE_BOLD, - }] = b + }, b) b, err = fontFacesFS.ReadFile("ttf/SourceSansPro-Semibold.ttf") if err != nil { panic(err) } - FontFaces[Font{ + FontFaces.Store(Font{ Family: SourceSansPro, Style: FONT_STYLE_SEMIBOLD, - }] = b + }, b) b, err = fontFacesFS.ReadFile("ttf/SourceSansPro-Italic.ttf") if err != nil { panic(err) } - FontFaces[Font{ + FontFaces.Store(Font{ Family: SourceSansPro, Style: FONT_STYLE_ITALIC, - }] = b + }, b) b, err = fontFacesFS.ReadFile("ttf/FuzzyBubbles-Regular.ttf") if err != nil { panic(err) } - FontFaces[Font{ + FontFaces.Store(Font{ Family: HandDrawn, Style: FONT_STYLE_REGULAR, - }] = b - FontFaces[Font{ + }, b) + FontFaces.Store(Font{ Family: HandDrawn, Style: FONT_STYLE_ITALIC, - }] = b + }, b) b, err = fontFacesFS.ReadFile("ttf/FuzzyBubbles-Bold.ttf") if err != nil { panic(err) } - FontFaces[Font{ + FontFaces.Store(Font{ Family: HandDrawn, Style: FONT_STYLE_BOLD, - }] = b - FontFaces[Font{ + }, b) + FontFaces.Store(Font{ Family: HandDrawn, Style: FONT_STYLE_SEMIBOLD, - }] = b + }, b) } var D2_FONT_TO_FAMILY = map[string]FontFamily{ @@ -334,7 +338,7 @@ var D2_FONT_TO_FAMILY = map[string]FontFamily{ } func AddFontStyle(font Font, style FontStyle, ttf []byte) error { - FontFaces[font] = ttf + FontFaces.Store(font, ttf) woff, err := fontlib.Sfnt2Woff(ttf) if err != nil { @@ -365,9 +369,10 @@ func AddFontFamily(name string, regularTTF, italicTTF, boldTTF, semiboldTTF []by Family: SourceSansPro, Style: FONT_STYLE_REGULAR, } - FontFaces[regularFont] = FontFaces[fallbackFont] - fb, _ := FontEncodings.Load(fallbackFont) - FontEncodings.Store(regularFont, fb) + f, _ := FontFaces.Load(fallbackFont) + FontFaces.Store(regularFont, f) + e, _ := FontEncodings.Load(fallbackFont) + FontEncodings.Store(regularFont, e) } italicFont := Font{ @@ -384,7 +389,8 @@ func AddFontFamily(name string, regularTTF, italicTTF, boldTTF, semiboldTTF []by Family: SourceSansPro, Style: FONT_STYLE_ITALIC, } - FontFaces[italicFont] = FontFaces[fallbackFont] + f, _ := FontFaces.Load(fallbackFont) + FontFaces.Store(italicFont, f) fb, _ := FontEncodings.Load(fallbackFont) FontEncodings.Store(italicFont, fb) } @@ -403,7 +409,8 @@ func AddFontFamily(name string, regularTTF, italicTTF, boldTTF, semiboldTTF []by Family: SourceSansPro, Style: FONT_STYLE_BOLD, } - FontFaces[boldFont] = FontFaces[fallbackFont] + f, _ := FontFaces.Load(fallbackFont) + FontFaces.Store(boldFont, f) fb, _ := FontEncodings.Load(fallbackFont) FontEncodings.Store(boldFont, fb) } @@ -422,7 +429,8 @@ func AddFontFamily(name string, regularTTF, italicTTF, boldTTF, semiboldTTF []by Family: SourceSansPro, Style: FONT_STYLE_SEMIBOLD, } - FontFaces[semiboldFont] = FontFaces[fallbackFont] + f, _ := FontFaces.Load(fallbackFont) + FontFaces.Store(semiboldFont, f) fb, _ := FontEncodings.Load(fallbackFont) FontEncodings.Store(semiboldFont, fb) } diff --git a/d2renderers/d2fonts/d2fonts_test.go b/d2renderers/d2fonts/d2fonts_test.go index fc95ff310..1fd773241 100644 --- a/d2renderers/d2fonts/d2fonts_test.go +++ b/d2renderers/d2fonts/d2fonts_test.go @@ -14,8 +14,13 @@ func TestCutFont(t *testing.T) { Family: SourceCodePro, Style: FONT_STYLE_BOLD, } - fontBuf := make([]byte, len(FontFaces[f])) - copy(fontBuf, FontFaces[f]) + var face []byte + { + ff, _ := FontFaces.Load(f) + face = ff.([]byte) + } + fontBuf := make([]byte, len(face)) + copy(fontBuf, face) fontBuf = font.UTF8CutFont(fontBuf, " 1") err := diff.Testdata(filepath.Join("testdata", "d2fonts", "cut"), ".txt", fontBuf) assert.Success(t, err) diff --git a/lib/pdf/pdf.go b/lib/pdf/pdf.go index 9d9eabe69..b1471f70a 100644 --- a/lib/pdf/pdf.go +++ b/lib/pdf/pdf.go @@ -31,8 +31,10 @@ func Init() *GoFPDF { UnitStr: "pt", }) - newGofPDF.AddUTF8FontFromBytes("source", "", d2fonts.FontFaces[d2fonts.SourceSansPro.Font(0, d2fonts.FONT_STYLE_REGULAR)]) - newGofPDF.AddUTF8FontFromBytes("source", "B", d2fonts.FontFaces[d2fonts.SourceSansPro.Font(0, d2fonts.FONT_STYLE_BOLD)]) + reg, _ := d2fonts.FontFaces.Load(d2fonts.SourceSansPro.Font(0, d2fonts.FONT_STYLE_REGULAR)) + bold, _ := d2fonts.FontFaces.Load(d2fonts.SourceSansPro.Font(0, d2fonts.FONT_STYLE_BOLD)) + newGofPDF.AddUTF8FontFromBytes("source", "", reg.([]byte)) + newGofPDF.AddUTF8FontFromBytes("source", "B", bold.([]byte)) newGofPDF.SetAutoPageBreak(false, 0) newGofPDF.SetLineWidth(2) newGofPDF.SetMargins(0, 0, 0) diff --git a/lib/textmeasure/textmeasure.go b/lib/textmeasure/textmeasure.go index 8df3a346e..004b48a3d 100644 --- a/lib/textmeasure/textmeasure.go +++ b/lib/textmeasure/textmeasure.go @@ -126,11 +126,12 @@ func NewRuler() (*Ruler, error) { Style: fontStyle, } // Note: FontFaces lookup is size-agnostic - if _, ok := d2fonts.FontFaces[font]; !ok { + face, has := d2fonts.FontFaces.Load(font) + if !has { continue } if _, loaded := r.ttfs[font]; !loaded { - ttf, err := truetype.Parse(d2fonts.FontFaces[font]) + ttf, err := truetype.Parse(face.([]byte)) if err != nil { return nil, err } From 94669f9b0484fa178ec398b0212ede52d3d6767b Mon Sep 17 00:00:00 2001 From: Gavin Nishizawa Date: Mon, 30 Oct 2023 12:02:29 -0700 Subject: [PATCH 3/6] add generic SyncMap lib --- lib/syncmap/syncmap.go | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 lib/syncmap/syncmap.go diff --git a/lib/syncmap/syncmap.go b/lib/syncmap/syncmap.go new file mode 100644 index 000000000..8dbb2ef1b --- /dev/null +++ b/lib/syncmap/syncmap.go @@ -0,0 +1,40 @@ +package syncmap + +import "sync" + +type SyncMap[K comparable, V any] struct { + _map *sync.Map +} + +func New[K comparable, V any]() SyncMap[K, V] { + return SyncMap[K, V]{ + _map: &sync.Map{}, + } +} + +func (sm SyncMap[K, V]) Set(key K, value V) { + sm._map.Store(key, value) +} + +func (sm SyncMap[K, V]) GetWithStatus(key K) (value V, ok bool) { + v, has := sm._map.Load(key) + if !has { + return value, false + } + return v.(V), true +} + +func (sm SyncMap[K, V]) Get(key K) (value V) { + v, _ := sm.GetWithStatus(key) + return v +} + +func (sm SyncMap[K, V]) Delete(key K) { + sm._map.Delete(key) +} + +func (sm SyncMap[K, V]) Range(f func(key K, value V) bool) { + sm._map.Range(func(k, v any) bool { + return f(k.(K), v.(V)) + }) +} From 1cfa2b9f81f322f88d6e66411a559a18038a717b Mon Sep 17 00:00:00 2001 From: Gavin Nishizawa Date: Mon, 30 Oct 2023 12:13:18 -0700 Subject: [PATCH 4/6] use new SyncMap with FontFaces/FontEncoding --- d2renderers/d2fonts/d2fonts.go | 101 +++++++++++-------------- d2renderers/d2fonts/d2fonts_test.go | 6 +- d2renderers/d2svg/appendix/appendix.go | 6 +- lib/pdf/pdf.go | 6 +- lib/textmeasure/textmeasure.go | 4 +- 5 files changed, 52 insertions(+), 71 deletions(-) diff --git a/d2renderers/d2fonts/d2fonts.go b/d2renderers/d2fonts/d2fonts.go index 85bd8b7f0..a41d1bbfe 100644 --- a/d2renderers/d2fonts/d2fonts.go +++ b/d2renderers/d2fonts/d2fonts.go @@ -13,6 +13,7 @@ import ( "oss.terrastruct.com/d2/lib/font" fontlib "oss.terrastruct.com/d2/lib/font" + "oss.terrastruct.com/d2/lib/syncmap" ) type FontFamily string @@ -44,11 +45,7 @@ func (f Font) GetEncodedSubset(corpus string) string { FontFamiliesMu.Lock() defer FontFamiliesMu.Unlock() - var face []byte - { - ff, _ := FontFaces.Load(f) - face = ff.([]byte) - } + face := FontFaces.Get(f) fontBuf := make([]byte, len(face)) copy(fontBuf, face) fontBuf = font.UTF8CutFont(fontBuf, uniqueChars) @@ -56,8 +53,7 @@ func (f Font) GetEncodedSubset(corpus string) string { fontBuf, err := fontlib.Sfnt2Woff(fontBuf) if err != nil { // If subset fails, return full encoding - fe, _ := FontEncodings.Load(f) - return fe.(string) + return FontEncodings.Get(f) } return fmt.Sprintf("data:application/font-woff;base64,%v", base64.StdEncoding.EncodeToString(fontBuf)) @@ -140,104 +136,105 @@ var fuzzyBubblesBoldBase64 string //go:embed ttf/* var fontFacesFS embed.FS -// FontEncodings map[Font]string -var FontEncodings sync.Map - -// FontFaces map[Font][]byte -var FontFaces sync.Map +var FontEncodings syncmap.SyncMap[Font, string] +var FontFaces syncmap.SyncMap[Font, []byte] func init() { - FontEncodings.Store( + FontEncodings = syncmap.New[Font, string]() + + FontEncodings.Set( Font{ Family: SourceSansPro, Style: FONT_STYLE_REGULAR, }, sourceSansProRegularBase64) - FontEncodings.Store( + FontEncodings.Set( Font{ Family: SourceSansPro, Style: FONT_STYLE_BOLD, }, sourceSansProBoldBase64) - FontEncodings.Store( + FontEncodings.Set( Font{ Family: SourceSansPro, Style: FONT_STYLE_SEMIBOLD, }, sourceSansProSemiboldBase64) - FontEncodings.Store( + FontEncodings.Set( Font{ Family: SourceSansPro, Style: FONT_STYLE_ITALIC, }, sourceSansProItalicBase64) - FontEncodings.Store( + FontEncodings.Set( Font{ Family: SourceCodePro, Style: FONT_STYLE_REGULAR, }, sourceCodeProRegularBase64) - FontEncodings.Store( + FontEncodings.Set( Font{ Family: SourceCodePro, Style: FONT_STYLE_BOLD, }, sourceCodeProBoldBase64) - FontEncodings.Store( + FontEncodings.Set( Font{ Family: SourceCodePro, Style: FONT_STYLE_SEMIBOLD, }, sourceCodeProSemiboldBase64) - FontEncodings.Store( + FontEncodings.Set( Font{ Family: SourceCodePro, Style: FONT_STYLE_ITALIC, }, sourceCodeProItalicBase64) - FontEncodings.Store( + FontEncodings.Set( Font{ Family: HandDrawn, Style: FONT_STYLE_REGULAR, }, fuzzyBubblesRegularBase64) - FontEncodings.Store( + FontEncodings.Set( Font{ Family: HandDrawn, Style: FONT_STYLE_ITALIC, // This font has no italic, so just reuse regular }, fuzzyBubblesRegularBase64) - FontEncodings.Store( + FontEncodings.Set( Font{ Family: HandDrawn, Style: FONT_STYLE_BOLD, }, fuzzyBubblesBoldBase64) - FontEncodings.Store( + FontEncodings.Set( Font{ Family: HandDrawn, Style: FONT_STYLE_SEMIBOLD, // This font has no semibold, so just reuse bold }, fuzzyBubblesBoldBase64) - FontEncodings.Range(func(k, v any) bool { - FontEncodings.Swap(k, strings.TrimSuffix(v.(string), "\n")) + FontEncodings.Range(func(k Font, v string) bool { + FontEncodings.Set(k, strings.TrimSuffix(v, "\n")) return true }) + FontFaces = syncmap.New[Font, []byte]() + b, err := fontFacesFS.ReadFile("ttf/SourceSansPro-Regular.ttf") if err != nil { panic(err) } - FontFaces.Store(Font{ + FontFaces.Set(Font{ Family: SourceSansPro, Style: FONT_STYLE_REGULAR, }, b) @@ -246,7 +243,7 @@ func init() { if err != nil { panic(err) } - FontFaces.Store(Font{ + FontFaces.Set(Font{ Family: SourceCodePro, Style: FONT_STYLE_REGULAR, }, b) @@ -255,7 +252,7 @@ func init() { if err != nil { panic(err) } - FontFaces.Store(Font{ + FontFaces.Set(Font{ Family: SourceCodePro, Style: FONT_STYLE_BOLD, }, b) @@ -264,7 +261,7 @@ func init() { if err != nil { panic(err) } - FontFaces.Store(Font{ + FontFaces.Set(Font{ Family: SourceCodePro, Style: FONT_STYLE_SEMIBOLD, }, b) @@ -273,7 +270,7 @@ func init() { if err != nil { panic(err) } - FontFaces.Store(Font{ + FontFaces.Set(Font{ Family: SourceCodePro, Style: FONT_STYLE_ITALIC, }, b) @@ -282,7 +279,7 @@ func init() { if err != nil { panic(err) } - FontFaces.Store(Font{ + FontFaces.Set(Font{ Family: SourceSansPro, Style: FONT_STYLE_BOLD, }, b) @@ -291,7 +288,7 @@ func init() { if err != nil { panic(err) } - FontFaces.Store(Font{ + FontFaces.Set(Font{ Family: SourceSansPro, Style: FONT_STYLE_SEMIBOLD, }, b) @@ -300,7 +297,7 @@ func init() { if err != nil { panic(err) } - FontFaces.Store(Font{ + FontFaces.Set(Font{ Family: SourceSansPro, Style: FONT_STYLE_ITALIC, }, b) @@ -309,11 +306,11 @@ func init() { if err != nil { panic(err) } - FontFaces.Store(Font{ + FontFaces.Set(Font{ Family: HandDrawn, Style: FONT_STYLE_REGULAR, }, b) - FontFaces.Store(Font{ + FontFaces.Set(Font{ Family: HandDrawn, Style: FONT_STYLE_ITALIC, }, b) @@ -322,11 +319,11 @@ func init() { if err != nil { panic(err) } - FontFaces.Store(Font{ + FontFaces.Set(Font{ Family: HandDrawn, Style: FONT_STYLE_BOLD, }, b) - FontFaces.Store(Font{ + FontFaces.Set(Font{ Family: HandDrawn, Style: FONT_STYLE_SEMIBOLD, }, b) @@ -338,14 +335,14 @@ var D2_FONT_TO_FAMILY = map[string]FontFamily{ } func AddFontStyle(font Font, style FontStyle, ttf []byte) error { - FontFaces.Store(font, ttf) + FontFaces.Set(font, ttf) woff, err := fontlib.Sfnt2Woff(ttf) if err != nil { return fmt.Errorf("failed to encode ttf to woff: %v", err) } encodedWoff := fmt.Sprintf("data:application/font-woff;base64,%v", base64.StdEncoding.EncodeToString(woff)) - FontEncodings.Store(font, encodedWoff) + FontEncodings.Set(font, encodedWoff) return nil } @@ -369,10 +366,8 @@ func AddFontFamily(name string, regularTTF, italicTTF, boldTTF, semiboldTTF []by Family: SourceSansPro, Style: FONT_STYLE_REGULAR, } - f, _ := FontFaces.Load(fallbackFont) - FontFaces.Store(regularFont, f) - e, _ := FontEncodings.Load(fallbackFont) - FontEncodings.Store(regularFont, e) + FontFaces.Set(regularFont, FontFaces.Get(fallbackFont)) + FontEncodings.Set(regularFont, FontEncodings.Get(fallbackFont)) } italicFont := Font{ @@ -389,10 +384,8 @@ func AddFontFamily(name string, regularTTF, italicTTF, boldTTF, semiboldTTF []by Family: SourceSansPro, Style: FONT_STYLE_ITALIC, } - f, _ := FontFaces.Load(fallbackFont) - FontFaces.Store(italicFont, f) - fb, _ := FontEncodings.Load(fallbackFont) - FontEncodings.Store(italicFont, fb) + FontFaces.Set(italicFont, FontFaces.Get(fallbackFont)) + FontEncodings.Set(italicFont, FontEncodings.Get(fallbackFont)) } boldFont := Font{ @@ -409,10 +402,8 @@ func AddFontFamily(name string, regularTTF, italicTTF, boldTTF, semiboldTTF []by Family: SourceSansPro, Style: FONT_STYLE_BOLD, } - f, _ := FontFaces.Load(fallbackFont) - FontFaces.Store(boldFont, f) - fb, _ := FontEncodings.Load(fallbackFont) - FontEncodings.Store(boldFont, fb) + FontFaces.Set(boldFont, FontFaces.Get(fallbackFont)) + FontEncodings.Set(boldFont, FontEncodings.Get(fallbackFont)) } semiboldFont := Font{ @@ -429,10 +420,8 @@ func AddFontFamily(name string, regularTTF, italicTTF, boldTTF, semiboldTTF []by Family: SourceSansPro, Style: FONT_STYLE_SEMIBOLD, } - f, _ := FontFaces.Load(fallbackFont) - FontFaces.Store(semiboldFont, f) - fb, _ := FontEncodings.Load(fallbackFont) - FontEncodings.Store(semiboldFont, fb) + FontFaces.Set(semiboldFont, FontFaces.Get(fallbackFont)) + FontEncodings.Set(semiboldFont, FontEncodings.Get(fallbackFont)) } FontFamilies = append(FontFamilies, customFontFamily) diff --git a/d2renderers/d2fonts/d2fonts_test.go b/d2renderers/d2fonts/d2fonts_test.go index 1fd773241..9c1cf4f00 100644 --- a/d2renderers/d2fonts/d2fonts_test.go +++ b/d2renderers/d2fonts/d2fonts_test.go @@ -14,11 +14,7 @@ func TestCutFont(t *testing.T) { Family: SourceCodePro, Style: FONT_STYLE_BOLD, } - var face []byte - { - ff, _ := FontFaces.Load(f) - face = ff.([]byte) - } + face := FontFaces.Get(f) fontBuf := make([]byte, len(face)) copy(fontBuf, face) fontBuf = font.UTF8CutFont(fontBuf, " 1") diff --git a/d2renderers/d2svg/appendix/appendix.go b/d2renderers/d2svg/appendix/appendix.go index 86c44b9c3..803651f35 100644 --- a/d2renderers/d2svg/appendix/appendix.go +++ b/d2renderers/d2svg/appendix/appendix.go @@ -121,7 +121,6 @@ func Append(diagram *d2target.Diagram, ruler *textmeasure.Ruler, in []byte) []by } if !strings.Contains(svg, `font-family: "font-regular"`) { - font, _ := d2fonts.FontEncodings.Load(d2fonts.SourceSansPro.Font(0, d2fonts.FONT_STYLE_REGULAR)) appendix += fmt.Sprintf(``, font.(string)) +]]>`, d2fonts.FontEncodings.Get(d2fonts.SourceSansPro.Font(0, d2fonts.FONT_STYLE_REGULAR))) } if !strings.Contains(svg, `font-family: "font-bold"`) { - font, _ := d2fonts.FontEncodings.Load(d2fonts.SourceSansPro.Font(0, d2fonts.FONT_STYLE_BOLD)) appendix += fmt.Sprintf(``, font.(string)) +]]>`, d2fonts.FontEncodings.Get(d2fonts.SourceSansPro.Font(0, d2fonts.FONT_STYLE_BOLD))) } closingIndex := strings.LastIndex(svg, "") diff --git a/lib/pdf/pdf.go b/lib/pdf/pdf.go index b1471f70a..85d6b7971 100644 --- a/lib/pdf/pdf.go +++ b/lib/pdf/pdf.go @@ -31,10 +31,8 @@ func Init() *GoFPDF { UnitStr: "pt", }) - reg, _ := d2fonts.FontFaces.Load(d2fonts.SourceSansPro.Font(0, d2fonts.FONT_STYLE_REGULAR)) - bold, _ := d2fonts.FontFaces.Load(d2fonts.SourceSansPro.Font(0, d2fonts.FONT_STYLE_BOLD)) - newGofPDF.AddUTF8FontFromBytes("source", "", reg.([]byte)) - newGofPDF.AddUTF8FontFromBytes("source", "B", bold.([]byte)) + newGofPDF.AddUTF8FontFromBytes("source", "", d2fonts.FontFaces.Get(d2fonts.SourceSansPro.Font(0, d2fonts.FONT_STYLE_REGULAR))) + newGofPDF.AddUTF8FontFromBytes("source", "B", d2fonts.FontFaces.Get(d2fonts.SourceSansPro.Font(0, d2fonts.FONT_STYLE_BOLD))) newGofPDF.SetAutoPageBreak(false, 0) newGofPDF.SetLineWidth(2) newGofPDF.SetMargins(0, 0, 0) diff --git a/lib/textmeasure/textmeasure.go b/lib/textmeasure/textmeasure.go index 004b48a3d..2bd112b7d 100644 --- a/lib/textmeasure/textmeasure.go +++ b/lib/textmeasure/textmeasure.go @@ -126,12 +126,12 @@ func NewRuler() (*Ruler, error) { Style: fontStyle, } // Note: FontFaces lookup is size-agnostic - face, has := d2fonts.FontFaces.Load(font) + face, has := d2fonts.FontFaces.GetWithStatus(font) if !has { continue } if _, loaded := r.ttfs[font]; !loaded { - ttf, err := truetype.Parse(face.([]byte)) + ttf, err := truetype.Parse(face) if err != nil { return nil, err } From fdbde73605f50c4a1f3e34f9bcfcac83b3bd3585 Mon Sep 17 00:00:00 2001 From: Gavin Nishizawa Date: Mon, 30 Oct 2023 13:51:36 -0700 Subject: [PATCH 5/6] rename to Get and MustGet --- d2renderers/d2fonts/d2fonts.go | 20 ++++++++++---------- d2renderers/d2fonts/d2fonts_test.go | 2 +- d2renderers/d2svg/appendix/appendix.go | 4 ++-- lib/pdf/pdf.go | 4 ++-- lib/syncmap/syncmap.go | 6 +++--- lib/textmeasure/textmeasure.go | 2 +- 6 files changed, 19 insertions(+), 19 deletions(-) diff --git a/d2renderers/d2fonts/d2fonts.go b/d2renderers/d2fonts/d2fonts.go index a41d1bbfe..717cdc8b2 100644 --- a/d2renderers/d2fonts/d2fonts.go +++ b/d2renderers/d2fonts/d2fonts.go @@ -45,7 +45,7 @@ func (f Font) GetEncodedSubset(corpus string) string { FontFamiliesMu.Lock() defer FontFamiliesMu.Unlock() - face := FontFaces.Get(f) + face := FontFaces.MustGet(f) fontBuf := make([]byte, len(face)) copy(fontBuf, face) fontBuf = font.UTF8CutFont(fontBuf, uniqueChars) @@ -53,7 +53,7 @@ func (f Font) GetEncodedSubset(corpus string) string { fontBuf, err := fontlib.Sfnt2Woff(fontBuf) if err != nil { // If subset fails, return full encoding - return FontEncodings.Get(f) + return FontEncodings.MustGet(f) } return fmt.Sprintf("data:application/font-woff;base64,%v", base64.StdEncoding.EncodeToString(fontBuf)) @@ -366,8 +366,8 @@ func AddFontFamily(name string, regularTTF, italicTTF, boldTTF, semiboldTTF []by Family: SourceSansPro, Style: FONT_STYLE_REGULAR, } - FontFaces.Set(regularFont, FontFaces.Get(fallbackFont)) - FontEncodings.Set(regularFont, FontEncodings.Get(fallbackFont)) + FontFaces.Set(regularFont, FontFaces.MustGet(fallbackFont)) + FontEncodings.Set(regularFont, FontEncodings.MustGet(fallbackFont)) } italicFont := Font{ @@ -384,8 +384,8 @@ func AddFontFamily(name string, regularTTF, italicTTF, boldTTF, semiboldTTF []by Family: SourceSansPro, Style: FONT_STYLE_ITALIC, } - FontFaces.Set(italicFont, FontFaces.Get(fallbackFont)) - FontEncodings.Set(italicFont, FontEncodings.Get(fallbackFont)) + FontFaces.Set(italicFont, FontFaces.MustGet(fallbackFont)) + FontEncodings.Set(italicFont, FontEncodings.MustGet(fallbackFont)) } boldFont := Font{ @@ -402,8 +402,8 @@ func AddFontFamily(name string, regularTTF, italicTTF, boldTTF, semiboldTTF []by Family: SourceSansPro, Style: FONT_STYLE_BOLD, } - FontFaces.Set(boldFont, FontFaces.Get(fallbackFont)) - FontEncodings.Set(boldFont, FontEncodings.Get(fallbackFont)) + FontFaces.Set(boldFont, FontFaces.MustGet(fallbackFont)) + FontEncodings.Set(boldFont, FontEncodings.MustGet(fallbackFont)) } semiboldFont := Font{ @@ -420,8 +420,8 @@ func AddFontFamily(name string, regularTTF, italicTTF, boldTTF, semiboldTTF []by Family: SourceSansPro, Style: FONT_STYLE_SEMIBOLD, } - FontFaces.Set(semiboldFont, FontFaces.Get(fallbackFont)) - FontEncodings.Set(semiboldFont, FontEncodings.Get(fallbackFont)) + FontFaces.Set(semiboldFont, FontFaces.MustGet(fallbackFont)) + FontEncodings.Set(semiboldFont, FontEncodings.MustGet(fallbackFont)) } FontFamilies = append(FontFamilies, customFontFamily) diff --git a/d2renderers/d2fonts/d2fonts_test.go b/d2renderers/d2fonts/d2fonts_test.go index 9c1cf4f00..d86753f4d 100644 --- a/d2renderers/d2fonts/d2fonts_test.go +++ b/d2renderers/d2fonts/d2fonts_test.go @@ -14,7 +14,7 @@ func TestCutFont(t *testing.T) { Family: SourceCodePro, Style: FONT_STYLE_BOLD, } - face := FontFaces.Get(f) + face := FontFaces.MustGet(f) fontBuf := make([]byte, len(face)) copy(fontBuf, face) fontBuf = font.UTF8CutFont(fontBuf, " 1") diff --git a/d2renderers/d2svg/appendix/appendix.go b/d2renderers/d2svg/appendix/appendix.go index 803651f35..bcc8b4675 100644 --- a/d2renderers/d2svg/appendix/appendix.go +++ b/d2renderers/d2svg/appendix/appendix.go @@ -129,7 +129,7 @@ func Append(diagram *d2target.Diagram, ruler *textmeasure.Ruler, in []byte) []by font-family: font-regular; src: url("%s"); } -]]>`, d2fonts.FontEncodings.Get(d2fonts.SourceSansPro.Font(0, d2fonts.FONT_STYLE_REGULAR))) +]]>`, d2fonts.FontEncodings.MustGet(d2fonts.SourceSansPro.Font(0, d2fonts.FONT_STYLE_REGULAR))) } if !strings.Contains(svg, `font-family: "font-bold"`) { appendix += fmt.Sprintf(``, d2fonts.FontEncodings.Get(d2fonts.SourceSansPro.Font(0, d2fonts.FONT_STYLE_BOLD))) +]]>`, d2fonts.FontEncodings.MustGet(d2fonts.SourceSansPro.Font(0, d2fonts.FONT_STYLE_BOLD))) } closingIndex := strings.LastIndex(svg, "") diff --git a/lib/pdf/pdf.go b/lib/pdf/pdf.go index 85d6b7971..acfe26370 100644 --- a/lib/pdf/pdf.go +++ b/lib/pdf/pdf.go @@ -31,8 +31,8 @@ func Init() *GoFPDF { UnitStr: "pt", }) - newGofPDF.AddUTF8FontFromBytes("source", "", d2fonts.FontFaces.Get(d2fonts.SourceSansPro.Font(0, d2fonts.FONT_STYLE_REGULAR))) - newGofPDF.AddUTF8FontFromBytes("source", "B", d2fonts.FontFaces.Get(d2fonts.SourceSansPro.Font(0, d2fonts.FONT_STYLE_BOLD))) + newGofPDF.AddUTF8FontFromBytes("source", "", d2fonts.FontFaces.MustGet(d2fonts.SourceSansPro.Font(0, d2fonts.FONT_STYLE_REGULAR))) + newGofPDF.AddUTF8FontFromBytes("source", "B", d2fonts.FontFaces.MustGet(d2fonts.SourceSansPro.Font(0, d2fonts.FONT_STYLE_BOLD))) newGofPDF.SetAutoPageBreak(false, 0) newGofPDF.SetLineWidth(2) newGofPDF.SetMargins(0, 0, 0) diff --git a/lib/syncmap/syncmap.go b/lib/syncmap/syncmap.go index 8dbb2ef1b..3ac1c1350 100644 --- a/lib/syncmap/syncmap.go +++ b/lib/syncmap/syncmap.go @@ -16,7 +16,7 @@ func (sm SyncMap[K, V]) Set(key K, value V) { sm._map.Store(key, value) } -func (sm SyncMap[K, V]) GetWithStatus(key K) (value V, ok bool) { +func (sm SyncMap[K, V]) Get(key K) (value V, ok bool) { v, has := sm._map.Load(key) if !has { return value, false @@ -24,8 +24,8 @@ func (sm SyncMap[K, V]) GetWithStatus(key K) (value V, ok bool) { return v.(V), true } -func (sm SyncMap[K, V]) Get(key K) (value V) { - v, _ := sm.GetWithStatus(key) +func (sm SyncMap[K, V]) MustGet(key K) (value V) { + v, _ := sm.Get(key) return v } diff --git a/lib/textmeasure/textmeasure.go b/lib/textmeasure/textmeasure.go index 2bd112b7d..eee20edd3 100644 --- a/lib/textmeasure/textmeasure.go +++ b/lib/textmeasure/textmeasure.go @@ -126,7 +126,7 @@ func NewRuler() (*Ruler, error) { Style: fontStyle, } // Note: FontFaces lookup is size-agnostic - face, has := d2fonts.FontFaces.GetWithStatus(font) + face, has := d2fonts.FontFaces.Get(font) if !has { continue } From c38f15712dc9e0bc078b56dccd04ebf1d8057c39 Mon Sep 17 00:00:00 2001 From: Gavin Nishizawa Date: Mon, 30 Oct 2023 15:02:20 -0700 Subject: [PATCH 6/6] rename to Lookup and Get --- d2renderers/d2fonts/d2fonts.go | 20 ++++++++++---------- d2renderers/d2fonts/d2fonts_test.go | 2 +- d2renderers/d2svg/appendix/appendix.go | 4 ++-- lib/pdf/pdf.go | 4 ++-- lib/syncmap/syncmap.go | 6 +++--- lib/textmeasure/textmeasure.go | 2 +- 6 files changed, 19 insertions(+), 19 deletions(-) diff --git a/d2renderers/d2fonts/d2fonts.go b/d2renderers/d2fonts/d2fonts.go index 717cdc8b2..a41d1bbfe 100644 --- a/d2renderers/d2fonts/d2fonts.go +++ b/d2renderers/d2fonts/d2fonts.go @@ -45,7 +45,7 @@ func (f Font) GetEncodedSubset(corpus string) string { FontFamiliesMu.Lock() defer FontFamiliesMu.Unlock() - face := FontFaces.MustGet(f) + face := FontFaces.Get(f) fontBuf := make([]byte, len(face)) copy(fontBuf, face) fontBuf = font.UTF8CutFont(fontBuf, uniqueChars) @@ -53,7 +53,7 @@ func (f Font) GetEncodedSubset(corpus string) string { fontBuf, err := fontlib.Sfnt2Woff(fontBuf) if err != nil { // If subset fails, return full encoding - return FontEncodings.MustGet(f) + return FontEncodings.Get(f) } return fmt.Sprintf("data:application/font-woff;base64,%v", base64.StdEncoding.EncodeToString(fontBuf)) @@ -366,8 +366,8 @@ func AddFontFamily(name string, regularTTF, italicTTF, boldTTF, semiboldTTF []by Family: SourceSansPro, Style: FONT_STYLE_REGULAR, } - FontFaces.Set(regularFont, FontFaces.MustGet(fallbackFont)) - FontEncodings.Set(regularFont, FontEncodings.MustGet(fallbackFont)) + FontFaces.Set(regularFont, FontFaces.Get(fallbackFont)) + FontEncodings.Set(regularFont, FontEncodings.Get(fallbackFont)) } italicFont := Font{ @@ -384,8 +384,8 @@ func AddFontFamily(name string, regularTTF, italicTTF, boldTTF, semiboldTTF []by Family: SourceSansPro, Style: FONT_STYLE_ITALIC, } - FontFaces.Set(italicFont, FontFaces.MustGet(fallbackFont)) - FontEncodings.Set(italicFont, FontEncodings.MustGet(fallbackFont)) + FontFaces.Set(italicFont, FontFaces.Get(fallbackFont)) + FontEncodings.Set(italicFont, FontEncodings.Get(fallbackFont)) } boldFont := Font{ @@ -402,8 +402,8 @@ func AddFontFamily(name string, regularTTF, italicTTF, boldTTF, semiboldTTF []by Family: SourceSansPro, Style: FONT_STYLE_BOLD, } - FontFaces.Set(boldFont, FontFaces.MustGet(fallbackFont)) - FontEncodings.Set(boldFont, FontEncodings.MustGet(fallbackFont)) + FontFaces.Set(boldFont, FontFaces.Get(fallbackFont)) + FontEncodings.Set(boldFont, FontEncodings.Get(fallbackFont)) } semiboldFont := Font{ @@ -420,8 +420,8 @@ func AddFontFamily(name string, regularTTF, italicTTF, boldTTF, semiboldTTF []by Family: SourceSansPro, Style: FONT_STYLE_SEMIBOLD, } - FontFaces.Set(semiboldFont, FontFaces.MustGet(fallbackFont)) - FontEncodings.Set(semiboldFont, FontEncodings.MustGet(fallbackFont)) + FontFaces.Set(semiboldFont, FontFaces.Get(fallbackFont)) + FontEncodings.Set(semiboldFont, FontEncodings.Get(fallbackFont)) } FontFamilies = append(FontFamilies, customFontFamily) diff --git a/d2renderers/d2fonts/d2fonts_test.go b/d2renderers/d2fonts/d2fonts_test.go index d86753f4d..9c1cf4f00 100644 --- a/d2renderers/d2fonts/d2fonts_test.go +++ b/d2renderers/d2fonts/d2fonts_test.go @@ -14,7 +14,7 @@ func TestCutFont(t *testing.T) { Family: SourceCodePro, Style: FONT_STYLE_BOLD, } - face := FontFaces.MustGet(f) + face := FontFaces.Get(f) fontBuf := make([]byte, len(face)) copy(fontBuf, face) fontBuf = font.UTF8CutFont(fontBuf, " 1") diff --git a/d2renderers/d2svg/appendix/appendix.go b/d2renderers/d2svg/appendix/appendix.go index bcc8b4675..803651f35 100644 --- a/d2renderers/d2svg/appendix/appendix.go +++ b/d2renderers/d2svg/appendix/appendix.go @@ -129,7 +129,7 @@ func Append(diagram *d2target.Diagram, ruler *textmeasure.Ruler, in []byte) []by font-family: font-regular; src: url("%s"); } -]]>`, d2fonts.FontEncodings.MustGet(d2fonts.SourceSansPro.Font(0, d2fonts.FONT_STYLE_REGULAR))) +]]>`, d2fonts.FontEncodings.Get(d2fonts.SourceSansPro.Font(0, d2fonts.FONT_STYLE_REGULAR))) } if !strings.Contains(svg, `font-family: "font-bold"`) { appendix += fmt.Sprintf(``, d2fonts.FontEncodings.MustGet(d2fonts.SourceSansPro.Font(0, d2fonts.FONT_STYLE_BOLD))) +]]>`, d2fonts.FontEncodings.Get(d2fonts.SourceSansPro.Font(0, d2fonts.FONT_STYLE_BOLD))) } closingIndex := strings.LastIndex(svg, "") diff --git a/lib/pdf/pdf.go b/lib/pdf/pdf.go index acfe26370..85d6b7971 100644 --- a/lib/pdf/pdf.go +++ b/lib/pdf/pdf.go @@ -31,8 +31,8 @@ func Init() *GoFPDF { UnitStr: "pt", }) - newGofPDF.AddUTF8FontFromBytes("source", "", d2fonts.FontFaces.MustGet(d2fonts.SourceSansPro.Font(0, d2fonts.FONT_STYLE_REGULAR))) - newGofPDF.AddUTF8FontFromBytes("source", "B", d2fonts.FontFaces.MustGet(d2fonts.SourceSansPro.Font(0, d2fonts.FONT_STYLE_BOLD))) + newGofPDF.AddUTF8FontFromBytes("source", "", d2fonts.FontFaces.Get(d2fonts.SourceSansPro.Font(0, d2fonts.FONT_STYLE_REGULAR))) + newGofPDF.AddUTF8FontFromBytes("source", "B", d2fonts.FontFaces.Get(d2fonts.SourceSansPro.Font(0, d2fonts.FONT_STYLE_BOLD))) newGofPDF.SetAutoPageBreak(false, 0) newGofPDF.SetLineWidth(2) newGofPDF.SetMargins(0, 0, 0) diff --git a/lib/syncmap/syncmap.go b/lib/syncmap/syncmap.go index 3ac1c1350..9836ecce3 100644 --- a/lib/syncmap/syncmap.go +++ b/lib/syncmap/syncmap.go @@ -16,7 +16,7 @@ func (sm SyncMap[K, V]) Set(key K, value V) { sm._map.Store(key, value) } -func (sm SyncMap[K, V]) Get(key K) (value V, ok bool) { +func (sm SyncMap[K, V]) Lookup(key K) (value V, ok bool) { v, has := sm._map.Load(key) if !has { return value, false @@ -24,8 +24,8 @@ func (sm SyncMap[K, V]) Get(key K) (value V, ok bool) { return v.(V), true } -func (sm SyncMap[K, V]) MustGet(key K) (value V) { - v, _ := sm.Get(key) +func (sm SyncMap[K, V]) Get(key K) (value V) { + v, _ := sm.Lookup(key) return v } diff --git a/lib/textmeasure/textmeasure.go b/lib/textmeasure/textmeasure.go index eee20edd3..294987c05 100644 --- a/lib/textmeasure/textmeasure.go +++ b/lib/textmeasure/textmeasure.go @@ -126,7 +126,7 @@ func NewRuler() (*Ruler, error) { Style: fontStyle, } // Note: FontFaces lookup is size-agnostic - face, has := d2fonts.FontFaces.Get(font) + face, has := d2fonts.FontFaces.Lookup(font) if !has { continue }