From bf76271d75a45fec43abf4f21ee0bfd85ea979a5 Mon Sep 17 00:00:00 2001 From: kris Date: Tue, 2 Nov 2021 23:28:58 +0000 Subject: [PATCH] NTSC conversion should be using YIQ space instead of YUV, which seems to explain several fudge factors I needed to include to match colours. --- convert.py | 17 +- ntsc_colours.py | 3 +- palette_ntsc.py | 1784 +++++++++++++++++++++++------------------------ screen.py | 51 +- 4 files changed, 928 insertions(+), 927 deletions(-) diff --git a/convert.py b/convert.py index 269663a..99d5050 100644 --- a/convert.py +++ b/convert.py @@ -84,14 +84,17 @@ def main(): screen, rgb, dither, args.lookahead, args.verbose, rgb_to_cam16) # Show output image by rendering in target palette - output_palette = palette_py.PALETTES[args.show_palette or args.palette]() + output_palette_name = args.show_palette or args.palette + output_palette = palette_py.PALETTES[output_palette_name]() output_screen = screen_py.DHGRScreen(output_palette) - # TODO: if output_palette_name == "ntsc" show bitmap_to_image_ntsc instead - output_rgb = output_screen.bitmap_to_image_rgb(bitmap) - out_image = Image.fromarray(image_py.linear_to_srgb(output_rgb).astype( - np.uint8)) - out_image = image_py.resize(out_image, screen.X_RES, screen.Y_RES * 2, - srgb_output=True) + if output_palette_name == "ntsc": + output_srgb = output_screen.bitmap_to_image_ntsc(bitmap) + else: + output_srgb = image_py.linear_to_srgb( + output_screen.bitmap_to_image_rgb(bitmap).astype(np.uint8)) + out_image = image_py.resize( + Image.fromarray(output_srgb), screen.X_RES, screen.Y_RES * 2, + srgb_output=True) if args.show_output: out_image.show() diff --git a/ntsc_colours.py b/ntsc_colours.py index 2f8ca54..aca1657 100644 --- a/ntsc_colours.py +++ b/ntsc_colours.py @@ -19,8 +19,7 @@ def main(): # pixel, using NTSC emulation. # Double Hi-Res has a timing shift that rotates the displayed bits one # position with respect to NTSC phase. - # TODO: should be 3? Do I have a compensating off-by-one in bitmap_to_ntsc? - ntsc_shift = 2 + ntsc_shift = 1 for j in range(ntsc_shift, ntsc_shift + 4): bitmap = np.zeros((1, 11 + ntsc_shift), dtype=bool) for bits in range(256): diff --git a/palette_ntsc.py b/palette_ntsc.py index 2934c3a..0440133 100644 --- a/palette_ntsc.py +++ b/palette_ntsc.py @@ -3,1028 +3,1028 @@ import numpy as np # Indexed by (trailing 8-bit dot pattern, x % 4) SRGB = { (0, 0): np.array((0, 0, 0)), - (1, 0): np.array((0, 37, 0)), - (2, 0): np.array((14, 14, 0)), - (3, 0): np.array((0, 52, 0)), - (4, 0): np.array((64, 0, 26)), + (1, 0): np.array((0, 20, 0)), + (2, 0): np.array((0, 0, 52)), + (3, 0): np.array((0, 17, 25)), + (4, 0): np.array((29, 0, 26)), (5, 0): np.array((0, 0, 0)), - (6, 0): np.array((79, 0, 0)), - (7, 0): np.array((14, 14, 0)), - (8, 0): np.array((0, 0, 115)), - (9, 0): np.array((0, 23, 88)), + (6, 0): np.array((14, 0, 79)), + (7, 0): np.array((0, 0, 52)), + (8, 0): np.array((15, 2, 0)), + (9, 0): np.array((0, 22, 0)), (10, 0): np.array((0, 0, 0)), - (11, 0): np.array((0, 37, 0)), - (12, 0): np.array((49, 0, 141)), - (13, 0): np.array((0, 0, 115)), - (14, 0): np.array((64, 0, 26)), + (11, 0): np.array((0, 20, 0)), + (12, 0): np.array((44, 0, 0)), + (13, 0): np.array((15, 2, 0)), + (14, 0): np.array((29, 0, 26)), (15, 0): np.array((0, 0, 0)), - (16, 0): np.array((0, 101, 37)), - (17, 0): np.array((0, 139, 11)), - (18, 0): np.array((13, 116, 0)), - (19, 0): np.array((0, 154, 0)), + (16, 0): np.array((34, 83, 36)), + (17, 0): np.array((4, 104, 10)), + (18, 0): np.array((19, 81, 89)), + (19, 0): np.array((0, 101, 62)), (20, 0): np.array((63, 63, 63)), - (21, 0): np.array((0, 101, 37)), - (22, 0): np.array((78, 78, 0)), - (23, 0): np.array((13, 116, 0)), - (24, 0): np.array((0, 86, 152)), - (25, 0): np.array((0, 124, 126)), - (26, 0): np.array((0, 101, 37)), - (27, 0): np.array((0, 139, 11)), - (28, 0): np.array((49, 48, 178)), - (29, 0): np.array((0, 86, 152)), + (21, 0): np.array((34, 83, 36)), + (22, 0): np.array((48, 61, 116)), + (23, 0): np.array((19, 81, 89)), + (24, 0): np.array((49, 86, 0)), + (25, 0): np.array((19, 106, 0)), + (26, 0): np.array((34, 83, 36)), + (27, 0): np.array((4, 104, 10)), + (28, 0): np.array((78, 66, 11)), + (29, 0): np.array((49, 86, 0)), (30, 0): np.array((63, 63, 63)), - (31, 0): np.array((0, 101, 37)), - (32, 0): np.array((78, 78, 0)), - (33, 0): np.array((13, 116, 0)), - (34, 0): np.array((93, 93, 0)), - (35, 0): np.array((28, 131, 0)), - (36, 0): np.array((142, 40, 0)), - (37, 0): np.array((78, 78, 0)), - (38, 0): np.array((157, 55, 0)), - (39, 0): np.array((93, 93, 0)), + (31, 0): np.array((34, 83, 36)), + (32, 0): np.array((48, 61, 116)), + (33, 0): np.array((19, 81, 89)), + (34, 0): np.array((33, 58, 168)), + (35, 0): np.array((4, 78, 142)), + (36, 0): np.array((78, 40, 143)), + (37, 0): np.array((48, 61, 116)), + (38, 0): np.array((63, 38, 195)), + (39, 0): np.array((33, 58, 168)), (40, 0): np.array((63, 63, 63)), - (41, 0): np.array((0, 101, 37)), - (42, 0): np.array((78, 78, 0)), - (43, 0): np.array((13, 116, 0)), - (44, 0): np.array((128, 25, 89)), + (41, 0): np.array((34, 83, 36)), + (42, 0): np.array((48, 61, 116)), + (43, 0): np.array((19, 81, 89)), + (44, 0): np.array((93, 43, 90)), (45, 0): np.array((63, 63, 63)), - (46, 0): np.array((142, 40, 0)), - (47, 0): np.array((78, 78, 0)), - (48, 0): np.array((77, 180, 0)), - (49, 0): np.array((13, 218, 0)), - (50, 0): np.array((92, 195, 0)), - (51, 0): np.array((27, 233, 0)), - (52, 0): np.array((142, 142, 12)), - (53, 0): np.array((77, 180, 0)), - (54, 0): np.array((156, 157, 0)), - (55, 0): np.array((92, 195, 0)), - (56, 0): np.array((62, 165, 101)), - (57, 0): np.array((0, 203, 75)), - (58, 0): np.array((77, 180, 0)), - (59, 0): np.array((13, 218, 0)), + (46, 0): np.array((78, 40, 143)), + (47, 0): np.array((48, 61, 116)), + (48, 0): np.array((82, 145, 153)), + (49, 0): np.array((53, 165, 126)), + (50, 0): np.array((67, 142, 205)), + (51, 0): np.array((38, 162, 179)), + (52, 0): np.array((112, 124, 180)), + (53, 0): np.array((82, 145, 153)), + (54, 0): np.array((97, 122, 232)), + (55, 0): np.array((67, 142, 205)), + (56, 0): np.array((98, 147, 100)), + (57, 0): np.array((68, 167, 73)), + (58, 0): np.array((82, 145, 153)), + (59, 0): np.array((53, 165, 126)), (60, 0): np.array((127, 127, 127)), - (61, 0): np.array((62, 165, 101)), - (62, 0): np.array((142, 142, 12)), - (63, 0): np.array((77, 180, 0)), - (64, 0): np.array((128, 25, 89)), + (61, 0): np.array((98, 147, 100)), + (62, 0): np.array((112, 124, 180)), + (63, 0): np.array((82, 145, 153)), + (64, 0): np.array((93, 43, 90)), (65, 0): np.array((63, 63, 63)), - (66, 0): np.array((142, 40, 0)), - (67, 0): np.array((78, 78, 0)), - (68, 0): np.array((192, 0, 116)), - (69, 0): np.array((128, 25, 89)), - (70, 0): np.array((207, 2, 1)), - (71, 0): np.array((142, 40, 0)), - (72, 0): np.array((113, 10, 204)), - (73, 0): np.array((49, 48, 178)), - (74, 0): np.array((128, 25, 89)), + (66, 0): np.array((78, 40, 143)), + (67, 0): np.array((48, 61, 116)), + (68, 0): np.array((122, 23, 117)), + (69, 0): np.array((93, 43, 90)), + (70, 0): np.array((107, 20, 169)), + (71, 0): np.array((78, 40, 143)), + (72, 0): np.array((108, 46, 37)), + (73, 0): np.array((78, 66, 11)), + (74, 0): np.array((93, 43, 90)), (75, 0): np.array((63, 63, 63)), - (76, 0): np.array((178, 0, 231)), - (77, 0): np.array((113, 10, 204)), - (78, 0): np.array((192, 0, 116)), - (79, 0): np.array((128, 25, 89)), + (76, 0): np.array((137, 25, 64)), + (77, 0): np.array((108, 46, 37)), + (78, 0): np.array((122, 23, 117)), + (79, 0): np.array((93, 43, 90)), (80, 0): np.array((127, 127, 127)), - (81, 0): np.array((62, 165, 101)), - (82, 0): np.array((142, 142, 12)), - (83, 0): np.array((77, 180, 0)), - (84, 0): np.array((192, 89, 153)), + (81, 0): np.array((98, 147, 100)), + (82, 0): np.array((112, 124, 180)), + (83, 0): np.array((82, 145, 153)), + (84, 0): np.array((156, 107, 154)), (85, 0): np.array((127, 127, 127)), - (86, 0): np.array((206, 104, 38)), - (87, 0): np.array((142, 142, 12)), - (88, 0): np.array((112, 112, 242)), - (89, 0): np.array((48, 150, 216)), + (86, 0): np.array((141, 104, 206)), + (87, 0): np.array((112, 124, 180)), + (88, 0): np.array((142, 130, 74)), + (89, 0): np.array((113, 150, 48)), (90, 0): np.array((127, 127, 127)), - (91, 0): np.array((62, 165, 101)), - (92, 0): np.array((177, 74, 255)), - (93, 0): np.array((112, 112, 242)), - (94, 0): np.array((192, 89, 153)), + (91, 0): np.array((98, 147, 100)), + (92, 0): np.array((172, 109, 101)), + (93, 0): np.array((142, 130, 74)), + (94, 0): np.array((156, 107, 154)), (95, 0): np.array((127, 127, 127)), - (96, 0): np.array((206, 104, 38)), - (97, 0): np.array((142, 142, 12)), - (98, 0): np.array((221, 119, 0)), - (99, 0): np.array((156, 157, 0)), - (100, 0): np.array((255, 66, 64)), - (101, 0): np.array((206, 104, 38)), - (102, 0): np.array((255, 81, 0)), - (103, 0): np.array((221, 119, 0)), - (104, 0): np.array((192, 89, 153)), + (96, 0): np.array((141, 104, 206)), + (97, 0): np.array((112, 124, 180)), + (98, 0): np.array((126, 102, 255)), + (99, 0): np.array((97, 122, 232)), + (100, 0): np.array((171, 84, 233)), + (101, 0): np.array((141, 104, 206)), + (102, 0): np.array((156, 81, 255)), + (103, 0): np.array((126, 102, 255)), + (104, 0): np.array((156, 107, 154)), (105, 0): np.array((127, 127, 127)), - (106, 0): np.array((206, 104, 38)), - (107, 0): np.array((142, 142, 12)), - (108, 0): np.array((255, 51, 179)), - (109, 0): np.array((192, 89, 153)), - (110, 0): np.array((255, 66, 64)), - (111, 0): np.array((206, 104, 38)), - (112, 0): np.array((205, 206, 76)), - (113, 0): np.array((141, 244, 50)), - (114, 0): np.array((220, 220, 0)), - (115, 0): np.array((156, 255, 0)), - (116, 0): np.array((255, 168, 102)), - (117, 0): np.array((205, 206, 76)), - (118, 0): np.array((255, 183, 0)), - (119, 0): np.array((220, 220, 0)), + (106, 0): np.array((141, 104, 206)), + (107, 0): np.array((112, 124, 180)), + (108, 0): np.array((186, 87, 181)), + (109, 0): np.array((156, 107, 154)), + (110, 0): np.array((171, 84, 233)), + (111, 0): np.array((141, 104, 206)), + (112, 0): np.array((176, 188, 243)), + (113, 0): np.array((146, 208, 217)), + (114, 0): np.array((161, 186, 255)), + (115, 0): np.array((131, 206, 255)), + (116, 0): np.array((205, 168, 255)), + (117, 0): np.array((176, 188, 243)), + (118, 0): np.array((190, 165, 255)), + (119, 0): np.array((161, 186, 255)), (120, 0): np.array((191, 191, 191)), - (121, 0): np.array((126, 229, 165)), - (122, 0): np.array((205, 206, 76)), - (123, 0): np.array((141, 244, 50)), - (124, 0): np.array((255, 153, 217)), + (121, 0): np.array((161, 211, 164)), + (122, 0): np.array((176, 188, 243)), + (123, 0): np.array((146, 208, 217)), + (124, 0): np.array((220, 171, 218)), (125, 0): np.array((191, 191, 191)), - (126, 0): np.array((255, 168, 102)), - (127, 0): np.array((205, 206, 76)), - (128, 0): np.array((49, 48, 178)), - (129, 0): np.array((0, 86, 152)), + (126, 0): np.array((205, 168, 255)), + (127, 0): np.array((176, 188, 243)), + (128, 0): np.array((78, 66, 11)), + (129, 0): np.array((49, 86, 0)), (130, 0): np.array((63, 63, 63)), - (131, 0): np.array((0, 101, 37)), - (132, 0): np.array((113, 10, 204)), - (133, 0): np.array((49, 48, 178)), - (134, 0): np.array((128, 25, 89)), + (131, 0): np.array((34, 83, 36)), + (132, 0): np.array((108, 46, 37)), + (133, 0): np.array((78, 66, 11)), + (134, 0): np.array((93, 43, 90)), (135, 0): np.array((63, 63, 63)), - (136, 0): np.array((34, 34, 255)), - (137, 0): np.array((0, 71, 255)), - (138, 0): np.array((49, 48, 178)), - (139, 0): np.array((0, 86, 152)), - (140, 0): np.array((98, 0, 255)), - (141, 0): np.array((34, 34, 255)), - (142, 0): np.array((113, 10, 204)), - (143, 0): np.array((49, 48, 178)), - (144, 0): np.array((48, 150, 216)), - (145, 0): np.array((0, 188, 190)), - (146, 0): np.array((62, 165, 101)), - (147, 0): np.array((0, 203, 75)), - (148, 0): np.array((112, 112, 242)), - (149, 0): np.array((48, 150, 216)), + (136, 0): np.array((93, 68, 0)), + (137, 0): np.array((64, 89, 0)), + (138, 0): np.array((78, 66, 11)), + (139, 0): np.array((49, 86, 0)), + (140, 0): np.array((123, 48, 0)), + (141, 0): np.array((93, 68, 0)), + (142, 0): np.array((108, 46, 37)), + (143, 0): np.array((78, 66, 11)), + (144, 0): np.array((113, 150, 48)), + (145, 0): np.array((83, 170, 21)), + (146, 0): np.array((98, 147, 100)), + (147, 0): np.array((68, 167, 73)), + (148, 0): np.array((142, 130, 74)), + (149, 0): np.array((113, 150, 48)), (150, 0): np.array((127, 127, 127)), - (151, 0): np.array((62, 165, 101)), - (152, 0): np.array((33, 135, 255)), - (153, 0): np.array((0, 173, 255)), - (154, 0): np.array((48, 150, 216)), - (155, 0): np.array((0, 188, 190)), - (156, 0): np.array((98, 97, 255)), - (157, 0): np.array((33, 135, 255)), - (158, 0): np.array((112, 112, 242)), - (159, 0): np.array((48, 150, 216)), + (151, 0): np.array((98, 147, 100)), + (152, 0): np.array((128, 152, 0)), + (153, 0): np.array((98, 173, 0)), + (154, 0): np.array((113, 150, 48)), + (155, 0): np.array((83, 170, 21)), + (156, 0): np.array((157, 132, 22)), + (157, 0): np.array((128, 152, 0)), + (158, 0): np.array((142, 130, 74)), + (159, 0): np.array((113, 150, 48)), (160, 0): np.array((127, 127, 127)), - (161, 0): np.array((62, 165, 101)), - (162, 0): np.array((142, 142, 12)), - (163, 0): np.array((77, 180, 0)), - (164, 0): np.array((192, 89, 153)), + (161, 0): np.array((98, 147, 100)), + (162, 0): np.array((112, 124, 180)), + (163, 0): np.array((82, 145, 153)), + (164, 0): np.array((156, 107, 154)), (165, 0): np.array((127, 127, 127)), - (166, 0): np.array((206, 104, 38)), - (167, 0): np.array((142, 142, 12)), - (168, 0): np.array((112, 112, 242)), - (169, 0): np.array((48, 150, 216)), + (166, 0): np.array((141, 104, 206)), + (167, 0): np.array((112, 124, 180)), + (168, 0): np.array((142, 130, 74)), + (169, 0): np.array((113, 150, 48)), (170, 0): np.array((127, 127, 127)), - (171, 0): np.array((62, 165, 101)), - (172, 0): np.array((177, 74, 255)), - (173, 0): np.array((112, 112, 242)), - (174, 0): np.array((192, 89, 153)), + (171, 0): np.array((98, 147, 100)), + (172, 0): np.array((172, 109, 101)), + (173, 0): np.array((142, 130, 74)), + (174, 0): np.array((156, 107, 154)), (175, 0): np.array((127, 127, 127)), - (176, 0): np.array((126, 229, 165)), - (177, 0): np.array((62, 255, 138)), - (178, 0): np.array((141, 244, 50)), - (179, 0): np.array((76, 255, 23)), + (176, 0): np.array((161, 211, 164)), + (177, 0): np.array((132, 231, 137)), + (178, 0): np.array((146, 208, 217)), + (179, 0): np.array((117, 229, 190)), (180, 0): np.array((191, 191, 191)), - (181, 0): np.array((126, 229, 165)), - (182, 0): np.array((205, 206, 76)), - (183, 0): np.array((141, 244, 50)), - (184, 0): np.array((112, 214, 255)), - (185, 0): np.array((47, 252, 253)), - (186, 0): np.array((126, 229, 165)), - (187, 0): np.array((62, 255, 138)), - (188, 0): np.array((176, 176, 255)), - (189, 0): np.array((112, 214, 255)), + (181, 0): np.array((161, 211, 164)), + (182, 0): np.array((176, 188, 243)), + (183, 0): np.array((146, 208, 217)), + (184, 0): np.array((176, 214, 111)), + (185, 0): np.array((147, 234, 85)), + (186, 0): np.array((161, 211, 164)), + (187, 0): np.array((132, 231, 137)), + (188, 0): np.array((206, 193, 138)), + (189, 0): np.array((176, 214, 111)), (190, 0): np.array((191, 191, 191)), - (191, 0): np.array((126, 229, 165)), - (192, 0): np.array((177, 74, 255)), - (193, 0): np.array((112, 112, 242)), - (194, 0): np.array((192, 89, 153)), + (191, 0): np.array((161, 211, 164)), + (192, 0): np.array((172, 109, 101)), + (193, 0): np.array((142, 130, 74)), + (194, 0): np.array((156, 107, 154)), (195, 0): np.array((127, 127, 127)), - (196, 0): np.array((241, 36, 255)), - (197, 0): np.array((177, 74, 255)), - (198, 0): np.array((255, 51, 179)), - (199, 0): np.array((192, 89, 153)), - (200, 0): np.array((162, 59, 255)), - (201, 0): np.array((98, 97, 255)), - (202, 0): np.array((177, 74, 255)), - (203, 0): np.array((112, 112, 242)), - (204, 0): np.array((227, 21, 255)), - (205, 0): np.array((162, 59, 255)), - (206, 0): np.array((241, 36, 255)), - (207, 0): np.array((177, 74, 255)), - (208, 0): np.array((176, 176, 255)), - (209, 0): np.array((112, 214, 255)), + (196, 0): np.array((201, 89, 128)), + (197, 0): np.array((172, 109, 101)), + (198, 0): np.array((186, 87, 181)), + (199, 0): np.array((156, 107, 154)), + (200, 0): np.array((187, 112, 49)), + (201, 0): np.array((157, 132, 22)), + (202, 0): np.array((172, 109, 101)), + (203, 0): np.array((142, 130, 74)), + (204, 0): np.array((216, 92, 75)), + (205, 0): np.array((187, 112, 49)), + (206, 0): np.array((201, 89, 128)), + (207, 0): np.array((172, 109, 101)), + (208, 0): np.array((206, 193, 138)), + (209, 0): np.array((176, 214, 111)), (210, 0): np.array((191, 191, 191)), - (211, 0): np.array((126, 229, 165)), - (212, 0): np.array((241, 138, 255)), - (213, 0): np.array((176, 176, 255)), - (214, 0): np.array((255, 153, 217)), + (211, 0): np.array((161, 211, 164)), + (212, 0): np.array((235, 173, 165)), + (213, 0): np.array((206, 193, 138)), + (214, 0): np.array((220, 171, 218)), (215, 0): np.array((191, 191, 191)), - (216, 0): np.array((161, 161, 255)), - (217, 0): np.array((97, 199, 255)), - (218, 0): np.array((176, 176, 255)), - (219, 0): np.array((112, 214, 255)), - (220, 0): np.array((226, 123, 255)), - (221, 0): np.array((161, 161, 255)), - (222, 0): np.array((241, 138, 255)), - (223, 0): np.array((176, 176, 255)), - (224, 0): np.array((255, 153, 217)), + (216, 0): np.array((221, 196, 86)), + (217, 0): np.array((191, 216, 59)), + (218, 0): np.array((206, 193, 138)), + (219, 0): np.array((176, 214, 111)), + (220, 0): np.array((250, 176, 112)), + (221, 0): np.array((221, 196, 86)), + (222, 0): np.array((235, 173, 165)), + (223, 0): np.array((206, 193, 138)), + (224, 0): np.array((220, 171, 218)), (225, 0): np.array((191, 191, 191)), - (226, 0): np.array((255, 168, 102)), - (227, 0): np.array((205, 206, 76)), - (228, 0): np.array((255, 115, 243)), - (229, 0): np.array((255, 153, 217)), - (230, 0): np.array((255, 130, 128)), - (231, 0): np.array((255, 168, 102)), - (232, 0): np.array((241, 138, 255)), - (233, 0): np.array((176, 176, 255)), - (234, 0): np.array((255, 153, 217)), + (226, 0): np.array((205, 168, 255)), + (227, 0): np.array((176, 188, 243)), + (228, 0): np.array((250, 150, 244)), + (229, 0): np.array((220, 171, 218)), + (230, 0): np.array((235, 148, 255)), + (231, 0): np.array((205, 168, 255)), + (232, 0): np.array((235, 173, 165)), + (233, 0): np.array((206, 193, 138)), + (234, 0): np.array((220, 171, 218)), (235, 0): np.array((191, 191, 191)), - (236, 0): np.array((255, 100, 255)), - (237, 0): np.array((241, 138, 255)), - (238, 0): np.array((255, 115, 243)), - (239, 0): np.array((255, 153, 217)), + (236, 0): np.array((255, 153, 192)), + (237, 0): np.array((235, 173, 165)), + (238, 0): np.array((250, 150, 244)), + (239, 0): np.array((220, 171, 218)), (240, 0): np.array((255, 255, 255)), - (241, 0): np.array((190, 255, 228)), - (242, 0): np.array((255, 255, 139)), - (243, 0): np.array((205, 255, 113)), - (244, 0): np.array((255, 217, 255)), - (245, 0): np.array((254, 254, 255)), - (246, 0): np.array((255, 231, 166)), - (247, 0): np.array((255, 255, 139)), - (248, 0): np.array((240, 240, 255)), - (249, 0): np.array((175, 255, 255)), - (250, 0): np.array((254, 255, 255)), - (251, 0): np.array((190, 255, 228)), - (252, 0): np.array((255, 202, 255)), - (253, 0): np.array((240, 240, 255)), - (254, 0): np.array((255, 217, 255)), - (255, 0): np.array((254, 254, 255)), + (241, 0): np.array((225, 255, 228)), + (242, 0): np.array((239, 252, 255)), + (243, 0): np.array((210, 255, 255)), + (244, 0): np.array((255, 234, 255)), + (245, 0): np.array((255, 255, 255)), + (246, 0): np.array((255, 232, 255)), + (247, 0): np.array((239, 252, 255)), + (248, 0): np.array((255, 255, 202)), + (249, 0): np.array((240, 255, 175)), + (250, 0): np.array((255, 255, 255)), + (251, 0): np.array((225, 255, 228)), + (252, 0): np.array((255, 237, 229)), + (253, 0): np.array((255, 255, 202)), + (254, 0): np.array((255, 234, 255)), + (255, 0): np.array((255, 255, 255)), (0, 1): np.array((0, 0, 0)), - (1, 1): np.array((14, 14, 0)), - (2, 1): np.array((64, 0, 26)), - (3, 1): np.array((79, 0, 0)), - (4, 1): np.array((0, 0, 115)), + (1, 1): np.array((0, 0, 52)), + (2, 1): np.array((29, 0, 26)), + (3, 1): np.array((14, 0, 79)), + (4, 1): np.array((15, 2, 0)), (5, 1): np.array((0, 0, 0)), - (6, 1): np.array((49, 0, 141)), - (7, 1): np.array((64, 0, 26)), - (8, 1): np.array((0, 37, 0)), - (9, 1): np.array((0, 52, 0)), + (6, 1): np.array((44, 0, 0)), + (7, 1): np.array((29, 0, 26)), + (8, 1): np.array((0, 20, 0)), + (9, 1): np.array((0, 17, 25)), (10, 1): np.array((0, 0, 0)), - (11, 1): np.array((14, 14, 0)), - (12, 1): np.array((0, 23, 88)), - (13, 1): np.array((0, 37, 0)), - (14, 1): np.array((0, 0, 115)), + (11, 1): np.array((0, 0, 52)), + (12, 1): np.array((0, 22, 0)), + (13, 1): np.array((0, 20, 0)), + (14, 1): np.array((15, 2, 0)), (15, 1): np.array((0, 0, 0)), - (16, 1): np.array((78, 78, 0)), - (17, 1): np.array((93, 93, 0)), - (18, 1): np.array((142, 40, 0)), - (19, 1): np.array((157, 55, 0)), + (16, 1): np.array((48, 61, 116)), + (17, 1): np.array((33, 58, 168)), + (18, 1): np.array((78, 40, 143)), + (19, 1): np.array((63, 38, 195)), (20, 1): np.array((63, 63, 63)), - (21, 1): np.array((78, 78, 0)), - (22, 1): np.array((128, 25, 89)), - (23, 1): np.array((142, 40, 0)), - (24, 1): np.array((13, 116, 0)), - (25, 1): np.array((28, 131, 0)), - (26, 1): np.array((78, 78, 0)), - (27, 1): np.array((93, 93, 0)), - (28, 1): np.array((0, 101, 37)), - (29, 1): np.array((13, 116, 0)), + (21, 1): np.array((48, 61, 116)), + (22, 1): np.array((93, 43, 90)), + (23, 1): np.array((78, 40, 143)), + (24, 1): np.array((19, 81, 89)), + (25, 1): np.array((4, 78, 142)), + (26, 1): np.array((48, 61, 116)), + (27, 1): np.array((33, 58, 168)), + (28, 1): np.array((34, 83, 36)), + (29, 1): np.array((19, 81, 89)), (30, 1): np.array((63, 63, 63)), - (31, 1): np.array((78, 78, 0)), - (32, 1): np.array((128, 25, 89)), - (33, 1): np.array((142, 40, 0)), - (34, 1): np.array((192, 0, 116)), - (35, 1): np.array((207, 2, 1)), - (36, 1): np.array((113, 10, 204)), - (37, 1): np.array((128, 25, 89)), - (38, 1): np.array((178, 0, 231)), - (39, 1): np.array((192, 0, 116)), + (31, 1): np.array((48, 61, 116)), + (32, 1): np.array((93, 43, 90)), + (33, 1): np.array((78, 40, 143)), + (34, 1): np.array((122, 23, 117)), + (35, 1): np.array((107, 20, 169)), + (36, 1): np.array((108, 46, 37)), + (37, 1): np.array((93, 43, 90)), + (38, 1): np.array((137, 25, 64)), + (39, 1): np.array((122, 23, 117)), (40, 1): np.array((63, 63, 63)), - (41, 1): np.array((78, 78, 0)), - (42, 1): np.array((128, 25, 89)), - (43, 1): np.array((142, 40, 0)), - (44, 1): np.array((49, 48, 178)), + (41, 1): np.array((48, 61, 116)), + (42, 1): np.array((93, 43, 90)), + (43, 1): np.array((78, 40, 143)), + (44, 1): np.array((78, 66, 11)), (45, 1): np.array((63, 63, 63)), - (46, 1): np.array((113, 10, 204)), - (47, 1): np.array((128, 25, 89)), - (48, 1): np.array((206, 104, 38)), - (49, 1): np.array((221, 119, 0)), - (50, 1): np.array((255, 66, 64)), - (51, 1): np.array((255, 81, 0)), - (52, 1): np.array((192, 89, 153)), - (53, 1): np.array((206, 104, 38)), - (54, 1): np.array((255, 51, 179)), - (55, 1): np.array((255, 66, 64)), - (56, 1): np.array((142, 142, 12)), - (57, 1): np.array((156, 157, 0)), - (58, 1): np.array((206, 104, 38)), - (59, 1): np.array((221, 119, 0)), + (46, 1): np.array((108, 46, 37)), + (47, 1): np.array((93, 43, 90)), + (48, 1): np.array((141, 104, 206)), + (49, 1): np.array((126, 102, 255)), + (50, 1): np.array((171, 84, 233)), + (51, 1): np.array((156, 81, 255)), + (52, 1): np.array((156, 107, 154)), + (53, 1): np.array((141, 104, 206)), + (54, 1): np.array((186, 87, 181)), + (55, 1): np.array((171, 84, 233)), + (56, 1): np.array((112, 124, 180)), + (57, 1): np.array((97, 122, 232)), + (58, 1): np.array((141, 104, 206)), + (59, 1): np.array((126, 102, 255)), (60, 1): np.array((127, 127, 127)), - (61, 1): np.array((142, 142, 12)), - (62, 1): np.array((192, 89, 153)), - (63, 1): np.array((206, 104, 38)), - (64, 1): np.array((49, 48, 178)), + (61, 1): np.array((112, 124, 180)), + (62, 1): np.array((156, 107, 154)), + (63, 1): np.array((141, 104, 206)), + (64, 1): np.array((78, 66, 11)), (65, 1): np.array((63, 63, 63)), - (66, 1): np.array((113, 10, 204)), - (67, 1): np.array((128, 25, 89)), - (68, 1): np.array((34, 34, 255)), - (69, 1): np.array((49, 48, 178)), - (70, 1): np.array((98, 0, 255)), - (71, 1): np.array((113, 10, 204)), - (72, 1): np.array((0, 86, 152)), - (73, 1): np.array((0, 101, 37)), - (74, 1): np.array((49, 48, 178)), + (66, 1): np.array((108, 46, 37)), + (67, 1): np.array((93, 43, 90)), + (68, 1): np.array((93, 68, 0)), + (69, 1): np.array((78, 66, 11)), + (70, 1): np.array((123, 48, 0)), + (71, 1): np.array((108, 46, 37)), + (72, 1): np.array((49, 86, 0)), + (73, 1): np.array((34, 83, 36)), + (74, 1): np.array((78, 66, 11)), (75, 1): np.array((63, 63, 63)), - (76, 1): np.array((0, 71, 255)), - (77, 1): np.array((0, 86, 152)), - (78, 1): np.array((34, 34, 255)), - (79, 1): np.array((49, 48, 178)), + (76, 1): np.array((64, 89, 0)), + (77, 1): np.array((49, 86, 0)), + (78, 1): np.array((93, 68, 0)), + (79, 1): np.array((78, 66, 11)), (80, 1): np.array((127, 127, 127)), - (81, 1): np.array((142, 142, 12)), - (82, 1): np.array((192, 89, 153)), - (83, 1): np.array((206, 104, 38)), - (84, 1): np.array((112, 112, 242)), + (81, 1): np.array((112, 124, 180)), + (82, 1): np.array((156, 107, 154)), + (83, 1): np.array((141, 104, 206)), + (84, 1): np.array((142, 130, 74)), (85, 1): np.array((127, 127, 127)), - (86, 1): np.array((177, 74, 255)), - (87, 1): np.array((192, 89, 153)), - (88, 1): np.array((62, 165, 101)), - (89, 1): np.array((77, 180, 0)), + (86, 1): np.array((172, 109, 101)), + (87, 1): np.array((156, 107, 154)), + (88, 1): np.array((98, 147, 100)), + (89, 1): np.array((82, 145, 153)), (90, 1): np.array((127, 127, 127)), - (91, 1): np.array((142, 142, 12)), - (92, 1): np.array((48, 150, 216)), - (93, 1): np.array((62, 165, 101)), - (94, 1): np.array((112, 112, 242)), + (91, 1): np.array((112, 124, 180)), + (92, 1): np.array((113, 150, 48)), + (93, 1): np.array((98, 147, 100)), + (94, 1): np.array((142, 130, 74)), (95, 1): np.array((127, 127, 127)), - (96, 1): np.array((177, 74, 255)), - (97, 1): np.array((192, 89, 153)), - (98, 1): np.array((241, 36, 255)), - (99, 1): np.array((255, 51, 179)), - (100, 1): np.array((162, 59, 255)), - (101, 1): np.array((177, 74, 255)), - (102, 1): np.array((227, 21, 255)), - (103, 1): np.array((241, 36, 255)), - (104, 1): np.array((112, 112, 242)), + (96, 1): np.array((172, 109, 101)), + (97, 1): np.array((156, 107, 154)), + (98, 1): np.array((201, 89, 128)), + (99, 1): np.array((186, 87, 181)), + (100, 1): np.array((187, 112, 49)), + (101, 1): np.array((172, 109, 101)), + (102, 1): np.array((216, 92, 75)), + (103, 1): np.array((201, 89, 128)), + (104, 1): np.array((142, 130, 74)), (105, 1): np.array((127, 127, 127)), - (106, 1): np.array((177, 74, 255)), - (107, 1): np.array((192, 89, 153)), - (108, 1): np.array((98, 97, 255)), - (109, 1): np.array((112, 112, 242)), - (110, 1): np.array((162, 59, 255)), - (111, 1): np.array((177, 74, 255)), - (112, 1): np.array((255, 153, 217)), - (113, 1): np.array((255, 168, 102)), - (114, 1): np.array((255, 115, 243)), - (115, 1): np.array((255, 130, 128)), - (116, 1): np.array((241, 138, 255)), - (117, 1): np.array((255, 153, 217)), - (118, 1): np.array((255, 100, 255)), - (119, 1): np.array((255, 115, 243)), + (106, 1): np.array((172, 109, 101)), + (107, 1): np.array((156, 107, 154)), + (108, 1): np.array((157, 132, 22)), + (109, 1): np.array((142, 130, 74)), + (110, 1): np.array((187, 112, 49)), + (111, 1): np.array((172, 109, 101)), + (112, 1): np.array((220, 171, 218)), + (113, 1): np.array((205, 168, 255)), + (114, 1): np.array((250, 150, 244)), + (115, 1): np.array((235, 148, 255)), + (116, 1): np.array((235, 173, 165)), + (117, 1): np.array((220, 171, 218)), + (118, 1): np.array((255, 153, 192)), + (119, 1): np.array((250, 150, 244)), (120, 1): np.array((191, 191, 191)), - (121, 1): np.array((205, 206, 76)), - (122, 1): np.array((255, 153, 217)), - (123, 1): np.array((255, 168, 102)), - (124, 1): np.array((176, 176, 255)), + (121, 1): np.array((176, 188, 243)), + (122, 1): np.array((220, 171, 218)), + (123, 1): np.array((205, 168, 255)), + (124, 1): np.array((206, 193, 138)), (125, 1): np.array((191, 191, 191)), - (126, 1): np.array((241, 138, 255)), - (127, 1): np.array((255, 153, 217)), - (128, 1): np.array((0, 101, 37)), - (129, 1): np.array((13, 116, 0)), + (126, 1): np.array((235, 173, 165)), + (127, 1): np.array((220, 171, 218)), + (128, 1): np.array((34, 83, 36)), + (129, 1): np.array((19, 81, 89)), (130, 1): np.array((63, 63, 63)), - (131, 1): np.array((78, 78, 0)), - (132, 1): np.array((0, 86, 152)), - (133, 1): np.array((0, 101, 37)), - (134, 1): np.array((49, 48, 178)), + (131, 1): np.array((48, 61, 116)), + (132, 1): np.array((49, 86, 0)), + (133, 1): np.array((34, 83, 36)), + (134, 1): np.array((78, 66, 11)), (135, 1): np.array((63, 63, 63)), - (136, 1): np.array((0, 139, 11)), - (137, 1): np.array((0, 154, 0)), - (138, 1): np.array((0, 101, 37)), - (139, 1): np.array((13, 116, 0)), - (140, 1): np.array((0, 124, 126)), - (141, 1): np.array((0, 139, 11)), - (142, 1): np.array((0, 86, 152)), - (143, 1): np.array((0, 101, 37)), - (144, 1): np.array((77, 180, 0)), - (145, 1): np.array((92, 195, 0)), - (146, 1): np.array((142, 142, 12)), - (147, 1): np.array((156, 157, 0)), - (148, 1): np.array((62, 165, 101)), - (149, 1): np.array((77, 180, 0)), + (136, 1): np.array((4, 104, 10)), + (137, 1): np.array((0, 101, 62)), + (138, 1): np.array((34, 83, 36)), + (139, 1): np.array((19, 81, 89)), + (140, 1): np.array((19, 106, 0)), + (141, 1): np.array((4, 104, 10)), + (142, 1): np.array((49, 86, 0)), + (143, 1): np.array((34, 83, 36)), + (144, 1): np.array((82, 145, 153)), + (145, 1): np.array((67, 142, 205)), + (146, 1): np.array((112, 124, 180)), + (147, 1): np.array((97, 122, 232)), + (148, 1): np.array((98, 147, 100)), + (149, 1): np.array((82, 145, 153)), (150, 1): np.array((127, 127, 127)), - (151, 1): np.array((142, 142, 12)), - (152, 1): np.array((13, 218, 0)), - (153, 1): np.array((27, 233, 0)), - (154, 1): np.array((77, 180, 0)), - (155, 1): np.array((92, 195, 0)), - (156, 1): np.array((0, 203, 75)), - (157, 1): np.array((13, 218, 0)), - (158, 1): np.array((62, 165, 101)), - (159, 1): np.array((77, 180, 0)), + (151, 1): np.array((112, 124, 180)), + (152, 1): np.array((53, 165, 126)), + (153, 1): np.array((38, 162, 179)), + (154, 1): np.array((82, 145, 153)), + (155, 1): np.array((67, 142, 205)), + (156, 1): np.array((68, 167, 73)), + (157, 1): np.array((53, 165, 126)), + (158, 1): np.array((98, 147, 100)), + (159, 1): np.array((82, 145, 153)), (160, 1): np.array((127, 127, 127)), - (161, 1): np.array((142, 142, 12)), - (162, 1): np.array((192, 89, 153)), - (163, 1): np.array((206, 104, 38)), - (164, 1): np.array((112, 112, 242)), + (161, 1): np.array((112, 124, 180)), + (162, 1): np.array((156, 107, 154)), + (163, 1): np.array((141, 104, 206)), + (164, 1): np.array((142, 130, 74)), (165, 1): np.array((127, 127, 127)), - (166, 1): np.array((177, 74, 255)), - (167, 1): np.array((192, 89, 153)), - (168, 1): np.array((62, 165, 101)), - (169, 1): np.array((77, 180, 0)), + (166, 1): np.array((172, 109, 101)), + (167, 1): np.array((156, 107, 154)), + (168, 1): np.array((98, 147, 100)), + (169, 1): np.array((82, 145, 153)), (170, 1): np.array((127, 127, 127)), - (171, 1): np.array((142, 142, 12)), - (172, 1): np.array((48, 150, 216)), - (173, 1): np.array((62, 165, 101)), - (174, 1): np.array((112, 112, 242)), + (171, 1): np.array((112, 124, 180)), + (172, 1): np.array((113, 150, 48)), + (173, 1): np.array((98, 147, 100)), + (174, 1): np.array((142, 130, 74)), (175, 1): np.array((127, 127, 127)), - (176, 1): np.array((205, 206, 76)), - (177, 1): np.array((220, 220, 0)), - (178, 1): np.array((255, 168, 102)), - (179, 1): np.array((255, 183, 0)), + (176, 1): np.array((176, 188, 243)), + (177, 1): np.array((161, 186, 255)), + (178, 1): np.array((205, 168, 255)), + (179, 1): np.array((190, 165, 255)), (180, 1): np.array((191, 191, 191)), - (181, 1): np.array((205, 206, 76)), - (182, 1): np.array((255, 153, 217)), - (183, 1): np.array((255, 168, 102)), - (184, 1): np.array((141, 244, 50)), - (185, 1): np.array((156, 255, 0)), - (186, 1): np.array((205, 206, 76)), - (187, 1): np.array((220, 220, 0)), - (188, 1): np.array((126, 229, 165)), - (189, 1): np.array((141, 244, 50)), + (181, 1): np.array((176, 188, 243)), + (182, 1): np.array((220, 171, 218)), + (183, 1): np.array((205, 168, 255)), + (184, 1): np.array((146, 208, 217)), + (185, 1): np.array((131, 206, 255)), + (186, 1): np.array((176, 188, 243)), + (187, 1): np.array((161, 186, 255)), + (188, 1): np.array((161, 211, 164)), + (189, 1): np.array((146, 208, 217)), (190, 1): np.array((191, 191, 191)), - (191, 1): np.array((205, 206, 76)), - (192, 1): np.array((48, 150, 216)), - (193, 1): np.array((62, 165, 101)), - (194, 1): np.array((112, 112, 242)), + (191, 1): np.array((176, 188, 243)), + (192, 1): np.array((113, 150, 48)), + (193, 1): np.array((98, 147, 100)), + (194, 1): np.array((142, 130, 74)), (195, 1): np.array((127, 127, 127)), - (196, 1): np.array((33, 135, 255)), - (197, 1): np.array((48, 150, 216)), - (198, 1): np.array((98, 97, 255)), - (199, 1): np.array((112, 112, 242)), - (200, 1): np.array((0, 188, 190)), - (201, 1): np.array((0, 203, 75)), - (202, 1): np.array((48, 150, 216)), - (203, 1): np.array((62, 165, 101)), - (204, 1): np.array((0, 173, 255)), - (205, 1): np.array((0, 188, 190)), - (206, 1): np.array((33, 135, 255)), - (207, 1): np.array((48, 150, 216)), - (208, 1): np.array((126, 229, 165)), - (209, 1): np.array((141, 244, 50)), + (196, 1): np.array((128, 152, 0)), + (197, 1): np.array((113, 150, 48)), + (198, 1): np.array((157, 132, 22)), + (199, 1): np.array((142, 130, 74)), + (200, 1): np.array((83, 170, 21)), + (201, 1): np.array((68, 167, 73)), + (202, 1): np.array((113, 150, 48)), + (203, 1): np.array((98, 147, 100)), + (204, 1): np.array((98, 173, 0)), + (205, 1): np.array((83, 170, 21)), + (206, 1): np.array((128, 152, 0)), + (207, 1): np.array((113, 150, 48)), + (208, 1): np.array((161, 211, 164)), + (209, 1): np.array((146, 208, 217)), (210, 1): np.array((191, 191, 191)), - (211, 1): np.array((205, 206, 76)), - (212, 1): np.array((112, 214, 255)), - (213, 1): np.array((126, 229, 165)), - (214, 1): np.array((176, 176, 255)), + (211, 1): np.array((176, 188, 243)), + (212, 1): np.array((176, 214, 111)), + (213, 1): np.array((161, 211, 164)), + (214, 1): np.array((206, 193, 138)), (215, 1): np.array((191, 191, 191)), - (216, 1): np.array((62, 255, 138)), - (217, 1): np.array((76, 255, 23)), - (218, 1): np.array((126, 229, 165)), - (219, 1): np.array((141, 244, 50)), - (220, 1): np.array((47, 252, 253)), - (221, 1): np.array((62, 255, 138)), - (222, 1): np.array((112, 214, 255)), - (223, 1): np.array((126, 229, 165)), - (224, 1): np.array((176, 176, 255)), + (216, 1): np.array((132, 231, 137)), + (217, 1): np.array((117, 229, 190)), + (218, 1): np.array((161, 211, 164)), + (219, 1): np.array((146, 208, 217)), + (220, 1): np.array((147, 234, 85)), + (221, 1): np.array((132, 231, 137)), + (222, 1): np.array((176, 214, 111)), + (223, 1): np.array((161, 211, 164)), + (224, 1): np.array((206, 193, 138)), (225, 1): np.array((191, 191, 191)), - (226, 1): np.array((241, 138, 255)), - (227, 1): np.array((255, 153, 217)), - (228, 1): np.array((161, 161, 255)), - (229, 1): np.array((176, 176, 255)), - (230, 1): np.array((226, 123, 255)), - (231, 1): np.array((241, 138, 255)), - (232, 1): np.array((112, 214, 255)), - (233, 1): np.array((126, 229, 165)), - (234, 1): np.array((176, 176, 255)), + (226, 1): np.array((235, 173, 165)), + (227, 1): np.array((220, 171, 218)), + (228, 1): np.array((221, 196, 86)), + (229, 1): np.array((206, 193, 138)), + (230, 1): np.array((250, 176, 112)), + (231, 1): np.array((235, 173, 165)), + (232, 1): np.array((176, 214, 111)), + (233, 1): np.array((161, 211, 164)), + (234, 1): np.array((206, 193, 138)), (235, 1): np.array((191, 191, 191)), - (236, 1): np.array((97, 199, 255)), - (237, 1): np.array((112, 214, 255)), - (238, 1): np.array((161, 161, 255)), - (239, 1): np.array((176, 176, 255)), + (236, 1): np.array((191, 216, 59)), + (237, 1): np.array((176, 214, 111)), + (238, 1): np.array((221, 196, 86)), + (239, 1): np.array((206, 193, 138)), (240, 1): np.array((255, 255, 255)), - (241, 1): np.array((255, 255, 139)), - (242, 1): np.array((255, 217, 255)), - (243, 1): np.array((255, 231, 166)), - (244, 1): np.array((240, 240, 255)), - (245, 1): np.array((254, 255, 255)), - (246, 1): np.array((255, 202, 255)), - (247, 1): np.array((255, 217, 255)), - (248, 1): np.array((190, 255, 228)), - (249, 1): np.array((205, 255, 113)), - (250, 1): np.array((254, 255, 255)), - (251, 1): np.array((255, 255, 139)), - (252, 1): np.array((175, 255, 255)), - (253, 1): np.array((190, 255, 228)), - (254, 1): np.array((240, 240, 255)), - (255, 1): np.array((254, 255, 255)), + (241, 1): np.array((239, 252, 255)), + (242, 1): np.array((255, 234, 255)), + (243, 1): np.array((255, 232, 255)), + (244, 1): np.array((255, 255, 202)), + (245, 1): np.array((255, 255, 254)), + (246, 1): np.array((255, 237, 229)), + (247, 1): np.array((255, 234, 255)), + (248, 1): np.array((225, 255, 228)), + (249, 1): np.array((210, 255, 255)), + (250, 1): np.array((255, 255, 255)), + (251, 1): np.array((239, 252, 255)), + (252, 1): np.array((240, 255, 175)), + (253, 1): np.array((225, 255, 228)), + (254, 1): np.array((255, 255, 202)), + (255, 1): np.array((255, 255, 254)), (0, 2): np.array((0, 0, 0)), - (1, 2): np.array((64, 0, 26)), - (2, 2): np.array((0, 0, 115)), - (3, 2): np.array((49, 0, 141)), - (4, 2): np.array((0, 37, 0)), + (1, 2): np.array((29, 0, 26)), + (2, 2): np.array((15, 2, 0)), + (3, 2): np.array((44, 0, 0)), + (4, 2): np.array((0, 20, 0)), (5, 2): np.array((0, 0, 0)), - (6, 2): np.array((0, 23, 88)), - (7, 2): np.array((0, 0, 115)), - (8, 2): np.array((14, 14, 0)), - (9, 2): np.array((79, 0, 0)), + (6, 2): np.array((0, 22, 0)), + (7, 2): np.array((15, 2, 0)), + (8, 2): np.array((0, 0, 52)), + (9, 2): np.array((14, 0, 79)), (10, 2): np.array((0, 0, 0)), - (11, 2): np.array((64, 0, 26)), - (12, 2): np.array((0, 52, 0)), - (13, 2): np.array((14, 14, 0)), - (14, 2): np.array((0, 37, 0)), + (11, 2): np.array((29, 0, 26)), + (12, 2): np.array((0, 17, 25)), + (13, 2): np.array((0, 0, 52)), + (14, 2): np.array((0, 20, 0)), (15, 2): np.array((0, 0, 0)), - (16, 2): np.array((128, 25, 89)), - (17, 2): np.array((192, 0, 116)), - (18, 2): np.array((113, 10, 204)), - (19, 2): np.array((178, 0, 231)), + (16, 2): np.array((93, 43, 90)), + (17, 2): np.array((122, 23, 117)), + (18, 2): np.array((108, 46, 37)), + (19, 2): np.array((137, 25, 64)), (20, 2): np.array((63, 63, 63)), - (21, 2): np.array((128, 25, 89)), - (22, 2): np.array((49, 48, 178)), - (23, 2): np.array((113, 10, 204)), - (24, 2): np.array((142, 40, 0)), - (25, 2): np.array((207, 2, 1)), - (26, 2): np.array((128, 25, 89)), - (27, 2): np.array((192, 0, 116)), - (28, 2): np.array((78, 78, 0)), - (29, 2): np.array((142, 40, 0)), + (21, 2): np.array((93, 43, 90)), + (22, 2): np.array((78, 66, 11)), + (23, 2): np.array((108, 46, 37)), + (24, 2): np.array((78, 40, 143)), + (25, 2): np.array((107, 20, 169)), + (26, 2): np.array((93, 43, 90)), + (27, 2): np.array((122, 23, 117)), + (28, 2): np.array((48, 61, 116)), + (29, 2): np.array((78, 40, 143)), (30, 2): np.array((63, 63, 63)), - (31, 2): np.array((128, 25, 89)), - (32, 2): np.array((49, 48, 178)), - (33, 2): np.array((113, 10, 204)), - (34, 2): np.array((34, 34, 255)), - (35, 2): np.array((98, 0, 255)), - (36, 2): np.array((0, 86, 152)), - (37, 2): np.array((49, 48, 178)), - (38, 2): np.array((0, 71, 255)), - (39, 2): np.array((34, 34, 255)), + (31, 2): np.array((93, 43, 90)), + (32, 2): np.array((78, 66, 11)), + (33, 2): np.array((108, 46, 37)), + (34, 2): np.array((93, 68, 0)), + (35, 2): np.array((123, 48, 0)), + (36, 2): np.array((49, 86, 0)), + (37, 2): np.array((78, 66, 11)), + (38, 2): np.array((64, 89, 0)), + (39, 2): np.array((93, 68, 0)), (40, 2): np.array((63, 63, 63)), - (41, 2): np.array((128, 25, 89)), - (42, 2): np.array((49, 48, 178)), - (43, 2): np.array((113, 10, 204)), - (44, 2): np.array((0, 101, 37)), + (41, 2): np.array((93, 43, 90)), + (42, 2): np.array((78, 66, 11)), + (43, 2): np.array((108, 46, 37)), + (44, 2): np.array((34, 83, 36)), (45, 2): np.array((63, 63, 63)), - (46, 2): np.array((0, 86, 152)), - (47, 2): np.array((49, 48, 178)), - (48, 2): np.array((177, 74, 255)), - (49, 2): np.array((241, 36, 255)), - (50, 2): np.array((162, 59, 255)), - (51, 2): np.array((227, 21, 255)), - (52, 2): np.array((112, 112, 242)), - (53, 2): np.array((177, 74, 255)), - (54, 2): np.array((98, 97, 255)), - (55, 2): np.array((162, 59, 255)), - (56, 2): np.array((192, 89, 153)), - (57, 2): np.array((255, 51, 179)), - (58, 2): np.array((177, 74, 255)), - (59, 2): np.array((241, 36, 255)), + (46, 2): np.array((49, 86, 0)), + (47, 2): np.array((78, 66, 11)), + (48, 2): np.array((172, 109, 101)), + (49, 2): np.array((201, 89, 128)), + (50, 2): np.array((187, 112, 49)), + (51, 2): np.array((216, 92, 75)), + (52, 2): np.array((142, 130, 74)), + (53, 2): np.array((172, 109, 101)), + (54, 2): np.array((157, 132, 22)), + (55, 2): np.array((187, 112, 49)), + (56, 2): np.array((156, 107, 154)), + (57, 2): np.array((186, 87, 181)), + (58, 2): np.array((172, 109, 101)), + (59, 2): np.array((201, 89, 128)), (60, 2): np.array((127, 127, 127)), - (61, 2): np.array((192, 89, 153)), - (62, 2): np.array((112, 112, 242)), - (63, 2): np.array((177, 74, 255)), - (64, 2): np.array((0, 101, 37)), + (61, 2): np.array((156, 107, 154)), + (62, 2): np.array((142, 130, 74)), + (63, 2): np.array((172, 109, 101)), + (64, 2): np.array((34, 83, 36)), (65, 2): np.array((63, 63, 63)), - (66, 2): np.array((0, 86, 152)), - (67, 2): np.array((49, 48, 178)), - (68, 2): np.array((0, 139, 11)), - (69, 2): np.array((0, 101, 37)), - (70, 2): np.array((0, 124, 126)), - (71, 2): np.array((0, 86, 152)), - (72, 2): np.array((13, 116, 0)), - (73, 2): np.array((78, 78, 0)), - (74, 2): np.array((0, 101, 37)), + (66, 2): np.array((49, 86, 0)), + (67, 2): np.array((78, 66, 11)), + (68, 2): np.array((4, 104, 10)), + (69, 2): np.array((34, 83, 36)), + (70, 2): np.array((19, 106, 0)), + (71, 2): np.array((49, 86, 0)), + (72, 2): np.array((19, 81, 89)), + (73, 2): np.array((48, 61, 116)), + (74, 2): np.array((34, 83, 36)), (75, 2): np.array((63, 63, 63)), - (76, 2): np.array((0, 154, 0)), - (77, 2): np.array((13, 116, 0)), - (78, 2): np.array((0, 139, 11)), - (79, 2): np.array((0, 101, 37)), + (76, 2): np.array((0, 101, 62)), + (77, 2): np.array((19, 81, 89)), + (78, 2): np.array((4, 104, 10)), + (79, 2): np.array((34, 83, 36)), (80, 2): np.array((127, 127, 127)), - (81, 2): np.array((192, 89, 153)), - (82, 2): np.array((112, 112, 242)), - (83, 2): np.array((177, 74, 255)), - (84, 2): np.array((62, 165, 101)), + (81, 2): np.array((156, 107, 154)), + (82, 2): np.array((142, 130, 74)), + (83, 2): np.array((172, 109, 101)), + (84, 2): np.array((98, 147, 100)), (85, 2): np.array((127, 127, 127)), - (86, 2): np.array((48, 150, 216)), - (87, 2): np.array((112, 112, 242)), - (88, 2): np.array((142, 142, 12)), - (89, 2): np.array((206, 104, 38)), + (86, 2): np.array((113, 150, 48)), + (87, 2): np.array((142, 130, 74)), + (88, 2): np.array((112, 124, 180)), + (89, 2): np.array((141, 104, 206)), (90, 2): np.array((127, 127, 127)), - (91, 2): np.array((192, 89, 153)), - (92, 2): np.array((77, 180, 0)), - (93, 2): np.array((142, 142, 12)), - (94, 2): np.array((62, 165, 101)), + (91, 2): np.array((156, 107, 154)), + (92, 2): np.array((82, 145, 153)), + (93, 2): np.array((112, 124, 180)), + (94, 2): np.array((98, 147, 100)), (95, 2): np.array((127, 127, 127)), - (96, 2): np.array((48, 150, 216)), - (97, 2): np.array((112, 112, 242)), - (98, 2): np.array((33, 135, 255)), - (99, 2): np.array((98, 97, 255)), - (100, 2): np.array((0, 188, 190)), - (101, 2): np.array((48, 150, 216)), - (102, 2): np.array((0, 173, 255)), - (103, 2): np.array((33, 135, 255)), - (104, 2): np.array((62, 165, 101)), + (96, 2): np.array((113, 150, 48)), + (97, 2): np.array((142, 130, 74)), + (98, 2): np.array((128, 152, 0)), + (99, 2): np.array((157, 132, 22)), + (100, 2): np.array((83, 170, 21)), + (101, 2): np.array((113, 150, 48)), + (102, 2): np.array((98, 173, 0)), + (103, 2): np.array((128, 152, 0)), + (104, 2): np.array((98, 147, 100)), (105, 2): np.array((127, 127, 127)), - (106, 2): np.array((48, 150, 216)), - (107, 2): np.array((112, 112, 242)), - (108, 2): np.array((0, 203, 75)), - (109, 2): np.array((62, 165, 101)), - (110, 2): np.array((0, 188, 190)), - (111, 2): np.array((48, 150, 216)), - (112, 2): np.array((176, 176, 255)), - (113, 2): np.array((241, 138, 255)), - (114, 2): np.array((161, 161, 255)), - (115, 2): np.array((226, 123, 255)), - (116, 2): np.array((112, 214, 255)), - (117, 2): np.array((176, 176, 255)), - (118, 2): np.array((97, 199, 255)), - (119, 2): np.array((161, 161, 255)), + (106, 2): np.array((113, 150, 48)), + (107, 2): np.array((142, 130, 74)), + (108, 2): np.array((68, 167, 73)), + (109, 2): np.array((98, 147, 100)), + (110, 2): np.array((83, 170, 21)), + (111, 2): np.array((113, 150, 48)), + (112, 2): np.array((206, 193, 138)), + (113, 2): np.array((235, 173, 165)), + (114, 2): np.array((221, 196, 86)), + (115, 2): np.array((250, 176, 112)), + (116, 2): np.array((176, 214, 111)), + (117, 2): np.array((206, 193, 138)), + (118, 2): np.array((191, 216, 59)), + (119, 2): np.array((221, 196, 86)), (120, 2): np.array((191, 191, 191)), - (121, 2): np.array((255, 153, 217)), - (122, 2): np.array((176, 176, 255)), - (123, 2): np.array((241, 138, 255)), - (124, 2): np.array((126, 229, 165)), + (121, 2): np.array((220, 171, 218)), + (122, 2): np.array((206, 193, 138)), + (123, 2): np.array((235, 173, 165)), + (124, 2): np.array((161, 211, 164)), (125, 2): np.array((191, 191, 191)), - (126, 2): np.array((112, 214, 255)), - (127, 2): np.array((176, 176, 255)), - (128, 2): np.array((78, 78, 0)), - (129, 2): np.array((142, 40, 0)), + (126, 2): np.array((176, 214, 111)), + (127, 2): np.array((206, 193, 138)), + (128, 2): np.array((48, 61, 116)), + (129, 2): np.array((78, 40, 143)), (130, 2): np.array((63, 63, 63)), - (131, 2): np.array((128, 25, 89)), - (132, 2): np.array((13, 116, 0)), - (133, 2): np.array((78, 78, 0)), - (134, 2): np.array((0, 101, 37)), + (131, 2): np.array((93, 43, 90)), + (132, 2): np.array((19, 81, 89)), + (133, 2): np.array((48, 61, 116)), + (134, 2): np.array((34, 83, 36)), (135, 2): np.array((63, 63, 63)), - (136, 2): np.array((93, 93, 0)), - (137, 2): np.array((157, 55, 0)), - (138, 2): np.array((78, 78, 0)), - (139, 2): np.array((142, 40, 0)), - (140, 2): np.array((28, 131, 0)), - (141, 2): np.array((93, 93, 0)), - (142, 2): np.array((13, 116, 0)), - (143, 2): np.array((78, 78, 0)), - (144, 2): np.array((206, 104, 38)), - (145, 2): np.array((255, 66, 64)), - (146, 2): np.array((192, 89, 153)), - (147, 2): np.array((255, 51, 179)), - (148, 2): np.array((142, 142, 12)), - (149, 2): np.array((206, 104, 38)), + (136, 2): np.array((33, 58, 168)), + (137, 2): np.array((63, 38, 195)), + (138, 2): np.array((48, 61, 116)), + (139, 2): np.array((78, 40, 143)), + (140, 2): np.array((4, 78, 142)), + (141, 2): np.array((33, 58, 168)), + (142, 2): np.array((19, 81, 89)), + (143, 2): np.array((48, 61, 116)), + (144, 2): np.array((141, 104, 206)), + (145, 2): np.array((171, 84, 233)), + (146, 2): np.array((156, 107, 154)), + (147, 2): np.array((186, 87, 181)), + (148, 2): np.array((112, 124, 180)), + (149, 2): np.array((141, 104, 206)), (150, 2): np.array((127, 127, 127)), - (151, 2): np.array((192, 89, 153)), - (152, 2): np.array((221, 119, 0)), - (153, 2): np.array((255, 81, 0)), - (154, 2): np.array((206, 104, 38)), - (155, 2): np.array((255, 66, 64)), - (156, 2): np.array((156, 157, 0)), - (157, 2): np.array((221, 119, 0)), - (158, 2): np.array((142, 142, 12)), - (159, 2): np.array((206, 104, 38)), + (151, 2): np.array((156, 107, 154)), + (152, 2): np.array((126, 102, 255)), + (153, 2): np.array((156, 81, 255)), + (154, 2): np.array((141, 104, 206)), + (155, 2): np.array((171, 84, 233)), + (156, 2): np.array((97, 122, 232)), + (157, 2): np.array((126, 102, 255)), + (158, 2): np.array((112, 124, 180)), + (159, 2): np.array((141, 104, 206)), (160, 2): np.array((127, 127, 127)), - (161, 2): np.array((192, 89, 153)), - (162, 2): np.array((112, 112, 242)), - (163, 2): np.array((177, 74, 255)), - (164, 2): np.array((62, 165, 101)), + (161, 2): np.array((156, 107, 154)), + (162, 2): np.array((142, 130, 74)), + (163, 2): np.array((172, 109, 101)), + (164, 2): np.array((98, 147, 100)), (165, 2): np.array((127, 127, 127)), - (166, 2): np.array((48, 150, 216)), - (167, 2): np.array((112, 112, 242)), - (168, 2): np.array((142, 142, 12)), - (169, 2): np.array((206, 104, 38)), + (166, 2): np.array((113, 150, 48)), + (167, 2): np.array((142, 130, 74)), + (168, 2): np.array((112, 124, 180)), + (169, 2): np.array((141, 104, 206)), (170, 2): np.array((127, 127, 127)), - (171, 2): np.array((192, 89, 153)), - (172, 2): np.array((77, 180, 0)), - (173, 2): np.array((142, 142, 12)), - (174, 2): np.array((62, 165, 101)), + (171, 2): np.array((156, 107, 154)), + (172, 2): np.array((82, 145, 153)), + (173, 2): np.array((112, 124, 180)), + (174, 2): np.array((98, 147, 100)), (175, 2): np.array((127, 127, 127)), - (176, 2): np.array((255, 153, 217)), - (177, 2): np.array((255, 115, 243)), - (178, 2): np.array((241, 138, 255)), - (179, 2): np.array((255, 100, 255)), + (176, 2): np.array((220, 171, 218)), + (177, 2): np.array((250, 150, 244)), + (178, 2): np.array((235, 173, 165)), + (179, 2): np.array((255, 153, 192)), (180, 2): np.array((191, 191, 191)), - (181, 2): np.array((255, 153, 217)), - (182, 2): np.array((176, 176, 255)), - (183, 2): np.array((241, 138, 255)), - (184, 2): np.array((255, 168, 102)), - (185, 2): np.array((255, 130, 128)), - (186, 2): np.array((255, 153, 217)), - (187, 2): np.array((255, 115, 243)), - (188, 2): np.array((205, 206, 76)), - (189, 2): np.array((255, 168, 102)), + (181, 2): np.array((220, 171, 218)), + (182, 2): np.array((206, 193, 138)), + (183, 2): np.array((235, 173, 165)), + (184, 2): np.array((205, 168, 255)), + (185, 2): np.array((235, 148, 255)), + (186, 2): np.array((220, 171, 218)), + (187, 2): np.array((250, 150, 244)), + (188, 2): np.array((176, 188, 243)), + (189, 2): np.array((205, 168, 255)), (190, 2): np.array((191, 191, 191)), - (191, 2): np.array((255, 153, 217)), - (192, 2): np.array((77, 180, 0)), - (193, 2): np.array((142, 142, 12)), - (194, 2): np.array((62, 165, 101)), + (191, 2): np.array((220, 171, 218)), + (192, 2): np.array((82, 145, 153)), + (193, 2): np.array((112, 124, 180)), + (194, 2): np.array((98, 147, 100)), (195, 2): np.array((127, 127, 127)), - (196, 2): np.array((13, 218, 0)), - (197, 2): np.array((77, 180, 0)), - (198, 2): np.array((0, 203, 75)), - (199, 2): np.array((62, 165, 101)), - (200, 2): np.array((92, 195, 0)), - (201, 2): np.array((156, 157, 0)), - (202, 2): np.array((77, 180, 0)), - (203, 2): np.array((142, 142, 12)), - (204, 2): np.array((27, 233, 0)), - (205, 2): np.array((92, 195, 0)), - (206, 2): np.array((13, 218, 0)), - (207, 2): np.array((77, 180, 0)), - (208, 2): np.array((205, 206, 76)), - (209, 2): np.array((255, 168, 102)), + (196, 2): np.array((53, 165, 126)), + (197, 2): np.array((82, 145, 153)), + (198, 2): np.array((68, 167, 73)), + (199, 2): np.array((98, 147, 100)), + (200, 2): np.array((67, 142, 205)), + (201, 2): np.array((97, 122, 232)), + (202, 2): np.array((82, 145, 153)), + (203, 2): np.array((112, 124, 180)), + (204, 2): np.array((38, 162, 179)), + (205, 2): np.array((67, 142, 205)), + (206, 2): np.array((53, 165, 126)), + (207, 2): np.array((82, 145, 153)), + (208, 2): np.array((176, 188, 243)), + (209, 2): np.array((205, 168, 255)), (210, 2): np.array((191, 191, 191)), - (211, 2): np.array((255, 153, 217)), - (212, 2): np.array((141, 244, 50)), - (213, 2): np.array((205, 206, 76)), - (214, 2): np.array((126, 229, 165)), + (211, 2): np.array((220, 171, 218)), + (212, 2): np.array((146, 208, 217)), + (213, 2): np.array((176, 188, 243)), + (214, 2): np.array((161, 211, 164)), (215, 2): np.array((191, 191, 191)), - (216, 2): np.array((220, 220, 0)), - (217, 2): np.array((255, 183, 0)), - (218, 2): np.array((205, 206, 76)), - (219, 2): np.array((255, 168, 102)), - (220, 2): np.array((156, 255, 0)), - (221, 2): np.array((220, 220, 0)), - (222, 2): np.array((141, 244, 50)), - (223, 2): np.array((205, 206, 76)), - (224, 2): np.array((126, 229, 165)), + (216, 2): np.array((161, 186, 255)), + (217, 2): np.array((190, 165, 255)), + (218, 2): np.array((176, 188, 243)), + (219, 2): np.array((205, 168, 255)), + (220, 2): np.array((131, 206, 255)), + (221, 2): np.array((161, 186, 255)), + (222, 2): np.array((146, 208, 217)), + (223, 2): np.array((176, 188, 243)), + (224, 2): np.array((161, 211, 164)), (225, 2): np.array((191, 191, 191)), - (226, 2): np.array((112, 214, 255)), - (227, 2): np.array((176, 176, 255)), - (228, 2): np.array((62, 255, 138)), - (229, 2): np.array((126, 229, 165)), - (230, 2): np.array((47, 252, 253)), - (231, 2): np.array((112, 214, 255)), - (232, 2): np.array((141, 244, 50)), - (233, 2): np.array((205, 206, 76)), - (234, 2): np.array((126, 229, 165)), + (226, 2): np.array((176, 214, 111)), + (227, 2): np.array((206, 193, 138)), + (228, 2): np.array((132, 231, 137)), + (229, 2): np.array((161, 211, 164)), + (230, 2): np.array((147, 234, 85)), + (231, 2): np.array((176, 214, 111)), + (232, 2): np.array((146, 208, 217)), + (233, 2): np.array((176, 188, 243)), + (234, 2): np.array((161, 211, 164)), (235, 2): np.array((191, 191, 191)), - (236, 2): np.array((76, 255, 23)), - (237, 2): np.array((141, 244, 50)), - (238, 2): np.array((62, 255, 138)), - (239, 2): np.array((126, 229, 165)), - (240, 2): np.array((254, 255, 255)), - (241, 2): np.array((255, 217, 255)), - (242, 2): np.array((240, 240, 255)), - (243, 2): np.array((255, 202, 255)), - (244, 2): np.array((190, 255, 228)), - (245, 2): np.array((254, 255, 255)), - (246, 2): np.array((175, 255, 255)), - (247, 2): np.array((240, 240, 255)), - (248, 2): np.array((255, 255, 139)), - (249, 2): np.array((255, 231, 166)), - (250, 2): np.array((254, 255, 255)), - (251, 2): np.array((255, 217, 255)), - (252, 2): np.array((205, 255, 113)), - (253, 2): np.array((255, 255, 139)), - (254, 2): np.array((190, 255, 228)), - (255, 2): np.array((254, 255, 255)), + (236, 2): np.array((117, 229, 190)), + (237, 2): np.array((146, 208, 217)), + (238, 2): np.array((132, 231, 137)), + (239, 2): np.array((161, 211, 164)), + (240, 2): np.array((255, 255, 255)), + (241, 2): np.array((255, 234, 255)), + (242, 2): np.array((255, 255, 202)), + (243, 2): np.array((255, 237, 229)), + (244, 2): np.array((225, 255, 228)), + (245, 2): np.array((255, 255, 255)), + (246, 2): np.array((240, 255, 175)), + (247, 2): np.array((255, 255, 202)), + (248, 2): np.array((239, 252, 255)), + (249, 2): np.array((255, 232, 255)), + (250, 2): np.array((255, 255, 255)), + (251, 2): np.array((255, 234, 255)), + (252, 2): np.array((210, 255, 255)), + (253, 2): np.array((239, 252, 255)), + (254, 2): np.array((225, 255, 228)), + (255, 2): np.array((255, 255, 255)), (0, 3): np.array((0, 0, 0)), - (1, 3): np.array((0, 0, 115)), - (2, 3): np.array((0, 37, 0)), - (3, 3): np.array((0, 23, 88)), - (4, 3): np.array((14, 14, 0)), + (1, 3): np.array((15, 2, 0)), + (2, 3): np.array((0, 20, 0)), + (3, 3): np.array((0, 22, 0)), + (4, 3): np.array((0, 0, 52)), (5, 3): np.array((0, 0, 0)), - (6, 3): np.array((0, 52, 0)), - (7, 3): np.array((0, 37, 0)), - (8, 3): np.array((64, 0, 26)), - (9, 3): np.array((49, 0, 141)), + (6, 3): np.array((0, 17, 25)), + (7, 3): np.array((0, 20, 0)), + (8, 3): np.array((29, 0, 26)), + (9, 3): np.array((44, 0, 0)), (10, 3): np.array((0, 0, 0)), - (11, 3): np.array((0, 0, 115)), - (12, 3): np.array((79, 0, 0)), - (13, 3): np.array((64, 0, 26)), - (14, 3): np.array((14, 14, 0)), + (11, 3): np.array((15, 2, 0)), + (12, 3): np.array((14, 0, 79)), + (13, 3): np.array((29, 0, 26)), + (14, 3): np.array((0, 0, 52)), (15, 3): np.array((0, 0, 0)), - (16, 3): np.array((49, 48, 178)), - (17, 3): np.array((34, 34, 255)), - (18, 3): np.array((0, 86, 152)), - (19, 3): np.array((0, 71, 255)), + (16, 3): np.array((78, 66, 11)), + (17, 3): np.array((93, 68, 0)), + (18, 3): np.array((49, 86, 0)), + (19, 3): np.array((64, 89, 0)), (20, 3): np.array((63, 63, 63)), - (21, 3): np.array((49, 48, 178)), - (22, 3): np.array((0, 101, 37)), - (23, 3): np.array((0, 86, 152)), - (24, 3): np.array((113, 10, 204)), - (25, 3): np.array((98, 0, 255)), - (26, 3): np.array((49, 48, 178)), - (27, 3): np.array((34, 34, 255)), - (28, 3): np.array((128, 25, 89)), - (29, 3): np.array((113, 10, 204)), + (21, 3): np.array((78, 66, 11)), + (22, 3): np.array((34, 83, 36)), + (23, 3): np.array((49, 86, 0)), + (24, 3): np.array((108, 46, 37)), + (25, 3): np.array((123, 48, 0)), + (26, 3): np.array((78, 66, 11)), + (27, 3): np.array((93, 68, 0)), + (28, 3): np.array((93, 43, 90)), + (29, 3): np.array((108, 46, 37)), (30, 3): np.array((63, 63, 63)), - (31, 3): np.array((49, 48, 178)), - (32, 3): np.array((0, 101, 37)), - (33, 3): np.array((0, 86, 152)), - (34, 3): np.array((0, 139, 11)), - (35, 3): np.array((0, 124, 126)), - (36, 3): np.array((13, 116, 0)), - (37, 3): np.array((0, 101, 37)), - (38, 3): np.array((0, 154, 0)), - (39, 3): np.array((0, 139, 11)), + (31, 3): np.array((78, 66, 11)), + (32, 3): np.array((34, 83, 36)), + (33, 3): np.array((49, 86, 0)), + (34, 3): np.array((4, 104, 10)), + (35, 3): np.array((19, 106, 0)), + (36, 3): np.array((19, 81, 89)), + (37, 3): np.array((34, 83, 36)), + (38, 3): np.array((0, 101, 62)), + (39, 3): np.array((4, 104, 10)), (40, 3): np.array((63, 63, 63)), - (41, 3): np.array((49, 48, 178)), - (42, 3): np.array((0, 101, 37)), - (43, 3): np.array((0, 86, 152)), - (44, 3): np.array((78, 78, 0)), + (41, 3): np.array((78, 66, 11)), + (42, 3): np.array((34, 83, 36)), + (43, 3): np.array((49, 86, 0)), + (44, 3): np.array((48, 61, 116)), (45, 3): np.array((63, 63, 63)), - (46, 3): np.array((13, 116, 0)), - (47, 3): np.array((0, 101, 37)), - (48, 3): np.array((48, 150, 216)), - (49, 3): np.array((33, 135, 255)), - (50, 3): np.array((0, 188, 190)), - (51, 3): np.array((0, 173, 255)), - (52, 3): np.array((62, 165, 101)), - (53, 3): np.array((48, 150, 216)), - (54, 3): np.array((0, 203, 75)), - (55, 3): np.array((0, 188, 190)), - (56, 3): np.array((112, 112, 242)), - (57, 3): np.array((98, 97, 255)), - (58, 3): np.array((48, 150, 216)), - (59, 3): np.array((33, 135, 255)), + (46, 3): np.array((19, 81, 89)), + (47, 3): np.array((34, 83, 36)), + (48, 3): np.array((113, 150, 48)), + (49, 3): np.array((128, 152, 0)), + (50, 3): np.array((83, 170, 21)), + (51, 3): np.array((98, 173, 0)), + (52, 3): np.array((98, 147, 100)), + (53, 3): np.array((113, 150, 48)), + (54, 3): np.array((68, 167, 73)), + (55, 3): np.array((83, 170, 21)), + (56, 3): np.array((142, 130, 74)), + (57, 3): np.array((157, 132, 22)), + (58, 3): np.array((113, 150, 48)), + (59, 3): np.array((128, 152, 0)), (60, 3): np.array((127, 127, 127)), - (61, 3): np.array((112, 112, 242)), - (62, 3): np.array((62, 165, 101)), - (63, 3): np.array((48, 150, 216)), - (64, 3): np.array((78, 78, 0)), + (61, 3): np.array((142, 130, 74)), + (62, 3): np.array((98, 147, 100)), + (63, 3): np.array((113, 150, 48)), + (64, 3): np.array((48, 61, 116)), (65, 3): np.array((63, 63, 63)), - (66, 3): np.array((13, 116, 0)), - (67, 3): np.array((0, 101, 37)), - (68, 3): np.array((93, 93, 0)), - (69, 3): np.array((78, 78, 0)), - (70, 3): np.array((28, 131, 0)), - (71, 3): np.array((13, 116, 0)), - (72, 3): np.array((142, 40, 0)), - (73, 3): np.array((128, 25, 89)), - (74, 3): np.array((78, 78, 0)), + (66, 3): np.array((19, 81, 89)), + (67, 3): np.array((34, 83, 36)), + (68, 3): np.array((33, 58, 168)), + (69, 3): np.array((48, 61, 116)), + (70, 3): np.array((4, 78, 142)), + (71, 3): np.array((19, 81, 89)), + (72, 3): np.array((78, 40, 143)), + (73, 3): np.array((93, 43, 90)), + (74, 3): np.array((48, 61, 116)), (75, 3): np.array((63, 63, 63)), - (76, 3): np.array((157, 55, 0)), - (77, 3): np.array((142, 40, 0)), - (78, 3): np.array((93, 93, 0)), - (79, 3): np.array((78, 78, 0)), + (76, 3): np.array((63, 38, 195)), + (77, 3): np.array((78, 40, 143)), + (78, 3): np.array((33, 58, 168)), + (79, 3): np.array((48, 61, 116)), (80, 3): np.array((127, 127, 127)), - (81, 3): np.array((112, 112, 242)), - (82, 3): np.array((62, 165, 101)), - (83, 3): np.array((48, 150, 216)), - (84, 3): np.array((142, 142, 12)), + (81, 3): np.array((142, 130, 74)), + (82, 3): np.array((98, 147, 100)), + (83, 3): np.array((113, 150, 48)), + (84, 3): np.array((112, 124, 180)), (85, 3): np.array((127, 127, 127)), - (86, 3): np.array((77, 180, 0)), - (87, 3): np.array((62, 165, 101)), - (88, 3): np.array((192, 89, 153)), - (89, 3): np.array((177, 74, 255)), + (86, 3): np.array((82, 145, 153)), + (87, 3): np.array((98, 147, 100)), + (88, 3): np.array((156, 107, 154)), + (89, 3): np.array((172, 109, 101)), (90, 3): np.array((127, 127, 127)), - (91, 3): np.array((112, 112, 242)), - (92, 3): np.array((206, 104, 38)), - (93, 3): np.array((192, 89, 153)), - (94, 3): np.array((142, 142, 12)), + (91, 3): np.array((142, 130, 74)), + (92, 3): np.array((141, 104, 206)), + (93, 3): np.array((156, 107, 154)), + (94, 3): np.array((112, 124, 180)), (95, 3): np.array((127, 127, 127)), - (96, 3): np.array((77, 180, 0)), - (97, 3): np.array((62, 165, 101)), - (98, 3): np.array((13, 218, 0)), - (99, 3): np.array((0, 203, 75)), - (100, 3): np.array((92, 195, 0)), - (101, 3): np.array((77, 180, 0)), - (102, 3): np.array((27, 233, 0)), - (103, 3): np.array((13, 218, 0)), - (104, 3): np.array((142, 142, 12)), + (96, 3): np.array((82, 145, 153)), + (97, 3): np.array((98, 147, 100)), + (98, 3): np.array((53, 165, 126)), + (99, 3): np.array((68, 167, 73)), + (100, 3): np.array((67, 142, 205)), + (101, 3): np.array((82, 145, 153)), + (102, 3): np.array((38, 162, 179)), + (103, 3): np.array((53, 165, 126)), + (104, 3): np.array((112, 124, 180)), (105, 3): np.array((127, 127, 127)), - (106, 3): np.array((77, 180, 0)), - (107, 3): np.array((62, 165, 101)), - (108, 3): np.array((156, 157, 0)), - (109, 3): np.array((142, 142, 12)), - (110, 3): np.array((92, 195, 0)), - (111, 3): np.array((77, 180, 0)), - (112, 3): np.array((126, 229, 165)), - (113, 3): np.array((112, 214, 255)), - (114, 3): np.array((62, 255, 138)), - (115, 3): np.array((47, 252, 253)), - (116, 3): np.array((141, 244, 50)), - (117, 3): np.array((126, 229, 165)), - (118, 3): np.array((76, 255, 23)), - (119, 3): np.array((62, 255, 138)), + (106, 3): np.array((82, 145, 153)), + (107, 3): np.array((98, 147, 100)), + (108, 3): np.array((97, 122, 232)), + (109, 3): np.array((112, 124, 180)), + (110, 3): np.array((67, 142, 205)), + (111, 3): np.array((82, 145, 153)), + (112, 3): np.array((161, 211, 164)), + (113, 3): np.array((176, 214, 111)), + (114, 3): np.array((132, 231, 137)), + (115, 3): np.array((147, 234, 85)), + (116, 3): np.array((146, 208, 217)), + (117, 3): np.array((161, 211, 164)), + (118, 3): np.array((117, 229, 190)), + (119, 3): np.array((132, 231, 137)), (120, 3): np.array((191, 191, 191)), - (121, 3): np.array((176, 176, 255)), - (122, 3): np.array((126, 229, 165)), - (123, 3): np.array((112, 214, 255)), - (124, 3): np.array((205, 206, 76)), + (121, 3): np.array((206, 193, 138)), + (122, 3): np.array((161, 211, 164)), + (123, 3): np.array((176, 214, 111)), + (124, 3): np.array((176, 188, 243)), (125, 3): np.array((191, 191, 191)), - (126, 3): np.array((141, 244, 50)), - (127, 3): np.array((126, 229, 165)), - (128, 3): np.array((128, 25, 89)), - (129, 3): np.array((113, 10, 204)), + (126, 3): np.array((146, 208, 217)), + (127, 3): np.array((161, 211, 164)), + (128, 3): np.array((93, 43, 90)), + (129, 3): np.array((108, 46, 37)), (130, 3): np.array((63, 63, 63)), - (131, 3): np.array((49, 48, 178)), - (132, 3): np.array((142, 40, 0)), - (133, 3): np.array((128, 25, 89)), - (134, 3): np.array((78, 78, 0)), + (131, 3): np.array((78, 66, 11)), + (132, 3): np.array((78, 40, 143)), + (133, 3): np.array((93, 43, 90)), + (134, 3): np.array((48, 61, 116)), (135, 3): np.array((63, 63, 63)), - (136, 3): np.array((192, 0, 116)), - (137, 3): np.array((178, 0, 231)), - (138, 3): np.array((128, 25, 89)), - (139, 3): np.array((113, 10, 204)), - (140, 3): np.array((207, 2, 1)), - (141, 3): np.array((192, 0, 116)), - (142, 3): np.array((142, 40, 0)), - (143, 3): np.array((128, 25, 89)), - (144, 3): np.array((177, 74, 255)), - (145, 3): np.array((162, 59, 255)), - (146, 3): np.array((112, 112, 242)), - (147, 3): np.array((98, 97, 255)), - (148, 3): np.array((192, 89, 153)), - (149, 3): np.array((177, 74, 255)), + (136, 3): np.array((122, 23, 117)), + (137, 3): np.array((137, 25, 64)), + (138, 3): np.array((93, 43, 90)), + (139, 3): np.array((108, 46, 37)), + (140, 3): np.array((107, 20, 169)), + (141, 3): np.array((122, 23, 117)), + (142, 3): np.array((78, 40, 143)), + (143, 3): np.array((93, 43, 90)), + (144, 3): np.array((172, 109, 101)), + (145, 3): np.array((187, 112, 49)), + (146, 3): np.array((142, 130, 74)), + (147, 3): np.array((157, 132, 22)), + (148, 3): np.array((156, 107, 154)), + (149, 3): np.array((172, 109, 101)), (150, 3): np.array((127, 127, 127)), - (151, 3): np.array((112, 112, 242)), - (152, 3): np.array((241, 36, 255)), - (153, 3): np.array((227, 21, 255)), - (154, 3): np.array((177, 74, 255)), - (155, 3): np.array((162, 59, 255)), - (156, 3): np.array((255, 51, 179)), - (157, 3): np.array((241, 36, 255)), - (158, 3): np.array((192, 89, 153)), - (159, 3): np.array((177, 74, 255)), + (151, 3): np.array((142, 130, 74)), + (152, 3): np.array((201, 89, 128)), + (153, 3): np.array((216, 92, 75)), + (154, 3): np.array((172, 109, 101)), + (155, 3): np.array((187, 112, 49)), + (156, 3): np.array((186, 87, 181)), + (157, 3): np.array((201, 89, 128)), + (158, 3): np.array((156, 107, 154)), + (159, 3): np.array((172, 109, 101)), (160, 3): np.array((127, 127, 127)), - (161, 3): np.array((112, 112, 242)), - (162, 3): np.array((62, 165, 101)), - (163, 3): np.array((48, 150, 216)), - (164, 3): np.array((142, 142, 12)), + (161, 3): np.array((142, 130, 74)), + (162, 3): np.array((98, 147, 100)), + (163, 3): np.array((113, 150, 48)), + (164, 3): np.array((112, 124, 180)), (165, 3): np.array((127, 127, 127)), - (166, 3): np.array((77, 180, 0)), - (167, 3): np.array((62, 165, 101)), - (168, 3): np.array((192, 89, 153)), - (169, 3): np.array((177, 74, 255)), + (166, 3): np.array((82, 145, 153)), + (167, 3): np.array((98, 147, 100)), + (168, 3): np.array((156, 107, 154)), + (169, 3): np.array((172, 109, 101)), (170, 3): np.array((127, 127, 127)), - (171, 3): np.array((112, 112, 242)), - (172, 3): np.array((206, 104, 38)), - (173, 3): np.array((192, 89, 153)), - (174, 3): np.array((142, 142, 12)), + (171, 3): np.array((142, 130, 74)), + (172, 3): np.array((141, 104, 206)), + (173, 3): np.array((156, 107, 154)), + (174, 3): np.array((112, 124, 180)), (175, 3): np.array((127, 127, 127)), - (176, 3): np.array((176, 176, 255)), - (177, 3): np.array((161, 161, 255)), - (178, 3): np.array((112, 214, 255)), - (179, 3): np.array((97, 199, 255)), + (176, 3): np.array((206, 193, 138)), + (177, 3): np.array((221, 196, 86)), + (178, 3): np.array((176, 214, 111)), + (179, 3): np.array((191, 216, 59)), (180, 3): np.array((191, 191, 191)), - (181, 3): np.array((176, 176, 255)), - (182, 3): np.array((126, 229, 165)), - (183, 3): np.array((112, 214, 255)), - (184, 3): np.array((241, 138, 255)), - (185, 3): np.array((226, 123, 255)), - (186, 3): np.array((176, 176, 255)), - (187, 3): np.array((161, 161, 255)), - (188, 3): np.array((255, 153, 217)), - (189, 3): np.array((241, 138, 255)), + (181, 3): np.array((206, 193, 138)), + (182, 3): np.array((161, 211, 164)), + (183, 3): np.array((176, 214, 111)), + (184, 3): np.array((235, 173, 165)), + (185, 3): np.array((250, 176, 112)), + (186, 3): np.array((206, 193, 138)), + (187, 3): np.array((221, 196, 86)), + (188, 3): np.array((220, 171, 218)), + (189, 3): np.array((235, 173, 165)), (190, 3): np.array((191, 191, 191)), - (191, 3): np.array((176, 176, 255)), - (192, 3): np.array((206, 104, 38)), - (193, 3): np.array((192, 89, 153)), - (194, 3): np.array((142, 142, 12)), + (191, 3): np.array((206, 193, 138)), + (192, 3): np.array((141, 104, 206)), + (193, 3): np.array((156, 107, 154)), + (194, 3): np.array((112, 124, 180)), (195, 3): np.array((127, 127, 127)), - (196, 3): np.array((221, 119, 0)), - (197, 3): np.array((206, 104, 38)), - (198, 3): np.array((156, 157, 0)), - (199, 3): np.array((142, 142, 12)), - (200, 3): np.array((255, 66, 64)), - (201, 3): np.array((255, 51, 179)), - (202, 3): np.array((206, 104, 38)), - (203, 3): np.array((192, 89, 153)), - (204, 3): np.array((255, 81, 0)), - (205, 3): np.array((255, 66, 64)), - (206, 3): np.array((221, 119, 0)), - (207, 3): np.array((206, 104, 38)), - (208, 3): np.array((255, 153, 217)), - (209, 3): np.array((241, 138, 255)), + (196, 3): np.array((126, 102, 255)), + (197, 3): np.array((141, 104, 206)), + (198, 3): np.array((97, 122, 232)), + (199, 3): np.array((112, 124, 180)), + (200, 3): np.array((171, 84, 233)), + (201, 3): np.array((186, 87, 181)), + (202, 3): np.array((141, 104, 206)), + (203, 3): np.array((156, 107, 154)), + (204, 3): np.array((156, 81, 255)), + (205, 3): np.array((171, 84, 233)), + (206, 3): np.array((126, 102, 255)), + (207, 3): np.array((141, 104, 206)), + (208, 3): np.array((220, 171, 218)), + (209, 3): np.array((235, 173, 165)), (210, 3): np.array((191, 191, 191)), - (211, 3): np.array((176, 176, 255)), - (212, 3): np.array((255, 168, 102)), - (213, 3): np.array((255, 153, 217)), - (214, 3): np.array((205, 206, 76)), + (211, 3): np.array((206, 193, 138)), + (212, 3): np.array((205, 168, 255)), + (213, 3): np.array((220, 171, 218)), + (214, 3): np.array((176, 188, 243)), (215, 3): np.array((191, 191, 191)), - (216, 3): np.array((255, 115, 243)), - (217, 3): np.array((255, 100, 255)), - (218, 3): np.array((255, 153, 217)), - (219, 3): np.array((241, 138, 255)), - (220, 3): np.array((255, 130, 128)), - (221, 3): np.array((255, 115, 243)), - (222, 3): np.array((255, 168, 102)), - (223, 3): np.array((255, 153, 217)), - (224, 3): np.array((205, 206, 76)), + (216, 3): np.array((250, 150, 244)), + (217, 3): np.array((255, 153, 192)), + (218, 3): np.array((220, 171, 218)), + (219, 3): np.array((235, 173, 165)), + (220, 3): np.array((235, 148, 255)), + (221, 3): np.array((250, 150, 244)), + (222, 3): np.array((205, 168, 255)), + (223, 3): np.array((220, 171, 218)), + (224, 3): np.array((176, 188, 243)), (225, 3): np.array((191, 191, 191)), - (226, 3): np.array((141, 244, 50)), - (227, 3): np.array((126, 229, 165)), - (228, 3): np.array((220, 220, 0)), - (229, 3): np.array((205, 206, 76)), - (230, 3): np.array((156, 255, 0)), - (231, 3): np.array((141, 244, 50)), - (232, 3): np.array((255, 168, 102)), - (233, 3): np.array((255, 153, 217)), - (234, 3): np.array((205, 206, 76)), + (226, 3): np.array((146, 208, 217)), + (227, 3): np.array((161, 211, 164)), + (228, 3): np.array((161, 186, 255)), + (229, 3): np.array((176, 188, 243)), + (230, 3): np.array((131, 206, 255)), + (231, 3): np.array((146, 208, 217)), + (232, 3): np.array((205, 168, 255)), + (233, 3): np.array((220, 171, 218)), + (234, 3): np.array((176, 188, 243)), (235, 3): np.array((191, 191, 191)), - (236, 3): np.array((255, 183, 0)), - (237, 3): np.array((255, 168, 102)), - (238, 3): np.array((220, 220, 0)), - (239, 3): np.array((205, 206, 76)), + (236, 3): np.array((190, 165, 255)), + (237, 3): np.array((205, 168, 255)), + (238, 3): np.array((161, 186, 255)), + (239, 3): np.array((176, 188, 243)), (240, 3): np.array((255, 255, 255)), - (241, 3): np.array((240, 240, 255)), - (242, 3): np.array((190, 255, 228)), - (243, 3): np.array((175, 255, 255)), - (244, 3): np.array((255, 255, 139)), - (245, 3): np.array((255, 255, 255)), - (246, 3): np.array((205, 255, 113)), - (247, 3): np.array((190, 255, 228)), - (248, 3): np.array((255, 217, 255)), - (249, 3): np.array((255, 202, 255)), - (250, 3): np.array((254, 255, 255)), - (251, 3): np.array((240, 240, 255)), - (252, 3): np.array((255, 231, 166)), - (253, 3): np.array((255, 217, 255)), - (254, 3): np.array((255, 255, 139)), + (241, 3): np.array((255, 255, 202)), + (242, 3): np.array((225, 255, 228)), + (243, 3): np.array((240, 255, 175)), + (244, 3): np.array((239, 252, 255)), + (245, 3): np.array((255, 255, 254)), + (246, 3): np.array((210, 255, 255)), + (247, 3): np.array((225, 255, 228)), + (248, 3): np.array((255, 234, 255)), + (249, 3): np.array((255, 237, 229)), + (250, 3): np.array((255, 255, 255)), + (251, 3): np.array((255, 255, 202)), + (252, 3): np.array((255, 232, 255)), + (253, 3): np.array((255, 234, 255)), + (254, 3): np.array((239, 252, 255)), (255, 3): np.array((254, 255, 255)), } # 87 unique colours diff --git a/screen.py b/screen.py index a6f8be0..51386f2 100644 --- a/screen.py +++ b/screen.py @@ -1,5 +1,6 @@ """Representation of Apple II screen memory.""" +import math import numpy as np import palette as palette_py @@ -84,51 +85,49 @@ class DHGRScreen: def bitmap_to_image_ntsc(self, bitmap: np.ndarray) -> np.ndarray: y_width = 12 - u_width = 24 - v_width = 24 + i_width = 24 + q_width = 24 contrast = 1 - # TODO: where does this come from? OpenEmulator looks like it should - # use a value of 1.0 by default. - saturation = 2 - # Fudge factor to make colours line up with OpenEmulator - # TODO: where does this come from - is it due to the band-pass - # filtering they do? - hue = -0.3 + saturation = 1 + # DHGR has a timing shift of 1/4 phase, i.e x=0 is actually 1/4 phase. + # XXX should use (x + 1) % 4 ? + hue = math.pi / 2 # Apply effect of saturation - yuv_to_rgb = np.array( + yiq_to_rgb = np.array( ((1, 0, 0), (0, saturation, 0), (0, 0, saturation)), dtype=np.float) # Apply hue phase rotation - yuv_to_rgb = np.matmul(np.array( + yiq_to_rgb = np.matmul(np.array( ((1, 0, 0), (0, np.cos(hue), np.sin(hue)), (0, -np.sin(hue), np.cos(hue)))), - yuv_to_rgb) - # Y'UV to R'G'B' conversion - yuv_to_rgb = np.matmul(np.array( - ((1, 0, 1.13983), (1, -0.39465, -.58060), (1, 2.03211, 0))), - yuv_to_rgb) + yiq_to_rgb) + # Y'IQ to R'G'B' conversion + yiq_to_rgb = np.matmul(np.array( + ((1, 0.956, 0.621), (1, -0.272, -.647), (1, -1.107, 1.704))), + yiq_to_rgb) + # Apply effect of contrast - yuv_to_rgb *= contrast + yiq_to_rgb *= contrast out_rgb = np.empty((bitmap.shape[0], bitmap.shape[1] * 3, 3), dtype=np.uint8) for y in range(bitmap.shape[0]): ysum = 0 - usum = 0 - vsum = 0 + isum = 0 + qsum = 0 line = np.repeat(bitmap[y], 3) for x in range(bitmap.shape[1] * 3): ysum += self._read(line, x) - self._read(line, x - y_width) - usum += self._read(line, x) * self._sin(x) - self._read( - line, x - u_width) * self._sin((x - u_width)) - vsum += self._read(line, x) * self._cos(x) - self._read( - line, x - v_width) * self._cos((x - v_width)) + isum += self._read(line, x) * self._sin(x) - self._read( + line, x - i_width) * self._sin((x - i_width)) + qsum += self._read(line, x) * self._cos(x) - self._read( + line, x - q_width) * self._cos((x - q_width)) rgb = np.matmul( - yuv_to_rgb, np.array( - (ysum / y_width, usum / u_width, - vsum / v_width)).reshape((3, 1))).reshape(3) + yiq_to_rgb, np.array( + (ysum / y_width, isum / i_width, + qsum / q_width)).reshape((3, 1))).reshape(3) r = min(255, max(0, rgb[0] * 255)) g = min(255, max(0, rgb[1] * 255)) b = min(255, max(0, rgb[2] * 255))