commit:ba3337f40ebfd836f3dba55a909a03f47a324a6f
author:Chip Black
committer:Chip Black
date:Sun Nov 22 02:53:50 2015 -0600
parents:0d77ac0596d5da46ee67a9f48c9ee9e34f996dab
Add palette map to bias color encoding to the ones we're using
diff --git a/bs/codec_manager.go b/bs/codec_manager.go
line changes: +8/-2
index 72284cf..00b9b6e
--- a/bs/codec_manager.go
+++ b/bs/codec_manager.go
@@ -5,9 +5,15 @@ import (
     "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))

diff --git a/bs/io.go b/bs/io.go
line changes: +10/-6
index 46de10a..2dd539e
--- a/bs/io.go
+++ b/bs/io.go
@@ -25,9 +25,9 @@ func (self *BitSmash) packetType(n int) int {
 }
 
 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
@@ -36,14 +36,16 @@ func (self *BitSmash) ReadFrom(file io.Reader) error {
     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!!!
@@ -70,7 +72,7 @@ func (self *BitSmash) WriteTo(file io.Writer) error {
         return errors.New("Too many packets")
     }
 
-    var header [3]byte
+    var header [5]byte
     transparent := 0
     if (self.transparent) {
         transparent = 1
@@ -78,6 +80,8 @@ func (self *BitSmash) WriteTo(file io.Writer) error {
     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[:])
 
@@ -85,7 +89,7 @@ func (self *BitSmash) WriteTo(file io.Writer) error {
     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)))

diff --git a/bs/new.go b/bs/new.go
line changes: +3/-0
index 4c9eb20..3261116
--- a/bs/new.go
+++ b/bs/new.go
@@ -17,6 +17,7 @@ type EncodeOpts struct {
 type BitSmash struct {
     size int
     palette int
+    paletteMap uint16
     transparent bool
     packetList []packet.Packet
 }
@@ -25,6 +26,7 @@ func NewFromPixels(pixels []uint8, size int, opts *EncodeOpts) BitSmash {
     bs := BitSmash{
         size,
         opts.Palette,
+        createPaletteMap(pixels),
         false,
         make([]packet.Packet, 0, 1),
     }
@@ -51,6 +53,7 @@ func NewFromFile(filename string) BitSmash {
     bs := BitSmash{
         0,
         0,
+        0,
         false,
         nil,
     }

diff --git a/bs/palette.go b/bs/palette.go
line changes: +10/-0
index 0c7fa2c..be6dbb0
--- a/bs/palette.go
+++ b/bs/palette.go
@@ -33,3 +33,13 @@ func findPalette(img image.Image) int {
 
     return selected
 }
+
+func createPaletteMap(pixels []uint8) uint16 {
+    m := uint16(0);
+
+    for _, v := range(pixels) {
+        m |= 1 << v;
+    }
+
+    return m;
+}

diff --git a/bs/util.go b/bs/util.go
line changes: +1/-0
index 65b2b44..1b707a2
--- a/bs/util.go
+++ b/bs/util.go
@@ -53,6 +53,7 @@ func (self *BitSmash) Dump() {
     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