#!/usr/bin/env python3

# 64 bits
red = 0x1212_1212_1212_1212
green = 0x3434_3434_3434_3434
blue = 0x5656_5656_5656_5656

red = red      / 0xFFFF_FFFF_FFFF_FFFF
green = green  / 0xFFFF_FFFF_FFFF_FFFF
blue = blue    / 0xFFFF_FFFF_FFFF_FFFF
print("RGB =", red, green, blue)

red_orig = red
green_orig = green
blue_orig = blue

X = (red * 0.4451698156) + (green * 0.2771344092) + (blue * 0.1722826698)
Y = (red * 0.2094916779) + (green * 0.7215952542) + (blue * 0.0689130679)
Z = (red * 0.0000000000) + (green * 0.0470605601) + (blue * 0.9073553944)
print("XYZ =", X, Y, Z)

red   = (X *  2.7253940305) + (Y * -1.0180030062) + (Z * -0.4401631952)
green = (X * -0.7951680258) + (Y *  1.6897320548) + (Z *  0.0226471906) 
blue  = (X *  0.0412418914) + (Y * -0.0876390192) + (Z *  1.1009293786)
print("RGB =", red, green, blue)


for nb_bits in range(8, 65, 2):

	# multiplicator
	mul = (2**nb_bits)-1

	# convert
	h_red   = hex(int(round(red * mul)))
	h_green = hex(int(round(green * mul)))
	h_blue  = hex(int(round(blue * mul)))
	print(f"{nb_bits:>2} bits : %-20s\t%-20s\t%-20s" % (
		h_red,
		h_green,
		h_blue
	))

	# original
	h_red_orig   = hex(int(round(red_orig * mul)))
	h_green_orig = hex(int(round(green_orig * mul)))
	h_blue_orig  = hex(int(round(blue_orig * mul)))
	print(f"{nb_bits:>2} bits : %-20s\t%-20s\t%-20s" % (
		h_red_orig,
		h_green_orig,
		h_blue_orig
	))

	if h_red_orig != h_red \
		or h_green_orig != h_green \
		or h_blue_orig != h_blue:
			print(f"# drift on {nb_bits} bits")

