From 92bbdb2e55001f9e902409297472946f1c4a3ccc Mon Sep 17 00:00:00 2001 From: Oliver Duis Date: Sun, 12 Jun 2011 14:28:43 +0200 Subject: [PATCH] Cleaned up missing floating point usage in transform functions --- rtengine/cubint.cc | 41 ++++++++++++++++--------------- rtengine/cubintch.cc | 34 +++++++++++++------------- rtengine/iptransform.cc | 53 ++++++++++++++--------------------------- 3 files changed, 55 insertions(+), 73 deletions(-) diff --git a/rtengine/cubint.cc b/rtengine/cubint.cc index 797667f7c..510cca2af 100644 --- a/rtengine/cubint.cc +++ b/rtengine/cubint.cc @@ -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); diff --git a/rtengine/cubintch.cc b/rtengine/cubintch.cc index c7b6f312d..cf41d3db8 100644 --- a/rtengine/cubintch.cc +++ b/rtengine/cubintch.cc @@ -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; } diff --git a/rtengine/iptransform.cc b/rtengine/iptransform.cc index 52db66aef..2656a8390 100644 --- a/rtengine/iptransform.cc +++ b/rtengine/iptransform.cc @@ -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)(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 (); }