mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-25 11:18:54 +01:00
Revert "text/v2: remove faceWithCache's mutex"
This reverts commit d5c6fd174f
.
Reason: CacheGlyphs and Measure should be concurrent safe.
This commit is contained in:
parent
d5c6fd174f
commit
9449e0a8a6
@ -16,6 +16,7 @@ package text
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"image"
|
"image"
|
||||||
|
"sync"
|
||||||
|
|
||||||
"golang.org/x/image/font"
|
"golang.org/x/image/font"
|
||||||
"golang.org/x/image/math/fixed"
|
"golang.org/x/image/math/fixed"
|
||||||
@ -43,6 +44,8 @@ type faceWithCache struct {
|
|||||||
glyphBoundsCache map[rune]glyphBoundsCacheValue
|
glyphBoundsCache map[rune]glyphBoundsCacheValue
|
||||||
glyphAdvanceCache map[rune]glyphAdvanceCacheValue
|
glyphAdvanceCache map[rune]glyphAdvanceCacheValue
|
||||||
kernCache map[kernCacheKey]fixed.Int26_6
|
kernCache map[kernCacheKey]fixed.Int26_6
|
||||||
|
|
||||||
|
m sync.Mutex
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *faceWithCache) Close() error {
|
func (f *faceWithCache) Close() error {
|
||||||
@ -50,6 +53,9 @@ func (f *faceWithCache) Close() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
f.m.Lock()
|
||||||
|
defer f.m.Unlock()
|
||||||
|
|
||||||
f.glyphBoundsCache = nil
|
f.glyphBoundsCache = nil
|
||||||
f.glyphAdvanceCache = nil
|
f.glyphAdvanceCache = nil
|
||||||
f.kernCache = nil
|
f.kernCache = nil
|
||||||
@ -61,6 +67,9 @@ func (f *faceWithCache) Glyph(dot fixed.Point26_6, r rune) (dr image.Rectangle,
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (f *faceWithCache) GlyphBounds(r rune) (bounds fixed.Rectangle26_6, advance fixed.Int26_6, ok bool) {
|
func (f *faceWithCache) GlyphBounds(r rune) (bounds fixed.Rectangle26_6, advance fixed.Int26_6, ok bool) {
|
||||||
|
f.m.Lock()
|
||||||
|
defer f.m.Unlock()
|
||||||
|
|
||||||
if v, ok := f.glyphBoundsCache[r]; ok {
|
if v, ok := f.glyphBoundsCache[r]; ok {
|
||||||
return v.bounds, v.advance, v.ok
|
return v.bounds, v.advance, v.ok
|
||||||
}
|
}
|
||||||
@ -78,6 +87,9 @@ func (f *faceWithCache) GlyphBounds(r rune) (bounds fixed.Rectangle26_6, advance
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (f *faceWithCache) GlyphAdvance(r rune) (advance fixed.Int26_6, ok bool) {
|
func (f *faceWithCache) GlyphAdvance(r rune) (advance fixed.Int26_6, ok bool) {
|
||||||
|
f.m.Lock()
|
||||||
|
defer f.m.Unlock()
|
||||||
|
|
||||||
if v, ok := f.glyphAdvanceCache[r]; ok {
|
if v, ok := f.glyphAdvanceCache[r]; ok {
|
||||||
return v.advance, v.ok
|
return v.advance, v.ok
|
||||||
}
|
}
|
||||||
@ -94,6 +106,9 @@ func (f *faceWithCache) GlyphAdvance(r rune) (advance fixed.Int26_6, ok bool) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (f *faceWithCache) Kern(r0, r1 rune) fixed.Int26_6 {
|
func (f *faceWithCache) Kern(r0, r1 rune) fixed.Int26_6 {
|
||||||
|
f.m.Lock()
|
||||||
|
defer f.m.Unlock()
|
||||||
|
|
||||||
key := kernCacheKey{r0: r0, r1: r1}
|
key := kernCacheKey{r0: r0, r1: r1}
|
||||||
if v, ok := f.kernCache[key]; ok {
|
if v, ok := f.kernCache[key]; ok {
|
||||||
return v
|
return v
|
||||||
|
Loading…
Reference in New Issue
Block a user