nori/gawi.go

86 lines
1.8 KiB
Go

package nori
import (
"encoding/binary"
"fmt"
"io"
)
type GawiSection struct {
Version uint32
Bpp uint32
IsCompressed bool
Params [4]uint32
BmpCount uint32
Size uint32
HasPalette bool
Palette *PaletteSection
Images []*Image
lastSignature [4]byte
}
func (g *GawiSection) Decode(rd io.Reader) error {
if _, err := io.ReadFull(rd, g.lastSignature[:]); err != nil {
return err
}
if sig, target := string(g.lastSignature[:]), "GAWI"; sig != target {
return fmt.Errorf("bad sig: want %s, got %s", target, sig)
}
if err := binary.Read(rd, end, &g.Version); err != nil {
return err
}
if g.Version != 300 {
return fmt.Errorf("bad ver: want 300, got %d", g.Version)
}
if err := binary.Read(rd, end, &g.Bpp); err != nil {
return err
}
good := false
for _, v := range [3]uint32{8, 16, 24} {
if g.Bpp == v {
good = true
}
}
if !good {
return fmt.Errorf("bad bpp: %d", g.Bpp)
}
var container uint32
if err := binary.Read(rd, end, &container); err != nil {
return err
}
g.IsCompressed = (container == 1)
if err := binary.Read(rd, end, &container); err != nil {
return err
}
g.HasPalette = (container > 0)
if err := binary.Read(rd, end, g.Params[:]); err != nil {
return err
}
if err := binary.Read(rd, end, &g.BmpCount); err != nil {
return err
}
if err := binary.Read(rd, end, &g.Size); err != nil {
return err
}
if g.HasPalette {
g.Palette = &PaletteSection{}
if err := g.Palette.Decode(rd); err != nil {
return err
}
}
if err := discardN(rd, 4*int(g.BmpCount)); err != nil {
return err
}
g.Images = make([]*Image, int(g.BmpCount))
for i := range g.Images {
g.Images[i] = &Image{Bpp: g.Bpp}
if err := g.Images[i].Decode(rd, g.Palette); err != nil {
return err
}
}
return nil
}