Cleaned up missing floating point usage in transform functions
This commit is contained in:
@@ -23,13 +23,14 @@ inline void cubint (Imagefloat* src, int xs, int ys, double Dx, double Dy, float
|
||||
|
||||
register double w[4];
|
||||
|
||||
{ register double t1, t2;
|
||||
t1 = -A*(Dx-1.0)*Dx;
|
||||
t2 = (3.0-2.0*Dx)*Dx*Dx;
|
||||
w[3] = t1*Dx;
|
||||
w[2] = t1*(Dx-1.0) + t2;
|
||||
w[1] = -t1*Dx + 1.0 - t2;
|
||||
w[0] = -t1*(Dx-1.0);
|
||||
{
|
||||
register double t1, t2;
|
||||
t1 = -A*(Dx-1.0)*Dx;
|
||||
t2 = (3.0-2.0*Dx)*Dx*Dx;
|
||||
w[3] = t1*Dx;
|
||||
w[2] = t1*(Dx-1.0) + t2;
|
||||
w[1] = -t1*Dx + 1.0 - t2;
|
||||
w[0] = -t1*(Dx-1.0);
|
||||
}
|
||||
|
||||
register double rd, gd, bd;
|
||||
@@ -46,13 +47,15 @@ inline void cubint (Imagefloat* src, int xs, int ys, double Dx, double Dy, float
|
||||
}
|
||||
|
||||
|
||||
{ register double t1, t2;
|
||||
t1 = -A*(Dy-1.0)*Dy;
|
||||
t2 = (3.0-2.0*Dy)*Dy*Dy;
|
||||
w[3] = t1*Dy;
|
||||
w[2] = t1*(Dy-1.0) + t2;
|
||||
w[1] = -t1*Dy + 1.0 - t2;
|
||||
w[0] = -t1*(Dy-1.0);
|
||||
{
|
||||
register double t1, t2;
|
||||
|
||||
t1 = -A*(Dy-1.0)*Dy;
|
||||
t2 = (3.0-2.0*Dy)*Dy*Dy;
|
||||
w[3] = t1*Dy;
|
||||
w[2] = t1*(Dy-1.0) + t2;
|
||||
w[1] = -t1*Dy + 1.0 - t2;
|
||||
w[0] = -t1*(Dy-1.0);
|
||||
}
|
||||
|
||||
rd = gd = bd = 0.0;
|
||||
@@ -62,13 +65,9 @@ inline void cubint (Imagefloat* src, int xs, int ys, double Dx, double Dy, float
|
||||
bd += yb[i] * w[i];
|
||||
}
|
||||
|
||||
rd*=mul;
|
||||
gd*=mul;
|
||||
bd*=mul;
|
||||
|
||||
*r = (int)CLIP(rd);
|
||||
*g = (int)CLIP(gd);
|
||||
*b = (int)CLIP(bd);
|
||||
*r = rd * mul;
|
||||
*g = gd * mul;
|
||||
*b = bd * mul;
|
||||
|
||||
// if (xs==100 && ys==100)
|
||||
// printf ("r=%g, g=%g\n", *r, *g);
|
||||
|
@@ -21,13 +21,14 @@ inline void cubintch (float** src, int xs, int ys, double Dx, double Dy, float *
|
||||
|
||||
register double w[4];
|
||||
|
||||
{ register double t1, t2;
|
||||
t1 = -A*(Dx-1.0)*Dx;
|
||||
t2 = (3.0-2.0*Dx)*Dx*Dx;
|
||||
w[3] = t1*Dx;
|
||||
w[2] = t1*(Dx-1.0) + t2;
|
||||
w[1] = -t1*Dx + 1.0 - t2;
|
||||
w[0] = -t1*(Dx-1.0);
|
||||
{
|
||||
register double t1, t2;
|
||||
t1 = -A*(Dx-1.0)*Dx;
|
||||
t2 = (3.0-2.0*Dx)*Dx*Dx;
|
||||
w[3] = t1*Dx;
|
||||
w[2] = t1*(Dx-1.0) + t2;
|
||||
w[1] = -t1*Dx + 1.0 - t2;
|
||||
w[0] = -t1*(Dx-1.0);
|
||||
}
|
||||
|
||||
register double rd;
|
||||
@@ -42,20 +43,19 @@ inline void cubintch (float** src, int xs, int ys, double Dx, double Dy, float *
|
||||
}
|
||||
|
||||
|
||||
{ register double t1, t2;
|
||||
t1 = -A*(Dy-1.0)*Dy;
|
||||
t2 = (3.0-2.0*Dy)*Dy*Dy;
|
||||
w[3] = t1*Dy;
|
||||
w[2] = t1*(Dy-1.0) + t2;
|
||||
w[1] = -t1*Dy + 1.0 - t2;
|
||||
w[0] = -t1*(Dy-1.0);
|
||||
{
|
||||
register double t1, t2;
|
||||
t1 = -A*(Dy-1.0)*Dy;
|
||||
t2 = (3.0-2.0*Dy)*Dy*Dy;
|
||||
w[3] = t1*Dy;
|
||||
w[2] = t1*(Dy-1.0) + t2;
|
||||
w[1] = -t1*Dy + 1.0 - t2;
|
||||
w[0] = -t1*(Dy-1.0);
|
||||
}
|
||||
|
||||
rd = 0.0;
|
||||
for (int i=0; i<4; i++)
|
||||
rd += yr[i] * w[i];
|
||||
|
||||
rd*=mul;
|
||||
|
||||
*r = (int)CLIP(rd);
|
||||
*r = rd * mul;
|
||||
}
|
||||
|
@@ -28,15 +28,12 @@ namespace rtengine {
|
||||
#undef CMAXVAL
|
||||
#undef MAX
|
||||
#undef MIN
|
||||
#undef CLIP
|
||||
#undef CLIPTO
|
||||
#undef CLIPTOC
|
||||
#undef SQR
|
||||
|
||||
#define CMAXVAL 0xffff
|
||||
#define MAX(a,b) ((a)<(b)?(b):(a))
|
||||
#define MIN(a,b) ((a)>(b)?(b):(a))
|
||||
#define CLIP(a) ((a)>0?((a)<CMAXVAL?(a):CMAXVAL):0)
|
||||
#define CLIPTO(a,b,c) ((a)>(b)?((a)<(c)?(a):(c)):(b))
|
||||
#define CLIPTOC(a,b,c,d) ((a)>=(b)?((a)<=(c)?(a):(d=true,(c))):(d=true,(b)))
|
||||
#define RT_PI 3.141592653589
|
||||
@@ -236,12 +233,9 @@ void ImProcFunctions::vignetting (Imagefloat* original, Imagefloat* transformed,
|
||||
double vig_x_d = (double) (x + cx) - vig_w2 ;
|
||||
double r = sqrt(vig_x_d*vig_x_d + vig_y_d*vig_y_d);
|
||||
double vign = v + mul * tanh (b*(maxRadius-r) / maxRadius);
|
||||
val = original->r[y][x] / vign;
|
||||
transformed->r[y][x] = CLIP(val);
|
||||
val = original->g[y][x] / vign;
|
||||
transformed->g[y][x] = CLIP(val);
|
||||
val = original->b[y][x] / vign;
|
||||
transformed->b[y][x] = CLIP(val);
|
||||
transformed->r[y][x] = original->r[y][x] / vign;
|
||||
transformed->g[y][x] = original->g[y][x] / vign;
|
||||
transformed->b[y][x] = original->b[y][x] / vign;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -336,12 +330,9 @@ void ImProcFunctions::transformNonSep (Imagefloat* original, Imagefloat* transfo
|
||||
int y2 = CLIPTO(yc+1, 0, original->height-1);
|
||||
int x1 = CLIPTO(xc, 0, original->width-1);
|
||||
int x2 = CLIPTO(xc+1, 0, original->width-1);
|
||||
int r = vignmul*(original->r[y1][x1]*(1.0-Dx)*(1.0-Dy) + original->r[y1][x2]*Dx*(1.0-Dy) + original->r[y2][x1]*(1.0-Dx)*Dy + original->r[y2][x2]*Dx*Dy);
|
||||
int g = vignmul*(original->g[y1][x1]*(1.0-Dx)*(1.0-Dy) + original->g[y1][x2]*Dx*(1.0-Dy) + original->g[y2][x1]*(1.0-Dx)*Dy + original->g[y2][x2]*Dx*Dy);
|
||||
int b = vignmul*(original->b[y1][x1]*(1.0-Dx)*(1.0-Dy) + original->b[y1][x2]*Dx*(1.0-Dy) + original->b[y2][x1]*(1.0-Dx)*Dy + original->b[y2][x2]*Dx*Dy);
|
||||
transformed->r[y][x] = CLIP(r);
|
||||
transformed->g[y][x] = CLIP(g);
|
||||
transformed->b[y][x] = CLIP(b);
|
||||
transformed->r[y][x] = vignmul*(original->r[y1][x1]*(1.0-Dx)*(1.0-Dy) + original->r[y1][x2]*Dx*(1.0-Dy) + original->r[y2][x1]*(1.0-Dx)*Dy + original->r[y2][x2]*Dx*Dy);
|
||||
transformed->g[y][x] = vignmul*(original->g[y1][x1]*(1.0-Dx)*(1.0-Dy) + original->g[y1][x2]*Dx*(1.0-Dy) + original->g[y2][x1]*(1.0-Dx)*Dy + original->g[y2][x2]*Dx*Dy);
|
||||
transformed->b[y][x] = vignmul*(original->b[y1][x1]*(1.0-Dx)*(1.0-Dy) + original->b[y1][x2]*Dx*(1.0-Dy) + original->b[y2][x1]*(1.0-Dx)*Dy + original->b[y2][x2]*Dx*Dy);
|
||||
}
|
||||
}
|
||||
else {
|
||||
@@ -464,8 +455,7 @@ void ImProcFunctions::transformSep (Imagefloat* original, Imagefloat* transforme
|
||||
int y2 = CLIPTO(yc+1, 0, original->height-1);
|
||||
int x1 = CLIPTO(xc, 0, original->width-1);
|
||||
int x2 = CLIPTO(xc+1, 0, original->width-1);
|
||||
int val = vignmul*(chorig[c][y1][x1]*(1.0-Dx)*(1.0-Dy) + chorig[c][y1][x2]*Dx*(1.0-Dy) + chorig[c][y2][x1]*(1.0-Dx)*Dy + chorig[c][y2][x2]*Dx*Dy);
|
||||
chtrans[c][y][x] = CLIP(val);
|
||||
chtrans[c][y][x] = vignmul*(chorig[c][y1][x1]*(1.0-Dx)*(1.0-Dy) + chorig[c][y1][x2]*Dx*(1.0-Dy) + chorig[c][y2][x1]*(1.0-Dx)*Dy + chorig[c][y2][x2]*Dx*Dy);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -560,24 +550,18 @@ void ImProcFunctions::simpltransform (Imagefloat* original, Imagefloat* transfor
|
||||
vignmul /= (v + mul * tanh (b*(maxRadius-s*r2) / maxRadius));
|
||||
|
||||
if (yc < original->height-1 && xc < original->width-1) { // all interpolation pixels inside image
|
||||
int r = vignmul*(original->r[yc][xc]*(1.0-Dx)*(1.0-Dy) + original->r[yc][xc+1]*Dx*(1.0-Dy) + original->r[yc+1][xc]*(1.0-Dx)*Dy + original->r[yc+1][xc+1]*Dx*Dy);
|
||||
int g = vignmul*(original->g[yc][xc]*(1.0-Dx)*(1.0-Dy) + original->g[yc][xc+1]*Dx*(1.0-Dy) + original->g[yc+1][xc]*(1.0-Dx)*Dy + original->g[yc+1][xc+1]*Dx*Dy);
|
||||
int b = vignmul*(original->b[yc][xc]*(1.0-Dx)*(1.0-Dy) + original->b[yc][xc+1]*Dx*(1.0-Dy) + original->b[yc+1][xc]*(1.0-Dx)*Dy + original->b[yc+1][xc+1]*Dx*Dy);
|
||||
transformed->r[y][x] = CLIP(r);
|
||||
transformed->g[y][x] = CLIP(g);
|
||||
transformed->b[y][x] = CLIP(b);
|
||||
transformed->r[y][x] = vignmul*(original->r[yc][xc]*(1.0-Dx)*(1.0-Dy) + original->r[yc][xc+1]*Dx*(1.0-Dy) + original->r[yc+1][xc]*(1.0-Dx)*Dy + original->r[yc+1][xc+1]*Dx*Dy);
|
||||
transformed->g[y][x] = vignmul*(original->g[yc][xc]*(1.0-Dx)*(1.0-Dy) + original->g[yc][xc+1]*Dx*(1.0-Dy) + original->g[yc+1][xc]*(1.0-Dx)*Dy + original->g[yc+1][xc+1]*Dx*Dy);
|
||||
transformed->b[y][x] = vignmul*(original->b[yc][xc]*(1.0-Dx)*(1.0-Dy) + original->b[yc][xc+1]*Dx*(1.0-Dy) + original->b[yc+1][xc]*(1.0-Dx)*Dy + original->b[yc+1][xc+1]*Dx*Dy);
|
||||
}
|
||||
else { // edge pixels
|
||||
int y1 = CLIPTO(yc, 0, original->height-1);
|
||||
int y2 = CLIPTO(yc+1, 0, original->height-1);
|
||||
int x1 = CLIPTO(xc, 0, original->width-1);
|
||||
int x2 = CLIPTO(xc+1, 0, original->width-1);
|
||||
int r = vignmul*(original->r[y1][x1]*(1.0-Dx)*(1.0-Dy) + original->r[y1][x2]*Dx*(1.0-Dy) + original->r[y2][x1]*(1.0-Dx)*Dy + original->r[y2][x2]*Dx*Dy);
|
||||
int g = vignmul*(original->g[y1][x1]*(1.0-Dx)*(1.0-Dy) + original->g[y1][x2]*Dx*(1.0-Dy) + original->g[y2][x1]*(1.0-Dx)*Dy + original->g[y2][x2]*Dx*Dy);
|
||||
int b = vignmul*(original->b[y1][x1]*(1.0-Dx)*(1.0-Dy) + original->b[y1][x2]*Dx*(1.0-Dy) + original->b[y2][x1]*(1.0-Dx)*Dy + original->b[y2][x2]*Dx*Dy);
|
||||
transformed->r[y][x] = CLIP(r);
|
||||
transformed->g[y][x] = CLIP(g);
|
||||
transformed->b[y][x] = CLIP(b);
|
||||
transformed->r[y][x] = vignmul*(original->r[y1][x1]*(1.0-Dx)*(1.0-Dy) + original->r[y1][x2]*Dx*(1.0-Dy) + original->r[y2][x1]*(1.0-Dx)*Dy + original->r[y2][x2]*Dx*Dy);
|
||||
transformed->g[y][x] = vignmul*(original->g[y1][x1]*(1.0-Dx)*(1.0-Dy) + original->g[y1][x2]*Dx*(1.0-Dy) + original->g[y2][x1]*(1.0-Dx)*Dy + original->g[y2][x2]*Dx*Dy);
|
||||
transformed->b[y][x] = vignmul*(original->b[y1][x1]*(1.0-Dx)*(1.0-Dy) + original->b[y1][x2]*Dx*(1.0-Dy) + original->b[y2][x1]*(1.0-Dx)*Dy + original->b[y2][x2]*Dx*Dy);
|
||||
}
|
||||
}
|
||||
else {
|
||||
@@ -609,27 +593,26 @@ double ImProcFunctions::getTransformAutoFill (int oW, int oH) {
|
||||
}
|
||||
|
||||
bool ImProcFunctions::needsCA () {
|
||||
|
||||
return fabs (params->cacorrection.red) > 1e-15 || fabs (params->cacorrection.blue) > 1e-15;
|
||||
}
|
||||
bool ImProcFunctions::needsDistortion () {
|
||||
|
||||
bool ImProcFunctions::needsDistortion () {
|
||||
return fabs (params->distortion.amount) > 1e-15;
|
||||
}
|
||||
bool ImProcFunctions::needsRotation () {
|
||||
|
||||
bool ImProcFunctions::needsRotation () {
|
||||
return fabs (params->rotate.degree) > 1e-15;
|
||||
}
|
||||
bool ImProcFunctions::needsPerspective () {
|
||||
|
||||
bool ImProcFunctions::needsPerspective () {
|
||||
return params->perspective.horizontal || params->perspective.vertical;
|
||||
}
|
||||
bool ImProcFunctions::needsVignetting () {
|
||||
|
||||
bool ImProcFunctions::needsVignetting () {
|
||||
return params->vignetting.amount;
|
||||
}
|
||||
bool ImProcFunctions::needsTransform () {
|
||||
|
||||
bool ImProcFunctions::needsTransform () {
|
||||
return needsCA () || needsDistortion () || needsRotation () || needsPerspective () || needsVignetting ();
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user