#[inline]
fn clamp01(x: f32) -> f32 {
x.clamp(0.0, 1.0)
}
#[inline]
fn to_u8(x: f32) -> u8 {
(clamp01(x) * 255.0 + 0.5) as u8
}
pub fn greyscale_rgba() -> [[u8; 4]; 256] {
let mut lut = [[0u8; 4]; 256];
for i in 0..256 {
let v = i as u8;
lut[i] = [v, v, v, 255];
}
lut
}
pub fn viridis_rgba() -> [[u8; 4]; 256] {
let mut lut = [[0u8; 4]; 256];
for i in 0..256 {
let t = i as f32 / 255.0;
let r = 0.277_727_33
+ t * (0.105_093_04
+ t * (-0.330_861_83
+ t * (-4.634_230_5
+ t * (6.228_269_9 + t * (4.776_385_0 - t * 5.435_455_9)))));
let g = 0.005_407_345
+ t * (1.404_613_5
+ t * (0.214_847_56
+ t * (-5.799_101_0 + t * (14.179_933 + t * (-13.745_145 + t * 4.645_852_6)))));
let b = 0.334_099_81
+ t * (1.384_590_2
+ t * (0.095_095_16
+ t * (-19.332_441 + t * (56.690_552 + t * (-65.353_033 + t * 26.312_435)))));
lut[i] = [to_u8(r), to_u8(g), to_u8(b), 255];
}
lut
}
pub fn plasma_rgba() -> [[u8; 4]; 256] {
let mut lut = [[0u8; 4]; 256];
for i in 0..256 {
let t = i as f32 / 255.0;
let r = 0.058_732_344
+ t * (2.176_514_6
+ t * (-2.689_460_5
+ t * (6.130_348_3 + t * (-11.107_436 + t * (10.023_066 - t * 3.658_713_8)))));
let g = 0.023_336_709
+ t * (0.238_383_42
+ t * (-7.455_851
+ t * (42.346_188 + t * (-82.666_31 + t * (71.413_62 - t * 22.931_534)))));
let b = 0.543_340_18
+ t * (0.753_960_46
+ t * (3.110_800
+ t * (-28.518_854 + t * (60.139_847 + t * (-54.072_186 + t * 18.191_908)))));
lut[i] = [to_u8(r), to_u8(g), to_u8(b), 255];
}
lut
}
pub fn coolwarm_rgba() -> [[u8; 4]; 256] {
let mut lut = [[0u8; 4]; 256];
let cold = [59.0 / 255.0_f32, 76.0 / 255.0, 192.0 / 255.0]; let mid = [220.0 / 255.0_f32, 220.0 / 255.0, 220.0 / 255.0]; let warm = [180.0 / 255.0_f32, 4.0 / 255.0, 38.0 / 255.0];
for i in 0..256 {
let t = i as f32 / 255.0;
let (r, g, b) = if t <= 0.5 {
let s = t * 2.0; let h = s * s * (3.0 - 2.0 * s); (
cold[0] + h * (mid[0] - cold[0]),
cold[1] + h * (mid[1] - cold[1]),
cold[2] + h * (mid[2] - cold[2]),
)
} else {
let s = (t - 0.5) * 2.0; let h = s * s * (3.0 - 2.0 * s);
(
mid[0] + h * (warm[0] - mid[0]),
mid[1] + h * (warm[1] - mid[1]),
mid[2] + h * (warm[2] - mid[2]),
)
};
lut[i] = [to_u8(r), to_u8(g), to_u8(b), 255];
}
lut
}
pub fn rainbow_rgba() -> [[u8; 4]; 256] {
let mut lut = [[0u8; 4]; 256];
for i in 0..256 {
let t = i as f32 / 255.0;
let hue = 240.0 * (1.0 - t); let (r, g, b) = hsv_to_rgb(hue, 1.0, 1.0);
lut[i] = [to_u8(r), to_u8(g), to_u8(b), 255];
}
lut
}
fn hsv_to_rgb(h: f32, s: f32, v: f32) -> (f32, f32, f32) {
if s == 0.0 {
return (v, v, v);
}
let h = h % 360.0;
let sector = (h / 60.0).floor() as i32;
let frac = h / 60.0 - sector as f32;
let p = v * (1.0 - s);
let q = v * (1.0 - s * frac);
let t = v * (1.0 - s * (1.0 - frac));
match sector {
0 => (v, t, p),
1 => (q, v, p),
2 => (p, v, t),
3 => (p, q, v),
4 => (t, p, v),
_ => (v, p, q),
}
}
pub fn magma_rgba() -> [[u8; 4]; 256] {
[
[0, 0, 4, 255],
[1, 0, 5, 255],
[1, 1, 6, 255],
[1, 1, 8, 255],
[2, 1, 9, 255],
[2, 2, 11, 255],
[2, 2, 13, 255],
[3, 3, 15, 255],
[3, 3, 18, 255],
[4, 4, 20, 255],
[5, 4, 22, 255],
[6, 5, 24, 255],
[6, 5, 26, 255],
[7, 6, 28, 255],
[8, 7, 30, 255],
[9, 7, 32, 255],
[10, 8, 34, 255],
[11, 9, 36, 255],
[12, 9, 38, 255],
[13, 10, 41, 255],
[14, 11, 43, 255],
[16, 11, 45, 255],
[17, 12, 47, 255],
[18, 13, 49, 255],
[19, 13, 52, 255],
[20, 14, 54, 255],
[21, 14, 56, 255],
[22, 15, 59, 255],
[24, 15, 61, 255],
[25, 16, 63, 255],
[26, 16, 66, 255],
[28, 16, 68, 255],
[29, 17, 71, 255],
[30, 17, 73, 255],
[32, 17, 75, 255],
[33, 17, 78, 255],
[34, 17, 80, 255],
[36, 18, 83, 255],
[37, 18, 85, 255],
[39, 18, 88, 255],
[41, 17, 90, 255],
[42, 17, 92, 255],
[44, 17, 95, 255],
[45, 17, 97, 255],
[47, 17, 99, 255],
[49, 17, 101, 255],
[51, 16, 103, 255],
[52, 16, 105, 255],
[54, 16, 107, 255],
[56, 16, 108, 255],
[57, 15, 110, 255],
[59, 15, 112, 255],
[61, 15, 113, 255],
[63, 15, 114, 255],
[64, 15, 116, 255],
[66, 15, 117, 255],
[68, 15, 118, 255],
[69, 16, 119, 255],
[71, 16, 120, 255],
[73, 16, 120, 255],
[74, 16, 121, 255],
[76, 17, 122, 255],
[78, 17, 123, 255],
[79, 18, 123, 255],
[81, 18, 124, 255],
[82, 19, 124, 255],
[84, 19, 125, 255],
[86, 20, 125, 255],
[87, 21, 126, 255],
[89, 21, 126, 255],
[90, 22, 126, 255],
[92, 22, 127, 255],
[93, 23, 127, 255],
[95, 24, 127, 255],
[96, 24, 128, 255],
[98, 25, 128, 255],
[100, 26, 128, 255],
[101, 26, 128, 255],
[103, 27, 128, 255],
[104, 28, 129, 255],
[106, 28, 129, 255],
[107, 29, 129, 255],
[109, 29, 129, 255],
[110, 30, 129, 255],
[112, 31, 129, 255],
[114, 31, 129, 255],
[115, 32, 129, 255],
[117, 33, 129, 255],
[118, 33, 129, 255],
[120, 34, 129, 255],
[121, 34, 130, 255],
[123, 35, 130, 255],
[124, 35, 130, 255],
[126, 36, 130, 255],
[128, 37, 130, 255],
[129, 37, 129, 255],
[131, 38, 129, 255],
[132, 38, 129, 255],
[134, 39, 129, 255],
[136, 39, 129, 255],
[137, 40, 129, 255],
[139, 41, 129, 255],
[140, 41, 129, 255],
[142, 42, 129, 255],
[144, 42, 129, 255],
[145, 43, 129, 255],
[147, 43, 128, 255],
[148, 44, 128, 255],
[150, 44, 128, 255],
[152, 45, 128, 255],
[153, 45, 128, 255],
[155, 46, 127, 255],
[156, 46, 127, 255],
[158, 47, 127, 255],
[160, 47, 127, 255],
[161, 48, 126, 255],
[163, 48, 126, 255],
[165, 49, 126, 255],
[166, 49, 125, 255],
[168, 50, 125, 255],
[170, 51, 125, 255],
[171, 51, 124, 255],
[173, 52, 124, 255],
[174, 52, 123, 255],
[176, 53, 123, 255],
[178, 53, 123, 255],
[179, 54, 122, 255],
[181, 54, 122, 255],
[183, 55, 121, 255],
[184, 55, 121, 255],
[186, 56, 120, 255],
[188, 57, 120, 255],
[189, 57, 119, 255],
[191, 58, 119, 255],
[192, 58, 118, 255],
[194, 59, 117, 255],
[196, 60, 117, 255],
[197, 60, 116, 255],
[199, 61, 115, 255],
[200, 62, 115, 255],
[202, 62, 114, 255],
[204, 63, 113, 255],
[205, 64, 113, 255],
[207, 64, 112, 255],
[208, 65, 111, 255],
[210, 66, 111, 255],
[211, 67, 110, 255],
[213, 68, 109, 255],
[214, 69, 108, 255],
[216, 69, 108, 255],
[217, 70, 107, 255],
[219, 71, 106, 255],
[220, 72, 105, 255],
[222, 73, 104, 255],
[223, 74, 104, 255],
[224, 76, 103, 255],
[226, 77, 102, 255],
[227, 78, 101, 255],
[228, 79, 100, 255],
[229, 80, 100, 255],
[231, 82, 99, 255],
[232, 83, 98, 255],
[233, 84, 98, 255],
[234, 86, 97, 255],
[235, 87, 96, 255],
[236, 88, 96, 255],
[237, 90, 95, 255],
[238, 91, 94, 255],
[239, 93, 94, 255],
[240, 95, 94, 255],
[241, 96, 93, 255],
[242, 98, 93, 255],
[242, 100, 92, 255],
[243, 101, 92, 255],
[244, 103, 92, 255],
[244, 105, 92, 255],
[245, 107, 92, 255],
[246, 108, 92, 255],
[246, 110, 92, 255],
[247, 112, 92, 255],
[247, 114, 92, 255],
[248, 116, 92, 255],
[248, 118, 92, 255],
[249, 120, 93, 255],
[249, 121, 93, 255],
[249, 123, 93, 255],
[250, 125, 94, 255],
[250, 127, 94, 255],
[250, 129, 95, 255],
[251, 131, 95, 255],
[251, 133, 96, 255],
[251, 135, 97, 255],
[252, 137, 97, 255],
[252, 138, 98, 255],
[252, 140, 99, 255],
[252, 142, 100, 255],
[252, 144, 101, 255],
[253, 146, 102, 255],
[253, 148, 103, 255],
[253, 150, 104, 255],
[253, 152, 105, 255],
[253, 154, 106, 255],
[253, 155, 107, 255],
[254, 157, 108, 255],
[254, 159, 109, 255],
[254, 161, 110, 255],
[254, 163, 111, 255],
[254, 165, 113, 255],
[254, 167, 114, 255],
[254, 169, 115, 255],
[254, 170, 116, 255],
[254, 172, 118, 255],
[254, 174, 119, 255],
[254, 176, 120, 255],
[254, 178, 122, 255],
[254, 180, 123, 255],
[254, 182, 124, 255],
[254, 183, 126, 255],
[254, 185, 127, 255],
[254, 187, 129, 255],
[254, 189, 130, 255],
[254, 191, 132, 255],
[254, 193, 133, 255],
[254, 194, 135, 255],
[254, 196, 136, 255],
[254, 198, 138, 255],
[254, 200, 140, 255],
[254, 202, 141, 255],
[254, 204, 143, 255],
[254, 205, 144, 255],
[254, 207, 146, 255],
[254, 209, 148, 255],
[254, 211, 149, 255],
[254, 213, 151, 255],
[254, 215, 153, 255],
[254, 216, 154, 255],
[253, 218, 156, 255],
[253, 220, 158, 255],
[253, 222, 160, 255],
[253, 224, 161, 255],
[253, 226, 163, 255],
[253, 227, 165, 255],
[253, 229, 167, 255],
[253, 231, 169, 255],
[253, 233, 170, 255],
[253, 235, 172, 255],
[252, 236, 174, 255],
[252, 238, 176, 255],
[252, 240, 178, 255],
[252, 242, 180, 255],
[252, 244, 182, 255],
[252, 246, 184, 255],
[252, 247, 185, 255],
[252, 249, 187, 255],
[252, 251, 189, 255],
[252, 253, 191, 255],
]
}
pub fn inferno_rgba() -> [[u8; 4]; 256] {
[
[0, 0, 4, 255],
[1, 0, 5, 255],
[1, 1, 6, 255],
[1, 1, 8, 255],
[2, 1, 10, 255],
[2, 2, 12, 255],
[2, 2, 14, 255],
[3, 2, 16, 255],
[4, 3, 18, 255],
[4, 3, 20, 255],
[5, 4, 23, 255],
[6, 4, 25, 255],
[7, 5, 27, 255],
[8, 5, 29, 255],
[9, 6, 31, 255],
[10, 7, 34, 255],
[11, 7, 36, 255],
[12, 8, 38, 255],
[13, 8, 41, 255],
[14, 9, 43, 255],
[16, 9, 45, 255],
[17, 10, 48, 255],
[18, 10, 50, 255],
[20, 11, 52, 255],
[21, 11, 55, 255],
[22, 11, 57, 255],
[24, 12, 60, 255],
[25, 12, 62, 255],
[27, 12, 65, 255],
[28, 12, 67, 255],
[30, 12, 69, 255],
[31, 12, 72, 255],
[33, 12, 74, 255],
[35, 12, 76, 255],
[36, 12, 79, 255],
[38, 12, 81, 255],
[40, 11, 83, 255],
[41, 11, 85, 255],
[43, 11, 87, 255],
[45, 11, 89, 255],
[47, 10, 91, 255],
[49, 10, 92, 255],
[50, 10, 94, 255],
[52, 10, 95, 255],
[54, 9, 97, 255],
[56, 9, 98, 255],
[57, 9, 99, 255],
[59, 9, 100, 255],
[61, 9, 101, 255],
[62, 9, 102, 255],
[64, 10, 103, 255],
[66, 10, 104, 255],
[68, 10, 104, 255],
[69, 10, 105, 255],
[71, 11, 106, 255],
[73, 11, 106, 255],
[74, 12, 107, 255],
[76, 12, 107, 255],
[77, 13, 108, 255],
[79, 13, 108, 255],
[81, 14, 108, 255],
[82, 14, 109, 255],
[84, 15, 109, 255],
[85, 15, 109, 255],
[87, 16, 110, 255],
[89, 16, 110, 255],
[90, 17, 110, 255],
[92, 18, 110, 255],
[93, 18, 110, 255],
[95, 19, 110, 255],
[97, 19, 110, 255],
[98, 20, 110, 255],
[100, 21, 110, 255],
[101, 21, 110, 255],
[103, 22, 110, 255],
[105, 22, 110, 255],
[106, 23, 110, 255],
[108, 24, 110, 255],
[109, 24, 110, 255],
[111, 25, 110, 255],
[113, 25, 110, 255],
[114, 26, 110, 255],
[116, 26, 110, 255],
[117, 27, 110, 255],
[119, 28, 109, 255],
[120, 28, 109, 255],
[122, 29, 109, 255],
[124, 29, 109, 255],
[125, 30, 109, 255],
[127, 30, 108, 255],
[128, 31, 108, 255],
[130, 32, 108, 255],
[132, 32, 107, 255],
[133, 33, 107, 255],
[135, 33, 107, 255],
[136, 34, 106, 255],
[138, 34, 106, 255],
[140, 35, 105, 255],
[141, 35, 105, 255],
[143, 36, 105, 255],
[144, 37, 104, 255],
[146, 37, 104, 255],
[147, 38, 103, 255],
[149, 38, 103, 255],
[151, 39, 102, 255],
[152, 39, 102, 255],
[154, 40, 101, 255],
[155, 41, 100, 255],
[157, 41, 100, 255],
[159, 42, 99, 255],
[160, 42, 99, 255],
[162, 43, 98, 255],
[163, 44, 97, 255],
[165, 44, 96, 255],
[166, 45, 96, 255],
[168, 46, 95, 255],
[169, 46, 94, 255],
[171, 47, 94, 255],
[173, 48, 93, 255],
[174, 48, 92, 255],
[176, 49, 91, 255],
[177, 50, 90, 255],
[179, 50, 90, 255],
[180, 51, 89, 255],
[182, 52, 88, 255],
[183, 53, 87, 255],
[185, 53, 86, 255],
[186, 54, 85, 255],
[188, 55, 84, 255],
[189, 56, 83, 255],
[191, 57, 82, 255],
[192, 58, 81, 255],
[193, 58, 80, 255],
[195, 59, 79, 255],
[196, 60, 78, 255],
[198, 61, 77, 255],
[199, 62, 76, 255],
[200, 63, 75, 255],
[202, 64, 74, 255],
[203, 65, 73, 255],
[204, 66, 72, 255],
[206, 67, 71, 255],
[207, 68, 70, 255],
[208, 69, 69, 255],
[210, 70, 68, 255],
[211, 71, 67, 255],
[212, 72, 66, 255],
[213, 74, 65, 255],
[215, 75, 63, 255],
[216, 76, 62, 255],
[217, 77, 61, 255],
[218, 78, 60, 255],
[219, 80, 59, 255],
[221, 81, 58, 255],
[222, 82, 56, 255],
[223, 83, 55, 255],
[224, 85, 54, 255],
[225, 86, 53, 255],
[226, 87, 52, 255],
[227, 89, 51, 255],
[228, 90, 49, 255],
[229, 92, 48, 255],
[230, 93, 47, 255],
[231, 94, 46, 255],
[232, 96, 45, 255],
[233, 97, 43, 255],
[234, 99, 42, 255],
[235, 100, 41, 255],
[235, 102, 40, 255],
[236, 103, 38, 255],
[237, 105, 37, 255],
[238, 106, 36, 255],
[239, 108, 35, 255],
[239, 110, 33, 255],
[240, 111, 32, 255],
[241, 113, 31, 255],
[241, 115, 29, 255],
[242, 116, 28, 255],
[243, 118, 27, 255],
[243, 120, 25, 255],
[244, 121, 24, 255],
[245, 123, 23, 255],
[245, 125, 21, 255],
[246, 126, 20, 255],
[246, 128, 19, 255],
[247, 130, 18, 255],
[247, 132, 16, 255],
[248, 133, 15, 255],
[248, 135, 14, 255],
[248, 137, 12, 255],
[249, 139, 11, 255],
[249, 140, 10, 255],
[249, 142, 9, 255],
[250, 144, 8, 255],
[250, 146, 7, 255],
[250, 148, 7, 255],
[251, 150, 6, 255],
[251, 151, 6, 255],
[251, 153, 6, 255],
[251, 155, 6, 255],
[251, 157, 7, 255],
[252, 159, 7, 255],
[252, 161, 8, 255],
[252, 163, 9, 255],
[252, 165, 10, 255],
[252, 166, 12, 255],
[252, 168, 13, 255],
[252, 170, 15, 255],
[252, 172, 17, 255],
[252, 174, 18, 255],
[252, 176, 20, 255],
[252, 178, 22, 255],
[252, 180, 24, 255],
[251, 182, 26, 255],
[251, 184, 29, 255],
[251, 186, 31, 255],
[251, 188, 33, 255],
[251, 190, 35, 255],
[250, 192, 38, 255],
[250, 194, 40, 255],
[250, 196, 42, 255],
[250, 198, 45, 255],
[249, 199, 47, 255],
[249, 201, 50, 255],
[249, 203, 53, 255],
[248, 205, 55, 255],
[248, 207, 58, 255],
[247, 209, 61, 255],
[247, 211, 64, 255],
[246, 213, 67, 255],
[246, 215, 70, 255],
[245, 217, 73, 255],
[245, 219, 76, 255],
[244, 221, 79, 255],
[244, 223, 83, 255],
[244, 225, 86, 255],
[243, 227, 90, 255],
[243, 229, 93, 255],
[242, 230, 97, 255],
[242, 232, 101, 255],
[242, 234, 105, 255],
[241, 236, 109, 255],
[241, 237, 113, 255],
[241, 239, 117, 255],
[241, 241, 121, 255],
[242, 242, 125, 255],
[242, 244, 130, 255],
[243, 245, 134, 255],
[243, 246, 138, 255],
[244, 248, 142, 255],
[245, 249, 146, 255],
[246, 250, 150, 255],
[248, 251, 154, 255],
[249, 252, 157, 255],
[250, 253, 161, 255],
[252, 255, 164, 255],
]
}
pub fn turbo_rgba() -> [[u8; 4]; 256] {
[
[48, 18, 59, 255],
[50, 21, 67, 255],
[51, 24, 74, 255],
[52, 27, 81, 255],
[53, 30, 88, 255],
[54, 33, 95, 255],
[55, 36, 102, 255],
[56, 39, 109, 255],
[57, 42, 115, 255],
[58, 45, 121, 255],
[59, 47, 128, 255],
[60, 50, 134, 255],
[61, 53, 139, 255],
[62, 56, 145, 255],
[63, 59, 151, 255],
[63, 62, 156, 255],
[64, 64, 162, 255],
[65, 67, 167, 255],
[65, 70, 172, 255],
[66, 73, 177, 255],
[66, 75, 181, 255],
[67, 78, 186, 255],
[68, 81, 191, 255],
[68, 84, 195, 255],
[68, 86, 199, 255],
[69, 89, 203, 255],
[69, 92, 207, 255],
[69, 94, 211, 255],
[70, 97, 214, 255],
[70, 100, 218, 255],
[70, 102, 221, 255],
[70, 105, 224, 255],
[70, 107, 227, 255],
[71, 110, 230, 255],
[71, 113, 233, 255],
[71, 115, 235, 255],
[71, 118, 238, 255],
[71, 120, 240, 255],
[71, 123, 242, 255],
[70, 125, 244, 255],
[70, 128, 246, 255],
[70, 130, 248, 255],
[70, 133, 250, 255],
[70, 135, 251, 255],
[69, 138, 252, 255],
[69, 140, 253, 255],
[68, 143, 254, 255],
[67, 145, 254, 255],
[66, 148, 255, 255],
[65, 150, 255, 255],
[64, 153, 255, 255],
[62, 155, 254, 255],
[61, 158, 254, 255],
[59, 160, 253, 255],
[58, 163, 252, 255],
[56, 165, 251, 255],
[55, 168, 250, 255],
[53, 171, 248, 255],
[51, 173, 247, 255],
[49, 175, 245, 255],
[47, 178, 244, 255],
[46, 180, 242, 255],
[44, 183, 240, 255],
[42, 185, 238, 255],
[40, 188, 235, 255],
[39, 190, 233, 255],
[37, 192, 231, 255],
[35, 195, 228, 255],
[34, 197, 226, 255],
[32, 199, 223, 255],
[31, 201, 221, 255],
[30, 203, 218, 255],
[28, 205, 216, 255],
[27, 208, 213, 255],
[26, 210, 210, 255],
[26, 212, 208, 255],
[25, 213, 205, 255],
[24, 215, 202, 255],
[24, 217, 200, 255],
[24, 219, 197, 255],
[24, 221, 194, 255],
[24, 222, 192, 255],
[24, 224, 189, 255],
[25, 226, 187, 255],
[25, 227, 185, 255],
[26, 228, 182, 255],
[28, 230, 180, 255],
[29, 231, 178, 255],
[31, 233, 175, 255],
[32, 234, 172, 255],
[34, 235, 170, 255],
[37, 236, 167, 255],
[39, 238, 164, 255],
[42, 239, 161, 255],
[44, 240, 158, 255],
[47, 241, 155, 255],
[50, 242, 152, 255],
[53, 243, 148, 255],
[56, 244, 145, 255],
[60, 245, 142, 255],
[63, 246, 138, 255],
[67, 247, 135, 255],
[70, 248, 132, 255],
[74, 248, 128, 255],
[78, 249, 125, 255],
[82, 250, 122, 255],
[85, 250, 118, 255],
[89, 251, 115, 255],
[93, 252, 111, 255],
[97, 252, 108, 255],
[101, 253, 105, 255],
[105, 253, 102, 255],
[109, 254, 98, 255],
[113, 254, 95, 255],
[117, 254, 92, 255],
[121, 254, 89, 255],
[125, 255, 86, 255],
[128, 255, 83, 255],
[132, 255, 81, 255],
[136, 255, 78, 255],
[139, 255, 75, 255],
[143, 255, 73, 255],
[146, 255, 71, 255],
[150, 254, 68, 255],
[153, 254, 66, 255],
[156, 254, 64, 255],
[159, 253, 63, 255],
[161, 253, 61, 255],
[164, 252, 60, 255],
[167, 252, 58, 255],
[169, 251, 57, 255],
[172, 251, 56, 255],
[175, 250, 55, 255],
[177, 249, 54, 255],
[180, 248, 54, 255],
[183, 247, 53, 255],
[185, 246, 53, 255],
[188, 245, 52, 255],
[190, 244, 52, 255],
[193, 243, 52, 255],
[195, 241, 52, 255],
[198, 240, 52, 255],
[200, 239, 52, 255],
[203, 237, 52, 255],
[205, 236, 52, 255],
[208, 234, 52, 255],
[210, 233, 53, 255],
[212, 231, 53, 255],
[215, 229, 53, 255],
[217, 228, 54, 255],
[219, 226, 54, 255],
[221, 224, 55, 255],
[223, 223, 55, 255],
[225, 221, 55, 255],
[227, 219, 56, 255],
[229, 217, 56, 255],
[231, 215, 57, 255],
[233, 213, 57, 255],
[235, 211, 57, 255],
[236, 209, 58, 255],
[238, 207, 58, 255],
[239, 205, 58, 255],
[241, 203, 58, 255],
[242, 201, 58, 255],
[244, 199, 58, 255],
[245, 197, 58, 255],
[246, 195, 58, 255],
[247, 193, 58, 255],
[248, 190, 57, 255],
[249, 188, 57, 255],
[250, 186, 57, 255],
[251, 184, 56, 255],
[251, 182, 55, 255],
[252, 179, 54, 255],
[252, 177, 54, 255],
[253, 174, 53, 255],
[253, 172, 52, 255],
[254, 169, 51, 255],
[254, 167, 50, 255],
[254, 164, 49, 255],
[254, 161, 48, 255],
[254, 158, 47, 255],
[254, 155, 45, 255],
[254, 153, 44, 255],
[254, 150, 43, 255],
[254, 147, 42, 255],
[254, 144, 41, 255],
[253, 141, 39, 255],
[253, 138, 38, 255],
[252, 135, 37, 255],
[252, 132, 35, 255],
[251, 129, 34, 255],
[251, 126, 33, 255],
[250, 123, 31, 255],
[249, 120, 30, 255],
[249, 117, 29, 255],
[248, 114, 28, 255],
[247, 111, 26, 255],
[246, 108, 25, 255],
[245, 105, 24, 255],
[244, 102, 23, 255],
[243, 99, 21, 255],
[242, 96, 20, 255],
[241, 93, 19, 255],
[240, 91, 18, 255],
[239, 88, 17, 255],
[237, 85, 16, 255],
[236, 83, 15, 255],
[235, 80, 14, 255],
[234, 78, 13, 255],
[232, 75, 12, 255],
[231, 73, 12, 255],
[229, 71, 11, 255],
[228, 69, 10, 255],
[226, 67, 10, 255],
[225, 65, 9, 255],
[223, 63, 8, 255],
[221, 61, 8, 255],
[220, 59, 7, 255],
[218, 57, 7, 255],
[216, 55, 6, 255],
[214, 53, 6, 255],
[212, 51, 5, 255],
[210, 49, 5, 255],
[208, 47, 5, 255],
[206, 45, 4, 255],
[204, 43, 4, 255],
[202, 42, 4, 255],
[200, 40, 3, 255],
[197, 38, 3, 255],
[195, 37, 3, 255],
[193, 35, 2, 255],
[190, 33, 2, 255],
[188, 32, 2, 255],
[185, 30, 2, 255],
[183, 29, 2, 255],
[180, 27, 1, 255],
[178, 26, 1, 255],
[175, 24, 1, 255],
[172, 23, 1, 255],
[169, 22, 1, 255],
[167, 20, 1, 255],
[164, 19, 1, 255],
[161, 18, 1, 255],
[158, 16, 1, 255],
[155, 15, 1, 255],
[152, 14, 1, 255],
[149, 13, 1, 255],
[146, 11, 1, 255],
[142, 10, 1, 255],
[139, 9, 2, 255],
[136, 8, 2, 255],
[133, 7, 2, 255],
[129, 6, 2, 255],
[126, 5, 2, 255],
[122, 4, 3, 255],
]
}
pub fn jet_rgba() -> [[u8; 4]; 256] {
[
[0, 0, 128, 255],
[0, 0, 132, 255],
[0, 0, 137, 255],
[0, 0, 141, 255],
[0, 0, 146, 255],
[0, 0, 150, 255],
[0, 0, 155, 255],
[0, 0, 159, 255],
[0, 0, 164, 255],
[0, 0, 168, 255],
[0, 0, 173, 255],
[0, 0, 178, 255],
[0, 0, 182, 255],
[0, 0, 187, 255],
[0, 0, 191, 255],
[0, 0, 196, 255],
[0, 0, 200, 255],
[0, 0, 205, 255],
[0, 0, 209, 255],
[0, 0, 214, 255],
[0, 0, 218, 255],
[0, 0, 223, 255],
[0, 0, 227, 255],
[0, 0, 232, 255],
[0, 0, 237, 255],
[0, 0, 241, 255],
[0, 0, 246, 255],
[0, 0, 250, 255],
[0, 0, 255, 255],
[0, 0, 255, 255],
[0, 0, 255, 255],
[0, 0, 255, 255],
[0, 1, 255, 255],
[0, 4, 255, 255],
[0, 9, 255, 255],
[0, 13, 255, 255],
[0, 17, 255, 255],
[0, 20, 255, 255],
[0, 25, 255, 255],
[0, 29, 255, 255],
[0, 33, 255, 255],
[0, 36, 255, 255],
[0, 41, 255, 255],
[0, 45, 255, 255],
[0, 49, 255, 255],
[0, 52, 255, 255],
[0, 57, 255, 255],
[0, 61, 255, 255],
[0, 65, 255, 255],
[0, 68, 255, 255],
[0, 73, 255, 255],
[0, 77, 255, 255],
[0, 81, 255, 255],
[0, 84, 255, 255],
[0, 89, 255, 255],
[0, 93, 255, 255],
[0, 97, 255, 255],
[0, 100, 255, 255],
[0, 105, 255, 255],
[0, 109, 255, 255],
[0, 113, 255, 255],
[0, 116, 255, 255],
[0, 121, 255, 255],
[0, 125, 255, 255],
[0, 129, 255, 255],
[0, 133, 255, 255],
[0, 136, 255, 255],
[0, 141, 255, 255],
[0, 145, 255, 255],
[0, 149, 255, 255],
[0, 153, 255, 255],
[0, 157, 255, 255],
[0, 161, 255, 255],
[0, 165, 255, 255],
[0, 168, 255, 255],
[0, 173, 255, 255],
[0, 177, 255, 255],
[0, 181, 255, 255],
[0, 185, 255, 255],
[0, 189, 255, 255],
[0, 193, 255, 255],
[0, 197, 255, 255],
[0, 200, 255, 255],
[0, 205, 255, 255],
[0, 209, 255, 255],
[0, 213, 255, 255],
[0, 217, 255, 255],
[0, 221, 254, 255],
[0, 225, 251, 255],
[0, 229, 248, 255],
[2, 232, 244, 255],
[6, 237, 241, 255],
[9, 241, 238, 255],
[12, 245, 235, 255],
[15, 249, 231, 255],
[19, 253, 228, 255],
[22, 255, 225, 255],
[25, 255, 222, 255],
[28, 255, 219, 255],
[31, 255, 215, 255],
[35, 255, 212, 255],
[38, 255, 209, 255],
[41, 255, 206, 255],
[44, 255, 202, 255],
[48, 255, 199, 255],
[51, 255, 196, 255],
[54, 255, 193, 255],
[57, 255, 190, 255],
[60, 255, 186, 255],
[64, 255, 183, 255],
[67, 255, 180, 255],
[70, 255, 177, 255],
[73, 255, 173, 255],
[77, 255, 170, 255],
[80, 255, 167, 255],
[83, 255, 164, 255],
[86, 255, 160, 255],
[90, 255, 157, 255],
[93, 255, 154, 255],
[96, 255, 151, 255],
[99, 255, 148, 255],
[102, 255, 144, 255],
[106, 255, 141, 255],
[109, 255, 138, 255],
[112, 255, 135, 255],
[115, 255, 131, 255],
[119, 255, 128, 255],
[122, 255, 125, 255],
[125, 255, 122, 255],
[128, 255, 119, 255],
[131, 255, 115, 255],
[135, 255, 112, 255],
[138, 255, 109, 255],
[141, 255, 106, 255],
[144, 255, 102, 255],
[148, 255, 99, 255],
[151, 255, 96, 255],
[154, 255, 93, 255],
[157, 255, 90, 255],
[160, 255, 86, 255],
[164, 255, 83, 255],
[167, 255, 80, 255],
[170, 255, 77, 255],
[173, 255, 73, 255],
[177, 255, 70, 255],
[180, 255, 67, 255],
[183, 255, 64, 255],
[186, 255, 60, 255],
[190, 255, 57, 255],
[193, 255, 54, 255],
[196, 255, 51, 255],
[199, 255, 48, 255],
[202, 255, 44, 255],
[206, 255, 41, 255],
[209, 255, 38, 255],
[212, 255, 35, 255],
[215, 255, 31, 255],
[219, 255, 28, 255],
[222, 255, 25, 255],
[225, 255, 22, 255],
[228, 255, 19, 255],
[231, 255, 15, 255],
[235, 255, 12, 255],
[238, 255, 9, 255],
[241, 252, 6, 255],
[244, 248, 2, 255],
[248, 245, 0, 255],
[251, 241, 0, 255],
[254, 237, 0, 255],
[255, 234, 0, 255],
[255, 230, 0, 255],
[255, 226, 0, 255],
[255, 222, 0, 255],
[255, 219, 0, 255],
[255, 215, 0, 255],
[255, 211, 0, 255],
[255, 208, 0, 255],
[255, 204, 0, 255],
[255, 200, 0, 255],
[255, 196, 0, 255],
[255, 193, 0, 255],
[255, 189, 0, 255],
[255, 185, 0, 255],
[255, 182, 0, 255],
[255, 178, 0, 255],
[255, 174, 0, 255],
[255, 171, 0, 255],
[255, 167, 0, 255],
[255, 163, 0, 255],
[255, 159, 0, 255],
[255, 156, 0, 255],
[255, 152, 0, 255],
[255, 148, 0, 255],
[255, 145, 0, 255],
[255, 141, 0, 255],
[255, 137, 0, 255],
[255, 134, 0, 255],
[255, 130, 0, 255],
[255, 126, 0, 255],
[255, 122, 0, 255],
[255, 119, 0, 255],
[255, 115, 0, 255],
[255, 111, 0, 255],
[255, 108, 0, 255],
[255, 104, 0, 255],
[255, 100, 0, 255],
[255, 96, 0, 255],
[255, 93, 0, 255],
[255, 89, 0, 255],
[255, 85, 0, 255],
[255, 82, 0, 255],
[255, 78, 0, 255],
[255, 74, 0, 255],
[255, 71, 0, 255],
[255, 67, 0, 255],
[255, 63, 0, 255],
[255, 59, 0, 255],
[255, 56, 0, 255],
[255, 52, 0, 255],
[255, 48, 0, 255],
[255, 45, 0, 255],
[255, 41, 0, 255],
[255, 37, 0, 255],
[255, 34, 0, 255],
[255, 30, 0, 255],
[255, 26, 0, 255],
[255, 22, 0, 255],
[255, 19, 0, 255],
[250, 15, 0, 255],
[246, 11, 0, 255],
[241, 8, 0, 255],
[237, 4, 0, 255],
[232, 0, 0, 255],
[228, 0, 0, 255],
[223, 0, 0, 255],
[218, 0, 0, 255],
[214, 0, 0, 255],
[209, 0, 0, 255],
[205, 0, 0, 255],
[200, 0, 0, 255],
[196, 0, 0, 255],
[191, 0, 0, 255],
[187, 0, 0, 255],
[182, 0, 0, 255],
[178, 0, 0, 255],
[173, 0, 0, 255],
[168, 0, 0, 255],
[164, 0, 0, 255],
[159, 0, 0, 255],
[155, 0, 0, 255],
[150, 0, 0, 255],
[146, 0, 0, 255],
[141, 0, 0, 255],
[137, 0, 0, 255],
[132, 0, 0, 255],
[128, 0, 0, 255],
]
}
pub fn rdbu_r_rgba() -> [[u8; 4]; 256] {
[
[5, 48, 97, 255],
[6, 50, 100, 255],
[7, 52, 103, 255],
[8, 54, 106, 255],
[9, 56, 109, 255],
[10, 59, 112, 255],
[12, 61, 115, 255],
[13, 63, 118, 255],
[14, 65, 121, 255],
[15, 67, 123, 255],
[16, 69, 126, 255],
[17, 71, 129, 255],
[18, 73, 132, 255],
[19, 76, 135, 255],
[20, 78, 138, 255],
[21, 80, 141, 255],
[23, 82, 144, 255],
[24, 84, 147, 255],
[25, 86, 150, 255],
[26, 88, 153, 255],
[27, 90, 156, 255],
[28, 92, 159, 255],
[29, 95, 162, 255],
[30, 97, 165, 255],
[31, 99, 168, 255],
[32, 101, 171, 255],
[34, 103, 172, 255],
[35, 105, 173, 255],
[36, 106, 174, 255],
[38, 108, 175, 255],
[39, 110, 176, 255],
[40, 112, 177, 255],
[42, 113, 178, 255],
[43, 115, 179, 255],
[44, 117, 180, 255],
[46, 119, 181, 255],
[47, 121, 181, 255],
[48, 122, 182, 255],
[50, 124, 183, 255],
[51, 126, 184, 255],
[52, 128, 185, 255],
[54, 129, 186, 255],
[55, 131, 187, 255],
[56, 133, 188, 255],
[58, 135, 189, 255],
[59, 136, 190, 255],
[60, 138, 190, 255],
[62, 140, 191, 255],
[63, 142, 192, 255],
[64, 143, 193, 255],
[66, 145, 194, 255],
[67, 147, 195, 255],
[70, 149, 196, 255],
[73, 151, 197, 255],
[76, 153, 198, 255],
[79, 155, 199, 255],
[82, 157, 200, 255],
[86, 159, 201, 255],
[89, 161, 202, 255],
[92, 163, 203, 255],
[95, 165, 205, 255],
[98, 167, 206, 255],
[101, 169, 207, 255],
[104, 171, 208, 255],
[107, 172, 209, 255],
[110, 174, 210, 255],
[113, 176, 211, 255],
[117, 178, 212, 255],
[120, 180, 213, 255],
[123, 182, 214, 255],
[126, 184, 215, 255],
[129, 186, 216, 255],
[132, 188, 217, 255],
[135, 190, 218, 255],
[138, 192, 219, 255],
[141, 194, 220, 255],
[144, 196, 221, 255],
[147, 198, 222, 255],
[150, 199, 223, 255],
[152, 200, 224, 255],
[155, 201, 224, 255],
[157, 203, 225, 255],
[160, 204, 226, 255],
[162, 205, 227, 255],
[165, 206, 227, 255],
[167, 208, 228, 255],
[169, 209, 229, 255],
[172, 210, 229, 255],
[174, 211, 230, 255],
[177, 213, 231, 255],
[179, 214, 232, 255],
[182, 215, 232, 255],
[184, 216, 233, 255],
[187, 218, 234, 255],
[189, 219, 234, 255],
[192, 220, 235, 255],
[194, 221, 236, 255],
[197, 223, 236, 255],
[199, 224, 237, 255],
[202, 225, 238, 255],
[204, 226, 239, 255],
[207, 228, 239, 255],
[209, 229, 240, 255],
[210, 230, 240, 255],
[212, 230, 241, 255],
[213, 231, 241, 255],
[215, 232, 241, 255],
[216, 233, 241, 255],
[218, 233, 242, 255],
[219, 234, 242, 255],
[221, 235, 242, 255],
[222, 235, 242, 255],
[224, 236, 243, 255],
[225, 237, 243, 255],
[227, 237, 243, 255],
[228, 238, 244, 255],
[230, 239, 244, 255],
[231, 240, 244, 255],
[233, 240, 244, 255],
[234, 241, 245, 255],
[236, 242, 245, 255],
[237, 242, 245, 255],
[239, 243, 245, 255],
[240, 244, 246, 255],
[242, 245, 246, 255],
[243, 245, 246, 255],
[245, 246, 247, 255],
[246, 247, 247, 255],
[247, 246, 246, 255],
[247, 245, 244, 255],
[248, 244, 242, 255],
[248, 243, 240, 255],
[248, 242, 239, 255],
[248, 241, 237, 255],
[249, 240, 235, 255],
[249, 239, 233, 255],
[249, 238, 231, 255],
[249, 237, 229, 255],
[249, 235, 227, 255],
[250, 234, 225, 255],
[250, 233, 223, 255],
[250, 232, 222, 255],
[250, 231, 220, 255],
[251, 230, 218, 255],
[251, 229, 216, 255],
[251, 228, 214, 255],
[251, 227, 212, 255],
[252, 226, 210, 255],
[252, 224, 208, 255],
[252, 223, 207, 255],
[252, 222, 205, 255],
[253, 221, 203, 255],
[253, 220, 201, 255],
[253, 219, 199, 255],
[253, 217, 196, 255],
[252, 215, 194, 255],
[252, 213, 191, 255],
[252, 211, 188, 255],
[251, 208, 185, 255],
[251, 206, 183, 255],
[251, 204, 180, 255],
[250, 202, 177, 255],
[250, 200, 175, 255],
[249, 198, 172, 255],
[249, 196, 169, 255],
[249, 194, 167, 255],
[248, 191, 164, 255],
[248, 189, 161, 255],
[248, 187, 158, 255],
[247, 185, 156, 255],
[247, 183, 153, 255],
[247, 181, 150, 255],
[246, 179, 148, 255],
[246, 177, 145, 255],
[246, 175, 142, 255],
[245, 172, 139, 255],
[245, 170, 137, 255],
[245, 168, 134, 255],
[244, 166, 131, 255],
[243, 164, 129, 255],
[242, 161, 127, 255],
[241, 158, 125, 255],
[240, 156, 123, 255],
[239, 153, 121, 255],
[238, 150, 119, 255],
[236, 147, 116, 255],
[235, 145, 114, 255],
[234, 142, 112, 255],
[233, 139, 110, 255],
[232, 137, 108, 255],
[230, 134, 106, 255],
[229, 131, 104, 255],
[228, 128, 102, 255],
[227, 126, 100, 255],
[226, 123, 98, 255],
[225, 120, 96, 255],
[223, 118, 94, 255],
[222, 115, 92, 255],
[221, 112, 89, 255],
[220, 110, 87, 255],
[219, 107, 85, 255],
[218, 104, 83, 255],
[216, 101, 81, 255],
[215, 99, 79, 255],
[214, 96, 77, 255],
[213, 93, 76, 255],
[211, 90, 74, 255],
[210, 88, 73, 255],
[208, 85, 72, 255],
[207, 82, 70, 255],
[206, 79, 69, 255],
[204, 76, 68, 255],
[203, 73, 66, 255],
[201, 71, 65, 255],
[200, 68, 64, 255],
[198, 65, 62, 255],
[197, 62, 61, 255],
[196, 59, 60, 255],
[194, 56, 58, 255],
[193, 54, 57, 255],
[191, 51, 56, 255],
[190, 48, 54, 255],
[189, 45, 53, 255],
[187, 42, 52, 255],
[186, 40, 50, 255],
[184, 37, 49, 255],
[183, 34, 48, 255],
[182, 31, 46, 255],
[180, 28, 45, 255],
[179, 25, 44, 255],
[177, 24, 43, 255],
[174, 23, 42, 255],
[171, 22, 42, 255],
[168, 21, 41, 255],
[165, 20, 41, 255],
[162, 19, 40, 255],
[159, 18, 40, 255],
[156, 17, 39, 255],
[153, 16, 39, 255],
[150, 15, 39, 255],
[147, 14, 38, 255],
[144, 13, 38, 255],
[141, 12, 37, 255],
[138, 11, 37, 255],
[135, 10, 36, 255],
[132, 9, 36, 255],
[129, 8, 35, 255],
[127, 8, 35, 255],
[124, 7, 34, 255],
[121, 6, 34, 255],
[118, 5, 33, 255],
[115, 4, 33, 255],
[112, 3, 32, 255],
[109, 2, 32, 255],
[106, 1, 31, 255],
[103, 0, 31, 255],
]
}
pub fn lerp_colourmap_lut(stops: &[(f32, [u8; 4])]) -> [[u8; 4]; 256] {
let mut lut = [[0u8; 4]; 256];
if stops.is_empty() {
return lut;
}
let mut sorted: Vec<(f32, [u8; 4])> = stops.to_vec();
sorted.sort_by(|a, b| a.0.partial_cmp(&b.0).unwrap_or(std::cmp::Ordering::Equal));
for i in 0..256 {
let t = i as f32 / 255.0;
let first = sorted[0];
let last = *sorted.last().unwrap();
if t <= first.0 {
lut[i] = first.1;
continue;
}
if t >= last.0 {
lut[i] = last.1;
continue;
}
let pos = sorted.partition_point(|s| s.0 <= t);
let lo = sorted[pos - 1];
let hi = sorted[pos];
let range = hi.0 - lo.0;
let frac = if range > 1.0e-7 {
(t - lo.0) / range
} else {
0.0
};
lut[i] = [
(lo.1[0] as f32 + (hi.1[0] as f32 - lo.1[0] as f32) * frac + 0.5) as u8,
(lo.1[1] as f32 + (hi.1[1] as f32 - lo.1[1] as f32) * frac + 0.5) as u8,
(lo.1[2] as f32 + (hi.1[2] as f32 - lo.1[2] as f32) * frac + 0.5) as u8,
(lo.1[3] as f32 + (hi.1[3] as f32 - lo.1[3] as f32) * frac + 0.5) as u8,
];
}
lut
}
pub fn parse_paraview_xml_colourmap(xml: &str) -> Vec<(String, Vec<(f32, [u8; 4])>)> {
let mut result = Vec::new();
let mut current_name: Option<String> = None;
let mut current_stops: Vec<(f32, [u8; 4])> = Vec::new();
for line in xml.lines() {
let trimmed = line.trim();
if trimmed.starts_with("<ColourMap") {
current_name = attr_value(trimmed, "name").map(|s| s.to_string());
current_stops.clear();
} else if trimmed.starts_with("</ColourMap>") {
if let Some(name) = current_name.take() {
if !current_stops.is_empty() {
result.push((name, current_stops.clone()));
}
}
current_stops.clear();
} else if trimmed.starts_with("<Point") {
if let (Some(x), Some(r), Some(g), Some(b)) = (
attr_f32(trimmed, "x"),
attr_f32(trimmed, "r"),
attr_f32(trimmed, "g"),
attr_f32(trimmed, "b"),
) {
let a = attr_f32(trimmed, "o").unwrap_or(1.0);
let stop = (
x,
[
(r.clamp(0.0, 1.0) * 255.0 + 0.5) as u8,
(g.clamp(0.0, 1.0) * 255.0 + 0.5) as u8,
(b.clamp(0.0, 1.0) * 255.0 + 0.5) as u8,
(a.clamp(0.0, 1.0) * 255.0 + 0.5) as u8,
],
);
current_stops.push(stop);
}
}
}
result
}
pub fn export_paraview_xml_colourmap(name: &str, stops: &[(f32, [u8; 4])]) -> String {
let mut out = String::new();
out.push_str("<ColourMaps>\n");
out.push_str(&format!(" <ColourMap name=\"{}\" space=\"RGB\">\n", name));
for &(pos, rgba) in stops {
let r = rgba[0] as f32 / 255.0;
let g = rgba[1] as f32 / 255.0;
let b = rgba[2] as f32 / 255.0;
let o = rgba[3] as f32 / 255.0;
out.push_str(&format!(
" <Point x=\"{:.6}\" r=\"{:.6}\" g=\"{:.6}\" b=\"{:.6}\" o=\"{:.6}\"/>\n",
pos, r, g, b, o
));
}
out.push_str(" </ColourMap>\n");
out.push_str("</ColourMaps>\n");
out
}
fn attr_value<'a>(tag: &'a str, name: &str) -> Option<&'a str> {
let search = format!("{}=\"", name);
let start = tag.find(search.as_str())? + search.len();
let end = tag[start..].find('"')? + start;
Some(&tag[start..end])
}
fn attr_f32(tag: &str, name: &str) -> Option<f32> {
attr_value(tag, name)?.parse().ok()
}