diff --git a/binary_image_palette.py b/binary_image_palette.py deleted file mode 100644 index bc967e7..0000000 --- a/binary_image_palette.py +++ /dev/null @@ -1,78 +0,0 @@ -import struct -import sys - -from PIL import Image - -def round_up_palette_size(palette_size): - assert palette_size != 0, (name, palette_size) - if palette_size <= 4: - return 4 - elif palette_size <= 16: - return 16 - elif palette_size <= 256: - return 256 - else: - assert False, palette_size - -def pixels_per_byte(palette_size): - if palette_size == 4: - return 4 - elif palette_size == 16: - return 2 - elif palette_size == 256: - return 1 - else: - assert False, palette_size - -def pack_one_byte(pixels, index, colors, palette_size): - color_count = len(colors) - num = pixels_per_byte(palette_size) - shift = 8 // num - byte = 0 - i = 0 - while num > 0: - px, alpha = pixels[index] - if alpha == 0 and color_count < palette_size: - px = color_count - assert px < palette_size - byte |= px << (shift * i) - index += 1 - i += 1 - num -= 1 - return [byte], index - -def pack_one_texel(pixels, index, colors, palette_size): - px, alpha = pixels[index] - return - -def pack_pixels(pixels, width, height, colors, palette_size): - index = 0 - with open(sys.argv[2], 'wb') as f: - while index < (width * height): - byte_list, index = pack_texel(pixels, index, colors, palette_size) - f.write(bytes(byte)) - -def pack_palette(colors, palette_size): - with open(sys.argv[2], 'wb') as f: - for color in colors: - out = argb1555(255, *color) - f.write(struct.pack('> 3) & 31 + g6 = (g >> 3) & 31 + g6_l = (g >> 2) & 1 + b5 = (b >> 3) & 31 + return (g6_l << 15) | (b5 << 10) | (g6 << 5) | (r5 << 0) + + def argb4444(r, g, b, a): + a4 = (a >> 4) & 15 + r4 = (r >> 4) & 15 + g4 = (g >> 4) & 15 + b4 = (b >> 4) & 15 + return (a4 << 12) | (r4 << 8) | (g4 << 4) | (b4 << 0) + + def argb1555(r, g, b, a): + a1 = (a >> 7) & 1 + r5 = (r >> 3) & 31 + g5 = (g >> 3) & 31 + b5 = (b >> 3) & 31 + return (a1 << 15) | (r5 << 10) | (g5 << 5) | (b5 << 0) + + def rgb565(r, g, b, a): + r5 = (r >> 3) & 31 + g6 = (g >> 2) & 63 + b5 = (b >> 3) & 31 + return (r5 << 11) | (g5 << 5) | (b5 << 0) + + def from_string(s): + return dict([ + ("gbgr1555", color_format.gbgr1555), + ("argb4444", color_format.argb4444), + ("argb1555", color_format.argb1555), + ("rgb565", color_format.rgb565), + ])[s] + +in_file = sys.argv[1] +format = sys.argv[2] +out_file = sys.argv[3] + +palette = None + +with Image.open(in_file) as im: + width, height = im.size + if not im.palette: + pixels = list(im.convert("RGBA").getdata()) + else: + pixels = list(im.convert("P").getdata()) + palette = list(im.palette.colors) + +has_alpha = False +convert = color_format.from_string(format) + +def convert_colors(f, colors): + for color in colors: + value = convert(*color) + f.write(struct.pack("