colorxy = {
const
HI = little_endian, LO = 1 - HI,
EMASK = 0x7ff00000,
float_array = new Float64Array([1.0, 1.0]),
int_array = new Int32Array(float_array.buffer);
return function colorxy([x, y]) {
if (x + y !== x + y) return [255, 255, 0, 255];
if ((x + y)*(x + y) === Infinity) return [0, 0, 0, 255];
if (x*x + y*y === 0) return [0, 0, 0, 255];
float_array[0] = x;
float_array[1] = y;
const
xlo = int_array[0+LO],
ylo = int_array[2+LO],
xhi = int_array[0+HI],
yhi = int_array[2+HI],
xtz = ctz32(xlo) + !xlo * ctz32(xhi | 0x100000),
ytz = ctz32(ylo) + !ylo * ctz32(yhi | 0x100000),
xexp = ((xhi & EMASK) >>> 20) - 1023,
yexp = ((yhi & EMASK) >>> 20) - 1023;
let
x_least_bit = xexp + xtz - 52,
y_least_bit = yexp + ytz - 52;
if (x_least_bit === -1023) x_least_bit = 1023;
if (y_least_bit === -1023) y_least_bit = 1023;
const
least_bit = Math.min(x_least_bit, y_least_bit),
x_tail = ((2**(-least_bit) * x) % 4) & 3,
y_tail = ((2**(-least_bit) * y) % 4) & 3;
const index = (
3 * (((x_tail & 2)) + 0.5 * (y_tail & 2)) +
(2 * (x_tail & 1) + (y_tail & 1) - 1));
return grouped_colors[least_bit & 3][index];
}
}