From 0684c35951518c4d6b32eb988276980148ecbce4 Mon Sep 17 00:00:00 2001 From: dP Date: Sun, 31 Dec 2023 21:24:30 +0530 Subject: [PATCH] Update cmclient grf to use latest version of grf-py --- bin/data/cmclient-5.grf | Bin 135908 -> 91470 bytes grf/cmclient/gencmclientgrf.py | 100 +++++++----- grf/cmclient/grf.py | 290 --------------------------------- 3 files changed, 59 insertions(+), 331 deletions(-) delete mode 100644 grf/cmclient/grf.py diff --git a/bin/data/cmclient-5.grf b/bin/data/cmclient-5.grf index 059f98f9b0cd115fdfea81716d984ab267fcce8a..0f95982fc210cda95fe4b7a16cfdf964bebabfd8 100644 GIT binary patch delta 37823 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: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 0: - return x.brighten(amount=2.56 * level) + return grf.oklab_blend(x, grf.srgb_to_oklab((255, 255, 192)), ratio=0.04 * level) else: - return x.darken(amount=-2.56 * level) + return grf.oklab_blend(x, grf.srgb_to_oklab((4, 0, 16)), ratio=-0.04 * level) + # l, a, b = x + # l = min(max(l + 0.019 * level, 0.), 1.) + # return np.array((l, a, b)) return func + def gen_white_tint_contrast(): def func(x): - white = spectra.rgb(1.0, 1.0, 1.0) - x = x.blend(white, ratio=0.4) - if grf.color_distance(x, white) < 0.5: - x = x.blend(spectra.rgb(0.5, 1.0, 0.0), ratio=0.2) + # white = grf.srgb_to_oklab((255, 255, 255)) + white = np.array((1., 0, 0)) + x = grf.oklab_blend(x, white, ratio=0.4) + # if grf.color_distance(x, white) < 0.5: + # x = x.blend(spectra.rgb(0.5, 1.0, 0.0), ratio=0.2) return x return func -remap = lambda f: gen.add_sprite(grf.PaletteRemap.from_function(f, remap_water=True)) -remap(gen_tint(spectra.rgb(1, 0, 0), 0.6)) # deep red tint -remap(gen_tint(spectra.rgb(1, 0.5, 0), 0.65)) # deep orange tint -remap(gen_tint(spectra.rgb(0, 1, 0), 0.65)) # deep green tint -remap(gen_tint(spectra.rgb(0, 1, 1), 0.65)) # deep cyan tint -remap(gen_tint(spectra.rgb(1, 0, 0), 0.4)) # red tint -remap(gen_tint(spectra.rgb(1, 0.5, 0), 0.4)) # orange tint -remap(gen_tint(spectra.rgb(1.0, 1.0, 0), 0.4)) # yellow tint -remap(gen_tint(spectra.rgb(1.0, 1.0, 0.5), 0.4)) # yellow white tint +remap = lambda f: g.add(grf.PaletteRemap.oklab_from_function(f, remap_water=True)) +remap(gen_tint((1, 0, 0), 0.6)) # deep red tint +remap(gen_tint((1, 0.5, 0), 0.65)) # deep orange tint +remap(gen_tint((0, 1, 0), 0.65)) # deep green tint +remap(gen_tint((0, 1, 1), 0.65)) # deep cyan tint +remap(gen_tint((1, 0, 0), 0.4)) # red tint +remap(gen_tint((1, 0.5, 0), 0.4)) # orange tint +remap(gen_tint((1.0, 1.0, 0), 0.4)) # yellow tint +remap(gen_tint((1.0, 1.0, 0.5), 0.4)) # yellow white tint remap(gen_white_tint_contrast()) # white tint -remap(gen_tint(spectra.rgb(0, 1.0, 0), 0.4)) # green tint -remap(gen_tint(spectra.rgb(0, 1.0, 1.0), 0.4)) # cyan tint -remap(gen_tint(spectra.rgb(0.5, 1.0, 1.0), 0.4)) # cyan white tint -remap(gen_tint(spectra.rgb(0, 0, 1.0), 0.4)) # blue tint +remap(gen_tint((0, 1.0, 0), 0.4)) # green tint +remap(gen_tint((0, 1.0, 1.0), 0.4)) # cyan tint +remap(gen_tint((0.5, 1.0, 1.0), 0.4)) # cyan white tint +remap(gen_tint((0, 0, 1.0), 0.4)) # blue tint B = 22.2 remap(gen_brightness(21.7 - B)) # shade N @@ -193,4 +206,9 @@ remap(gen_brightness(18.4 - B)) # shade SW remap(gen_brightness(17.1 - B)) # shade W remap(gen_brightness(17.5 - B)) # shade NW -gen.write('../../bin/data/cmclient-5.grf') +grf.main(g, '../../bin/data/cmclient-5.grf') + +# func = gen_brightness(17.1 - B) +# grf.make_palette_image([grf.oklab_to_srgb(func(x)) for x in grf.OKLAB_PALETTE]).show() +# remap = grf.PaletteRemap.oklab_from_function(func, remap_water=True).remap +# grf.make_palette_image([grf.PALETTE[x] for x in remap]).show() diff --git a/grf/cmclient/grf.py b/grf/cmclient/grf.py deleted file mode 100644 index ec6e198b23..0000000000 --- a/grf/cmclient/grf.py +++ /dev/null @@ -1,290 +0,0 @@ -import math - -from PIL import Image, ImageDraw -from nml.spriteencoder import SpriteEncoder -import spectra -import struct -import numpy as np - -to_spectra = lambda r, g, b: spectra.rgb(float(r) / 255., float(g) / 255., float(b) / 255.) -# working with DOS palette only -PALETTE = (0, 0, 255, 16, 16, 16, 32, 32, 32, 48, 48, 48, 64, 64, 64, 80, 80, 80, 100, 100, 100, 116, 116, 116, 132, 132, 132, 148, 148, 148, 168, 168, 168, 184, 184, 184, 200, 200, 200, 216, 216, 216, 232, 232, 232, 252, 252, 252, 52, 60, 72, 68, 76, 92, 88, 96, 112, 108, 116, 132, 132, 140, 152, 156, 160, 172, 176, 184, 196, 204, 208, 220, 48, 44, 4, 64, 60, 12, 80, 76, 20, 96, 92, 28, 120, 120, 64, 148, 148, 100, 176, 176, 132, 204, 204, 168, 72, 44, 4, 88, 60, 20, 104, 80, 44, 124, 104, 72, 152, 132, 92, 184, 160, 120, 212, 188, 148, 244, 220, 176, 64, 0, 4, 88, 4, 16, 112, 16, 32, 136, 32, 52, 160, 56, 76, 188, 84, 108, 204, 104, 124, 220, 132, 144, 236, 156, 164, 252, 188, 192, 252, 208, 0, 252, 232, 60, 252, 252, 128, 76, 40, 0, 96, 60, 8, 116, 88, 28, 136, 116, 56, 156, 136, 80, 176, 156, 108, 196, 180, 136, 68, 24, 0, 96, 44, 4, 128, 68, 8, 156, 96, 16, 184, 120, 24, 212, 156, 32, 232, 184, 16, 252, 212, 0, 252, 248, 128, 252, 252, 192, 32, 4, 0, 64, 20, 8, 84, 28, 16, 108, 44, 28, 128, 56, 40, 148, 72, 56, 168, 92, 76, 184, 108, 88, 196, 128, 108, 212, 148, 128, 8, 52, 0, 16, 64, 0, 32, 80, 4, 48, 96, 4, 64, 112, 12, 84, 132, 20, 104, 148, 28, 128, 168, 44, 28, 52, 24, 44, 68, 32, 60, 88, 48, 80, 104, 60, 104, 124, 76, 128, 148, 92, 152, 176, 108, 180, 204, 124, 16, 52, 24, 32, 72, 44, 56, 96, 72, 76, 116, 88, 96, 136, 108, 120, 164, 136, 152, 192, 168, 184, 220, 200, 32, 24, 0, 56, 28, 0, 72, 40, 4, 88, 52, 12, 104, 64, 24, 124, 84, 44, 140, 108, 64, 160, 128, 88, 76, 40, 16, 96, 52, 24, 116, 68, 40, 136, 84, 56, 164, 96, 64, 184, 112, 80, 204, 128, 96, 212, 148, 112, 224, 168, 128, 236, 188, 148, 80, 28, 4, 100, 40, 20, 120, 56, 40, 140, 76, 64, 160, 100, 96, 184, 136, 136, 36, 40, 68, 48, 52, 84, 64, 64, 100, 80, 80, 116, 100, 100, 136, 132, 132, 164, 172, 172, 192, 212, 212, 224, 40, 20, 112, 64, 44, 144, 88, 64, 172, 104, 76, 196, 120, 88, 224, 140, 104, 252, 160, 136, 252, 188, 168, 252, 0, 24, 108, 0, 36, 132, 0, 52, 160, 0, 72, 184, 0, 96, 212, 24, 120, 220, 56, 144, 232, 88, 168, 240, 128, 196, 252, 188, 224, 252, 16, 64, 96, 24, 80, 108, 40, 96, 120, 52, 112, 132, 80, 140, 160, 116, 172, 192, 156, 204, 220, 204, 240, 252, 172, 52, 52, 212, 52, 52, 252, 52, 52, 252, 100, 88, 252, 144, 124, 252, 184, 160, 252, 216, 200, 252, 244, 236, 72, 20, 112, 92, 44, 140, 112, 68, 168, 140, 100, 196, 168, 136, 224, 200, 176, 248, 208, 184, 255, 232, 208, 252, 60, 0, 0, 92, 0, 0, 128, 0, 0, 160, 0, 0, 196, 0, 0, 224, 0, 0, 252, 0, 0, 252, 80, 0, 252, 108, 0, 252, 136, 0, 252, 164, 0, 252, 192, 0, 252, 220, 0, 252, 252, 0, 204, 136, 8, 228, 144, 4, 252, 156, 0, 252, 176, 48, 252, 196, 100, 252, 216, 152, 8, 24, 88, 12, 36, 104, 20, 52, 124, 28, 68, 140, 40, 92, 164, 56, 120, 188, 72, 152, 216, 100, 172, 224, 92, 156, 52, 108, 176, 64, 124, 200, 76, 144, 224, 92, 224, 244, 252, 200, 236, 248, 180, 220, 236, 132, 188, 216, 88, 152, 172, 244, 0, 244, 245, 0, 245, 246, 0, 246, 247, 0, 247, 248, 0, 248, 249, 0, 249, 250, 0, 250, 251, 0, 251, 252, 0, 252, 253, 0, 253, 254, 0, 254, 255, 0, 255, 76, 24, 8, 108, 44, 24, 144, 72, 52, 176, 108, 84, 210, 146, 126, 252, 60, 0, 252, 84, 0, 252, 104, 0, 252, 124, 0, 252, 148, 0, 252, 172, 0, 252, 196, 0, 64, 0, 0, 255, 0, 0, 48, 48, 0, 64, 64, 0, 80, 80, 0, 255, 255, 0, 32, 68, 112, 36, 72, 116, 40, 76, 120, 44, 80, 124, 48, 84, 128, 72, 100, 144, 100, 132, 168, 216, 244, 252, 96, 128, 164, 68, 96, 140, 255, 255, 255) -SAFE_COLORS = set(range(1, 0xD7)) -ALL_COLORS = set(range(256)) -SPECTRA_PALETTE = {i:to_spectra(PALETTE[i * 3], PALETTE[i * 3 + 1], PALETTE[i * 3 + 2]) for i in range(256)} -WATER_COLORS = set(range(0xF5, 0xFF)) - -# ZOOM_OUT_4X, ZOOM_NORMAL, ZOOM_OUT_2X, ZOOM_OUT_8X, ZOOM_OUT_16X, ZOOM_OUT_32X = range(6) -ZOOM_4X, ZOOM_NORMAL, ZOOM_2X, ZOOM_8X, ZOOM_16X, ZOOM_32X = range(6) -BPP_8, BPP_32 = range(2) - -def color_distance(c1, c2): - rmean = (c1.rgb[0] + c2.rgb[0]) / 2. - r = c1.rgb[0] - c2.rgb[0] - g = c1.rgb[1] - c2.rgb[1] - b = c1.rgb[2] - c2.rgb[2] - return math.sqrt( - ((2 + rmean) * r * r) + - 4 * g * g + - (3 - rmean) * b * b) - - -def find_best_color(x, in_range=SAFE_COLORS): - mj, md = 0, 1e100 - for j in in_range: - c = SPECTRA_PALETTE[j] - d = color_distance(x, c) - if d < md: - mj, md = j, d - return mj - - -# def map_rgb_image(self, im): -# assert im.mode == 'RGB', im.mode -# data = np.array(im) - - -class BaseSprite: - def get_data(self): - raise NotImplemented - - def get_data_size(self): - raise NotImplemented - - -class PaletteRemap(BaseSprite): - def __init__(self, ranges=None): - self.remap = np.arange(256, dtype=np.uint8) - if ranges: - self.set_ranges(ranges) - - def get_data(self): - return b'\x00' + self.remap.tobytes() - - def get_data_size(self): - return 257 - - @classmethod - def from_function(cls, color_func, remap_water=False): - res = cls() - for i in SAFE_COLORS: - res.remap[i] = find_best_color(color_func(SPECTRA_PALETTE[i])) - if remap_water: - for i in WATER_COLORS: - res.remap[i] = find_best_color(color_func(SPECTRA_PALETTE[i])) - return res - - def set_ranges(self, ranges): - for r in ranges: - f, t, v = r - self.remap[f: t + 1] = v - - def remap_image(self, im): - assert im.mode == 'P', im.mode - data = np.array(im) - data = self.remap[data] - res = Image.fromarray(data) - res.putpalette(PALETTE) - return res - - -class RealSprite(BaseSprite): - def __init__(self, w, h, *, xofs=0, yofs=0, zoom=ZOOM_4X): - self.sprite_id = None - self.w = w - self.h = h - # self.file = None - # self.x = None - # self.y = None - self.xofs = xofs - self.yofs = yofs - self.zoom = zoom - - def get_data_size(self): - return 4 - - def get_data(self): - return struct.pack(' 0) - if isinstance(sprites[0], RealSprite): - assert(all(isinstance(s, RealSprite) for s in sprites)) - assert(len(set(s.zoom for s in sprites)) == len(sprites)) - for s in sprites: - s.sprite_id = self._next_sprite_id - self._next_sprite_id += 1 - - for s in sprites: - self.sprites.append(s) - - self.pseudo_sprites.append(sprites[0]) - else: - assert(len(sprites) == 1) - self.pseudo_sprites.append(sprites[0]) - - def _write_pseudo_sprite(self, f, data, grf_type=0xff): - f.write(struct.pack(' recoloursprites() (257 each) - self._write_pseudo_sprite(f, b'\x02\x00\x00\x00') - - for s in self.pseudo_sprites: - self._write_pseudo_sprite(f, s.get_data(), grf_type=0xfd if isinstance(s, RealSprite) else 0xff) - f.write(b'\x00\x00\x00\x00') - for s in self.sprites: - f.write(s.get_real_data()) - - f.write(b'\x00\x00\x00\x00') \ No newline at end of file