//added by James on 1/22/96 void sxyztolab(double *Lxy, double *lab) { double t; double xyz[3]; double e, f, c, d; double X, Y, Z; double bot; t = (16.0+Lxy[0])/116.0; t = t*t*t; xyz[1] = t; Y = t*100; X = Lxy[1]*Y/Lxy[2]; Z = (1-Lxy[1]-Lxy[2])*Y/Lxy[2]; xyz[0] = X/96.442; xyz[2] = Z/82.521; nxyztoLab(xyz,lab); }
McoStatus Techkon::translatetoLab(double *xyz,double *lab) { // convert to lab for 5000K // normalize first xyz[0] = 0.3585*xyz[0]/(100*0.3457); xyz[1] = xyz[1]/(100); xyz[2] = 0.3585*xyz[2]/(100*0.2958); // convert to lab nxyztoLab(xyz,lab); if (lab[0] < 0) lab[0] = 0; if (lab[0] > 100) lab[0] = 100; if (lab[1] < -128) lab[1] = -128; if (lab[1] > 128) lab[1] = 128; if (lab[2] < -128) lab[2] = -128; if (lab[2] > 128) lab[2] = 128; // now apply the tweak if it exist if (tweak != NULL) tweak->eval(lab,lab,1); return MCO_SUCCESS; }
//normalized xyz to LAB in place void nxyztoLabinplace(double *xyz, long num) { double LAB[3]; for(long i = 0; i < num; i++){ nxyztoLab(xyz, LAB); *xyz++ = LAB[0]; *xyz++ = LAB[1]; *xyz++ = LAB[2]; } }
//added by James on 1/22/96 void luvtolab(double *luv, double *lab) { /* t = (16+luv[0]); t = t*t*t*0.000064; xyz[1] = t/100; // X xyz[0] = (9*luv[1]*t/(4*luv[2]))/96.43; // Z xyz[2] = ((12-(3*luv[1])-(20*luv[2]))*t/(4*luv[2]))/82.51; nxyztoLab(xyz,lab); */ double t; double xyz[3]; double e, f, c, d; double X, Y, Z; double bot; t = (16.0+luv[0])/116.0; t = t*t*t; xyz[1] = t; Y = t*100; c = luv[1]; d = luv[2]; bot = 12*d; X = 27*c/bot; Z = -(9*c - 36 + 60*d)/bot; xyz[0] = X*Y/96.442; xyz[2] = Z*Y/82.521; nxyztoLab(xyz,lab); }