1
1
mirror of https://github.com/OpenDiablo2/OpenDiablo2 synced 2024-11-18 02:16:23 -05:00

d2font: removed d2interface.Animation argument from d2font.Load; added height reading in glyphs loader

This commit is contained in:
M. Sz 2021-02-09 08:43:46 +01:00
parent 51833ed2de
commit d9cfe7f435
2 changed files with 34 additions and 10 deletions

View File

@ -18,7 +18,7 @@ const (
signatureBytesCount = 5 signatureBytesCount = 5
unknownHeaderBytesCount = 7 unknownHeaderBytesCount = 7
unknown1BytesCount = 1 unknown1BytesCount = 1
unknown2BytesCount = 4 unknown2BytesCount = 3
unknown3BytesCount = 4 unknown3BytesCount = 4
) )
@ -31,17 +31,21 @@ type fontGlyph struct {
height int height int
} }
func (fg *fontGlyph) setHeight(h int) {
fg.height = h
}
// Font represents a displayable font // Font represents a displayable font
type Font struct { type Font struct {
unknownHeaderBytes []byte unknownHeaderBytes []byte
sheet d2interface.Animation sheet d2interface.Animation
table []byte table []byte
glyphs map[rune]fontGlyph glyphs map[rune]*fontGlyph
color color.Color color color.Color
} }
// Load loads a new font from byte slice // Load loads a new font from byte slice
func Load(data []byte, sheet d2interface.Animation) (*Font, error) { func Load(data []byte) (*Font, error) {
sr := d2datautils.CreateStreamReader(data) sr := d2datautils.CreateStreamReader(data)
signature, err := sr.ReadBytes(signatureBytesCount) signature, err := sr.ReadBytes(signatureBytesCount)
@ -55,7 +59,6 @@ func Load(data []byte, sheet d2interface.Animation) (*Font, error) {
font := &Font{ font := &Font{
table: data, table: data,
sheet: sheet,
color: color.White, color: color.White,
} }
@ -72,6 +75,18 @@ func Load(data []byte, sheet d2interface.Animation) (*Font, error) {
return font, nil return font, nil
} }
// SetBackground sets font's background
func (f *Font) SetBackground(sheet d2interface.Animation) {
f.sheet = sheet
// recalculate max height
_, h := f.sheet.GetFrameBounds()
for i := range f.glyphs {
f.glyphs[i].setHeight(h)
}
}
// SetColor sets the fonts color // SetColor sets the fonts color
func (f *Font) SetColor(c color.Color) { func (f *Font) SetColor(c color.Color) {
f.color = c f.color = c
@ -142,9 +157,7 @@ func (f *Font) RenderText(text string, target d2interface.Surface) error {
} }
func (f *Font) initGlyphs(sr *d2datautils.StreamReader) error { func (f *Font) initGlyphs(sr *d2datautils.StreamReader) error {
_, maxCharHeight := f.sheet.GetFrameBounds() glyphs := make(map[rune]*fontGlyph)
glyphs := make(map[rune]fontGlyph)
for i := 12; i < len(f.table); i += 14 { for i := 12; i < len(f.table); i += 14 {
code, err := sr.ReadUInt16() code, err := sr.ReadUInt16()
@ -154,6 +167,7 @@ func (f *Font) initGlyphs(sr *d2datautils.StreamReader) error {
var glyph fontGlyph var glyph fontGlyph
// two bytes of 0
glyph.unknown1, err = sr.ReadBytes(unknown1BytesCount) glyph.unknown1, err = sr.ReadBytes(unknown1BytesCount)
if err != nil { if err != nil {
return err return err
@ -166,8 +180,14 @@ func (f *Font) initGlyphs(sr *d2datautils.StreamReader) error {
glyph.width = int(width) glyph.width = int(width)
glyph.height = maxCharHeight height, err := sr.ReadByte()
if err != nil {
return err
}
glyph.height = int(height)
// 1, 0, 0
glyph.unknown2, err = sr.ReadBytes(unknown2BytesCount) glyph.unknown2, err = sr.ReadBytes(unknown2BytesCount)
if err != nil { if err != nil {
return err return err
@ -180,12 +200,13 @@ func (f *Font) initGlyphs(sr *d2datautils.StreamReader) error {
glyph.frame = int(frame) glyph.frame = int(frame)
// 1, 0, 0, character code repeated, and further 0.
glyph.unknown3, err = sr.ReadBytes(unknown3BytesCount) glyph.unknown3, err = sr.ReadBytes(unknown3BytesCount)
if err != nil { if err != nil {
return err return err
} }
glyphs[rune(code)] = glyph glyphs[rune(code)] = &glyph
} }
f.glyphs = glyphs f.glyphs = glyphs
@ -204,6 +225,7 @@ func (f *Font) Marshal() []byte {
sw.PushUint16(uint16(c)) sw.PushUint16(uint16(c))
sw.PushBytes(i.unknown1...) sw.PushBytes(i.unknown1...)
sw.PushBytes(byte(i.width)) sw.PushBytes(byte(i.width))
sw.PushBytes(byte(i.height))
sw.PushBytes(i.unknown2...) sw.PushBytes(i.unknown2...)
sw.PushUint16(uint16(i.frame)) sw.PushUint16(uint16(i.frame))
sw.PushBytes(i.unknown3...) sw.PushBytes(i.unknown3...)

View File

@ -228,11 +228,13 @@ func (am *AssetManager) LoadFont(tablePath, spritePath, palettePath string) (*d2
am.Debugf(fmtLoadFont, tablePath, spritePath, palettePath) am.Debugf(fmtLoadFont, tablePath, spritePath, palettePath)
font, err := d2font.Load(tableData, sheet) font, err := d2font.Load(tableData)
if err != nil { if err != nil {
return nil, fmt.Errorf("error while loading font table %s: %v", tablePath, err) return nil, fmt.Errorf("error while loading font table %s: %v", tablePath, err)
} }
font.SetBackground(sheet)
err = am.fonts.Insert(cachePath, font, defaultCacheEntryWeight) err = am.fonts.Insert(cachePath, font, defaultCacheEntryWeight)
return font, err return font, err