use crate::vspd::{SpdShape, VSPD, Sample};
use crate::RGBf64;
use lazy_static::lazy_static;
use itertools::izip;
pub fn uplift_my(rgb: RGBf64) -> VSPD {
let (my_r, my_g, my_b) = my_basis();
izip!(my_r.wavelengths(), my_r.values(), my_g.values(), my_b.values())
.map(|(nm, w_r, w_g, w_b)| Sample::new(nm, w_r * rgb.r + w_g * rgb.g + w_b * rgb.b)).collect()
}
#[cfg(test)]
mod test {
use super::*;
use crate::colorchecker;
use crate::illuminant;
use crate::RGBu16;
use crate::cmf;
use crate::transform::{xyz_to_rgb, xyz_to_rgb_matrix};
use crate::color_space_rgb::model_f64;
#[test]
fn test_my_uplift() {
let xyz_to_rgb_mtx = xyz_to_rgb_matrix(model_f64::SRGB.white, &model_f64::SRGB);
for (name, ref_rgb) in colorchecker::SRGB_LINEAR.iter() {
let spd = uplift_my(*ref_rgb);
let xyz = spd.to_xyz(
&illuminant::spd::D65,
&cmf::CIE_1931_2_DEGREE,
);
let rgb = xyz_to_rgb(&xyz_to_rgb_mtx, xyz);
println!(" rgb {}: {}", name, RGBu16::from(rgb));
println!("ref rgb {}: {}", name, RGBu16::from(*ref_rgb));
}
}
}
pub fn my_basis() -> (VSPD, VSPD, VSPD) {
(
VSPD::from_values(SpdShape::new(380.0, 780.0, 5.0),
&[
0.327457413827055,
0.323750578270541,
0.313439461251577,
0.288879382755265,
0.239205681158886,
0.189702036890535,
0.121746067959218,
0.074578270669466,
0.0444331586340337,
0.0289286321285029,
0.0223166534847512,
0.0169113072926318,
0.0141811071179667,
0.0130531426774873,
0.011986163627845,
0.0112887147124048,
0.0109060664656517,
0.0104007134810042,
0.0106373602541465,
0.0109076625337741,
0.0110327124480988,
0.0113106565912268,
0.0111546420569403,
0.0101487704062122,
0.00891858211883843,
0.00768557633847106,
0.00670570828469526,
0.00599580598764424,
0.00553725664234189,
0.00519378424120663,
0.00502536226522334,
0.00513636276967508,
0.00543320026053983,
0.00581998590243535,
0.00640057277462412,
0.00744952868340878,
0.00858363581937657,
0.0103957624651674,
0.0135654335386492,
0.0193845158399742,
0.0320840712020024,
0.0743560378459411,
0.624393724178075,
0.91831003276872,
0.949253030175051,
0.958187833329246,
0.958187751332698,
0.958187625087782,
0.955679060771746,
0.958006154893429,
0.954101573456564,
0.947607606237237,
0.938681328447549,
0.924466682751434,
0.904606025333056,
0.880412198927933,
0.8477878731517,
0.805779126623019,
0.752531853871421,
0.686439396844578,
0.61869457086061,
0.540264443959111,
0.472964416293838,
0.432701596704049,
0.405358045528392,
0.385491834974902,
0.370983584551061,
0.357608701523081,
0.348712800108393,
0.344880119344691,
0.341917877323291,
0.339531092987129,
0.337169503774367,
0.336172018527717,
0.335167443433363,
0.334421625306463,
0.334008760376402,
0.333915792790082,
0.333818454946367,
0.333672774928456,
0.333569513405591,
]
),
VSPD::from_values(
SpdShape::new(380.0, 780.0, 5.0),
&[
0.331861713085874,
0.329688187759399,
0.327860021624697,
0.319173580231756,
0.294322583694842,
0.258697064768736,
0.188894319254765,
0.125388381991689,
0.0786870603106217,
0.0531432708659453,
0.0422881460313421,
0.0333183455029171,
0.0297559481859724,
0.0303312505369047,
0.0309885718973007,
0.0316863551888381,
0.0346699615029974,
0.034551957443675,
0.0406848061948297,
0.0544600373694056,
0.0809052874204737,
0.146348302857044,
0.379679643296617,
0.766744268654033,
0.87621474761337,
0.918491655613843,
0.940655562534437,
0.95373188453302,
0.961643279840238,
0.967200019685078,
0.970989746390046,
0.972852303563554,
0.973116594076444,
0.973351069154143,
0.973351115544369,
0.972261079731725,
0.973351021746917,
0.973148495185693,
0.971061306300914,
0.966371305955183,
0.954941967502548,
0.913578989551261,
0.364348803907687,
0.0715072425408851,
0.0412304344713751,
0.0324238741836685,
0.0319246297982003,
0.0312760331730969,
0.0326303704290574,
0.0295308721490739,
0.0315617611702464,
0.0356742182708204,
0.0414030053955673,
0.0506042604489561,
0.0634343003817003,
0.0789182452939229,
0.0995427426653747,
0.125595760093287,
0.15759091044168,
0.19539823904421,
0.231474474772178,
0.268852136095262,
0.296029164217928,
0.309754994441945,
0.317815883383822,
0.322990347389898,
0.326353847938009,
0.32914390227898,
0.330808726803682,
0.331482689922243,
0.331984550352389,
0.332341172522545,
0.332912009415539,
0.332919279695214,
0.333027672578856,
0.33317970467326,
0.333247030974549,
0.333259349210601,
0.333275050279383,
0.333294328448732,
0.333309424957775,
]
),
VSPD::from_values(
SpdShape::new(380.0, 780.0, 5.0),
&[
0.340680791548052,
0.346561186624852,
0.358700493140351,
0.391947026588195,
0.466471730587333,
0.551600895598602,
0.689359610948928,
0.800033346878607,
0.876879780935314,
0.917928097443955,
0.935395200669632,
0.949770347115183,
0.95606294480524,
0.956615606890316,
0.957025264931328,
0.957024930534713,
0.954423972737066,
0.955047329020204,
0.948677833093334,
0.934632299842328,
0.908061999852269,
0.842341039463727,
0.609165715365647,
0.223106960959533,
0.114866670291336,
0.0738227678957437,
0.0526387287910555,
0.0402723090168887,
0.0328194626509591,
0.0276061959270456,
0.0239848911270394,
0.0220113333527922,
0.0214502052559966,
0.0208289445095685,
0.0202483113888087,
0.0202893914512066,
0.018065342335913,
0.0164557422344685,
0.0153732601340955,
0.0142441784845517,
0.0129739615543347,
0.0120649741345218,
0.0112574781603901,
0.0101827246716942,
0.00951653538723741,
0.00938829272866817,
0.00988761909067028,
0.0105363420064589,
0.0116905688374448,
0.0124629728871037,
0.0143366651774203,
0.0167181753275443,
0.0199156660750025,
0.024929056163281,
0.0319596735860402,
0.0406695540952484,
0.0526693824219396,
0.0686251105141947,
0.0898772323000136,
0.118162358926434,
0.149830947442133,
0.190883409341834,
0.231006403025217,
0.257543385422202,
0.276826038721536,
0.291517772810795,
0.302662506083233,
0.313247301302886,
0.320478325124633,
0.323636994707961,
0.3260973088469,
0.328127369340184,
0.329917975958888,
0.330907901216649,
0.331803633095995,
0.332396627255361,
0.332740780726824,
0.332820857081489,
0.332901731283444,
0.333025967488632,
0.333111083081497,
]
))
}
lazy_static! {
pub static ref MY_RED: VSPD =
VSPD::from_values(SpdShape::new(380.0, 780.0, 5.0),
&[
0.327457413827055,
0.323750578270541,
0.313439461251577,
0.288879382755265,
0.239205681158886,
0.189702036890535,
0.121746067959218,
0.074578270669466,
0.0444331586340337,
0.0289286321285029,
0.0223166534847512,
0.0169113072926318,
0.0141811071179667,
0.0130531426774873,
0.011986163627845,
0.0112887147124048,
0.0109060664656517,
0.0104007134810042,
0.0106373602541465,
0.0109076625337741,
0.0110327124480988,
0.0113106565912268,
0.0111546420569403,
0.0101487704062122,
0.00891858211883843,
0.00768557633847106,
0.00670570828469526,
0.00599580598764424,
0.00553725664234189,
0.00519378424120663,
0.00502536226522334,
0.00513636276967508,
0.00543320026053983,
0.00581998590243535,
0.00640057277462412,
0.00744952868340878,
0.00858363581937657,
0.0103957624651674,
0.0135654335386492,
0.0193845158399742,
0.0320840712020024,
0.0743560378459411,
0.624393724178075,
0.91831003276872,
0.949253030175051,
0.958187833329246,
0.958187751332698,
0.958187625087782,
0.955679060771746,
0.958006154893429,
0.954101573456564,
0.947607606237237,
0.938681328447549,
0.924466682751434,
0.904606025333056,
0.880412198927933,
0.8477878731517,
0.805779126623019,
0.752531853871421,
0.686439396844578,
0.61869457086061,
0.540264443959111,
0.472964416293838,
0.432701596704049,
0.405358045528392,
0.385491834974902,
0.370983584551061,
0.357608701523081,
0.348712800108393,
0.344880119344691,
0.341917877323291,
0.339531092987129,
0.337169503774367,
0.336172018527717,
0.335167443433363,
0.334421625306463,
0.334008760376402,
0.333915792790082,
0.333818454946367,
0.333672774928456,
0.333569513405591,
]
);
pub static ref MY_GREEN: VSPD = VSPD::from_values(
SpdShape::new(380.0, 780.0, 5.0),
&[
0.331861713085874,
0.329688187759399,
0.327860021624697,
0.319173580231756,
0.294322583694842,
0.258697064768736,
0.188894319254765,
0.125388381991689,
0.0786870603106217,
0.0531432708659453,
0.0422881460313421,
0.0333183455029171,
0.0297559481859724,
0.0303312505369047,
0.0309885718973007,
0.0316863551888381,
0.0346699615029974,
0.034551957443675,
0.0406848061948297,
0.0544600373694056,
0.0809052874204737,
0.146348302857044,
0.379679643296617,
0.766744268654033,
0.87621474761337,
0.918491655613843,
0.940655562534437,
0.95373188453302,
0.961643279840238,
0.967200019685078,
0.970989746390046,
0.972852303563554,
0.973116594076444,
0.973351069154143,
0.973351115544369,
0.972261079731725,
0.973351021746917,
0.973148495185693,
0.971061306300914,
0.966371305955183,
0.954941967502548,
0.913578989551261,
0.364348803907687,
0.0715072425408851,
0.0412304344713751,
0.0324238741836685,
0.0319246297982003,
0.0312760331730969,
0.0326303704290574,
0.0295308721490739,
0.0315617611702464,
0.0356742182708204,
0.0414030053955673,
0.0506042604489561,
0.0634343003817003,
0.0789182452939229,
0.0995427426653747,
0.125595760093287,
0.15759091044168,
0.19539823904421,
0.231474474772178,
0.268852136095262,
0.296029164217928,
0.309754994441945,
0.317815883383822,
0.322990347389898,
0.326353847938009,
0.32914390227898,
0.330808726803682,
0.331482689922243,
0.331984550352389,
0.332341172522545,
0.332912009415539,
0.332919279695214,
0.333027672578856,
0.33317970467326,
0.333247030974549,
0.333259349210601,
0.333275050279383,
0.333294328448732,
0.333309424957775,
]
);
pub static ref MY_BLUE: VSPD = VSPD::from_values(
SpdShape::new(380.0, 780.0, 5.0),
&[
0.340680791548052,
0.346561186624852,
0.358700493140351,
0.391947026588195,
0.466471730587333,
0.551600895598602,
0.689359610948928,
0.800033346878607,
0.876879780935314,
0.917928097443955,
0.935395200669632,
0.949770347115183,
0.95606294480524,
0.956615606890316,
0.957025264931328,
0.957024930534713,
0.954423972737066,
0.955047329020204,
0.948677833093334,
0.934632299842328,
0.908061999852269,
0.842341039463727,
0.609165715365647,
0.223106960959533,
0.114866670291336,
0.0738227678957437,
0.0526387287910555,
0.0402723090168887,
0.0328194626509591,
0.0276061959270456,
0.0239848911270394,
0.0220113333527922,
0.0214502052559966,
0.0208289445095685,
0.0202483113888087,
0.0202893914512066,
0.018065342335913,
0.0164557422344685,
0.0153732601340955,
0.0142441784845517,
0.0129739615543347,
0.0120649741345218,
0.0112574781603901,
0.0101827246716942,
0.00951653538723741,
0.00938829272866817,
0.00988761909067028,
0.0105363420064589,
0.0116905688374448,
0.0124629728871037,
0.0143366651774203,
0.0167181753275443,
0.0199156660750025,
0.024929056163281,
0.0319596735860402,
0.0406695540952484,
0.0526693824219396,
0.0686251105141947,
0.0898772323000136,
0.118162358926434,
0.149830947442133,
0.190883409341834,
0.231006403025217,
0.257543385422202,
0.276826038721536,
0.291517772810795,
0.302662506083233,
0.313247301302886,
0.320478325124633,
0.323636994707961,
0.3260973088469,
0.328127369340184,
0.329917975958888,
0.330907901216649,
0.331803633095995,
0.332396627255361,
0.332740780726824,
0.332820857081489,
0.332901731283444,
0.333025967488632,
0.333111083081497,
]
);
pub static ref SMITS_WHITE: VSPD = VSPD::from_values(SpdShape::new(380.0, 720.0, 10.9375),
&[
1.0618958571272863e+00,
1.0615019980348779e+00,
1.0614335379927147e+00,
1.0622711654692485e+00,
1.0622036218416742e+00,
1.0625059965187085e+00,
1.0623938486985884e+00,
1.0624706448043137e+00,
1.0625048144827762e+00,
1.0624366131308856e+00,
1.0620694238892607e+00,
1.0613167586932164e+00,
1.0610334029377020e+00,
1.0613868564828413e+00,
1.0614215366116762e+00,
1.0620336151299086e+00,
1.0625497454805051e+00,
1.0624317487992085e+00,
1.0625249140554480e+00,
1.0624277664486914e+00,
1.0624749854090769e+00,
1.0625538581025402e+00,
1.0625326910104864e+00,
1.0623922312225325e+00,
1.0623650980354129e+00,
1.0625256476715284e+00,
1.0612277619533155e+00,
1.0594262608698046e+00,
1.0599810758292072e+00,
1.0602547314449409e+00,
1.0601263046243634e+00,
1.0606565756823634e+00
]
);
pub static ref SMITS_CYAN: VSPD = VSPD::from_values(SpdShape::new(380.0, 720.0, 10.9375),
&[
1.0414628021426751e+00,
1.0328661533771188e+00,
1.0126146228964314e+00,
1.0350460524836209e+00,
1.0078661447098567e+00,
1.0422280385081280e+00,
1.0442596738499825e+00,
1.0535238290294409e+00,
1.0180776226938120e+00,
1.0442729908727713e+00,
1.0529362541920750e+00,
1.0537034271160244e+00,
1.0533901869215969e+00,
1.0537782700979574e+00,
1.0527093770467102e+00,
1.0530449040446797e+00,
1.0550554640191208e+00,
1.0553673610724821e+00,
1.0454306634683976e+00,
6.2348950639230805e-01,
1.8038071613188977e-01,
-7.6303759201984539e-03,
-1.5217847035781367e-04,
-7.5102257347258311e-03,
-2.1708639328491472e-03,
6.5919466602369636e-04,
1.2278815318539780e-02,
-4.4669775637208031e-03,
1.7119799082865147e-02,
4.9211089759759801e-03,
5.8762925143334985e-03,
2.5259399415550079e-02
]
);
pub static ref SMITS_MAGENTA: VSPD = VSPD::from_values(SpdShape::new(380.0, 720.0, 10.9375),
&[
9.9422138151236850e-01,
9.8986937122975682e-01,
9.8293658286116958e-01,
9.9627868399859310e-01,
1.0198955019000133e+00,
1.0166395501210359e+00,
1.0220913178757398e+00,
9.9651666040682441e-01,
1.0097766178917882e+00,
1.0215422470827016e+00,
6.4031953387790963e-01,
2.5012379477078184e-03,
6.5339939555769944e-03,
2.8334080462675826e-03,
-5.1209675389074505e-11,
-9.0592291646646381e-03,
3.3936718323331200e-03,
-3.0638741121828406e-03,
2.2203936168286292e-01,
6.3141140024811970e-01,
9.7480985576500956e-01,
9.7209562333590571e-01,
1.0173770302868150e+00,
9.9875194322734129e-01,
9.4701725739602238e-01,
8.5258623154354796e-01,
9.4897798581660842e-01,
9.4751876096521492e-01,
9.9598944191059791e-01,
8.6301351503809076e-01,
8.9150987853523145e-01,
8.4866492652845082e-01
]
);
pub static ref SMITS_YELLOW: VSPD = VSPD::from_values(SpdShape::new(380.0, 720.0, 10.9375),
&[
5.5740622924920873e-03,
-4.7982831631446787e-03,
-5.2536564298613798e-03,
-6.4571480044499710e-03,
-5.9693514658007013e-03,
-2.1836716037686721e-03,
1.6781120601055327e-02,
9.6096355429062641e-02,
2.1217357081986446e-01,
3.6169133290685068e-01,
5.3961011543232529e-01,
7.4408810492171507e-01,
9.2209571148394054e-01,
1.0460304298411225e+00,
1.0513824989063714e+00,
1.0511991822135085e+00,
1.0510530911991052e+00,
1.0517397230360510e+00,
1.0516043086790485e+00,
1.0511944032061460e+00,
1.0511590325868068e+00,
1.0516612465483031e+00,
1.0514038526836869e+00,
1.0515941029228475e+00,
1.0511460436960840e+00,
1.0515123758830476e+00,
1.0508871369510702e+00,
1.0508923708102380e+00,
1.0477492815668303e+00,
1.0493272144017338e+00,
1.0435963333422726e+00,
1.0392280772051465e+00
]
);
pub static ref SMITS_RED: VSPD = VSPD::from_values(SpdShape::new(380.0, 720.0, 10.9375),
&[
1.6575604867086180e-01,
1.1846442802747797e-01,
1.2408293329637447e-01,
1.1371272058349924e-01,
7.8992434518899132e-02,
3.2205603593106549e-02,
-1.0798365407877875e-02,
1.8051975516730392e-02,
5.3407196598730527e-03,
1.3654918729501336e-02,
-5.9564213545642841e-03,
-1.8444365067353252e-03,
-1.0571884361529504e-02,
-2.9375521078000011e-03,
-1.0790476271835936e-02,
-8.0224306697503633e-03,
-2.2669167702495940e-03,
7.0200240494706634e-03,
-8.1528469000299308e-03,
6.0772866969252792e-01,
9.8831560865432400e-01,
9.9391691044078823e-01,
1.0039338994753197e+00,
9.9234499861167125e-01,
9.9926530858855522e-01,
1.0084621557617270e+00,
9.8358296827441216e-01,
1.0085023660099048e+00,
9.7451138326568698e-01,
9.8543269570059944e-01,
9.3495763980962043e-01,
9.8713907792319400e-01
]
);
pub static ref SMITS_GREEN: VSPD = VSPD::from_values(SpdShape::new(380.0, 720.0, 10.9375),
&[
2.6494153587602255e-03,
-5.0175013429732242e-03,
-1.2547236272489583e-02,
-9.4554964308388671e-03,
-1.2526086181600525e-02,
-7.9170697760437767e-03,
-7.9955735204175690e-03,
-9.3559433444469070e-03,
6.5468611982999303e-02,
3.9572875517634137e-01,
7.5244022299886659e-01,
9.6376478690218559e-01,
9.9854433855162328e-01,
9.9992977025287921e-01,
9.9939086751140449e-01,
9.9994372267071396e-01,
9.9939121813418674e-01,
9.9911237310424483e-01,
9.6019584878271580e-01,
6.3186279338432438e-01,
2.5797401028763473e-01,
9.4014888527335638e-03,
-3.0798345608649747e-03,
-4.5230367033685034e-03,
-6.8933410388274038e-03,
-9.0352195539015398e-03,
-8.5913667165340209e-03,
-8.3690869120289398e-03,
-7.8685832338754313e-03,
-8.3657578711085132e-06,
5.4301225442817177e-03,
-2.7745589759259194e-03
]
);
pub static ref SMITS_BLUE: VSPD = VSPD::from_values(SpdShape::new(380.0, 720.0, 10.9375),
&[
9.9209771469720676e-01,
9.8876426059369127e-01,
9.9539040744505636e-01,
9.9529317353008218e-01,
9.9181447411633950e-01,
1.0002584039673432e+00,
9.9968478437342512e-01,
9.9988120766657174e-01,
9.8504012146370434e-01,
7.9029849053031276e-01,
5.6082198617463974e-01,
3.3133458513996528e-01,
1.3692410840839175e-01,
1.8914906559664151e-02,
-5.1129770932550889e-06,
-4.2395493167891873e-04,
-4.1934593101534273e-04,
1.7473028136486615e-03,
3.7999160177631316e-03,
-5.5101474906588642e-04,
-4.3716662898480967e-05,
7.5874501748732798e-03,
2.5795650780554021e-02,
3.8168376532500548e-02,
4.9489586408030833e-02,
4.9595992290102905e-02,
4.9814819505812249e-02,
3.9840911064978023e-02,
3.0501024937233868e-02,
2.1243054765241080e-02,
6.9596532104356399e-03,
4.1733649330980525e-03
]
);
}