// use splines to linearize tables // the polaroid version (data is in density format) McoStatus LinearData::setUp(double *data,double *vals,int array_mult,int nc,int *s) { int i,j; double t,t2; McoStatus state = MCO_SUCCESS; double z,Ts,Tt; CleanUp(); numc = nc; sizes = new int32[numc]; curves = new double*[numc]; values = new double*[numc]; y2 = new double*[numc]; y3 = new double*[numc]; if ((sizes == 0L) || (curves == 0L) || (values == 0L) || (y2 == 0L) || (y3 == 0L)) return MCO_MEM_ALLOC_ERROR; for (i=0; i<numc; i++) { sizes[i] = s[i]; curves[i] = new double[sizes[i]]; values[i] = new double[sizes[i]]; y2[i] = new double[sizes[i]]; y3[i] = new double[sizes[i]]; if ((sizes[i] == 0L) || (curves[i] == 0L) || (values[i] == 0L) || (y2[i] == 0L) || (y3[i] == 0L)) return MCO_MEM_ALLOC_ERROR; for (j=0; j<sizes[i]; j++) { values[i][j] = vals[i*array_mult+j]; } } // build the curves for (i=0; i<numc; i++) { for (j=0; j<sizes[i]; j++) { curves[i][j] = data[i*array_mult+j]; } // remve any reversals from the data state = cleanReversals(curves[i],values[i],&sizes[i]); if (state != MCO_SUCCESS) goto bail; // use %dot z = curves[i][0]; Ts = pow(10,(-curves[i][sizes[i]-1]+z)); for (j=0; j<sizes[i]; j++) { Tt = pow(10,(-curves[i][j]+z)); curves[i][j] = 100*(1-Tt)/(1-Ts); } // set up the splines spline_0(values[i],curves[i],sizes[i],1.0e30,1.0e30,y2[i]); // set up the splines spline_0(curves[i],values[i],sizes[i],1.0e30,1.0e30,y3[i]); } bail: return state; }
McoStatus CalCurves::buildLinearCurve(int monaco) { int i,j; int32 *inverscurve; double *linearDot; double *linearX2; long linnum[4]; double *linearp; double *y2; double x,out,out2; double max; double *orig; unsigned short *s_out; unsigned char *c_out; double *y2_2 = 0L,*linear2X = 0L; double *curve18; for (i=0; i<numlinear; i++) if (numLinearHand[i] < 2) return MCO_SUCCESS; // build the 18% curve curve18 = new double[1<<numBits]; if (!curve18) return MCO_MEM_ALLOC_ERROR; _build18PerCurve(curve18); _convertPercentDot(curve18,curve18,1<<numBits); // convert to %dot linearDot = new double [numlinear*MAX_LINEAR_HAND]; linearX2 = new double [numlinear*MAX_LINEAR_HAND]; for (i=0; i<numlinear; i++) { linearp = &linearY[i*MAX_LINEAR_HAND]; for (j=0; j<numLinearHand[i]; j++) { linearDot[j+i*MAX_LINEAR_HAND] = linearp[j]; linearX2[j+i*MAX_LINEAR_HAND]= linearX[i*MAX_LINEAR_HAND+j]; } linnum[i] = numLinearHand[i]; // remove reversals cleanReversals(&linearDot[i*MAX_LINEAR_HAND],&linearX2[i*MAX_LINEAR_HAND],&linnum[i]); max = linearp[linnum[i]-1]; if (!monaco) _convertPercentDot(&linearDot[i*MAX_LINEAR_HAND],&linearDot[i*MAX_LINEAR_HAND],linnum[i]); else _convertPercent(&linearDot[i*MAX_LINEAR_HAND],&linearDot[i*MAX_LINEAR_HAND],linnum[i]); } // build the inverse curve y2 = new double [MAX_LINEAR_HAND]; if (!monaco) { if (numBits == 8) { for (i=0; i<numlinear; i++) { sinterp_init(&linearDot[i*MAX_LINEAR_HAND],&linearX2[i*MAX_LINEAR_HAND],linnum[i],1e30,1e30,y2); orig = linear[i]; c_out = (unsigned char*)A2B0->output_tables[i]; for (j=0; j<sizelinear; j++) { x = curve18[(long)(orig[j]+0.5)]; sinterp_eval(&linearDot[i*MAX_LINEAR_HAND],&linearX2[i*MAX_LINEAR_HAND],y2,linnum[i],x,&out); c_out[j] = ((1<<numBits)-1)*out*0.01; } } } else if (numBits == 16) { if (A2B0->output_entries < 4096) { A2B0->output_entries = 4096; for (i=0; i<numlinear; i++) { if (A2B0->output_tables[i]) delete A2B0->output_tables[i]; A2B0->output_tables[i] = (char*)new short[4096]; } } linear2X = new double[sizelinear]; y2_2 = new double[sizelinear]; for (i=0; i<sizelinear; i++) linear2X[i] = 100*(double)i/((double)sizelinear-1.0); for (i=0; i<numlinear; i++) { sinterp_init(&linearDot[i*MAX_LINEAR_HAND],&linearX2[i*MAX_LINEAR_HAND],linnum[i],1e30,1e30,y2); sinterp_init(linear2X,linear[i],sizelinear,1e30,1e30,y2_2); orig = linear[i]; s_out = (unsigned short*)A2B0->output_tables[i]; for (j=0; j<A2B0->output_entries; j++) { x = 100.0*(double)j/((double)A2B0->output_entries-1.0); sinterp_eval(linear2X,linear[i],y2_2,sizelinear,x,&out); out = curve18[(long)out]; sinterp_eval(&linearDot[i*MAX_LINEAR_HAND],&linearX2[i*MAX_LINEAR_HAND],y2,linnum[i],out,&out2); s_out[j] = ((1<<numBits)-1)*out2*0.01; } } delete linear2X; delete y2_2; } } else // build the curve without using the backup because this is a monaco file { if (numBits == 8) { for (i=0; i<numlinear; i++) { sinterp_init(&linearDot[i*MAX_LINEAR_HAND],&linearX2[i*MAX_LINEAR_HAND],linnum[i],1e30,1e30,y2); c_out = (unsigned char*)A2B0->output_tables[i]; for (j=0; j<sizelinear; j++) { x = 100*(double)j/(sizelinear-1); sinterp_eval(&linearDot[i*MAX_LINEAR_HAND],&linearX2[i*MAX_LINEAR_HAND],y2,linnum[i],x,&out); c_out[j] = ((1<<numBits)-1)*out*0.01; } } } else if (numBits == 16) { if (A2B0->output_entries < 4096) { A2B0->output_entries = 4096; for (i=0; i<numlinear; i++) { if (A2B0->output_tables[i]) delete A2B0->output_tables[i]; A2B0->output_tables[i] = (char*)new short[4096]; } } for (i=0; i<numlinear; i++) { sinterp_init(&linearDot[i*MAX_LINEAR_HAND],&linearX2[i*MAX_LINEAR_HAND],linnum[i],1e30,1e30,y2); s_out = (unsigned short*)A2B0->output_tables[i]; for (j=0; j<A2B0->output_entries; j++) { x = 100*(double)j/(A2B0->output_entries-1); sinterp_eval(&linearDot[i*MAX_LINEAR_HAND],&linearX2[i*MAX_LINEAR_HAND],y2,linnum[i],x,&out); s_out[j] = ((1<<numBits)-1)*out*0.01; } } } } delete y2; delete linearDot; delete linearX2; delete curve18; return MCO_SUCCESS; }
// use splines to linearize tables McoStatus LinearData::setUp(double *data,double *vals, double *paper,int nc,int s) { int i,j; double t,t2; McoStatus state = MCO_SUCCESS; int LAB = 0; double z,Ts,Tt; CleanUp(); numc = nc; sizes = new int32[numc]; curves = new double*[numc]; values = new double*[numc]; y2 = new double*[numc]; y3 = new double*[numc]; if ((sizes == 0L) || (curves == 0L) || (values == 0L) || (y2 == 0L) || (y3 == 0L)) return MCO_MEM_ALLOC_ERROR; for (i=0; i<numc; i++) { sizes[i] = s; curves[i] = new double[s]; values[i] = new double[s]; y2[i] = new double[s]; y3[i] = new double[s]; if ((sizes[i] == 0L) || (curves[i] == 0L) || (values[i] == 0L) || (y2[i] == 0L) || (y3[i] == 0L)) return MCO_MEM_ALLOC_ERROR; for (j=0; j<s; j++) { values[i][j] = vals[j]; } } // determine if data is in density format // must have paper density subtracted for (i=0; i<numc; i++) { for (j=0; j<sizes[i]-1; j++) { if (fabs(data[i*(s-1)*3+j*3+1]) > 0.01) LAB = 1; if (fabs(data[i*(s-1)*3+j*3+2]) > 0.01) LAB = 1; } } // build the curves for (i=0; i<numc; i++) { curves[i][0] = 0; // 0% for (j=0; j<sizes[i]-1; j++) { if (LAB) { t = data[i*(s-1)*3+j*3]-paper[0]; t2 = t*t; t = data[i*(s-1)*3+j*3+1]-paper[1]; t2 += t*t; t = data[i*(s-1)*3+j*3+2]-paper[2]; t2 += t*t; curves[i][j+1] = sqrt(t2); } else curves[i][j+1] = data[i*(s-1)*3+j*3]; } // remve any reversals from the data state = cleanReversals(curves[i],values[i],&sizes[i]); if (state != MCO_SUCCESS) goto bail; // scale from 0 to 100 if lab if (LAB) for (j=0; j<sizes[i]; j++) curves[i][j] = 100*curves[i][j]/curves[i][sizes[i]-1]; else { z = curves[i][0]; Ts = pow(10,(-curves[i][sizes[i]-1]+z)); for (j=0; j<sizes[i]; j++) { Tt = pow(10,(-curves[i][j]+z)); curves[i][j] = 100*(1-Tt)/(1-Ts); } } // set up the splines spline_0(values[i],curves[i],sizes[i],1.0e30,1.0e30,y2[i]); // set up the splines spline_0(curves[i],values[i],sizes[i],1.0e30,1.0e30,y3[i]); } bail: return state; }