mirror of https://github.com/liamg/aminal.git
78 lines
1.5 KiB
Go
78 lines
1.5 KiB
Go
package gui
|
|
|
|
import "github.com/liamg/aminal/glfont"
|
|
|
|
type FontMap struct {
|
|
defaultFont *glfont.Font
|
|
defaultBoldFont *glfont.Font
|
|
runeMap map[rune]*glfont.Font
|
|
ranges map[runeRange]*glfont.Font
|
|
}
|
|
|
|
type runeRange struct {
|
|
start rune
|
|
end rune // inclusive
|
|
}
|
|
|
|
func NewFontMap(defaultFont *glfont.Font, defaultBoldFont *glfont.Font) *FontMap {
|
|
return &FontMap{
|
|
defaultFont: defaultFont,
|
|
defaultBoldFont: defaultBoldFont,
|
|
runeMap: map[rune]*glfont.Font{},
|
|
ranges: map[runeRange]*glfont.Font{},
|
|
}
|
|
}
|
|
|
|
func (fm *FontMap) UpdateResolution(w int, h int) {
|
|
fm.defaultFont.UpdateResolution(w, h)
|
|
fm.defaultBoldFont.UpdateResolution(w, h)
|
|
for _, f := range fm.ranges {
|
|
f.UpdateResolution(w, h)
|
|
}
|
|
}
|
|
|
|
func (fm *FontMap) findOverride(r rune) *glfont.Font {
|
|
|
|
override, ok := fm.runeMap[r]
|
|
if ok {
|
|
return override
|
|
}
|
|
|
|
for rr, f := range fm.ranges {
|
|
if r >= rr.start && r <= rr.end {
|
|
fm.runeMap[r] = f
|
|
return f
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (fm *FontMap) setOverrideRange(start rune, end rune, font *glfont.Font) {
|
|
fm.ranges[runeRange{start: start, end: end}] = font
|
|
}
|
|
|
|
func (fm *FontMap) GetFont(r rune) *glfont.Font {
|
|
if r <= 0xff {
|
|
return fm.defaultFont
|
|
}
|
|
|
|
if f := fm.findOverride(r); f != nil {
|
|
return f
|
|
}
|
|
|
|
return fm.defaultFont
|
|
}
|
|
|
|
func (fm *FontMap) GetBoldFont(r rune) *glfont.Font {
|
|
if r <= 0xff {
|
|
return fm.defaultBoldFont
|
|
}
|
|
|
|
if f := fm.findOverride(r); f != nil {
|
|
return f
|
|
}
|
|
|
|
return fm.defaultBoldFont
|
|
}
|