4 The start of something cool.
9 from typing import Optional, Tuple
11 from pyutils import ansi, bootstrap, config
13 logger = logging.getLogger(__name__)
14 args = config.add_commandline_args(f'({__file__})', f'Args related to {__file__}')
17 def rgb_to_hsv(rgb: Tuple[int, int, int]) -> Tuple[int, int, int]:
31 h = math.fmod(60 * ((g - b) / diff) + 360, 360)
33 h = math.fmod(60 * ((b - r) / diff) + 120, 360)
35 h = math.fmod(60 * ((r - g) / diff) + 240, 360)
40 s = (diff / cmax) * 100.0
46 def step(code, repetitions=1):
50 lum = math.sqrt(0.241 * r + 0.691 * g + 0.068 * b)
51 h, s, v = rgb_to_hsv(code)
52 h2 = int(h * repetitions)
53 lum2 = int(lum * repetitions)
54 v2 = int(v * repetitions)
57 lum = repetitions - lum
61 def sort_value(code: Tuple[int, int, int]) -> int:
62 lum = math.sqrt(0.241 * code[0] + 0.691 * code[1] + 0.068 * code[2])
63 hsv = rgb_to_hsv(code)
64 return lum * hsv[0] * hsv[1]
68 def main() -> Optional[int]:
71 for name, code in ansi.COLOR_NAMES_TO_RGB.items():
72 colors_to_code[name] = code
73 colors[name] = step(code, 8)
75 print(' <TABLE><TR><TD></TD><TD></TD><TD></TD><TD></TD>')
76 for n, name in enumerate(
77 {k: v for k, v in sorted(colors.items(), key=lambda i: i[1])}
81 code = colors_to_code[name]
82 contrast = ansi.pick_contrasting_color(None, code[0], code[1], code[2])
83 code = code[0] << 16 | code[1] << 8 | code[2]
85 contrast = contrast[0] << 16 | contrast[1] << 8 | contrast[2]
86 contrast = f'{contrast:06X}'
89 f" <TD BGCOLOR='{code}'><FONT COLOR='{contrast}'><CENTER>{name} (0x{code})</CENTER></FONT></TD>"
94 if __name__ == '__main__':