/bs/new.go
package bs

import (
    "log"
    "os"

    _ "image/png"

    "bytex64.net/code/bitsmash/packet"
)

type EncodeOpts struct {
    Optimize int
    Palette int
}

type BitSmash struct {
    size int
    palette int
    paletteMap uint32
    packetList []packet.Packet
}

func NewFromPixels(pixels []uint8, size int, opts *EncodeOpts) BitSmash {
    bs := BitSmash{
        size,
        opts.Palette,
        createPaletteMap(pixels),
        make([]packet.Packet, 0, 1),
    }

    i := 0
    for i < len(pixels) {
        packet := findOptimalEncoding(pixels[i:], opts.Optimize)
        i += packet.Length()
        bs.packetList = append(bs.packetList, packet)
    }

    bs.packetList = findRepeats(bs.packetList)

    return bs
}

func NewFromImage(filename string, opts *EncodeOpts) BitSmash {
    image := loadImage(filename, opts)
    size := image.Bounds().Size().X
    return NewFromPixels(getPixelList(image), size, opts)
}

func NewFromFile(filename string) BitSmash {
    bs := BitSmash{
        0,
        0,
        0,
        nil,
    }

    file, err := os.Open(filename)
    defer file.Close()
    if err != nil {
        log.Fatalf("Failed to open: %v", err)
    }
    err = bs.ReadFrom(file)
    if err != nil {
        log.Fatalf("Reading file: %v", err)
    }

    return bs
}