func newSetFuncPaletted(p *image.Paletted) SetFunc { return func(x, y int, r, g, b, a uint32) { i := p.PixOffset(x, y) p.Pix[i] = uint8(p.Palette.Index(color.RGBA64{ R: uint16(r), G: uint16(g), B: uint16(b), A: uint16(a), })) } }
func untile(m *image.Paletted, data []byte) { w, h := m.Rect.Dx(), m.Rect.Dy() for i, x := 0, 0; x < w; x += 8 { for y := 0; y < h; y += 8 { for ty := 0; ty < 8; ty++ { pix := mingle(uint16(data[i]), uint16(data[i+1])) for tx := 7; tx >= 0; tx-- { i := m.PixOffset(x+tx, y+ty) m.Pix[i] = uint8(pix & 3) pix >>= 2 } i += 2 } } } }
func encodeImageBlock(w io.Writer, img *image.Paletted) error { // start image litWidth := int(paletteBits(img.Palette)) if litWidth < 2 { litWidth = 2 } bounds := img.Bounds() if err := writeData(w, byte(0x2C), uint16(bounds.Min.X), uint16(bounds.Min.Y), uint16(bounds.Dx()), uint16(bounds.Dy()), byte(0), byte(litWidth), ); err != nil { return err } // start compression blocks := &blockWriter{w: w} compress := lzw.NewWriter(blocks, lzw.LSB, litWidth) // write each scan line (might not be contiguous) startX := img.Rect.Min.X stopX := img.Rect.Max.X stopY := img.Rect.Max.Y for y := img.Rect.Min.Y; y < stopY; y++ { start := img.PixOffset(startX, y) stop := img.PixOffset(stopX, y) if _, err := compress.Write(img.Pix[start:stop]); err != nil { return err } } if err := compress.Close(); err != nil { return err } return blocks.Close() }
func newAtFuncPaletted(p *image.Paletted) AtFunc { return func(x, y int) (r, g, b, a uint32) { i := p.PixOffset(x, y) return p.Palette[p.Pix[i]].RGBA() } }