lazarus/formats/dcc/frame.go

65 lines
1.8 KiB
Go
Raw Normal View History

2019-02-10 20:23:35 +00:00
package dcc
import (
"errors"
"github.com/FooSoft/lazarus/streaming"
)
type frameHeader struct {
Variable0 uint32
Width uint32
Height uint32
OffsetX int32
OffsetY int32
OptionalBytes uint32
CodedBytes uint32
FrameBottomUp bool
}
type frame struct {
header frameHeader
bounds bounds
}
func readFrameHeader(bitReader *streaming.BitReader, dirHead directionHeader) frameHeader {
var frameHead frameHeader
frameHead.Variable0 = uint32(bitReader.ReadUintPacked(int(dirHead.Variable0Bits)))
frameHead.Width = uint32(bitReader.ReadUintPacked(int(dirHead.WidthBits)))
frameHead.Height = uint32(bitReader.ReadUintPacked(int(dirHead.HeightBits)))
frameHead.OffsetX = int32(bitReader.ReadIntPacked(int(dirHead.OffsetXBits)))
frameHead.OffsetY = int32(bitReader.ReadIntPacked(int(dirHead.OffsetYBits)))
frameHead.OptionalBytes = uint32(bitReader.ReadUintPacked(int(dirHead.OptionalBytesBits)))
frameHead.CodedBytes = uint32(bitReader.ReadUintPacked(int(dirHead.CodedBytesBits)))
frameHead.FrameBottomUp = bitReader.ReadBool()
return frameHead
}
func readFrameHeaders(bitReader *streaming.BitReader, fileHead fileHeader, dirHead directionHeader) ([]frameHeader, error) {
var frameHeads []frameHeader
for i := 0; i < int(fileHead.FramesPerDir); i++ {
frameHead := readFrameHeader(bitReader, dirHead)
if err := bitReader.Error(); err != nil {
return nil, err
}
if frameHead.OptionalBytes != 0 {
return nil, errors.New("optional frame data not supported")
}
if frameHead.FrameBottomUp {
return nil, errors.New("bottom-up frames are not supported")
}
if frameHead.Width == 0 || frameHead.Height == 0 {
return nil, errors.New("invalid frame dimensions")
}
frameHeads = append(frameHeads, frameHead)
}
return frameHeads, nil
}