Add palette map to bias color encoding to the ones we're using
"bytex64.net/code/bitsmash/ac"
)
-func (self *BitSmash) codecManagerInit(c ac.CodecManager) {
+func (self *BitSmash) codecManagerInit(c ac.CodecManager, paletteMap uint16) {
+ var colorBiases [16]uint32
+ for i := 0; i < 16; i++ {
+ colorBiases[i] = uint32(paletteMap & 1)
+ paletteMap >>= 1
+ }
+
c.AddModel(packet.CONTEXT_PACKET_TYPE, ac.NewModelOrder0(4))
- c.AddModel(packet.CONTEXT_COLOR, ac.NewModelOrder0(16))
+ c.AddModel(packet.CONTEXT_COLOR, ac.NewModelOrder0PreBias(16, colorBiases[:]))
c.AddModel(packet.CONTEXT_PATTERN_NUMBER, ac.NewModelOrder0PreBias(16, packet.ContextBias(packet.CONTEXT_PATTERN_NUMBER)))
c.AddModel(packet.CONTEXT_PATTERN_REPEAT, ac.NewModelOrder0PreBias(8, packet.ContextBias(packet.CONTEXT_PATTERN_REPEAT)))
c.AddModel(packet.CONTEXT_RLE_REPEAT, ac.NewModelOrder0(16))
}
func (self *BitSmash) ReadFrom(file io.Reader) error {
- var header [3]byte
+ var header [5]byte
n, err := file.Read(header[:])
- if n < 3 {
+ if n < 5 {
log.Fatal("Short read on header")
} else if err != nil {
return err
self.palette = (int(header[0]) >> 3) & 0xF
self.transparent = ((header[0] >> 7) & 0x1) == 1
- n_packets := int(header[1]) + (int(header[2]) & 0x3) + 1
+ n_packets := int(header[1]) + (int(header[2] & 0x3) << 8) + 1
self.packetList = make([]packet.Packet, n_packets)
+ self.paletteMap = uint16(header[3]) + (uint16(header[4]) << 8);
+
decoder, err := ac.NewDecoder(file)
if err != nil {
return err
}
- self.codecManagerInit(decoder)
+ self.codecManagerInit(decoder, self.paletteMap)
for i := 0; i < n_packets; i++ {
var pkt packet.Packet // Packet! PACKET! PACKET!!!
return errors.New("Too many packets")
}
- var header [3]byte
+ var header [5]byte
transparent := 0
if (self.transparent) {
transparent = 1
header[0] = byte(sizeIndex(self.size) + (self.palette << 3) + (transparent << 7))
header[1] = byte((n_packets - 1) & 0xFF)
header[2] = byte(((n_packets - 1) >> 8) & 0x3)
+ header[3] = byte(self.paletteMap & 0xFF)
+ header[4] = byte(self.paletteMap >> 8)
file.Write(header[:])
if err != nil {
return err
}
- self.codecManagerInit(encoder)
+ self.codecManagerInit(encoder, self.paletteMap)
for i, p := range(self.packetList) {
encoder.Encode(packet.CONTEXT_PACKET_TYPE, uint32(self.packetType(i)))
type BitSmash struct {
size int
palette int
+ paletteMap uint16
transparent bool
packetList []packet.Packet
}
bs := BitSmash{
size,
opts.Palette,
+ createPaletteMap(pixels),
false,
make([]packet.Packet, 0, 1),
}
bs := BitSmash{
0,
0,
+ 0,
false,
nil,
}
return selected
}
+
+func createPaletteMap(pixels []uint8) uint16 {
+ m := uint16(0);
+
+ for _, v := range(pixels) {
+ m |= 1 << v;
+ }
+
+ return m;
+}
self.unpackRepeat()
size := self.Size()
fmt.Printf("%d pixels, %dx%d\n", self.Length(), size.X, size.Y)
+ fmt.Printf("Palette %d, palette map %b\n", self.palette, self.paletteMap)
fmt.Printf("%d packets:\n", len(self.packetList))
c := 0