From b9b1310346c8fe1d696d979c2dbc979030c8c128 Mon Sep 17 00:00:00 2001 From: Alex Yatskov Date: Sun, 16 Dec 2018 18:07:24 -0800 Subject: [PATCH] work in progress on getting dc6 files read in --- formats/dc6/dc6.go | 97 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/formats/dc6/dc6.go b/formats/dc6/dc6.go index c751858..49c1fb6 100644 --- a/formats/dc6/dc6.go +++ b/formats/dc6/dc6.go @@ -1 +1,98 @@ package dc6 + +import ( + "encoding/binary" + "io" +) + +const ( + FlagIsSerialized = 1 << iota + FlagIsLoadedInHw + FlagIs24Bits +) + +type FileHeader struct { + Version uint32 + Flags uint32 + Format uint32 + SkipColor uint32 + DirCount uint32 + FramesPerDir uint32 +} + +type FrameHeader struct { + Flip uint32 + Width uint32 + Height uint32 + OffsetX uint32 + OffsetY uint32 + AllocSize uint32 + NextBlock uint32 + Block uint32 +} + +type Frame struct { + Width int + Height int + OffsetX int + OffsetY int + Data []byte +} + +type Dc6 struct { + Frames []Frame +} + +func New(reader io.ReadSeeker) (*Dc6, error) { + sprite := new(Dc6) + + var fileHeader FileHeader + if err := binary.Read(reader, binary.LittleEndian, &fileHeader); err != nil { + return nil, err + } + + var frameOffsets []uint32 + for i := 0; i < int(fileHeader.DirCount*fileHeader.FramesPerDir); i++ { + var frameOffset uint32 + if err := binary.Read(reader, binary.LittleEndian, &frameOffset); err != nil { + return nil, err + } + + frameOffsets = append(frameOffsets, frameOffset) + } + + for _, frameOffset := range frameOffsets { + var frameHeader FrameHeader + if _, err := reader.Seek(int64(frameOffset), io.SeekStart); err != nil { + return nil, err + } + + if err := binary.Read(reader, binary.LittleEndian, &frameHeader); err != nil { + return nil, err + } + + frame := Frame{ + int(frameHeader.Width), + int(frameHeader.Height), + int(frameHeader.OffsetX), + int(frameHeader.OffsetY), + make([]byte, frameHeader.Width*frameHeader.Height), + } + + if _, err := io.ReadFull(reader, frame.Data); err != nil { + return nil, err + } + + if err := extractFrame(reader, frameHeader); err != nil { + return nil, err + } + + sprite.Frames = append(sprite.Frames, frame) + } + + return sprite, nil +} + +func extractFrame(reader io.ReadSeeker, header FrameHeader) error { + return nil +}