Пример #1
0
// 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;
}
Пример #2
0
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;
}
Пример #3
0
// 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;
}