From 147d6b36f6b4b49570496825b120108a5b5d7c53 Mon Sep 17 00:00:00 2001 From: Pavel Shlyak Date: Wed, 21 Aug 2019 04:22:04 +0300 Subject: [PATCH 001/208] dcraw.cc: replace memcpy with memmove Memcpy does not support overlapping. It can cause problems in specific situations. --- rtengine/dcraw.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index a4450a69a..9606c1c71 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -4216,8 +4216,8 @@ void CLASS foveon_interpolate() foveon_avg (image[row*width]+c, dscr[1], cfilt) * 3 - ddft[0][c][0] ) / 4 - ddft[0][c][1]; } - memcpy (black, black+8, sizeof *black*8); - memcpy (black+height-11, black+height-22, 11*sizeof *black); + memmove (black, black+8, sizeof *black*8); + memmove (black+height-11, black+height-22, 11*sizeof *black); memcpy (last, black, sizeof last); for (row=1; row < height-1; row++) { From 7c616453940fea53ea3872bb78236280ccc577ce Mon Sep 17 00:00:00 2001 From: Pavel Shlyak Date: Wed, 21 Aug 2019 04:30:59 +0300 Subject: [PATCH 002/208] improcfun.cc: cleanup The pointers allocated with new can never be null. Exception will be thrown in case of memory allocation error. --- rtengine/improcfun.cc | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 23dc4b1ba..c3272c4d1 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -4247,11 +4247,9 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW if (params->labCurve.chromaticity > -100) { chCurve = new FlatCurve (params->labCurve.chcurve); - if (!chCurve || chCurve->isIdentity()) { - if (chCurve) { - delete chCurve; - chCurve = nullptr; - } + if (chCurve->isIdentity()) { + delete chCurve; + chCurve = nullptr; }//do not use "Munsell" if Chcurve not used else { chutili = true; @@ -4264,11 +4262,9 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW if (params->labCurve.chromaticity > -100) { lhCurve = new FlatCurve (params->labCurve.lhcurve); - if (!lhCurve || lhCurve->isIdentity()) { - if (lhCurve) { - delete lhCurve; - lhCurve = nullptr; - } + if (lhCurve->isIdentity()) { + delete lhCurve; + lhCurve = nullptr; }//do not use "Munsell" if Chcurve not used else { lhutili = true; @@ -4281,11 +4277,9 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW if (params->labCurve.chromaticity > -100) { hhCurve = new FlatCurve (params->labCurve.hhcurve); - if (!hhCurve || hhCurve->isIdentity()) { - if (hhCurve) { - delete hhCurve; - hhCurve = nullptr; - } + if (hhCurve->isIdentity()) { + delete hhCurve; + hhCurve = nullptr; }//do not use "Munsell" if Chcurve not used else { hhutili = true; From 9a624ca01e36208a8727f200554ed088f9f618e2 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 27 Aug 2019 13:25:34 +0200 Subject: [PATCH 003/208] Speedup for transform --- rtengine/improcfun.h | 110 ------------------------------------- rtengine/iptransform.cc | 119 +++++++++++++++++++++++++++++----------- 2 files changed, 86 insertions(+), 143 deletions(-) diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 987a460d7..338df2416 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -77,116 +77,6 @@ class ImProcFunctions bool needsLensfun(); // static cmsUInt8Number* Mempro = NULL; - inline void interpolateTransformCubic(Imagefloat* src, int xs, int ys, double Dx, double Dy, float *r, float *g, float *b, double mul) - { - const double A = -0.85; - - double w[4]; - - { - 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); - } - - double rd, gd, bd; - double yr[4] = {0.0}, yg[4] = {0.0}, yb[4] = {0.0}; - - for (int k = ys, kx = 0; k < ys + 4; k++, kx++) { - rd = gd = bd = 0.0; - - for (int i = xs, ix = 0; i < xs + 4; i++, ix++) { - rd += src->r(k, i) * w[ix]; - gd += src->g(k, i) * w[ix]; - bd += src->b(k, i) * w[ix]; - } - - yr[kx] = rd; - yg[kx] = gd; - yb[kx] = bd; - } - - - { - 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; - - for (int i = 0; i < 4; i++) { - rd += yr[i] * w[i]; - gd += yg[i] * w[i]; - bd += yb[i] * w[i]; - } - - *r = rd * mul; - *g = gd * mul; - *b = bd * mul; - - // if (xs==100 && ys==100) - // printf ("r=%g, g=%g\n", *r, *g); - } - - inline void interpolateTransformChannelsCubic(float** src, int xs, int ys, double Dx, double Dy, float *r, double mul) - { - const double A = -0.85; - - double w[4]; - - { - 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); - } - - double rd; - double yr[4] = {0.0}; - - for (int k = ys, kx = 0; k < ys + 4; k++, kx++) { - rd = 0.0; - - for (int i = xs, ix = 0; i < xs + 4; i++, ix++) { - rd += src[k][i] * w[ix]; - } - - yr[kx] = rd; - } - - - { - 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]; - } - - *r = rd * mul; - } - public: enum class Median { diff --git a/rtengine/iptransform.cc b/rtengine/iptransform.cc index 5b1e7c458..1d7ac9d56 100644 --- a/rtengine/iptransform.cc +++ b/rtengine/iptransform.cc @@ -26,7 +26,8 @@ #include "rt_math.h" #include "sleef.c" #include "rtlensfun.h" - +#define BENCHMARK +#include "StopWatch.h" using namespace std; @@ -87,6 +88,66 @@ float normn (float a, float b, int n) } } +inline void interpolateTransformCubic(rtengine::Imagefloat* src, int xs, int ys, float Dx, float Dy, float &r, float &g, float &b, float mul) +{ + constexpr float A = -0.85f; + + // Vertical + const float t1Vert = A * (Dy - Dy * Dy); + const float t2Vert = (3.f - 2.f * Dy) * Dy * Dy; + const float w3Vert = t1Vert * Dy; + const float w2Vert = t1Vert * Dy - t1Vert + t2Vert; + const float w1Vert = 1.f - (t1Vert * Dy) - t2Vert; + const float w0Vert = t1Vert - (t1Vert * Dy); + + float rv[4], gv[4], bv[4]; + for (int i = 0; i < 4; ++i) { + rv[i] = w0Vert * src->r(ys, xs + i) + w1Vert * src->r(ys + 1, xs + i) + w2Vert * src->r(ys + 2, xs + i) + w3Vert * src->r(ys + 3, xs + i); + gv[i] = w0Vert * src->g(ys, xs + i) + w1Vert * src->g(ys + 1, xs + i) + w2Vert * src->g(ys + 2, xs + i) + w3Vert * src->g(ys + 3, xs + i); + bv[i] = w0Vert * src->b(ys, xs + i) + w1Vert * src->b(ys + 1, xs + i) + w2Vert * src->b(ys + 2, xs + i) + w3Vert * src->b(ys + 3, xs + i); + } + + // Horizontal + const float t1Hor = A * (Dx - Dx * Dx); + const float t2Hor = (3.f - 2.f * Dx) * Dx * Dx; + const float w3Hor = t1Hor * Dx; + const float w2Hor = t1Hor * Dx - t1Hor + t2Hor; + const float w1Hor = 1.f - (t1Hor * Dx) - t2Hor; + const float w0Hor = t1Hor - (t1Hor * Dx); + + r = mul * (rv[0] * w0Hor + rv[1] * w1Hor + rv[2] * w2Hor + rv[3] * w3Hor); + g = mul * (gv[0] * w0Hor + gv[1] * w1Hor + gv[2] * w2Hor + gv[3] * w3Hor); + b = mul * (bv[0] * w0Hor + bv[1] * w1Hor + bv[2] * w2Hor + bv[3] * w3Hor); +} + +inline void interpolateTransformChannelsCubic(const float* const * src, int xs, int ys, float Dx, float Dy, float &dest, float mul) +{ + constexpr float A = -0.85f; + + // Vertical + const float t1Vert = A * (Dy - Dy * Dy); + const float t2Vert = (3.f - 2.f * Dy) * Dy * Dy; + const float w3Vert = t1Vert * Dy; + const float w2Vert = t1Vert * Dy - t1Vert + t2Vert; + const float w1Vert = 1.f - (t1Vert * Dy) - t2Vert; + const float w0Vert = t1Vert - (t1Vert * Dy); + + float cv[4]; + for (int i = 0; i < 4; ++i) { + cv[i] = w0Vert * src[ys][xs + i] + w1Vert * src[ys + 1][xs + i] + w2Vert * src[ys + 2][xs + i] + w3Vert * src[ys + 3][xs + i]; + } + + // Horizontal + const float t1Hor = A * (Dx - Dx * Dx); + const float t2Hor = (3.f - 2.f * Dx) * Dx * Dx; + const float w3Hor = t1Hor * Dx; + const float w2Hor = t1Hor * Dx - t1Hor + t2Hor; + const float w1Hor = 1.f - (t1Hor * Dx) - t2Hor; + const float w0Hor = t1Hor - (t1Hor * Dx); + + dest = mul * (cv[0] * w0Hor + cv[1] * w1Hor + cv[2] * w2Hor + cv[3] * w3Hor); +} + } @@ -740,17 +801,18 @@ void ImProcFunctions::transformLuminanceOnly (Imagefloat* original, Imagefloat* void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, Imagefloat *transformed, int cx, int cy, int sx, int sy, int oW, int oH, int fW, int fH, const LensCorrection *pLCPMap) { + BENCHFUN // set up stuff, depending on the mode we are - bool enableLCPDist = pLCPMap && params->lensProf.useDist; - bool enableCA = highQuality && needsCA(); - bool enableGradient = needsGradient(); - bool enablePCVignetting = needsPCVignetting(); - bool enableVignetting = needsVignetting(); - bool enablePerspective = needsPerspective(); - bool enableDistortion = needsDistortion(); + const bool enableLCPDist = pLCPMap && params->lensProf.useDist; + const bool enableCA = highQuality && needsCA(); + const bool enableGradient = needsGradient(); + const bool enablePCVignetting = needsPCVignetting(); + const bool enableVignetting = needsVignetting(); + const bool enablePerspective = needsPerspective(); + const bool enableDistortion = needsDistortion(); - double w2 = (double) oW / 2.0 - 0.5; - double h2 = (double) oH / 2.0 - 0.5; + const double w2 = (double) oW / 2.0 - 0.5; + const double h2 = (double) oH / 2.0 - 0.5; double vig_w2, vig_h2, maxRadius, v, b, mul; calcVignettingParams (oW, oH, params->vignetting, vig_w2, vig_h2, maxRadius, v, b, mul); @@ -784,11 +846,11 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I chDist[2] = enableCA ? params->cacorrection.blue : 0.0; // auxiliary variables for distortion correction - double distAmount = params->distortion.amount; + const double distAmount = params->distortion.amount; // auxiliary variables for rotation - double cost = cos (params->rotate.degree * rtengine::RT_PI / 180.0); - double sint = sin (params->rotate.degree * rtengine::RT_PI / 180.0); + const double cost = cos (params->rotate.degree * rtengine::RT_PI / 180.0); + const double sint = sin (params->rotate.degree * rtengine::RT_PI / 180.0); // auxiliary variables for vertical perspective correction double vpdeg = params->perspective.vertical / 100.0 * 45.0; @@ -814,9 +876,10 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I #pragma GCC diagnostic pop #endif // main cycle - bool darkening = (params->vignetting.amount <= 0.0); + const bool darkening = (params->vignetting.amount <= 0.0); + #ifdef _OPENMP - #pragma omp parallel for if (multiThread) + #pragma omp parallel for schedule(dynamic, 16) if(multiThread) #endif for (int y = 0; y < transformed->getHeight(); y++) { @@ -833,13 +896,6 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I x_d += ascale * (cx - w2); // centering x coord & scale y_d += ascale * (cy - h2); // centering y coord & scale - double vig_x_d = 0., vig_y_d = 0.; - - if (enableVignetting) { - vig_x_d = ascale * (x + cx - vig_w2); // centering x coord & scale - vig_y_d = ascale * (y + cy - vig_h2); // centering y coord & scale - } - if (enablePerspective) { // horizontal perspective transformation y_d *= maxRadius / (maxRadius + x_d * hptanpt); @@ -862,14 +918,6 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I s = 1.0 - distAmount + distAmount * r ; } - double r2 = 0.; - - if (enableVignetting) { - double vig_Dx = vig_x_d * cost - vig_y_d * sint; - double vig_Dy = vig_x_d * sint + vig_y_d * cost; - r2 = sqrt (vig_Dx * vig_Dx + vig_Dy * vig_Dy); - } - for (int c = 0; c < (enableCA ? 3 : 1); c++) { double Dx = Dxc * (s + chDist[c]); double Dy = Dyc * (s + chDist[c]); @@ -893,6 +941,11 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I double vignmul = 1.0; if (enableVignetting) { + const double vig_x_d = ascale * (x + cx - vig_w2); // centering x coord & scale + const double vig_y_d = ascale * (y + cy - vig_h2); // centering y coord & scale + const double vig_Dx = vig_x_d * cost - vig_y_d * sint; + const double vig_Dy = vig_x_d * sint + vig_y_d * cost; + const double r2 = sqrt (vig_Dx * vig_Dx + vig_Dy * vig_Dy); if (darkening) { vignmul /= std::max (v + mul * tanh (b * (maxRadius - s * r2) / maxRadius), 0.001); } else { @@ -911,13 +964,13 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I if (yc > 0 && yc < original->getHeight() - 2 && xc > 0 && xc < original->getWidth() - 2) { // all interpolation pixels inside image if (enableCA) { - interpolateTransformChannelsCubic (chOrig[c], xc - 1, yc - 1, Dx, Dy, & (chTrans[c][y][x]), vignmul); + interpolateTransformChannelsCubic (chOrig[c], xc - 1, yc - 1, Dx, Dy, chTrans[c][y][x], vignmul); } else if (!highQuality) { 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 { - interpolateTransformCubic (original, xc - 1, yc - 1, Dx, Dy, & (transformed->r (y, x)), & (transformed->g (y, x)), & (transformed->b (y, x)), vignmul); + interpolateTransformCubic (original, xc - 1, yc - 1, Dx, Dy, transformed->r (y, x), transformed->g (y, x), transformed->b (y, x), vignmul); } } else { // edge pixels @@ -988,7 +1041,7 @@ void ImProcFunctions::transformLCPCAOnly(Imagefloat *original, Imagefloat *trans // multiplier for vignetting correction if (yc > 0 && yc < original->getHeight() - 2 && xc > 0 && xc < original->getWidth() - 2) { // all interpolation pixels inside image - interpolateTransformChannelsCubic (chOrig[c], xc - 1, yc - 1, Dx, Dy, & (chTrans[c][y][x]), 1.0); + interpolateTransformChannelsCubic (chOrig[c], xc - 1, yc - 1, Dx, Dy, chTrans[c][y][x], 1.0); } else { // edge pixels int y1 = LIM (yc, 0, original->getHeight() - 1); From 5a5952dddbbeb5ba901950e43592aea338d22e60 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 27 Aug 2019 13:36:52 +0200 Subject: [PATCH 004/208] added two comments --- rtengine/iptransform.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rtengine/iptransform.cc b/rtengine/iptransform.cc index 1d7ac9d56..9484599d6 100644 --- a/rtengine/iptransform.cc +++ b/rtengine/iptransform.cc @@ -90,6 +90,7 @@ float normn (float a, float b, int n) inline void interpolateTransformCubic(rtengine::Imagefloat* src, int xs, int ys, float Dx, float Dy, float &r, float &g, float &b, float mul) { + // I tried hand written SSE code but gcc vectorizes better constexpr float A = -0.85f; // Vertical @@ -122,6 +123,7 @@ inline void interpolateTransformCubic(rtengine::Imagefloat* src, int xs, int ys, inline void interpolateTransformChannelsCubic(const float* const * src, int xs, int ys, float Dx, float Dy, float &dest, float mul) { + // I tried hand written SSE code but gcc vectorizes better constexpr float A = -0.85f; // Vertical From 4312e682657590ef8c30f4056baa49613bdd16ed Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 27 Aug 2019 19:59:10 +0200 Subject: [PATCH 005/208] SSE code for interpolateTransformCubic and interpolateTransformChannelsCubic, also some cleanups --- rtengine/iptransform.cc | 165 ++++++++++++++++++++++++---------------- 1 file changed, 98 insertions(+), 67 deletions(-) diff --git a/rtengine/iptransform.cc b/rtengine/iptransform.cc index 9484599d6..608fa0337 100644 --- a/rtengine/iptransform.cc +++ b/rtengine/iptransform.cc @@ -88,9 +88,34 @@ float normn (float a, float b, int n) } } +#ifdef __SSE2__ +inline void interpolateTransformCubic(rtengine::Imagefloat* src, int xs, int ys, float Dx, float Dy, float &r, float &g, float &b, float mul) +{ + constexpr float A = -0.85f; + + // Vertical + const float t1Vert = A * (Dy - Dy * Dy); + const float t2Vert = (3.f - 2.f * Dy) * Dy * Dy; + const vfloat w3Vert = F2V(t1Vert * Dy); + const vfloat w2Vert = F2V(t1Vert * Dy - t1Vert + t2Vert); + const vfloat w1Vert = F2V(1.f - (t1Vert * Dy) - t2Vert); + const vfloat w0Vert = F2V(t1Vert - (t1Vert * Dy)); + + const vfloat rv = (w0Vert * LVFU(src->r(ys, xs)) + w1Vert * LVFU(src->r(ys + 1, xs))) + (w2Vert * LVFU(src->r(ys + 2, xs)) + w3Vert * LVFU(src->r(ys + 3, xs))); + const vfloat gv = (w0Vert * LVFU(src->g(ys, xs)) + w1Vert * LVFU(src->g(ys + 1, xs))) + (w2Vert * LVFU(src->g(ys + 2, xs)) + w3Vert * LVFU(src->g(ys + 3, xs))); + const vfloat bv = (w0Vert * LVFU(src->b(ys, xs)) + w1Vert * LVFU(src->b(ys + 1, xs))) + (w2Vert * LVFU(src->b(ys + 2, xs)) + w3Vert * LVFU(src->b(ys + 3, xs))); + + // Horizontal + const float t1Hor = A * (Dx - Dx * Dx); + const float t2Hor = (3.f - 2.f * Dx) * Dx * Dx; + const vfloat weight = _mm_set_ps(t1Hor * Dx, t1Hor * Dx - t1Hor + t2Hor, 1.f - (t1Hor * Dx) - t2Hor, t1Hor - (t1Hor * Dx)) * F2V(mul); + r = vhadd(weight * rv); + g = vhadd(weight * gv); + b = vhadd(weight * bv); +} +#else inline void interpolateTransformCubic(rtengine::Imagefloat* src, int xs, int ys, float Dx, float Dy, float &r, float &g, float &b, float mul) { - // I tried hand written SSE code but gcc vectorizes better constexpr float A = -0.85f; // Vertical @@ -120,10 +145,31 @@ inline void interpolateTransformCubic(rtengine::Imagefloat* src, int xs, int ys, g = mul * (gv[0] * w0Hor + gv[1] * w1Hor + gv[2] * w2Hor + gv[3] * w3Hor); b = mul * (bv[0] * w0Hor + bv[1] * w1Hor + bv[2] * w2Hor + bv[3] * w3Hor); } - +#endif +#ifdef __SSE2__ +inline void interpolateTransformChannelsCubic(const float* const * src, int xs, int ys, float Dx, float Dy, float &dest, float mul) +{ + constexpr float A = -0.85f; + + // Vertical + const float t1Vert = A * (Dy - Dy * Dy); + const float t2Vert = (3.f - 2.f * Dy) * Dy * Dy; + const vfloat w3Vert = F2V(t1Vert * Dy); + const vfloat w2Vert = F2V(t1Vert * Dy - t1Vert + t2Vert); + const vfloat w1Vert = F2V(1.f - (t1Vert * Dy) - t2Vert); + const vfloat w0Vert = F2V(t1Vert - (t1Vert * Dy)); + + const vfloat cv = (w0Vert * LVFU(src[ys][xs]) + w1Vert * LVFU(src[ys + 1][xs])) + (w2Vert * LVFU(src[ys + 2][xs]) + w3Vert * LVFU(src[ys + 3][xs])); + + // Horizontal + const float t1Hor = A * (Dx - Dx * Dx); + const float t2Hor = (3.f - 2.f * Dx) * Dx * Dx; + const vfloat weight = _mm_set_ps(t1Hor * Dx, t1Hor * Dx - t1Hor + t2Hor, 1.f - (t1Hor * Dx) - t2Hor, t1Hor - (t1Hor * Dx)); + dest = mul * vhadd(weight * cv); +} +#else inline void interpolateTransformChannelsCubic(const float* const * src, int xs, int ys, float Dx, float Dy, float &dest, float mul) { - // I tried hand written SSE code but gcc vectorizes better constexpr float A = -0.85f; // Vertical @@ -149,7 +195,7 @@ inline void interpolateTransformChannelsCubic(const float* const * src, int xs, dest = mul * (cv[0] * w0Hor + cv[1] * w1Hor + cv[2] * w2Hor + cv[3] * w3Hor); } - +#endif } @@ -817,69 +863,54 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I const double h2 = (double) oH / 2.0 - 0.5; double vig_w2, vig_h2, maxRadius, v, b, mul; - calcVignettingParams (oW, oH, params->vignetting, vig_w2, vig_h2, maxRadius, v, b, mul); + calcVignettingParams(oW, oH, params->vignetting, vig_w2, vig_h2, maxRadius, v, b, mul); struct grad_params gp; if (enableGradient) { - calcGradientParams (oW, oH, params->gradient, gp); + calcGradientParams(oW, oH, params->gradient, gp); } struct pcv_params pcv; if (enablePCVignetting) { - calcPCVignetteParams (fW, fH, oW, oH, params->pcvignette, params->crop, pcv); + calcPCVignetteParams(fW, fH, oW, oH, params->pcvignette, params->crop, pcv); } - float** chOrig[3]; - chOrig[0] = original->r.ptrs; - chOrig[1] = original->g.ptrs; - chOrig[2] = original->b.ptrs; - - float** chTrans[3]; - chTrans[0] = transformed->r.ptrs; - chTrans[1] = transformed->g.ptrs; - chTrans[2] = transformed->b.ptrs; + float** chOrig[3] = {original->r.ptrs, original->g.ptrs, original->b.ptrs}; + float** chTrans[3] = {transformed->r.ptrs, transformed->g.ptrs, transformed->b.ptrs}; // auxiliary variables for c/a correction - double chDist[3]; - chDist[0] = enableCA ? params->cacorrection.red : 0.0; - chDist[1] = 0.0; - chDist[2] = enableCA ? params->cacorrection.blue : 0.0; + const double chDist[3] = {enableCA ? params->cacorrection.red : 0.0, 0.0, enableCA ? params->cacorrection.blue : 0.0}; // auxiliary variables for distortion correction const double distAmount = params->distortion.amount; // auxiliary variables for rotation - const double cost = cos (params->rotate.degree * rtengine::RT_PI / 180.0); - const double sint = sin (params->rotate.degree * rtengine::RT_PI / 180.0); + const double cost = cos(params->rotate.degree * rtengine::RT_PI / 180.0); + const double sint = sin(params->rotate.degree * rtengine::RT_PI / 180.0); // auxiliary variables for vertical perspective correction - double vpdeg = params->perspective.vertical / 100.0 * 45.0; - double vpalpha = (90.0 - vpdeg) / 180.0 * rtengine::RT_PI; - double vpteta = fabs (vpalpha - rtengine::RT_PI / 2) < 3e-4 ? 0.0 : acos ((vpdeg > 0 ? 1.0 : -1.0) * sqrt ((-SQR (oW * tan (vpalpha)) + (vpdeg > 0 ? 1.0 : -1.0) * - oW * tan (vpalpha) * sqrt (SQR (4 * maxRadius) + SQR (oW * tan (vpalpha)))) / (SQR (maxRadius) * 8))); - double vpcospt = (vpdeg >= 0 ? 1.0 : -1.0) * cos (vpteta), vptanpt = tan (vpteta); + const double vpdeg = params->perspective.vertical / 100.0 * 45.0; + const double vpalpha = (90.0 - vpdeg) / 180.0 * rtengine::RT_PI; + const double vpteta = fabs(vpalpha - rtengine::RT_PI / 2) < 3e-4 ? 0.0 : acos((vpdeg > 0 ? 1.0 : -1.0) * sqrt((-SQR(oW * tan(vpalpha)) + (vpdeg > 0 ? 1.0 : -1.0) * + oW * tan(vpalpha) * sqrt(SQR(4 * maxRadius) + SQR(oW * tan(vpalpha)))) / (SQR(maxRadius) * 8))); + const double vpcospt = (vpdeg >= 0 ? 1.0 : -1.0) * cos(vpteta), vptanpt = tan(vpteta); // auxiliary variables for horizontal perspective correction - double hpdeg = params->perspective.horizontal / 100.0 * 45.0; - double hpalpha = (90.0 - hpdeg) / 180.0 * rtengine::RT_PI; - double hpteta = fabs (hpalpha - rtengine::RT_PI / 2) < 3e-4 ? 0.0 : acos ((hpdeg > 0 ? 1.0 : -1.0) * sqrt ((-SQR (oH * tan (hpalpha)) + (hpdeg > 0 ? 1.0 : -1.0) * - oH * tan (hpalpha) * sqrt (SQR (4 * maxRadius) + SQR (oH * tan (hpalpha)))) / (SQR (maxRadius) * 8))); - double hpcospt = (hpdeg >= 0 ? 1.0 : -1.0) * cos (hpteta), hptanpt = tan (hpteta); + const double hpdeg = params->perspective.horizontal / 100.0 * 45.0; + const double hpalpha = (90.0 - hpdeg) / 180.0 * rtengine::RT_PI; + const double hpteta = fabs(hpalpha - rtengine::RT_PI / 2) < 3e-4 ? 0.0 : acos((hpdeg > 0 ? 1.0 : -1.0) * sqrt((-SQR(oH * tan(hpalpha)) + (hpdeg > 0 ? 1.0 : -1.0) * + oH * tan(hpalpha) * sqrt(SQR(4 * maxRadius) + SQR(oH * tan(hpalpha)))) / (SQR(maxRadius) * 8))); + const double hpcospt = (hpdeg >= 0 ? 1.0 : -1.0) * cos(hpteta), hptanpt = tan(hpteta); - double ascale = params->commonTrans.autofill ? getTransformAutoFill (oW, oH, pLCPMap) : 1.0; + const double ascale = params->commonTrans.autofill ? getTransformAutoFill(oW, oH, pLCPMap) : 1.0; -#if defined( __GNUC__ ) && __GNUC__ >= 7// silence warning -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wimplicit-fallthrough" -#endif -#if defined( __GNUC__ ) && __GNUC__ >= 7 -#pragma GCC diagnostic pop -#endif - // main cycle const bool darkening = (params->vignetting.amount <= 0.0); + const double centerFactorx = cx - w2; + const double centerFactory = cy - h2; + // main cycle #ifdef _OPENMP #pragma omp parallel for schedule(dynamic, 16) if(multiThread) #endif @@ -895,8 +926,8 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I y_d *= ascale; } - x_d += ascale * (cx - w2); // centering x coord & scale - y_d += ascale * (cy - h2); // centering y coord & scale + x_d += ascale * centerFactorx; // centering x coord & scale + y_d += ascale * centerFactory; // centering y coord & scale if (enablePerspective) { // horizontal perspective transformation @@ -909,15 +940,15 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I } // rotate - double Dxc = x_d * cost - y_d * sint; - double Dyc = x_d * sint + y_d * cost; + const double Dxc = x_d * cost - y_d * sint; + const double Dyc = x_d * sint + y_d * cost; // distortion correction double s = 1; if (enableDistortion) { - double r = sqrt (Dxc * Dxc + Dyc * Dyc) / maxRadius; // sqrt is slow - s = 1.0 - distAmount + distAmount * r ; + double r = sqrt(Dxc * Dxc + Dyc * Dyc) / maxRadius; + s = 1.0 - distAmount + distAmount * r; } for (int c = 0; c < (enableCA ? 3 : 1); c++) { @@ -947,46 +978,46 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I const double vig_y_d = ascale * (y + cy - vig_h2); // centering y coord & scale const double vig_Dx = vig_x_d * cost - vig_y_d * sint; const double vig_Dy = vig_x_d * sint + vig_y_d * cost; - const double r2 = sqrt (vig_Dx * vig_Dx + vig_Dy * vig_Dy); + const double r2 = sqrt(vig_Dx * vig_Dx + vig_Dy * vig_Dy); if (darkening) { - vignmul /= std::max (v + mul * tanh (b * (maxRadius - s * r2) / maxRadius), 0.001); + vignmul /= std::max(v + mul * tanh(b * (maxRadius - s * r2) / maxRadius), 0.001); } else { - vignmul *= (v + mul * tanh (b * (maxRadius - s * r2) / maxRadius)); + vignmul *= (v + mul * tanh(b * (maxRadius - s * r2) / maxRadius)); } } if (enableGradient) { - vignmul *= calcGradientFactor (gp, cx + x, cy + y); + vignmul *= calcGradientFactor(gp, cx + x, cy + y); } if (enablePCVignetting) { - vignmul *= calcPCVignetteFactor (pcv, cx + x, cy + y); + vignmul *= calcPCVignetteFactor(pcv, cx + x, cy + y); } if (yc > 0 && yc < original->getHeight() - 2 && xc > 0 && xc < original->getWidth() - 2) { // all interpolation pixels inside image if (enableCA) { - interpolateTransformChannelsCubic (chOrig[c], xc - 1, yc - 1, Dx, Dy, chTrans[c][y][x], vignmul); + interpolateTransformChannelsCubic(chOrig[c], xc - 1, yc - 1, Dx, Dy, chTrans[c][y][x], vignmul); } else if (!highQuality) { - 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); + 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 { - interpolateTransformCubic (original, xc - 1, yc - 1, Dx, Dy, transformed->r (y, x), transformed->g (y, x), transformed->b (y, x), vignmul); + interpolateTransformCubic(original, xc - 1, yc - 1, Dx, Dy, transformed->r(y, x), transformed->g(y, x), transformed->b(y, x), vignmul); } } else { // edge pixels - int y1 = LIM (yc, 0, original->getHeight() - 1); - int y2 = LIM (yc + 1, 0, original->getHeight() - 1); - int x1 = LIM (xc, 0, original->getWidth() - 1); - int x2 = LIM (xc + 1, 0, original->getWidth() - 1); + int y1 = LIM(yc, 0, original->getHeight() - 1); + int y2 = LIM(yc + 1, 0, original->getHeight() - 1); + int x1 = LIM(xc, 0, original->getWidth() - 1); + int x2 = LIM(xc + 1, 0, original->getWidth() - 1); if (enableCA) { 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 { - 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); + 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 { @@ -994,9 +1025,9 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I // not valid (source pixel x,y not inside source image, etc.) chTrans[c][y][x] = 0; } else { - transformed->r (y, x) = 0; - transformed->g (y, x) = 0; - transformed->b (y, x) = 0; + transformed->r(y, x) = 0; + transformed->g(y, x) = 0; + transformed->b(y, x) = 0; } } } From 2e34aa8a1de8c0f8c0786b050fad6e1bdea63e22 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 10 Sep 2019 23:23:37 +0200 Subject: [PATCH 006/208] Soft Light: speedup and reduce memory usage --- rtengine/ipsoftlight.cc | 115 +++++++++++++++++++++++++++++++--------- 1 file changed, 90 insertions(+), 25 deletions(-) diff --git a/rtengine/ipsoftlight.cc b/rtengine/ipsoftlight.cc index c7a4d1af7..1d94a29c2 100644 --- a/rtengine/ipsoftlight.cc +++ b/rtengine/ipsoftlight.cc @@ -3,6 +3,7 @@ * This file is part of RawTherapee. * * Copyright 2018 Alberto Griggio + * Optimized 2019 Ingo Weyrich * * RawTherapee is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,14 +19,10 @@ * along with RawTherapee. If not, see . */ -#ifdef _OPENMP -#include -#endif - #include "improcfun.h" - #include "procparams.h" - +#define BENCHMARK +#include "StopWatch.h" namespace rtengine { namespace { @@ -33,18 +30,29 @@ namespace { inline float sl(float blend, float x) { if (!OOG(x)) { - const float orig = 1.f - blend; float v = Color::gamma_srgb(x) / MAXVALF; - // Pegtop's formula from + // using Pegtop's formula from // https://en.wikipedia.org/wiki/Blend_modes#Soft_Light - float v2 = v * v; - float v22 = v2 * 2.f; - v = v2 + v22 - v22 * v; - x = blend * Color::igamma_srgb(v * MAXVALF) + orig * x; + // const float orig = 1.f - blend; + // float v2 = v * v; + // float v22 = v2 * 2.f; + // v = v2 + v22 - v22 * v; + // return blend * Color::igamma_srgb(v * MAXVALF) + orig * x; + + // using optimized formula (heckflosse67@gmx.de) + return intp(blend, Color::igamma_srgb(v * v * (3.f - 2.f * v) * MAXVALF), x); } return x; } +#ifdef __SSE2__ +inline vfloat sl(vfloat blend, vfloat x) +{ + const vfloat v = Color::gammatab_srgb[x] / F2V(MAXVALF); + return vself(vmaskf_gt(x, F2V(MAXVALF)), x, vself(vmaskf_lt(x, ZEROV), x, vintpf(blend, Color::igammatab_srgb[v * v * (F2V(3.f) - (v + v)) * MAXVALF], x))); +} +#endif + } // namespace @@ -53,24 +61,81 @@ void ImProcFunctions::softLight(LabImage *lab) if (!params->softlight.enabled || !params->softlight.strength) { return; } + BENCHFUN - Imagefloat working(lab->W, lab->H); - lab2rgb(*lab, working, params->icm.workingProfile); + TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix(params->icm.workingProfile); + const float wp[3][3] = { + {static_cast (wprof[0][0]), static_cast (wprof[0][1]), static_cast (wprof[0][2])}, + {static_cast (wprof[1][0]), static_cast (wprof[1][1]), static_cast (wprof[1][2])}, + {static_cast (wprof[2][0]), static_cast (wprof[2][1]), static_cast (wprof[2][2])} + }; - const float blend = params->softlight.strength / 100.f; + TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix(params->icm.workingProfile); + const float wip[3][3] = { + {static_cast (wiprof[0][0]), static_cast (wiprof[0][1]), static_cast (wiprof[0][2])}, + {static_cast (wiprof[1][0]), static_cast (wiprof[1][1]), static_cast (wiprof[1][2])}, + {static_cast (wiprof[2][0]), static_cast (wiprof[2][1]), static_cast (wiprof[2][2])} + }; -#ifdef _OPENMP - #pragma omp parallel for -#endif - for (int y = 0; y < working.getHeight(); ++y) { - for (int x = 0; x < working.getWidth(); ++x) { - working.r(y, x) = sl(blend, working.r(y, x)); - working.g(y, x) = sl(blend, working.g(y, x)); - working.b(y, x) = sl(blend, working.b(y, x)); +#ifdef __SSE2__ + vfloat wipv[3][3]; + + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + wipv[i][j] = F2V(wiprof[i][j]); + } + } + + vfloat wpv[3][3]; + + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + wpv[i][j] = F2V(wprof[i][j]); + } + } +#endif + +#ifdef _OPENMP + #pragma omp parallel +#endif + { + const float blend = params->softlight.strength / 100.f; +#ifdef __SSE2__ + const vfloat blendv = F2V(blend); +#endif +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) +#endif + for (int i = 0; i < lab->H; ++i) { + int j = 0; +#ifdef __SSE2__ + for (; j < lab->W - 3; j += 4) { + vfloat Xv, Yv, Zv; + vfloat Rv, Gv, Bv; + Color::Lab2XYZ(LVFU(lab->L[i][j]),LVFU (lab->a[i][j]),LVFU (lab->b[i][j]), Xv, Yv, Zv); + Color::xyz2rgb(Xv, Yv, Zv, Rv, Gv, Bv, wipv); + Rv = sl(blendv, Rv); + Gv = sl(blendv, Gv); + Bv = sl(blendv, Bv); + Color::rgbxyz(Rv, Gv, Bv, Xv, Yv, Zv, wpv); + for (int k = 0; k < 4; ++k) { + Color::XYZ2Lab(Xv[k], Yv[k], Zv[k], lab->L[i][j + k], lab->a[i][j + k], lab->b[i][j+ k]); + } + } +#endif + for (; j < lab->W; j++) { + float X, Y, Z; + float R, G, B; + Color::Lab2XYZ(lab->L[i][j], lab->a[i][j], lab->b[i][j], X, Y, Z); + Color::xyz2rgb(X, Y, Z, R, G, B, wip); + R = sl(blend, R); + G = sl(blend, G); + B = sl(blend, B); + Color::rgbxyz(R, G, B, X, Y, Z, wp); + Color::XYZ2Lab(X, Y, Z, lab->L[i][j], lab->a[i][j], lab->b[i][j]); + } } } - - rgb2lab(working, *lab, params->icm.workingProfile); } } // namespace rtengine From 9a020899a32447be884d0e4b9b3c744cefbe00f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Wed, 11 Sep 2019 09:16:06 +0200 Subject: [PATCH 007/208] Minor cleanups --- rtengine/iptransform.cc | 95 +++++++++++++++++++++++++---------------- 1 file changed, 59 insertions(+), 36 deletions(-) diff --git a/rtengine/iptransform.cc b/rtengine/iptransform.cc index 608fa0337..1e739dac6 100644 --- a/rtengine/iptransform.cc +++ b/rtengine/iptransform.cc @@ -16,16 +16,21 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include "rtengine.h" -#include "improcfun.h" -#include "procparams.h" +#include + #ifdef _OPENMP #include #endif + +#include "improcfun.h" + #include "mytime.h" +#include "procparams.h" #include "rt_math.h" -#include "sleef.c" +#include "rtengine.h" #include "rtlensfun.h" +#include "sleef.c" + #define BENCHMARK #include "StopWatch.h" @@ -147,7 +152,7 @@ inline void interpolateTransformCubic(rtengine::Imagefloat* src, int xs, int ys, } #endif #ifdef __SSE2__ -inline void interpolateTransformChannelsCubic(const float* const * src, int xs, int ys, float Dx, float Dy, float &dest, float mul) +inline void interpolateTransformChannelsCubic(const float* const* src, int xs, int ys, float Dx, float Dy, float& dest, float mul) { constexpr float A = -0.85f; @@ -168,7 +173,7 @@ inline void interpolateTransformChannelsCubic(const float* const * src, int xs, dest = mul * vhadd(weight * cv); } #else -inline void interpolateTransformChannelsCubic(const float* const * src, int xs, int ys, float Dx, float Dy, float &dest, float mul) +inline void interpolateTransformChannelsCubic(const float* const* src, int xs, int ys, float Dx, float Dy, float& dest, float mul) { constexpr float A = -0.85f; @@ -859,29 +864,45 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I const bool enablePerspective = needsPerspective(); const bool enableDistortion = needsDistortion(); - const double w2 = (double) oW / 2.0 - 0.5; - const double h2 = (double) oH / 2.0 - 0.5; + const double w2 = static_cast(oW) / 2.0 - 0.5; + const double h2 = static_cast(oH) / 2.0 - 0.5; double vig_w2, vig_h2, maxRadius, v, b, mul; calcVignettingParams(oW, oH, params->vignetting, vig_w2, vig_h2, maxRadius, v, b, mul); - struct grad_params gp; + grad_params gp; if (enableGradient) { calcGradientParams(oW, oH, params->gradient, gp); } - struct pcv_params pcv; + pcv_params pcv; if (enablePCVignetting) { calcPCVignetteParams(fW, fH, oW, oH, params->pcvignette, params->crop, pcv); } - float** chOrig[3] = {original->r.ptrs, original->g.ptrs, original->b.ptrs}; - float** chTrans[3] = {transformed->r.ptrs, transformed->g.ptrs, transformed->b.ptrs}; + const std::array chOrig = { + original->r.ptrs, + original->g.ptrs, + original->b.ptrs + }; + const std::array chTrans = { + transformed->r.ptrs, + transformed->g.ptrs, + transformed->b.ptrs + }; // auxiliary variables for c/a correction - const double chDist[3] = {enableCA ? params->cacorrection.red : 0.0, 0.0, enableCA ? params->cacorrection.blue : 0.0}; + const std::array chDist = { + enableCA + ? params->cacorrection.red + : 0.0, + 0.0, + enableCA + ? params->cacorrection.blue + : 0.0 + }; // auxiliary variables for distortion correction const double distAmount = params->distortion.amount; @@ -893,16 +914,18 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I // auxiliary variables for vertical perspective correction const double vpdeg = params->perspective.vertical / 100.0 * 45.0; const double vpalpha = (90.0 - vpdeg) / 180.0 * rtengine::RT_PI; - const double vpteta = fabs(vpalpha - rtengine::RT_PI / 2) < 3e-4 ? 0.0 : acos((vpdeg > 0 ? 1.0 : -1.0) * sqrt((-SQR(oW * tan(vpalpha)) + (vpdeg > 0 ? 1.0 : -1.0) * - oW * tan(vpalpha) * sqrt(SQR(4 * maxRadius) + SQR(oW * tan(vpalpha)))) / (SQR(maxRadius) * 8))); - const double vpcospt = (vpdeg >= 0 ? 1.0 : -1.0) * cos(vpteta), vptanpt = tan(vpteta); + const double vpteta = fabs(vpalpha - rtengine::RT_PI / 2) < 3e-4 ? 0.0 : acos((vpdeg > 0 ? 1.0 : -1.0) * sqrt((-SQR(oW * tan(vpalpha)) + (vpdeg > 0 ? 1.0 : -1.0) * + oW * tan(vpalpha) * sqrt(SQR(4 * maxRadius) + SQR(oW * tan(vpalpha)))) / (SQR(maxRadius) * 8))); + const double vpcospt = (vpdeg >= 0 ? 1.0 : -1.0) * cos(vpteta); + const double vptanpt = tan(vpteta); // auxiliary variables for horizontal perspective correction const double hpdeg = params->perspective.horizontal / 100.0 * 45.0; const double hpalpha = (90.0 - hpdeg) / 180.0 * rtengine::RT_PI; - const double hpteta = fabs(hpalpha - rtengine::RT_PI / 2) < 3e-4 ? 0.0 : acos((hpdeg > 0 ? 1.0 : -1.0) * sqrt((-SQR(oH * tan(hpalpha)) + (hpdeg > 0 ? 1.0 : -1.0) * - oH * tan(hpalpha) * sqrt(SQR(4 * maxRadius) + SQR(oH * tan(hpalpha)))) / (SQR(maxRadius) * 8))); - const double hpcospt = (hpdeg >= 0 ? 1.0 : -1.0) * cos(hpteta), hptanpt = tan(hpteta); + const double hpteta = fabs(hpalpha - rtengine::RT_PI / 2) < 3e-4 ? 0.0 : acos((hpdeg > 0 ? 1.0 : -1.0) * sqrt((-SQR(oH * tan(hpalpha)) + (hpdeg > 0 ? 1.0 : -1.0) * + oH * tan(hpalpha) * sqrt(SQR(4 * maxRadius) + SQR(oH * tan(hpalpha)))) / (SQR(maxRadius) * 8))); + const double hpcospt = (hpdeg >= 0 ? 1.0 : -1.0) * cos(hpteta); + const double hptanpt = tan(hpteta); const double ascale = params->commonTrans.autofill ? getTransformAutoFill(oW, oH, pLCPMap) : 1.0; @@ -915,9 +938,10 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I #pragma omp parallel for schedule(dynamic, 16) if(multiThread) #endif - for (int y = 0; y < transformed->getHeight(); y++) { - for (int x = 0; x < transformed->getWidth(); x++) { - double x_d = x, y_d = y; + for (int y = 0; y < transformed->getHeight(); ++y) { + for (int x = 0; x < transformed->getWidth(); ++x) { + double x_d = x; + double y_d = y; if (enableLCPDist) { pLCPMap->correctDistortion(x_d, y_d, cx, cy, ascale); // must be first transform @@ -944,14 +968,14 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I const double Dyc = x_d * sint + y_d * cost; // distortion correction - double s = 1; + double s = 1.0; if (enableDistortion) { - double r = sqrt(Dxc * Dxc + Dyc * Dyc) / maxRadius; + const double r = sqrt(Dxc * Dxc + Dyc * Dyc) / maxRadius; s = 1.0 - distAmount + distAmount * r; } - for (int c = 0; c < (enableCA ? 3 : 1); c++) { + for (int c = 0; c < (enableCA ? 3 : 1); ++c) { double Dx = Dxc * (s + chDist[c]); double Dy = Dyc * (s + chDist[c]); @@ -960,22 +984,21 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I Dy += h2; // Extract integer and fractions of source screen coordinates - int xc = (int)Dx; - Dx -= (double)xc; + int xc = Dx; + Dx -= xc; xc -= sx; - int yc = (int)Dy; - Dy -= (double)yc; + int yc = Dy; + Dy -= yc; yc -= sy; // Convert only valid pixels if (yc >= 0 && yc < original->getHeight() && xc >= 0 && xc < original->getWidth()) { - // multiplier for vignetting correction double vignmul = 1.0; if (enableVignetting) { - const double vig_x_d = ascale * (x + cx - vig_w2); // centering x coord & scale - const double vig_y_d = ascale * (y + cy - vig_h2); // centering y coord & scale + const double vig_x_d = ascale * (x + cx - vig_w2); // centering x coord & scale + const double vig_y_d = ascale * (y + cy - vig_h2); // centering y coord & scale const double vig_Dx = vig_x_d * cost - vig_y_d * sint; const double vig_Dy = vig_x_d * sint + vig_y_d * cost; const double r2 = sqrt(vig_Dx * vig_Dx + vig_Dy * vig_Dy); @@ -1007,10 +1030,10 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I } } else { // edge pixels - int y1 = LIM(yc, 0, original->getHeight() - 1); - int y2 = LIM(yc + 1, 0, original->getHeight() - 1); - int x1 = LIM(xc, 0, original->getWidth() - 1); - int x2 = LIM(xc + 1, 0, original->getWidth() - 1); + const int y1 = LIM(yc, 0, original->getHeight() - 1); + const int y2 = LIM(yc + 1, 0, original->getHeight() - 1); + const int x1 = LIM(xc, 0, original->getWidth() - 1); + const int x2 = LIM(xc + 1, 0, original->getWidth() - 1); if (enableCA) { 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); From 1e75f38dba6b95d380f1d97fb9ec61748a139ff1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Thu, 12 Sep 2019 14:49:51 +0200 Subject: [PATCH 008/208] Softlight cleanups - More `const` - Removed `using namespace` - Whitespace cleanups --- rtengine/ipsoftlight.cc | 57 ++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 32 deletions(-) diff --git a/rtengine/ipsoftlight.cc b/rtengine/ipsoftlight.cc index 1d94a29c2..556790eb4 100644 --- a/rtengine/ipsoftlight.cc +++ b/rtengine/ipsoftlight.cc @@ -20,17 +20,17 @@ */ #include "improcfun.h" + #include "procparams.h" #define BENCHMARK #include "StopWatch.h" -namespace rtengine { namespace { inline float sl(float blend, float x) { - if (!OOG(x)) { - float v = Color::gamma_srgb(x) / MAXVALF; + if (!rtengine::OOG(x)) { + float v = rtengine::Color::gamma_srgb(x) / rtengine::MAXVALF; // using Pegtop's formula from // https://en.wikipedia.org/wiki/Blend_modes#Soft_Light // const float orig = 1.f - blend; @@ -40,7 +40,7 @@ inline float sl(float blend, float x) // return blend * Color::igamma_srgb(v * MAXVALF) + orig * x; // using optimized formula (heckflosse67@gmx.de) - return intp(blend, Color::igamma_srgb(v * v * (3.f - 2.f * v) * MAXVALF), x); + return rtengine::intp(blend, rtengine::Color::igamma_srgb(v * v * (3.f - 2.f * v) * rtengine::MAXVALF), x); } return x; } @@ -48,51 +48,46 @@ inline float sl(float blend, float x) #ifdef __SSE2__ inline vfloat sl(vfloat blend, vfloat x) { - const vfloat v = Color::gammatab_srgb[x] / F2V(MAXVALF); - return vself(vmaskf_gt(x, F2V(MAXVALF)), x, vself(vmaskf_lt(x, ZEROV), x, vintpf(blend, Color::igammatab_srgb[v * v * (F2V(3.f) - (v + v)) * MAXVALF], x))); + const vfloat v = rtengine::Color::gammatab_srgb[x] / F2V(rtengine::MAXVALF); + return vself(vmaskf_gt(x, F2V(rtengine::MAXVALF)), x, vself(vmaskf_lt(x, ZEROV), x, vintpf(blend, rtengine::Color::igammatab_srgb[v * v * (F2V(3.f) - (v + v)) * rtengine::MAXVALF], x))); } #endif } // namespace - -void ImProcFunctions::softLight(LabImage *lab) +void rtengine::ImProcFunctions::softLight(LabImage *lab) { if (!params->softlight.enabled || !params->softlight.strength) { return; } BENCHFUN - TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix(params->icm.workingProfile); + const TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix(params->icm.workingProfile); const float wp[3][3] = { - {static_cast (wprof[0][0]), static_cast (wprof[0][1]), static_cast (wprof[0][2])}, - {static_cast (wprof[1][0]), static_cast (wprof[1][1]), static_cast (wprof[1][2])}, - {static_cast (wprof[2][0]), static_cast (wprof[2][1]), static_cast (wprof[2][2])} + {static_cast(wprof[0][0]), static_cast(wprof[0][1]), static_cast(wprof[0][2])}, + {static_cast(wprof[1][0]), static_cast(wprof[1][1]), static_cast(wprof[1][2])}, + {static_cast(wprof[2][0]), static_cast(wprof[2][1]), static_cast(wprof[2][2])} }; - TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix(params->icm.workingProfile); + const TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix(params->icm.workingProfile); const float wip[3][3] = { - {static_cast (wiprof[0][0]), static_cast (wiprof[0][1]), static_cast (wiprof[0][2])}, - {static_cast (wiprof[1][0]), static_cast (wiprof[1][1]), static_cast (wiprof[1][2])}, - {static_cast (wiprof[2][0]), static_cast (wiprof[2][1]), static_cast (wiprof[2][2])} + {static_cast(wiprof[0][0]), static_cast(wiprof[0][1]), static_cast(wiprof[0][2])}, + {static_cast(wiprof[1][0]), static_cast(wiprof[1][1]), static_cast(wiprof[1][2])}, + {static_cast(wiprof[2][0]), static_cast(wiprof[2][1]), static_cast(wiprof[2][2])} }; #ifdef __SSE2__ - vfloat wipv[3][3]; + const vfloat wpv[3][3] = { + {F2V(wprof[0][0]), F2V(wprof[0][1]), F2V(wprof[0][2])}, + {F2V(wprof[1][0]), F2V(wprof[1][1]), F2V(wprof[1][2])}, + {F2V(wprof[2][0]), F2V(wprof[2][1]), F2V(wprof[2][2])} + }; - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 3; j++) { - wipv[i][j] = F2V(wiprof[i][j]); - } - } - - vfloat wpv[3][3]; - - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 3; j++) { - wpv[i][j] = F2V(wprof[i][j]); - } - } + const vfloat wipv[3][3] = { + {F2V(wiprof[0][0]), F2V(wiprof[0][1]), F2V(wiprof[0][2])}, + {F2V(wiprof[1][0]), F2V(wiprof[1][1]), F2V(wiprof[1][2])}, + {F2V(wiprof[2][0]), F2V(wiprof[2][1]), F2V(wiprof[2][2])} + }; #endif #ifdef _OPENMP @@ -137,5 +132,3 @@ void ImProcFunctions::softLight(LabImage *lab) } } } - -} // namespace rtengine From 19e01124952069794dbfc980e4e0a315566fdd83 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 15 Sep 2019 12:55:20 +0200 Subject: [PATCH 009/208] xtrans: border artifacts when using 1-pass Markesteijn, fixes #5452 --- rtengine/xtrans_demosaic.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/xtrans_demosaic.cc b/rtengine/xtrans_demosaic.cc index e84b5217e..9a3b341cc 100644 --- a/rtengine/xtrans_demosaic.cc +++ b/rtengine/xtrans_demosaic.cc @@ -959,7 +959,7 @@ void RawImageSource::xtrans_interpolate (const int passes, const bool useCieLab, free(buffer); } - xtransborder_interpolate(8, red, green, blue); + xtransborder_interpolate(passes > 1 ? 8 : 11, red, green, blue); } #undef CLIP void RawImageSource::fast_xtrans_interpolate (const array2D &rawData, array2D &red, array2D &green, array2D &blue) From a06c2714e27a7415554fc036c7749bc209f33f2a Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 15 Sep 2019 16:29:29 +0200 Subject: [PATCH 010/208] Update capturesharpening.cc Fix artifacts at radius > 0.85 --- rtengine/capturesharpening.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index 8d9ee5b64..df2b1d908 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -530,7 +530,7 @@ BENCHFUN } constexpr int tileSize = 194; - constexpr int border = 3; + constexpr int border = 5; constexpr int fullTileSize = tileSize + 2 * border; double progress = startVal; From 0c1c2152622fbbc09f3fac99cf4687fdf77b0fff Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 15 Sep 2019 21:57:17 +0200 Subject: [PATCH 011/208] Improve readability of hasselblad_load_raw() code, #5434 --- rtengine/dcraw.cc | 121 +++++++++++++++++++++++++++------------------- 1 file changed, 70 insertions(+), 51 deletions(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index e15a2bb0f..5e85b1e2e 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -2417,59 +2417,78 @@ void CLASS hasselblad_correct() void CLASS hasselblad_load_raw() { - struct jhead jh; - int shot, row, col, *back[5], len[2], diff[12], pred, sh, f, s, c; - unsigned upix, urow, ucol; - ushort *ip; + struct jhead jh; + int *back[5], diff[12]; - if (!ljpeg_start (&jh, 0)) return; - order = 0x4949; - ph1_bithuff_t ph1_bithuff(this, ifp, order); - hb_bits(-1); - back[4] = (int *) calloc (raw_width, 3*sizeof **back); - merror (back[4], "hasselblad_load_raw()"); - FORC3 back[c] = back[4] + c*raw_width; - cblack[6] >>= sh = tiff_samples > 1; - shot = LIM(shot_select, 1, tiff_samples) - 1; - for (row=0; row < raw_height; row++) { - FORC4 back[(c+3) & 3] = back[c]; - for (col=0; col < raw_width; col+=2) { - for (s=0; s < tiff_samples*2; s+=2) { - FORC(2) len[c] = ph1_huff(jh.huff[0]); - FORC(2) { - diff[s+c] = hb_bits(len[c]); - if ((diff[s+c] & (1 << (len[c]-1))) == 0) - diff[s+c] -= (1 << len[c]) - 1; - if (diff[s+c] == 65535) diff[s+c] = -32768; - } - } - for (s=col; s < col+2; s++) { - pred = 0x8000 + load_flags; - if (col) pred = back[2][s-2]; - if (col && row > 1) switch (jh.psv) { - case 11: pred += back[0][s]/2 - back[0][s-2]/2; break; - } - f = (row & 1)*3 ^ ((col+s) & 1); - FORC (tiff_samples) { - pred += diff[(s & 1)*tiff_samples+c]; - upix = pred >> sh & 0xffff; - if (raw_image && c == shot) - RAW(row,s) = upix; - if (image) { - urow = row-top_margin + (c & 1); - ucol = col-left_margin - ((c >> 1) & 1); - ip = &image[urow*width+ucol][f]; - if (urow < height && ucol < width) - *ip = c < 4 ? upix : (*ip + upix) >> 1; - } - } - back[2][s] = pred; - } + if (!ljpeg_start (&jh, 0)) { + return; + } + order = 0x4949; + ph1_bithuff_t ph1_bithuff(this, ifp, order); + hb_bits(-1); + back[4] = (int *) calloc(raw_width, 3 * sizeof **back); + merror(back[4], "hasselblad_load_raw()"); + for (int c = 0; c < 3; ++c) { + back[c] = back[4] + c * raw_width; + } + const int sh = tiff_samples > 1; + cblack[6] >>= sh; + const int shot = LIM(shot_select, 1, tiff_samples) - 1; + for (int row = 0; row < raw_height; ++row) { + for (int c = 0; c < 4; ++c) { + back[(c + 3) & 3] = back[c]; + } + for (int col = 0; col < raw_width; col += 2) { + for (int s = 0; s < tiff_samples * 2; s += 2) { + int len[2]; + for (int c = 0; c < 2; ++c) { + len[c] = ph1_huff(jh.huff[0]); + } + for (int c = 0; c < 2; ++c) { + diff[s + c] = hb_bits(len[c]); + if ((diff[s + c] & (1 << (len[c] - 1))) == 0) { + diff[s + c] -= (1 << len[c]) - 1; + } + if (diff[s + c] == 65535) { + diff[s + c] = -32768; + } + } + } + for (int s = col; s < col + 2; ++s) { + int pred; + if (col) { + pred = back[2][s - 2]; + if (row > 1 && jh.psv == 11) { + pred += back[0][s] / 2 - back[0][s - 2] / 2; + } + } else { + pred = 0x8000 + load_flags; + } + for (int c = 0; c < tiff_samples; ++c) { + pred += diff[(s & 1) * tiff_samples + c]; + const unsigned upix = pred >> sh & 0xffff; + if (raw_image && c == shot) { + RAW(row, s) = upix; + } + if (image) { + const int f = (row & 1) * 3 ^ ((col + s) & 1); + const unsigned urow = row - top_margin + (c & 1); + const unsigned ucol = col - left_margin - ((c >> 1) & 1); + ushort* const ip = &image[urow * width + ucol][f]; + if (urow < height && ucol < width) { + *ip = c < 4 ? upix : (*ip + upix) >> 1; + } + } + } + back[2][s] = pred; + } + } + } + free(back[4]); + ljpeg_end(&jh); + if (image) { + mix_green = 1; } - } - free (back[4]); - ljpeg_end (&jh); - if (image) mix_green = 1; } void CLASS leaf_hdr_load_raw() From f55afb91c306c3449f579bff0f1f6cfdcde8c831 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 15 Sep 2019 22:30:03 +0200 Subject: [PATCH 012/208] Soft Light: remove benchmark code, closes #5447 --- rtengine/ipsoftlight.cc | 3 --- 1 file changed, 3 deletions(-) diff --git a/rtengine/ipsoftlight.cc b/rtengine/ipsoftlight.cc index 556790eb4..cd49e858f 100644 --- a/rtengine/ipsoftlight.cc +++ b/rtengine/ipsoftlight.cc @@ -22,8 +22,6 @@ #include "improcfun.h" #include "procparams.h" -#define BENCHMARK -#include "StopWatch.h" namespace { @@ -60,7 +58,6 @@ void rtengine::ImProcFunctions::softLight(LabImage *lab) if (!params->softlight.enabled || !params->softlight.strength) { return; } - BENCHFUN const TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix(params->icm.workingProfile); const float wp[3][3] = { From f2cdbd0e4dabc1878f36a6b35c88132b8c561901 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 16 Sep 2019 15:09:47 +0200 Subject: [PATCH 013/208] Capture sharpening: experimental radius offset depending on distance to center --- rtdata/languages/default | 1 + rtengine/capturesharpening.cc | 30 ++++++++++++++++++++++-------- rtengine/procparams.cc | 4 ++++ rtengine/procparams.h | 1 + rtgui/paramsedited.cc | 8 +++++++- rtgui/paramsedited.h | 1 + rtgui/pdsharpening.cc | 22 ++++++++++++++++++++-- rtgui/pdsharpening.h | 2 ++ 8 files changed, 58 insertions(+), 11 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 3749a706a..be1638e8e 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2037,6 +2037,7 @@ TP_SHARPENING_LABEL;Sharpening TP_SHARPENING_METHOD;Method TP_SHARPENING_ONLYEDGES;Sharpen only edges TP_SHARPENING_RADIUS;Radius +TP_SHARPENING_RADIUS_OFFSET;Radius corner offset TP_SHARPENING_RLD;RL Deconvolution TP_SHARPENING_RLD_AMOUNT;Amount TP_SHARPENING_RLD_DAMPING;Damping diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index df2b1d908..e08243713 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -513,11 +513,11 @@ float calcRadiusXtrans(const float * const *rawData, int W, int H, float lowerLi } return std::sqrt((1.f / (std::log(1.f / maxRatio))) / -2.f); } -void CaptureDeconvSharpening (float** luminance, float** oldLuminance, const float * const * blend, int W, int H, double sigma, int iterations, rtengine::ProgressListener* plistener, double startVal, double endVal) +void CaptureDeconvSharpening (float** luminance, float** oldLuminance, const float * const * blend, int W, int H, double sigma, double sigmaCornerOffset, int iterations, rtengine::ProgressListener* plistener, double startVal, double endVal) { BENCHFUN - const bool is5x5 = (sigma <= 0.84); - const bool is3x3 = (sigma < 0.6); + const bool is5x5 = (sigma <= 0.84 && sigmaCornerOffset == 0.0); + const bool is3x3 = (sigma < 0.6 && sigmaCornerOffset == 0.0); float kernel7[7][7]; float kernel5[5][5]; float kernel3[3][3]; @@ -532,6 +532,9 @@ BENCHFUN constexpr int tileSize = 194; constexpr int border = 5; constexpr int fullTileSize = tileSize + 2 * border; + const float maxRadius = std::min(1.15f, sigma + sigmaCornerOffset); + const float maxDistance = sqrt(rtengine::SQR(W * 0.5f) + rtengine::SQR(H * 0.5f)); + const float distanceFactor = (maxRadius - sigma) / maxDistance; double progress = startVal; const double progressStep = (endVal - startVal) * rtengine::SQR(tileSize) / (W * H); @@ -578,10 +581,21 @@ BENCHFUN gauss5x5mult(tmpThr, tmpIThr, fullTileSize, fullTileSize, kernel5); } } else { - for (int k = 0; k < iterations; ++k) { - // apply 7x7 gaussian blur and divide luminance by result of gaussian blur - gauss7x7div(tmpIThr, tmpThr, lumThr, fullTileSize, fullTileSize, kernel7); - gauss7x7mult(tmpThr, tmpIThr, fullTileSize, fullTileSize, kernel7); + if (sigmaCornerOffset > 0.0) { + float lkernel7[7][7]; + const float distance = sqrt(rtengine::SQR(i + tileSize / 2 - H / 2) + rtengine::SQR(j + tileSize / 2 - W / 2)); + compute7x7kernel(sigma + distanceFactor * distance, lkernel7); + for (int k = 0; k < iterations - 1; ++k) { + // apply 7x7 gaussian blur and divide luminance by result of gaussian blur + gauss7x7div(tmpIThr, tmpThr, lumThr, fullTileSize, fullTileSize, lkernel7); + gauss7x7mult(tmpThr, tmpIThr, fullTileSize, fullTileSize, lkernel7); + } + } else { + for (int k = 0; k < iterations; ++k) { + // apply 7x7 gaussian blur and divide luminance by result of gaussian blur + gauss7x7div(tmpIThr, tmpThr, lumThr, fullTileSize, fullTileSize, kernel7); + gauss7x7mult(tmpThr, tmpIThr, fullTileSize, fullTileSize, kernel7); + } } } if (endOfRow || endOfCol) { @@ -760,7 +774,7 @@ BENCHFUN } conrastThreshold = contrast * 100.f; - CaptureDeconvSharpening(YNew, YOld, blend, W, H, radius, sharpeningParams.deconviter, plistener, 0.2, 0.9); + CaptureDeconvSharpening(YNew, YOld, blend, W, H, radius, sharpeningParams.deconvradiusOffset, sharpeningParams.deconviter, plistener, 0.2, 0.9); if (plistener) { plistener->setProgress(0.9); } diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index f88220c4e..639a9e3d3 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -1156,6 +1156,7 @@ CaptureSharpeningParams::CaptureSharpeningParams() : contrast(10.0), gamma(1.00), deconvradius(0.75), + deconvradiusOffset(0.0), deconviter(20) { } @@ -1169,6 +1170,7 @@ bool CaptureSharpeningParams::operator ==(const CaptureSharpeningParams& other) && autoContrast == other.autoContrast && autoRadius == other.autoRadius && deconvradius == other.deconvradius + && deconvradiusOffset == other.deconvradiusOffset && deconviter == other.deconviter; } @@ -3375,6 +3377,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->pdsharpening.autoRadius, "PostDemosaicSharpening", "AutoRadius", pdsharpening.autoRadius, keyFile); saveToKeyfile(!pedited || pedited->pdsharpening.gamma, "PostDemosaicSharpening", "DeconvGamma", pdsharpening.gamma, keyFile); saveToKeyfile(!pedited || pedited->pdsharpening.deconvradius, "PostDemosaicSharpening", "DeconvRadius", pdsharpening.deconvradius, keyFile); + saveToKeyfile(!pedited || pedited->pdsharpening.deconvradiusOffset, "PostDemosaicSharpening", "DeconvRadiusOffset", pdsharpening.deconvradiusOffset, keyFile); saveToKeyfile(!pedited || pedited->pdsharpening.deconviter, "PostDemosaicSharpening", "DeconvIterations", pdsharpening.deconviter, keyFile); // Post resize sharpening @@ -4465,6 +4468,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "PostDemosaicSharpening", "DeconvGamma", pedited, pdsharpening.gamma, pedited->pdsharpening.gamma); assignFromKeyfile(keyFile, "PostDemosaicSharpening", "DeconvRadius", pedited, pdsharpening.deconvradius, pedited->pdsharpening.deconvradius); + assignFromKeyfile(keyFile, "PostDemosaicSharpening", "DeconvRadiusOffset", pedited, pdsharpening.deconvradiusOffset, pedited->pdsharpening.deconvradiusOffset); assignFromKeyfile(keyFile, "PostDemosaicSharpening", "DeconvIterations", pedited, pdsharpening.deconviter, pedited->pdsharpening.deconviter); } diff --git a/rtengine/procparams.h b/rtengine/procparams.h index ce03efc7d..ec529ee06 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -549,6 +549,7 @@ struct CaptureSharpeningParams { double contrast; double gamma; double deconvradius; + double deconvradiusOffset; int deconviter; CaptureSharpeningParams(); diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 2ab5702ea..b2b51f38a 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -171,6 +171,7 @@ void ParamsEdited::set(bool v) pdsharpening.autoRadius = v; pdsharpening.gamma = v; pdsharpening.deconvradius = v; + pdsharpening.deconvradiusOffset = v; pdsharpening.deconviter = v; prsharpening.enabled = v; prsharpening.contrast = v; @@ -756,6 +757,7 @@ void ParamsEdited::initFrom(const std::vector& pdsharpening.autoRadius = pdsharpening.autoRadius && p.pdsharpening.autoRadius == other.pdsharpening.autoRadius; pdsharpening.gamma = pdsharpening.gamma && p.pdsharpening.gamma == other.pdsharpening.gamma; pdsharpening.deconvradius = pdsharpening.deconvradius && p.pdsharpening.deconvradius == other.pdsharpening.deconvradius; + pdsharpening.deconvradiusOffset = pdsharpening.deconvradiusOffset && p.pdsharpening.deconvradiusOffset == other.pdsharpening.deconvradiusOffset; pdsharpening.deconviter = pdsharpening.deconviter && p.pdsharpening.deconviter == other.pdsharpening.deconviter; prsharpening.enabled = prsharpening.enabled && p.prsharpening.enabled == other.prsharpening.enabled; prsharpening.contrast = prsharpening.contrast && p.prsharpening.contrast == other.prsharpening.contrast; @@ -1746,6 +1748,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.pdsharpening.deconvradius = dontforceSet && options.baBehav[ADDSET_SHARP_RADIUS] ? toEdit.pdsharpening.deconvradius + mods.pdsharpening.deconvradius : mods.pdsharpening.deconvradius; } + if (pdsharpening.deconvradiusOffset) { + toEdit.pdsharpening.deconvradiusOffset = dontforceSet && options.baBehav[ADDSET_SHARP_RADIUS] ? toEdit.pdsharpening.deconvradiusOffset + mods.pdsharpening.deconvradiusOffset : mods.pdsharpening.deconvradiusOffset; + } + if (pdsharpening.deconviter) { toEdit.pdsharpening.deconviter = dontforceSet && options.baBehav[ADDSET_SHARP_ITER] ? toEdit.pdsharpening.deconviter + mods.pdsharpening.deconviter : mods.pdsharpening.deconviter; } @@ -3295,5 +3301,5 @@ bool FilmNegativeParamsEdited::isUnchanged() const bool CaptureSharpeningParamsEdited::isUnchanged() const { - return enabled && contrast && autoContrast && autoRadius && gamma && deconvradius && deconviter; + return enabled && contrast && autoContrast && autoRadius && gamma && deconvradius && deconvradiusOffset && deconviter; } \ No newline at end of file diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 1bd7170d4..b83fbf568 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -205,6 +205,7 @@ struct CaptureSharpeningParamsEdited { bool autoRadius; bool gamma; bool deconvradius; + bool deconvradiusOffset; bool deconviter; bool isUnchanged() const; }; diff --git a/rtgui/pdsharpening.cc b/rtgui/pdsharpening.cc index ef0ad90c2..f25e44e69 100644 --- a/rtgui/pdsharpening.cc +++ b/rtgui/pdsharpening.cc @@ -33,6 +33,7 @@ PdSharpening::PdSharpening() : FoldableToolPanel(this, "pdsharpening", M("TP_PDS EvPdShrContrast = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_CONTRAST"); EvPdSharpenGamma = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_GAMMA"); EvPdShrDRadius = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_RADIUS"); + EvPdShrDRadiusOffset = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_RADIUS_OFFSET"); EvPdShrDIterations = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_ITERATIONS"); EvPdShrAutoContrast = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST"); EvPdShrAutoRadius = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_AUTO_RADIUS"); @@ -51,25 +52,30 @@ PdSharpening::PdSharpening() : FoldableToolPanel(this, "pdsharpening", M("TP_PDS Gtk::VBox* rld = Gtk::manage(new Gtk::VBox()); gamma = Gtk::manage(new Adjuster(M("TP_SHARPENING_GAMMA"), 0.5, 6.0, 0.05, 1.00)); - dradius = Gtk::manage(new Adjuster(M("TP_SHARPENING_EDRADIUS"), 0.4, 1.15, 0.01, 0.75)); + dradius = Gtk::manage(new Adjuster(M("TP_SHARPENING_RADIUS"), 0.4, 1.15, 0.01, 0.75)); dradius->addAutoButton(M("TP_PDSHARPENING_AUTORADIUS_TOOLTIP")); dradius->setAutoValue(true); + dradiusOffset = Gtk::manage(new Adjuster(M("TP_SHARPENING_RADIUS_OFFSET"), 0.0, 0.5, 0.01, 0.0)); diter = Gtk::manage(new Adjuster(M("TP_SHARPENING_RLD_ITERATIONS"), 1, 100, 1, 20)); rld->pack_start(*gamma); rld->pack_start(*dradius); + rld->pack_start(*dradiusOffset); rld->pack_start(*diter); gamma->show(); dradius->show(); + dradiusOffset->show(); diter->show(); rld->show(); pack_start(*rld); dradius->setAdjusterListener(this); + dradiusOffset->setAdjusterListener(this); gamma->setAdjusterListener(this); diter->setAdjusterListener(this); contrast->delay = std::max(contrast->delay, options.adjusterMaxDelay); dradius->delay = std::max(dradius->delay, options.adjusterMaxDelay); + dradiusOffset->delay = std::max(dradiusOffset->delay, options.adjusterMaxDelay); gamma->delay = std::max(gamma->delay, options.adjusterMaxDelay); diter->delay = std::max(diter->delay, options.adjusterMaxDelay); } @@ -91,6 +97,7 @@ void PdSharpening::read(const ProcParams* pp, const ParamsEdited* pedited) dradius->setAutoInconsistent(multiImage && !pedited->pdsharpening.autoRadius); gamma->setEditedState(pedited->pdsharpening.gamma ? Edited : UnEdited); dradius->setEditedState(pedited->pdsharpening.deconvradius ? Edited : UnEdited); + dradiusOffset->setEditedState(pedited->pdsharpening.deconvradiusOffset ? Edited : UnEdited); diter->setEditedState(pedited->pdsharpening.deconviter ? Edited : UnEdited); set_inconsistent(multiImage && !pedited->pdsharpening.enabled); @@ -103,6 +110,7 @@ void PdSharpening::read(const ProcParams* pp, const ParamsEdited* pedited) gamma->setValue(pp->pdsharpening.gamma); dradius->setValue(pp->pdsharpening.deconvradius); dradius->setAutoValue(pp->pdsharpening.autoRadius); + dradiusOffset->setValue(pp->pdsharpening.deconvradiusOffset); diter->setValue(pp->pdsharpening.deconviter); lastAutoContrast = pp->pdsharpening.autoContrast; lastAutoRadius = pp->pdsharpening.autoRadius; @@ -119,6 +127,7 @@ void PdSharpening::write(ProcParams* pp, ParamsEdited* pedited) pp->pdsharpening.gamma = gamma->getValue(); pp->pdsharpening.deconvradius = dradius->getValue(); pp->pdsharpening.autoRadius = dradius->getAutoValue(); + pp->pdsharpening.deconvradiusOffset = dradiusOffset->getValue(); pp->pdsharpening.deconviter =(int)diter->getValue(); if (pedited) { @@ -127,6 +136,7 @@ void PdSharpening::write(ProcParams* pp, ParamsEdited* pedited) pedited->pdsharpening.gamma = gamma->getEditedState(); pedited->pdsharpening.deconvradius = dradius->getEditedState(); pedited->pdsharpening.autoRadius = !dradius->getAutoInconsistent(); + pedited->pdsharpening.deconvradiusOffset = dradiusOffset->getEditedState(); pedited->pdsharpening.deconviter = diter->getEditedState(); pedited->pdsharpening.enabled = !get_inconsistent(); } @@ -138,17 +148,20 @@ void PdSharpening::setDefaults(const ProcParams* defParams, const ParamsEdited* contrast->setDefault(defParams->pdsharpening.contrast); gamma->setDefault(defParams->pdsharpening.gamma); dradius->setDefault(defParams->pdsharpening.deconvradius); + dradiusOffset->setDefault(defParams->pdsharpening.deconvradiusOffset); diter->setDefault(defParams->pdsharpening.deconviter); if (pedited) { contrast->setDefaultEditedState(pedited->pdsharpening.contrast ? Edited : UnEdited); gamma->setDefaultEditedState(pedited->pdsharpening.gamma ? Edited : UnEdited); dradius->setDefaultEditedState(pedited->pdsharpening.deconvradius ? Edited : UnEdited); + dradiusOffset->setDefaultEditedState(pedited->pdsharpening.deconvradiusOffset ? Edited : UnEdited); diter->setDefaultEditedState(pedited->pdsharpening.deconviter ? Edited : UnEdited); } else { contrast->setDefaultEditedState(Irrelevant); gamma->setDefaultEditedState(Irrelevant); dradius->setDefaultEditedState(Irrelevant); + dradiusOffset->setDefaultEditedState(Irrelevant); diter->setDefaultEditedState(Irrelevant); } } @@ -159,7 +172,7 @@ void PdSharpening::adjusterChanged(Adjuster* a, double newval) Glib::ustring costr; - if (a == gamma || a == dradius) { + if (a == gamma || a == dradius || a == dradiusOffset) { costr = Glib::ustring::format(std::setw(3), std::fixed, std::setprecision(2), a->getValue()); } else { costr = Glib::ustring::format((int)a->getValue()); @@ -171,6 +184,8 @@ void PdSharpening::adjusterChanged(Adjuster* a, double newval) listener->panelChanged(EvPdSharpenGamma, costr); } else if (a == dradius) { listener->panelChanged(EvPdShrDRadius, costr); + } else if (a == dradiusOffset) { + listener->panelChanged(EvPdShrDRadiusOffset, costr); } else if (a == diter) { listener->panelChanged(EvPdShrDIterations, costr); } @@ -198,6 +213,7 @@ void PdSharpening::setBatchMode(bool batchMode) contrast->showEditedCB(); gamma->showEditedCB(); dradius->showEditedCB(); + dradiusOffset->showEditedCB(); diter->showEditedCB(); } @@ -207,6 +223,7 @@ void PdSharpening::setAdjusterBehavior(bool contrastadd, bool gammaadd, bool rad contrast->setAddMode(contrastadd); gamma->setAddMode(gammaadd); dradius->setAddMode(radiusadd); + dradiusOffset->setAddMode(radiusadd); diter->setAddMode(iteradd); } @@ -216,6 +233,7 @@ void PdSharpening::trimValues(rtengine::procparams::ProcParams* pp) contrast->trimValue(pp->pdsharpening.contrast); gamma->trimValue(pp->pdsharpening.gamma); dradius->trimValue(pp->pdsharpening.deconvradius); + dradiusOffset->trimValue(pp->pdsharpening.deconvradiusOffset); diter->trimValue(pp->pdsharpening.deconviter); } diff --git a/rtgui/pdsharpening.h b/rtgui/pdsharpening.h index e56b4b085..f621fd0a5 100644 --- a/rtgui/pdsharpening.h +++ b/rtgui/pdsharpening.h @@ -28,12 +28,14 @@ protected: Adjuster* contrast; Adjuster* gamma; Adjuster* dradius; + Adjuster* dradiusOffset; Adjuster* diter; bool lastAutoContrast; bool lastAutoRadius; rtengine::ProcEvent EvPdShrContrast; rtengine::ProcEvent EvPdShrDRadius; + rtengine::ProcEvent EvPdShrDRadiusOffset; rtengine::ProcEvent EvPdSharpenGamma; rtengine::ProcEvent EvPdShrDIterations; rtengine::ProcEvent EvPdShrAutoContrast; From 7956f6f786e4ddfcc0080cf8807300da5f8068b3 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 16 Sep 2019 15:29:26 +0200 Subject: [PATCH 014/208] Enable Capture sharpening for * ISO Low.pp3, #5412 --- rtdata/profiles/Auto-Matched Curve - ISO Low.pp3 | 3 +++ rtdata/profiles/Standard Film Curve - ISO Low.pp3 | 3 +++ 2 files changed, 6 insertions(+) diff --git a/rtdata/profiles/Auto-Matched Curve - ISO Low.pp3 b/rtdata/profiles/Auto-Matched Curve - ISO Low.pp3 index 882c0130f..ee620398a 100644 --- a/rtdata/profiles/Auto-Matched Curve - ISO Low.pp3 +++ b/rtdata/profiles/Auto-Matched Curve - ISO Low.pp3 @@ -21,3 +21,6 @@ DCPIlluminant=0 [RAW] CA=true + +[PostDemosaicSharpening] +Enabled=true \ No newline at end of file diff --git a/rtdata/profiles/Standard Film Curve - ISO Low.pp3 b/rtdata/profiles/Standard Film Curve - ISO Low.pp3 index c23b5b8a4..de7787827 100644 --- a/rtdata/profiles/Standard Film Curve - ISO Low.pp3 +++ b/rtdata/profiles/Standard Film Curve - ISO Low.pp3 @@ -23,3 +23,6 @@ DCPIlluminant=0 [RAW] CA=true + +[PostDemosaicSharpening] +Enabled=true \ No newline at end of file From c7400459f056125cf5072cbec2d4a697c331c85f Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 16 Sep 2019 15:51:47 +0200 Subject: [PATCH 015/208] Update Auto-Matched Curve - ISO Low.pp3 --- rtdata/profiles/Auto-Matched Curve - ISO Low.pp3 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtdata/profiles/Auto-Matched Curve - ISO Low.pp3 b/rtdata/profiles/Auto-Matched Curve - ISO Low.pp3 index ee620398a..c94077b21 100644 --- a/rtdata/profiles/Auto-Matched Curve - ISO Low.pp3 +++ b/rtdata/profiles/Auto-Matched Curve - ISO Low.pp3 @@ -23,4 +23,4 @@ DCPIlluminant=0 CA=true [PostDemosaicSharpening] -Enabled=true \ No newline at end of file +Enabled=true From 6d9e7d58988e1c554e8f7d3450fd571477cd6124 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 16 Sep 2019 15:52:11 +0200 Subject: [PATCH 016/208] Update Standard Film Curve - ISO Low.pp3 --- rtdata/profiles/Standard Film Curve - ISO Low.pp3 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtdata/profiles/Standard Film Curve - ISO Low.pp3 b/rtdata/profiles/Standard Film Curve - ISO Low.pp3 index de7787827..45fcca730 100644 --- a/rtdata/profiles/Standard Film Curve - ISO Low.pp3 +++ b/rtdata/profiles/Standard Film Curve - ISO Low.pp3 @@ -25,4 +25,4 @@ DCPIlluminant=0 CA=true [PostDemosaicSharpening] -Enabled=true \ No newline at end of file +Enabled=true From 796e8f02896c0506dd9c403572adabf80187e03b Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 16 Sep 2019 17:17:49 +0200 Subject: [PATCH 017/208] Removed timing code --- rtengine/iptransform.cc | 4 ---- 1 file changed, 4 deletions(-) diff --git a/rtengine/iptransform.cc b/rtengine/iptransform.cc index 1e739dac6..1a38d8e2f 100644 --- a/rtengine/iptransform.cc +++ b/rtengine/iptransform.cc @@ -31,9 +31,6 @@ #include "rtlensfun.h" #include "sleef.c" -#define BENCHMARK -#include "StopWatch.h" - using namespace std; namespace @@ -854,7 +851,6 @@ void ImProcFunctions::transformLuminanceOnly (Imagefloat* original, Imagefloat* void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, Imagefloat *transformed, int cx, int cy, int sx, int sy, int oW, int oH, int fW, int fH, const LensCorrection *pLCPMap) { - BENCHFUN // set up stuff, depending on the mode we are const bool enableLCPDist = pLCPMap && params->lensProf.useDist; const bool enableCA = highQuality && needsCA(); From a0c6c1569c1f7574952341e4be4a8a0859ba811a Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 16 Sep 2019 21:43:03 +0200 Subject: [PATCH 018/208] Fix indentations --- rtengine/dcraw.cc | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index 5e85b1e2e..5275c42c1 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -2441,9 +2441,9 @@ void CLASS hasselblad_load_raw() for (int col = 0; col < raw_width; col += 2) { for (int s = 0; s < tiff_samples * 2; s += 2) { int len[2]; - for (int c = 0; c < 2; ++c) { - len[c] = ph1_huff(jh.huff[0]); - } + for (int c = 0; c < 2; ++c) { + len[c] = ph1_huff(jh.huff[0]); + } for (int c = 0; c < 2; ++c) { diff[s + c] = hb_bits(len[c]); if ((diff[s + c] & (1 << (len[c] - 1))) == 0) { @@ -2455,15 +2455,15 @@ void CLASS hasselblad_load_raw() } } for (int s = col; s < col + 2; ++s) { - int pred; - if (col) { + int pred; + if (col) { pred = back[2][s - 2]; if (row > 1 && jh.psv == 11) { pred += back[0][s] / 2 - back[0][s - 2] / 2; } - } else { - pred = 0x8000 + load_flags; - } + } else { + pred = 0x8000 + load_flags; + } for (int c = 0; c < tiff_samples; ++c) { pred += diff[(s & 1) * tiff_samples + c]; const unsigned upix = pred >> sh & 0xffff; From 991fc94d89e08ce625256ca4a146d7151ae5c5fd Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 17 Sep 2019 15:11:12 +0200 Subject: [PATCH 019/208] Speedup for guided filter --- rtengine/guidedfilter.cc | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/rtengine/guidedfilter.cc b/rtengine/guidedfilter.cc index 0ebe6c172..bc7f64f05 100644 --- a/rtengine/guidedfilter.cc +++ b/rtengine/guidedfilter.cc @@ -207,9 +207,6 @@ void guidedFilter(const array2D &guide, const array2D &src, array2 apply(SUBMUL, b, a, meanI, meanp); DEBUG_DUMP(b); - meanI.free(); // frees w * h * 4 byte - meanp.free(); // frees w * h * 4 byte - array2D &meana = a; f_mean(meana, a, r1); DEBUG_DUMP(meana); @@ -218,18 +215,25 @@ void guidedFilter(const array2D &guide, const array2D &src, array2 f_mean(meanb, b, r1); DEBUG_DUMP(meanb); - blur_buf.resize(0); // frees w * h * 4 byte + const int Ws = meana.width(); + const int Hs = meana.height(); + const int Wd = q.width(); + const int Hd = q.height(); - array2D meanA(W, H); - f_upsample(meanA, meana); - DEBUG_DUMP(meanA); + float col_scale = float (Ws) / float (Wd); + float row_scale = float (Hs) / float (Hd); - array2D &meanB = q; - f_upsample(meanB, meanb); - DEBUG_DUMP(meanB); +#ifdef _OPENMP + #pragma omp parallel for if (multithread) +#endif - apply(ADDMUL, q, meanA, I, meanB); - DEBUG_DUMP(q); + for (int y = 0; y < Hd; ++y) { + float ymrs = y * row_scale; + + for (int x = 0; x < Wd; ++x) { + q[y][x] = getBilinearValue(meana, x * col_scale, ymrs) * I[y][x] + getBilinearValue(meanb, x * col_scale, ymrs); + } + } } } // namespace rtengine From c0aa982fdda7cef7edbf9ded52273a3e91936a7c Mon Sep 17 00:00:00 2001 From: rom9 <4711834+rom9@users.noreply.github.com> Date: Wed, 18 Sep 2019 21:32:35 +0200 Subject: [PATCH 020/208] Fixed sampling loop ranges in `channelsAvg`. It was effectively doubling `spotSize`, sampling an area of 64x64 instead of 32x32. --- rtengine/filmnegativeproc.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtengine/filmnegativeproc.cc b/rtengine/filmnegativeproc.cc index 1a7270b82..4293c6b2a 100644 --- a/rtengine/filmnegativeproc.cc +++ b/rtengine/filmnegativeproc.cc @@ -77,8 +77,8 @@ bool channelsAvg( } std::array pxCount = {}; // Per-channel sample counts - for (int c = spotPos.x - spotSize; c < spotPos.x + spotSize; ++c) { - for (int r = spotPos.y - spotSize; r < spotPos.y + spotSize; ++r) { + for (int c = x1; c < x2; ++c) { + for (int r = y1; r < y2; ++r) { const int ch = ri->getSensorType() == rtengine::ST_BAYER ? ri->FC(r,c) : ri->XTRANSFC(r,c); ++pxCount[ch]; From 3ab379ad0a3871f4cd8b1ce933dfa7a8d37b001b Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 19 Sep 2019 20:56:33 +0200 Subject: [PATCH 021/208] Dehaze: further speedup, #5456 --- rtengine/boxblur.h | 255 +++++++++++++++++++++++++++++++++++--- rtengine/guidedfilter.cc | 187 ++++++++++------------------ rtengine/ipdehaze.cc | 260 +++++++++++++++++++++------------------ 3 files changed, 442 insertions(+), 260 deletions(-) diff --git a/rtengine/boxblur.h b/rtengine/boxblur.h index da302964b..3020278b2 100644 --- a/rtengine/boxblur.h +++ b/rtengine/boxblur.h @@ -204,15 +204,15 @@ template void boxblur (T** src, A** dst, T* buffer, int radx, tempv = tempv / lenv; temp1v = temp1v / lenv; - STVFU( dst[0][col], tempv); - STVFU( dst[0][col + 4], temp1v); + STVFU(dst[0][col], tempv); + STVFU(dst[0][col + 4], temp1v); for (int row = 1; row <= rady; row++) { lenp1v = lenv + onev; tempv = (tempv * lenv + LVFU(temp[(row + rady) * W + col])) / lenp1v; temp1v = (temp1v * lenv + LVFU(temp[(row + rady) * W + col + 4])) / lenp1v; - STVFU( dst[row][col], tempv); - STVFU( dst[row][col + 4], temp1v); + STVFU(dst[row][col], tempv); + STVFU(dst[row][col + 4], temp1v); lenv = lenp1v; } @@ -221,16 +221,16 @@ template void boxblur (T** src, A** dst, T* buffer, int radx, for (int row = rady + 1; row < H - rady; row++) { tempv = tempv + (LVFU(temp[(row + rady) * W + col]) - LVFU(temp[(row - rady - 1) * W + col])) * rlenv ; temp1v = temp1v + (LVFU(temp[(row + rady) * W + col + 4]) - LVFU(temp[(row - rady - 1) * W + col + 4])) * rlenv ; - STVFU( dst[row][col], tempv); - STVFU( dst[row][col + 4], temp1v); + STVFU(dst[row][col], tempv); + STVFU(dst[row][col + 4], temp1v); } for (int row = H - rady; row < H; row++) { lenm1v = lenv - onev; tempv = (tempv * lenv - LVFU(temp[(row - rady - 1) * W + col])) / lenm1v; temp1v = (temp1v * lenv - LVFU(temp[(row - rady - 1) * W + col + 4])) / lenm1v; - STVFU( dst[row][col], tempv); - STVFU( dst[row][col + 4], temp1v); + STVFU(dst[row][col], tempv); + STVFU(dst[row][col + 4], temp1v); lenv = lenm1v; } } @@ -312,6 +312,221 @@ template void boxblur (T** src, A** dst, T* buffer, int radx, } +inline void boxblur (float** src, float** dst, int radius, int W, int H, bool multiThread) +{ + //box blur using rowbuffers and linebuffers instead of a full size buffer + + if (radius == 0) { + if (src != dst) { +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + + for (int row = 0; row < H; row++) { + for (int col = 0; col < W; col++) { + dst[row][col] = src[row][col]; + } + } + } + return; + } + + constexpr int numCols = 8; // process numCols columns at once for better usage of L1 cpu cache +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + float* const buffer = new float[std::max(W, 8 * H)]; + //horizontal blur + float* const lineBuffer = buffer; +#ifdef _OPENMP + #pragma omp for +#endif + for (int row = 0; row < H; row++) { + float len = radius + 1; + float tempval = src[row][0]; + lineBuffer[0] = tempval; + for (int j = 1; j <= radius; j++) { + tempval += src[row][j]; + } + + tempval /= len; + dst[row][0] = tempval; + + for (int col = 1; col <= radius; col++) { + lineBuffer[col] = src[row][col]; + dst[row][col] = tempval = (tempval * len + src[row][col + radius]) / (len + 1); + len ++; + } + + for (int col = radius + 1; col < W - radius; col++) { + lineBuffer[col] = src[row][col]; + dst[row][col] = tempval = tempval + (src[row][col + radius] - lineBuffer[col - radius - 1]) / len; + } + + for (int col = W - radius; col < W; col++) { + dst[row][col] = tempval = (tempval * len - lineBuffer[col - radius - 1]) / (len - 1); + len --; + } + } + + //vertical blur +#ifdef __SSE2__ + vfloat (* const rowBuffer)[2] = (vfloat(*)[2]) buffer; + vfloat leninitv = F2V(radius + 1); + vfloat onev = F2V(1.f); + vfloat tempv, temp1v, lenv, lenp1v, lenm1v, rlenv; + +#ifdef _OPENMP + #pragma omp for nowait +#endif + + for (int col = 0; col < W - 7; col += 8) { + lenv = leninitv; + tempv = LVFU(dst[0][col]); + temp1v = LVFU(dst[0][col + 4]); + rowBuffer[0][0] = tempv; + rowBuffer[0][1] = temp1v; + + for (int i = 1; i <= radius; i++) { + tempv = tempv + LVFU(dst[i][col]); + temp1v = temp1v + LVFU(dst[i][col + 4]); + } + + tempv = tempv / lenv; + temp1v = temp1v / lenv; + STVFU(dst[0][col], tempv); + STVFU(dst[0][col + 4], temp1v); + + for (int row = 1; row <= radius; row++) { + rowBuffer[row][0] = LVFU(dst[row][col]); + rowBuffer[row][1] = LVFU(dst[row][col + 4]); + lenp1v = lenv + onev; + tempv = (tempv * lenv + LVFU(dst[row + radius][col])) / lenp1v; + temp1v = (temp1v * lenv + LVFU(dst[row + radius][col + 4])) / lenp1v; + STVFU(dst[row][col], tempv); + STVFU(dst[row][col + 4], temp1v); + lenv = lenp1v; + } + + rlenv = onev / lenv; + + for (int row = radius + 1; row < H - radius; row++) { + rowBuffer[row][0] = LVFU(dst[row][col]); + rowBuffer[row][1] = LVFU(dst[row][col + 4]); + tempv = tempv + (LVFU(dst[row + radius][col]) - rowBuffer[row - radius - 1][0]) * rlenv ; + temp1v = temp1v + (LVFU(dst[row + radius][col + 4]) - rowBuffer[row - radius - 1][1]) * rlenv ; + STVFU(dst[row][col], tempv); + STVFU(dst[row][col + 4], temp1v); + } + + for (int row = H - radius; row < H; row++) { + lenm1v = lenv - onev; + tempv = (tempv * lenv - rowBuffer[row - radius - 1][0]) / lenm1v; + temp1v = (temp1v * lenv - rowBuffer[row - radius - 1][1]) / lenm1v; + STVFU(dst[row][col], tempv); + STVFU(dst[row][col + 4], temp1v); + lenv = lenm1v; + } + } + +#else + float (* const rowBuffer)[8] = (float(*)[8]) buffer; +#ifdef _OPENMP + #pragma omp for nowait +#endif + + for (int col = 0; col < W - numCols + 1; col += 8) { + float len = radius + 1; + + for(int k = 0; k < numCols; k++) { + rowBuffer[0][k] = dst[0][col + k]; + } + + for (int i = 1; i <= radius; i++) { + for(int k = 0; k < numCols; k++) { + dst[0][col + k] += dst[i][col + k]; + } + } + + for(int k = 0; k < numCols; k++) { + dst[0][col + k] /= len; + } + + for (int row = 1; row <= radius; row++) { + for(int k = 0; k < numCols; k++) { + rowBuffer[row][k] = dst[row][col + k]; + dst[row][col + k] = (dst[row - 1][col + k] * len + dst[row + radius][col + k]) / (len + 1); + } + + len ++; + } + + for (int row = radius + 1; row < H - radius; row++) { + for(int k = 0; k < numCols; k++) { + rowBuffer[row][k] = dst[row][col + k]; + dst[row][col + k] = dst[row - 1][col + k] + (dst[row + radius][col + k] - rowBuffer[row - radius - 1][k]) / len; + } + } + + for (int row = H - radius; row < H; row++) { + for(int k = 0; k < numCols; k++) { + dst[row][col + k] = (dst[row - 1][col + k] * len - rowBuffer[row - radius - 1][k]) / (len - 1); + } + + len --; + } + } + +#endif + //vertical blur, remaining columns +#ifdef _OPENMP + #pragma omp single +#endif + { + const int remaining = W % numCols; + if (remaining > 0) { + float (* const rowBuffer)[8] = (float(*)[8]) buffer; + const int col = W - remaining; + + float len = radius + 1; + for(int k = 0; k < remaining; k++) { + rowBuffer[0][k] = dst[0][col + k]; + } + for (int i = 1; i <= radius; i++) { + for(int k = 0; k < remaining; k++) { + dst[0][col + k] += dst[i][col + k]; + } + } + for(int k = 0; k < remaining; k++) { + dst[0][col + k] /= len; + } + for (int row = 1; row <= radius; row++) { + for(int k = 0; k < remaining; k++) { + rowBuffer[row][k] = dst[row][col + k]; + dst[row][col + k] = (dst[(row - 1)][col + k] * len + dst[row + radius][col + k]) / (len + 1); + len ++; + } + } + const float rlen = 1.f / len; + for (int row = radius + 1; row < H - radius; row++) { + for(int k = 0; k < remaining; k++) { + rowBuffer[row][k] = dst[row][col + k]; + dst[row][col + k] = dst[(row - 1)][col + k] + (dst[row + radius][col + k] - rowBuffer[row - radius - 1][k]) * rlen; + } + } + for (int row = H - radius; row < H; row++) { + for(int k = 0; k < remaining; k++) { + dst[row][col + k] = (dst[(row - 1)][col + k] * len - rowBuffer[row - radius - 1][k]) / (len - 1); + len --; + } + } + } + } + delete [] buffer; + } +} + template void boxblur (T* src, A* dst, A* buffer, int radx, int rady, int W, int H) { //box blur image; box range = (radx,rady) i.e. box size is (2*radx+1)x(2*rady+1) @@ -382,15 +597,15 @@ template void boxblur (T* src, A* dst, A* buffer, int radx, in tempv = tempv / lenv; temp1v = temp1v / lenv; - STVFU( dst[0 * W + col], tempv); - STVFU( dst[0 * W + col + 4], temp1v); + STVFU(dst[0 * W + col], tempv); + STVFU(dst[0 * W + col + 4], temp1v); for (int row = 1; row <= rady; row++) { lenp1v = lenv + onev; tempv = (tempv * lenv + LVFU(temp[(row + rady) * W + col])) / lenp1v; temp1v = (temp1v * lenv + LVFU(temp[(row + rady) * W + col + 4])) / lenp1v; - STVFU( dst[row * W + col], tempv); - STVFU( dst[row * W + col + 4], temp1v); + STVFU(dst[row * W + col], tempv); + STVFU(dst[row * W + col + 4], temp1v); lenv = lenp1v; } @@ -399,16 +614,16 @@ template void boxblur (T* src, A* dst, A* buffer, int radx, in for (int row = rady + 1; row < H - rady; row++) { tempv = tempv + (LVFU(temp[(row + rady) * W + col]) - LVFU(temp[(row - rady - 1) * W + col])) * rlenv ; temp1v = temp1v + (LVFU(temp[(row + rady) * W + col + 4]) - LVFU(temp[(row - rady - 1) * W + col + 4])) * rlenv ; - STVFU( dst[row * W + col], tempv); - STVFU( dst[row * W + col + 4], temp1v); + STVFU(dst[row * W + col], tempv); + STVFU(dst[row * W + col + 4], temp1v); } for (int row = H - rady; row < H; row++) { lenm1v = lenv - onev; tempv = (tempv * lenv - LVFU(temp[(row - rady - 1) * W + col])) / lenm1v; temp1v = (temp1v * lenv - LVFU(temp[(row - rady - 1) * W + col + 4])) / lenm1v; - STVFU( dst[row * W + col], tempv); - STVFU( dst[row * W + col + 4], temp1v); + STVFU(dst[row * W + col], tempv); + STVFU(dst[row * W + col + 4], temp1v); lenv = lenm1v; } } @@ -422,12 +637,12 @@ template void boxblur (T* src, A* dst, A* buffer, int radx, in } tempv = tempv / lenv; - STVFU( dst[0 * W + col], tempv); + STVFU(dst[0 * W + col], tempv); for (int row = 1; row <= rady; row++) { lenp1v = lenv + onev; tempv = (tempv * lenv + LVFU(temp[(row + rady) * W + col])) / lenp1v; - STVFU( dst[row * W + col], tempv); + STVFU(dst[row * W + col], tempv); lenv = lenp1v; } @@ -435,13 +650,13 @@ template void boxblur (T* src, A* dst, A* buffer, int radx, in for (int row = rady + 1; row < H - rady; row++) { tempv = tempv + (LVFU(temp[(row + rady) * W + col]) - LVFU(temp[(row - rady - 1) * W + col])) * rlenv ; - STVFU( dst[row * W + col], tempv); + STVFU(dst[row * W + col], tempv); } for (int row = H - rady; row < H; row++) { lenm1v = lenv - onev; tempv = (tempv * lenv - LVFU(temp[(row - rady - 1) * W + col])) / lenm1v; - STVFU( dst[row * W + col], tempv); + STVFU(dst[row * W + col], tempv); lenv = lenm1v; } } diff --git a/rtengine/guidedfilter.cc b/rtengine/guidedfilter.cc index bc7f64f05..8d19fc7a5 100644 --- a/rtengine/guidedfilter.cc +++ b/rtengine/guidedfilter.cc @@ -3,6 +3,7 @@ * This file is part of RawTherapee. * * Copyright (c) 2018 Alberto Griggio + * Optimized 2019 Ingo Weyrich * * RawTherapee is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,9 +17,9 @@ * * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . - */ +*/ -/** +/* * This is a Fast Guided Filter implementation, derived directly from the * pseudo-code of the paper: * @@ -26,32 +27,16 @@ * by Kaiming He, Jian Sun * * available at https://arxiv.org/abs/1505.00996 - */ +*/ #include "guidedfilter.h" #include "boxblur.h" #include "rescale.h" #include "imagefloat.h" - +#define BENCHMARK +#include "StopWatch.h" namespace rtengine { -#if 0 -# define DEBUG_DUMP(arr) \ - do { \ - Imagefloat im(arr.width(), arr.height()); \ - const char *out = "/tmp/" #arr ".tif"; \ - for (int y = 0; y < im.getHeight(); ++y) { \ - for (int x = 0; x < im.getWidth(); ++x) { \ - im.r(y, x) = im.g(y, x) = im.b(y, x) = arr[y][x] * 65535.f; \ - } \ - } \ - im.saveTIFF(out, 16); \ - } while (false) -#else -# define DEBUG_DUMP(arr) -#endif - - namespace { int calculate_subsampling(int w, int h, int r) @@ -78,15 +63,7 @@ int calculate_subsampling(int w, int h, int r) void guidedFilter(const array2D &guide, const array2D &src, array2D &dst, int r, float epsilon, bool multithread, int subsampling) { - - const int W = src.width(); - const int H = src.height(); - - if (subsampling <= 0) { - subsampling = calculate_subsampling(W, H, r); - } - - enum Op { MUL, DIVEPSILON, ADD, SUB, ADDMUL, SUBMUL }; + enum Op {MUL, DIVEPSILON, SUBMUL}; const auto apply = [=](Op op, array2D &res, const array2D &a, const array2D &b, const array2D &c=array2D()) -> void @@ -99,139 +76,107 @@ void guidedFilter(const array2D &guide, const array2D &src, array2 #endif for (int y = 0; y < h; ++y) { for (int x = 0; x < w; ++x) { - float r; - float aa = a[y][x]; - float bb = b[y][x]; switch (op) { - case MUL: - r = aa * bb; - break; - case DIVEPSILON: - r = aa / (bb + epsilon); - break; - case ADD: - r = aa + bb; - break; - case SUB: - r = aa - bb; - break; - case ADDMUL: - r = aa * bb + c[y][x]; - break; - case SUBMUL: - r = c[y][x] - (aa * bb); - break; - default: - assert(false); - r = 0; - break; + case MUL: + res[y][x] = a[y][x] * b[y][x]; + break; + case DIVEPSILON: + res[y][x] = a[y][x] / (b[y][x] + epsilon); // note: the value of epsilon intentionally has an impact on the result. It is not only to avoid divisions by zero + break; + case SUBMUL: + res[y][x] = c[y][x] - (a[y][x] * b[y][x]); + break; + default: + assert(false); + res[y][x] = 0; + break; } - res[y][x] = r; } } }; - // use the terminology of the paper (Algorithm 2) - const array2D &I = guide; - const array2D &p = src; - array2D &q = dst; - const auto f_subsample = [=](array2D &d, const array2D &s) -> void { rescaleBilinear(s, d, multithread); }; - const auto f_upsample = f_subsample; - - const size_t w = W / subsampling; - const size_t h = H / subsampling; - - AlignedBuffer blur_buf(w * h); const auto f_mean = [&](array2D &d, array2D &s, int rad) -> void { rad = LIM(rad, 0, (min(s.width(), s.height()) - 1) / 2 - 1); - float **src = s; - float **dst = d; -#ifdef _OPENMP - #pragma omp parallel if (multithread) -#endif - boxblur(src, dst, blur_buf.data, rad, rad, s.width(), s.height()); + boxblur(s, d, rad, s.width(), s.height(), multithread); }; + const int W = src.width(); + const int H = src.height(); + + if (subsampling <= 0) { + subsampling = calculate_subsampling(W, H, r); + } + + const size_t w = W / subsampling; + const size_t h = H / subsampling; + const float r1 = float(r) / subsampling; + array2D I1(w, h); array2D p1(w, h); - f_subsample(I1, I); - f_subsample(p1, p); + f_subsample(I1, guide); - DEBUG_DUMP(I); - DEBUG_DUMP(p); - DEBUG_DUMP(I1); - DEBUG_DUMP(p1); + if (&guide == &src) { + f_mean(p1, I1, r1); - float r1 = float(r) / subsampling; + apply(MUL, I1, I1, I1); // I1 = I1 * I1 - array2D meanI(w, h); - f_mean(meanI, I1, r1); - DEBUG_DUMP(meanI); + f_mean(I1, I1, r1); - array2D meanp(w, h); - f_mean(meanp, p1, r1); - DEBUG_DUMP(meanp); + apply(SUBMUL, I1, p1, p1, I1); // I1 = I1 - p1 * p1 + apply(DIVEPSILON, I1, I1, I1); // I1 = I1 / (I1 + epsilon) + apply(SUBMUL, p1, I1, p1, p1); // p1 = p1 - I1 * p1 - array2D &corrIp = p1; - apply(MUL, corrIp, I1, p1); - f_mean(corrIp, corrIp, r1); - DEBUG_DUMP(corrIp); + } else { + f_subsample(p1, src); - array2D &corrI = I1; - apply(MUL, corrI, I1, I1); - f_mean(corrI, corrI, r1); - DEBUG_DUMP(corrI); + array2D meanI(w, h); + f_mean(meanI, I1, r1); - array2D &varI = corrI; - apply(SUBMUL, varI, meanI, meanI, corrI); - DEBUG_DUMP(varI); + array2D meanp(w, h); + f_mean(meanp, p1, r1); - array2D &covIp = corrIp; - apply(SUBMUL, covIp, meanI, meanp, corrIp); - DEBUG_DUMP(covIp); + apply(MUL, p1, I1, p1); - array2D &a = varI; - apply(DIVEPSILON, a, covIp, varI); - DEBUG_DUMP(a); + f_mean(p1, p1, r1); - array2D &b = covIp; - apply(SUBMUL, b, a, meanI, meanp); - DEBUG_DUMP(b); + apply(MUL, I1, I1, I1); - array2D &meana = a; - f_mean(meana, a, r1); - DEBUG_DUMP(meana); + f_mean(I1, I1, r1); - array2D &meanb = b; - f_mean(meanb, b, r1); - DEBUG_DUMP(meanb); + apply(SUBMUL, I1, meanI, meanI, I1); + apply(SUBMUL, p1, meanI, meanp, p1); + apply(DIVEPSILON, I1, p1, I1); + apply(SUBMUL, p1, I1, meanI, meanp); + } - const int Ws = meana.width(); - const int Hs = meana.height(); - const int Wd = q.width(); - const int Hd = q.height(); + f_mean(I1, I1, r1); + f_mean(p1, p1, r1); - float col_scale = float (Ws) / float (Wd); - float row_scale = float (Hs) / float (Hd); + const int Ws = I1.width(); + const int Hs = I1.height(); + const int Wd = dst.width(); + const int Hd = dst.height(); + + const float col_scale = static_cast(Ws) / static_cast(Wd); + const float row_scale = static_cast(Hs) / static_cast(Hd); #ifdef _OPENMP #pragma omp parallel for if (multithread) #endif for (int y = 0; y < Hd; ++y) { - float ymrs = y * row_scale; - + const float ymrs = y * row_scale; for (int x = 0; x < Wd; ++x) { - q[y][x] = getBilinearValue(meana, x * col_scale, ymrs) * I[y][x] + getBilinearValue(meanb, x * col_scale, ymrs); + dst[y][x] = getBilinearValue(I1, x * col_scale, ymrs) * guide[y][x] + getBilinearValue(p1, x * col_scale, ymrs); } } } diff --git a/rtengine/ipdehaze.cc b/rtengine/ipdehaze.cc index 60d4cb9ff..68af84970 100644 --- a/rtengine/ipdehaze.cc +++ b/rtengine/ipdehaze.cc @@ -35,7 +35,10 @@ #include "improcfun.h" #include "procparams.h" #include "rt_algo.h" +#include "rt_algo.h" #include "rt_math.h" +#define BENCHMARK +#include "StopWatch.h" extern Options options; @@ -43,24 +46,7 @@ namespace rtengine { namespace { -#if 0 -# define DEBUG_DUMP(arr) \ - do { \ - Imagefloat im(arr.width(), arr.height()); \ - const char *out = "/tmp/" #arr ".tif"; \ - for (int y = 0; y < im.getHeight(); ++y) { \ - for (int x = 0; x < im.getWidth(); ++x) { \ - im.r(y, x) = im.g(y, x) = im.b(y, x) = arr[y][x] * 65535.f; \ - } \ - } \ - im.saveTIFF(out, 16); \ - } while (false) -#else -# define DEBUG_DUMP(arr) -#endif - - -int get_dark_channel(const array2D &R, const array2D &G, const array2D &B, array2D &dst, int patchsize, const float ambient[3], bool clip, bool multithread) +int get_dark_channel(const array2D &R, const array2D &G, const array2D &B, array2D &dst, int patchsize, const float ambient[3], bool clip, bool multithread, float strength) { const int W = R.width(); const int H = R.height(); @@ -73,22 +59,12 @@ int get_dark_channel(const array2D &R, const array2D &G, const arr for (int x = 0; x < W; x += patchsize) { float val = RT_INFINITY_F; const int pW = min(x + patchsize, W); - for (int yy = y; yy < pH; ++yy) { - for (int xx = x; xx < pW; ++xx) { - float r = R[yy][xx]; - float g = G[yy][xx]; - float b = B[yy][xx]; - if (ambient) { - r /= ambient[0]; - g /= ambient[1]; - b /= ambient[2]; - } - val = min(val, r, g, b); + for (int xx = x; xx < pW; ++xx) { + for (int yy = y; yy < pH; ++yy) { + val = min(val, R[yy][xx] / ambient[0], G[yy][xx] / ambient[1], B[yy][xx] / ambient[2]); } } - if (clip) { - val = LIM01(val); - } + val = 1.f - strength * LIM01(val); for (int yy = y; yy < pH; ++yy) { std::fill(dst[yy] + x, dst[yy] + pW, val); } @@ -98,41 +74,59 @@ int get_dark_channel(const array2D &R, const array2D &G, const arr return (W / patchsize + ((W % patchsize) > 0)) * (H / patchsize + ((H % patchsize) > 0)); } +int get_dark_channel_downsized(const array2D &R, const array2D &G, const array2D &B, array2D &dst, int patchsize, bool multithread) +{ + const int W = R.width(); + const int H = R.height(); + +#ifdef _OPENMP + #pragma omp parallel for if (multithread) +#endif + for (int y = 0; y < H; y += patchsize) { + int yy = y / patchsize; + const int pH = min(y + patchsize, H); + for (int x = 0, xx = 0; x < W; x += patchsize, ++xx) { + float val = RT_INFINITY_F; + const int pW = min(x + patchsize, W); + for (int xp = x; xp < pW; ++xp) { + for (int yp = y; yp < pH; ++yp) { + val = min(val, R[yp][xp], G[yp][xp], B[yp][xp]); + } + } + dst[yy][xx] = val; + } + } + + return (W / patchsize + ((W % patchsize) > 0)) * (H / patchsize + ((H % patchsize) > 0)); +} + float estimate_ambient_light(const array2D &R, const array2D &G, const array2D &B, const array2D &dark, int patchsize, int npatches, float ambient[3]) { const int W = R.width(); const int H = R.height(); - const auto get_percentile = - [](std::priority_queue &q, float prcnt) -> float - { - size_t n = LIM(q.size() * prcnt, 1, q.size()); - while (q.size() > n) { - q.pop(); - } - return q.top(); - }; - float darklim = RT_INFINITY_F; { - std::priority_queue p; - for (int y = 0; y < H; y += patchsize) { - for (int x = 0; x < W; x += patchsize) { - if (!OOG(dark[y][x], 1.f - 1e-5f)) { - p.push(dark[y][x]); + std::vector p; + for (int y = 0, yy = 0; y < H; y += patchsize, ++yy) { + for (int x = 0, xx = 0; x < W; x += patchsize, ++xx) { + if (!OOG(dark[yy][xx], 1.f - 1e-5f)) { + p.push_back(dark[yy][xx]); } } } - darklim = get_percentile(p, 0.95); + const int pos = p.size() * 0.95; + std::nth_element(p.begin(), p.begin() + pos, p.end()); + darklim = p[pos]; } std::vector> patches; patches.reserve(npatches); - for (int y = 0; y < H; y += patchsize) { - for (int x = 0; x < W; x += patchsize) { - if (dark[y][x] >= darklim && !OOG(dark[y][x], 1.f)) { + for (int y = 0, yy = 0; y < H; y += patchsize, ++yy) { + for (int x = 0, xx = 0; x < W; x += patchsize, ++xx) { + if (dark[yy][xx] >= darklim && !OOG(dark[yy][xx], 1.f)) { patches.push_back(std::make_pair(x, y)); } } @@ -145,33 +139,38 @@ float estimate_ambient_light(const array2D &R, const array2D &G, c float bright_lim = RT_INFINITY_F; { - std::priority_queue l; + std::vector l; + l.reserve(patches.size() * patchsize * patchsize); - for (auto &p : patches) { - const int pW = min(p.first+patchsize, W); - const int pH = min(p.second+patchsize, H); + for (const auto &p : patches) { + const int pW = min(p.first + patchsize, W); + const int pH = min(p.second + patchsize, H); for (int y = p.second; y < pH; ++y) { for (int x = p.first; x < pW; ++x) { - l.push(R[y][x] + G[y][x] + B[y][x]); + l.push_back(R[y][x] + G[y][x] + B[y][x]); } } } - - bright_lim = get_percentile(l, 0.95); + const int pos = l.size() * 0.95; + std::nth_element(l.begin(), l.begin() + pos, l.end()); + bright_lim = l[pos]; } double rr = 0, gg = 0, bb = 0; int n = 0; - for (auto &p : patches) { - const int pW = min(p.first+patchsize, W); - const int pH = min(p.second+patchsize, H); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic) reduction(+:rr,gg,bb,n) +#endif + for (const auto &p : patches) { + const int pW = min(p.first + patchsize, W); + const int pH = min(p.second + patchsize, H); for (int y = p.second; y < pH; ++y) { for (int x = p.first; x < pW; ++x) { - float r = R[y][x]; - float g = G[y][x]; - float b = B[y][x]; + const float r = R[y][x]; + const float g = G[y][x]; + const float b = B[y][x]; if (r + g + b >= bright_lim) { rr += r; gg += g; @@ -181,6 +180,7 @@ float estimate_ambient_light(const array2D &R, const array2D &G, c } } } + n = std::max(n, 1); ambient[0] = rr / n; ambient[1] = gg / n; @@ -211,12 +211,12 @@ void extract_channels(Imagefloat *img, array2D &r, array2D &g, arr void ImProcFunctions::dehaze(Imagefloat *img) { - if (!params->dehaze.enabled) { + if (!params->dehaze.enabled || params->dehaze.strength == 0.0) { return; } - +BENCHFUN img->normalizeFloatTo1(); - + const int W = img->getWidth(); const int H = img->getHeight(); const float strength = LIM01(float(params->dehaze.strength) / 100.f * 0.9f); @@ -229,21 +229,19 @@ void ImProcFunctions::dehaze(Imagefloat *img) int patchsize = max(int(5 / scale), 2); float ambient[3]; - array2D &t_tilde = dark; float max_t = 0.f; { - int npatches = 0; array2D R(W, H); array2D G(W, H); array2D B(W, H); extract_channels(img, R, G, B, patchsize, 1e-1, multiThread); - - patchsize = max(max(W, H) / 600, 2); - npatches = get_dark_channel(R, G, B, dark, patchsize, nullptr, false, multiThread); - DEBUG_DUMP(dark); - max_t = estimate_ambient_light(R, G, B, dark, patchsize, npatches, ambient); + patchsize = max(max(W, H) / 600, 2); + array2D darkDownsized(W / patchsize + 1, H / patchsize + 1); + const int npatches = get_dark_channel_downsized(R, G, B, darkDownsized, patchsize, multiThread); + + max_t = estimate_ambient_light(R, G, B, darkDownsized, patchsize, npatches, ambient); if (options.rtSettings.verbose) { std::cout << "dehaze: ambient light is " @@ -251,78 +249,102 @@ void ImProcFunctions::dehaze(Imagefloat *img) << std::endl; } - get_dark_channel(R, G, B, dark, patchsize, ambient, true, multiThread); - } - - if (min(ambient[0], ambient[1], ambient[2]) < 0.01f) { - if (options.rtSettings.verbose) { - std::cout << "dehaze: no haze detected" << std::endl; + if (min(ambient[0], ambient[1], ambient[2]) < 0.01f) { + if (options.rtSettings.verbose) { + std::cout << "dehaze: no haze detected" << std::endl; + } + img->normalizeFloatTo65535(); + return; // probably no haze at all } - img->normalizeFloatTo65535(); - return; // probably no haze at all - } - DEBUG_DUMP(t_tilde); - -#ifdef _OPENMP - #pragma omp parallel for if (multiThread) -#endif - for (int y = 0; y < H; ++y) { - for (int x = 0; x < W; ++x) { - dark[y][x] = 1.f - strength * dark[y][x]; - } + get_dark_channel(R, G, B, dark, patchsize, ambient, true, multiThread, strength); } const int radius = patchsize * 4; - const float epsilon = 1e-5; - array2D &t = t_tilde; + constexpr float epsilon = 1e-5f; { array2D guideB(W, H, img->b.ptrs, ARRAY2D_BYREFERENCE); - guidedFilter(guideB, t_tilde, t, radius, epsilon, multiThread); + guidedFilter(guideB, dark, dark, radius, epsilon, multiThread); } - DEBUG_DUMP(t); - if (options.rtSettings.verbose) { std::cout << "dehaze: max distance is " << max_t << std::endl; } - float depth = -float(params->dehaze.depth) / 100.f; + const float depth = -float(params->dehaze.depth) / 100.f; const float t0 = max(1e-3f, std::exp(depth * max_t)); const float teps = 1e-3f; #ifdef _OPENMP #pragma omp parallel for if (multiThread) #endif for (int y = 0; y < H; ++y) { - for (int x = 0; x < W; ++x) { + int x = 0; +#ifdef __SSE2__ + const vfloat onev = F2V(1.f); + const vfloat ambient0v = F2V(ambient[0]); + const vfloat ambient1v = F2V(ambient[1]); + const vfloat ambient2v = F2V(ambient[2]); + const vfloat t0v = F2V(t0); + const vfloat tepsv = F2V(teps); + const vfloat c65535v = F2V(65535.f); + for (; x < W - 3; x += 4) { // ensure that the transmission is such that to avoid clipping... - float rgb[3] = { img->r(y, x), img->g(y, x), img->b(y, x) }; + vfloat r = LVFU(img->r(y, x)); + vfloat g = LVFU(img->g(y, x)); + vfloat b = LVFU(img->b(y, x)); // ... t >= tl to avoid negative values - float tl = 1.f - min(rgb[0]/ambient[0], rgb[1]/ambient[1], rgb[2]/ambient[2]); + const vfloat tlv = onev - vminf(r / ambient0v, vminf(g / ambient1v, b / ambient2v)); // ... t >= tu to avoid values > 1 - float tu = t0 - teps; - for (int c = 0; c < 3; ++c) { - if (ambient[c] < 1) { - tu = max(tu, (rgb[c] - ambient[c])/(1.f - ambient[c])); - } - } - float mt = max(t[y][x], t0, tl + teps, tu + teps); - if (params->dehaze.showDepthMap) { - img->r(y, x) = img->g(y, x) = img->b(y, x) = LIM01(1.f - mt); - } else { - float r = (rgb[0] - ambient[0]) / mt + ambient[0]; - float g = (rgb[1] - ambient[1]) / mt + ambient[1]; - float b = (rgb[2] - ambient[2]) / mt + ambient[2]; + r -= ambient0v; + g -= ambient1v; + b -= ambient2v; - img->r(y, x) = r; - img->g(y, x) = g; - img->b(y, x) = b; + vfloat tuv = t0v - tepsv; + tuv = vself(vmaskf_lt(ambient0v, onev), vmaxf(tuv, r / (onev - ambient0v)), tuv); + tuv = vself(vmaskf_lt(ambient1v, onev), vmaxf(tuv, g / (onev - ambient1v)), tuv); + tuv = vself(vmaskf_lt(ambient2v, onev), vmaxf(tuv, b / (onev - ambient2v)), tuv); + + const vfloat mtv = vmaxf(LVFU(dark[y][x]), vmaxf(tlv, tuv) + tepsv); + if (params->dehaze.showDepthMap) { + const vfloat valv = vclampf(onev - mtv, ZEROV, onev) * c65535v; + STVFU(img->r(y, x), valv); + STVFU(img->g(y, x), valv); + STVFU(img->b(y, x), valv); + } else { + STVFU(img->r(y, x), (r / mtv + ambient0v) * c65535v); + STVFU(img->g(y, x), (g / mtv + ambient1v) * c65535v); + STVFU(img->b(y, x), (b / mtv + ambient2v) * c65535v); + } + } +#endif + for (; x < W; ++x) { + // ensure that the transmission is such that to avoid clipping... + float r = img->r(y, x); + float g = img->g(y, x); + float b = img->b(y, x); + // ... t >= tl to avoid negative values + const float tl = 1.f - min(r / ambient[0], g / ambient[1], b / ambient[2]); + // ... t >= tu to avoid values > 1 + r -= ambient[0]; + g -= ambient[1]; + b -= ambient[2]; + + float tu = t0 - teps; + tu = ambient[0] < 1.f ? max(tu, r / (1.f - ambient[0])) : tu; + tu = ambient[1] < 1.f ? max(tu, g / (1.f - ambient[1])) : tu; + tu = ambient[2] < 1.f ? max(tu, b / (1.f - ambient[2])) : tu; + + const float mt = max(dark[y][x], tl + teps, tu + teps); + if (params->dehaze.showDepthMap) { + img->r(y, x) = img->g(y, x) = img->b(y, x) = LIM01(1.f - mt) * 65535.f; + } else { + img->r(y, x) = (r / mt + ambient[0]) * 65535.f; + img->g(y, x) = (g / mt + ambient[1]) * 65535.f; + img->b(y, x) = (b / mt + ambient[2]) * 65535.f; } } } - - img->normalizeFloatTo65535(); } From 3981e285b9bda62d3126ad9704f58bf232ba67e0 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 19 Sep 2019 22:06:41 +0200 Subject: [PATCH 022/208] dehaze: fix broken build on gcc < 9.x, #5456 --- rtengine/ipdehaze.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rtengine/ipdehaze.cc b/rtengine/ipdehaze.cc index 68af84970..cf333a5d5 100644 --- a/rtengine/ipdehaze.cc +++ b/rtengine/ipdehaze.cc @@ -162,7 +162,8 @@ float estimate_ambient_light(const array2D &R, const array2D &G, c #ifdef _OPENMP #pragma omp parallel for schedule(dynamic) reduction(+:rr,gg,bb,n) #endif - for (const auto &p : patches) { + for (size_t i = 0; i < patches.size(); ++i) { + const auto &p = patches[i]; const int pW = min(p.first + patchsize, W); const int pH = min(p.second + patchsize, H); From 7d5ec6c0678f5a5d8a0eabccc197b51128949e3b Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 19 Sep 2019 22:21:45 +0200 Subject: [PATCH 023/208] Fix bug at right border in new boxblur function, #5456 --- rtengine/boxblur.h | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/rtengine/boxblur.h b/rtengine/boxblur.h index 3020278b2..5cc7430e2 100644 --- a/rtengine/boxblur.h +++ b/rtengine/boxblur.h @@ -26,6 +26,7 @@ #include "alignedbuffer.h" #include "rt_math.h" #include "opthelper.h" +#include "StopWatch.h" namespace rtengine @@ -485,41 +486,42 @@ inline void boxblur (float** src, float** dst, int radius, int W, int H, bool mu #endif { const int remaining = W % numCols; + if (remaining > 0) { float (* const rowBuffer)[8] = (float(*)[8]) buffer; const int col = W - remaining; float len = radius + 1; - for(int k = 0; k < remaining; k++) { + for(int k = 0; k < remaining; ++k) { rowBuffer[0][k] = dst[0][col + k]; } - for (int i = 1; i <= radius; i++) { - for(int k = 0; k < remaining; k++) { - dst[0][col + k] += dst[i][col + k]; + for (int row = 1; row <= radius; ++row) { + for(int k = 0; k < remaining; ++k) { + dst[0][col + k] += dst[row][col + k]; } } - for(int k = 0; k < remaining; k++) { + for(int k = 0; k < remaining; ++k) { dst[0][col + k] /= len; } - for (int row = 1; row <= radius; row++) { - for(int k = 0; k < remaining; k++) { + for (int row = 1; row <= radius; ++row) { + for(int k = 0; k < remaining; ++k) { rowBuffer[row][k] = dst[row][col + k]; - dst[row][col + k] = (dst[(row - 1)][col + k] * len + dst[row + radius][col + k]) / (len + 1); - len ++; + dst[row][col + k] = (dst[row - 1][col + k] * len + dst[row + radius][col + k]) / (len + 1); } + len ++; } const float rlen = 1.f / len; - for (int row = radius + 1; row < H - radius; row++) { - for(int k = 0; k < remaining; k++) { + for (int row = radius + 1; row < H - radius; ++row) { + for(int k = 0; k < remaining; ++k) { rowBuffer[row][k] = dst[row][col + k]; - dst[row][col + k] = dst[(row - 1)][col + k] + (dst[row + radius][col + k] - rowBuffer[row - radius - 1][k]) * rlen; + dst[row][col + k] = dst[row - 1][col + k] + (dst[row + radius][col + k] - rowBuffer[row - radius - 1][k]) * rlen; } } - for (int row = H - radius; row < H; row++) { - for(int k = 0; k < remaining; k++) { + for (int row = H - radius; row < H; ++row) { + for(int k = 0; k < remaining; ++k) { dst[row][col + k] = (dst[(row - 1)][col + k] * len - rowBuffer[row - radius - 1][k]) / (len - 1); - len --; } + len --; } } } From e33bee7ceab5e5f8bfbd01c3d26c60f463cc0088 Mon Sep 17 00:00:00 2001 From: scx Date: Thu, 19 Sep 2019 23:40:49 +0200 Subject: [PATCH 024/208] Update desktop file - Update Version entry (Keyword key was introduced in 1.1) - Fix GenericName - Add TryExec entry - Update Keywords --- rtdata/rawtherapee.desktop.in | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/rtdata/rawtherapee.desktop.in b/rtdata/rawtherapee.desktop.in index 233a737b6..9356c5a2d 100644 --- a/rtdata/rawtherapee.desktop.in +++ b/rtdata/rawtherapee.desktop.in @@ -1,8 +1,8 @@ [Desktop Entry] Type=Application -Version=1.0 +Version=1.1 Name=RawTherapee -GenericName=Raw photo editor +GenericName=Raw Photo Editor GenericName[cs]=Editor raw obrázků GenericName[fr]=Éditeur d'images raw GenericName[pl]=Edytor zdjęć raw @@ -11,9 +11,10 @@ Comment[cs]=Program pro konverzi a zpracování digitálních raw fotografií Comment[fr]=Logiciel de conversion et de traitement de photos numériques de format raw (but de capteur) Comment[pl]=Zaawansowany program do wywoływania zdjęć typu raw Icon=rawtherapee +TryExec=rawtherapee Exec=rawtherapee %f Terminal=false MimeType=image/jpeg;image/png;image/tiff;image/x-adobe-dng;image/x-canon-cr2;image/x-canon-crf;image/x-canon-crw;image/x-fuji-raf;image/x-hasselblad-3fr;image/x-hasselblad-fff;image/x-jpg;image/x-kodak-dcr;image/x-kodak-k25;image/x-kodak-kdc;image/x-leaf-mos;image/x-leica-rwl;image/x-mamiya-mef;image/x-minolta-mrw;image/x-nikon-nef;image/x-nikon-nrw;image/x-olympus-orf;image/x-panasonic-raw;image/x-panasonic-rw2;image/x-pentax-pef;image/x-pentax-raw;image/x-phaseone-iiq;image/x-raw;image/x-rwz;image/x-samsung-srw;image/x-sigma-x3f;image/x-sony-arq;image/x-sony-arw;image/x-sony-sr2;image/x-sony-srf;image/x-tif; Categories=Photography;Graphics;2DGraphics;RasterGraphics;GTK; -Keywords=raw;photography;develop;pp3;graphics; +Keywords=raw;photo;photography;develop;pp3;graphics; StartupWMClass=rawtherapee From 633eab24c288b2a8933af23b88d057f7df2ed0f3 Mon Sep 17 00:00:00 2001 From: scx Date: Thu, 19 Sep 2019 23:44:17 +0200 Subject: [PATCH 025/208] Update AppData file - Fix description (

tag) - Remove keywords (should be obtained from desktop file) - Fix URLs - Fix screenshot caption (too long) --- com.rawtherapee.RawTherapee.appdata.xml | 28 +++++++------------------ 1 file changed, 7 insertions(+), 21 deletions(-) diff --git a/com.rawtherapee.RawTherapee.appdata.xml b/com.rawtherapee.RawTherapee.appdata.xml index 0e5dfef50..564821cb4 100644 --- a/com.rawtherapee.RawTherapee.appdata.xml +++ b/com.rawtherapee.RawTherapee.appdata.xml @@ -8,31 +8,17 @@

Zaawansowany program do wywoływania zdjęć typu raw rawtherapee -

- RawTherapee is a powerful, cross-platform raw photo processing program. It is written mostly in C++ using a GTK+ front-end. It uses a patched version of dcraw for reading raw files, with an in-house solution which adds the highest quality support for certain camera models unsupported by dcraw and enhances the accuracy of certain raw files already supported by dcraw. It is notable for the advanced control it gives the user over the demosaicing and development process. -

-

- RawTherapee is designed for developing raw files from a broad range of digital cameras, as well as HDR DNG files and non-raw image formats (JPEG, TIFF and PNG). The target audience ranges from enthusiast newcomers who wish to broaden their understanding of how digital imaging works to semi-professional photographers. Knowledge in color science is not compulsory, but it is recommended that you are eager to learn and ready to read our documentation (RawPedia) as well as look up basic concepts which lie outside the scope of RawPedia, such as color balance, elsewhere. -

-

- Of course, professionals may use RawTherapee too while enjoying complete freedom, but will probably lack some peripheral features such as Digital Asset Management, printing, uploading, etc. RawTherapee is not aimed at being an inclusive all-in-one program, and the open-source community is sufficiently developed by now to offer all those peripheral features in other specialized software. -

+

RawTherapee is a powerful, cross-platform raw photo processing program. It is written mostly in C++ using a GTK+ front-end. It uses a patched version of dcraw for reading raw files, with an in-house solution which adds the highest quality support for certain camera models unsupported by dcraw and enhances the accuracy of certain raw files already supported by dcraw. It is notable for the advanced control it gives the user over the demosaicing and development process.

+

RawTherapee is designed for developing raw files from a broad range of digital cameras, as well as HDR DNG files and non-raw image formats (JPEG, TIFF and PNG). The target audience ranges from enthusiast newcomers who wish to broaden their understanding of how digital imaging works to semi-professional photographers. Knowledge in color science is not compulsory, but it is recommended that you are eager to learn and ready to read our documentation (RawPedia) as well as look up basic concepts which lie outside the scope of RawPedia, such as color balance, elsewhere.

+

Of course, professionals may use RawTherapee too while enjoying complete freedom, but will probably lack some peripheral features such as Digital Asset Management, printing, uploading, etc. RawTherapee is not aimed at being an inclusive all-in-one program, and the open-source community is sufficiently developed by now to offer all those peripheral features in other specialized software.

- - raw - photo - photography - develop - pp3 - graphics - CC-BY-SA-4.0 GPL-3.0+ - https://github.com/Beep6581/RawTherapee/issues/new + https://github.com/Beep6581/RawTherapee/issues https://www.paypal.me/rawtherapee - https://rawpedia.rawtherapee.com/ - https://www.rawtherapee.com/ + https://rawpedia.rawtherapee.com + https://www.rawtherapee.com https://discuss.pixls.us/t/localization-how-to-translate-rawtherapee-and-rawpedia/2594 rawtherapee.desktop @@ -48,7 +34,7 @@ - Color-correcting a drosera rotundifolia in RawTherapee 5.7. + Color-correcting a drosera rotundifolia https://rawtherapee.com/images/screenshots/rt570_1.jpg From 2415511b7011434b6f088fb46df8f4737b9e717b Mon Sep 17 00:00:00 2001 From: scx Date: Thu, 19 Sep 2019 23:55:31 +0200 Subject: [PATCH 026/208] Update desktop file - Change order of categories (Main Category before Additional Categories) --- rtdata/rawtherapee.desktop.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtdata/rawtherapee.desktop.in b/rtdata/rawtherapee.desktop.in index 9356c5a2d..c6c675c4d 100644 --- a/rtdata/rawtherapee.desktop.in +++ b/rtdata/rawtherapee.desktop.in @@ -15,6 +15,6 @@ TryExec=rawtherapee Exec=rawtherapee %f Terminal=false MimeType=image/jpeg;image/png;image/tiff;image/x-adobe-dng;image/x-canon-cr2;image/x-canon-crf;image/x-canon-crw;image/x-fuji-raf;image/x-hasselblad-3fr;image/x-hasselblad-fff;image/x-jpg;image/x-kodak-dcr;image/x-kodak-k25;image/x-kodak-kdc;image/x-leaf-mos;image/x-leica-rwl;image/x-mamiya-mef;image/x-minolta-mrw;image/x-nikon-nef;image/x-nikon-nrw;image/x-olympus-orf;image/x-panasonic-raw;image/x-panasonic-rw2;image/x-pentax-pef;image/x-pentax-raw;image/x-phaseone-iiq;image/x-raw;image/x-rwz;image/x-samsung-srw;image/x-sigma-x3f;image/x-sony-arq;image/x-sony-arw;image/x-sony-sr2;image/x-sony-srf;image/x-tif; -Categories=Photography;Graphics;2DGraphics;RasterGraphics;GTK; +Categories=Graphics;Photography;2DGraphics;RasterGraphics;GTK; Keywords=raw;photo;photography;develop;pp3;graphics; StartupWMClass=rawtherapee From 581e46c7b053b69ebc488011f43e7290870fa287 Mon Sep 17 00:00:00 2001 From: scx Date: Thu, 19 Sep 2019 23:59:00 +0200 Subject: [PATCH 027/208] Fix AppData file - Remove unreachable screenshot URL --- com.rawtherapee.RawTherapee.appdata.xml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/com.rawtherapee.RawTherapee.appdata.xml b/com.rawtherapee.RawTherapee.appdata.xml index 564821cb4..41a669532 100644 --- a/com.rawtherapee.RawTherapee.appdata.xml +++ b/com.rawtherapee.RawTherapee.appdata.xml @@ -33,10 +33,6 @@ rawtherapee-cli - - Color-correcting a drosera rotundifolia - https://rawtherapee.com/images/screenshots/rt570_1.jpg - HDR DNG of a misty morning in the countryside https://rawtherapee.com/images/screenshots/rt540_1.jpg From 7ff3192cc96d7f9339775a3469e52715ddf3e08a Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Fri, 20 Sep 2019 14:03:09 +0200 Subject: [PATCH 028/208] dehaze: added lumimance mode from ART, #5456, thanks to @agriggio --- rtdata/languages/default | 2 ++ rtengine/color.h | 5 +++++ rtengine/ipdehaze.cc | 43 +++++++++++++++++++++++++++++++--------- rtengine/procparams.cc | 9 ++++++--- rtengine/procparams.h | 2 +- rtgui/dehaze.cc | 16 +++++++++++++++ rtgui/dehaze.h | 5 ++++- rtgui/paramsedited.cc | 6 ++++++ rtgui/paramsedited.h | 1 + 9 files changed, 75 insertions(+), 14 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 3749a706a..49dabe9b9 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -744,6 +744,7 @@ HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold @@ -1538,6 +1539,7 @@ TP_DEFRINGE_RADIUS;Radius TP_DEFRINGE_THRESHOLD;Threshold TP_DEHAZE_DEPTH;Depth TP_DEHAZE_LABEL;Haze Removal +TP_DEHAZE_LUMINANCE;Luminance only TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map TP_DEHAZE_STRENGTH;Strength TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones diff --git a/rtengine/color.h b/rtengine/color.h index b859fb0cf..1031ca150 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -210,6 +210,11 @@ public: return r * workingspace[1][0] + g * workingspace[1][1] + b * workingspace[1][2]; } + static vfloat rgbLuminance(vfloat r, vfloat g, vfloat b, const vfloat workingspace[3]) + { + return r * workingspace[0] + g * workingspace[1] + b * workingspace[2]; + } + /** * @brief Convert red/green/blue to L*a*b * @brief Convert red/green/blue to hue/saturation/luminance diff --git a/rtengine/ipdehaze.cc b/rtengine/ipdehaze.cc index cf333a5d5..4eb5ed8e9 100644 --- a/rtengine/ipdehaze.cc +++ b/rtengine/ipdehaze.cc @@ -276,6 +276,13 @@ BENCHFUN const float depth = -float(params->dehaze.depth) / 100.f; const float t0 = max(1e-3f, std::exp(depth * max_t)); const float teps = 1e-3f; + + const bool luminance = params->dehaze.luminance; + TMatrix ws = ICCStore::getInstance()->workingSpaceMatrix(params->icm.workingProfile); +#ifdef __SSE2__ + const vfloat wsv[3] = {F2V(ws[1][0]), F2V(ws[1][1]),F2V(ws[1][2])}; +#endif + const float ambientY = Color::rgbLuminance(ambient[0], ambient[1], ambient[2], ws); #ifdef _OPENMP #pragma omp parallel for if (multiThread) #endif @@ -286,6 +293,8 @@ BENCHFUN const vfloat ambient0v = F2V(ambient[0]); const vfloat ambient1v = F2V(ambient[1]); const vfloat ambient2v = F2V(ambient[2]); + const vfloat ambientYv = F2V(ambientY); + const vfloat epsYv = F2V(1e-5f); const vfloat t0v = F2V(t0); const vfloat tepsv = F2V(teps); const vfloat c65535v = F2V(65535.f); @@ -297,14 +306,14 @@ BENCHFUN // ... t >= tl to avoid negative values const vfloat tlv = onev - vminf(r / ambient0v, vminf(g / ambient1v, b / ambient2v)); // ... t >= tu to avoid values > 1 - r -= ambient0v; - g -= ambient1v; - b -= ambient2v; +// r -= ambient0v; +// g -= ambient1v; +// b -= ambient2v; vfloat tuv = t0v - tepsv; - tuv = vself(vmaskf_lt(ambient0v, onev), vmaxf(tuv, r / (onev - ambient0v)), tuv); - tuv = vself(vmaskf_lt(ambient1v, onev), vmaxf(tuv, g / (onev - ambient1v)), tuv); - tuv = vself(vmaskf_lt(ambient2v, onev), vmaxf(tuv, b / (onev - ambient2v)), tuv); + tuv = vself(vmaskf_lt(ambient0v, onev), vmaxf(tuv, (r - ambient0v) / (onev - ambient0v)), tuv); + tuv = vself(vmaskf_lt(ambient1v, onev), vmaxf(tuv, (g - ambient1v) / (onev - ambient1v)), tuv); + tuv = vself(vmaskf_lt(ambient2v, onev), vmaxf(tuv, (b - ambient2v) / (onev - ambient2v)), tuv); const vfloat mtv = vmaxf(LVFU(dark[y][x]), vmaxf(tlv, tuv) + tepsv); if (params->dehaze.showDepthMap) { @@ -312,10 +321,17 @@ BENCHFUN STVFU(img->r(y, x), valv); STVFU(img->g(y, x), valv); STVFU(img->b(y, x), valv); + } else if (luminance) { + const vfloat Yv = Color::rgbLuminance(r, g, b, wsv); + const vfloat YYv = (Yv - ambientYv) / mtv + ambientYv; + const vfloat fv = vself(vmaskf_gt(Yv, epsYv), c65535v * YYv / Yv, c65535v); + STVFU(img->r(y, x), r * fv); + STVFU(img->g(y, x), g * fv); + STVFU(img->b(y, x), b * fv); } else { - STVFU(img->r(y, x), (r / mtv + ambient0v) * c65535v); - STVFU(img->g(y, x), (g / mtv + ambient1v) * c65535v); - STVFU(img->b(y, x), (b / mtv + ambient2v) * c65535v); + STVFU(img->r(y, x), ((r - ambient0v) / mtv + ambient0v) * c65535v); + STVFU(img->g(y, x), ((g - ambient1v) / mtv + ambient1v) * c65535v); + STVFU(img->b(y, x), ((b - ambient2v) / mtv + ambient2v) * c65535v); } } #endif @@ -339,6 +355,15 @@ BENCHFUN const float mt = max(dark[y][x], tl + teps, tu + teps); if (params->dehaze.showDepthMap) { img->r(y, x) = img->g(y, x) = img->b(y, x) = LIM01(1.f - mt) * 65535.f; + } else if (luminance) { + const float Y = Color::rgbLuminance(img->r(y, x), img->g(y, x), img->b(y, x), ws); + const float YY = (Y - ambientY) / mt + ambientY; + if (Y > 1e-5f) { + const float f = 65535.f * YY / Y; + img->r(y, x) *= f; + img->g(y, x) *= f; + img->b(y, x) *= f; + } } else { img->r(y, x) = (r / mt + ambient[0]) * 65535.f; img->g(y, x) = (g / mt + ambient[1]) * 65535.f; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index f88220c4e..fcf6dd4db 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2517,7 +2517,8 @@ DehazeParams::DehazeParams() : enabled(false), strength(50), showDepthMap(false), - depth(25) + depth(25), + luminance(false) { } @@ -2527,7 +2528,8 @@ bool DehazeParams::operator ==(const DehazeParams& other) const enabled == other.enabled && strength == other.strength && showDepthMap == other.showDepthMap - && depth == other.depth; + && depth == other.depth + && luminance == other.luminance; } bool DehazeParams::operator !=(const DehazeParams& other) const @@ -3238,7 +3240,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->dehaze.strength, "Dehaze", "Strength", dehaze.strength, keyFile); saveToKeyfile(!pedited || pedited->dehaze.showDepthMap, "Dehaze", "ShowDepthMap", dehaze.showDepthMap, keyFile); saveToKeyfile(!pedited || pedited->dehaze.depth, "Dehaze", "Depth", dehaze.depth, keyFile); - + saveToKeyfile(!pedited || pedited->dehaze.depth, "Dehaze", "Luminance", dehaze.luminance, keyFile); // Directional pyramid denoising saveToKeyfile(!pedited || pedited->dirpyrDenoise.enabled, "Directional Pyramid Denoising", "Enabled", dirpyrDenoise.enabled, keyFile); saveToKeyfile(!pedited || pedited->dirpyrDenoise.enhance, "Directional Pyramid Denoising", "Enhance", dirpyrDenoise.enhance, keyFile); @@ -4878,6 +4880,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Dehaze", "Strength", pedited, dehaze.strength, pedited->dehaze.strength); assignFromKeyfile(keyFile, "Dehaze", "ShowDepthMap", pedited, dehaze.showDepthMap, pedited->dehaze.showDepthMap); assignFromKeyfile(keyFile, "Dehaze", "Depth", pedited, dehaze.depth, pedited->dehaze.depth); + assignFromKeyfile(keyFile, "Dehaze", "Luminance", pedited, dehaze.luminance, pedited->dehaze.luminance); } if (keyFile.has_group("Film Simulation")) { diff --git a/rtengine/procparams.h b/rtengine/procparams.h index ce03efc7d..a60c497bc 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1342,7 +1342,7 @@ struct DehazeParams { int strength; bool showDepthMap; int depth; - + bool luminance; DehazeParams(); bool operator==(const DehazeParams &other) const; diff --git a/rtgui/dehaze.cc b/rtgui/dehaze.cc index 6f60d08d6..6b7fcd64f 100644 --- a/rtgui/dehaze.cc +++ b/rtgui/dehaze.cc @@ -36,6 +36,7 @@ Dehaze::Dehaze(): FoldableToolPanel(this, "dehaze", M("TP_DEHAZE_LABEL"), false, EvDehazeStrength = m->newEvent(HDR, "HISTORY_MSG_DEHAZE_STRENGTH"); EvDehazeShowDepthMap = m->newEvent(HDR, "HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP"); EvDehazeDepth = m->newEvent(HDR, "HISTORY_MSG_DEHAZE_DEPTH"); + EvDehazeLuminance = m->newEvent(HDR, "HISTORY_MSG_DEHAZE_LUMINANCE"); strength = Gtk::manage(new Adjuster(M("TP_DEHAZE_STRENGTH"), 0., 100., 1., 50.)); strength->setAdjusterListener(this); @@ -45,12 +46,17 @@ Dehaze::Dehaze(): FoldableToolPanel(this, "dehaze", M("TP_DEHAZE_LABEL"), false, depth->setAdjusterListener(this); depth->show(); + luminance = Gtk::manage(new Gtk::CheckButton(M("TP_DEHAZE_LUMINANCE"))); + luminance->signal_toggled().connect(sigc::mem_fun(*this, &Dehaze::luminanceChanged)); + luminance->show(); + showDepthMap = Gtk::manage(new Gtk::CheckButton(M("TP_DEHAZE_SHOW_DEPTH_MAP"))); showDepthMap->signal_toggled().connect(sigc::mem_fun(*this, &Dehaze::showDepthMapChanged)); showDepthMap->show(); pack_start(*strength); pack_start(*depth); + pack_start(*luminance); pack_start(*showDepthMap); } @@ -64,12 +70,14 @@ void Dehaze::read(const ProcParams *pp, const ParamsEdited *pedited) depth->setEditedState(pedited->dehaze.depth ? Edited : UnEdited); set_inconsistent(multiImage && !pedited->dehaze.enabled); showDepthMap->set_inconsistent(!pedited->dehaze.showDepthMap); + luminance->set_inconsistent(!pedited->dehaze.luminance); } setEnabled(pp->dehaze.enabled); strength->setValue(pp->dehaze.strength); depth->setValue(pp->dehaze.depth); showDepthMap->set_active(pp->dehaze.showDepthMap); + luminance->set_active(pp->dehaze.luminance); enableListener(); } @@ -81,12 +89,14 @@ void Dehaze::write(ProcParams *pp, ParamsEdited *pedited) pp->dehaze.depth = depth->getValue(); pp->dehaze.enabled = getEnabled(); pp->dehaze.showDepthMap = showDepthMap->get_active(); + pp->dehaze.luminance = luminance->get_active(); if (pedited) { pedited->dehaze.strength = strength->getEditedState(); pedited->dehaze.depth = depth->getEditedState(); pedited->dehaze.enabled = !get_inconsistent(); pedited->dehaze.showDepthMap = !showDepthMap->get_inconsistent(); + pedited->dehaze.luminance = !luminance->get_inconsistent(); } } @@ -138,6 +148,12 @@ void Dehaze::showDepthMapChanged() } } +void Dehaze::luminanceChanged() +{ + if (listener) { + listener->panelChanged(EvDehazeLuminance, luminance->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED")); + } +} void Dehaze::setBatchMode(bool batchMode) { diff --git a/rtgui/dehaze.h b/rtgui/dehaze.h index 3120dfc91..6a9d31cd1 100644 --- a/rtgui/dehaze.h +++ b/rtgui/dehaze.h @@ -28,12 +28,14 @@ class Dehaze: public ToolParamBlock, public AdjusterListener, public FoldableToo private: Adjuster *strength; Adjuster *depth; - Gtk::CheckButton *showDepthMap; + Gtk::CheckButton *showDepthMap; + Gtk::CheckButton *luminance; rtengine::ProcEvent EvDehazeEnabled; rtengine::ProcEvent EvDehazeStrength; rtengine::ProcEvent EvDehazeDepth; rtengine::ProcEvent EvDehazeShowDepthMap; + rtengine::ProcEvent EvDehazeLuminance; public: @@ -47,6 +49,7 @@ public: void adjusterChanged(Adjuster *a, double newval) override; void enabledChanged() override; void showDepthMapChanged(); + void luminanceChanged(); void setAdjusterBehavior(bool strengthAdd); }; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 2ab5702ea..9ea89f267 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -587,6 +587,7 @@ void ParamsEdited::set(bool v) dehaze.strength = v; dehaze.showDepthMap = v; dehaze.depth = v; + dehaze.luminance = v; metadata.mode = v; filmNegative.enabled = v; filmNegative.redRatio = v; @@ -1158,6 +1159,7 @@ void ParamsEdited::initFrom(const std::vector& dehaze.strength = dehaze.strength && p.dehaze.strength == other.dehaze.strength; dehaze.showDepthMap = dehaze.showDepthMap && p.dehaze.showDepthMap == other.dehaze.showDepthMap; dehaze.depth = dehaze.depth && p.dehaze.depth == other.dehaze.depth; + dehaze.luminance = dehaze.luminance && p.dehaze.luminance == other.dehaze.luminance; metadata.mode = metadata.mode && p.metadata.mode == other.metadata.mode; filmNegative.enabled = filmNegative.enabled && p.filmNegative.enabled == other.filmNegative.enabled; filmNegative.redRatio = filmNegative.redRatio && p.filmNegative.redRatio == other.filmNegative.redRatio; @@ -3224,6 +3226,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.dehaze.showDepthMap = mods.dehaze.showDepthMap; } + if (dehaze.luminance) { + toEdit.dehaze.luminance = mods.dehaze.luminance; + } + if (metadata.mode) { toEdit.metadata.mode = mods.metadata.mode; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 1bd7170d4..41af0510d 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -596,6 +596,7 @@ struct DehazeParamsEdited { bool strength; bool showDepthMap; bool depth; + bool luminance; }; struct RAWParamsEdited { From 83a8ca8ef52a03b600610a40720149bee30c5bec Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Fri, 20 Sep 2019 15:29:35 +0200 Subject: [PATCH 029/208] dehaze: Fix artifacts when blue channel is clipped, #5456, thanks to @agriggio --- rtengine/ipdehaze.cc | 50 +++++++++++++------------------------------- 1 file changed, 14 insertions(+), 36 deletions(-) diff --git a/rtengine/ipdehaze.cc b/rtengine/ipdehaze.cc index 4eb5ed8e9..81074a15b 100644 --- a/rtengine/ipdehaze.cc +++ b/rtengine/ipdehaze.cc @@ -264,10 +264,8 @@ BENCHFUN const int radius = patchsize * 4; constexpr float epsilon = 1e-5f; - { - array2D guideB(W, H, img->b.ptrs, ARRAY2D_BYREFERENCE); - guidedFilter(guideB, dark, dark, radius, epsilon, multiThread); - } + array2D guideB(W, H, img->b.ptrs, ARRAY2D_BYREFERENCE); + guidedFilter(guideB, dark, dark, radius, epsilon, multiThread); if (options.rtSettings.verbose) { std::cout << "dehaze: max distance is " << max_t << std::endl; @@ -300,22 +298,12 @@ BENCHFUN const vfloat c65535v = F2V(65535.f); for (; x < W - 3; x += 4) { // ensure that the transmission is such that to avoid clipping... - vfloat r = LVFU(img->r(y, x)); - vfloat g = LVFU(img->g(y, x)); - vfloat b = LVFU(img->b(y, x)); + const vfloat r = LVFU(img->r(y, x)); + const vfloat g = LVFU(img->g(y, x)); + const vfloat b = LVFU(img->b(y, x)); // ... t >= tl to avoid negative values const vfloat tlv = onev - vminf(r / ambient0v, vminf(g / ambient1v, b / ambient2v)); - // ... t >= tu to avoid values > 1 -// r -= ambient0v; -// g -= ambient1v; -// b -= ambient2v; - - vfloat tuv = t0v - tepsv; - tuv = vself(vmaskf_lt(ambient0v, onev), vmaxf(tuv, (r - ambient0v) / (onev - ambient0v)), tuv); - tuv = vself(vmaskf_lt(ambient1v, onev), vmaxf(tuv, (g - ambient1v) / (onev - ambient1v)), tuv); - tuv = vself(vmaskf_lt(ambient2v, onev), vmaxf(tuv, (b - ambient2v) / (onev - ambient2v)), tuv); - - const vfloat mtv = vmaxf(LVFU(dark[y][x]), vmaxf(tlv, tuv) + tepsv); + const vfloat mtv = vmaxf(LVFU(dark[y][x]), vmaxf(tlv + tepsv, t0v)); if (params->dehaze.showDepthMap) { const vfloat valv = vclampf(onev - mtv, ZEROV, onev) * c65535v; STVFU(img->r(y, x), valv); @@ -337,37 +325,27 @@ BENCHFUN #endif for (; x < W; ++x) { // ensure that the transmission is such that to avoid clipping... - float r = img->r(y, x); - float g = img->g(y, x); - float b = img->b(y, x); + const float r = img->r(y, x); + const float g = img->g(y, x); + const float b = img->b(y, x); // ... t >= tl to avoid negative values const float tl = 1.f - min(r / ambient[0], g / ambient[1], b / ambient[2]); - // ... t >= tu to avoid values > 1 - r -= ambient[0]; - g -= ambient[1]; - b -= ambient[2]; - - float tu = t0 - teps; - tu = ambient[0] < 1.f ? max(tu, r / (1.f - ambient[0])) : tu; - tu = ambient[1] < 1.f ? max(tu, g / (1.f - ambient[1])) : tu; - tu = ambient[2] < 1.f ? max(tu, b / (1.f - ambient[2])) : tu; - - const float mt = max(dark[y][x], tl + teps, tu + teps); + const float mt = max(dark[y][x], t0, tl + teps); if (params->dehaze.showDepthMap) { img->r(y, x) = img->g(y, x) = img->b(y, x) = LIM01(1.f - mt) * 65535.f; } else if (luminance) { const float Y = Color::rgbLuminance(img->r(y, x), img->g(y, x), img->b(y, x), ws); - const float YY = (Y - ambientY) / mt + ambientY; if (Y > 1e-5f) { + const float YY = (Y - ambientY) / mt + ambientY; const float f = 65535.f * YY / Y; img->r(y, x) *= f; img->g(y, x) *= f; img->b(y, x) *= f; } } else { - img->r(y, x) = (r / mt + ambient[0]) * 65535.f; - img->g(y, x) = (g / mt + ambient[1]) * 65535.f; - img->b(y, x) = (b / mt + ambient[2]) * 65535.f; + img->r(y, x) = ((r - ambient[0]) / mt + ambient[0]) * 65535.f; + img->g(y, x) = ((g - ambient[1]) / mt + ambient[1]) * 65535.f; + img->b(y, x) = ((b - ambient[2]) / mt + ambient[2]) * 65535.f; } } } From 706c16510fef47d87e69bfe980906c199bdfee05 Mon Sep 17 00:00:00 2001 From: Franz Trischberger Date: Sat, 21 Sep 2019 08:44:53 +0300 Subject: [PATCH 030/208] Add option to link against libtcmalloc.so Implementation done by Alberto Griggio (agriggio) for his fork at https://bitbucket.org/agriggio/art libtcmalloc.so comes with google's perftools: https://github.com/gperftools/gperftools This should fix issues where glibc won't give memory back to the OS. Related issue: #4416 --- CMakeLists.txt | 20 ++++++++++++++++++++ rtgui/CMakeLists.txt | 2 ++ 2 files changed, 22 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index b027ea5f7..b5626512a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -136,6 +136,9 @@ option(TRACE_MYRWMUTEX "Trace custom R/W Mutex (Debug builds only); redirecting option(AUTO_GDK_FLUSH "Use gdk_flush on all gdk_thread_leave other than the GUI thread; set it ON if you experience X Server warning/errors" OFF) #option(TARGET32BIT "Build for 32-bit architecture when ON, otherwise 64-bit. Default is OFF" OFF) +option(ENABLE_TCMALLOC "Use the tcmalloc library if available" OFF) +set(TCMALLOC_LIB_DIR "" CACHE PATH "Custom path for the tcmalloc library") + # Set installation directories: if(WIN32 OR APPLE) if(BUILD_BUNDLE) @@ -564,6 +567,23 @@ int main() return 0; }" LENSFUN_HAS_LOAD_DIRECTORY) +set(TCMALLOC_LIB_DIR) +if(ENABLE_TCMALLOC) + if(TCMALLOC_LIB_DIR) + find_library(TCMALLOC_LIBRARIES tcmalloc PATHS ${TCMALLOC_LIB_DIR} NO_DEFAULT_PATH) + else() + find_library(TCMALLOC_LIBRARIES tcmalloc) + endif() + if(TCMALLOC_LIBRARIES) + message(STATUS "using tcmalloc library in ${TCMALLOC_LIBRARIES}") + else() + set(TCMALLOC_LIBRARIES "" CACHE INTERNAL "" FORCE) + message(STATUS "tcmalloc not found") + endif() +else() + set(TCMALLOC_LIBRARIES "" CACHE INTERNAL "" FORCE) +endif() + add_subdirectory(rtexif) add_subdirectory(rtengine) diff --git a/rtgui/CMakeLists.txt b/rtgui/CMakeLists.txt index bc52b64b0..edc2b8202 100644 --- a/rtgui/CMakeLists.txt +++ b/rtgui/CMakeLists.txt @@ -286,6 +286,7 @@ target_link_libraries(rth rtengine ${ZLIB_LIBRARIES} ${LENSFUN_LIBRARIES} ${RSVG_LIBRARIES} + ${TCMALLOC_LIBRARIES} ) target_link_libraries(rth-cli rtengine @@ -307,6 +308,7 @@ target_link_libraries(rth-cli rtengine ${ZLIB_LIBRARIES} ${LENSFUN_LIBRARIES} ${RSVG_LIBRARIES} + ${TCMALLOC_LIBRARIES} ) # Install executables From a7cc59c91dc2b715203e63bfcf8f5423103a18e6 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sat, 21 Sep 2019 21:33:05 +0200 Subject: [PATCH 031/208] dehaze: further speedup, stolen from ART, thanks @agriggio, #5456 --- rtengine/ipdehaze.cc | 91 ++++++++++++++++++++++++-------------------- 1 file changed, 49 insertions(+), 42 deletions(-) diff --git a/rtengine/ipdehaze.cc b/rtengine/ipdehaze.cc index 81074a15b..6f516d95b 100644 --- a/rtengine/ipdehaze.cc +++ b/rtengine/ipdehaze.cc @@ -39,7 +39,7 @@ #include "rt_math.h" #define BENCHMARK #include "StopWatch.h" - +#include "rescale.h" extern Options options; namespace rtengine { @@ -83,24 +83,24 @@ int get_dark_channel_downsized(const array2D &R, const array2D &G, #pragma omp parallel for if (multithread) #endif for (int y = 0; y < H; y += patchsize) { - int yy = y / patchsize; const int pH = min(y + patchsize, H); - for (int x = 0, xx = 0; x < W; x += patchsize, ++xx) { + for (int x = 0; x < W; x += patchsize) { float val = RT_INFINITY_F; const int pW = min(x + patchsize, W); - for (int xp = x; xp < pW; ++xp) { - for (int yp = y; yp < pH; ++yp) { - val = min(val, R[yp][xp], G[yp][xp], B[yp][xp]); + for (int xx = x; xx < pW; ++xx) { + for (int yy = y; yy < pH; ++yy) { + val = min(val, R[yy][xx], G[yy][xx], B[yy][xx]); } } - dst[yy][xx] = val; + for (int yy = y; yy < pH; ++yy) { + std::fill(dst[yy] + x, dst[yy] + pW, val); + } } } return (W / patchsize + ((W % patchsize) > 0)) * (H / patchsize + ((H % patchsize) > 0)); } - float estimate_ambient_light(const array2D &R, const array2D &G, const array2D &B, const array2D &dark, int patchsize, int npatches, float ambient[3]) { const int W = R.width(); @@ -109,10 +109,10 @@ float estimate_ambient_light(const array2D &R, const array2D &G, c float darklim = RT_INFINITY_F; { std::vector p; - for (int y = 0, yy = 0; y < H; y += patchsize, ++yy) { - for (int x = 0, xx = 0; x < W; x += patchsize, ++xx) { - if (!OOG(dark[yy][xx], 1.f - 1e-5f)) { - p.push_back(dark[yy][xx]); + for (int y = 0; y < H; y += patchsize) { + for (int x = 0; x < W; x += patchsize) { + if (!OOG(dark[y][x], 1.f - 1e-5f)) { + p.push_back(dark[y][x]); } } } @@ -124,9 +124,9 @@ float estimate_ambient_light(const array2D &R, const array2D &G, c std::vector> patches; patches.reserve(npatches); - for (int y = 0, yy = 0; y < H; y += patchsize, ++yy) { - for (int x = 0, xx = 0; x < W; x += patchsize, ++xx) { - if (dark[yy][xx] >= darklim && !OOG(dark[yy][xx], 1.f)) { + for (int y = 0; y < H; y += patchsize) { + for (int x = 0; x < W; x += patchsize) { + if (dark[y][x] >= darklim && !OOG(dark[y][x], 1.f)) { patches.push_back(std::make_pair(x, y)); } } @@ -142,9 +142,9 @@ float estimate_ambient_light(const array2D &R, const array2D &G, c std::vector l; l.reserve(patches.size() * patchsize * patchsize); - for (const auto &p : patches) { - const int pW = min(p.first + patchsize, W); - const int pH = min(p.second + patchsize, H); + for (auto &p : patches) { + const int pW = min(p.first+patchsize, W); + const int pH = min(p.second+patchsize, H); for (int y = p.second; y < pH; ++y) { for (int x = p.first; x < pW; ++x) { @@ -159,19 +159,15 @@ float estimate_ambient_light(const array2D &R, const array2D &G, c double rr = 0, gg = 0, bb = 0; int n = 0; -#ifdef _OPENMP - #pragma omp parallel for schedule(dynamic) reduction(+:rr,gg,bb,n) -#endif - for (size_t i = 0; i < patches.size(); ++i) { - const auto &p = patches[i]; - const int pW = min(p.first + patchsize, W); - const int pH = min(p.second + patchsize, H); + for (auto &p : patches) { + const int pW = min(p.first+patchsize, W); + const int pH = min(p.second+patchsize, H); for (int y = p.second; y < pH; ++y) { for (int x = p.first; x < pW; ++x) { - const float r = R[y][x]; - const float g = G[y][x]; - const float b = B[y][x]; + float r = R[y][x]; + float g = G[y][x]; + float b = B[y][x]; if (r + g + b >= bright_lim) { rr += r; gg += g; @@ -181,7 +177,6 @@ float estimate_ambient_light(const array2D &R, const array2D &G, c } } } - n = std::max(n, 1); ambient[0] = rr / n; ambient[1] = gg / n; @@ -191,7 +186,6 @@ float estimate_ambient_light(const array2D &R, const array2D &G, c return darklim > 0 ? -1.125f * std::log(darklim) : std::log(std::numeric_limits::max()) / 2; } - void extract_channels(Imagefloat *img, array2D &r, array2D &g, array2D &b, int radius, float epsilon, bool multithread) { const int W = img->getWidth(); @@ -238,11 +232,32 @@ BENCHFUN array2D B(W, H); extract_channels(img, R, G, B, patchsize, 1e-1, multiThread); - patchsize = max(max(W, H) / 600, 2); - array2D darkDownsized(W / patchsize + 1, H / patchsize + 1); - const int npatches = get_dark_channel_downsized(R, G, B, darkDownsized, patchsize, multiThread); + { + constexpr int sizecap = 200; + float r = float(W)/float(H); + const int hh = r >= 1.f ? sizecap : sizecap / r; + const int ww = r >= 1.f ? sizecap * r : sizecap; - max_t = estimate_ambient_light(R, G, B, darkDownsized, patchsize, npatches, ambient); + if (W <= ww && H <= hh) { + // don't rescale small thumbs + array2D D(W, H); + int npatches = get_dark_channel_downsized(R, G, B, D, 2, multiThread); + max_t = estimate_ambient_light(R, G, B, D, patchsize, npatches, ambient); + } else { + array2D RR(ww, hh); + array2D GG(ww, hh); + array2D BB(ww, hh); + rescaleNearest(R, RR, multiThread); + rescaleNearest(G, GG, multiThread); + rescaleNearest(B, BB, multiThread); + array2D D(ww, hh); + + int npatches = get_dark_channel_downsized(RR, GG, BB, D, 2, multiThread); + max_t = estimate_ambient_light(RR, GG, BB, D, patchsize, npatches, ambient); + } + } + + patchsize = max(max(W, H) / 600, 2); if (options.rtSettings.verbose) { std::cout << "dehaze: ambient light is " @@ -250,14 +265,6 @@ BENCHFUN << std::endl; } - if (min(ambient[0], ambient[1], ambient[2]) < 0.01f) { - if (options.rtSettings.verbose) { - std::cout << "dehaze: no haze detected" << std::endl; - } - img->normalizeFloatTo65535(); - return; // probably no haze at all - } - get_dark_channel(R, G, B, dark, patchsize, ambient, true, multiThread, strength); } From cab84aed38456964f34f1bbe68b4ca3104753cd7 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 22 Sep 2019 13:21:34 +0200 Subject: [PATCH 032/208] dehaze: fix bug in luminance mode, #5456 --- rtengine/ipdehaze.cc | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/rtengine/ipdehaze.cc b/rtengine/ipdehaze.cc index 6f516d95b..125fa4d60 100644 --- a/rtengine/ipdehaze.cc +++ b/rtengine/ipdehaze.cc @@ -283,7 +283,7 @@ BENCHFUN const float teps = 1e-3f; const bool luminance = params->dehaze.luminance; - TMatrix ws = ICCStore::getInstance()->workingSpaceMatrix(params->icm.workingProfile); + const TMatrix ws = ICCStore::getInstance()->workingSpaceMatrix(params->icm.workingProfile); #ifdef __SSE2__ const vfloat wsv[3] = {F2V(ws[1][0]), F2V(ws[1][1]),F2V(ws[1][2])}; #endif @@ -342,13 +342,11 @@ BENCHFUN img->r(y, x) = img->g(y, x) = img->b(y, x) = LIM01(1.f - mt) * 65535.f; } else if (luminance) { const float Y = Color::rgbLuminance(img->r(y, x), img->g(y, x), img->b(y, x), ws); - if (Y > 1e-5f) { - const float YY = (Y - ambientY) / mt + ambientY; - const float f = 65535.f * YY / Y; - img->r(y, x) *= f; - img->g(y, x) *= f; - img->b(y, x) *= f; - } + const float YY = (Y - ambientY) / mt + ambientY; + const float f = Y > 1e-5f ? 65535.f * YY / Y : 65535.f; + img->r(y, x) *= f; + img->g(y, x) *= f; + img->b(y, x) *= f; } else { img->r(y, x) = ((r - ambient[0]) / mt + ambient[0]) * 65535.f; img->g(y, x) = ((g - ambient[1]) / mt + ambient[1]) * 65535.f; From 189f474e033c908ed06bfcb32580ab63427b9ad0 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 22 Sep 2019 20:53:03 +0200 Subject: [PATCH 033/208] dehaze: add accidently removed early exit in case there is no haze detected, #5456 --- rtengine/ipdehaze.cc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/rtengine/ipdehaze.cc b/rtengine/ipdehaze.cc index 125fa4d60..00236d1de 100644 --- a/rtengine/ipdehaze.cc +++ b/rtengine/ipdehaze.cc @@ -257,6 +257,13 @@ BENCHFUN } } + if (min(ambient[0], ambient[1], ambient[2]) < 0.01f) { + if (options.rtSettings.verbose) { + std::cout << "dehaze: no haze detected" << std::endl; + } + img->normalizeFloatTo65535(); + return; // probably no haze at all + } patchsize = max(max(W, H) / 600, 2); if (options.rtSettings.verbose) { From ca162e8ffc7ecd1ad924a0735c9e364c0aff3779 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 22 Sep 2019 23:45:19 +0200 Subject: [PATCH 034/208] dehaze: (experimental) input normalization to improve handling of overexposed pictures, thanks @agriggio, #5456 --- rtengine/ipdehaze.cc | 79 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 62 insertions(+), 17 deletions(-) diff --git a/rtengine/ipdehaze.cc b/rtengine/ipdehaze.cc index 00236d1de..8ba1b935a 100644 --- a/rtengine/ipdehaze.cc +++ b/rtengine/ipdehaze.cc @@ -28,24 +28,69 @@ * */ +#include #include -#include +#include #include "guidedfilter.h" #include "improcfun.h" #include "procparams.h" -#include "rt_algo.h" -#include "rt_algo.h" +#include "rescale.h" #include "rt_math.h" #define BENCHMARK #include "StopWatch.h" -#include "rescale.h" + extern Options options; namespace rtengine { namespace { +float normalize(Imagefloat *rgb, bool multithread) +{ + float maxval = 0.f; + const int W = rgb->getWidth(); + const int H = rgb->getHeight(); +#ifdef _OPENMP +# pragma omp parallel for reduction(max:maxval) if (multithread) +#endif + for (int y = 0; y < H; ++y) { + for (int x = 0; x < W; ++x) { + maxval = max(maxval, rgb->r(y, x), rgb->g(y, x), rgb->b(y, x)); + } + } + maxval = max(maxval * 2.f, 65535.f); +#ifdef _OPENMP +# pragma omp parallel for if (multithread) +#endif + for (int y = 0; y < H; ++y) { + for (int x = 0; x < W; ++x) { + rgb->r(y, x) /= maxval; + rgb->g(y, x) /= maxval; + rgb->b(y, x) /= maxval; + } + } + return maxval; +} + +void restore(Imagefloat *rgb, float maxval, bool multithread) +{ + const int W = rgb->getWidth(); + const int H = rgb->getHeight(); + if (maxval > 0.f && maxval != 1.f) { +#ifdef _OPENMP +# pragma omp parallel for if (multithread) +#endif + for (int y = 0; y < H; ++y) { + for (int x = 0; x < W; ++x) { + rgb->r(y, x) *= maxval; + rgb->g(y, x) *= maxval; + rgb->b(y, x) *= maxval; + } + } + } +} + int get_dark_channel(const array2D &R, const array2D &G, const array2D &B, array2D &dst, int patchsize, const float ambient[3], bool clip, bool multithread, float strength) { const int W = R.width(); @@ -210,7 +255,7 @@ void ImProcFunctions::dehaze(Imagefloat *img) return; } BENCHFUN - img->normalizeFloatTo1(); + const float maxChannel = normalize(img, multiThread); const int W = img->getWidth(); const int H = img->getHeight(); @@ -261,7 +306,7 @@ BENCHFUN if (options.rtSettings.verbose) { std::cout << "dehaze: no haze detected" << std::endl; } - img->normalizeFloatTo65535(); + restore(img, maxChannel, multiThread); return; // probably no haze at all } patchsize = max(max(W, H) / 600, 2); @@ -309,7 +354,7 @@ BENCHFUN const vfloat epsYv = F2V(1e-5f); const vfloat t0v = F2V(t0); const vfloat tepsv = F2V(teps); - const vfloat c65535v = F2V(65535.f); + const vfloat cmaxChannelv = F2V(maxChannel); for (; x < W - 3; x += 4) { // ensure that the transmission is such that to avoid clipping... const vfloat r = LVFU(img->r(y, x)); @@ -319,21 +364,21 @@ BENCHFUN const vfloat tlv = onev - vminf(r / ambient0v, vminf(g / ambient1v, b / ambient2v)); const vfloat mtv = vmaxf(LVFU(dark[y][x]), vmaxf(tlv + tepsv, t0v)); if (params->dehaze.showDepthMap) { - const vfloat valv = vclampf(onev - mtv, ZEROV, onev) * c65535v; + const vfloat valv = vclampf(onev - mtv, ZEROV, onev) * cmaxChannelv; STVFU(img->r(y, x), valv); STVFU(img->g(y, x), valv); STVFU(img->b(y, x), valv); } else if (luminance) { const vfloat Yv = Color::rgbLuminance(r, g, b, wsv); const vfloat YYv = (Yv - ambientYv) / mtv + ambientYv; - const vfloat fv = vself(vmaskf_gt(Yv, epsYv), c65535v * YYv / Yv, c65535v); + const vfloat fv = vself(vmaskf_gt(Yv, epsYv), cmaxChannelv * YYv / Yv, cmaxChannelv); STVFU(img->r(y, x), r * fv); STVFU(img->g(y, x), g * fv); STVFU(img->b(y, x), b * fv); } else { - STVFU(img->r(y, x), ((r - ambient0v) / mtv + ambient0v) * c65535v); - STVFU(img->g(y, x), ((g - ambient1v) / mtv + ambient1v) * c65535v); - STVFU(img->b(y, x), ((b - ambient2v) / mtv + ambient2v) * c65535v); + STVFU(img->r(y, x), ((r - ambient0v) / mtv + ambient0v) * cmaxChannelv); + STVFU(img->g(y, x), ((g - ambient1v) / mtv + ambient1v) * cmaxChannelv); + STVFU(img->b(y, x), ((b - ambient2v) / mtv + ambient2v) * cmaxChannelv); } } #endif @@ -346,18 +391,18 @@ BENCHFUN const float tl = 1.f - min(r / ambient[0], g / ambient[1], b / ambient[2]); const float mt = max(dark[y][x], t0, tl + teps); if (params->dehaze.showDepthMap) { - img->r(y, x) = img->g(y, x) = img->b(y, x) = LIM01(1.f - mt) * 65535.f; + img->r(y, x) = img->g(y, x) = img->b(y, x) = LIM01(1.f - mt) * maxChannel; } else if (luminance) { const float Y = Color::rgbLuminance(img->r(y, x), img->g(y, x), img->b(y, x), ws); const float YY = (Y - ambientY) / mt + ambientY; - const float f = Y > 1e-5f ? 65535.f * YY / Y : 65535.f; + const float f = Y > 1e-5f ? maxChannel * YY / Y : maxChannel; img->r(y, x) *= f; img->g(y, x) *= f; img->b(y, x) *= f; } else { - img->r(y, x) = ((r - ambient[0]) / mt + ambient[0]) * 65535.f; - img->g(y, x) = ((g - ambient[1]) / mt + ambient[1]) * 65535.f; - img->b(y, x) = ((b - ambient[2]) / mt + ambient[2]) * 65535.f; + img->r(y, x) = ((r - ambient[0]) / mt + ambient[0]) * maxChannel; + img->g(y, x) = ((g - ambient[1]) / mt + ambient[1]) * maxChannel; + img->b(y, x) = ((b - ambient[2]) / mt + ambient[2]) * maxChannel; } } } From c656fa0fc768c8fb8a82ca48e9a68b138bab370b Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Mon, 23 Sep 2019 01:21:52 +0200 Subject: [PATCH 035/208] Update screenshots in appdata file --- com.rawtherapee.RawTherapee.appdata.xml | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/com.rawtherapee.RawTherapee.appdata.xml b/com.rawtherapee.RawTherapee.appdata.xml index 41a669532..3a55109ba 100644 --- a/com.rawtherapee.RawTherapee.appdata.xml +++ b/com.rawtherapee.RawTherapee.appdata.xml @@ -33,17 +33,21 @@ rawtherapee-cli - - HDR DNG of a misty morning in the countryside - https://rawtherapee.com/images/screenshots/rt540_1.jpg + + Color correction + https://rawtherapee.com/images/screenshots/rt57_drosera_rotundifolia.png - Straight-out-of-camera vs RawTherapee - https://rawtherapee.com/images/screenshots/rt540_2.jpg + File browser + https://rawtherapee.com/images/screenshots/rt57_file_browser.png - - RawTherapee using the Auto-Matched Tone Curve tool - https://rawtherapee.com/images/screenshots/rt540_3.jpg + + High dynamic range compression + https://rawtherapee.com/images/screenshots/rt57_field_sunset.png + + + Developing a film negative + https://rawtherapee.com/images/screenshots/rt57_film_negative.png contactus@rawtherapee.com From f03605b73526235c27832f5815359943f4e0441e Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 23 Sep 2019 13:39:21 +0200 Subject: [PATCH 036/208] boxblur: apply changes requested by @Floessie in code review --- rtengine/boxblur.h | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/rtengine/boxblur.h b/rtengine/boxblur.h index 5cc7430e2..27aa9d2fc 100644 --- a/rtengine/boxblur.h +++ b/rtengine/boxblur.h @@ -20,6 +20,7 @@ #define _BOXBLUR_H_ #include +#include #include #include #include @@ -337,9 +338,10 @@ inline void boxblur (float** src, float** dst, int radius, int W, int H, bool mu #pragma omp parallel if (multiThread) #endif { - float* const buffer = new float[std::max(W, 8 * H)]; + std::unique_ptr buffer(new float[std::max(W, 8 * H)]); + //horizontal blur - float* const lineBuffer = buffer; + float* const lineBuffer = buffer.get(); #ifdef _OPENMP #pragma omp for #endif @@ -356,8 +358,9 @@ inline void boxblur (float** src, float** dst, int radius, int W, int H, bool mu for (int col = 1; col <= radius; col++) { lineBuffer[col] = src[row][col]; - dst[row][col] = tempval = (tempval * len + src[row][col + radius]) / (len + 1); - len ++; + tempval = (tempval * len + src[row][col + radius]) / (len + 1); + dst[row][col] = tempval; + ++len; } for (int col = radius + 1; col < W - radius; col++) { @@ -367,15 +370,15 @@ inline void boxblur (float** src, float** dst, int radius, int W, int H, bool mu for (int col = W - radius; col < W; col++) { dst[row][col] = tempval = (tempval * len - lineBuffer[col - radius - 1]) / (len - 1); - len --; + --len; } } //vertical blur #ifdef __SSE2__ - vfloat (* const rowBuffer)[2] = (vfloat(*)[2]) buffer; - vfloat leninitv = F2V(radius + 1); - vfloat onev = F2V(1.f); + vfloat (* const rowBuffer)[2] = (vfloat(*)[2]) buffer.get(); + const vfloat leninitv = F2V(radius + 1); + const vfloat onev = F2V(1.f); vfloat tempv, temp1v, lenv, lenp1v, lenm1v, rlenv; #ifdef _OPENMP @@ -432,7 +435,7 @@ inline void boxblur (float** src, float** dst, int radius, int W, int H, bool mu } #else - float (* const rowBuffer)[8] = (float(*)[8]) buffer; + float (* const rowBuffer)[8] = (float(*)[8]) buffer.get(); #ifdef _OPENMP #pragma omp for nowait #endif @@ -440,12 +443,12 @@ inline void boxblur (float** src, float** dst, int radius, int W, int H, bool mu for (int col = 0; col < W - numCols + 1; col += 8) { float len = radius + 1; - for(int k = 0; k < numCols; k++) { + for (int k = 0; k < numCols; k++) { rowBuffer[0][k] = dst[0][col + k]; } for (int i = 1; i <= radius; i++) { - for(int k = 0; k < numCols; k++) { + for (int k = 0; k < numCols; k++) { dst[0][col + k] += dst[i][col + k]; } } @@ -488,7 +491,7 @@ inline void boxblur (float** src, float** dst, int radius, int W, int H, bool mu const int remaining = W % numCols; if (remaining > 0) { - float (* const rowBuffer)[8] = (float(*)[8]) buffer; + float (* const rowBuffer)[8] = (float(*)[8]) buffer.get(); const int col = W - remaining; float len = radius + 1; @@ -525,7 +528,6 @@ inline void boxblur (float** src, float** dst, int radius, int W, int H, bool mu } } } - delete [] buffer; } } From 3ca7f09655e0c703a7d23c74414723d8f0d7b8a4 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 23 Sep 2019 13:39:50 +0200 Subject: [PATCH 037/208] guidedfilter: apply changes requested by @Floessie in code review --- rtengine/guidedfilter.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rtengine/guidedfilter.cc b/rtengine/guidedfilter.cc index 8d19fc7a5..159e89504 100644 --- a/rtengine/guidedfilter.cc +++ b/rtengine/guidedfilter.cc @@ -66,7 +66,7 @@ void guidedFilter(const array2D &guide, const array2D &src, array2 enum Op {MUL, DIVEPSILON, SUBMUL}; const auto apply = - [=](Op op, array2D &res, const array2D &a, const array2D &b, const array2D &c=array2D()) -> void + [multithread, epsilon](Op op, array2D &res, const array2D &a, const array2D &b, const array2D &c=array2D()) -> void { const int w = res.width(); const int h = res.height(); @@ -96,13 +96,13 @@ void guidedFilter(const array2D &guide, const array2D &src, array2 }; const auto f_subsample = - [=](array2D &d, const array2D &s) -> void + [multithread](array2D &d, const array2D &s) -> void { rescaleBilinear(s, d, multithread); }; const auto f_mean = - [&](array2D &d, array2D &s, int rad) -> void + [multithread](array2D &d, array2D &s, int rad) -> void { rad = LIM(rad, 0, (min(s.width(), s.height()) - 1) / 2 - 1); boxblur(s, d, rad, s.width(), s.height(), multithread); From 7a8225d2745ef86eb71b537a2a852cbdf9882f26 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 23 Sep 2019 13:40:19 +0200 Subject: [PATCH 038/208] procparams: apply changes requested by @Floessie in code review --- rtengine/procparams.cc | 1 + rtengine/procparams.h | 1 + 2 files changed, 2 insertions(+) diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 734796cd8..8de7e2b55 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -3243,6 +3243,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->dehaze.showDepthMap, "Dehaze", "ShowDepthMap", dehaze.showDepthMap, keyFile); saveToKeyfile(!pedited || pedited->dehaze.depth, "Dehaze", "Depth", dehaze.depth, keyFile); saveToKeyfile(!pedited || pedited->dehaze.depth, "Dehaze", "Luminance", dehaze.luminance, keyFile); + // Directional pyramid denoising saveToKeyfile(!pedited || pedited->dirpyrDenoise.enabled, "Directional Pyramid Denoising", "Enabled", dirpyrDenoise.enabled, keyFile); saveToKeyfile(!pedited || pedited->dirpyrDenoise.enhance, "Directional Pyramid Denoising", "Enhance", dirpyrDenoise.enhance, keyFile); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 0ef0f045b..734ca7556 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1344,6 +1344,7 @@ struct DehazeParams { bool showDepthMap; int depth; bool luminance; + DehazeParams(); bool operator==(const DehazeParams &other) const; From 204475dd05576f9e2d4b8b8d8e443603f1f3d9aa Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 23 Sep 2019 13:42:23 +0200 Subject: [PATCH 039/208] sleefsseavx: added horizontal min and max --- rtengine/sleefsseavx.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/rtengine/sleefsseavx.c b/rtengine/sleefsseavx.c index 3000c1c10..cce88df5d 100644 --- a/rtengine/sleefsseavx.c +++ b/rtengine/sleefsseavx.c @@ -1390,6 +1390,18 @@ static inline float vhadd( vfloat a ) { return _mm_cvtss_f32(_mm_add_ss(a, _mm_shuffle_ps(a, a, 1))); } +static inline float vhmin(vfloat a) { + // returns min(a[0], a[1], a[2], a[3]) + a = vminf(a, _mm_movehl_ps(a, a)); + return _mm_cvtss_f32(vminf(a, _mm_shuffle_ps(a, a, 1))); +} + +static inline float vhmax(vfloat a) { + // returns max(a[0], a[1], a[2], a[3]) + a = vmaxf(a, _mm_movehl_ps(a, a)); + return _mm_cvtss_f32(vmaxf(a, _mm_shuffle_ps(a, a, 1))); +} + static INLINE vfloat vmul2f(vfloat a){ // fastest way to multiply by 2 return a + a; From 9cff2bca486e36b8bedc2612d26587d938df5c6a Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 23 Sep 2019 13:43:43 +0200 Subject: [PATCH 040/208] dehaze: speedup and changes requested by @Floessie in code review, #5456 --- rtengine/ipdehaze.cc | 57 +++++++++++++++++++++++++++++++------------- 1 file changed, 40 insertions(+), 17 deletions(-) diff --git a/rtengine/ipdehaze.cc b/rtengine/ipdehaze.cc index 8ba1b935a..fb4f73903 100644 --- a/rtengine/ipdehaze.cc +++ b/rtengine/ipdehaze.cc @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . - */ +*/ /* * Haze removal using the algorithm described in the paper: @@ -26,7 +26,7 @@ * * using a guided filter for the "soft matting" of the transmission map * - */ +*/ #include #include @@ -52,7 +52,7 @@ float normalize(Imagefloat *rgb, bool multithread) const int W = rgb->getWidth(); const int H = rgb->getHeight(); #ifdef _OPENMP -# pragma omp parallel for reduction(max:maxval) if (multithread) + #pragma omp parallel for reduction(max:maxval) schedule(dynamic, 16) if (multithread) #endif for (int y = 0; y < H; ++y) { for (int x = 0; x < W; ++x) { @@ -61,7 +61,7 @@ float normalize(Imagefloat *rgb, bool multithread) } maxval = max(maxval * 2.f, 65535.f); #ifdef _OPENMP -# pragma omp parallel for if (multithread) + #pragma omp parallel for schedule(dynamic, 16) if (multithread) #endif for (int y = 0; y < H; ++y) { for (int x = 0; x < W; ++x) { @@ -102,13 +102,36 @@ int get_dark_channel(const array2D &R, const array2D &G, const arr for (int y = 0; y < H; y += patchsize) { const int pH = min(y + patchsize, H); for (int x = 0; x < W; x += patchsize) { - float val = RT_INFINITY_F; + float minR = RT_INFINITY_F; + float minG = RT_INFINITY_F; + float minB = RT_INFINITY_F; +#ifdef __SSE2__ + vfloat minRv = F2V(minR); + vfloat minGv = F2V(minG); + vfloat minBv = F2V(minB); +#endif const int pW = min(x + patchsize, W); - for (int xx = x; xx < pW; ++xx) { - for (int yy = y; yy < pH; ++yy) { - val = min(val, R[yy][xx] / ambient[0], G[yy][xx] / ambient[1], B[yy][xx] / ambient[2]); + for (int yy = y; yy < pH; ++yy) { + int xx = x; +#ifdef __SSE2__ + for (; xx < pW - 3; xx += 4) { + minRv = vminf(minRv, LVFU(R[yy][xx])); + minGv = vminf(minGv, LVFU(G[yy][xx])); + minBv = vminf(minBv, LVFU(B[yy][xx])); + } +#endif + for (; xx < pW; ++xx) { + minR = min(minR, R[yy][xx]); + minG = min(minG, G[yy][xx]); + minB = min(minB, B[yy][xx]); } } +#ifdef __SSE2__ + minR = min(minR, vhmin(minRv)); + minG = min(minG, vhmin(minGv)); + minB = min(minB, vhmin(minBv)); +#endif + float val = min(minR / ambient[0], minG / ambient[1], minB / ambient[2]); val = 1.f - strength * LIM01(val); for (int yy = y; yy < pH; ++yy) { std::fill(dst[yy] + x, dst[yy] + pW, val); @@ -269,25 +292,25 @@ BENCHFUN int patchsize = max(int(5 / scale), 2); float ambient[3]; - float max_t = 0.f; + float maxDistance = 0.f; { - array2D R(W, H); + array2D& R = dark; // R and dark can safely use the same buffer, which is faster and reduces memory allocations/deallocations array2D G(W, H); array2D B(W, H); extract_channels(img, R, G, B, patchsize, 1e-1, multiThread); { constexpr int sizecap = 200; - float r = float(W)/float(H); + const float r = static_cast(W) / static_cast(H); const int hh = r >= 1.f ? sizecap : sizecap / r; const int ww = r >= 1.f ? sizecap * r : sizecap; if (W <= ww && H <= hh) { // don't rescale small thumbs array2D D(W, H); - int npatches = get_dark_channel_downsized(R, G, B, D, 2, multiThread); - max_t = estimate_ambient_light(R, G, B, D, patchsize, npatches, ambient); + const int npatches = get_dark_channel_downsized(R, G, B, D, 2, multiThread); + maxDistance = estimate_ambient_light(R, G, B, D, patchsize, npatches, ambient); } else { array2D RR(ww, hh); array2D GG(ww, hh); @@ -297,8 +320,8 @@ BENCHFUN rescaleNearest(B, BB, multiThread); array2D D(ww, hh); - int npatches = get_dark_channel_downsized(RR, GG, BB, D, 2, multiThread); - max_t = estimate_ambient_light(RR, GG, BB, D, patchsize, npatches, ambient); + const int npatches = get_dark_channel_downsized(RR, GG, BB, D, 2, multiThread); + maxDistance = estimate_ambient_light(RR, GG, BB, D, patchsize, npatches, ambient); } } @@ -327,11 +350,11 @@ BENCHFUN guidedFilter(guideB, dark, dark, radius, epsilon, multiThread); if (options.rtSettings.verbose) { - std::cout << "dehaze: max distance is " << max_t << std::endl; + std::cout << "dehaze: max distance is " << maxDistance << std::endl; } const float depth = -float(params->dehaze.depth) / 100.f; - const float t0 = max(1e-3f, std::exp(depth * max_t)); + const float t0 = max(1e-3f, std::exp(depth * maxDistance)); const float teps = 1e-3f; const bool luminance = params->dehaze.luminance; From c83b577dc7b06a8d092c27f60f2e47911e5caba8 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 23 Sep 2019 14:22:14 +0200 Subject: [PATCH 041/208] hasselblad_load_raw: apply changes requested by @Floessie in code review --- rtengine/dcraw.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index 5275c42c1..c9c66a8fb 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -2440,10 +2440,10 @@ void CLASS hasselblad_load_raw() } for (int col = 0; col < raw_width; col += 2) { for (int s = 0; s < tiff_samples * 2; s += 2) { - int len[2]; - for (int c = 0; c < 2; ++c) { - len[c] = ph1_huff(jh.huff[0]); - } + const int len[2]= { + ph1_huff(jh.huff[0]), + ph1_huff(jh.huff[0]) + }; for (int c = 0; c < 2; ++c) { diff[s + c] = hb_bits(len[c]); if ((diff[s + c] & (1 << (len[c] - 1))) == 0) { From 1e41ee62650fc27129a1b602539536434949372d Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 23 Sep 2019 15:54:11 +0200 Subject: [PATCH 042/208] dehaze: fix two cppcheck style warnings, #5456 --- rtengine/ipdehaze.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtengine/ipdehaze.cc b/rtengine/ipdehaze.cc index fb4f73903..d36c876c2 100644 --- a/rtengine/ipdehaze.cc +++ b/rtengine/ipdehaze.cc @@ -91,7 +91,7 @@ void restore(Imagefloat *rgb, float maxval, bool multithread) } } -int get_dark_channel(const array2D &R, const array2D &G, const array2D &B, array2D &dst, int patchsize, const float ambient[3], bool clip, bool multithread, float strength) +int get_dark_channel(const array2D &R, const array2D &G, const array2D &B, const array2D &dst, int patchsize, const float ambient[3], bool clip, bool multithread, float strength) { const int W = R.width(); const int H = R.height(); @@ -142,7 +142,7 @@ int get_dark_channel(const array2D &R, const array2D &G, const arr return (W / patchsize + ((W % patchsize) > 0)) * (H / patchsize + ((H % patchsize) > 0)); } -int get_dark_channel_downsized(const array2D &R, const array2D &G, const array2D &B, array2D &dst, int patchsize, bool multithread) +int get_dark_channel_downsized(const array2D &R, const array2D &G, const array2D &B, const array2D &dst, int patchsize, bool multithread) { const int W = R.width(); const int H = R.height(); From d1ccf27780d8825eadab1effc5fb38af96707497 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 23 Sep 2019 16:32:23 +0200 Subject: [PATCH 043/208] Capture sharpening: add missing history message --- rtdata/languages/default | 1 + 1 file changed, 1 insertion(+) diff --git a/rtdata/languages/default b/rtdata/languages/default index be1638e8e..d54536603 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -770,6 +770,7 @@ HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CAS - Auto radius HISTORY_MSG_PDSHARPEN_GAMMA;CAS - Gamma HISTORY_MSG_PDSHARPEN_ITERATIONS;CAS - Iterations HISTORY_MSG_PDSHARPEN_RADIUS;CAS - Radius +HISTORY_MSG_PDSHARPEN_RADIUS_OFFSET;CAS - Radius offset HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter From 8d5c999ad84946f127815416f39cfc389f6d30da Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 23 Sep 2019 16:44:55 +0200 Subject: [PATCH 044/208] hasselblad_load_raw: fix warning --- rtengine/dcraw.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index ad634c1e3..ef209118b 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -2441,8 +2441,8 @@ void CLASS hasselblad_load_raw() for (int col = 0; col < raw_width; col += 2) { for (int s = 0; s < tiff_samples * 2; s += 2) { const int len[2]= { - ph1_huff(jh.huff[0]), - ph1_huff(jh.huff[0]) + static_cast(ph1_huff(jh.huff[0])), + static_cast(ph1_huff(jh.huff[0])) }; for (int c = 0; c < 2; ++c) { diff[s + c] = hb_bits(len[c]); From 57466be795ee871cc04bbbce9b399e1ee05db814 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 23 Sep 2019 20:33:32 +0200 Subject: [PATCH 045/208] Capture sharpening: Label and tooltip changes, also renamed key for favorite tab to capturesharpening --- rtdata/languages/default | 5 ++--- rtgui/pdsharpening.cc | 10 +++++----- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index d54536603..aabff4bbe 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -770,7 +770,7 @@ HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CAS - Auto radius HISTORY_MSG_PDSHARPEN_GAMMA;CAS - Gamma HISTORY_MSG_PDSHARPEN_ITERATIONS;CAS - Iterations HISTORY_MSG_PDSHARPEN_RADIUS;CAS - Radius -HISTORY_MSG_PDSHARPEN_RADIUS_OFFSET;CAS - Radius offset +HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CAS - Corner radius boost HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter @@ -1802,7 +1802,6 @@ TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Roundness:\n0 = rectangle,\n50 = fitted ellipse, TP_PCVIGNETTE_STRENGTH;Strength TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filter strength in stops (reached in corners). TP_PDSHARPENING_LABEL;Capture Sharpening -TP_PDSHARPENING_AUTORADIUS_TOOLTIP;If the checkbox is checked, RawTherapee calculates a value based on the raw data of the image. TP_PERSPECTIVE_HORIZONTAL;Horizontal TP_PERSPECTIVE_LABEL;Perspective TP_PERSPECTIVE_VERTICAL;Vertical @@ -2038,7 +2037,7 @@ TP_SHARPENING_LABEL;Sharpening TP_SHARPENING_METHOD;Method TP_SHARPENING_ONLYEDGES;Sharpen only edges TP_SHARPENING_RADIUS;Radius -TP_SHARPENING_RADIUS_OFFSET;Radius corner offset +TP_SHARPENING_RADIUS_BOOST;Corner radius boost TP_SHARPENING_RLD;RL Deconvolution TP_SHARPENING_RLD_AMOUNT;Amount TP_SHARPENING_RLD_DAMPING;Damping diff --git a/rtgui/pdsharpening.cc b/rtgui/pdsharpening.cc index f25e44e69..cd34a466e 100644 --- a/rtgui/pdsharpening.cc +++ b/rtgui/pdsharpening.cc @@ -26,14 +26,14 @@ using namespace rtengine; using namespace rtengine::procparams; -PdSharpening::PdSharpening() : FoldableToolPanel(this, "pdsharpening", M("TP_PDSHARPENING_LABEL"), false, true) +PdSharpening::PdSharpening() : FoldableToolPanel(this, "capturesharpening", M("TP_PDSHARPENING_LABEL"), false, true) { auto m = ProcEventMapper::getInstance(); EvPdShrContrast = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_CONTRAST"); EvPdSharpenGamma = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_GAMMA"); EvPdShrDRadius = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_RADIUS"); - EvPdShrDRadiusOffset = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_RADIUS_OFFSET"); + EvPdShrDRadiusOffset = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_RADIUS_BOOST"); EvPdShrDIterations = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_ITERATIONS"); EvPdShrAutoContrast = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST"); EvPdShrAutoRadius = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_AUTO_RADIUS"); @@ -42,7 +42,7 @@ PdSharpening::PdSharpening() : FoldableToolPanel(this, "pdsharpening", M("TP_PDS hb->show(); contrast = Gtk::manage(new Adjuster(M("TP_SHARPENING_CONTRAST"), 0, 200, 1, 10)); contrast->setAdjusterListener(this); - contrast->addAutoButton(M("TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP")); + contrast->addAutoButton(); contrast->setAutoValue(true); pack_start(*contrast); @@ -53,9 +53,9 @@ PdSharpening::PdSharpening() : FoldableToolPanel(this, "pdsharpening", M("TP_PDS Gtk::VBox* rld = Gtk::manage(new Gtk::VBox()); gamma = Gtk::manage(new Adjuster(M("TP_SHARPENING_GAMMA"), 0.5, 6.0, 0.05, 1.00)); dradius = Gtk::manage(new Adjuster(M("TP_SHARPENING_RADIUS"), 0.4, 1.15, 0.01, 0.75)); - dradius->addAutoButton(M("TP_PDSHARPENING_AUTORADIUS_TOOLTIP")); + dradius->addAutoButton(); dradius->setAutoValue(true); - dradiusOffset = Gtk::manage(new Adjuster(M("TP_SHARPENING_RADIUS_OFFSET"), 0.0, 0.5, 0.01, 0.0)); + dradiusOffset = Gtk::manage(new Adjuster(M("TP_SHARPENING_RADIUS_BOOST"), 0.0, 0.5, 0.01, 0.0)); diter = Gtk::manage(new Adjuster(M("TP_SHARPENING_RLD_ITERATIONS"), 1, 100, 1, 20)); rld->pack_start(*gamma); rld->pack_start(*dradius); From e62b004434e72c042bd8d05dabae74417482feee Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 23 Sep 2019 22:14:52 +0200 Subject: [PATCH 046/208] dehaze: removed benchmark code --- rtengine/ipdehaze.cc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/rtengine/ipdehaze.cc b/rtengine/ipdehaze.cc index d36c876c2..e7bf71ba6 100644 --- a/rtengine/ipdehaze.cc +++ b/rtengine/ipdehaze.cc @@ -37,8 +37,6 @@ #include "procparams.h" #include "rescale.h" #include "rt_math.h" -#define BENCHMARK -#include "StopWatch.h" extern Options options; @@ -277,7 +275,7 @@ void ImProcFunctions::dehaze(Imagefloat *img) if (!params->dehaze.enabled || params->dehaze.strength == 0.0) { return; } -BENCHFUN + const float maxChannel = normalize(img, multiThread); const int W = img->getWidth(); From 5b72cc0dd3ce0288408ee0a1b0785f7c603a059e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Tue, 24 Sep 2019 09:59:31 +0200 Subject: [PATCH 047/208] Quote parameters correctly for Linux when spawning (#5463) --- rtgui/extprog.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/rtgui/extprog.cc b/rtgui/extprog.cc index a6a9050c0..95c1c937d 100644 --- a/rtgui/extprog.cc +++ b/rtgui/extprog.cc @@ -58,7 +58,7 @@ bool ExtProgAction::execute (const std::vector& fileNames) const } for (const auto& fileName : fileNames) { - cmdLine += " \"" + fileName + "\""; + cmdLine += " " + Glib::shell_quote(fileName); } return ExtProgStore::spawnCommandAsync (cmdLine); @@ -256,7 +256,7 @@ bool ExtProgStore::openInGimp (const Glib::ustring& fileName) #else - auto cmdLine = Glib::ustring("gimp \"") + fileName + Glib::ustring("\""); + auto cmdLine = Glib::ustring("gimp ") + Glib::shell_quote(fileName); auto success = spawnCommandAsync (cmdLine); #endif @@ -291,7 +291,7 @@ bool ExtProgStore::openInGimp (const Glib::ustring& fileName) #else - cmdLine = Glib::ustring("gimp-remote \"") + fileName + Glib::ustring("\""); + cmdLine = Glib::ustring("gimp-remote ") + Glib::shell_quote(fileName); success = ExtProgStore::spawnCommandAsync (cmdLine); #endif @@ -312,7 +312,7 @@ bool ExtProgStore::openInPhotoshop (const Glib::ustring& fileName) #else - const auto cmdLine = Glib::ustring("\"") + Glib::build_filename(options.psDir, "Photoshop.exe") + Glib::ustring("\" \"") + fileName + Glib::ustring("\""); + const auto cmdLine = Glib::ustring("\"") + Glib::build_filename(options.psDir, "Photoshop.exe") + "\" " + Glib::shell_quote(fileName); #endif @@ -334,7 +334,7 @@ bool ExtProgStore::openInCustomEditor (const Glib::ustring& fileName) #else - const auto cmdLine = Glib::ustring("\"") + options.customEditorProg + Glib::ustring("\" \"") + fileName + Glib::ustring("\""); + const auto cmdLine = Glib::ustring("\"") + options.customEditorProg + "\" " + Glib::shell_quote(fileName); return spawnCommandAsync (cmdLine); #endif From 54ca2977c3ee3219d96b84fbdb0a2bbbce4f1af7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Tue, 24 Sep 2019 14:54:13 +0200 Subject: [PATCH 048/208] Add missing inits and header to `PdSharpening` --- rtgui/pdsharpening.cc | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/rtgui/pdsharpening.cc b/rtgui/pdsharpening.cc index cd34a466e..3134afa1c 100644 --- a/rtgui/pdsharpening.cc +++ b/rtgui/pdsharpening.cc @@ -18,17 +18,23 @@ */ #include -#include "eventmapper.h" +#include + #include "pdsharpening.h" + +#include "eventmapper.h" #include "options.h" + #include "../rtengine/procparams.h" using namespace rtengine; using namespace rtengine::procparams; -PdSharpening::PdSharpening() : FoldableToolPanel(this, "capturesharpening", M("TP_PDSHARPENING_LABEL"), false, true) +PdSharpening::PdSharpening() : + FoldableToolPanel(this, "capturesharpening", M("TP_PDSHARPENING_LABEL"), false, true), + lastAutoContrast(true), + lastAutoRadius(true) { - auto m = ProcEventMapper::getInstance(); EvPdShrContrast = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_CONTRAST"); EvPdSharpenGamma = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_GAMMA"); From 26bfb526bf8abd87b2f52022bb7537f98ab5a8ba Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Tue, 24 Sep 2019 17:52:12 +0200 Subject: [PATCH 049/208] Deleted obsolete travis.yml file --- .travis.yml.fixme | 44 -------------------------------------------- 1 file changed, 44 deletions(-) delete mode 100644 .travis.yml.fixme diff --git a/.travis.yml.fixme b/.travis.yml.fixme deleted file mode 100644 index 0aa85f3b4..000000000 --- a/.travis.yml.fixme +++ /dev/null @@ -1,44 +0,0 @@ -sudo: required -dist: trusty - -language: cpp - -compiler: - - gcc - -os: - - linux - -#branches: -# only: -# - master - -notifications: - irc: - channels: - - "chat.freenode.net#rawtherapee" - skip_join: true - template: - - "%{repository}/%{branch} (%{commit} - %{author}): %{build_url}: %{message}" - email: - on_success: change - on_failure: always - -env: - global: - - OMP_NUM_THREADS=4 - -before_install: - - sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y - - sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu/ xenial main" - - sudo apt-get -qq update - - sudo apt-get install gcc-6 g++-6 - - sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-6 60 --slave /usr/bin/g++ g++ /usr/bin/g++-6 - - sudo apt-get install build-essential cmake curl git libbz2-dev libcanberra-gtk3-dev libexiv2-dev libexpat-dev libfftw3-dev libglibmm-2.4-dev libgtk-3-dev libgtkmm-3.0-dev libiptcdata0-dev libjpeg8-dev liblcms2-dev libpng12-dev libsigc++-2.0-dev libtiff5-dev zlib1g-dev - -before_script: - - mkdir build - - cd build - - cmake -DCMAKE_CXX_FLAGS="-Wno-deprecated-declarations" -DWITH_LTO="OFF" -DPROC_TARGET_NUMBER="2" .. - -script: make From 79b3ff8e6e559e85c5eec1a80460f5da4212447e Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 24 Sep 2019 18:59:02 +0200 Subject: [PATCH 050/208] capture sharpening: allow negative corner boost --- rtengine/capturesharpening.cc | 17 ++++++++++------- rtgui/pdsharpening.cc | 2 +- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index e08243713..ef8a55a6e 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -581,14 +581,17 @@ BENCHFUN gauss5x5mult(tmpThr, tmpIThr, fullTileSize, fullTileSize, kernel5); } } else { - if (sigmaCornerOffset > 0.0) { - float lkernel7[7][7]; + if (sigmaCornerOffset != 0.0) { const float distance = sqrt(rtengine::SQR(i + tileSize / 2 - H / 2) + rtengine::SQR(j + tileSize / 2 - W / 2)); - compute7x7kernel(sigma + distanceFactor * distance, lkernel7); - for (int k = 0; k < iterations - 1; ++k) { - // apply 7x7 gaussian blur and divide luminance by result of gaussian blur - gauss7x7div(tmpIThr, tmpThr, lumThr, fullTileSize, fullTileSize, lkernel7); - gauss7x7mult(tmpThr, tmpIThr, fullTileSize, fullTileSize, lkernel7); + const float sigmaTile = sigma + distanceFactor * distance; + if (sigmaTile >= 0.4f) { + float lkernel7[7][7]; + compute7x7kernel(sigma + distanceFactor * distance, lkernel7); + for (int k = 0; k < iterations - 1; ++k) { + // apply 7x7 gaussian blur and divide luminance by result of gaussian blur + gauss7x7div(tmpIThr, tmpThr, lumThr, fullTileSize, fullTileSize, lkernel7); + gauss7x7mult(tmpThr, tmpIThr, fullTileSize, fullTileSize, lkernel7); + } } } else { for (int k = 0; k < iterations; ++k) { diff --git a/rtgui/pdsharpening.cc b/rtgui/pdsharpening.cc index cd34a466e..759461ba5 100644 --- a/rtgui/pdsharpening.cc +++ b/rtgui/pdsharpening.cc @@ -55,7 +55,7 @@ PdSharpening::PdSharpening() : FoldableToolPanel(this, "capturesharpening", M("T dradius = Gtk::manage(new Adjuster(M("TP_SHARPENING_RADIUS"), 0.4, 1.15, 0.01, 0.75)); dradius->addAutoButton(); dradius->setAutoValue(true); - dradiusOffset = Gtk::manage(new Adjuster(M("TP_SHARPENING_RADIUS_BOOST"), 0.0, 0.5, 0.01, 0.0)); + dradiusOffset = Gtk::manage(new Adjuster(M("TP_SHARPENING_RADIUS_BOOST"), -0.5, 0.5, 0.01, 0.0)); diter = Gtk::manage(new Adjuster(M("TP_SHARPENING_RLD_ITERATIONS"), 1, 100, 1, 20)); rld->pack_start(*gamma); rld->pack_start(*dradius); From 851a12e165c50333dcd779f78ea0658c38798972 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 24 Sep 2019 19:18:26 +0200 Subject: [PATCH 051/208] capture sharpening: more clear variable names --- rtengine/capturesharpening.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index ef8a55a6e..6720d9abc 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -532,9 +532,9 @@ BENCHFUN constexpr int tileSize = 194; constexpr int border = 5; constexpr int fullTileSize = tileSize + 2 * border; - const float maxRadius = std::min(1.15f, sigma + sigmaCornerOffset); - const float maxDistance = sqrt(rtengine::SQR(W * 0.5f) + rtengine::SQR(H * 0.5f)); - const float distanceFactor = (maxRadius - sigma) / maxDistance; + const float cornerRadius = std::min(1.15f, sigma + sigmaCornerOffset); + const float cornerDistance = sqrt(rtengine::SQR(W * 0.5f) + rtengine::SQR(H * 0.5f)); + const float distanceFactor = (cornerRadius - sigma) / cornerDistance; double progress = startVal; const double progressStep = (endVal - startVal) * rtengine::SQR(tileSize) / (W * H); From 5a19632475eda7958d93a9c9ce94fa3841fca7b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Wed, 25 Sep 2019 11:33:56 +0200 Subject: [PATCH 052/208] Fix non-SSE2 build --- rtengine/color.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rtengine/color.h b/rtengine/color.h index 1031ca150..97835ba10 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -210,10 +210,12 @@ public: return r * workingspace[1][0] + g * workingspace[1][1] + b * workingspace[1][2]; } +#ifdef __SSE2__ static vfloat rgbLuminance(vfloat r, vfloat g, vfloat b, const vfloat workingspace[3]) { return r * workingspace[0] + g * workingspace[1] + b * workingspace[2]; } +#endif /** * @brief Convert red/green/blue to L*a*b From 277c494fefc69a63ddd970af217ef4499616bdf5 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Wed, 25 Sep 2019 11:54:30 +0200 Subject: [PATCH 053/208] Downgrade desktop file to Version=1.0, #5470 Version=1.1 caused Travis CI builds to fail. Version 1.1 was necessary only to standardize the Keywords key, but this key is a potential pitfall and unnecessary. --- rtdata/rawtherapee.desktop.in | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rtdata/rawtherapee.desktop.in b/rtdata/rawtherapee.desktop.in index c6c675c4d..107ce2a42 100644 --- a/rtdata/rawtherapee.desktop.in +++ b/rtdata/rawtherapee.desktop.in @@ -1,6 +1,6 @@ [Desktop Entry] Type=Application -Version=1.1 +Version=1.0 Name=RawTherapee GenericName=Raw Photo Editor GenericName[cs]=Editor raw obrázků @@ -16,5 +16,4 @@ Exec=rawtherapee %f Terminal=false MimeType=image/jpeg;image/png;image/tiff;image/x-adobe-dng;image/x-canon-cr2;image/x-canon-crf;image/x-canon-crw;image/x-fuji-raf;image/x-hasselblad-3fr;image/x-hasselblad-fff;image/x-jpg;image/x-kodak-dcr;image/x-kodak-k25;image/x-kodak-kdc;image/x-leaf-mos;image/x-leica-rwl;image/x-mamiya-mef;image/x-minolta-mrw;image/x-nikon-nef;image/x-nikon-nrw;image/x-olympus-orf;image/x-panasonic-raw;image/x-panasonic-rw2;image/x-pentax-pef;image/x-pentax-raw;image/x-phaseone-iiq;image/x-raw;image/x-rwz;image/x-samsung-srw;image/x-sigma-x3f;image/x-sony-arq;image/x-sony-arw;image/x-sony-sr2;image/x-sony-srf;image/x-tif; Categories=Graphics;Photography;2DGraphics;RasterGraphics;GTK; -Keywords=raw;photo;photography;develop;pp3;graphics; StartupWMClass=rawtherapee From b86b7a4af6f9b7248d9d3af0bc77395475a7721c Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Wed, 25 Sep 2019 12:08:43 +0200 Subject: [PATCH 054/208] Reverted Keywords key in desktop file, #5470 --- rtdata/rawtherapee.desktop.in | 1 + 1 file changed, 1 insertion(+) diff --git a/rtdata/rawtherapee.desktop.in b/rtdata/rawtherapee.desktop.in index 107ce2a42..b059e7d6a 100644 --- a/rtdata/rawtherapee.desktop.in +++ b/rtdata/rawtherapee.desktop.in @@ -16,4 +16,5 @@ Exec=rawtherapee %f Terminal=false MimeType=image/jpeg;image/png;image/tiff;image/x-adobe-dng;image/x-canon-cr2;image/x-canon-crf;image/x-canon-crw;image/x-fuji-raf;image/x-hasselblad-3fr;image/x-hasselblad-fff;image/x-jpg;image/x-kodak-dcr;image/x-kodak-k25;image/x-kodak-kdc;image/x-leaf-mos;image/x-leica-rwl;image/x-mamiya-mef;image/x-minolta-mrw;image/x-nikon-nef;image/x-nikon-nrw;image/x-olympus-orf;image/x-panasonic-raw;image/x-panasonic-rw2;image/x-pentax-pef;image/x-pentax-raw;image/x-phaseone-iiq;image/x-raw;image/x-rwz;image/x-samsung-srw;image/x-sigma-x3f;image/x-sony-arq;image/x-sony-arw;image/x-sony-sr2;image/x-sony-srf;image/x-tif; Categories=Graphics;Photography;2DGraphics;RasterGraphics;GTK; +Keywords=raw;photo;photography;develop;pp3;graphics; StartupWMClass=rawtherapee From ca109814fcfcdc4a64cf483a333b309489e75116 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Wed, 25 Sep 2019 15:18:10 +0200 Subject: [PATCH 055/208] boxblur: further reduction of memory usage --- rtengine/boxblur.h | 64 +++++++++++++++++++++++++++++++--------------- 1 file changed, 43 insertions(+), 21 deletions(-) diff --git a/rtengine/boxblur.h b/rtengine/boxblur.h index 27aa9d2fc..1689c5ed1 100644 --- a/rtengine/boxblur.h +++ b/rtengine/boxblur.h @@ -27,8 +27,6 @@ #include "alignedbuffer.h" #include "rt_math.h" #include "opthelper.h" -#include "StopWatch.h" - namespace rtengine { @@ -338,7 +336,7 @@ inline void boxblur (float** src, float** dst, int radius, int W, int H, bool mu #pragma omp parallel if (multiThread) #endif { - std::unique_ptr buffer(new float[std::max(W, 8 * H)]); + std::unique_ptr buffer(new float[numCols * (radius + 1)]); //horizontal blur float* const lineBuffer = buffer.get(); @@ -362,15 +360,22 @@ inline void boxblur (float** src, float** dst, int radius, int W, int H, bool mu dst[row][col] = tempval; ++len; } - + int pos = 0; for (int col = radius + 1; col < W - radius; col++) { - lineBuffer[col] = src[row][col]; - dst[row][col] = tempval = tempval + (src[row][col + radius] - lineBuffer[col - radius - 1]) / len; + const float oldVal = lineBuffer[pos]; + lineBuffer[pos] = src[row][col]; + tempval = tempval + (src[row][col + radius] - oldVal) / len; + dst[row][col] = tempval; + ++pos; + pos = pos <= radius ? pos : 0; } for (int col = W - radius; col < W; col++) { - dst[row][col] = tempval = (tempval * len - lineBuffer[col - radius - 1]) / (len - 1); + tempval = (tempval * len - lineBuffer[pos]) / (len - 1); + dst[row][col] = tempval; --len; + ++pos; + pos = pos <= radius ? pos : 0; } } @@ -414,23 +419,29 @@ inline void boxblur (float** src, float** dst, int radius, int W, int H, bool mu } rlenv = onev / lenv; - + int pos = 0; for (int row = radius + 1; row < H - radius; row++) { - rowBuffer[row][0] = LVFU(dst[row][col]); - rowBuffer[row][1] = LVFU(dst[row][col + 4]); - tempv = tempv + (LVFU(dst[row + radius][col]) - rowBuffer[row - radius - 1][0]) * rlenv ; - temp1v = temp1v + (LVFU(dst[row + radius][col + 4]) - rowBuffer[row - radius - 1][1]) * rlenv ; + vfloat oldVal0 = rowBuffer[pos][0]; + vfloat oldVal1 = rowBuffer[pos][1]; + rowBuffer[pos][0] = LVFU(dst[row][col]); + rowBuffer[pos][1] = LVFU(dst[row][col + 4]); + tempv = tempv + (LVFU(dst[row + radius][col]) - oldVal0) * rlenv ; + temp1v = temp1v + (LVFU(dst[row + radius][col + 4]) - oldVal1) * rlenv ; STVFU(dst[row][col], tempv); STVFU(dst[row][col + 4], temp1v); + ++pos; + pos = pos <= radius ? pos : 0; } for (int row = H - radius; row < H; row++) { lenm1v = lenv - onev; - tempv = (tempv * lenv - rowBuffer[row - radius - 1][0]) / lenm1v; - temp1v = (temp1v * lenv - rowBuffer[row - radius - 1][1]) / lenm1v; + tempv = (tempv * lenv - rowBuffer[pos][0]) / lenm1v; + temp1v = (temp1v * lenv - rowBuffer[pos][1]) / lenm1v; STVFU(dst[row][col], tempv); STVFU(dst[row][col + 4], temp1v); lenv = lenm1v; + ++pos; + pos = pos <= radius ? pos : 0; } } @@ -466,19 +477,24 @@ inline void boxblur (float** src, float** dst, int radius, int W, int H, bool mu len ++; } + int pos = 0; for (int row = radius + 1; row < H - radius; row++) { for(int k = 0; k < numCols; k++) { - rowBuffer[row][k] = dst[row][col + k]; - dst[row][col + k] = dst[row - 1][col + k] + (dst[row + radius][col + k] - rowBuffer[row - radius - 1][k]) / len; + float oldVal = rowBuffer[pos][k]; + rowBuffer[pos][k] = dst[row][col + k]; + dst[row][col + k] = dst[row - 1][col + k] + (dst[row + radius][col + k] - oldVal) / len; } + ++pos; + pos = pos <= radius ? pos : 0; } for (int row = H - radius; row < H; row++) { for(int k = 0; k < numCols; k++) { - dst[row][col + k] = (dst[row - 1][col + k] * len - rowBuffer[row - radius - 1][k]) / (len - 1); + dst[row][col + k] = (dst[row - 1][col + k] * len - rowBuffer[pos][k]) / (len - 1); } - len --; + ++pos; + pos = pos <= radius ? pos : 0; } } @@ -514,17 +530,23 @@ inline void boxblur (float** src, float** dst, int radius, int W, int H, bool mu len ++; } const float rlen = 1.f / len; + int pos = 0; for (int row = radius + 1; row < H - radius; ++row) { for(int k = 0; k < remaining; ++k) { - rowBuffer[row][k] = dst[row][col + k]; - dst[row][col + k] = dst[row - 1][col + k] + (dst[row + radius][col + k] - rowBuffer[row - radius - 1][k]) * rlen; + float oldVal = rowBuffer[pos][k]; + rowBuffer[pos][k] = dst[row][col + k]; + dst[row][col + k] = dst[row - 1][col + k] + (dst[row + radius][col + k] - oldVal) * rlen; } + ++pos; + pos = pos <= radius ? pos : 0; } for (int row = H - radius; row < H; ++row) { for(int k = 0; k < remaining; ++k) { - dst[row][col + k] = (dst[(row - 1)][col + k] * len - rowBuffer[row - radius - 1][k]) / (len - 1); + dst[row][col + k] = (dst[(row - 1)][col + k] * len - rowBuffer[pos][k]) / (len - 1); } len --; + ++pos; + pos = pos <= radius ? pos : 0; } } } From ca42b7b726f901c18153efd3206f1e4fe597b769 Mon Sep 17 00:00:00 2001 From: scx Date: Thu, 26 Sep 2019 04:21:28 +0200 Subject: [PATCH 056/208] Fix launch of custom editor Fixes Beep6581/RawTherapee#5472 --- rtgui/extprog.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/extprog.cc b/rtgui/extprog.cc index 95c1c937d..00ea07713 100644 --- a/rtgui/extprog.cc +++ b/rtgui/extprog.cc @@ -334,7 +334,7 @@ bool ExtProgStore::openInCustomEditor (const Glib::ustring& fileName) #else - const auto cmdLine = Glib::ustring("\"") + options.customEditorProg + "\" " + Glib::shell_quote(fileName); + const auto cmdLine = options.customEditorProg + Glib::ustring(" ") + Glib::shell_quote(fileName); return spawnCommandAsync (cmdLine); #endif From 6bebc19f02f23c5c6af98e44d807ae4c7f9dfee0 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 26 Sep 2019 15:03:09 +0200 Subject: [PATCH 057/208] reviewed boxblur code and usage --- rtengine/CMakeLists.txt | 1 + rtengine/FTblockDN.cc | 212 +++----- rtengine/boxblur.cc | 420 +++++++++++++++ rtengine/boxblur.h | 872 +----------------------------- rtengine/gauss.cc | 12 +- rtengine/gauss.h | 2 +- rtengine/guidedfilter.cc | 2 +- rtengine/improcfun.h | 20 +- rtengine/ipretinex.cc | 1044 +++++++++++++++++------------------- rtengine/ipsharpen.cc | 4 +- rtengine/ipwavelet.cc | 1 - rtengine/rawimagesource.cc | 4 +- rtengine/rawimagesource.h | 2 +- rtengine/rescale.h | 1 + rtengine/shmap.cc | 13 +- 15 files changed, 1015 insertions(+), 1595 deletions(-) create mode 100644 rtengine/boxblur.cc diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt index f52cfa256..add2e51c0 100644 --- a/rtengine/CMakeLists.txt +++ b/rtengine/CMakeLists.txt @@ -31,6 +31,7 @@ set(CAMCONSTSFILE "camconst.json") set(RTENGINESOURCEFILES badpixels.cc + boxblur.cc CA_correct_RT.cc capturesharpening.cc EdgePreservingDecomposition.cc diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index d1e659114..8fd0ba29e 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -479,6 +479,7 @@ enum nrquality {QUALITY_STANDARD, QUALITY_HIGH}; void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagefloat * dst, Imagefloat * calclum, float * ch_M, float *max_r, float *max_b, bool isRAW, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, const NoiseCurve & noiseLCurve, const NoiseCurve & noiseCCurve, float &nresi, float &highresi) { BENCHFUN + //#ifdef _DEBUG MyTime t1e, t2e; t1e.set(); @@ -687,8 +688,8 @@ BENCHFUN } } - int tilesize; - int overlap; + int tilesize = 0; + int overlap = 0; if (settings->leveldnti == 0) { tilesize = 1024; @@ -1341,8 +1342,6 @@ BENCHFUN #ifdef _OPENMP int masterThread = omp_get_thread_num(); -#endif -#ifdef _OPENMP #pragma omp parallel num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif { @@ -1351,11 +1350,9 @@ BENCHFUN #else int subThread = 0; #endif - float blurbuffer[TS * TS] ALIGNED64; float *Lblox = LbloxArray[subThread]; float *fLblox = fLbloxArray[subThread]; float pBuf[width + TS + 2 * blkrad * offset] ALIGNED16; - float nbrwt[TS * TS] ALIGNED64; #ifdef _OPENMP #pragma omp for #endif @@ -1430,7 +1427,7 @@ BENCHFUN for (int hblk = 0; hblk < numblox_W; ++hblk) { - RGBtile_denoise(fLblox, hblk, noisevar_Ldetail, nbrwt, blurbuffer); + RGBtile_denoise(fLblox, hblk, noisevar_Ldetail); }//end of horizontal block loop //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1447,14 +1444,8 @@ BENCHFUN //add row of blocks to output image tile RGBoutput_tile_row(Lblox, Ldetail, tilemask_out, height, width, topproc); - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - }//end of vertical block loop - - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - } - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #ifdef _OPENMP #pragma omp parallel for num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) @@ -2041,26 +2032,20 @@ BENCHFUN }//end of main RGB_denoise - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - -void ImProcFunctions::RGBtile_denoise(float * fLblox, int hblproc, float noisevar_Ldetail, float * nbrwt, float * blurbuffer) //for DCT +void ImProcFunctions::RGBtile_denoise(float* fLblox, int hblproc, float noisevar_Ldetail) //for DCT { - int blkstart = hblproc * TS * TS; + float nbrwt[TS * TS] ALIGNED64; + const int blkstart = hblproc * TS * TS; - boxabsblur(fLblox + blkstart, nbrwt, 3, 3, TS, TS, blurbuffer); //blur neighbor weights for more robust estimation //for DCT + boxabsblur(fLblox + blkstart, nbrwt, 3, TS, TS, false); //blur neighbor weights for more robust estimation //for DCT #ifdef __SSE2__ - __m128 tempv; - __m128 noisevar_Ldetailv = _mm_set1_ps(noisevar_Ldetail); - __m128 onev = _mm_set1_ps(1.0f); + const vfloat noisevar_Ldetailv = F2V(-1.f / noisevar_Ldetail); + const vfloat onev = F2V(1.f); for (int n = 0; n < TS * TS; n += 4) { //for DCT - tempv = onev - xexpf(-SQRV(LVF(nbrwt[n])) / noisevar_Ldetailv); - _mm_storeu_ps(&fLblox[blkstart + n], LVFU(fLblox[blkstart + n]) * tempv); + const vfloat tempv = onev - xexpf(SQRV(LVF(nbrwt[n])) * noisevar_Ldetailv); + STVF(fLblox[blkstart + n], LVF(fLblox[blkstart + n]) * tempv); }//output neighbor averaged result #else @@ -2071,14 +2056,7 @@ void ImProcFunctions::RGBtile_denoise(float * fLblox, int hblproc, float noiseva #endif - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - //printf("vblk=%d hlk=%d wsqave=%f || ",vblproc,hblproc,wsqave); - -}//end of function tile_denoise - - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +} void ImProcFunctions::RGBoutput_tile_row(float *bloxrow_L, float ** Ldetail, float ** tilemask_out, int height, int width, int top) { @@ -2207,7 +2185,7 @@ void ImProcFunctions::Noise_residualAB(const wavelet_decomposition &WaveletCoeff chmaxresid = maxresid; } -bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3]) +bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(const wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3]) { int maxlvl = min(WaveletCoeffs_L.maxlevel(), 5); const float eps = 0.01f; @@ -2258,23 +2236,22 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposition &Wavelet //simple wavelet shrinkage float * sfave = buffer[0] + 32; float * sfaved = buffer[2] + 96; - float * blurBuffer = buffer[1] + 64; float mad_Lr = madL[lvl][dir - 1]; float levelFactor = mad_Lr * 5.f / (lvl + 1); #ifdef __SSE2__ - __m128 mad_Lv; - __m128 ninev = _mm_set1_ps(9.0f); - __m128 epsv = _mm_set1_ps(eps); - __m128 mag_Lv; - __m128 levelFactorv = _mm_set1_ps(levelFactor); + vfloat mad_Lv; + vfloat ninev = F2V(9.0f); + vfloat epsv = F2V(eps); + vfloat mag_Lv; + vfloat levelFactorv = F2V(levelFactor); int coeffloc_L; for (coeffloc_L = 0; coeffloc_L < Hlvl_L * Wlvl_L - 3; coeffloc_L += 4) { mad_Lv = LVFU(noisevarlum[coeffloc_L]) * levelFactorv; mag_Lv = SQRV(LVFU(WavCoeffs_L[dir][coeffloc_L])); - _mm_storeu_ps(&sfave[coeffloc_L], mag_Lv / (mag_Lv + mad_Lv * xexpf(-mag_Lv / (mad_Lv * ninev)) + epsv)); + STVFU(sfave[coeffloc_L], mag_Lv / (mag_Lv + mad_Lv * xexpf(-mag_Lv / (mad_Lv * ninev)) + epsv)); } for (; coeffloc_L < Hlvl_L * Wlvl_L; ++coeffloc_L) { @@ -2294,15 +2271,15 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposition &Wavelet } #endif - boxblur(sfave, sfaved, blurBuffer, lvl + 2, lvl + 2, Wlvl_L, Hlvl_L); //increase smoothness by locally averaging shrinkage + boxblur(sfave, sfaved, lvl + 2, Wlvl_L, Hlvl_L, false); //increase smoothness by locally averaging shrinkage #ifdef __SSE2__ - __m128 sfavev; - __m128 sf_Lv; + vfloat sfavev; + vfloat sf_Lv; for (coeffloc_L = 0; coeffloc_L < Hlvl_L * Wlvl_L - 3; coeffloc_L += 4) { sfavev = LVFU(sfaved[coeffloc_L]); sf_Lv = LVFU(sfave[coeffloc_L]); - _mm_storeu_ps(&WavCoeffs_L[dir][coeffloc_L], LVFU(WavCoeffs_L[dir][coeffloc_L]) * (SQRV(sfavev) + SQRV(sf_Lv)) / (sfavev + sf_Lv + epsv)); + STVFU(WavCoeffs_L[dir][coeffloc_L], LVFU(WavCoeffs_L[dir][coeffloc_L]) * (SQRV(sfavev) + SQRV(sf_Lv)) / (sfavev + sf_Lv + epsv)); //use smoothed shrinkage unless local shrinkage is much less } @@ -2340,7 +2317,7 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposition &Wavelet return (!memoryAllocationFailed); } -bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposition &WaveletCoeffs_L, wavelet_decomposition &WaveletCoeffs_ab, +bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(const wavelet_decomposition &WaveletCoeffs_L, const wavelet_decomposition &WaveletCoeffs_ab, float *noisevarchrom, float madL[8][3], float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb) { int maxlvl = WaveletCoeffs_L.maxlevel(); @@ -2422,12 +2399,12 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposition &Wavele if (noisevar_ab > 0.001f) { #ifdef __SSE2__ - __m128 onev = _mm_set1_ps(1.f); - __m128 mad_abrv = _mm_set1_ps(mad_abr); - __m128 rmad_Lm9v = onev / _mm_set1_ps(mad_Lr * 9.f); - __m128 mad_abv; - __m128 mag_Lv, mag_abv; - __m128 tempabv; + vfloat onev = F2V(1.f); + vfloat mad_abrv = F2V(mad_abr); + vfloat rmad_Lm9v = onev / F2V(mad_Lr * 9.f); + vfloat mad_abv; + vfloat mag_Lv, mag_abv; + vfloat tempabv; int coeffloc_ab; for (coeffloc_ab = 0; coeffloc_ab < Hlvl_ab * Wlvl_ab - 3; coeffloc_ab += 4) { @@ -2437,7 +2414,7 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposition &Wavele mag_Lv = LVFU(WavCoeffs_L[dir][coeffloc_ab]); mag_abv = SQRV(tempabv); mag_Lv = SQRV(mag_Lv) * rmad_Lm9v; - _mm_storeu_ps(&WavCoeffs_ab[dir][coeffloc_ab], tempabv * SQRV((onev - xexpf(-(mag_abv / mad_abv) - (mag_Lv))))); + STVFU(WavCoeffs_ab[dir][coeffloc_ab], tempabv * SQRV((onev - xexpf(-(mag_abv / mad_abv) - (mag_Lv))))); } // few remaining pixels @@ -2470,9 +2447,7 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposition &Wavele } for (int i = 2; i >= 0; i--) { - if (buffer[i] != nullptr) { - delete[] buffer[i]; - } + delete[] buffer[i]; } } @@ -2480,7 +2455,7 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposition &Wavele } -bool ImProcFunctions::WaveletDenoiseAllL(wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3], float * vari, int edge)//mod JD +bool ImProcFunctions::WaveletDenoiseAllL(const wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3], float * vari, int edge)//mod JD { @@ -2530,16 +2505,14 @@ bool ImProcFunctions::WaveletDenoiseAllL(wavelet_decomposition &WaveletCoeffs_L, } for (int i = 3; i >= 0; i--) { - if (buffer[i] != nullptr) { - delete[] buffer[i]; - } + delete[] buffer[i]; } } return (!memoryAllocationFailed); } -bool ImProcFunctions::WaveletDenoiseAllAB(wavelet_decomposition &WaveletCoeffs_L, wavelet_decomposition &WaveletCoeffs_ab, +bool ImProcFunctions::WaveletDenoiseAllAB(const wavelet_decomposition &WaveletCoeffs_L, const wavelet_decomposition &WaveletCoeffs_ab, float *noisevarchrom, float madL[8][3], float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb)//mod JD { @@ -2596,7 +2569,7 @@ bool ImProcFunctions::WaveletDenoiseAllAB(wavelet_decomposition &WaveletCoeffs_L //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -void ImProcFunctions::ShrinkAllL(wavelet_decomposition &WaveletCoeffs_L, float **buffer, int level, int dir, +void ImProcFunctions::ShrinkAllL(const wavelet_decomposition &WaveletCoeffs_L, float **buffer, int level, int dir, float *noisevarlum, float * madL, float * vari, int edge) { @@ -2607,12 +2580,12 @@ void ImProcFunctions::ShrinkAllL(wavelet_decomposition &WaveletCoeffs_L, float * float * sfaved = buffer[1] + 64; float * blurBuffer = buffer[2] + 96; - int W_L = WaveletCoeffs_L.level_W(level); - int H_L = WaveletCoeffs_L.level_H(level); + const int W_L = WaveletCoeffs_L.level_W(level); + const int H_L = WaveletCoeffs_L.level_H(level); float ** WavCoeffs_L = WaveletCoeffs_L.level_coeffs(level); -// printf("OK lev=%d\n",level); - float mad_L = madL[dir - 1] ; + const float mad_L = madL[dir - 1] ; + const float levelFactor = mad_L * 5.f / static_cast(level + 1); if (edge == 1 && vari) { noisevarlum = blurBuffer; // we need one buffer, but fortunately we don't have to allocate a new one because we can use blurBuffer @@ -2622,71 +2595,45 @@ void ImProcFunctions::ShrinkAllL(wavelet_decomposition &WaveletCoeffs_L, float * } } - float levelFactor = mad_L * 5.f / static_cast(level + 1); + int i = 0; #ifdef __SSE2__ - __m128 magv; - __m128 levelFactorv = _mm_set1_ps(levelFactor); - __m128 mad_Lv; - __m128 ninev = _mm_set1_ps(9.0f); - __m128 epsv = _mm_set1_ps(eps); - int i; + const vfloat levelFactorv = F2V(levelFactor); + const vfloat ninev = F2V(9.f); + const vfloat epsv = F2V(eps); - for (i = 0; i < W_L * H_L - 3; i += 4) { - mad_Lv = LVFU(noisevarlum[i]) * levelFactorv; - magv = SQRV(LVFU(WavCoeffs_L[dir][i])); - _mm_storeu_ps(&sfave[i], magv / (magv + mad_Lv * xexpf(-magv / (ninev * mad_Lv)) + epsv)); + for (; i < W_L * H_L - 3; i += 4) { + const vfloat mad_Lv = LVFU(noisevarlum[i]) * levelFactorv; + const vfloat magv = SQRV(LVFU(WavCoeffs_L[dir][i])); + STVFU(sfave[i], magv / (magv + mad_Lv * xexpf(-magv / (ninev * mad_Lv)) + epsv)); } - +#endif // few remaining pixels for (; i < W_L * H_L; ++i) { - float mag = SQR(WavCoeffs_L[dir][i]); + const float mag = SQR(WavCoeffs_L[dir][i]); sfave[i] = mag / (mag + levelFactor * noisevarlum[i] * xexpf(-mag / (9 * levelFactor * noisevarlum[i])) + eps); } -#else - - for (int i = 0; i < W_L * H_L; ++i) { - - float mag = SQR(WavCoeffs_L[dir][i]); - float shrinkfactor = mag / (mag + levelFactor * noisevarlum[i] * xexpf(-mag / (9 * levelFactor * noisevarlum[i])) + eps); - sfave[i] = shrinkfactor; - } - -#endif - boxblur(sfave, sfaved, blurBuffer, level + 2, level + 2, W_L, H_L); //increase smoothness by locally averaging shrinkage + boxblur(sfave, sfaved, level + 2, W_L, H_L, false); //increase smoothness by locally averaging shrinkage + i = 0; #ifdef __SSE2__ - __m128 sfv; - for (i = 0; i < W_L * H_L - 3; i += 4) { - sfv = LVFU(sfave[i]); + for (; i < W_L * H_L - 3; i += 4) { + const vfloat sfv = LVFU(sfave[i]); //use smoothed shrinkage unless local shrinkage is much less - _mm_storeu_ps(&WavCoeffs_L[dir][i], _mm_loadu_ps(&WavCoeffs_L[dir][i]) * (SQRV(LVFU(sfaved[i])) + SQRV(sfv)) / (LVFU(sfaved[i]) + sfv + epsv)); + STVFU(WavCoeffs_L[dir][i], LVFU(WavCoeffs_L[dir][i]) * (SQRV(LVFU(sfaved[i])) + SQRV(sfv)) / (LVFU(sfaved[i]) + sfv + epsv)); } - +#endif // few remaining pixels for (; i < W_L * H_L; ++i) { - float sf = sfave[i]; - + const float sf = sfave[i]; //use smoothed shrinkage unless local shrinkage is much less WavCoeffs_L[dir][i] *= (SQR(sfaved[i]) + SQR(sf)) / (sfaved[i] + sf + eps); }//now luminance coefficients are denoised - -#else - - for (int i = 0; i < W_L * H_L; ++i) { - float sf = sfave[i]; - - //use smoothed shrinkage unless local shrinkage is much less - WavCoeffs_L[dir][i] *= (SQR(sfaved[i]) + SQR(sf)) / (sfaved[i] + sf + eps); - - }//now luminance coefficients are denoised - -#endif } -void ImProcFunctions::ShrinkAllAB(wavelet_decomposition &WaveletCoeffs_L, wavelet_decomposition &WaveletCoeffs_ab, float **buffer, int level, int dir, +void ImProcFunctions::ShrinkAllAB(const wavelet_decomposition &WaveletCoeffs_L, const wavelet_decomposition &WaveletCoeffs_ab, float **buffer, int level, int dir, float *noisevarchrom, float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb, float * madL, float * madaab, bool madCalculated) @@ -2700,7 +2647,6 @@ void ImProcFunctions::ShrinkAllAB(wavelet_decomposition &WaveletCoeffs_L, wavele float * sfaveab = buffer[0] + 32; float * sfaveabd = buffer[1] + 64; - float * blurBuffer = buffer[2] + 96; int W_ab = WaveletCoeffs_ab.level_W(level); int H_ab = WaveletCoeffs_ab.level_H(level); @@ -2724,12 +2670,12 @@ void ImProcFunctions::ShrinkAllAB(wavelet_decomposition &WaveletCoeffs_L, wavele if (noisevar_ab > 0.001f) { madab = useNoiseCCurve ? madab : madab * noisevar_ab; #ifdef __SSE2__ - __m128 onev = _mm_set1_ps(1.f); - __m128 mad_abrv = _mm_set1_ps(madab); + vfloat onev = F2V(1.f); + vfloat mad_abrv = F2V(madab); - __m128 rmadLm9v = onev / _mm_set1_ps(mad_L * 9.f); - __m128 mad_abv ; - __m128 mag_Lv, mag_abv; + vfloat rmadLm9v = onev / F2V(mad_L * 9.f); + vfloat mad_abv ; + vfloat mag_Lv, mag_abv; int coeffloc_ab; for (coeffloc_ab = 0; coeffloc_ab < H_ab * W_ab - 3; coeffloc_ab += 4) { @@ -2738,7 +2684,7 @@ void ImProcFunctions::ShrinkAllAB(wavelet_decomposition &WaveletCoeffs_L, wavele mag_Lv = LVFU(WavCoeffs_L[dir][coeffloc_ab]); mag_abv = SQRV(LVFU(WavCoeffs_ab[dir][coeffloc_ab])); mag_Lv = (SQRV(mag_Lv)) * rmadLm9v; - _mm_storeu_ps(&sfaveab[coeffloc_ab], (onev - xexpf(-(mag_abv / mad_abv) - (mag_Lv)))); + STVFU(sfaveab[coeffloc_ab], (onev - xexpf(-(mag_abv / mad_abv) - (mag_Lv)))); } // few remaining pixels @@ -2761,18 +2707,18 @@ void ImProcFunctions::ShrinkAllAB(wavelet_decomposition &WaveletCoeffs_L, wavele #endif - boxblur(sfaveab, sfaveabd, blurBuffer, level + 2, level + 2, W_ab, H_ab); //increase smoothness by locally averaging shrinkage + boxblur(sfaveab, sfaveabd, level + 2, W_ab, H_ab, false); //increase smoothness by locally averaging shrinkage #ifdef __SSE2__ - __m128 epsv = _mm_set1_ps(eps); - __m128 sfabv; - __m128 sfaveabv; + vfloat epsv = F2V(eps); + vfloat sfabv; + vfloat sfaveabv; for (coeffloc_ab = 0; coeffloc_ab < H_ab * W_ab - 3; coeffloc_ab += 4) { sfabv = LVFU(sfaveab[coeffloc_ab]); sfaveabv = LVFU(sfaveabd[coeffloc_ab]); //use smoothed shrinkage unless local shrinkage is much less - _mm_storeu_ps(&WavCoeffs_ab[dir][coeffloc_ab], LVFU(WavCoeffs_ab[dir][coeffloc_ab]) * (SQRV(sfaveabv) + SQRV(sfabv)) / (sfaveabv + sfabv + epsv)); + STVFU(WavCoeffs_ab[dir][coeffloc_ab], LVFU(WavCoeffs_ab[dir][coeffloc_ab]) * (SQRV(sfaveabv) + SQRV(sfabv)) / (sfaveabv + sfabv + epsv)); } // few remaining pixels @@ -2919,8 +2865,8 @@ void ImProcFunctions::ShrinkAll_info(float ** WavCoeffs_a, float ** WavCoeffs_b, } -void ImProcFunctions::WaveletDenoiseAll_info(int levwav, wavelet_decomposition &WaveletCoeffs_a, - wavelet_decomposition &WaveletCoeffs_b, float **noisevarlum, float **noisevarchrom, float **noisevarhue, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &minredaut, float &minblueaut, int schoice, +void ImProcFunctions::WaveletDenoiseAll_info(int levwav, const wavelet_decomposition &WaveletCoeffs_a, + const wavelet_decomposition &WaveletCoeffs_b, float **noisevarlum, float **noisevarchrom, float **noisevarhue, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &minredaut, float &minblueaut, int schoice, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, float &maxchred, float &maxchblue, float &minchred, float &minchblue, int &nb, float &chau, float &chred, float &chblue, bool denoiseMethodRgb) { @@ -3106,7 +3052,7 @@ void ImProcFunctions::calcautodn_info(float &chaut, float &delta, int Nb, int le } -void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat * provicalc, const bool isRAW, LUTf &gamcurve, float gam, float gamthresh, float gamslope, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &minredaut, float &minblueaut, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, bool multiThread) +void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat * provicalc, const bool isRAW, const LUTf &gamcurve, float gam, float gamthresh, float gamslope, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &minredaut, float &minblueaut, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, bool multiThread) { if ((settings->leveldnautsimpl == 1 && dnparams.Cmethod == "MAN") || (settings->leveldnautsimpl == 0 && dnparams.C2method == "MANU")) { //nothing to do @@ -3173,8 +3119,8 @@ void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat * provicalc, const float gain = pow(2.0f, float(expcomp)); - int tilesize; - int overlap; + int tilesize = 0; + int overlap = 0; if (settings->leveldnti == 0) { tilesize = 1024; @@ -3275,16 +3221,16 @@ void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat * provicalc, for (int i = tiletop; i < tilebottom; i += 2) { int i1 = i - tiletop; #ifdef __SSE2__ - __m128 aNv, bNv; - __m128 c100v = _mm_set1_ps(100.f); + vfloat aNv, bNv; + vfloat c100v = F2V(100.f); int j; for (j = tileleft; j < tileright - 7; j += 8) { int j1 = j - tileleft; aNv = LVFU(acalc[i >> 1][j >> 1]); bNv = LVFU(bcalc[i >> 1][j >> 1]); - _mm_storeu_ps(&noisevarhue[i1 >> 1][j1 >> 1], xatan2f(bNv, aNv)); - _mm_storeu_ps(&noisevarchrom[i1 >> 1][j1 >> 1], vmaxf(vsqrtf(SQRV(aNv) + SQRV(bNv)),c100v)); + STVFU(noisevarhue[i1 >> 1][j1 >> 1], xatan2f(bNv, aNv)); + STVFU(noisevarchrom[i1 >> 1][j1 >> 1], vmaxf(vsqrtf(SQRV(aNv) + SQRV(bNv)),c100v)); } for (; j < tileright; j += 2) { diff --git a/rtengine/boxblur.cc b/rtengine/boxblur.cc new file mode 100644 index 000000000..491ffae14 --- /dev/null +++ b/rtengine/boxblur.cc @@ -0,0 +1,420 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (C) 2010 Emil Martinec + * Copyright (C) 2019 Ingo Weyrich + * + * RawTherapee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RawTherapee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RawTherapee. If not, see . +*/ + +#include +#include + +#include "boxblur.h" + +#include "rt_math.h" +#include "opthelper.h" + +namespace rtengine +{ + +void boxblur(float** src, float** dst, int radius, int W, int H, bool multiThread) +{ + //box blur using rowbuffers and linebuffers instead of a full size buffer + + if (radius == 0) { + if (src != dst) { +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + + for (int row = 0; row < H; ++row) { + for (int col = 0; col < W; ++col) { + dst[row][col] = src[row][col]; + } + } + } + return; + } + + constexpr int numCols = 8; // process numCols columns at once for better usage of L1 cpu cache +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + std::unique_ptr buffer(new float[numCols * (radius + 1)]); + + //horizontal blur + float* const lineBuffer = buffer.get(); +#ifdef _OPENMP + #pragma omp for +#endif + for (int row = 0; row < H; ++row) { + float len = radius + 1; + float tempval = src[row][0]; + lineBuffer[0] = tempval; + for (int j = 1; j <= radius; j++) { + tempval += src[row][j]; + } + + tempval /= len; + dst[row][0] = tempval; + + for (int col = 1; col <= radius; ++col) { + lineBuffer[col] = src[row][col]; + tempval = (tempval * len + src[row][col + radius]) / (len + 1); + dst[row][col] = tempval; + ++len; + } + int pos = 0; + for (int col = radius + 1; col < W - radius; ++col) { + const float oldVal = lineBuffer[pos]; + lineBuffer[pos] = src[row][col]; + tempval = tempval + (src[row][col + radius] - oldVal) / len; + dst[row][col] = tempval; + ++pos; + pos = pos <= radius ? pos : 0; + } + + for (int col = W - radius; col < W; ++col) { + tempval = (tempval * len - lineBuffer[pos]) / (len - 1); + dst[row][col] = tempval; + --len; + ++pos; + pos = pos <= radius ? pos : 0; + } + } + + //vertical blur +#ifdef __SSE2__ + vfloat (* const rowBuffer)[2] = (vfloat(*)[2]) buffer.get(); + const vfloat leninitv = F2V(radius + 1); + const vfloat onev = F2V(1.f); + vfloat tempv, temp1v, lenv, lenp1v, lenm1v, rlenv; + +#ifdef _OPENMP + #pragma omp for nowait +#endif + + for (int col = 0; col < W - 7; col += 8) { + lenv = leninitv; + tempv = LVFU(dst[0][col]); + temp1v = LVFU(dst[0][col + 4]); + rowBuffer[0][0] = tempv; + rowBuffer[0][1] = temp1v; + + for (int i = 1; i <= radius; ++i) { + tempv = tempv + LVFU(dst[i][col]); + temp1v = temp1v + LVFU(dst[i][col + 4]); + } + + tempv = tempv / lenv; + temp1v = temp1v / lenv; + STVFU(dst[0][col], tempv); + STVFU(dst[0][col + 4], temp1v); + + for (int row = 1; row <= radius; ++row) { + rowBuffer[row][0] = LVFU(dst[row][col]); + rowBuffer[row][1] = LVFU(dst[row][col + 4]); + lenp1v = lenv + onev; + tempv = (tempv * lenv + LVFU(dst[row + radius][col])) / lenp1v; + temp1v = (temp1v * lenv + LVFU(dst[row + radius][col + 4])) / lenp1v; + STVFU(dst[row][col], tempv); + STVFU(dst[row][col + 4], temp1v); + lenv = lenp1v; + } + + rlenv = onev / lenv; + int pos = 0; + for (int row = radius + 1; row < H - radius; ++row) { + vfloat oldVal0 = rowBuffer[pos][0]; + vfloat oldVal1 = rowBuffer[pos][1]; + rowBuffer[pos][0] = LVFU(dst[row][col]); + rowBuffer[pos][1] = LVFU(dst[row][col + 4]); + tempv = tempv + (LVFU(dst[row + radius][col]) - oldVal0) * rlenv ; + temp1v = temp1v + (LVFU(dst[row + radius][col + 4]) - oldVal1) * rlenv ; + STVFU(dst[row][col], tempv); + STVFU(dst[row][col + 4], temp1v); + ++pos; + pos = pos <= radius ? pos : 0; + } + + for (int row = H - radius; row < H; ++row) { + lenm1v = lenv - onev; + tempv = (tempv * lenv - rowBuffer[pos][0]) / lenm1v; + temp1v = (temp1v * lenv - rowBuffer[pos][1]) / lenm1v; + STVFU(dst[row][col], tempv); + STVFU(dst[row][col + 4], temp1v); + lenv = lenm1v; + ++pos; + pos = pos <= radius ? pos : 0; + } + } + +#else + float (* const rowBuffer)[8] = (float(*)[8]) buffer.get(); +#ifdef _OPENMP + #pragma omp for nowait +#endif + + for (int col = 0; col < W - numCols + 1; col += 8) { + float len = radius + 1; + + for (int k = 0; k < numCols; ++k) { + rowBuffer[0][k] = dst[0][col + k]; + } + + for (int i = 1; i <= radius; ++i) { + for (int k = 0; k < numCols; ++k) { + dst[0][col + k] += dst[i][col + k]; + } + } + + for(int k = 0; k < numCols; ++k) { + dst[0][col + k] /= len; + } + + for (int row = 1; row <= radius; ++row) { + for(int k = 0; k < numCols; ++k) { + rowBuffer[row][k] = dst[row][col + k]; + dst[row][col + k] = (dst[row - 1][col + k] * len + dst[row + radius][col + k]) / (len + 1); + } + + len ++; + } + + int pos = 0; + for (int row = radius + 1; row < H - radius; ++row) { + for(int k = 0; k < numCols; ++k) { + float oldVal = rowBuffer[pos][k]; + rowBuffer[pos][k] = dst[row][col + k]; + dst[row][col + k] = dst[row - 1][col + k] + (dst[row + radius][col + k] - oldVal) / len; + } + ++pos; + pos = pos <= radius ? pos : 0; + } + + for (int row = H - radius; row < H; ++row) { + for(int k = 0; k < numCols; ++k) { + dst[row][col + k] = (dst[row - 1][col + k] * len - rowBuffer[pos][k]) / (len - 1); + } + len --; + ++pos; + pos = pos <= radius ? pos : 0; + } + } + +#endif + //vertical blur, remaining columns +#ifdef _OPENMP + #pragma omp single +#endif + { + const int remaining = W % numCols; + + if (remaining > 0) { + float (* const rowBuffer)[8] = (float(*)[8]) buffer.get(); + const int col = W - remaining; + + float len = radius + 1; + for(int k = 0; k < remaining; ++k) { + rowBuffer[0][k] = dst[0][col + k]; + } + for (int row = 1; row <= radius; ++row) { + for(int k = 0; k < remaining; ++k) { + dst[0][col + k] += dst[row][col + k]; + } + } + for(int k = 0; k < remaining; ++k) { + dst[0][col + k] /= len; + } + for (int row = 1; row <= radius; ++row) { + for(int k = 0; k < remaining; ++k) { + rowBuffer[row][k] = dst[row][col + k]; + dst[row][col + k] = (dst[row - 1][col + k] * len + dst[row + radius][col + k]) / (len + 1); + } + len ++; + } + const float rlen = 1.f / len; + int pos = 0; + for (int row = radius + 1; row < H - radius; ++row) { + for(int k = 0; k < remaining; ++k) { + float oldVal = rowBuffer[pos][k]; + rowBuffer[pos][k] = dst[row][col + k]; + dst[row][col + k] = dst[row - 1][col + k] + (dst[row + radius][col + k] - oldVal) * rlen; + } + ++pos; + pos = pos <= radius ? pos : 0; + } + for (int row = H - radius; row < H; ++row) { + for(int k = 0; k < remaining; ++k) { + dst[row][col + k] = (dst[(row - 1)][col + k] * len - rowBuffer[pos][k]) / (len - 1); + } + len --; + ++pos; + pos = pos <= radius ? pos : 0; + } + } + } + } +} + +void boxabsblur(float** src, float** dst, int radius, int W, int H, bool multiThread) +{ + //abs box blur using rowbuffers and linebuffers instead of a full size buffer, W should be a multiple of 16 + + if (radius == 0) { + if (src != dst) { +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + + for (int row = 0; row < H; ++row) { + for (int col = 0; col < W; ++col) { + dst[row][col] = std::fabs(src[row][col]); + } + } + } + return; + } + + constexpr int numCols = 16; // process numCols columns at once for better usage of L1 cpu cache +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + float buffer[numCols * (radius + 1)] ALIGNED64; + + //horizontal blur + float* const lineBuffer = buffer; +#ifdef _OPENMP + #pragma omp for +#endif + for (int row = 0; row < H; ++row) { + float len = radius + 1; + float tempval = std::fabs(src[row][0]); + lineBuffer[0] = tempval; + for (int j = 1; j <= radius; j++) { + tempval += std::fabs(src[row][j]); + } + + tempval /= len; + dst[row][0] = tempval; + + for (int col = 1; col <= radius; ++col) { + lineBuffer[col] = std::fabs(src[row][col]); + tempval = (tempval * len + std::fabs(src[row][col + radius])) / (len + 1); + dst[row][col] = tempval; + ++len; + } + + const float rlen = 1.f / len; + int pos = 0; + for (int col = radius + 1; col < W - radius; ++col) { + const float oldVal = lineBuffer[pos]; + lineBuffer[pos] = std::fabs(src[row][col]); + tempval = tempval + (std::fabs(src[row][col + radius]) - oldVal) * rlen; + dst[row][col] = tempval; + ++pos; + pos = pos <= radius ? pos : 0; + } + + for (int col = W - radius; col < W; ++col) { + tempval = (tempval * len - lineBuffer[pos]) / (len - 1); + dst[row][col] = tempval; + --len; + ++pos; + pos = pos <= radius ? pos : 0; + } + } + + //vertical blur + float (* const rowBuffer)[numCols] = (float(*)[numCols]) buffer; +#ifdef _OPENMP + #pragma omp for +#endif + + for (int col = 0; col < W; col += numCols) { + float len = radius + 1; + + for (int k = 0; k < numCols; ++k) { + rowBuffer[0][k] = dst[0][col + k]; + } + + for (int i = 1; i <= radius; ++i) { + for (int k = 0; k < numCols; ++k) { + dst[0][col + k] += dst[i][col + k]; + } + } + + for(int k = 0; k < numCols; ++k) { + dst[0][col + k] /= len; + } + + for (int row = 1; row <= radius; ++row) { + for(int k = 0; k < numCols; ++k) { + rowBuffer[row][k] = dst[row][col + k]; + dst[row][col + k] = (dst[row - 1][col + k] * len + dst[row + radius][col + k]) / (len + 1); + } + + ++len; + } + + const float rlen = 1.f / len; + int pos = 0; + for (int row = radius + 1; row < H - radius; ++row) { + for(int k = 0; k < numCols; ++k) { + float oldVal = rowBuffer[pos][k]; + rowBuffer[pos][k] = dst[row][col + k]; + dst[row][col + k] = dst[row - 1][col + k] + (dst[row + radius][col + k] - oldVal) * rlen; + } + ++pos; + pos = pos <= radius ? pos : 0; + } + + for (int row = H - radius; row < H; ++row) { + for(int k = 0; k < numCols; ++k) { + dst[row][col + k] = (dst[row - 1][col + k] * len - rowBuffer[pos][k]) / (len - 1); + } + --len; + ++pos; + pos = pos <= radius ? pos : 0; + } + } + } +} + +void boxblur(float* src, float* dst, int radius, int W, int H, bool multiThread) +{ + float* srcp[H]; + float* dstp[H]; + for (int i = 0; i < H; ++i) { + srcp[i] = src + i * W; + dstp[i] = dst + i * W; + } + boxblur(srcp, dstp, radius, W, H, multiThread); +} + +void boxabsblur(float* src, float* dst, int radius, int W, int H, bool multiThread) +{ + float* srcp[H]; + float* dstp[H]; + for (int i = 0; i < H; ++i) { + srcp[i] = src + i * W; + dstp[i] = dst + i * W; + } + boxabsblur(srcp, dstp, radius, W, H, multiThread); +} + +} diff --git a/rtengine/boxblur.h b/rtengine/boxblur.h index 1689c5ed1..57fba9119 100644 --- a/rtengine/boxblur.h +++ b/rtengine/boxblur.h @@ -1,7 +1,7 @@ /* * This file is part of RawTherapee. * - * Copyright (C) 2010 Emil Martinec + * Copyright (C) 2019 Ingo Weyrich * * RawTherapee is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -15,873 +15,15 @@ * * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . - */ -#ifndef _BOXBLUR_H_ -#define _BOXBLUR_H_ - -#include -#include -#include -#include -#include -#include "alignedbuffer.h" -#include "rt_math.h" -#include "opthelper.h" +*/ +#pragma once namespace rtengine { -// classical filtering if the support window is small: - -template void boxblur (T** src, A** dst, int radx, int rady, int W, int H) -{ - //box blur image; box range = (radx,rady) - assert(2*radx+1 < W); - assert(2*rady+1 < H); - - AlignedBuffer* buffer = new AlignedBuffer (W * H); - float* temp = buffer->data; - - if (radx == 0) { -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int row = 0; row < H; row++) - for (int col = 0; col < W; col++) { - temp[row * W + col] = (float)src[row][col]; - } - } else { - //horizontal blur -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int row = 0; row < H; row++) { - int len = radx + 1; - temp[row * W + 0] = (float)src[row][0] / len; - - for (int j = 1; j <= radx; j++) { - temp[row * W + 0] += (float)src[row][j] / len; - } - - for (int col = 1; col <= radx; col++) { - temp[row * W + col] = (temp[row * W + col - 1] * len + (float)src[row][col + radx]) / (len + 1); - len ++; - } - - for (int col = radx + 1; col < W - radx; col++) { - temp[row * W + col] = temp[row * W + col - 1] + ((float)(src[row][col + radx] - src[row][col - radx - 1])) / len; - } - - for (int col = W - radx; col < W; col++) { - temp[row * W + col] = (temp[row * W + col - 1] * len - src[row][col - radx - 1]) / (len - 1); - len --; - } - } - } - - if (rady == 0) { -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int row = 0; row < H; row++) - for (int col = 0; col < W; col++) { - dst[row][col] = temp[row * W + col]; - } - } else { - //vertical blur -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int col = 0; col < W; col++) { - int len = rady + 1; - dst[0][col] = temp[0 * W + col] / len; - - for (int i = 1; i <= rady; i++) { - dst[0][col] += temp[i * W + col] / len; - } - - for (int row = 1; row <= rady; row++) { - dst[row][col] = (dst[(row - 1)][col] * len + temp[(row + rady) * W + col]) / (len + 1); - len ++; - } - - for (int row = rady + 1; row < H - rady; row++) { - dst[row][col] = dst[(row - 1)][col] + (temp[(row + rady) * W + col] - temp[(row - rady - 1) * W + col]) / len; - } - - for (int row = H - rady; row < H; row++) { - dst[row][col] = (dst[(row - 1)][col] * len - temp[(row - rady - 1) * W + col]) / (len - 1); - len --; - } - } - } - - delete buffer; +void boxblur(float** src, float** dst, int radius, int W, int H, bool multiThread); +void boxblur(float* src, float* dst, int radius, int W, int H, bool multiThread); +void boxabsblur(float** src, float** dst, int radius, int W, int H, bool multiThread); +void boxabsblur(float* src, float* dst, int radius, int W, int H, bool multiThread); } - -template void boxblur (T** src, A** dst, T* buffer, int radx, int rady, int W, int H) -{ - //box blur image; box range = (radx,rady) - - float* temp = buffer; - - if (radx == 0) { -#ifdef _OPENMP - #pragma omp for -#endif - - for (int row = 0; row < H; row++) - for (int col = 0; col < W; col++) { - temp[row * W + col] = (float)src[row][col]; - } - } else { - //horizontal blur -#ifdef _OPENMP - #pragma omp for -#endif - - for (int row = 0; row < H; row++) { - float len = radx + 1; - float tempval = (float)src[row][0]; - - for (int j = 1; j <= radx; j++) { - tempval += (float)src[row][j]; - } - - tempval /= len; - temp[row * W + 0] = tempval; - - for (int col = 1; col <= radx; col++) { - temp[row * W + col] = tempval = (tempval * len + (float)src[row][col + radx]) / (len + 1); - len ++; - } - - for (int col = radx + 1; col < W - radx; col++) { - temp[row * W + col] = tempval = tempval + ((float)(src[row][col + radx] - src[row][col - radx - 1])) / len; - } - - for (int col = W - radx; col < W; col++) { - temp[row * W + col] = tempval = (tempval * len - src[row][col - radx - 1]) / (len - 1); - len --; - } - } - } - - if (rady == 0) { -#ifdef _OPENMP - #pragma omp for -#endif - - for (int row = 0; row < H; row++) - for (int col = 0; col < W; col++) { - dst[row][col] = temp[row * W + col]; - } - } else { - const int numCols = 8; // process numCols columns at once for better usage of L1 cpu cache -#ifdef __SSE2__ - vfloat leninitv = F2V( (float)(rady + 1)); - vfloat onev = F2V( 1.f ); - vfloat tempv, temp1v, lenv, lenp1v, lenm1v, rlenv; - -#ifdef _OPENMP - #pragma omp for -#endif - - for (int col = 0; col < W - 7; col += 8) { - lenv = leninitv; - tempv = LVFU(temp[0 * W + col]); - temp1v = LVFU(temp[0 * W + col + 4]); - - for (int i = 1; i <= rady; i++) { - tempv = tempv + LVFU(temp[i * W + col]); - temp1v = temp1v + LVFU(temp[i * W + col + 4]); - } - - tempv = tempv / lenv; - temp1v = temp1v / lenv; - STVFU(dst[0][col], tempv); - STVFU(dst[0][col + 4], temp1v); - - for (int row = 1; row <= rady; row++) { - lenp1v = lenv + onev; - tempv = (tempv * lenv + LVFU(temp[(row + rady) * W + col])) / lenp1v; - temp1v = (temp1v * lenv + LVFU(temp[(row + rady) * W + col + 4])) / lenp1v; - STVFU(dst[row][col], tempv); - STVFU(dst[row][col + 4], temp1v); - lenv = lenp1v; - } - - rlenv = onev / lenv; - - for (int row = rady + 1; row < H - rady; row++) { - tempv = tempv + (LVFU(temp[(row + rady) * W + col]) - LVFU(temp[(row - rady - 1) * W + col])) * rlenv ; - temp1v = temp1v + (LVFU(temp[(row + rady) * W + col + 4]) - LVFU(temp[(row - rady - 1) * W + col + 4])) * rlenv ; - STVFU(dst[row][col], tempv); - STVFU(dst[row][col + 4], temp1v); - } - - for (int row = H - rady; row < H; row++) { - lenm1v = lenv - onev; - tempv = (tempv * lenv - LVFU(temp[(row - rady - 1) * W + col])) / lenm1v; - temp1v = (temp1v * lenv - LVFU(temp[(row - rady - 1) * W + col + 4])) / lenm1v; - STVFU(dst[row][col], tempv); - STVFU(dst[row][col + 4], temp1v); - lenv = lenm1v; - } - } - -#else - //vertical blur -#ifdef _OPENMP - #pragma omp for -#endif - - for (int col = 0; col < W - numCols + 1; col += 8) { - float len = rady + 1; - - for(int k = 0; k < numCols; k++) { - dst[0][col + k] = temp[0 * W + col + k]; - } - - for (int i = 1; i <= rady; i++) { - for(int k = 0; k < numCols; k++) { - dst[0][col + k] += temp[i * W + col + k]; - } - } - - for(int k = 0; k < numCols; k++) { - dst[0][col + k] /= len; - } - - for (int row = 1; row <= rady; row++) { - for(int k = 0; k < numCols; k++) { - dst[row][col + k] = (dst[(row - 1)][col + k] * len + temp[(row + rady) * W + col + k]) / (len + 1); - } - - len ++; - } - - for (int row = rady + 1; row < H - rady; row++) { - for(int k = 0; k < numCols; k++) { - dst[row][col + k] = dst[(row - 1)][col + k] + (temp[(row + rady) * W + col + k] - temp[(row - rady - 1) * W + col + k]) / len; - } - } - - for (int row = H - rady; row < H; row++) { - for(int k = 0; k < numCols; k++) { - dst[row][col + k] = (dst[(row - 1)][col + k] * len - temp[(row - rady - 1) * W + col + k]) / (len - 1); - } - - len --; - } - } - -#endif -#ifdef _OPENMP - #pragma omp single -#endif - - for (int col = W - (W % numCols); col < W; col++) { - float len = rady + 1; - dst[0][col] = temp[0 * W + col] / len; - - for (int i = 1; i <= rady; i++) { - dst[0][col] += temp[i * W + col] / len; - } - - for (int row = 1; row <= rady; row++) { - dst[row][col] = (dst[(row - 1)][col] * len + temp[(row + rady) * W + col]) / (len + 1); - len ++; - } - - for (int row = rady + 1; row < H - rady; row++) { - dst[row][col] = dst[(row - 1)][col] + (temp[(row + rady) * W + col] - temp[(row - rady - 1) * W + col]) / len; - } - - for (int row = H - rady; row < H; row++) { - dst[row][col] = (dst[(row - 1)][col] * len - temp[(row - rady - 1) * W + col]) / (len - 1); - len --; - } - } - } - -} - -inline void boxblur (float** src, float** dst, int radius, int W, int H, bool multiThread) -{ - //box blur using rowbuffers and linebuffers instead of a full size buffer - - if (radius == 0) { - if (src != dst) { -#ifdef _OPENMP - #pragma omp parallel for if (multiThread) -#endif - - for (int row = 0; row < H; row++) { - for (int col = 0; col < W; col++) { - dst[row][col] = src[row][col]; - } - } - } - return; - } - - constexpr int numCols = 8; // process numCols columns at once for better usage of L1 cpu cache -#ifdef _OPENMP - #pragma omp parallel if (multiThread) -#endif - { - std::unique_ptr buffer(new float[numCols * (radius + 1)]); - - //horizontal blur - float* const lineBuffer = buffer.get(); -#ifdef _OPENMP - #pragma omp for -#endif - for (int row = 0; row < H; row++) { - float len = radius + 1; - float tempval = src[row][0]; - lineBuffer[0] = tempval; - for (int j = 1; j <= radius; j++) { - tempval += src[row][j]; - } - - tempval /= len; - dst[row][0] = tempval; - - for (int col = 1; col <= radius; col++) { - lineBuffer[col] = src[row][col]; - tempval = (tempval * len + src[row][col + radius]) / (len + 1); - dst[row][col] = tempval; - ++len; - } - int pos = 0; - for (int col = radius + 1; col < W - radius; col++) { - const float oldVal = lineBuffer[pos]; - lineBuffer[pos] = src[row][col]; - tempval = tempval + (src[row][col + radius] - oldVal) / len; - dst[row][col] = tempval; - ++pos; - pos = pos <= radius ? pos : 0; - } - - for (int col = W - radius; col < W; col++) { - tempval = (tempval * len - lineBuffer[pos]) / (len - 1); - dst[row][col] = tempval; - --len; - ++pos; - pos = pos <= radius ? pos : 0; - } - } - - //vertical blur -#ifdef __SSE2__ - vfloat (* const rowBuffer)[2] = (vfloat(*)[2]) buffer.get(); - const vfloat leninitv = F2V(radius + 1); - const vfloat onev = F2V(1.f); - vfloat tempv, temp1v, lenv, lenp1v, lenm1v, rlenv; - -#ifdef _OPENMP - #pragma omp for nowait -#endif - - for (int col = 0; col < W - 7; col += 8) { - lenv = leninitv; - tempv = LVFU(dst[0][col]); - temp1v = LVFU(dst[0][col + 4]); - rowBuffer[0][0] = tempv; - rowBuffer[0][1] = temp1v; - - for (int i = 1; i <= radius; i++) { - tempv = tempv + LVFU(dst[i][col]); - temp1v = temp1v + LVFU(dst[i][col + 4]); - } - - tempv = tempv / lenv; - temp1v = temp1v / lenv; - STVFU(dst[0][col], tempv); - STVFU(dst[0][col + 4], temp1v); - - for (int row = 1; row <= radius; row++) { - rowBuffer[row][0] = LVFU(dst[row][col]); - rowBuffer[row][1] = LVFU(dst[row][col + 4]); - lenp1v = lenv + onev; - tempv = (tempv * lenv + LVFU(dst[row + radius][col])) / lenp1v; - temp1v = (temp1v * lenv + LVFU(dst[row + radius][col + 4])) / lenp1v; - STVFU(dst[row][col], tempv); - STVFU(dst[row][col + 4], temp1v); - lenv = lenp1v; - } - - rlenv = onev / lenv; - int pos = 0; - for (int row = radius + 1; row < H - radius; row++) { - vfloat oldVal0 = rowBuffer[pos][0]; - vfloat oldVal1 = rowBuffer[pos][1]; - rowBuffer[pos][0] = LVFU(dst[row][col]); - rowBuffer[pos][1] = LVFU(dst[row][col + 4]); - tempv = tempv + (LVFU(dst[row + radius][col]) - oldVal0) * rlenv ; - temp1v = temp1v + (LVFU(dst[row + radius][col + 4]) - oldVal1) * rlenv ; - STVFU(dst[row][col], tempv); - STVFU(dst[row][col + 4], temp1v); - ++pos; - pos = pos <= radius ? pos : 0; - } - - for (int row = H - radius; row < H; row++) { - lenm1v = lenv - onev; - tempv = (tempv * lenv - rowBuffer[pos][0]) / lenm1v; - temp1v = (temp1v * lenv - rowBuffer[pos][1]) / lenm1v; - STVFU(dst[row][col], tempv); - STVFU(dst[row][col + 4], temp1v); - lenv = lenm1v; - ++pos; - pos = pos <= radius ? pos : 0; - } - } - -#else - float (* const rowBuffer)[8] = (float(*)[8]) buffer.get(); -#ifdef _OPENMP - #pragma omp for nowait -#endif - - for (int col = 0; col < W - numCols + 1; col += 8) { - float len = radius + 1; - - for (int k = 0; k < numCols; k++) { - rowBuffer[0][k] = dst[0][col + k]; - } - - for (int i = 1; i <= radius; i++) { - for (int k = 0; k < numCols; k++) { - dst[0][col + k] += dst[i][col + k]; - } - } - - for(int k = 0; k < numCols; k++) { - dst[0][col + k] /= len; - } - - for (int row = 1; row <= radius; row++) { - for(int k = 0; k < numCols; k++) { - rowBuffer[row][k] = dst[row][col + k]; - dst[row][col + k] = (dst[row - 1][col + k] * len + dst[row + radius][col + k]) / (len + 1); - } - - len ++; - } - - int pos = 0; - for (int row = radius + 1; row < H - radius; row++) { - for(int k = 0; k < numCols; k++) { - float oldVal = rowBuffer[pos][k]; - rowBuffer[pos][k] = dst[row][col + k]; - dst[row][col + k] = dst[row - 1][col + k] + (dst[row + radius][col + k] - oldVal) / len; - } - ++pos; - pos = pos <= radius ? pos : 0; - } - - for (int row = H - radius; row < H; row++) { - for(int k = 0; k < numCols; k++) { - dst[row][col + k] = (dst[row - 1][col + k] * len - rowBuffer[pos][k]) / (len - 1); - } - len --; - ++pos; - pos = pos <= radius ? pos : 0; - } - } - -#endif - //vertical blur, remaining columns -#ifdef _OPENMP - #pragma omp single -#endif - { - const int remaining = W % numCols; - - if (remaining > 0) { - float (* const rowBuffer)[8] = (float(*)[8]) buffer.get(); - const int col = W - remaining; - - float len = radius + 1; - for(int k = 0; k < remaining; ++k) { - rowBuffer[0][k] = dst[0][col + k]; - } - for (int row = 1; row <= radius; ++row) { - for(int k = 0; k < remaining; ++k) { - dst[0][col + k] += dst[row][col + k]; - } - } - for(int k = 0; k < remaining; ++k) { - dst[0][col + k] /= len; - } - for (int row = 1; row <= radius; ++row) { - for(int k = 0; k < remaining; ++k) { - rowBuffer[row][k] = dst[row][col + k]; - dst[row][col + k] = (dst[row - 1][col + k] * len + dst[row + radius][col + k]) / (len + 1); - } - len ++; - } - const float rlen = 1.f / len; - int pos = 0; - for (int row = radius + 1; row < H - radius; ++row) { - for(int k = 0; k < remaining; ++k) { - float oldVal = rowBuffer[pos][k]; - rowBuffer[pos][k] = dst[row][col + k]; - dst[row][col + k] = dst[row - 1][col + k] + (dst[row + radius][col + k] - oldVal) * rlen; - } - ++pos; - pos = pos <= radius ? pos : 0; - } - for (int row = H - radius; row < H; ++row) { - for(int k = 0; k < remaining; ++k) { - dst[row][col + k] = (dst[(row - 1)][col + k] * len - rowBuffer[pos][k]) / (len - 1); - } - len --; - ++pos; - pos = pos <= radius ? pos : 0; - } - } - } - } -} - -template void boxblur (T* src, A* dst, A* buffer, int radx, int rady, int W, int H) -{ - //box blur image; box range = (radx,rady) i.e. box size is (2*radx+1)x(2*rady+1) - - float* temp = buffer; - - if (radx == 0) { - for (int row = 0; row < H; row++) - for (int col = 0; col < W; col++) { - temp[row * W + col] = src[row * W + col]; - } - } else { - //horizontal blur - for (int row = H - 1; row >= 0; row--) { - int len = radx + 1; - float tempval = (float)src[row * W]; - - for (int j = 1; j <= radx; j++) { - tempval += (float)src[row * W + j]; - } - - tempval = tempval / len; - temp[row * W] = tempval; - - for (int col = 1; col <= radx; col++) { - tempval = (tempval * len + src[row * W + col + radx]) / (len + 1); - temp[row * W + col] = tempval; - len ++; - } - - float reclen = 1.f / len; - - for (int col = radx + 1; col < W - radx; col++) { - tempval = tempval + ((float)(src[row * W + col + radx] - src[row * W + col - radx - 1])) * reclen; - temp[row * W + col] = tempval; - } - - for (int col = W - radx; col < W; col++) { - tempval = (tempval * len - src[row * W + col - radx - 1]) / (len - 1); - temp[row * W + col] = tempval; - len --; - } - } - } - - if (rady == 0) { - for (int row = 0; row < H; row++) - for (int col = 0; col < W; col++) { - dst[row * W + col] = temp[row * W + col]; - } - } else { - //vertical blur -#ifdef __SSE2__ - vfloat leninitv = F2V( (float)(rady + 1)); - vfloat onev = F2V( 1.f ); - vfloat tempv, temp1v, lenv, lenp1v, lenm1v, rlenv; - int col; - - for (col = 0; col < W - 7; col += 8) { - lenv = leninitv; - tempv = LVFU(temp[0 * W + col]); - temp1v = LVFU(temp[0 * W + col + 4]); - - for (int i = 1; i <= rady; i++) { - tempv = tempv + LVFU(temp[i * W + col]); - temp1v = temp1v + LVFU(temp[i * W + col + 4]); - } - - tempv = tempv / lenv; - temp1v = temp1v / lenv; - STVFU(dst[0 * W + col], tempv); - STVFU(dst[0 * W + col + 4], temp1v); - - for (int row = 1; row <= rady; row++) { - lenp1v = lenv + onev; - tempv = (tempv * lenv + LVFU(temp[(row + rady) * W + col])) / lenp1v; - temp1v = (temp1v * lenv + LVFU(temp[(row + rady) * W + col + 4])) / lenp1v; - STVFU(dst[row * W + col], tempv); - STVFU(dst[row * W + col + 4], temp1v); - lenv = lenp1v; - } - - rlenv = onev / lenv; - - for (int row = rady + 1; row < H - rady; row++) { - tempv = tempv + (LVFU(temp[(row + rady) * W + col]) - LVFU(temp[(row - rady - 1) * W + col])) * rlenv ; - temp1v = temp1v + (LVFU(temp[(row + rady) * W + col + 4]) - LVFU(temp[(row - rady - 1) * W + col + 4])) * rlenv ; - STVFU(dst[row * W + col], tempv); - STVFU(dst[row * W + col + 4], temp1v); - } - - for (int row = H - rady; row < H; row++) { - lenm1v = lenv - onev; - tempv = (tempv * lenv - LVFU(temp[(row - rady - 1) * W + col])) / lenm1v; - temp1v = (temp1v * lenv - LVFU(temp[(row - rady - 1) * W + col + 4])) / lenm1v; - STVFU(dst[row * W + col], tempv); - STVFU(dst[row * W + col + 4], temp1v); - lenv = lenm1v; - } - } - - for (; col < W - 3; col += 4) { - lenv = leninitv; - tempv = LVFU(temp[0 * W + col]); - - for (int i = 1; i <= rady; i++) { - tempv = tempv + LVFU(temp[i * W + col]); - } - - tempv = tempv / lenv; - STVFU(dst[0 * W + col], tempv); - - for (int row = 1; row <= rady; row++) { - lenp1v = lenv + onev; - tempv = (tempv * lenv + LVFU(temp[(row + rady) * W + col])) / lenp1v; - STVFU(dst[row * W + col], tempv); - lenv = lenp1v; - } - - rlenv = onev / lenv; - - for (int row = rady + 1; row < H - rady; row++) { - tempv = tempv + (LVFU(temp[(row + rady) * W + col]) - LVFU(temp[(row - rady - 1) * W + col])) * rlenv ; - STVFU(dst[row * W + col], tempv); - } - - for (int row = H - rady; row < H; row++) { - lenm1v = lenv - onev; - tempv = (tempv * lenv - LVFU(temp[(row - rady - 1) * W + col])) / lenm1v; - STVFU(dst[row * W + col], tempv); - lenv = lenm1v; - } - } - - for (; col < W; col++) { - int len = rady + 1; - dst[0 * W + col] = temp[0 * W + col] / len; - - for (int i = 1; i <= rady; i++) { - dst[0 * W + col] += temp[i * W + col] / len; - } - - for (int row = 1; row <= rady; row++) { - dst[row * W + col] = (dst[(row - 1) * W + col] * len + temp[(row + rady) * W + col]) / (len + 1); - len ++; - } - - for (int row = rady + 1; row < H - rady; row++) { - dst[row * W + col] = dst[(row - 1) * W + col] + (temp[(row + rady) * W + col] - temp[(row - rady - 1) * W + col]) / len; - } - - for (int row = H - rady; row < H; row++) { - dst[row * W + col] = (dst[(row - 1) * W + col] * len - temp[(row - rady - 1) * W + col]) / (len - 1); - len --; - } - } - -#else - - for (int col = 0; col < W; col++) { - int len = rady + 1; - dst[0 * W + col] = temp[0 * W + col] / len; - - for (int i = 1; i <= rady; i++) { - dst[0 * W + col] += temp[i * W + col] / len; - } - - for (int row = 1; row <= rady; row++) { - dst[row * W + col] = (dst[(row - 1) * W + col] * len + temp[(row + rady) * W + col]) / (len + 1); - len ++; - } - - for (int row = rady + 1; row < H - rady; row++) { - dst[row * W + col] = dst[(row - 1) * W + col] + (temp[(row + rady) * W + col] - temp[(row - rady - 1) * W + col]) / len; - } - - for (int row = H - rady; row < H; row++) { - dst[row * W + col] = (dst[(row - 1) * W + col] * len - temp[(row - rady - 1) * W + col]) / (len - 1); - len --; - } - } - -#endif - } - -} - -template void boxabsblur (T* src, A* dst, int radx, int rady, int W, int H, float * temp) -{ - - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - //box blur image; box range = (radx,rady) i.e. box size is (2*radx+1)x(2*rady+1) - - if (radx == 0) { - for (int row = 0; row < H; row++) - for (int col = 0; col < W; col++) { - temp[row * W + col] = fabs(src[row * W + col]); - } - } else { - //horizontal blur - for (int row = 0; row < H; row++) { - int len = radx + 1; - float tempval = fabsf((float)src[row * W + 0]); - - for (int j = 1; j <= radx; j++) { - tempval += fabsf((float)src[row * W + j]); - } - - tempval /= len; - temp[row * W + 0] = tempval; - - for (int col = 1; col <= radx; col++) { - tempval = (tempval * len + fabsf(src[row * W + col + radx])) / (len + 1); - temp[row * W + col] = tempval; - len ++; - } - - float rlen = 1.f / (float)len; - - for (int col = radx + 1; col < W - radx; col++) { - tempval = tempval + ((float)(fabsf(src[row * W + col + radx]) - fabsf(src[row * W + col - radx - 1]))) * rlen; - temp[row * W + col] = tempval; - } - - for (int col = W - radx; col < W; col++) { - tempval = (tempval * len - fabsf(src[row * W + col - radx - 1])) / (len - 1); - temp[row * W + col] = tempval; - len --; - } - } - } - - if (rady == 0) { - for (int row = 0; row < H; row++) - for (int col = 0; col < W; col++) { - dst[row * W + col] = temp[row * W + col]; - } - } else { - //vertical blur -#ifdef __SSE2__ - vfloat leninitv = F2V( (float)(rady + 1)); - vfloat onev = F2V( 1.f ); - vfloat tempv, lenv, lenp1v, lenm1v, rlenv; - - for (int col = 0; col < W - 3; col += 4) { - lenv = leninitv; - tempv = LVF(temp[0 * W + col]); - - for (int i = 1; i <= rady; i++) { - tempv = tempv + LVF(temp[i * W + col]); - } - - tempv = tempv / lenv; - STVF(dst[0 * W + col], tempv); - - for (int row = 1; row <= rady; row++) { - lenp1v = lenv + onev; - tempv = (tempv * lenv + LVF(temp[(row + rady) * W + col])) / lenp1v; - STVF(dst[row * W + col], tempv); - lenv = lenp1v; - } - - rlenv = onev / lenv; - - for (int row = rady + 1; row < H - rady; row++) { - tempv = tempv + (LVF(temp[(row + rady) * W + col]) - LVF(temp[(row - rady - 1) * W + col])) * rlenv; - STVF(dst[row * W + col], tempv); - } - - for (int row = H - rady; row < H; row++) { - lenm1v = lenv - onev; - tempv = (tempv * lenv - LVF(temp[(row - rady - 1) * W + col])) / lenm1v; - STVF(dst[row * W + col], tempv); - lenv = lenm1v; - } - } - - for (int col = W - (W % 4); col < W; col++) { - int len = rady + 1; - dst[0 * W + col] = temp[0 * W + col] / len; - - for (int i = 1; i <= rady; i++) { - dst[0 * W + col] += temp[i * W + col] / len; - } - - for (int row = 1; row <= rady; row++) { - dst[row * W + col] = (dst[(row - 1) * W + col] * len + temp[(row + rady) * W + col]) / (len + 1); - len ++; - } - - for (int row = rady + 1; row < H - rady; row++) { - dst[row * W + col] = dst[(row - 1) * W + col] + (temp[(row + rady) * W + col] - temp[(row - rady - 1) * W + col]) / len; - } - - for (int row = H - rady; row < H; row++) { - dst[row * W + col] = (dst[(row - 1) * W + col] * len - temp[(row - rady - 1) * W + col]) / (len - 1); - len --; - } - } - -#else - - for (int col = 0; col < W; col++) { - int len = rady + 1; - dst[0 * W + col] = temp[0 * W + col] / len; - - for (int i = 1; i <= rady; i++) { - dst[0 * W + col] += temp[i * W + col] / len; - } - - for (int row = 1; row <= rady; row++) { - dst[row * W + col] = (dst[(row - 1) * W + col] * len + temp[(row + rady) * W + col]) / (len + 1); - len ++; - } - - for (int row = rady + 1; row < H - rady; row++) { - dst[row * W + col] = dst[(row - 1) * W + col] + (temp[(row + rady) * W + col] - temp[(row - rady - 1) * W + col]) / len; - } - - for (int row = H - rady; row < H; row++) { - dst[row * W + col] = (dst[(row - 1) * W + col] * len - temp[(row - rady - 1) * W + col]) / (len - 1); - len --; - } - } - -#endif - } - -} - -} -#endif /* _BOXBLUR_H_ */ diff --git a/rtengine/gauss.cc b/rtengine/gauss.cc index ca330f9b9..dad1c4954 100644 --- a/rtengine/gauss.cc +++ b/rtengine/gauss.cc @@ -1349,7 +1349,7 @@ template void gaussVerticalmult (T** src, T** dst, const int W, const i } #endif -template void gaussianBlurImpl(T** src, T** dst, const int W, const int H, const double sigma, T *buffer = nullptr, eGaussType gausstype = GAUSS_STANDARD, T** buffer2 = nullptr) +template void gaussianBlurImpl(T** src, T** dst, const int W, const int H, const double sigma, bool useBoxBlur, eGaussType gausstype = GAUSS_STANDARD, T** buffer2 = nullptr) { static constexpr auto GAUSS_SKIP = 0.25; static constexpr auto GAUSS_3X3_LIMIT = 0.6; @@ -1357,7 +1357,7 @@ template void gaussianBlurImpl(T** src, T** dst, const int W, const int static constexpr auto GAUSS_7X7_LIMIT = 1.15; static constexpr auto GAUSS_DOUBLE = 25.0; - if(buffer) { + if (useBoxBlur) { // special variant for very large sigma, currently only used by retinex algorithm // use iterated boxblur to approximate gaussian blur // Compute ideal averaging filter width and number of iterations @@ -1393,10 +1393,10 @@ template void gaussianBlurImpl(T** src, T** dst, const int W, const int sizes[i] = ((i < m ? wl : wu) - 1) / 2; } - rtengine::boxblur(src, dst, buffer, sizes[0], sizes[0], W, H); + rtengine::boxblur(src, dst, sizes[0], W, H, true); for(int i = 1; i < n; i++) { - rtengine::boxblur(dst, dst, buffer, sizes[i], sizes[i], W, H); + rtengine::boxblur(dst, dst, sizes[i], W, H, true); } } else { if (sigma < GAUSS_SKIP) { @@ -1532,8 +1532,8 @@ template void gaussianBlurImpl(T** src, T** dst, const int W, const int } } -void gaussianBlur(float** src, float** dst, const int W, const int H, const double sigma, float *buffer, eGaussType gausstype, float** buffer2) +void gaussianBlur(float** src, float** dst, const int W, const int H, const double sigma, bool useBoxBlur, eGaussType gausstype, float** buffer2) { - gaussianBlurImpl(src, dst, W, H, sigma, buffer, gausstype, buffer2); + gaussianBlurImpl(src, dst, W, H, sigma, useBoxBlur, gausstype, buffer2); } diff --git a/rtengine/gauss.h b/rtengine/gauss.h index b63301d2b..f78762df3 100644 --- a/rtengine/gauss.h +++ b/rtengine/gauss.h @@ -21,6 +21,6 @@ enum eGaussType {GAUSS_STANDARD, GAUSS_MULT, GAUSS_DIV}; -void gaussianBlur(float** src, float** dst, const int W, const int H, const double sigma, float *buffer = nullptr, eGaussType gausstype = GAUSS_STANDARD, float** buffer2 = nullptr); +void gaussianBlur(float** src, float** dst, const int W, const int H, const double sigma, bool useBoxBlur = false, eGaussType gausstype = GAUSS_STANDARD, float** buffer2 = nullptr); #endif \ No newline at end of file diff --git a/rtengine/guidedfilter.cc b/rtengine/guidedfilter.cc index 159e89504..feb108198 100644 --- a/rtengine/guidedfilter.cc +++ b/rtengine/guidedfilter.cc @@ -105,7 +105,7 @@ void guidedFilter(const array2D &guide, const array2D &src, array2 [multithread](array2D &d, array2D &s, int rad) -> void { rad = LIM(rad, 0, (min(s.width(), s.height()) - 1) / 2 - 1); - boxblur(s, d, rad, s.width(), s.height(), multithread); + boxblur(static_cast(s), static_cast(d), rad, s.width(), s.height(), multithread); }; const int W = src.width(); diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 84da1cacc..f88108422 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -198,20 +198,20 @@ public: void Median_Denoise(float **src, float **dst, float upperBound, int width, int height, Median medianType, int iterations, int numThreads, float **buffer = nullptr); void RGB_denoise(int kall, Imagefloat * src, Imagefloat * dst, Imagefloat * calclum, float * ch_M, float *max_r, float *max_b, bool isRAW, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, const NoiseCurve & noiseLCurve, const NoiseCurve & noiseCCurve, float &nresi, float &highresi); void RGB_denoise_infoGamCurve(const procparams::DirPyrDenoiseParams & dnparams, const bool isRAW, LUTf &gamcurve, float &gam, float &gamthresh, float &gamslope); - void RGB_denoise_info(Imagefloat * src, Imagefloat * provicalc, bool isRAW, LUTf &gamcurve, float gam, float gamthresh, float gamslope, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float & maxblueaut, float &minredaut, float & minblueaut, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, bool multiThread = false); - void RGBtile_denoise(float * fLblox, int hblproc, float noisevar_Ldetail, float * nbrwt, float * blurbuffer); //for DCT + void RGB_denoise_info(Imagefloat * src, Imagefloat * provicalc, bool isRAW, const LUTf &gamcurve, float gam, float gamthresh, float gamslope, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float & maxblueaut, float &minredaut, float & minblueaut, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, bool multiThread = false); + void RGBtile_denoise(float * fLblox, int hblproc, float noisevar_Ldetail); //for DCT void RGBoutput_tile_row(float *bloxrow_L, float ** Ldetail, float ** tilemask_out, int height, int width, int top); - bool WaveletDenoiseAllL(wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3], float * vari, int edge); - bool WaveletDenoiseAllAB(wavelet_decomposition &WaveletCoeffs_L, wavelet_decomposition &WaveletCoeffs_ab, float *noisevarchrom, float madL[8][3], float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb); - void WaveletDenoiseAll_info(int levwav, wavelet_decomposition &WaveletCoeffs_a, - wavelet_decomposition &WaveletCoeffs_b, float **noisevarlum, float **noisevarchrom, float **noisevarhue, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &minredaut, float & minblueaut, int schoice, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, + bool WaveletDenoiseAllL(const wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3], float * vari, int edge); + bool WaveletDenoiseAllAB(const wavelet_decomposition &WaveletCoeffs_L, const wavelet_decomposition &WaveletCoeffs_ab, float *noisevarchrom, float madL[8][3], float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb); + void WaveletDenoiseAll_info(int levwav, const wavelet_decomposition &WaveletCoeffs_a, + const wavelet_decomposition &WaveletCoeffs_b, float **noisevarlum, float **noisevarchrom, float **noisevarhue, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &minredaut, float & minblueaut, int schoice, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, float &maxchred, float &maxchblue, float &minchred, float &minchblue, int &nb, float &chau, float &chred, float &chblue, bool denoiseMethodRgb); - bool WaveletDenoiseAll_BiShrinkL(wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3]); - bool WaveletDenoiseAll_BiShrinkAB(wavelet_decomposition &WaveletCoeffs_L, wavelet_decomposition &WaveletCoeffs_ab, float *noisevarchrom, float madL[8][3], float noisevar_ab, + bool WaveletDenoiseAll_BiShrinkL(const wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3]); + bool WaveletDenoiseAll_BiShrinkAB(const wavelet_decomposition &WaveletCoeffs_L, const wavelet_decomposition &WaveletCoeffs_ab, float *noisevarchrom, float madL[8][3], float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb); - void ShrinkAllL(wavelet_decomposition &WaveletCoeffs_L, float **buffer, int level, int dir, float *noisevarlum, float * madL, float * vari, int edge); - void ShrinkAllAB(wavelet_decomposition &WaveletCoeffs_L, wavelet_decomposition &WaveletCoeffs_ab, float **buffer, int level, int dir, + void ShrinkAllL(const wavelet_decomposition &WaveletCoeffs_L, float **buffer, int level, int dir, float *noisevarlum, float * madL, float * vari, int edge); + void ShrinkAllAB(const wavelet_decomposition &WaveletCoeffs_L, const wavelet_decomposition &WaveletCoeffs_ab, float **buffer, int level, int dir, float *noisevarchrom, float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb, float * madL, float * madaab = nullptr, bool madCalculated = false); void ShrinkAll_info(float ** WavCoeffs_a, float ** WavCoeffs_b, int W_ab, int H_ab, float **noisevarlum, float **noisevarchrom, float **noisevarhue, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &minredaut, float &minblueaut, int schoice, int lvl, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, diff --git a/rtengine/ipretinex.cc b/rtengine/ipretinex.cc index 7117c9f2a..de6f4960a 100644 --- a/rtengine/ipretinex.cc +++ b/rtengine/ipretinex.cc @@ -43,6 +43,7 @@ #include "gauss.h" #include "improcfun.h" +#include "jaggedarray.h" #include "median.h" #include "opthelper.h" #include "procparams.h" @@ -50,8 +51,6 @@ #include "rtengine.h" #include "StopWatch.h" -#define clipretinex( val, minv, maxv ) (( val = (val < minv ? minv : val ) ) > maxv ? maxv : val ) - namespace { void retinex_scales( float* scales, int nscales, int mode, int s, float high) @@ -138,360 +137,422 @@ namespace rtengine extern const Settings* settings; -void RawImageSource::MSR(float** luminance, float** originalLuminance, float **exLuminance, LUTf & mapcurve, bool &mapcontlutili, int width, int height, const RetinexParams &deh, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax) +void RawImageSource::MSR(float** luminance, float** originalLuminance, float **exLuminance, const LUTf& mapcurve, bool mapcontlutili, int width, int height, const RetinexParams &deh, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax) { +BENCHFUN + if (!deh.enabled) { + return; + } - if (deh.enabled) {//enabled - float maxtr, mintr; - constexpr float eps = 2.f; - bool useHsl = deh.retinexcolorspace == "HSLLOG"; - bool useHslLin = deh.retinexcolorspace == "HSLLIN"; - float offse = (float) deh.offs; //def = 0 not use - int iter = deh.iter; - int gradient = deh.scal; - int scal = 3;//disabled scal - int nei = (int) (2.8f * deh.neigh); //def = 220 - float vart = (float)deh.vart / 100.f;//variance - float gradvart = (float)deh.grad; - float gradstr = (float)deh.grads; - float strength = (float) deh.str / 100.f; // Blend with original L channel data - float limD = (float) deh.limd; - limD = pow(limD, 1.7f);//about 2500 enough - limD *= useHslLin ? 10.f : 1.f; - float ilimD = 1.f / limD; - float hig = ((float) deh.highl) / 100.f; - scal = deh.skal; + constexpr float eps = 2.f; + const bool useHsl = deh.retinexcolorspace == "HSLLOG"; + const bool useHslLin = deh.retinexcolorspace == "HSLLIN"; + const float offse = deh.offs; //def = 0 not use + const int iter = deh.iter; + const int gradient = deh.scal; + int scal = deh.skal; + const int nei = 2.8f * deh.neigh; //def = 220 + const float vart = deh.vart / 100.f;//variance + const float gradvart = deh.grad; + const float gradstr = deh.grads; + const float strength = deh.str / 100.f; // Blend with original L channel data + float limD = deh.limd; + limD = pow(limD, 1.7f);//about 2500 enough + limD *= useHslLin ? 10.f : 1.f; + const float ilimD = 1.f / limD; + const float hig = deh.highl / 100.f; - int H_L = height; - int W_L = width; + const int H_L = height; + const int W_L = width; - float *tran[H_L] ALIGNED16; - float *tranBuffer = nullptr; + constexpr float elogt = 2.71828f; + bool lhutili = false; - constexpr float elogt = 2.71828f; - bool lhutili = false; + FlatCurve* shcurve = new FlatCurve(deh.lhcurve); //curve L=f(H) - FlatCurve* shcurve = new FlatCurve(deh.lhcurve); //curve L=f(H) - - if (!shcurve || shcurve->isIdentity()) { - if (shcurve) { - delete shcurve; - shcurve = nullptr; - } - } else { - lhutili = true; + if (!shcurve || shcurve->isIdentity()) { + if (shcurve) { + delete shcurve; + shcurve = nullptr; } + } else { + lhutili = true; + } - bool higplus = false ; - int moderetinex = 2; // default to 2 ( deh.retinexMethod == "high" ) + bool higplus = false ; + int moderetinex = 2; // default to 2 ( deh.retinexMethod == "high" ) - if(deh.retinexMethod == "highliplus") { - higplus = true; - moderetinex = 3; - } else if (deh.retinexMethod == "uni") { - moderetinex = 0; - } else if (deh.retinexMethod == "low") { - moderetinex = 1; - } else { /*if (deh.retinexMethod == "highli") */ - moderetinex = 3; - } + if(deh.retinexMethod == "highliplus") { + higplus = true; + moderetinex = 3; + } else if (deh.retinexMethod == "uni") { + moderetinex = 0; + } else if (deh.retinexMethod == "low") { + moderetinex = 1; + } else { /*if (deh.retinexMethod == "highli") */ + moderetinex = 3; + } - constexpr float aahi = 49.f / 99.f; ////reduce sensibility 50% - constexpr float bbhi = 1.f - aahi; + constexpr float aahi = 49.f / 99.f; ////reduce sensibility 50% + constexpr float bbhi = 1.f - aahi; + float high = bbhi + aahi * (float) deh.highl; - for(int it = 1; it < iter + 1; it++) { //iter nb max of iterations - float high = bbhi + aahi * (float) deh.highl; + for (int it = 1; it < iter + 1; it++) { //iter nb max of iterations + float grad = 1.f; + float sc = scal; - float grad = 1.f; - float sc = scal; - - if(gradient == 0) { - grad = 1.f; - sc = 3.f; - } else if(gradient == 1) { - grad = 0.25f * it + 0.75f; - sc = -0.5f * it + 4.5f; - } else if(gradient == 2) { - grad = 0.5f * it + 0.5f; - sc = -0.75f * it + 5.75f; - } else if(gradient == 3) { - grad = 0.666f * it + 0.333f; - sc = -0.75f * it + 5.75f; - } else if(gradient == 4) { - grad = 0.8f * it + 0.2f; - sc = -0.75f * it + 5.75f; - } else if(gradient == 5) { - if(moderetinex != 3) { - grad = 2.5f * it - 1.5f; - } else { - float aa = (11.f * high - 1.f) / 4.f; - float bb = 1.f - aa; - grad = aa * it + bb; - } - - sc = -0.75f * it + 5.75f; - } else if(gradient == 6) { - if(moderetinex != 3) { - grad = 5.f * it - 4.f; - } else { - float aa = (21.f * high - 1.f) / 4.f; - float bb = 1.f - aa; - grad = aa * it + bb; - } - - sc = -0.75f * it + 5.75f; - } - - else if(gradient == -1) { - grad = -0.125f * it + 1.125f; - sc = 3.f; - } - - if(iter == 1) { - sc = scal; + if (gradient == 0) { + grad = 1.f; + sc = 3.f; + } else if (gradient == 1) { + grad = 0.25f * it + 0.75f; + sc = -0.5f * it + 4.5f; + } else if (gradient == 2) { + grad = 0.5f * it + 0.5f; + sc = -0.75f * it + 5.75f; + } else if (gradient == 3) { + grad = 0.666f * it + 0.333f; + sc = -0.75f * it + 5.75f; + } else if (gradient == 4) { + grad = 0.8f * it + 0.2f; + sc = -0.75f * it + 5.75f; + } else if (gradient == 5) { + if (moderetinex != 3) { + grad = 2.5f * it - 1.5f; } else { - //adjust sc in function of choice of scale by user if iterations - if(scal < 3) { - sc -= 1; + float aa = (11.f * high - 1.f) / 4.f; + float bb = 1.f - aa; + grad = aa * it + bb; + } - if(sc < 1.f) {//avoid 0 - sc = 1.f; - } + sc = -0.75f * it + 5.75f; + } else if (gradient == 6) { + if (moderetinex != 3) { + grad = 5.f * it - 4.f; + } else { + float aa = (21.f * high - 1.f) / 4.f; + float bb = 1.f - aa; + grad = aa * it + bb; + } + + sc = -0.75f * it + 5.75f; + } else if (gradient == -1) { + grad = -0.125f * it + 1.125f; + sc = 3.f; + } + + if (iter == 1) { + sc = scal; + } else { + //adjust sc in function of choice of scale by user if iterations + if (scal < 3) { + sc -= 1; + if (sc < 1.f) {//avoid 0 + sc = 1.f; } + } else if (scal > 4) { + sc += 1; + } + } - if(scal > 4) { - sc += 1; + float varx = vart; + float limdx = limD; + float ilimdx = ilimD; + + if (gradvart != 0) { + if (gradvart == 1) { + varx = vart * (-0.125f * it + 1.125f); + limdx = limD * (-0.125f * it + 1.125f); + ilimdx = 1.f / limdx; + } else if (gradvart == 2) { + varx = vart * (-0.2f * it + 1.2f); + limdx = limD * (-0.2f * it + 1.2f); + ilimdx = 1.f / limdx; + } else if (gradvart == -1) { + varx = vart * (0.125f * it + 0.875f); + limdx = limD * (0.125f * it + 0.875f); + ilimdx = 1.f / limdx; + } else if (gradvart == -2) { + varx = vart * (0.4f * it + 0.6f); + limdx = limD * (0.4f * it + 0.6f); + ilimdx = 1.f / limdx; + } + } + + scal = round(sc); + float ks = 1.f; + + if (gradstr != 0) { + if (gradstr == 1) { + if (it <= 3) { + ks = -0.3f * it + 1.6f; + } else { + ks = 0.5f; + } + } else if (gradstr == 2) { + if (it <= 3) { + ks = -0.6f * it + 2.2f; + } else { + ks = 0.3f; + } + } else if (gradstr == -1) { + if (it <= 3) { + ks = 0.2f * it + 0.6f; + } else { + ks = 1.2f; + } + } else if (gradstr == -2) { + if (it <= 3) { + ks = 0.4f * it + 0.2f; + } else { + ks = 1.5f; } } + } - float varx = vart; - float limdx = limD; - float ilimdx = ilimD; + const float strengthx = ks * strength; - if(gradvart != 0) { - if(gradvart == 1) { - varx = vart * (-0.125f * it + 1.125f); - limdx = limD * (-0.125f * it + 1.125f); - ilimdx = 1.f / limdx; - } else if(gradvart == 2) { - varx = vart * (-0.2f * it + 1.2f); - limdx = limD * (-0.2f * it + 1.2f); - ilimdx = 1.f / limdx; - } else if(gradvart == -1) { - varx = vart * (0.125f * it + 0.875f); - limdx = limD * (0.125f * it + 0.875f); - ilimdx = 1.f / limdx; - } else if(gradvart == -2) { - varx = vart * (0.4f * it + 0.6f); - limdx = limD * (0.4f * it + 0.6f); - ilimdx = 1.f / limdx; - } - } + constexpr auto maxRetinexScales = 8; + float RetinexScales[maxRetinexScales]; - scal = round(sc); - float ks = 1.f; + retinex_scales(RetinexScales, scal, moderetinex, nei / grad, high); - if(gradstr != 0) { - if(gradstr == 1) { - if(it <= 3) { - ks = -0.3f * it + 1.6f; - } else { - ks = 0.5f; - } - } else if(gradstr == 2) { - if(it <= 3) { - ks = -0.6f * it + 2.2f; - } else { - ks = 0.3f; - } - } else if(gradstr == -1) { - if(it <= 3) { - ks = 0.2f * it + 0.6f; - } else { - ks = 1.2f; - } - } else if(gradstr == -2) { - if(it <= 3) { - ks = 0.4f * it + 0.2f; - } else { - ks = 1.5f; - } - } - } + const int shHighlights = deh.highlights; + const int shShadows = deh.shadows; - float strengthx = ks * strength; + int mapmet = 0; - constexpr auto maxRetinexScales = 8; - float RetinexScales[maxRetinexScales]; + if(deh.mapMethod == "map") { + mapmet = 2; + } else if(deh.mapMethod == "mapT") { + mapmet = 3; + } else if(deh.mapMethod == "gaus") { + mapmet = 4; + } - retinex_scales( RetinexScales, scal, moderetinex, nei / grad, high ); + const double shradius = mapmet == 4 ? (double) deh.radius : 40.; - float *src[H_L] ALIGNED16; - float *srcBuffer = new float[H_L * W_L]; + int viewmet = 0; - for (int i = 0; i < H_L; i++) { - src[i] = &srcBuffer[i * W_L]; - } + if(deh.viewMethod == "mask") { + viewmet = 1; + } else if(deh.viewMethod == "tran") { + viewmet = 2; + } else if(deh.viewMethod == "tran2") { + viewmet = 3; + } else if(deh.viewMethod == "unsharp") { + viewmet = 4; + } - int h_th = 0, s_th = 0; - - int shHighlights = deh.highlights; - int shShadows = deh.shadows; - - int mapmet = 0; - - if(deh.mapMethod == "map") { - mapmet = 2; - } else if(deh.mapMethod == "mapT") { - mapmet = 3; - } else if(deh.mapMethod == "gaus") { - mapmet = 4; - } - - const double shradius = mapmet == 4 ? (double) deh.radius : 40.; - - int viewmet = 0; - - if(deh.viewMethod == "mask") { - viewmet = 1; - } else if(deh.viewMethod == "tran") { - viewmet = 2; - } else if(deh.viewMethod == "tran2") { - viewmet = 3; - } else if(deh.viewMethod == "unsharp") { - viewmet = 4; - } + std::unique_ptr> srcBuffer(new JaggedArray(W_L, H_L)); + float** src = *(srcBuffer.get()); #ifdef _OPENMP - #pragma omp parallel for + #pragma omp parallel for #endif - for (int i = 0; i < H_L; i++) - for (int j = 0; j < W_L; j++) { - src[i][j] = luminance[i][j] + eps; - luminance[i][j] = 0.f; - } - - float *out[H_L] ALIGNED16; - float *outBuffer = new float[H_L * W_L]; - - for (int i = 0; i < H_L; i++) { - out[i] = &outBuffer[i * W_L]; + for (int i = 0; i < H_L; i++) + for (int j = 0; j < W_L; j++) { + src[i][j] = luminance[i][j] + eps; + luminance[i][j] = 0.f; } - if(viewmet == 3 || viewmet == 2) { - tranBuffer = new float[H_L * W_L]; + JaggedArray out(W_L, H_L); + JaggedArray& tran = out; // tran and out can safely use the same buffer - for (int i = 0; i < H_L; i++) { - tran[i] = &tranBuffer[i * W_L]; - } - } + const float logBetaGain = xlogf(16384.f); + float pond = logBetaGain / (float) scal; - const float logBetaGain = xlogf(16384.f); - float pond = logBetaGain / (float) scal; + if(!useHslLin) { + pond /= log(elogt); + } - if(!useHslLin) { - pond /= log(elogt); - } + std::unique_ptr shmap; + if (((mapmet == 2 || mapmet == 3 || mapmet == 4) && it == 1)) { + shmap.reset(new SHMap(W_L, H_L)); + } - auto shmap = ((mapmet == 2 || mapmet == 3 || mapmet == 4) && it == 1) ? new SHMap (W_L, H_L) : nullptr; + std::unique_ptr buffer; + if (mapmet > 0) { + buffer.reset(new float[W_L * H_L]); + } - float *buffer = new float[W_L * H_L];; - - for ( int scale = scal - 1; scale >= 0; scale-- ) { -#ifdef _OPENMP - #pragma omp parallel -#endif - { - if(scale == scal - 1) - { - gaussianBlur (src, out, W_L, H_L, RetinexScales[scale], buffer); - } else { // reuse result of last iteration - // out was modified in last iteration => restore it - if((((mapmet == 2 && scale > 1) || mapmet == 3 || mapmet == 4) || (mapmet > 0 && mapcontlutili)) && it == 1) - { -#ifdef _OPENMP - #pragma omp for -#endif - - for (int i = 0; i < H_L; i++) { - for (int j = 0; j < W_L; j++) { - out[i][j] = buffer[i * W_L + j]; - } - } - } - - gaussianBlur (out, out, W_L, H_L, sqrtf(SQR(RetinexScales[scale]) - SQR(RetinexScales[scale + 1])), buffer); - } - if((((mapmet == 2 && scale > 2) || mapmet == 3 || mapmet == 4) || (mapmet > 0 && mapcontlutili)) && it == 1 && scale > 0) - { - // out will be modified => store it for use in next iteration. We even don't need a new buffer because 'buffer' is free after gaussianBlur :) -#ifdef _OPENMP - #pragma omp for -#endif - - for (int i = 0; i < H_L; i++) { - for (int j = 0; j < W_L; j++) { - buffer[i * W_L + j] = out[i][j]; - } - } - } - } - - if(((mapmet == 2 && scale > 2) || mapmet == 3 || mapmet == 4) && it == 1) { - shmap->updateL (out, shradius, true, 1); - h_th = shmap->max_f - deh.htonalwidth * (shmap->max_f - shmap->avg) / 100; - s_th = deh.stonalwidth * (shmap->avg - shmap->min_f) / 100; - } - -#ifdef __SSE2__ - vfloat pondv = F2V(pond); - vfloat limMinv = F2V(ilimdx); - vfloat limMaxv = F2V(limdx); - -#endif - - if(mapmet > 0 && mapcontlutili && it == 1) { - // TODO: When rgbcurvespeedup branch is merged into master we can simplify the code by - // 1) in rawimagesource.retinexPrepareCurves() insert - // mapcurve *= 0.5f; - // after - // CurveFactory::mapcurve (mapcontlutili, retinexParams.mapcurve, mapcurve, 1, lhist16RETI, histLRETI); - // 2) remove the division by 2.f from the code 7 lines below this line + for (int scale = scal - 1; scale >= 0; --scale) { + if (scale == scal - 1) { + gaussianBlur(src, out, W_L, H_L, RetinexScales[scale], true); + } else { // reuse result of last iteration + // out was modified in last iteration => restore it + if((((mapmet == 2 && scale > 1) || mapmet == 3 || mapmet == 4) || (mapmet > 0 && mapcontlutili)) && it == 1) { #ifdef _OPENMP #pragma omp parallel for #endif for (int i = 0; i < H_L; i++) { for (int j = 0; j < W_L; j++) { - out[i][j] = mapcurve[2.f * out[i][j]] / 2.f; + out[i][j] = buffer[i * W_L + j]; } } - } - if(((mapmet == 2 && scale > 2) || mapmet == 3 || mapmet == 4) && it == 1) { - float hWeight = (100.f - shHighlights) / 100.f; - float sWeight = (100.f - shShadows) / 100.f; + gaussianBlur(out, out, W_L, H_L, sqrtf(SQR(RetinexScales[scale]) - SQR(RetinexScales[scale + 1])), true); + } + + if ((((mapmet == 2 && scale > 2) || mapmet == 3 || mapmet == 4) || (mapmet > 0 && mapcontlutili)) && it == 1 && scale > 0) { + // out will be modified => store it for use in next iteration. #ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) + #pragma omp parallel for #endif - for (int i = 0; i < H_L; i++) { - for (int j = 0; j < W_L; j++) { - float mapval = 1.f + shmap->map[i][j]; - float factor = 1.f; + for (int i = 0; i < H_L; i++) { + for (int j = 0; j < W_L; j++) { + buffer[i * W_L + j] = out[i][j]; + } + } + } + int h_th = 0; + int s_th = 0; + if (((mapmet == 2 && scale > 2) || mapmet == 3 || mapmet == 4) && it == 1) { + shmap->updateL(out, shradius, true, 1); + h_th = shmap->max_f - deh.htonalwidth * (shmap->max_f - shmap->avg) / 100; + s_th = deh.stonalwidth * (shmap->avg - shmap->min_f) / 100; + } - if (mapval > h_th) { - factor = (h_th + hWeight * (mapval - h_th)) / mapval; - } else if (mapval < s_th) { - factor = (s_th - sWeight * (s_th - mapval)) / mapval; - } + if (mapmet > 0 && mapcontlutili && it == 1) { +#ifdef _OPENMP + #pragma omp parallel for +#endif - out[i][j] *= factor; + for (int i = 0; i < H_L; i++) { + for (int j = 0; j < W_L; j++) { + out[i][j] = mapcurve[2.f * out[i][j]]; + } + } + } + + if (((mapmet == 2 && scale > 2) || mapmet == 3 || mapmet == 4) && it == 1) { + const float hWeight = (100.f - shHighlights) / 100.f; + const float sWeight = (100.f - shShadows) / 100.f; +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + + for (int i = 0; i < H_L; i++) { + for (int j = 0; j < W_L; j++) { + const float mapval = 1.f + shmap->map[i][j]; + float factor; + + if (mapval > h_th) { + factor = (h_th + hWeight * (mapval - h_th)) / mapval; + } else if (mapval < s_th) { + factor = (s_th - sWeight * (s_th - mapval)) / mapval; + } else { + factor = 1.f; } + + out[i][j] *= factor; + } + } + } + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int i = 0; i < H_L; i++) { + int j = 0; + +#ifdef __SSE2__ + const vfloat pondv = F2V(pond); + const vfloat limMinv = F2V(ilimdx); + const vfloat limMaxv = F2V(limdx); + if( useHslLin) { + for (; j < W_L - 3; j += 4) { + STVFU(luminance[i][j], LVFU(luminance[i][j]) + pondv * vclampf(LVFU(src[i][j]) / LVFU(out[i][j]), limMinv, limMaxv)); + } + } else { + for (; j < W_L - 3; j += 4) { + STVFU(luminance[i][j], LVFU(luminance[i][j]) + pondv * xlogf(vclampf(LVFU(src[i][j]) / LVFU(out[i][j]), limMinv, limMaxv))); + } + } + +#endif + + if(useHslLin) { + for (; j < W_L; j++) { + luminance[i][j] += pond * LIM(src[i][j] / out[i][j], ilimdx, limdx); + } + } else { + for (; j < W_L; j++) { + luminance[i][j] += pond * xlogf(LIM(src[i][j] / out[i][j], ilimdx, limdx)); // /logt ? + } + } + } + } + + srcBuffer.reset(); + + float mean = 0.f; + float stddv = 0.f; + // I call mean_stddv2 instead of mean_stddv ==> logBetaGain + + float maxtr, mintr; + mean_stddv2(luminance, mean, stddv, W_L, H_L, maxtr, mintr); + //printf("mean=%f std=%f delta=%f maxtr=%f mintr=%f\n", mean, stddv, delta, maxtr, mintr); + + //mean_stddv( luminance, mean, stddv, W_L, H_L, logBetaGain, maxtr, mintr); + if (dehatransmissionCurve && mean != 0.f && stddv != 0.f) { //if curve + float asig = 0.166666f / stddv; + float bsig = 0.5f - asig * mean; + float amax = 0.333333f / (maxtr - mean - stddv); + float bmax = 1.f - amax * maxtr; + float amin = 0.333333f / (mean - stddv - mintr); + float bmin = -amin * mintr; + + asig *= 500.f; + bsig *= 500.f; + amax *= 500.f; + bmax *= 500.f; + amin *= 500.f; + bmin *= 500.f; + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + + for (int i = 0; i < H_L; i++ ) { + for (int j = 0; j < W_L; j++) { //for mintr to maxtr evalate absciss in function of original transmission + float absciss; + if (LIKELY(fabsf(luminance[i][j] - mean) < stddv)) { + absciss = asig * luminance[i][j] + bsig; + } else if (luminance[i][j] >= mean) { + absciss = amax * luminance[i][j] + bmax; + } else { /*if(luminance[i][j] <= mean - stddv)*/ + absciss = amin * luminance[i][j] + bmin; + } + + //TODO : move multiplication by 4.f and subtraction of 1.f inside the curve + luminance[i][j] *= (-1.f + 4.f * dehatransmissionCurve[absciss]); //new transmission + + if(viewmet == 3 || viewmet == 2) { + tran[i][j] = luminance[i][j]; + } + } + } + + // median filter on transmission ==> reduce artifacts + if (deh.medianmap && it == 1) { //only one time + JaggedArray tmL(W_L, H_L); + constexpr int borderL = 1; + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int i = borderL; i < H_L - borderL; i++) { + for (int j = borderL; j < W_L - borderL; j++) { + tmL[i][j] = median(luminance[i][j], luminance[i - 1][j], luminance[i + 1][j], luminance[i][j + 1], luminance[i][j - 1], luminance[i - 1][j - 1], luminance[i - 1][j + 1], luminance[i + 1][j - 1], luminance[i + 1][j + 1]); //3x3 } } @@ -499,307 +560,164 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e #pragma omp parallel for #endif - for (int i = 0; i < H_L; i++) { - int j = 0; - -#ifdef __SSE2__ - - if(useHslLin) { - for (; j < W_L - 3; j += 4) { - _mm_storeu_ps(&luminance[i][j], LVFU(luminance[i][j]) + pondv * (vclampf(LVFU(src[i][j]) / LVFU(out[i][j]), limMinv, limMaxv) )); - } - } else { - for (; j < W_L - 3; j += 4) { - _mm_storeu_ps(&luminance[i][j], LVFU(luminance[i][j]) + pondv * xlogf(vclampf(LVFU(src[i][j]) / LVFU(out[i][j]), limMinv, limMaxv) )); - } - } - -#endif - - if(useHslLin) { - for (; j < W_L; j++) { - luminance[i][j] += pond * (LIM(src[i][j] / out[i][j], ilimdx, limdx)); - } - } else { - for (; j < W_L; j++) { - luminance[i][j] += pond * xlogf(LIM(src[i][j] / out[i][j], ilimdx, limdx)); // /logt ? - } + for (int i = borderL; i < H_L - borderL; i++ ) { + for (int j = borderL; j < W_L - borderL; j++) { + luminance[i][j] = tmL[i][j]; } } } - if(mapmet > 1) { - if(shmap) { - delete shmap; - } - } - - shmap = nullptr; - - delete [] buffer; - delete [] srcBuffer; - - float mean = 0.f; - float stddv = 0.f; // I call mean_stddv2 instead of mean_stddv ==> logBetaGain + //mean_stddv( luminance, mean, stddv, W_L, H_L, 1.f, maxtr, mintr); + mean_stddv2(luminance, mean, stddv, W_L, H_L, maxtr, mintr); + } - mean_stddv2( luminance, mean, stddv, W_L, H_L, maxtr, mintr); - //printf("mean=%f std=%f delta=%f maxtr=%f mintr=%f\n", mean, stddv, delta, maxtr, mintr); + constexpr float epsil = 0.1f; - //mean_stddv( luminance, mean, stddv, W_L, H_L, logBetaGain, maxtr, mintr); - if (dehatransmissionCurve && mean != 0.f && stddv != 0.f) { //if curve - float asig = 0.166666f / stddv; - float bsig = 0.5f - asig * mean; - float amax = 0.333333f / (maxtr - mean - stddv); - float bmax = 1.f - amax * maxtr; - float amin = 0.333333f / (mean - stddv - mintr); - float bmin = -amin * mintr; + mini = mean - varx * stddv; - asig *= 500.f; - bsig *= 500.f; - amax *= 500.f; - bmax *= 500.f; - amin *= 500.f; - bmin *= 500.f; + if (mini < mintr) { + mini = mintr + epsil; + } -#ifdef _OPENMP - #pragma omp parallel -#endif - { - float absciss; -#ifdef _OPENMP - #pragma omp for schedule(dynamic,16) -#endif + maxi = mean + varx * stddv; - for (int i = 0; i < H_L; i++ ) - for (int j = 0; j < W_L; j++) { //for mintr to maxtr evalate absciss in function of original transmission - if (LIKELY(fabsf(luminance[i][j] - mean) < stddv)) { - absciss = asig * luminance[i][j] + bsig; - } else if (luminance[i][j] >= mean) { - absciss = amax * luminance[i][j] + bmax; - } else { /*if(luminance[i][j] <= mean - stddv)*/ - absciss = amin * luminance[i][j] + bmin; - } + if (maxi > maxtr) { + maxi = maxtr - epsil; + } - //TODO : move multiplication by 4.f and subtraction of 1.f inside the curve - luminance[i][j] *= (-1.f + 4.f * dehatransmissionCurve[absciss]); //new transmission + float delta = maxi - mini; + //printf("maxi=%f mini=%f mean=%f std=%f delta=%f maxtr=%f mintr=%f\n", maxi, mini, mean, stddv, delta, maxtr, mintr); - if(viewmet == 3 || viewmet == 2) { - tran[i][j] = luminance[i][j]; - } - } - } + if ( !delta ) { + delta = 1.0f; + } - // median filter on transmission ==> reduce artifacts - if (deh.medianmap && it == 1) { //only one time - int wid = W_L; - int hei = H_L; - float *tmL[hei] ALIGNED16; - float *tmLBuffer = new float[wid * hei]; - int borderL = 1; - - for (int i = 0; i < hei; i++) { - tmL[i] = &tmLBuffer[i * wid]; - } - -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int i = borderL; i < hei - borderL; i++) { - for (int j = borderL; j < wid - borderL; j++) { - tmL[i][j] = median(luminance[i][j], luminance[i - 1][j], luminance[i + 1][j], luminance[i][j + 1], luminance[i][j - 1], luminance[i - 1][j - 1], luminance[i - 1][j + 1], luminance[i + 1][j - 1], luminance[i + 1][j + 1]); //3x3 - } - } - -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int i = borderL; i < hei - borderL; i++ ) { - for (int j = borderL; j < wid - borderL; j++) { - luminance[i][j] = tmL[i][j]; - } - } - - delete [] tmLBuffer; - - } - - // I call mean_stddv2 instead of mean_stddv ==> logBetaGain - //mean_stddv( luminance, mean, stddv, W_L, H_L, 1.f, maxtr, mintr); - mean_stddv2( luminance, mean, stddv, W_L, H_L, maxtr, mintr); - - } - - float epsil = 0.1f; - - mini = mean - varx * stddv; - - if (mini < mintr) { - mini = mintr + epsil; - } - - maxi = mean + varx * stddv; - - if (maxi > maxtr) { - maxi = maxtr - epsil; - } - - float delta = maxi - mini; - //printf("maxi=%f mini=%f mean=%f std=%f delta=%f maxtr=%f mintr=%f\n", maxi, mini, mean, stddv, delta, maxtr, mintr); - - if ( !delta ) { - delta = 1.0f; - } - - float cdfactor = 32768.f / delta; - maxCD = -9999999.f; - minCD = 9999999.f; - // coeff for auto "transmission" with 2 sigma #95% data - float aza = 16300.f / (2.f * stddv); - float azb = -aza * (mean - 2.f * stddv); - float bza = 16300.f / (2.f * stddv); - float bzb = 16300.f - bza * (mean); + // coeff for auto "transmission" with 2 sigma #95% data + const float aza = 16300.f / (2.f * stddv); + const float azb = -aza * (mean - 2.f * stddv); + const float bza = 16300.f / (2.f * stddv); + const float bzb = 16300.f - bza * (mean); //prepare work for curve gain #ifdef _OPENMP - #pragma omp parallel for + #pragma omp parallel for #endif - for (int i = 0; i < H_L; i++) { - for (int j = 0; j < W_L; j++) { - luminance[i][j] = luminance[i][j] - mini; - } + for (int i = 0; i < H_L; i++) { + for (int j = 0; j < W_L; j++) { + luminance[i][j] = luminance[i][j] - mini; } + } - mean = 0.f; - stddv = 0.f; - // I call mean_stddv2 instead of mean_stddv ==> logBetaGain + mean = 0.f; + stddv = 0.f; + // I call mean_stddv2 instead of mean_stddv ==> logBetaGain - mean_stddv2( luminance, mean, stddv, W_L, H_L, maxtr, mintr); - float asig = 0.f, bsig = 0.f, amax = 0.f, bmax = 0.f, amin = 0.f, bmin = 0.f; + mean_stddv2(luminance, mean, stddv, W_L, H_L, maxtr, mintr); + float asig = 0.f, bsig = 0.f, amax = 0.f, bmax = 0.f, amin = 0.f, bmin = 0.f; - if (dehagaintransmissionCurve && mean != 0.f && stddv != 0.f) { //if curve - asig = 0.166666f / stddv; - bsig = 0.5f - asig * mean; - amax = 0.333333f / (maxtr - mean - stddv); - bmax = 1.f - amax * maxtr; - amin = 0.333333f / (mean - stddv - mintr); - bmin = -amin * mintr; + if (dehagaintransmissionCurve && mean != 0.f && stddv != 0.f) { //if curve + asig = 0.166666f / stddv; + bsig = 0.5f - asig * mean; + amax = 0.333333f / (maxtr - mean - stddv); + bmax = 1.f - amax * maxtr; + amin = 0.333333f / (mean - stddv - mintr); + bmin = -amin * mintr; - asig *= 500.f; - bsig *= 500.f; - amax *= 500.f; - bmax *= 500.f; - amin *= 500.f; - bmin *= 500.f; - } + asig *= 500.f; + bsig *= 500.f; + amax *= 500.f; + bmax *= 500.f; + amin *= 500.f; + bmin *= 500.f; + } + + const float cdfactor = 32768.f / delta; + maxCD = -9999999.f; + minCD = 9999999.f; #ifdef _OPENMP - #pragma omp parallel -#endif - { - float cdmax = -999999.f, cdmin = 999999.f; -#ifdef _OPENMP - #pragma omp for schedule(dynamic,16) nowait + #pragma omp parallel for reduction(max:maxCD) reduction(min:minCD) schedule(dynamic, 16) #endif - for ( int i = 0; i < H_L; i ++ ) - for (int j = 0; j < W_L; j++) { - float gan; + for ( int i = 0; i < H_L; i ++ ) { + for (int j = 0; j < W_L; j++) { + float gan; - if (dehagaintransmissionCurve && mean != 0.f && stddv != 0.f) { - float absciss; - - if (LIKELY(fabsf(luminance[i][j] - mean) < stddv)) { - absciss = asig * luminance[i][j] + bsig; - } else if (luminance[i][j] >= mean) { - absciss = amax * luminance[i][j] + bmax; - } else { /*if(luminance[i][j] <= mean - stddv)*/ - absciss = amin * luminance[i][j] + bmin; - } - - - // float cd = cdfactor * ( luminance[i][j] - mini ) + offse; - // TODO : move multiplication by 2.f inside the curve - gan = 2.f * (dehagaintransmissionCurve[absciss]); //new gain function transmission - } else { - gan = 0.5f; - } - - float cd = gan * cdfactor * ( luminance[i][j] ) + offse; - - cdmax = cd > cdmax ? cd : cdmax; - cdmin = cd < cdmin ? cd : cdmin; - - float str = strengthx; - - if(lhutili && it == 1) { // S=f(H) - { - float HH = exLuminance[i][j]; - float valparam; - - if(useHsl || useHslLin) { - valparam = float((shcurve->getVal(HH) - 0.5f)); - } else { - valparam = float((shcurve->getVal(Color::huelab_to_huehsv2(HH)) - 0.5f)); - } - - str *= (1.f + 2.f * valparam); - } - } - - if(higplus && exLuminance[i][j] > 65535.f * hig) { - str *= hig; - } - - if(viewmet == 0) { - luminance[i][j] = intp(str, clipretinex( cd, 0.f, 32768.f ), originalLuminance[i][j]); - } else if(viewmet == 1) { - luminance[i][j] = out[i][j]; - } else if(viewmet == 4) { - luminance[i][j] = originalLuminance[i][j] + str * (originalLuminance[i][j] - out[i][j]);//unsharp - } else if(viewmet == 2) { - if(tran[i][j] <= mean) { - luminance[i][j] = azb + aza * tran[i][j]; //auto values - } else { - luminance[i][j] = bzb + bza * tran[i][j]; - } - } else { /*if(viewmet == 3) */ - luminance[i][j] = 1000.f + tran[i][j] * 700.f; //arbitrary values to help display log values which are between -20 to + 30 - usage values -4 + 5 - } + if (dehagaintransmissionCurve && mean != 0.f && stddv != 0.f) { + float absciss; + if (LIKELY(fabsf(luminance[i][j] - mean) < stddv)) { + absciss = asig * luminance[i][j] + bsig; + } else if (luminance[i][j] >= mean) { + absciss = amax * luminance[i][j] + bmax; + } else { /*if(luminance[i][j] <= mean - stddv)*/ + absciss = amin * luminance[i][j] + bmin; } -#ifdef _OPENMP - #pragma omp critical -#endif - { - maxCD = maxCD > cdmax ? maxCD : cdmax; - minCD = minCD < cdmin ? minCD : cdmin; + + // float cd = cdfactor * ( luminance[i][j] - mini ) + offse; + // TODO : move multiplication by 2.f inside the curve + gan = 2.f * dehagaintransmissionCurve[absciss]; //new gain function transmission + } else { + gan = 0.5f; + } + + const float cd = gan * cdfactor * luminance[i][j] + offse; + + maxCD = cd > maxCD ? cd : maxCD; + minCD = cd < minCD ? cd : minCD; + + float str = strengthx; + + if (lhutili && it == 1) { // S=f(H) + { + const float HH = exLuminance[i][j]; + float valparam; + + if(useHsl || useHslLin) { + valparam = shcurve->getVal(HH) - 0.5f; + } else { + valparam = shcurve->getVal(Color::huelab_to_huehsv2(HH)) - 0.5f; + } + + str *= (1.f + 2.f * valparam); + } + } + + if (higplus && exLuminance[i][j] > 65535.f * hig) { + str *= hig; + } + + if (viewmet == 0) { + luminance[i][j] = intp(str, LIM(cd, 0.f, 32768.f), originalLuminance[i][j]); + } else if (viewmet == 1) { + luminance[i][j] = out[i][j]; + } else if (viewmet == 4) { + luminance[i][j] = originalLuminance[i][j] + str * (originalLuminance[i][j] - out[i][j]);//unsharp + } else if (viewmet == 2) { + if(tran[i][j] <= mean) { + luminance[i][j] = azb + aza * tran[i][j]; //auto values + } else { + luminance[i][j] = bzb + bza * tran[i][j]; + } + } else { /*if (viewmet == 3) */ + luminance[i][j] = 1000.f + tran[i][j] * 700.f; //arbitrary values to help display log values which are between -20 to + 30 - usage values -4 + 5 } } - - delete [] outBuffer; - outBuffer = nullptr; - //printf("cdmin=%f cdmax=%f\n",minCD, maxCD); - Tmean = mean; - Tsigma = stddv; - Tmin = mintr; - Tmax = maxtr; - - if (shcurve) { - delete shcurve; - shcurve = nullptr; - } } - if(tranBuffer) { - delete [] tranBuffer; - } + Tmean = mean; + Tsigma = stddv; + Tmin = mintr; + Tmax = maxtr; + if (shcurve) { + delete shcurve; + shcurve = nullptr; + } } } diff --git a/rtengine/ipsharpen.cc b/rtengine/ipsharpen.cc index bbd1de155..0b1332ec9 100644 --- a/rtengine/ipsharpen.cc +++ b/rtengine/ipsharpen.cc @@ -207,13 +207,13 @@ BENCHFUN for (int k = 0; k < sharpenParam.deconviter; k++) { if (!needdamp) { // apply gaussian blur and divide luminance by result of gaussian blur - gaussianBlur(tmpI, tmp, W, H, sigma, nullptr, GAUSS_DIV, luminance); + gaussianBlur(tmpI, tmp, W, H, sigma, false, GAUSS_DIV, luminance); } else { // apply gaussian blur + damping gaussianBlur(tmpI, tmp, W, H, sigma); dcdamping(tmp, luminance, damping, W, H); } - gaussianBlur(tmp, tmpI, W, H, sigma, nullptr, GAUSS_MULT); + gaussianBlur(tmp, tmpI, W, H, sigma, false, GAUSS_MULT); } // end for #ifdef _OPENMP diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 07e9da85b..6631aae32 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -32,7 +32,6 @@ #include "improcfun.h" #include "LUT.h" #include "array2D.h" -#include "boxblur.h" #include "rt_math.h" #include "mytime.h" #include "sleef.c" diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 5f1d13c79..ed1e45394 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -1950,8 +1950,8 @@ void RawImageSource::retinexPrepareCurves(const RetinexParams &retinexParams, LU CurveFactory::curveDehaContL (retinexcontlutili, retinexParams.cdcurve, cdcurve, 1, lhist16RETI, histLRETI); } - CurveFactory::mapcurve (mapcontlutili, retinexParams.mapcurve, mapcurve, 1, lhist16RETI, histLRETI); - + CurveFactory::mapcurve(mapcontlutili, retinexParams.mapcurve, mapcurve, 1, lhist16RETI, histLRETI); + mapcurve *= 0.5f; retinexParams.getCurves(retinextransmissionCurve, retinexgaintransmissionCurve); } diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index e52adea18..37d927445 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -201,7 +201,7 @@ public: } static void inverse33 (const double (*coeff)[3], double (*icoeff)[3]); - void MSR(float** luminance, float **originalLuminance, float **exLuminance, LUTf & mapcurve, bool &mapcontlutili, int width, int height, const RetinexParams &deh, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax); + void MSR(float** luminance, float **originalLuminance, float **exLuminance, const LUTf& mapcurve, bool mapcontlutili, int width, int height, const RetinexParams &deh, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax); void HLRecovery_inpaint (float** red, float** green, float** blue) override; static void HLRecovery_Luminance (float* rin, float* gin, float* bin, float* rout, float* gout, float* bout, int width, float maxval); static void HLRecovery_CIELab (float* rin, float* gin, float* bin, float* rout, float* gout, float* bout, int width, float maxval, double cam[3][3], double icam[3][3]); diff --git a/rtengine/rescale.h b/rtengine/rescale.h index e9d476fea..8e1f99271 100644 --- a/rtengine/rescale.h +++ b/rtengine/rescale.h @@ -21,6 +21,7 @@ #pragma once #include "array2D.h" +#include "rt_math.h" namespace rtengine { diff --git a/rtengine/shmap.cc b/rtengine/shmap.cc index 6b59c4b40..368442f2b 100644 --- a/rtengine/shmap.cc +++ b/rtengine/shmap.cc @@ -85,21 +85,14 @@ void SHMap::update (Imagefloat* img, double radius, double lumi[3], bool hq, int if (!hq) { fillLuminance( img, map, lumi); - float *buffer = nullptr; - - if(radius > 40.) { - // When we pass another buffer to gaussianBlur, it will use iterated boxblur which is less prone to artifacts - buffer = new float[W * H]; - } + const bool useBoxBlur = radius > 40.0; // boxblur is less prone to artifacts for large radi #ifdef _OPENMP - #pragma omp parallel + #pragma omp parallel if (!useBoxBlur) #endif { - gaussianBlur (map, map, W, H, radius, buffer); + gaussianBlur (map, map, W, H, radius, useBoxBlur); } - - delete [] buffer; } else { From 5afb0a345e68374117dcf8957a485818de29b188 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 26 Sep 2019 15:27:12 +0200 Subject: [PATCH 058/208] add mising include --- rtengine/gauss.cc | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/rtengine/gauss.cc b/rtengine/gauss.cc index dad1c4954..8d9e5de38 100644 --- a/rtengine/gauss.cc +++ b/rtengine/gauss.cc @@ -16,12 +16,16 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include "gauss.h" -#include "rt_math.h" #include #include -#include "opthelper.h" +#include + +#include "gauss.h" + #include "boxblur.h" +#include "opthelper.h" +#include "rt_math.h" + namespace { From d08c88bdea7eeac7303378d5376cd73bdae47b99 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 26 Sep 2019 18:02:37 +0200 Subject: [PATCH 059/208] Update rt_algo.cc Fixed a comment --- rtengine/rt_algo.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/rt_algo.cc b/rtengine/rt_algo.cc index dd7783c1d..aadbac7f7 100644 --- a/rtengine/rt_algo.cc +++ b/rtengine/rt_algo.cc @@ -352,7 +352,7 @@ void buildBlendMask(const float* const * luminance, float **blend, int W, int H, contrastThreshold = calcContrastThreshold(luminance, minY, minX, tilesize); break; } else { - // in second pass we allow a variance of 4 + // in second pass we allow a variance of 8 // we additionally scan the tiles +-skip pixels around the best tile from pass 2 // Means we scan (2 * skip + 1)^2 tiles in this step to get a better hit rate // fortunately the scan is quite fast, so we use only one core and don't parallelize From 51e08b82d2be6efca2db95f7c4a9320e02a01471 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 26 Sep 2019 20:44:08 +0200 Subject: [PATCH 060/208] Update AUTHORS.txt Added 'Javier Bartol', thanks a lot for the Capture sharpening tests and feedback :+1: --- AUTHORS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.txt b/AUTHORS.txt index 160869776..227390faa 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -39,6 +39,7 @@ Development contributors, in last name alphabetical order: Other contributors (profiles, ideas, mockups, testing, forum activity, translations, etc.), in last name alphabetical order: Marcin Bajor + Javier Bartol Thorsten Bartolomäus Patrik Brunner Fernando Carello From bd3c8a2066e525d0737c06098b69ecc55406cc99 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Mon, 30 Sep 2019 17:19:46 +0200 Subject: [PATCH 061/208] Nikon COOLPIX P1000 black level --- rtengine/camconst.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index 7f481e104..ae50369e5 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -1481,6 +1481,13 @@ Camera constants: } }, + { // Quality C + "make_model": "Nikon COOLPIX P1000", + "ranges": { + "black": 200 + } + }, + { // Quality B, no LENR samples "make_model": "Nikon D5", "dcraw_matrix": [ 9200,-3522,-992,-5755,13803,2117,-753,1486,6338 ], // adobe dng_v9.5 d65 From 9764d0e97250df24ce9fc489d013091d938d5996 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Tue, 1 Oct 2019 11:31:37 +0200 Subject: [PATCH 062/208] NIKON COOLPIX P1000 matrix, closes #5480 Also, no issue with magenta highlights, so bumping quality to B. --- rtengine/camconst.json | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index ae50369e5..128ba3e24 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -1481,11 +1481,10 @@ Camera constants: } }, - { // Quality C - "make_model": "Nikon COOLPIX P1000", - "ranges": { - "black": 200 - } + { // Quality B + "make_model": "NIKON COOLPIX P1000", + "dcraw_matrix": [ 14294, -6116, -1333, -1628, 10219, 1637, -14, 1158, 5022 ], // ColorMatrix2 from Adobe DNG Converter 11.4 + "ranges": { "black": 200 } }, { // Quality B, no LENR samples From 8789ef668a580bdc4394018262999e94d18b8962 Mon Sep 17 00:00:00 2001 From: Jala015 Date: Wed, 2 Oct 2019 15:52:09 -0300 Subject: [PATCH 063/208] Update Portugues (Brasil) --- rtdata/languages/Portugues (Brasil) | 40 ++++++++++++++--------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/rtdata/languages/Portugues (Brasil) b/rtdata/languages/Portugues (Brasil) index aef5fcde9..4779e343c 100644 --- a/rtdata/languages/Portugues (Brasil) +++ b/rtdata/languages/Portugues (Brasil) @@ -2249,42 +2249,42 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !!!!!!!!!!!!!!!!!!!!!!!!! !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords. -!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash? -!FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files? -!FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version? -!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. -!FILEBROWSER_POPUPREMOVE;Delete permanently -!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version -!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. +FILEBROWSER_DELETEDIALOG_ALL;Você tem certeza que quer deletas permanentemente todos os %1 arquivos na lixeira? +FILEBROWSER_DELETEDIALOG_SELECTED;Você tem certeza que quer deletar permanentemente os %1 arquivos selecionados? +FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Você tem certeza que quer deletar permanentemente os %1 arquivos selecionados, incluindo a versão processada em fila? +FILEBROWSER_EMPTYTRASHHINT;Deletar permanentemente todos os arquivos na lixeira. +FILEBROWSER_POPUPREMOVE;Deletar permanentemente +FILEBROWSER_POPUPREMOVEINCLPROC;Excluir permanentemente, incluindo a versão processada em fila +FILEBROWSER_SHOWNOTTRASHHINT;Mostrar apenas imagens que não estão no lixo. !HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset !HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power !HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative !HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values -!MAIN_FRAME_PLACES_DEL;Remove +MAIN_FRAME_PLACES_DEL;Remover !PARTIALPASTE_FILMNEGATIVE;Film Negative -!PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode +PREFERENCES_APPEARANCE_PSEUDOHIDPI;Modo pseudo-HiDPI !PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PROGRESSBAR_DECODING;Decoding... -!PROGRESSBAR_GREENEQUIL;Green equilibration... -!PROGRESSBAR_HLREC;Highlight reconstruction... +PROGRESSBAR_GREENEQUIL;Equilíbrio de verde... +PROGRESSBAR_HLREC;Reconstrução de realces... !PROGRESSBAR_HOTDEADPIXELFILTER;Hot/dead pixel filter... -!PROGRESSBAR_LINEDENOISE;Line noise filter... +PROGRESSBAR_LINEDENOISE;Filtro de ruído de linha... !PROGRESSBAR_RAWCACORR;Raw CA correction... -!QUEUE_LOCATION_TITLE;Output Location +QUEUE_LOCATION_TITLE;Local da Saída !TP_COLORTONING_LABREGION_OFFSET;Offset !TP_COLORTONING_LABREGION_POWER;Power !TP_CROP_PPI;PPI -!TP_FILMNEGATIVE_BLUE;Blue ratio +TP_FILMNEGATIVE_BLUE;Relação de azul !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) !TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. !TP_FILMNEGATIVE_LABEL;Film Negative -!TP_FILMNEGATIVE_PICK;Pick white and black spots -!TP_FILMNEGATIVE_RED;Red ratio -!TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected -!TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected +TP_FILMNEGATIVE_PICK;Escolher os pontos brancos e pretos +TP_FILMNEGATIVE_RED;Relação de vermelho +TP_LENSPROFILE_CORRECTION_AUTOMATCH;Selecionado automaticamente +TP_LENSPROFILE_CORRECTION_MANUAL;Selecionado manualmente !TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. -!TP_LENSPROFILE_MODE_HEADER;Lens Profile -!TP_LENSPROFILE_USE_GEOMETRIC;Geometric distortion +TP_LENSPROFILE_MODE_HEADER;Perfil da Lente +TP_LENSPROFILE_USE_GEOMETRIC;Distorção geométrica !TP_LENSPROFILE_USE_HEADER;Correct !TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, meaning that it often does not correct all chromatic aberration.\nTo correct the remaining chromatic aberration, you can use up to five iterations of automatic chromatic aberration correction.\nEach iteration will reduce the remaining chromatic aberration from the last iteration at the cost of additional processing time. !TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the checkbox is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the checkbox first (reasonable values depend on the image). From 9c36345a385b16cb6df386606d148c4ae6425b3d Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Thu, 3 Oct 2019 10:09:13 +0200 Subject: [PATCH 064/208] Capture Sharpening history entries --- rtdata/languages/default | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index c8c223a9a..968a8c0ed 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -765,13 +765,13 @@ HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius HISTORY_MSG_METADATA_MODE;Metadata copy mode HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold -HISTORY_MSG_PDSHARPEN_CONTRAST;CAS - Contrast threshold -HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CAS - Auto threshold -HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CAS - Auto radius -HISTORY_MSG_PDSHARPEN_GAMMA;CAS - Gamma -HISTORY_MSG_PDSHARPEN_ITERATIONS;CAS - Iterations -HISTORY_MSG_PDSHARPEN_RADIUS;CAS - Radius -HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CAS - Corner radius boost +HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold +HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold +HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma +HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations +HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius +HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter From 984696ed99c0aa8d45bd8f7656dd7e2bceedb268 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Thu, 3 Oct 2019 10:11:47 +0200 Subject: [PATCH 065/208] generateTranslationDiffs --- rtdata/languages/Catala | 14 +++++ rtdata/languages/Chinese (Simplified) | 14 +++++ rtdata/languages/Czech | 14 +++++ rtdata/languages/Deutsch | 18 +++++++ rtdata/languages/English (UK) | 14 +++++ rtdata/languages/English (US) | 14 +++++ rtdata/languages/Espanol | 14 +++++ rtdata/languages/Francais | 14 +++++ rtdata/languages/Italiano | 14 +++++ rtdata/languages/Japanese | 18 +++++++ rtdata/languages/Magyar | 14 +++++ rtdata/languages/Nederlands | 14 +++++ rtdata/languages/Polish | 14 +++++ rtdata/languages/Portugues | 14 +++++ rtdata/languages/Portugues (Brasil) | 54 ++++++++++++------- rtdata/languages/Russian | 14 +++++ rtdata/languages/Serbian (Cyrilic Characters) | 14 +++++ rtdata/languages/Swedish | 14 +++++ 18 files changed, 280 insertions(+), 20 deletions(-) diff --git a/rtdata/languages/Catala b/rtdata/languages/Catala index 407348417..e702cbe49 100644 --- a/rtdata/languages/Catala +++ b/rtdata/languages/Catala @@ -1293,6 +1293,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_494;Capture Sharpening !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction !HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -1310,6 +1311,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope !HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth !HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only !HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map !HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength !HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold @@ -1330,6 +1332,13 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold +!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold +!HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma +!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations +!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius +!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost !HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion !HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction !HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter @@ -1340,6 +1349,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma !HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength @@ -1786,6 +1796,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_CROP_SELECTCROP;Select !TP_DEHAZE_DEPTH;Depth !TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_LUMINANCE;Luminance only !TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map !TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones @@ -1935,6 +1946,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Roundness:\n0 = rectangle,\n50 = fitted ellipse,\n100 = circle. !TP_PCVIGNETTE_STRENGTH;Strength !TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filter strength in stops (reached in corners). +!TP_PDSHARPENING_LABEL;Capture Sharpening !TP_PFCURVE_CURVEEDITOR_CH;Hue !TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Controls defringe strength by color.\nHigher = more,\nLower = less. !TP_PREPROCESS_DEADPIXFILT;Dead pixel filter @@ -2110,6 +2122,8 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_SAVEDIALOG_OK_TIP;Shortcut: Ctrl-Enter !TP_SHARPENING_BLUR;Blur radius !TP_SHARPENING_CONTRAST;Contrast threshold +!TP_SHARPENING_GAMMA;Gamma +!TP_SHARPENING_RADIUS_BOOST;Corner radius boost !TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SOFTLIGHT_LABEL;Soft Light !TP_SOFTLIGHT_STRENGTH;Strength diff --git a/rtdata/languages/Chinese (Simplified) b/rtdata/languages/Chinese (Simplified) index b93aed7af..387d8fb85 100644 --- a/rtdata/languages/Chinese (Simplified) +++ b/rtdata/languages/Chinese (Simplified) @@ -1340,6 +1340,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_494;Capture Sharpening !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction !HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -1357,6 +1358,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope !HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth !HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only !HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map !HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength !HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold @@ -1377,6 +1379,13 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold +!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold +!HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma +!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations +!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius +!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost !HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion !HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction !HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter @@ -1387,6 +1396,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma !HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength @@ -1732,6 +1742,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_DEFRINGE_THRESHOLD;Threshold !TP_DEHAZE_DEPTH;Depth !TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_LUMINANCE;Luminance only !TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map !TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones @@ -1896,6 +1907,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_NEUTRAL_TIP;Resets exposure sliders to neutral values.\nApplies to the same controls that Auto Levels applies to, regardless of whether you used Auto Levels or not. !TP_PCVIGNETTE_FEATHER_TOOLTIP;Feathering:\n0 = corners only,\n50 = halfway to center,\n100 = to center. !TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Roundness:\n0 = rectangle,\n50 = fitted ellipse,\n100 = circle. +!TP_PDSHARPENING_LABEL;Capture Sharpening !TP_PFCURVE_CURVEEDITOR_CH;Hue !TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Controls defringe strength by color.\nHigher = more,\nLower = less. !TP_PREPROCESS_DEADPIXFILT;Dead pixel filter @@ -2078,6 +2090,8 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_RETINEX_VIEW_UNSHARP;Unsharp mask !TP_SHARPENING_BLUR;Blur radius !TP_SHARPENING_CONTRAST;Contrast threshold +!TP_SHARPENING_GAMMA;Gamma +!TP_SHARPENING_RADIUS_BOOST;Corner radius boost !TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SHARPENMICRO_LABEL;Microcontrast !TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 diff --git a/rtdata/languages/Czech b/rtdata/languages/Czech index d0b4d89f3..5c807b61d 100644 --- a/rtdata/languages/Czech +++ b/rtdata/languages/Czech @@ -2323,13 +2323,27 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !FILEBROWSER_POPUPREMOVE;Delete permanently !FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version !FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. +!HISTORY_MSG_494;Capture Sharpening +!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only !HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative !HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values +!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold +!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold +!HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma +!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations +!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius +!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost +!HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma !PARTIALPASTE_FILMNEGATIVE;Film Negative !PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode +!TP_DEHAZE_LUMINANCE;Luminance only !TP_FILMNEGATIVE_BLUE;Blue ratio !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) !TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. !TP_FILMNEGATIVE_LABEL;Film Negative !TP_FILMNEGATIVE_PICK;Pick white and black spots !TP_FILMNEGATIVE_RED;Red ratio +!TP_PDSHARPENING_LABEL;Capture Sharpening +!TP_SHARPENING_GAMMA;Gamma +!TP_SHARPENING_RADIUS_BOOST;Corner radius boost diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index 57236e1e6..bd98c63b2 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -2371,3 +2371,21 @@ ZOOMPANEL_ZOOMFITSCREEN;An Bildschirm anpassen.\nTaste: Alt + f ZOOMPANEL_ZOOMIN;Hineinzoomen\nTaste: + ZOOMPANEL_ZOOMOUT;Herauszoomen\nTaste: - +!!!!!!!!!!!!!!!!!!!!!!!!! +! Untranslated keys follow; remove the ! prefix after an entry is translated. +!!!!!!!!!!!!!!!!!!!!!!!!! + +!HISTORY_MSG_494;Capture Sharpening +!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only +!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold +!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold +!HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma +!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations +!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius +!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost +!HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma +!TP_DEHAZE_LUMINANCE;Luminance only +!TP_PDSHARPENING_LABEL;Capture Sharpening +!TP_SHARPENING_GAMMA;Gamma +!TP_SHARPENING_RADIUS_BOOST;Corner radius boost diff --git a/rtdata/languages/English (UK) b/rtdata/languages/English (UK) index c6b521c12..a36a3d1a9 100644 --- a/rtdata/languages/English (UK) +++ b/rtdata/languages/English (UK) @@ -820,6 +820,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_494;Capture Sharpening !HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel !HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask !HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask @@ -834,6 +835,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope !HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth !HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only !HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map !HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength !HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold @@ -854,6 +856,13 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold +!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold +!HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma +!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations +!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius +!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost !HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion !HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction !HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter @@ -863,6 +872,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength !HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor @@ -1568,6 +1578,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_DEFRINGE_THRESHOLD;Threshold !TP_DEHAZE_DEPTH;Depth !TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_LUMINANCE;Luminance only !TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map !TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones @@ -1808,6 +1819,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Roundness:\n0 = rectangle,\n50 = fitted ellipse,\n100 = circle. !TP_PCVIGNETTE_STRENGTH;Strength !TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filter strength in stops (reached in corners). +!TP_PDSHARPENING_LABEL;Capture Sharpening !TP_PERSPECTIVE_HORIZONTAL;Horizontal !TP_PERSPECTIVE_LABEL;Perspective !TP_PERSPECTIVE_VERTICAL;Vertical @@ -2031,12 +2043,14 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_SHARPENING_CONTRAST;Contrast threshold !TP_SHARPENING_EDRADIUS;Radius !TP_SHARPENING_EDTOLERANCE;Edge tolerance +!TP_SHARPENING_GAMMA;Gamma !TP_SHARPENING_HALOCONTROL;Halo control !TP_SHARPENING_HCAMOUNT;Amount !TP_SHARPENING_LABEL;Sharpening !TP_SHARPENING_METHOD;Method !TP_SHARPENING_ONLYEDGES;Sharpen only edges !TP_SHARPENING_RADIUS;Radius +!TP_SHARPENING_RADIUS_BOOST;Corner radius boost !TP_SHARPENING_RLD;RL Deconvolution !TP_SHARPENING_RLD_AMOUNT;Amount !TP_SHARPENING_RLD_DAMPING;Damping diff --git a/rtdata/languages/English (US) b/rtdata/languages/English (US) index 9b8eda038..aa5239911 100644 --- a/rtdata/languages/English (US) +++ b/rtdata/languages/English (US) @@ -727,6 +727,7 @@ !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_494;Capture Sharpening !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction !HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -744,6 +745,7 @@ !HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope !HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth !HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only !HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map !HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength !HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold @@ -764,6 +766,13 @@ !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold +!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold +!HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma +!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations +!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius +!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost !HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion !HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction !HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter @@ -774,6 +783,7 @@ !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma !HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength @@ -1531,6 +1541,7 @@ !TP_DEFRINGE_THRESHOLD;Threshold !TP_DEHAZE_DEPTH;Depth !TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_LUMINANCE;Luminance only !TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map !TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones @@ -1793,6 +1804,7 @@ !TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Roundness:\n0 = rectangle,\n50 = fitted ellipse,\n100 = circle. !TP_PCVIGNETTE_STRENGTH;Strength !TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filter strength in stops (reached in corners). +!TP_PDSHARPENING_LABEL;Capture Sharpening !TP_PERSPECTIVE_HORIZONTAL;Horizontal !TP_PERSPECTIVE_LABEL;Perspective !TP_PERSPECTIVE_VERTICAL;Vertical @@ -2021,12 +2033,14 @@ !TP_SHARPENING_CONTRAST;Contrast threshold !TP_SHARPENING_EDRADIUS;Radius !TP_SHARPENING_EDTOLERANCE;Edge tolerance +!TP_SHARPENING_GAMMA;Gamma !TP_SHARPENING_HALOCONTROL;Halo control !TP_SHARPENING_HCAMOUNT;Amount !TP_SHARPENING_LABEL;Sharpening !TP_SHARPENING_METHOD;Method !TP_SHARPENING_ONLYEDGES;Sharpen only edges !TP_SHARPENING_RADIUS;Radius +!TP_SHARPENING_RADIUS_BOOST;Corner radius boost !TP_SHARPENING_RLD;RL Deconvolution !TP_SHARPENING_RLD_AMOUNT;Amount !TP_SHARPENING_RLD_DAMPING;Damping diff --git a/rtdata/languages/Espanol b/rtdata/languages/Espanol index 1e3b84371..27aa39c12 100644 --- a/rtdata/languages/Espanol +++ b/rtdata/languages/Espanol @@ -2321,9 +2321,19 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !FILEBROWSER_POPUPREMOVE;Delete permanently !FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version !FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. +!HISTORY_MSG_494;Capture Sharpening +!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only !HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative !HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values +!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold +!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold +!HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma +!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations +!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius +!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost !HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius +!HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma !MAIN_FRAME_PLACES_DEL;Remove !MAIN_TAB_FAVORITES;Favorites !MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u @@ -2345,6 +2355,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !PROGRESSBAR_RAWCACORR;Raw CA correction... !QUEUE_LOCATION_TITLE;Output Location !TP_CROP_PPI;PPI +!TP_DEHAZE_LUMINANCE;Luminance only !TP_FILMNEGATIVE_BLUE;Blue ratio !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) !TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. @@ -2356,7 +2367,10 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !TP_LENSPROFILE_MODE_HEADER;Lens Profile !TP_LENSPROFILE_USE_GEOMETRIC;Geometric distortion !TP_LENSPROFILE_USE_HEADER;Correct +!TP_PDSHARPENING_LABEL;Capture Sharpening !TP_RAW_IMAGENUM_SN;SN mode !TP_RAW_XTRANS;X-Trans !TP_RAW_XTRANSFAST;Fast X-Trans !TP_SHARPENING_BLUR;Blur radius +!TP_SHARPENING_GAMMA;Gamma +!TP_SHARPENING_RADIUS_BOOST;Corner radius boost diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index 082cff1f1..9f9485c70 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -2266,8 +2266,18 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !FILEBROWSER_POPUPREMOVE;Delete permanently !FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version !FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. +!HISTORY_MSG_494;Capture Sharpening +!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only !HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative !HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values +!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold +!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold +!HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma +!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations +!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius +!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost +!HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma !MAIN_FRAME_PLACES_DEL;Remove !PARTIALPASTE_FILMNEGATIVE;Film Negative !PROGRESSBAR_DECODING;Decoding... @@ -2278,6 +2288,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !PROGRESSBAR_RAWCACORR;Raw CA correction... !QUEUE_LOCATION_TITLE;Output Location !TP_CROP_PPI;PPI +!TP_DEHAZE_LUMINANCE;Luminance only !TP_FILMNEGATIVE_BLUE;Blue ratio !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) !TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. @@ -2289,5 +2300,8 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !TP_LENSPROFILE_MODE_HEADER;Lens Profile !TP_LENSPROFILE_USE_GEOMETRIC;Geometric distortion !TP_LENSPROFILE_USE_HEADER;Correct +!TP_PDSHARPENING_LABEL;Capture Sharpening !TP_RAW_XTRANS;X-Trans !TP_RAW_XTRANSFAST;Fast X-Trans +!TP_SHARPENING_GAMMA;Gamma +!TP_SHARPENING_RADIUS_BOOST;Corner radius boost diff --git a/rtdata/languages/Italiano b/rtdata/languages/Italiano index f11423d7a..7ba18b2d8 100644 --- a/rtdata/languages/Italiano +++ b/rtdata/languages/Italiano @@ -1518,6 +1518,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_494;Capture Sharpening !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction !HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -1535,6 +1536,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope !HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth !HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only !HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map !HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength !HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold @@ -1555,6 +1557,13 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold +!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold +!HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma +!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations +!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius +!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost !HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion !HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction !HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter @@ -1565,6 +1574,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma !HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength @@ -1852,6 +1862,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_CROP_SELECTCROP;Select !TP_DEHAZE_DEPTH;Depth !TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_LUMINANCE;Luminance only !TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map !TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones @@ -1954,6 +1965,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_METADATA_STRIP;Strip all metadata !TP_METADATA_TUNNEL;Copy unchanged !TP_NEUTRAL;Reset +!TP_PDSHARPENING_LABEL;Capture Sharpening !TP_PREPROCESS_DEADPIXFILT;Dead pixel filter !TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tries to suppress dead pixels. !TP_PREPROCESS_HOTPIXFILT;Hot pixel filter @@ -2119,6 +2131,8 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_RETINEX_VIEW_UNSHARP;Unsharp mask !TP_SHARPENING_BLUR;Blur radius !TP_SHARPENING_CONTRAST;Contrast threshold +!TP_SHARPENING_GAMMA;Gamma +!TP_SHARPENING_RADIUS_BOOST;Corner radius boost !TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SOFTLIGHT_LABEL;Soft Light !TP_SOFTLIGHT_STRENGTH;Strength diff --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese index 16dafb297..83b8caa30 100644 --- a/rtdata/languages/Japanese +++ b/rtdata/languages/Japanese @@ -2319,3 +2319,21 @@ ZOOMPANEL_ZOOMFITSCREEN;画像全体を画面に合わせる\nショートカッ ZOOMPANEL_ZOOMIN;ズームイン\nショートカット: + ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: - +!!!!!!!!!!!!!!!!!!!!!!!!! +! Untranslated keys follow; remove the ! prefix after an entry is translated. +!!!!!!!!!!!!!!!!!!!!!!!!! + +!HISTORY_MSG_494;Capture Sharpening +!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only +!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold +!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold +!HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma +!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations +!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius +!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost +!HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma +!TP_DEHAZE_LUMINANCE;Luminance only +!TP_PDSHARPENING_LABEL;Capture Sharpening +!TP_SHARPENING_GAMMA;Gamma +!TP_SHARPENING_RADIUS_BOOST;Corner radius boost diff --git a/rtdata/languages/Magyar b/rtdata/languages/Magyar index 5879bf130..11c48c3d9 100644 --- a/rtdata/languages/Magyar +++ b/rtdata/languages/Magyar @@ -1227,6 +1227,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_494;Capture Sharpening !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction !HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -1244,6 +1245,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope !HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth !HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only !HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map !HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength !HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold @@ -1264,6 +1266,13 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold +!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold +!HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma +!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations +!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius +!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost !HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion !HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction !HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter @@ -1274,6 +1283,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma !HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength @@ -1741,6 +1751,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_CROP_SELECTCROP;Select !TP_DEHAZE_DEPTH;Depth !TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_LUMINANCE;Luminance only !TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map !TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones @@ -1928,6 +1939,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Roundness:\n0 = rectangle,\n50 = fitted ellipse,\n100 = circle. !TP_PCVIGNETTE_STRENGTH;Strength !TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filter strength in stops (reached in corners). +!TP_PDSHARPENING_LABEL;Capture Sharpening !TP_PFCURVE_CURVEEDITOR_CH;Hue !TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Controls defringe strength by color.\nHigher = more,\nLower = less. !TP_PREPROCESS_DEADPIXFILT;Dead pixel filter @@ -2103,6 +2115,8 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_SAVEDIALOG_OK_TIP;Shortcut: Ctrl-Enter !TP_SHARPENING_BLUR;Blur radius !TP_SHARPENING_CONTRAST;Contrast threshold +!TP_SHARPENING_GAMMA;Gamma +!TP_SHARPENING_RADIUS_BOOST;Corner radius boost !TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SOFTLIGHT_LABEL;Soft Light !TP_SOFTLIGHT_STRENGTH;Strength diff --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands index d39173a52..5e2c92742 100644 --- a/rtdata/languages/Nederlands +++ b/rtdata/languages/Nederlands @@ -2015,6 +2015,7 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_494;Capture Sharpening !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction !HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -2032,6 +2033,7 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope !HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth !HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only !HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map !HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength !HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold @@ -2052,6 +2054,13 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold +!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold +!HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma +!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations +!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius +!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost !HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion !HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction !HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter @@ -2062,6 +2071,7 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma !HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength @@ -2226,6 +2236,7 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !TP_CROP_SELECTCROP;Select !TP_DEHAZE_DEPTH;Depth !TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_LUMINANCE;Luminance only !TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map !TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. @@ -2263,6 +2274,7 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !TP_METADATA_MODE;Metadata copy mode !TP_METADATA_STRIP;Strip all metadata !TP_METADATA_TUNNEL;Copy unchanged +!TP_PDSHARPENING_LABEL;Capture Sharpening !TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction !TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both !TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal @@ -2300,6 +2312,8 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !TP_RETINEX_MAP;Method !TP_SHARPENING_BLUR;Blur radius !TP_SHARPENING_CONTRAST;Contrast threshold +!TP_SHARPENING_GAMMA;Gamma +!TP_SHARPENING_RADIUS_BOOST;Corner radius boost !TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SOFTLIGHT_LABEL;Soft Light !TP_SOFTLIGHT_STRENGTH;Strength diff --git a/rtdata/languages/Polish b/rtdata/languages/Polish index a631353c3..2e8a4549f 100644 --- a/rtdata/languages/Polish +++ b/rtdata/languages/Polish @@ -1600,6 +1600,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_494;Capture Sharpening !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction !HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -1617,6 +1618,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope !HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth !HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only !HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map !HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength !HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold @@ -1637,6 +1639,13 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold +!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold +!HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma +!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations +!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius +!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost !HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion !HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction !HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter @@ -1647,6 +1656,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma !HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength @@ -1892,6 +1902,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_CROP_SELECTCROP;Select !TP_DEHAZE_DEPTH;Depth !TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_LUMINANCE;Luminance only !TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map !TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones @@ -1975,6 +1986,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_METADATA_STRIP;Strip all metadata !TP_METADATA_TUNNEL;Copy unchanged !TP_NEUTRAL;Reset +!TP_PDSHARPENING_LABEL;Capture Sharpening !TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction !TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both !TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal @@ -2125,6 +2137,8 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_RETINEX_VIEW_UNSHARP;Unsharp mask !TP_SHARPENING_BLUR;Blur radius !TP_SHARPENING_CONTRAST;Contrast threshold +!TP_SHARPENING_GAMMA;Gamma +!TP_SHARPENING_RADIUS_BOOST;Corner radius boost !TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SOFTLIGHT_LABEL;Soft Light !TP_SOFTLIGHT_STRENGTH;Strength diff --git a/rtdata/languages/Portugues b/rtdata/languages/Portugues index 766b14e0b..c4adbc7f9 100644 --- a/rtdata/languages/Portugues +++ b/rtdata/languages/Portugues @@ -2264,8 +2264,18 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !FILEBROWSER_POPUPREMOVE;Delete permanently !FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version !FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. +!HISTORY_MSG_494;Capture Sharpening +!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only !HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative !HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values +!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold +!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold +!HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma +!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations +!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius +!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost +!HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma !MAIN_FRAME_PLACES_DEL;Remove !PARTIALPASTE_FILMNEGATIVE;Film Negative !PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode @@ -2277,6 +2287,7 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !PROGRESSBAR_RAWCACORR;Raw CA correction... !QUEUE_LOCATION_TITLE;Output Location !TP_CROP_PPI;PPI +!TP_DEHAZE_LUMINANCE;Luminance only !TP_FILMNEGATIVE_BLUE;Blue ratio !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) !TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. @@ -2288,5 +2299,8 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !TP_LENSPROFILE_MODE_HEADER;Lens Profile !TP_LENSPROFILE_USE_GEOMETRIC;Geometric distortion !TP_LENSPROFILE_USE_HEADER;Correct +!TP_PDSHARPENING_LABEL;Capture Sharpening !TP_RAW_XTRANS;X-Trans !TP_RAW_XTRANSFAST;Fast X-Trans +!TP_SHARPENING_GAMMA;Gamma +!TP_SHARPENING_RADIUS_BOOST;Corner radius boost diff --git a/rtdata/languages/Portugues (Brasil) b/rtdata/languages/Portugues (Brasil) index 4779e343c..259cabb7e 100644 --- a/rtdata/languages/Portugues (Brasil) +++ b/rtdata/languages/Portugues (Brasil) @@ -119,8 +119,12 @@ FILEBROWSER_COLORLABEL_TOOLTIP;Etiqueta de cor.\n\nUse o menu suspenso ou atalho FILEBROWSER_COPYPROFILE;Copiar perfil FILEBROWSER_CURRENT_NAME;Nome atual: FILEBROWSER_DARKFRAME;Quadro escuro +FILEBROWSER_DELETEDIALOG_ALL;Você tem certeza que quer deletas permanentemente todos os %1 arquivos na lixeira? FILEBROWSER_DELETEDIALOG_HEADER;Confirmação de exclusão de arquivo +FILEBROWSER_DELETEDIALOG_SELECTED;Você tem certeza que quer deletar permanentemente os %1 arquivos selecionados? +FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Você tem certeza que quer deletar permanentemente os %1 arquivos selecionados, incluindo a versão processada em fila? FILEBROWSER_EMPTYTRASH;Esvaziar lixeira +FILEBROWSER_EMPTYTRASHHINT;Deletar permanentemente todos os arquivos na lixeira. FILEBROWSER_EXTPROGMENU;Abrir com FILEBROWSER_FLATFIELD;Flat-Field FILEBROWSER_MOVETODARKFDIR;Mover para o diretório de quadros escuros @@ -154,6 +158,8 @@ FILEBROWSER_POPUPRANK2;Classificação 2 ** FILEBROWSER_POPUPRANK3;Classificação 3 *** FILEBROWSER_POPUPRANK4;Classificação 4 **** FILEBROWSER_POPUPRANK5;Classificação 5 ***** +FILEBROWSER_POPUPREMOVE;Deletar permanentemente +FILEBROWSER_POPUPREMOVEINCLPROC;Excluir permanentemente, incluindo a versão processada em fila FILEBROWSER_POPUPRENAME;Renomear FILEBROWSER_POPUPSELECTALL;Selecionar tudo FILEBROWSER_POPUPTRASH;Mover para a lixeira @@ -180,6 +186,7 @@ FILEBROWSER_SHOWDIRHINT;Limpar todos os filtros.\nAtalho: d FILEBROWSER_SHOWEDITEDHINT;Mostrar imagens editadas.\nAtalho: 7 FILEBROWSER_SHOWEDITEDNOTHINT;Mostrar imagens não editadas.\nAtalho: 6 FILEBROWSER_SHOWEXIFINFO;Mostrar informações Exif.\n\nAtalhos:\ni - Modo de Guias de Editores Múltiplos,\nAlt-i - Modo de Guia de Editor Único. +FILEBROWSER_SHOWNOTTRASHHINT;Mostrar apenas imagens que não estão no lixo. FILEBROWSER_SHOWORIGINALHINT;Mostre somente imagens originais.\n\nQuando existem várias imagens com o mesmo nome de arquivo, mas extensões diferentes, a única considerada original é aquela cuja extensão está mais próxima da parte superior da lista de extensões analisadas em Preferências > Navegador de Arquivos > Extensões Analisadas. FILEBROWSER_SHOWRANK1HINT;Mostrar imagens classificadas com 1 estrela.\nAtalho: 1 FILEBROWSER_SHOWRANK2HINT;Mostrar imagens classificadas com 2 estrelas.\nAtalho: 2 @@ -870,6 +877,7 @@ MAIN_FRAME_FILEBROWSER;Navegador de Arquivos MAIN_FRAME_FILEBROWSER_TOOLTIP;Navegador de arquivos.\nAtalho: Ctrl-F2 MAIN_FRAME_PLACES;Locais MAIN_FRAME_PLACES_ADD;Adicionar +MAIN_FRAME_PLACES_DEL;Remover MAIN_FRAME_QUEUE;Fila MAIN_FRAME_QUEUE_TOOLTIP;Processando fila.\nAtalho: Ctrl-F3 MAIN_FRAME_RECENT;Pastas Recentes @@ -1029,6 +1037,7 @@ PREFERENCES_APPEARANCE_COLORPICKERFONT;Fonte do seletor de cor PREFERENCES_APPEARANCE_CROPMASKCOLOR;Cor da máscara de corte PREFERENCES_APPEARANCE_MAINFONT;Fonte principal PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Cor do guia do navegador +PREFERENCES_APPEARANCE_PSEUDOHIDPI;Modo pseudo-HiDPI PREFERENCES_APPEARANCE_THEME;Tema PREFERENCES_APPLNEXTSTARTUP;é necessário reiniciar PREFERENCES_AUTOMONPROFILE;Usar o perfil de cores do monitor principal do sistema operacional @@ -1215,6 +1224,9 @@ PROFILEPANEL_TOOLTIPCOPY;Copie o perfil de processamento atual para a área de t PROFILEPANEL_TOOLTIPLOAD;Carregue um perfil do arquivo.\nCtrl-click para selecionar os parâmetros a serem carregados. PROFILEPANEL_TOOLTIPPASTE;Cole o perfil da área de transferência.\nCtrl-click para selecionar os parâmetros a serem colados. PROFILEPANEL_TOOLTIPSAVE;Salvar o perfil atual.\nCtrl-click para selecionar os parâmetros a serem salvos. +PROGRESSBAR_GREENEQUIL;Equilíbrio de verde... +PROGRESSBAR_HLREC;Reconstrução de realces... +PROGRESSBAR_LINEDENOISE;Filtro de ruído de linha... PROGRESSBAR_LOADING;Carregando imagem... PROGRESSBAR_LOADINGTHUMBS;Carregando miniaturas... PROGRESSBAR_LOADJPEG;Carregando arquivo JPEG... @@ -1241,6 +1253,7 @@ QUEUE_FORMAT_TITLE;Formato de arquivo QUEUE_LOCATION_FOLDER;Salvar na pasta QUEUE_LOCATION_TEMPLATE;Use modelo QUEUE_LOCATION_TEMPLATE_TOOLTIP;Podes usar as seguintes sequências de formatação:\n%f, %d1, %d2, ..., %p1, %p2, ..., %r, %s1, %s2, ...\n\nEssas cadeias de formatação referem-se às diferentes partes do endereço do nome da foto, alguns atributos da foto ou um índice de sequência arbitrário no processamento em lote.\n\nPor exemplo, se a foto que está sendo processada tiver o seguinte endereço do nome:\n/inicio/rodrigo/fotos/2010-10-31/dsc0042.nef\no significado das cadeias de formatação são:\n%d4 = inicio\n%d3 = rodrigo\n%d2 = fotos\n%d1 = 2010-10-31\n%f = dsc0042\n%p1 = /inicio/rodrigo/fotos/2010-10-31/\n%p2 = /inicio/rodrigo/fotos/\n%p3 = /inicio/rodrigo/\n%p4 = /inicio/\n\n%r será substituído pela classificação da foto. Se a foto não tiver classificação, %r será substituído por '0'. Se a foto estiver na lixeira, %r será substituído por 'x'.\n\n%s1, %s2, etc. será substituído por um índice de sequência que é preenchido entre 1 e 9 dígitos. O índice de sequência iniciará em 1 sempre que o processamento da fila for iniciado e será incrementado em 1 para cada imagem processada.\n\nSe quiseres salvar a imagem de saída no local onde se encontra a original, escreva:\n%p1/%f\n\nSe quiseres salvar a imagem de saída num diretório chamado "convertido" localizado no diretório da imagem aberta, escreva:\n%p1/convertido/%f\n\nSe quiseres salvar a imagem de saída num diretório chamado\n"/inicio/rodrigo/fotos/convertido/2010-10-31", escreva:\n%p2/convertido/%d1/%f +QUEUE_LOCATION_TITLE;Local da Saída QUEUE_STARTSTOP_TOOLTIP;Inicia ou para o processamento das imagens na fila.\n\nAtalho: Ctrl+s SAMPLEFORMAT_0;Formato de dados desconhecido SAMPLEFORMAT_1;8 bits sem assinatura @@ -1612,6 +1625,9 @@ TP_EXPOSURE_TCMODE_STANDARD;Padrão TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Padrão Ponderado TP_EXPOS_BLACKPOINT_LABEL;Pontos Pretos Raw TP_EXPOS_WHITEPOINT_LABEL;Pontos Brancos Raw +TP_FILMNEGATIVE_BLUE;Relação de azul +TP_FILMNEGATIVE_PICK;Escolher os pontos brancos e pretos +TP_FILMNEGATIVE_RED;Relação de vermelho TP_FILMSIMULATION_LABEL;Simulação de Filme TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee está configurado para procurar por imagens Hald CLUT, que são usadas para a ferramenta Simulação de Filme, numa pasta que está demorando para carregar.\nVá para Preferências > Processamento de Imagem > Simulação de Filme\npara ver qual pasta está sendo usada. Deves apontar RawTherapee para uma pasta que contenha apenas imagens Hald CLUT e nada mais, ou para uma pasta vazia, se não quiseres usar a ferramenta Simulação de Filme.\n\nLeia o artigo sobre Simulação de Filme na RawPedia para mais informações.\n\nDesejas cancelar a verificação agora? TP_FILMSIMULATION_STRENGTH;Intensidade @@ -1732,9 +1748,13 @@ TP_LABCURVE_RSTPRO_TOOLTIP;Funciona no controle deslizante de cromaticidade e na TP_LENSGEOM_AUTOCROP;Corte automático TP_LENSGEOM_FILL;Preenchimento automático TP_LENSGEOM_LABEL;Lente / Geometria +TP_LENSPROFILE_CORRECTION_AUTOMATCH;Selecionado automaticamente TP_LENSPROFILE_CORRECTION_LCPFILE;Ficheiro LCP +TP_LENSPROFILE_CORRECTION_MANUAL;Selecionado manualmente TP_LENSPROFILE_LABEL;Correção de lente perfilada +TP_LENSPROFILE_MODE_HEADER;Perfil da Lente TP_LENSPROFILE_USE_CA;Aberração cromática +TP_LENSPROFILE_USE_GEOMETRIC;Distorção geométrica TP_LENSPROFILE_USE_VIGNETTING;Vinhetagem TP_LOCALCONTRAST_AMOUNT;Montante TP_LOCALCONTRAST_DARKNESS;Nível de escuridão @@ -2249,45 +2269,39 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !!!!!!!!!!!!!!!!!!!!!!!!! !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords. -FILEBROWSER_DELETEDIALOG_ALL;Você tem certeza que quer deletas permanentemente todos os %1 arquivos na lixeira? -FILEBROWSER_DELETEDIALOG_SELECTED;Você tem certeza que quer deletar permanentemente os %1 arquivos selecionados? -FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Você tem certeza que quer deletar permanentemente os %1 arquivos selecionados, incluindo a versão processada em fila? -FILEBROWSER_EMPTYTRASHHINT;Deletar permanentemente todos os arquivos na lixeira. -FILEBROWSER_POPUPREMOVE;Deletar permanentemente -FILEBROWSER_POPUPREMOVEINCLPROC;Excluir permanentemente, incluindo a versão processada em fila -FILEBROWSER_SHOWNOTTRASHHINT;Mostrar apenas imagens que não estão no lixo. +!HISTORY_MSG_494;Capture Sharpening !HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset !HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power +!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only !HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative !HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values -MAIN_FRAME_PLACES_DEL;Remover +!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold +!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold +!HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma +!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations +!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius +!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost +!HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma !PARTIALPASTE_FILMNEGATIVE;Film Negative -PREFERENCES_APPEARANCE_PSEUDOHIDPI;Modo pseudo-HiDPI !PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PROGRESSBAR_DECODING;Decoding... -PROGRESSBAR_GREENEQUIL;Equilíbrio de verde... -PROGRESSBAR_HLREC;Reconstrução de realces... !PROGRESSBAR_HOTDEADPIXELFILTER;Hot/dead pixel filter... -PROGRESSBAR_LINEDENOISE;Filtro de ruído de linha... !PROGRESSBAR_RAWCACORR;Raw CA correction... -QUEUE_LOCATION_TITLE;Local da Saída !TP_COLORTONING_LABREGION_OFFSET;Offset !TP_COLORTONING_LABREGION_POWER;Power !TP_CROP_PPI;PPI -TP_FILMNEGATIVE_BLUE;Relação de azul +!TP_DEHAZE_LUMINANCE;Luminance only !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) !TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. !TP_FILMNEGATIVE_LABEL;Film Negative -TP_FILMNEGATIVE_PICK;Escolher os pontos brancos e pretos -TP_FILMNEGATIVE_RED;Relação de vermelho -TP_LENSPROFILE_CORRECTION_AUTOMATCH;Selecionado automaticamente -TP_LENSPROFILE_CORRECTION_MANUAL;Selecionado manualmente !TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. -TP_LENSPROFILE_MODE_HEADER;Perfil da Lente -TP_LENSPROFILE_USE_GEOMETRIC;Distorção geométrica !TP_LENSPROFILE_USE_HEADER;Correct +!TP_PDSHARPENING_LABEL;Capture Sharpening !TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, meaning that it often does not correct all chromatic aberration.\nTo correct the remaining chromatic aberration, you can use up to five iterations of automatic chromatic aberration correction.\nEach iteration will reduce the remaining chromatic aberration from the last iteration at the cost of additional processing time. !TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the checkbox is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the checkbox first (reasonable values depend on the image). !TP_RAW_XTRANS;X-Trans !TP_RAW_XTRANSFAST;Fast X-Trans !TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. +!TP_SHARPENING_GAMMA;Gamma +!TP_SHARPENING_RADIUS_BOOST;Corner radius boost diff --git a/rtdata/languages/Russian b/rtdata/languages/Russian index 79c6bebfc..2014f9aad 100644 --- a/rtdata/languages/Russian +++ b/rtdata/languages/Russian @@ -1690,6 +1690,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !HISTORY_MSG_483;CAM02 - Yb scene !HISTORY_MSG_484;CAM02 - Auto Yb scene !HISTORY_MSG_489;DRC - Detail +!HISTORY_MSG_494;Capture Sharpening !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction !HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction !HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel @@ -1704,6 +1705,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation !HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask !HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope +!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only !HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold !HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold !HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative @@ -1715,6 +1717,13 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope !HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold +!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold +!HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma +!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations +!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius +!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost !HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion !HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction !HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter @@ -1725,6 +1734,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma !HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !ICCPROFCREATOR_COPYRIGHT;Copyright: !ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" @@ -1947,6 +1957,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !TP_COLORTONING_TWOCOLOR_TOOLTIP;Standard chroma:\nLinear response, a* = b*.\n\nSpecial chroma:\nLinear response, a* = b*, but unbound - try under the diagonal.\n\nSpecial a* and b*:\nLinear response unbound with separate curves for a* and b*. Intended for special effects.\n\nSpecial chroma 2 colors:\nMore predictable. !TP_COLORTONING_TWOSTD;Standard chroma !TP_CROP_PPI;PPI +!TP_DEHAZE_LUMINANCE;Luminance only !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones !TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. !TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. @@ -2008,6 +2019,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !TP_LENSPROFILE_MODE_HEADER;Lens Profile !TP_LENSPROFILE_USE_GEOMETRIC;Geometric distortion !TP_LENSPROFILE_USE_HEADER;Correct +!TP_PDSHARPENING_LABEL;Capture Sharpening !TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction !TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both !TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal @@ -2135,6 +2147,8 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !TP_RETINEX_VIEW_TRAN2;Transmission - Fixed !TP_RETINEX_VIEW_UNSHARP;Unsharp mask !TP_SHARPENING_BLUR;Blur radius +!TP_SHARPENING_GAMMA;Gamma +!TP_SHARPENING_RADIUS_BOOST;Corner radius boost !TP_WAVELET_1;Level 1 !TP_WAVELET_2;Level 2 !TP_WAVELET_3;Level 3 diff --git a/rtdata/languages/Serbian (Cyrilic Characters) b/rtdata/languages/Serbian (Cyrilic Characters) index 2b98cfe2a..0e940be55 100644 --- a/rtdata/languages/Serbian (Cyrilic Characters) +++ b/rtdata/languages/Serbian (Cyrilic Characters) @@ -1493,6 +1493,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_494;Capture Sharpening !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction !HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -1510,6 +1511,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope !HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth !HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only !HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map !HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength !HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold @@ -1530,6 +1532,13 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold +!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold +!HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma +!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations +!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius +!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost !HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion !HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction !HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter @@ -1540,6 +1549,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma !HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength @@ -1843,6 +1853,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_CROP_SELECTCROP;Select !TP_DEHAZE_DEPTH;Depth !TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_LUMINANCE;Luminance only !TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map !TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones @@ -1954,6 +1965,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_METADATA_MODE;Metadata copy mode !TP_METADATA_STRIP;Strip all metadata !TP_METADATA_TUNNEL;Copy unchanged +!TP_PDSHARPENING_LABEL;Capture Sharpening !TP_PREPROCESS_DEADPIXFILT;Dead pixel filter !TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tries to suppress dead pixels. !TP_PREPROCESS_HOTPIXFILT;Hot pixel filter @@ -2119,6 +2131,8 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_RETINEX_VIEW_UNSHARP;Unsharp mask !TP_SHARPENING_BLUR;Blur radius !TP_SHARPENING_CONTRAST;Contrast threshold +!TP_SHARPENING_GAMMA;Gamma +!TP_SHARPENING_RADIUS_BOOST;Corner radius boost !TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SOFTLIGHT_LABEL;Soft Light !TP_SOFTLIGHT_STRENGTH;Strength diff --git a/rtdata/languages/Swedish b/rtdata/languages/Swedish index 220339a45..fbc55624d 100644 --- a/rtdata/languages/Swedish +++ b/rtdata/languages/Swedish @@ -1842,6 +1842,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_494;Capture Sharpening !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction !HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -1859,6 +1860,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope !HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth !HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only !HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map !HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength !HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold @@ -1879,6 +1881,13 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold +!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold +!HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma +!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations +!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius +!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost !HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion !HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction !HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter @@ -1889,6 +1898,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma !HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength @@ -2100,6 +2110,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_CROP_SELECTCROP;Select !TP_DEHAZE_DEPTH;Depth !TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_LUMINANCE;Luminance only !TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map !TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones @@ -2157,6 +2168,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_METADATA_MODE;Metadata copy mode !TP_METADATA_STRIP;Strip all metadata !TP_METADATA_TUNNEL;Copy unchanged +!TP_PDSHARPENING_LABEL;Capture Sharpening !TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction !TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both !TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal @@ -2246,6 +2258,8 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_RETINEX_VIEW_METHOD_TOOLTIP;Standard - Normal display.\nMask - Displays the mask.\nUnsharp mask - Displays the image with a high radius unsharp mask.\nTransmission - Auto/Fixed - Displays the file transmission-map, before any action on contrast and brightness.\n\nAttention: the mask does not correspond to reality, but is amplified to make it more visible. !TP_SHARPENING_BLUR;Blur radius !TP_SHARPENING_CONTRAST;Contrast threshold +!TP_SHARPENING_GAMMA;Gamma +!TP_SHARPENING_RADIUS_BOOST;Corner radius boost !TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SOFTLIGHT_LABEL;Soft Light !TP_SOFTLIGHT_STRENGTH;Strength From 0b2b3dc974a0e63e4514c45e371fe8383f932448 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Thu, 3 Oct 2019 10:37:35 +0200 Subject: [PATCH 066/208] Force static privately used subdir libraries (closes #5481) --- rtengine/CMakeLists.txt | 57 +++++++++++++++++++++-------------------- rtexif/CMakeLists.txt | 14 +++++++++- 2 files changed, 42 insertions(+), 29 deletions(-) diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt index f52cfa256..8ee905e2c 100644 --- a/rtengine/CMakeLists.txt +++ b/rtengine/CMakeLists.txt @@ -11,7 +11,7 @@ include_directories(${EXTRA_INCDIR} ${LCMS_INCLUDE_DIRS} ${LENSFUN_INCLUDE_DIRS} ${RSVG_INCLUDE_DIRS} - ) +) link_directories("${PROJECT_SOURCE_DIR}/rtexif" ${EXPAT_LIBRARY_DIRS} @@ -25,25 +25,22 @@ link_directories("${PROJECT_SOURCE_DIR}/rtexif" ${LCMS_LIBRARY_DIRS} ${LENSFUN_LIBRARY_DIRS} ${RSVG_LIBRARY_DIRS} - ) +) set(CAMCONSTSFILE "camconst.json") set(RTENGINESOURCEFILES - badpixels.cc - CA_correct_RT.cc - capturesharpening.cc - EdgePreservingDecomposition.cc - FTblockDN.cc - PF_correct_RT.cc ahd_demosaic_RT.cc amaze_demosaic_RT.cc - cJSON.c + badpixels.cc + CA_correct_RT.cc calc_distort.cc camconst.cc + capturesharpening.cc cfa_linedn_RT.cc ciecam02.cc cieimage.cc + cJSON.c clutstore.cc color.cc colortemp.cc @@ -60,14 +57,19 @@ set(RTENGINESOURCEFILES dual_demosaic_RT.cc dynamicprofile.cc eahd_demosaic.cc + EdgePreservingDecomposition.cc fast_demo.cc ffmanager.cc filmnegativeproc.cc filmnegativethumb.cc flatcurves.cc + FTblockDN.cc + gamutwarning.cc gauss.cc green_equil_RT.cc + guidedfilter.cc hilite_recon.cc + histmatching.cc hphd_demosaic_RT.cc iccjpeg.cc iccstore.cc @@ -82,10 +84,15 @@ set(RTENGINESOURCEFILES improcfun.cc impulse_denoise.cc init.cc + ipdehaze.cc iplab2rgb.cc + iplabregions.cc + iplocalcontrast.cc ipresize.cc ipretinex.cc + ipshadowshighlights.cc ipsharpen.cc + ipsoftlight.cc iptransform.cc ipvibrance.cc ipwavelet.cc @@ -93,8 +100,8 @@ set(RTENGINESOURCEFILES jpeg_ijg/jpeg_memsrc.cc klt/convolve.cc klt/error.cc - klt/klt.cc klt/klt_util.cc + klt/klt.cc klt/pnmio.cc klt/pyramid.cc klt/selectGoodFeatures.cc @@ -103,8 +110,11 @@ set(RTENGINESOURCEFILES klt/writeFeatures.cc labimage.cc lcp.cc + lj92.c loadinitial.cc myfile.cc + pdaflinesfilter.cc + PF_correct_RT.cc pipettebuffer.cc pixelshift.cc previewimage.cc @@ -116,27 +126,17 @@ set(RTENGINESOURCEFILES rcd_demosaic.cc refreshmap.cc rt_algo.cc + rtlensfun.cc rtthumbnail.cc shmap.cc simpleprocess.cc slicer.cc stdimagesource.cc - utils.cc - rtlensfun.cc tmo_fattal02.cc - iplocalcontrast.cc - histmatching.cc - pdaflinesfilter.cc - gamutwarning.cc - ipshadowshighlights.cc - xtrans_demosaic.cc + utils.cc vng4_demosaic_RT.cc - ipsoftlight.cc - guidedfilter.cc - ipdehaze.cc - iplabregions.cc - lj92.c - ) + xtrans_demosaic.cc +) if(LENSFUN_HAS_LOAD_DIRECTORY) set_source_files_properties(rtlensfun.cc PROPERTIES COMPILE_DEFINITIONS RT_LENSFUN_HAS_LOAD_DIRECTORY) @@ -150,21 +150,22 @@ if(NOT WITH_SYSTEM_KLT) set(RTENGINESOURCEFILES ${RTENGINESOURCEFILES} klt/convolve.cc klt/error.cc - klt/klt.cc klt/klt_util.cc + klt/klt.cc klt/pnmio.cc klt/pyramid.cc klt/selectGoodFeatures.cc klt/storeFeatures.cc klt/trackFeatures.cc klt/writeFeatures.cc - ) + ) set(KLT_LIBRARIES) endif() include_directories(BEFORE "${CMAKE_CURRENT_BINARY_DIR}") -add_library(rtengine ${RTENGINESOURCEFILES}) +add_library(rtengine STATIC ${RTENGINESOURCEFILES}) + add_dependencies(rtengine UpdateInfo) # It may be nice to store library version too @@ -190,6 +191,6 @@ target_link_libraries(rtengine rtexif ${ZLIB_LIBRARIES} ${LENSFUN_LIBRARIES} ${RSVG_LIBRARIES} - ) +) install(FILES ${CAMCONSTSFILE} DESTINATION "${DATADIR}" PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ) diff --git a/rtexif/CMakeLists.txt b/rtexif/CMakeLists.txt index 9747b03fb..0a38a3a35 100644 --- a/rtexif/CMakeLists.txt +++ b/rtexif/CMakeLists.txt @@ -1,4 +1,16 @@ -add_library(rtexif rtexif.cc stdattribs.cc nikonattribs.cc canonattribs.cc pentaxattribs.cc fujiattribs.cc sonyminoltaattribs.cc olympusattribs.cc kodakattribs.cc panasonicattribs.cc) +add_library(rtexif STATIC + canonattribs.cc + fujiattribs.cc + kodakattribs.cc + nikonattribs.cc + olympusattribs.cc + panasonicattribs.cc + pentaxattribs.cc + rtexif.cc + sonyminoltaattribs.cc + stdattribs.cc +) + add_dependencies(rtexif UpdateInfo) if(WIN32) From 8f0de49d4104df9485c788913244ebe024dd9abc Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Thu, 3 Oct 2019 11:43:12 +0200 Subject: [PATCH 067/208] Whitespace cleanup Cleans up whitespace (tab -> space), alignment and DOS line endings. --- rtdata/themes/RawTherapee-GTK3-20_.css | 12 +- rtdata/themes/RawTherapee-GTK3-_19.css | 2 +- rtengine/CMakeLists.txt | 10 - rtengine/ciecam02.cc | 4 +- rtengine/color.h | 16 +- rtengine/sleef.c | 1504 ++++++++++----------- rtengine/sleefsseavx.c | 1626 +++++++++++------------ rtexif/CMakeLists.txt | 2 +- rtgui/coloredbar.cc | 8 +- rtgui/main.cc | 14 +- rtgui/options.cc | 2 +- rtgui/rtscalable.cc | 6 +- rtgui/rtwindow.cc | 4 +- tools/RTProfileBuilderSample.cs | 586 ++++---- tools/RTProfileBuilderSample.exe.config | 16 +- tools/osx/Info.plist-bin.in | 12 +- tools/osx/Info.plist.in | 326 ++--- tools/osx/rt.entitlements | 32 +- 18 files changed, 2085 insertions(+), 2097 deletions(-) diff --git a/rtdata/themes/RawTherapee-GTK3-20_.css b/rtdata/themes/RawTherapee-GTK3-20_.css index 3f5072f48..a5f52a769 100644 --- a/rtdata/themes/RawTherapee-GTK3-20_.css +++ b/rtdata/themes/RawTherapee-GTK3-20_.css @@ -640,11 +640,11 @@ spinbutton entry { } spinbutton button { margin: 0; - padding: 0; - border-radius: 0; + padding: 0; + border-radius: 0; } spinbutton button.up { - border-radius: 0 0.16666666666666666666em 0.16666666666666666666em 0; + border-radius: 0 0.16666666666666666666em 0.16666666666666666666em 0; } entry:disabled, spinbutton:disabled { @@ -841,7 +841,7 @@ flowboxchild:selected { color: #CCCCCC; padding: 0; margin: 0 0.25em 0 0.25em; - font-size: 1.1em; + font-size: 1.1em; } #MyExpanderTitle:hover { background-color: #202020; @@ -955,7 +955,7 @@ fontchooser scrolledwindow, } #PlacesPaned { - margin: 0; + margin: 0; padding: 0 0.4166666666666666em 0 0; } #PlacesPaned > box:nth-child(1) scrolledwindow + grid { @@ -1050,7 +1050,7 @@ dialog frame > label:not(.dummy) { #LabelRightNotebook { padding: 0.4166666666666666em; margin: 0.1666666666666666em; - font-size: 1.25em; + font-size: 1.25em; } #ToolPanelNotebook { diff --git a/rtdata/themes/RawTherapee-GTK3-_19.css b/rtdata/themes/RawTherapee-GTK3-_19.css index 58742e8ca..f4bec23b1 100644 --- a/rtdata/themes/RawTherapee-GTK3-_19.css +++ b/rtdata/themes/RawTherapee-GTK3-_19.css @@ -46,7 +46,7 @@ GtkBox { border-style: none; border-radius: 0; margin: 0; - padding: 0; + padding: 0; } GtkGrid { diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt index 8ee905e2c..40ddaefbb 100644 --- a/rtengine/CMakeLists.txt +++ b/rtengine/CMakeLists.txt @@ -98,16 +98,6 @@ set(RTENGINESOURCEFILES ipwavelet.cc jdatasrc.cc jpeg_ijg/jpeg_memsrc.cc - klt/convolve.cc - klt/error.cc - klt/klt_util.cc - klt/klt.cc - klt/pnmio.cc - klt/pyramid.cc - klt/selectGoodFeatures.cc - klt/storeFeatures.cc - klt/trackFeatures.cc - klt/writeFeatures.cc labimage.cc lcp.cc lj92.c diff --git a/rtengine/ciecam02.cc b/rtengine/ciecam02.cc index dfef273d6..dc71fee85 100644 --- a/rtengine/ciecam02.cc +++ b/rtengine/ciecam02.cc @@ -145,8 +145,8 @@ void Ciecam02::curveJfloat (float br, float contr, const LUTu & histogram, LUTf } outCurve *= 32767.f; - //printf("out500=%f out15000=%f\n", outCurve[500], outCurve[15000]); - //outCurve.dump("brig"); + //printf("out500=%f out15000=%f\n", outCurve[500], outCurve[15000]); + //outCurve.dump("brig"); } /** diff --git a/rtengine/color.h b/rtengine/color.h index 97835ba10..2acf675d4 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -1070,12 +1070,11 @@ public: */ static inline double gamma2 (double x) // g3 1+g4 { - // return x <= 0.003041 ? x * 12.92310 : 1.055 * exp(log(x) / 2.39990) - 0.055;//calculate with calcgamma + // return x <= 0.003041 ? x * 12.92310 : 1.055 * exp(log(x) / 2.39990) - 0.055;//calculate with calcgamma //return x <= 0.0031308 ? x * 12.92310 : 1.055 * exp(log(x) / sRGBGammaCurve) - 0.055;//standard discontinuous - //very small differences between the 2 + //very small differences between the 2 return x <= 0.003040 ? x * 12.92310 : 1.055 * exp(log(x) / sRGBGammaCurve) - 0.055;//continuous - // return x <= 0.003041 ? x * 12.92310 : 1.055011 * exp(log(x) / sRGBGammaCurve) - 0.055011;//continuous - + // return x <= 0.003041 ? x * 12.92310 : 1.055011 * exp(log(x) / sRGBGammaCurve) - 0.055011;//continuous } @@ -1087,12 +1086,11 @@ public: */ static inline double igamma2 (double x) //g2 { - // return x <= 0.039289 ? x / 12.92310 : exp(log((x + 0.055) / 1.055) * 2.39990);//calculate with calcgamma - // return x <= 0.04045 ? x / 12.92310 : exp(log((x + 0.055) / 1.055) * sRGBGammaCurve);//standard discontinuous - //very small differences between the 4 + // return x <= 0.039289 ? x / 12.92310 : exp(log((x + 0.055) / 1.055) * 2.39990);//calculate with calcgamma + // return x <= 0.04045 ? x / 12.92310 : exp(log((x + 0.055) / 1.055) * sRGBGammaCurve);//standard discontinuous + //very small differences between the 4 return x <= 0.039286 ? x / 12.92310 : exp(log((x + 0.055) / 1.055) * sRGBGammaCurve);//continuous - // return x <= 0.039293 ? x / 12.92310 : exp(log((x + 0.055011) / 1.055011) * sRGBGammaCurve);//continuous - + // return x <= 0.039293 ? x / 12.92310 : exp(log((x + 0.055011) / 1.055011) * sRGBGammaCurve);//continuous } diff --git a/rtengine/sleef.c b/rtengine/sleef.c index cc92be108..a01aef5b9 100644 --- a/rtengine/sleef.c +++ b/rtengine/sleef.c @@ -26,29 +26,29 @@ #define pow_F(a,b) (xexpf(b*xlogf(a))) __inline int64_t doubleToRawLongBits(double d) { - union { - double f; - int64_t i; - } tmp; - tmp.f = d; - return tmp.i; + union { + double f; + int64_t i; + } tmp; + tmp.f = d; + return tmp.i; } __inline double longBitsToDouble(int64_t i) { - union { - double f; - int64_t i; - } tmp; - tmp.i = i; - return tmp.f; + union { + double f; + int64_t i; + } tmp; + tmp.i = i; + return tmp.f; } __inline double xfabs(double x) { - return longBitsToDouble(0x7fffffffffffffffLL & doubleToRawLongBits(x)); + return longBitsToDouble(0x7fffffffffffffffLL & doubleToRawLongBits(x)); } __inline double mulsign(double x, double y) { - return longBitsToDouble(doubleToRawLongBits(x) ^ (doubleToRawLongBits(y) & (1LL << 63))); + return longBitsToDouble(doubleToRawLongBits(x) ^ (doubleToRawLongBits(y) & (1LL << 63))); } __inline double sign(double d) { return mulsign(1, d); } @@ -61,827 +61,827 @@ __inline int xisminf(double x) { return x == -rtengine::RT_INFINITY; } __inline int xispinf(double x) { return x == rtengine::RT_INFINITY; } __inline double ldexpk(double x, int q) { - double u; - int m; - m = q >> 31; - m = (((m + q) >> 9) - m) << 7; - q = q - (m << 2); - u = longBitsToDouble(((int64_t)(m + 0x3ff)) << 52); - double u2 = u*u; - u2 = u2 * u2; - x = x * u2; - u = longBitsToDouble(((int64_t)(q + 0x3ff)) << 52); - return x * u; + double u; + int m; + m = q >> 31; + m = (((m + q) >> 9) - m) << 7; + q = q - (m << 2); + u = longBitsToDouble(((int64_t)(m + 0x3ff)) << 52); + double u2 = u*u; + u2 = u2 * u2; + x = x * u2; + u = longBitsToDouble(((int64_t)(q + 0x3ff)) << 52); + return x * u; } __inline double xldexp(double x, int q) { return ldexpk(x, q); } __inline int ilogbp1(double d) { - int m = d < 4.9090934652977266E-91; - d = m ? 2.037035976334486E90 * d : d; - int q = (doubleToRawLongBits(d) >> 52) & 0x7ff; - q = m ? q - (300 + 0x03fe) : q - 0x03fe; - return q; + int m = d < 4.9090934652977266E-91; + d = m ? 2.037035976334486E90 * d : d; + int q = (doubleToRawLongBits(d) >> 52) & 0x7ff; + q = m ? q - (300 + 0x03fe) : q - 0x03fe; + return q; } __inline int xilogb(double d) { - int e = ilogbp1(xfabs(d)) - 1; - e = d == 0 ? (-2147483647 - 1) : e; - e = d == rtengine::RT_INFINITY || d == -rtengine::RT_INFINITY ? 2147483647 : e; - return e; + int e = ilogbp1(xfabs(d)) - 1; + e = d == 0 ? (-2147483647 - 1) : e; + e = d == rtengine::RT_INFINITY || d == -rtengine::RT_INFINITY ? 2147483647 : e; + return e; } __inline double upper(double d) { - return longBitsToDouble(doubleToRawLongBits(d) & 0xfffffffff8000000LL); + return longBitsToDouble(doubleToRawLongBits(d) & 0xfffffffff8000000LL); } typedef struct { - double x, y; + double x, y; } double2; typedef struct { - float x, y; + float x, y; } float2; __inline double2 dd(double h, double l) { - double2 ret; - ret.x = h; ret.y = l; - return ret; + double2 ret; + ret.x = h; ret.y = l; + return ret; } __inline double2 normalize_d(double2 t) { - double2 s; + double2 s; - s.x = t.x + t.y; - s.y = t.x - s.x + t.y; + s.x = t.x + t.y; + s.y = t.x - s.x + t.y; - return s; + return s; } __inline double2 scale_d(double2 d, double s) { - double2 r; + double2 r; - r.x = d.x * s; - r.y = d.y * s; + r.x = d.x * s; + r.y = d.y * s; - return r; + return r; } __inline double2 add2_ss(double x, double y) { - double2 r; + double2 r; - r.x = x + y; - double v = r.x - x; - r.y = (x - (r.x - v)) + (y - v); + r.x = x + y; + double v = r.x - x; + r.y = (x - (r.x - v)) + (y - v); - return r; + return r; } __inline double2 add_ds(double2 x, double y) { - // |x| >= |y| + // |x| >= |y| - double2 r; + double2 r; - assert(xisnan(x.x) || xisnan(y) || xfabs(x.x) >= xfabs(y)); + assert(xisnan(x.x) || xisnan(y) || xfabs(x.x) >= xfabs(y)); - r.x = x.x + y; - r.y = x.x - r.x + y + x.y; + r.x = x.x + y; + r.y = x.x - r.x + y + x.y; - return r; + return r; } __inline double2 add2_ds(double2 x, double y) { - // |x| >= |y| + // |x| >= |y| - double2 r; + double2 r; - r.x = x.x + y; - double v = r.x - x.x; - r.y = (x.x - (r.x - v)) + (y - v); - r.y += x.y; + r.x = x.x + y; + double v = r.x - x.x; + r.y = (x.x - (r.x - v)) + (y - v); + r.y += x.y; - return r; + return r; } __inline double2 add_sd(double x, double2 y) { - // |x| >= |y| + // |x| >= |y| - double2 r; + double2 r; - assert(xisnan(x) || xisnan(y.x) || xfabs(x) >= xfabs(y.x)); + assert(xisnan(x) || xisnan(y.x) || xfabs(x) >= xfabs(y.x)); - r.x = x + y.x; - r.y = x - r.x + y.x + y.y; + r.x = x + y.x; + r.y = x - r.x + y.x + y.y; - return r; + return r; } __inline double2 add_dd(double2 x, double2 y) { - // |x| >= |y| + // |x| >= |y| - double2 r; + double2 r; - assert(xisnan(x.x) || xisnan(y.x) || xfabs(x.x) >= xfabs(y.x)); + assert(xisnan(x.x) || xisnan(y.x) || xfabs(x.x) >= xfabs(y.x)); - r.x = x.x + y.x; - r.y = x.x - r.x + y.x + x.y + y.y; + r.x = x.x + y.x; + r.y = x.x - r.x + y.x + x.y + y.y; - return r; + return r; } __inline double2 add2_dd(double2 x, double2 y) { - double2 r; + double2 r; - r.x = x.x + y.x; - double v = r.x - x.x; - r.y = (x.x - (r.x - v)) + (y.x - v); - r.y += x.y + y.y; + r.x = x.x + y.x; + double v = r.x - x.x; + r.y = (x.x - (r.x - v)) + (y.x - v); + r.y += x.y + y.y; - return r; + return r; } __inline double2 div_dd(double2 n, double2 d) { - double t = 1.0 / d.x; - double dh = upper(d.x), dl = d.x - dh; - double th = upper(t ), tl = t - th; - double nhh = upper(n.x), nhl = n.x - nhh; + double t = 1.0 / d.x; + double dh = upper(d.x), dl = d.x - dh; + double th = upper(t ), tl = t - th; + double nhh = upper(n.x), nhl = n.x - nhh; - double2 q; + double2 q; - q.x = n.x * t; + q.x = n.x * t; - double u = -q.x + nhh * th + nhh * tl + nhl * th + nhl * tl + - q.x * (1 - dh * th - dh * tl - dl * th - dl * tl); + double u = -q.x + nhh * th + nhh * tl + nhl * th + nhl * tl + + q.x * (1 - dh * th - dh * tl - dl * th - dl * tl); - q.y = t * (n.y - q.x * d.y) + u; + q.y = t * (n.y - q.x * d.y) + u; - return q; + return q; } __inline double2 mul_ss(double x, double y) { - double xh = upper(x), xl = x - xh; - double yh = upper(y), yl = y - yh; - double2 r; + double xh = upper(x), xl = x - xh; + double yh = upper(y), yl = y - yh; + double2 r; - r.x = x * y; - r.y = xh * yh - r.x + xl * yh + xh * yl + xl * yl; + r.x = x * y; + r.y = xh * yh - r.x + xl * yh + xh * yl + xl * yl; - return r; + return r; } __inline double2 mul_ds(double2 x, double y) { - double xh = upper(x.x), xl = x.x - xh; - double yh = upper(y ), yl = y - yh; - double2 r; + double xh = upper(x.x), xl = x.x - xh; + double yh = upper(y ), yl = y - yh; + double2 r; - r.x = x.x * y; - r.y = xh * yh - r.x + xl * yh + xh * yl + xl * yl + x.y * y; + r.x = x.x * y; + r.y = xh * yh - r.x + xl * yh + xh * yl + xl * yl + x.y * y; - return r; + return r; } __inline double2 mul_dd(double2 x, double2 y) { - double xh = upper(x.x), xl = x.x - xh; - double yh = upper(y.x), yl = y.x - yh; - double2 r; + double xh = upper(x.x), xl = x.x - xh; + double yh = upper(y.x), yl = y.x - yh; + double2 r; - r.x = x.x * y.x; - r.y = xh * yh - r.x + xl * yh + xh * yl + xl * yl + x.x * y.y + x.y * y.x; + r.x = x.x * y.x; + r.y = xh * yh - r.x + xl * yh + xh * yl + xl * yl + x.x * y.y + x.y * y.x; - return r; + return r; } __inline double2 squ_d(double2 x) { - double xh = upper(x.x), xl = x.x - xh; - double2 r; + double xh = upper(x.x), xl = x.x - xh; + double2 r; - r.x = x.x * x.x; - r.y = xh * xh - r.x + (xh + xh) * xl + xl * xl + x.x * (x.y + x.y); + r.x = x.x * x.x; + r.y = xh * xh - r.x + (xh + xh) * xl + xl * xl + x.x * (x.y + x.y); - return r; + return r; } __inline double2 rec_s(double d) { - double t = 1.0 / d; - double dh = upper(d), dl = d - dh; - double th = upper(t), tl = t - th; - double2 q; + double t = 1.0 / d; + double dh = upper(d), dl = d - dh; + double th = upper(t), tl = t - th; + double2 q; - q.x = t; - q.y = t * (1 - dh * th - dh * tl - dl * th - dl * tl); + q.x = t; + q.y = t * (1 - dh * th - dh * tl - dl * th - dl * tl); - return q; + return q; } __inline double2 sqrt_d(double2 d) { - double t = sqrt(d.x + d.y); - return scale_d(mul_dd(add2_dd(d, mul_ss(t, t)), rec_s(t)), 0.5); + double t = sqrt(d.x + d.y); + return scale_d(mul_dd(add2_dd(d, mul_ss(t, t)), rec_s(t)), 0.5); } __inline double atan2k(double y, double x) { - double s, t, u; - int q = 0; + double s, t, u; + int q = 0; - if (x < 0) { x = -x; q = -2; } - if (y > x) { t = x; x = y; y = -t; q += 1; } + if (x < 0) { x = -x; q = -2; } + if (y > x) { t = x; x = y; y = -t; q += 1; } - s = y / x; - t = s * s; + s = y / x; + t = s * s; - u = -1.88796008463073496563746e-05; - u = u * t + (0.000209850076645816976906797); - u = u * t + (-0.00110611831486672482563471); - u = u * t + (0.00370026744188713119232403); - u = u * t + (-0.00889896195887655491740809); - u = u * t + (0.016599329773529201970117); - u = u * t + (-0.0254517624932312641616861); - u = u * t + (0.0337852580001353069993897); - u = u * t + (-0.0407629191276836500001934); - u = u * t + (0.0466667150077840625632675); - u = u * t + (-0.0523674852303482457616113); - u = u * t + (0.0587666392926673580854313); - u = u * t + (-0.0666573579361080525984562); - u = u * t + (0.0769219538311769618355029); - u = u * t + (-0.090908995008245008229153); - u = u * t + (0.111111105648261418443745); - u = u * t + (-0.14285714266771329383765); - u = u * t + (0.199999999996591265594148); - u = u * t + (-0.333333333333311110369124); + u = -1.88796008463073496563746e-05; + u = u * t + (0.000209850076645816976906797); + u = u * t + (-0.00110611831486672482563471); + u = u * t + (0.00370026744188713119232403); + u = u * t + (-0.00889896195887655491740809); + u = u * t + (0.016599329773529201970117); + u = u * t + (-0.0254517624932312641616861); + u = u * t + (0.0337852580001353069993897); + u = u * t + (-0.0407629191276836500001934); + u = u * t + (0.0466667150077840625632675); + u = u * t + (-0.0523674852303482457616113); + u = u * t + (0.0587666392926673580854313); + u = u * t + (-0.0666573579361080525984562); + u = u * t + (0.0769219538311769618355029); + u = u * t + (-0.090908995008245008229153); + u = u * t + (0.111111105648261418443745); + u = u * t + (-0.14285714266771329383765); + u = u * t + (0.199999999996591265594148); + u = u * t + (-0.333333333333311110369124); - t = u * t * s + s; - t = q * (rtengine::RT_PI_2) + t; + t = u * t * s + s; + t = q * (rtengine::RT_PI_2) + t; - return t; + return t; } __inline double xatan2(double y, double x) { - double r = atan2k(xfabs(y), x); + double r = atan2k(xfabs(y), x); - r = mulsign(r, x); - if (xisinf(x) || x == 0) r = rtengine::RT_PI_2 - (xisinf(x) ? (sign(x) * (rtengine::RT_PI_2)) : 0); - if (xisinf(y) ) r = rtengine::RT_PI_2 - (xisinf(x) ? (sign(x) * (rtengine::RT_PI*1/4)) : 0); - if ( y == 0) r = (sign(x) == -1 ? rtengine::RT_PI : 0); + r = mulsign(r, x); + if (xisinf(x) || x == 0) r = rtengine::RT_PI_2 - (xisinf(x) ? (sign(x) * (rtengine::RT_PI_2)) : 0); + if (xisinf(y) ) r = rtengine::RT_PI_2 - (xisinf(x) ? (sign(x) * (rtengine::RT_PI*1/4)) : 0); + if ( y == 0) r = (sign(x) == -1 ? rtengine::RT_PI : 0); - return xisnan(x) || xisnan(y) ? rtengine::RT_NAN : mulsign(r, y); + return xisnan(x) || xisnan(y) ? rtengine::RT_NAN : mulsign(r, y); } __inline double xasin(double d) { - return mulsign(atan2k(xfabs(d), sqrt((1+d)*(1-d))), d); + return mulsign(atan2k(xfabs(d), sqrt((1+d)*(1-d))), d); } __inline double xacos(double d) { - return mulsign(atan2k(sqrt((1+d)*(1-d)), xfabs(d)), d) + (d < 0 ? rtengine::RT_PI : 0); + return mulsign(atan2k(sqrt((1+d)*(1-d)), xfabs(d)), d) + (d < 0 ? rtengine::RT_PI : 0); } __inline double xatan(double s) { - double t, u; - int q = 0; + double t, u; + int q = 0; - if (s < 0) { s = -s; q = 2; } - if (s > 1) { s = 1.0 / s; q |= 1; } + if (s < 0) { s = -s; q = 2; } + if (s > 1) { s = 1.0 / s; q |= 1; } - t = s * s; + t = s * s; - u = -1.88796008463073496563746e-05; - u = u * t + (0.000209850076645816976906797); - u = u * t + (-0.00110611831486672482563471); - u = u * t + (0.00370026744188713119232403); - u = u * t + (-0.00889896195887655491740809); - u = u * t + (0.016599329773529201970117); - u = u * t + (-0.0254517624932312641616861); - u = u * t + (0.0337852580001353069993897); - u = u * t + (-0.0407629191276836500001934); - u = u * t + (0.0466667150077840625632675); - u = u * t + (-0.0523674852303482457616113); - u = u * t + (0.0587666392926673580854313); - u = u * t + (-0.0666573579361080525984562); - u = u * t + (0.0769219538311769618355029); - u = u * t + (-0.090908995008245008229153); - u = u * t + (0.111111105648261418443745); - u = u * t + (-0.14285714266771329383765); - u = u * t + (0.199999999996591265594148); - u = u * t + (-0.333333333333311110369124); + u = -1.88796008463073496563746e-05; + u = u * t + (0.000209850076645816976906797); + u = u * t + (-0.00110611831486672482563471); + u = u * t + (0.00370026744188713119232403); + u = u * t + (-0.00889896195887655491740809); + u = u * t + (0.016599329773529201970117); + u = u * t + (-0.0254517624932312641616861); + u = u * t + (0.0337852580001353069993897); + u = u * t + (-0.0407629191276836500001934); + u = u * t + (0.0466667150077840625632675); + u = u * t + (-0.0523674852303482457616113); + u = u * t + (0.0587666392926673580854313); + u = u * t + (-0.0666573579361080525984562); + u = u * t + (0.0769219538311769618355029); + u = u * t + (-0.090908995008245008229153); + u = u * t + (0.111111105648261418443745); + u = u * t + (-0.14285714266771329383765); + u = u * t + (0.199999999996591265594148); + u = u * t + (-0.333333333333311110369124); - t = s + s * (t * u); + t = s + s * (t * u); - if ((q & 1) != 0) t = 1.570796326794896557998982 - t; - if ((q & 2) != 0) t = -t; + if ((q & 1) != 0) t = 1.570796326794896557998982 - t; + if ((q & 2) != 0) t = -t; - return t; + return t; } __inline double xsin(double d) { - int q; - double u, s; + int q; + double u, s; - q = (int)xrint(d * rtengine::RT_1_PI); + q = (int)xrint(d * rtengine::RT_1_PI); - d = mla(q, -PI4_A*4, d); - d = mla(q, -PI4_B*4, d); - d = mla(q, -PI4_C*4, d); + d = mla(q, -PI4_A*4, d); + d = mla(q, -PI4_B*4, d); + d = mla(q, -PI4_C*4, d); - s = d * d; + s = d * d; - if ((q & 1) != 0) d = -d; + if ((q & 1) != 0) d = -d; - u = -7.97255955009037868891952e-18; - u = mla(u, s, 2.81009972710863200091251e-15); - u = mla(u, s, -7.64712219118158833288484e-13); - u = mla(u, s, 1.60590430605664501629054e-10); - u = mla(u, s, -2.50521083763502045810755e-08); - u = mla(u, s, 2.75573192239198747630416e-06); - u = mla(u, s, -0.000198412698412696162806809); - u = mla(u, s, 0.00833333333333332974823815); - u = mla(u, s, -0.166666666666666657414808); + u = -7.97255955009037868891952e-18; + u = mla(u, s, 2.81009972710863200091251e-15); + u = mla(u, s, -7.64712219118158833288484e-13); + u = mla(u, s, 1.60590430605664501629054e-10); + u = mla(u, s, -2.50521083763502045810755e-08); + u = mla(u, s, 2.75573192239198747630416e-06); + u = mla(u, s, -0.000198412698412696162806809); + u = mla(u, s, 0.00833333333333332974823815); + u = mla(u, s, -0.166666666666666657414808); - u = mla(s, u * d, d); + u = mla(s, u * d, d); - return u; + return u; } __inline double xcos(double d) { - int q; - double u, s; + int q; + double u, s; - q = 1 + 2*(int)xrint(d * rtengine::RT_1_PI - 0.5); + q = 1 + 2*(int)xrint(d * rtengine::RT_1_PI - 0.5); - d = mla(q, -PI4_A*2, d); - d = mla(q, -PI4_B*2, d); - d = mla(q, -PI4_C*2, d); + d = mla(q, -PI4_A*2, d); + d = mla(q, -PI4_B*2, d); + d = mla(q, -PI4_C*2, d); - s = d * d; + s = d * d; - if ((q & 2) == 0) d = -d; + if ((q & 2) == 0) d = -d; - u = -7.97255955009037868891952e-18; - u = mla(u, s, 2.81009972710863200091251e-15); - u = mla(u, s, -7.64712219118158833288484e-13); - u = mla(u, s, 1.60590430605664501629054e-10); - u = mla(u, s, -2.50521083763502045810755e-08); - u = mla(u, s, 2.75573192239198747630416e-06); - u = mla(u, s, -0.000198412698412696162806809); - u = mla(u, s, 0.00833333333333332974823815); - u = mla(u, s, -0.166666666666666657414808); + u = -7.97255955009037868891952e-18; + u = mla(u, s, 2.81009972710863200091251e-15); + u = mla(u, s, -7.64712219118158833288484e-13); + u = mla(u, s, 1.60590430605664501629054e-10); + u = mla(u, s, -2.50521083763502045810755e-08); + u = mla(u, s, 2.75573192239198747630416e-06); + u = mla(u, s, -0.000198412698412696162806809); + u = mla(u, s, 0.00833333333333332974823815); + u = mla(u, s, -0.166666666666666657414808); - u = mla(s, u * d, d); + u = mla(s, u * d, d); - return u; + return u; } __inline double2 xsincos(double d) { - int q; - double u, s, t; - double2 r; + int q; + double u, s, t; + double2 r; - q = (int)xrint(d * (2 * rtengine::RT_1_PI)); + q = (int)xrint(d * (2 * rtengine::RT_1_PI)); - s = d; + s = d; - s = mla(-q, PI4_A*2, s); - s = mla(-q, PI4_B*2, s); - s = mla(-q, PI4_C*2, s); + s = mla(-q, PI4_A*2, s); + s = mla(-q, PI4_B*2, s); + s = mla(-q, PI4_C*2, s); - t = s; + t = s; - s = s * s; + s = s * s; - u = 1.58938307283228937328511e-10; - u = mla(u, s, -2.50506943502539773349318e-08); - u = mla(u, s, 2.75573131776846360512547e-06); - u = mla(u, s, -0.000198412698278911770864914); - u = mla(u, s, 0.0083333333333191845961746); - u = mla(u, s, -0.166666666666666130709393); - u = u * s * t; + u = 1.58938307283228937328511e-10; + u = mla(u, s, -2.50506943502539773349318e-08); + u = mla(u, s, 2.75573131776846360512547e-06); + u = mla(u, s, -0.000198412698278911770864914); + u = mla(u, s, 0.0083333333333191845961746); + u = mla(u, s, -0.166666666666666130709393); + u = u * s * t; - r.x = t + u; + r.x = t + u; - u = -1.13615350239097429531523e-11; - u = mla(u, s, 2.08757471207040055479366e-09); - u = mla(u, s, -2.75573144028847567498567e-07); - u = mla(u, s, 2.48015872890001867311915e-05); - u = mla(u, s, -0.00138888888888714019282329); - u = mla(u, s, 0.0416666666666665519592062); - u = mla(u, s, -0.5); + u = -1.13615350239097429531523e-11; + u = mla(u, s, 2.08757471207040055479366e-09); + u = mla(u, s, -2.75573144028847567498567e-07); + u = mla(u, s, 2.48015872890001867311915e-05); + u = mla(u, s, -0.00138888888888714019282329); + u = mla(u, s, 0.0416666666666665519592062); + u = mla(u, s, -0.5); - r.y = u * s + 1; + r.y = u * s + 1; - if ((q & 1) != 0) { s = r.y; r.y = r.x; r.x = s; } - if ((q & 2) != 0) { r.x = -r.x; } - if (((q+1) & 2) != 0) { r.y = -r.y; } + if ((q & 1) != 0) { s = r.y; r.y = r.x; r.x = s; } + if ((q & 2) != 0) { r.x = -r.x; } + if (((q+1) & 2) != 0) { r.y = -r.y; } - if (xisinf(d)) { r.x = r.y = rtengine::RT_NAN; } + if (xisinf(d)) { r.x = r.y = rtengine::RT_NAN; } - return r; + return r; } __inline double xtan(double d) { - int q; - double u, s, x; + int q; + double u, s, x; - q = (int)xrint(d * (2 * rtengine::RT_1_PI)); + q = (int)xrint(d * (2 * rtengine::RT_1_PI)); - x = mla(q, -PI4_A*2, d); - x = mla(q, -PI4_B*2, x); - x = mla(q, -PI4_C*2, x); + x = mla(q, -PI4_A*2, d); + x = mla(q, -PI4_B*2, x); + x = mla(q, -PI4_C*2, x); - s = x * x; + s = x * x; - if ((q & 1) != 0) x = -x; + if ((q & 1) != 0) x = -x; - u = 1.01419718511083373224408e-05; - u = mla(u, s, -2.59519791585924697698614e-05); - u = mla(u, s, 5.23388081915899855325186e-05); - u = mla(u, s, -3.05033014433946488225616e-05); - u = mla(u, s, 7.14707504084242744267497e-05); - u = mla(u, s, 8.09674518280159187045078e-05); - u = mla(u, s, 0.000244884931879331847054404); - u = mla(u, s, 0.000588505168743587154904506); - u = mla(u, s, 0.00145612788922812427978848); - u = mla(u, s, 0.00359208743836906619142924); - u = mla(u, s, 0.00886323944362401618113356); - u = mla(u, s, 0.0218694882853846389592078); - u = mla(u, s, 0.0539682539781298417636002); - u = mla(u, s, 0.133333333333125941821962); - u = mla(u, s, 0.333333333333334980164153); + u = 1.01419718511083373224408e-05; + u = mla(u, s, -2.59519791585924697698614e-05); + u = mla(u, s, 5.23388081915899855325186e-05); + u = mla(u, s, -3.05033014433946488225616e-05); + u = mla(u, s, 7.14707504084242744267497e-05); + u = mla(u, s, 8.09674518280159187045078e-05); + u = mla(u, s, 0.000244884931879331847054404); + u = mla(u, s, 0.000588505168743587154904506); + u = mla(u, s, 0.00145612788922812427978848); + u = mla(u, s, 0.00359208743836906619142924); + u = mla(u, s, 0.00886323944362401618113356); + u = mla(u, s, 0.0218694882853846389592078); + u = mla(u, s, 0.0539682539781298417636002); + u = mla(u, s, 0.133333333333125941821962); + u = mla(u, s, 0.333333333333334980164153); - u = mla(s, u * x, x); + u = mla(s, u * x, x); - if ((q & 1) != 0) u = 1.0 / u; + if ((q & 1) != 0) u = 1.0 / u; - if (xisinf(d)) u = rtengine::RT_NAN; + if (xisinf(d)) u = rtengine::RT_NAN; - return u; + return u; } __inline double xlog(double d) { - double x, x2, t, m; - int e; + double x, x2, t, m; + int e; - e = ilogbp1(d * 0.7071); - m = ldexpk(d, -e); + e = ilogbp1(d * 0.7071); + m = ldexpk(d, -e); - x = (m-1) / (m+1); - x2 = x * x; + x = (m-1) / (m+1); + x2 = x * x; - t = 0.148197055177935105296783; - t = mla(t, x2, 0.153108178020442575739679); - t = mla(t, x2, 0.181837339521549679055568); - t = mla(t, x2, 0.22222194152736701733275); - t = mla(t, x2, 0.285714288030134544449368); - t = mla(t, x2, 0.399999999989941956712869); - t = mla(t, x2, 0.666666666666685503450651); - t = mla(t, x2, 2); + t = 0.148197055177935105296783; + t = mla(t, x2, 0.153108178020442575739679); + t = mla(t, x2, 0.181837339521549679055568); + t = mla(t, x2, 0.22222194152736701733275); + t = mla(t, x2, 0.285714288030134544449368); + t = mla(t, x2, 0.399999999989941956712869); + t = mla(t, x2, 0.666666666666685503450651); + t = mla(t, x2, 2); - x = x * t + 0.693147180559945286226764 * e; + x = x * t + 0.693147180559945286226764 * e; - if (xisinf(d)) x = rtengine::RT_INFINITY; - if (d < 0) x = rtengine::RT_NAN; - if (d == 0) x = -rtengine::RT_INFINITY; + if (xisinf(d)) x = rtengine::RT_INFINITY; + if (d < 0) x = rtengine::RT_NAN; + if (d == 0) x = -rtengine::RT_INFINITY; - return x; + return x; } __inline double xexp(double d) { - int q = (int)xrint(d * R_LN2); - double s, u; + int q = (int)xrint(d * R_LN2); + double s, u; - s = mla(q, -L2U, d); - s = mla(q, -L2L, s); + s = mla(q, -L2U, d); + s = mla(q, -L2L, s); - u = 2.08860621107283687536341e-09; - u = mla(u, s, 2.51112930892876518610661e-08); - u = mla(u, s, 2.75573911234900471893338e-07); - u = mla(u, s, 2.75572362911928827629423e-06); - u = mla(u, s, 2.4801587159235472998791e-05); - u = mla(u, s, 0.000198412698960509205564975); - u = mla(u, s, 0.00138888888889774492207962); - u = mla(u, s, 0.00833333333331652721664984); - u = mla(u, s, 0.0416666666666665047591422); - u = mla(u, s, 0.166666666666666851703837); - u = mla(u, s, 0.5); + u = 2.08860621107283687536341e-09; + u = mla(u, s, 2.51112930892876518610661e-08); + u = mla(u, s, 2.75573911234900471893338e-07); + u = mla(u, s, 2.75572362911928827629423e-06); + u = mla(u, s, 2.4801587159235472998791e-05); + u = mla(u, s, 0.000198412698960509205564975); + u = mla(u, s, 0.00138888888889774492207962); + u = mla(u, s, 0.00833333333331652721664984); + u = mla(u, s, 0.0416666666666665047591422); + u = mla(u, s, 0.166666666666666851703837); + u = mla(u, s, 0.5); - u = s * s * u + s + 1; - u = ldexpk(u, q); + u = s * s * u + s + 1; + u = ldexpk(u, q); - if (xisminf(d)) u = 0; + if (xisminf(d)) u = 0; - return u; + return u; } __inline double2 logk(double d) { - double2 x, x2; - double m, t; - int e; + double2 x, x2; + double m, t; + int e; - e = ilogbp1(d * 0.7071); - m = ldexpk(d, -e); + e = ilogbp1(d * 0.7071); + m = ldexpk(d, -e); - x = div_dd(add2_ss(-1, m), add2_ss(1, m)); - x2 = squ_d(x); + x = div_dd(add2_ss(-1, m), add2_ss(1, m)); + x2 = squ_d(x); - t = 0.134601987501262130076155; - t = mla(t, x2.x, 0.132248509032032670243288); - t = mla(t, x2.x, 0.153883458318096079652524); - t = mla(t, x2.x, 0.181817427573705403298686); - t = mla(t, x2.x, 0.222222231326187414840781); - t = mla(t, x2.x, 0.285714285651261412873718); - t = mla(t, x2.x, 0.400000000000222439910458); - t = mla(t, x2.x, 0.666666666666666371239645); + t = 0.134601987501262130076155; + t = mla(t, x2.x, 0.132248509032032670243288); + t = mla(t, x2.x, 0.153883458318096079652524); + t = mla(t, x2.x, 0.181817427573705403298686); + t = mla(t, x2.x, 0.222222231326187414840781); + t = mla(t, x2.x, 0.285714285651261412873718); + t = mla(t, x2.x, 0.400000000000222439910458); + t = mla(t, x2.x, 0.666666666666666371239645); - return add2_dd(mul_ds(dd(0.693147180559945286226764, 2.319046813846299558417771e-17), e), - add2_dd(scale_d(x, 2), mul_ds(mul_dd(x2, x), t))); + return add2_dd(mul_ds(dd(0.693147180559945286226764, 2.319046813846299558417771e-17), e), + add2_dd(scale_d(x, 2), mul_ds(mul_dd(x2, x), t))); } __inline double expk(double2 d) { - int q = (int)rint((d.x + d.y) * R_LN2); - double2 s, t; - double u; + int q = (int)rint((d.x + d.y) * R_LN2); + double2 s, t; + double u; - s = add2_ds(d, q * -L2U); - s = add2_ds(s, q * -L2L); + s = add2_ds(d, q * -L2U); + s = add2_ds(s, q * -L2L); - s = normalize_d(s); + s = normalize_d(s); - u = 2.51069683420950419527139e-08; - u = mla(u, s.x, 2.76286166770270649116855e-07); - u = mla(u, s.x, 2.75572496725023574143864e-06); - u = mla(u, s.x, 2.48014973989819794114153e-05); - u = mla(u, s.x, 0.000198412698809069797676111); - u = mla(u, s.x, 0.0013888888939977128960529); - u = mla(u, s.x, 0.00833333333332371417601081); - u = mla(u, s.x, 0.0416666666665409524128449); - u = mla(u, s.x, 0.166666666666666740681535); - u = mla(u, s.x, 0.500000000000000999200722); + u = 2.51069683420950419527139e-08; + u = mla(u, s.x, 2.76286166770270649116855e-07); + u = mla(u, s.x, 2.75572496725023574143864e-06); + u = mla(u, s.x, 2.48014973989819794114153e-05); + u = mla(u, s.x, 0.000198412698809069797676111); + u = mla(u, s.x, 0.0013888888939977128960529); + u = mla(u, s.x, 0.00833333333332371417601081); + u = mla(u, s.x, 0.0416666666665409524128449); + u = mla(u, s.x, 0.166666666666666740681535); + u = mla(u, s.x, 0.500000000000000999200722); - t = add_dd(s, mul_ds(squ_d(s), u)); + t = add_dd(s, mul_ds(squ_d(s), u)); - t = add_sd(1, t); - return ldexpk(t.x + t.y, q); + t = add_sd(1, t); + return ldexpk(t.x + t.y, q); } __inline double xpow(double x, double y) { - int yisint = (int)y == y; - int yisodd = (1 & (int)y) != 0 && yisint; + int yisint = (int)y == y; + int yisodd = (1 & (int)y) != 0 && yisint; - double result = expk(mul_ds(logk(xfabs(x)), y)); + double result = expk(mul_ds(logk(xfabs(x)), y)); - result = xisnan(result) ? rtengine::RT_INFINITY : result; - result *= (x >= 0 ? 1 : (!yisint ? rtengine::RT_NAN : (yisodd ? -1 : 1))); + result = xisnan(result) ? rtengine::RT_INFINITY : result; + result *= (x >= 0 ? 1 : (!yisint ? rtengine::RT_NAN : (yisodd ? -1 : 1))); - double efx = mulsign(xfabs(x) - 1, y); - if (xisinf(y)) result = efx < 0 ? 0.0 : (efx == 0 ? 1.0 : rtengine::RT_INFINITY); - if (xisinf(x) || x == 0) result = (yisodd ? sign(x) : 1) * ((x == 0 ? -y : y) < 0 ? 0 : rtengine::RT_INFINITY); - if (xisnan(x) || xisnan(y)) result = rtengine::RT_NAN; - if (y == 0 || x == 1) result = 1; + double efx = mulsign(xfabs(x) - 1, y); + if (xisinf(y)) result = efx < 0 ? 0.0 : (efx == 0 ? 1.0 : rtengine::RT_INFINITY); + if (xisinf(x) || x == 0) result = (yisodd ? sign(x) : 1) * ((x == 0 ? -y : y) < 0 ? 0 : rtengine::RT_INFINITY); + if (xisnan(x) || xisnan(y)) result = rtengine::RT_NAN; + if (y == 0 || x == 1) result = 1; - return result; + return result; } __inline double2 expk2(double2 d) { - int q = (int)rint((d.x + d.y) * R_LN2); - double2 s, t; - double u; + int q = (int)rint((d.x + d.y) * R_LN2); + double2 s, t; + double u; - s = add2_ds(d, q * -L2U); - s = add2_ds(s, q * -L2L); + s = add2_ds(d, q * -L2U); + s = add2_ds(s, q * -L2L); - s = normalize_d(s); + s = normalize_d(s); - u = 2.51069683420950419527139e-08; - u = mla(u, s.x, 2.76286166770270649116855e-07); - u = mla(u, s.x, 2.75572496725023574143864e-06); - u = mla(u, s.x, 2.48014973989819794114153e-05); - u = mla(u, s.x, 0.000198412698809069797676111); - u = mla(u, s.x, 0.0013888888939977128960529); - u = mla(u, s.x, 0.00833333333332371417601081); - u = mla(u, s.x, 0.0416666666665409524128449); - u = mla(u, s.x, 0.166666666666666740681535); - u = mla(u, s.x, 0.500000000000000999200722); + u = 2.51069683420950419527139e-08; + u = mla(u, s.x, 2.76286166770270649116855e-07); + u = mla(u, s.x, 2.75572496725023574143864e-06); + u = mla(u, s.x, 2.48014973989819794114153e-05); + u = mla(u, s.x, 0.000198412698809069797676111); + u = mla(u, s.x, 0.0013888888939977128960529); + u = mla(u, s.x, 0.00833333333332371417601081); + u = mla(u, s.x, 0.0416666666665409524128449); + u = mla(u, s.x, 0.166666666666666740681535); + u = mla(u, s.x, 0.500000000000000999200722); - t = add_dd(s, mul_ds(squ_d(s), u)); + t = add_dd(s, mul_ds(squ_d(s), u)); - t = add_sd(1, t); - return dd(ldexpk(t.x, q), ldexpk(t.y, q)); + t = add_sd(1, t); + return dd(ldexpk(t.x, q), ldexpk(t.y, q)); } __inline double xsinh(double x) { - double y = xfabs(x); - double2 d = expk2(dd(y, 0)); - d = add2_dd(d, div_dd(dd(-1, 0), d)); - y = (d.x + d.y) * 0.5; + double y = xfabs(x); + double2 d = expk2(dd(y, 0)); + d = add2_dd(d, div_dd(dd(-1, 0), d)); + y = (d.x + d.y) * 0.5; - y = xisinf(x) || xisnan(y) ? rtengine::RT_INFINITY : y; - y = mulsign(y, x); - y = xisnan(x) ? rtengine::RT_NAN : y; + y = xisinf(x) || xisnan(y) ? rtengine::RT_INFINITY : y; + y = mulsign(y, x); + y = xisnan(x) ? rtengine::RT_NAN : y; - return y; + return y; } __inline double xcosh(double x) { - double2 d = expk2(dd(x, 0)); - d = add2_dd(d, div_dd(dd(1, 0), d)); - double y = (d.x + d.y) * 0.5; + double2 d = expk2(dd(x, 0)); + d = add2_dd(d, div_dd(dd(1, 0), d)); + double y = (d.x + d.y) * 0.5; - y = xisinf(x) || xisnan(y) ? rtengine::RT_INFINITY : y; - y = xisnan(x) ? rtengine::RT_NAN : y; + y = xisinf(x) || xisnan(y) ? rtengine::RT_INFINITY : y; + y = xisnan(x) ? rtengine::RT_NAN : y; - return y; + return y; } __inline double xtanh(double x) { - double y = xfabs(x); - double2 d = expk2(dd(y, 0)); - double2 e = div_dd(dd(1, 0), d); - d = div_dd(add2_dd(d, scale_d(e, -1)), add2_dd(d, e)); - y = d.x + d.y; + double y = xfabs(x); + double2 d = expk2(dd(y, 0)); + double2 e = div_dd(dd(1, 0), d); + d = div_dd(add2_dd(d, scale_d(e, -1)), add2_dd(d, e)); + y = d.x + d.y; - y = xisinf(x) || xisnan(y) ? 1.0 : y; - y = mulsign(y, x); - y = xisnan(x) ? rtengine::RT_NAN : y; + y = xisinf(x) || xisnan(y) ? 1.0 : y; + y = mulsign(y, x); + y = xisnan(x) ? rtengine::RT_NAN : y; - return y; + return y; } __inline double2 logk2(double2 d) { - double2 x, x2, m; - double t; - int e; + double2 x, x2, m; + double t; + int e; - d = normalize_d(d); - e = ilogbp1(d.x * 0.7071); - m = scale_d(d, ldexpk(1, -e)); + d = normalize_d(d); + e = ilogbp1(d.x * 0.7071); + m = scale_d(d, ldexpk(1, -e)); - x = div_dd(add2_ds(m, -1), add2_ds(m, 1)); - x2 = squ_d(x); + x = div_dd(add2_ds(m, -1), add2_ds(m, 1)); + x2 = squ_d(x); - t = 0.134601987501262130076155; - t = mla(t, x2.x, 0.132248509032032670243288); - t = mla(t, x2.x, 0.153883458318096079652524); - t = mla(t, x2.x, 0.181817427573705403298686); - t = mla(t, x2.x, 0.222222231326187414840781); - t = mla(t, x2.x, 0.285714285651261412873718); - t = mla(t, x2.x, 0.400000000000222439910458); - t = mla(t, x2.x, 0.666666666666666371239645); + t = 0.134601987501262130076155; + t = mla(t, x2.x, 0.132248509032032670243288); + t = mla(t, x2.x, 0.153883458318096079652524); + t = mla(t, x2.x, 0.181817427573705403298686); + t = mla(t, x2.x, 0.222222231326187414840781); + t = mla(t, x2.x, 0.285714285651261412873718); + t = mla(t, x2.x, 0.400000000000222439910458); + t = mla(t, x2.x, 0.666666666666666371239645); - return add2_dd(mul_ds(dd(0.693147180559945286226764, 2.319046813846299558417771e-17), e), - add2_dd(scale_d(x, 2), mul_ds(mul_dd(x2, x), t))); + return add2_dd(mul_ds(dd(0.693147180559945286226764, 2.319046813846299558417771e-17), e), + add2_dd(scale_d(x, 2), mul_ds(mul_dd(x2, x), t))); } __inline double xasinh(double x) { - double y = xfabs(x); - double2 d = logk2(add2_ds(sqrt_d(add2_ds(mul_ss(y, y), 1)), y)); - y = d.x + d.y; + double y = xfabs(x); + double2 d = logk2(add2_ds(sqrt_d(add2_ds(mul_ss(y, y), 1)), y)); + y = d.x + d.y; - y = xisinf(x) || xisnan(y) ? rtengine::RT_INFINITY : y; - y = mulsign(y, x); - y = xisnan(x) ? rtengine::RT_NAN : y; + y = xisinf(x) || xisnan(y) ? rtengine::RT_INFINITY : y; + y = mulsign(y, x); + y = xisnan(x) ? rtengine::RT_NAN : y; - return y; + return y; } __inline double xacosh(double x) { - double2 d = logk2(add2_ds(sqrt_d(add2_ds(mul_ss(x, x), -1)), x)); - double y = d.x + d.y; + double2 d = logk2(add2_ds(sqrt_d(add2_ds(mul_ss(x, x), -1)), x)); + double y = d.x + d.y; - y = xisinf(x) || xisnan(y) ? rtengine::RT_INFINITY : y; - y = x == 1.0 ? 0.0 : y; - y = x < 1.0 ? rtengine::RT_NAN : y; - y = xisnan(x) ? rtengine::RT_NAN : y; + y = xisinf(x) || xisnan(y) ? rtengine::RT_INFINITY : y; + y = x == 1.0 ? 0.0 : y; + y = x < 1.0 ? rtengine::RT_NAN : y; + y = xisnan(x) ? rtengine::RT_NAN : y; - return y; + return y; } __inline double xatanh(double x) { - double y = xfabs(x); - double2 d = logk2(div_dd(add2_ss(1, y), add2_ss(1, -y))); - y = y > 1.0 ? rtengine::RT_NAN : (y == 1.0 ? rtengine::RT_INFINITY : (d.x + d.y) * 0.5); + double y = xfabs(x); + double2 d = logk2(div_dd(add2_ss(1, y), add2_ss(1, -y))); + y = y > 1.0 ? rtengine::RT_NAN : (y == 1.0 ? rtengine::RT_INFINITY : (d.x + d.y) * 0.5); - y = xisinf(x) || xisnan(y) ? rtengine::RT_NAN : y; - y = mulsign(y, x); - y = xisnan(x) ? rtengine::RT_NAN : y; + y = xisinf(x) || xisnan(y) ? rtengine::RT_NAN : y; + y = mulsign(y, x); + y = xisnan(x) ? rtengine::RT_NAN : y; - return y; + return y; } // __inline double xfma(double x, double y, double z) { - union { - double f; - long long int i; - } tmp; + union { + double f; + long long int i; + } tmp; - tmp.f = x; - tmp.i = (tmp.i + 0x4000000) & 0xfffffffff8000000LL; - double xh = tmp.f, xl = x - xh; + tmp.f = x; + tmp.i = (tmp.i + 0x4000000) & 0xfffffffff8000000LL; + double xh = tmp.f, xl = x - xh; - tmp.f = y; - tmp.i = (tmp.i + 0x4000000) & 0xfffffffff8000000LL; - double yh = tmp.f, yl = y - yh; + tmp.f = y; + tmp.i = (tmp.i + 0x4000000) & 0xfffffffff8000000LL; + double yh = tmp.f, yl = y - yh; - double h = x * y; - double l = xh * yh - h + xl * yh + xh * yl + xl * yl; + double h = x * y; + double l = xh * yh - h + xl * yh + xh * yl + xl * yl; - double h2, l2, v; + double h2, l2, v; - h2 = h + z; - v = h2 - h; - l2 = (h - (h2 - v)) + (z - v) + l; + h2 = h + z; + v = h2 - h; + l2 = (h - (h2 - v)) + (z - v) + l; - return h2 + l2; + return h2 + l2; } __inline double xsqrt(double d) { // max error : 0.5 ulp - double q = 1; + double q = 1; - if (d < 8.636168555094445E-78) { - d *= 1.157920892373162E77; - q = 2.9387358770557188E-39; - } + if (d < 8.636168555094445E-78) { + d *= 1.157920892373162E77; + q = 2.9387358770557188E-39; + } - // http://en.wikipedia.org/wiki/Fast_inverse_square_root - double x = longBitsToDouble(0x5fe6ec85e7de30da - (doubleToRawLongBits(d + 1e-320) >> 1)); + // http://en.wikipedia.org/wiki/Fast_inverse_square_root + double x = longBitsToDouble(0x5fe6ec85e7de30da - (doubleToRawLongBits(d + 1e-320) >> 1)); - x = x * (1.5 - 0.5 * d * x * x); - x = x * (1.5 - 0.5 * d * x * x); - x = x * (1.5 - 0.5 * d * x * x); + x = x * (1.5 - 0.5 * d * x * x); + x = x * (1.5 - 0.5 * d * x * x); + x = x * (1.5 - 0.5 * d * x * x); - // You can change xfma to fma if fma is correctly implemented - x = xfma(d * x, d * x, -d) * (x * -0.5) + d * x; + // You can change xfma to fma if fma is correctly implemented + x = xfma(d * x, d * x, -d) * (x * -0.5) + d * x; - return d == rtengine::RT_INFINITY ? rtengine::RT_INFINITY : x * q; + return d == rtengine::RT_INFINITY ? rtengine::RT_INFINITY : x * q; } __inline double xcbrt(double d) { // max error : 2 ulps - double x, y, q = 1.0; - int e, r; + double x, y, q = 1.0; + int e, r; - e = ilogbp1(d); - d = ldexpk(d, -e); - r = (e + 6144) % 3; - q = (r == 1) ? 1.2599210498948731647672106 : q; - q = (r == 2) ? 1.5874010519681994747517056 : q; - q = ldexpk(q, (e + 6144) / 3 - 2048); + e = ilogbp1(d); + d = ldexpk(d, -e); + r = (e + 6144) % 3; + q = (r == 1) ? 1.2599210498948731647672106 : q; + q = (r == 2) ? 1.5874010519681994747517056 : q; + q = ldexpk(q, (e + 6144) / 3 - 2048); - q = mulsign(q, d); - d = xfabs(d); + q = mulsign(q, d); + d = xfabs(d); - x = -0.640245898480692909870982; - x = x * d + 2.96155103020039511818595; - x = x * d + -5.73353060922947843636166; - x = x * d + 6.03990368989458747961407; - x = x * d + -3.85841935510444988821632; - x = x * d + 2.2307275302496609725722; + x = -0.640245898480692909870982; + x = x * d + 2.96155103020039511818595; + x = x * d + -5.73353060922947843636166; + x = x * d + 6.03990368989458747961407; + x = x * d + -3.85841935510444988821632; + x = x * d + 2.2307275302496609725722; - y = x * x; y = y * y; x -= (d * y - x) * (1.0 / 3.0); - y = d * x * x; - y = (y - (2.0 / 3.0) * y * (y * x - 1)) * q; + y = x * x; y = y * y; x -= (d * y - x) * (1.0 / 3.0); + y = d * x * x; + y = (y - (2.0 / 3.0) * y * (y * x - 1)) * q; - return y; + return y; } __inline double xexp2(double a) { - double u = expk(mul_ds(dd(0.69314718055994528623, 2.3190468138462995584e-17), a)); - if (xispinf(a)) u = rtengine::RT_INFINITY; - if (xisminf(a)) u = 0; - return u; + double u = expk(mul_ds(dd(0.69314718055994528623, 2.3190468138462995584e-17), a)); + if (xispinf(a)) u = rtengine::RT_INFINITY; + if (xisminf(a)) u = 0; + return u; } __inline double xexp10(double a) { - double u = expk(mul_ds(dd(2.3025850929940459011, -2.1707562233822493508e-16), a)); - if (xispinf(a)) u = rtengine::RT_INFINITY; - if (xisminf(a)) u = 0; - return u; + double u = expk(mul_ds(dd(2.3025850929940459011, -2.1707562233822493508e-16), a)); + if (xispinf(a)) u = rtengine::RT_INFINITY; + if (xisminf(a)) u = 0; + return u; } __inline double xexpm1(double a) { - double2 d = add2_ds(expk2(dd(a, 0)), -1.0); - double x = d.x + d.y; - if (xispinf(a)) x = rtengine::RT_INFINITY; - if (xisminf(a)) x = -1; - return x; + double2 d = add2_ds(expk2(dd(a, 0)), -1.0); + double x = d.x + d.y; + if (xispinf(a)) x = rtengine::RT_INFINITY; + if (xisminf(a)) x = -1; + return x; } __inline double xlog10(double a) { - double2 d = mul_dd(logk(a), dd(0.43429448190325176116, 6.6494347733425473126e-17)); - double x = d.x + d.y; + double2 d = mul_dd(logk(a), dd(0.43429448190325176116, 6.6494347733425473126e-17)); + double x = d.x + d.y; - if (xisinf(a)) x = rtengine::RT_INFINITY; - if (a < 0) x = rtengine::RT_NAN; - if (a == 0) x = -rtengine::RT_INFINITY; + if (xisinf(a)) x = rtengine::RT_INFINITY; + if (a < 0) x = rtengine::RT_NAN; + if (a == 0) x = -rtengine::RT_INFINITY; - return x; + return x; } __inline double xlog1p(double a) { - double2 d = logk2(add2_ss(a, 1)); - double x = d.x + d.y; + double2 d = logk2(add2_ss(a, 1)); + double x = d.x + d.y; - if (xisinf(a)) x = rtengine::RT_INFINITY; - if (a < -1) x = rtengine::RT_NAN; - if (a == -1) x = -rtengine::RT_INFINITY; + if (xisinf(a)) x = rtengine::RT_INFINITY; + if (a < -1) x = rtengine::RT_NAN; + if (a == -1) x = -rtengine::RT_INFINITY; - return x; + return x; } /////////////////////////////////////////// @@ -897,29 +897,29 @@ __inline double xlog1p(double a) { #define R_LN2f 1.442695040888963407359924681001892137426645954152985934135449406931f __inline int32_t floatToRawIntBits(float d) { - union { - float f; - int32_t i; - } tmp; - tmp.f = d; - return tmp.i; + union { + float f; + int32_t i; + } tmp; + tmp.f = d; + return tmp.i; } __inline float intBitsToFloat(int32_t i) { - union { - float f; - int32_t i; - } tmp; - tmp.i = i; - return tmp.f; + union { + float f; + int32_t i; + } tmp; + tmp.i = i; + return tmp.f; } __inline float xfabsf(float x) { - return intBitsToFloat(0x7fffffffL & floatToRawIntBits(x)); + return intBitsToFloat(0x7fffffffL & floatToRawIntBits(x)); } __inline float mulsignf(float x, float y) { - return intBitsToFloat(floatToRawIntBits(x) ^ (floatToRawIntBits(y) & (1 << 31))); + return intBitsToFloat(floatToRawIntBits(x) ^ (floatToRawIntBits(y) & (1 << 31))); } __inline float signf(float d) { return copysign(1, d); } @@ -931,337 +931,337 @@ __inline int xisminff(float x) { return x == -rtengine::RT_INFINITY_F; } __inline int xispinff(float x) { return x == rtengine::RT_INFINITY_F; } __inline int ilogbp1f(float d) { - int m = d < 5.421010862427522E-20f; - d = m ? 1.8446744073709552E19f * d : d; - int q = (floatToRawIntBits(d) >> 23) & 0xff; - q = m ? q - (64 + 0x7e) : q - 0x7e; - return q; + int m = d < 5.421010862427522E-20f; + d = m ? 1.8446744073709552E19f * d : d; + int q = (floatToRawIntBits(d) >> 23) & 0xff; + q = m ? q - (64 + 0x7e) : q - 0x7e; + return q; } __inline float ldexpkf(float x, int q) { - float u; - int m; - m = q >> 31; - m = (((m + q) >> 6) - m) << 4; - q = q - (m << 2); - u = intBitsToFloat(((int32_t)(m + 0x7f)) << 23); - u = u * u; - x = x * u * u; - u = intBitsToFloat(((int32_t)(q + 0x7f)) << 23); - return x * u; + float u; + int m; + m = q >> 31; + m = (((m + q) >> 6) - m) << 4; + q = q - (m << 2); + u = intBitsToFloat(((int32_t)(m + 0x7f)) << 23); + u = u * u; + x = x * u * u; + u = intBitsToFloat(((int32_t)(q + 0x7f)) << 23); + return x * u; } __inline float xcbrtf(float d) { // max error : 2 ulps - float x, y, q = 1.0f; - int e, r; + float x, y, q = 1.0f; + int e, r; - e = ilogbp1f(d); - d = ldexpkf(d, -e); - r = (e + 6144) % 3; - q = (r == 1) ? 1.2599210498948731647672106f : q; - q = (r == 2) ? 1.5874010519681994747517056f : q; - q = ldexpkf(q, (e + 6144) / 3 - 2048); + e = ilogbp1f(d); + d = ldexpkf(d, -e); + r = (e + 6144) % 3; + q = (r == 1) ? 1.2599210498948731647672106f : q; + q = (r == 2) ? 1.5874010519681994747517056f : q; + q = ldexpkf(q, (e + 6144) / 3 - 2048); - q = mulsignf(q, d); - d = xfabsf(d); + q = mulsignf(q, d); + d = xfabsf(d); - x = -0.601564466953277587890625f; - x = mlaf(x, d, 2.8208892345428466796875f); - x = mlaf(x, d, -5.532182216644287109375f); - x = mlaf(x, d, 5.898262500762939453125f); - x = mlaf(x, d, -3.8095417022705078125f); - x = mlaf(x, d, 2.2241256237030029296875f); + x = -0.601564466953277587890625f; + x = mlaf(x, d, 2.8208892345428466796875f); + x = mlaf(x, d, -5.532182216644287109375f); + x = mlaf(x, d, 5.898262500762939453125f); + x = mlaf(x, d, -3.8095417022705078125f); + x = mlaf(x, d, 2.2241256237030029296875f); - y = d * x * x; - y = (y - (2.0f / 3.0f) * y * (y * x - 1.0f)) * q; + y = d * x * x; + y = (y - (2.0f / 3.0f) * y * (y * x - 1.0f)) * q; - return y; + return y; } __inline float xsinf(float d) { - int q; - float u, s; + int q; + float u, s; - q = rint(d * rtengine::RT_1_PI_F); + q = rint(d * rtengine::RT_1_PI_F); - d = mlaf(q, -PI4_Af*4, d); - d = mlaf(q, -PI4_Bf*4, d); - d = mlaf(q, -PI4_Cf*4, d); - d = mlaf(q, -PI4_Df*4, d); + d = mlaf(q, -PI4_Af*4, d); + d = mlaf(q, -PI4_Bf*4, d); + d = mlaf(q, -PI4_Cf*4, d); + d = mlaf(q, -PI4_Df*4, d); - s = d * d; + s = d * d; - if ((q & 1) != 0) d = -d; + if ((q & 1) != 0) d = -d; - u = 2.6083159809786593541503e-06f; - u = mlaf(u, s, -0.0001981069071916863322258f); - u = mlaf(u, s, 0.00833307858556509017944336f); - u = mlaf(u, s, -0.166666597127914428710938f); + u = 2.6083159809786593541503e-06f; + u = mlaf(u, s, -0.0001981069071916863322258f); + u = mlaf(u, s, 0.00833307858556509017944336f); + u = mlaf(u, s, -0.166666597127914428710938f); - u = mlaf(s, u * d, d); + u = mlaf(s, u * d, d); - return u; + return u; } __inline float xcosf(float d) { #ifdef __SSE2__ - // faster than scalar version - return xcosf(_mm_set_ss(d))[0]; + // faster than scalar version + return xcosf(_mm_set_ss(d))[0]; #else - int q; - float u, s; + int q; + float u, s; - q = 1 + 2*rint(d * rtengine::RT_1_PI_F - 0.5f); + q = 1 + 2*rint(d * rtengine::RT_1_PI_F - 0.5f); - d = mlaf(q, -PI4_Af*2, d); - d = mlaf(q, -PI4_Bf*2, d); - d = mlaf(q, -PI4_Cf*2, d); - d = mlaf(q, -PI4_Df*2, d); + d = mlaf(q, -PI4_Af*2, d); + d = mlaf(q, -PI4_Bf*2, d); + d = mlaf(q, -PI4_Cf*2, d); + d = mlaf(q, -PI4_Df*2, d); - s = d * d; + s = d * d; - if ((q & 2) == 0) d = -d; + if ((q & 2) == 0) d = -d; - u = 2.6083159809786593541503e-06f; - u = mlaf(u, s, -0.0001981069071916863322258f); - u = mlaf(u, s, 0.00833307858556509017944336f); - u = mlaf(u, s, -0.166666597127914428710938f); + u = 2.6083159809786593541503e-06f; + u = mlaf(u, s, -0.0001981069071916863322258f); + u = mlaf(u, s, 0.00833307858556509017944336f); + u = mlaf(u, s, -0.166666597127914428710938f); - u = mlaf(s, u * d, d); + u = mlaf(s, u * d, d); - return u; + return u; #endif } __inline float2 xsincosf(float d) { #ifdef __SSE2__ - // faster than scalar version + // faster than scalar version vfloat2 res = xsincosf(_mm_set_ss(d)); return {res.x[0], res.y[0]}; #else - int q; - float u, s, t; - float2 r; + int q; + float u, s, t; + float2 r; - q = rint(d * rtengine::RT_2_PI_F); + q = rint(d * rtengine::RT_2_PI_F); - s = d; + s = d; - s = mlaf(q, -PI4_Af*2, s); - s = mlaf(q, -PI4_Bf*2, s); - s = mlaf(q, -PI4_Cf*2, s); - s = mlaf(q, -PI4_Df*2, s); + s = mlaf(q, -PI4_Af*2, s); + s = mlaf(q, -PI4_Bf*2, s); + s = mlaf(q, -PI4_Cf*2, s); + s = mlaf(q, -PI4_Df*2, s); - t = s; + t = s; - s = s * s; + s = s * s; - u = -0.000195169282960705459117889f; - u = mlaf(u, s, 0.00833215750753879547119141f); - u = mlaf(u, s, -0.166666537523269653320312f); - u = u * s * t; + u = -0.000195169282960705459117889f; + u = mlaf(u, s, 0.00833215750753879547119141f); + u = mlaf(u, s, -0.166666537523269653320312f); + u = u * s * t; - r.x = t + u; + r.x = t + u; - u = -2.71811842367242206819355e-07f; - u = mlaf(u, s, 2.47990446951007470488548e-05f); - u = mlaf(u, s, -0.00138888787478208541870117f); - u = mlaf(u, s, 0.0416666641831398010253906f); - u = mlaf(u, s, -0.5f); + u = -2.71811842367242206819355e-07f; + u = mlaf(u, s, 2.47990446951007470488548e-05f); + u = mlaf(u, s, -0.00138888787478208541870117f); + u = mlaf(u, s, 0.0416666641831398010253906f); + u = mlaf(u, s, -0.5f); - r.y = u * s + 1; + r.y = u * s + 1; - if ((q & 1) != 0) { s = r.y; r.y = r.x; r.x = s; } - if ((q & 2) != 0) { r.x = -r.x; } - if (((q+1) & 2) != 0) { r.y = -r.y; } + if ((q & 1) != 0) { s = r.y; r.y = r.x; r.x = s; } + if ((q & 2) != 0) { r.x = -r.x; } + if (((q+1) & 2) != 0) { r.y = -r.y; } - if (xisinff(d)) { r.x = r.y = rtengine::RT_NAN_F; } + if (xisinff(d)) { r.x = r.y = rtengine::RT_NAN_F; } - return r; + return r; #endif } __inline float xtanf(float d) { - int q; - float u, s, x; + int q; + float u, s, x; - q = rint(d * (float)(2 * rtengine::RT_1_PI)); + q = rint(d * (float)(2 * rtengine::RT_1_PI)); - x = d; + x = d; - x = mlaf(q, -PI4_Af*2, x); - x = mlaf(q, -PI4_Bf*2, x); - x = mlaf(q, -PI4_Cf*2, x); - x = mlaf(q, -PI4_Df*2, x); + x = mlaf(q, -PI4_Af*2, x); + x = mlaf(q, -PI4_Bf*2, x); + x = mlaf(q, -PI4_Cf*2, x); + x = mlaf(q, -PI4_Df*2, x); - s = x * x; + s = x * x; - if ((q & 1) != 0) x = -x; + if ((q & 1) != 0) x = -x; - u = 0.00927245803177356719970703f; - u = mlaf(u, s, 0.00331984995864331722259521f); - u = mlaf(u, s, 0.0242998078465461730957031f); - u = mlaf(u, s, 0.0534495301544666290283203f); - u = mlaf(u, s, 0.133383005857467651367188f); - u = mlaf(u, s, 0.333331853151321411132812f); + u = 0.00927245803177356719970703f; + u = mlaf(u, s, 0.00331984995864331722259521f); + u = mlaf(u, s, 0.0242998078465461730957031f); + u = mlaf(u, s, 0.0534495301544666290283203f); + u = mlaf(u, s, 0.133383005857467651367188f); + u = mlaf(u, s, 0.333331853151321411132812f); - u = mlaf(s, u * x, x); + u = mlaf(s, u * x, x); - if ((q & 1) != 0) u = 1.0f / u; + if ((q & 1) != 0) u = 1.0f / u; - if (xisinff(d)) u = rtengine::RT_NAN_F; + if (xisinff(d)) u = rtengine::RT_NAN_F; - return u; + return u; } __inline float xatanf(float s) { - float t, u; - int q = 0; + float t, u; + int q = 0; - if (s < 0) { s = -s; q = 2; } - if (s > 1) { s = 1.0f / s; q |= 1; } + if (s < 0) { s = -s; q = 2; } + if (s > 1) { s = 1.0f / s; q |= 1; } - t = s * s; + t = s * s; - u = 0.00282363896258175373077393f; - u = mlaf(u, t, -0.0159569028764963150024414f); - u = mlaf(u, t, 0.0425049886107444763183594f); - u = mlaf(u, t, -0.0748900920152664184570312f); - u = mlaf(u, t, 0.106347933411598205566406f); - u = mlaf(u, t, -0.142027363181114196777344f); - u = mlaf(u, t, 0.199926957488059997558594f); - u = mlaf(u, t, -0.333331018686294555664062f); + u = 0.00282363896258175373077393f; + u = mlaf(u, t, -0.0159569028764963150024414f); + u = mlaf(u, t, 0.0425049886107444763183594f); + u = mlaf(u, t, -0.0748900920152664184570312f); + u = mlaf(u, t, 0.106347933411598205566406f); + u = mlaf(u, t, -0.142027363181114196777344f); + u = mlaf(u, t, 0.199926957488059997558594f); + u = mlaf(u, t, -0.333331018686294555664062f); - t = s + s * (t * u); + t = s + s * (t * u); - if ((q & 1) != 0) t = 1.570796326794896557998982f - t; - if ((q & 2) != 0) t = -t; + if ((q & 1) != 0) t = 1.570796326794896557998982f - t; + if ((q & 2) != 0) t = -t; - return t; + return t; } __inline float atan2kf(float y, float x) { - float s, t, u; - float q = 0.f; + float s, t, u; + float q = 0.f; - if (x < 0) { x = -x; q = -2.f; } - if (y > x) { t = x; x = y; y = -t; q += 1.f; } + if (x < 0) { x = -x; q = -2.f; } + if (y > x) { t = x; x = y; y = -t; q += 1.f; } - s = y / x; - t = s * s; + s = y / x; + t = s * s; - u = 0.00282363896258175373077393f; - u = mlaf(u, t, -0.0159569028764963150024414f); - u = mlaf(u, t, 0.0425049886107444763183594f); - u = mlaf(u, t, -0.0748900920152664184570312f); - u = mlaf(u, t, 0.106347933411598205566406f); - u = mlaf(u, t, -0.142027363181114196777344f); - u = mlaf(u, t, 0.199926957488059997558594f); - u = mlaf(u, t, -0.333331018686294555664062f); + u = 0.00282363896258175373077393f; + u = mlaf(u, t, -0.0159569028764963150024414f); + u = mlaf(u, t, 0.0425049886107444763183594f); + u = mlaf(u, t, -0.0748900920152664184570312f); + u = mlaf(u, t, 0.106347933411598205566406f); + u = mlaf(u, t, -0.142027363181114196777344f); + u = mlaf(u, t, 0.199926957488059997558594f); + u = mlaf(u, t, -0.333331018686294555664062f); - t = u * t; - t = mlaf(t,s,s); - return mlaf(q,(float)(rtengine::RT_PI_F_2),t); + t = u * t; + t = mlaf(t,s,s); + return mlaf(q,(float)(rtengine::RT_PI_F_2),t); } __inline float xatan2f(float y, float x) { - float r = atan2kf(xfabsf(y), x); + float r = atan2kf(xfabsf(y), x); - r = mulsignf(r, x); - if (xisinff(x) || x == 0) r = rtengine::RT_PI_F/2 - (xisinff(x) ? (signf(x) * (float)(rtengine::RT_PI_F*.5f)) : 0); - if (xisinff(y) ) r = rtengine::RT_PI_F/2 - (xisinff(x) ? (signf(x) * (float)(rtengine::RT_PI_F*.25f)) : 0); - if ( y == 0) r = (signf(x) == -1 ? rtengine::RT_PI_F : 0); + r = mulsignf(r, x); + if (xisinff(x) || x == 0) r = rtengine::RT_PI_F/2 - (xisinff(x) ? (signf(x) * (float)(rtengine::RT_PI_F*.5f)) : 0); + if (xisinff(y) ) r = rtengine::RT_PI_F/2 - (xisinff(x) ? (signf(x) * (float)(rtengine::RT_PI_F*.25f)) : 0); + if ( y == 0) r = (signf(x) == -1 ? rtengine::RT_PI_F : 0); - return xisnanf(x) || xisnanf(y) ? rtengine::RT_NAN_F : mulsignf(r, y); + return xisnanf(x) || xisnanf(y) ? rtengine::RT_NAN_F : mulsignf(r, y); } __inline float xasinf(float d) { - return mulsignf(atan2kf(fabsf(d), sqrtf((1.0f+d)*(1.0f-d))), d); + return mulsignf(atan2kf(fabsf(d), sqrtf((1.0f+d)*(1.0f-d))), d); } __inline float xacosf(float d) { - return mulsignf(atan2kf(sqrtf((1.0f+d)*(1.0f-d)), fabsf(d)), d) + (d < 0 ? (float)rtengine::RT_PI : 0.0f); + return mulsignf(atan2kf(sqrtf((1.0f+d)*(1.0f-d)), fabsf(d)), d) + (d < 0 ? (float)rtengine::RT_PI : 0.0f); } __inline float xlogf(float d) { - float x, x2, t, m; - int e; + float x, x2, t, m; + int e; - e = ilogbp1f(d * 0.7071f); - m = ldexpkf(d, -e); + e = ilogbp1f(d * 0.7071f); + m = ldexpkf(d, -e); - x = (m-1.0f) / (m+1.0f); - x2 = x * x; + x = (m-1.0f) / (m+1.0f); + x2 = x * x; - t = 0.2371599674224853515625f; - t = mlaf(t, x2, 0.285279005765914916992188f); - t = mlaf(t, x2, 0.400005519390106201171875f); - t = mlaf(t, x2, 0.666666567325592041015625f); - t = mlaf(t, x2, 2.0f); + t = 0.2371599674224853515625f; + t = mlaf(t, x2, 0.285279005765914916992188f); + t = mlaf(t, x2, 0.400005519390106201171875f); + t = mlaf(t, x2, 0.666666567325592041015625f); + t = mlaf(t, x2, 2.0f); - x = x * t + 0.693147180559945286226764f * e; + x = x * t + 0.693147180559945286226764f * e; - if (xisinff(d)) x = rtengine::RT_INFINITY_F; - if (d < 0) x = rtengine::RT_NAN_F; - if (d == 0) x = -rtengine::RT_INFINITY_F; + if (xisinff(d)) x = rtengine::RT_INFINITY_F; + if (d < 0) x = rtengine::RT_NAN_F; + if (d == 0) x = -rtengine::RT_INFINITY_F; - return x; + return x; } __inline float xexpf(float d) { - if(d<=-104.0f) return 0.0f; + if(d<=-104.0f) return 0.0f; - int q = rint(d * R_LN2f); - float s, u; + int q = rint(d * R_LN2f); + float s, u; - s = mlaf(q, -L2Uf, d); - s = mlaf(q, -L2Lf, s); + s = mlaf(q, -L2Uf, d); + s = mlaf(q, -L2Lf, s); - u = 0.00136324646882712841033936f; - u = mlaf(u, s, 0.00836596917361021041870117f); - u = mlaf(u, s, 0.0416710823774337768554688f); - u = mlaf(u, s, 0.166665524244308471679688f); - u = mlaf(u, s, 0.499999850988388061523438f); + u = 0.00136324646882712841033936f; + u = mlaf(u, s, 0.00836596917361021041870117f); + u = mlaf(u, s, 0.0416710823774337768554688f); + u = mlaf(u, s, 0.166665524244308471679688f); + u = mlaf(u, s, 0.499999850988388061523438f); - u = mlaf( s, mlaf(s,u,1.f),1.f); - return ldexpkf(u, q); + u = mlaf( s, mlaf(s,u,1.f),1.f); + return ldexpkf(u, q); } __inline float xmul2f(float d) { - union { - float floatval; - int intval; - } uflint; - uflint.floatval = d; - if (uflint.intval & 0x7FFFFFFF) { // if f==0 do nothing - uflint.intval += 1 << 23; // add 1 to the exponent - } - return uflint.floatval; + union { + float floatval; + int intval; + } uflint; + uflint.floatval = d; + if (uflint.intval & 0x7FFFFFFF) { // if f==0 do nothing + uflint.intval += 1 << 23; // add 1 to the exponent + } + return uflint.floatval; } __inline float xdiv2f(float d) { - union { - float floatval; - int intval; - } uflint; - uflint.floatval = d; - if (uflint.intval & 0x7FFFFFFF) { // if f==0 do nothing - uflint.intval -= 1 << 23; // sub 1 from the exponent - } - return uflint.floatval; + union { + float floatval; + int intval; + } uflint; + uflint.floatval = d; + if (uflint.intval & 0x7FFFFFFF) { // if f==0 do nothing + uflint.intval -= 1 << 23; // sub 1 from the exponent + } + return uflint.floatval; } __inline float xdivf( float d, int n){ - union { - float floatval; - int intval; - } uflint; - uflint.floatval = d; - if (uflint.intval & 0x7FFFFFFF) { // if f==0 do nothing - uflint.intval -= n << 23; // add n to the exponent - } - return uflint.floatval; + union { + float floatval; + int intval; + } uflint; + uflint.floatval = d; + if (uflint.intval & 0x7FFFFFFF) { // if f==0 do nothing + uflint.intval -= n << 23; // add n to the exponent + } + return uflint.floatval; } __inline float xlin2log(float x, float base) diff --git a/rtengine/sleefsseavx.c b/rtengine/sleefsseavx.c index cce88df5d..1982c7c4c 100644 --- a/rtengine/sleefsseavx.c +++ b/rtengine/sleefsseavx.c @@ -48,199 +48,199 @@ #define NANf ((float)rtengine::RT_NAN) static INLINE vdouble vadd3(vdouble v0, vdouble v1, vdouble v2) { - return vadd(vadd(v0, v1), v2); + return vadd(vadd(v0, v1), v2); } static INLINE vdouble vadd4(vdouble v0, vdouble v1, vdouble v2, vdouble v3) { - return vadd3(vadd(v0, v1), v2, v3); + return vadd3(vadd(v0, v1), v2, v3); } static INLINE vdouble vadd5(vdouble v0, vdouble v1, vdouble v2, vdouble v3, vdouble v4) { - return vadd4(vadd(v0, v1), v2, v3, v4); + return vadd4(vadd(v0, v1), v2, v3, v4); } static INLINE vdouble vadd6(vdouble v0, vdouble v1, vdouble v2, vdouble v3, vdouble v4, vdouble v5) { - return vadd5(vadd(v0, v1), v2, v3, v4, v5); + return vadd5(vadd(v0, v1), v2, v3, v4, v5); } static INLINE vdouble vadd7(vdouble v0, vdouble v1, vdouble v2, vdouble v3, vdouble v4, vdouble v5, vdouble v6) { - return vadd6(vadd(v0, v1), v2, v3, v4, v5, v6); + return vadd6(vadd(v0, v1), v2, v3, v4, v5, v6); } static INLINE vdouble vsub3(vdouble v0, vdouble v1, vdouble v2) { - return vsub(vsub(v0, v1), v2); + return vsub(vsub(v0, v1), v2); } static INLINE vdouble vsub4(vdouble v0, vdouble v1, vdouble v2, vdouble v3) { - return vsub3(vsub(v0, v1), v2, v3); + return vsub3(vsub(v0, v1), v2, v3); } static INLINE vdouble vsub5(vdouble v0, vdouble v1, vdouble v2, vdouble v3, vdouble v4) { - return vsub4(vsub(v0, v1), v2, v3, v4); + return vsub4(vsub(v0, v1), v2, v3, v4); } // static INLINE vdouble2 normalize_d(vdouble2 t) { - vdouble2 s; + vdouble2 s; - s.x = vadd(t.x, t.y); - s.y = vadd(vsub(t.x, s.x), t.y); + s.x = vadd(t.x, t.y); + s.y = vadd(vsub(t.x, s.x), t.y); - return s; + return s; } static INLINE vdouble2 scale_d(vdouble2 d, vdouble s) { - vdouble2 r = {vmul(d.x, s), vmul(d.y, s)}; - return r; + vdouble2 r = {vmul(d.x, s), vmul(d.y, s)}; + return r; } static INLINE vdouble2 add_ss(vdouble x, vdouble y) { - vdouble2 r; + vdouble2 r; - r.x = vadd(x, y); - r.y = vadd(vsub(x, r.x), y); + r.x = vadd(x, y); + r.y = vadd(vsub(x, r.x), y); - return r; + return r; } static INLINE vdouble2 add2_ss(vdouble x, vdouble y) { - vdouble2 r; + vdouble2 r; - r.x = vadd(x, y); - vdouble v = vsub(r.x, x); - r.y = vadd(vsub(x, vsub(r.x, v)), vsub(y, v)); + r.x = vadd(x, y); + vdouble v = vsub(r.x, x); + r.y = vadd(vsub(x, vsub(r.x, v)), vsub(y, v)); - return r; + return r; } static INLINE vdouble2 add_ds(vdouble2 x, vdouble y) { - vdouble2 r; + vdouble2 r; - r.x = vadd(x.x, y); - r.y = vadd3(vsub(x.x, r.x), y, x.y); + r.x = vadd(x.x, y); + r.y = vadd3(vsub(x.x, r.x), y, x.y); - return r; + return r; } static INLINE vdouble2 add2_ds(vdouble2 x, vdouble y) { - vdouble2 r; + vdouble2 r; - r.x = vadd(x.x, y); - vdouble v = vsub(r.x, x.x); - r.y = vadd(vsub(x.x, vsub(r.x, v)), vsub(y, v)); - r.y = vadd(r.y, x.y); + r.x = vadd(x.x, y); + vdouble v = vsub(r.x, x.x); + r.y = vadd(vsub(x.x, vsub(r.x, v)), vsub(y, v)); + r.y = vadd(r.y, x.y); - return r; + return r; } static INLINE vdouble2 add_sd(vdouble x, vdouble2 y) { - vdouble2 r; + vdouble2 r; - r.x = vadd(x, y.x); - r.y = vadd3(vsub(x, r.x), y.x, y.y); + r.x = vadd(x, y.x); + r.y = vadd3(vsub(x, r.x), y.x, y.y); - return r; + return r; } static INLINE vdouble2 add_dd(vdouble2 x, vdouble2 y) { - // |x| >= |y| + // |x| >= |y| - vdouble2 r; + vdouble2 r; - r.x = vadd(x.x, y.x); - r.y = vadd4(vsub(x.x, r.x), y.x, x.y, y.y); + r.x = vadd(x.x, y.x); + r.y = vadd4(vsub(x.x, r.x), y.x, x.y, y.y); - return r; + return r; } static INLINE vdouble2 add2_dd(vdouble2 x, vdouble2 y) { - vdouble2 r; + vdouble2 r; - r.x = vadd(x.x, y.x); - vdouble v = vsub(r.x, x.x); - r.y = vadd(vsub(x.x, vsub(r.x, v)), vsub(y.x, v)); - r.y = vadd(r.y, vadd(x.y, y.y)); + r.x = vadd(x.x, y.x); + vdouble v = vsub(r.x, x.x); + r.y = vadd(vsub(x.x, vsub(r.x, v)), vsub(y.x, v)); + r.y = vadd(r.y, vadd(x.y, y.y)); - return r; + return r; } static INLINE vdouble2 div_dd(vdouble2 n, vdouble2 d) { - vdouble t = vrec(d.x); - vdouble dh = vupper(d.x), dl = vsub(d.x, dh); - vdouble th = vupper(t ), tl = vsub(t , th); - vdouble nhh = vupper(n.x), nhl = vsub(n.x, nhh); + vdouble t = vrec(d.x); + vdouble dh = vupper(d.x), dl = vsub(d.x, dh); + vdouble th = vupper(t ), tl = vsub(t , th); + vdouble nhh = vupper(n.x), nhl = vsub(n.x, nhh); - vdouble2 q; + vdouble2 q; - q.x = vmul(n.x, t); + q.x = vmul(n.x, t); - vdouble u = vadd5(vsub(vmul(nhh, th), q.x), vmul(nhh, tl), vmul(nhl, th), vmul(nhl, tl), - vmul(q.x, vsub5(vcast_vd_d(1), vmul(dh, th), vmul(dh, tl), vmul(dl, th), vmul(dl, tl)))); + vdouble u = vadd5(vsub(vmul(nhh, th), q.x), vmul(nhh, tl), vmul(nhl, th), vmul(nhl, tl), + vmul(q.x, vsub5(vcast_vd_d(1), vmul(dh, th), vmul(dh, tl), vmul(dl, th), vmul(dl, tl)))); - q.y = vadd(vmul(t, vsub(n.y, vmul(q.x, d.y))), u); + q.y = vadd(vmul(t, vsub(n.y, vmul(q.x, d.y))), u); - return q; + return q; } static INLINE vdouble2 mul_ss(vdouble x, vdouble y) { - vdouble xh = vupper(x), xl = vsub(x, xh); - vdouble yh = vupper(y), yl = vsub(y, yh); - vdouble2 r; + vdouble xh = vupper(x), xl = vsub(x, xh); + vdouble yh = vupper(y), yl = vsub(y, yh); + vdouble2 r; - r.x = vmul(x, y); - r.y = vadd5(vmul(xh, yh), vneg(r.x), vmul(xl, yh), vmul(xh, yl), vmul(xl, yl)); + r.x = vmul(x, y); + r.y = vadd5(vmul(xh, yh), vneg(r.x), vmul(xl, yh), vmul(xh, yl), vmul(xl, yl)); - return r; + return r; } static INLINE vdouble2 mul_ds(vdouble2 x, vdouble y) { - vdouble xh = vupper(x.x), xl = vsub(x.x, xh); - vdouble yh = vupper(y ), yl = vsub(y , yh); - vdouble2 r; + vdouble xh = vupper(x.x), xl = vsub(x.x, xh); + vdouble yh = vupper(y ), yl = vsub(y , yh); + vdouble2 r; - r.x = vmul(x.x, y); - r.y = vadd6(vmul(xh, yh), vneg(r.x), vmul(xl, yh), vmul(xh, yl), vmul(xl, yl), vmul(x.y, y)); + r.x = vmul(x.x, y); + r.y = vadd6(vmul(xh, yh), vneg(r.x), vmul(xl, yh), vmul(xh, yl), vmul(xl, yl), vmul(x.y, y)); - return r; + return r; } static INLINE vdouble2 mul_dd(vdouble2 x, vdouble2 y) { - vdouble xh = vupper(x.x), xl = vsub(x.x, xh); - vdouble yh = vupper(y.x), yl = vsub(y.x, yh); - vdouble2 r; + vdouble xh = vupper(x.x), xl = vsub(x.x, xh); + vdouble yh = vupper(y.x), yl = vsub(y.x, yh); + vdouble2 r; - r.x = vmul(x.x, y.x); - r.y = vadd7(vmul(xh, yh), vneg(r.x), vmul(xl, yh), vmul(xh, yl), vmul(xl, yl), vmul(x.x, y.y), vmul(x.y, y.x)); + r.x = vmul(x.x, y.x); + r.y = vadd7(vmul(xh, yh), vneg(r.x), vmul(xl, yh), vmul(xh, yl), vmul(xl, yl), vmul(x.x, y.y), vmul(x.y, y.x)); - return r; + return r; } static INLINE vdouble2 squ_d(vdouble2 x) { - vdouble xh = vupper(x.x), xl = vsub(x.x, xh); - vdouble2 r; + vdouble xh = vupper(x.x), xl = vsub(x.x, xh); + vdouble2 r; - r.x = vmul(x.x, x.x); - r.y = vadd5(vmul(xh, xh), vneg(r.x), vmul(vadd(xh, xh), xl), vmul(xl, xl), vmul(x.x, vadd(x.y, x.y))); + r.x = vmul(x.x, x.x); + r.y = vadd5(vmul(xh, xh), vneg(r.x), vmul(vadd(xh, xh), xl), vmul(xl, xl), vmul(x.x, vadd(x.y, x.y))); - return r; + return r; } static INLINE vdouble2 rec_s(vdouble d) { - vdouble t = vrec(d); - vdouble dh = vupper(d), dl = vsub(d, dh); - vdouble th = vupper(t), tl = vsub(t, th); - vdouble2 q; + vdouble t = vrec(d); + vdouble dh = vupper(d), dl = vsub(d, dh); + vdouble th = vupper(t), tl = vsub(t, th); + vdouble2 q; - q.x = t; - q.y = vmul(t, vsub5(vcast_vd_d(1), vmul(dh, th), vmul(dh, tl), vmul(dl, th), vmul(dl, tl))); + q.x = t; + q.y = vmul(t, vsub5(vcast_vd_d(1), vmul(dh, th), vmul(dh, tl), vmul(dl, th), vmul(dl, tl))); - return q; + return q; } static INLINE vdouble2 sqrt_d(vdouble2 d) { - vdouble t = vsqrt(vadd(d.x, d.y)); - return scale_d(mul_dd(add2_dd(d, mul_ss(t, t)), rec_s(t)), vcast_vd_d(0.5)); + vdouble t = vsqrt(vadd(d.x, d.y)); + return scale_d(mul_dd(add2_dd(d, mul_ss(t, t)), rec_s(t)), vcast_vd_d(0.5)); } // @@ -248,688 +248,688 @@ static INLINE vdouble2 sqrt_d(vdouble2 d) { static INLINE vdouble xldexp(vdouble x, vint q) { return vldexp(x, q); } static INLINE vint xilogb(vdouble d) { - vdouble e = vcast_vd_vi(vsubi(vilogbp1(vabs(d)), vcast_vi_i(1))); - e = vsel(vmask_eq(d, vcast_vd_d(0)), vcast_vd_d(-2147483648.0), e); - e = vsel(vmask_eq(vabs(d), vcast_vd_d(rtengine::RT_INFINITY)), vcast_vd_d(2147483647), e); - return vrint_vi_vd(e); + vdouble e = vcast_vd_vi(vsubi(vilogbp1(vabs(d)), vcast_vi_i(1))); + e = vsel(vmask_eq(d, vcast_vd_d(0)), vcast_vd_d(-2147483648.0), e); + e = vsel(vmask_eq(vabs(d), vcast_vd_d(rtengine::RT_INFINITY)), vcast_vd_d(2147483647), e); + return vrint_vi_vd(e); } static INLINE vdouble xsin(vdouble d) { - vint q; - vdouble u, s; + vint q; + vdouble u, s; - q = vrint_vi_vd(vmul(d, vcast_vd_d(rtengine::RT_1_PI))); + q = vrint_vi_vd(vmul(d, vcast_vd_d(rtengine::RT_1_PI))); - u = vcast_vd_vi(q); - d = vadd(d, vmul(u, vcast_vd_d(-PI4_A*4))); - d = vadd(d, vmul(u, vcast_vd_d(-PI4_B*4))); - d = vadd(d, vmul(u, vcast_vd_d(-PI4_C*4))); + u = vcast_vd_vi(q); + d = vadd(d, vmul(u, vcast_vd_d(-PI4_A*4))); + d = vadd(d, vmul(u, vcast_vd_d(-PI4_B*4))); + d = vadd(d, vmul(u, vcast_vd_d(-PI4_C*4))); - s = vmul(d, d); + s = vmul(d, d); - d = vsel(vmaski_eq(vandi(q, vcast_vi_i(1)), vcast_vi_i(1)), vneg(d), d); + d = vsel(vmaski_eq(vandi(q, vcast_vi_i(1)), vcast_vi_i(1)), vneg(d), d); - u = vcast_vd_d(-7.97255955009037868891952e-18); - u = vmla(u, s, vcast_vd_d(2.81009972710863200091251e-15)); - u = vmla(u, s, vcast_vd_d(-7.64712219118158833288484e-13)); - u = vmla(u, s, vcast_vd_d(1.60590430605664501629054e-10)); - u = vmla(u, s, vcast_vd_d(-2.50521083763502045810755e-08)); - u = vmla(u, s, vcast_vd_d(2.75573192239198747630416e-06)); - u = vmla(u, s, vcast_vd_d(-0.000198412698412696162806809)); - u = vmla(u, s, vcast_vd_d(0.00833333333333332974823815)); - u = vmla(u, s, vcast_vd_d(-0.166666666666666657414808)); + u = vcast_vd_d(-7.97255955009037868891952e-18); + u = vmla(u, s, vcast_vd_d(2.81009972710863200091251e-15)); + u = vmla(u, s, vcast_vd_d(-7.64712219118158833288484e-13)); + u = vmla(u, s, vcast_vd_d(1.60590430605664501629054e-10)); + u = vmla(u, s, vcast_vd_d(-2.50521083763502045810755e-08)); + u = vmla(u, s, vcast_vd_d(2.75573192239198747630416e-06)); + u = vmla(u, s, vcast_vd_d(-0.000198412698412696162806809)); + u = vmla(u, s, vcast_vd_d(0.00833333333333332974823815)); + u = vmla(u, s, vcast_vd_d(-0.166666666666666657414808)); - u = vmla(s, vmul(u, d), d); + u = vmla(s, vmul(u, d), d); - return u; + return u; } static INLINE vdouble xcos(vdouble d) { - vint q; - vdouble u, s; + vint q; + vdouble u, s; - q = vrint_vi_vd(vsub(vmul(d, vcast_vd_d(rtengine::RT_1_PI)), vcast_vd_d(0.5))); - q = vaddi(vaddi(q, q), vcast_vi_i(1)); + q = vrint_vi_vd(vsub(vmul(d, vcast_vd_d(rtengine::RT_1_PI)), vcast_vd_d(0.5))); + q = vaddi(vaddi(q, q), vcast_vi_i(1)); - u = vcast_vd_vi(q); - d = vadd(d, vmul(u, vcast_vd_d(-PI4_A*2))); - d = vadd(d, vmul(u, vcast_vd_d(-PI4_B*2))); - d = vadd(d, vmul(u, vcast_vd_d(-PI4_C*2))); + u = vcast_vd_vi(q); + d = vadd(d, vmul(u, vcast_vd_d(-PI4_A*2))); + d = vadd(d, vmul(u, vcast_vd_d(-PI4_B*2))); + d = vadd(d, vmul(u, vcast_vd_d(-PI4_C*2))); - s = vmul(d, d); + s = vmul(d, d); - d = vsel(vmaski_eq(vandi(q, vcast_vi_i(2)), vcast_vi_i(0)), vneg(d), d); + d = vsel(vmaski_eq(vandi(q, vcast_vi_i(2)), vcast_vi_i(0)), vneg(d), d); - u = vcast_vd_d(-7.97255955009037868891952e-18); - u = vmla(u, s, vcast_vd_d(2.81009972710863200091251e-15)); - u = vmla(u, s, vcast_vd_d(-7.64712219118158833288484e-13)); - u = vmla(u, s, vcast_vd_d(1.60590430605664501629054e-10)); - u = vmla(u, s, vcast_vd_d(-2.50521083763502045810755e-08)); - u = vmla(u, s, vcast_vd_d(2.75573192239198747630416e-06)); - u = vmla(u, s, vcast_vd_d(-0.000198412698412696162806809)); - u = vmla(u, s, vcast_vd_d(0.00833333333333332974823815)); - u = vmla(u, s, vcast_vd_d(-0.166666666666666657414808)); + u = vcast_vd_d(-7.97255955009037868891952e-18); + u = vmla(u, s, vcast_vd_d(2.81009972710863200091251e-15)); + u = vmla(u, s, vcast_vd_d(-7.64712219118158833288484e-13)); + u = vmla(u, s, vcast_vd_d(1.60590430605664501629054e-10)); + u = vmla(u, s, vcast_vd_d(-2.50521083763502045810755e-08)); + u = vmla(u, s, vcast_vd_d(2.75573192239198747630416e-06)); + u = vmla(u, s, vcast_vd_d(-0.000198412698412696162806809)); + u = vmla(u, s, vcast_vd_d(0.00833333333333332974823815)); + u = vmla(u, s, vcast_vd_d(-0.166666666666666657414808)); - u = vmla(s, vmul(u, d), d); + u = vmla(s, vmul(u, d), d); - return u; + return u; } static INLINE vdouble2 xsincos(vdouble d) { - vint q; - vmask m; - vdouble u, s, t, rx, ry; - vdouble2 r; + vint q; + vmask m; + vdouble u, s, t, rx, ry; + vdouble2 r; - q = vrint_vi_vd(vmul(d, vcast_vd_d(rtengine::RT_2_PI))); + q = vrint_vi_vd(vmul(d, vcast_vd_d(rtengine::RT_2_PI))); - s = d; + s = d; - u = vcast_vd_vi(q); - s = vmla(u, vcast_vd_d(-PI4_A*2), s); - s = vmla(u, vcast_vd_d(-PI4_B*2), s); - s = vmla(u, vcast_vd_d(-PI4_C*2), s); + u = vcast_vd_vi(q); + s = vmla(u, vcast_vd_d(-PI4_A*2), s); + s = vmla(u, vcast_vd_d(-PI4_B*2), s); + s = vmla(u, vcast_vd_d(-PI4_C*2), s); - t = s; + t = s; - s = vmul(s, s); + s = vmul(s, s); - u = vcast_vd_d(1.58938307283228937328511e-10); - u = vmla(u, s, vcast_vd_d(-2.50506943502539773349318e-08)); - u = vmla(u, s, vcast_vd_d(2.75573131776846360512547e-06)); - u = vmla(u, s, vcast_vd_d(-0.000198412698278911770864914)); - u = vmla(u, s, vcast_vd_d(0.0083333333333191845961746)); - u = vmla(u, s, vcast_vd_d(-0.166666666666666130709393)); - u = vmul(vmul(u, s), t); + u = vcast_vd_d(1.58938307283228937328511e-10); + u = vmla(u, s, vcast_vd_d(-2.50506943502539773349318e-08)); + u = vmla(u, s, vcast_vd_d(2.75573131776846360512547e-06)); + u = vmla(u, s, vcast_vd_d(-0.000198412698278911770864914)); + u = vmla(u, s, vcast_vd_d(0.0083333333333191845961746)); + u = vmla(u, s, vcast_vd_d(-0.166666666666666130709393)); + u = vmul(vmul(u, s), t); - rx = vadd(t, u); + rx = vadd(t, u); - u = vcast_vd_d(-1.13615350239097429531523e-11); - u = vmla(u, s, vcast_vd_d(2.08757471207040055479366e-09)); - u = vmla(u, s, vcast_vd_d(-2.75573144028847567498567e-07)); - u = vmla(u, s, vcast_vd_d(2.48015872890001867311915e-05)); - u = vmla(u, s, vcast_vd_d(-0.00138888888888714019282329)); - u = vmla(u, s, vcast_vd_d(0.0416666666666665519592062)); - u = vmla(u, s, vcast_vd_d(-0.5)); + u = vcast_vd_d(-1.13615350239097429531523e-11); + u = vmla(u, s, vcast_vd_d(2.08757471207040055479366e-09)); + u = vmla(u, s, vcast_vd_d(-2.75573144028847567498567e-07)); + u = vmla(u, s, vcast_vd_d(2.48015872890001867311915e-05)); + u = vmla(u, s, vcast_vd_d(-0.00138888888888714019282329)); + u = vmla(u, s, vcast_vd_d(0.0416666666666665519592062)); + u = vmla(u, s, vcast_vd_d(-0.5)); - ry = vadd(vcast_vd_d(1), vmul(s, u)); + ry = vadd(vcast_vd_d(1), vmul(s, u)); - m = vmaski_eq(vandi(q, vcast_vi_i(1)), vcast_vi_i(0)); - r.x = vsel(m, rx, ry); - r.y = vsel(m, ry, rx); + m = vmaski_eq(vandi(q, vcast_vi_i(1)), vcast_vi_i(0)); + r.x = vsel(m, rx, ry); + r.y = vsel(m, ry, rx); - m = vmaski_eq(vandi(q, vcast_vi_i(2)), vcast_vi_i(2)); - r.x = vreinterpret_vd_vm(vxorm(vandm(m, vreinterpret_vm_vd(vcast_vd_d(-0.0))), vreinterpret_vm_vd(r.x))); + m = vmaski_eq(vandi(q, vcast_vi_i(2)), vcast_vi_i(2)); + r.x = vreinterpret_vd_vm(vxorm(vandm(m, vreinterpret_vm_vd(vcast_vd_d(-0.0))), vreinterpret_vm_vd(r.x))); - m = vmaski_eq(vandi(vaddi(q, vcast_vi_i(1)), vcast_vi_i(2)), vcast_vi_i(2)); - r.y = vreinterpret_vd_vm(vxorm(vandm(m, vreinterpret_vm_vd(vcast_vd_d(-0.0))), vreinterpret_vm_vd(r.y))); + m = vmaski_eq(vandi(vaddi(q, vcast_vi_i(1)), vcast_vi_i(2)), vcast_vi_i(2)); + r.y = vreinterpret_vd_vm(vxorm(vandm(m, vreinterpret_vm_vd(vcast_vd_d(-0.0))), vreinterpret_vm_vd(r.y))); - m = vmask_isinf(d); - r.x = vsel(m, vcast_vd_d(rtengine::RT_NAN), r.x); - r.y = vsel(m, vcast_vd_d(rtengine::RT_NAN), r.y); + m = vmask_isinf(d); + r.x = vsel(m, vcast_vd_d(rtengine::RT_NAN), r.x); + r.y = vsel(m, vcast_vd_d(rtengine::RT_NAN), r.y); - return r; + return r; } static INLINE vdouble xtan(vdouble d) { - vint q; - vdouble u, s, x; - vmask m; + vint q; + vdouble u, s, x; + vmask m; - q = vrint_vi_vd(vmul(d, vcast_vd_d(rtengine::RT_2_PI))); + q = vrint_vi_vd(vmul(d, vcast_vd_d(rtengine::RT_2_PI))); - u = vcast_vd_vi(q); - x = vadd(d, vmul(u, vcast_vd_d(-PI4_A*2))); - x = vadd(x, vmul(u, vcast_vd_d(-PI4_B*2))); - x = vadd(x, vmul(u, vcast_vd_d(-PI4_C*2))); + u = vcast_vd_vi(q); + x = vadd(d, vmul(u, vcast_vd_d(-PI4_A*2))); + x = vadd(x, vmul(u, vcast_vd_d(-PI4_B*2))); + x = vadd(x, vmul(u, vcast_vd_d(-PI4_C*2))); - s = vmul(x, x); + s = vmul(x, x); - m = vmaski_eq(vandi(q, vcast_vi_i(1)), vcast_vi_i(1)); - x = vsel(m, vneg(x), x); + m = vmaski_eq(vandi(q, vcast_vi_i(1)), vcast_vi_i(1)); + x = vsel(m, vneg(x), x); - u = vcast_vd_d(1.01419718511083373224408e-05); - u = vmla(u, s, vcast_vd_d(-2.59519791585924697698614e-05)); - u = vmla(u, s, vcast_vd_d(5.23388081915899855325186e-05)); - u = vmla(u, s, vcast_vd_d(-3.05033014433946488225616e-05)); - u = vmla(u, s, vcast_vd_d(7.14707504084242744267497e-05)); - u = vmla(u, s, vcast_vd_d(8.09674518280159187045078e-05)); - u = vmla(u, s, vcast_vd_d(0.000244884931879331847054404)); - u = vmla(u, s, vcast_vd_d(0.000588505168743587154904506)); - u = vmla(u, s, vcast_vd_d(0.00145612788922812427978848)); - u = vmla(u, s, vcast_vd_d(0.00359208743836906619142924)); - u = vmla(u, s, vcast_vd_d(0.00886323944362401618113356)); - u = vmla(u, s, vcast_vd_d(0.0218694882853846389592078)); - u = vmla(u, s, vcast_vd_d(0.0539682539781298417636002)); - u = vmla(u, s, vcast_vd_d(0.133333333333125941821962)); - u = vmla(u, s, vcast_vd_d(0.333333333333334980164153)); + u = vcast_vd_d(1.01419718511083373224408e-05); + u = vmla(u, s, vcast_vd_d(-2.59519791585924697698614e-05)); + u = vmla(u, s, vcast_vd_d(5.23388081915899855325186e-05)); + u = vmla(u, s, vcast_vd_d(-3.05033014433946488225616e-05)); + u = vmla(u, s, vcast_vd_d(7.14707504084242744267497e-05)); + u = vmla(u, s, vcast_vd_d(8.09674518280159187045078e-05)); + u = vmla(u, s, vcast_vd_d(0.000244884931879331847054404)); + u = vmla(u, s, vcast_vd_d(0.000588505168743587154904506)); + u = vmla(u, s, vcast_vd_d(0.00145612788922812427978848)); + u = vmla(u, s, vcast_vd_d(0.00359208743836906619142924)); + u = vmla(u, s, vcast_vd_d(0.00886323944362401618113356)); + u = vmla(u, s, vcast_vd_d(0.0218694882853846389592078)); + u = vmla(u, s, vcast_vd_d(0.0539682539781298417636002)); + u = vmla(u, s, vcast_vd_d(0.133333333333125941821962)); + u = vmla(u, s, vcast_vd_d(0.333333333333334980164153)); - u = vmla(s, vmul(u, x), x); + u = vmla(s, vmul(u, x), x); - u = vsel(m, vrec(u), u); + u = vsel(m, vrec(u), u); - u = vsel(vmask_isinf(d), vcast_vd_d(rtengine::RT_NAN), u); + u = vsel(vmask_isinf(d), vcast_vd_d(rtengine::RT_NAN), u); - return u; + return u; } static INLINE vdouble atan2k(vdouble y, vdouble x) { - vdouble s, t, u; - vint q; - vmask p; + vdouble s, t, u; + vint q; + vmask p; - q = vseli_lt(x, vcast_vd_d(0), vcast_vi_i(-2), vcast_vi_i(0)); - x = vabs(x); + q = vseli_lt(x, vcast_vd_d(0), vcast_vi_i(-2), vcast_vi_i(0)); + x = vabs(x); - q = vseli_lt(x, y, vaddi(q, vcast_vi_i(1)), q); - p = vmask_lt(x, y); - s = vsel (p, vneg(x), y); - t = vmax (x, y); + q = vseli_lt(x, y, vaddi(q, vcast_vi_i(1)), q); + p = vmask_lt(x, y); + s = vsel (p, vneg(x), y); + t = vmax (x, y); - s = vdiv(s, t); - t = vmul(s, s); + s = vdiv(s, t); + t = vmul(s, s); - u = vcast_vd_d(-1.88796008463073496563746e-05); - u = vmla(u, t, vcast_vd_d(0.000209850076645816976906797)); - u = vmla(u, t, vcast_vd_d(-0.00110611831486672482563471)); - u = vmla(u, t, vcast_vd_d(0.00370026744188713119232403)); - u = vmla(u, t, vcast_vd_d(-0.00889896195887655491740809)); - u = vmla(u, t, vcast_vd_d(0.016599329773529201970117)); - u = vmla(u, t, vcast_vd_d(-0.0254517624932312641616861)); - u = vmla(u, t, vcast_vd_d(0.0337852580001353069993897)); - u = vmla(u, t, vcast_vd_d(-0.0407629191276836500001934)); - u = vmla(u, t, vcast_vd_d(0.0466667150077840625632675)); - u = vmla(u, t, vcast_vd_d(-0.0523674852303482457616113)); - u = vmla(u, t, vcast_vd_d(0.0587666392926673580854313)); - u = vmla(u, t, vcast_vd_d(-0.0666573579361080525984562)); - u = vmla(u, t, vcast_vd_d(0.0769219538311769618355029)); - u = vmla(u, t, vcast_vd_d(-0.090908995008245008229153)); - u = vmla(u, t, vcast_vd_d(0.111111105648261418443745)); - u = vmla(u, t, vcast_vd_d(-0.14285714266771329383765)); - u = vmla(u, t, vcast_vd_d(0.199999999996591265594148)); - u = vmla(u, t, vcast_vd_d(-0.333333333333311110369124)); + u = vcast_vd_d(-1.88796008463073496563746e-05); + u = vmla(u, t, vcast_vd_d(0.000209850076645816976906797)); + u = vmla(u, t, vcast_vd_d(-0.00110611831486672482563471)); + u = vmla(u, t, vcast_vd_d(0.00370026744188713119232403)); + u = vmla(u, t, vcast_vd_d(-0.00889896195887655491740809)); + u = vmla(u, t, vcast_vd_d(0.016599329773529201970117)); + u = vmla(u, t, vcast_vd_d(-0.0254517624932312641616861)); + u = vmla(u, t, vcast_vd_d(0.0337852580001353069993897)); + u = vmla(u, t, vcast_vd_d(-0.0407629191276836500001934)); + u = vmla(u, t, vcast_vd_d(0.0466667150077840625632675)); + u = vmla(u, t, vcast_vd_d(-0.0523674852303482457616113)); + u = vmla(u, t, vcast_vd_d(0.0587666392926673580854313)); + u = vmla(u, t, vcast_vd_d(-0.0666573579361080525984562)); + u = vmla(u, t, vcast_vd_d(0.0769219538311769618355029)); + u = vmla(u, t, vcast_vd_d(-0.090908995008245008229153)); + u = vmla(u, t, vcast_vd_d(0.111111105648261418443745)); + u = vmla(u, t, vcast_vd_d(-0.14285714266771329383765)); + u = vmla(u, t, vcast_vd_d(0.199999999996591265594148)); + u = vmla(u, t, vcast_vd_d(-0.333333333333311110369124)); - t = vadd(s, vmul(s, vmul(t, u))); - t = vadd(t, vmul(vcast_vd_vi(q), vcast_vd_d(rtengine::RT_PI/2))); + t = vadd(s, vmul(s, vmul(t, u))); + t = vadd(t, vmul(vcast_vd_vi(q), vcast_vd_d(rtengine::RT_PI/2))); - return t; + return t; } static INLINE vdouble xatan2(vdouble y, vdouble x) { - vdouble r = atan2k(vabs(y), x); + vdouble r = atan2k(vabs(y), x); - r = vmulsign(r, x); - r = vsel(vorm(vmask_isinf(x), vmask_eq(x, vcast_vd_d(0))), vsub(vcast_vd_d(rtengine::RT_PI/2), visinf2(x, vmulsign(vcast_vd_d(rtengine::RT_PI/2), x))), r); - r = vsel(vmask_isinf(y), vsub(vcast_vd_d(rtengine::RT_PI/2), visinf2(x, vmulsign(vcast_vd_d(rtengine::RT_PI/4), x))), r); - r = vsel(vmask_eq(y, vcast_vd_d(0)), vsel(vmask_eq(vsign(x), vcast_vd_d(-1.0)), vcast_vd_d(rtengine::RT_PI), vcast_vd_d(0)), r); + r = vmulsign(r, x); + r = vsel(vorm(vmask_isinf(x), vmask_eq(x, vcast_vd_d(0))), vsub(vcast_vd_d(rtengine::RT_PI/2), visinf2(x, vmulsign(vcast_vd_d(rtengine::RT_PI/2), x))), r); + r = vsel(vmask_isinf(y), vsub(vcast_vd_d(rtengine::RT_PI/2), visinf2(x, vmulsign(vcast_vd_d(rtengine::RT_PI/4), x))), r); + r = vsel(vmask_eq(y, vcast_vd_d(0)), vsel(vmask_eq(vsign(x), vcast_vd_d(-1.0)), vcast_vd_d(rtengine::RT_PI), vcast_vd_d(0)), r); - return vsel(vorm(vmask_isnan(x), vmask_isnan(y)), vcast_vd_d(rtengine::RT_NAN), vmulsign(r, y)); + return vsel(vorm(vmask_isnan(x), vmask_isnan(y)), vcast_vd_d(rtengine::RT_NAN), vmulsign(r, y)); } static INLINE vdouble xasin(vdouble d) { - vdouble x, y; - x = vadd(vcast_vd_d(1), d); - y = vsub(vcast_vd_d(1), d); - x = vmul(x, y); - x = vsqrt(x); - x = vsel(vmask_isnan(x), vcast_vd_d(rtengine::RT_NAN), atan2k(vabs(d), x)); - return vmulsign(x, d); + vdouble x, y; + x = vadd(vcast_vd_d(1), d); + y = vsub(vcast_vd_d(1), d); + x = vmul(x, y); + x = vsqrt(x); + x = vsel(vmask_isnan(x), vcast_vd_d(rtengine::RT_NAN), atan2k(vabs(d), x)); + return vmulsign(x, d); } static INLINE vdouble xacos(vdouble d) { - vdouble x, y; - x = vadd(vcast_vd_d(1), d); - y = vsub(vcast_vd_d(1), d); - x = vmul(x, y); - x = vsqrt(x); - x = vmulsign(atan2k(x, vabs(d)), d); - y = (vdouble)vandm(vmask_lt(d, vcast_vd_d(0)), (vmask)vcast_vd_d(rtengine::RT_PI)); - x = vadd(x, y); - return x; + vdouble x, y; + x = vadd(vcast_vd_d(1), d); + y = vsub(vcast_vd_d(1), d); + x = vmul(x, y); + x = vsqrt(x); + x = vmulsign(atan2k(x, vabs(d)), d); + y = (vdouble)vandm(vmask_lt(d, vcast_vd_d(0)), (vmask)vcast_vd_d(rtengine::RT_PI)); + x = vadd(x, y); + return x; } static INLINE vdouble xatan(vdouble s) { - vdouble t, u; - vint q; + vdouble t, u; + vint q; - q = vseli_lt(s, vcast_vd_d(0), vcast_vi_i(2), vcast_vi_i(0)); - s = vabs(s); + q = vseli_lt(s, vcast_vd_d(0), vcast_vi_i(2), vcast_vi_i(0)); + s = vabs(s); - q = vseli_lt(vcast_vd_d(1), s, vaddi(q, vcast_vi_i(1)), q); - s = vsel(vmask_lt(vcast_vd_d(1), s), vdiv(vcast_vd_d(1), s), s); + q = vseli_lt(vcast_vd_d(1), s, vaddi(q, vcast_vi_i(1)), q); + s = vsel(vmask_lt(vcast_vd_d(1), s), vdiv(vcast_vd_d(1), s), s); - t = vmul(s, s); + t = vmul(s, s); - u = vcast_vd_d(-1.88796008463073496563746e-05); - u = vmla(u, t, vcast_vd_d(0.000209850076645816976906797)); - u = vmla(u, t, vcast_vd_d(-0.00110611831486672482563471)); - u = vmla(u, t, vcast_vd_d(0.00370026744188713119232403)); - u = vmla(u, t, vcast_vd_d(-0.00889896195887655491740809)); - u = vmla(u, t, vcast_vd_d(0.016599329773529201970117)); - u = vmla(u, t, vcast_vd_d(-0.0254517624932312641616861)); - u = vmla(u, t, vcast_vd_d(0.0337852580001353069993897)); - u = vmla(u, t, vcast_vd_d(-0.0407629191276836500001934)); - u = vmla(u, t, vcast_vd_d(0.0466667150077840625632675)); - u = vmla(u, t, vcast_vd_d(-0.0523674852303482457616113)); - u = vmla(u, t, vcast_vd_d(0.0587666392926673580854313)); - u = vmla(u, t, vcast_vd_d(-0.0666573579361080525984562)); - u = vmla(u, t, vcast_vd_d(0.0769219538311769618355029)); - u = vmla(u, t, vcast_vd_d(-0.090908995008245008229153)); - u = vmla(u, t, vcast_vd_d(0.111111105648261418443745)); - u = vmla(u, t, vcast_vd_d(-0.14285714266771329383765)); - u = vmla(u, t, vcast_vd_d(0.199999999996591265594148)); - u = vmla(u, t, vcast_vd_d(-0.333333333333311110369124)); + u = vcast_vd_d(-1.88796008463073496563746e-05); + u = vmla(u, t, vcast_vd_d(0.000209850076645816976906797)); + u = vmla(u, t, vcast_vd_d(-0.00110611831486672482563471)); + u = vmla(u, t, vcast_vd_d(0.00370026744188713119232403)); + u = vmla(u, t, vcast_vd_d(-0.00889896195887655491740809)); + u = vmla(u, t, vcast_vd_d(0.016599329773529201970117)); + u = vmla(u, t, vcast_vd_d(-0.0254517624932312641616861)); + u = vmla(u, t, vcast_vd_d(0.0337852580001353069993897)); + u = vmla(u, t, vcast_vd_d(-0.0407629191276836500001934)); + u = vmla(u, t, vcast_vd_d(0.0466667150077840625632675)); + u = vmla(u, t, vcast_vd_d(-0.0523674852303482457616113)); + u = vmla(u, t, vcast_vd_d(0.0587666392926673580854313)); + u = vmla(u, t, vcast_vd_d(-0.0666573579361080525984562)); + u = vmla(u, t, vcast_vd_d(0.0769219538311769618355029)); + u = vmla(u, t, vcast_vd_d(-0.090908995008245008229153)); + u = vmla(u, t, vcast_vd_d(0.111111105648261418443745)); + u = vmla(u, t, vcast_vd_d(-0.14285714266771329383765)); + u = vmla(u, t, vcast_vd_d(0.199999999996591265594148)); + u = vmla(u, t, vcast_vd_d(-0.333333333333311110369124)); - t = vadd(s, vmul(s, vmul(t, u))); + t = vadd(s, vmul(s, vmul(t, u))); - t = vsel(vmaski_eq(vandi(q, vcast_vi_i(1)), vcast_vi_i(1)), vsub(vcast_vd_d(rtengine::RT_PI/2), t), t); - t = vsel(vmaski_eq(vandi(q, vcast_vi_i(2)), vcast_vi_i(2)), vneg(t), t); + t = vsel(vmaski_eq(vandi(q, vcast_vi_i(1)), vcast_vi_i(1)), vsub(vcast_vd_d(rtengine::RT_PI/2), t), t); + t = vsel(vmaski_eq(vandi(q, vcast_vi_i(2)), vcast_vi_i(2)), vneg(t), t); - return t; + return t; } static INLINE vdouble xlog(vdouble d) { - vdouble x, x2; - vdouble t, m; - vint e; + vdouble x, x2; + vdouble t, m; + vint e; - e = vilogbp1(vmul(d, vcast_vd_d(0.7071))); - m = vldexp(d, vsubi(vcast_vi_i(0), e)); + e = vilogbp1(vmul(d, vcast_vd_d(0.7071))); + m = vldexp(d, vsubi(vcast_vi_i(0), e)); - x = vdiv(vadd(vcast_vd_d(-1), m), vadd(vcast_vd_d(1), m)); - x2 = vmul(x, x); + x = vdiv(vadd(vcast_vd_d(-1), m), vadd(vcast_vd_d(1), m)); + x2 = vmul(x, x); - t = vcast_vd_d(0.148197055177935105296783); - t = vmla(t, x2, vcast_vd_d(0.153108178020442575739679)); - t = vmla(t, x2, vcast_vd_d(0.181837339521549679055568)); - t = vmla(t, x2, vcast_vd_d(0.22222194152736701733275)); - t = vmla(t, x2, vcast_vd_d(0.285714288030134544449368)); - t = vmla(t, x2, vcast_vd_d(0.399999999989941956712869)); - t = vmla(t, x2, vcast_vd_d(0.666666666666685503450651)); - t = vmla(t, x2, vcast_vd_d(2)); + t = vcast_vd_d(0.148197055177935105296783); + t = vmla(t, x2, vcast_vd_d(0.153108178020442575739679)); + t = vmla(t, x2, vcast_vd_d(0.181837339521549679055568)); + t = vmla(t, x2, vcast_vd_d(0.22222194152736701733275)); + t = vmla(t, x2, vcast_vd_d(0.285714288030134544449368)); + t = vmla(t, x2, vcast_vd_d(0.399999999989941956712869)); + t = vmla(t, x2, vcast_vd_d(0.666666666666685503450651)); + t = vmla(t, x2, vcast_vd_d(2)); - x = vadd(vmul(x, t), vmul(vcast_vd_d(0.693147180559945286226764), vcast_vd_vi(e))); + x = vadd(vmul(x, t), vmul(vcast_vd_d(0.693147180559945286226764), vcast_vd_vi(e))); - x = vsel(vmask_ispinf(d), vcast_vd_d(rtengine::RT_INFINITY), x); - x = vsel(vmask_gt(vcast_vd_d(0), d), vcast_vd_d(rtengine::RT_NAN), x); - x = vsel(vmask_eq(d, vcast_vd_d(0)), vcast_vd_d(-rtengine::RT_INFINITY), x); + x = vsel(vmask_ispinf(d), vcast_vd_d(rtengine::RT_INFINITY), x); + x = vsel(vmask_gt(vcast_vd_d(0), d), vcast_vd_d(rtengine::RT_NAN), x); + x = vsel(vmask_eq(d, vcast_vd_d(0)), vcast_vd_d(-rtengine::RT_INFINITY), x); - return x; + return x; } static INLINE vdouble xexp(vdouble d) { - vint q = vrint_vi_vd(vmul(d, vcast_vd_d(R_LN2))); - vdouble s, u; + vint q = vrint_vi_vd(vmul(d, vcast_vd_d(R_LN2))); + vdouble s, u; - s = vadd(d, vmul(vcast_vd_vi(q), vcast_vd_d(-L2U))); - s = vadd(s, vmul(vcast_vd_vi(q), vcast_vd_d(-L2L))); + s = vadd(d, vmul(vcast_vd_vi(q), vcast_vd_d(-L2U))); + s = vadd(s, vmul(vcast_vd_vi(q), vcast_vd_d(-L2L))); - u = vcast_vd_d(2.08860621107283687536341e-09); - u = vmla(u, s, vcast_vd_d(2.51112930892876518610661e-08)); - u = vmla(u, s, vcast_vd_d(2.75573911234900471893338e-07)); - u = vmla(u, s, vcast_vd_d(2.75572362911928827629423e-06)); - u = vmla(u, s, vcast_vd_d(2.4801587159235472998791e-05)); - u = vmla(u, s, vcast_vd_d(0.000198412698960509205564975)); - u = vmla(u, s, vcast_vd_d(0.00138888888889774492207962)); - u = vmla(u, s, vcast_vd_d(0.00833333333331652721664984)); - u = vmla(u, s, vcast_vd_d(0.0416666666666665047591422)); - u = vmla(u, s, vcast_vd_d(0.166666666666666851703837)); - u = vmla(u, s, vcast_vd_d(0.5)); + u = vcast_vd_d(2.08860621107283687536341e-09); + u = vmla(u, s, vcast_vd_d(2.51112930892876518610661e-08)); + u = vmla(u, s, vcast_vd_d(2.75573911234900471893338e-07)); + u = vmla(u, s, vcast_vd_d(2.75572362911928827629423e-06)); + u = vmla(u, s, vcast_vd_d(2.4801587159235472998791e-05)); + u = vmla(u, s, vcast_vd_d(0.000198412698960509205564975)); + u = vmla(u, s, vcast_vd_d(0.00138888888889774492207962)); + u = vmla(u, s, vcast_vd_d(0.00833333333331652721664984)); + u = vmla(u, s, vcast_vd_d(0.0416666666666665047591422)); + u = vmla(u, s, vcast_vd_d(0.166666666666666851703837)); + u = vmla(u, s, vcast_vd_d(0.5)); - u = vadd(vcast_vd_d(1), vadd(s, vmul(vmul(s, s), u))); + u = vadd(vcast_vd_d(1), vadd(s, vmul(vmul(s, s), u))); - u = vldexp(u, q); + u = vldexp(u, q); - u = vsel(vmask_isminf(d), vcast_vd_d(0), u); + u = vsel(vmask_isminf(d), vcast_vd_d(0), u); - return u; + return u; } static INLINE vdouble2 logk(vdouble d) { - vdouble2 x, x2; - vdouble t, m; - vint e; + vdouble2 x, x2; + vdouble t, m; + vint e; - e = vilogbp1(vmul(d, vcast_vd_d(0.7071))); - m = vldexp(d, vsubi(vcast_vi_i(0), e)); + e = vilogbp1(vmul(d, vcast_vd_d(0.7071))); + m = vldexp(d, vsubi(vcast_vi_i(0), e)); - x = div_dd(add2_ss(vcast_vd_d(-1), m), add2_ss(vcast_vd_d(1), m)); - x2 = squ_d(x); - x2 = normalize_d(x2); + x = div_dd(add2_ss(vcast_vd_d(-1), m), add2_ss(vcast_vd_d(1), m)); + x2 = squ_d(x); + x2 = normalize_d(x2); - t = vcast_vd_d(0.134601987501262130076155); - t = vmla(t, x2.x, vcast_vd_d(0.132248509032032670243288)); - t = vmla(t, x2.x, vcast_vd_d(0.153883458318096079652524)); - t = vmla(t, x2.x, vcast_vd_d(0.181817427573705403298686)); - t = vmla(t, x2.x, vcast_vd_d(0.222222231326187414840781)); - t = vmla(t, x2.x, vcast_vd_d(0.285714285651261412873718)); - t = vmla(t, x2.x, vcast_vd_d(0.400000000000222439910458)); - t = vmla(t, x2.x, vcast_vd_d(0.666666666666666371239645)); + t = vcast_vd_d(0.134601987501262130076155); + t = vmla(t, x2.x, vcast_vd_d(0.132248509032032670243288)); + t = vmla(t, x2.x, vcast_vd_d(0.153883458318096079652524)); + t = vmla(t, x2.x, vcast_vd_d(0.181817427573705403298686)); + t = vmla(t, x2.x, vcast_vd_d(0.222222231326187414840781)); + t = vmla(t, x2.x, vcast_vd_d(0.285714285651261412873718)); + t = vmla(t, x2.x, vcast_vd_d(0.400000000000222439910458)); + t = vmla(t, x2.x, vcast_vd_d(0.666666666666666371239645)); - return add2_dd(mul_ds(dd(vcast_vd_d(0.693147180559945286226764), vcast_vd_d(2.319046813846299558417771e-17)), - vcast_vd_vi(e)), - add2_dd(scale_d(x, vcast_vd_d(2)), mul_ds(mul_dd(x2, x), t))); + return add2_dd(mul_ds(dd(vcast_vd_d(0.693147180559945286226764), vcast_vd_d(2.319046813846299558417771e-17)), + vcast_vd_vi(e)), + add2_dd(scale_d(x, vcast_vd_d(2)), mul_ds(mul_dd(x2, x), t))); } static INLINE vdouble expk(vdouble2 d) { - vdouble u = vmul(vadd(d.x, d.y), vcast_vd_d(R_LN2)); - vint q = vrint_vi_vd(u); - vdouble2 s, t; + vdouble u = vmul(vadd(d.x, d.y), vcast_vd_d(R_LN2)); + vint q = vrint_vi_vd(u); + vdouble2 s, t; - s = add2_ds(d, vmul(vcast_vd_vi(q), vcast_vd_d(-L2U))); - s = add2_ds(s, vmul(vcast_vd_vi(q), vcast_vd_d(-L2L))); + s = add2_ds(d, vmul(vcast_vd_vi(q), vcast_vd_d(-L2U))); + s = add2_ds(s, vmul(vcast_vd_vi(q), vcast_vd_d(-L2L))); - q = vrint_vi_vd(vmin(vmax(vcast_vd_d(-2047.49), u), vcast_vd_d(2047.49))); + q = vrint_vi_vd(vmin(vmax(vcast_vd_d(-2047.49), u), vcast_vd_d(2047.49))); - s = normalize_d(s); + s = normalize_d(s); - u = vcast_vd_d(2.51069683420950419527139e-08); - u = vmla(u, s.x, vcast_vd_d(2.76286166770270649116855e-07)); - u = vmla(u, s.x, vcast_vd_d(2.75572496725023574143864e-06)); - u = vmla(u, s.x, vcast_vd_d(2.48014973989819794114153e-05)); - u = vmla(u, s.x, vcast_vd_d(0.000198412698809069797676111)); - u = vmla(u, s.x, vcast_vd_d(0.0013888888939977128960529)); - u = vmla(u, s.x, vcast_vd_d(0.00833333333332371417601081)); - u = vmla(u, s.x, vcast_vd_d(0.0416666666665409524128449)); - u = vmla(u, s.x, vcast_vd_d(0.166666666666666740681535)); - u = vmla(u, s.x, vcast_vd_d(0.500000000000000999200722)); + u = vcast_vd_d(2.51069683420950419527139e-08); + u = vmla(u, s.x, vcast_vd_d(2.76286166770270649116855e-07)); + u = vmla(u, s.x, vcast_vd_d(2.75572496725023574143864e-06)); + u = vmla(u, s.x, vcast_vd_d(2.48014973989819794114153e-05)); + u = vmla(u, s.x, vcast_vd_d(0.000198412698809069797676111)); + u = vmla(u, s.x, vcast_vd_d(0.0013888888939977128960529)); + u = vmla(u, s.x, vcast_vd_d(0.00833333333332371417601081)); + u = vmla(u, s.x, vcast_vd_d(0.0416666666665409524128449)); + u = vmla(u, s.x, vcast_vd_d(0.166666666666666740681535)); + u = vmla(u, s.x, vcast_vd_d(0.500000000000000999200722)); - t = add_dd(s, mul_ds(squ_d(s), u)); + t = add_dd(s, mul_ds(squ_d(s), u)); - t = add_sd(vcast_vd_d(1), t); - u = vadd(t.x, t.y); - u = vldexp(u, q); + t = add_sd(vcast_vd_d(1), t); + u = vadd(t.x, t.y); + u = vldexp(u, q); - return u; + return u; } static INLINE vdouble xpow(vdouble x, vdouble y) { #if 1 - vmask yisint = vmask_eq(vcast_vd_vi(vrint_vi_vd(y)), y); - vmask yisodd = vandm(vmaski_eq(vandi(vrint_vi_vd(y), vcast_vi_i(1)), vcast_vi_i(1)), yisint); + vmask yisint = vmask_eq(vcast_vd_vi(vrint_vi_vd(y)), y); + vmask yisodd = vandm(vmaski_eq(vandi(vrint_vi_vd(y), vcast_vi_i(1)), vcast_vi_i(1)), yisint); - vdouble result = expk(mul_ds(logk(vabs(x)), y)); + vdouble result = expk(mul_ds(logk(vabs(x)), y)); - //result = vsel(vmask_isnan(result), vcast_vd_d(rtengine::RT_INFINITY), result); + //result = vsel(vmask_isnan(result), vcast_vd_d(rtengine::RT_INFINITY), result); - result = vmul(result, - vsel(vmask_gt(x, vcast_vd_d(0)), - vcast_vd_d(1), - vsel(yisint, - vsel(yisodd, - vcast_vd_d(-1), - vcast_vd_d(1)), - vcast_vd_d(rtengine::RT_NAN)))); + result = vmul(result, + vsel(vmask_gt(x, vcast_vd_d(0)), + vcast_vd_d(1), + vsel(yisint, + vsel(yisodd, + vcast_vd_d(-1), + vcast_vd_d(1)), + vcast_vd_d(rtengine::RT_NAN)))); - vdouble efx = vreinterpret_vd_vm(vxorm(vreinterpret_vm_vd(vsub(vabs(x), vcast_vd_d(1))), vsignbit(y))); + vdouble efx = vreinterpret_vd_vm(vxorm(vreinterpret_vm_vd(vsub(vabs(x), vcast_vd_d(1))), vsignbit(y))); - result = vsel(vmask_isinf(y), - vsel(vmask_lt(efx, vcast_vd_d(0)), - vcast_vd_d(0), - vsel(vmask_eq(efx, vcast_vd_d(0)), - vcast_vd_d(1.0), - vcast_vd_d(rtengine::RT_INFINITY))), - result); + result = vsel(vmask_isinf(y), + vsel(vmask_lt(efx, vcast_vd_d(0)), + vcast_vd_d(0), + vsel(vmask_eq(efx, vcast_vd_d(0)), + vcast_vd_d(1.0), + vcast_vd_d(rtengine::RT_INFINITY))), + result); - result = vsel(vorm(vmask_isinf(x), vmask_eq(x, vcast_vd_d(0))), - vmul(vsel(yisodd, vsign(x), vcast_vd_d(1)), - vsel(vmask_lt(vsel(vmask_eq(x, vcast_vd_d(0)), vneg(y), y), vcast_vd_d(0)), - vcast_vd_d(0), - vcast_vd_d(rtengine::RT_INFINITY))), - result); + result = vsel(vorm(vmask_isinf(x), vmask_eq(x, vcast_vd_d(0))), + vmul(vsel(yisodd, vsign(x), vcast_vd_d(1)), + vsel(vmask_lt(vsel(vmask_eq(x, vcast_vd_d(0)), vneg(y), y), vcast_vd_d(0)), + vcast_vd_d(0), + vcast_vd_d(rtengine::RT_INFINITY))), + result); - result = vsel(vorm(vmask_isnan(x), vmask_isnan(y)), vcast_vd_d(rtengine::RT_NAN), result); + result = vsel(vorm(vmask_isnan(x), vmask_isnan(y)), vcast_vd_d(rtengine::RT_NAN), result); - result = vsel(vorm(vmask_eq(y, vcast_vd_d(0)), vmask_eq(x, vcast_vd_d(1))), vcast_vd_d(1), result); + result = vsel(vorm(vmask_eq(y, vcast_vd_d(0)), vmask_eq(x, vcast_vd_d(1))), vcast_vd_d(1), result); - return result; + return result; #else - return expk(mul_ds(logk(x), y)); + return expk(mul_ds(logk(x), y)); #endif } static INLINE vdouble2 expk2(vdouble2 d) { - vdouble u = vmul(vadd(d.x, d.y), vcast_vd_d(R_LN2)); - vint q = vrint_vi_vd(u); - vdouble2 s, t; + vdouble u = vmul(vadd(d.x, d.y), vcast_vd_d(R_LN2)); + vint q = vrint_vi_vd(u); + vdouble2 s, t; - s = add2_ds(d, vmul(vcast_vd_vi(q), vcast_vd_d(-L2U))); - s = add2_ds(s, vmul(vcast_vd_vi(q), vcast_vd_d(-L2L))); + s = add2_ds(d, vmul(vcast_vd_vi(q), vcast_vd_d(-L2U))); + s = add2_ds(s, vmul(vcast_vd_vi(q), vcast_vd_d(-L2L))); - q = vrint_vi_vd(vmin(vmax(vcast_vd_d(-2047.49), u), vcast_vd_d(2047.49))); + q = vrint_vi_vd(vmin(vmax(vcast_vd_d(-2047.49), u), vcast_vd_d(2047.49))); - s = normalize_d(s); + s = normalize_d(s); - u = vcast_vd_d(2.51069683420950419527139e-08); - u = vmla(u, s.x, vcast_vd_d(2.76286166770270649116855e-07)); - u = vmla(u, s.x, vcast_vd_d(2.75572496725023574143864e-06)); - u = vmla(u, s.x, vcast_vd_d(2.48014973989819794114153e-05)); - u = vmla(u, s.x, vcast_vd_d(0.000198412698809069797676111)); - u = vmla(u, s.x, vcast_vd_d(0.0013888888939977128960529)); - u = vmla(u, s.x, vcast_vd_d(0.00833333333332371417601081)); - u = vmla(u, s.x, vcast_vd_d(0.0416666666665409524128449)); - u = vmla(u, s.x, vcast_vd_d(0.166666666666666740681535)); - u = vmla(u, s.x, vcast_vd_d(0.500000000000000999200722)); + u = vcast_vd_d(2.51069683420950419527139e-08); + u = vmla(u, s.x, vcast_vd_d(2.76286166770270649116855e-07)); + u = vmla(u, s.x, vcast_vd_d(2.75572496725023574143864e-06)); + u = vmla(u, s.x, vcast_vd_d(2.48014973989819794114153e-05)); + u = vmla(u, s.x, vcast_vd_d(0.000198412698809069797676111)); + u = vmla(u, s.x, vcast_vd_d(0.0013888888939977128960529)); + u = vmla(u, s.x, vcast_vd_d(0.00833333333332371417601081)); + u = vmla(u, s.x, vcast_vd_d(0.0416666666665409524128449)); + u = vmla(u, s.x, vcast_vd_d(0.166666666666666740681535)); + u = vmla(u, s.x, vcast_vd_d(0.500000000000000999200722)); - t = add_dd(s, mul_ds(squ_d(s), u)); + t = add_dd(s, mul_ds(squ_d(s), u)); - t = add_sd(vcast_vd_d(1), t); + t = add_sd(vcast_vd_d(1), t); - return dd(vldexp(t.x, q), vldexp(t.y, q)); + return dd(vldexp(t.x, q), vldexp(t.y, q)); } static INLINE vdouble xsinh(vdouble x) { - vdouble y = vabs(x); - vdouble2 d = expk2(dd(y, vcast_vd_d(0))); - d = add2_dd(d, div_dd(dd(vcast_vd_d(-1), vcast_vd_d(0)), d)); - y = vmul(vadd(d.x, d.y), vcast_vd_d(0.5)); + vdouble y = vabs(x); + vdouble2 d = expk2(dd(y, vcast_vd_d(0))); + d = add2_dd(d, div_dd(dd(vcast_vd_d(-1), vcast_vd_d(0)), d)); + y = vmul(vadd(d.x, d.y), vcast_vd_d(0.5)); - y = vsel(vorm(vmask_isinf(x), vmask_isnan(y)), vcast_vd_d(rtengine::RT_INFINITY), y); - y = vmulsign(y, x); - y = vsel(vmask_isnan(x), vcast_vd_d(rtengine::RT_NAN), y); + y = vsel(vorm(vmask_isinf(x), vmask_isnan(y)), vcast_vd_d(rtengine::RT_INFINITY), y); + y = vmulsign(y, x); + y = vsel(vmask_isnan(x), vcast_vd_d(rtengine::RT_NAN), y); - return y; + return y; } static INLINE vdouble xcosh(vdouble x) { - vdouble2 d = expk2(dd(x, vcast_vd_d(0))); - d = add2_dd(d, div_dd(dd(vcast_vd_d(1), vcast_vd_d(0)), d)); - vdouble y = vmul(vadd(d.x, d.y), vcast_vd_d(0.5)); + vdouble2 d = expk2(dd(x, vcast_vd_d(0))); + d = add2_dd(d, div_dd(dd(vcast_vd_d(1), vcast_vd_d(0)), d)); + vdouble y = vmul(vadd(d.x, d.y), vcast_vd_d(0.5)); - y = vsel(vorm(vmask_isinf(x), vmask_isnan(y)), vcast_vd_d(rtengine::RT_INFINITY), y); - y = vsel(vmask_isnan(x), vcast_vd_d(rtengine::RT_NAN), y); + y = vsel(vorm(vmask_isinf(x), vmask_isnan(y)), vcast_vd_d(rtengine::RT_INFINITY), y); + y = vsel(vmask_isnan(x), vcast_vd_d(rtengine::RT_NAN), y); - return y; + return y; } static INLINE vdouble xtanh(vdouble x) { - vdouble y = vabs(x); - vdouble2 d = expk2(dd(y, vcast_vd_d(0))); - vdouble2 e = div_dd(dd(vcast_vd_d(1), vcast_vd_d(0)), d); - d = div_dd(add2_dd(d, scale_d(e, vcast_vd_d(-1))), add2_dd(d, e)); - y = d.x + d.y; + vdouble y = vabs(x); + vdouble2 d = expk2(dd(y, vcast_vd_d(0))); + vdouble2 e = div_dd(dd(vcast_vd_d(1), vcast_vd_d(0)), d); + d = div_dd(add2_dd(d, scale_d(e, vcast_vd_d(-1))), add2_dd(d, e)); + y = d.x + d.y; - y = vsel(vorm(vmask_isinf(x), vmask_isnan(y)), vcast_vd_d(1.0), y); - y = vmulsign(y, x); - y = vsel(vmask_isnan(x), vcast_vd_d(rtengine::RT_NAN), y); + y = vsel(vorm(vmask_isinf(x), vmask_isnan(y)), vcast_vd_d(1.0), y); + y = vmulsign(y, x); + y = vsel(vmask_isnan(x), vcast_vd_d(rtengine::RT_NAN), y); - return y; + return y; } static INLINE vdouble2 logk2(vdouble2 d) { - vdouble2 x, x2, m; - vdouble t; - vint e; + vdouble2 x, x2, m; + vdouble t; + vint e; - d = normalize_d(d); - e = vilogbp1(vmul(d.x, vcast_vd_d(0.7071))); - m = scale_d(d, vldexp(vcast_vd_d(1), vsubi(vcast_vi_i(0), e))); + d = normalize_d(d); + e = vilogbp1(vmul(d.x, vcast_vd_d(0.7071))); + m = scale_d(d, vldexp(vcast_vd_d(1), vsubi(vcast_vi_i(0), e))); - x = div_dd(add2_ds(m, vcast_vd_d(-1)), add2_ds(m, vcast_vd_d(1))); - x2 = squ_d(x); - x2 = normalize_d(x2); + x = div_dd(add2_ds(m, vcast_vd_d(-1)), add2_ds(m, vcast_vd_d(1))); + x2 = squ_d(x); + x2 = normalize_d(x2); - t = vcast_vd_d(0.134601987501262130076155); - t = vmla(t, x2.x, vcast_vd_d(0.132248509032032670243288)); - t = vmla(t, x2.x, vcast_vd_d(0.153883458318096079652524)); - t = vmla(t, x2.x, vcast_vd_d(0.181817427573705403298686)); - t = vmla(t, x2.x, vcast_vd_d(0.222222231326187414840781)); - t = vmla(t, x2.x, vcast_vd_d(0.285714285651261412873718)); - t = vmla(t, x2.x, vcast_vd_d(0.400000000000222439910458)); - t = vmla(t, x2.x, vcast_vd_d(0.666666666666666371239645)); + t = vcast_vd_d(0.134601987501262130076155); + t = vmla(t, x2.x, vcast_vd_d(0.132248509032032670243288)); + t = vmla(t, x2.x, vcast_vd_d(0.153883458318096079652524)); + t = vmla(t, x2.x, vcast_vd_d(0.181817427573705403298686)); + t = vmla(t, x2.x, vcast_vd_d(0.222222231326187414840781)); + t = vmla(t, x2.x, vcast_vd_d(0.285714285651261412873718)); + t = vmla(t, x2.x, vcast_vd_d(0.400000000000222439910458)); + t = vmla(t, x2.x, vcast_vd_d(0.666666666666666371239645)); - return add2_dd(mul_ds(dd(vcast_vd_d(0.693147180559945286226764), vcast_vd_d(2.319046813846299558417771e-17)), - vcast_vd_vi(e)), - add2_dd(scale_d(x, vcast_vd_d(2)), mul_ds(mul_dd(x2, x), t))); + return add2_dd(mul_ds(dd(vcast_vd_d(0.693147180559945286226764), vcast_vd_d(2.319046813846299558417771e-17)), + vcast_vd_vi(e)), + add2_dd(scale_d(x, vcast_vd_d(2)), mul_ds(mul_dd(x2, x), t))); } static INLINE vdouble xasinh(vdouble x) { - vdouble y = vabs(x); - vdouble2 d = logk2(add2_ds(sqrt_d(add2_ds(mul_ss(y, y), vcast_vd_d(1))), y)); - y = vadd(d.x, d.y); + vdouble y = vabs(x); + vdouble2 d = logk2(add2_ds(sqrt_d(add2_ds(mul_ss(y, y), vcast_vd_d(1))), y)); + y = vadd(d.x, d.y); - y = vsel(vorm(vmask_isinf(x), vmask_isnan(y)), vcast_vd_d(rtengine::RT_INFINITY), y); - y = vmulsign(y, x); - y = vsel(vmask_isnan(x), vcast_vd_d(rtengine::RT_NAN), y); + y = vsel(vorm(vmask_isinf(x), vmask_isnan(y)), vcast_vd_d(rtengine::RT_INFINITY), y); + y = vmulsign(y, x); + y = vsel(vmask_isnan(x), vcast_vd_d(rtengine::RT_NAN), y); - return y; + return y; } static INLINE vdouble xacosh(vdouble x) { - vdouble2 d = logk2(add2_ds(sqrt_d(add2_ds(mul_ss(x, x), vcast_vd_d(-1))), x)); - vdouble y = vadd(d.x, d.y); + vdouble2 d = logk2(add2_ds(sqrt_d(add2_ds(mul_ss(x, x), vcast_vd_d(-1))), x)); + vdouble y = vadd(d.x, d.y); - y = vsel(vorm(vmask_isinf(x), vmask_isnan(y)), vcast_vd_d(rtengine::RT_INFINITY), y); - y = vsel(vmask_eq(x, vcast_vd_d(1.0)), vcast_vd_d(0.0), y); - y = vsel(vmask_lt(x, vcast_vd_d(1.0)), vcast_vd_d(rtengine::RT_NAN), y); - y = vsel(vmask_isnan(x), vcast_vd_d(rtengine::RT_NAN), y); + y = vsel(vorm(vmask_isinf(x), vmask_isnan(y)), vcast_vd_d(rtengine::RT_INFINITY), y); + y = vsel(vmask_eq(x, vcast_vd_d(1.0)), vcast_vd_d(0.0), y); + y = vsel(vmask_lt(x, vcast_vd_d(1.0)), vcast_vd_d(rtengine::RT_NAN), y); + y = vsel(vmask_isnan(x), vcast_vd_d(rtengine::RT_NAN), y); - return y; + return y; } static INLINE vdouble xatanh(vdouble x) { - vdouble y = vabs(x); - vdouble2 d = logk2(div_dd(add2_ss(vcast_vd_d(1), y), add2_ss(vcast_vd_d(1), -y))); - y = vsel(vmask_gt(y, vcast_vd_d(1.0)), vcast_vd_d(rtengine::RT_NAN), vsel(vmask_eq(y, vcast_vd_d(1.0)), vcast_vd_d(rtengine::RT_INFINITY), vmul(vadd(d.x, d.y), vcast_vd_d(0.5)))); + vdouble y = vabs(x); + vdouble2 d = logk2(div_dd(add2_ss(vcast_vd_d(1), y), add2_ss(vcast_vd_d(1), -y))); + y = vsel(vmask_gt(y, vcast_vd_d(1.0)), vcast_vd_d(rtengine::RT_NAN), vsel(vmask_eq(y, vcast_vd_d(1.0)), vcast_vd_d(rtengine::RT_INFINITY), vmul(vadd(d.x, d.y), vcast_vd_d(0.5)))); - y = vsel(vorm(vmask_isinf(x), vmask_isnan(y)), vcast_vd_d(rtengine::RT_NAN), y); - y = vmulsign(y, x); - y = vsel(vmask_isnan(x), vcast_vd_d(rtengine::RT_NAN), y); + y = vsel(vorm(vmask_isinf(x), vmask_isnan(y)), vcast_vd_d(rtengine::RT_NAN), y); + y = vmulsign(y, x); + y = vsel(vmask_isnan(x), vcast_vd_d(rtengine::RT_NAN), y); - return y; + return y; } static INLINE vdouble xcbrt(vdouble d) { - vdouble x, y, q = vcast_vd_d(1.0); - vint e, qu, re; - vdouble t; + vdouble x, y, q = vcast_vd_d(1.0); + vint e, qu, re; + vdouble t; - e = vilogbp1(vabs(d)); - d = vldexp(d, vsubi(vcast_vi_i(0), e)); + e = vilogbp1(vabs(d)); + d = vldexp(d, vsubi(vcast_vi_i(0), e)); - t = vadd(vcast_vd_vi(e), vcast_vd_d(6144)); - qu = vtruncate_vi_vd(vdiv(t, vcast_vd_d(3))); - re = vtruncate_vi_vd(vsub(t, vmul(vcast_vd_vi(qu), vcast_vd_d(3)))); + t = vadd(vcast_vd_vi(e), vcast_vd_d(6144)); + qu = vtruncate_vi_vd(vdiv(t, vcast_vd_d(3))); + re = vtruncate_vi_vd(vsub(t, vmul(vcast_vd_vi(qu), vcast_vd_d(3)))); - q = vsel(vmaski_eq(re, vcast_vi_i(1)), vcast_vd_d(1.2599210498948731647672106), q); - q = vsel(vmaski_eq(re, vcast_vi_i(2)), vcast_vd_d(1.5874010519681994747517056), q); - q = vldexp(q, vsubi(qu, vcast_vi_i(2048))); + q = vsel(vmaski_eq(re, vcast_vi_i(1)), vcast_vd_d(1.2599210498948731647672106), q); + q = vsel(vmaski_eq(re, vcast_vi_i(2)), vcast_vd_d(1.5874010519681994747517056), q); + q = vldexp(q, vsubi(qu, vcast_vi_i(2048))); - q = vmulsign(q, d); + q = vmulsign(q, d); - d = vabs(d); + d = vabs(d); - x = vcast_vd_d(-0.640245898480692909870982); - x = vmla(x, d, vcast_vd_d(2.96155103020039511818595)); - x = vmla(x, d, vcast_vd_d(-5.73353060922947843636166)); - x = vmla(x, d, vcast_vd_d(6.03990368989458747961407)); - x = vmla(x, d, vcast_vd_d(-3.85841935510444988821632)); - x = vmla(x, d, vcast_vd_d(2.2307275302496609725722)); + x = vcast_vd_d(-0.640245898480692909870982); + x = vmla(x, d, vcast_vd_d(2.96155103020039511818595)); + x = vmla(x, d, vcast_vd_d(-5.73353060922947843636166)); + x = vmla(x, d, vcast_vd_d(6.03990368989458747961407)); + x = vmla(x, d, vcast_vd_d(-3.85841935510444988821632)); + x = vmla(x, d, vcast_vd_d(2.2307275302496609725722)); - y = vmul(x, x); y = vmul(y, y); x = vsub(x, vmul(vmla(d, y, vneg(x)), vcast_vd_d(1.0 / 3.0))); - y = vmul(vmul(d, x), x); - y = vmul(vsub(y, vmul(vmul(vcast_vd_d(2.0 / 3.0), y), vmla(y, x, vcast_vd_d(-1.0)))), q); + y = vmul(x, x); y = vmul(y, y); x = vsub(x, vmul(vmla(d, y, vneg(x)), vcast_vd_d(1.0 / 3.0))); + y = vmul(vmul(d, x), x); + y = vmul(vsub(y, vmul(vmul(vcast_vd_d(2.0 / 3.0), y), vmla(y, x, vcast_vd_d(-1.0)))), q); - return y; + return y; } static INLINE vdouble xexp2(vdouble a) { - vdouble u = expk(mul_ds(dd(vcast_vd_d(0.69314718055994528623), vcast_vd_d(2.3190468138462995584e-17)), a)); - u = vsel(vmask_ispinf(a), vcast_vd_d(rtengine::RT_INFINITY), u); - u = vsel(vmask_isminf(a), vcast_vd_d(0), u); - return u; + vdouble u = expk(mul_ds(dd(vcast_vd_d(0.69314718055994528623), vcast_vd_d(2.3190468138462995584e-17)), a)); + u = vsel(vmask_ispinf(a), vcast_vd_d(rtengine::RT_INFINITY), u); + u = vsel(vmask_isminf(a), vcast_vd_d(0), u); + return u; } static INLINE vdouble xexp10(vdouble a) { - vdouble u = expk(mul_ds(dd(vcast_vd_d(2.3025850929940459011), vcast_vd_d(-2.1707562233822493508e-16)), a)); - u = vsel(vmask_ispinf(a), vcast_vd_d(rtengine::RT_INFINITY), u); - u = vsel(vmask_isminf(a), vcast_vd_d(0), u); - return u; + vdouble u = expk(mul_ds(dd(vcast_vd_d(2.3025850929940459011), vcast_vd_d(-2.1707562233822493508e-16)), a)); + u = vsel(vmask_ispinf(a), vcast_vd_d(rtengine::RT_INFINITY), u); + u = vsel(vmask_isminf(a), vcast_vd_d(0), u); + return u; } static INLINE vdouble xexpm1(vdouble a) { - vdouble2 d = add2_ds(expk2(dd(a, vcast_vd_d(0))), vcast_vd_d(-1.0)); - vdouble x = d.x + d.y; - x = vsel(vmask_ispinf(a), vcast_vd_d(rtengine::RT_INFINITY), x); - x = vsel(vmask_isminf(a), vcast_vd_d(-1), x); - return x; + vdouble2 d = add2_ds(expk2(dd(a, vcast_vd_d(0))), vcast_vd_d(-1.0)); + vdouble x = d.x + d.y; + x = vsel(vmask_ispinf(a), vcast_vd_d(rtengine::RT_INFINITY), x); + x = vsel(vmask_isminf(a), vcast_vd_d(-1), x); + return x; } static INLINE vdouble xlog10(vdouble a) { - vdouble2 d = mul_dd(logk(a), dd(vcast_vd_d(0.43429448190325176116), vcast_vd_d(6.6494347733425473126e-17))); - vdouble x = d.x + d.y; + vdouble2 d = mul_dd(logk(a), dd(vcast_vd_d(0.43429448190325176116), vcast_vd_d(6.6494347733425473126e-17))); + vdouble x = d.x + d.y; - x = vsel(vmask_ispinf(a), vcast_vd_d(rtengine::RT_INFINITY), x); - x = vsel(vmask_gt(vcast_vd_d(0), a), vcast_vd_d(rtengine::RT_NAN), x); - x = vsel(vmask_eq(a, vcast_vd_d(0)), vcast_vd_d(-rtengine::RT_INFINITY), x); + x = vsel(vmask_ispinf(a), vcast_vd_d(rtengine::RT_INFINITY), x); + x = vsel(vmask_gt(vcast_vd_d(0), a), vcast_vd_d(rtengine::RT_NAN), x); + x = vsel(vmask_eq(a, vcast_vd_d(0)), vcast_vd_d(-rtengine::RT_INFINITY), x); - return x; + return x; } static INLINE vdouble xlog1p(vdouble a) { - vdouble2 d = logk2(add2_ss(a, vcast_vd_d(1))); - vdouble x = d.x + d.y; + vdouble2 d = logk2(add2_ss(a, vcast_vd_d(1))); + vdouble x = d.x + d.y; - x = vsel(vmask_ispinf(a), vcast_vd_d(rtengine::RT_INFINITY), x); - x = vsel(vmask_gt(vcast_vd_d(-1), a), vcast_vd_d(rtengine::RT_NAN), x); - x = vsel(vmask_eq(a, vcast_vd_d(-1)), vcast_vd_d(-rtengine::RT_INFINITY), x); + x = vsel(vmask_ispinf(a), vcast_vd_d(rtengine::RT_INFINITY), x); + x = vsel(vmask_gt(vcast_vd_d(-1), a), vcast_vd_d(rtengine::RT_NAN), x); + x = vsel(vmask_eq(a, vcast_vd_d(-1)), vcast_vd_d(-rtengine::RT_INFINITY), x); - return x; + return x; } // typedef struct { - vfloat x, y; + vfloat x, y; } vfloat2; static INLINE vfloat vabsf(vfloat f) { return (vfloat)vandnotm((vmask)vcast_vf_f(-0.0f), (vmask)f); } static INLINE vfloat vnegf(vfloat f) { return (vfloat)vxorm((vmask)f, (vmask)vcast_vf_f(-0.0f)); } #ifdef __SSE4_1__ - // only one instruction when using SSE4.1 - static INLINE vfloat vself(vmask mask, vfloat x, vfloat y) { - return _mm_blendv_ps(y,x,(vfloat)mask); - } +// only one instruction when using SSE4.1 +static INLINE vfloat vself(vmask mask, vfloat x, vfloat y) { + return _mm_blendv_ps(y,x,(vfloat)mask); +} - static INLINE vint vselc(vmask mask, vint x, vint y) { - return _mm_blendv_epi8(y,x,mask); - } +static INLINE vint vselc(vmask mask, vint x, vint y) { + return _mm_blendv_epi8(y,x,mask); +} #else - // three instructions when using SSE2 - static INLINE vfloat vself(vmask mask, vfloat x, vfloat y) { - return (vfloat)vorm(vandm(mask, (vmask)x), vandnotm(mask, (vmask)y)); - } +// three instructions when using SSE2 +static INLINE vfloat vself(vmask mask, vfloat x, vfloat y) { + return (vfloat)vorm(vandm(mask, (vmask)x), vandnotm(mask, (vmask)y)); +} - static INLINE vint vselc(vmask mask, vint x, vint y) { - return vorm(vandm(mask, (vmask)x), vandnotm(mask, (vmask)y)); - } +static INLINE vint vselc(vmask mask, vint x, vint y) { + return vorm(vandm(mask, (vmask)x), vandnotm(mask, (vmask)y)); +} #endif static INLINE vfloat vselfzero(vmask mask, vfloat x) { - // returns value of x if corresponding mask bits are 1, else returns 0 - // faster than vself(mask, x, ZEROV) + // returns value of x if corresponding mask bits are 1, else returns 0 + // faster than vself(mask, x, ZEROV) return _mm_and_ps((vfloat)mask, x); } static INLINE vfloat vselfnotzero(vmask mask, vfloat x) { @@ -939,8 +939,8 @@ static INLINE vfloat vselfnotzero(vmask mask, vfloat x) { } static INLINE vint vselizero(vmask mask, vint x) { - // returns value of x if corresponding mask bits are 1, else returns 0 - // faster than vselc(mask, x, ZEROV) + // returns value of x if corresponding mask bits are 1, else returns 0 + // faster than vselc(mask, x, ZEROV) return _mm_and_si128(mask, x); } static INLINE vint vselinotzero(vmask mask, vint x) { @@ -950,20 +950,20 @@ static INLINE vint vselinotzero(vmask mask, vint x) { } static INLINE vint2 vseli2_lt(vfloat f0, vfloat f1, vint2 x, vint2 y) { - vint2 m2 = vcast_vi2_vm(vmaskf_lt(f0, f1)); - return vori2(vandi2(m2, x), vandnoti2(m2, y)); + vint2 m2 = vcast_vi2_vm(vmaskf_lt(f0, f1)); + return vori2(vandi2(m2, x), vandnoti2(m2, y)); } static INLINE vmask vsignbitf(vfloat f) { - return vandm((vmask)f, (vmask)vcast_vf_f(-0.0f)); + return vandm((vmask)f, (vmask)vcast_vf_f(-0.0f)); } static INLINE vfloat vmulsignf(vfloat x, vfloat y) { - return (vfloat)vxorm((vmask)x, vsignbitf(y)); + return (vfloat)vxorm((vmask)x, vsignbitf(y)); } static INLINE vfloat vsignf(vfloat f) { - return (vfloat)vorm((vmask)vcast_vf_f(1.0f), vandm((vmask)vcast_vf_f(-0.0f), (vmask)f)); + return (vfloat)vorm((vmask)vcast_vf_f(1.0f), vandm((vmask)vcast_vf_f(-0.0f), (vmask)f)); } static INLINE vmask vmaskf_isinf(vfloat d) { return vmaskf_eq(vabsf(d), vcast_vf_f(INFINITYf)); } @@ -976,396 +976,396 @@ static INLINE vfloat visinf2f(vfloat d, vfloat m) { return (vfloat)vandm(vmaskf_ static INLINE vfloat visinff(vfloat d) { return visinf2f(d, vcast_vf_f(1.0f)); } static INLINE vint2 vilogbp1f(vfloat d) { - vmask m = vmaskf_lt(d, vcast_vf_f(5.421010862427522E-20f)); - d = vself(m, vmulf(vcast_vf_f(1.8446744073709552E19f), d), d); - vint2 q = vandi2(vsrli2(vcast_vi2_vm(vreinterpret_vm_vf(d)), 23), vcast_vi2_i(0xff)); - q = vsubi2(q, vseli2(m, vcast_vi2_i(64 + 0x7e), vcast_vi2_i(0x7e))); - return q; + vmask m = vmaskf_lt(d, vcast_vf_f(5.421010862427522E-20f)); + d = vself(m, vmulf(vcast_vf_f(1.8446744073709552E19f), d), d); + vint2 q = vandi2(vsrli2(vcast_vi2_vm(vreinterpret_vm_vf(d)), 23), vcast_vi2_i(0xff)); + q = vsubi2(q, vseli2(m, vcast_vi2_i(64 + 0x7e), vcast_vi2_i(0x7e))); + return q; } static INLINE vfloat vldexpf(vfloat x, vint2 q) { - vfloat u; - vint2 m = vsrai2(q, 31); - m = vslli2(vsubi2(vsrai2(vaddi2(m, q), 6), m), 4); - q = vsubi2(q, vslli2(m, 2)); - u = vreinterpret_vf_vm(vcast_vm_vi2(vslli2(vaddi2(m, vcast_vi2_i(0x7f)), 23))); - x = vmulf(vmulf(vmulf(vmulf(x, u), u), u), u); - u = vreinterpret_vf_vm(vcast_vm_vi2(vslli2(vaddi2(q, vcast_vi2_i(0x7f)), 23))); - return vmulf(x, u); + vfloat u; + vint2 m = vsrai2(q, 31); + m = vslli2(vsubi2(vsrai2(vaddi2(m, q), 6), m), 4); + q = vsubi2(q, vslli2(m, 2)); + u = vreinterpret_vf_vm(vcast_vm_vi2(vslli2(vaddi2(m, vcast_vi2_i(0x7f)), 23))); + x = vmulf(vmulf(vmulf(vmulf(x, u), u), u), u); + u = vreinterpret_vf_vm(vcast_vm_vi2(vslli2(vaddi2(q, vcast_vi2_i(0x7f)), 23))); + return vmulf(x, u); } static INLINE vfloat xsinf(vfloat d) { - vint2 q; - vfloat u, s; + vint2 q; + vfloat u, s; - q = vrint_vi2_vf(vmulf(d, vcast_vf_f((float)rtengine::RT_1_PI))); + q = vrint_vi2_vf(vmulf(d, vcast_vf_f((float)rtengine::RT_1_PI))); - u = vcast_vf_vi2(q); - d = vmlaf(u, vcast_vf_f(-PI4_Af*4), d); - d = vmlaf(u, vcast_vf_f(-PI4_Bf*4), d); - d = vmlaf(u, vcast_vf_f(-PI4_Cf*4), d); - d = vmlaf(u, vcast_vf_f(-PI4_Df*4), d); + u = vcast_vf_vi2(q); + d = vmlaf(u, vcast_vf_f(-PI4_Af*4), d); + d = vmlaf(u, vcast_vf_f(-PI4_Bf*4), d); + d = vmlaf(u, vcast_vf_f(-PI4_Cf*4), d); + d = vmlaf(u, vcast_vf_f(-PI4_Df*4), d); - s = vmulf(d, d); + s = vmulf(d, d); - d = vself(vmaski2_eq(vandi2(q, vcast_vi2_i(1)), vcast_vi2_i(1)), vnegf(d), d); + d = vself(vmaski2_eq(vandi2(q, vcast_vi2_i(1)), vcast_vi2_i(1)), vnegf(d), d); - u = vcast_vf_f(2.6083159809786593541503e-06f); - u = vmlaf(u, s, vcast_vf_f(-0.0001981069071916863322258f)); - u = vmlaf(u, s, vcast_vf_f(0.00833307858556509017944336f)); - u = vmlaf(u, s, vcast_vf_f(-0.166666597127914428710938f)); + u = vcast_vf_f(2.6083159809786593541503e-06f); + u = vmlaf(u, s, vcast_vf_f(-0.0001981069071916863322258f)); + u = vmlaf(u, s, vcast_vf_f(0.00833307858556509017944336f)); + u = vmlaf(u, s, vcast_vf_f(-0.166666597127914428710938f)); - u = vmlaf(s, vmulf(u, d), d); + u = vmlaf(s, vmulf(u, d), d); - return u; + return u; } static INLINE vfloat xcosf(vfloat d) { - vint2 q; - vfloat u, s; + vint2 q; + vfloat u, s; - q = vrint_vi2_vf(vsubf(vmulf(d, vcast_vf_f((float)rtengine::RT_1_PI)), vcast_vf_f(0.5f))); - q = vaddi2(vaddi2(q, q), vcast_vi2_i(1)); + q = vrint_vi2_vf(vsubf(vmulf(d, vcast_vf_f((float)rtengine::RT_1_PI)), vcast_vf_f(0.5f))); + q = vaddi2(vaddi2(q, q), vcast_vi2_i(1)); - u = vcast_vf_vi2(q); - d = vmlaf(u, vcast_vf_f(-PI4_Af*2), d); - d = vmlaf(u, vcast_vf_f(-PI4_Bf*2), d); - d = vmlaf(u, vcast_vf_f(-PI4_Cf*2), d); - d = vmlaf(u, vcast_vf_f(-PI4_Df*2), d); + u = vcast_vf_vi2(q); + d = vmlaf(u, vcast_vf_f(-PI4_Af*2), d); + d = vmlaf(u, vcast_vf_f(-PI4_Bf*2), d); + d = vmlaf(u, vcast_vf_f(-PI4_Cf*2), d); + d = vmlaf(u, vcast_vf_f(-PI4_Df*2), d); - s = vmulf(d, d); + s = vmulf(d, d); - d = vself(vmaski2_eq(vandi2(q, vcast_vi2_i(2)), vcast_vi2_i(2)), d, vnegf(d)); + d = vself(vmaski2_eq(vandi2(q, vcast_vi2_i(2)), vcast_vi2_i(2)), d, vnegf(d)); - u = vcast_vf_f(2.6083159809786593541503e-06f); - u = vmlaf(u, s, vcast_vf_f(-0.0001981069071916863322258f)); - u = vmlaf(u, s, vcast_vf_f(0.00833307858556509017944336f)); - u = vmlaf(u, s, vcast_vf_f(-0.166666597127914428710938f)); + u = vcast_vf_f(2.6083159809786593541503e-06f); + u = vmlaf(u, s, vcast_vf_f(-0.0001981069071916863322258f)); + u = vmlaf(u, s, vcast_vf_f(0.00833307858556509017944336f)); + u = vmlaf(u, s, vcast_vf_f(-0.166666597127914428710938f)); - u = vmlaf(s, vmulf(u, d), d); + u = vmlaf(s, vmulf(u, d), d); - return u; + return u; } static INLINE vfloat2 xsincosf(vfloat d) { - vint2 q; - vmask m; - vfloat u, s, t, rx, ry; - vfloat2 r; + vint2 q; + vmask m; + vfloat u, s, t, rx, ry; + vfloat2 r; - q = vrint_vi2_vf(vmulf(d, vcast_vf_f((float)rtengine::RT_2_PI))); + q = vrint_vi2_vf(vmulf(d, vcast_vf_f((float)rtengine::RT_2_PI))); - s = d; + s = d; - u = vcast_vf_vi2(q); - s = vmlaf(u, vcast_vf_f(-PI4_Af*2), s); - s = vmlaf(u, vcast_vf_f(-PI4_Bf*2), s); - s = vmlaf(u, vcast_vf_f(-PI4_Cf*2), s); - s = vmlaf(u, vcast_vf_f(-PI4_Df*2), s); + u = vcast_vf_vi2(q); + s = vmlaf(u, vcast_vf_f(-PI4_Af*2), s); + s = vmlaf(u, vcast_vf_f(-PI4_Bf*2), s); + s = vmlaf(u, vcast_vf_f(-PI4_Cf*2), s); + s = vmlaf(u, vcast_vf_f(-PI4_Df*2), s); - t = s; + t = s; - s = vmulf(s, s); + s = vmulf(s, s); - u = vcast_vf_f(-0.000195169282960705459117889f); - u = vmlaf(u, s, vcast_vf_f(0.00833215750753879547119141f)); - u = vmlaf(u, s, vcast_vf_f(-0.166666537523269653320312f)); - u = vmulf(vmulf(u, s), t); + u = vcast_vf_f(-0.000195169282960705459117889f); + u = vmlaf(u, s, vcast_vf_f(0.00833215750753879547119141f)); + u = vmlaf(u, s, vcast_vf_f(-0.166666537523269653320312f)); + u = vmulf(vmulf(u, s), t); - rx = vaddf(t, u); + rx = vaddf(t, u); - u = vcast_vf_f(-2.71811842367242206819355e-07f); - u = vmlaf(u, s, vcast_vf_f(2.47990446951007470488548e-05f)); - u = vmlaf(u, s, vcast_vf_f(-0.00138888787478208541870117f)); - u = vmlaf(u, s, vcast_vf_f(0.0416666641831398010253906f)); - u = vmlaf(u, s, vcast_vf_f(-0.5)); + u = vcast_vf_f(-2.71811842367242206819355e-07f); + u = vmlaf(u, s, vcast_vf_f(2.47990446951007470488548e-05f)); + u = vmlaf(u, s, vcast_vf_f(-0.00138888787478208541870117f)); + u = vmlaf(u, s, vcast_vf_f(0.0416666641831398010253906f)); + u = vmlaf(u, s, vcast_vf_f(-0.5)); - ry = vaddf(vcast_vf_f(1), vmulf(s, u)); + ry = vaddf(vcast_vf_f(1), vmulf(s, u)); - m = vmaski2_eq(vandi2(q, vcast_vi2_i(1)), vcast_vi2_i(0)); - r.x = vself(m, rx, ry); - r.y = vself(m, ry, rx); + m = vmaski2_eq(vandi2(q, vcast_vi2_i(1)), vcast_vi2_i(0)); + r.x = vself(m, rx, ry); + r.y = vself(m, ry, rx); - m = vmaski2_eq(vandi2(q, vcast_vi2_i(2)), vcast_vi2_i(2)); - r.x = vreinterpret_vf_vm(vxorm(vandm(m, vreinterpret_vm_vf(vcast_vf_f(-0.0))), vreinterpret_vm_vf(r.x))); + m = vmaski2_eq(vandi2(q, vcast_vi2_i(2)), vcast_vi2_i(2)); + r.x = vreinterpret_vf_vm(vxorm(vandm(m, vreinterpret_vm_vf(vcast_vf_f(-0.0))), vreinterpret_vm_vf(r.x))); - m = vmaski2_eq(vandi2(vaddi2(q, vcast_vi2_i(1)), vcast_vi2_i(2)), vcast_vi2_i(2)); - r.y = vreinterpret_vf_vm(vxorm(vandm(m, vreinterpret_vm_vf(vcast_vf_f(-0.0))), vreinterpret_vm_vf(r.y))); + m = vmaski2_eq(vandi2(vaddi2(q, vcast_vi2_i(1)), vcast_vi2_i(2)), vcast_vi2_i(2)); + r.y = vreinterpret_vf_vm(vxorm(vandm(m, vreinterpret_vm_vf(vcast_vf_f(-0.0))), vreinterpret_vm_vf(r.y))); - m = vmaskf_isinf(d); - r.x = vself(m, vcast_vf_f(rtengine::RT_NAN), r.x); - r.y = vself(m, vcast_vf_f(rtengine::RT_NAN), r.y); + m = vmaskf_isinf(d); + r.x = vself(m, vcast_vf_f(rtengine::RT_NAN), r.x); + r.y = vself(m, vcast_vf_f(rtengine::RT_NAN), r.y); - return r; + return r; } static INLINE vfloat xtanf(vfloat d) { - vint2 q; - vmask m; - vfloat u, s, x; + vint2 q; + vmask m; + vfloat u, s, x; - q = vrint_vi2_vf(vmulf(d, vcast_vf_f((float)(2 * rtengine::RT_1_PI)))); + q = vrint_vi2_vf(vmulf(d, vcast_vf_f((float)(2 * rtengine::RT_1_PI)))); - x = d; + x = d; - u = vcast_vf_vi2(q); - x = vmlaf(u, vcast_vf_f(-PI4_Af*2), x); - x = vmlaf(u, vcast_vf_f(-PI4_Bf*2), x); - x = vmlaf(u, vcast_vf_f(-PI4_Cf*2), x); - x = vmlaf(u, vcast_vf_f(-PI4_Df*2), x); + u = vcast_vf_vi2(q); + x = vmlaf(u, vcast_vf_f(-PI4_Af*2), x); + x = vmlaf(u, vcast_vf_f(-PI4_Bf*2), x); + x = vmlaf(u, vcast_vf_f(-PI4_Cf*2), x); + x = vmlaf(u, vcast_vf_f(-PI4_Df*2), x); - s = vmulf(x, x); + s = vmulf(x, x); - m = vmaski2_eq(vandi2(q, vcast_vi2_i(1)), vcast_vi2_i(1)); - x = vself(m, vnegf(x), x); + m = vmaski2_eq(vandi2(q, vcast_vi2_i(1)), vcast_vi2_i(1)); + x = vself(m, vnegf(x), x); - u = vcast_vf_f(0.00927245803177356719970703f); - u = vmlaf(u, s, vcast_vf_f(0.00331984995864331722259521f)); - u = vmlaf(u, s, vcast_vf_f(0.0242998078465461730957031f)); - u = vmlaf(u, s, vcast_vf_f(0.0534495301544666290283203f)); - u = vmlaf(u, s, vcast_vf_f(0.133383005857467651367188f)); - u = vmlaf(u, s, vcast_vf_f(0.333331853151321411132812f)); + u = vcast_vf_f(0.00927245803177356719970703f); + u = vmlaf(u, s, vcast_vf_f(0.00331984995864331722259521f)); + u = vmlaf(u, s, vcast_vf_f(0.0242998078465461730957031f)); + u = vmlaf(u, s, vcast_vf_f(0.0534495301544666290283203f)); + u = vmlaf(u, s, vcast_vf_f(0.133383005857467651367188f)); + u = vmlaf(u, s, vcast_vf_f(0.333331853151321411132812f)); - u = vmlaf(s, vmulf(u, x), x); + u = vmlaf(s, vmulf(u, x), x); - u = vself(m, vrecf(u), u); + u = vself(m, vrecf(u), u); - u = vself(vmaskf_isinf(d), vcast_vf_f(NANf), u); + u = vself(vmaskf_isinf(d), vcast_vf_f(NANf), u); - return u; + return u; } static INLINE vfloat xatanf(vfloat s) { - vfloat t, u; - vint2 q; + vfloat t, u; + vint2 q; - q = vseli2_lt(s, vcast_vf_f(0.0f), vcast_vi2_i(2), vcast_vi2_i(0)); - s = vabsf(s); + q = vseli2_lt(s, vcast_vf_f(0.0f), vcast_vi2_i(2), vcast_vi2_i(0)); + s = vabsf(s); - q = vseli2_lt(vcast_vf_f(1.0f), s, vaddi2(q, vcast_vi2_i(1)), q); - s = vself(vmaskf_lt(vcast_vf_f(1.0f), s), vdivf(vcast_vf_f(1.0f), s), s); + q = vseli2_lt(vcast_vf_f(1.0f), s, vaddi2(q, vcast_vi2_i(1)), q); + s = vself(vmaskf_lt(vcast_vf_f(1.0f), s), vdivf(vcast_vf_f(1.0f), s), s); - t = vmulf(s, s); + t = vmulf(s, s); - u = vcast_vf_f(0.00282363896258175373077393f); - u = vmlaf(u, t, vcast_vf_f(-0.0159569028764963150024414f)); - u = vmlaf(u, t, vcast_vf_f(0.0425049886107444763183594f)); - u = vmlaf(u, t, vcast_vf_f(-0.0748900920152664184570312f)); - u = vmlaf(u, t, vcast_vf_f(0.106347933411598205566406f)); - u = vmlaf(u, t, vcast_vf_f(-0.142027363181114196777344f)); - u = vmlaf(u, t, vcast_vf_f(0.199926957488059997558594f)); - u = vmlaf(u, t, vcast_vf_f(-0.333331018686294555664062f)); + u = vcast_vf_f(0.00282363896258175373077393f); + u = vmlaf(u, t, vcast_vf_f(-0.0159569028764963150024414f)); + u = vmlaf(u, t, vcast_vf_f(0.0425049886107444763183594f)); + u = vmlaf(u, t, vcast_vf_f(-0.0748900920152664184570312f)); + u = vmlaf(u, t, vcast_vf_f(0.106347933411598205566406f)); + u = vmlaf(u, t, vcast_vf_f(-0.142027363181114196777344f)); + u = vmlaf(u, t, vcast_vf_f(0.199926957488059997558594f)); + u = vmlaf(u, t, vcast_vf_f(-0.333331018686294555664062f)); - t = vaddf(s, vmulf(s, vmulf(t, u))); + t = vaddf(s, vmulf(s, vmulf(t, u))); - t = vself(vmaski2_eq(vandi2(q, vcast_vi2_i(1)), vcast_vi2_i(1)), vsubf(vcast_vf_f((float)(rtengine::RT_PI/2)), t), t); - t = vself(vmaski2_eq(vandi2(q, vcast_vi2_i(2)), vcast_vi2_i(2)), vnegf(t), t); + t = vself(vmaski2_eq(vandi2(q, vcast_vi2_i(1)), vcast_vi2_i(1)), vsubf(vcast_vf_f((float)(rtengine::RT_PI/2)), t), t); + t = vself(vmaski2_eq(vandi2(q, vcast_vi2_i(2)), vcast_vi2_i(2)), vnegf(t), t); - return t; + return t; } static INLINE vfloat atan2kf(vfloat y, vfloat x) { - vfloat s, t, u; - vint2 q; - vmask p; + vfloat s, t, u; + vint2 q; + vmask p; - q = vseli2_lt(x, vcast_vf_f(0.0f), vcast_vi2_i(-2), vcast_vi2_i(0)); - x = vabsf(x); + q = vseli2_lt(x, vcast_vf_f(0.0f), vcast_vi2_i(-2), vcast_vi2_i(0)); + x = vabsf(x); - q = vseli2_lt(x, y, vaddi2(q, vcast_vi2_i(1)), q); - p = vmaskf_lt(x, y); - s = vself(p, vnegf(x), y); - t = vmaxf(x, y); + q = vseli2_lt(x, y, vaddi2(q, vcast_vi2_i(1)), q); + p = vmaskf_lt(x, y); + s = vself(p, vnegf(x), y); + t = vmaxf(x, y); - s = vdivf(s, t); - t = vmulf(s, s); + s = vdivf(s, t); + t = vmulf(s, s); - u = vcast_vf_f(0.00282363896258175373077393f); - u = vmlaf(u, t, vcast_vf_f(-0.0159569028764963150024414f)); - u = vmlaf(u, t, vcast_vf_f(0.0425049886107444763183594f)); - u = vmlaf(u, t, vcast_vf_f(-0.0748900920152664184570312f)); - u = vmlaf(u, t, vcast_vf_f(0.106347933411598205566406f)); - u = vmlaf(u, t, vcast_vf_f(-0.142027363181114196777344f)); - u = vmlaf(u, t, vcast_vf_f(0.199926957488059997558594f)); - u = vmlaf(u, t, vcast_vf_f(-0.333331018686294555664062f)); + u = vcast_vf_f(0.00282363896258175373077393f); + u = vmlaf(u, t, vcast_vf_f(-0.0159569028764963150024414f)); + u = vmlaf(u, t, vcast_vf_f(0.0425049886107444763183594f)); + u = vmlaf(u, t, vcast_vf_f(-0.0748900920152664184570312f)); + u = vmlaf(u, t, vcast_vf_f(0.106347933411598205566406f)); + u = vmlaf(u, t, vcast_vf_f(-0.142027363181114196777344f)); + u = vmlaf(u, t, vcast_vf_f(0.199926957488059997558594f)); + u = vmlaf(u, t, vcast_vf_f(-0.333331018686294555664062f)); - t = vaddf(s, vmulf(s, vmulf(t, u))); - t = vaddf(t, vmulf(vcast_vf_vi2(q), vcast_vf_f((float)(rtengine::RT_PI/2)))); + t = vaddf(s, vmulf(s, vmulf(t, u))); + t = vaddf(t, vmulf(vcast_vf_vi2(q), vcast_vf_f((float)(rtengine::RT_PI/2)))); - return t; + return t; } static INLINE vfloat xatan2f(vfloat y, vfloat x) { - vfloat r = atan2kf(vabsf(y), x); + vfloat r = atan2kf(vabsf(y), x); - r = vmulsignf(r, x); - r = vself(vorm(vmaskf_isinf(x), vmaskf_eq(x, vcast_vf_f(0.0f))), vsubf(vcast_vf_f((float)(rtengine::RT_PI/2)), visinf2f(x, vmulsignf(vcast_vf_f((float)(rtengine::RT_PI/2)), x))), r); - r = vself(vmaskf_isinf(y), vsubf(vcast_vf_f((float)(rtengine::RT_PI/2)), visinf2f(x, vmulsignf(vcast_vf_f((float)(rtengine::RT_PI/4)), x))), r); - r = vself(vmaskf_eq(y, vcast_vf_f(0.0f)), vselfzero(vmaskf_eq(vsignf(x), vcast_vf_f(-1.0f)), vcast_vf_f((float)rtengine::RT_PI)), r); + r = vmulsignf(r, x); + r = vself(vorm(vmaskf_isinf(x), vmaskf_eq(x, vcast_vf_f(0.0f))), vsubf(vcast_vf_f((float)(rtengine::RT_PI/2)), visinf2f(x, vmulsignf(vcast_vf_f((float)(rtengine::RT_PI/2)), x))), r); + r = vself(vmaskf_isinf(y), vsubf(vcast_vf_f((float)(rtengine::RT_PI/2)), visinf2f(x, vmulsignf(vcast_vf_f((float)(rtengine::RT_PI/4)), x))), r); + r = vself(vmaskf_eq(y, vcast_vf_f(0.0f)), vselfzero(vmaskf_eq(vsignf(x), vcast_vf_f(-1.0f)), vcast_vf_f((float)rtengine::RT_PI)), r); - return vself(vmaskf_isnan(x, y), vcast_vf_f(NANf), vmulsignf(r, y)); + return vself(vmaskf_isnan(x, y), vcast_vf_f(NANf), vmulsignf(r, y)); } static INLINE vfloat xasinf(vfloat d) { - vfloat x, y; - x = vaddf(vcast_vf_f(1.0f), d); - y = vsubf(vcast_vf_f(1.0f), d); - x = vmulf(x, y); - x = vsqrtf(x); - x = vself(vmaskf_isnan(x), vcast_vf_f(NANf), atan2kf(vabsf(d), x)); - return vmulsignf(x, d); + vfloat x, y; + x = vaddf(vcast_vf_f(1.0f), d); + y = vsubf(vcast_vf_f(1.0f), d); + x = vmulf(x, y); + x = vsqrtf(x); + x = vself(vmaskf_isnan(x), vcast_vf_f(NANf), atan2kf(vabsf(d), x)); + return vmulsignf(x, d); } static INLINE vfloat xacosf(vfloat d) { - vfloat x, y; - x = vaddf(vcast_vf_f(1.0f), d); - y = vsubf(vcast_vf_f(1.0f), d); - x = vmulf(x, y); - x = vsqrtf(x); - x = vmulsignf(atan2kf(x, vabsf(d)), d); - y = (vfloat)vandm(vmaskf_lt(d, vcast_vf_f(0.0f)), (vmask)vcast_vf_f((float)rtengine::RT_PI)); - x = vaddf(x, y); - return x; + vfloat x, y; + x = vaddf(vcast_vf_f(1.0f), d); + y = vsubf(vcast_vf_f(1.0f), d); + x = vmulf(x, y); + x = vsqrtf(x); + x = vmulsignf(atan2kf(x, vabsf(d)), d); + y = (vfloat)vandm(vmaskf_lt(d, vcast_vf_f(0.0f)), (vmask)vcast_vf_f((float)rtengine::RT_PI)); + x = vaddf(x, y); + return x; } static INLINE vfloat xlogf(vfloat d) { - vfloat x, x2, t, m; - vint2 e; + vfloat x, x2, t, m; + vint2 e; - e = vilogbp1f(vmulf(d, vcast_vf_f(0.7071f))); - m = vldexpf(d, vsubi2(vcast_vi2_i(0), e)); + e = vilogbp1f(vmulf(d, vcast_vf_f(0.7071f))); + m = vldexpf(d, vsubi2(vcast_vi2_i(0), e)); - x = vdivf(vaddf(vcast_vf_f(-1.0f), m), vaddf(vcast_vf_f(1.0f), m)); - x2 = vmulf(x, x); + x = vdivf(vaddf(vcast_vf_f(-1.0f), m), vaddf(vcast_vf_f(1.0f), m)); + x2 = vmulf(x, x); - t = vcast_vf_f(0.2371599674224853515625f); - t = vmlaf(t, x2, vcast_vf_f(0.285279005765914916992188f)); - t = vmlaf(t, x2, vcast_vf_f(0.400005519390106201171875f)); - t = vmlaf(t, x2, vcast_vf_f(0.666666567325592041015625f)); - t = vmlaf(t, x2, vcast_vf_f(2.0f)); + t = vcast_vf_f(0.2371599674224853515625f); + t = vmlaf(t, x2, vcast_vf_f(0.285279005765914916992188f)); + t = vmlaf(t, x2, vcast_vf_f(0.400005519390106201171875f)); + t = vmlaf(t, x2, vcast_vf_f(0.666666567325592041015625f)); + t = vmlaf(t, x2, vcast_vf_f(2.0f)); - x = vaddf(vmulf(x, t), vmulf(vcast_vf_f(0.693147180559945286226764f), vcast_vf_vi2(e))); + x = vaddf(vmulf(x, t), vmulf(vcast_vf_f(0.693147180559945286226764f), vcast_vf_vi2(e))); - x = vself(vmaskf_ispinf(d), vcast_vf_f(INFINITYf), x); - x = vself(vmaskf_gt(vcast_vf_f(0), d), vcast_vf_f(NANf), x); - x = vself(vmaskf_eq(d, vcast_vf_f(0)), vcast_vf_f(-INFINITYf), x); + x = vself(vmaskf_ispinf(d), vcast_vf_f(INFINITYf), x); + x = vself(vmaskf_gt(vcast_vf_f(0), d), vcast_vf_f(NANf), x); + x = vself(vmaskf_eq(d, vcast_vf_f(0)), vcast_vf_f(-INFINITYf), x); - return x; + return x; } static INLINE vfloat xlogf0(vfloat d) { - vfloat x, x2, t, m; - vint2 e; + vfloat x, x2, t, m; + vint2 e; - e = vilogbp1f(vmulf(d, vcast_vf_f(0.7071f))); - m = vldexpf(d, vsubi2(vcast_vi2_i(0), e)); + e = vilogbp1f(vmulf(d, vcast_vf_f(0.7071f))); + m = vldexpf(d, vsubi2(vcast_vi2_i(0), e)); - x = vdivf(vaddf(vcast_vf_f(-1.0f), m), vaddf(vcast_vf_f(1.0f), m)); - x2 = vmulf(x, x); + x = vdivf(vaddf(vcast_vf_f(-1.0f), m), vaddf(vcast_vf_f(1.0f), m)); + x2 = vmulf(x, x); - t = vcast_vf_f(0.2371599674224853515625f); - t = vmlaf(t, x2, vcast_vf_f(0.285279005765914916992188f)); - t = vmlaf(t, x2, vcast_vf_f(0.400005519390106201171875f)); - t = vmlaf(t, x2, vcast_vf_f(0.666666567325592041015625f)); - t = vmlaf(t, x2, vcast_vf_f(2.0f)); + t = vcast_vf_f(0.2371599674224853515625f); + t = vmlaf(t, x2, vcast_vf_f(0.285279005765914916992188f)); + t = vmlaf(t, x2, vcast_vf_f(0.400005519390106201171875f)); + t = vmlaf(t, x2, vcast_vf_f(0.666666567325592041015625f)); + t = vmlaf(t, x2, vcast_vf_f(2.0f)); - x = vaddf(vmulf(x, t), vmulf(vcast_vf_f(0.693147180559945286226764f), vcast_vf_vi2(e))); + x = vaddf(vmulf(x, t), vmulf(vcast_vf_f(0.693147180559945286226764f), vcast_vf_vi2(e))); - x = vself(vmaskf_ispinf(d), vcast_vf_f(0), x); - x = vself(vmaskf_gt(vcast_vf_f(0), d), vcast_vf_f(0), x); - x = vself(vmaskf_eq(d, vcast_vf_f(0)), vcast_vf_f(0), x); + x = vself(vmaskf_ispinf(d), vcast_vf_f(0), x); + x = vself(vmaskf_gt(vcast_vf_f(0), d), vcast_vf_f(0), x); + x = vself(vmaskf_eq(d, vcast_vf_f(0)), vcast_vf_f(0), x); - return x; + return x; } static INLINE vfloat xlogfNoCheck(vfloat d) { // this version does not check input values. Use it only when you know the input values are > 0 e.g. when filling a lookup table - vfloat x, x2, t, m; - vint2 e; + vfloat x, x2, t, m; + vint2 e; - e = vilogbp1f(vmulf(d, vcast_vf_f(0.7071f))); - m = vldexpf(d, vsubi2(vcast_vi2_i(0), e)); + e = vilogbp1f(vmulf(d, vcast_vf_f(0.7071f))); + m = vldexpf(d, vsubi2(vcast_vi2_i(0), e)); - x = vdivf(vaddf(vcast_vf_f(-1.0f), m), vaddf(vcast_vf_f(1.0f), m)); - x2 = vmulf(x, x); + x = vdivf(vaddf(vcast_vf_f(-1.0f), m), vaddf(vcast_vf_f(1.0f), m)); + x2 = vmulf(x, x); - t = vcast_vf_f(0.2371599674224853515625f); - t = vmlaf(t, x2, vcast_vf_f(0.285279005765914916992188f)); - t = vmlaf(t, x2, vcast_vf_f(0.400005519390106201171875f)); - t = vmlaf(t, x2, vcast_vf_f(0.666666567325592041015625f)); - t = vmlaf(t, x2, vcast_vf_f(2.0f)); + t = vcast_vf_f(0.2371599674224853515625f); + t = vmlaf(t, x2, vcast_vf_f(0.285279005765914916992188f)); + t = vmlaf(t, x2, vcast_vf_f(0.400005519390106201171875f)); + t = vmlaf(t, x2, vcast_vf_f(0.666666567325592041015625f)); + t = vmlaf(t, x2, vcast_vf_f(2.0f)); - return vaddf(vmulf(x, t), vmulf(vcast_vf_f(0.693147180559945286226764f), vcast_vf_vi2(e))); + return vaddf(vmulf(x, t), vmulf(vcast_vf_f(0.693147180559945286226764f), vcast_vf_vi2(e))); } static INLINE vfloat xexpf(vfloat d) { - vint2 q = vrint_vi2_vf(vmulf(d, vcast_vf_f(R_LN2f))); - vfloat s, u; + vint2 q = vrint_vi2_vf(vmulf(d, vcast_vf_f(R_LN2f))); + vfloat s, u; - s = vmlaf(vcast_vf_vi2(q), vcast_vf_f(-L2Uf),d); - s = vmlaf(vcast_vf_vi2(q), vcast_vf_f(-L2Lf),s); + s = vmlaf(vcast_vf_vi2(q), vcast_vf_f(-L2Uf),d); + s = vmlaf(vcast_vf_vi2(q), vcast_vf_f(-L2Lf),s); - u = vcast_vf_f(0.00136324646882712841033936f); - u = vmlaf(u, s, vcast_vf_f(0.00836596917361021041870117f)); - u = vmlaf(u, s, vcast_vf_f(0.0416710823774337768554688f)); - u = vmlaf(u, s, vcast_vf_f(0.166665524244308471679688f)); - u = vmlaf(u, s, vcast_vf_f(0.499999850988388061523438f)); + u = vcast_vf_f(0.00136324646882712841033936f); + u = vmlaf(u, s, vcast_vf_f(0.00836596917361021041870117f)); + u = vmlaf(u, s, vcast_vf_f(0.0416710823774337768554688f)); + u = vmlaf(u, s, vcast_vf_f(0.166665524244308471679688f)); + u = vmlaf(u, s, vcast_vf_f(0.499999850988388061523438f)); - u = vaddf(vcast_vf_f(1.0f), vmlaf(vmulf(s, s), u, s)); + u = vaddf(vcast_vf_f(1.0f), vmlaf(vmulf(s, s), u, s)); - u = vldexpf(u, q); + u = vldexpf(u, q); - // -104.0 - return vselfnotzero(vmaskf_gt(vcast_vf_f(-104.f), d), u); + // -104.0 + return vselfnotzero(vmaskf_gt(vcast_vf_f(-104.f), d), u); } static INLINE vfloat xexpfNoCheck(vfloat d) { // this version does not check input values. Use it only when you know the input values are > -104.f e.g. when filling a lookup table - vint2 q = vrint_vi2_vf(vmulf(d, vcast_vf_f(R_LN2f))); - vfloat s, u; + vint2 q = vrint_vi2_vf(vmulf(d, vcast_vf_f(R_LN2f))); + vfloat s, u; - s = vmlaf(vcast_vf_vi2(q), vcast_vf_f(-L2Uf),d); - s = vmlaf(vcast_vf_vi2(q), vcast_vf_f(-L2Lf),s); + s = vmlaf(vcast_vf_vi2(q), vcast_vf_f(-L2Uf),d); + s = vmlaf(vcast_vf_vi2(q), vcast_vf_f(-L2Lf),s); - u = vcast_vf_f(0.00136324646882712841033936f); - u = vmlaf(u, s, vcast_vf_f(0.00836596917361021041870117f)); - u = vmlaf(u, s, vcast_vf_f(0.0416710823774337768554688f)); - u = vmlaf(u, s, vcast_vf_f(0.166665524244308471679688f)); - u = vmlaf(u, s, vcast_vf_f(0.499999850988388061523438f)); + u = vcast_vf_f(0.00136324646882712841033936f); + u = vmlaf(u, s, vcast_vf_f(0.00836596917361021041870117f)); + u = vmlaf(u, s, vcast_vf_f(0.0416710823774337768554688f)); + u = vmlaf(u, s, vcast_vf_f(0.166665524244308471679688f)); + u = vmlaf(u, s, vcast_vf_f(0.499999850988388061523438f)); - u = vaddf(vcast_vf_f(1.0f), vmlaf(vmulf(s, s), u, s)); + u = vaddf(vcast_vf_f(1.0f), vmlaf(vmulf(s, s), u, s)); - return vldexpf(u, q); + return vldexpf(u, q); } static INLINE vfloat xcbrtf(vfloat d) { - vfloat x, y, q = vcast_vf_f(1.0), t; - vint2 e, qu, re; + vfloat x, y, q = vcast_vf_f(1.0), t; + vint2 e, qu, re; - e = vilogbp1f(vabsf(d)); - d = vldexpf(d, vsubi2(vcast_vi2_i(0), e)); + e = vilogbp1f(vabsf(d)); + d = vldexpf(d, vsubi2(vcast_vi2_i(0), e)); - t = vaddf(vcast_vf_vi2(e), vcast_vf_f(6144)); - qu = vtruncate_vi2_vf(vdivf(t, vcast_vf_f(3))); - re = vtruncate_vi2_vf(vsubf(t, vmulf(vcast_vf_vi2(qu), vcast_vf_f(3)))); + t = vaddf(vcast_vf_vi2(e), vcast_vf_f(6144)); + qu = vtruncate_vi2_vf(vdivf(t, vcast_vf_f(3))); + re = vtruncate_vi2_vf(vsubf(t, vmulf(vcast_vf_vi2(qu), vcast_vf_f(3)))); - q = vself(vmaski2_eq(re, vcast_vi2_i(1)), vcast_vf_f(1.2599210498948731647672106f), q); - q = vself(vmaski2_eq(re, vcast_vi2_i(2)), vcast_vf_f(1.5874010519681994747517056f), q); - q = vldexpf(q, vsubi2(qu, vcast_vi2_i(2048))); + q = vself(vmaski2_eq(re, vcast_vi2_i(1)), vcast_vf_f(1.2599210498948731647672106f), q); + q = vself(vmaski2_eq(re, vcast_vi2_i(2)), vcast_vf_f(1.5874010519681994747517056f), q); + q = vldexpf(q, vsubi2(qu, vcast_vi2_i(2048))); - q = vmulsignf(q, d); - d = vabsf(d); + q = vmulsignf(q, d); + d = vabsf(d); - x = vcast_vf_f(-0.601564466953277587890625f); - x = vmlaf(x, d, vcast_vf_f(2.8208892345428466796875f)); - x = vmlaf(x, d, vcast_vf_f(-5.532182216644287109375f)); - x = vmlaf(x, d, vcast_vf_f(5.898262500762939453125f)); - x = vmlaf(x, d, vcast_vf_f(-3.8095417022705078125f)); - x = vmlaf(x, d, vcast_vf_f(2.2241256237030029296875f)); + x = vcast_vf_f(-0.601564466953277587890625f); + x = vmlaf(x, d, vcast_vf_f(2.8208892345428466796875f)); + x = vmlaf(x, d, vcast_vf_f(-5.532182216644287109375f)); + x = vmlaf(x, d, vcast_vf_f(5.898262500762939453125f)); + x = vmlaf(x, d, vcast_vf_f(-3.8095417022705078125f)); + x = vmlaf(x, d, vcast_vf_f(2.2241256237030029296875f)); - y = vmulf(vmulf(d, x), x); - y = vmulf(vsubf(y, vmulf(vmulf(vcast_vf_f(2.0f / 3.0f), y), vmlaf(y, x, vcast_vf_f(-1.0f)))), q); + y = vmulf(vmulf(d, x), x); + y = vmulf(vsubf(y, vmulf(vmulf(vcast_vf_f(2.0f / 3.0f), y), vmlaf(y, x, vcast_vf_f(-1.0f)))), q); - return y; + return y; } static INLINE vfloat vclampf(vfloat value, vfloat low, vfloat high) { @@ -1374,7 +1374,7 @@ static INLINE vfloat vclampf(vfloat value, vfloat low, vfloat high) { } static INLINE vfloat SQRV(vfloat a){ - return a * a; + return a * a; } static inline void vswap( vmask condition, vfloat &a, vfloat &b) { @@ -1404,7 +1404,7 @@ static inline float vhmax(vfloat a) { static INLINE vfloat vmul2f(vfloat a){ // fastest way to multiply by 2 - return a + a; + return a + a; } static INLINE vfloat vintpf(vfloat a, vfloat b, vfloat c) { diff --git a/rtexif/CMakeLists.txt b/rtexif/CMakeLists.txt index 0a38a3a35..5a3831455 100644 --- a/rtexif/CMakeLists.txt +++ b/rtexif/CMakeLists.txt @@ -6,7 +6,7 @@ add_library(rtexif STATIC olympusattribs.cc panasonicattribs.cc pentaxattribs.cc - rtexif.cc + rtexif.cc sonyminoltaattribs.cc stdattribs.cc ) diff --git a/rtgui/coloredbar.cc b/rtgui/coloredbar.cc index ca9a381cf..adafcbdde 100644 --- a/rtgui/coloredbar.cc +++ b/rtgui/coloredbar.cc @@ -142,7 +142,7 @@ void ColoredBar::updateBackBuffer(Gtk::DrawingArea &drawingArea) case (RTO_Left2Right): for (int py = 0; py < h; ++py) { for (int px = 0; px < w; ++px) { - unsigned char *pixel = surfaceData + (py * w + px) * 4; + unsigned char *pixel = surfaceData + (py * w + px) * 4; double x_ = double( px); //double y_ = double((h-1)-py); unused double x01 = x_ / double(w - 1); @@ -158,7 +158,7 @@ void ColoredBar::updateBackBuffer(Gtk::DrawingArea &drawingArea) case (RTO_Right2Left): for (int py = 0; py < h; ++py) { for (int px = 0; px < w; ++px) { - unsigned char *pixel = surfaceData + (py * w + px) * 4; + unsigned char *pixel = surfaceData + (py * w + px) * 4; //double x_ = double((w-1)-px); unused //double y_ = double((h-1)-py); unused double x01 = double(px) / double(w - 1); @@ -174,7 +174,7 @@ void ColoredBar::updateBackBuffer(Gtk::DrawingArea &drawingArea) case (RTO_Bottom2Top): for (int py = 0; py < h; ++py) { for (int px = 0; px < w; ++px) { - unsigned char *pixel = surfaceData + (py * w + px) * 4; + unsigned char *pixel = surfaceData + (py * w + px) * 4; //double x_ = double((w-1)-px); unused //double y_ = double((h-1)-py); unused double x01 = double(px) / double(w - 1); @@ -191,7 +191,7 @@ void ColoredBar::updateBackBuffer(Gtk::DrawingArea &drawingArea) default: for (int py = 0; py < h; ++py) { for (int px = 0; px < w; ++px) { - unsigned char *pixel = surfaceData + (py * w + px) * 4; + unsigned char *pixel = surfaceData + (py * w + px) * 4; double x_ = double( px); double y_ = double( py); double x01 = x_ / double(w - 1); diff --git a/rtgui/main.cc b/rtgui/main.cc index 098963e0e..631d3db0a 100644 --- a/rtgui/main.cc +++ b/rtgui/main.cc @@ -529,13 +529,13 @@ int main (int argc, char **argv) int ret = 0; if (options.pseudoHiDPISupport) { - // Reading/updating GDK_SCALE early if it exists - const gchar *gscale = g_getenv("GDK_SCALE"); - if (gscale && gscale[0] == '2') { - initialGdkScale = 2; - } - // HOMBRE: On Windows, if resolution is set to 200%, Gtk internal variables are SCALE=2 and DPI=96 - g_setenv("GDK_SCALE", "1", true); + // Reading/updating GDK_SCALE early if it exists + const gchar *gscale = g_getenv("GDK_SCALE"); + if (gscale && gscale[0] == '2') { + initialGdkScale = 2; + } + // HOMBRE: On Windows, if resolution is set to 200%, Gtk internal variables are SCALE=2 and DPI=96 + g_setenv("GDK_SCALE", "1", true); } gdk_threads_set_lock_functions (G_CALLBACK (myGdkLockEnter), (G_CALLBACK (myGdkLockLeave))); diff --git a/rtgui/options.cc b/rtgui/options.cc index 20e20620a..737607bcf 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -1258,7 +1258,7 @@ void Options::readFromFile(Glib::ustring fname) } if (keyFile.has_key("GUI", "PseudoHiDPISupport")) { - pseudoHiDPISupport = keyFile.get_boolean("GUI", "PseudoHiDPISupport"); + pseudoHiDPISupport = keyFile.get_boolean("GUI", "PseudoHiDPISupport"); } if (keyFile.has_key("GUI", "LastPreviewScale")) { diff --git a/rtgui/rtscalable.cc b/rtgui/rtscalable.cc index 15211a7ee..b37f2276f 100644 --- a/rtgui/rtscalable.cc +++ b/rtgui/rtscalable.cc @@ -37,9 +37,9 @@ Gtk::TextDirection RTScalable::direction = Gtk::TextDirection::TEXT_DIR_NONE; void RTScalable::setDPInScale (const double newDPI, const int newScale) { if (!options.pseudoHiDPISupport) { - scale = 1; - dpi = baseDPI; - return; + scale = 1; + dpi = baseDPI; + return; } if (scale != newScale || (scale == 1 && dpi != newDPI)) { diff --git a/rtgui/rtwindow.cc b/rtgui/rtwindow.cc index 3983f93b1..fc9be32f7 100644 --- a/rtgui/rtwindow.cc +++ b/rtgui/rtwindow.cc @@ -168,7 +168,7 @@ RTWindow::RTWindow () #endif //GTK318 if (options.pseudoHiDPISupport) { - fontScale = options.fontSize / (float)RTScalable::baseFontSize; + fontScale = options.fontSize / (float)RTScalable::baseFontSize; } if (options.rtSettings.verbose) { printf("\"Non-Default\" font size(%d) * scale(%d) / fontScale(%.3f)\n", options.fontSize, (int)initialGdkScale, fontScale); @@ -196,7 +196,7 @@ RTWindow::RTWindow () pt = fontSize / Pango::SCALE; } if (options.pseudoHiDPISupport) { - fontScale = (float)pt / (float)RTScalable::baseFontSize; + fontScale = (float)pt / (float)RTScalable::baseFontSize; } if ((int)initialGdkScale > 1 || pt != RTScalable::baseFontSize) { css = Glib::ustring::compose ("* { font-size: %1pt}", pt * (int)initialGdkScale); diff --git a/tools/RTProfileBuilderSample.cs b/tools/RTProfileBuilderSample.cs index a097e6883..80474b63b 100644 --- a/tools/RTProfileBuilderSample.cs +++ b/tools/RTProfileBuilderSample.cs @@ -1,293 +1,293 @@ -#region Usings -using System; -using System.Text; -using System.IO; -using System.Globalization; -using System.Diagnostics; -using System.Configuration; -using System.Collections; -using System.Collections.Specialized; -#endregion - -// *** Raw Therapee sample Custom Profile builder (version 2013-08-12) *** -// -// -// WARNING: The command line parameters has changed since this file has been created by Oduis. The new mechanism involves a -// temporary communication file (.ini style) to provide system parameters and metadata read by RawTherapee. This script has -// to be updated by some C# developer in order to work. -// -// -// WARNING: PP3 format may change in the future versions! If this happens there will probably be no automatic migration path, -// you'll have to adjust on your own. This is a sample, and therefore not supported by the RT team (just by oduis) -// -// -// How to use: -// 1. Modify the GetCorrectedSettings function below according to your needs. -// 2. Download and install Microsoft .Net Runtime (latest version is 4.0 as of writing), if it's not already on your machine. -// You can get it for free via Windows Update or from microsoft.com. No need for Visual Studio etc. -// 3. Open a command line and compile this CS-File using the C# 32bit compiler. It is usually installed somewhere here: -// C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe -// Call csc.exe (C#-Compiler) with your .CS file as parameter like this (one big line): -// -// C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc -// /r:C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.dll -// /r:C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Configuration.dll -// RTProfileBuilderSample.cs -// -// (On most machines it already works with "C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc RTProfileBuilderSample.cs") -// CSC will compile it and emit an EXE. -// 4. Open your RT options files and find the entry [Profiles]/CustomProfileBuilder -// 5. Enter the path to your newly built exe here. On Windows, don't forget double slashes (e.g. "C:\\MyDir\\Mybuilder.exe") -// And you're done! The EXE is only called on opening the image editor and there is no PP3 already -// -// If you want to use EXIFTOOL to gather more details information to build queries: -// 1. Download exiftool.exe from http://www.sno.phy.queensu.ca/~phil/exiftool/ -// 2. Rename it to exiftool.exe (NOT exiftool(-k).. or something!) -// 3. Copy the RTProfilerBuilder.exe.config next to your own EXE. If you renamed it, rename config to "(Yourname).exe.config" -// 4. Open the config with notepad (it's an XML file). Set ExifToolPath to your downloaded and renamed exe -// -// If you want to know what parameters are available, call "exiftool.exe -tab -short" -// -// This description is for Windows. The C# code does not use anything fancy, will probably work with MONO on Linux/OSX, too - -namespace RTProfilerBuilder { - /// Main class. Mostly change GetCorrectedSettings. - class RTProfileBuilder { - - /// Adds the Nikkor zoom distortion correction profile. - /// First array is list of focal lengths, second array is the RT setting that should correct the - /// distortion for the corresponding focal length. Values between these values are automatically interpolated. - /// The focal length values must already be ordered. The number of sample points is not limited. - static DistortionCorrectProf distNikkor24120f4 = new DistortionCorrectProf( - new double[] { 24, 28, 35, 50, 70, 85, 120 }, - new double[] { -0.1, -0.063, -0.012, 0.018, 0.034, 0.04, 0.048 } - ); - - - /// This is your personalisation function - /// Full EXIF from EXIFTOOL (if configured). - /// Entry, like "Sharpening/Radius" - /// Current value (from default file) - /// FNumberExposure in seconds - /// Focal length in MMISO value - /// Lens from EXIFCamera from EXIF - /// The value to be written. Simply take the current value if you have nothing to touch. - static string GetCorrectedSetting(NameValueCollection exif, string sectionEntry, string value, - double fNumber, double exposureSecs, double focalLength, long iso, string lens, string camera) { - - string s; - - // We don't do anything to the value if it's not our camera - if (camera.EndsWith("NIKON D700", StringComparison.InvariantCultureIgnoreCase) && lens.Contains("24.0-120.0 mm f/4.0")) { - switch (sectionEntry) { - // Here is the place to adjust your settings - // Pretty simple: "SectionName/EntryName" in options file - - case "Vignetting Correction/Amount": - value = (fNumber < 8 && focalLength < 30) ? "30" : "0"; - break; - - case "RAW/CA": - value = ToBool(fNumber < 11); // Means "Enabled if fnumber<11, otherwise disabled" - break; - - case "Impulse Denoising/Enabled": - value = ToBool(iso >= 3200); - break; - - case "HLRecovery/Enabled": - value = ToBool(iso >= 1600); // Dynamic range decreases, so we'll probably need it - break; - - case "Color Boost/Amount": - if (iso >= 6400) value = "0"; // Colors will get poppy anyway... - break; - - case "Distortion/Amount": - // we already checked in the IF upstairs that this is "our" lens - value = distNikkor24120f4.GetDistortionAmount(focalLength); - break; - - // Add other parameters here. Mention this is case sensitive! - - default: break; // we don't touch values we don't care about - } - } // end if camera=xxx - - - // This is for camera independent settings - switch (sectionEntry) { - // These are parsed from EXIFTOOL and XMP in DNG (see http://en.wikipedia.org/wiki/Extensible_Metadata_Platform) - case "IPTC/City": - s = exif.Get("City"); - if (!String.IsNullOrEmpty(s)) value = s; - break; - - case "IPTC/Country": - s = exif.Get("Country"); - if (!String.IsNullOrEmpty(s)) value = s; - break; - - case "IPTC/Caption": - case "IPTC/Title": - s = exif.Get("Headline"); - if (!String.IsNullOrEmpty(s)) value = s; - break; - - // Add other parameters here. Mention this is case sensitive! - - default: break; // we don't touch values we don't care about - } - return value; - } - - #region * Main and Helpers - static string ToBool(bool condition) { return condition ? "true" : "false"; } - static string ToFloat(float f) { return f.ToString(CultureInfo.InvariantCulture); } - - /// Reads default file and parses it. No need to touch it for your personal settings. - /// Command line args - /// 0 on all OK. - static int Main(string[] args) { - int exitCode = 0; - - try { - #region Parse input parameters - int argNo = 0; - - // Name of raw/JPG to process - string sourceFile = args[argNo++]; - - // What the user selected as his base profile - string defaultProfileFilePath = args[argNo++]; - - // Cache directory, for any logging file - string cachePath = args[argNo++]; - - - // True if the image is only being flagged as inTrash, rank or colorLabel but still need valid PP3 - actually not used by this script - bool forFlaggingPurpose = bool.Parse(args[argNo++], CultureInfo.InvariantCulture); - - // Note that old C++ has no automatic number globalization - double fNumber = double.Parse(args[argNo++], CultureInfo.InvariantCulture); - double exposureSecs = double.Parse(args[argNo++], CultureInfo.InvariantCulture); - double focalLength = double.Parse(args[argNo++], CultureInfo.InvariantCulture); - long iso = long.Parse(args[argNo++], CultureInfo.InvariantCulture); - - string lens = args[argNo++]; - string cameraMake = args[argNo++]; - string cameraModel = args[argNo++]; - string camera = cameraMake + " " + cameraModel; - #endregion - - // Read default file as basis - string[] lines = File.ReadAllLines(defaultProfileFilePath); - - NameValueCollection nvEXIF = ParseFullExifData(sourceFile); - - // File should be Windows ANSI - using (TextWriter tw = new StreamWriter(sourceFile + ".pp3", false, new UTF8Encoding(false))) { - string section = ""; - - foreach (string line in lines) { - string l = line.Trim(); - if (!String.IsNullOrEmpty(line)) { - - if (l.StartsWith("[")) - section = l.Trim(new char[] { '[', ']' }); - else if (char.IsLetterOrDigit(l[0]) && l.Contains("=")) { - int valPos = l.IndexOf("=") + 1; - - string newValue = GetCorrectedSetting(nvEXIF, section + "/" + l.Substring(0, valPos - 1), l.Substring(valPos).Trim(), - fNumber, exposureSecs, focalLength, iso, lens, camera); - - // Merge in new value - l = l.Substring(0, valPos) + (newValue ?? ""); - } - } - - tw.WriteLine(l); - } - } - - } catch (Exception ex) { - Console.WriteLine("Error: " + ex.ToString()); // can be seen in the RT console window - - exitCode = 1; - } - - return exitCode; - } - - - static NameValueCollection ParseFullExifData(string filePath) { - NameValueCollection nv = new NameValueCollection(); - - string exifToolPath = ConfigurationManager.AppSettings["ExifToolPath"]; - if (!String.IsNullOrEmpty(exifToolPath)) { - ProcessStartInfo psi = new ProcessStartInfo(exifToolPath, "\"" + filePath + "\" -tab -short"); - psi.CreateNoWindow = false; - psi.UseShellExecute = false; - psi.StandardOutputEncoding = System.Text.Encoding.UTF8; - psi.RedirectStandardOutput = true; - - Process p = Process.Start(psi); - - using (StreamReader sr = p.StandardOutput) { - while (!sr.EndOfStream) { - string line = sr.ReadLine(); - if (line.Contains("\t")) { - string[] split = line.Split('\t'); - nv.Add(split[0], split[1]); - } - } - } - - p.WaitForExit(); - } - - return nv; - } - - #endregion - } - - #region DistortionCorrectProf - /// Holds a distortion correction profile for one lens. Uses sample points (focal length vs. dist. correction) as input. - class DistortionCorrectProf { - double[] adFocLen, adCorrect; - - /// Parses array to internal structure - /// Focal lengths - /// Correction factors - public DistortionCorrectProf(double[] focLen, double[] correct) { - if (focLen == null || correct == null || focLen.Length != correct.Length || focLen.Length < 2) - throw new Exception("DistortionCorrectProf inputs must be valid and of the same lengths, at least 2 points"); - - adFocLen = focLen; adCorrect = correct; - - for (int i = 0; i < adFocLen.Length - 1; i++) - if (adFocLen[i] >= adFocLen[i + 1]) throw new Exception("The distortion correction focal length points must be ordered!"); - } - - /// Calculates regression value of RT distortion amount for the given focal length. - /// Input focal length. - /// Distortion in RT format. - public string GetDistortionAmount(double focalLength) { - // if it's out of area (which should just happen with e.g. rounding errors), return flat defaults. - if (focalLength <= adFocLen[0]) return adCorrect[0].ToString("G", CultureInfo.InvariantCulture); - if (focalLength >= adFocLen[adFocLen.Length - 1]) return adCorrect[adFocLen.Length - 1].ToString("G", CultureInfo.InvariantCulture); - - for (int i = 0; i < adFocLen.Length - 1; i++) { - if (focalLength >= adFocLen[i] && focalLength < adFocLen[i + 1]) { - // from the sample curves taken so far, it it safe to take a simple linear interpolation here - double corr = adCorrect[i] + (adCorrect[i + 1] - adCorrect[i]) * (focalLength - adFocLen[i]) / (adFocLen[i + 1] - adFocLen[i]); - return corr.ToString("G3", CultureInfo.InvariantCulture); - } - } - - return ""; // should never happen - } - } - #endregion -} +#region Usings +using System; +using System.Text; +using System.IO; +using System.Globalization; +using System.Diagnostics; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +#endregion + +// *** Raw Therapee sample Custom Profile builder (version 2013-08-12) *** +// +// +// WARNING: The command line parameters has changed since this file has been created by Oduis. The new mechanism involves a +// temporary communication file (.ini style) to provide system parameters and metadata read by RawTherapee. This script has +// to be updated by some C# developer in order to work. +// +// +// WARNING: PP3 format may change in the future versions! If this happens there will probably be no automatic migration path, +// you'll have to adjust on your own. This is a sample, and therefore not supported by the RT team (just by oduis) +// +// +// How to use: +// 1. Modify the GetCorrectedSettings function below according to your needs. +// 2. Download and install Microsoft .Net Runtime (latest version is 4.0 as of writing), if it's not already on your machine. +// You can get it for free via Windows Update or from microsoft.com. No need for Visual Studio etc. +// 3. Open a command line and compile this CS-File using the C# 32bit compiler. It is usually installed somewhere here: +// C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe +// Call csc.exe (C#-Compiler) with your .CS file as parameter like this (one big line): +// +// C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc +// /r:C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.dll +// /r:C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Configuration.dll +// RTProfileBuilderSample.cs +// +// (On most machines it already works with "C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc RTProfileBuilderSample.cs") +// CSC will compile it and emit an EXE. +// 4. Open your RT options files and find the entry [Profiles]/CustomProfileBuilder +// 5. Enter the path to your newly built exe here. On Windows, don't forget double slashes (e.g. "C:\\MyDir\\Mybuilder.exe") +// And you're done! The EXE is only called on opening the image editor and there is no PP3 already +// +// If you want to use EXIFTOOL to gather more details information to build queries: +// 1. Download exiftool.exe from http://www.sno.phy.queensu.ca/~phil/exiftool/ +// 2. Rename it to exiftool.exe (NOT exiftool(-k).. or something!) +// 3. Copy the RTProfilerBuilder.exe.config next to your own EXE. If you renamed it, rename config to "(Yourname).exe.config" +// 4. Open the config with notepad (it's an XML file). Set ExifToolPath to your downloaded and renamed exe +// +// If you want to know what parameters are available, call "exiftool.exe -tab -short" +// +// This description is for Windows. The C# code does not use anything fancy, will probably work with MONO on Linux/OSX, too + +namespace RTProfilerBuilder { + /// Main class. Mostly change GetCorrectedSettings. + class RTProfileBuilder { + + /// Adds the Nikkor zoom distortion correction profile. + /// First array is list of focal lengths, second array is the RT setting that should correct the + /// distortion for the corresponding focal length. Values between these values are automatically interpolated. + /// The focal length values must already be ordered. The number of sample points is not limited. + static DistortionCorrectProf distNikkor24120f4 = new DistortionCorrectProf( + new double[] { 24, 28, 35, 50, 70, 85, 120 }, + new double[] { -0.1, -0.063, -0.012, 0.018, 0.034, 0.04, 0.048 } + ); + + + /// This is your personalisation function + /// Full EXIF from EXIFTOOL (if configured). + /// Entry, like "Sharpening/Radius" + /// Current value (from default file) + /// FNumberExposure in seconds + /// Focal length in MMISO value + /// Lens from EXIFCamera from EXIF + /// The value to be written. Simply take the current value if you have nothing to touch. + static string GetCorrectedSetting(NameValueCollection exif, string sectionEntry, string value, + double fNumber, double exposureSecs, double focalLength, long iso, string lens, string camera) { + + string s; + + // We don't do anything to the value if it's not our camera + if (camera.EndsWith("NIKON D700", StringComparison.InvariantCultureIgnoreCase) && lens.Contains("24.0-120.0 mm f/4.0")) { + switch (sectionEntry) { + // Here is the place to adjust your settings + // Pretty simple: "SectionName/EntryName" in options file + + case "Vignetting Correction/Amount": + value = (fNumber < 8 && focalLength < 30) ? "30" : "0"; + break; + + case "RAW/CA": + value = ToBool(fNumber < 11); // Means "Enabled if fnumber<11, otherwise disabled" + break; + + case "Impulse Denoising/Enabled": + value = ToBool(iso >= 3200); + break; + + case "HLRecovery/Enabled": + value = ToBool(iso >= 1600); // Dynamic range decreases, so we'll probably need it + break; + + case "Color Boost/Amount": + if (iso >= 6400) value = "0"; // Colors will get poppy anyway... + break; + + case "Distortion/Amount": + // we already checked in the IF upstairs that this is "our" lens + value = distNikkor24120f4.GetDistortionAmount(focalLength); + break; + + // Add other parameters here. Mention this is case sensitive! + + default: break; // we don't touch values we don't care about + } + } // end if camera=xxx + + + // This is for camera independent settings + switch (sectionEntry) { + // These are parsed from EXIFTOOL and XMP in DNG (see http://en.wikipedia.org/wiki/Extensible_Metadata_Platform) + case "IPTC/City": + s = exif.Get("City"); + if (!String.IsNullOrEmpty(s)) value = s; + break; + + case "IPTC/Country": + s = exif.Get("Country"); + if (!String.IsNullOrEmpty(s)) value = s; + break; + + case "IPTC/Caption": + case "IPTC/Title": + s = exif.Get("Headline"); + if (!String.IsNullOrEmpty(s)) value = s; + break; + + // Add other parameters here. Mention this is case sensitive! + + default: break; // we don't touch values we don't care about + } + return value; + } + +#region * Main and Helpers + static string ToBool(bool condition) { return condition ? "true" : "false"; } + static string ToFloat(float f) { return f.ToString(CultureInfo.InvariantCulture); } + + /// Reads default file and parses it. No need to touch it for your personal settings. + /// Command line args + /// 0 on all OK. + static int Main(string[] args) { + int exitCode = 0; + + try { +#region Parse input parameters + int argNo = 0; + + // Name of raw/JPG to process + string sourceFile = args[argNo++]; + + // What the user selected as his base profile + string defaultProfileFilePath = args[argNo++]; + + // Cache directory, for any logging file + string cachePath = args[argNo++]; + + + // True if the image is only being flagged as inTrash, rank or colorLabel but still need valid PP3 - actually not used by this script + bool forFlaggingPurpose = bool.Parse(args[argNo++], CultureInfo.InvariantCulture); + + // Note that old C++ has no automatic number globalization + double fNumber = double.Parse(args[argNo++], CultureInfo.InvariantCulture); + double exposureSecs = double.Parse(args[argNo++], CultureInfo.InvariantCulture); + double focalLength = double.Parse(args[argNo++], CultureInfo.InvariantCulture); + long iso = long.Parse(args[argNo++], CultureInfo.InvariantCulture); + + string lens = args[argNo++]; + string cameraMake = args[argNo++]; + string cameraModel = args[argNo++]; + string camera = cameraMake + " " + cameraModel; +#endregion + + // Read default file as basis + string[] lines = File.ReadAllLines(defaultProfileFilePath); + + NameValueCollection nvEXIF = ParseFullExifData(sourceFile); + + // File should be Windows ANSI + using (TextWriter tw = new StreamWriter(sourceFile + ".pp3", false, new UTF8Encoding(false))) { + string section = ""; + + foreach (string line in lines) { + string l = line.Trim(); + if (!String.IsNullOrEmpty(line)) { + + if (l.StartsWith("[")) + section = l.Trim(new char[] { '[', ']' }); + else if (char.IsLetterOrDigit(l[0]) && l.Contains("=")) { + int valPos = l.IndexOf("=") + 1; + + string newValue = GetCorrectedSetting(nvEXIF, section + "/" + l.Substring(0, valPos - 1), l.Substring(valPos).Trim(), + fNumber, exposureSecs, focalLength, iso, lens, camera); + + // Merge in new value + l = l.Substring(0, valPos) + (newValue ?? ""); + } + } + + tw.WriteLine(l); + } + } + + } catch (Exception ex) { + Console.WriteLine("Error: " + ex.ToString()); // can be seen in the RT console window + + exitCode = 1; + } + + return exitCode; + } + + + static NameValueCollection ParseFullExifData(string filePath) { + NameValueCollection nv = new NameValueCollection(); + + string exifToolPath = ConfigurationManager.AppSettings["ExifToolPath"]; + if (!String.IsNullOrEmpty(exifToolPath)) { + ProcessStartInfo psi = new ProcessStartInfo(exifToolPath, "\"" + filePath + "\" -tab -short"); + psi.CreateNoWindow = false; + psi.UseShellExecute = false; + psi.StandardOutputEncoding = System.Text.Encoding.UTF8; + psi.RedirectStandardOutput = true; + + Process p = Process.Start(psi); + + using (StreamReader sr = p.StandardOutput) { + while (!sr.EndOfStream) { + string line = sr.ReadLine(); + if (line.Contains("\t")) { + string[] split = line.Split('\t'); + nv.Add(split[0], split[1]); + } + } + } + + p.WaitForExit(); + } + + return nv; + } + +#endregion + } + +#region DistortionCorrectProf + /// Holds a distortion correction profile for one lens. Uses sample points (focal length vs. dist. correction) as input. + class DistortionCorrectProf { + double[] adFocLen, adCorrect; + + /// Parses array to internal structure + /// Focal lengths + /// Correction factors + public DistortionCorrectProf(double[] focLen, double[] correct) { + if (focLen == null || correct == null || focLen.Length != correct.Length || focLen.Length < 2) + throw new Exception("DistortionCorrectProf inputs must be valid and of the same lengths, at least 2 points"); + + adFocLen = focLen; adCorrect = correct; + + for (int i = 0; i < adFocLen.Length - 1; i++) + if (adFocLen[i] >= adFocLen[i + 1]) throw new Exception("The distortion correction focal length points must be ordered!"); + } + + /// Calculates regression value of RT distortion amount for the given focal length. + /// Input focal length. + /// Distortion in RT format. + public string GetDistortionAmount(double focalLength) { + // if it's out of area (which should just happen with e.g. rounding errors), return flat defaults. + if (focalLength <= adFocLen[0]) return adCorrect[0].ToString("G", CultureInfo.InvariantCulture); + if (focalLength >= adFocLen[adFocLen.Length - 1]) return adCorrect[adFocLen.Length - 1].ToString("G", CultureInfo.InvariantCulture); + + for (int i = 0; i < adFocLen.Length - 1; i++) { + if (focalLength >= adFocLen[i] && focalLength < adFocLen[i + 1]) { + // from the sample curves taken so far, it it safe to take a simple linear interpolation here + double corr = adCorrect[i] + (adCorrect[i + 1] - adCorrect[i]) * (focalLength - adFocLen[i]) / (adFocLen[i + 1] - adFocLen[i]); + return corr.ToString("G3", CultureInfo.InvariantCulture); + } + } + + return ""; // should never happen + } + } +#endregion +} diff --git a/tools/RTProfileBuilderSample.exe.config b/tools/RTProfileBuilderSample.exe.config index 2dbb6b973..c054fce6c 100644 --- a/tools/RTProfileBuilderSample.exe.config +++ b/tools/RTProfileBuilderSample.exe.config @@ -1,8 +1,8 @@ - - - - - - - + + + + + + + diff --git a/tools/osx/Info.plist-bin.in b/tools/osx/Info.plist-bin.in index 20ce5a741..33abd4f7a 100644 --- a/tools/osx/Info.plist-bin.in +++ b/tools/osx/Info.plist-bin.in @@ -1,10 +1,10 @@ - - CFBundleName - RawTherapee-bin - CFBundleIdentifier - com.rawtherapee.rawtherapee - + + CFBundleName + RawTherapee-bin + CFBundleIdentifier + com.rawtherapee.rawtherapee + diff --git a/tools/osx/Info.plist.in b/tools/osx/Info.plist.in index e78db0cc4..eec1ab490 100644 --- a/tools/osx/Info.plist.in +++ b/tools/osx/Info.plist.in @@ -1,167 +1,167 @@ - - CFBundleDevelopmentRegion - English - CFBundleDisplayName - RawTherapee - CFBundleDocumentTypes - - - CFBundleTypeExtensions - - pp3 - PP3 - - CFBundleTypeIconFile - profile.icns - CFBundleTypeName - RawTherapee Profile Data - CFBundleTypeRole - Editor - LSIsAppleDefaultForType - - LSItemContentTypes - - com.rawtherapee.pp3 - - - - CFBundleTypeExtensions - - 3FR - 3fr - ARW - arw - CR2 - cr2 - CRF - crf - CRW - crw - DCR - dcr - DNG - dng - FFF - fff - IIQ - iiq - KDC - kdc - MEF - mef - MOS - mos - MRW - mrw - NEF - nef - NRW - nrw - ORF - orf - PEF - pef - RAF - raf - RAW - raw - RW2 - rw2 - RWZ - rwz - SR2 - sr2 - SRF - srf - SRW - srw - - CFBundleTypeMIMETypes - - image/raw - - CFBundleTypeName - Camera Raw - CFBundleTypeRole - Viewer - - - CFBundleTypeExtensions - - JPEG - jpeg - JPG - jpg - PNG - png - TIF - tif - TIFF - tiff - - CFBundleTypeName - Image - CFBundleTypeRole - Viewer - - - CFBundleExecutable - rawtherapee - CFBundleGetInfoString - @version@, Copyright © 2004-2010 Gábor Horváth, 2010-2017 RawTherapee Development Team - CFBundleIconFile - rawtherapee.icns - CFBundleIdentifier - com.rawtherapee.rawtherapee - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - RawTherapee - CFBundlePackageType - APPL - CFBundleShortVersionString - @shortVersion@ - CFBundleSignature - ???? - CFBundleVersion - @shortVersion@ - LSExecutableArchitectures - - @arch@ - - NSHighResolutionCapable - - NSHumanReadableCopyright - Copyright © 2004-2010 Gábor Horváth, 2010-2017 RawTherapee Development Team - UTExportedTypeDeclarations - - - UTTypeConformsTo - - public.data - - UTTypeDescription - RawTherapee Profile Data - UTTypeIconFile - Icons.icns - UTTypeIdentifier - com.rawtherapee.pp3 - UTTypeReferenceURL - http://www.rawtherapee.com/ - UTTypeTagSpecification - - com.apple.ostype - PP3 - public.filename-extension - - pp3 - PP3 - - - - - + + CFBundleDevelopmentRegion + English + CFBundleDisplayName + RawTherapee + CFBundleDocumentTypes + + + CFBundleTypeExtensions + + pp3 + PP3 + + CFBundleTypeIconFile + profile.icns + CFBundleTypeName + RawTherapee Profile Data + CFBundleTypeRole + Editor + LSIsAppleDefaultForType + + LSItemContentTypes + + com.rawtherapee.pp3 + + + + CFBundleTypeExtensions + + 3FR + 3fr + ARW + arw + CR2 + cr2 + CRF + crf + CRW + crw + DCR + dcr + DNG + dng + FFF + fff + IIQ + iiq + KDC + kdc + MEF + mef + MOS + mos + MRW + mrw + NEF + nef + NRW + nrw + ORF + orf + PEF + pef + RAF + raf + RAW + raw + RW2 + rw2 + RWZ + rwz + SR2 + sr2 + SRF + srf + SRW + srw + + CFBundleTypeMIMETypes + + image/raw + + CFBundleTypeName + Camera Raw + CFBundleTypeRole + Viewer + + + CFBundleTypeExtensions + + JPEG + jpeg + JPG + jpg + PNG + png + TIF + tif + TIFF + tiff + + CFBundleTypeName + Image + CFBundleTypeRole + Viewer + + + CFBundleExecutable + rawtherapee + CFBundleGetInfoString + @version@, Copyright © 2004-2010 Gábor Horváth, 2010-2017 RawTherapee Development Team + CFBundleIconFile + rawtherapee.icns + CFBundleIdentifier + com.rawtherapee.rawtherapee + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + RawTherapee + CFBundlePackageType + APPL + CFBundleShortVersionString + @shortVersion@ + CFBundleSignature + ???? + CFBundleVersion + @shortVersion@ + LSExecutableArchitectures + + @arch@ + + NSHighResolutionCapable + + NSHumanReadableCopyright + Copyright © 2004-2010 Gábor Horváth, 2010-2017 RawTherapee Development Team + UTExportedTypeDeclarations + + + UTTypeConformsTo + + public.data + + UTTypeDescription + RawTherapee Profile Data + UTTypeIconFile + Icons.icns + UTTypeIdentifier + com.rawtherapee.pp3 + UTTypeReferenceURL + http://www.rawtherapee.com/ + UTTypeTagSpecification + + com.apple.ostype + PP3 + public.filename-extension + + pp3 + PP3 + + + + + diff --git a/tools/osx/rt.entitlements b/tools/osx/rt.entitlements index 2236af138..082661401 100644 --- a/tools/osx/rt.entitlements +++ b/tools/osx/rt.entitlements @@ -1,20 +1,20 @@ - - application-identifier - com.rawtherapee.rawtherapee - com.apple.security.temporary-exception.files.absolute-path.read-write - - "/" - - com.apple.security.cs.allow-dyld-environment-variables - - com.apple.security.files.user-selected.read-write - - com.apple.security.app-sandbox - - com.apple.security.files.downloads.read-write - - + + application-identifier + com.rawtherapee.rawtherapee + com.apple.security.temporary-exception.files.absolute-path.read-write + + "/" + + com.apple.security.cs.allow-dyld-environment-variables + + com.apple.security.files.user-selected.read-write + + com.apple.security.app-sandbox + + com.apple.security.files.downloads.read-write + + From a87d104a4d5b303666a9f468a209f3d3ed4d91de Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Thu, 3 Oct 2019 16:07:47 +0200 Subject: [PATCH 068/208] NIKON COOLPIX P1000 white level Fixes magenta highlights issue somehow missed in 9764d0e97 --- rtengine/camconst.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index 128ba3e24..3393dec9f 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -1484,7 +1484,7 @@ Camera constants: { // Quality B "make_model": "NIKON COOLPIX P1000", "dcraw_matrix": [ 14294, -6116, -1333, -1628, 10219, 1637, -14, 1158, 5022 ], // ColorMatrix2 from Adobe DNG Converter 11.4 - "ranges": { "black": 200 } + "ranges": { "black": 200, "white": 4093 } }, { // Quality B, no LENR samples From feb278608714b912b9450678a784f517655cd476 Mon Sep 17 00:00:00 2001 From: TooWaBoo Date: Sun, 6 Oct 2019 03:43:10 +0200 Subject: [PATCH 069/208] Update Deutsch locale --- rtdata/languages/Deutsch | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index bd98c63b2..2f7dbaf4c 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -83,6 +83,7 @@ #82 25.05.2019 Erweiterung (TooWaBoo) RT 5.6 #83 06.07.2019 Erweiterung (TooWaBoo) RT 5.6 #84 18.07.2019 Erweiterung (TooWaBoo) RT 5.6 +#84 06.10.2019 Erweiterung (TooWaBoo) RT 5.7 ABOUT_TAB_BUILD;Version ABOUT_TAB_CREDITS;Danksagungen @@ -2375,17 +2376,17 @@ ZOOMPANEL_ZOOMOUT;Herauszoomen\nTaste: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! -!HISTORY_MSG_494;Capture Sharpening -!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only -!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold -!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius -!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold -!HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma -!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations -!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius -!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost -!HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma -!TP_DEHAZE_LUMINANCE;Luminance only -!TP_PDSHARPENING_LABEL;Capture Sharpening -!TP_SHARPENING_GAMMA;Gamma -!TP_SHARPENING_RADIUS_BOOST;Corner radius boost +HISTORY_MSG_494;(Eingangsschärfung) +HISTORY_MSG_DEHAZE_LUMINANCE;(Bildschleier entfernen)\nNur Luminanz +HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;(Eingangsschärfung)\nAuto-Schwelle +HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;(Eingangsschärfung)\nAuto-Radius +HISTORY_MSG_PDSHARPEN_CONTRAST;(Eingangsschärfung)\nKontrastschwelle +HISTORY_MSG_PDSHARPEN_GAMMA;(Eingangsschärfung)\nGamma +HISTORY_MSG_PDSHARPEN_ITERATIONS;(Eingangsschärfung)\nIterationen +HISTORY_MSG_PDSHARPEN_RADIUS;(Eingangsschärfung)\nRadius +HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;(Eingangsschärfung)\nRandschärfe erhöhen +HISTORY_MSG_SHARPENING_GAMMA;(Schärfung) - Gamma +TP_DEHAZE_LUMINANCE;Nur Luminanz +TP_PDSHARPENING_LABEL;Eingangsschärfung +TP_SHARPENING_GAMMA;Gamma +TP_SHARPENING_RADIUS_BOOST;Randschärfe erhöhen From 7885e113b8835c367c8150c2a400ec755cbca1c2 Mon Sep 17 00:00:00 2001 From: Andreas Hoenselaar Date: Sat, 5 Oct 2019 21:47:06 -0800 Subject: [PATCH 070/208] Stop right-shifting of predictor value for Hasselblad pixelshift and align math with lossless JPEG predictor 5 --- rtengine/dcraw.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index ef209118b..400eb62a7 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -2431,8 +2431,6 @@ void CLASS hasselblad_load_raw() for (int c = 0; c < 3; ++c) { back[c] = back[4] + c * raw_width; } - const int sh = tiff_samples > 1; - cblack[6] >>= sh; const int shot = LIM(shot_select, 1, tiff_samples) - 1; for (int row = 0; row < raw_height; ++row) { for (int c = 0; c < 4; ++c) { @@ -2459,14 +2457,14 @@ void CLASS hasselblad_load_raw() if (col) { pred = back[2][s - 2]; if (row > 1 && jh.psv == 11) { - pred += back[0][s] / 2 - back[0][s - 2] / 2; + pred += (back[0][s] - back[0][s - 2]) / 2; } } else { pred = 0x8000 + load_flags; } for (int c = 0; c < tiff_samples; ++c) { pred += diff[(s & 1) * tiff_samples + c]; - const unsigned upix = pred >> sh & 0xffff; + const unsigned upix = pred & 0xffff; if (raw_image && c == shot) { RAW(row, s) = upix; } @@ -2479,8 +2477,10 @@ void CLASS hasselblad_load_raw() *ip = c < 4 ? upix : (*ip + upix) >> 1; } } + if (c == (tiff_samples-1)) { + back[2][s] = static_cast(upix); + } } - back[2][s] = pred; } } } From 1a3d4504d1fc8af0c699bc828f2fe6b37b7bcdb2 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Mon, 7 Oct 2019 21:03:52 +0200 Subject: [PATCH 071/208] Updated file, closes #5301 --- tools/camconst_creator.ods | Bin 12371 -> 13566 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tools/camconst_creator.ods b/tools/camconst_creator.ods index 954abe6ac4cca0e88b754053be164394cabdd30e..8930587ba2779cc4e6cb22adeb5375f3bff687b4 100644 GIT binary patch delta 11607 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

a8GlV$^*)Tv~}hKSQIhezROtN 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 Oml1L4cSall@P7cMgNwib From f7c57eeeda6d9e217419addeb4e74c9f208c35c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Tue, 8 Oct 2019 14:12:42 +0200 Subject: [PATCH 072/208] Make ImProcFunctions::transCoord() const --- rtengine/improcfun.h | 26 +++++++++++++------------- rtengine/iptransform.cc | 26 +++++++++++++------------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 84da1cacc..3a3d461a0 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -67,14 +67,14 @@ class ImProcFunctions void transformGeneral(bool highQuality, Imagefloat *original, Imagefloat *transformed, int cx, int cy, int sx, int sy, int oW, int oH, int fW, int fH, const LensCorrection *pLCPMap); void transformLCPCAOnly(Imagefloat *original, Imagefloat *transformed, int cx, int cy, const LensCorrection *pLCPMap); - bool needsCA(); - bool needsDistortion(); - bool needsRotation(); - bool needsPerspective(); - bool needsGradient(); - bool needsVignetting(); - bool needsLCP(); - bool needsLensfun(); + bool needsCA() const; + bool needsDistortion() const; + bool needsRotation() const; + bool needsPerspective() const; + bool needsGradient() const; + bool needsVignetting() const; + bool needsLCP() const; + bool needsLensfun() const; // static cmsUInt8Number* Mempro = NULL; @@ -99,8 +99,8 @@ public: } void setScale(double iscale); - bool needsTransform(); - bool needsPCVignetting(); + bool needsTransform() const; + bool needsPCVignetting() const; void firstAnalysis(const Imagefloat* const working, const procparams::ProcParams ¶ms, LUTu & vhist16); void updateColorProfiles(const Glib::ustring& monitorProfile, RenderingIntent monitorIntent, bool softProof, bool gamutCheck); @@ -247,11 +247,11 @@ public: // CieImage *ciec; void workingtrc(const Imagefloat* src, Imagefloat* dst, int cw, int ch, int mul, const Glib::ustring &profile, double gampos, double slpos, cmsHTRANSFORM &transform, bool normalizeIn = true, bool normalizeOut = true, bool keepTransForm = false) const; - bool transCoord(int W, int H, int x, int y, int w, int h, int& xv, int& yv, int& wv, int& hv, double ascaleDef = -1, const LensCorrection *pLCPMap = nullptr); - bool transCoord(int W, int H, const std::vector &src, std::vector &red, std::vector &green, std::vector &blue, double ascaleDef = -1, const LensCorrection *pLCPMap = nullptr); + bool transCoord(int W, int H, int x, int y, int w, int h, int& xv, int& yv, int& wv, int& hv, double ascaleDef = -1, const LensCorrection *pLCPMap = nullptr) const; + bool transCoord(int W, int H, const std::vector &src, std::vector &red, std::vector &green, std::vector &blue, double ascaleDef = -1, const LensCorrection *pLCPMap = nullptr) const; static void getAutoExp(const LUTu & histogram, int histcompr, double clip, double& expcomp, int& bright, int& contr, int& black, int& hlcompr, int& hlcomprthresh); static double getAutoDistor(const Glib::ustring& fname, int thumb_size); - double getTransformAutoFill(int oW, int oH, const LensCorrection *pLCPMap = nullptr); + double getTransformAutoFill(int oW, int oH, const LensCorrection *pLCPMap = nullptr) const; void rgb2lab(const Imagefloat &src, LabImage &dst, const Glib::ustring &workingSpace); void lab2rgb(const LabImage &src, Imagefloat &dst, const Glib::ustring &workingSpace); }; diff --git a/rtengine/iptransform.cc b/rtengine/iptransform.cc index 99fd39f7e..69b57d0ba 100644 --- a/rtengine/iptransform.cc +++ b/rtengine/iptransform.cc @@ -208,7 +208,7 @@ namespace rtengine #define CLIPTOC(a,b,c,d) ((a)>=(b)?((a)<=(c)?(a):(d=true,(c))):(d=true,(b))) bool ImProcFunctions::transCoord (int W, int H, const std::vector &src, std::vector &red, std::vector &green, std::vector &blue, double ascaleDef, - const LensCorrection *pLCPMap) + const LensCorrection *pLCPMap) const { bool clipped = false; @@ -310,7 +310,7 @@ bool ImProcFunctions::transCoord (int W, int H, const std::vector &src, } // Transform all corners and critical sidelines of an image -bool ImProcFunctions::transCoord (int W, int H, int x, int y, int w, int h, int& xv, int& yv, int& wv, int& hv, double ascaleDef, const LensCorrection *pLCPMap) +bool ImProcFunctions::transCoord (int W, int H, int x, int y, int w, int h, int& xv, int& yv, int& wv, int& hv, double ascaleDef, const LensCorrection *pLCPMap) const { const int DivisionsPerBorder = 32; @@ -1113,7 +1113,7 @@ void ImProcFunctions::transformLCPCAOnly(Imagefloat *original, Imagefloat *trans } -double ImProcFunctions::getTransformAutoFill (int oW, int oH, const LensCorrection *pLCPMap) +double ImProcFunctions::getTransformAutoFill (int oW, int oH, const LensCorrection *pLCPMap) const { if (!needsCA() && !needsDistortion() && !needsRotation() && !needsPerspective() && (!params->lensProf.useDist || pLCPMap == nullptr)) { return 1; @@ -1137,52 +1137,52 @@ double ImProcFunctions::getTransformAutoFill (int oW, int oH, const LensCorrecti return scaleL; } -bool ImProcFunctions::needsCA () +bool ImProcFunctions::needsCA () const { return fabs (params->cacorrection.red) > 1e-15 || fabs (params->cacorrection.blue) > 1e-15; } -bool ImProcFunctions::needsDistortion () +bool ImProcFunctions::needsDistortion () const { return fabs (params->distortion.amount) > 1e-15; } -bool ImProcFunctions::needsRotation () +bool ImProcFunctions::needsRotation () const { return fabs (params->rotate.degree) > 1e-15; } -bool ImProcFunctions::needsPerspective () +bool ImProcFunctions::needsPerspective () const { return params->perspective.horizontal || params->perspective.vertical; } -bool ImProcFunctions::needsGradient () +bool ImProcFunctions::needsGradient () const { return params->gradient.enabled && fabs (params->gradient.strength) > 1e-15; } -bool ImProcFunctions::needsPCVignetting () +bool ImProcFunctions::needsPCVignetting () const { return params->pcvignette.enabled && fabs (params->pcvignette.strength) > 1e-15; } -bool ImProcFunctions::needsVignetting () +bool ImProcFunctions::needsVignetting () const { return params->vignetting.amount; } -bool ImProcFunctions::needsLCP () +bool ImProcFunctions::needsLCP () const { return params->lensProf.useLcp(); } -bool ImProcFunctions::needsLensfun() +bool ImProcFunctions::needsLensfun() const { return params->lensProf.useLensfun(); } -bool ImProcFunctions::needsTransform () +bool ImProcFunctions::needsTransform () const { return needsCA () || needsDistortion () || needsRotation () || needsPerspective () || needsGradient () || needsPCVignetting () || needsVignetting () || needsLCP() || needsLensfun(); } From bbb410fc1411c367a991b53e542f52197423b062 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Fri, 11 Oct 2019 12:21:35 +0200 Subject: [PATCH 073/208] Added RICOH GR III dual-illuminant DCP --- rtdata/dcpprofiles/RICOH GR III.dcp | Bin 0 -> 1102958 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 rtdata/dcpprofiles/RICOH GR III.dcp diff --git a/rtdata/dcpprofiles/RICOH GR III.dcp b/rtdata/dcpprofiles/RICOH GR III.dcp new file mode 100644 index 0000000000000000000000000000000000000000..f226e62b42a1effb9a42beec188a8eb20323e8ab GIT binary patch literal 1102958 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�C zeyXFI2H5k}0vuwSD)$(*FhJD*sDlBFzNa1rxZkpXT_^+m{4)*b@fWDn0C~UCBp(0! z0(_BTz}5v#Gr;g)G{XSrZqhuqulg3S8)bm}JG8_A(Id3X049%Vr2$5sFF^e+1DtmBLh?l#yHmhv$Wq3MQwE05I&dE*u65u<1RXGh;RR(N=8`SO*M_+*OSH$ zmJy!bq84mh4NwOoynBy&7$M+68oO9Vc>aWjvu*W)N{vuFL6eLStdP!5mJwd4&@>~Q z)}R?iSf@+#j1X#=&Tf_wUYXJoBm8JZ%ZyNHPb-aJ=912imJu#^&>ABY`OrEeSO(HY zBU}tkXIIMz?|`-#!CFe&jL;oVJB_e6Ih~y?Bg~yidyHU`O8brQ*8)0hgnf(C+1)b2 z{7gE|`BqRixGon^O=G;bI-MOZV>qs*7RIa!(~f4yIjWj^CKE=jEy^} z)EI8NXp%9m?@ec?%NUz#X__%4hiQf}ZXBU`#wa_Q&Tf}6ypGcnWBhZHmKmesG_5p- z@0oOVyo_=49IY|NhaI%e7y+HM(HOUWPiNQ57?sy(i!p-!rfr<}ChasveqTB}U&c_n zLwk&|f0*_g!{-qlHs+e!bauatvG5fgH^#F!RLKN;6&K+jSX@&`+!)Trf zZeSt1VJ0Y)(h?IWPoZTds7a=kCh(oPkR35Lz~;~z6D(Rl>rC)`5p6Us6X}<}+E~CRHi2QINyJIHkuA<{6$p4fo znL??WYMSD}fradlnZoCDYGI0tb=1KWi@u^Brg+x0kXs^lL(5E&e~VV~bqp+I$IKM_ z@6sB+j!{}?ijK#$(UjL;7P4z*il?t>iz&9rEyCqCQy41KPE%B?FJkA+6eilVhvVqc zep8qm(_vH8nlEDa%oNr(bleo5J5VJv*tt?oGkhUg#15Jn9DS*U8IA-}2Q#>YQ4ceG zg+=V5nZaF3!_CkXPo-w?Or}X@I6h+$J85R{nM2de@W1&q!wdn7Xr38PEnCEEjb;d5 zPD{-2Lmn+NLs${5G(+pVi`Y>!gLseDnBk`lw9X7sn`xsN&Q~mASIvyqifD@&E__Ve z%n-MmcADYRzD4Y;nIZ8Y?J+~=VcKtosSR}448I>;#O|6IW*n#EX87|YRWe7)X{u?C z>#d8}VKYbSIci~!zb;S*bIkvhdYGf;Fo((mnrDvHPZqJ;X3l%Bw8R`q^c%W+%=9%ip1C7Pz*SW>_Gql;&CB*rvto##z8@3oWrg z#YeP^O||W`(gKTjE@ns0g7@-ijRit#Xq^R)d`=rJpkKe3T{#PE{ED_%V7Q64Ss>|K z+G&9=PAz6mU|uI3x4?SogI;Q3iL~3)!4ek-sfQ&3?k{GS&Ju?n&~Qs=Kc!Mj6uh8GmS`VejQc5;u#{hd z`)QVVN10|=qEnsbS;Ag>3A=TcSg%J*Eb)gCEwhB1Ij!XU)=Mz5%MyRt(;7?oxX?OF zZ1tdxmbm4;gk3vJ1P9O-OY8`tZI&2{pq-XL^b%e}x5S=U+GB~)1ln(j*lBdw61B6I zuzP2TXQ_1D5=m)P$qIFgsiqaiGnTM}XN6fg)WQl!^QnUs6jxCXE6iWBgk3xtue!IDLa1F*cC);tZ_Yz*0Bi}NgJ(^ zCSA&|pEVA~(-v#|mqgpF;V^@CS|e-rQg;5V@zp%qV~zXiwBH(@OX;vRin5ln`)7^+ zt)LUucwRu2*-%?ewQMl2cq!x!ZBVhETH4^`M(SvT+ncGx2D)39vI}T~h)Nn^gWQj) z%mznx(PSIk*}D{qv)O2?rRg>(I7BmTaJ-)8+u+GpOW6&yLEtf3YJ;`k(sCQF)uL54 z_~(bEP~L3=^|Q3r20`a(y$v!uXp;>-{dFn3f;RZ+H`;20(LZUs4J>ZZE*nhgSqjx_ zHYmPDdu>qPPX}!9#~nIi1G$l<><+RK_lQo|V8Ju0Y>N+HQY~9FPb_7J&=&pj%b;#) z3q2L;Xp6{6RAP$)?Pcr|+Tws7jj-jKB`UMUm>EsBg@g4nb_#7V)1Ic=;(ceDX^SRz zns1ALyq2+BXbW|JTFN$DFfF%5MmVjq#V3)=*fF%lSt+fx#YjA@w}n|UZL&rDjAiT^ z+G5RY+G>k0=FxUrTuG;0ws^Z_89Rrz@W`UQwwS+y4%lLA0Ufc$sa4C^J+wvN8aiQ% z$?K`I9eg)ZEjuJ^UWUnrc34(HE$y&=8+Ek9t{qfjho+s&*hRGCvtBg94mS@_nH`iq zr^y_rZW;7v+hOsSG~JHZENG@3emqX|?Qr+xGIkT~V0@aEvK`k-%k7Z)Gp({iY5Ou5 z?zY38OSIMw-*nM>J9J#3O?J3-Z5g|Yc6jj@ZMDPXo3z~yZntR{TXloW_}$YE3+~Zg zJG?VW2lzT3(-AuydA^L@MLV2%MJMdg{e~*rQF~E z;Pk1)9=XOD>@wP8vpJ2hM~yX=+2cEVnrzPuRtC&x+hfq3rrYDK7tOSXi9gM^hfi<@ zyNztzh0{`dERCe)_Q;pgDti>gXTWl|J>E^Cwf0yyoz~l^j<`ERD9> zW9wqtZjXH#w96jfF3*7VHGBM$M|=C<(Dm!3C zIn`pj?!ydrAlaa+qLysSeL@}CirY;k4p_D?gZGRakX=h79FTj6${bKoPm>+6>Z=TP zA|0@%iKaW?y%RLk0j1y3d_|FbR~M~y zz}_pg-T?=$(Iy9c_E!eGk`DNym$o{f;Xm5$fUgH=mjjO7&0uHJ0pE_$UI(0dL{L2pR6^4o@z{rEI^tOX&3DAhkW6+f9WfC> zOC2E}P0JlICZkmxXG$hJmYg@4);i++3|jAqZ)ejcM;w}$$*!d%cBIo*M{HO^+a2*< zChg*X=VY>T>4*>VX|E&7i|BwOK75ysIHGc0CcBr8__&l#IAYf(s_cZ1%BdFHb0221 zgXx6jRn*c6sh?0sC$=4_#0mcUGTFs+f_*KGaDv_;DszH-JxzAP!!I-0$#lZaMw;$~ zuH!V*2`wjSz7wAV$YeLu3Hw@TsS~#TM9bO4Yok?8$hw%xj;0e*I%%yFVt%LfPVl`- zo19>KBa>ZCCqCOmTb=OcU)t`3kv`hxgr1>Hb~c^x%YEAGgwqe`fD^uaLPwlXJ(kJt zrW49v(+Rfw-cn^}%vQ`ou$D8tRI?Cb=nQoYYUzyI+SJh*EqYYqj6FtKymsV_m1Z=; z8B?sN%o#p*G}#%}PFV<>?F?-oJn=F(PYRHe~&XS}{?OIM65Q%6_cXQvWZe4~}kE~zU%oJ=EJvCNRlToGYP zlU-qCnaxhAD<0a=bXWZ1Kr>xY=R)&cQR z2V4=9Nk?4qdU-axr>^)Zk50Ivd?i(OL&7^$%MChfv)Ms)!=LM^r5pBcq>gS#-%KTL zu&c;s7u5|zAJGW5_qJ1+8;U-q$!-YPlg&=58(!_B>25e%OEcY2c8KP?A-+DF-BdSd zeML*%@JAypcSH4YTIGfXC$rg6b%V|KwAKv+KhkUh#U6&m(A`f=NX_AoaZi8cE|N$s^yL? z53@1P&>ewKsiivx$Ec$_cE6?)cgWsmv&-s^X9~+PKf)dLDpclQz%Snoos+~MxA9O=8=`8ko+x?`Ik zt><|`w8W%|~wz?xBnzp;+m5g?|qma`MxCS`Tdbiq?DZ?|$0kfq~=8*_HLc?vu3DgU|2LcD}A3X_p5! zon6k(tOqR4(_YSdfev_J<}Y-_1H)a**`4)3#T7c?0lRBdS%P10P%R18_bg|JRs#21 z)KY@K`>3M?9}Q871flnrvr8+%y-^w=!T!foCPDafn#|VU%jN9UN>DUG(ZuIqcp_U>r*)B+C;bZTg;C%*oSwtGVM1?}SNKazvuYo1vDHSP6;(J?yU ziQ^~eh$j-i%VBqyO~UW#geNw&P-QP@|3tOCu=9KlJG@>n?Vy%k`0N+z=mp2iRN{rB zS8~|p^@7he8sUZJ8&u|n#2%XLg~5Mw*y;7c`+YRs3+6*K(+j8W(R?q=7|mg~m(9XQ zwA2d~&uF<9^k32{FYFu7VaL}C)^aOQTI+>+MOyC#cU9Wtg%gujuxHQnwATw)t?7Ul=G)T|FWhok!S1gYvfStdUx$P$dt;Rk)nbd# ze+4!fdSgQ{wPf2boH}~rLr{q~bYfPp3+#>Eu{6RP<_T2hjYG*a*&EI?R$%jNZ#1RQ zbZW?dD^R}M8(*xXwcdPIoYs4z zyqGqzrTE?oc7?r>wSl&Jqk9u=_eN?t?ea$N))lC@=8a{QwAUMVchCWE6z-%W-fT3i zV0YLX>-WFvvN^=%@^x)Xs<82^XPyt{8rKtU+h?&%kHu-?ysQ} zzKDB|D*NHvQmVza;ig=6nEm)n0=4vm@>c5Thc(-%#1BK;bFn|b4|6}I5q`L|o66WE z+((oBP*Ic1PO~5SKBMV=z!x;r5BrbMd_O$@Dwo}6Kg?{RrG7YeoR<4x(n(t7$2HTr z>^S@3+z+(Y4_0Sry&vBDnKt?HUPmqte&+|@i?r1b+kd6)ezf9!sh%PzD(9!<~)eu&;{c+rn zw)#Ueh_?G)elLHaalZXG!4n*0%G(8Z%-lmy>&>N)rY#ZLqV>dexpAXa0 zKny*g<$>^gLaPGt?(;l+w>uCmFKKNc6ennXAQI&A@m*6OK2gkPS33|lRA_4;tS8ZS zHWjsKS0Fyr%}4XKK>Vmrdjm0ILo0 zAe>B~nL!v#rujiInUT+KcMuX%XlW3im!suDXq`{1f}pf8pB?WYBrc(~LHIO-)(7FQ zY}ynAo7{YMy@QZlKwE=wtcbRA{C8*<$6uSz&Ns(jPkTB320FmwHqntF+$zgw_nYr$ zE1d{}bQ@I;#+vO^D;QsXlFtr!Fh6fm%V22krH;W62dIRt#Dn?lf(PU9AsP{kt94Ws z43#fwaxj9A=CczXj1|XddN68E(9B@ov!?mMko!KL-SA-e{zyxMk#UBW2V>9Av?>@E z+w$2F55}twS{n?HUuk_X7G9=J!T9(}KCc}F0WiD2A*NR>l)ACGE4Ps3{e&OCEwyRT>e3yh&6Rf`eK#IRwA!7O+zu0tEw_9s+-3ni+yDGnyZQ zy_N;+mWSXM8(JEIaeG=G0&8bl6@qZL0(Q(pFi%2jL$Jo1)`wuHA8iW3@xTIh%|p-? zLR&+450bWrKsAzfg}@=EfSvOYM8(qH5GmoX$9<_hv2)JbRq~d9Ye7!lS)GI{_+BL(b*Wxr4ga{p@7Ol(OpE7LwRqn zfSvSEOkPXVL*coeW`-hh1I-V`@=XQoriWrn87&RP7ZtQT6hD1Lt3uIRRltsVC|-R` zYeQkYi`Iw2ubMW6V*369cGW}q-H5h^;-k-Ldng*dpk1M8J5s>TdMN(;iuQ)$O(Pu$ zh52zh5{lse6|lP=irJ^=L?~9BrpjU1(L%M@5LzQL1kgcxki)2P;{e!o%S%S`-i57;r*L5GYnh*qxoU@xW9ni_Au-n zqNQQ@{2nb2!}lY!Dh$^i7O>+UhR086Z5VXMXnhzwUeTs7OqnQP*F6kba)r3r8ivh^ zw4LLs&@PUvUdYZn$JM00Y%A)}fiRrVqa$HBZCJ?edl-H;p%Z+c=2STxSFEU3IR3IN zWCuPR|2a_0aNKpKj^TLZMkV2RDJf(ZJ{$@@G$Nd9VW}(}wm~#G93r%ko%nDph@k1= zSQ|+*!?8Pt=7;0k*g|&W!|~e`S{jbwBwEgKr_m~oJFAc#d5$}W)`mlG9<2|DSsHEP z?na9W*_986+fv#Z4&O}L9uD{Av@0A|xrOY^hhuU9?G1-g5giD}*lIe$_p_#u-T83z ztfLcr9VJvb0)K3zS`qmBgF<%bBXGN%T1MdBR_Yjm$J?kR0j>N>}JW1T?SGkq8)c7qWZLasQ?h5pd|G$^sU*sFr|kUm-jA0*ZswQsDU=>L_sc zK9vacj25zsFYwzV8X<7*DU~rJKSq-UzI;{4PQJi_37RgjU2Y|wWD0Cjr1=8xsH|i+ zUm#nZmI}<*q~!wXI~kIo?d3e)bb#~t(Gh{hWTzjPSU}U+7FTBx2^|4ccdcaiA9%HgzTqu_eN-h9S8AwsB)<7< zCHDb{MAczx6^Yz>>J*77UsBIVI3HcfeF50|J4Qt$`i|4sNc{XiIyDlXom$C#0wPg* znl6k)S_{pJMCe&s5DAlWE4gm~n}}_6LnN+t&@GWT_Y2(~iSN2ravy<6eEB;)7>NUa z(j$@Bew`kR#HPPia$kW+ywgL^L?ZiNdLa^tx9R0bxDKr3J_C_Zy+dzCV&EPfjKuj7 zIvR;X4_9*EfkMLfA{H9R;)TmE4CQ3NPMJt0-KTFM_&L6izBp&nSGV zTEu+`qOfuj6;YU~MPsAjp-ZQ-Rj6OYeF~y*$B-_J!UYqW6@_|pS`dZJRz=*mAPP%t z>4qr4fo@^5(3x)Me6B^@#~=!ydC-GVSnfrSM8U_G9*g3$Cq>-XAPQ|k^h^}0Lg|Gl zWJS=+QIJL!ai4=I*u~JBQILzJgHgB{Pe-HBl32uj52ASgfWC>s+8It7%p=TjjKXZNPO!+&3W_qwDF0XnencZi&XGO>}!S63U8TxF;I=74%>b&A2ir>SQQzHBMtz6>!a zI!guHeCKFv3>4ex)EIPj6v2E>40iuQ7sg;=7tM-+^Y64E1`q!z;=TJGj-{0FJ?)$*`6js6J4d+v)DpFilrP@+_FliO{fsi6li&{x> zPlq~5aZrzXN-@)L759aZLdAp%DSj}cu~KZbq*K}QvsuM`BBYpXPZvt@w zpOl{Ad~x)G6!Ho5vJ~GXt>QitQshjdH>G@TpAJfKC54VkQJ%Vr`%Xv^GM~QTxM@^H zhQo`fHd}p5S8*Q-875^?D;dsYQzsc#ub`eXIOnh8z7#V2Q%HpjJ66$H8Die0Q)L({ zUd4SXWH|aBUC72>Db13>;C)&k!^IC)ao-9VuldpqGI(#LTV#0p5#26BYt<_5VjV{{9!MxX*Wp-!;~`5*834%1_?7#&^3eKlfn_z^u5 zi#bo}g;>0LPA|t|-^*19x*m&=ae6ZrH{Q^}SQN{zM$l+1jFeU*_&MiQp>JX_TmApo zyU(_$&c6NoR?w(miy8}9AvREBER?ld>Am;fdxz-)N{6v`!3t^=Vz11gCSZw>XzUT} zBoM_*85;MoA!qmeOR}E-@B~m8R2ulo@ zLK7_Uqfsi%GA!XVoyslI{vFM;MENXQW(k+MsW4w_32if4Zi!O@t+Yhqd|GXZaf?#f z^{~VZ3#zh2u{Eu?gs~lMv_zvrDsbHr@y@i_5`Eq16HDy#plz10^-g8?!xB$@X@@2E zjiFjr_%@j8SmAtVD&`NdLSzKhvw~JMHL$|2SZZX2MG2|wf>_~E5*4hFn@TOLFgAla zSm8`oDi(TJAxJ_4tk5Z=5mqQ)LKCcDo}0>Uh!sEcP`MSP1vJkJBZ_I66;76>V)0rl zcrT~rR(QXXR&tNLHMH6av)8AxD`JJ~8>z~Q*NAAn74JWzjoj;Rdn&K}T4C5O+H8gG zRrHA!rtYO}RyejVmE935%&(yxR=9M4YFTqlG1aj~&ts|VkZ@1C6I9O{i%wGmYdlm@ zBWvWGNoAMB8e@KlJLG!F};4Uq*hSR-Nc1*0%{(zQSqwF!Qw1&~2wAvb%pQf^FVvV>LRAr4m zFKN9sHoT^d)?DY7%Fc;3s^8IOYs~pbpIGDUXWC{ByUtX0PpomHYZ{z7tP$LUYT4kK z7S*vqdhawi53xaKAF5}AA{}aAgTVu+kqycRrLl`*gKvjWfqUZ(qZT%>A3+^#@O)Gn zTs>@1GMWb1VDdN`VS|ekXo3x*zfEH|#Rk16Q@IUxPo;S_m^F=-aqqbqX>ea_1KaOu zxecz(rj<4bG@;ct_{%JfT@@Ro@&6tw8+6R4^)@J2L>p}|&@v64*KM%bnl{_O(2hRg zo_-Fr%?75MC$yr_;X1m84x53%LBOR8s!i9yuB7Udz-$QFab z)7WLPML{GLZ1E+UTG%2tjyl+)Ut$`3J#4W)nFiQmY#NQQWvhTD*mAvI8jpo+Q755t zTb>u8dE7H@2`#flU@liSt+mBp%V@bRQVVFMEjo&5HJ`UMja?U83|vlCw%ELq*4tvp z8ro=!;&o{Vyl#sw8)>sG*HF_Zws=-f+iVfEEsfn5KHm=7VGEl|s%3{?cT*iZ`23K@ z4h;8j+fViEkoY4tu)~Lg)W{CGN7C4Zu|vP(RItPPlhncv18S**9rDy^?8MmN(-|6I z$8~2kf_uQ#(*!&CUPxm%hR=72%I&bYk>=U)z8+d;hiO;S*pacru4}a14#RKKN;@cT z(`q~Pyqm_Zj2*-+RAqewUqV;Va&+=J~i)w4%JCpECg!>;LwHnQiw8|m!Q*rQR4 z3iepon_Af8cpvIu4$FM;(!XBkx(*%2T8~UjEIy*M@up3Xy?QzzCR@!6sL|Sc+eUsDKwXw$-BdW5;+G(`j9(})~jrPd? zKAoK#?m0J`HrpfCgg&vyeKXo-4-cfXdt;AF^J#}Y<}IRH4me^#bsR9+I-MOH2W+*a zdJg#7ff_iV$cY*`aNT`6yEqO=cc+2_o_bOX2RQgp2M1L9rL&Xc0Np?u;DE$n8sUJZ zP@3R?X%Xq{<~U$^6qP&RWem-8KuA0-bHI(nbar$cV3$J69dIU%Rytr-CareBK2bWm zIt~~kr78!kmD73$d|W~s9pICj&d!blPA#L&4j55DpEy8LMB5y2rzD--9S4{yX@>(g zub^6vTvtwY9O1V%9ikzQs9jI>95HGWHE`s$cxvQ`=8AN7c^n~Zr-CEOcTx*SbW~CY zN3Ih~hs47X>K|x;BlN3jgd-F`(ga7e9871o#}V_6P`M+v9;11V=yH;lIU?wEI%I1d zQKzEiju>->Ryrd49IbZb{$J_r`Z!|#d8%^6wu`jh5#27+Mn{A+r9*Mu5odp+&5juN zJALAa-0QT>5f5*sv-{(SMR#b2BX-`UT2AP3kLoxf>_Iv^Ku-Ai5!G|TgjQAFXskp)Rd z!rmdY-U%Ou(MBgM8j-=ykQ0`VqRmdYqfehW!C)+Hb3)4a40eZ{P-{Rt_`DOTmNUX9 zQypjgJT-$IBJMRdjp{jL*$isnjK?#nkuxl2XRu4;jLNxGaE6u{wQz>JKpmX1bzTNL zMb3D>fCe~Y_F@|0%zy$?lr}m;5}v`%ku&Z@(q?Cv#?U9u*c?aO zobfp!gWV%%_$AX0XVj)rEf=1XpgJz_%*tQ~$pzcRRL=!3q}0HL_v=t27c9-rU>C^+ zO}SKX;W{pA;ezl2>fnL{MH%cQxo|BD4RC>_l18{-)e4&6g635j>?XNj;#w+qLHc@{ z=YqP8w9Ey4wq&rQRF8JXPed2=qM`)W1h8@pfcgY0~Cus-&eNIy?SNx))I<6RcCW9R&SA?FU zdak^-N)24`p@AB?V)4ZcY@Fqa<-btD6?Yn`g)0nyqYkb}xthUFlPhYk(EwNUzDXlo z;dYxQxbpsv40fAb@vNE3T`}uE&2vT4Lt5sF%EuY(IJxpZW?Jrwflq0rE3BW>YFGX@ zoPqMAt~m0Ns`xmsX}v4H`-e8VLjEp;ohMgZ_&}Ro@%3l=#FanmX`3te&&g!>$rbOq z(GFKE=t;HQxStW#al^shnb z++h3-b#O!Yh)nG8aKoliG{6nN>C*@|^cqVO+#rn4WH-tUX$Dm8h9ADAd2YBriI%xx z=+sQ?TFX7IjA^+WmQJUYZaDcJt#-q!?=#tza)aR6DZvdUz4$_-IAw8IUD?5LJIUN}%4cdnz#WQWQfKCV>H9n0OR zfjjCwsgXOrcxSRp<<7nBsNjz10BYfmvLNcH7GI3yt2j*>{dfd}#6E*Na?iOm~ft?kZ>|%MKej61$(7J4E&cG{A#v)@g(X{;sA89+-3>lie)tHFb!}J$Nq<&GW#iW3EU2%0;`RXA?1|5V=o3$j8baGVAq>l6_sbK3!)b>nvPV)aFKpMN zI$k(8I*T1JFFYPg^}L`pff{(h(2yE=!FpmAyI@|3nM?&Q6i=lVUf6F;9lX#uJ&T<% zFP_(+0bUp|i$-{1#vGd91y_?ScEh-rlNptJVXZ*(ys&E?E%U;`1zGHfc|o;^mV4o% z1+Dbr{tmR-3lD9w*cIdB+fkJlK0DBQFAR64jb1Qy&0=TF3;yo3nR_F7(kEWn>P_3c zaK<-_-7zmb@TVPK=n+JUd*xSQgjxd2{_7)$`^$b!y;^#WB>#8_scA?2>uI zKY1SW!@-VmW9h}y|E#mmV0AYA+7Yr!D3qN4OM9tyJmcRB~^Lj#tK^Rjfbmfqc_^u zWTEN0H$JbU&EDv>kv{Rp;LWtn8)M3|*gf;c)UC9`8*{f)EgyL9q&hwjRc7J0AwJl+ zo9g-C^j>PQR#)x!rdCuo2VGEUJ5 zALP{11nxnk&SE#s2b<1Nxeuz&(L5g<{+X8fpspbc*Vg*rmkYGq2RAR#N*_GFOsjqH zswsk%b%Aeem}!+U$d;cjyxzJh)5Sd~mBJi`_LJ z{C1yq_~86Qs^yC-kExC?np?AQYlttN{zdhC@%9-t@J07FYUB&umsz+y%NHYFQ^A*e z$x;hn%zR57d@=8R7VdcX!u}%-@P+qh8sUrZ4w~SLlrAE6+k7GKM&-UJ>Ou2-u}q7W z`9j)Dgu82fk@giW_eE@9TIq`r9a`-RpZ+2=AN7UvK&tYE^3zs3Z(H8;3L}^TTl~5j%3+tHy?wbI%?-TIq*!2U_iiwN4^-<@`|U zLREfP=0@xJydJdC52;=vcINyL>qDFU5aLIl_`y4Xw)w$1NW|`(AFM)XhaV6|wfr$V zg6jCgC`yFChWKMb4At|;s5olikHHDl$RB-^MC{V}b3Hs2{P8K3TKMC2I(6{JUzs92 z^YF)g5e@LiO$m+gN0W>u_@hA~Vz-WawPaH{_q55SdH&eHjF$Pcr6IzLwf@*tNXz}P zs+d;#qo|Zt`y)pwV%N?eq7_u-kK|Rf-XBqGXrn&@*NM=6-5;JCXtO^YHqj^kTuVjU z{9#@pV)xD;Gq=$We@xy%wE{417u5;C@G22r4GF-2Jyb6My?>wv0qC-y8U^5ewTNB3 z0JQ%|g#ff3q!!$}SP@pS%ViO}dI6|yqN)HK`Hj{GVB=NV z7y#)t5#C)7VC#rB2Vnj!`Xm73@6fgYXx$aDyT|8grXAdql9w(nf?DhrX=ocyv#D-3q7YIpLF+P_CBA~k%U)BaCpN>DErgKKqLL;K+GCKp9EsqFxnP~Pv3~y z{R_n15wtT9b)%?u5Vq@6-5@L-BW4FM2$AEceh{oDP{SZhHl)Tu(3vP^7cdAfCs739 z$`ooDgd;}OF$n9XiP;GZf@lT}41(WG8W{v(7EKJom^os01B1}rgetgahbheu!g+J5 z48ji(vm+RU()qL^2#E`6RS;Yj)0!a6v=p-|7=)qLR2_s5Hnf3zr`XY^AgCO~>U zvs)O9x^$`tMrkI^4@SI*DudxD5wl|$j2SXo5sbkKTE)F9me87D+{zKNYslwWO4Y$A z&!Y{&NGPC9!7wcnvvU}X-X*jp7}rZ_YcO^yX?rk|SBTj?42H0Zb_S#G8mb+F=WD5M z2pZRm*+C4!fsIr@1gkbv!w{~|qQ)Wc+A3xjF$AXDDMGk6J+%zsJxbIu1ShM+>?DSu zU=Ixpf%^|MG6duH)5H+GtQNDI7=qd#sUif$2WdVZ_b^q4@Y=4J9mNp*eT-Iw;LHhH z6@s!;v?c_;wPJP^LoiWI)ggFWM;k)$(^=XSf)ziB*;x!hU_EUK!Ibl~H3T0n(Do2C zToPm0yAZA~r=1}@Uq-bM|`k_3RKn+6?ev=x9V#aMThR+V= z^-GFST)s;!L$RraI))Q383k=|3n?qetxXwy#a`OuqchvDK^R5uK{eI@Kb zhQU;a>WATtE;S6pz5&!Y3}J&L>_T!cg0CsUaBT>+48zu8)G-VR!zJuQ^6N*^z%brJ zLnFg*U7sd~VdoeLyOCi?9!C{n5GK(4Fnlne$}k-KR>F>C7-A;T3hpT|g;s^(&Qw|x zhE>KAb|u4LH=U}((BnJW5Qe6iv?&Z*W=YtY7*r^PMzZ(q<$JZV-G8~PbG%*}`-V$~z!vSBa2**1=njg;3N>mw+izSQSmx;RueU4dECOPn*K=dxC_W%W#w=(Ux#5 zPNA*g_>xN7!*L{C!tP}_5;AFLI1EHoI|40YsvCiIQVBbl5pa@I{Rs40LJcEOmrac$ zAj*}niy49G%P1o7G>=+FV0!^|jDT;Egq_R?3@V|45x7)JBO|a>NfWuoeT9VG%n1Cm zk}4v&*CEZ1K*U0 zz>uA^DFP>VN!ZzpU;~l1M4;;)+8TkKducn@c<+;7&btUa+fO_B_%&2J5{nN|-AHsC zlwj`ANbWI6^&^pZlp03D@HjP&#Jv*|b~z)l{uBk*OxIG&NbXld9V2n3P6AWUNQlqU zz(~yaiAF}^+0QgF5<40sFw2bObug-k#NbObKN2T?p~^`3H%ef>E)rdTr4^Cb`5Uc@ zgw<7A!^inu!mei|&+$?VDwudPb3&@&33-_gJ*RD7V3QCRqiCPv}OX9>HZQ7G!5iYQF&BE_Qo zDE!uyDx;9rUCKSkqcE%|t%$-YEn3C3%e`n#6uNySWmhx`yZTUd6s-HvhA2GOp-oX( z-d_sK8&Q}!khVnO#vs}n1>DLzhcp^a z`cyv}e~+ey(O5f{8b`xqyp&ziXxyDZ5shp^Y8j336RBe~&QFrEQ_8izQ)pl`bd6|a zG!7cm#AtX-m$F+LjgK>^A{tv}()?)5pGB3?cr;tej%hUV=hBL3Og5!e(P%WIHC$sW zNZB=w#@F+xIvOYD(}rmHEu>A+=(1SK&S^AuSkRVeSX$B6Xgsy1?a?T+m9l#pjp_EZ zGaA<%sCEppoTzRLM!HDhJTwMsSE?VwwcOM&23nrfI0k#Yr0k-`z}|-jL5QF}iv?&G^SyFi3h=Gxqw#4AH zgto@ORz}-na7!*_cQpo4OK4{d-eyy6uKmlUy0I`_CWZIVShVC({aEA_P{UXl6j9?? zTqu^Z%NmRLQi@pgS5ix^om);FV`02f3SZAy)UKj|v9Mc1BV%!UElrF?^m-|~t+9B& zfhuB=w~6M*a<3z*jKz*}Dg4*PV#Zcl5sSKQv?>;kJ7`TT_X3o%>l%x=N~(_Ke%G{t zYX|qxrdZ7TLCViQv3R(Tw!|X8nzqJb(vP$~7MBl5*?o;g@*&z8i@`^zHrL)ArMhwW z?zog4*f^X$LG|O{bc!0rq2)9+jzhdk$}VgiKC3C>P;`b`#^IZD)RAlKev+~i8^?RH zXkZ+EYM_yEaJfJe<8c3?l-<}kB>qAbap<^A^W#v`M3r$E@tc$#S+2FaLM!4h=XY8a zhx%)@CJyd5q+BBz$Lp9>9fy?Lv>^^J?$D+4qUY2wp7#z@<9MuXm$KOqkMXZ4 z;&JFTwT#F7H`FnnYip$J)W##=9Sw}fi}y4#9+HnVF&@1?OWCcB$NDc+5f6h-njepC zU1W$;#$!Y`89TP|Slyjg#6zbit%^s!7Oja#*IqJqZTWb;sX88SzM>8B$nHy<;?ZA6 z#?Ea#%5`Z=Jf;qytz3IHkhaJ3x~Yua+j!jkns&w`awyeKz=L5_HvxXbW$fT`t<4Ck zp8&^E)Gz_(^{854i1(q1T!Z2(W4AXELH<;ch}!`)Kau?!s!YV?U>RiV5@8Wa zD-ux`MynDrH-gqA;!vcFUEf4ZiKgmARL0PTM2wE3O^MhLFN5MnA_gVWmP8&0($++1 zrO@_7C{ktY{wCr>8tqI(N(R+VVoQ zL-mvKU@tXHhTlGFoXj<7GIoiR;aEeFjPpNI%VZcGq>jm0bx6ieaWdW=rh)vrqck!Z zb;oF8GA5jmv0I#s!jn{yjJ8uWKbd=(P-QaisbuUJC&RmrRwU!<8CsPLyK}TAnR^|} z*fmZD>Zv*zCmLu2@9n-oo05@xQO3@3GXA_oTljUCX=^eLG}3n7L;tIc-Q#44f1{nr zXt_eQQ?T%Ns+)q{*JSJFBBUOtnt zqnrZw7qlV;C)#LL3iMvmniS-`lCi6tg4WkmodUZzv>}CSnrTxCzJ4cTXE_C;_p~Ji z%^zrM3Ko2#?J21GEW`SDDd^KdJ5%@`NVQY(dlxy@>+&AoZgOlGnu_x7R6iBndQ!tw zL~2pvR9w=QW8>^pOzTaNiq&6H%T#>mLmgA$-%pNBo~byiLjzM`(4R)8qIdvJOvTHA za%|2_<@q_PNacDwnxBeML#Z+qIm6`GvMv>^-_Q!)GdhA+rQ*ktv?di_>&a1mES2v~ zRGo_E(X=5IMq_DHD&*tjsJM}e#__a;k840%QxR`S+f#A+TRFSWspvb2cBaC2GSyCl zdJ5G|!#E>3whc`~ficxj!}Dp>koSJhpvGx9`kkCz=rrzuNRbA`ENYpChqI|;8m#8Z zvBNVB`%GwH8U~or$TXyz)5J7hGm*0!od#hZRit6Ze43wzHw&mT4GR~^v1?r#RxPF# zd|V4!m4+Esv?dKX)^c{G({ROxs?#vWjy9wr*`79~q0T{$svBwO??hX8&!aPKO+$?f zZBIj|tDN2GG&s1^&NP&JQ0;Vd^`g4zi13zU&(L&S^r8CcF!rN{>Dna2lA7E|D}c9Zpd+F&!1ra(1iJdA^V;(jmmr z{B)GXQ)N1u6Xe*xE*(>oXa(>2N~TrmxST?3(%Fubvun+J1=FcIo!63SLpu6o(WZ3x zisY!dk&eA$+LDfs655&$YZ+}%#|F8a-RpGxsi2+dn3GMld2dt>)y=?-Tsb?~88BQ% z^)rx>M-4MjpHGc5@O7b_UF-~m7g1#3a51&a;NGp&F@yK;%Gt@zzz!u1%)sBvX=DZ# zuB3^)M`)Ft-RulJSWOifn6Z}TXCQkWRc7F~^>TK!GcbB1t;j&qCR&vN^=4X=0o`&r zyV@BDsG#Z$RBxpX8Thh|Hf6wmhn$^l-b=HSwq)S>F4~#_vntxod$4xP+1<{-ojtTO z1CxHB+L?&hM|F7*%zimL+?lvjP4zP|9$8vVV zv+(!{Rb*lGpEN%UK7UbV7S=qKb8lH*i+)BcvhdXlT9w874QWjlmbA;+70<%SmsFjF ze_qjsEKK{GHf6DIDo4YOEbRJ+wq&8@Ep5%h@b|Pm3vM6e?2cza`H^<=n*JxME#h9V zR9D1%g5|g{RK(e!`XXp|Rp5f52%g=jv54nU73`ApT2l`S5iGQ*r3l&D)KP@fy%f0Q z$$#FP28uAf4~-P@IxbBVp|YQX-SYpr)=Cv3jOb7EMerCvl_D%3sNmk`B3v3oD@4%x znpTN0ZwRdsK{8aquDJ+Dhfy`J*?mJBM3_8+Hi-~1Qh}x$B5WN+TST~{M_WZ0GMcuF z;50_T?zsrXV`--d_2a0vn7tvY%X9n&3j8)yjM;`%Uktx*si7D-6REKnRg)C#qKk2P zGUXBQ>nYSyjHyP{QH)4q1+IFEv3(j16yxr68p(6--_b-d+kpyp)5R$Lo+`v>m__q> z?Pv~FieWxifoto;$TXo9VjMK3Rbsp_qcvg}3JP}B#r*6^)naU!M;pXAH=j0%*+Ej^ z#tmKzSwvgJ?9b9xF}y8kyBKmy1-t8F?6jhtVqCDM+7k9@sV>i<*(q>qs01Q=sxQG| z2WlumnA#f>7Wmf~|UZIEJYDQ)68yfOt^Z%7fZq%BgcT25P~?0V96DVkR* z*qxW6$7Adn(wWmtoU-sxL#`25Kn7la16^hQ6B>?9$6HeG7#Q zp5@f?e?F^GM;W$nRj^Yp!})DAP=*)VX`~E;cG5%{=I&Db?`N%mN~+*zo+_Fz!`|Ig zDMQm91v~aK{Ii!<$S`6bt&(Bhep(|#M74rldwy1^p=ucp{74&QID3FL$#C_cf}MLA z9vz}BGQ2rVTV?2Zl(x%w?M%V$y^Os;+9|{A6I5Fczmrr~j+|2pyc)`5rPEYjj?1;w zP>$CsYAnaFIt5==UMDuxU`3qI@7~--5|E%NBl15q~$JHiUCC8&*X^k9jepBG>F*$l( zrD{2b{7xI>Fug{bp1Jf^xyTjjWNi?+-0{wVt3X(b0w0DdkbaNqE0A}e8Y-~%0X0@|J+1;DXDe|05rqQhA5%-d_D`sz0)zfk zFp;Rh+`nj`0)bCyqykHy(L@FIK3Cv#Cf{pcPzC>;+GxH4S}&982|52dhm;y0xsagTaJKCT?@q5~&z~&DMbly;4|3})QKxH{Oiju|JwEc^yvBTUqAZ4uOI$@-s|!2-#?)BuZDg9@7E3cSFLXU z%3t=s&ujdD&(~|zzklt+zpwXye-Qrf-|t`Z=bG0+GXt6#(9D2l1~fCEnE}lVXl6h& z1DYAo%z$PFG&7)?0nH3(W~c8% zsV8JsY!Du;QlhhGcVVjOYT;scC3Mz2Ft4ar3g^Sh;4Zmn?*6`5m~ycc`Znv$X zQ_a4*@mer^SA_4L_BMOtuZ68{MVQ|Go@xHC1CU%@2)kd7nZ~A$MAW+iwEwl%)a-)+ zw&)c=woqg`zI+-?k&nJE4yI3Jb5ZD(hj&XRnGQNXACA$>ux4Ig(@ojdFi&2Jom(H7 zlwERyUP3OuKYq-lQ_l;{Kjgq6e!0nHMIao9kB7?RV~TSG9}Kpt}SY&n(8%0tL+e$i)A5<}XzYfoyxVkh5etp3m4U z#3bzz&N(lK!B;NAcgn4T(nZ+s$i-7Yeaom*VNsjph=cJYl({1W6%l%;Wyd6&xQFQaTy+uV3y=*ZptR0A6 z+X^x8(=pSy8KdyvWdRhM)|oE0F@*EC1^CrfY&!YTG^}^XM{iw6{`$H2Cq55GT_>AP z`aB;cdCOqDq_64JAFVN9-BM&6dt_qr+6i~dbKx3&%;X@vpmRS5Xi%D9Lm-l^b5OF~ z+hoM12&j%^qh`qnlNP6Vd@;zzx)%*|L+VnYzx99q`{~l9{GAB*#xKFNpS{ih_@IDE z7sY>G=g$L%p!`OSu;Qf>)uo$+DD6GM$qPz+I^--=lvN15GnH7WH%=(%wm}&Br3}8k zdJDggUoET?m!Y`&m3i^l%3>5xzENzq1&|*v@fbOzwk}I zu)wMW^USuJkGir{P@gQuyMvkL{Q~z2%fBy1ZpwBuRo9zBsYNkdET))UIsQ%<)=&hm zIlaveSNB5Ow?&9K-)tH%VK7un3(;wM%=B5Z9=^X_fIla!Gu`C>Ev9`_fKM4>)6dz{ zan>mxN4yV#*TCMvTWho&UWx~bM<$h%oH48+7mkmP znmELHLE0}D2j7;NtUMKnH>o+WO7=9lb2tK@{>aAdhG8a&q45Z{&W2iXW^Vj1sknb~ z2_8Q!n!EFh2+=c_U~=X_VPBg9r^Dp`d7Xzo84Sk>2LxqB8McP65mx)|5*EwLu*$(n zIF`RzaI`4HPf6p28DrK7&26P{F76{Ve!EJjDJsQB#-v_}=8+4J3R_eL(OlKOl{g0VExWzXqemA zbatE#mYiRT)~1Ih;W^H@{5ThnbdH+*TI~h5>AASrR%#-97Kq}teBWqyGg*2)0yjTr zWBRXOo6Hx-<6~Ghf~!u>U3NPa%}q=2utq*Ns)rcw!Pk6}jj*~|fw_bJ`#M|4_Je=b zZebxxF*#?IFw4C{P#TxwhyG5&)_@Jdhk>PdGN-37$#;z)Z7#uLQLDLP<4R%TmJ&pN zd)2&LYq@a6wFLI#8q5t=mkLJRO0d?n&U|V}u^`!74C{TT&7Y%C7;Rk)A^eE>?Jw&D zc~cRZ#<-gg7<*1IsxE^2nP9VP)1L}oRTg3RFXPNst?mX-&al0653@`|9cWh-Li*vR z>8{nokTS9m{h|(;uAVa%YnB$EmtwW)s4bIm?^-@aZq6_bx1WhNy?hvVw>N!lV+L_p z9)7(#(e%jGg{a-O3?FLxnC|&#gQwS)Vu{v6lYm>!*wJMv-i$e7QvA{jsZO~F`nAL) zb$AeF9?rqd`7S04-bJ8(Xb#f$4K%S|9*;YcY|PI%G*{=(R5ab=d$KfQ?t`zyxNWrr zBMjqCKWI>(WaNL}H;kQh@UiX(LA|ULS0=0$uC{I!#L1jDW^<>O{ zn2*e#GEIZyXX4P*eEb??Z+dvO8RjSF!TaZlrc1tCgwUF0m>$!|^mk8NX#KeqQ!O8u zydCEPyWvYQ-|w)A%QxP*$)AamyTvB+rv$x3)2OA+&Fkf8l$mGH^E6df`5%r`w-E*QQo z!L6g$%_EkS39nX{AYkMbbLr#~;lk7sytwwOImQ(UXY2UB(b;6aG*ua#@2nL%K358t)|KIGjJvR*uv}33mEoVHDZ;SH8w86!Wr#`| zB1oRB7H;sk;&sbobIYSEgbdqK?D+Ps`R&(bg7MuF{84nv+~UU)VP#?oj?TMf{&-E1 z@aLyutXXi|eB!uL;i0S;O}^{R$0r^aj_DU;|8%9gd z&PCH7m-R*N(?S^bwmLmfHWb%<3z4LpT|2LA403)dfY0#LwT)Jj@nA#&hGL{j-+U&- zDf#eS8LcuXGQ)=Rd06<(PE`+^ML0bs4}&k>RfQ>S5i4JYpG^m@BE` zoxHI*bt!88iBsz>3c|b*OELS>GPT|F2z-Am7tc2qsr&iHW3zcK^d~FSZz@yqd|eKv z?(tPyUlC#F&1@X_9Hp93sX%$le_!X+LxW+m_JFWps1j|1)(goEy9I}5WmtT`L)iA9 zLI~SkhJt%jg@rB~g)NR{7*M(N^p>o(g2_KTPA-mAON`tzo%gTgJ8%yx~@6mOeHrIAtY$0a9?p2rn@Cq?vzFKb~TX zxOaJIecrC_?B{}>^Yd^ktyyjQ(F<1VmO&bQUhO+M#de@hu`?ivY^_M3#qOUjU4u3dY5={n)*7#@dQ5vj-Z zTr2!>qZB8_`gQk4t`W{`E5*b$rFD-6uNF+irAT>jt?u>Ml|n~wDf}1pKeOFl$z!}y zWEYG-<7s(Rn6ER ztB0UJj|t5qit65;8;!BU`TO!qQeD{kN%$OCgoj;S>wc{K4jo$yF)q}k&Z#%wpYIl6 zcg=*lw|5uf%-03b(HdO0>w8;7+T`QvxgK@L#=BsgBo7ULwyC@7cq8r%e^v(FP=Bu< zgx-CYVPN1{b@#^+aCBXYnPD~RS5fisS)Yp!V>hTb98JaX%Q-0RYN0;(L4-fnXX8X- zSBN(&pgT|YpX0h2M+W2c@&m%&A|>vf-yp=j-zzw~DKWUKmtb;Zn^2&w#6v%0p=07^ zA#7I}ULdS?PxgAjWMLUUyA`SjEnX*BzAJ@g(d4=}OVtrASZzt8VeA z4q?EcQcUH$`o`2g@J%kk>e0LEX0089OHIW%v81f-$<5JNF}WBErexJ!KQ;*$lZ)_A zkWXF3rSH(=NFmfe&9B=s-3+te6yV|TsdZ-E79n<80UUBi)TP+k;!;dLp4s-Tn_%pM z%B^`=wcv|-;4p9aJYI$$e!Z){J1qzcM=Zn26Gzp>{5cpmb14#bELHz_I3AnE<>EW% zKI)NPY1s2H8>`gGs$~zvh`Y4}CgXa*ak&CN+x_=-p0{x@ER_d@?++-kXVykxW84oy zuM8#nfA$ngHf$IEo}ffmS7TxQo6W+Vx-x9oQeFFV>IR{d@7ud3Zcv|;t{48+EyJf5 zCUvf#)(O#fO0h6#Yh88ITEYAj=lRpKx}Slj2%7v%nR=og2n1me5yA)v-0*K z;h)c?uJLJRQi<#=PvNk|4&k1e62lG}2?Gyq5!PQT!}@`rYZ0(f z_?%dV(~^DayZbf>=f;)6&dk2}T&c?)_fV+NDn&o{Ep=C|yTI0>1m6uzs5{Wm z7sCsS5iglhx1;|sJpQQ&_jS70{hT-!X8#o8r}3xNW5TE4@Q^|bQs=5)6n&4;CIz@q zK3%mReRhXi;gdY_Tvevj=$Y-r)?>IGWl5hQ0#{h z=1U<`jZm4q4n-6{kDqo4QtcWMi|2iE@hZ7o)pjEp53_S{Wa({H*}F^}=*-4Nry=Uh z#WHj&$i~gTIt71`0&>NFU+4Gdrr^TEBZAfwCAJPaB&@krEjVshV%(Ap!L3`R&}q;2 zkb#SYB=@aC@#8Y29`sS|S+GTL%r3(#ovZ4=$D4(NbIUll-_#vDzfstFzZB#BJJfBX z)(O>trFir8@9GJLtA&i)B`}OSsP1mRQh3ex+o<)H>IZ{Q2pfOmIi@3;@WL3qW!T%8uDX0B5U*rQG2zK-)fK)ce`v|Y$ihRaE24NDS&)nAJ#MNF6{aF# zcMi6G-A$d-nFXH#IVk>nlzQX=8ERzNSmFOtuuW3n?au$c&aWZ{V(;q{!iiT(BxbJ_ z@YNw<*bXVfIVvO)+-%i2wc^O>J_7>U>Zxw?1**tjsJM+lZTZCF3 z?`e-#nY+E+D7@r*f?~>X^FEu_3sv8g!m-B@^EkeTxKxzjQuBUu_4PHvv2RKc@_CT? z=tXMb;KpLKZFznAp8s>w2PjbrG_DSJbLb4aCEKMX2ewy>{@|dRSh{ zz##iAaCn6~p}ZN;`3hzKpf^?tgl)^<}YI+G9g&xWf0;zjTunUAB<3ssc? zcIcgvhrjj)s}3J@#p%Xn&|8tM(#!FI+k|CUHFmYCW=}9&6iX3xWw*-8Eef%>a?$Wb zt?Iud0k3A{V#?Uts?(FxaI!Q9-}U&Q+G!`^F=saVh7C~5F3R9$myP81~G>7ii ze60K0She%eVx0Vthrg>9t8}95;o_2q?yvk+M)_`t-?I!S(z8^jCi~(5KeMzq7paa< z4uQSfQrud!N%guW3fFe$V$GNRDlK&a{`|rjes@mwt#=wa-E#2eX0u8e%X4%!*(l5F zs^0jA3_t2-LrZ>6m=&l%V)}oNpSSHkCX}wO6K4LVM867CA!5rhVMo3aKA~UCW3TTQ z&P`Y1@AW^M`;6EvoIGEK?Rk~vBfIVtKKPWOHfNRjfpc4h6@QkZ>)wUtMm@`g0Dfk_ zl9yojwJGL3Kdu+F-V|eIPMzr=PtOWADaDvLduVOn z%yuF8MG^cD|35C?J1*z{eg7{qLRlFNBN3s%3uU3)a8BB@Yz z%ILbD&#Uar>^(EG_ZHvB=k@#N=lx&*xZOBO|mo^ymhag%mNHXYrGk+hLbff+j|>{Pk6Xv6J~5yQik|$5KUzaS>x! zViEu0r6=~uQ!rn2gg;#{4qfjg!|>8Ye%&d5Tw=B2c0oOVYQ=OkS(=2g=8c4uxFB?| zNW_vYZG}v;g;@I|0gWSV1T&|luy9MjK(VtBz`Ud9QSoqCH&KYPT!WbXaj-qNN|?Vd z2HcrgBvg8k>5N#k_4-$5-v?H7hOeSs{%X7&o5P*5sGwi1)EL*E5b_#XNNgfUjh95nw|LEFMj6Db^K_2uo4};C z3>~ZX>*9~J!wu#+U(2e|g~xYAKh_UNf2`Au9cag9cL^r$GT_U`4o1HU=5G|V;Xf@F zA+@C#XN-FAbjA~JW;4IeXehrnX&gT6VKupK3}3s`ANrq3822NPzdvm{;F*Mt$D{d# zkRT)|6WQ!6=jSwppyFx*_FT*3e_Aiasm=)yF74y*UR!}}Q{&MoriPDhwFUv{aacR^ z75}w31}#%#p)}ER3#P`xH|yW}Y+T~YMX>iAH$@HO-&)bPC*>5-PK_b67K?7T+esCA z72HPk6Wyd@+BJ>!%t1{=)1PgjrOaPy?BcBJ?X!uF$0#x6eRrLN_1}M+E0L^dtvguE zdg)9Ba$Fke`c2KG^JWUHz41+(cO#wlq{;DQOdH+!Gdfaqkz>OtQ{C?~FR6UL3^V^e z*3M|w1gc&#q=y{V?wZ^Vg}G9^Uc5oO$+|1{w31>#O_X-f{R&TM9kFuTDYO{<6xCK*o_1XcEx`r~4UWGph$A6e`) z9cF<^|IKcdqk>SmGZCXc_H#{s5Q4s65+E|pciq-(DJ1MYHw}O9x?8^j$5~$yIHjLk zqhC>QWIliW>A7w`IWd_0C>G@ONIPjlEDS^b)w$V*N&MKTDw+|khR@g!y8To^xh`rX zx*yPan(n0DFI4E}l&Sg%5G|J6vqY<{umci4ewWxo6TgmEiWf8qCRiXB95B|@-d^+W>!bxh!tGDHn{WT>5 zIO0wFXVZc}C3dB$)Q*v%S;FXQ2XP@K3d^YPLk<+#J#L!PENK|d$+PxZ!j~*$wp0Jw> zAK;JPsmUl4pWp_)n}*Z3ld#SD>Or0$xudnsY4*x5vgK(l&_1@iCa26o=H$s|44ftbbnkug3Aq1%_sQ*eeuJ5VlTi2A*_&#dv{*}$Ubt$6KQ|vp~5YHzy%_sXH6_zB1@RRQ5 z(5g>LboWijM5`QW|B(Dll}=3_g|DkllAVLfZb+ z-N`*dbt*ZsExx*Wcd4g!?sD8H-zAz|(-`M?rtO3#T&zV~oOPCA-M2y9hxb+x_DV6K zdk{B#PjCF_BE{Bv377la5pioIunO49{c(0f{ADp-j^?>nRUR1FTa0=AZgaMIW3ehK z1rOqXaO!6hQNiYvs?R30Z}&7TZIg^+ovq2NCJ?KGlCVk`Mo(9Vz;!?K<+Q%kVgC|n zSYNkywDHeO}|J8Y$^I_rW zRXsh>s7nk{^d4-gHPldsA%J^!Z&2&FX1+)B3 zd_zPI&2OT@xAJX#jqL^sVf}M@RSsX`kU_yFN=yn$)<>&DY9Ng!IJCteku$bkBGfpJY zv)CorI+*>;{2TZ2>^-kfz}i;(sJbu;&yK}o!N5!OAUFm?{>C9U$xI*gZ9UvBtoz5W z^QnC;EZMB5m&aIrj#w=`?N&h{tjCK9?k5!6mQu908fRxU6*{*mq=q-FJ{v#g@nRF* zOjcpr{geD3qZ~47$L7R<8h&AZ7OluuB5q41UzD0owH8X8^4P~$8KqJV%M&X{Z0DQ) zRFTAz)sx>Me%hl$^!^a@f*MT_J&`=4S8;M&z1EDYY}FW}8p-i_>UgeXP8%RzhRyjB zPCLX3Yko=LZMBm-{LL1!C2W4#evv!j4IF3s{gMPQy_|tCSi%6oHAZ5!0pb= z3q84+JO(epsL(_#>vWJ(+pNIEiUjB)u29LkD17}Hk2NiS(;MFyGUAuYAJ zuui#&GFdO3n)r^FrER1_bEdQC6))+KMaQ=&VX^HNf8%2s>1>!U?Qou7;H9A{+Z1S; zdz4pqRnY=l1r9%($!{NYh+dzNqq29fsO9~qba5lgT-vkRd!!K-b(KRpaUoaJvJGVU zGTgqG!!5sW3ALpRrbCZ%mkMmLQZ2>Tx34%AV>a%*W8QvUOEPkE#jtTKHymz5r5D{X zvRI7Pi$&CQzc;%4Wc9fwfXd$cVbS;$B(;sC%SWc-DB}&r8!715`8jC!F$o_-^Qmj* z0+f$QLOZL2wDorw9C8xzXvQUa^gaRw&k_*2{}a`RL}92y0=!GwVwQUhG+|6&a={wVT z*u8E-k=-V;P_k_0R7>Ha#YS4kdXE=_n+gXd%;zsuV$jWR{CmGNI@nu@GyPuh<5X(8 zP|D_%KX>`Qqm*>CzXDa~*Yc|>4^s15Ir5h-5Vf8Dl)mnfqeDqA&TLg9+#V)}ZEg(b zbF4LDDj9olq=fsCYKd4@t6NXM###8=VlHEonqM)b#H@ih-$sg>-WIgzr3;=fmEgy_ z!SrmVJABWJvGIy8y&C9^+r7jnow=0eukpjOH7SVcE1{ZcQ^B)Z?K~}){%YpntOd(z z-S^Yk)Hk=*lUIeBu{-C5Zf(k`L8XRgqEax`?jVhy8jH`&5W@5Y z)RxVLOJ5BWzEMLInt{}I83KYFp@Iz-GB;^e`y8oCd3VZp4va98g?6T(+PL1%K@nD^I zq;Rsh*649XhJ&6JT&1@q=J>PTZ}StbadTS?IV*+5xR!LwejpAHVsAUX7p2T{!KN(6 zDM?3A_0SvN;BJ;1LKni` zxtE-aY}Oi??_{{so9E8mw7?LSoA?fY#|;ea1Fgif{a!&^QDsaNx8uklnYZ;=A~m;>}?_#8ye zO@>wcdD_uu0g9`WaKrR9{mBc%3M=N9Dx0GqKLTr(Cjx!C!@N%vxatJ_3LJr%onuhh zGyww|238F|u@2^ytNzh>;^Sz2y@SB`3=J{{H`eD~IzTJlsL?#^omDpPENcE-`-T_$cB1>kaf_2Fu5-1_@E785I3ciHlyng@_al&1e3z z`DiO)$OI)_VgB>k?Dj(KZW(1wSKvn5L%d(qeyVC<_2JW1x2Y{2ku&=_zI{J#Ww8Ma zS-)3kqu>r&nIg7>90tBsT+kVFcx;j($npy}bxBWDv08mh-I3PhJ0LGb3bkekJ@a(N zy2tE27fzyX79&u`Jpbd1R+HQCF;J?-_*$!?q30(c_(2K+&5P*rl>k`vXEURnj+|Q0 zfrB_1E_ZLxiH7-bV~oesb>FEhDh%GEk|11` z7${s4FzfKbs=I}2;W;znAD#32$@MJ)dGegEL0W8EeUd{tEfi_c^xa9pkV+`>iyFPp zWDDQ!7EnLd@0|)>C)9i9(M3~MxBaFIE+reNX}St`+It8O3)AUuTNO5p94eUoQqx-2 zUd@h684Hw7m`Mg<$loqO@Zn19W?X&R1}O$!SXrP z)OSiCbj&Y3)A>FXYeI0#BpGeL|E2EpmSSjl67n{g!T;t;gr7}Bq45AbeI1R7)``fD znFM3MI0S_yV9AH{DpS{JSQvSG9N-=8Bmt6nD9&vagOSIvpd%`vP-hIT#z_s*y%Hjb2G$@{n5)=UR9-X+D% zuWe}hYG(vAlVbYKel$cp0+(h>uzQOaU3@VHiUZ7Fx)VaT5BMRXu^8VwCeyWssc1PN z1$!K`=}>AQMl-Le?8I)exgLVAX322VoTS)_r7(+TzEf!(1-Yz3i@S;F8`>DU1#7X; zmFZk;juC}%Se}u9>Ysrw1_p6(vj5kA_I#A7H>^2A53@A*n{1)~G4lY`FVJAkzDq)z z&pU{^YETlLFI?GEKzmuva?B+`NEw<(qX(!VjhQWY9o#@wdsJ|?^%P#6O{Z~oDjXT+ zC=7Sekc#Eq=Wq28&c0L7Oy>Dpt?nd54P(p<(|NY|93S?07r8T?oA~K;nm6~T7t^_8 zz;CxFPJd|#^G^3{dn-ENW5V9P9L>&-=4w`(WAHHtTrHqYC2Cymo+QZU<&n%@4gb7AA?V!(nzu`ZozFdmu+|wgi@oQR zlmUWDtRbsh)<1i77plf6DZG^ux!ui#?FBMwh*uzNc?~}7NrMU;?n7d(|=)2SeRh%5Pzu$<)A25eTFGFoNC$9KRPaJoWp^f)yZswu^ zXuC;@>&3ZTuXZlz{8xf;3v^uWrxA#qDM7sEJ{Rofjpa<|Rm%-Y*=iyVHW9<{t{JUl ztXBccSsvZCqZGp+_#Q~c^V;Dw$!{V2S#Id&G@bk@9HXR+FWnJIbFQpH5w4Y?*_-1cvu3^UVXzF@?j5*d z?EtLVz-Ggvqc{a)_+NaLKyDnxmCSHQ+sP8_cg*A_=<*12wD;#}joDBs2TasCJR)(~t;; z$y4Ucb*NgD2%lk-sq3J4Y`m3#hiwOF|L;8?AN;S*?&SsgQ@tu_f4T4NC`Q$)nMP79fHtvE1h8VdHPz3V9WaFfZl49_E;b^4a}y#jGu{oG+Hpp z%%DLmXSr2vFQ{x%saqOj9ba1sn;Vq0vyl?P3t9_ZqvfQCQXseINq*nzJ@li40i!}Tc-Wi-vVO~$q;$^sM{^~Ug$ZH zai@vvMe*MTz$`vXU?|t(JQ? zCK9<#lW=d`OD-sT9hR+5#JuRn6g4p(o-Y$%H!0#joy&*(tMk~M#rlq;D(P3M2B-Gh z=~r2mQ~3-HuGQ7Co}q-iT4^w_+b&^x>{gnzNsWr{GNI?&JQ~=O<+EEtg}d3=6kni1 zi$UJP?3)?X))#ZZYi%lgdnTugD-_t%@+4njw3qcK z3OvkP%x5=wNKqCFm~F7;zo-mgR3gWFg9kc8cT=1n$b8i2YF)uX3k*IW!~0Vfy8AJ` zu(-bryJwkb=MEZ(OByLGhiKgHe0D*z4-#yC+fOw9wLA8VXMEkJWD$wRB6PbLWBQbf zY`!rc>30equ7520!hHUlYzA*$)SRoU2}07rWZXQ^ox9sC6drcT=zqqAD}EJ@X?aO7 z@tDM!$426G>m<0o3FnH=twU~NB3hG}b6gq^8OyochZp{*^T=WU>g=_xgt2**gj7{KvBf&=korOw^HAtT#nce>s#HFLc^M3)tuQU&=vOdz>l#KEH;;G16Pb?b2IBP zeAZT;wf9F7)A@{N3%B;+)8XmMa`3}NZe2`+v4Zh4KX)65W=sr4r~a%~2RMjk4qL{U zy(E~unkwpWJQB-0CE;vcqR6g!3}&bj(aJPWU^?rxBiK^ zl2j@UEHWMSoz|3-<75q%)w~gg$CgrPBMque4hT1f6jFpn4Pm54Sg>gm#dT)fBO-*S zEjH4C92E@9CJ2FnnRJQu&!3(Q5DHDxNRp()$^Ko09j(;#?h|7X+n5S>s}&TyNPz`) zr}?z*`^ct+0(BjgeDC&;$e|tcJ+92;i<%pv`xeGauNuPdt~7;5A32idcj8Cgw?O}$ zGE84@$RGL83&gUm>X3)J8N~x}NG8SQ%_nsB^IaKx!se9BeY)%!9@yZ`_`0|Gy8Ddv z@?|=otW48I2m2$sAqBI1B|7oe>Cmyd5z58smbwR{QkRUWqgLt$Cx_yLBbyB)7wdk6 zEJMPMBvid#sI&bXi7VZc&_zC9S28pP7dIxt>*PFLv(52n&3q4=ML+-3`G)hqI=gP% zub1qrqz9~jPSXt4>-Ln>A3qIzK7SO394n=`1~tqt9TZG8h15u<#vR*qLE3&Z?Qf&T zqGyr90og_xmZn0&w@Jc=qD z%~#;+iL?BIz58ec%V*OXW%BQ{A5l~GwlD4t=Ua?4M0qab|BsB}1HPJ~MNc_Scn#o3 zceVs=m*J?Z6`$SL7U!%PFWu3UkG(e#bz&)oni}zCxvp#MzilQlL= zxXbwSy5?#m8?O^~TIEnL<|!!xrwRRrXOYB6g{DSBg%*d?=o;g4H^o~Em#Wod^OCV% zC2fVE%}Qz-#Afh}i~JSrr-hAJk71v~n|6Inca0f~dp(-(6>o@f8|1j0IhnV2Y>iut zMep&$jo14zAE{6V;kF%rI@lJ=84q^rxD|iW%n?q>QoMW6p0~f`in;X?th6=db53~R z8q2f#ziGjz7>`3WtIwSUV}9s9fBa-~O8?O<_{EQ=WAdyNoSWK;*G2`SVZA@ZA)Wts4Ni{F@5=Vd_3MdFwKJp z{HL?8>%Tgm3Ob^XvCuMhUjr8@r;m25pwnYDI9=5s#7@{r{3phd8t8=sql>6_j2Z_I zZxm)4_X*us(d8?Jgw-f65O$`TlhTho@G)z}TD&n5Wus|8=k znCGReK09x0${VyFhk)H;*xMWNtF->;!q|g*3mWr*Z`pfZkOD<}Bfdr)jCa?Qakptx zUVI`HE)$YrW@F6Plq^GSO%kr%GvUibt1*Ld2q)XO=k1bX5TIw-))aG|t6}+-TOwxd z8uOpdZ~jN;dRJcW9-yUfVhyU4BlK?36;$D+LGubj{mSf}bc^v|<5nIME)*6~IpcMs zBQ^=2BlBta59W*ZPZBIfyZ%#`+uRL1Slw_8d8TuJ z;(^W+B*>4wt~0Y7hnZ~d4(WeJ*ZG7$ZZp2|ZB>|395m-Tr;gTWqTJTBVi>lQo#MZ=^n;vVwVD%)2Wx(hGNYlFJLm=-QnYM*S(G zlyEiHtt${pUgxt+LWS~kVxjJGF4-+%jIP0A;jVW!b$-fNeXkLMar;cxwDTV@TcXNI@`mMuqqF#5ho6w*lN^VgLwSp=Mraq$=E2Ku z{ByfDxZF|>vrFduz`<7doyxv_(m%TXZ*6g*qYU=KCEe&qM_f;oqD%5FT|*l;__7?_ z;+R7B?3D+)PLg0yr(oTp9^=sLh!}0O19k4_{ju6Yj7fhR>*^cLz*Xk?e?C{C4bBh7 z@HZ?sw3w(hddT{Xg~>1qh_AFhwG1h2hh^PCwd>iLt1)v{64uZ5bu-)%gFiPC@zA-{ z?be-m^q-iBcZ=iy)4BG4-t%qq6Z$DfwPYEmLHxTh`t7eO=nAJn=FVpNbscxn;D>5F z>2h9hn^;Wm=c&P8FBS}EZ=u6aRJd|pF6;`*qxv~26y!t*oxW$&(d$agn>1PwZfBCo z7$sDS!9t{KIxW*GaK5#T5W6Uqt_@LOP2FRDW5+z@3@Qi*lFZ$q?3B0#m zV~k;YeIa91)tB_%J=60RLus1B*%V6LzRhJ=k#P>KU6r1jA zTe02DxK~VPZG2^uzaH4-&*qe_8aHpoZ;YyBvv#4SDC~hh`!|U(sB@U;NBbG5i%mhp z=uINyeZlzrIT;zPj*EW03q|g-WXwDLQj~dp8RoxALiWAp+>OPn;jn&RGg?`x3 zUG(I<8iz(-7V0yK$&_U)y0xW30Am*yUR0sCy+&wW&pf3uD&#&75oV@tq^^PzHS>Lh zb(^!uYoHPn^sd4q#|%m>WSL;AzCu5B8jWLnKs|)#ykq@Z7_`SjbooD>yj2*Vaa+K!akkUF74PG4NYW_`ptKnp6`g% zRcuezZH&l>b3zV#x6N|RxeD&@|8TE=!IlQGjIhf7Xgjaue)ocvSD z<)4Z{+ZIWfpwV%S>f^Ck!gLNP_)llM&i~d8-*d z&6pSZdR8O8+^{kFu-qykEJ^2^(+1hMm|xV=U)xAzg^f$tzTre;(XD5;So1^5n7w?F z=MqPRu_aDLAsD$JT)v*3mE!bY%N|rBGc-(QbkYcx)4lhtaCQlK(*sev{edZUnnJR=f z-$3ssDk1qkLU_XV#h+H~xTXZtBPA9Bq)vbtfK0~>X~&KM!i|a@6wPvzydK6vhv2QWTcyJFfzSBb!cFwmScNX`XZR`A8_7DJef!MR z{D6Qg`pV`$WmF0;-jq(Ii2jc9|Za>CM=z zw>D2S#HWrbhs)vXV#LjUW{9xcY)|c_Jy#Up8l`M!Fyv4G_a)yFzTc#XaE#}k?X<<^ z7%8;UEY5C-BbtAaV1DpUZUpa&MPU+TI8<@XQaq4RCr18|Yg}pZSm>sS@ptD-j&ow) z!HX$)8)QHm{H7y!6l3sOx1sdYK}f!zjKs#))bMN}&c-Dp{LvsWJZT3@Pl*22&*S&a9Pj6v;W;Ts< zSE5f@20uP7lX4F!u%S}HryNP6_iWd@BvQ<$k6|}D3fRq!m+`#0NJV|y%kk=wF|T;A zpPsS(ZgEt#Xu!(H)U=Hp1KW1z9%UQCVV4Z?@e{bUTx+c6m|wIzj`NvjiR5!q40*bd z3kb5s)X7p@xLD3*{2B=1yac#f%Y|=t#fDK5SVbkDA<5qQj12ewhW^ zLt(X|QLh~Sb$$l*JIV49T^irJJe7{HT>IoJC2tw3rcS%q-rqY3|3;&vN^?1y_Gr%+ zcG^$57Z}rZvrhDE-y`y|ljG7XSFRR@$YeQS#rWl%*HcrhX6)z*Sq9hhuLTU=OYt^- zKXWD`FZoXS`^3uN25TET>hy7h-;0GJ^b*Y5uvTNGMFk zW|wr5TC76lf@CCwZlymR*CO3M8JeC4XhcXH+Z{T5M$cEMG3&!nVHSJOSte>6|K3_?^?nP@W(?8}uP=Q6i@9`%F?H!rZu5&} zY&Vw8*VTRU`2&~IsT-TGmvqYJxjw0+W4X5Z$#ni@jf#wF3ziCFsk6jRcNP;V3OX`2f9iyEkI5&47c|G(-5$iV| z?j1#O;S;fS1e?M0XVb5kY3O<`1@VDV)NmpYYs8Gfvy)MBbqMZEN^3Sf+GMi*yc+rjO0YLFU}ySEdLvtCZRUj?gMKlrC%xpbkg3ZD-?;7_q{ zUo(~ic8DnCjZ@O88Ou$wujldUyEHU%r2_o-Y<|E%74?6__J!Rt`N{zbIy_zu*NL|L z@_Bpdm=Sy1dK2!5$wM+rl%rkqh1}T$1GqBJdCyfifi3 z-r=0a^g{2CQmkM(l=Gtj;8#kK+_fXcC9<1H>~7Lq>;BYavOAiulb~|H2Mt*3jUh%7 z9BMI(el?$nIE@&EE23y``)M%fA;zihax$GBh!gcGC|QzAiBm!_>SPMm%-T)u>X$%V zngVV_H4QdjiGEor7?ga29)4oCAY>`1tA0-l6Jue?eun+f|8x$>_*Z9j{$HW(mP)F4 zrG|T}6yfmJGCF=p4W+fKFrMlBiSc!tJDLdtC0pp=B^4fhXyDKN&7srYDoiV_<1b%e zd#{I-xN5nbUpF+JE_G!Y%A+m(fT0>{E>%D~cN3qxNl8oDtk-;C4nJBdr;tE7K29CL zKS|p|-`Gs;a=8;X&Eo-e-yz3visoMTHh|9zIjpP;xFeTL@bH@qA4Z+zj=nO7ip_&} zmcQYO-uA===8GO|(~6KZfX!7>)Su`lgIs#T~SLn0nWct&|8y`or zy1ivNoi6l)^0pZ7-6fP+G8KbYim`O?MzVQ42iv{GSYE%AR5upj7`sbjbA;`b1TMj2 zM==~MZ_--v3alNE%*2c3$lu?DO10hZrxqFU>%RxR^uDf>}QG`x$Sd z$)djOo7m8*l(&AAMt*~o7~7?Y|D;#b`Higic)o>Kv{RBZ^W`SmZRQU>m(iJ}tT!%l z;~8kCx_vF_|aX0sqNC~)bOcTd5rBN8*QVTbLOCod3wJ6wKQz>0-V|kadQ0I?Be3^^}v%Y6Nf`~9c$&kz6VocGs2f4Oxf z6`E=AWxhmM6j??QFIj!w$O(_rwo_-Z8bkd%3C(}z)2AkCjJ$3r_-@M~#Y*OHWWV5_ zjn5(%_D%Hdzl#r*rO~GmO8j2DjW-*ortjMnP|qvmJE#@(h3yP>Xk5TYd&?+bjU1C- z6Yu_a7ge(QFekhRXI*)ZirL)V%Ua6qX8cA0n_p5}?B|NRo8TO~Pi3vS&3$n*N6<4F z_RMNbx#)?QIL48dT2jF!2TX0nxVv*hX<@iCUgSt|%W5KZrV;qrUkcH;Wz^n(4BoPP z9gXKp=|ar}3|zo&q}b%qDO~_Ix0A59x}SPnoDKJ;tj=6MP0K3gy z$nr1wIYUrD1jZ@ZzQ!suOl=tjH|ANTTlK@Hnaop)kmBddF8}G=_J8g|@Crlyu}ep& zV^8KI`AUT*Q_HB`AGS+q2tgXb>P9Z}=w@^lUfs$k7j~ng^RY&PA}WV=C92SW;VT}- zS@iLx65_z!e1>BhIr%6d-M^jpzonwa`x*D5E#lv`Qcya}q?T>m%D>$wr44cH=EfsW zzCX8%<~gw%;@N{U{&knSG49JFNY35&{6i0p$i}2A7;JZUBOfzo#@@0X`}0&%pBauObERf|Ozu2omA(&sK+YR}l+G8uQVpn<%Zzck&moa-3X3WvmU+`IUIJCxoT z{q5PG9np-kvTQKpybLedzJo;v2Y3d_(8!vj!Rb!8$>#A@PiN4^F~gC`c!Pqb>uKI} zFANk(G0HiOir@QU>kIZKUv8)S-=<*h4))GERZ4lYb>B;4)x1a zVc_W3JXU4WT;}cn@V~<^j!vc7GuRE8J==JLZ%Q&?9-U2OAwQ;-oQ5)HU`tp5-(Mo3 z%}nPv!QOm#me<^2I^XHnkt;ZJhZgr{Iqbz0uFk4~4*p=ZqRT$+@E~?ircjPUv5YnH z?hJ3{duToyQTx6&IR23_Gnczk=|+2m%Gq3F?MCjMosij^`O-zxsm(i}-6@tEK8vBb z-Mp|qT#BdH(#U>~FT!nE{-P+Mh&@wa|B+<@&yG=g;Vfuuq##YN>YZs0h3p^FKO& zXrv#pD|*|h!`(JjCv9sI0p3i!0ttS zSWU}ck486k%kfEf4ULcR#mQhP>sz+dphZ*Q#da=t%es0#dus-npJ%r<-f!a%ZqU$R)^B|3v4uD7uB2CNcV2In#}Dr;qZ(Fw z3u8C(>Uc42V)fQ%f*Ze@?KLlPkR!(7ugLn*U8;iuKNp8`IW-OBY^lID=Nv9tm+0s?Z+(tcKh^ZAUGGo$!=-deWv|G}d=G znz78~#e_xVr}RQrtrQh?68b!F0)B0hBGh0Dd5;f3B-8fY9xX{1&c@|0QUuiAqvfIV zafo>Ww`z@WbM4d75%gpJ(t6i-BbHjKAu_y zhGMkuzdC;(@l}}l<}hi3Syu9Tz3?J&FLfNP#^>FRLKD{_Qh#F}U1m$6e*Y$FyOzy> z$6xV$VKx=BTRob!wY=H<45Fn<^!G~Ty?1NK|A7ME^Q8Pym6Cq?v;R}dBtBO!Bd3$> zuGHN)o^z4Vco#OCRJ7zbuPLKxHge2Q+bvod_K23-Fy5e77j8+00d~JL6PhfrBG&ywYVs2KKp7_#S4$-MoT!NnizL&}{{M#FD&l@MS9wURbODlR@ zJsi*8N?ESdlVVdlPa|9{&oxTdB}z!5`k2}Jugj=&SMdG$Iu zrO%e*MJGRAbx%ouZm{|}_PB0hjh1qnvi-qBwjxQRdg{mC%$($HqOGQlk-1Hd*k|uV zcV4wd%Q>vauI$1!n{Np_GdUioj^t(>>V-gdgLHb~a!$5w0KC{6ZeOS2a!#_o&Wv%S zhjwzZpbUq}I~%Q> zSl#e&qdV8<<0{+Bh_{yqemEbE`Qu=}Vxx03CsC@dJxxbBgcXvm%z z{O-^ChxUe*kzHc(uIOK#`<%Zam=4}gt531JmnpM^t1pVELxGa{D&|6q|GOKrnC(wh zzu`SXvI*^#u=%d$SANT&@%t2bFf*F>`kqRk*^SnoszBamh?<(*WjiLVeR$V{3KE5} z{B+@PzP*!-c7B%O*VF#I>GV`8UdXbi+-lwAWdh@YWjL@;uYL5Po;I@`WLM{DmB;@y z!lkcl9=SQ$EqP^Y6lcq@{`D)jDCTceu{(`5(N3Z}&w3(~d3PykF`{I_0VAeJQ65wz zimP(MmPc&9zH?r*tNU=+En_oa`EOCipV1iJg!xNib51Yy1v`F$eJfnJ1DmIy4cjpk zUz@`{yfq88Y!5DYlb9RzZ64?+yEk~fm^*x6G5YV8;8MeRF0fMsjQ2~irfXxmY7vE> z?47UhwI_2v29MZW-1|#Y?d#j?5uN+5&hG|a7TR9iOA22V=%~N&B(snxD6!P_9vO?9s>c0`1!6emXi(Z;s5W*!gwx4(U&&HCLJ z4;V8r<7urn!h8t2zfNH{$Evh@B1FiwOTqZR2eem)d%`+687<`{+AjHH;gQWau3iON zgRK*Bfo0aK)Hzx`V;cW2<6FEhQ`@p#5W8cP2w7~J_UqdaWL-%>Yx7j?(AcHWvfF?z zmr}KX$5&!8+qaq*nyKAh!#t&a2^jxDq&=Lu9y`|lt8>AKqe5E!UOLZqsaD3h3pZ93 z)0iXd8#l9&@UCdBL^`q(eI@$XtjiTvAWvuvs(9gObWeg%l05#w&)snOd`n|8D70@ud9>nrbo=T zKYL@e?zi|hsiS4c8|S1`E&D;HMl3g(W~mz;W{hbwS@yT3scz6QGt{y9BFyNGc51(F z`1VGO!^M}i-3Qy@aAz^5_U5&F;XN8V;mDA*K1sbnjulrpop#j$!x4g$jcd#Ud8bgk_=u+(^O%iDeWGLOb z*lkaKDP3wOLqD^Qx;JxgQVSW|d!5}!SJU!4ePA_qLl0Bk#h1;oFI0-Do4;rmEi%I# zmPwVKzMRB&1N^~?x?hX zj64t)nS@VCiQ29TZ;&(*+tn+y7q6N|9k*4l$@)+27& zzdGCB*(mfa+Dng%7~l1{qhKoRAVr88gKt&wdDAwN#TVxDHx={k7z6WWA=@?n=D}ZF zkVa-Vln9?@!mH9%G>h%8@h9wbF{N_4kf}f;^I6)HHd5OCmGunc2e>`%Ehgica-@Vd z7X7qMrb}8GZhEd2RSzhkU2LYfn15FLWx)-y$&jJAyM@j_`Wua5OqX?op{|R*Il3=r z{lNN%TI(rhn8^G$|K2CG2_L$mhSkq$E%$1_Tif9l^ETIw+N7NlJqSNMS>CrtrR~|( zjqRMV9r<+$+I(9N99Yeme6MBNvc2Bu#dLm@I9vPXgdaRv9r)7GS3A{c8WuLhqjUNQ z?SNr{uwo3TWARY!(KaD?Y8Hh2LjQ`S{W4o@!OGD9+ty1d1yrcie z)muPCxpwdW3I>8=04fF`HYT6~GxOY+bV~_>NQ0o15-KG%K}gvxHg?wx^E`vy*xibq z*!|z{`>y|5Uw>z`M|GC+q?`p<6o&dQJgQPm%@JV85LrQX{e^1 z;<()^GhI{I{UUu)%t}>>!(e>xtALqbr7ES?ir#-Y`kNK1Cb)`G8zn>h=p@wvUq{@b zILo9VDvz5U2q6uC-Yj?3f;Y5#Mf*FhWn$HsAtCtvtq?1MMyQqtN202LSc^6NRL_RR zu@;R-N}4L?Fk{UejGDDTvVK4r+f6-3%~-!Vb>{B*)v;TSl%uYwP)aDyN0(DSx#7DiBjYP`q&QzLzNBh>O9xdH=QpZ- zs;vs*#@Cm?d(kSDueB*w{#4-U-U`*#)WMiWabC4+w#xH@6|yMKYs}(R=VprGPI0!L z9-!)3;D`wn=c5`2Rb3lT3?}~YkK|FRq^|z(m|FyS+d-;L&LPnIQi$+@y;Yy%B7vMj zTq`wDO&JxB(b|RR{6klDNlkpw$^yuJv{mc1Gho-N03XkMQ~DTXV^=^vZdAWfZuQJV zO~Su%-nq$+Z>#j}en!cM^ijsDz>`98BUdt+o3vprm#rh{#mawzyDxo!X zM7{L>eDWL#ban{advjubzZEUGVKH3MiS>!i=kI9tMM z<>m0sAH>b?pkP^#%ODn8b0xID_uiZCjh)4!Ea&S?xuOitws%w>ny+lA8SSjCIi%{| zwjKQF-WcRstBOBlNO^P#{Ep92t&2Css_zQ4?U1e7w|+2=^--YiNTiByV~r7XZ_I4v zrMkIQ3>UgL2JRQBPHc6=V2X3H!BCZ}i6vl`mn#ib)5nFN>*qrJ z`KqfjN{Pg!8N{Q@(^AEW<8hWeCVoHqtjs-=`WGW?EmVz+E4 zo$_%~enB}_HxD=dA3pz(&Yk%OSvyz@-D-5H%2hu~+{}6&AtqIBOZAlIT4v-}g?9l# z^>M`6u-Zg%?(*Hvd*uS=tXm12?P5vcff|+;Pt1+-cM_?*lDQq3gTXmnIsaGXtb0G= z4|lNUmeOu!ixQe~5Afz1PAFK!i!!W^^5rtl)G_BEVrvJC7VGT2&TJ^ojq7<;?$B>6 zxfkVuLal13eLHL+4NTpYGS!sNhA^esU&rQj)z7u2*g)@K!ogsb=HXzBqj#|50|&|s ztTC6~!K3XgRhLhQkxIGT%wFay<$gzm=15VSYNSdURd z4Oh~$f+h8tgX!nSbG^*VSsnEy=5|TtM*EdAzos(WHHhaTj5o7B6X~wlRwxeNd4p|Q zO1=_pSF1FQ-&lX@OISTssMOMS7@SBvldDrzD{YO?f$|OO_;IQpPfdvvrNDp^84xALsDCtT+i<4eC+ z%1mp2d|FzBt$lAR9il^M*Rzmx6NjdF}fJYwDxhkwI9rBh=vCS{Um z%Hb`_qa8D_y=4JDTwkLs>zR#k3*xFdEKn*Hx#0hwIFH|!uP)En!9*t2a4lFW&(_7OW^QIMS2XJ3?tPsFsRLOUkvhsyFsN0`<~(UrTP%!emb ztBb)#HYlx_Kd_0oCB614?-N_*P0Jz#t*=wsl|WF_9~adS~OVWj@rMQj|N1ojW%3-}CHkP+zZ|u!G&TCLLq@ z2vPqDTiC_tq+Jw=Br}(+VRPdsm-g5p@l09H0!|WhWAAs#>~D*h8|`C`%rWIYWD?Ju z_9Jwo{JG#IH7xQ5c~U%2bhGGvs!q++*`gWlLWR+DD|A&$z5qD6An(m1AzCM)^org5nw(>B)C0r5_z(w1qq- zuC7s*M34_cJ@IcX7AZYL{PE&&5oo_rxu7V7=6pq%)K{w9vy^7vm4(<-F-y5QA|5?- z=xkR^ReIh}MtTX|6|KUR2|Y5pq z-oc)ERAW`_Hp$QHTi6$R6L-uzD=D0?mMx^d=$8vx++wE{Yy`2*EA(k-@n$jW&(VHy z0=QA-3s~wR+T9*Em8(8Bm({$TgN*^j+=C<4EZ>_n{5dt;fq_+Qz;@b$uvo!0{;Xg= zR2xpqlX0%f9ZbHcjP|8hiFY*JWpfV@yLC|~m9FP+X3&r7luw_Pi39WyE-%G^=BvsW zaaXh<7J;9ZTKO#13>!z5;IOPt`8US`+oI@AY_nK-f2TE^h{2ehUZ(79B|#tB*VZ0B zTe-WN6MmkMBL3l2<+lP)jJjD2E%%8^pPBv$zh8v6cRZEjR)nD0n%ID22xGU4v>Y1> zQP_5ra%EaP0(%$I4yJ|j#hYZ(G!-CYa37_gDfQ(juUl(kto&h`jgC3_NT_Z)^y6p_ z244F&&g)_)auI`eur{weZFC=CdNIO196D*b4UKS8%D=?wSRH-bs#_YAkAI|Hn zG$d}kC$VCBrM6bKY<9%K`%=`zd^yyO&hydt#Sl(BIiyGDIp#|dre=3az@ z`X>*yUlIv#75R5q)*reN9*+~2h4{H@*P$)86X>?6gW;++)QxCC_IgFOar;8n}ruHSCfFX$-D;aRJXO*~Svu zL$M0w);7&yn&+g+H%;ISW6GJePdP%zxN>`nwzAh}%226yUOf2OE#~`{bmR2b{=Glg zdYbqB=ko$rT^v`I{`Yh7Q6oq?{O_}0do#Eb^Wi`L%vTc&M3pQ4`&k-njp)7d|9&3z zP>k-^W&i!W`5fhS@BhbLOriVvCVA8R=ihau`}u6^;{Sf`nGk}W6N>)(d9ExHbten| z`}w0!JnGs1J|DZBjJ>M=d0M^doB@04Z~W)?8Qd!yhY#dqoWFx)>ct#%X#6+MsVB8q zhlcH}O=dN`KG$&5mTY0qhF2p(FOVzyv4(x8`QSo35jQwvIeS2JtMyTqT*THzY`?S; zKJ!L$-H2mp{-gr;yN%*btRVJ2^<%rO9nGo!RIrehq$K(!7~9-YdhOR=364NjI6gC24W@hl;GyzOx6jD6d;PMs#6!I|N@WMZ$!h zqG7H^7;j#R3imdm>$go27+-?kr7!J#wJb1Yp#oQJ8|`+DwZ?T`4&S2(?K+V-pmAS>^wafoLcRinsok#u`TNC{Z{Pg_a=b#?hXgr<|W%u2Z4cBwIY^yQzbuQ<5VhzhZT7^NYeK{?&bKqZvPnK0n!|{ z)qG2?``CFb;|t9M#}4BnpH#7lRD;i0ZO-KyRj}mUb70!LKi7D?j9D8JLk5Gmil-&4 zcMj>Cuj+EG>o&1jbcUa`yeE#Ec7qjlB;DPN*P=~lzOh&GG7Qf;D*Bq-4tDowcHe8G z=vr$dOd3HmzN~7|-4&*A$tb~H`&^Oo#$ZIQRzT}qxajK$YuqEfR{DMyQ57#HrV(io ztE@!DI~`Hll6czbeMGM8MEM3n>mA?sR<+;6Q#6a7O_Hn|92OF!EUPLG7@ zdLgdXKeV&9kB7{=5L~Ydc6ld>&3L*1^8z(?5xN=lvnn7h)^5A9?oRHkCG>M zb8w~izj1b+@57$OZ)a1Bt5H4lCYQjru#WcC*x)>mJ5{rWIZ)rD!gC5|cX}Cf;)oyE z?8e;?7P8M&8~*wht6S*q%%*=>CC-uRmQ$i z&2o20C(h5OgzYAsz}96CCEma5SWC)13ijR=XP&yw-WbzP&~|IFHT%Xo&ZB(enV~p* za63$SS&Buge~I=UHNM=DEXYUqb$b){OcXshe2`I#skZz*4hm&buS%5Ck6V=qEYkKk%;}NhX=W?nt&Xf%XTx9R1C${k)ku(+-7an@!x@&^2uO?JE4R zD&l&jFJt*0|Jl6?;eNR;WW6YtzWRyd&UT#3S`+Upe%TPxA6Bw!vno(OP?z&om9w&o z#4~xR#f_d<$`%siE40^7N!4)$Gn`kBjpz4E3IghwmUcOI2=~Q_=GTdLSB@S&sp9^- zzOwZzX$HE0w?q5-L5^!rWz5nfwGJ+d6}vkNhKikFHMEj^*%hkSp=mW%p!CSMQo z=?L$XE7IXYXm76wWe;OT#!->*quricF}|X`R#bNri@5s$CYntBjSp7}u=mn1(Pym; z6izC@dt+14Ps41~KF!A?#S2O9%N(@5|F8aeX&Eukx@>3bs%UOo)|rKF+st(Rs*!VA z-~?hp^nO}}jruj*%^u5`Xaap+p2RsdE?`Fv6AOBuJ7-i{!}<@ZM8E4Jxq+iAS$J^; zj(lmwjhIkQGc4+nPWvc{>r=}1)80hY#)lG5reNAD%keF9q2$Mwjci_fnjx-h5Wr1-%T6D(O&f+@qh zi_?b;hTT!}`nlgqY+Pl95if{~+xexaNFv7VwsKrq(J0dLbi|C_tmqM{-3*c(=eH))eZPY)zx zJ^7^UZE_X4QortNB(Y<{MvH8yUuXU!`e4(W9AF05w*S_ ztBKmoqKH>;bn|u2=;dnW{hpXezN@*9hnKR_7-Fnx3b_Y?3)r6vl}P;=%t<_InADOq z|CJ){*V77?K`e-q&s%XHn#)+Xr*p8p{Iz7}juMvaG6!~7uSmM>le3z-a#)`#l=!#a z$c`G7^bS8uaxZ+w_p5)I8JWeAQHQ2xAXq3H7HNSu2|9tZ6dqPQ;c z=tG`^vnQsBPOV9X^nL*{OF~3n->2hyTmj||a1=?}XCwJ*K6W*pQ+@lAgQdp*@)(!8 z?PvANx3T_9X=iYQEj#mL6YD~`v{}=8Zt;fI?DzL7L>unm=1p13rl*ou!v0F`ENNpp z+@g6_WD@s6m*OlUhD=9yE@*KD8%j0HqCj0vMBZVc?`dEA#RtiE>WiNAr8!IfRf+CU zIXk!eKN`ghiA%%=w%(*1OCGh9=ncEdQW)(Ft~?`tsrQAwP5&QBD(Pc=bTnvKrLbQcF49E9+j#7r|9F0Srtg+71e*tNEsIP1Cymc3{` z__UQ+`<(*@R_flkB?13JP?&nkIMcy<|NdV0RM;#D7I3J8nr9~JhUn9zC5ecpD z#E9XlMROlcrhA+GVPEHq`s5{};VI=9e6;8{`8st2Q9D;#E&iPY zjLrUUzW1M<`v3f$`Rz1&Z@-NlUs;Vvxi?EM+{7G-k0d?bnq3H8%^bAJD>m&or=`D? zwalqP@Qf8)r!^N2K9P8>m9fM1bXO!5NCFS7XQKv|qv!LEk~^|1Y=cWVR-9}Sw<`F|bWf4@ z#08~z#9il1TqK&FnvB3#6t_t+q9s?-sRk;5%NS=- z`&mmKRk~4}3ePb!a~6PH3LxQO)U9RI??XmDsc~lMDGZhwUVd$DLmTxZ8J1 znQtp%LECiUGR7;|%2@J(^liyq=^#nJQHVhQa^T)VnioMdl+>|E0AXI6>z-}go`X%2_4N)vB#8iZ(? z$%dHth*$2jgd6Q{?;dO=ZuA$S#9EHcAB@F6!W`i1NxY+&*5c2^SSt@9&U5H9QJ|q8 zT1+fPx%8wcG&UF!%Zf0ze4A+gp$J?dzT#!g0#Tp+ld)iCA*QS-5dDfv#@KgsC#Qvq zY|p2oHmv}!Qtd=f$sg9VO#$AGOIGh|my4lq|K(oBm3(CRH@C9O8>?|3VCZ*HYSXd#d4fD(17BwBK#|rIwrSUCoXK(0qJo8Fyye z99FZt0?tj0>sC<8o_8RAUD;qR>)_5V73=Tm4d*i@ z_%NbK?D26Rn!Z!M@pY2;mb)dCG%GAzC=r{!wL>B?%*SW-5jX2N;82JRrh&TRLxMZT zMAP1%_8U=9OFt}*ARntur$wdy> zlaleZxq$cvo}wEk((!?Mq@At%iyD4pL7#fj7gMyD{HRSpMQAY*H0z`!8PQ&IZnBA4m_DYP*-4(4m@b zrCvv~Y&mx^d=49~s=%AIVca|OQYPv~{@rGUZj!RQADJHM$&a3H78i7Aiz^(R=f}sz#~ZrfQdKEZ zqSlMsdH06$W(f?rGI2=$K#bQdf$Pl#@tAuf@ySYoEk~ThySLe4@;KTVSv){o{ec*3 z5i+O^JBXb&yW?=Y6cf_kiYC4F#mCrUs<}>z8cEw&Ev*>JR>WEg5uk>NP0wiv==VH6&!maDSaUO51 zkMZSno_AE^RelW{=Tpbl=2hcdfIX|6T+6ijS7S+jXO@t@gtc8j+{;#PxO?XF*{nb0 zKWKHDn|!v4X_2NeruA-aL`Tvf9id&q6NQ}3u@ct8jPB}`RL-C6s+>V;j9?DwQ(UsoBb8^Y%rx%$jmN-aT%q7+VA6Xk>w{|+-QZnRB8@#2S(v*jn z#lJkdpdIy;mYeSoKe^ls+N7mF7*Hd2YCjN;JxahvrHR9Ljl^M*f;8eD;)(O^aFdv6 zmMaE}-EZ0BN-Xg-4s{SeneUE!Nm87udnKBF+ZT6**JuA}x-6 z?3D}k)qj1`jpv)PPo(87XqG~}WG$Dx*#?^_pU=D!&q>n8z@5?Vt&SZR-C`8lQqR0w z&z79-Lu;ISAVWluvt;3}F%VH7a`|AXiche?xk1FFReIM?uN#HsONf6Mo>Tw6*DzdZ zR|1F4mGuJx`r~;Hv2+rb)nAP54c*JMyLw?~{R4Y*_>uSPr;VC=YnrP>#;c^hqRVsAk=>^VT*M|j9LvIK zx=)52aYkNcKD4+0`wkx08N$vwiQ#rg3M^>kw1?Z`!VM`-iOuNr}OwCm~= zxr$9K7=uCkOYyK*64PEM!SJ?}?^WI8dR(zb0G)G#8t3}X2`*@gC(e0pD}I-qC)P%i zSMrryenT5y!^x1Br@IuxPrm__xI zuVkT~^1b(E@m%*G`FO1RFR$QE!Wd>v^{IPXDF!xv<$?teUSLHD&i1t8j6Ch3T$*d!BR~|!oO01S;1MR+DNVlUi@>C~|p zSs1}K+uGudZ802%xv}d*>D&^xt*_xk_RyNcxo%QSDa>LO_6(PnNb&0#F?7?!i2Opj z6vLg&?~(*#$QLGCA+Y`nX-D;l3`QrJ^g~+Ug?epv~yi_uLWY(dLho5 z`a%mjA>pDAv79M?n5>7N{{Fbqwgk-vSJ+m|@#q&_f&q3Cw(M*m>bDZ(D^rVKdT|1B z=q~d1z0cq68-i|+h)ZnTN9fgkA~F>v_+vRzDBK&0l8@wv^}|@0+b16@T;z2$vCjA@d?crW*et!;e?+eMJtrr^|#38I}5!y-zGu3)A)RH2Y z1beW*i|x=qk@9wfDJ=D;2*-)zeI_fP1qA|sJ&SSrJSoM3d+G<6qNvc~Hnh_NZbtBubks}_aA zJ+uTVMjLo5i%FOhMZB*_BjMSHNf@qGg0xO{!Z2|--1BJfTgHT;10w(HLt!$mpTO2c zV_$1IUi!5VZipt6&!G%MKJ)yBfT@%Z7o*K^IX~oH3Vxn0BEO#g{DGJZoH$245Uncp zaGDSHC;ybzuDiH*XY(Px`EQ)ZI{UJiV-mWnijZF4kG&7(pzta};@L4Q{)HItsIQWA zV-oZ0C_=~%>Vbcs&C;KWk*`Y(WEawp)9#pJK{4*x*Rso<9Kdy#LO$&jiOHvn^;6lfwZN71Mt+@bIIGlQP^+&37fN%v*H?+%;Naw59h(%#<)Ytmwq_b4&G zmNmEI-QP`ul^gkb>z(C?TnmH!3k3|#OoUg~5vYh!V6j>vnWE>zr(>|-4dH&K=nA|4T;^7T^b^lZZAE3FdeIOq&KLZJxLNt4n@kfSa zqwY@urdHW-n}mG4Xz}m;e74Y!?dlHNloI3->PD3HVc>kwr8@IgE3xfy#( z&@n84{Ge$6^q>SvE(jg!NI$T2AUbahMisFL3i4ZE*0PDPv?xLK@;PkC%So6mp?6LA zq*81RL%AiL^E3H;o0Ig$T~ZJu<00?m9EmO73gW;U2<c>9$Y0sKk(C2Z*Nd1w>jvf&q zzpxmGf67_jbPh+a6~mC&Fwx1xi1U%6vS=;y8sH2gwG;ufPOzqY2Wa$VsOi$oUM4YY zB)!V$`&#%GIu^Z%#TOK-g?D-`$fdeC{X`2~S?__XwQ>Y{d}pgV`e0^T1ukX0Wvvnd z@IH>bIjYXH_#;8+CMZz8X94>*Is~UEPdFpiVfV8`G1IjKj}EO;*R~0VB8cLgu#um7 zJRF%ctNqZild$0%o#C$vsH85!+59N#6)CW8%?#mZYz(@6ljG}$xx(NracDU~4)yoV zLi3pfbe%85C|jjaC`qCmgl1m7>IHGTX=p`!9`<0hF!WOfR^BK=+N4w=3fWkoEX2a= zm(}uZq|eRz_dGic3t&HTC9os*+P9AH)Q0Cd^vWp47LAXlL$D(zk)MTaxxJ=m@3ClS zMf!(&Tg}%12fQavFOo-T-fVP5Y%duOOt;jSm%Cvdz0qAS4A;C3afbVAil^3a&6nn} z_(Y6_2Df3Fu$2rm8szBgH(2v=of966QK0d9KTV%9cR1}-fITtMytW$$Ez=ShX}W2w zCio+o_I&MSoiuHq1|t7i2}bJbY2sf~&u0kbz`b-d20KDwJ-!rMN9kxxW`#o(T#C?P zdKzVE1o?@T!e@I2&4tI2up$na`xbr8vDwjhlt~OFmkyeQDY1BRPl4^VI+}hPCu7I} z1%iTq2~y=0JQz;3r1>-9i%~Kp#LoSja!znMI}MLJN^#=acHwz$CX%#@(Na?)xX#Rm z@0~*Yo>!qEzB zef(8(`4HeLrT*~g2b!u2V#=`<5cfT-NpH5tK=TqDX<4Uvw%-*y=+D0RSB<7yi5LE! zro3)do~B=lA9@&)&*Q2HO?6Em7LOzEuxIWXM;-E|%A&p3^CC@!`6Mi@q@7~UQsWsy z=QfW%+YQxB-W-WtG#6O^YJg^2U^E&&mf-kXGmUrKSlHzfuh^)ErtVT4YG0GbO1mza z%I0`{5Yu-@)mF3Z^Hj7YzH8yUufi6q6u1zZv18F~A?nn0ytb2K`&2>bXgLFYN03gh z_begpA5%m-T!op;k8W< zDV*|M8>Cn5Ns}hS)6X#tK_(0i)Hm3D(Xk;q$qDaH$l-oqV1wNw7knd~+t%J)8uq+# z!opw$#y)P@AhNK>@n!UV&v>EPTF;^T9R>E7p3#`La6p(z39cX9skt%P6+LItPI}c+ z&Dw=tqzR?o@>GT9SEC=Abm)9;pQdTD3Bm!c6epu5YSuJ`;5_YaulDlL3>p%K8N}b{ z6avkbLec|7kSFpQTaDh)DAZV$(oU3>rZh7K{VB&AyJCpOc61ze(SPg0lzy6D{o?WW zodU1V_S7s7nu0J_(ndz;YxajF!E=%vi;jE|O6R1)%1ee>UmAqF1Jf~EUy40tX@Yh& zF)%k2;oJMye1<_TPI85ac-ao~7UZKz_&3h}7rfZOHXL?7D~3;SIDavU;dy&0+}CZ> z9P)5OGijyP9rbQdt#Ck2y$ma2;v2|D26v{*;gaXlP`uq48y?XAkJO@Jp^Y2tMp8Z1 z-l$=rzYDfU(LL~|RYTJW2RPI!kgfY(<46`S=C>8--+WoqwZ$CmhG#KRI~o=DY5y(Zu))p32-2WWoVgd)Va6lHrj&Dt&D zc+#yDag9SYf8RyH<9!Ks8k=bxzD47MiuSmVbkR({5sOFRRPUeH)-*ku4ADc%&x4wT zP5W7RP9ku$P}kzcc3#|Eu(sws%i8LxPu zId|6^KFj17o2b!vx_M&34w@N-*J||j-Efxb@j-Pm%`4`F{$Hsl>=~q~&UQji69pni znrqxLJuuCazP}sa3x;E9*ECguhrPE7{OdrxS190Ak|~5_pKVM*NhI{`z58^vk(O#Uf$FIF9XL2r{^v~V~k z3uB2z+@&Z}5Uk;|33tf1Wnn)drqTziI?6EY z@+H3OCtvdYkfB3(GCy~u4-Qkm_fXa;_0t$H_!B!TvG*VGa3eRoKPAJl@7p=;C|3+` zBZqn3Gj8QGZHI*Bl76ElLY3Hopi*7Z> z;CvSa&V8>^?~ue}@(}WbT|bb2{xbphssH@LWDehisi-4giIEOxdGq)r9K9$<$<5Y6 z4|NJ6sP|QRxSue>VmeeKDYxwHAf(MthiwD(PFqF@fwO0zVt@?opJWRiY_sr&dJYwe zGC_B2E?yibuiiz~!dcpRO(YN5_bZA7!;|@tJRm>QO`nJZ{fYYhCh2^DbhSwa-+q z9_59dl#`rVyj6X(iS$=ia&&w4MBUmU1eU3^1L)nEAIe3*f0Y~+ckTGS(_+!@82Kf2 zOX53?OTa?PvE4-T`Q1T@$owsbPvSvdyfz7o-x0HD(L-LBv=+VMC9o-V)^1K|3 zpqNa5F;6HSFdJv-JfFL_P;fn#kLOpY2JcuToHnDqE7IeoINoQ{lzh^c{+n+!jeO7b z9qoYtnwOb$X53-1JM8E?lGS>HkKW?TUZk5RJ z`|2z{Zj=vnco~$-EBMK80>xA#xRGwT1mF4Gn~t5OiOgks*VqcCG>Dmv3U(*K&NkX}3; z26m(|$g~o4$m8`$vkdj!U4@0aGl~C7e9P})!nZFoF^KA^rF&-x?t8MaeJ%A097=@F zPI(xoBSnvU^MqxTvvs8T%Z=X)1dnOtySuOmhqq@7pC=X|R7$;$i-*~p$@w^7|8M@h zuF{L!`rQLESMsplw^3BP!yV2PXR+jX{qC3U5Hh708t$j=(asZU^7Q<knTQ z)zQ29^I7DtTK-Uqc`<(cWK{^DMSC~BGkI}jF#4I0mVR{w-}Cu+R8d}(zH>EkRD2Om zan|dxpTD`l8>f^q)P_`8ZY z93>6;uH#xl+PEo@Cy>{CuQtMy?}>OypM#p)2=4~d9;FM_@6*}{eMhFy-Uj8LcXfsB zou)xTKhucf&cfn8X$Yn}ZNt%4!H<4I`qUXX;3p;hv!$Rg$U?+?@;f$# z@L*LAcAh9g=Tlz75Zl?vd`*6iK0ZQ+8~K>kwh&tiM+(t>3t&ZO+Wue#%ZbZ}`HO$g zv-PNn^&>BN-~s6wdbTuI?@4rrjOx3*1BL248SXHcBE`x*YV`~c4|+$XxWA$!f82xk zDF>xES?|tw2n>eBGbvhnX7kgdg0Ym|j^0P+@q-QpA%_@x(fZr?+Lrpvk(-}d3HV3K}a->puRfg=kK}* zd$?ExB+BuvyMfS@nLx8OIbL{l6!h#8!7|A!)4z@IFr4lU`sW7(ed5nVkl&~YasP%k z@e4+!LUcg}oh7&Vv9{AumqfE~uj{;PP&#Se>H8afonM%iiKo>6wBv8{FWb+84&4u< zi<|hvW!Y$Ti*y~C&HQt59!C73*v|UG+x5yPeoP?(Qg8ATKILPfNdeA|8p__&e%sIJ zf8&g0OVwICJ&1u%UZ{b!Y9niRe3eMi#_fzczP&pJ(7p6>P-{MUnLC!#Tae&r&1Vnw zMFHI#?~*qP~X4A58f%dy=$9eH)EEmIQhh^>BAl`v$zPqIJAM5MO-=x|ksciu!z?(~o%*Q2S zL;v5r?yGTozT-R($W5g1T=_~p=9wE}NJC;`-j>f?*7cD&k$$fe8OCMcJYiymLb!J`I;)fqOlFd3FGn1=7sr%>(}aB1Ri0GJnq~VZf_N_>e=) z)mNhh{pKhvTp-7>R>Oo=T_@u_-OpF{_YfwQO+jaR@Z zl`Y-#)dhT;#l-r1DT9TXIsY&@758N_Tn^l#-sd+RzjWvf)ZD4x=|lNOx)cZE{3PkG zGRdo?7!8fBIH%-USpT4ieB9b`;y}7X{ubg(_bN&3&OAKTFNA+lZhgn`G(#a>LAwjp z>gU1vXf66T&X1ei`QmgByrvn-OG{%uQQ<~;EcNQ!_UHR{q?o7Bz2Qw>Y{VCuwUoHW zgOm8=d)}zHErn$H9NsN#Jf>1VIbeGozaVrxz2|hElTP!I8b2t>Gx1>BM}EbuaY$Ct zojjnk@cEDj{75S+_8TZPMY-cz7dhHgjughd@IiU7996^Zgf*RluzRi?3kEm{`!0vV zoR`CFoxR|3H4>+8%keCKl+fXOEcU#VV{&~@;l3;Z2~BcXzkSWy8BRsBT8_|pbNMot zM7$}KV}(n5e%QMtw5EI}OyytyX=4h`pQC$h>27Xg<}_&gkvDz9KsGWi4c`tCTXG^g4~e)JlJ z1K+}n=7YojjdN$GVt%c+2VAK(c{NbPkLu%wH9-{H-r(2fx?&&Q6|I9O@lQQn5wV@T zS_}&KUeq@}M6;5(%k%iE7sQZsqqDJT2S1c@v+kwzURPe`H@)+L9ldczpa1eYGrX|= zBmMeKW8vUrH(VJ+o=1Bug`q=SF^h7EbvJE=fYal!gwAS8zP*4K}xZ=BEnt>vToc;GJe;-+m5=6@b=MKj$My}bkZh{rByMU3>w4ynB1bQg5w z$v1>%XTK(RB9-2|6`70pkKD+rD6a8SjO9nT;>%7))Z}g*cyQ+t_Fn5>- zRt=WpuiQj9_nB(RSUIAG+X$mxI-xDqkGJ|WA#AA^e%v9Jc!ZNMd`|$n87Sbn-CKA) zGX!xS3fy?$E)-1*$MSRqe#u4&K~>Rkt59ISZ%0AWb21*+C@{NjFWK>#L>Q^mNo!yLEw%)rLX6HmZMj)C!7g4Hco znhB8at<*%Q&v3*bimlMWMv!iBK>c+&$i7%O=<9*yX2f{;<0#lAlU6oN0g-{H5YQLtXHuRVwY6${?lM z>(=S%ki3&3F*F31S7gAn1MOvO=~09>mpWra-`R-%P3(eZ zbD^*mooCuT{=e@aue`+z_3mh-d&8@Tg1`U71%{-F@-EBdtLvO`YrYgyHHG}?txhn% zMEgoPW&G=HZb+v0?(vqn{A25J7`mML9`1E~^doN!_$I>{?X!H`eRm{qava(AgI^+b zhIT3Cw|$L;S+B<;=N#!GW{ni~r;SBSCk2*%8zZPYxnXo9-3d1(LfAkbsA%>&Y@oB? zofC+c_ek3;<^;X^i8$Dy1RIP^h2EVa&|_E$x-Pg&p5xJYJC^p{8VBC-H@ zs05`I(?BLe|6wr*%Pv0E&SM%^?Xd&*@ zMhGV^%!W(tzxrp%jxT&@sXOk_J9xZ&EJ6oQeVP~CcgnDQ)lxpr$csExX}7wyil6h&6=x!;zS#Se4;o5- zUc0D|vAKhwieUKjgZxSg&4nS+47+Id=RSUraN(6RnwHUdD;^<)a$ZPlR$yYOt#Bd5 zA9{8rn0a!za9cS6$`s^&OYQphZCm5@PqV z_9tS|i)Je}6(jM(Z!)xr9s0f3Ea(|0;LSV*-YlrWfF4uPQ=7On!HaP@I0@!d2c^_j zVqrik#?PX@jVu@2rlnz`LW<8B5lCsy#Lgl*&)UwgKc5B1nMJtPI1F`VdH5Yvh=lR; zg$U9VOd~Dh|2@x1e{=-9K$_{({Iq%fa{hsZ3r6^pCyPT7A5`FktT`0tG5P$jj}DlB zk#dr+x%`pe&PWqcj&Xekui4{4tOgl8A?Nqnd%(v+j^=>X{M$dyXq_j==R+s>BbUdL zKRMM7TfguHv;(E-LyTXK_CiRpgz{kpW?t?hocQAaOX^iByBZ5-9M%4GJ}b8M5hSyG zP+wVsp0!4T?#1zFe}Kv|LLSB;yqS{;mMy8to_@YU7isIZJN30`xt?L z9F2Jgsn;5mieWXeSP)%;c=NeeE652-SC!rT)8@d{Ew+_Fr<97UFTeWtDY00Ye;iaw4Be+VR%Mt zsQzaT^K&fia9}KbXXo7EI#8^zES=FH}Z+ZKC7xYxnxwZJs|Ec%F zygMb>AAOIXE%wL4-lXS`kn)PRL74AOY$c05l3jYCwAVm7u_4FU%N`MM@hC-c>{w`D zh@{_>Sc~z+n35Ka_4G4Z961;DGh^||gM4E@mSamZopb81nh{gu>A@*5yFtCd-ih?{ zONQBVnrWs7qgFNzflujvR=eR;KnA!=#TXpKuwnl!y3dPn?m5GE!#tSN{_MvQZ8Z}& zD=(Skj9 z`~T_~SDzgz_#AOV-*_o@3cL9!DNZQcNFGCLX7Woy9B}@H6dNO*`0PKxI?~tG?K0p~ zX4%u9MTSdvcc@QUI3wDf@}d@=>dzTYcym?`J>_t9@@~6UyzT_9=Uq07l#3)uUkK{TrG-nLd|wM zpWhjGrpyDrUrUke>&KGT`e6MK+L^t*kG&l>9?`^3eEX>dY8rxJOun%Jjsx-2cM`6C zAf`k=U|DH6#>^>2=gD?BWEzFWHzkl&SmW%Q7~H2lafR`4@}rJNZ4hy3EC%D%9@1Ycp!|Q>h=}5z_UZgj0wZe?oGZCg+44pu4{BF!eAZft5T1?Rx(Vk{B zu}A;!{k;D(C#Wjj;Co(*J2=4Gq&p&p^rCq`6L^)kJ-Sj~%loGpuV2StOZD<$yM5|G z+ktaK7O_QQwAqw{zTB$l&2PHMqmJ@enlC!Mr>iG(>>9Zc34JyJ;aJH`eH~UakdRku=ZzyaE5l`8hkIYITJ#$ zAb|Fo)9b^a$4JMvq@PH|+A#7Wd|-e{$1+e){h#xDEzmhN8#Anmk^IUBvpW^Qq<;~#+t1hR z%FTvNU+SCu_pkr$r>yK?FTCySf_1Iv_i4AAzt`IV&2BRAJI3)%bZ1so%5eS3YxQ*} zn!Vnm+%mkC+O`46qTWtTYyp>7<%lbkKbZL$uoLYZ;Zm$XR#pJJy_jJOeIIQ%Dp<`Z z8+4|3KSyUH^K}`4R1NtQB%Nfl@&@95uTmr}e#-1e3@05H@c{K(qT%2ejCxy&C{Y)9 zwE-&VteUN8g{A}-Sjx*_`2H$Op6!LnyUVb|avc+BH*IzU@xi`EFr(55o^1PTHuz08{<_mn+?y`w7D+50mm*Bb zSS$Odo5RK;i*n<`Z8xfwg$ysA z$w7cxUvz=U*Gb%z_+LKj=y z_M<<`mJe*(o{{Krfb!Gv2C%2^r$OgZ44p6l<;zB(H{HEYJjUQ+wk?KVEydIjcN{!E z7C#0NbEei2FMGPdbP6%~3yraNz&N~~N9@)v$JndV0MxH0U&3`3>_Tf|cI6R&X-S}Z z!s|(}8B1)j&{_P~Aj-+^mcrd8flqLZ#wwdqjF{7!4-1V$tMn4Iz9>?ctW1Cdo#&{Y z2HdlMAczVn8RH|L|lZjxP-kf-{1M6Zc^H6Ck$n8{LrM6T(RF3SAKFQ+csCe65z^r zg|oowU2@mY!1ud(*j)BXcCKTO`5yEPU)6;9MHV==LW}AnZBX-k4?Ot42Oz`i;cXr+x6MH}w>?xcj~BjR&Li@oPzaEbs1* zvuXL{(X%HjQ!;0wtO%4G>(Scjd#?Lb7Dz@ zSVRuxZvD>;5$!SzEp^Os+ul>$Y|ot+F{l})*-CQX(Ga6@aKz0(TGnA47KdgdZ*?wBwNLg}5R1Gcm~;bLC|}T~RM3kG_s) zWO=z0)?CfQc1a&I&)CC9)}lv(A%f~yViDi^v8%mMH^CSdPpNm<6N8%vEbxMT+KuYt z(Xzr3S61k7fOlEv-mVzTJEZTw`}o!U@Ud$?v%!YrLXHnc44`Mb1$o&!2Vr73eV#2Z z$T#&uk?oid{X3bOoL=-)tdx)KDVxOBf=Ku+r5A2sE%jHYA!u7uhfz;jsIQ;LVjMqf z>)iF!KevV^yyD(-&BW#Mm4$9VQXWpNyD1;& zxYfawK4SJ-K z=Wu7L4yAg9kk+}8v&M5+L{IG>{V}H=?~1CEF# z!=%>CBj{r<4>XNHBi_mD_H-4iJ)>a3pLx^cuBd!)2yXFn^hIrk2{@2Kd~g2&q0~>p2HqPBtH+D18{<%&T#iR|%9Jn3%xjyFh3EP< z(%`lkFe&7&u*Tf~>RizL?>aAqhnj5Y4t>^n%j4C;OLjp%@8>}~8wz=v6D$@`H<6HD zQGQa!;z!h~tT-m!&UVHR_B?&72Fl0SGf#QO9o(yx@Tj&`2rK|aqYAf)@Nz)+!|V3R6N@og@<`MJb#of<{QVL^b7yiPyP|*r-vfbjU31UwbhMl;&Eau zd;1-YRFCikNaJ~a^ee01h)d7my-~gUW)WmM9&zk}pVYG#MIser)2P+*tf`zO7s-sA z+v+X1{8#7DR)5#I-I~7YT4Ggu*@t)NxK6Zncfq$o&#Vgb88aD@!psatBM=r$0KPNxg2M5g#E8nY|bICe)3`EPGAN#IGN~L|M-7( ze$o2xI-iU1RJWSDBawCPxqG81_Hscy>)fYKE758#`?`6YuMh34X#P&d)CW1(YPnO2 z-|vj81Bt_*=`E*zBrg4!JGdtE<(oFW;U7+}m-|II#H<%O6CWE}vo>aI)xfzK>uhR< zl*u+2Oe|=4Nf6q)F=uTLF*i8@x2xEqPb21N?4E>OrcO9O?p&AR9O9uKXjG;HM&!ce zyBB=l&|~drDneHJ;S}rKcuOd9RtDiyH+qO|HA3~0aIB{8{(k3c@=fzd<}1-3{<^gs z8X67FWcGCjvn%SKkAdAwW}}SmB8n5@P-@S&*gHpDb{dXx!|APkZi$$6Cjsx1a?!4^ zRE)Zo1plNQ9Qrv!m@XWTX^Gjm`#M~V=*(Q{BF=`dpDRuyxsP3!3By(Q{;Tst?r8sS z|NLO^0Cl9so!-FwIg880k`Na>^(R(;#z5?@aKiPuIr!APzA~dW_!%VMOqnSaK6QpZ z>%2F|T&~i!H+&xDQtMG5CzB&LlDM&z*e}l_=X~cTVxBcBq4rP-H|sF}=wT;%hugw+ z2s6}{_CXc)7&kYO2fjZPhF5LjL%!mh4e{7&MC^1Z^GXUPpuoTbZK?4|FG@knKVF#q zfqx6@kqFwz9a&rY>%R4Y(Uu?t8t0=Rx*KZj3`ZB<;TId+m9wKFsq>~*$Te2Zo*zx$ zIrfd0he+3}#v+yPZ^YA?%EatA9CsiFwZEHq=r$b3$v0D~4i>YXbGJ1v7gx8A5vBS7#l)K_9f{L7bbNQxFp6+b8DY&)#lg`iCSKr_iVL zn}L{ecsypO5dZ03ON0eX#>DwqSn{GwF)H9YxHl8C4u}6&=L!E)=d%U@s(*|-1nZon z*(WCCxbVzzulK`USblTD(K*ZtuUMkE1p&GD=+(KXSYu0`xh3mdWOrE_!`dEXo#&o{ zeBnWFWU=9RAQY&e|?Z2dE22K>wM&U3#4v0$GeSMjA`8+ z+e>XxtFaD0c3Ps2xf9xt(qXcJj5He${1VJS;ZDH4xi_}|)SFln! zb|wgWt=M}ssD-Il!r{@BeuMW<$WHXTUGdRy*XdBvuZC=LoS91Bw3z16 zQPTI1gE@QqYxllYwCy|`N$fW+|5>X1xtxISY1DC;UQ(t#PQv{(*16AZ<->vTkTbF| zYtTWZX82^t%d(KLC09u-$v}TNt5R2+sDz zHv%5XMk~Vcp*?-1Q#Q%wR*|^%ihXk82>GFVH0Dp&;j2r187o=mN;*`or;{dI5cBuc z(&xxd^F?nseAC!J7r(BkR*`^-*|}IYa*$H%ToS^_L$C>%pcHQ#4-+l@Gpj@^QZW6r zS7%}V!Pd&|IT?I6GEw!5*WUl;!T;$u3~CKlUzE6W@0o*rw=ak(J6!N{U=G%nOcdW8 zojLFG>w_AL?HfT)ChkzSc9Ud*yc1Z19MET}$ud z@(w#-kd}Sjmn(Ae_}UUUWntJ;CkpXxmA7`X2&cf9Fgbw1);c4KH4X) zmn+$YBZ@s(mE!QtmzflO z+e_DP#iLs$bsXB38f9(*(m8i8E38v7Wk(Wq1 znK|&CCW*LHz`k3&TVB3aj=gfhcCTDi&lsVs^Y@^aWG-=IvkLoZ9taF%U)SiFX5Us< zcu*VVG$LP`Q(4B1dRp8#eoJau#})^OCn&31$uxC9H)8K2uh_|vzpSy$T!&7#yydpr zWkeM7yyXm$xBqd+dEydga-#f&+Czty^o5?AAiujX5XXowt?3#qJD&}NiGMykNB5H( z9tgvD)<14mcUhScf%=u{>0POsd~a(MPAy|k=yggu*ER-U>gaIZXs)zY8HzssT4=_E zN;}y~vi+e$CS z4TDV{@tLmK(r@NUl$OvVW&Ua@;O=OQr{=M!`*CSh)$s_ZAcxcIi8SU?Dqg+J!tpo1 zr6$1{Fl?2DFXyT&|K1y}EB~&uQ8$0pdsHvfc|@*4$pg{-ofBGg$w8;cb;A5C$QR{( z^1MWx>ng)xTMmMLdFE`?{mvKw7u`TGWG%jT{Hmv@)A8067+AV}>8kORd!=;gE#rJn=>pV^7v>^y$FVxy;uJq*7 zPz1Zs|0n0S)M?ZRv>cX;$3ETVCl;eIk#n(eB{zBAz;W<7#C=K)KRNo_By_HpP5oq` zeB@#}8oOtqEME6totrHAn5dIr$I1E9VY7oA7H3oclFhAM||{P zZd!FSwSF|`oq0NR@aw5w{niH&SJ?X95?<2(C!thr);iI_+Mxd-k+Qou{@2e0Izage?o!n=BO z+dPEV@sRZ_M!<(y*^*sjcrV9wy4?b&!cO(&1coy0n1!Ss5LT!Z`a zLi&bX{!sp3oip$K&EL?ubrv(1xS9*Hw5u5uNFu zGocdaL9hDi^@Eo9hjW2V`<|-XHxmrjv3K1osUBY~koKN+-tVUVIq!hm{yIbr@lsVE z7wlN6!`%a(>gpRF*mhTkl1omir18RI_7Yj!4b?A|24aGKK0=@9sns6@;Ke;+M;F(K zl8_KAU&Fk%VQoc~`C+JPMf_Q>NyS?42y826Kk0H;+BG{G;oPrQ*WM3H;hxHgHNKCiSpqth~nHD*ZjC(Bmzt><)L!%Z?QAb4quIk z+e~ez?y6&f?-QAI8||WgsBMfe-p|+X4Nxz)w7}QaI(Yh0k8_v)9+{luRt`~JeVs9z zpZy*8qE-1?Z^SaENf+p+_OtPXmiO?{I9s*nFCPq(>5HCLTRr-G5N@|)9$frNad=rU zdT~yPE4!;~ZWV@TVy&02XG?c$L}1e$EtZ)0$umYrqcQ*PqjxQ1{^L+wFC{l`@G<$- zuHlHhOO4))Te3fS=~gW`i%obSH#8iJm#j(ouN!iesVSJhkvxI#$K=DG=w;rLybGJE z;@@|$X8GTB-ezSiQiI)KaD^CDLL*Uf-3bxIqR;O#71MW7OBhP7vU8~T*j9rJdg6DHdkM*c8pn~?44FM zG*oXpo1qG4?a0|)YJ(2UiFm_#FeF@!b1_5gKzg()vFf9bcE}Hy`*JuKsfAk4j@$=bsvNN+TbfO3z344z*PL@yF`n`KUj#STuUe+!>F2 zocLWyiAfEG3%FP_iu2%>D(A(rmZ_bHP-{q$MY3P3-8}pCW`mfFx z>->E`f8A#)N^IRQ@J=>PUT7>P6|m0af-W*Q6U*FW`j3&5lNm17>KtLWJqOqJXNqMr zHR#X2u3<*8aCLV=sXpI6*L9)?@AEA?dB4rREJojSgfJvWYfcT-)6NN1Co1OYSRQYw@iVSnBLr5cmKOLQaCIAU%W0_ z-%N-GZfN!-8^JM+#CnYro_5PY<0>X%9 z=R$GJ5ZrC#p=QUGqAR%sD&LfTJj(BM>bG@IYUKC9Y=;uSf?(XN7D+ksG;$VXU-b)#BQAP+h z-pWVznrgUK5stS*@?o;j9WvcDnd?`H_;c5DnPS*c z2|If74DXsNrgfH}e8|JMB2}3FvBL_^Bkit!5eWtssC-?E74O=pmHQYWiSPa*=U(dS zBm+DmCVcS0K-GR`56s|>DKa-)z1+YOUD*$p6b)DV8aiV07VfpX#j19E6A%C7{rtMO zT4fONQu^yg|7fhfoa>3JAEPRM4sQNLc0Gs0D-v$_&N2B-0XKSY~twm z_`n^bZNhQsT|OckPe8_wNODW_=^2=Vjl?}X4(V_;a5B0+9ELB|$YtsgiKTJ<@izANK)gs+~mH0Hx7CmRvKc9NQrc2Dwmwe8iBWtNG)^>+a0R7E|nW!aeI^q6O z9rk2OYItAzs&U`cVP|jk{6*g3x%37+;HS3!ZHKeZScf^D>T+u*ERdOxTw_xUIrnuaXS;|sj=aVa?#Rf31%`*a5ZI0 z+{rrA1Eha1{G2!*-t42MedvuIlTzu^n+Kl*eH3NSBy2eQcb&&r8;h<>TygwUHvF!B zQ;Y(EU$*py+MzGD&(L51d*-E0I*DK}dwO2xp#2(aVOiN8`(o+S^~OQ`uH%T??B)73 z@ez+@2lyIj@oIUd_}z1bLh0cf`-?hG>jmhOHb#8T>w~H73z1gvU79`38&5+EG4$>axo$&${94Yh-}i>)t3ZrgT?o6ZvG5KF z#cV_7GM`I8X9HqQ+@%{xp%_NKf%$!MZ2EYj>PCjcaK;Y_BEQdkB;K%B2_uJS#m3P{ zeMc??G2rR@$06XF7TW6s=T}a`I0GG;9%`bfF67-k|GUm{lMTi3R9C#9Mj*MyU1fF? zAk>2UslIoWmX;cu)4T^ z*$#FVyenc2#r|DZa5zD4s4g*L@nRF0+7l}ankyPM?24HSbky%1788cF!zAwess{Wc z+I;HF477aoN_ryt1sLNfe_zk5zeI~(R+z#&!C=(`v3Qgt?i{5@cg=Jm9e2iAlR`}V z;<;C^q&IwXn58A<$kp$8qJTc?FYWXZUpNpG&595(#09RG17Ovs2*Z!l2P-oKEtuc; zyh4KK;K6X~REV27*6@po#>^Dvk9;=6(~m=O@K8SbRJK4w<_NfV$;TEw2YmZ63e&bT zNA++&dL50$NA{dK0iI~MI0b>s!Z3Mvyy7kQFW!~@p1bW1cNXqp@r^MCM?zv_;uuX@^H;3;nR9!5!0s)YLdsIts;v` zGdrQj_1=_#J&^uR^^0-UfKDe?j>a6(sr8=j3ti(GrSlG8CGs!D}%6(RZm@jHO!g^L<+PFg@x{Lg!{*Tp-pl`FDFI^Mox9vgT3GGb(}y*g)mn-EaRnP1Ourlz(LJF)LkK zKE(!a?$ckjDdC7cd*Wyo#(Q*~6tu&uZ?_hL4WoWMF{&gK>oba7ngfXMZL)ha@B+Y6vj=3o3~DmG7mwc zCq;;zxL96oGZ^Q6i*VunE?JWhjgGqt@vP22^0kOKWHc^B&Y#No>@^bmmM}wnS9?sg zWKMc9@Bb^F=*Qhk#0q{-O8fF7{gN=xE*&QidddgJ#$&MU-*uKs>x+^Tz0lxX7L*~8 z$_5iBcs0pJgLlOhSIPbU7?O=CN_UOY$R69)aQ_(SAsKw;ZkqFW(=!*PuuOZrvdG2l z7aio#xpufhK6$gx-ty2CE0mF!s~tH>ZqHtGu{rtkuCwLF`=}FJqD8m(RdTDd-Klre zA%gkR^2MI0cR`2EhYrX~c3GoZ5;yZEJT+H75+g&Oqk+eKV1({)xky9n1hV$(HYI7>R8r1z56f zkGv!$3E_N~Z}j*h7rh>jwiyK|)Yw4NXEJuqEJDWg&yM~Nli}<1cb&%!(i0($y^u{_ zx`t`rHA*1Qh?3m5m_il1)cSl?! zj@qhGysS6Q0b}*Z8U8j)HXmYxQ%iEOCu5ha$Nr&i9qP+!os>^^ut64QTeIPJ)ex(^+}8EOR8b^Z5ISBlKRX{)ISD z*g}2(Bpkk#3Nd$86*aR-6b4T$K>zNi#HTeeh`7#di~Tc%!GmF#)}3>ZVkg@7Pe8bi zo>zfOl-3WEP|=Kd)S6S8jV==~hFHP-O10#jizcIub3WGEoY(AoIt3d;{yxu!rB9TQ z6OLHM-B#x%mK7g~VK(}ciNXbb(hPDcyUTOU$&d-gOJZUkcKVp|L{k(e(Zd1)>{wD>XY9 zscVjhz$IOWj(*na^IC(kO=xj;Xj@f3H42kX=0R`yCvjj86HpiA;^LN_;(m|e7#fg+ zVDm{L|41UTYH-%bYbDsC(uy^~r&h18>QjWH9 zz~%5PWVFh3+|j`f|7f$YD5ONXf7u!VJF+lpZXLNrz6E!TS!nj$SI)g)jtVz=%gmT6 zxBpF?^H(;0?bszB+RGm75cx|JpUBNQ19srdm>84zqY+#OU?%inD& zwVIko0-s7Q?(ALN)gOsr=#fbLxuv<E1oQz52)s&euXG~M|LI$~`V{5>uBH!I_h!tFqsHbteKYj!5b?s0+AP*~(?Dzr z>y9w)0@}}y!bcx7gnh}w>#C#i@QDp`(6l&AfABkPC0NeYBA>aTmWN&Nh;xBO)Nn*B z;x3YB`&Xa~ijMaCPm}d|XH}?SdF_aEL9cuIYg)5!8-l2I6~&Awsze zI5#mCb`N^uehn?^Fk>g-r40@TXwiRg24)1)u#;;7k9;IwjKCbpdE_i~7MSzmCkFx&HljPttmWb}k`zm3Me5ao+HeAfXX3stH z=k0drmQF9YgOB8TVKx{}T>5-meY_cDjx6gutlifW^T!yYh@aCiD|-11HH23gz0IF6 z+o7Kse%B_S(1yB@5?hR9o!hrhh39tZ|Le1MO+k@wFFblcjl;A=JmuWmi@2Xp?f{rA z>Q8SX`ZPLs#Boy}Y-X>x?ZXlIbf`bFZTa?iRkvzY#6%w9iLzoSd>n*W@>PF9sL(H=pVTaN;$ubrp1eaolk@L8i@bwt-En0Lx#%GSu%@Fq?5mSg zs)WHL%NAZyTKsH20{W*o8qtHCs1BK+eSa#`y(Kq^|E$e)3 zZU+?P`k*JVl%;R3$j^58VP^vEu5iaAdZ~ zgTdWkDB8&%RB6;l%rQlXF z>a)&ITpB65h!k{Voe%69FAW_r8BhPGe|B1DsWkfF0QW__Hyr9qP4?R&mV3saH3y}H z12%}i%KVFt9psA(t#E?xowMyAId`-*l7jf&T}zdJPP0d&O1Y@9XO?Vbgo|tPV13j9ugKBuO{}j< zraN}u50*Fgxm(+gE!^Yi|!KQ0{fKqbCwbFA#p-_8^B+Hqe{ zvpKvk`yjdncO~<#$S)uGV{!u>_I=Hhe+&!6?jrIhC)AVey+WYeq4s$dbv;?()Jao+ zr_obh)Qo~($6PpMFIAR|h{YuCqa#KgRlM%UW61U_1pF>nFd-4A{W7U*$W)>pB;(zH z3=Dlbsp3ym3YxOcu1f->EA*1d(ENQrPxWb`_|r3?|F!?SPnkQpin70(BOaFXthTRwr^#NH{{QFTXc{QUU9_Fn)GS8Z!RBSBH`e|T;`*M%HH9Q zDCPZZJfKLn`euV)UGs43;a2%Xj0H8$-;$8VZ|4|lskBaUmPgXT$#YnJ9o0Z`wfz=-?qiV z582ER*&=o5ZG%D0a;R&#Bw2m1rH?+nH@6*;RPF+{*P?e^z%fbxs*J94b1|&yPsyT0 zLyPKMxJ@#Ycl5WzvNp_rX%sH^J7$4Jyf?hI7Rg83o4}8=$%EYs<#*-gsN9}IAM&7HXQ)@|}0SD+^~EJludm=<$c&GjWG()u}HAv$h}Stdlo1@S;Dz4g;&t zmL)@9Ol2?qK^iS5(|>GH7ag_7_VUjU0nq3DoU%k;zO*M8&+pOS_4#JWwJN=Uh{*)! zcuH^QMWP3>nrHRPHOnf;!jrh=>v83d547=Ub2$rdE;cOhVVa2H<2c8S`my)phGeWs z$UrU2eU4|{QxF-Lj>sk(G~Q!U5%xdxVC1he6%4dM$J4}!rVGa`#SWTV*$6Xwqp_ln zbqPN^sjIvt%NsT*Z_V5mzhJ5BIXiSuqQBpr7nH#^sI*^=1$1NvjIn?x|t^Qn#hBFlgCosHWqlwxqDl$ z-_q)u_L!MVJye%^@)&ZVLobqVU#o@urIel?Jj3;Fw31`n_l2j1z444@a^*T+*uovn z#630TMh3n}`B_F(xY1ec*f5~cGY>(qugM;`bK}1yFt=nH4MQ$ z$=PtNEnV=B#EpKr?1ScMT#m%xiAfIf8`sek2E^mtyDZd>hU10m>^JB`^>cQa!;j)* zywPUhW3?fUFYHoqbQJS|sm| zzBnvqpO*JK8;x4F)|8}hM(aRse~0PinPv8vIF{H^N-sqa?w-Or_e)u?%yB0Nl6%S7 zmWP$M^oTw|UWed9sPVMjt-L(#Mjj*Iz8|HEUgy3r3)aD6U%v9ZnHSED zBR8f~piR|HBmu{_yxDkNLH`veE=~t|c4#xfFTBMdG@2xsM z3~$}o!z^01TLy70#$c9nSu8P~w?GW~Y z8R9Mfsn}g&2frFQ*i^NaQp3|0aYo!*^&h9$M%rU*dJgvpkCo2*WHfC`51IMQ;-Loi z#BBP|)^rtH!erdO#SE1F5n|mQJFGRO2bWE{IBm;0k#!!OGF?oWYQpRidYg}#C&t=a z;59Lg$c~Fdi50P?>CEdHutbdDUicI_EmJcVijP~}P`NXA({?k3wq0M?lCz{W&lMw@ zdtvt&9W#TX#UNW>7_-g~Mw|E7TSi zXr|$AvBNiE-OL^h=8?x+rILF2BERJc^O&N3i{g3oE-~W$(BZxCu>^yuCfr$fK>1H`N-=__bH!dSN96LZxH#KbG1*0q z2zRoP#>L7RH#@W>H)&7EdF9k2_R{1u)@{^M+&gZEYt;4)3=R{wK1kTth5S|L>Eg^W zdN`~lAIxZrxSA&6*azyPuU`-cI@;kU_wQ2E@8ZaN3%C{Lp-ysRb&;zH-rdZ@{d(=x zx?j!F+?k(iM{*Ru*db&wx#%yut2=lhu5BAQ4c@us2 zEA#iV&f(1XXl10-r*24|Lhbx`$MUh~V(^^%qdJdDH5G&DH`qNJ9w(k@!t2pn=5!`Z z>K@jdoRy4Dhcb{|`IqBTO$usnOo#8rW{%J4K{a&7-*w((y|#Rliz8C$|C8FwRk^vy zj$Y&RNWZ#SDQj;BxfMNTQ>%#5G8-&);!d`Wqxdt$4zuUvAYo9Zs6JJ~USoO}6s-}A zF+s*wVu_KbMQ#HLeSVQg>hV=fS#68ZzIkx(*+d<*$^s*15SP2!Q@z{41pDq%4`Lyy z(p7V`cVo}i+fChj%?|UHGlxR?_VK@1^QL=z~_nba=tM zs&#d}kdV#y@p(hlEYTO<+>152cU9ceAB3HW)NTDN7UNnG7kx{fbD^;)UlWW-?u%bI zE>#?Zc;D|KD{!wA0#gvyCGh=+AR%<^Uxs z+YZ|~_qmTcq7;9#g>idoU>`LVb<=D(L(r?RmOnk~?9gE`^@a}9#g}dpaxHTaV7ymM zcqPMa4?RD(KM<+QG+0hPn8Au#>U|?y%=F8{nBuOgK@$s%UYLj2PVVZ^d&W5bC=a=M zgH+2LbKD_DS5zZHjT&QzA?sOZ{do0bcXCsIYB47*UM+v;ib(bk^-99k_9cCo4a%C| zb61xh^2CLy)P1+@q}DL?#bNTttk*vhcPbA;m1KHN_)QaQItC($f3FR<8jA2O!Dwou zMW;3OmDk6^P&+OUrT2SEH-|*xcU~?;@jhwM%^1`j!Ow4tH*1r6kS8!&7t7dNxN1W!{=QPYm zc^7Yo@s-K1JAP3KyU2N@a}J*F>m+W|e|7ueUOv!`kuxLD#-aJ{ zO16(3npUH(ZO2um{zhV?#JacMHxy%<5xe6~s@aUj`Sio~T zZd-`zYV3*hQtC~5^-yh!d=R=shdbBl={l5iH_v&CRvOWH1#!{F)XJ4Ta(LwvjFaU4 zb(`2wo~R4M=E?Ma^h%aPs9{N&pNm`5XUb1D#=wOWGuUtffticNd`8|Nk5#9ar4$zM0ZRD?)=Tm4f|L}8r^{J;M;6ie(R~E z*w|qzd$})_FDN3LyiNA%8`>I*uXk80?rzE|=;`Whi^p4X(6wTTFnZ^RF1^`vjyNeI zM@lHUKrNW%Pmz4W0r!paFltyEHQ>Az9J6?4^q`)q)D!Q|Qok7%t3HeDjwh{&zu8Pw zw_G!YOA5KrYnk1UZ^M3%9!gd^HSHla%dN=KeWO*s-tGlU_QL~DPf=UPd7$rX;-3{k zYC=(e`0XTiw63H2?(+bwC}S_}Unc53@v~UL#WWckawxhvoL{pF4lZ zM1|v2`PNvzgO4&WX~0{ltw{= zxKEzgvfH`5w?B!uZ|&j6-Cy^eE!4cbmeBHdSzzj@rrhIfLXO9)>?qaN&=9xz?$6jZ zR-Lrk1mlay{qB*W9vNnh8jm?67iiVBb2K>5Ir@Hip1MxZ6O#R#>-+Jl#robzTuTjR z0eSv+`(e#-9afL6r(O&gfQyH@pIV$O&JOfLmF@Jno0~4hsPq+d<^Dx)o}4lv2$eIa z*KmF(LxldPCv|S$95u2cu=`Lh20m7@g_xL8`&g%?VHohnwX`4d-)pXci9Hvw=Nk#F}zx^1)XQoS$2OKcsBlB+dl~|-5F@k^JUVfrqo(+Afa&XILnmDX=fK>o{=C`{< z)&@tkeNJ3dJQADfiDb+kqtU|ps{d09Oj${MY^j+#jM!1qC+aCi4pNl|T`>ndSGL2{ zx$(vrMorM>M&s4Q{g!B`NAH)YEcM8J2mJbX9(k9cx^{JD#x*&RA#rLm4|iNT$usO| ztCpRk-{xZ-yz1T&sVlrO>Nm04E@J5zkb06xk*w2sx-=C zj`ct})HoT(zGk2-aJy7dI|Zw*F{i#_mU71;6-V0sUFV0z%cSAlr-X11^(nnp#p%Pg z5X9xOUuIKlX@gQb>e_yORCZP)PauZ=_HlNiu%-{@61tq7k#vD(EoXv5f0WMwwdFsZlBf#SAD6c=-FVv=1W%Qcr@|t2_guLYUFZ?cF8tadfyw3&9@h3D8?RfuBSm=cJ zr$R82SoEDVBS>X~5yzf?^oMFVoj`A&Q^a!?9FyntBL_N<9x^V4@_=3maBZIjpEE{s zQmtfMuAGS(N{Qt4eIl;kPRBBf*@|M9iiTTL{=!8=UmTLU&UZlA*KC+sH`ct{%pRi& zdyI7^N)$7TZ)#gd|kq}A#Mr@_dYT_LiR5!>+m7|A+ z$GqP7=0uNz<}Qk|zCUzU`4|x}TlO;Z!TXlf3Z16j!PgHf4sf?}zzpyEGehdM(U`G-;6hzFGo|$+g(& zttV?9j)7n8Obk5~CB;6Qh_esV@m}9d*(7sL3I4mzb85Yi8ccJ5&v)X?%in2|=i8!D z3u+RLM_07a*`U5NcT#@>6}x#>7)y_!tn5Qd;A1QNyh6XVRgFbw;?>p1GdpH*Z*jdn z>)e2zb>UOQ{n0k`49G*nf~8`To*620?yI3WCK}x^#Bk2n^_G7YUsF0_6Y-*kZEL8( zQ@Y|*CF)alH&nBKn;?pFoITI~8Eb1~^6t&t(O5md*b%*(Q>S_DnAlXy84dmN(YJ9& zG5C=iGDcHBIHXj1-R|#haFY*SY1dn)2%`2fX`{&HT?GNo9|5 zpEIC{ou%0nWrMe_+ylPQtH`vs!o~^A!f4Z4Y3*l)Z+FRW+&W8YpF@$ojmmJgR|2BLNsU|J460LQja zwzj6PX=y&DeA_Oqn9v6;XVbH>B2?bC*bCPZ@=@M@v23UHMRo^jg%0P+y6gT>opspt zCQ`1xJ_tX&=+|UyCmU7|$M^okOEc=r!|8FC*z#YV$rb6AOB|LT&IW4Fl77t`iT}sd zRfa{mc3l+}1G@zkMa4oaFqpX)Vs|&vrJ!^SHAP9;-CZbl0P{S9iQS5Yo!A{H-#Y&K zcz<{uE<7^Kp8MJN-fOSDR?u)g{bB8u+t!7`!9s^}v1=3;E~wD_y@va@?&8|eSXjL+ ztCxFBw?+{c>dksagZ7T)^M;)ChV2dw9C|&=>)1k76eA%zZn~y`KJjn&aKz-@&)1{Da(-8E4cY32>X&}9XR<9a`>O~um&ucQM;Z(QMSQIF)e(zXpVF^kWO#q(#<;e)gA znV-e)ZD%A~*36HHebwogAU(emhz;yD*8DwTaEJ=Q<|#TH_p;4fGdc?Dts2xlH2|5( zYB(6@T_eKqDjxRSjSBQqeLW{y- z_YHqH$74gH7Mnhlm-^R@!>CjA0*I|GJ-M%fx*_vb^`_E-IbqaTpe~czQmV&U&$hQZ ztlVHJUF$IuI%hquwr(zc$?`_cXY|~8(o%XwU7efJVdQ0?C{5srWYHyfcimaOO^D3T!$T875_N z@7SAsuz`0C_ouqy@dwt=6aN|}w)TeKpj7nqTqQM4nSsOr>OD?tESsm#LR;qf5!tTt z*5iQ~&6+STB1Ep#H5j#c=HFEsAa6eqf*b9~Js49WJOm5YJBXzh`P;I>=JW+z^8iJGJOq%UW97Kaw0IEo!LkB)|If zLF0_Lze``~O#5)mrjC%;&cTvNL?}LX*5huQky2)}5QI@PB;fT>>3dobe%OJq;uT?KKbaR^t#d&h}-kdaezn=jw6*+S9 zLc_?tGqJrnb@O7K4DZ_oV0{ifdBYkRa^q)1*b$e0-%Fa78-%2})PZbQL5>?7incrE za8Ex@4*VX9VqznqFL%i672#-{$vWS4i`>8?0%wY;x8|pp57&%>^C9kL)@>y(s1}1W z{po?Vytx?pPR-A%ERHnp#6HE`A|K2*C)N}*C@-avFTBlI2VSdhXmD{Re%8^TVa$0$ zp)M9f!Zf(LznN4*{kYxv8j$`dt)Uwx|B^}F z20aGu(PGEKl~Tog9p?Yl!aZS&w7a*Cyd!#oAKxX_TTdVCBRbqTwnzH1Q-f{f1{e76 zlP+FYqvJ+BKE~~l21muitu6Oxs&10bRE|YnK7B?k7E4uGySi}xUawAqbm3JLeweZT z$(tg1T#m%KoFwGAT1kD&N1{pq{VblnGc0`)foAnnFypDabkr^qQLNho1Io#c?va@J zoqA2R!sNZ`NQ|yZor>TC@}fIY*hD=1V%kl4kOdJ)8vlhExjbNk}ClJ-mzI=<4t>G>vU>$@bJZK=hX zlLw`riAiYe$vB@pDOp@j#GxHp^q6%`YE2Hvxj*#ea=arQo=)#9@~OuCxG!CHpqKRt z9okqtkQVt-gSI!lOHLO`=HyCjl=O(Gb5_dXnX#Kdt@Yvq();=3c=H~Aow!W$_l`mC zKGyb4eWcjIDh%gNrQ`YflKs(0or)Q;e1LbUE*A2M4kqt^Os23#6J$c)1Zo5mh^zN_V9LE z%=wciePMsO(vKeECFdnq_EibHwHUd&P?~dB4~L36Tx)$_y6{woN#qB5I^LIzxmr}Y zq{G6CcO_@mN-qcKQDf+JX=W7-4xOf6qm?8TTgRclX9C_e*d$H57>(zq+{L??Bn3LC zaBP1fYI`_IJ@-YTqBs4Uv`-8RcSq1SIT_w-q79qAMquI&`UN+#k|tJ-f(0>_KR!iL z?bA^l`f_J&o|mlNsY2J;-2K<($=zJ2BRVw&-9MJf9d5>>!3)+-{TmzG(sS_TJ& z^82dJwWJ2Aap>i(!I)BNK~S%>0cSL4J#>;qe?2N+peDlDrBVs?CrbZlFeougnoN%o z&z@Q=4kH}J9PAPPpNBa6L}KJq4r^gw?~ZiWncT!GI(%(kBqd~MvDTZh-F;8G9;rds zE7a;V+>$C$54H9Xa;?oTN|#h|IB`}F|FMUpTI3tgqi*el?klC)N1||zn7M^Vth6nY zd0;K~#eO?TM@~lInUX$+5g!dvlOu4XFbU0;Q?LF;1m6qKcAm2o|0oiJxx-s?mx-)7 z9tF30jO|gieBz@DW>%a9Ou8=HR*ORw?&~d?+QjHupZ68_1e-M(Y#i8Giw+UVi2bH8 z-sX82<(Y`Bzy2z<`_4e@hG{& zm?w3V=YNbv++^ys^z0+gPKiO4hxDpD+Fx$`Hwu^I=w+5aMjlxl0a#IcmRRfAKjHK$ z<@+^_l;?$p;~0CW?JJUG>nr5Yc4BSjyi`_=4adj}+}GA-%fSaDuvJi-@#|GNtYQ@U zP`k-F*~GXvUWIBgriRbOJlwM zj8y^m2r6GO-q{_4_dj*0TTwD@E{wrn;sc7&yN%t#qp6qwUoElDIB~NITJB=B-nGbR z$((80DFNGTQ;nMp5g0I+zT_7*#>w>}pd}9T)F;SzeOwssa^5k#gPYMYDFnt+>MAT6 zZS2%J7#<7AZ=cfF*#Bk_J~m~IVcpGGay1BpmnY+E*Vaax_93wUl8i5j7RJtX!!U(0 zUva|1=vfku9L~XqB(ya~UWkNaNix2_?PJt@j=_pk$r#jiig7E?n-zPOsBUWGK6f3t zC&ZvKf{lAFYM~v)*+(T)oL!+tgZpLYDZ#E4l*Tw8+;=DUV96n4UEU+ZiC4GjJ|{nR zNdSJ_qR!yL;C!cYkyy}AhcoB;<{ReGmzLb8I*zUK&xXe$bgm9vyP4%b=@Wxidvqw6 z{N3mkqr!k&I_y&2GiooX@VdMnO=h1q-an-xA4ZRDI}RCF$I#~`PLBZ#wi$g6MPd)* zyl?+1W0z+1km7uKT)PFvTerh7fqtnq@=}b8+JxaR_jc>rXpG^*Ltr+Wx+}ecjCBHn zsDnta>RWEcs1bqGR3vxn?HJ=Pe%-5t+`m6g#wLM*=+2qW>4!axqmBe&9BFWSy&(-=%pB zIv&tr>C(SOGY=K6-qzv$gQv#AUy;bJM4v>9OU5eYxZ`iHrx%^U2&xv+$X68lw$+$?J{i=`eb}(IqexYJb+r2?@sdZ0aJC2Us&8$e6M`2+n;t(}|p9 ztnqR-{f-mS@Uhb9K|C$foczg=Rz}az*)Sy^BfGMxu^;yxJ`lsd_w<^q;=djKmiXs^ z?ed8mAuxZFgteASWS2JKn17U9;y)|o)_o%pOuTnOOWU(xgsJjr;iI2sD#9&0zb7;QYGVdu-e17mOF=AtOnTEfr5)7*I3 zI||dd^JV;6-gq`A0>QQPP(CY^GiHZl$|UZ~Y(5}|a(;1dub%#Ji{vi|!8t2>6MqSk zSJ7L|d>MU&gZj#Ao(59CBoXqrrgBQ(Aeco`*W%!3Y2KR*HA_YuO+-o4ipIGiywkPB zgdYqvE`G#)sfpA%Ngrvfdsl}?HOa$&R{=JW)bROHHqLdcn+p3Pe>6+xJ-B&_F>62s z9v{=-Ntg1*QDLDNbey^R*DiVFK-RyvG}N+)k*B`a!Ms?5r>>B5nU7EY)*$VvxxA8h zL9d4FwO3Y=6MQuo%6j9l(;w+K@7^Zt%{Q9-kdj>E;KIAo#k!nqY8DH7evV>$71>W_ zZntHf7gIxiPb_6|zYTinrubO>HDM$_qh9=9WE28pt&7z|XtXY?<0v4vPxIdB(Xoyshjo zHv)2her-2EUety6LVNnk?TeP5|50Hj^?8CW?3c@V#iI}V1cOaQqnda7Ogqk!_Bk47 zw@X0Gn*?O`?rRKVOwzbhdB^&T_`~~ajcM6?FyfK7@|H_5uFcgTz@{|sb%h{mw6pKl zoHpz<566#n%-fxuIV;iQ-a!riELS4bFf%z3VGiZWxB;oK2jrJWyURF&ryuQETzSXnK4{ zLNMlLbA03rOQJBJ_v!vBNpkt_)b-xXT;#M*zLyY>a}LyzYxzqqeabU(J^?rLyBZz3 z@pZftuoIK z=8l8cMEUxiP?%ogK4XxJY&|a&w+1Al-y=`CLRKhBw$jVs#tb>6FboRLN?P9tmS63S zK;f4}9N!%;2k_b1b0QJrho;Jl&#ADTbLVb*cFI$`@%JHS8$Il~thk`X%E|PDKGDMX z%{GDiUwRBFY-seorURIx2PNf;IA=8mHYkhN<+fjHcr=EdC5tuKaet5Du}wIX#7K|b z{B7{497EoO27{AENnKbgd6U<)-y%UueVU9>Cp55czCx;*#$NxrhNfZJQotnkxNkH# zFz>XK&l%&XI$Er`RwRXR_wFEj!^d~NNHd%3aL1MX%!JDFJAdNVtF##Zu&(^98gtA& zEu_+BvhR2`CUvD(RB?OR)`}h;8PrEzZ7<*76oc|_ba<}sC)ZM_;O(YI|MR2da8S#g zdz3YQIm`2^(BEWO0`{JsDNnx|j>7%)aIX;|uY5(V4DuyT&d|ugwtNqOb}T%le?DS2KbHY{Kar(7^R9TtwtjC1oJ zuME3t5|7%!9=x@+bUuaqm$C-$-wcx$v6h^5gY`}EOsN6Sb1mMRs!!A%9hd|Q6D+h>pFICJ zOym>C)JPhnL(3DjW!Vr%Er0T0Pd1l>ICtyEooMU9o#o>fRahKCFP>vc`R~n09DAzg zuIvao^KS%BkZVyX%SE2e+WYho&f_pkuEyHN&Wv-ZU^{_Ex$N`{b#E67Z7z zXR}Ug<>X5`D5q&Kq}WCT(Z759sIqbHxJ@Am_60MUpEo%d8?4ra<0tcm&9u7)bB`Eo z&Z5uFgbI>vRuXERWo+H+ON*{1V+(V#V-;)3ggX#Ef0=XJ3F!)J$x-IKFIP^JGDmR6 z_1`_Xnx5}}_2@zzDeu5S$!eeuixv>C3)?D9=YO5AYEk=co;1*bUvt)074#b(5F#jx*}MaI(&IvjgRI!7!&YKmbD6u+nLnZm*a!Z!mbWtY z(Zr3bANN(hpqAaaeP!#7{U+g3=e<$np|ihkQb~HyJOcgJYOwM6MMKGl7`$Pw7-VHM zY$pC$LLB3i!DyKOn_k4MF&37)X!yojeo15Ea!+3x%>B6k+FJ{6+bU914e?+XVj8O~0w>OtGp5Sj7Lq%}nSS|!{pD}e`FhHE zw4aN)tjLMS7F_~@<)>12Vm57ycrTn=F1;zyA;y%L`X&(Eie5QhjDt=A(|$#VnaOk@!qVgm!!T= z)wo8SbNtRH2B&x}oQSbJ-D@odvp31}($f#;fq20=o1S^Zy?e13#Tn7)2O9kS04dOs zwG%yF{y&biQ?*a>U8KSo)^d|g+DMj%BCwh{x$^QHL#tSxnF0-c0q85#E*T!op>y86 z&#Cc?dzQomM|B8N=riaAO{}W4&Q^t%b?8qu^YEJ`icM{Z>oB&JPuEsdWempO)*^NI z<=pJ<-21P}&wkpqyr5VemT{iqUvH41665`3D{G@OdkuG(d#;gNwPk7rDN?V2Icqr^ z(=O7)t{PN2${E1zVCji59<|y~pW*R3sX3?}w~Y1G?F*7qC&s*1BIm<1wXC^nw z#u*DPO1t)}V8z`E?+W&k6XRT)_1mV^2e`9LKeEf5eHWL{OQ`hUUK;PX3eA;S#$-6L zZ?S8atZY6o8688otGIZxa>zTLi*;Ij`?yc}llS~$=HBPnt=zzS(5Vu8km7a93_f2g znI96`FHv^k9$sDw=khOumHo|h@F>#ZL7j(+qUu^)5PB@HP&==yiw0lT>B;kOHtgcP zU$q)B=lHLNH|L2(>k}|zPJd~tCKj8?jdwYlEVXJAi=H#diwnq>`jEG&yv6(O-c6}w zR4mqZ;ZC&MTWR~1IJ|Qs|Mtac$=qIz&76sBs$eTU`=iFr&Pn7$I0`%VZJW*|qN;T( zyeIZhtzRPUJe&tp;$DSw6X?rw5eC-mHx}x#r|SW1naO*HHDAz)_tJv;YP5S^HqJlZ zzLw@~B&N-r*!tTbDK;$vG5d(;TkbQ=p^mhYoUz`8GZfck;xVj;$2VB6Y|9!$%UYoz z`?+#4=LufvS`1!QT~uR_TSR>C>Gvk$ZFTPDeCmv74u`H-itnuJ;)1x} zVQeero#o%ljO~SX;>u;>(&Vl62&*DCrg9Fc(PQzdGs+wN)VTSM@1;wq^06`=2V4>` zIkI<-LLCb|Yud4q&Iy2%4#D#p9&rlvN;+%R{62!J2Vqpqr4diDgvEIM;LW|y) z61kgj0YiNBP`4+iWl~kgvE-h2w&9<`2MBG!+PO3P)@yC#urKsUzf(5Ownt6mlnfP0 zd7k@ko+|lIi@@yz+_MPSX9!__%P8U;d|6fH;Be~1bH+XW`(5SMD#<7eVr-pSh_21}s}yb^2GTA@?0up^ z%x`kzo#KUtudio*P^Smcvq=qa*4(1cM3HwQ4m}-suT#sbIdfiT@`A$emlr9mW6+5> z(sF9)FCwN|Tjo4e+05bk3>EZ(8cn|j83qv(yUMr?RG%{JZ5x9VrqoPMdvB0SV`1Gl z8AWIIi{dcNlBv4PNp-Lp*$lS^xk1>{+F*ydz45^-IZFdNYgO z@ew%3{`y}1gN8d@V=$Vr(0Y$lhIb&=C5T^)H4`oOP={ErrT6e4vG@=9(Ro^oFb@(} z*ppS_T=n{`Byn*z^KM_pGjhJzK3EG&=7%lD)nXp!T_)`B7N>0z2L`C|fcYWYZHHK} zBObjdd>(Uvv&$O?|VTM}R5{-#>9RNk+qPkQIFakg-=ly7^hfJLk^Zfc}HrQt~Ad7gUw zD1C6Exks;rBScj@h zHi$W_(@KbgPuaOgytO6oV6P6PSC5G|L)7r9&Dqn=i^8UN9G1lE(e%h|VPwrP`hy;8 zW)_Ky6=SfQxR6KmeX-w1g?!=_`X+b8`M4;2C4a+Gx-9BOvF|S7UVk&As5&A7KQfqO zt8Nzsi^9>e4fhBZEfu9!5!joRj42yZMLzvFYLLtEAZVT#`&fmkuH5a?zZIoNVo^DS zI@=efp+&EFWQ|CHbSek)cBt{?E4jqmYB)aTJ^!EI$Nqx~#~NFx3Gs?`Rp>~^mU+ba z6B2RcYY7TDKT6D`M`i1avQ4dc`X-g-<*IT!%U8##@PK`a#oJWrFMHMZd#Nkf#b~G! z7>$w7HF)-Ljq>tB&g#cn{EgW=mpFll8;1JX18$M8k}@jNi~2 zD0xi0l=G?cTWTSqh_ zhVSMO_%OCFzEnhwf>0diURC`im9gefIEHSb)}mNqXBhc)L`Q4s}(8NXGq zAP45~fdk45%!Mbtv=;}Jx)EUN^W2b9CXxVJJ1lXtC0KmSC3VfT4A$qBof#coM>o+A*aK! zumO1<+ylry7K&aw$zT0V-AzL*zmOKL~HGQ%`u~XylR$*LNuWCN{a^>+W!9$U!PMb}sgGQlaNo>Vlp>kKGSB z=S`q~Z$>@G7OZDlcAkR_7bnLLt{VJ2%+Jebvg7Ff#CK07qv+}@3I6V1-1==&-Z&6ytp&UC>0qx64at^Z|tA6!ZeghNf@W4=Q$YX2;R{kQ*8 zaS{$(^~V?IBrMa|>s;2eSN6jebNV@& zrJ?Sv8F;^Q4p!V+gy!!8(3pJbdTAT5QXh;jPqrt^@^nwhk>!@IFeaf19l%~tb&87Dw z=dw$e%`gsF9fQKP5oO{$YZWmrrzkACs=?+8yU802!$bBXTc~T7wk#42`1w`Zb4r<> zrN`O-?%m1ZVqpn!A>wIIChZfKi1Ys>o)%Z_f%x!Cjmxaz;_sWF{Vo+f5%_OP8zN?M zC>|8EhQ8VkUo&UnDKXn+xzxy9<%>GM*)R7WhSeHxJX@ZKHm961(A5Klqv^xmClI+O z-H=(C9zDEE7yNL=t=wds+%yN9HoIVUB(=K_FTlu17y3bRm+jOl#6EOI-F#}6I&HdLxc7;6x-ucAXnyG6!a zyJ$GQ2`v-nGuJ%iwi#jQ#ytFS!eMFW_7ME$8D1Z3CT+}%fH~{rZWmpY_ThRof1t&K z0wKEJWz9B%I+=cp#QPW>nleAwTIP#tmFM{wxc+p(ZVlgi;sz)cuINa;uUQlJpv1}@n+(*27$za0)Ds=3DP5)3 zd2F?tfdcZS$6hJKhL3@$voaNH8ehVM2jQs1IN$Da5Qn(as{TbTZuU~Bcf?{(cjlAP zOYzg5_xLn-Qqbt^4lKLvju)of@mZ0Bo*zB`?QA}7d=?Gv`CvBpR*uSrXgneSzg+0= zR__^id+5JL4dh>8_b_=+6yzzX#Eo;&0o-?ZHV013v$GuHQGw6M-&gbp;62y@+@&pY z#2?}WTYn|t^5*)8FR#Tq-YKet`(i%v^DJVK;bNxZzc_C#Ul!-T_Q+Q@n;ixNF`~~- zr=*_2ArO|tu4na@K9ei8#7B!d^9*^mtaBR|6Vn)eP&t$sVb`hjcAnl#Tqb_`B$v4N z@MKYqed|T?Jm*>-5LKs9UxjggZ1YrHG7rN_#`$zpGrUWh&AulALrvRbu9+`pGS0nU zJK<|ZZ`|C={G8^3+}@s8Np5*_Vn5pscp$YReTCkp!|A36HttNu&g512xZ4BU$ET1l zn}sI7J(2dF{>3-)Nb>i=V(Jz2Uwj^oE-*hA&q1|bcahhId;>))S~YzEyW!#3&;0Cl zr3fRpaPB;kOXRK+z4YSXT|`|?>K7P<8sl40-@~IbPB3S+bK-8}5sgkJ0c&jAdvn7+o#Mi7jJLz$} z^K#L50PD0(dfeJ^MobCfoSJ<{^^c`O^IrGeofATNR>6OaHIVU_o?lvh5e;8-=;%ib&U+TdU$8a`vm%dbtKt0Z>S5`f2 zcu`Z2&&*Bp-z|2Sw47SS>_O6ZW+@fJba2bpQLC=4_(raB!!E>xtExp#$7o3O^n6;7 zEiOcaA*4C;^XTUy)hUp?*90_qRu9iE`=SQpoW)((z#HDU#2RD5gP}N(=7lSabJrYS zJh|b88SKRb-{0{m-gvT*_u#OF*wf4#NBG{8-fcu-AT^`zQ)4RV0IFZ{LyrF(L_3{8 z!7qQTc}cC&#aGbQCm2_eioOf)VBnQVIQXT)Bj^fF)F9uCan20ikBjV2$1=`~$7yi` z#EGeiH*R+;j3V~(n&||Z$#d$>Pvwv~U zu3R?GZx+v%PYt8T&3p3RGH**O$%*=ErNu6{5Gm#ky`20xv)li{Fyb3~JJxb5$Clv*dK%(`-3 zEF2byi7OIttfMKWcksim=JX0V*b+aw`(PL2+^VONJD*3FxV! zKY$m!Stl>`OUJ5GFL(~6&h5-q$Vj0E8nsZI`e)%x#Th6G=RH`QgXt*&sK#B1fU~C% z+ckvVcd6L8{~|iEuZ#(y{_vDj*u#DISI()p;IIQ3scIDPb1A7CL5)t{WxQMK`ZdND z;&sl0Q*e3t7Gd{-^%diMsQ(}36wWI~5?kM5X`>ukphZytG3dUh{>6FS|HL_WQII^< zk@dz0`e6Mjl8kjiVB1EE7H>4t(d=*}&C;TtXC0|2`#A%#t0)t-!EFXP$bOuYK78*` zwYm;(&ggLV$2w(AJ-O1{_X&?`C3=5QL2!0yy(?a{>rDLw>jbpkE1=2rA_ileuYtIt3E|9IIJnhPRhgeIPlvKSM~IL7@m#sIRO~)hkI3FIk@T+f;+tLrrGBs zds!4lCUXz&!4Y)X9EX#$xF2+R4eDpBVPIWny~YO`_R)P=Z2)O7(<-1=kX=25yB+lVzQ31yl2ItXDHR=l zZ%4OW&Ky&ipDh=_mU|3!Yoy}apYeDa!262(R@=6ehwdYLz-jauznUPbKjyu}K6L2v zlgi!1fJ0YvKK>^{k@T3H?kMsMFV6ZG=Qrib#<^2os9bwi81}Khez5I@G~6--o!hZ* z|D7(a*c^_x!CGuhwwJsM+4FH0_VHYip~O{>`^1pXKkjF^!(6icI%{axSViIpHHyhQ zkJIi|&O55&ERl1NMIA(VoiLoTBmc8pqS$a|HahO*?*HlI)JgNfFV5)(xA`JgwDH2k zhl$8sT9=yFSUNpz4oR-97R43BR62t;#E&*pi;YUBM_~Io{aS ziT)r}xLeiB58sbb6D({Irq>KWC*}&1cdKy0B!t)p_1=~1QSDq5K3`46&Hc-9tU)~1 z9$@Xk*^FId4JLG>m&e_{xXL-+A(#I&uil8Daysrsv6m+%IhoJ(Zq7VHHXl%CGS1I= zX8av$Dc&)+ypCgT&93<`&USyx*3VbxhRIpfZ@l!0c$4n6G=!eBZXL8}|9zfxzFY*x zg=;bHMqkOg4tJXQdKpl8ioO-+Rb^M7=|1k7CSDe9J=jmc*dkiBlF7+>U#{OQDvH{KFWd4{_XW9`?l0-Q_T z@tN4>>CDDh^THht)02_i(iYi94-Buyy@pEzc{g}s#SwlT!X3ow-e@tMy>=Y^2O9Wc z;+HvaD9`ubKL8C?skmyNhPSgr@P*zS(~>jsF+znXdMk8h4(j_N9wXk+*P!D}#Dr_` z+LyiIN*ks)%N>!*oM4|FK5n~VZEOPR&Iac382pZ0$ojC`(N zBP1wu!Kv>a==UxK>5+Xg_@o!MES-Zse&eAj=ZD?hQ&Fxm zb^ho*y2?Ngg~i;nsTvAj`U>522*){fG>(i-!)473T&zs~W{))J`wzv(idwYFqJLRh zBN(P~p2_FJaW!ROSn9(R7X@=2~1KMqraPBBpNh&k1Q_`}-D zi*x_$Q>y$=oZDoF$uWH*u=y+b`VZeo+U=qEY|H1tc9FElB@(^j*#l+|lJ0VL(5oi7 zE0U=+oM%&;LJU7^i{Zs-9dizO=J6(mb6O4j{PZa2maQ0Go<2mxG_FtCuI%wL6dxja zhPRoExAZWYLacsOxe(F(j2HB)sNrw1LS)YK;F)LMtClPF4{=8Y_O^Ac?+Gus!+T#c zuGB9TsaxGq5=d>d26eF3*8`)h=?U_zC1$vL!RPQxGTet46pfq~u}N!>f3)?z-#U+C?7syr?{BCmvZ zX#e{=#Kt{3oVr7;$iD-{>GwK%9T30zm8%S3oNbTME4Kb&#by)M8sxs3JNC`{FV5Be zC(a%V!sOS+2weF_E^huCDbFGdnpkTOyIr}xwvi0OGrq- z?YTO9j#_PaVxotU*im7tiiYXrAO!N^K~auH`t79-633jtRw7Vj88%-;|#- z0;ng%`Q0X^z)w#&ve)(q4-vQTxWmRH2@l6E6puH$;gLl$is$bZm;SioOHnd3-_D3H zT6$4&*Kf}FXTmGQ9i667%Pyl-%+Pw`Y1LG`tZs(NHomy9D;4L?G{kuadKN3wFfF|~ zW+sK=@zyk0t6O2;su=Rr(&$xY0VC)6=Z>Xe(Tr+%^;L^uozk%3!5!h-lROO@dVl+@ z6uLXS-~LeVuFDWn>kGd>AQ}34HZ&#eJ(-sxmbU#ofs@tTA6&*enVg6Sz}Z)lO>3=Uz0{;roZDhWhKdzqOb> zV35vGpSY19XE{(A^Oo)8d_b+o^x3l%6Iw)LQk?{BYB^E){CEh~Zb-o6c{$3+)&BGV zNyKZjDnj+x0}n1HQj^C<%(>x)Kha6tDHtb&(iKih`a54%iF-4sH%{$wpBnSToC>b! zeTx0H?MCsgl^f=0=OAavLDApQ1BZIh^KrsyvB}m4TW_Z#?%gf%z|SA4^vLUz_)PqG z6N2nQdJI*1FDysLU@*OYx^8(bwsT%2-ln0Y)h%(CcTM{VJlkInh{x=66Gjt9JvCRf z=Nax)hkfG1@uHN^?zj>3#q04`IryL!%PvwkJ5a0KNiNla^*YpadiXES1KyO4b9(h~ z`4soR&hR`J(vSX4>oDdw){E{L($?#d*vUAzIM7OxdXT@sIM)b1Vwg|9&rm)iFGFk$ z{mA<*&ojLy|7Y&IHr&%n=4{ety`n=!6-=8YU`LRx(s5}pwz0;r`Jz^yb)uc2NhZ=J3Iy@;*1*pP34?SuUc&H81W$rQw!{5RPr=FP}}{F}Gx~?0PT; zwx)O0i-p4Jb~KV)(sBLwa&geey)k7vhEH53j+C-a+meRHhcZQ%K{^ax!k$q|61N|+ zM;J*BEAttm`782bcweOCG!gapux9?m+9_RD4sJ@^;~?+I6;1#755`<88|Q#IzH+nj zp|If|>x9|2C7wpk~*p z#Dj`X6I{`iIDDIdClp`%yJPCoR9tlXu2{?3!)oc z{9`C~5PyDRaY{-{4#8zhEt(B?mug;)K#xdrI@_N$j5$Fb5$l`M;0gxU4hcBAONV5O z`ie#C$ekn>+F^Y~r8n!Mxb5UszG|-AsEEd1#{^_`s-m>35Q_eH5|9y=s2K6WA5%i; zY1m;^-iQ&NC|@rLCr4B=BzKiP!p3owbIplJk1kr$X!Hs_02Y=j0+~}vl&R%>TFV_?59-L7>(IIK%uzzu$NKE(t z^9p)QTB@*a5Q+OQG+5_pq5KjPhB3r9UXM>z_8$|4_OV)=i!>1}2a@aCmCwbHmSP~W z?IHO(`j>POL08D@R1kBPyNNfPG1lbg(LJfXuyBk)5@!vgM%NJuHMt}Cfp=$cp|VL8 z&Qnr&o;&naz9Z%~l6wlyjix9*F;+vV7hUISYTl1zH`WLAG(6#GxNPT!ZXqey?z7d9 z;^Br5O3qC>d^Thdi~eMqik2fSq!oNF6z5W@UDZo^H^mzr^l9koJX~tsV+Nkn&#}h& zQIgap5Yx7&!zRK}s#`k(w!hM`)u*cDksAX;r3`!yYhvj0C?3aGrlb0?E6Q4}xxaQI z4U<~yMKQ7Y;mcC7@^hv*Jzj(JoIh6UK177BipMx|%uXkD5eZ<(AE5b zVZcCl3>*BPkDjHJ?(dE(bvffJ878e;=7H-sQ!(*bpj2n5H*|B;xYm&*6>aguXS;L^ z2uzcl|IUKLk#uZ3pCFAL9)`B2893E@fV5|c3Uljcpdu0s<%(mmBR3r;>pv@hDB@A+ zeHwGrGVyRM_a!-h=^3y>%-9%59#}GtxA76%vSTrybzR54&Z43tcR)B-nqOYh^A#0FaL464b-y#6ML+6MyiMmmow~nhNnHI8@qE*%bwzdV zn$0m#>$q>6GONB1KDv@GWHC~4rjjQna_6zepI>=JG49Ykrx)siC5HPi+;Dt<3ZD7D zF_g@5$43=sqc$C-`~&XT>y!#zp{wM)(S!TWX{g#XNorBko1XS*c(8W4G`q4Nl6}&V zn!Zu`d?ElH=>^&C@Onwlo;SC9238D)UaW82~ z<#eyV*YaeK1Yc&yLgMb?CT@OvA>?)Tl}I< z^;q&VmG$zKJ2HIWPQR7Sb8VEJXL_Ov`Bz;WJabPOsi#W5M5OBwgZ*d5`8RigryMg> zVgGWyfH=m^#?p@Y?$l9Eg`3@IsaAjowz|>VRI8I(g?eFq%XGw6UMZa{$9c_#bZRAS zlU#=Q!+%T$vKQ}^;)wZwT9E{hC=3UdX2APnfgyWD6dK!PAou47W!};#j5SNg z@8V?f_fI4~znX)5>v^JREpt2j?%EA?;xF%0yGh)03|=U19gWBR{oG64{_S6!AN~&? zDbYovu&{~5l9!w*nz$>2H*?0+T8k&P*OlY>x<8XSd%ZV8G~%;*)0}B(re**dh&KIUu(dftiI_*oM`0f;jp-G7-o#HMAPneCS zZK&sewU$sk@WCN!dGxGyMEN7f6KZ1kBiq?4dwzCDE;SiqLQHe-6uRNy0P0go;|vck zxS<8{w^hR)8@``$gEf1%Z`K{8-8y$PIGG01`_rWp8J?Ihhn}0)QYEvC-q`Mt!Th;O zN?SPtR>v~Xz z!^8{DLE?$E-kmyEO#K^%EZ)~&(wB&cH<4KDLwuw8Vd3&F4zpNyi9Ub-#o2Ur+4Fop zBv{e0TO`6>YtV@NSkvq$kk!BJ{o%=}&pKPahH6cwgsnju<{|pmO@vwXq7>2P%EjE%AMSy4A@!) zNE1JM!l_{<&g|SMjcdr>oM(7WK$g^HGv z##{AQtQOo=nVhAL8sqy(6zS^*3`s4 ze>oM)Ta^=&uRFtjFENTm!O9bH&Ipf7N3-S$d5U|^xY0TThF|v#+4rYI-jab1!(F7x zQLf~#WxzUYzqG@|0~MK1+7ujud{4jFoUgzROrN-dw(@CVn7s1R!}SKSE7(P<35o^KFp(CB5#`>l8Tt; ztO7BgyaV$V#CmrWib72su3V?LX81! zj$E%?VRg+NO*SOsLhL?qlRe0QuoQTX*)H-!r(@daIXIoYQY@qX=T-8x-d9Nxqn1p? zl@F=dQE{3OucyG{Xc~P48i`}-DQL$2qVV(#<=)0q(2_Mn?p1$7odr{HxqSvyM@CCG z)=|U!MLKHTI4lh|nU0^M(@|`CR+5;1>IJ5u--t}fgxG9jYt9Y7`Y5(0lUrh7oxE(f zn09#vK6XmRf!D23Tr?a1alZFjjYs2kVVF~th;V!IO`g-gn|DwrpIk%B_!vA+EF0%m zi60&IjiAmI<6PS>Q`zKU7_^MD99K&;85V`$djdvxB)?;IHE}L!JZ7`M?!EazAF*aUjyR{|+mB{a z=d%;w^EnMuudbJ#O_+@L!_!cdvs=1-Vj2#TU$@%#1GfP^KK|YsYSWCMJNW6^ZA(f&fATNhT+tx*}bQ1 zoU{B=9NJEaL?H9?+qId>eIKdK!u*`rzOJx#i9$EVxi~pptXV+)24c-me;g6*-HC;6 z(4*0hLSe_bLzgl1vaj_~Sd$B}qz3innv}p> zrtX$9)&%F2)S0}^UBrVGajDNVJmsu!zl#a3x0#G`rm%snV)mO$#*a~*%5f%0tD7K;)7>FR|SYT z)ToPNsbZUs8Fn&>(6_Ty`0$^dVQ}X_l!McM9DYBpIqX$^xD0DzyNKG zIqy&>GI_5tM(**)wxm>4Dr|_a#CdwPPs4{rjnKZ(5pC&h?(W5rU z)_HT9@|e7>RvXE=&EKQ++D5O+)Ff02ysp?2v#Lui%tha?iUo5+x;#uq-7_^X@d`8J za(P}QHN>A_8^VC!v zrFUXVXKPeAWDoOp8SvT<82uWDGhXy4US^3%=69c5#dmyfZ+KlAg`y3_@rHMRN!5`U z%KNM9!N!=GHv-m52E6xFqrcB6{5YPD;4cr9m+Ba5cG9tMnO=E3U?NPp+wGsJDm$&F z!GzE7viWzFu=TE(#`mk|qRM!e?~T5kN&9JAVQh3DYVIKCzkCdH!MPJ@!d>K~76-p? z2}S{RcSnxcDkm!Wpwa)yn`rnms>F5?_fr|fMT;ynHVeaXexD94mtWD;agRm>d+96F z#wvlgsNtHxx%+dL(pQ^|%;xmi@!q8DuSqY5q9nX@JFa+^Q7^z}+b!=A^*)hU_$3+h zN-H4#M>t;QkpuI&76!S8;ZpZh9Io61%{B(1`4Q?q3fdq`=ZEtC41Y3w{`!H#O@Ch@P?mr_`xuo@}7iX?!t~WZOYt92h8An)T`%qW#A(xOy9{J zS-^YEi9&bmA3^V_4i_{{OMFmoXgZ2JYL%y*$fxR(jz7b0D~YYbQ8GFmQ)~5vrHDZu zF@cCyQC9Aq=uOe$Z@kX=+NBb8bOh!Or{1aiIjj6c?kRofX|;c@reZ0*{m=0^zhkVp zxTRp&n*_vq4^_HS&orIScFxOCrEcw1tQkb^Vo;8vp{{NIJ$jE+EKr7YqsE-L-slb` ziVgde8o$Za|M!Bjx@rRQbSb!&|5&-VJPr|0>2Y-No07IC5?44UwqH~g7wXK!M|Wn0 z)U1sP0M=`~eRPpGz*y$L{3iyP|k6IZMeJbY1O?uIKnO zof?HT%s}mboxY<}r;#%_9kr@a_juR~r<*xpAi2J_yKFJ)hckZmB-Wi`fF+IGn5jkH zLdaXq{wOcBznlh(>V{(bXg}O1Z$$rNhkDN-m^**|_do7x?DE60Fh31N#hVnvTCtea zGab`x3^b9AwfNEZ?>bkkZLXGbUYkoCaQ=6lWz;Kb6Z-N_{Ai-teuADwDXjnYWt#Z! zDVV`KvB~Lcn!HtM$QePNSw{n<+#(Hjml9FsS!-o1F`@5HoQY-*Qbv+D_lh--nCz}R zT)^A_Y8o$AO;!TVkPmW$yUT#ZN-gr_#}1(1OQmg!KY5R(tp9;}$CM2`>oSg}U~tp> ziUmDgSC*&XlKH>NuEpFDaR1WQr!E$J@`N#cM8`L5$8(FbByqnsR#yMbuGIZg4>fB7 zy%naTm|B2m5B)HXcU*m4D*Q_LyDgaxO=>DmtO~}-G0uqR_qb(sFKn=P#aVB9Sd}bQ z)I*+lDwtVg-&lQT?8ljr{gQ96INTx_t1mH=Vv>cZb)KF!N4b~3Xsag+<2E&=pc2A#wt$ZzY z&`+l4b6-czBkr}5ekTxrnXj45eODs+PCcF<)R+a+x8oi897|tnW;f76PaMzebzLRl zYb=UyBynH!kJ7zcgRw%cMnBF(-gRUEL7H~2g1~!HP1e! zd|K~|@iW(>RUHs{QuFagWgzv?vsG)e;+7bB`=@s+H z9Wiwr(1FiKX&&{ZQ>UT{XHw&rvoUn01HSSz*Ca4MV74Px^+`d?5BAtKhx^Bs$!Kr> zOli7{d^6%@fiG`q?*HqBe$+E8uJldyH4ngRVmsHm+KX*JLh*hKy(yziMY~k`q;bdh z&(Z{qO-?-XnEy|m#|Npy8u&5uh}!io=SnIU`5WG7~G`~j1!?*R{b>8z(s}6taiwk}_tT|9e?X$!OGefA;JoljFMb!XY$=6}8c_(#} zXB;k(Gc)q4m0Gv8j+}pLULH48quk?gD2*JBy?G_qOz36tgISXSt*j1In}zfK+|Pcs z(KOi+!VKvooHWhWv~>x=fC=Vj)>}zhRf8(WyL$f{0p;+#xgJA&~(JF$ zS4T~06@~}InpXX3ZP}+{Fov)vIhgv|YQVujthr5oW8*}PS7Y{^Q|Vpi`AcIk%@+P0G2nv^KZo4Ns0hy(BVpllxLf-@Vbr!X^x$z^Bk zElb1Dnij-joba5wA5BJi zA#=^@mQ$mpZdC`>4nZ-`XZsDdYF^hs9N>P|Yr1F2uP1)!=SQ!F#4lF0s9)>#i5|z~ zuubyz#x7>4-9OMonK<7QBkK}pXhB}hB=Vx?GjsMvq0+ai8>;+F!{hpQmGI9laOD2Z zqGKJnmdt?X3}&Ia_F!HGxi{RKcdIZKw$EIc5t@!VeiNd9Wu2g+tYZ-i-+u;}hQrS=qm>O$$Cl~-Hw=n{%9#O=RKOVE5g9EoS; z^rRjhpc$A*{YAsS>s;WKs~WEK<=snfy7MvW`q@56Eg%;veu=u+ECBn@>(JP~hFJ1G z4!d#_aLBqhbHsGG%jfw{$D!gmc{fhn*F5PkR-Cn=2lekn?7n6v);Ek|t{gLhZAOY- z7s6q3B?*bI5Zr@$4F({72 z;;Yn+tevFUM?Vmy&fj$&ma{~aec6{5(!=>jwz^>ixqVycd;4yW>hj7T`!BK&32H5N z)0eb)4*i@hrigc&beP?WeO>>VLN`{6G#&2+`y_Gw2)#sJ5~B{y5arZ7HkzCSgL_$G z?|*(!f_&3EI&q6U_MTSB==6QOX!Ft!ktdU3etNJN3}!vJP*Z%fhe-SAjW%CXsAp^_ zYIX3&Gvd{;t)Ht_ZeHlvk=d6!b*lGM4}3q)EY!qh18ncR^1fL=AJt_E+gB z?9y0?>f??<|LtNDBFPhQ#|F0y@^f}7HLZxn4W{@0ytB%oU@zRik&dG4$Cds^yfK$^ z(3pp7l=^FY5W=2q;IKK0hvJJLxqLP>(aO`O{2Yj%R&`4Ahgli@kt_y? z{`2F|jeX0ds!_sn4bSpAi8yq5j<`EZi;;ebFfUjxPS=ma^oxn`sb45I4`c4(fFxw( zZV?Mdk-xW@y5r&vB71)b%sSB5zBL^c1H@mnva=O6gRWn5!HaW z(Dx;3uix$%oIxDp!nl&op`N&ZG6QFiXKGaH2!>q9z=?NXHPLZCsLxy{AGfMXrTe}( zzLUBt=c^h=7e7ih(%_q0L3xwxhr>Nm@ODgFWl>@Pop(;I$|5y1#77b(0=CQX= ziypheVZm7?^VV76)HehtY9*ujpTk1G$rtI=UhPL}540n{G47resiE%3XPvvh+$WZDKQ)QmgNA0CMSXvFKKmIs z)N`dc$NpsL<_x@lIa?eV>V+&r;!asU;u3qR)s~q!(^wG}Q~k&{CckSzTe0-DKj#nb z0eRO{>>U7io+r}=rK$_w`{Tn6axb;LHH`-aB6SKqlJ;HI3~w8XNRF^Q5)-BTh6NL4(E;; zuyLs+fAc&Mhci$XY$RR0y|C*aVs{-4WF<#mtV<*=YFJ6Wf8dX&G0bUt_)&yD2}IDd z3>f~rD)iNYU|L38u3N4!)dgZ>b}BufqSgJ8fNo_FWg8fSWvZwjC%&hFuwd)i2} ztVI7c(|J~P`jQ92jD-I^H{!>yQ{OiCMj7kedecGm!)Y)0@OlVexujz~y~!yca1F1tR7NW&;x`bchH zT2;B4yW`!S^aRl|A8=|g&fZDF@8c%dj4R3zi*q~_96^}^U6$r#qQy&N^b6K1Q} zKkx1?EpJgvI6f5(-u0C^+uiW7W*WW=jqIQ83XfB1FdQ&M#_xBKC|YezK;>Rrtc;?V z{n4D>JD0y&j`_fR3fI5ud@Z3s?On?o_B)9`uRo^RocDtFW*z!Gt|M9=^utG~!{=@Z zqDHScoU|hb6tqKZIzb-P;RL+-R>uB;J}BIISM2&u6!(l{rYm(UrUufF*#uq4rOB<` zP=5BDi3t-Qe}&Au9)x- zv)*j8M_ z?n>5qR)X{m2u0;{8K`VMLgqXSL2MB*^X+#<|Mnp`y+4^6z(1<>y-?-|bFa5&P>F9W zy=yG^{1sUhPu{_7k@UaoTvU6Jx~P*ka(6K=;n8lj=`Sw`KF>)-mBbk0FX_ak>rC|$ zR}AA2&RtE+qLt$0I(oR0V_kcz5MAn!k3c@_)%-hR$BS4rbfku*=Wmhj#=Ix)1wI%W z%M;|+)g%w0D6f^AwkrthS5WhLv4?c*NS-0}oBi4kl9gY0qUxq(G?+Y5X0Bw$;@A}2 z`{F6Tkw26Eg}J~HkuucT6&2PoTX|xNG;(r*Dd&{Bo94*A;pBrEaObrqPmbu|imANI z{#}tT9dq4Kb65uEZ7-0m%RHe!kO55HBt0(pqEB^dE8Z5$ZM_M-X~F+{r`V{3+;+KiI3%>D7e8LpGy;U2hWWM zLv+|bGV0*GeKGj8>hC&xXp+_HoxRDe;QTmmrD{#gWIxa6&el&<-1kFPsSeA>4i_!H zvp2S-U+9DkF>x{bkz#r(`W6V~4>N{X=U#1(h%47)F?JgLri~wqyR38U5zgj=tH@j2 ztt{x8#7wM)^7ZZ@Tv(cfIm0{2(5{?4sYgB?u92p1Ju#;snH-?;a_>oZd>xU33jcV? z*LiL@{Wb-^cgIM>RLB+DoU1rC-AdeVkS?L0Kbgm0#vmaaNzf!Il;fke&>1b86 zP}bV&hAG7PEk^B-*BtHrg11E!Q%T zzdA>DW}S0c=gZBe$P+6=kkB*@8GZkVPwhhRPdGC~3WkfCk^ z->mbMcRu1{Ha!wq=OI;c#9Yom-B@RL>&>FDC>9?b=ofMEwCLl-T{$_Wd2Qc`dGub+ z?vzB$uc54XAP7_Qn0L_AT=u3{gN|l^b|zMMY?kAfguv>22CAOU zk+BV##a5kl?qe@EYzjd@b9z#BsUXj4LePhMj#gn)#gz(S=ud5-+%a1)#`k;%oMIN8kQr3C( zQXAovNIp61ynjuI5XZIn#yNE2BJ@+qF zD#)s(LDB%79Tum2(q(e2mCL9<*jcR@Nj+wPD}Z@Xb! zduG$e7R%7;Uf8&p+J_*$+)(a|W$Y`Cg_X#*&VdN2#2tFyEwXQV2)eO939y+h?@-ri zP>K0&qitm=XefPEh>4#pS|?9MswA3H~lb{{YJO(FVyy@V)2J{F0^PR zBFVqq#5&)aG+bnDqb8bl-n}$Rbd8Bceb#wdz%pTM5s6ijJC`>?_;HWZsZA0R20asd zPY0nEISDa7wdE>XA2hF%jOqbxWF$Qz?y#4BM<%t&P1c$CfA0;Gr0Fp?B;QUU1`;d- z@4BL4GC4NZsq){CF39Y~oyg-{Y4n|Z{(EUK8nRZlna|!Mjrp@~JLH+SZt!iIfsm+! z(#pUKiL>cp()y5W%X6dV-3%-VRpsb`fjIh&yt4h9PuHvvYJ^IgIbUO z-gmeDQ&}zQ<_*nWYO$hPs|HoP@ql%19~P)?zrj5M>s-B8iF&mp7M5d}sW!cWP=bhm zu+FD%nTwZ;v{=JB?`mczmOIDdz*P3q{Zqs@(@0cdoj(wUo$|tD{8D?#(#!5x+LwN|Ye&nz2ib32W9Flomo&TJ ziYxKtwpCA*gTK0?7kh7PJ$~7#+1@bof7!YT88L37tq{mdC4yo0w2k5THU{2)Ub)NX; zOo_fb`wiB)&DP55!>ZmG!(RH?r-ACt>wd64LXVh+x$5#Av4~=wBSxQ8H+r&{W1YiZ zRTNisTBNhi4QqB5$A-irn00>kz(wq5mWNKzXRP^rap!s%UYk?DIk{N0oF9Z|tn;oX zZ^ezt%nGbdE#k3S@-gciGLJmeC++0VGS1GunC)mZP*z^6ar zJzCmMcfq^vX&CoBTjqwjpv_HYqgXAMyV~*|)G|lu{w8_H+YJ*qgD+}UB%93g#M@NX zxmd{XNxTQIWZ+(d{W7#H0N-BH3uWjkS@T^mZg6itc1VzHx;2DZHq1nJX)M>W-?-n3 zz54kL;w$|nmeX(HR4qec);0{IYts)(W3D#Ki$vl~<{s4wD%o@|hMcCqd5mA8b4zM9 z_Wu9*q#4?CB{?6NZ}nfDy_%{u4iT$loeOe2RHLj|eBrqugG#O-$vS zLfre1VkpKm<1UgM=|!oE_^d{t2J39`PrNwoABOfkH(pjM5M|~;Fq)Hu?n7>hHC23I z#yUr2SCnt7dU1!843joZ<=GkT&{F$0EcYKd@RKWUUFTk@_Bi>AXR;;F4Zm?g@{T%# zcT^g#HcyjXF3!LJo*Sp)7fHK37bJ5w6t~yO=e6CisXjRglXuE~O_{}$LLFTA0qOJA z2f3Fs;P7RqG@M0@{ROocPx7Q=UNBzJ}vaB5)f`8x9bEEK=u!x{Pm^t<~+!Iu*=KOCF`pDp@jW&r|!Mf;4`)GN#B3nlbkSliJsFxaYb1YxI5nEHZ5sX74j&T{KfQ3W zaxz+%zZG2;dZ1(ux$!IO$U~#uP)OY7;P(#Fv7#%6T_NtV*+w>{CS?aPrK5dZ z$l#3Tc}pvCn;g-*Ja{r8k`Oa|kAfMoM9~*ITMhJ}RF<+@9S^OcM@J~FwaP#&FUp`|l z#C2Uq-w~mQ+#oXP(ebs4TomkrMO{H6VC#$*$|LzRFuWoA=MSso@TYF@VV%3JER>`A zc;g_kyPGpt%6dlraJkM*@ReG*%q<9c^T;=Q+C)Zf2*!XX%(}YaCWae?U>><@Q|~Ue zYSJf!UcBUZdwkYRG!4V_4*VUnE^1oOX3kM6y;B{wsC7Tbpv?F0Iv>nPx2*2yfg;Y` z;Y}NsSgRfg-bg&8$=Z?`yr*3E^9<=$K@B7>G^jswfTng+UvbYkw19fIkAbS$n^^jS zb6-|>n>sZ#3bBLu4EO$})+X=WuaJ3WmOVr+^QTT5Q@1iZR6K|x-k6w#bvp{g`SY9;Y7#4(*Py)|yJk90ao^E>iM6zO z;)vLPxCfazO&4mdU)BQnV&ip!AwMmm!##<`-tta-$T@x83>lmqh_6dBFn`iB@u5pFEL8_;)>j zJ4nek4xt|u`#No^VpKH@GkWv6sykRYlE93cIrM0Kuuc8_lNu;yNc=C3WJ?X8=_C)l zVVxJwxOH&ILHdob&cUt=Oa7V2Txr(%$;is8eOwedLEKw??4$NVJTh443dcj$?0vE5 z`hq>=n~m!GUQzfxm_E;TZ`AsGW@6B0);X@N`0X8p?56Z$8{{lT_;5!yI|=s>FA}Ey zZg4QBW_HtFQC`;t=h#1QIdfBd9pi-S!`WllSCs3{JK_U(SX$49(ye3~rgQE#zSULc zNe38B<30Fuh*XOmP^o4*$l8|W#*T>LJ|(cuEZO@8`L|X)ZwIExq1=yO;~lqeLAEq~ z;DOG(`|ADD%I?*DVf{S=-{1F>w@(BhW@`qL>&_MfR|diQM>3~A1VcN99GffW zmBVL(5md&Ev!92Qh$o@2wx)0D`_9V4ut;Ptq;LF)@#_6bu^4#lZ+}q}hbdNXCVQX< z&kd*1MF+1457g(m@%Y%%l56Y-deLiCFdO|$OcbgPV7^av2enyC`eGH*x4dh%x*|Ci zIj`s=5mBVh{}ze+!#EF$PijGV7+k5t{rRJnxa&nPwRTA;t7In@I{2Uk=kD)UQ-ubu z_|cr$QJ>Y~SAa7v?jkV*#_T z(@7YyGmZ0Y6}e@VJ#NwO<;?*Td4BOEtZ0@2`%=#Jm#3f!F^$s`ddNu&9pTzE6aI|` z$f(Y)FsHsXZiuN&Y32pHiPT{B-6W2$_QM7GBULVSP$O&t@xFToa(?gAjN<#)Cq4}& zRaR;4^a_UcYx;*w+o-9&oZdT=IR7S2(LA3Vi8*WOIUMP%tT&EDS>WGwZoFb~$&j~B z!0#IBIHg4OgC%Mf32O!q{m>BJIGt`&pd`on_U;E`gtC|&A{=Oc*$dK?x>_FfownmG$q%fxcddYMu50GZFs zTxuvr3?|>{_8al)i374LkTdD@TSP=n#&~ir7rr)-=xLAB)GE3RsVDvVO~m)r^quR_ zN*a^*o8g?syP=o-UE+WYo;hW=hsz#gTv3&?n1d~-%Ye=P#cHmld?cw?CDQTZ{W^W5s0y z;{PdHd|#g{hP{r(Schiq=nJ4BVv?m9MT{1b8_y8=$tsLt;bxUTc5?2 zs&QyEfPB=B)nw_^SZt3af4Ib0mQIhs*kd{z9N$E4b&f`PC*HH8%w_sddMYoYPUBk# z*{mP}P0W}{{i2J!{2&~`2k7tpu#5EI`*PMh2`+Ox%VU*7(V{~#+>dsYA3KH6JC1wF zF70LYZPaOU|L8KMoeT&Ffd#oqMIjyJ@HS!m8ORCwZ6#A3BVf{j{&*J>Odg$`DI7~l4OV<3Sx=g%fokF>b zJ=XSs*h(C4EIsV1|GFlI)utw3xfZ&>Z^F@w*$4-;Xw{&WOfR9={c9~M$Fz{$$y2*o zUxymwd&pC~x5p1;24CGl^2Pi_?2V?b-)Mqtw1D#^F++>Jt}-Mc5t3Si`U^tjs`1Q8 zrdHQ$U%d1)N~FhV0zOYnl99p00A|zYGcZ}^@=O{@?Lo@$B)Q*Gi+kTWE2YQF4ddg` z^b+|wmBOSgGi{e1N*mXS7s*|rR;8BRUAg{d zJTVn=Y(g68(^~0ZmPYTdj?ML^iDp?6uUWX0|Vb1TOFUFRqBj+OL%?}GSzEvAS_ zb!kI4^s>=ni2j>;kzA~jZp?nL^Ayd8#A9O)F{9fHggN&Hp8Q@0#_kdO_mP)JZSw=; zYocS*1gOiHRTl75>^qf!@V)%LP8rL(1G(3tC+38LHgf6KM69kvj#JzIvK6^hbNRC# zZ#+hZx+fueBxj{AZu0eAVosc`=K4g)=?26SSm)ZaljX$cJR2Gl8yu4@^VcV#b3FYT zoaal2R@5XBpY(NJC<|v$8=cLZg}b@(Pas zOg`)5Mi|MFpAx87*3t*qOrGQKu2iI_k8fXT!5(B4_m#%AN6RJkso{bS&u_TMsl%v8 z45WwhQqCIWdYmm_ZGWZ6RtJ(0@QPk?{&Qq-0&|vzGTWldLiyDw2^Kr(Mb=}fObzGk z+l9|`*fRNbHgn$&Gn;4M5^0jiewLi5Q%MWuoH|zi z-hSn|oRzvy(N~+pnV7i+g(LHo7yGp6)aUQ#`EkF?B~fi$(PAg-xn_}CiFKaf&G-75 zsrWEF0EW}~-IQgE8|&CJ?_myE#l2z+&r!caTKKNMEtazeHP2|Vuxe%5&yIM~JuSA+ zYb3+?d>vwKFTG=iogeu-4f%Y!4Uw~1=T3b&H(j14*ZiRtpF4+Pt(L8 zS^i{gT*+r}Xgo*SyOPILhrGezi)1{X+k-yjU0bb?x%=tCbs+&q{np4_`c>Rv-+u1K z8tJ0&dA~#c>ZyEL+Jc#K#8S%oFO>&=#o;Wq=iP?q$_31cHfol_ee+ytzBn3}f2ZK{ z^#!tMdo&K*W^Sz6I=Q4@EC#WL{)?XxC0clGU#Wh`cSSp%xAVrEiTES_ zm@$jq=mCqwIj49WO=iQP}Qdwjy3N_8V?F+Kr@e`^ulsEsVH zNS+<B|&-6EK8STxhB>ye5l@zxE_n7S#HMocJUGKNr#)d&f6v z%>BHRC3`LZ%K8dzv@rWdEM;j;z30wYG@wS<{cT;n$C_wd+s~TxG}V`xM4|pxdOv<` zqW7#Ch4yo~FWA{o|FB04ZZ}A$uS8?L*^4;T>Ya{ZFMH}c*5&<73^wS1qrNixAgh7Y zSsd}z&p1S#LNa&9PWDQhHRL6E|6S*UYt@o1bDi<}B%i};PWr?K0rXcPPv)wv{`&VY z9Opgt>Hbjt6ZTo(hVk#{I7pweoOv~l#QG-=)Sux$2ZazD3AfQ(vCmz}XEN#PFnt)g ze%9M{2&_6rKOvGm?^PWt7TW87@8*uBI{V?t)Ag-3&|`2A-~AhI`o8O#-Ihv!!*M?P zid*R4Rz^H22>*i_w_7u&-YF#Sdd)C6f_1XPUn0k7!5_X0LQ-26W#jRPV$bqwd!Fw=W`a?>&9< zj`h-8O^n3)mE1Fq?x5cXT-ZXIqyX)J#P`;yp76)})a`>7nmO{_MZx zR5zRLuU~bLcQUarv&ub{=InV7g#TUV=e72h*u**G=~eb@uZ&BZ8AhOs7qbPQrj%ak z8iZ!e=_%T0eCevX@i;h{`_`>pOAXBVjC<1G^eMB$vm^SlY6_4t#%uRp|@5tK|i}W=X^RwUZJbkrUU-KUOwWjp$ z%wMCgPM^HyqlrgdTB=X{#b=rKT7}BF`rG84tt}@H=fZ6LlwxMp+K`W0Ctcsrf@ji} zB<80l>h%@k(V`#sU#XG$xazUk#lE8BD?hz@ItnpbX2LStdd=GibQ+Y3x%J2C=e(GO zp}$ix`SgLtH2(i1;@ zF3*kW8&dJd-cSEz2cNeq$*@+dQX|LQ1oCVD7e_KK+fWk1IzM86o31t}owAmBlwmr& zi(XNBZn-!5le5v?KD6|7W;EueB_Q$2z|v76%yY>}!1FfdrAw0I5yEofbi zd}heq{;Hps#NF3+_8hD4>Ak6Esm%APN9VKpOZ>C?JDl0ilUl|1u1Y1ItJ8PuS6ySC zL|6Jtnr_n9<}PU7bY_B2UZX#ClY8}*iC8&*nSO77p3U^>JMXhlZ^V8?j3=*bM~=SR z1NNA_FCX8_&}UAGgEPTj-mq%q&|=FZqvF`dpp~`{^6s zp}oC+_&)wTCaG8)VXGhaC;?^U!Im#Hz=s&lXP^JBvu<;4$ho`K4EdH&!_$pmmK|rNJ)I2$@fRDz71><*c(c=Y_YM+Lpdu5s%Jm$Op@+Q`)MQ z4pX=CoO<+IKWi>`wJNj5GM?x+4CXtU`YMNg#M=$uW{`C3;95bYU$IHF? z2x6;KdNMz{&L(|V?t&b-&&~DE*PlJk-6MNw)2M}dU;5nqxyRgv-C259Hy!MFc1ONR z&|kl=#n~i!o>~Oyn>6JdME``&{!{htSEA8_y91wV1NDVJA~BVBpPbr3|JXl*IXfx% z>T0alZ<&P;6POXU=8HVLCjy@IU9qWnLq2&KjkP>aT4Z07D?7#Gmp&CWqAThDjbV;! zXP!B4E%dXAZ5&BqcBJ8GeKC92X;taD^Pwt+1oCY8_wPE}p9?Rkn&gagzsN^SY*X5H zGJ8m#vGoHIOXEI;V&6Xr)I=$z4<2!D7)77PjwYo$cxDV8$amiRrCzr*0WB^5%Qn&L z@3f)rsz(9>#43H`eTmrKnOa&UO@Cq}-*2ApRpUJM9@NsBbfK?(m*M(j#YwnGY$|PL z5Bdk81h}IXPm!Z4%t9%HZzXX zU+t5(YeZo>`?{lDisk0c(b$@hicOb}%DvR%I3FT@m3U8vG}1x0hWWT2M*0N)?!9WI za&I(HUv5a>z8UP9FO1Olj^Q10oLo(9MVz0Z#p>#RpU)%Sv{f?fyfKh>UxW2y_2amI z4DPDKfM0*)%d%Pc$TPQY{vLUWGg{9+I(h@A%eP(VYr=mn@O78NHn48}`5otslcO6j z^VWv<-IK9WykvgMc=py>2kF0rx-<{=8$AQ$tT!oG$i7xBPn7y@so1fJ*|j5bqzAE2 zhuidnJF-m14@rfc3E!8a1#&)X@MbE%i%C1=sP@!S6fq+pY`^TIkW*vMer~c}?srVW z)+O{%4LBm_UQ9r8Z)QL@J0U*=FyHT15}rkzmPg228OS|#P{>)i-YpioiS*udDwDn& zm~Tbx)qCAl*)}#7`{$+No$CX+U=*Lb(p2j7K1-jY{9UMH-UdF%Iz=_Dzk6lm{2adHco|E8~PY8t0|9hzEA9-!=K1Da$7(4mDb$( zUQ^`grs?=TL5G|ZQ)SWNbeQ?*Fs9#38Ol)c4`_T8Zvu&=_dJ4XL2Zbb`?4EyRMOj3hYw{=9b7xM^jMNp5A#4j>@0pG1Xi_ zukRP9q@B1X-OuGy69N)8-56CzBd_`uJY4IkHo@G;R%G-f)kQ10oWpiJiBIm@m zLMlG&dm=-4->oBWVNu9Cx$y#fhUL`3RsJK}azjzNvWfJNnY}?>YxYZc}ZBhGGQk8Q@(-D4xN@*EvTu_YoaS z;_--mU0Kcn@idHi=&W<$lDfA^)FV-F3gDf?{Yu9DBc_OqGnX_|ppEB^QG2FRmj z8F)Ebhn*M4%T=!QnRDiR*WOPK^C1QtrGs;Hf-LQoiEC?l7knl+fIGThW%OE^vsnIG zo`KiY<>l8{D{qlQah2!0_r)!;9)E@$?iYME?3FIHQ<+Vchz<9IG-F@fFO6sTfn)L_ z>wJ^*j1qEAh8rfJ(}g4qFuf*)n--pl)CLyZm0v!@!oGhB-gkH^FTIYz)4TL>3V$mr zt!C!w#8fo*`X;T?wfO49+@Dhw^wrMj@S{>HHgq%6pQucaRqlv~RP3O?ot(tY5_c1o z>*$Yk<~fM*oVE!pWDwdQ>0 zzh&Isxf#=VDyIykaIWx;gU) zzb2!W<9qppy}+Os%tl%HRpz)PU_nSS91s1Gzt{)OoSB3hJ8J2la{uPUUUakPLpg>2 zK5Uf^XPI?)8SLE-{QW#nHlHVqAB3U~>%6G5r3jA?=A293SJptWf<0hi1I}w-1H{RL zshGnW-pfuA6_AE0tYP;7c_Mcoc|iOf;(BiuE8eEzW=~>ds$TqDoQ^#M_?c_2iDr#6 zu$kw!eV=z?1E2X{Jhw;1R+VSy_wd12hrZz^vgZqW)Maqb-pyPdIG&EloB5e#J>|Di zoE2^{`{9s{>`2aLv$o9fN}ME*SLGQV#eU_fugrT+UC~wM)%Hw~R>c0B@*Qr{XpS_> zV}J6JSw#lRWs(EEF4&XAM{bhlF7c?+iaqwo12SNB9IBHiuqW-9wDOF{l#2ARG`S$f zBIZBSZ$Zb#*WpIYm@(3`S$tdF}jOqSKl<+~!@oXK`;)Co>iMJCF~V z-$y($ARm@za(I$PybI>s&wH>{_ff)7O+zN@8L`k&6ndrO=ve0Vtqm3p9;TxM=SRPy zWHF^Y9Y;8~C$-5HtKX!nKuo-=)B66U=~mG9oiqd{x#C7tr*`yTPID5O_*{(3p)UOevoOC3ksZSuk?-r*m3 zuW#KXz2_z%B#D_Xu6gom9646pDIEQlBHw2)A9y0Oy^Q+GuzwSLhr~7$VQFDCg%a!M9jTDRvm zU`PX*zabQtS?9wYvqeK@Q0_M-zI?uwNd6X!wq~3M?iZ+?%~Ns3N{6VS)z$O`sqh#@ z-H=V9rQyR=4Cgzkt=m|WG&Bu!c@E60k*>MKo!g37`q=oEXha;d3+8e@OnInjOitFq zP1J{9{jPbMnvPiBF_Vs0Q99BS*Z)0rUf*gc&*pJoVM_hWuHTw&7U^h5zS+Xbdo`mQ zrQrhSqtF4pG$+{;#=RrgeQ~>z%H*Wyj3j@u#RWCt4$tSKiMX(RhA`;E8GRga)e}3! zb>4|Z{NL8q{vn3F(&A(g`DV4vuz_s#LXEft^ zL;P7&Y%9_YiH+!!vEbZRF)>MtK0{K_FZP)j@E?x4ocqKh-^GY9Vp*fdKt3U&w6!5`N+Py0e1t7&%RdP z)ksHG&Lj3N6%lhfjT&Xn*f(p!=3E-iM=s8ilQUh#?-=4V2E>|*7Fg}+OH7M?9iJ-I z#2xm?Gtbf&anEd+bME|-!`aho7MwWm*7RpDwDGO5c@vM5>;JCvpY?9iz>oe0{JVp0 z9}@l62jLUzTy3bic>OB|9lH|O?qz3Xs7pZt&xg08zH3I_Pr;K=`m(&At~~2WUz{u* zGF_J|IjqC&0{#xCk1PIz==XM*I+x)0%I+P^3@qn4Q_%=z)K`S=;4uUmP34-11G-4h*+O+xyHs=lRg@`yia)K7Sw2hoNE+DqE(Ycr$fI zPpn}&pW3)uNvM(Ao%(O~%ZrncJkJ#6#99h^lH2+8n{se5_aGONadyRi<*BEZ-YhBb zKNqgF{1}gYtgWM|v9eOneSR3vL9ZrCJbOmF*i>w5c1-!wi*sjdzQfe4Pba=Io*Jb$ zmPgULjQ*6B=|4VtC0>{D{yCUHugSJjo`^>Td-4B0pZ7J2mo}3_;lMgiFS;sBbV2kC z=De_?qqtZYgLys3o!(wmV>^-=>~5SjmYCCPn%_VB%iodoYM|cTZ5chL*Gi==@t6+9 z{J!42S8ShA!^(avx_w>T`kxKv&EAl_75xA z4@Wp*88MqPw}?lne)KaY#=yDn&IslP#8YR_d8C-$Z#S3G$Mh||K3a#v?-KQ?oW1)y zdE<6OBIdr}Gxll%mKqa-B{$NjuN5AB(c(zY6vQ`fi3!%+rQYVgJGLse5J&CH+VN%&U@`b(H+H!7)8!m>N*=3lKYv8VW0TD z%x#NfOE_1xA_t>Dfz|9(_RqwzFWIAT8hwVc*_&A~hl>3}rPB$R)S6kKgHmC@^Wn&9 z>UQ`$z2|IjW$+vfr?)}yaqa*H&c!<7Dz;X{6YS@q_%M6dz0Aa6=B9-+IcTHUOO(=& zhG*WbH_5n5{(Gf@cywGqP2w3hjIS04%c0~$4z`8YvRKr4L2u;yfZ^{rRCP+juA=dX zz0A4FKMj%h=OW`e`Ss+PcQSu~RT}Pz$d9_U&cJ#n&lVfbI17?bA)c74X+`UA$WHw)I)>%KMf{g7OgmpYO7A_trqM7OQ=pP;OHhF8_-DMUXzq9jK z9F?w~%vfU|?{DL3$P)|Qy@~BrI<{p|pJ^yKHZgiiE`bnJi1`((DwFHLzdrMc4%Wby` zf|9od|dK!@XB;K%-LnV;Rxo^u&5RJwO^l#qR zu9h3*e0oh+He#(t8p@w_gK&oZhV6@S!gyOWj&N78cYC~MR53Ya?9*1qg(zLP|CzX& zePECYXmFkL5K}(Bkw#Obv`d5V_MUC+~-&5`}9Ec*hy< zf#d549GIAfHZ6ByO3O%G`^mn%-ae#dL?ev-WzE;e;N5^3c@gCEpL&CJJPW5)ONYE$ z&w3T_eBB}D2yAF<{lY>EXKG__DCgkr8;2D3&{hwt>oZ!!Avx=B-q*wRd*txyp}596 zw_o2-_I(}*1D+e>ns|uB3DLN2$yw4qPBVTMu^QrR5$Dw6u;n|}Zud+)e3^_t2f0Ua$i#Dg=Fh6c zf;ufh342oMl!$va8<>I3yiTg-eADDD!Grj~Jvy`9$Ifzgk#N>mQHX z$EihX($YHiF?COA$tW3d2>*|(uMEp-+u9Zr6|fsS5W5lKSvM*M78cmj-Q7HNBZAnX zh=E<0z*-aR?ryd|x9^|BcYb-D>)LMiV6HjG7v;$q*)!jX5F3a0Vk;mjprL|DSbo#nx5Fg+3AIs zhDq^74;;P9J#4Y2Ndo1|Ew)?m&%^(;qMcQz?s5(b|D z&a{2|n1nSA!vpdmvn!gLjGYt;-){7uOk9f4`Jp&bI~wXgE+u=bLh-C#K(#vm>33Ol zJwjb=TlU7e{X`#nAk^cIsIpUva>X+Qmu7OeY&lwWp1hz}68KcX={a>lL0`=PF9@x1W0%jT|JAi)YQ+>Wn)e3lSuR;nX1ZZ68k}?N%THiT54)eieOh zQ^UT4UWA^HaQuxIo>NazV*3W$nF(vjJK>eqSFHT#0%P(4-rmwMxqq1cKlPF!9&4I3 zt>udG+vv-Y)5zqqp9kvINx`rQEleEm`Qmsj=6c(;HR=9341Z@*vpJ-x$?!F5^!!BJ zFzF|B%+*+PoxATbGVaO|Cm2&8S@UeHqpH5haS|?JFaPO;xi@!F{7z>tJF66Qj=cdoT(n$ z3#2*C-RxzLKKkXqoX2Q-2mf!Kd#2wJRaLI={BMsD zq7q+9-0-arc^X>|DRB*g(Z!12uyj4+|iG-=)A5!ak#HLHeDb`ZdN^$6VV<>oJ}3d z^F}7`y}dDs{o|lRElr-&&+v2(`wsiICV`&ZFSTa<>uZ}#m05cEvE21f9p$L zR^U0srbRGLS`!mF*O{I$>_cVpxYlX{7V&RMHr5{8{A#Onm&|9|=WoiH4(Rq#Bg zbM6>%WR*0GoQ@xDW3a;DlvHUJjXmTijobBAn$du}?YA-5_O&@0&*pn)!|cMx{dk{; zBj!FazKn_Z%KmnuQyd&)JrGaae>itW6Nnqg{{AREMc>`@HRxjKi|=akkgN8RL*xyK zIK;!G)2JWhiOD~x_S%~)W$?cx zk2{CU{%QZtb5B+EIw$;kAo{S*8(HT7DWTnh5zSfKeQc7_(2$&n zqvX8hHd9tCk3*xM+z%&?l&#rsv{I1+^Q^t+JO!M3WB?Q6!b|`;seTP?q~zisCH%$t@OHH?=YQXgE|axc{;2g(DH6 zNM`?6_uM4>85)G(F3gjq4`L3pP(R&eFa9YF&o=m=Q8w?5w|V?Kys(P*#+w62U{HhS znfL0fvdgFy>H!1dyFE8N$9Hn|=k`fP+XLURgZkD!LCIKitCq>;xq%1|O@_ZgZIc%~ z&lSIt@L=6Lq;j9Vle{mjBb%{{v&aQq^2FZvMl3mo`<=*JJsU3V_ah&94e!Ba3;)&m z=EUlCK4bhy^snT-!8*5I! z`RO-#cQNJisz^*idRa zm^+MQ&Lfox(#&USy!=BR{?`4{wH*<797_Cn!87SP-@%yQ%>9kffz8|yyd~EqBy9lw z*aG2cOy8u=7HCY(@A6OaSl=z2{ell-wmb<`nAOf{b2Osy|ZS^UggDT^50JqE7=mF%%Q&dW({I*x;+)W zGIHdJNAC$Ql~dVocxMv(^nPAE-k2UI59uji+D;Ya%?uWDjZ6kzP}L(g@-CB@M4q8^ zwHdjSI`q`NktAhgg`+8VjO!;Kk``?a#pPz?XViNqW%Un6VtyR9UulKYKbfIJ&iw6V zMtJzw2M755?(nf8Z@`Ow(Fv$+mw-MSJkW<+*(o)15XJoNr6$bO8?YaKquns?4fn8> zry={fqtuDs_IS76KV`N@0CYFdbAC-3^vK75PEYuaUZ*k3iP`9Vh^rN+ z;Sc{i+HwEVr+*9ha-KVyNpDZR1(F+ih8d;QeQa6vuivQHTfNSf7Ei>PPp(+UI5oH$cQmngf(5>Wu0xuQ?t3J ziL!~l$o+}gEj^VlpBu`|@TbvOWxTWaG<$0Q;mqPJ=&t(8S!YEa-^i->D$BZ&I86>f z*tiLjNkAB;Zit0iJ5zd<9fFCy;*e*2Tsl&RTrBS79U9fd(kp)W%6;a|pWU#Mxjgzj zS7Yx?K+U0^`1O%BmzZDu-3@~Z67e-514lAlQRJS4?mC;VdJGG+^LRYuRC@})58DyjfsD&*ZHtWQucPZZ<=8mxA4(+Id-76N)@7dQ93N#b?~Oi_sFST6qO5He ziyy0^`L=(P2N3HR`8pbrOC#jfKZu{0#-Q%=#Geu5-4W8BUc|TNVZOU7I+Rmi&%Mc%jxM;JORxSzOObWL84lzz=-=CnS1Vodj@jI^ zjP_%$vnTxNCv&8CF=7+^5&xNYNb({0^p8aDLeAiQb1|P-%^c4p)ZS!`=2OU7h~!>U z_oH-eGBua%KWl{bm%j6C*6Bo^q1XL?`Q2Y;RNsr%xLhV8=rd-@84%y+izC~qzveD< z;1eBT$h>1M*C@1~aYbpwIgY#K&W7rl3;xtjL5p?k$Q|*7 z>*y4mNZN$|eD>0rCGB%Mm$|9*VOWuj*Ugwq&0Vbh>LmDmAB7F`x!+!wfU8B9rCBaf zm{}EzzHOUJv(t#@TaZ86!nXLo^Za*n^*Xa>X*%`Kb0n@oXbK>sV*K8;!*9 z=E0ciM()=2tI8^JT{m4MujA83kk#zGf&D6edxu@J}=SIMDDtRp6ZvFqiSw#Ts|iZD=o+sFV9h}isJ9|2{T%@ zwvcWtASXE>4licANjq=)B9uMGgAH4xdo8`-@`^czyBXFYw`QccEQK-%p)ToZ3EAWQN7M5mX-_iXRdh3I+x5_D7xpkVfPUJo-F8t!7Q*$cg}3-n17tBG-O}blX#nl4j9TE#ne8dkgZKWXYCYhG_*jUi7q&un!mfIaA3mqI&pY-TLA#BQmvB!NL>_+QY}LNU0eIJxKKgTONG^5#(CQ$y>Xt^* ztK(kqb&toOI+4wVRR~wPQjR#2WI(lM% zdOW1g3#4Q08BA>w(4~2Tq!NzkNbGiT|Fu#dGkY{>%QI|sP&%{L7UosdXurK6Z4I%- zXWkVnQ=dvL&)8vBbPB#3ewCuB8Sl?L*|Pf@IB>xOnMj3}du>#N1tO_iDqPyvfaNxF zHp7^u)woQWw~iV__S+e;xl-ad?!C0Av8oy*MeT^fPFHfv>n~S5K1x0m`SCR$oBpfw zPVOB4caKyutX%ZF?Fu#PTrps-*cI(YjUjpYjsoVf z)vG#TXxcCqJ@OBz!ZHG}d<*Z5ckfhIF}_&Jy>?<@6Ui-rd*h$X*QnP^`sV14!9~m_ z7^af+J~`pQiUdr1Z7#J=w}%=1na7^8l^nX*qI7N&4%ZEk($-p|=ZIvuPKuSrZnMUt z`ot5A(j?p3wlKYzg8CD(r7n*h@NQ}~0Ys>c`xTc|QN@ zJo7Cjf@CIk(qNP~Odqg&q6n7t32I zPj1J;hkL7NgEYD8GxC9nS^K2)D4xt6%N*{G-d|{{`o?{7d~ar{+|E*6D+$Mk2m`=gs{gr;?r8X!K{Qm^{L^#q$@c*b;rc> z#GVRUO0Lv#1aR*2snn9b+dB|bOvIhUn$njawg{sy#L4MzR6b@ls5>i}dF3}$uSd~? zbYKd~J&&p;rrBcm&lFS`6sm5va>Ry3srWVbs46#^{^Yk((L3;(s<2f6wN0t$b>)XD zvk@_W(^MojY9n=aVa`tf6g>G_SNcx}-JN&TyGydlmvh^Xy2Kw7R;%8zpZysUgAt+L z|LVNsQuR8&3}_;PJ)N<&C1>rtEy{wYE-2(KI(VU^M7IjW%fE|v9C80vMgX;Zv8|-jQM%|C~jr@fT z4)IQY8uG1pNG0FA_NmY@m?AqxIU-h0#f)8kvY~}L)^tik&DiO3jXZxmVUD52%Glzm zPHKcRNAiB)Jk_N>oDt5Yps&d_RVw!}8#X4PZs%jFfmP&F5IK^nsSoW@P|HlDjASN`6*OT>R24oCq5sL$FR1Bbw3 zsqU3fEEq(MaZr(D;v0nJ=VF-?e@OB(^~X<7-bd4RNm~c{z^79@&M#XlX*~D9f~WCN zZ;qF;F1TQCNditr&XhDCI^xYb?&6xXl8!su!=AnwJs0Pz?r*2Rs6YLtwkt_mj_6bmXi;7i+GCn zQmLevxC!g*UAA2^JjA^m>wK+Jkyi5!+NS`2xOUzYycTfLm zdUNG=tL(6Kd@2ebUy}pQIAWG|8lpzmQJzlYd0v_Z>$X}-PNE-l@1{Y^WwV@7L{4&E z8s>UCsyeZkyI+xtfsM1w9=VJQ*GZ1~PUu9h053leX~%E}v?s6k%e^L&wW}QhsJl>|TBv&S+7_y;6okF4 zB`cAve^e^k3_K(o(a$8(lKIioKFev>xi|Zh23Pkl@-FJjYR*r`qU4$KvCH9DWtxuk z6P2otznJ;FKMltWE=aMy+>!GQwe)%@E#%wRV|OCP|6WAS7`cQK>2V#t<==T87h8Q! z(UNAU=C+_eybkfcza^^jVf4DxBA@y45a}ZGsW(j|hL^HJy3I3a&U?cxu}IoCCKhEq z$Q!b~Bb9XLy-N(mZ&HQSxC?m%Wzp#Hur^$_tI={Iclb_P%<<(O<0L&b8aG4yEPByQ zk44=B%@A-Z5He?zG{a`ZVf_%dk-c1E6U++n!RC4K@O;q#ugP;*)RWw=(n@J9am+^K zibb@#B<0_6!l0@|;N(W>fsF%Byi3B4Q7%$SlpPY@(@SlkrgZC$E%_uV*xtCmN-?Jw zG|yyBO}paFCXO&>R_}PrR`Ls1X29)DM@5IX#qH+$V$P^VcwgzS3T+gQ8J3HX)hqPz;=Q3v8A6(uCpEc>9+K9fI+Z3rM_Y=B1iQ83N`B&$ZPSxvN;4(wC zq>&p68dCT4=7K7PSsUZ)QeReYv=kK;h<;1iaHS2t7?RjY$_ZWlpnP;JT zFU3BN#&b3Osb1GXQ})-*Uqu6-nxc^WK-J6`w$yQLa~JN)q!Mv z454l=qd^=>PWD1zfgj!~*6(-u@#iSH0TO2EWDzSx|Ju{K7^p=j+vBS@ZG;DWz zqncalfTN4kF|ornRrVhCv{{Rg-$X-tJY}48@O285pW9nZ*M9LCgVB9`uzfB4pO=k7P@E?Uh)Jco4})$2J^g%`Lw!h(c#jhT{Fw(a zrxh-&aNu{4j4tLH=~`%L~177Q;xVCJqLMkSCu>e`*UPZ>5H&EE8F4x5142u=}Q& zDA>9ad)Q~?YBBR|cUxv!^4)w(-}}_3|LQ#9|GPI<44$M~UB?Zjb;##m`dBrswi~=E z)X@GoTXJX}2#pcsX&4krXZem9u+D>Ky_5$+^s&(CSdKR5Y!6hd$D{bF76JbCgVS!z4h+%4U)KG@UK4^w}{K~3MR_Vfpy zMh~18{Fxrn?@RwAXOj(~_}+>KTIy1ciKWT1KX2{^Xh0ds6K(cRM#5hiX} z)qe@ptFv(HAbk$YvT>|)DK(9uFfLq*j?bSV!jKqo?h>qAx*juc2E+MGDn6g?4ACMK z^SP7xm3j4Fox8TL-fx^PHc+*#;l{i;;*OTjRe9VgjU~QVz`VG%=qg2^A~pED>8kDfZ*;%3nzeph_s?^z+rXE8KGQ}JUwGj8T*LDXDBA5~|V&(B7b|9%Yk=?Uf4 zQatQ`8SQ)d|cy45<~`wyi+!K|bm^ z%j$LRWT~f`^4FDKWor2Ama7DJ9Z%?alAUTRiRA&X=ti&Ic_*a0qgk_S)JN?7F6nmS z4wn5!^q=OKd5qfb$p5g5KB&`}e1`Yb*awe7hkD_}K6#!`&%%P}5Nv0iN8R$|{TGDB z$((rtxMQ{OhcuoZFT{s_(6fC6Io7R~WWpuW6U%-w2f=X#A|JV-8+rgVHQ}I7~{$-T}Fo){}ELb5FK@ScfB#R(Mh~4YPNw#VFGSn4Fo;Gq?`fLGy7N z8BpGA!UdNFFz%X(k@ea@HlD{H$G6+gs47_sgMCF9H^d!N zKPurC(|ow#}waXU{w+gF~?X1@G#w{x~@~2)@)QC4HgZ ziC%LvSm!HUGw?3io0$OIGtXa%cjOD1Q_GOHIuF)-`+hcNKI7djShB|vJ&A{QG}wjD zPi*1in~crZ_aU&<3azfC@LM~GWnbqbYfKu}#1!G=v$>f1HXV)~OYxgI>?3w&!2H~4 zEbKWKTO%_uXToJ-1oIF#UW}++9MvFaa|**`ZNr22$#h z!SC;ceEVcf-eHc4=AJO%3}x0h4OV^GGqg@X?=B1Fqh(>Ux!&C)a&29>cfqC%r=a zUS3dbJ?V;`dGs~-F+=il2!J2^>RbB?rQC)wSaO0K>DBM059Er>XvH(!uQ43_IODt0 z^W{rVgv}+_np}eRS4P6#APl$1#-QlYeCYfRLHb?ZJ57V3{f#?qzJo_=@OvX}8Y1yd z>yZtIOWyD&2S)76MZH}f*j|SmiK{!%LAXL`$sFee2XS(OBeX^&q3u9{k>xg6n4XM4 z@?p%}7vk@a6f{|Oh4{=o3=K@f5Y#bRA z0weZCx_vj`catETc@vMZOUPXu?2jVe8``H76m#dFO#Wy1xpUBBc3}tdwTuSc#`9^; zNGB%pr&BrXdf8)N>oj~F@eV)NS|h|G9Tp!dvFp?VIBj9gU4LT8yLniZmjS~eU$OA_ zTm)Rrz@(h}_`72cx&<%7^`bRcw0I7^5V`A{ZGv_47T`d4`cqYO#n`oum=enjU!&N8+7)FDVJ0Ryw?9fIORX<6vu|JZI$!;eXSBx24XqBS(cxCGYLX@AK|AW- zinXL`^@GryzDZ?|!=%zf^dn!*_un^9T2H=PLK$cCC#R%t{O)tubBy}>UK-eg8V7P> zcK>RK{QC4r{z~pqLT6n5OYA*@{dbe$*ucMMe=F*tmYQS3SL(%%lNZW-fCjqU)vSuc z81h2?ZS$Spi}05#2n(7AI8 z){9cCP_aKWNW~I^3wSi%3sWbjA^PAgxD&^pJvtqd{$ps5bw=+$>G-5q4vi=WRP|p3 z*Xg&BcHEY~(=-$gl`$*H2AaVsD16E9__HluZlg}D^s+ROIjX5u+|w2xkTRGx=E!~c z!4B?tp!qstcs+g^_n7L5kE5BRH+`q- zb>DEf338hX+e>levi+A&v)gczw9bN>U(WM7JHn+&3CyPF+4gz4T)NCY_b)MD-xvF& z$ma?0B3>3Ba!K<3m4KEb`19U>Cmq#Ego?A_^uhI@eVw_W+!qYk)EX1lQuD;#Loc#7 z+6_t|ADzDOmw?yoqjkn7Kr3!0=AC74Vv`7m9nLtw-FvPVb)KB*?{I%*?M%GGAeovR za&PQXaLONN3bqNl)Fl&S-Pi6^UIF(DhBQ^xn+}t#302d|QHa z;#df(meS`ZuaBx1XW?c2s@M5S*|%c%JmyFy|DRvPpjbB?YOBV*f;Yx~aly>yrmvl5 zjB1J*Jpm?hS2Asta z)16hFH%7v^XZ1S!G=sdhlRbBmYPf5jD%R@efD3Qw^BCh%tkU*|vj%;Mvziunr(RH# zGvfl6@}fQg^g`2TR`u(ZMVUq1IZvQ|bJ2~$&fIHl52hAi#ss4$6Ub{WB9`f;Yy8}a zTHS`xKz5GtbYc!axJNyoP)DWko&5TooL7Xt`pQyj5U55md%wR4i=~TC!*PJ$%+K~mrSC^V5Ji22zu|9b zp-mu;woFE8ZfC@H^+N;w6zuP3hCFL;7)snJ1^d8@UhDI9)6lRW9UYB5@bz#SK6$P| zzpfs5&^?X&{VY6SzR59(-u~qyQG2!=$Xrf;X> zu39iX5@%ahuk)mj4zg#c6>3JmbyGNnJ-81r@3^nX0(~F?=vHX(!_B!!V2-Es3pBqnq z)(gyDH~uOA~Fn70iR$@3`8usMOUuC46`Wb-~b9%@$w^VfQ(I=BU63-+r#Wg|wkDE94 zW0aD{nbC{;)84vC%4F6slvtPEiB#ot9(7EOsCB)Rro4R0Jm1YR=s7x3xkXK-vrR1g zp7|;cQ^U}LJna4brzrF4h9a>&^S+yRRJ=AY%d!i75$COx>xKtn_sB%lIay)cPK$F8 zal_85+e#{WLFaBJH^44a$}8}O?uQg~Uwc)m8O<5La~iyE*M*vU?@fc!VJzw5{s@0W z9pMaW*ako91R!*I8e+05rAgEd-xEz4C}u#H3o;gCrTrK1>h*_T=mXT)%-vN z_R`Pvf8W6~V;9SPCtG3WA~lNSBsuW~d;W%MnA9ke7Z*B1;}7|%8Eut22SYHsjK8m) zCd$;0%;juGZkdsta+FyiI=n;DYsV|jU&0Z`I>-N7p$x3UeO(l>%-=hde10EW$ffL< zpeTk@=y^29Em?#qmT zE=gEBd5ye(kq_?7Pll(BmMZ+DH&$=vPETnht*-5ZUc|7vH1?D{Rx-D-MLJB@r%FTT z1;X@JI$~D)N-Zpc@ysk8M;y9I{{6X=r-r4@oCs;OoiCbjS985;ru2SjAm+KyTlLjE zm8Vk#`m?|O-#TmVUn4tAv_g#)YK$AcUS9sq3L&ldW)FBNZ++~Hll9fusA;NLd<{VX zxdOF~0+l7k;V@;LFYnJ(jJnewmFGEn>=vc&oN%n zKTK`Q!jH;2^2vMYL_^oEhDbJ!fVB_%@0fbR`!Icgxl>(pTw5IB@9r7z@#3JyVn>@W z6nCKx>!6Ow@#qUMJH9LSGH*oa3;$QnN=yXc{idRQr= zj?Cf`v0A4rC4~9ETGT-_(3q$=&GJTl(-eecy^+tp^~R%=RP;IKC_n1phe~p9^{vh2 zy&K4nT9J+>rVnIUO-$1(9nb9sD#oot@alXDnonM)GBxtY!7*`Yy?V4{Ozy{XdRHCN zAFmqSIs%seA3i9{`Le#b6^hx{-FbOXZmeUCK>BoC?xm@iH*~@Nrt~B)bXG9HsrQ+aQU&fKNwB!@$j_j6g;S;h2JIG&7Se$bc~O69Z&tny|3N7WSe4FQ6I)8};tAmhaH4AF(Gg44=sRX}M*PSgC|! zzXm;82M-i`?1N#X5ZC$JTQnUM2(R=wnEH1YooD$Y+CLr_-?kFjb$#)OJ<0xDO;It; z8zbqZzjxPLW%@JrZ<~{l(eSL&id^)@x2f^5-=mBohrzs6Dh&T@RstIOVHSuLdKM_d zRKaN8CLJy%x0I)+!eFSI4*A>%Wj*!8JzjE`vaM2Ha4!ILisDdY*+rUD7>K!{#Q2X6 zQEffPo!*G*=lP50UU`zG6)tZgf4BUMe5RW(QLs8Cq zqn>xZ(yW}h6?_MKpF5?ve-4L9Cwig8zf_W#cW*S39uW^}iRAtfSjjoiWO+03bw~sb zY$yMJb7vv*PKf+PpP4!R#9{70wvaQn{rLznfxWIX@p4#<6Pcx<^y8<0S^X)Z26Kp} zb5>ZmezFKS7Kp68So&^E63a^cam^tPHF}!~y$WCYGR0&2Dv0MBy>Z5XysS|J#b`fI zAh`QZ+)S?qzGT8Ts5xC8V{M(5p)#M5P-&|95?RVGb@wXQE3?@7hN3%cU` zvmm?)N<(+`0C8#p!1pM|NcmEsBRdRv&U|IcB-(-4~0Hwc8jJ9#RfS95#*%@G;t6nXM%A0 zI_qrXB$6uqAyYeFbEJ!yecu-yIg4&|b`?fbh>vpzRe9J}%=Y!f`34Di@OzG^AL@<| z^%7x{J56}O4O1E=;XuMfQ6rvzCRabSlbJZv&jUAlkauS|MO^*jjjy_?$TXf$MkF;y z#i=mYa~IERgd=HdDx{v1B)ygX7>5oH zhuO&LbzbthMDE~Xg>O5Vm!R=dHnFfq>=0(7+#ag<Q!+Z85HoTKt4G_n9KZJ8;?~GBx zQVGMc=iGPL&k$pBLy>P1jTYVP#TT7WwAw;V+%O;U)G!!h`%uqf9wss*a&(Wzpj&p7 zn9qE@RmAltdc=xu6MW#=I}Z2L;)G{SFDxZb?9l5NVOHrzj4mEs{h~#?cCPe0NWi6O zQKD-L7rssO+qa7nXBN5O(PertHIEUgiNw3fId2n{KwYpG(w9&VyF5*}GykR2?-Z=n z&J@F(!!YVf3hcJWiNPzvufklBa>_C9@Y&cQCGJ8HCpxA~7lNi1C1zVVGQ6 zozH*l&PlnCzZEv^Q6p_ag}lPk8eYT6{dHwuanl8Jx~ehY?`CBnbq!&csP%etO{w=W z0?U3dgU08NvWEEx{fOZXOKT>MM@8Uoe`+oiJ>g2+CT1@EyLK3frQAhd&Y}kVoVoZK z9tQh+Q8?MlPSmgt#mPa@Sp3vaD7&fA$YmdLFIpHp41`t}=Ai9L66TNmv55TtMO)HE z|E9i(AcmVGGQ~Ugy{5z#dsbzOoI~yy|B8E7*Ja|ia6x@yF;Dxi5Lcf%;XC;r9eb}5 z-5)zLTZ+CmgLA}U7birmOG4cC^D{Wf6 z&ZDx<$>-Eoc+8xdRJ~uab&@qb3e+f6#w)YP&wNPl^+MGy4v==iAGzN&WqHx@tLH$ww7}2|&^KS~z`ObOb>+CRi zkVjpp<1H*WUvwakXI@scxZo3no#d!JtCcF6Zw|niwwxPFmWU|!4~Msq2XbqbsK3;k zJ0$XfF6WB=dNheYR_ z_NbzVcKbY8s68C8Qcb-{_zB@iKH=$6$@oxpPB;wkfbIEYJS)8@?oIQ@ukvK5txkz! zbwcrZN-_#c)`>fN=q=EQ9$N{zB4uD8zHTKCHt484j6eUXa}n4x>y**B>0#J(s=EJ% zy2mB?5qZ_enQeL~k=5(GGVYLk zM$Zb<3e>1s_klc(bNA#C^l8%Rr*s(Zf*$Op6ZbAt8mES07j^r`UI^vrw{Ya_Vjj)x z7s{21%yVJ=E1PSIPGk74@tkXqXfJkpg+hb9pGJehqG@CZQVqxz-ft#yKLn!*`w+F6 zweTWOvXJx3*Ww^CtcgFIb*ZCylPKEQ&{sAk8XZSx3)#UNu64Nwamp3DO58DMcMPnm zc8L8`T;OC!?cVT0v9GZcLU@PNmQM)}S9?r8)8F)Oac6?K>q~%I~9OCaHWKxwFXh8pg zm_+QjcTl9v2u9VUcpO@-65%`PM{$Y1zKNrhrrtqt0 zJ6j=xbzb!6u)M0ZHOyFNKl?^Xv(_#c+>*UV&p>69MJW2OQZsLOjk26R>d)ApY_gG+ zbggi7JitYx?cz~2S(w2t6pOIieUV-=RWEZ zA>zvc_{{m`>~>2r`#dv1o01C>=qcv3^@TCHH(OrEiaqU^_xB?j4;N>OcG2z#$Rj_Y zg6F)K3x@Fyd8oHrJbUAaYg%zQZYe~VsXe;#4l$T>S?sj7MFMq0YX_By(w{c?u#CA9 z4=ThG3p-q;S5Itc&62yVobZc%h^Sk?#J@ItdBH-q|dAL^8IzKUJFLZGpN zUT->w#RunL9HF*uN2@WS!OZ~Nt{p=U0taPRNDywmh(OWBog?}*4@0(2_51mJ*HpP# zJ1gvAo%4K_%d51kp~pJk`uI$~_}v+OTBvcN#%SeZ7oO+kYNV)wl#%h_7?!U_`GjT4 z#xumH_|MvV7buBxD0)6r!{+8y<=!pkZ`PwuChCjg{v;Sndy~J{Tub~M9gK(Mpc?G$ zBy5O3-rvKW-pXO3AjJ<&HR(NcY_j-u!v{yX(=)Pj5^Jt`;VkFGw(1y>Ious~OW9YO zWQiI-oUv^zHAFx1MA2zSVhhyI+8hwB9qrNLGQDqZo)(gkEvD`yr}x`^(e9}YcE!_Q zFZrX`sUio@A`!|0jgmTl`Onr$!e?{Mk}KQYahSZ*tKBq9{FC^71@Ua3t`wndLojU% z_vVuiiqeo^SkhBv(3NpQvj%r`L+MXw9;tMS4MMyrIat3x8hvgX2ES3&>wLV8r)=56 z3MW~sAR8ZfyoNP?aUb$oZ=XEmfiv`*tDzIzT)FW%1f!R#p`Ku*>@g3=)(!M}Yv!Q5 zPY%OT-XR@Eq$oO^Pxljl@ekUlJj)EhV&2mNPq*_x54E$I60=AXJfqy4kgs z@T4c&^)2Mq=(iTOL;P^!4|~N4{lvL!A53zlm&CDgV(B6;w0y#xnm>+0`Rs;%Nimo@ zHcm7<;EeCXsZ*}KOz7u1V(?pft9INbL`{1fA%CnqUWh(j$QNBrPm+im;^TQ6Jn^Nc zSk7xv-oXxwP1#rP`7M^+a>U`vM6_s8x1?pPJMKg!VafYCB@wRV4}{ULQ}>hbs2M`M zDG`Ui?G<05gRyIGJlsBv5fAkPvE7Edukr-tdukAlFQ+$C*(l@gUBXakQN7MPI-ALr zjjaBi$?fe%$m^=C*t0V)sb-vPbkvz1Yuv95yD6KU2*KAZ&fR5olrr6LOv+Wmv`2Tv zadH^mZ{>N8nxOPH4kcE?Ot@YF%02TC^!lYnKyj9GX<9J4b7l;vyHknhzI`S+s98@h zE5EMzqw#vqJ14#>#hg1DRMAJBNi+WB&75AqOo|A7VLsCf{mAtlmSrZaOWe>clwLFz z?jj|{8E^GtG3h{(*y-$um-IKd-f*pmxx_5#U2!;7^ME+=n3?s&9!`aw7xyA;u!_3m zFC}GS$YopT4Wqa6!Ya{cG5Iks6EQEfX33Xv?kEdRf;_Kg$%#?^@QL8re(*}zlm$am zB%<=qHqjy>7{AUihh-k&(V2l5#(mu_+hk?l(jaJ+M`G=bQO1gX7zUVCud~%IJ^5V& z=BMyH7ay!IuY3D{xp?S1TrS(g zU1Yylcw@#LR9voN z!M-AAC3`>Xp4tuFTcgWr6u z9$PQE#PS{FZm?(PA>spZ>KW|q-R%;Tc58#MR*xBBV>cQV4GhDp_SNg$u~7pVb-8n9 zozL$nEjBB+BCkY^o3Gy#_sn#LOB3G1Q9b1sJ|Q@@NR6|1#>#<$ewcg{uXj+(IuApk zyIu{?{4KJV2!Y>mH5&Ndm+PMihUZ)Uvx>IT6{wNj|xSM-qJ!w)uAxleSX_NAIWm4?>j{{7#2CaMla$R;)WB41cax?>A2McvAdY!wMSg zpA)A<73bWw!YtNVUpKzEcbGGB$T9laDyMkTq!7GJqp$Im4aIM=!{Ep_G3n)#;_2H% z(S>Jwd78dFjys>W#BB%F2$G8vgAu^qW6sYV^1zHB%w>ryQi|c z!Vguc^nomJP$I7S;PXT7sHbKtWgWe-jUEU^wS{t~wI_5BlZR9JOIe=g3U6{y9~N~I zhpe4oSw9vXJjMtMGY8B%%>0kWzM|(2Tlz)C;ju-gC@HjtKk-FtQ-1H$tYJ5TnHB-1 zqA=fv{*%-KXxsUc`r$hmUVgJS(D!8pv`{-E^}4fcY8rgV!qD3HA=ub53JY|4b45=Pd0Hy#~I{NpVku7 z`F^=^U+NV*K)hLQj|}RzK5U;SH0#*HJBqr1=R{k+aTg43h_^>vvBI2p@{;S~#CKnWd2nAnp-?=azVF&;=HDF( z5@yEqjM7YiW`j@4@>fI>Te-OwyjJpnPW4Ysx00_=3f9Dj) zUfMh}apX)lZlD;w^G4BiVu<}rlr5vY@Y8_&>M?POPj?So-%7vSWkpJ(U>9gjrtfIZ z52cr;BYORzw~~2BQJ8Co)w^R6qCZ}&Y-9tyh&T*9;V+E3T0z@_-miw4qWQCh@X%uh zO_O}#*2Nl^z9qmp`G}bH*$$Rl6EX7JNl|g!1$9PpzclWo*wWD#nsb;HtFuGQ7#4(& zM-nm1Vy@WzI|#Y-^t|%vh%%x-GjOSM*k@EOUnmSh@oP248sy2fX7YPKT-}ecMUSZB z-&G6IopsL0+*!2zxD~3nM;bP1X3^_W&RD5K%&URVh&1wP`w=fNOTTEex(ELrzKPA6 z9Wz>>7mE5zm~Cn?euUxIU|iZmU)s_(#hnfXVLE%f=Z8-f+wu(8Y`|V_Lm#<&LI5*{ zxJUBOlf9RcD-}bXzSehnp_@0duF#)Qx1SQc!IM8f^JrT5C<~eA62&@yzp+jEp6!g3 zN#syAeX1Pj;y_G|+1Z*+#Iv2Y@MWD}+Yb{TI#}aX7-z%g)}o`Yj!tjHOV#^(!5q;H`XVj7nti$QF_5>y5#alc0HMklh^J>F~Cmr zJAFTY{4T#c#vS(zE-I}3?DecQ*IaYr=0fg%cDN?y`Pp$-H3|jmwWK)Mz>wMH2J2&Ufjk-3t=;|1{Kj`q3~7pd`#MfmhQ z7QYuqN)KHfFlR*^`n8Xh)Z`}Jv}f%x#ZtOn<&9mNW07QcR7_F%ab_1okK1@nA7XTW zJyc4wbQR-S*BxSbN9FV~K9uk&%m=XNbXcrfQCZ!3xiZCQX$kEx|ny;$RB zWecN3&i+-GG$%QC`*Jx9PQSIp6E8gRIU@|l@g2naH>tBXISk`w4Hu`}@Pv~Nxw%#g z#KxaJ@kio}PzV%L&UnHkp7ZbEWHGte18;mo(Rh58XmHvcN}o`8ugDiIsXIL;B$PP* zX>kMfxZGs=^aR}$m8)04c0m}lUsa0k^XS{IO)M+FMhqC_2%(C1v~~k&HS4#`JnGmR zwUF8mUxaVg^s;Z;R#IjyK=!D=Jf|*Ff3JBk??Zo?zI`Ocj@ek=PEAjM!BTeGY}7eP zJ-$G5DaU9IY>lE(BMzYp=X@CYb3gaMAj#Ka5iYLcu7}Sc=^3?X`mp9{c%V|e!}_yo zFym%*Lvw_hKT}5sz@Wqf31;+GaCNVBp3NGi7w^kkfI@O{^2yvST0&@<$m$;P;54;6fY0=M9kSx z>U3&J`8?;^A3_0_#?qLk?igkjh6^?NQa^iFJoprb(+@jJ8+SP)qnLA_Cfy`M;(^J*7v}0&tLZUCRMJ3g55nSH{&o&vpJ}7Ms6VhdngQ-9LMn*)cKKe-u+H$wZnH;k25mLI!V9SldRQ$Pob^O;GV8-hDrso6 z2X!~;QP|&4>N?*Yft;(}Xlo;_YVD3J#`g8up;G5Ocg*S?jh6enOMN%PyD|uT-@Kp7q+h%L$gidpc%d>DWo=*ZJ}6q5BGXf z!*D0!j`+E~AC|13$H3lSqAllWQ>KO?Ca#4P*3loWhlD|=+F0r$`C~nKm20*PlOj@y zHT4aHX8m+&f`1^gh%tV9?kGjFuQKuEvrZ3_45L|3^4~HuN|L%$@9weDUk%W8l3>Xl zx}D+NDa?^PT7>}v$V1zHP|8`yKewCsNuweuEsg%X<09c$BTJjVa9*#&eapZSsV-;n z&t6iWWMhG(RUCxR%=2FD@}yrc17Puq{K-`rQUEc=`48z&;i-~toen^sPBF+a-z5b^ z(-(3fy->$gN;7kLcF1{n+A3bSSWb?HZS8sYz*hOiA!9A^fHknzPY;c9za_eNCpYHd zM@`oy_RwMusp#M!TL1RO)&b!d{%)l>pJy_h{foTqkl6j0FSfko@3!EE__UiJE}jj; zoSr|$D>;5R!ui(y_ARC4fBeyFV;ItIcb5z<`Ximcb4cY#X%l(B-S}MIy3CQ9tO$fM zi~O))7pcZ02$QJ!+jMJ`GoPTegm82jwnd8l5sJDy!ZEXSpOir^ z<&n13Qb;bAMrDKpe$+OyFO_ca9v=6BJ2fR&qzkHWW~lI?^=O$aCacQ=o5YRpS{we_kn1-J_hRE`O;DHf_fRoqHouS z(yhc$bR=dH7x-JcY{yw%3u?=3E)?`N;dpOUn~c{@;7E#R9(LYZ&tx%g%{sh`}x;rUzxU_+Y2sf4Sw$ zjwaF}Y8@C5>8W^?Y2y;lbE;ofL}v)5OHu?3a#^KNi@LoE&G3)QFtcnajE7 z*r!Zty@Ee`DK#W(u1ggjJXfq+W}LYz9p4>>X|JjOW`AF@iwlL>UV32V(wFc+FibW@ zA@T49sa}&H>St1;>8d2vjNtCl`Dp6r6iS2F1YyE$?gMqcCS`<%p@Ap4{j2n3E^bhJ zll{(sR&tUJbF+sUv*%n9hVS8gX=Uv=Kiwl1JEmB|pJ$^eZKdY!ALi#7;n=p=N|)RMFqog;xKEa{j5sgo8ICQn4pQ=qKv?jZx_l3peqA7Ty@*;rvs0v_ zwBKDBe`$Ig}?nUkMT)}Zz_#m%ie!3@6+8T(sKp(G5Oiv zWvn!?Dgdtho>PjY(#70Bs5}|}*U{2g=7%ke=diR5(vbP||0SmCeE)!SQTbP!m3n%o zOQq~?p)g@z^C0MnG|?ywvMaff^J=8G&%@xr*ByTI*PBl84BP6FKKU zpvI;a=Y-RoJ9TPQoBy17KvV4Z)Dm@zn3LBplOH56!%*JcUD7P%$DLd;fi=qhXEWt< zV}fv^EAfZLQ{}qnIa}$;-~IFy`PO9Su7T{MhfbHj4+umCG0#JF=g5C%1>)Cq>Y_^v z()D#h9!WBX?z;*h!B%wk@ONp4wrEa^)_@ zg%DYL9e2;3s<3sQm%MmV2(-fJw^C=BtW!xX0&0uBc(XuWNPcg!E-}59ljP}>>G$!A zo>Ge8@0q`K4_QRERlACg>>|8qI!{NYZw)#8!? zOZ-ruzi(EK*L zBER8GXB7MB+yz(Uev7#C!k^D0xkUannE0Lry@7rnmbdf@LPsb10m*rCJ9;`eMMUD; z{B5%C<6wAgC5~jZQ66}P^WXFI0S{U&8?7a0@(=aWC#A`a*wbiDpbto5qI~RpD00d7 zNIDiHyYgLlPuy~mQ>1LnT$D-d^bGuEgRwz4PA#UrPn_gg%>pnF^vLP9P!99=g9E*} z?^{fg`%uen6uEh8pYhyU2jVdM?&8kFW&fOTjLM9K>FR0niuv@_Il$egS?2Oq#<_%b zwc?=;@_ncg@wIl|=qBVAFSu$6-OHTuC3G(78q8XkXYbn0+>)tI_L#`nHfa}8Vt>aA zR*QMA`b{gj!Caleo+~G(Pl?ee_S6eFzw4`CQqjl{X8hc=zD~(*a?e&-M&jh~H}W`g z5r^4Q+h_SL`P$9^yjf0+sJc|XpAv{U{?x|wFP1NpA7U9#t>c;bvfgs?m$vhFc)v>? zJ}?BsPDf(t=WVi0vrx2s7l~#KGv&PUP<$pgY}=8wvi(l>H16EzzPwWI5EY81=T%VO zPL_=hhaiu&L~FY^Ig^~pFZbD}+pFZ(2*k;B?kcYHlhwpwPP#_pqQNpbV1+LhaJKa_ z#X=UyfeGvyi}3c7X=m(|1!=6{Pq zRz^K!Gw&|pZo~iL8^Yd{;&LBLe7PMCr|l*sqs#r6KdA+AbZ3d%OncZVxEuH=vZR~wC006 zs8s-31QMfAK9J3|0&z^mIaH5}@-5C2?=zR?oe|~Cy1}sBM9s{ge0g$JFy0WO%hxohqh$BVWGm{nNjl2-=W<3V83v~ zTW)DazGY+bc&{y%uM*oCv7X%NixXvoyMfp?m_AZN%;eVB{PBi&pVvww`3`*+%5Jd6 z*waGZ=->~tj2OKApewHpbyWd8c!I8O<&DYpH*5C+eQVNUE<^7RU5Orgw^&EiYq{&3H$J@-e}Pb^tQ zZl`&lNc_6puB0V3gy-?=x7U4@yXXgDSYzr0rJt7@FAKteUz|gY-zj?-1fzy?)ucYj zvXf2-{(VIKc{g{t-H#At-5>|-;dJ@qFXqpy+=-h%M6TP9`{m{Q9aeUeOF4Uq;rUov zWFVLNM?m{M^VoxCa?97$2x%UPfHsZfroEXPnTxWm>dB{mk~^6|ZJiT3^0Zt0v(FSJS2WuqrQo)m^6y;yvgd&_0*=-2ix1}_38$O30pE1ySW!_1!YquHz( zW1{ftX^mjb+96c8cASURJt&MyTMoyMyd$TZ%MQ!kkjvS0#Jmqu&_*wOGN3N>f_+jQ z_TPT27xycprGP$RNMwB_x3`s&OzB|F&m~=ENHeHK_JZHDCT51zJc)H#cWN+fvX(4(Zy^t%%t-Fti#w6rFSV8bk)Oya=$FNyS)=jtjenx>c0IYN1#RVb-6K&#oJxlp zTscEn^BB~QbIq#@3avYCsP~7p)~3FiR=1t-@ds;+w}ZvJxzsw-ia?uBd&Ji2NDL;9 zZL;#QxFSCinR?u1Gi@wQ{K7NN=kmCRiPVyVFwFG|yVqv6E&<>^27rNaUAlOI8?k14OE@lWY9zm7W>y5A+$G&L62Q(k!y+NA&mFcJiY- zp{(JVt2cC)TLx3dy)p(jU53bYzN;`q9fSONBjqc+V^wC+(3k4T1Ne@<;0}EJ@N2>g z_7Go;YsWc$lD@cKk8@|vT;BEUDXw1Ug17ak?S3svJijCmZ8>kMGCeI0Rde3hf*!j` z)#9QQ`c?6qJGX2u^(y8))0rNc_f4c84Vd%z?2lwZI%coNAI?oo#w?V)PpC0wG-nOF zyrsrXsL4vc?#QTE=@Dnq_DhM4A6_k${~JwBMgF_>vZX}MIs0!U$0IOb8rzy2BEAFH z=afheiWn?q4q5c>vUEqA8eskT4kX=|9*(5;HuL~ouZlXN&!S`f{= zaav2B&D_6rB=xTf8px0P(PNoA=UaT5%6SNd`xEwnP4wl+bn=K!Qj^oE|*? zw_p5MbNlaq4_+t~tyg-ZxpoAy)EA$D8#_w(yv z(pmB>*7DiyzBW~AQ(uijz9X*E5@{@V^Sd{v*7O>G>D@;1T-q|f^o^C4ZRbu^AJ(SE ztE5v`=w&vF9MrX0QUmT4t_bujFOY_KM$uEA`V}Y7N?CR)?g-O& zZ@>-d{du0ZI-C(~e=ZIC9EQ$2sWIE=i==E3g89_+T-CI$?3_mJdQ&wf=r@ypRtH15 zn?7D$4dvy-sV&K~GVNIxx#ASD=jP;EAJmt(^S-S)#5tOYC>>$Wd#_9WgOOV3*@2um z=Gp(f2j3gCmSU(wXu$js5VS{pwZ;Xl`MGz$HR9!bVyN}WRqnT09Lk)3kN4C0{@LP% z+syww+pqrY7wg>Pztf5}O^hU7sv#eoe3(fES4CaUft?tukA^SAVBaXTWDZ{!^Gi(6 zqnC{lJ(2Bnr86(7J=iS*yQ~bPm@#T><-71FwYyXrKz|9&YLB)XEPY8D-oo7!auS}Na+R#88-3$U1dO(*q%?nOzP09Fzj2ymz&kKHiuKRV zEGg|BeY#rHPvrIiX^lDYr9u_Pj6WsiE(}5a5azNjwdIY-VVCt%!@&E6WJ({HSr=6ZJ((np=Fhc^^?=#RE<#aT;ugF+ z|2NLP?@yItg1!Gc+lyP?7QfK%?C&`@p0rg=C8ye+XZU@O6tPYP&n@F=kf;*XXQ*|_ z7>@lGBAzOx?+@{usoz7z!Tg@Yt`Ud}Q;7xbct(0epy|XovCjhL98>noJ<`NW$vn^O zqq7gL7pu#t-!qbT+@WkS*O>bM7sxwz|Yofx5e~DdZmx%6z_?#aRmlz+UsU*g7PPcZP=P%eSmDqTr z5918tY=4qm@QFQ-@#17n4>1~ zd`|87t$0i^wb#reAhvTiANEQGg9+4D%CJ!w8bwj_g}FkjK(Tsy6ecj9_b%2bMkLWY z#hI}>Y$WJEkHY)F2wXikOgP0nFg!H^{f;y!{4HT2xZNcAE^aQ!8DAmvt44RhE@>O4O(93#aE zhjL*UXBtiRbLVAWg)mE-v$#uqCv|@cWl+PH^+u0q6+KB6(J=J>D7rI-XY8WMvnmiLJY_AzdAi4pO~s2? zGiUUT;%=&17+gZ$iZ(fcGq#8|#1gmsQ#;OcoNh?d#&{!|aSqF$C{4?BVU5Z>KJI}y zj(fg0nv>6|SRn4;y|J40kfmX=<{fK)74z!ar9%~ugH&kAd#Y}bo?yb5+gU^)v$LCE z$$a9=nk}}@Hlg|%XGDJdeE7Uj)`Yv-@w{hEKL|&M5#!0^-u;dys9}ywJVegMvL^#Xled5-x02Rl#ZyQjvt- z1umHspihkkVZK3n7?0o6y8N16sn9vp*xG-&~KXy0{5NE zn@7XzOIopkWeDnRjz+sv7c`>-iQ$v;{P$j~BzEM~k)A|7HVMwFSa0&@UbLejo=qY* z9MsRTsTL0w6B}<+JI)XNK1lK~Z#?4}E_Je%R_}7bB)(Ubi{FbgZ31wjCFABYPdv}F z(1P#JZc`JD4r8k`mb{D0CltBMs0}kG0*}fpg-yP^e|c`h|H%;w*Yo`Qvi5s_Tj

~B9R6)e-$4Ex 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

gV!_hxRf>WSmHeAt_!oyk^2!x&4}Ci8Z(PP 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 z zjw~WB-6dOO@Vi>>VsDtQ6T|m#o^qCYEM>FBc+T94Uvtm8b1xA=yn0A|*2Wn|;vwg@ zk*wJ~L$1mttjUACIRhHCTF&Ns?85qXUJd5sq_Y3zg%iUZvW%^%t7gYq{R0=m}99$(M$S)mC?tM7& zxx8pgZJa_KOwPE$mKr67y^PH!-c-Vl8TYOrlFYqlAC z#4YBBs;o<1ep)1|Jkp@`MQZx54H5;!z`{OoF4KClXuepB-c5-`TypCe-J;O-AoG-cSLvB2cVX%iqd6i=dkVQjnWDwJCvEY@!V8m$f7RtK_>6@vc*VK? zl@6;hV+MUaj1q9Cj=kJ(iQF*oA;TEgoZlUPGX(hue+EuSqHZ` z_Udiwi^Zzgcsa3OS3Qit&K$r#jzJF~=Y z=J(ry*A900NPHnE=s1EB?Xbn4T7v&w#L{{Wn8*9O{Wk@@9y()VPijVyJNb$;m%iMe zsWI)K+51o2sU&{=zx`m@u@rr;<=oF@oJVM@=o{a2rir21b5JVw^v?cq_e6 zu;v{{?8tI}@|@>O?HY%V!F7~pb$N%g2efYbQk3$}*|D5B^5di8I=MM3*_#v>ZV^Gm z23B3?v$&oi7BfGL{7J2$qHyts9(SENi=FVtMidO!VfIYc$+Q?-6-dwX1+3H3x{5)} zm$T2YckWwHI6dc|XRc_G|5k3N(IAQ#%6Hd%`L`u|Bk~yDzjBhtl|-VU0q4PaQ;G|> z1>vx-7Qbe;lA3LskHoK9v>1F+`ZUlJyR)e6zp^vVZg$4sL3>o4;|#K*rh6b*mCePxTXwbFnNFGsf9` z;9w==4E4#}I6IzSU%AX0cz6u!WRrIyay4g|#4&m|J}tUeB6s*O_ciL|iW{z4sBd$g zI(exGJ4OCdCF=P7(1;Pubr{!!T>2GW;)%14ddkG_7EcjpSLkql8UM_yLBesN4u?zW zbI`D@_4d$c^20K0cS2+OuZ zha(BtYqJ1n=G&v3XWr!85}cmuh{$TxgUv}HZ_EuNvei)6=#0ZlxbIK?w8zQT#b?Ri zEACUV?`~(Dsu#I#n8`Sw&>85(Pj~jI#5baIl&9v@&aWSXob1dfw_8-Oc!y24l%{!^-c`>)07NLd2GwPsxik{o~bKZS_BTYq8rVb5X@#kZ^2z?1P zDR~E2OsOl%d(-ojvyWVLnVjWEjt}pE34wXCHMx%E6Se5Ldy0JOZ2)~+=mmbOdGWg& z^xbySAwq6y2W)miiUgO+i=#dJ)cU+&4RHsgnI6;Zx*j>&w4(+qMo@| z&s4p^Ava8AoX`F=&})r6FqLuM9lA}4aq+_l#(BLIsHhFN-%QM1ZZKRq$)2va2l*|( z8!43?sBsuaALX^5#Rb;G@7EHGzjQ&En6Yk>iM2J_D_X7B(yx`Z_nMVLWk{dxn&iB# zPZWX7k@tr&p67kUuVuXF+0R~kX(_7j)ghhO)6rfd#DEkXzI|tYp5IwqW-WG_yuHrX z>WYjTyo>q%+&c6@_9FgV^|uBQ_Ojf!b2tj-YcVrIE1%H&L;YTh$Ig}HO=2#&c{+Mr ztT*kj#0^p8Gk@9BSK74A5%+E+ptLYs8u;1{4F@M8eeX-@W{w^9c1;Ab>SEGKd+LiP z;CMt!bUg0}Pu9|{>7TyZ#1nB__@1|mmtL2Jpz~4A1WmiiO(J5D+Ag3%-gq%3RsUL{ zUMu6g$lFlApos^p80XTd+ZC@UKLjw&4U&SCL5*2YG0t883|Cgx(4em8KhKoLN@5`M zWIXZwE1$*9GWtFc(>U7Wf;c}*i*)vYK}&WE&qG>td(K&*YPm3It-}V^aw`M0!qHEM ze?FU~%{)ce8Xew8k~h_OqLBA-&!#vY4IlLr{=qt2;O~n)*-G@DMxKK$ISOt@qDBDu z@2nTM9)2yKjgG;krsNKJpODX-4&_5|B^hglkZL*}iO zG>Rh(&uEeFpDg_-^n@4Bj98swcFU07sfJN_o@XU*&*vWem5TVYlW(fthqYf<#@YLd zpjMgLa$feO2$QXf#iYmB%?l9KBN%oTIV#}KJ_PRDIiFaTC--8_{F=FmTh8)T;@T0{0yyJ@^a~3QvYO z!sM?O_v>ydvcE%*DlhJgl-?@-S&eg zMI`4b#@WR5bX&!DVl&<)#71Hlig9zq>>vddy zbT|@gMv+rtBjlyr(O50Ca9=Lu*VE>s7IV|!!Fu`W8V@WpB=5xcs679t6Rsbmf6ypJ zepJ;SMpF_|!|AZx-oh3&wk4u{)m`#{HMS^QoQO8fw#rUd?NIqV>yW28a=S7IEbF4f zqmYgAM*8K1?4u`_V>)%=!VuRX28-zZy_6W&NbZ#WZ(Vn6dWLeY?QCLO^v-zGP?=fN z0bAnKxaDy|lu;vn=xTZ&cxQ;_;nYQI#yN+Tow&)f{7>glHN2M?)RlV)R`ez;F%nPM zcdv~k|GC<2*_(YtW1em2@a=L2v7kEaQ?8DUl??*5&{ZMVdFKFm4evDvGse9Blj4a# z=*gyu$NF@~;(na%cDzEIv!-#;*n)rjde-HGH<%`66VqEn|DI(JOruZ6;lLNxH({2h z6S+5EK9@fAgYt^zYz%?ROKNDhUs1essxJz|bhuYiQ|?F)ucfUL@OjP@c~giBrk_Z_ z7=vWlx~c<=of2_bwMAY-f0ML>i71#OvZ1&YNL@AZ zH@??55FvBCFlSyo1|%JpkM9n{v&qqT5N9cub9e0^_YeO!&I7_bi9K3ZdS9q9u&t1l z_U`CGZfkxwPr2SAU+la|Z~8^Yi=zry7n?E8KerV%khI`u#UtNR)Zdi6+>#>OL(cvIsc z|4AnWbxirpKHbln|ueckERVvkX^$%{?TmKWI5N2Y!f_LN?c2gWtQcqI=m68*Rvs|B&e`j>!Di!2 zJrKz_k6UuetVdgaq~9Sw*~(0MPV6C{_(tdT{?hWs%)`tZRWB`)-pwJ`FPU6%n_Njb zMJz6l7}1FmX?qJT%5D??Kk!%rF(Q-N?Bl9e!T{DDqsP$`ws{@Q<9#wPg}sSSOH9A1 zMI+{l##vp7J!uimx~=P#ei#zK-eehf`eKJ-ChM8zb@&XjhM+wgnrF#cNEdox1NWH6 z80qlBu?5ETj({n9ko@XDq`*Ug%2Ey$lFda=pl6<;el}5M2tMryePA^ zGhVz-#Ku>B>+Kkxvy zklXs@x!J>}{`hv5-ZbfU(#dY@Cq_}1%q>ki$=+A%&Kc6f9a8Cd?nfjNU)X*|IIm;QZ+a*E0v$eP~g>#VT1lT_9$K*o) zStAY9caF%$ZsZ@erUppuwx&NA=TToO)*CBYOfh{o+XGEX=!5Xi*DU{~2V9nO2lj0h z=|cm5JS$S;MR>Rr+=Bb2AkKeey>$8ocNScU=bIdpq@EgbQkaK(ypSBjHF(H4PnuF4 za}N+x;@qTv^Op3=;_SNtch+Y0`G0QUI7{*YR*uHt*2FniaUX4x6-pXtk@S{0QkQv{ z^P2VHR1LQGA@-KSzFugsg}8jeJI-ZBYw>(&B6_o@EaE$0-JAG3`CS`=ba=CsKG;Je zF|IE6N2W}}js3w`zB>UI|Fp%ArM{>;Gm+f=5^0ae90Yz$gz@3uX16Z7lIN9#0~4yt zi-$Q;Z!8HJwGYU?-i}CporHirRmFheft)*w=K zMV>e<9Pti3&rg>QpHoP!*0hRo9=^)b^s0>qmMUswm1@oOAIJ|$p$7hmdXh8aJSC6w z=7TBHlUme{Wqz()x>ss@joez|NVbh`ON;9Bj$@qHHLU`hnZ(eTH|kVthWQB^Ok@w3 zwy!rHZzUewgxGSUv1o9H*bg!Mom(BS^SlN>vgw1&9nD_*`SU;IW^fNACq{#F?!5EV znYh-5yGVC6@U~u#yIN|u^S*oeX*Jezo*>uM!5gcw$%6VVtc|trv+#3xBnI=}NPfn1 zQ7r_6J0#+D)O6$w^TWF9iFi1qKH_cWqJLr%npasMC0%yI+h)md{a8{I^w)`cjmZcJ zT_{Jram3Pf$=HASmAo+9g`Cr5?C4)dcv#Fqqj~fgZ#T||ACS$a|q4dGt87Ic3;N;#0@`)x+7^z9& z9C5$=z|#f2{ZcSx2NFppvl^I@B8?i_*D)%pJBwJ)~6OYW^} z#r%A?e4Ob_4-c5{C%NU>0xFI=od7mrR8yoHoG!2^X z0bQ;d3zx4odr;349?ry(&i0XFc@LVhmJZI{CRHzEj0f@Vn{h|-*g%}vmU#Ze8su+s ze#E-Y?PW(SAO>%=opo*Hk19!fhVF{mxJ16)?_s{$%39MRH;C zx%0k!1J-bk9mU!725B$W508f#>*V`=^r%G4Pid>gP4z{{hUC|r(qhcZ+w={i-bscI zNA5gCnGb!<$rZlTAqQzHc@-ZGdf}Nb^Kh#L+?84{<^Oa*p4$RgZC_|MbqzJ2w=RH>?KHEV$35}v z+XA##r<>(03_$z7saU65TYTYL7;5|?zO#SX|NErBkSq2n`CFTqo+eJXf;GnZY8%Zi zwerLuOL7RT2T2Jn{Lz7$8wTt1q{z26)`45U*J zOgc+m196pxzb4?xf1H!tAg|1S9`-TM9B34e_2Xf&3BrNIj0+*`#!o`rWoqYlND|47LQpwZZNq<*2 zg!Wm04!-Q2jyj>KQ5uqJbws(5118y};nuk|l1o1a?6Xb7EXM<8YcwwCcXI)*TSdx6 z^HkDo1rX>XO-=8Dm(o7=ZU3a$ZZ zZ!2;7%lz|40+7oZ`4Dq!J0+ERIh^5I5sM32i__hifB2k|x9`C$_KPi=lJhh9I5v}0 z)@g|b2anx=qZfI9y*L}tlp*9QH8r1dPB-xvc-PlZW%qGDk|I;Eqtz!&xa@`2g{fHI`#Q|8xFYK10<^BN z8=(sv@%_Iv&MZREy}lh*{78e*uV2#Q^)~RHo<<*&x@J2U+9BvjDk9Af$K!5q7i7-`vbXk%Ef zonfD%a7TOwdEZsZL%o=W%bln(U_n3hJ{vf9=C0*t>RMYKz(#UJ7uM3CTDQ|EKTRE= zRBDDazlVB$)RXJVc~xOKo(uZTG0rxxtEeo<8((pjcwdW}Di`*Ev+pLL!@T+`5ALQV zG*80ag^g6RNbGur4{46A%9nafz|`F7ZQK&yUc9iWKRt3LLH^r{iP^VYI~Zg zF~54Aw4QMu*@d;S?K7!5G0DZmNR5o@VIyNcelGWJp7q9#aK@SQ?r*oI;xcFA4-{fO zuc#;5g+KpJe4}X^db}jg1m=iS>(MGD4%@Qmkv#VRYS!mo*AMFFl%GcOTk1=(-Z=mF zJ{A+p9p9L9>akyNHlNyxoT+ShR#nwBD1v-i9d~2vs-CO~#fN7JI5ec0YQS)6eGEy0 z)V_@>s*@j_@{`fMMmyC6>v?D}JQc=vtyQXy9tbN~fN$fQs8)Y+!rK8z4 z-zNikCGWB1niV2GWWYG05GJ2y!NV~F?w6zC8*YV|+i8sXdMW3H0~Qn|Z##f9=M))aWPOKrGK3t7j4&-!1@O{{{2Yd5bv$J-2pL`Mn=hG8)Hglalc~(!U z3H_11(1%Z0*Dwlp#IiSAR8whBg(EOehk3W^t1f&9!OzkJa_(BGN~qH{%RC8CI;)0< z`(i(9HuJz9DyNLO=op!b8+N@^QQh1j)lY-Z>K>{``HtwYHXW4;I;%RIv%%Mw8OT1> zOqFwz{s=*t*wNfj^?BzEto)UMQF|}r=!couluAz1B}-HpXa{{{G76Fp%bRz3qC=G^ zbbNcH=+iX%OlMczn=q;DP_#Xqy|zXTSKk1$^X_f4nRz3Z{3+t4 zqxe2-Z$VAQW?D3<%RBPTLi97D2E#1!5@WNm?gKrh_OiF1as+RWX)v90zyY%^q9*$t zg8~f>XFcN#mGk@A5<^bb8%>bVivusM}_kpon(oXG7Tm4<{jgH>wkw^Z4kjwwq9t8RWEF0?%ZuC@EA zW**?|<6#C`b~jNO9dO3ZPu9zj%3&0k}*>aS%)H8{E z+Gf-q9J5fWJ(;uD!Q3;|Dl8wFN zUvxPewJo?4$=aj#_(S+LTZ`EZSZ|n|#SwmX8<~J(s~%uKv5~YhiP&E7h3^sn&9%uW z&8(_=KApIAQYyyB)KP6S<~=?q4M(OoR^{2o;{NY+G@0I9H90r}`Y#z6a;}9+HVDRo z9+{XP+ESGm;RpTW4D8?1Ottj>e2hPkj))mGRYL}m_q!?;yP0cFc?O|7>(`{TV$&X9 zyz$JaVw}xO8Wmr6cSnE5+3egvQ=_XMIBBGYYObHzXd8e0A5~u&7uENDZFgWdqGDlp zz|6801qmgU?(UqRK?PB<6Hzg+J7Dg)2zFp#cVJ+5>$AT9=gp6IBOe@Q_T6Wn9c!<( zvQ+|}U8$*@uHby5Df<{#1}XpQv8JcrY%X_Ij+o8f-B{x5lIAM!vfpFHI`O^rCS}}B zp7kW=(m!QoHs>JcS-)g0eV{z8pMtyxoUL@LhMRqfV`tBQ;__x#Mce8#7rC!6ge~_F zUvQq{IAA2c+NIzsXM!KI%+WO@1$eM&i= zT1hT>VxUVlnZNb?kGr6U za;OV2r4#r&U&boqS&x+X^LbTsQ6{iPabCe5;2(`L=q_`RYuvBTUZ70jeYmt6bDD{H z$|Hu!u%w^AAAdl(#3mW%*pvOf?XSE-hrj$53M&DLBtTi>*fRNg{rJ+&tV&9EUlqJFOaKp;wv*_An=P8ZjSl z*#~HSP6cc2d{|A|iaYsH`1>FW+y9=$pMGJ)z-OZMnp>z-Hw<@LaX0bS98_1vBG@JY z4NdDSoa$?_cDY}bxN&QrM%T-376!2fluD}U4&0gz?Q!xYx@|1l^v#oXm=<-e&Mxv@ z6@xS55|F!ga?u!dJhrlyDL6N_D0id^p3JxFj~QR&`%8r!Bw*?m)1s}JY8)GrfXwn4 zMID-Iu-c5eAzww}<&h z<*XG&qZ_d&Gn08s_xz%yH0}oOaEF!8#`JDjuEX9L$LzeQ@dtc6*}RokeYK;&XOYuPr(Bp_c2# z|FmV>OZBCAR6k8UwbcWqbyMjl{Q0+=Q>28$D(>Y`f3w708cYs>b+xEV<*Jp;R;rOY zmRR>4^Ch{32FfjbUfFA;;pDO%(3y8`>UQZ|Q}QnnYdypFsMI-&oFepp;dFxB2-Hsb zzLxPD@Gk%w(G z=GVx;io~T#6?vEgdQew-NPjec5rBU@7t`<0LAaA2E?*|rWLG}UTa&+>z2-Y912k0CVs7d2QiAP7QI80s6E~&bS)!b3+PHuC* z8@jSJkr-Zw{?@&r^yWzn)-i^EuIw!>+Z7ADms+@nPLmEK$Dzkn?rRi;NI!eT}(id`YwK}Oq<;4rqs`1>pd%?e@eI^awOg)Ou z)NMDcCi=DIPOFAFr)y);C5`)!HR;bc+lyO2SsVHgdz0H!%p~W-h7at`x(^Yy{F}FT za1PP>KkguEn*CQ-8jlqD3pGeg=DzNUp2B;I3NyTkLrttHCYQ(Hd#^OqS(YJv{vM8u z^=Xh-?pDlE2O(uK@pbe6DZ4Wdv8s`V1-sm^zrcsQSi~b~GtrJ1rzasA7@JPT&M5MP zb7x@i^SX*H=hb-n!>Nit-&?(0=dWn7=rCpuzTkrrn&w&@E0a;LzTzJ0Q} zw1aluSCjjmS0D|28UuU!UL)@S>HHqy%6)m>R(jqdH93NA( zqWu94Y7=wrT@X*cL>0Bo*$-^vE-oI3h0K}Pw%}o6XHq0w>!xB$!ga~uUog%YGqzu8 ztuwIUzI>}xoNg+VQ&YWAkxmSf?P!z)5l8fjdvN;#a9=+Fm)6IVw_y~d84)n(=7+BX zsw)mrXTW>KtSWXsRd77V26hIg&ewdR2yJbvJ&x!6t~>@n42Y%~q3J zyE=2f^Fh*j`t#&})SeiaBh90o%kJ=d=Ixd$=EUJV|L?S3WzzP3r0J5kK1Ki_|@#mx9w;y3jP zD~B@X?+g>|iH9lMngBiWZ2MeeZ12VRTP<4{eW1=&F6Rq*%f!A?>Rk*X#wK8;*y625 zW(oI;t(FLvBXJlrp8EhdQbn~RQP@_H%)NYT;hP-_?K|Roul|+BM*1W97x(`if9dQd zdZ8s}z9A>lm8(a)W2OstTWp$Oevt<*@R^znP@+|$KXwg@g=J0;%xx0^!+t(+>G{s& zQVnVjP!HgL^JkTHuI{|013tPXpiirHy15CCka(7@x<1o={NjdP_8VGL(6@JWT%)c{S=+3L~klfBjCFbHc<3{f-T3ou|B@(D1R(63}$v3p3sFMae zT9B{vQ>M5XNPI*B?~$w(qBS)ZHaBK%S#Oi@FCq^*>!Xq-+r^G+YV>36xg=$~c**;E z9P82(E*r(@Ix!fxhPs*Wv&DulVK`aN9k57eVbUNFFF1$G`qoIa?CFiQzqr4A(Og=@ zxnaAHNtkf;hvNG|7v#in7pdnSWs>X;-Bt4RRy4(Y&I_E$QQMPw>8YFH&@1r5hxqFz zv(~DxL1SOV&NEW;bYE>85bDYA(r}xuBA)n=b6O0@{iCaV?FRi=a$-*ikd9nlkNR8vyU$m(4Ly}tLawoBj+~dBE~y@_iL-9{cf4Lq4!hT9wvCCq2^+1I+KJ1Sb)sgTKB(RtEg(QOPldCEA0 z$Sx2Mh|!(!iN7;HM?5$aguuW5;iW-(Z6V}#QEu9|dj5Nxe-Vx_WSm^f6ePvR;C9$}2hTQL_Kcr=WarnU4d*n)U@v{y4X$xqdSw`ZeE*?i!oRtn6 zFBZ|CTk(uci*XXuud6Vc{kYusu|n;jMqMp+W{c;EzLFa68CzEK?04@-%?jr5D~4_r zy=H0PF^q9z)*(^fj#`n2s4+cRh`S%CW6+9x$WxCC=a@Jck0zHvZlTyeBno+!^z)tD zMeVa8u%F7F`I{V3J&8DeGtMTwg2eX?9=O3dMXNRa#k*C`Xt_TTozL8rLWa-6oCEBM zb@q`GtY^WZE%^zHMidRKbcX$E6^2`#R6gD2iB06vH7~AI4*n2|qnYk7nzP7c@#T1G zgWFcIbK}Adx>?g5kmr{G?~fcyV~Y zkYLG-rbc>WyRue3H9C5YKfn|aY)!mf3DS0)Zxzc&~*NsTvg*lJjRBSYpjQb zXyvLxZ}Rh7JoOj5o~V%MOs%Mj6k*7HKM#NM^FPfIPssuCDV2PeUK_*&=3q&MoSod< zD~?z&hO{I{_dZGZ=Bx2LfUomU2xP^>EjIz1I-U^4zu4z5V9z|ZP{=pK5X8Bg_wsEb zZf^iw$j$L?-4YSH$P3fg5?6m(C6={x#le=u#4epGeB)-p!-jeJtB#@-`SUMY@m#!p zDJ?nUfE`Gn&Y+)E;N*nLmht#@$z54K!~<{c2gBj(Ze`DcP(0DOarSIsQVIN$=;zLMc%n&9i~n<{yXpYv_|#x{Byd@!Vb2V(4ZQ(f>3#)oI(s@9f0;U~I5O{7#L8 zSJWrEe_WhfPAwYNFcnWviXs(t!$c<$xbOtjVk^P9iWY$jdJ>-Vl*;=&C%8~53QxnNJxpZE!bnr+FBA#mD znD<6nkr|7PN2q7&&_qlPi$mcOYIr&J6sLF(K8RqC=KNT3@OnIMI%v`U7&+NeRn)1| z!ljK$+=rO1Ox8OakBKf;YK+@S z4X=hJVyZzrR`Ho`8dWMLvM)N0z0?jhB++XT{ffEuz=ivT;V6G>I!Wy(mjdxV-4m|A zHAr8TCmPjr!BFNu4V$kN;T;^=`%1vp%ZtR?3$|!ghd8Uv^Td|THn>jA+gGO;k+Ihn zdoncW@N0l*^T`1V<6_V}eww8H?22yZ0%86*Lve00XV%AD(W&2b1uYbE=jW9i)ZK%Zq5Yjm?%ye?6$_{E3CvFXbdJk)WTu* z2kA6%^3r8e~u6bBx|4%BY{&#)r@M%Te);F{jaNEqdh$ zF{fQD)Q0TW%$7u#b`jWAM898rSj4>wMACTPm)d>eSA8EG7^^{1+HNr=(T&>Nd}b4N ziOLDHu`8Z+LHI85vE1(eaxIqwyTzwhGf}-pBF^dU6tT~#VwOrh-mRjp9(m zyKSsrnD~K+w5G+RWoW&hzkiRV1BLrf2M z#O3E|s3H#tW9oOWx~jnqtxn|6o&f``7P^7Q#iw*@tn5S|n0`#GeKQ07c=tURv{J+` zu*0&u)D%BCOmw^Mf(LGaNcgIeZcy(mtG^p=H5+A;!`+QPJ*&p&f%V;W+rHUj3+>$L zO|s7Dg##wi&Nq8p()GIHiXHP9pWP-)Cd?0eGVZC?q)6#Cqj8yawEnC->EB%H9mFv2 zbuX6AbmI(RG__6+Kas2##6a-;o*i6EjQtY>g^u$l(MI_B$C6KiwMR~0(O_RJzD=c` zscxJw|4m+f=E^PX9EG}P9Nd4XF|lccxYIcfwlCEJVOU+l7Q#AKe6 zY26QqC4X(Ooc$~_(^BeO%s~Do=2XAR#3es#B=HIPP_Ut5Fd88)y@yIM(P%Svd3}S`Apb!UDpQ= z7)3j8&fcIKQs~M(FLGrz>mZHT5suk6cn@BhCY`+$#oaRMik z0>mcbf((g?t?w8iuAcTs1?}v&I#K+%;fW!;S=%ROiS9F8;7xzNWwKTT>pNogdo_l? z+$-jCJ{A9-y%OzdF{=IytS{AK#-iJzY>YK(Q4{B|?E{gtWdi^o z__{MkG!JpX(kDT9<62z=><&i1_3jwbWrL!Dc^n3HshU5VIyBR5e`k*yw6pz^4!Vr% z4ltsfpHB$a+2y;kKgitpMul#1ayYhLqjuQKR#Lb1>J{r7Ka-I-_4%?{xv|+n6dQA)-_%T;|QzAXN7=x+2=QjJ_ zm;7omZy_e5JnWaWp0Ri4IW@YxYb;ji#Zs4Ejn=D6! zyJowDI)QV*?~G%U&Wf>TtWp1-7JoWE7IHo6nezN%)oal!YzA!ZF^@cbPqb=lhn@Tm zZcPh>MKc$~k{>gwRcE2y6oe~%JdnEjnqrzQv366d+Ii*FTSY%!*`tznz7%q&$mya3 zI?~SJdA)S2h=Y31yzc#}b-JI9;b>aUylC2aT{*c2+wP%W)$OmkH{{GY96*lL`^~8z z8V&2-T0BYXD_vM0jgdT$FOsK7dT$wLay6*`)myqwKX2}=!IqJ!Qg6;6_IK3a&C_Ml zc+S?cD>!p~N?yL@G0>;>+)I~I$ud0#8`kkVKDaM+*dC3K$&4G9eoB3m)Pu8Np4Ygs z_%|RFsmxuz`F0kk^Za2*I~&v;Ep}#jLQPJnIyYU#?WfN8-j4Z=;XGlm-T@J`v*Des zB5#llF8rnT`r|X=d#p8vvi>SO`b_LTZiSERv5wPz6;kgRNb09Se99YB zD~aWK&e+~91hYFbcbyc7V(xK`7#P){SQ6b zd2qKYMSs<<2%??O%Hwt8hY_=VMaz0PQfD%W8gR_7_KjVn%i0u$3BHVDUAF74wWMyE zA^B1poz{ihM`O`F_H@R*&}FZVMoaQe9<5eKx_v(y4QG%GW=wnO`fu8;3ANQO4wCFT z#^8Fn8f!Amr9mBH(0PNJIHFK#Bk@J`dEZr3WJ#|^k)MaL;+cB0H2PTtT%g9tt?Vs- zqVC2&_N2l-NrqZ~EGGUS(Yu|PW8q1D3l%D!O%$irI776dc3#Uwan0NTJwB_^IA?=! zyD<~vYilt(=9Jjn-WtQ%D@%-cAzp=8K^PIMT=82xE4M}g`=4JI{tz}^w&*)A7VB=8 zi9cDxCt z^WJRURkyfBG)!-3aKEjwZZTu{pKQj8&Gx!oY0;cVYfx*lMyFXtUPR^+Llc(iKJ1Rh z@DsdibO&{3H%7yIff_r;Kh|~BM&n1Q8n*TIq`{}6u!i;d`XYtooF0MG{ne$8{IsYEQ=V})O=eZ1YDi@}Ypuz1RUdG$XrK7@RQoA_N`Rg-JKw!!Czv8aFf zp7<8zgnDoL%lqe2@pmI_x(#_!|b_5moJ+`ysyY)Ea5eNKz z!W_7kabaHvSESR4 z2WL$O)-0aOjK5!wLe^#8gCAw%ozB?i7j4F;+Orx$`jxa{I5h#2EJEYc~8RM*Om34~M+j)oaQYE;iH& zi9>GXb5XKpHlCY@Vsvb}D0lV7rOO^@yH?iO=m+DOW7Yh*&(p@n)gIVmIPE;Up|>%J zYx+Su$KFgfu5RiIL)!V`#h1oE%EGYqB5UXN-X<-tM54}C=5PPDn*689=;ES9R*(B8 z0|Us**M>Ra)cOj$CDgb)uR-r~T@{(fq7X$bjUR5tiph_nFlx94oiTt zhdL{oRz#sQ`=Je5xGC&Q7?*<7xYxr>VVe=fyoR$DZF9v&YVFk-qQ>(_?Trr}3dh98 zYMjW9&=paWal$PXYIt>(4({_q?>rR@udJ22`g$O7sR|{#YY5wHCmgS*#=_)@Vt0Rg z6f>`Lm@rScZdCh-WP`D7qkd6-(g})UD5E(S~SjhXENz^Bq~{> z_1V`>Q8qFP{aR|#w}y$r$}tKttW9h~oE7h4sDBsF9=&g(qHrm>6Z&hg%5$Nj$$}`< zX8zV|=32$v^eCKJ!&u>!uXyG_n=_ZFS+YT~s6`YkN2=lVEnCssClW^7ozA!Hso24J z+{520++3Jmbe4Dio3kn$%Y34HIGy{&wC%E=$8!C920=>*(%^>)oi!R>J<8(*#Aps3`bHvR^#JLt#5TihQgZ*#AjT zTv0|*UzqjXhD^n(zEL=}hCgE^F+nL+u>PwPMFp3*4eVS3W;347yt&h&{~rs~(BXsg{`Z zTmwtJkHYi74D7Xx1HL~IH-edmr-vf1JGH;_-SElO1BVtYll-~EvP-Y3orfL?HQ9W_ z94(pN>7{5hRI76 zmaJ_n;^iBLqg4;LAyT=DFZJAC8%N$(0hu&cXu6@M-pG0$Wh zxg2w7=VZMt#w*u4Fo&ha=(Y61`z>6dM>`L#nOXGEI}Gh;XYJkmqJ#F45S&T9C_PqG zm=K9hcGTM~FE7eH6p6xyj3MrE*F@q?^Oz$2rG>Hp~2r(k;3`Jbi}g18t=MPxcoGS&Nu<bwl6n0c~mL-$PQ1R@QgL^ECGD?FZ``S%)FJ*87Ek3^HB)DGV9LN|Nqe_Y?3TW_r+ZCDhEmz=FW zxz%2JL#%Rb;;Y1{LDI<4)HIA$<4o_VQuimEX%1B**27ym7#M-Mb$It(PL?_o3wnz_ zSy(Gaa#x08U$F`eve!!ktOId7i}vifTY7cXoBJ^;?Cx<~((`h~;F*jqcOFU;Irr4N zt-?>|I^s(`8w|h5eCBjlF)7OuuW09ST_*_Xl{vQ5AQor6mk8-*j_=GpurWc@51x*$ zM%<-pog%t?v%-u9u`v4TCVm+@V9~;0wDJ+UOUxPEid{J)Q{&_~@)+k>RI#&HYiGrH z151o09%(@bjY(hTknN7M-yYDkX!s^ucupWrXosUNw3ja|gV}FiwpI83O%T4%Anqmi zx~?m^eaaZ$tdG``;v0k_iawlp+CWAwsnnkwT0Lpcrtw#$+V{gy(N~2o z6*r`ZeS;A*B_7@0Uy%;+?pr%P4jKKgNMfcJvhrh5;&)vde#Q-T*&o*=+?SG+&KUDP z7Dp71q+m}66cn;o_3xfk_MA9d_HY}vx*~bCutcj!?jN?5q%kTpthyYBw7=`5{P=13 zG&=^nJ4}>pN1NktDs|Ti_AAcJwT9y_Kco)|g~J$U?DL<6F2R~H{<+a`Ici$P&gGL` z6;J*AXn|!JMl31-bT2d^TVefaX9PSQfw&k##zoDCjVl<Fnp7OY?HuaF+>WGzgaS2sN<8ODU7##iciO)i&| z1Hv%-k_KOzewF$>4nvRK>>GqM7BdpUVZ20xeRH}9YihH~8qPkVM+ljG8ao+(ng>~k zDB5`idwr)D`w1Jy|EOU8PPHU4N)?H#Zp>%u%@ga@5g0l^1JlFv#nRL;EGt!`yE;>N zy`tt?4>k1jGQ~Gd5ZW;hywY)@80-~7S~+eVp7pldJOA z-6-%^EdD+n8_9w4F{;Ek@0ulMF^9BHudS5Dy z9b?O+HvZCl&LK~3;f(V70%;!agh8CW)~vo$lBlCPdnPe61?Qy~BSK+4m>AH;@1&ET zLeZ)fF&jf0h*R5H%X4NoNTV-OEy5AZK5E|Fp`yX3a9BT}7GtWJaN*v6^}8Ah=aP9!>-C}+BFlq~EkpFy_nDQ?Kj+T6OF1v-xq7W!Nc-GttL<^%3{9wMP{IgJ0 z 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

}eE-iKD~_jy&a;UXI5PiNPb)w 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Ž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 YbY+DI?4Hulusnv;L>_2_<~rJ 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

K}fA>0j5>X_sebnSL~0g*JcSwmqayk)A2w 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 literal 0 HcmV?d00001 From 911cc85ffc8ad695eb29c691a27ebd0bab1930c3 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Sun, 13 Oct 2019 18:51:27 +0200 Subject: [PATCH 074/208] Added Panasonic DMC-GX7 dual-illuminant DCP, closes #5500 --- rtdata/dcpprofiles/Panasonic DMC-GX7.dcp | Bin 0 -> 1102966 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 rtdata/dcpprofiles/Panasonic DMC-GX7.dcp diff --git a/rtdata/dcpprofiles/Panasonic DMC-GX7.dcp b/rtdata/dcpprofiles/Panasonic DMC-GX7.dcp new file mode 100644 index 0000000000000000000000000000000000000000..25f4e6eab79cc780bc78f93048758c2f28f2ec8d GIT binary patch literal 1102966 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�ge?N_mBK*O5eCDE$}_*hAr*HO4{9>Sx$4qm)qodU)7(@cugJ<+Ba@`D(tthE1WMG z;m8IxW~NMk{+4{=m&whd>q7OEF;+dA$l`OHVL-xrm9G&CSU9O;Y?Q69M0tB-hWwz9VDjjx;_>#x;BDcc}u-0W8wpT8Oc`M zGQ!Be7MR;OnuUy@dQ009s_VwGy~X-)X|P1g!0~K=BXMhpt#G1c5X-qln#SK<*SU@l zWGYi=c1K)=*h9+fR5#KI&!qcRVK5uH&Idg+MYy0pl8vE^;N?5?vFr9k)=G1ySFiM; z)I5hh+3F4Ba|XDqpw1>v_C`PI(P<4@&%}SdV04wv(91j7t|wkt-byu#_z*Lop5CXk zM$o7{MZRpBlfNd-W#$D|PF`;l%1PH&xxxmictTQXjKhbovRy}sL#1hg($iPj4iWic z^G&d<=?Z&EGa0?zrc~EmVJV}Xkw`kuAj8YdvDN`+Xq~4#yTmdBhNXN4o3Rhtd2l=n9+t+WD~<)Y}=#{Q^kEuy=MR{YxUt2 zbezdl_~S73WM_=J#C9b4BdEy$I}2_zIWK?QxIk=1C4Dwt@a8RLh64g3ACAFQh>TVawNTjl8s>#ZjEJJO!%M|fjj zE%Clm>{-VYPfWT%EWybREXvaj2{M$!a@T>4A3@$_>c0(q>P_t16=KX4JF@&|R(M?`MtOxJiz05%7X#_WW02=!?V;6z?0SNRYmoiRl24{KKZH<)}yhUm*2n9QeO;@TQP zd$0?0$Pb1h)m=4v-C4b5FeV%~#y15oW;mNzrqAh}q2R+ZDT~UJ&J6>~P%fY05BmM z$KZnv^-K>Mu^k>!cs-WZw!x5qh-i0YbsHlvgLJ>$id@-Fnm@mz{#)pN zPnNbb0v~9d`xyH$P5N)IoHRz?fBe}}X*h1bq3oN{fo%A2%HY0FbI`OPraCPMr$?J2 zbV>-jvB)1eRKK+7hO$~s>USL^=5l5j3%u)zo1JD*?-{|0GKjrK{WSTtk*sNm3--|a zd5vil`(*5hiv`30&5CAPN>uM3wZNl}7&bA+2J)28`+>5>dl27doH_9>H^;Nxi!Gow zl6Y!o6WA_Qb1b4h;H|rfZ15;k*eq#cRvmI=2QJ1SjI=u|%3PSlH3m0NQWoR{ z52pVx2CL}Y7&FhC$vvhlD!KqqtYx=>b}Fsdp3?#^kBrB`Trp-FXqL*BCbx(OZA% z<4ERp%^9B*E%4`TH2d_*0k>)I%Jzw65vS~k2|=?<|2S4bGvv#Z!L(sk0(+ZgNf~Wc zh>c8S^UcK2?O_f7QOT@`_zf{`*7)Tc|KB|NQ^fVy+Z4@yxYKOsLDzLwqjU1HN(#Jgf6X{|G6YHt&%zb!)F$3`sacLEMB)W^H!#%#~21nPuOVFS{5_x(^SkSxo(ye6TOFSJU11#-B}-cwr}<6>`S|nI>uYCp(LwGe4M( znc<4{i|Bk98_EO&>Va2M4om-Vwy4b>epkuI_cemK>e!;QAN8;EquAAv_kHS;TohvrYx>X_QHhgvakBX)7YA$wNe8UcM`EnXeu$ZGvV zF`PU(@o`Sf`$`a;9L=D&)`eBd*Ex#WZc3r zX_gtpw@lfyogw($MjYLh=B#8&AiAf~yF$@|B@OnYJ^^Ls)>yLL!>O0P#R4fI)+}kh z2joXuqU4S(OFZQY*Cx8}Hrlhr#Mg~WrF(4z@qY$6V5-IcQFYc~QEpopx5W-@5xY?_ zQBmG)i{0Idomd#i&^${Y0rQ=q ztuSDt^BmEz)&;RGMeJ`*x&wVSo=Yv*-<J`7;q_PX7plySGqQYz)7=x0wI15P#xL&{uc`SH~MDaxulr4KL~LoQLm* zX6Tvp5?ax@*nEJ_*gkLYy$j`v(lhzg=RNj)%%S?zoOACt4BMKE@X=P-pxTnH9+n4> zf!0v&Xv=2y$U$ir%Es01z>JAev;LP2mi_3=HWF7O~BtbC^6Hw-(JD~=A^HB?E?LsJJ{cxbeqSnxR|ht{mn`DR&{Px zXVotUsc$GFjhP5hu?O&z7yvzMjnSmsi}vG+5K?FYw}Rc+<5_@w(y6Cx-3_gPe9ZJW z!@E0s@N8xt`LNBQYIy+1cji)WZ9#c9N71`qE<%WvaJcp?o}9>~IR)+X1tYBAn1>BC z_sK3aN4Q=NBG=R0l6r;{3IV+**`j>{v5QhN;M9&-;>4iq{UikgsLrAt?&v-w5%(hO zVJ7u~KQRhk5+k@vavKsr=p31Ur>~Bu`Rp;h)7UeI_QXN~4*Iz`m zCmNTvr{NAZzBWe8%YIpV&)>p6>aRzrcFf9)EX4D>rdX)=IrFi>4P?=IE8S9&*|{_i z`I*#f42;ig%FIQVL<{mj*=6SI()kc=iB->ZGl$vaLL6;{Th$*kCP?$}G0_^|b@Vdk zW#z!ZnfN#c3uYON;5fJ47I9wJ=6n@pg7qbS`{(v^ht;H_q{t3iX6=~!dvX$DuiE2R zyw}{(*Wxghdft%u^0|ldqj0@QjIP@{=yd2Cjz=dXNEVONF}e_pA)RQaGI*8F?^pi# z5+KFZ*t0t4$xB$N?SK#G?RC60J<<1$1Kwx&>cqBm!|%P6fnu4Y^WnV{^4~dPdF)M{ zN3G@XF_J;HZaV(vq&xSaxtN$Z;PgD(M$-RAdf~r0>Hd^&QG8pDzd7l(;^yZ@@Vszk z*rN*g{t;oav7d5`9{KHl8l!f&hf+bl0gbQp?z`)xJeGG8(}+1!tL3P)+F1bk8`9{^ z5i4~}^P&BcbSyt@l#}P?L7VcedMd4yyFGGI`-=X1ovf70v+3uLG=E64R;o4TLDt3w zD@NEWz24{G{1Y3PsW>QmrE|)OvPG&`t{iYR3%ifo;X+$yW&BXeBqct(R!6j>J38lYPP!xUl>hr4 zT#!9f80K~l8`~30Sw2Ac(pZLPok*wAueZ=g^$t{Muie6=yD;-b5h8k+p@nZ}!C`YD z1ezy@UFaZS(+$k0cVFD7_CniNd00aGzT)p~g{E%a4$U@YMt#+*JGe?;JK3K4R)Bgaj>9uD+4aHd#EWM zDtOLIh20u4CY&E8m@iGlWzsq>XdEic91{zpP|CP;93o8W7D;m$DL$pC3${H%(ez3R zRZ}%#;>WIZ_`wGK;lP8ZdeJn5b5*lev@^m>d3ygaR!U1RO zs*z#orLIEzwQ^(~mt%`Xqw;Sa{l~Tnh~*K=zd7ldo(eR5I->lWlWsND2_uSKm4EBJ zwq5f&KTbSNV1;U`Cq2XBgMvh_95V-+U{~NSL3FqTUq_mvzVjAgkyt`J7fApaEYn9|GE z2};)+kO$E&@4-&NG$jwmY4%&#`iRhDM-C>Ppqz%u`a(wq#}*LNHr7Dk%d;?0MU1+t zE5g*xX&9DA{v7A4fiI0 z!>{cHL4A85TB#FnVeVPMKu%u&O!`^-wDA3#C*E%(=4$s7!hRb!xO|df=gv_uzjy>085_ z*V%HiuTc8qJ~F5`@pW($Zal7lc$^8o?o|l(Ii>hH#}r;_4#Lgdw=td=O3HA1q0X-e zTKh;(ILcPIZ(E2(7cH>8z*?vuMSL;|^%TFY1r^y1Bt}?akjzeK-@gD4X$L9RmI-aT zk>~7(4eot%6Ml9oz#Y0*(49+&Swine+R-k3799se{<4PPBwoJ zhHbqmBnQ{vG|emV&5X`or47<6N z!sgcj_&i&ND9dtTWmjKBJd@#3Oqp<(a&W>)XJ&D|L>OK}8sIq!+{(W#bg*>7Y0|y- z$hjqG(DUv>_YdP(F8s|&e>aJ=DZ`@w)p^JRXPi{=6#nLtq2Xo^lrLUD+JPA<=PC=tj>8R6d2Lni1Y!P>plva z6UkQ^WDD;hzl4`1@Mvn}sRuYkF8BnVNq z<-G@`L#rd@Fc!DvEf*$XTq)%Xo3!Prl2~+7P@dh#HvDymNXXVZ;+j?)-hpPh>$}RZ zcx!9E#3cafxx`!8--@@4^uZ{~ZhWz`B{%=zfd}I$2Ww>uE;&M6;rqn>Klxkm?CgZT zR!%UR^HbmVmpbCI7$dAxXYO$1J`%T>px2%DT;8)15);yNCAHy2ab@@#VTPvLt#~O) zU|402i~Cyf3FIX$=wJ!$C#`vy^=;&UavU1k^XoBpaLthNl4f+}pU0G;___@)dG_L; zzL#Ms@rD|1_TyLY-$oU&fOR4Va*eNrP=92PFP8@Kw*|R)kW0IXlj_{vTEGe)3DUVb zAG|FcZ_m=%>!r>`Ym!hq&jALb)VV47@;`QTgwyFkJhn1|SP_m$7pw8gQz2;OAj1Ru zf!vH(nvJxZ^u0KMe<2S_X$RuAukX*ZOg+#eTY>YV`tcs`Tu^(_32Q#};a%(%I6mGP z6R!8>B^yZZM9=NJaLPWQ=ea=af`slW|MI(sETz1?Ge3mCIq71`C34Db{VylIqfc}G zvq$6@uI14H`{~Bimkr~2O%E{gunFdS4kB&OJ-j2$K#kD=Ucapzkws>xYtx^f8drwC ztt_z8zCW)SQA#3LIqTM*k`Pb%q0e?`@$Aj9D7)r}Ef;3+BKHW~)0JVx;pyB*Jp{9Q$k7(l z_|{r~Y$vT`LhGq~HnB^kPE_a2$$Vf352$Z+!q_vKJm!Q8SPy67s7&JVtrQq{(-~hX zCh%`L4(Md+0xPiwH;Sd4v$hNJF3gP3>QPciRo*1^xHW z|8)h!v>4xr$5=pGf^}VI@q<@u;Yk`YjfvCvtf|#FPI`#^g_F6#uu8bUqWPP-ChwzL zj((&m3fwz|AI!N+-!n`6ny$rrN0lQsm1gf!9UhiniKpaQTHvvm-ydI%?0uvUIJtt4 zh$SDrlO0-StmYSpSvY|*pqC}C`Nn^KaAh8{$#$p%s6f=LV=52RUPItBpt1?&dZ4pS@6$s5ZJ-zr8i;xKUHe~7dRCwtOiyb5%SmrK;tq{2TL1F9SG93( zR_9k6ws2P8i0=!HvDkbK-`k}Q>Xs&?9bL}nJh+cm1vF3Yqs!-aszP>WbJ95Ja!2<{ zT-;y*oo6ff75_?%@Uz4|$Mw9UY8ASCp?rujJ9z2l`d6Ve>8yx7!IOsA1uy(`L!JGf(ch|3W$E`oh{^fTc8Q_7qnzejhOG}K5 zZC>XgZO-tWCQlK&!Wi@X4s(xydIUR};78_u?(AHHxH`JmwcW=L^tq40r@H#GfnhWf)Rd{8!>A4M*BH1#qcxrpW*F0L3U zH{hMW6C+|D?Rr~Y0UUL^rcxuC)N6_qOt1Apz+HiA!N5qo`#eBFm z&)Fz}4tc=TS6T7RT6S1?(;a2TmfUlpHD0@T!05d3znt`;r^uVR+JsMeLYXqw&FgH? z&w<-S-G{>>^81+B@jlxtaFg`pC+FGlHLpr>p0cFR_OamudzT=uCuO6zw4>+e4w8ux zom(#9i^v=68fA%VHFEChQHK6)tueCEmDlN)(|*bZX_cP5;amlrlS#9!g;iM_pHU{$3{#`|=e~5Pu`K(Ff7~ zPOz$S;ay5RaL$mpaCy$Wie}F6(<>`c(UWIq4IKwXVO_mZ$clIb~?`I#=#@o#8c$R{H4j@mlD$SWoT=`I! zTnyV_iI}$D{E1FJqRF%HV|D=F@#F@2k>@MzR0yB`xBv^s*`mjoaBf{!fJ>)nzkDcy z7gXQCt7v=po{iw^Tje9_g&4(E;k@t@&6K{7Ca)=s_tnop=|?F>R)q3hZIiL*xdX;~ zhHwe(h)+~fcJ{hpuK$p7dj%QR{R!mjriY+Mpd8)90=PkmKMv4tJ7=>$pBL+m#|Nm# z>+Ht|mbjziJUWXDeRv1zCuWf5!%*(c`*1nZKDc1yaWB5e+5uICu5cmG;6r0EihPL4 zu+)Pe47Nq?dGhJ4a_2^$N!Ow40fS)qznt{CQJ%DeknxJymKf*Wyv`p^`S6ip0;)zE zBih)VU)q;}TGGR)pL6AV3sSM?oGGqVxbnreDd_5H277%Eo??`O)dl9*)j+@JsZ@OX zM%vmPLAi z(md!n;?UJ7K5SPgvWfW?P!YkyCI-T5mK<)xtGPX$n4)xs9G8XirL-Rm{X;!Six9r- zl`Ez`bV8tE5WnN%gr1qsu|qO*Hmsn&9j;cYawt604S)qSXoyK72w1W|2-H@uWBJu`&XSjLb1%cK{zaKN7us zEMPK^p1p`D93rpN36&Tg)HMblURa^yodka1YYgIh*r4yw6#ip$EWBsX&hAYrf9Vhd z^(~ZjbTp0kTNRDL=k4*LCY6sjp;?d}-8~#rc;@Dn*;%1RlOR z2qjStIAR#bL#9%`e2^pDw#RTqtv7;*LpN$p6fg4ez-B|zfsKyfp``0Oe?Wnt5n;Sq z?u6UAPKY6H$)h5gAx)&*ieo`MZlVKBdbprdMgV2fiIMWr1w$tJ^K$a9f2?#xR<17( zA@7<&I?bCzKHOE?3Wnb9*gVCPhYGYWn&6IoBRzOe(y5MF)V$8-7T!E9G!T6|8sqk2 zH|{bb01tYaK#}Oe&sO_EOU)G8DsDVH%NGYnlTV|_lNaUrVC{732ao!5-q{yN7F(cS zeJF21yP@OTXlFAhh96D#$BNU$AX`Y!s&fF2Sy0AkV+!}W8-VVl+g$!3jW5_AfSVD- z((*{>fgAl{n`Q^yvFZFkA!Q%XGt{>}mA|VaWRuX;n88Jep)toGpr^~tzLTLbH{z_4=<$ytb{CL(n2}aZI`>UQekLXNU9(j(azvaPw%IwhEUWQMb z-1tX&$2F{zV}*(f54R@PNPp_hpDMVefi+m2g5IMpTrMGQ0nMB}bzFHadBoMvJHzvw zJ0I+BiHEALNCzsAkjvu4l+1?rv4z{u8yK?<7HjRA8J*@fnJYVDz zXK-1tEuZw5IH(s)aebteAL>bS81fOXtWofTOTA$-o7i_PJouz*UXZ90Paw;eOCrh3 zNm}uBCxf_JsRsr>vxHh&C_hS``WH8?aM6SEonN~lhWrlqSOnis-sHn}@@{u>lk&NJy&iJdk6+=7o{^O1d271{b{%8O{ zM*YN8$}IU7>&F|3HRnFU4h@bzyvFS-G-FZKHA5LK8`+DKR zeReq@n(m5v)13IR!8Aj4l)%wc#zW}eebkcTaD$YGQ2z6h2T}xY74xxycKA;9H)^uw zM&yePAMS`B*7n>#h4hbf{%kmJ&kd;l4L=-lzKx74$!oiQfC5`6C-fq*4MJ<>@yz z&zDp&+w*S5v*G*>=|JR0vCDLZquGoLkGj%sWA{wK@%lTVJY7(+ghwvPNpD$UvG zeR^e?g!1U6lpiR@Dn~m$ajOIe-ion=@>PYIVpN$(aCfaG-#vnu2E9o$T4ly<$;(+4 zEQR(EE8cO99r}`o+$PwXdtI@GO)SvD+VU%~(2Puj-u^yhww_^^SJT4p@{u_vaHPD!6W_h%D5VKvMg*UIgA?MV;3%_DZps{K;z{1UQQDy3JDVKpIOW z>G@kWt>D=;-q5CZ;{9hEx!OT*j9FuXtSx)_74m(LdTN5XRVVnz-Ci&wzm=srWsc{1 zl1|@@e3B-7TYpci2&X>X%YqAgi60Kizy58-I|RGqdKu0ABCYw2r*5Q$w!oXI)*Sua zF!nR)hQC?z)iYcHV@niFx8R3}FO}7fX4+lMxI~Ls%@))TxEu36!zru!j}=@R4f*qS zH2c)I#-J4j{Kr!ncGVGE!%Cm07ScOS*9Joqj`Q?52egj1!RW^ad6J(L7kiLrbKG9; z?ID4ZbkSoK+j%MRI(+Wf!miB$ex_86qp-uAi--9O+PAkR&)R>VbGxcD{55$g{DzCM z=)Q=rrurYI`VSav%y-PTBmHu7UGDKdTKvWuAB32S5N0-mhgEyyYkOmyoIi(~T_Coi zy)hovEaFMMz0s>TWx6G-<=rB^aFFzk$M){xsnfjhowNtj!jAH*A)a_mKHjru&-0@y zo-mqb29*#)zI_{=8>ys!?qJMy!f9ShdeQLx#{B(vH>~884d*H1TZu(!I?n?0bg%J; zdt4EnVFB}PmwCRv3mPU{;!W&%@?|?C-p3MIMyL7VgH9MibHafykMecv6fh=T*@oVF zJcj0WM{iJe=YZY({wTUH46()y)vbI}U%JPgBY#k@^}M{B1G?u~dx!#&73`*O907IGs@=5AqSjyL!^i z9^XD2@*yUagG}?rn&^vs3hAkfJ2%&vk1QO{cg1-l?3@T&x{ctEH`8#I(Vx5k$9?AVKcwl%r=IPDg%)qJkYW(cDc<_c zx|NDO;y8UsNRiDf8Xru_!(VcJaqoDl;>2;s?=MNXs zzHF@shipdjuSXRKIV?i%lgZr7n6x<}5geQ5@+YPWv?YJs%k-su?`Z{QM2VnvVl8i> zOF8n{A~d|&#P{{3+`MvPP-JfAGv5-sj&!Qees1KA333ejCc>rEbv$&J94p%xW8(f* ze8_7V#&>+iU$={-sWgJyidXKNj;%8^uW9YJ(0l_Hbn< zdj36|`(fAjx-L8&A;#JmBicP&7am;`W6oY9cwQ?OuF(7}>G?G<%2P13rtI|@*RaIp zlW;KI4qJ#54MMO=@rcHK8TxH*u!rdoE$!jz9*d>IXn!p1Ci8)zlfEmW)cwj!UGKLtyO=lGEL9^e7 zM=wJC=Me6lNY78u1w8#cfIC~04*BkRWbEz5C#@o1&c}1OdAJLA=^#d6`*YMMw&N%0 zZfw)-EH3e1g4oO+y%yHN3COapu5CF-Nc*m~i?E_-7>W)i;Fu$Xh};@+6%m|NqW*4}`l@ z=yM-^1(k!I3Ije;KiB#)oJw8^g}?1_wfiNs`ua+ELf=6PJp;^Z|6B-lqk4Y5NP3h8 zq3Wp^;mV6Rtyv|g4W|EJ@fY#IxmZvkO~=}ji_{xt3#W7>NKiFE-GwA!+ZYK_E*M}$ zVyI9@^{M=1fDKPQ1d&oqESgKm)|Cp`XT^w|aTymonF*?c#F*4{89R?U3L8kv@MDG% zrs&%Vh8FY;m>Qv}FhrQ3Lb|8NCTP1NO(>)uXJSC}=iIZV6;Gw-|2`~n@X!kGPW698 z_5bgEBetJXx$c`2(kF_rq%2c8psh2Kc8f56`dwvfN2k9&27LeYRar#+y*7Cat4^p2 z6IB(oW1{o?qXs3Y$+uD$gfk^vm+dEyUjJE=-3LWA(YJ>Z-}sU)HL*U)j{M&UXf$P+~Ti*tkuc_c-nml3v9j}fxS^++Uo#gA(ezoLp)=faSd!pG_rnR>E$R2rhk#bgr9Pzov(0x^*j3BOB z>)*!s^g&Qgq|Y>LIr)#O{geut8xM~(L5KZ@%GNqEBoIevx8(%oCYp&x5=UrYTtZfE zjRRhdF~jt6&okWmIAB$>8J4wo)Jdl~-qXeAc&;MKJq`doR)8vg=mLl5G)Ds`d8*_URV>iEw^4q-O;ciS>u7&tK&kIxg(K}*1 zagd1xdyupT_o}>b^s)!`Ju`uAcgmD?cSkw#d{QoK!`qu~cw|amT(|M~(cKMms83Hx zXoWT>Y3J68GI3Vq>5Ol1LDd2?oY?K7qd4e-?GozWO?_!Kidv>V36-rjI7ChlU<0Jbv43(@<{v1E`cTk_BoULVZS z)X<4p_a=`pc`Nq$v}M{`J#eF|CFXQ!$?5{!kw|yrX}y2r^BcNL(;e)6V++=KoEseL ztPs9Xg_$mLMW%~20y_6$AE&#(=#UN0iN-LsR+O8%lo&>T=CI)@3ItE3KFx0}E8HiC ztvdC0L-bg12N{-7PiHN@z~ZTA(Z4MQf#umm(%?L$`G&*YlPsfNiWeagXx}=|TFjNg zkv@apul6w0Q&Q}qxl=EV1MGr2{TcGP=|5P_l%#!V?IwlBzO^h$MT+OtkN+t5#!b=y zmY6p0Q{u}`vfW)m@t~gWX)n$)ZWDruw~gVr{X9FD6pXRt6MPwdjwNOWVRIBQAAI#$ zL_#3O5@YB>{3-S{h_YbJX%9a6I6Lm{kKp4p=U;i4O?L9bq;-~PHT(bzaPh_b8CG~y zu$#U2^}+jo*644vomoYDW7&6Ww0^Le?alOp?R^^r)oo<6sjrMz+9KrJCf1Na{*iFX zzP-1Tl}p`emP6Y9RVP{WNH=`V7Na!Xn0<4i-n>bIuVr?uH*qAQhdJP+kuy6+`lD~e z6YQbt%i2?Zc-dak*Q$iF6yoq-CGEJ!&nVWFdc$X(6wq82z?3?~a+#uldU+7*BO2cgk<|cED@e zq5t>Xc>2bM*@QMkHZZ zy9dC$h-NOnVz%v}ALeziN4LlJY*nBy#B}HA`qQ3`*+sp-kp#V-NLUu}CDL=KPhP2D zDd%XPOj>b8sTVsF?@oSP($t%~1~VX?NGnx$96wUPcG0uBXCC#g ztFl@VgXSbKRgAmB7yBNpbSJ8+v|Hu*F>jC42(kg zO*)Sc`?BlB5g14OQ#DsV_Vh|P@`|m|A=RJl8xe-@yQzn|6~MgmLeTby9XxUaS*KmW zSmPl^$E!ii^-& z(i>&JoG@`6XV>0&AoQUN^19z*gGpP_^R^on1l?mRV(83QdLa6412d#u_H%_7)YiXX zabh_JsQKXcj5q9{t0P?d`O-Z74eLtJs)Zi$(0M&OLw>B8FMV)jVLe-sM!v6mK5(rn zXXEr7;5^3%7oE!4?RUgF8{tE|%QW_w*xh~&zHqOMWtPb@^xoqS?;WPBU5E?mjv|`X zdGdUBc7fRcBTmvxL)DwzAf5cUPsEKG;>Q|0CqhkZ21?CgS2E)RCR2YCIiKOMen8#iP_~8-h0JLx2VeNMN zU>tEaFGW0H7h2QqCcq0nzdmFA>1^+-P8tI1k8HJ1|alD7`r)~a!##+vAmNzYf1Ci*S$iapm%{yUpZb!M>eZ- z?^dqlrA>#b7oEvJi6L-5jm~*fEIH}JT%A)9Hpv_^SAW)NWC{ug(A+XSh`p01VY`|& zG;=~(tG5a0Go5&+ts>d`>G8)$UFov*nfKK~{=mK=nM<2yaT}Uz{RzP87QdL+c@I2YLHRUct>=k95ohKSWtZMaOw)Bp|ne>+P@^c;WZgnKOy!giMaw&|@g`-1s6Eh=!Ri-ZGQFeLFQfYSmOD`0` zE$*#X`ceO|_)IC9;T4W~J|G&BO`pG?^EEiPE}Cmh>Pu3~q#Ibcyv zRI@tw*(YU_>;x#t13PG|oXwReVVX_a#XrtWbwU=3=x#a4(w$|?GKeu{h5r4$S;O5l z$cdvhwaSnE`jUcy)Q69L9>nJVq0AYYbB#V6&gMQ(z=@X*C^;3wp2f!DB>C)=Qg zJU;lgm={btC0)Nb_>TU|zGSCp2J)4>LzjC$W}QaSuJ36CoRkmQ<)3oA zbPvb)SuyO=A336mB4BjOg{8fcq2ItrVChcQ<%A4PwseN>TF=^%uEA+b6t-AvGZ`@w z7d14m^RFCZcEmOpL4S;)Z)VO)YIE>>Jms5?w`LmY*Ky3y0_?sWd$u7PmBddTlp$qX zvIU&ABR|@EIg9VA#Jgo;xCFSe-N=NPv?d!qd9e+f(rJ$`hl6S$YuuQM_}$JZ*c`z= zE=k7A2siRLC$dR%5^-s?7y30SS>&8}jH>a)sToDAepxJP9|XcqO4R&)(daTW3>UxyF@i`t6@fYT16oPN_lM(pwBRh3J0PAa$@gepNYaHr}s?sFb zc6-8J*?FSCFaZ=s#9A>ogv^LV{o4|jve_A1>F-V0##uoNR}{95hEkHqyhpoWL0}|h z)0?p!3RhIGk8JkbUecV&hEu;k{#Xpo<&I~k$B|EWcMMup_hwpOtx@?jrrGoCsx6tvi1me3_n0NY3bQ>YVX^AN_I#GaP@`NtXv0>di=3_M7!-^IX#K_$ z2g=>qf!W!_*7Jq5EQm=SD)D<&5DsO>F+u)DVTdA z5k(cnOtLwVxG0oQuUgC^7sq0UYZ|us7O)ZBB2joJ6$9R9GofWDcG@Q6+^00wPB##> z8kEJ76~`X6_QQ}_G008`XBD)s*PvV#ubytKT*DP@lVhO@Yqs2v*t4cFnAmG8yT3+` zQ>2~xadi#rFvStpUeV}$We)R9Ca?FkX!twNW;S$Q)-Q^})|@Z67-$89cd^atoH?`u z%gm(g9&Hm8t94<9FDkGm$_#JIdaz>aa%ir$#LZcK+2QgsM5)cQA$!=v5no<)55bo0FvX zdz=WRod;7NlZ29=sW5Eq#XdhGo%xq^wDb00HxEQ2V^{|I9dczYsLqRCreX3gIdiBB zApc(qZqr?H!~nX_+a(f9(1w*}cv7B295Lc8*d4mJoC=|H;6LZ>+4!-n;EWWzNr>!o;DR1Sgk`LYR=Uv#Gox;yRBb5js({7Mie zm*UEB$~szk8}?tx8}d1i<~T)YvT}y*lm~dcrV#s)ojRU z%J1Hiich*5+45B}xJOKo+v3e^#))v;YLSUk%Qmyvupl&!&&2Fe8`;w#ekeblfd~F; znRzYk;$Nj<$i$Uw$xHHBm89UI#!@z6IWc<|(|xPw0@kVpagz+=aekK$i|Ii8lH{0X z&+WFjB;2*48ZpubKM00KkOkI?;)#oGPT3>0J6aImtj?*b+p~`3--q{F6O3E8KP%u% zHNMu6C){yu);9Ypboa2tfr}bhV{$4njx;(elAmR^O)f_}@=?z89g=B(z6^I?(%tCY z!MXB|C3v%&n9d!i>MS-YhFS~a5j*(lTzYU5TW-0dLG`Onk8uTN5v46rdEFqqu z-RVqN?R$oC%P7MlJOe~QLi8C&L?24WUDZZ>ejvuxv{alM*??iTwh*NyV@-A~vM-Z% z&NvZg=ibNnP;;8s#^c*t%2Dn^?4ma@^uX^Vk@A{VA?^{M>#5%s<%ZyVSQ!Uk zp{<6pU2+c2+@tIt_1{^MaU4myk;Ki6&kDVrfhRv>pm*+YmiNYFw3(OyH{GVp)K9V4 z+a?(soTD=|vm=myJQbC)OLJce!O&Wlj$TP^b?$%iLqrfg!;9wW+&SQdp`;JqFVfd} zN^`Am@=RFlve#+xQ-SAmGSN=vsS`QM5e7#y@NGw!&LzsssUDw>QyK|6b7$J(fix9) zN78jps9C`>JQ>x(kvzvF{5 z9s`8dB{z`sBLI;LdI-5mxhQ3!IBC&d7-B*1M{y+9y!@?HKb(oyU1BjXx=FeD4!zU5 zB%txaBW29?IH)Eh;rW%uUyLu|$d(%vHZw7WcD3nLL(N2}_Oq;{R z%EUBVM7~Ld_HHYs8u9B4wNfxY%|uz2X^t@qlF-ZLin41@;xvy&o+Z#$uD{|YQ1-p%3pHp1>1WmvMo75Pd_;mGtmSfS&IPTpq1 zvw^oTV<~AOzlem|R|ObyED&ExF9`u5dFbLE3Jr}j!q%17VMTdYn;#qzE`Q0yq;9bo zJ7~X*juVba^0D?sC_c=O64rIf!I;;PsLTlyPKmN` zNhKD62ZM!?i7D6}L+_^60mM&;NBN&b9FzM93-clo{vjDveLRJtBw}t@q~eT?tB~@V z^yid?THT}&WJkQAxJY^SD;-xr$*NB=$--toy$T6>FZmZpzqYwbHaj8lvm(G_w$%d z!d`uI7&kLZ`7$@WO_4bX}hb%59CrilmI`@>jyjj7Ja=OMKbjCSj_3Jxsib zOF#X+5TN!D(`aXQlzk8`Y<>W5H%D0Q`XHEYuR_E++V=;&7xqr8fH(P-s>Zz&uDvM5 z=D}X*{q>CyVR{=AM*5-8z*hoqT|^lRK}ZjKCM-X3gK`AIP?7RjSd^WEgsxG@nL&Hf zHcFhN^SL~(M)*1`71med@v(cgF#a-eP68518&e^K_a_e6xnxN8mkMjzgyPAw6!hL& zEDWTcJ^Obmu4ontQKYA8pO}VuZ*v8$i|**(nQHFAh3w0u>ui^fYb;aPktxIOAgXO+ ziZGV$s;Azk!ooR0IQ@~l(eF~QNH0bReni~*h-7Tv8zEe4Z;3$7B-~o&Cp@5g-Q7z` zsA_N)bbDDKIih);TjZ(myd}?2MxH@Yhc3LG!BZrhCvJF)?%b}h5heDN4>zDEzv%b~ zxMxdjUsYaAe(;B@CAhe=7jLavi}&Q?I~UuFSA49-nRq9Bmh|FlLMyRTPW<9lz4-81 zck#r=3mrSFa`Uh|lr!vy;+P(MWUE_fv<^bx&u;wNf&yYohta*R3vW1<3)L}E@EqKk z53x|f=yeSG&F;w8NKz5FG#>uiDm=9^9{DRM%W_ydzWhWKK7CI@T2pKOcMkDkZ3?;t zx8(E8Xx_6X6)6tCg}fF%`0zOuY4P8LfjRD|Ta<=AnIDDdLYe^}4J_rY(6NUcYo4Xz zZ0rl+3C%xU7p7ura-%S94Kc>HQ&!^rI$_KL8*HAD3_kUNFz2Wxx-}$1v!-15P1?X; zJCd+@U6D|I*8)wU&Fg%mXebXk@&dKQ?2fM-Mc&NkP$jNZ@BQPrS=CdVBn^qvdkucu zsu9yD^Ws9rL~e4Y0oKkEym>f@Clx-#V~W>serkFGlwT9DYSB>c&!doTnS_j6>O9OR6q~On zBW$)B?|df!W#K94Bkj+-t?)sQ`KgF2?ZZ8~d!WuT6_48Y;$Hnpha*Zw>GU3a@_so& zC#J$@e^(wyJN^H0_0?fjK2f)bClCu86$KR#3$c~+?mfl<6j8CU3$PUnTZt1iNJ-}* zrKLnrMh_u&W20hsx8D7I_n-T_|2RH8ay;+6duHv~v)5Yhqsm!XbZcIl70ABSl(AWl z^tf}99~(q|rjzU?{Az=mrBlA)a)&erh@aY%Vmm8B!W&2%qkZ&$=lN5(jBf~fP4y}- z*0h0qh>pEtx!Keg6llZip1)xBq~SR?WHP_M{~4QMPra(e_S`$Yne}}T%tDMExch;J z%!T|A|A&J-#_&FqQg7D!-qZMHkK4?3c`RvWI`Aj_23x-%krh9k%0E21!WK_YW$pIb z^H(n~uoFWv*qN}&Jf*3DydATdRA$Rt6DB%M%VW1ia=y>2nm933d&-}{AGuTz$EAop z9?p1ZSTS?XDrTz=3H*K6d=}fYl=ZnVj=R0jVy~f$*1%}~-6)M!b|@#0s1Y2Zl2{YX z+o$JNJYz{5dvd*;>0BPdj}nJ_^f@{w9v#TLmV~p39_4IXbbtPm?p7+lm9ahkrrb|A zh>5Jr*!qY*yzn>qyE&G!_?q5)$3P$EH>HGy8};Oq(tVlH*An(DuOnabQ_Ti!`|mt2 z?>Ud3D|yQtNni2f>Bao(oi}Vxjgmdwy@J2~_KMAK?aSQXIPkk`EnU#||&fV>)2@+iGU= zv6Rca_4*%A%IQ3dc$yx+%h;QKQ~AjwaqP~pau&|*crbA^bo-aHyG!IekT?R5o66Y3 z78CgPaOy90DPyc0__{?wOs}ex6$D!IPfq@-Jq`3jYs zpgC{q&DYZW51;oUy^>hMdT(Cb@;d9)Qo}k1dvW&@msq>g8LVQNC%4;hj`f&)ggIR~$Y))z zV;k1xu@L?JeC}?}baD&W#_oIgaM^J-H=u~&FL!P`vxNOIBu&`jZG68rpB-@`P1vb! zydf-`wVhGQ-qmg3O%-WuBh_m2hpy!wBa_*bjb*IH&xH^DMSbsaWo+WZ75qr6XjXHm zjERM%y!|5T$DdWk+NCYzw_hG2ZRS$;v;Tblr8tNc&n#sjS7!5~5`T6lg}iJFr}Nvc z0nGjx)f>pW?MO9gp$C<)szHPJh=o)~8vNgRw$D`Yxvf93!K9n*aoLZbF#X8Feo?RT z$w0oS^LuuE8ToKM3Fe(b>?nsNk8)K(f`Ex|650z{VSaR8~cS-QqRDokZAsV z%4c@DtBSp@jpM&fKC+>HzU+^2BL9Hz*jvj$mU)Tzi4R_}opd)T{*ugf%$~E)Pr_Mx zTnfKw+RU1%CnM!T3J-nzfQ@b@o@77@uL!!s8tJa>N@FtrX>gP6&DF4)@+5xG;|g0a zEt72=n#gTlo@c#NkFdjY;`y;}^(@aTkJW|6^4RsK*rebB$_=9V!uF&AD-^K}mk#rN z2BmCF%u!Z!IfDD`C}36v#cWPZ7}ph!un2GR^3FfRJ(i}kA>FC|91+Yf-biMpJ4%`P z-auZKK%U46rEIl}Kc87Z+7D5s%xi%!HXCoiNz(nPS>spMwsgIU+3 zCG2aSH$S?C^qioCImCGL#^^wnWkWTr954Q5U;rETBcBlsY&}q zR=}Nu@3YCY#v0od^5u)}Fq@?j?5ArX`7qvOmN%nVp1hDNY_73H;)nhwo?74CmssQB zMCKHk&j$pbW4kL-*uHjo{90%|n-iVJth?lJmk=%6+b5GvHP7a!Z=7J8-(|6FW|@5C zpK_M$bc7k}r}N1hDDQC3VNH#xe8#Xmc98C&+8s{jM$@v`@fW#F-#(GAsHD5~DS52d zw>a*xCy9A(%VXK8G2G27j>T=rV@u{n@v#@9*c|ITHoIdahs6@`FUSp#_QXjl&6~AOf8b0^wjy1iCHJIKFr$h`N1S6F z%MY_R=2iUpo-=H+58bDjR`S1NYuU{qq#u`1!GGO4#lj;J*{i5>eqilMW|~X>ovTZU zKU=|Sk+`EHi@BkH36rkWu!~KFT(Yfz#X%Yi-I~uoCm*4DbsC%SK8MdY%3ue_rZe~D z*?i!`6gG85ItxFO!FQ0hNx}Sd)?s)W-v+TP#3Y>+CZ+I^=SiQHr?EPtB>p)noGHc= zKRhp<8^n{QU>dEvWwG4kMi4Xok;-gk(Y*Zx>W{Uhd+n!@+{8PO_EpNAXiZ6odpAIw z$`oV5c=Q?K^%|!9XP&p{7xPPo=h#Uf@>e>2jK_{X&mPaF{tcGXIXkh36__MW3Yx(ztdNyfg5NpxCj_=Q^Wq#-A zj&n>MKj5xqv#r9|-s`pebDLA_%Yg{?^hphO*?y9hW*lY@owa;z3GE4_EAr9t6yJIK z7;D5>)|R};eU_B60mLKvxu%LAEGlG0^Xa`@s^Iaxa#_TycF zE=|#}jih5Db1mWyHH5v>6IhS^`TU?oJbTwVfn|i{@L^|&mysCH^oz2%LKDe4w~J>+ z#7R6{Mp`LL9V2t^iiq?Z3R^+8bs35j#QmBjiWZ<^(_Z&32kpW?-b zs@cY;-fYT;8h#_Knkf{-4UDbl&JNY=FR0m$lm@;f_9W{{+^Bn9&hhSvC)mH2eysH8 zIlgac73)fOTVlua{Mh~DY+oMrUv@apOHC`7cpvG5k2}YIk1D5{RVe#+qJfW~ee_py z7@Hbb&pQ#m;Z4#)yjR1=E-qxR%c!rt_i27^RW9>_NOovgHMd@p#cI7H88fQlL-(h# z1&62)>BTYr<5DtvxGs{d)s*ts#R;suGx?#ngy(`j$)oJ`42086KP58Ik} zo=BVt`RP#h{9qj4q!+*(Hqp7bDViIQ{*z|kfB9Bl#ASTIT*7k=`2k(1;(*K>vnytO6UlFP-5K7?ub4dHNxPu@Ecrhcvz{g@_HpBReuL_Q zlgYGx?SXXr;AwXaPkY*y~szF7P8QTR41{!z>l~Uu!{TuHudH? z?*1*0RTc%Z;Isz**)f-0a}Q!3d3Ah+`Uo5Mnmo|=YWdKBOm?VSFq_tw^DD+_tc5;# z3LdWF)9RC11NEkVrFqVbB29kktxq;D<%NfdLsuHe3>Oyh#yZlB`9O7wkUYM70O8&L z%**v`u0#D`KU(@T|IrzA<~qbaKlf#_)2TdoGx-~w^kI5|N&G<|c`Jpg*@7eSeC{3c z*&`j3R(f%K&(i=_Hi7E!f_1BiNbaKCIDF!z=W|SaP%vlX)lc4u*$VUsoUYuv+ye-h)1B(pWpp!x{qEZsJXsvq)b4g*-fo^ELQuI5*xHz+BY-?dLBYoyGP1 z(rK^oU~ezxb2I03suxj@ZbC8Fj7(>ID)B@%mGfZTbe602WU>Co`CF=Gew{@30^LsV zN2zHnhqSoY^s45k-KiH~0rg|Ya=zO(jYUw;*e+jM7j4s6HuW`4zkQ0=*Jzj*dE{m8 zKgF%rX;|uYC5u|Z`KGU_%++1R#x6O@-?*kyuL^16xm5Ba$5Pm*aPq8=E9bo`lUXYX zox!S$xo&hKtEF0EV_5-TKbP*$Nng4lI)_(Kf85t*AC|l)lTW9eNGT#ewtrc@WDJJL4~LU|w0 zKqjL4aK$|0KT_Q8{i0_5J00TRs%Wq7yW2mXZ@Z{r6YkUB{}pmyFAd|% z$+v7tG2daWA)b&In=!4F{J~S%hTY`(bgqnVI-1J97?9@X<#HarK9$YOSFlG8q-|oD z%A#i}S?b_pys0FGC4Ez}MNZ}X3ZyXe81mcADdqJ!$;@x0nmyMk=G*=yvG|k3<(yZ* z8%HIvRU>^E+nB?RHYKp^Nb*lvmC22%zc=}b4|A~7kn&Cpn`ca(HI_-d)6gh3aFQ>} z9vH{lQLp>xnWWh}C5k)K`PJ2)<~%B#H?AR$p_MPYV0MVRXN9m5i7&hQFOa_@9>jx7 z#LpV*&og!hvfOae;CST2Uy;w)t_4&pR{QeHrzmbW`LG2`efZY4=^l}2X0E?&22QSv%4qzx<8F4(cOgnyC=IT z&g7D@sch&0FP1qln>*Y{VaBbz*`Xgt_#^6(ULNDkZn)+0F6JpLi~6FUDDrst#blOn zS;1DB=JVfMl36&_U6)$t^V!m5cC4q0`eyQYfgkyUS5rN4ZZ5z0jcW2s)J*S3HXmxA z$WBn4lpV<61|HZJ#-qP*f_u@7_K?#bWO1+Y7`FCBID;73dXSQ6<2 zXRr3)2X+LIuE2liId4e_Kdhr+CSD$Fv2z4Js7Pg|5>IyZBIWRZNsG+ilX+~3O=3yr)GLX1ka94Wa}SzGwgPl_clso z?{*U(b7U0%mYKjF^-!|EdeQv$s07xVIItgfM)Q#4@vPrE74umU&6kagXZs1quO(3a zNm^O?C2F?%StQSV9m`rzBj2BjFm7iY%gWA^mf5Lb4nhnQk)DggQGcF&HHxhWAWeyM zHE%uXFlqHuo|)^-=j27OgwM2ZR37BtdWW;2q@!`oZx`Q8XX;||z)HElg7r%To<}n*gIeTiF6@$v{bO2 zJ^cB6ItOe?RIq~K0oCsQ@8-)CFFg33O^4Y( zicj4eyLq`mB)cIc9(U`lyg56Z*^@3wi}-aM?MQRRnmk0(S8*h*q$n#tHiRwVlGG5^ zql+KAy^ekRABZ$o>Zg zyOeJnit}atD((42($l(3@8$JtM;;$SKll3YJRh`K%SBYnYL4+>FMGK0na7h@uTeD5 zd>hYyn#gL-dlK)_oqG`{D9qW5?K!!VKchUV-%r{%mhR@icEz(_!QSke>0Z9PHjeEj zep9LWe*Uq492-b{#x0W$@^y5sn!QfR`b2r~ybiIf3*Da;Po`R^I)+`RJ$Z)0lXv+P zO}s8OYtzM(znDSiwa(;iIsG7aiXzRe0w3n|VmH^TCqKurzU;wm;>bTHU;AudR@8Al zcYHy*p%kls#;@YRC&O8;+>dS6EaDdaM!Fa)@HC(^9@;L9fJTk}-XFc94$U#F}w+@5Oi6*qm^ zJMW2nG0pRjO7bWfF@c+{r1Ri0Uv}~9WWI#%ZEKVMJI^f+&gI!fNo;hg2fH+35#LX~ znJsKQnaimqq-C1GW;A=UiYH6C$Cr5GJ$SLKkY!xIHSxH6(3!=4Iqzi|$MTMPv-U14 z_-&V1=006Pe9u+9xrENCZx!Sj;KJ9@{<$=qJSp0)<}ZAr8M#%ma?Kh}K1OW$I~A*( zzm~@>jAEPP)hso04c}5gx&*d9EbfmB@BAr}g_6(WL4y_C(j=1Y-0aIFJ_~s>X}b4) zO3!OGn`>;tnHkOPoRq12E%kffQTVYnHgaBS9m-y5$opmn@Zpw+m_7Ldh;NMMJ_AUb zE`+oqKU(o;q(g7D!H>nA8^qhq3u3G3bNYq#=K&#sEW9822)LQ@?@#D_M_l{%yZe#` zW&kVcQXyjGKP&+*lov z2aOKnbR^Z|_AHAYM?bfwpO4cKn^^Zr{6{|@Z@p((cWWK#a%<;z!>#GxTc;d!u=Wsz zSoc}B+FD1PWbJ6|Y3(5{ur>$|vZl|mzVtWN+Cy^5I%HE8{a%yxjQge59@6*L?Wb$$ z_jP0!t1erQ7wO4@hdiLqF_6uOe{EeYGL*Gz`;$J;M7H`wOWAm_h0M-fU*;jUlJ&Rj zAgdOSl}Vp=lhOB)*~j;mjh9T8ZSXdgc}N^(L2C!fswGacf*Dpa`kt~YqejcdOV`N0 z^b}+sQa4#Q-HEbl=`Pv0=XNss{xaJO(_|(hg=}-;Y}t5`k1WbCaTimWy*_ zhgPZS`xeLy-Th=q;$m5%Pau8oa+!H-h^$FmDa*?ZqwilW+g=?hGm&UzZ+}PAbJWXL zkBgTrmzu1jb4j+SC{>muxhA{*Hl3cUQ8r^xwya5VS9WG~E}>G^ep zS%c5X3`Dv@_T`H-4tiQAc6kus1YMorT`5KgbG1U4^I3pJ~1fg}f8rWtT)f1ox=lG;cyLpg0i{ z%z6oz#MZ*5nZ`nsSP*c3AK|?ig?3r}1d1P_*L5?&Kr&Hy*2O|Fk;sLDc>@J2iLJ2b z@L+-BN|@AWDL6{(g|^*?3Ckr8!p#LE1UJcaAt`2*K=CGAx-&)yk<1d>3)VuCWR5T+ zP7n$t^Mv5vC{P><7Zy(tE=d*&?W!gTO_IgJ^j@~Yd&yEEaQ|e1;!_xK-(E0~t`w4- zrU@oeXQA8G8G@D6RS23kOQ5(F#PxFoN9j6Y|HS#ia_I))bL9fTO}a@~KW4E&@hsRB zEfqqfTZPZID}*HJb|Ll7DxpB?F3fUs6)4Vy7UH$SCFvfaAbP#fB;6-0v)m-SmmUz> zopuu_{snWVZGxW2Q)olKV<7SpK9%ee3`O3;ZRfoLtqY;L(*eOkq!i|?@DQv-Dxt32 zQy42!3)TkS0<9O}_G*PNS>!7;oKXsnB0r&GkXmpO`3u>BJ_4;HA?BU0utpRp_|Nng z+(bdb-lGA+E>Wr3$487%mS4hi2LhX^5}P+^s0s1PLz6E0PT3AFA6VL*hC zDT)xXA|izXQKZmSH%cfM9TvPcMGLeZg+6y;gnCi5pg${4xFm`ZKG(+!jiOlL9!nIO zL~%l0X_D|<6fYDENujt)5Mnf`!go=k;N3Hg;x9=^4ow&I#L0rRb0)=Mim)*vOE46t z3Rk-xp?K5?=Ne-!j>wE-vYt@&k4atTqx)t zs-`$D5*kcT2~pysf?xS*isxcsszZ&CDJ~IOH`P*HmkMXM)eGg~GQnTkK=EBJ_{5$S z>cz)|nsMhT&MO4n#tTBD__)B_FHyW#3i~==5uS^ygkwclDeg}QUmdRt-^C||;qPux z{8tN!fsKNmgbT+;+@^JKO1O6Gj$kM`ExbK=kJf`$&@+D^SV(Gwe&?EKUDOJ&^^q`E zQYSbWHq-j37s5_F5hhE{2(Q;Zqjl0C*mQXzI7!Y5@zpPBy_^%iu7548k(?K1bbCwd z=7NxU>YcDla#3ip=>x5wOF}~TPlAu+vas#qXIe*Bgel6eLX_mH&|CJM*3&iN^ZOq{ zrsTSCCjA$!s~bY%;y*&U6wg1xaWG)nFW*M93l zljN?j^ma>lF1aT>FB8Fg$$epKgc!a{9tgj;N`UrHA=yz1deVnNkKuY?Abli+b!r8M z(#JyUFRg&~RY7q>A1tI#gg<4i!Akm6*b&_Z#!86ay!8;={wF7!13K6O8QCoVr~euZwonXyF;e*i?Hf*cPNm46?)w10p-$f!e!nQXg?R? zGL4{K`a}41s25z4{uHL{?G266UqYg@F*Hek3ty(0z;o#zVd|JZ@Lu{?NH*yU-=+VA z@2&a)?f>BPsUL_GI`H?NDd>q>fTrFI+9+DUl%wWAxB&0s`$K1iE=2fPfT5@*SZ^Bu zMv9iuv}7ORL13y7!NXC5!9pYk^L|5MutE&$4J?6h1PcCG!bpV#zPua?V?|Q1 zZnOeHA%%lA!+`JwZWj#)xk3+4q>O;cqE?U+IuaZdtw7~93J7;#-PX}CN1+eXSB?QE zQEM1JYb-2Qw1%z|#{uCHbQo?8&Wbh=ZYqN{qPAezO@IxGwh-G2fN%%rgeyA2 zJYQRg5_N(B`|Ti3(FuOJO$Nd{xa~XzG>XpfXMsIrin@UDjH!^L=mHbv4nQ~v&f}&* zv7#%eEvG}ds2gPUn*o)IZgAGn5eOea+HNLj6^2kRo(1)y?%?-l7MxRb2Zt}Sfp8Pr zzL^8p6g}W#^IT{Y^@NbS^Wd(cC(ODwADTo)Fyx#QG%JiCsCEH77xjX7)eGUZq8B(G zUj&4+P*AcMJ}Y`dhk_;WU1SVfvzNkeg)v;!ECU^}2~0>_4kD!qe27^Adg4Bi61fuE zDEq*y&{bd{?hCp>&d^!e7moV6fT6e_tWvsyk+L6j@>~rjVpF)hZw;6#Y23XQEW~DT z*?k=hR?@g_Jy?m&;j-HX7^$Rj<3<=O?hlvOZ300_YUTgtxoZUdKw15ETEihR; z00ud41qbB-Xjruk9K{1+?W*lCM>!B$t=a)j;z5wP(j68n2Z7znov>Uy7(TDq1|JvZJj7O@ z9q9oIr4{&!fiK;{ME%Hfb+y=O-9u3{>RZy%P4foHgpjuBjSdd=#p%@qkwNAcpPB{(~cYWcK*cv7-_k(LnYtU)-gGR9oPOSEa zyGj}Cf8`HNVgY2E1E5(cz>kjs@LUW~?j8uQl>qKP1L3_GVdQ}z_^d?u)FK$Ziy0Iu zgW=BGWa=1!(_=6c=j?H98^=lW=jk>O6(!! zTMW!m*@Mo3Sa6a|g(admSge`~$Nl19xx@kbbchFMl>?YZ#lsrOG#F%@02@@(U|4zr zxJjnN=pl))T{RtK#fh*>G6N>al3<@|2H2iT0uPBJ%$br53Y8& znXsrS1wtgVKyOVdgsWyj$-7jDlFWvcJ2eoenhgg3G>{~j0~b_jpi#|%v+dI%Q!*Fo zqS7HpH5asfGN3>*4|sM46szVz)rd?em&}KX%1o$K&4)6ZEU1<^!O;s@pjA0R!TfB( zu?3LZlnv)p3m|Ll5yG>DkpA%qTvIKC)V(=`Yl|RJlnZxNiy$sAm+);d9O;?|&8o%l zEh&$1ZV5~pln<{}OCY!;pYU!eu~G`)vuY_=G!zi-EracI3gNeE8C2gdB>YeI~dLzv0!wGLU0pxMmuHFO#WTyysH$&(8Q?O6H z8UD>VP5A2uUml(Yh1v~#Hfsrow?NN7S_n{YfqcIj!sD$l(XbZ6)m!0uS}o!7Hdr&F z4&v0?;CFQ$;q!Kgo?Z_c^>(;+x1Ml%2ee;*26EIp!2ZV>!fSU>svDqK?GDvl&Ju3# zgkPy=p;EmQMh`zn_`M7ER-Xf{dKWC6ah`B|H;li39?q$EL%)p|2+#L`KKtX7xTWue(e*zaI+cU4hr?{UAKOLU?}wYIj_P z&*}p(Q+$nZ{~+86zXre62f@|!I^n+ud?4RZUAYJBopgip01uE{y#W%f2ZXG=N%?>$ z^!#`e^yQwA=GjPjfhSmXxCQOBo=}l=i}C|6SZH+{I?BChKfFzOf)})#bqBg?z2L>8 zJCrYY!|82zp@-ZX;zjo;Z}5g)5%-|C)*EJ-->3XR0b|PULtnW9j!k|*d4vLFw;zBx z?WI-gn<$@90{hbh1LaDn4thv=g%T#3JOWFt610VnD8Ep_%t?=7xLgH$uRo?dLj`H8 zn_;w81s8raQ@){w@BUA~TCRq^y`NIvp@yjiPXV=R*fH@Lbml&|>1i=%I0q1+!<*}bE@h4${-?_jCcALed)Px(s#Tx{_H zR>}ila>NJ9V*=om#Yb?}27s*cBjq!JP(0%ktdj?V<>OD3*91a_`)Ams4FnVYFO=T| zL1FwC*eVZ#J;T3Jo)ZL<>b`=zHVE1*{zmyuFkFBC4fe=`Azt~N@}6LD?ePN+XoF#B z{twE3Lg4$PpWr2@!d>G}%7a3{Z{sgeX+vPP?r+M64uR3(-{2=d1WyM2p}go2KH zAnhS=pZk~cqfnUo@-KwSL!t8EKgyFrAyQulBekJ0W3CR;IS!;rIv67lgOe|HFisH$ zyGFIZ1Z@~td9*+}-@)647MLOrhhJTEQKJY4=?Yy;*M>u<99^VyADDd8#cVlY%EXqK zqlkd9fh{pl8v!D=ib&{IA;MB^Bw@W6>6{3Sj$*8k6ZXW3 zu~KmuqMnKIg!V9eA1*;UKf=-j5-F8 zqwi8Yr-+6~xgK87MuUBb9@2Re#CP@ZiaZ9|TC~DziWum!y%pZj#z3#?R@f+t1+zB# zcv~I|L!9*St|AsjY4q{FHWuK$J~k1S*$A!ikvtBj`LxDnMI6k%)*7E`<6wzN8+_nwehguu`SYh7DD6N;zxM`OnA{2KPwX8!>D%nRhs}w zUhR<1x!`!Q9sZOjf{syp{H;iY{59?IuQm~um9$44aT2uGH9%dPBse+U07c3q*c5Ak zlA0vw{oDZc#K~}BWCzr@NrnTS9k7iu8HQZwfbD9M;a-o9Xdq63@YNl$qfH7NF7Ak( zl_?P0q7!zlNrA-aozPI63MsLju!l`5q(AS3M#@yk8r2zl*Q7$OS7$U4YoPFAXY6aE zfnuXBXsXme`PwdMUZa7^(k^HrPJ@#zyW&8bG&t?p6$dNRpf0{ETGpgN!^^H{B~FLC zW4hsRn{-esyWvP>It;(s4M*3c!+jG&94pQM-%W;SZIc0`Dh*LkW2Tm4e!IL{Z(B38sLI(6i2W1urJA2~v znk;yx?TL=!Y>4h?gtKgDTyBJOl-UrKXN2==vf=P=BXklUfy4H_aG}i+h>YrmiGcaivWTyuH*Los~H-!PppGYjPlBqcN@#=fd;j#<eO z2y40^uIV5w zR+hr|ZG*71rW9gN55jVB8DOWuSYcBJO)CdurLqjXiw5I~nldog9fH;3ayT<{2%fSj zhxN%rP^&D5b{~ddZB028j<>{m@iCYaVu=kl$KcxoOFXAM1~Eg2;)R-H00)QSC2<8j zyD${5*i^v%-d1=`SpnBJS>cVE3OIYh3LC}8;Z(a}c-!VUlrJ5Ica_H>KW`Y`uQ?9s ze}`d{xDqtehvOrgN_d+v9GjJuFz(%Od|Fcp3N`|ti>u&5@CbZqQw80dM&N5@6*yas z#J4q7kmoTH--}OB-Z~OL+MIyIKBMrn@&w@4QTVmy1l&C}3crg_!ro4!@u$s6=k5p8Sh zVcq75I9YNAocKhvw><;4ohG4!>I{r@nS|48&p^MjN$4nPfDWzXILo#H{wR`baKAE9o@!v%L(73#MU!>N1SVnTA2N zm*MQ+X&5580&8bZ$57iVFk3Sn!&O%RzD>u-+AGlCeg;NKu7W}Q42-e83P0b?z&O=a zXrAbZ3AI<@e1sz=Nv=WJb4N_Ey#~p$nW#}+1OK3zm|lAgc08PknUd?UY~(D=w!IFM z)w3{1bsdJ^o`rd}*THDWY%Gx6fc74rYI9#2L#i|?NXFdl@Yi~f^?m1X4xe4O) zbFjkpCQLG!iZ>%hCmS zqxLq~7cIa>$sMqgEX3Qkcc9C{g?LwW2Y%)*#QU{(psB?oY?9oCnz@Vck?mbLlC=n% zRd*re&mw$Udl%eiF2?7Qd$1^NF}}3D2NQlQ#@DKQU_NaLzOB6nZIYMZd&zzH`FRO` zw7m}_r!2+Ks{61pekp#fy$|Uhmg0BG18A~YhCgi|K=+ts_*?Y=X1`sAe`_B=z{KUK zBW;4p$mOVO*96Hgm!nAC1ZrG?lDa0?5V`{Oqz_@%(-o+1_YlTduf#U$hhP-665G{1 z1l>m~(LnkL?vGl99qk^$X5UrVS^WrF+*^fR>mEUvl`|SjA5%{6j6LigL+MRtG*UkX zyFo74yY4aEI^cpP(q`Cx#RdD?HN!%4S2R^O1KZ<@=5@_rcEJ@bq)$MXSHi^r1~l78Lq|Abx*-|{aPF=eFlmX zYth>78SoD4P*6XEf6nU=>z;v7z7EGrpTnNk>v5vpbK0NRqg?$Qz7(!U+q&m4Lc9Sd zOJBeirwwRt_X6^dY(NL~3wZr^15U4d0Rv}kL`UgMSd+F9XW6}kwC@{nj`}4$p1KL= z)xCs1iJQ<#`U;kQ+=L75UO}AAW?Za(1-GI$C=xX$hk+`YF2H>lr0t<_fCRQCo7ytks8^eu$k*os^2 z-h%mnZMa?i7Ap5{L-)G3F!RDT+$DVn&rG)C9=mt2f7^E4r+x>WYPaKox_6LexC1?; z?}4q~fnIj+;ab%WRH)y>Is&d$@#_khX#_q;A^(Sz9 zvl|oYK0y)NgGtiQ@cGalOtJe6qnr1jM*SIfjoyptb)TWaXD?<-zrgR?dokPY3*eA_ zn4|sz9tZbfUfmbqm-k_T^eg=6w;zk_zQVH|`>|O46|UFq$I`m5pzVGD%cb9-X#D}K zu=@r{RR^$A{SAWJAH)-N-(cU0gIF#74$F@o#8YOx4=76Wz;o&!aPWc$Ua0#44&OZRlJqBZH}S+Pc0b|iWKX=N{s~97c;bz^ zpWqSWiH*`U>xj)&FbH9 zs>}J07__pp3eDw0h_tL)*al{)x+Wm#G z*Sztw`Y+u5?TugS{=z{s1%8+QgTB)h_|xtm)VM3~xB4HfNmSt9x_{8RUV%Cy9n5;K zz!s)D*tfe9b>(zMo1ny&&N|p-of1U~9SjOpqFAGY(&I{$Xm!x@u@a@tI{34-3iU)S zaMMT?wlZyjRf|=qFK1s3(>EbhYHFhx7#nFjs>?qfz*i&OCXI;GhPK})vx@cP^wKYtwLEXL_Y{y116#woY` zafn8YHo5_5sTJe+fdM$QS&Xt-0ca(X;IKUbILuUnx+wuTTrR<3)P-@k9Ufv2# zy+UxRb1O{F3PA@&E9`wa1gB|QVcho+oUUz!-AxYRjOJE&*zOQIiuAGl=0iBsR3BGH z9>Q62eJrgygtMLXQUA#yoTJdkC2c}+u0|gVM}*=$tv-qth2s2XeRT2)MJG{f%*hJH z1*Wa>-=$DoC~u9kzlY)?=hm2R9EOV(tqJ?WaEYchPTv%UOSP>rIU)>~HMhnum0`GC z)CMOthv5p-Hn^d6IIfhp!N}p^xXQT=o?H-)&Wbkp!Xq4AG;Od`W;nWP+n{hU99K8D zLD#S0xQ5Q+e!U`at!Z2Il}F$@IgRThaJ_R|^a+i?4GJ2MMc_sajZG1_N!u3H(n#Fg zOrvEax{2DMYHlQMF{N=|ByN?{m>P-OoM~)`#O;c9sQeI#J2W&J9!7U9jqEV)Y;K1N z*Tc9=)E*B69>(3K?Qu@=Vca8cj|1-<#=Xw%@n4H5+^1-d*Da!OzotDNnGuBtwC&N; zJqiytx5s($QRpEupqP$APg4WD@-hm&ONPh~W! zv<5ghCmPkw2H1Ed8hu0^Q1K%geN8){l}QZx$vfa3+ZgnB?ttozF&LoefFr_VFi_J0 zA5_F(khTN*Ka9cP<_nuvHzHtmeRkH=$*yfe;z6pyLS zo$-iX0%{bUvE|SNOw)A6MROA{UE3Lt?oGgq=FX^}l0fyTF1WZp0kcfIpx@gB%$9e- z^3I8P#JLMTwNAtwMHlS6A`x>nU2vj05%aWN&@DF+^P9V1!qr5oUv)ajvzNg|jMR&CBt-#TvY9+5@w1Yw(J^2QJh}!>i6cP~SWauPJ(9#nd#suIYj6wxr<= zZ4c~mI1O($_rQkAG^(%l#7&RV@Rn&$Y>=koZFx^LACiuDoO`0ztaQAq=!y4trsF+L zPn5-{<9%&UJbWr0A2j#GPtVe+{$_+T+GgNGQzJYwJOdxejZo^8fsdVy(0P9bHY<#< zIwb?2XpGRPJ_Da>jd0hS41CsXgx5M|Qhlx$T8+)b7pA>1a7iYg&$0NV>_QL{3!2@U30VW zlXGu0zLJHX6}_?lw=Ddk>5W5;vhl07H;$Q*jo+Gk<9OF>s_z-&WdCgZVQP$y1=;vh zZj1}AXX7ttV_fkw8-FW|ajo$Y{G&0(E%GDyS8I%W)*ius&Bo{zbcE`ECa5@i1Y4My z;L64$sB2?_@IjC>b2S=FZVr!Q^*kMX8wo&%M_ZxGuZCW3^5SokaYWiSKSuVDJ(g*$T z=2HEzFRp5lhaJrNVmI?V>}b;$&)VlaC07ZR`$h_;d$64tuH<=&%>@YeKGD{ z9(H@u7aeu;slM0`|C;Axce8%zJ2fAB*!06rZu!{Lr5`4Q=cAFbA6gvC$6jgu@aVmK z>|N6jLAL;npY+3e^8%_rn&Q-{1=z>T6mvEgU|$ku)|g?~Hw}z{e{~&?e0SYg8p@TVsKl*(GTA!~*>T z_jV}5nPvlV5W8v1a9+(oy!5OL=RX;U zKCR2CzB&je3@yh6W`pqOta4mvGYE^^%W;v*AY30)j*FFp(DXz(E=e1NcORDH(wadS zAwGu7o(#fi1CCMsbuj*OIEE|C24j%hF&Y@;VPHGc%jxDIb^)5p&?rH^YP!7Qs z-zsop+7NW@aU3_*48gN-95+81f>tYzQ~lNwgA~Vciy74#Gmhg{8%u0?_Bd{Hu|#}( z9Jebiad(GG+>vI9#Um@xy~YyX&9B6rPb_i3-b&mh9*WKhmAKn%C?@hs++#BoZ#P%s zUYDWRMXw6?DTkutpeo#-HWdA*SK)!0p;)t}3J*RRiaHThRR6WYk>yqBX=a5scdF3K z#_Intbk|W$_E8+b1qnL|J7JiJQX=rZ~BgQgOxA0)=x^5#?h6(T-F^ zi!JaYG8Iy(1%gvjA(LBRU|lL=R2I0aoyPTPOSle8!!=_|luu4Wtg9u~u1mvpA4~i@ zo`xG@OPsu$hB&DujEmE7Q*Md-t!cQWvc!}=>0H0ILaALk?igFaVM#jfx?17dzI5F4 zu|kjNbi|9TutSlK1gRD3-=rf^ZiQ(bv>)Y1oHB*iU#@6uKEXPAvYlMf& z@yN#-#ffq}7F$EVT#jU^HQay6@kDNoQ~ecqsMRYIv6j|(%ETpzc=z0FEw8rvWJlrjT_J`-U0HUmZC3DE4AiDKyld>oaD68Qv_PtQcDY68+XW}-~n7FSPZqTJXP ztKu_J;cAPKC7G!7vBmq=OuQ7^BCdB9s-(8qV4Ho@ubi;_ST6pl2+~`*XrtqR zxB0oy5IA7e*IZ}{9k8Ki9$z~SxMz_EEr|nKJo2C|;~M(bJm@GKuk=MOH>XnKLc0v9Os3Nb|Jf?&%+3>9%r-?I=#5*HY5ErhYm1yvD+5GY&_ zb-xfMY8R|5FXVi}6@s6I7%p%{YM&yE5V~TqZ4pL_T=8Q;5k^T|5w^1kqh+ob8(9QX zg)5#X7h#Or6)RsAaeg6$*1sZ*6$o)@U@^uCg|KxfhPg*oH-n6LFxi6ccqO;eCfPuIWsI#mF*D7EZ#>DP@=#Ic1oko`kyhWtgcm8ACglW0qht97mU9ws0~QPbQFPwtU(<-n)GzInR zDzH#81!YGout+uqIdK(OteAq7=M`9@o`U!f6`a3J#nsN0SSFZ?^P?-VTsRdcrd48v zh_jG&mGG8K#kQlB@R3c$+PF%H6jQPEc_n<+Q{n!hlJl8qpw2I`N-z!WN58~s;WQLZ zeTg-qX^33=5^E*X;2ZoB>txd~_Qp%BS4_jt?3dV}o`&>yFFC)Nj$<9Gut_i-b4ONT zvv4|wOsT>a(R93DT?IeMbR-_Gg1>A!_QqBrKrtPYv#PLFJso{iS`h~gFYsAups{EG9RnGkDN zW1nCqjE$?YUpNzTmuegk&4iD4H3B6wp&eKav1}%!QPq$rX7buv)d*70gz9xQ=R>pL zr&)tTf>}rzT!X{HS?J_ggCn9@n76bB!ID{!?y131*(`jyP=jNNS+IXngX8L1I8;@` z`O$0?|E@uZU^WK#tHnv-Y^<}b#VOHjJeXgLP|0lQ{8x)G*=)={Q;TrLY+SfsiwN~> zG?vzKzBC7;TWfJfFo*9yU*oKB4#%IbaZWS`q3*A7UNQ%XTV5klHV0)VU*m#e4u0Kv zjf?6z=wI-f^Cx%k;!n6NaL2N)b+{sQ#{ttiM2XxXomPivi93{Q>mZf6qwz=`WD0k5 zx?YDEwL46+>NubBfZN+TToZVJ+SMag=z;Mj^|&tbfSIr!HzXby=2MS2nFj_1*5jta z1HGc^aZBxi?y2>hUwNWUZ9VP?Jdyja9(RSFh#a88J&`BY*sBmP@r2Dn6%u5g(A}Xz zqQVo!XH-a1dm{S2it{ZmtSVLEfxru$TU2-`^uk>|H6Dq);AyVLV~H1j&Qc>;=7ozJ z)p(-tg7a}To~pgj5U1w+Yc7Iw)OaSC3$u4>qzdPvsC@&{M02rySOd}}bJ5?e0dm<~ zJo9OQLNOPjzy>JQbI~EHf%CC>xcRIBnSyzkQ`3Mf;XJhdZ9ukY9?tcDgB-~`IM}_x zbJ;x9&wqnl#XKC`{swvKc^G~A4d-X`@ig%b3Iy}fwfGHQ2Kyh&ByKTZ&4(f zk2Yp+Q7oH}S<~O5L@^(i*SV7tRBur!S^#sc zM!b|Pz=0u+sFE!}kwYV1DHgzJNh7M&3*f)2k@L5Oke_QrtzaPx9ya2&a3Mrxji?hX zL{dv5>Lm-ItN#uv*+R@Ue+RWAl&c)KLktA z>*xorbuPiX*bn$6T7u+^5BM!vf)nZw_#<0_s=FS_-4$kI;@;iq@|mp`%=i%x<5c+prYpO+Rry zxC}m1KcT(JGIUw}2_4*)Au;F^I{Gfd66q&&3R(u;v`^?9vkbRuKB0?p8Rq@{gsu(C zpwaI$=ZDJ?Yx5c1O_pP}*Jt!_TaI6TpV8BIIigQ~hF;KeOuhXX`Z3GV{QNTvl*@79 z-Dem!EQhfD7tR+~KrQ%!-X<&Ht~Xxv_=>?M-Y_xyiXm>^*fH%ZhWdIVfAv=w1$o2x;8z&O zcw@WtD+Ee!pWe1oad2YzwiFs8u=nOWaBzZ605%{PoS5rMRuFwRYcRYRI!?kfVXBo2!p z5uPq=f@O>dZ?`wWO3C|2G{L%o_m6MleA5@J3YuVJ;)~FaO_<>3i>Do%Ve9LQ#$nB{ z3-X1&uo?C-zMvJ&fYKMM_cntXd=VDe%=za^BtC40qsdAnl{Ul4Z6)qEHN)9=B_4Ed zflJUzJTz^AYs^YKn$iNHawXpvw7{)lC6dK0oR6+T{FN3=GFgQqPg^kAZ55WkY{3-Y zRj~Qdf~i5P(9NI~(_&UZJ+2kgm8+0EqZKn6Rv~n4E9a-HvF1=KW|^#pldKi9-BzP_ zS}W%GuEwY8R=5YPhT?ZCJYrTOviEm*Dp$kL>N~s|R%6PX@0_o$L9dP9G0$WTstPteqfo& zTKw4b1IyjkV&}0RSmC=C|6+f@J7_KTD}TTzW-YYqe?X*Mi-T=`!na{9I`sd^`RqCz zwfTuvChO46^Cwojt;4C!Ke5Jl9Sn~D#M+>BICK3c*2S#j`r%KkSFYpQ^G|GOScf4R zzc{~LkMsS1VUx*vG~4{bX1Dd2?)eK_eAgpp^Dp=Xtw)>Vzu+IU9`mmMLV$8T?kay_ zYr}eUtpCON?gn_b`Hk%+8<5=ZH~w?m00W!f*x|bY8$5nvXV3;@Z2FB|F&i-W*l+As zZoq%Bzp}l7AE-1HPpFtbC*sukGMs4Vlt{--dYeSb!{NUlxhOW5z z!E|~Xit_b?&cZen9ps1VRc%Nbnv~_X9e4aSDcg5DmLAZgoS^OK5~4}ZW40stf+poE zw`1)MP0DN7jy?}HDPQ+Lq$@S4z~nzHF4m+MZvUb6wI&t%{)dpynp70@A4dMwq~aLf zuVY&(QSyGh+fr%6fA}tFOJ%w{5Mt4m%1w4)q*Gg}aN7a-jJ8ziy90|CwWXIqJMevV zTdIoLfs@(rCO7ncy+Tay>{D)6_49eo$pS($!tsY zK|8Uwv@NM(cH&EYTT&}`BH(LVYG~Mrpa0s@8{J*_ud^1tHQ9y6K3df1whQxyY0*31 zUC6Z5qW3|&VB@SsA7Xal+Dt9_sN99#i?!%e!!8_LqeY)}cjNmuE&5`z8!IJR^wn)Q z%1&v~H{acucv*{@f_5Y6rWQ5F?1sr>EoxEjMnt9-wKnYLdao9J*WH6n^;-19WDjz_ zXwgr%JuvyFMZbLaV1FlV`W>_fRlT+8Ps|=zn`qNt%A8%FKUyP-(IBNU<3D}*F$a6 z4&BS&t!(sOL>Fn3PW)ap*0Sk)G3Jvt=@#vU|8KT_FCMkmp>|Dsp<&2s?Sq?<4z<_Y zhofUzqkSlZ4t22Dhh9@zmwi|~Plr0X??beR_1=fZEjrZ6Zy(I|v4Q)r@t6*E4&8^# z=h$fO#ki_NUE=paGm%Z-2lF%?>RPl9-uZ0(K7>{2P`9RiP&Bey`_a;>L*2P2!$ez` zx*P4s+#b5r!(u-U4P;&R>gm28jW(?Je)M(IB|X3WnCi|3?#I?;x}+bvAE(x{ z(fe_0hb|e!???7QHhn)D!gR^7Xg}IUvGw~g@U|}XYT6ImWLE0{W@YJ8Z@mMUTgn<8 z;A~o#`dA!*=nLy|0PFthQeXE2@ax!)`g$M0j$ZAkpWgxOH)aD5;NZA+)Ian9uMEaU zA3*rjb~GUV03zqH=?D0IYexf%4j^_5TYms|_O_!zO$TuQD618S2WQ*SV7)+Gk711h z5gFf(hFApR_%qfe5c_i5(NOn5Y^h|u1L56bvkMi5o=uk0ESFzDz_%*gC(|9pv zwX*4Am}+&PF-2l@?9SGU@uq(VGHVh;K7!Sf;JkGQ8mlLPw+m||!KhgsXdL&nG%aFX zBzU~K1DU%^5V)1~mT*r)2eR;!Kre(1l%OQC16hVja443ImcTBl16jpO@F|T=m*7f% z2eK}bz@v(-=bo9y4m7?=f=4Z^RuI;=?MOCyK^WYPH3~vezm7D)A_zglS(hM8uM{=?_h|Nu`%RzM0=tR!$2XV7A z>wOSY`*b1~zk_HLuz?40z`PT=h8{#G2R8a3!lrg2Vf;Z1n8&6cM2t@-aw|Frv(0S% zK|I*qi6%B3gwqjL>kzUdI?*J(LvW8~jSiveb|;!_aR{Ph*5wdBWp<(|?uW3gg!MiI z&ALuB)$b6Fd}0F+LGO1bnihHpk?lIuwCF<+=y#^+@rQ70Fq?h|<4rr$jG{w$Hi4}_ zgvoB5X=c+Q6wYC_4rA8R&NNH!FyEK3Mu*XLduM)D?P07Jvo446Jft(taX*Yv7g+DZ zI1<~L-2D!tF_8^CjOl5e$s_bI((>5o!?1qYnLOhUwN^5 zHg=(fen-%_lMOtA35UAyIu}Q9CX9_fg725R(Bk+b@Vd#SAL0A^F0`cR2>*6s>yN;{ zunR41I)b8VRx238-glv8dcj!qoiz%^Nv*E5+#(ptZmdf%e)sE2E8Mw9X*la043TA5 z^7aeHIY%}y7$wuXl22$b2F+)qgRw@`l|=EuNZ8D#2jk!FuH;)3j7dk>`e2-j=t?V_ zf>9O4Y8^$t+g)ju-ci^+W{r+=KSftsZE+Mki&&SVIA7D1*0>+V9Ly(!F-)6?z;`F0#?b5r4fq?T$Z=*d#XnI4-4ir#(f-5s}B%AIH(k?zFe*I1V(h zS|_mmTX)*0cLE#!u|_B0)3FEbw>W`?hOEm8%pTf<4!Co#*BI9O1Yp~P0{u?F!i^0) z0i!uRNE~_sI!oB-6KGi7gCy}MkP*P9pTM>KJt(N?1dbeI>rY_q*&cMTiF?9itX2q2 z@AjZWdLiicgf$Amm&_jgEXNSMC}v$kaIdxp9dQpq*ay}-1OY#KP_SPJytI2#a9{|= zb?-?>LqqVd9~&Kl>|s6WSbPW~EZFoAtZ?W_$BRN>HkGXp!EdjgbfPH)87o+=lL+0= zlS1@PV%ZMX=p;r5^`w&)C-LJX>v9r`3q9$S`$?RPWxY>gabiyj^*f1?schg$e0koJ z!a`5tYB?Ky5=&J*DLnop48O4HCz1QRCq)#Ugt(m^Mbw{!y`CPOZaRskfvnakTpy`N zXY@{CxixEa3VodQ=&Z#l6ijDbPT}BuJv!%p3M68^PoZ^_9-a3)g`2zBK<;Hbq(_mV zr=StWMxR3TB|W+je+t4IZ2Bp@Nz$W>MW=8ijjcb0(Rq4wsp%B*D_E^iY*y>hWxY`7 zePxY8k@QE8u2_U(UVDAI;u4BqdioUQ9*PTtSnp6cjMArQzfiokW&=YZcGf3pXedl( zu+gE&oUc!^_)x4BvFV}cvRR*Eib8RF7h4~S*@yJ$YEvkhLRqaa9J!=V*Yv{B_6BPd zh8;=z6l)QNrc{=D>elA!({=YS)R(i~VOXTnryG7@DE`a_hQa-}K0j+S47Iuj6c^1s zc0CPv&4)1j9>AuD;m`;Jx>Xbg11q*Z4AG7Tbh{}GW2doN;kZB7fbQspW2`r86pm{f z4Ct;!I0o-vUBYozVnFxY!_ng;>m826kp>j+7ml{q*g)>hi#MQz&~TJJWuwDkmu*0a z@!_~w!lv_nuMH@vC>){>Y<)QYt~H?hP2m`=Wk~n6A`sHmkRIqops5dQ6oI({LwaZt zfk$Immk127H>5}I5!gSG^^SmQjv+nvi@?MsY+wX#tTv?N&eeJ@J)I}NoS8+aO~gL;uX^fY`&veBn;*{T;Q;!mT(kxf4h zy=lEjS#%oH=Cbvt5wxNgWi;{MUC(NrL7V@2QKsG*Oc%38XApU!7iC$T!Mk&;%Nf|j z^rCEc?lrv2dY?f_axcp9I|HLkHt-BYMZM^G=ouWTW~0yGR%0*9jX#5;W;Xo{zPIU3 zc|~W?zY|-329AckDZl9qe1@=E+_N~kHx=le#m(`o(ODEa_of#XXVE&HbvcWE^LtaF z`&l^nu-<3kv#~c7`JKg~9c&;UC+SVap=a?TgpKCo&iAI0__OGHl}+d4?)9e9qOPzEB-(oQrACWL{8`4jMB@9}zVyyL5?{Bn-jVpQ zzc0P_i$udwHZT&Er~A@}&`3OsVxuD=yV;jM#z!Lf0h=C)P3e8T%LTaf?ML6-FF;SgdS8IbtRFS` zT|j~@8+ZXnh5e{G^a3`|Vxup>YhgcXiN64QUpD;$hHUOftwk5mZWmjB0Uv_;(f6hc zC_Kq(UBunUe)NNTM)zN3jV@x&y?*r5;v)Agu`Uwi`@U-pZ>;Q#0ot&{UQbo>`(uSE}~*MThGT^^rtq>7cq-i z?Mvu9xj$*>UqXgEYkUcTOZt%l#zdsv@K*mAf(Y58Bmm@rm+ z35^%~lXlo8$YNRPB`izmPdW*g&_9KhUqX3Sf6^_!gwSGEbqOt!q$G=MsKT!zL-*5@*=S`MI2{+BV`ffZlI z$H@bzbJ%6<^XL97(W_bcWmx(TpsvN2q1?l&E@R%|0o1MeG8#i!?JGEN zaR7DKzk=bhtnn4(#}A+$mRAt)ly$v={#gU4rw8}K7O_58u)2Bx>G@wl_eNHH1$UYT zkbc+|IQ?U#S2#Z#NCpX4Akt&ySMYtnKr$@8f8c4nM zqYyubHIBmA#RI92WfX3%WL={$a?3#K>k);RU93+Oj1CT@e*RIoe3BJMp?~B+UN1fh zXJc4t6b$YTqyY(0IQ5v7N1>Z?APp>zLT~}AibDIB18Gom6vS#)I~tl_2GU^tXzcmL z8b{-o_8=N!8I5h-Sl4JY_ZdV(J)*J6nDvRq$1#J*$UhouCa~gY)Vd5JUmp3bq#@_XV$fP(L4ck~%G-ezaM8le+k#v;RmSVu^K{Q-n3dt4LSc;D~ z2GIyhDLj){S1EXP4I1eog>eq+BgN5@K{U!=il!P?EQQCrK{Pr{imT16REl5!29ark z6w^BlCR4c-m-PnIm|`iu4PaGL2!{_Qvt}vIn6uh4ytf}rWA$aAiL9{6I^4U z+i3{ddc?rhfc1&Nfk8va&OZjvMzG=-{IeKB_F*xwBUT!N|0WF~B*ftU99ABK=0!t@ zieq5Dl2yfE)8--M&>VwXJ6Y|kP)UZ6qyAN{)3U}_VSR20IayxCQYq_t6^CvOA!m=P zxbuMZxr&OkA>`tJ6>W1_@l}i}8$zyOSK;xRm0rc}_d`gSa22u^R(=(EZHAIt@l|~9 zz^bldu>Me**nAa}2eR7NuzC1UnxuaX=ge8-Ye=^rN|P}YoLX! z&o%gphSF63YdEoy6<@>M|Ax}Euxn5RveIiPKQ@%6C-Cv7S@|_+L=B}G#n+%0$EvPj zSkh3M*?bLl&sgnP%*-B2v-D%JqL?*~#n$SfG}|&3N8YlovAFncD9!PR#l1hQPb?I= zM&#}vi;C{7I2H|kjmRS`7HVTw8Vl7JBl1j$MZFCxk42rc5qTBI;`KCE6^mLgBbwVB zi<)Ju_H|URF`{|;*HPuq8ehlDJw`O&@;WLHv98xqamt7mcw9$$Br7=dd(EmD0 z?y%zPD1Kx_i^8s>NX|;HqcG2i7AIWCi*i&R_2qNUB(@m#~0 zmTKRCyrVHK)4ze6`mFH{oE~UQ%PntU|8Umz2G*Jz(+ZCp@U&-rZh+j3$=m-1hRgvaMfP|YE8_&vb;!CoCwie&S9VM%}iA@Cp+Sbh5D_QMZoGS=uyZ$ZQ`N$gI z!lv&6`p@zf%rs5tKi6CM+|h(~c-+Emeb(m|HV!nQo&LOiI4kDu<4kB**e%?$W2LvS zL1;p|6K-M5OjdpipXQm+o?_mrVMbtbg8nYV9cwQu9iUK84$Fr_? z@Wyc%9r3t>-BVbfJJ9nOM#27f5WAQa-+|l8VRSU?4!&+;rFRgyV;CJvxPyseR(=QH zjt!&Z#dmPwG^@IUNmqu^iDrKNI;(vbClZEHi2hx4f65x)#mS6ebkg!JdcI&??;^Bv z7@hLC3w;&qa~I(shw(ZIcVYOQ72m}rjo}m)b{Cc%S?OJ5>kX&ygu7TafR*1xtI2R) zGx#p&8?5RshT0CN)6IABz=hSmhl$gN(;5AH$n;{3?_u(?;dIvW90n&0j7O;E2)g1Lk2ak~P?SeJ z*6Oo9@hBTGf};K7;WCUB$K&?c5hM+ZM?YIu8jpi6BS@AIkEUs?JRZxuMo>&~Jf1IQ zRq?P{J%X+_$3wb>)lNY7T_fn4egbw$SmOk|IX;47Efe5=hILKg`I`}R-6MhL&RCxW zo;w*qH~bTz^^_GSU{%HliVNfY3Rr0Z3@b;_&4dK3uV>{6kbf9Kw~7G}^gurePIp-2B%FCTk{((n;d2`6ngqA!Bk7Sx5-yamK1pb<9!Zb=lQ8uy zD^9|>uOoT=fFxA?Vx>tKs6C3FBqU*Z7gnBxXv0zTv^WXsL98kX!$ypvl;$L?HfOc( zBie2hJ=4FB0$0}fKK@M~MX8qeF={UB%Ci;AMp2r_eMnZbKKF5N%P30szmJ-otoS}U zOGc4A>^^Ldv(o!md3qEn67F-KFDt)~)Yws^EWVFV_gK|^^h+K^8O`@GNx^DAKtSFo z%G7^=s4~|00rG1{QI_Qc{ApxeA7Dh&D9ZMDfVqEIp9c`@jHVp_2e{jn6+b|AuhH~8 z>;XCrVWkgXGjcTLCh)9=1uK7mQ}&}NulNB{gskcTKFknQ-S_N z%w5A8Kg34A(Y!|RLmb@2x<14u$!IF{c!&qbS)Yd}I6az*{2$`&WmfzU8rMftao9uj zj%TG0F*bQLl_Wgm|BsbF#In56R9gHH+sjzhLxj|hrn2UTxYo#OKf=Rrqp4i~5t4ti z#*dJqZAulEkC4`db$tYdp(#~*JVNFm*5?tP4>zTk{*RD9juk&bp{*%Zg*`%v3oCtu z@@b~@D&Y}cdb09Is99o4)y0ocw~|#of_jrF)igiC+y7YY$9R9hlxp=K<5Mte{1{)u zOzE}dW3*ggT_58|j49Q5JjU@hq$T1YfU=p)dMRkbRvseuC)uG4$2)33es3 zu20~l7(?GYp1>@R^?8E!Wn-wx{|V}9Sn(4)emjPm!=51QD=U41^}ohYOTrVlX_--r z{0RniHlx5fEj&neu5h&toBog&CKYB{!=WrVU3?+yptLIw0w&0Q&`uh zXq;n4zdW8IZ6WLP6p=n=^xOX_0@kzQrG2JAO#zKv62+-vm8s>;VEeC#L80eNPjHpB&J}`09KI#XOpp{Tap4@ zGgh5~obh9+T}uj1II=p=Fm>`+YH#oizh<+7XSlv#EOoGYhWXyC@EO{#8%rHMpW(hg zD|&{NyT?+efM+laVkOU@I6js-hd)EWX;$_O#+S!Zm&9i%y2dJ=;lSOo)V1Up%pbAp zXLy}9mb$e(Lr4y*lM098vDDol6`!kEK`QqKkEI?~shIwW6{g}(>sadPnTohJZ5l^?tkUp%J1a~>`2KO!*E0=fM_5rBvQCYo zegSFlInPSc@Gp8C^$$9L}8Z0K)JMgi$) zFJL9~3#^LE0WX;ObAtQ4VB&K8JL{`BwPBYEPq$C}d^H_B{9xXGcVJ+!gUt)FS zkZ(4p;RbR{*})3r$Uk6CBdp}`2xf(HREC<{4%Gp1_~T# zYe8cL3ViEmLF23xTt8!l3KaIUAahRzT#Q+f0`a3Q$Ra=iBP&*-Ko~5@GF$;|H&&*A z{|pPVN>o7Y#VQo=TxvnqB?|t0S+xSzn=EL2ivls*Ssf*M?YAHs10@a~W(7)oKWRY| ztdv-Jjuk3V9%Vtco=Qx*!HSf45N|E&&;M@5D+nFmZ|{xrS#TY7Q&Qz`q5SBuvcU>z7qzAYrW~ zxs_y~yFaVWz}j7wG_fTEN-?XGiJ`|VX_7%Ec89Y9p5?k=Nt3NIVHv{;GjZaUB~9_n z#JeO`lnG&qB~1;;#FY$Il8NSgOPUs*3EOg3mdVcnv83sVnaFs{Dl*aKt0m1S$%MyG zR-K7+npQNkB@?wBSe+~k>uE)^46?AkFDuAG!cZ%kZIy*zBUxb<94)M9j%OAQ+OeW6 zb3ClbBRmU%i&$9}5`C=5GcgMd>sUn=dIwmMS4kEo?`G9mJdc<4qQ!~XkbPkl*(m*CMN3Mu(O%P^TO0w5Iime4Z9o!RPsFO&dy{!%t^CZBX-hx{RldEzc2W!0O~8bHI4oWRS~! za;Kq!n%~rV>Xw3?9VN2s_i)Sw8y0M~M_{|tkegU}%@nR*pkS-Zd{^7ZZ^JQhZ zh~F@t0upoacq^;OMcSV6w6!D`*+Hy27cY*Fr)@2{sEA;7@=$wmJZ(3~!A1VLo!nh7NeOv@=?FUhQ#5#-ItZ+BV&UNNfPt%Xe+D8 zN8BD83M$FRr65+FkCVr3=wM4e#1X7c0k&SWp+g1*SRKO(3b62&4IQ>Bz>FkTSOCYT zHgv?Z02WGCQ~*Jq4Fw1A%wH)hDL~t58#)?ZfEqO`E5MVFHgqhp0Owj*MFF<|wV~rB z1@P3FK*!a5o-PyUL`wm>8?ZVr(As|jg&4d*qcJOZftRBv&`GNo$g^aHFYwHM0-f@F zfp}L|^a8SJ6DTy`1+xcsB9p1iDzlU6q=)bWvT1 z`u4VTsihFly0bb(2=8r6mko-rWH2izg2`}Ox?)v?&t|N!2oJ{FQj}*A_BpVkBAySl zrRabn^q9#?icslgOVaQnL@i-uMOf==OR~fwSZrVwMfek7OED!yknd*IMK~t0rK>GP z@I1!q6vH6gmaZ8TBP)^>6l0gvmSU}nF*c4B7DE+pOV>S%ar!YUD#p}wTe=ZYj5ax} zq!^D2Z7D9i7=e|ntQgbkZ0TlVG4$WDiekL_YD>3DiXr>Ss*ABf(~fSp@C;=KR;L85 z-Rqa5rgKA;5EZmgsPhiBMP zLU;*=d$F<-C>PsNVqytIB34lX?e%t)R8oQ{e^y-rr(Je*zoi5{fU5cVsJ4$IO#pZvkP8quE+S4s<@Tg3DZ_x(thx-3H`!B0OBohyXLZW)Wv@MD8kFO|gRGz&S|{u&%c>m5 zB3NNL3@_SKwr4pm%UDr4M%=WgoPct~C$N%oAlaUthnGW{&dPX}G{>HD6U$Lq$STU= zU1?8wCFS_|npKx$Yok5ox0FNUE2~q1BR}k^z@P$p8lVC}1unD$y|Ai)NjFwlfjfqv zLeC1=4rE0YNEd+DsII_tQ&v)eQcF;Acmca1*oj00_Rqt%Vpj#Irlk^J zYFV9^oFjv34PK)1Gb?zB8Q(##tzIJiA1izbZhNLW&zFen!irvEhyk~e2E0Uge^&Am zn#LR}g}=n|QLOAGo|*G)X5vfm*9oZ=FR{;wsG;N~YA3PkmvERx^rqz{F3n|is?dHZ z(OZKm?DAy=RrtD|sL`qlz5%ST3YEKv-g#DGrkE8~Aw8JreLxj#LRm=_r00k}gjYc; zij`HtJC^8UVinTvu!<@SeL(c7qzVU8SalU%D~Ue0RKY2a)p>=}B}88gUZJjv6}*C} zis-8q&(ywWg|CqIjp&=_D|GqAie6!!rUNwvyh2oaR`Lq1-5jVn{1v=<`e{{- zoMo)A8V0Kz=$B_TmThE3)wr?Mfqn;6qh&WMsfMG(f&PS7BlsvQt42wv1N}{`#^Cd; zq8e+X9Oz$3HIiakbu~2ZI#8R|YD|5=>ee74#ep;oYf!6XO=>VI&w(_pYp}J1b*n*Y zl>@c)szE0e>ste__YS1BwFXzdu|YMc`{_X15jE(o=}6i!HJH)fk#v%35ZH}X*5IL` zBk7jb;PU{sp#}nhBeiR-!Gh7OZY|DQI8uAVTBvMUlUkTLJ5mShTI`t2y46BH%aJ;I z)uP)x*0&Z5mO4_Wt+kN)vO%?+H#t)0h+6auU}I`AdzT}1Nvg%cKvr3cZm-cr?nphoUSmuS z>-!or3mr*s>uYSRV1szpxYm*MBVHr_4IA?sI-ecMAn7&iT3O|5Z2Id+hNZ6&qwPe7 z4X;tv$%%TkzD7?yR<{n+*NJ)?)?w)o)}#)5hdWUp>pEOEW8LbIYVAaQz3Na0*0&CA zg-+COYaNWHu|aikb$6ov5p@tPU}NeaS?)vwl6XdW6|1a6#zrR^SXzfSTiJ#>wBO@I zgIen_Lc;3SW6Dt{8f;jPHKD9YJ%Z0U(GY8%S-!%$)#Ld!CmQNikB_%m-+FYt??gsh z>tXhk4XTHm!ikI{>M`dz8&i)ZMNTA0;`3Fq%6bI6b|RC~dhCD8Hq_(TXD1rgT931> ztgZ^OzfLsVP=!0%&NSRah2&1oG{Rbi%$}^93dMb#X{475HG^4S72XeXrcql}_&$aW zQbEhwnMOyb&=qWq3VmIj$uvm?lc}syg>iG7X-ugKn9nw-IA3ulvsM*6SF*ZlEZg8r zV-3|<7r>gRv3-{_jk8um9LTz<5pu+t%)QizJjwd1arKNdS!`7!{t_FcMpBG3Sw^T4 zcax1#BRavEtdi6?_n1}k@oCOvU8=^xEVe<7Jq6A*zEzEYGFG<%0oBfAW7vTGYSyFy z$38gI1nUNzX=2?PApPY`wq6amqv=Anz70rj??QH4dFHws8^p8LhAw0u(SXzeY)k|0 z8@mva8gOeAt89SG+=ZyL0g)5fh6bE+bRmaUUb%H5tNR99XSnd%t#2^TlQnq*+eI$q zWc>#Hy;-+6__x}HoW0(lb`$IS2C3Uz$YtvrMDO{ZqWg}kvi{#V&K|Oqz4wO0-s5ut zp2J}}Q5@i8h%6CvBxojxC1~Zq0hR_*38rO|1(ph;1(u~^1%53-9DrLKfWPba*YlCy z_x(A?2kANYc)e-GUGdQtDP+}m#g;1Ca95P>k|MVGu2^+|cH9-Yhoz8r-xW)~qyt>% zxD;_Cclr6As^4P|K#F*id%~ujy4>UEIw=x@@A303mERL>e@T&;dQTj=MYHdTtpidd zt+^+b57UZ!BJsHt$<_CSWRy1C6MD)rOliI+9&6H$d*aWDGED8h$L~9I;GU?qmSNh+ zJ+an_s^1s$JY|?}a$iLFQmQ9nzDlr{H7 zMH;QRFBUG9VOI5h;kleP+!wD_$S}M4zPPZ4cH9>`H^`9MeP1jprvu!sQieGr-0l;q z{y_Y`PlmZB55$SjsLKOhZj9O|YG4@ALD85T4@5aIo_=#eE&>GRXU7VzDH6P|UTU@xW7K_4eZucu47!pHQVzFX`+ufk*!=m_qu_!Vb7RGm| z%dj{-7>kv`!y@e|mGfEoSFtEg9TtZbW{?{>o|O1@>s+>QJ2SJ&?62X z20s=%{HXk~@C%K@w$#VsDroj&u_iVSm23E{e=@CjEWVu?hpOtwB6=Qecr1Qf6o>82 zk41Vm?RYF6sZ=&ja)_-dpJ~nwGPHd+xPXu#IZ|p*wg$( zMEp)Wo`_$r$Dz9WiI~$%2cC#Kx8tyPQm7%iDo|)vrOYrv*xL|ZA~klifpHN)K)(gw>)UWQ!&>s9tWGB zia$bV$5WArczoLZRJ6(Hz*7;K6pznFo{Cd5sQNSEJvSbQOrD7^7E+gI!Y(Twhl8Jq zeR)*=Oz0QK&; z{)~1!6Mr9xM??2BF|&ydJQJPY#^Z~TXF~P^Revtd{2Y%jO`eP34(jq;9Pf(9SHaJP z+f^!mE)M@4kE5y2g$2Jr9L;_%b`8X%am{m~GfXRhwV7ovu0mqu3 ziw1St@my%>CgAJt=c3S%4m=lsnkV4+2-mZt>Mz6rmjs+Jc_H3PsLKnnG#~-r1iug+ zVO0J?ctj`Q+te3ghn!}=;C&4VIJxG9n3F;)UWk@?3HYx1g|J;r8(xUA>;#-@e!=s< zw1X{#RS9VBej&bomkzuT2AdM_{m2Wkrh=-Eh<~aQaN1-9{65ufi*zz@MALj4ex zkBHoc1pJsfB7SS4*(1XLWCB{&jEL$VXvK(l^K$}Pt4GAb4%#px&UYo?O!J6vxk@`m z#J0Z^@Kg7QczBBru&pqVfS*T3#Hk^w{!&bQmVmP+FU7*w)a9i(rjUqp!7s(Q8kN5k z$vTNRpZZeN7|`sO;(=Kr+Sa@jVYam5rTD-(5$)A4#SKr|@KU(=C*nf$OR+kXcDxkr zNJK~XOJNvG2VROLNr|{P@=~0bLDgRgg}I5iWb#T(TS#4AiBB^V@k{V4F`P@~uSDd^ zMEsiiN>r|;*{{Su8xqmE=9O?SrxmZnx^0Q*s(vLdeoPx)36s5vxZKQE!$I2dN_m9Gf zm_`!1yI+eWJv#7O95714jgi;lz6Di(BfRXB@R!LOk>g5T-iXh=lJIx%8_^p;-0UYutQIUH-33r-DMg1k(F)IG|TM`Dk zM}^sSIxs3ydXjK=WK?YbkE)M}*1Ji#XEG-K8>TK}Lj8FX?gx(v$r~yk6EhT(@gQ|f ztWl@gW1>bU8G~!a#90GcF(&SqC1a?1OlaBChB4veoQ&b-F)_=Nc8rO4{gUypdrW*9 zLI=h~n@Gl^kuh;kO4Y}OZelVXn~V$p>C|Oh%uP+kli+c&A)U&{#pg?t@icW@T+E@_ z<6@{V8PC>?3;or!VqAEZB;$GYxQKk8HjInpt;u-NJTB6=(~fbGzbhFd-Q%KkKOJBT zE%ttx!6hjMu?$h09M={#GQlC*w`(TT%2Y&1M7R zN-{>*ycIuo(~7s^dT%nus^9Y8725DtyttQ)@#eSu9!fjj3gZ{ac-#F}IFHhSw<1Vs z3KU+x6|ovrMFF#QskQg;@Zd^cssb#J z(jKmRg7zsuznKmyK&N#Iy8{Z)I8R3vpnQp{C_?i$s;vmKYg5=EP=wn*)KU?l|58Uq z#1BwUMa&(V!Y+X#a-Px%MZEipN)@r{ElpCyeATJ!6euEEi>4{UWfIL$gpLW#Q^Zrt zsq7Xg;%|Fe!uEzMEo1w`i&iS4F<>e?28w71qcw^+97XFCQ5#De6|pyID!T@X*g1o? zC}R5@+NOvP7SK*blx0k1=Rgq~m(w0atY1O<6tQ|W9aKb7$y9a^6p{Bn9aTj3R;r?e zIoqkW62z{l>>wz?aX+uWGXufO4#y} z)+ixwoYpB}hRQS;H7X%w!ZdajlwduPwkScxn6@e5z6I@MOT=y(I}1u^cA-5=sFlz@ zC2aPmgG$H=oyP8h5~hNVDj`TlRg^I)k!rL3F>M;m43&AVpIR!TJdHXkWA+m2sSKB8 z)7WKD#>;#fp^Qt#RH}^nbu>vC+cr*vMT#^(_nK|86*GE9%Wp-OZ$|uZ^>+X{52g_hK|B?*s7@DPgSa| zf*o4Z*?~|&;v{OR0u2-DsDd_2>ZyYF?5DE}p@Ilk8o~C6gi2NLlRr&T!AGIf*@;lW z63{di_{(U93RDtlo(ir_o6c^83XaUCB`R2(M$1$fB&C&Xmt;?8M?wXs@@b6`bU&?*ZDQf|NtFPX!Yj=%5NZ z8>h27p@Oa7&`}l0zNac|o}8g-(&JKkt)?K2OstEjzI;!IFRqCmVV}DO)mqHcG zZ_x-B~b#Uh&->{#&EooEf$bEkExnB_wo*>DM*!LEfW>cVLYj}uMX`0KH>lgCM# z!On#$-kCvrRN*&=_NihxoerwvtEDs8y--C~4jom6eIZp*sTbiMU zqu*Y8`ZGw z!3=ga)Zq7+wy5Fn7qm?ct4C=kTQW*B+1XITes$WT28j;siieXCgdB9a)QMnmS%)(F}EL%cFVfuv$5j-41npy@r->zfxMp{obdQ+;8hlMDF5# zRkTJOAMT`e+;1Okjz7PoZR*JUns#!(lQV&<-0uh4qYlfTX&?7% zr-R(@*O}~oaKGQ_DEGTgRWva857pMd@_%Qt1ERreG}KZ98H3bO1OGmzo*Gy%GLu~p z4fKrC2o20tNPK84*84a97sqZ;^W3suqNpFP#q#OaSy5O1i7 z;A+Z-&B+?-s0rW0)Ke2*H>9vj!sbj9jnKrG-%zP0EWW2nn%LZ$g2WU}44$KDnn<}w zGc?iCMf2Fk`7?#x5=~Uype34k-b>3gk#n0?YU0k_6eRD`#L{6}qltf?(mG8nctsmE z@y~b)yC#~Lt1=5yS~PK8leTFhPLFnK;<(`~OuecJQ*+v*iA^@NPZReX>7XX2yU$|x zL=!)F(@{-6<44)X`7n%XPry^mVh3dc=F6z%1e{NxjuYT9je1VNu359#MVWxnc{E}I zG8R!bbGkBV65BVqv)Dn7m%5!yHbrj4`MRhfWICuqwA+&e|vCSZCC?VNxg z&dy?IWdiIwXb<04C+(YnCs*ho-&gl6c31emdgv(M*MC$+3tI=MwibE@XJM|P7QCNO zOD()VLLIemZIpUy!A)s4yDVBLQKu1F_)VKiwcwynleDnfWH#ofXyKA2P1Ayw(7F3qdHZ7!P(@rfM&6|ydSG6!+M0>O_eGTo?LR|?R)WXY6v)O&oLSh9S z)xyC_s-lf2A5(3%d#Yz+v7t8h)=*1rJUB!hwSflesf|w>XY=nyZSwDIT>t zc58HSZZj>>f#L_WOb6IbD|Jx1GZp!}bkMSw*684MEv?f*$mg_C2dlqGW!FXr-!;(| z9X$Ppw&}q6d)mpiQEMs+uj*jkIohLx!yU9w2fudGK^;85lFIIl4y?QBs1D+KsERI% z{-xTw*ncOL9UNVpe?TpDG4zN!>caR1_2k9>H>vF6=psj94pv6!;uBRW)y0n!Xp%1a z_2#gXqYGUlnx>0jbDF`XkPXe##fOe_*v-+!NjF-ei(W5UrVI4|TB!@4&^heruz@6K zjV?A%rgge#jH8XZxSl+RT^(J#ok3f4;W~%5>0(AY?bOBkC3D!>(M4T0?a{^MJldy= zks>;%3)?kw*xk`ZdB1P`XPGU;IaF^w2Uu>-2DCkT&X}|M47lef03^1#QuT?kH{3 zgT3NhZ0OWOklI{qysC#pE!v}pg%fF?9*T|VpdPlG&t>fyK}WkadWjcQNC zUtV*u$#5cu{Hf(cD1}nTi7*z_b0Rz@&t(^AA`nL-CSqnXl}^O688m4kN>b-ybIL?~ zoJP|oqJA;Wn26I^G;bm<=gws}Xd?bwK}#lLWWx$Fwjy|iT_-qg~ziFkdOcG8BqsJJ>2uNr9&Jwf{>;^iqi$n}1l%kB{U znT}56vl&!n5?=g5wI|{EZ*%d1A-zg1C*j#&)REq#o|EwO_FQ&}=v^8y2~UQols=(s zHa#Ahi)|@%l%`F>BgJ{xmO<5M-XuKKn#XR@Bn(faCDe$PO~Q~lt)w>dP_=6k1|4b5 zBs_4Vb<~SCPQrcvdF&d|5ZW>c_abTAB;1Xmom4&#JFZT`Koaet(`nx%+?h=WC!v4- zJa&)hB04$=eVJ56A2*g$ZGD_8oW~B5KHECfQXkdpsG~kMZJ?g|$lE-RT_kd}3{>Nzv{f?ID!}$kVsgFrN z&0|MNA8*dn8hzZkNbB_Rdlzlg$B%!^V^>KZ_1&~ZA0PG5HhsMNFYVMv=AC)$Ea_wF z1KOjHut&5{ACAxIpgwe8&trEp=pG~QAPBensyHlwF)_GI5rIrTFXQ#;kQ$lH)0YU`LFo45knr8sr zxcTfh8Q^6SEiu6D>9ouMU9)MW0h;H}XUE9^hZoTrwyiR0odMP?r;P?!TsR*GPZ}U` z6>Tv<&^p>?0K*Nm(*XD1pU=*d0e-5WJ#0}`(mn$$|CkOMAZpKicApGjbbyW;;K8R< z#SlN&QEfx)`EouEu}zhGj9MBZ`djK~2;=Xmry(A+%x4$M5NFTQ2yTCYN)3_sD^23| zzt6|#DTZua&@@8~{zWqkaqcF~WBcm%e0HM@k$;z#7$RnfmKnnI39U55(2Mz~-(`sN zZ)gqMSPE&VujBTrw9ycgC#10}#qITIiy?*$XqzFLO=+hg)>x&X;i@4*>}ii7UOLl0 zL!9=YgN9h=lg93pA=?Uc)DUk%sfrOg1l2Y|?c_9esEn{Oj#?TaE}1$S!D|rbkGRCm(tk1GQyKCI%(jA%qX4REMvSjqb0`p(VCVSqtJm?8pGT*ogFP>T=1kd#whZob;hs? zqK(G57?#eimN8a=wiv@kO52Rl9Y;Hju{SxLoh@U`nL&GuVVX+&jPcieI%tf2i_+QM zGRC}2I?DByQ#QCR7f@{zyjz^k4wng>)>2CoTq&WBCMelNJx$=cC7oR^6a4uhjWEH+ z9aL%p_gyr}1lRYbv(sgQO|>-51d_uv!vr^u&^!~A9ZhGq%LLxXX^9E`IZ4Y*P;r`8 zn!xW&Iy+t_xOtA&nBapBT4#d5PTFXKTfe8X>t%wu6vVqnjrsnIy+w` zP`OKcOt62D_L;!sNewkpwYdUIz=i^kx6nm8y;Ad@9Ox9Sy4wxw(YEw&7 z?4Lv(O%ZEMJx%f0d;z;)rl_@{5vGW9q*7Ddb)`wB*dSTJPM9f-{Aijfjt0>TQ^bVR zJX74j0(QepQ7EM)rcjNiWu~Y}rj@4fo3Vf$F*d+v(;8DOoKNda@nRuuG(}~`0(Qkr z;gCaHOmRA&wwYquO4@0PJF6G4GiHj?^|Z$n2Jg{6Q+!oM2Tc+6!2)*2OwnCMM@^Cc z2~{zJN;TCs!+`?}*da56?`PD~3>WLDqZt-{Nj=T*ylDZuWM-)RhDMmdp_xj}aQa7@ zWQJ)!FJPz4jLj>WW`@#BG{X!Amua3EzWQSUyJcpG>ZT=T=>CV6nIZoct>o+IU%-x; z8TQ|!HGCbzw9X72PiUhV&%Z2S*USvh-q02^Y*Sc>%WY;bQl*_{sMcJ_&Y2lZb!iWe zqfh(HU|~WB%}{Hxkliyg*x1rhGkoSqRm@@UMzziHxnvM^hY?n!_uZCYj^-^o8uCnZtKBO*6;0^Js=S0vFOebDUbbkmnlB z5weVynB#{$T4s*$B3fyV)^`@Nqh=2AF0C=g&l_l+IifeyMsu96SjeuLInNc*7IR$q zh_;zSzMFQM}qnmMK)r=#Zh^CVTVK+0*V zZGr2p3)x|_Kw`kvfF0CYp=A#0!gE^%mNn_7NMuo0&>+w?6_Ir5^sp^ zt+7CYF0Hdbr#@}8K(fgqcHJ!Sn+0vLz%*OhW`TA`+Gznlw?*u{S>T|A_Ez$ zZ4e!_KwsD*cHb;`cAkz};LK#IVhQ&+s%?qtq($t&SweX_wY0>FS=7-Iy>qFjCE^z> zVi(R5r#g(j>OX3Ky{xXNhI2XqqLit)&^3h%TjhmN>R)5xa4gFyBH; zEK%_xEn`z{JFT?DqMeJ_k+bBrd|G3P&>C82i6fuUMoSpfFJf2D5*xpyEtVK;qHUH) z`i6E|;`39B*qLJ^?FZUpiJ3pqK1+Oco(@_<>Ea@G=PWU|la5;A#P3wa3dYx{wiVw0 zYZ2}lTH#?YwX{Oof7H}$9ljd2$L3c5`byirfPfM)uhcPX)g1ZH+u<^EBLz7 zIxB4Tq>Wa%<+GSwJ1c|)(iSW12&HXS7>J~uRzS>Ro~JwS!3BpG{YJ{@1l9uFxj`5-8^d)*3uGdbR42( zY_1)lmDWi4YB4){)~G&4Ypn6tH?+wPJMFQ?@KxGp4d1`$pf!qn7qh!(jZ^>9QER;Frz$pxyHB-k@Y(QUcKB@Y z@(H!H!PF7zXoH3~)YArU-!5jC&jzzqmf&@S4UTD0sSRFf(&Pg=rGpA9w`(KH*J zHKQ3eP_d?YHi)%f!fu}pK5(WbHt2MxWj4_Brj<6B?!SZ`KO5`{rZqOW9!~4ngo~n$ zHb|2$Vb{+F2jggq4gO7{Z8mV6PCIRoHERhwe>V7XF72_wgLK+w1Ft1?&;~_WOW6Ih z!MDrlm6c5`4YWnjFepMSUObx5XcK>5wfHhL*59$VS{_I%bRc ^%K6piS?9e>6gdIXV^eHZd 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 J-{OPg6IA3vDD-EX> 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

_}s;;n7L^kpKV3YR<%$*VA6+ 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%0Ad}M6p74VwS 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%0Dt&Y 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Ð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 literal 0 HcmV?d00001 From 330a7807ed773068701ad1ea476eb0417dde9c1c Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Mon, 14 Oct 2019 21:31:22 +0200 Subject: [PATCH 075/208] Partial profile save dialog order If it's a partial profile, it's more intuitive to first allow the user to choose which parameters to save before showing the Save As dialog. Closes #5491 --- rtgui/profilepanel.cc | 69 ++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 37 deletions(-) diff --git a/rtgui/profilepanel.cc b/rtgui/profilepanel.cc index b4b85dfd0..627f413f3 100644 --- a/rtgui/profilepanel.cc +++ b/rtgui/profilepanel.cc @@ -275,6 +275,23 @@ void ProfilePanel::save_clicked (GdkEventButton* event) return; } + // If it's a partial profile, it's more intuitive to first allow the user + // to choose which parameters to save before showing the Save As dialog + // #5491 + if (event->state & Gdk::CONTROL_MASK) { + if(!partialProfileDlg) { + partialProfileDlg = new PartialPasteDlg (Glib::ustring (), parent); + } + + partialProfileDlg->set_title(M("PROFILEPANEL_SAVEPPASTE")); + int i = partialProfileDlg->run(); + partialProfileDlg->hide(); + + if (i != Gtk::RESPONSE_OK) { + return; + } + } + Gtk::FileChooserDialog dialog (getToplevelWindow (this), M("PROFILEPANEL_SAVEDLGLABEL"), Gtk::FILE_CHOOSER_ACTION_SAVE); bindCurrentFolder (dialog, options.loadSaveProfilePath); dialog.set_current_name (lastFilename); @@ -294,7 +311,6 @@ void ProfilePanel::save_clicked (GdkEventButton* event) dialog.add_button(M("GENERAL_SAVE"), Gtk::RESPONSE_OK); //Add filters, so that only certain file types can be selected: - Glib::RefPtr filter_pp = Gtk::FileFilter::create(); filter_pp->set_name(M("FILECHOOSER_FILTER_PP")); filter_pp->add_pattern("*" + paramFileExtension); @@ -305,8 +321,6 @@ void ProfilePanel::save_clicked (GdkEventButton* event) filter_any->add_pattern("*"); dialog.add_filter(filter_any); -// dialog.set_do_overwrite_confirmation (true); - bool done = false; do { @@ -337,45 +351,27 @@ void ProfilePanel::save_clicked (GdkEventButton* event) } if (toSave) { + int retCode; if (event->state & Gdk::CONTROL_MASK) { - // opening the partial paste dialog window - if(!partialProfileDlg) { - partialProfileDlg = new PartialPasteDlg (Glib::ustring (), parent); - } - partialProfileDlg->set_title(M("PROFILEPANEL_SAVEPPASTE")); - int i = partialProfileDlg->run(); - partialProfileDlg->hide(); - - if (i != Gtk::RESPONSE_OK) { - return; - } - - // saving the partial profile + // Build partial profile PartialProfile ppTemp(true); partialProfileDlg->applyPaste (ppTemp.pparams, ppTemp.pedited, toSave->pparams, toSave->pedited); - int retCode = ppTemp.pparams->save (fname, "", true, ppTemp.pedited); + // Save partial profile + retCode = ppTemp.pparams->save (fname, "", true, ppTemp.pedited); + // Cleanup ppTemp.deleteInstance(); - - if (retCode) { - writeFailed(dialog, fname); - } else { - done = true; - bool ccPrevState = changeconn.block(true); - ProfileStore::getInstance()->parseProfiles(); - changeconn.block (ccPrevState); - } } else { - // saving a full profile - int retCode = toSave->pparams->save (fname); + // Save full profile + retCode = toSave->pparams->save (fname); + } - if (retCode) { - writeFailed(dialog, fname); - } else { - done = true; - bool ccPrevState = changeconn.block(true); - ProfileStore::getInstance()->parseProfiles(); - changeconn.block (ccPrevState); - } + if (!retCode) { + done = true; + bool ccPrevState = changeconn.block(true); + ProfileStore::getInstance()->parseProfiles(); + changeconn.block (ccPrevState); + } else { + writeFailed(dialog, fname); } } else { done = true; @@ -465,7 +461,6 @@ void ProfilePanel::load_clicked (GdkEventButton* event) dialog.add_button(M("GENERAL_OPEN"), Gtk::RESPONSE_OK); //Add filters, so that only certain file types can be selected: - Glib::RefPtr filter_pp = Gtk::FileFilter::create(); filter_pp->set_name(M("FILECHOOSER_FILTER_PP")); filter_pp->add_pattern("*" + paramFileExtension); From de1c04b6336aef0cf52a477b7924952995c7c32e Mon Sep 17 00:00:00 2001 From: Andreas Hoenselaar Date: Sat, 19 Oct 2019 11:22:06 -0800 Subject: [PATCH 076/208] Use the same predictor for all Hasselblad files. --- rtengine/dcraw.cc | 27 +++++++-------------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index 400eb62a7..a1fc6ca08 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -2418,7 +2418,7 @@ void CLASS hasselblad_correct() void CLASS hasselblad_load_raw() { struct jhead jh; - int *back[5], diff[12]; + int diff[12]; if (!ljpeg_start (&jh, 0)) { return; @@ -2426,16 +2426,12 @@ void CLASS hasselblad_load_raw() order = 0x4949; ph1_bithuff_t ph1_bithuff(this, ifp, order); hb_bits(-1); - back[4] = (int *) calloc(raw_width, 3 * sizeof **back); - merror(back[4], "hasselblad_load_raw()"); - for (int c = 0; c < 3; ++c) { - back[c] = back[4] + c * raw_width; - } const int shot = LIM(shot_select, 1, tiff_samples) - 1; for (int row = 0; row < raw_height; ++row) { - for (int c = 0; c < 4; ++c) { - back[(c + 3) & 3] = back[c]; - } + int stashed_predictors[2] = { + static_cast(0x8000 + load_flags), + static_cast(0x8000 + load_flags) + }; for (int col = 0; col < raw_width; col += 2) { for (int s = 0; s < tiff_samples * 2; s += 2) { const int len[2]= { @@ -2453,15 +2449,7 @@ void CLASS hasselblad_load_raw() } } for (int s = col; s < col + 2; ++s) { - int pred; - if (col) { - pred = back[2][s - 2]; - if (row > 1 && jh.psv == 11) { - pred += (back[0][s] - back[0][s - 2]) / 2; - } - } else { - pred = 0x8000 + load_flags; - } + int pred = stashed_predictors[s % 2]; for (int c = 0; c < tiff_samples; ++c) { pred += diff[(s & 1) * tiff_samples + c]; const unsigned upix = pred & 0xffff; @@ -2478,13 +2466,12 @@ void CLASS hasselblad_load_raw() } } if (c == (tiff_samples-1)) { - back[2][s] = static_cast(upix); + stashed_predictors[s % 2] = pred; } } } } } - free(back[4]); ljpeg_end(&jh); if (image) { mix_green = 1; From 1bffb54977a6e37eeb77bf6c92320364fcabf87e Mon Sep 17 00:00:00 2001 From: Andreas Hoenselaar Date: Sat, 19 Oct 2019 21:25:36 -0800 Subject: [PATCH 077/208] Calculate the initial predictor only once. --- rtengine/dcraw.cc | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index a1fc6ca08..eb206a15f 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -2427,11 +2427,9 @@ void CLASS hasselblad_load_raw() ph1_bithuff_t ph1_bithuff(this, ifp, order); hb_bits(-1); const int shot = LIM(shot_select, 1, tiff_samples) - 1; + const int predictor_init = static_cast(0x8000 + load_flags); for (int row = 0; row < raw_height; ++row) { - int stashed_predictors[2] = { - static_cast(0x8000 + load_flags), - static_cast(0x8000 + load_flags) - }; + int stashed_predictors[2] = {predictor_init, predictor_init}; for (int col = 0; col < raw_width; col += 2) { for (int s = 0; s < tiff_samples * 2; s += 2) { const int len[2]= { @@ -2449,7 +2447,7 @@ void CLASS hasselblad_load_raw() } } for (int s = col; s < col + 2; ++s) { - int pred = stashed_predictors[s % 2]; + int pred = stashed_predictors[s & 1]; for (int c = 0; c < tiff_samples; ++c) { pred += diff[(s & 1) * tiff_samples + c]; const unsigned upix = pred & 0xffff; @@ -2466,7 +2464,7 @@ void CLASS hasselblad_load_raw() } } if (c == (tiff_samples-1)) { - stashed_predictors[s % 2] = pred; + stashed_predictors[s & 1] = pred; } } } From 0ede513e3b5fb16d4ce2e266cc6c7672cdea5e99 Mon Sep 17 00:00:00 2001 From: scx Date: Sun, 20 Oct 2019 23:30:14 +0200 Subject: [PATCH 078/208] Update desktop file - Add StartupNotify entry --- rtdata/rawtherapee.desktop.in | 1 + 1 file changed, 1 insertion(+) diff --git a/rtdata/rawtherapee.desktop.in b/rtdata/rawtherapee.desktop.in index b059e7d6a..f6bc3afeb 100644 --- a/rtdata/rawtherapee.desktop.in +++ b/rtdata/rawtherapee.desktop.in @@ -17,4 +17,5 @@ Terminal=false MimeType=image/jpeg;image/png;image/tiff;image/x-adobe-dng;image/x-canon-cr2;image/x-canon-crf;image/x-canon-crw;image/x-fuji-raf;image/x-hasselblad-3fr;image/x-hasselblad-fff;image/x-jpg;image/x-kodak-dcr;image/x-kodak-k25;image/x-kodak-kdc;image/x-leaf-mos;image/x-leica-rwl;image/x-mamiya-mef;image/x-minolta-mrw;image/x-nikon-nef;image/x-nikon-nrw;image/x-olympus-orf;image/x-panasonic-raw;image/x-panasonic-rw2;image/x-pentax-pef;image/x-pentax-raw;image/x-phaseone-iiq;image/x-raw;image/x-rwz;image/x-samsung-srw;image/x-sigma-x3f;image/x-sony-arq;image/x-sony-arw;image/x-sony-sr2;image/x-sony-srf;image/x-tif; Categories=Graphics;Photography;2DGraphics;RasterGraphics;GTK; Keywords=raw;photo;photography;develop;pp3;graphics; +StartupNotify=true StartupWMClass=rawtherapee From 095b5233a9082b3bf2286dde29d5368c45d9d92e Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 21 Oct 2019 22:50:17 +0200 Subject: [PATCH 079/208] partial save code review --- rtgui/profilepanel.cc | 50 +++++++++++++++++++------------------------ 1 file changed, 22 insertions(+), 28 deletions(-) diff --git a/rtgui/profilepanel.cc b/rtgui/profilepanel.cc index 627f413f3..a6885d7d3 100644 --- a/rtgui/profilepanel.cc +++ b/rtgui/profilepanel.cc @@ -278,23 +278,24 @@ void ProfilePanel::save_clicked (GdkEventButton* event) // If it's a partial profile, it's more intuitive to first allow the user // to choose which parameters to save before showing the Save As dialog // #5491 - if (event->state & Gdk::CONTROL_MASK) { - if(!partialProfileDlg) { - partialProfileDlg = new PartialPasteDlg (Glib::ustring (), parent); + const auto isPartial = event->state & Gdk::CONTROL_MASK; + if (isPartial) { + if (!partialProfileDlg) { + partialProfileDlg = new PartialPasteDlg(Glib::ustring(), parent); } partialProfileDlg->set_title(M("PROFILEPANEL_SAVEPPASTE")); - int i = partialProfileDlg->run(); + const auto response = partialProfileDlg->run(); partialProfileDlg->hide(); - if (i != Gtk::RESPONSE_OK) { + if (response != Gtk::RESPONSE_OK) { return; } } - Gtk::FileChooserDialog dialog (getToplevelWindow (this), M("PROFILEPANEL_SAVEDLGLABEL"), Gtk::FILE_CHOOSER_ACTION_SAVE); - bindCurrentFolder (dialog, options.loadSaveProfilePath); - dialog.set_current_name (lastFilename); + Gtk::FileChooserDialog dialog(getToplevelWindow(this), M("PROFILEPANEL_SAVEDLGLABEL"), Gtk::FILE_CHOOSER_ACTION_SAVE); + bindCurrentFolder(dialog, options.loadSaveProfilePath); + dialog.set_current_name(lastFilename); //Add the user's default (or global if multiuser=false) profile path to the Shortcut list try { @@ -311,33 +312,32 @@ void ProfilePanel::save_clicked (GdkEventButton* event) dialog.add_button(M("GENERAL_SAVE"), Gtk::RESPONSE_OK); //Add filters, so that only certain file types can be selected: - Glib::RefPtr filter_pp = Gtk::FileFilter::create(); + auto filter_pp = Gtk::FileFilter::create(); filter_pp->set_name(M("FILECHOOSER_FILTER_PP")); filter_pp->add_pattern("*" + paramFileExtension); dialog.add_filter(filter_pp); - Glib::RefPtr filter_any = Gtk::FileFilter::create(); + auto filter_any = Gtk::FileFilter::create(); filter_any->set_name(M("FILECHOOSER_FILTER_ANY")); filter_any->add_pattern("*"); dialog.add_filter(filter_any); - bool done = false; + bool done = true; do { if (dialog.run() == Gtk::RESPONSE_OK) { std::string fname = dialog.get_filename(); - Glib::ustring ext = getExtension (fname); - if (("." + ext) != paramFileExtension) { + if (("." + getExtension(fname)) != paramFileExtension) { fname += paramFileExtension; } - if (!confirmOverwrite (dialog, fname)) { + if (!confirmOverwrite(dialog, fname)) { continue; } - lastFilename = Glib::path_get_basename (fname); + lastFilename = Glib::path_get_basename(fname); const PartialProfile* toSave; @@ -347,7 +347,7 @@ void ProfilePanel::save_clicked (GdkEventButton* event) toSave = lastsaved; } else { const ProfileStoreEntry* entry = profiles->getSelectedEntry(); - toSave = entry ? ProfileStore::getInstance()->getProfile (profiles->getSelectedEntry()) : nullptr; + toSave = entry ? ProfileStore::getInstance()->getProfile(entry) : nullptr; } if (toSave) { @@ -355,33 +355,27 @@ void ProfilePanel::save_clicked (GdkEventButton* event) if (event->state & Gdk::CONTROL_MASK) { // Build partial profile PartialProfile ppTemp(true); - partialProfileDlg->applyPaste (ppTemp.pparams, ppTemp.pedited, toSave->pparams, toSave->pedited); + partialProfileDlg->applyPaste(ppTemp.pparams, ppTemp.pedited, toSave->pparams, toSave->pedited); // Save partial profile - retCode = ppTemp.pparams->save (fname, "", true, ppTemp.pedited); + retCode = ppTemp.pparams->save(fname, "", true, ppTemp.pedited); // Cleanup ppTemp.deleteInstance(); } else { // Save full profile - retCode = toSave->pparams->save (fname); + retCode = toSave->pparams->save(fname); } if (!retCode) { - done = true; - bool ccPrevState = changeconn.block(true); + const auto ccPrevState = changeconn.block(true); ProfileStore::getInstance()->parseProfiles(); - changeconn.block (ccPrevState); + changeconn.block(ccPrevState); } else { + done = false; writeFailed(dialog, fname); } - } else { - done = true; } - } else { - done = true; } } while (!done); - - return; } /* From 45900cbd68fdd56515a90f867b6665d4b8252d57 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 21 Oct 2019 23:02:48 +0200 Subject: [PATCH 080/208] partial save code review --- rtgui/profilepanel.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtgui/profilepanel.cc b/rtgui/profilepanel.cc index a6885d7d3..fc418e5b7 100644 --- a/rtgui/profilepanel.cc +++ b/rtgui/profilepanel.cc @@ -346,13 +346,13 @@ void ProfilePanel::save_clicked (GdkEventButton* event) } else if (isLastSavedSelected()) { toSave = lastsaved; } else { - const ProfileStoreEntry* entry = profiles->getSelectedEntry(); + const auto entry = profiles->getSelectedEntry(); toSave = entry ? ProfileStore::getInstance()->getProfile(entry) : nullptr; } if (toSave) { int retCode; - if (event->state & Gdk::CONTROL_MASK) { + if (isPartial) { // Build partial profile PartialProfile ppTemp(true); partialProfileDlg->applyPaste(ppTemp.pparams, ppTemp.pedited, toSave->pparams, toSave->pedited); From 0e209a0bc103cff752839a21fa0c1533b5f88af2 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 22 Oct 2019 14:12:38 +0200 Subject: [PATCH 081/208] Capture Sharpening: Highlights zone with Color Propagation are filled in a purple color, fixes #5505 --- rtengine/capturesharpening.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index 6720d9abc..38fe0897c 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -810,6 +810,7 @@ BENCHFUN if (plistener) { plistener->setProgress(1.0); } + rgbSourceModified = false; } } /* namespace */ From 959849f098b526f74ac7b43b600cefa44409a271 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 22 Oct 2019 14:32:36 +0200 Subject: [PATCH 082/208] Favorites tab: hide vertical scrollbar --- rtgui/toolpanelcoord.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index 4fec4a18a..deea489fe 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -178,7 +178,6 @@ ToolPanelCoordinator::ToolPanelCoordinator (bool batch) : ipc (nullptr), favorit transformPanelSW = Gtk::manage (new MyScrolledWindow ()); rawPanelSW = Gtk::manage (new MyScrolledWindow ()); advancedPanelSW = Gtk::manage (new MyScrolledWindow ()); - updateVScrollbars (options.hideTPVScrollbar); // load panel endings for (int i = 0; i < 7; i++) { @@ -195,6 +194,7 @@ ToolPanelCoordinator::ToolPanelCoordinator (bool batch) : ipc (nullptr), favorit favoritePanel->pack_start(*Gtk::manage(new Gtk::HSeparator), Gtk::PACK_SHRINK, 0); favoritePanel->pack_start(*vbPanelEnd[0], Gtk::PACK_SHRINK, 4); } + updateVScrollbars(options.hideTPVScrollbar); exposurePanelSW->add (*exposurePanel); exposurePanel->pack_start (*Gtk::manage (new Gtk::HSeparator), Gtk::PACK_SHRINK, 0); From 6a44170aff6400a1936f0431ee727318646e9a73 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Wed, 23 Oct 2019 18:01:04 +0200 Subject: [PATCH 083/208] Fix shadow/highlight clipping indicator keyboard shortcuts in tooltips Closes #5493 --- rtdata/languages/Czech | 4 ++-- rtdata/languages/Deutsch | 4 ++-- rtdata/languages/English (UK) | 4 ++-- rtdata/languages/English (US) | 4 ++-- rtdata/languages/Espanol | 4 ++-- rtdata/languages/Francais | 4 ++-- rtdata/languages/Italiano | 4 ++-- rtdata/languages/Japanese | 4 ++-- rtdata/languages/Nederlands | 4 ++-- rtdata/languages/Polish | 4 ++-- rtdata/languages/Portugues | 4 ++-- rtdata/languages/Portugues (Brasil) | 4 ++-- rtdata/languages/Russian | 4 ++-- rtdata/languages/Swedish | 4 ++-- rtdata/languages/default | 4 ++-- 15 files changed, 30 insertions(+), 30 deletions(-) diff --git a/rtdata/languages/Czech b/rtdata/languages/Czech index 5c807b61d..f45b39ef2 100644 --- a/rtdata/languages/Czech +++ b/rtdata/languages/Czech @@ -961,8 +961,8 @@ MAIN_TOOLTIP_BACKCOLOR2;Barva pozadí náhledu: bílá\nZkratka: 9 MAIN_TOOLTIP_BACKCOLOR3;Barva pozadí náhledu: středně šedá\nZkratka: 9 MAIN_TOOLTIP_BEFOREAFTERLOCK;Zamknout / Odemknout pohled Před\n\nZamknout: ponechá pohled Před nezměněn.\nUžitečné pro posouzení výsledného efektu po použití více nástrojů.\nNavíc může být porovnání provedeno proti kterémukoli stavu v historii.\n\nOdemknout: pohled Před bude následovat pohled Poté, vždy jen o jeden krok zpět, představí vliv právě použitého nástroje. MAIN_TOOLTIP_HIDEHP;Zobrazit či schovat levý panel (obsahující historii).\nZkratka: l -MAIN_TOOLTIP_INDCLIPPEDH;Zvýraznit oříznutá světla.\nZkratka: < -MAIN_TOOLTIP_INDCLIPPEDS;Zvýraznit oříznuté stíny.\nZkratka: > +MAIN_TOOLTIP_INDCLIPPEDH;Zvýraznit oříznutá světla.\nZkratka: > +MAIN_TOOLTIP_INDCLIPPEDS;Zvýraznit oříznuté stíny.\nZkratka: < MAIN_TOOLTIP_PREVIEWB;Náhled modrého kanálu.\nZkratka: b MAIN_TOOLTIP_PREVIEWFOCUSMASK;Náhled masky zaostření.\nZkratka: Shift-f\n\nVíce přesné u snímků s nízkou hloubkou ostrosti, nízkým šumem a na vyšších úrovních zvětšení.\n\nPoužijte přiblížení v rozsahu 10 až 30% pro zlepšení přesnosti detekce u zašuměných snímků. MAIN_TOOLTIP_PREVIEWG;Náhled zeleného kanálu.\nZkratka: g diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index 2f7dbaf4c..2ec2a020d 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -1012,8 +1012,8 @@ MAIN_TOOLTIP_BACKCOLOR2;Hintergrundfarbe der Vorschau: Weiß\nTaste: 9 MAIN_TOOLTIP_BACKCOLOR3;Hintergrundfarbe der Vorschau: Mittleres Grau\nTaste: 9 MAIN_TOOLTIP_BEFOREAFTERLOCK;Vorher-Ansicht: Sperren / Entsperren\n\nGesperrt: Friert die Vorher-Ansicht ein, so\ndass sich die Gesamtwirkung mehrerer\nBearbeitungsschritte beurteilen lässt.\n\nEntsperrt: Die Vorher-Ansicht hinkt dem\naktuellen Bild immer einen Bearbeitungs-\nschritt hinterher. MAIN_TOOLTIP_HIDEHP;Linkes Bedienfeld ein-/ausblenden.\nTaste: l -MAIN_TOOLTIP_INDCLIPPEDH;Anzeige zu heller Bereiche ein-/ausschalten.\nTaste: < -MAIN_TOOLTIP_INDCLIPPEDS;Anzeige zu dunkler Bereiche ein-/ausschalten.\nTaste: > +MAIN_TOOLTIP_INDCLIPPEDH;Anzeige zu heller Bereiche ein-/ausschalten.\nTaste: > +MAIN_TOOLTIP_INDCLIPPEDS;Anzeige zu dunkler Bereiche ein-/ausschalten.\nTaste: < MAIN_TOOLTIP_PREVIEWB;Vorschau Blau-Kanal\nTaste: b MAIN_TOOLTIP_PREVIEWFOCUSMASK;Vorschau Fokusmaske\nTaste: Umschalt + f\n\nPräziser bei Bildern mit geringer Tiefenschärfe,\nniedrigem Rauschen und bei hoher Vergrößerung. MAIN_TOOLTIP_PREVIEWG;Vorschau Grün-Kanal\nTaste: g diff --git a/rtdata/languages/English (UK) b/rtdata/languages/English (UK) index a36a3d1a9..01f23c1e9 100644 --- a/rtdata/languages/English (UK) +++ b/rtdata/languages/English (UK) @@ -1022,8 +1022,8 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !MAIN_TAB_TRANSFORM_TOOLTIP;Shortcut: Alt-t !MAIN_TOOLTIP_BEFOREAFTERLOCK;Lock / Unlock the Before view\n\nLock: keep the Before view unchanged.\nUseful to evaluate the cumulative effect of multiple tools.\nAdditionally, comparisons can be made to any state in the History.\n\nUnlock: the Before view will follow the After view one step behind, showing the image before the effect of the currently used tool. !MAIN_TOOLTIP_HIDEHP;Show/Hide the left panel (including the history).\nShortcut: l -!MAIN_TOOLTIP_INDCLIPPEDH;Clipped highlight indication.\nShortcut: < -!MAIN_TOOLTIP_INDCLIPPEDS;Clipped shadow indication.\nShortcut: > +!MAIN_TOOLTIP_INDCLIPPEDH;Clipped highlight indication.\nShortcut: > +!MAIN_TOOLTIP_INDCLIPPEDS;Clipped shadow indication.\nShortcut: < !MAIN_TOOLTIP_PREVIEWB;Preview the blue channel.\nShortcut: b !MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the focus mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\nZoom out to 10-30% to improve detection accuracy on noisy images. !MAIN_TOOLTIP_PREVIEWG;Preview the green channel.\nShortcut: g diff --git a/rtdata/languages/English (US) b/rtdata/languages/English (US) index aa5239911..0e80fb985 100644 --- a/rtdata/languages/English (US) +++ b/rtdata/languages/English (US) @@ -939,8 +939,8 @@ !MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9 !MAIN_TOOLTIP_BEFOREAFTERLOCK;Lock / Unlock the Before view\n\nLock: keep the Before view unchanged.\nUseful to evaluate the cumulative effect of multiple tools.\nAdditionally, comparisons can be made to any state in the History.\n\nUnlock: the Before view will follow the After view one step behind, showing the image before the effect of the currently used tool. !MAIN_TOOLTIP_HIDEHP;Show/Hide the left panel (including the history).\nShortcut: l -!MAIN_TOOLTIP_INDCLIPPEDH;Clipped highlight indication.\nShortcut: < -!MAIN_TOOLTIP_INDCLIPPEDS;Clipped shadow indication.\nShortcut: > +!MAIN_TOOLTIP_INDCLIPPEDH;Clipped highlight indication.\nShortcut: > +!MAIN_TOOLTIP_INDCLIPPEDS;Clipped shadow indication.\nShortcut: < !MAIN_TOOLTIP_PREVIEWB;Preview the blue channel.\nShortcut: b !MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the focus mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\nZoom out to 10-30% to improve detection accuracy on noisy images. !MAIN_TOOLTIP_PREVIEWG;Preview the green channel.\nShortcut: g diff --git a/rtdata/languages/Espanol b/rtdata/languages/Espanol index 27aa39c12..478a9a9eb 100644 --- a/rtdata/languages/Espanol +++ b/rtdata/languages/Espanol @@ -979,8 +979,8 @@ MAIN_TOOLTIP_BACKCOLOR2;Color de fondo de la previsualización: Blanco\nT MAIN_TOOLTIP_BACKCOLOR3;Color de fondo de la vista previa: Medio gris \nMétodo rápido: 9 MAIN_TOOLTIP_BEFOREAFTERLOCK;Bloquear / Desbloquear la vista Antes\n\nBloquear: la vista Antes permanece inalterada - \nútil para evaluar el efecto acumulativo de varias herramientas.\nAdemás, se puede hacer una comparación con cualquier estado en el Historial\n\nDesbloquear: la vista Antes seguirá a la vista Después un paso por detrás, mostrando la imagen antes del efecto de la herramienta que se está usando MAIN_TOOLTIP_HIDEHP;Mostrar/Ocultar panel izquierdo (incluyendo historial).\nTecla de Atajo: i -MAIN_TOOLTIP_INDCLIPPEDH;Indicación de luces altas recortadas.\nTecla de Atajo: < -MAIN_TOOLTIP_INDCLIPPEDS;Indicación de sombras recortadas.\nTecla de Atajo: > +MAIN_TOOLTIP_INDCLIPPEDH;Indicación de luces altas recortadas.\nTecla de Atajo: > +MAIN_TOOLTIP_INDCLIPPEDS;Indicación de sombras recortadas.\nTecla de Atajo: < MAIN_TOOLTIP_PREVIEWB;Previsualización Canal azul.\nTecla de Atajo: b MAIN_TOOLTIP_PREVIEWFOCUSMASK;Previsualización Máscara de Foco.\nTecla de Atajo: Shift-F\n\nMás preciso en imágenes con poca profundidad de campo, bajo ruido y a mayores niveles de aumento\n\nPara mejorar la precisión en imágenes con ruido evalúe usando menor aumento (10%-30%)\n\nLa vista previa es realizada más lentamente cuando la Máscara de Foco esta activa. MAIN_TOOLTIP_PREVIEWG;Previsualización Canal verde.\nTecla de Atajo: g diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index 9f9485c70..60a7368d2 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -916,8 +916,8 @@ MAIN_TOOLTIP_BACKCOLOR2;Couleur de fond de l'aperçu: Blanc\nRaccourci: < MAIN_TOOLTIP_BACKCOLOR3;Couleur de fond de l'aperçu: Gris moyen\nRaccourci : 9 MAIN_TOOLTIP_BEFOREAFTERLOCK;Vérouille / déverouille la vue Avant\n\nVérouille: garde la vue Avant inchangée - \nutile pour évaluer l'effet cumulatif de plusieurs outils.\nDe plus, une comparaison peut être faite à partir de n'importe quelle étape de l'historique\n\nDéverouille: la vue Avant représentera l'étape précédant la vue Après, montrant l'effet qui vient d'être modifié MAIN_TOOLTIP_HIDEHP;Montrer/cacher le panneau gauche (incluant l'historique)\nRaccourci: l -MAIN_TOOLTIP_INDCLIPPEDH;Indication hautes lumières hors domaine\nRaccourci: < -MAIN_TOOLTIP_INDCLIPPEDS;Indication ombres hors domaine\nRaccourci: > +MAIN_TOOLTIP_INDCLIPPEDH;Indication hautes lumières hors domaine\nRaccourci: > +MAIN_TOOLTIP_INDCLIPPEDS;Indication ombres hors domaine\nRaccourci: < MAIN_TOOLTIP_PREVIEWB;Affichage du canal Bleu\nRaccourci: b MAIN_TOOLTIP_PREVIEWFOCUSMASK;Affichage du Masque du focus\nRaccourci: Shift-f\n\nPlus précis sur les images avec une faible profondeur de champ, à faible bruit et à des niveaux de zoom élevé\n\nPour améliorer la précision de détection des images bruitées, évaluez les à un facteur de zoom de 10-30%\n\nLa prévisualisation met plus de temps à se calculer lorsque cet outil est actif. MAIN_TOOLTIP_PREVIEWG;Affichage du canal Vert\nRaccourci: g diff --git a/rtdata/languages/Italiano b/rtdata/languages/Italiano index 7ba18b2d8..f388332b8 100644 --- a/rtdata/languages/Italiano +++ b/rtdata/languages/Italiano @@ -519,8 +519,8 @@ MAIN_TOOLTIP_BACKCOLOR1;Colore di sfondo dell'anteprima: Nero\nScorciatoi MAIN_TOOLTIP_BACKCOLOR2;Colore di sfondo dell'anteprima: Bianco\nScorciatoia: 9 MAIN_TOOLTIP_BEFOREAFTERLOCK;Blocca/Sblocca la vista Prima\n\nBlocca: Conserva la vista Prima.\nUtile per valutare l'effetto cumulativo di diversi strumenti.\nIn più, possono essere confrontati diversi passi della cronologia.\n\nSblocca: la vista Prima segue di un passo la vista Dopo, mostrando l'immagine prima dell'effetto dello strumento corrente. MAIN_TOOLTIP_HIDEHP;Mostra/Nascondi il pannello sinistro (inclusa la cronologia)\nScorciatoia: l -MAIN_TOOLTIP_INDCLIPPEDH;Indicazione delle alteluci tosate.\nScorciatoia: < -MAIN_TOOLTIP_INDCLIPPEDS;Indicazione delle ombre tosate.\nScorciatoia: > +MAIN_TOOLTIP_INDCLIPPEDH;Indicazione delle alteluci tosate.\nScorciatoia: > +MAIN_TOOLTIP_INDCLIPPEDS;Indicazione delle ombre tosate.\nScorciatoia: < MAIN_TOOLTIP_PREVIEWB;Anteprima del Canale Blu.\nScorciatoia: b MAIN_TOOLTIP_PREVIEWFOCUSMASK;Anteprima della Focus Mask.\nScorciatoia: Maiuscolo-F\n\nPiù accurato su immagini con bassa profondità di campo, poco rumore e ad elevati livelli di zoom.\n\nPer aumentare l'accuratezza della rilevazione su immagini con molto rumore, riduci le dimensioni del 10-30%. MAIN_TOOLTIP_PREVIEWG;Anteprima del Canale Verde.\nScorciatoia: g diff --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese index 83b8caa30..242ef7631 100644 --- a/rtdata/languages/Japanese +++ b/rtdata/languages/Japanese @@ -960,8 +960,8 @@ MAIN_TOOLTIP_BACKCOLOR2;プレビューの背景色を指定します: 中間のグレー\nショートカット: 9 MAIN_TOOLTIP_BEFOREAFTERLOCK;固定 / 固定解除 - 補正前 の表示設定\n\n固定: 補正前をそのまま表示し変更されません\n複数のツールの累積効果を評価するのに役立ちます\nさらに、比較は履歴上のどこからでも行うことができます\n\n固定解除: 現在使用のツールの効果が 補正後 に表示され、その1段階前が 補正前 に表示されます MAIN_TOOLTIP_HIDEHP;左パネル 表示/非表示 (履歴含む)\nショートカット: l -MAIN_TOOLTIP_INDCLIPPEDH;ハイライト・クリッピング領域の表示\nショートカット: < -MAIN_TOOLTIP_INDCLIPPEDS;シャドウ・クリッピング領域の表示\nショートカット: > +MAIN_TOOLTIP_INDCLIPPEDH;ハイライト・クリッピング領域の表示\nショートカット: > +MAIN_TOOLTIP_INDCLIPPEDS;シャドウ・クリッピング領域の表示\nショートカット: < MAIN_TOOLTIP_PREVIEWB;ブルー チャンネル表示\nショートカット: b MAIN_TOOLTIP_PREVIEWFOCUSMASK;フォーカス・マスク表示\nショートカット: Shift-f\n\n浅い被写界深度、低ノイズ、高ズームの画像の場合は、より正確に\n\nノイズの多い画像に対しては、検出精度を向上させるため10から30%縮小して評価します\n\nフォーカス・マスクをオンにすると表示に時間が掛かります MAIN_TOOLTIP_PREVIEWG;グリーン チャンネル表示\nショートカット: g diff --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands index 5e2c92742..12bce5305 100644 --- a/rtdata/languages/Nederlands +++ b/rtdata/languages/Nederlands @@ -788,8 +788,8 @@ MAIN_TOOLTIP_BACKCOLOR1;Achtergrond kleur van het voorbeeld: Zwart\nSnelt MAIN_TOOLTIP_BACKCOLOR2;Achtergrond kleur van het voorbeeld: Wit\nSneltoets: 0 MAIN_TOOLTIP_BEFOREAFTERLOCK;Vergrendel / Ontgrendel de Voorafbeelding.\n\nVergrendel: hou de Voorafbeelding ongewijzigd.\nDit is handig om het cumulatieve effect van meerdere gereedschappen te beoordelen.\nBovendien kan er worden vergeleken met elke stap in de geschiedenislijst.\n\nOntgrendel: de Voorafbeelding volgt een stap achter de Naafbeelding en laat de afbeelding zien zonder het effect van het huidige gereedschap. MAIN_TOOLTIP_HIDEHP;Toon/verberg linkerpaneel (geschiedenis).\nSneltoets: H -MAIN_TOOLTIP_INDCLIPPEDH;Overbelichtingsindicatie.\nSneltoets: < -MAIN_TOOLTIP_INDCLIPPEDS;Onderbelichtingsindicatie.\nSneltoets: > +MAIN_TOOLTIP_INDCLIPPEDH;Overbelichtingsindicatie.\nSneltoets: > +MAIN_TOOLTIP_INDCLIPPEDS;Onderbelichtingsindicatie.\nSneltoets: < MAIN_TOOLTIP_PREVIEWB;Bekijk het Blauwe kanaal.\nSneltoets: b MAIN_TOOLTIP_PREVIEWFOCUSMASK;Bekijk het Focus Masker.\nSneltoets: Shift-F\n\nAccurater bij afbeeldingen met geringe scherptediepte, weinig ruis en hogere zoomniveaus.\n\nBekijk de afbeelding op lagere zoomniveaus (10-30%) om de accuratesse te vergroten bij afbeeldingen met veel ruis.\n\nHet voorbeeld wordt langzamer aangemaakt als Focus Masker aanstaat. MAIN_TOOLTIP_PREVIEWG;Bekijk het Groene kanaal.\nSneltoets: g diff --git a/rtdata/languages/Polish b/rtdata/languages/Polish index 2e8a4549f..440093ef3 100644 --- a/rtdata/languages/Polish +++ b/rtdata/languages/Polish @@ -563,8 +563,8 @@ MAIN_TOOLTIP_BACKCOLOR1;Kolor tła podglądu: Czarny\nSkrót: 9 MAIN_TOOLTIP_BACKCOLOR2;Kolor tła podglądu: Biały\nSkrót: 9 MAIN_TOOLTIP_BEFOREAFTERLOCK;Zablokuj / Odblokuj widok Przed\n\nZablokuj: nie zmieniaj widoku Przed - \nPrzydatne w porównywaniu zablokowanego obrazu z obrazem na ktorym wykonano wiele zmian.\n\nOdblokuj: widok Przed będzie śledził widok Po o jeden krok do tyłu, pokazując obraz przed efektem aktualnie użytego narzędzia. MAIN_TOOLTIP_HIDEHP;Pokaż/ukryj lewy panel (razem z historią).\nSkrót: l -MAIN_TOOLTIP_INDCLIPPEDH;Pokaż obcięte prześwietlenia.\nSkrót: < -MAIN_TOOLTIP_INDCLIPPEDS;Pokaż obcięte niedoświetlenia.\nSkrót: > +MAIN_TOOLTIP_INDCLIPPEDH;Pokaż obcięte prześwietlenia.\nSkrót: > +MAIN_TOOLTIP_INDCLIPPEDS;Pokaż obcięte niedoświetlenia.\nSkrót: < MAIN_TOOLTIP_PREVIEWB;Podgląd kanału niebieskiego.\nSkrót: b MAIN_TOOLTIP_PREVIEWFOCUSMASK;Podgląd maski ostrości.\nSkrót: Shift-f\n\nDokładniejsze w przypadku zdjęc o płytkiej głębi ostrości, niskim pozimie szumów i o większym przybliżeniu. W przypadku zdjęć o wyższym poziomie szumów maska ostrości będzie dokładniejsza przy mniejszym zoomie (10-30%). MAIN_TOOLTIP_PREVIEWG;Podgląd kanału zielonego.\nSkrót: g diff --git a/rtdata/languages/Portugues b/rtdata/languages/Portugues index c4adbc7f9..33d1e32a1 100644 --- a/rtdata/languages/Portugues +++ b/rtdata/languages/Portugues @@ -916,8 +916,8 @@ MAIN_TOOLTIP_BACKCOLOR2;Cor de fundo da pré-visualização: branco\nAtal MAIN_TOOLTIP_BACKCOLOR3;Cor de fundo da pré-visualização: cinza médio\nAtalho: 9 MAIN_TOOLTIP_BEFOREAFTERLOCK;Bloquear / desbloquear a visualização antes\n\nBloquear: manter a visualização antes inalterada.\nÚtil para avaliar o efeito cumulativo de várias ferramentas.\nAlém disso, podem ser feitas comparações a qualquer momento no histórico.\n\nDesbloquear: a visualização antes seguirá a visualização depois um passo antes, mostrando a imagem antes do efeito da ferramenta atualmente utilizada. MAIN_TOOLTIP_HIDEHP;Mostrar o painel esquerdo (incluindo o histórico).\nAtalho: l -MAIN_TOOLTIP_INDCLIPPEDH;Ver altas luzes cortadas.\nAtalho: < -MAIN_TOOLTIP_INDCLIPPEDS;Ver sombras cortadas.\nAtalho: > +MAIN_TOOLTIP_INDCLIPPEDH;Ver altas luzes cortadas.\nAtalho: > +MAIN_TOOLTIP_INDCLIPPEDS;Ver sombras cortadas.\nAtalho: < MAIN_TOOLTIP_PREVIEWB;Pré-visualizar o canal azul.\nAtalho: b MAIN_TOOLTIP_PREVIEWFOCUSMASK;Pré-visualizar a máscara de foco.\nAtalho: Shift-f\n\nMais preciso em imagens com pouca profundidade de campo, baixo ruído e níveis de zoom mais altos.\n\nUtilize um zoom menor entre 10-30% para melhorar a precisão da deteção de imagens com muito ruído. MAIN_TOOLTIP_PREVIEWG;Pré-visualizar o canal verde.\nAtalho: g diff --git a/rtdata/languages/Portugues (Brasil) b/rtdata/languages/Portugues (Brasil) index 259cabb7e..794bc20d2 100644 --- a/rtdata/languages/Portugues (Brasil) +++ b/rtdata/languages/Portugues (Brasil) @@ -923,8 +923,8 @@ MAIN_TOOLTIP_BACKCOLOR2;Cor de fundo da pré-visualização: Branco\nAtal MAIN_TOOLTIP_BACKCOLOR3;Cor de fundo da pré-visualização: Cinza médio\nAtalho: 9 MAIN_TOOLTIP_BEFOREAFTERLOCK;Travar / Destravar a Antes visualização\n\nTravar: mantenha o Antes visualização inalterada.\nÚtil para avaliar o efeito cumulativo de várias ferramentas.\nAlém disso, comparações podem ser feitas a qualquer momento.\n\nDestravar: o Antes visualização seguinte Depois visualização anterior, mostrando a imagem antes do efeito da ferramenta atualmente utilizada. MAIN_TOOLTIP_HIDEHP;Mostrar/Ocultar o painel esquerdo (incluindo o histórico).\nAtalho: l -MAIN_TOOLTIP_INDCLIPPEDH;Indicação de realce recortado.\nAtalho: < -MAIN_TOOLTIP_INDCLIPPEDS;Indicação de sombra recortada.\nAtalho: > +MAIN_TOOLTIP_INDCLIPPEDH;Indicação de realce recortado.\nAtalho: > +MAIN_TOOLTIP_INDCLIPPEDS;Indicação de sombra recortada.\nAtalho: < MAIN_TOOLTIP_PREVIEWB;Pré-visualize o Canal Azul.\nAtalho: b MAIN_TOOLTIP_PREVIEWFOCUSMASK;Pré-visualize a Máscara de Foco.\nAtalho: Shift-f\n\nMais preciso em imagens com pouca profundidade de campo, baixo ruído e níveis de zoom mais altos.\n\nPara melhorar a precisão da detecção de imagens ruidosas, avalie com zoom menor, cerca de 10-30%. MAIN_TOOLTIP_PREVIEWG;Pré-visualize o Canal verde.\nAtalho: g diff --git a/rtdata/languages/Russian b/rtdata/languages/Russian index 2014f9aad..0512fb37c 100644 --- a/rtdata/languages/Russian +++ b/rtdata/languages/Russian @@ -613,8 +613,8 @@ MAIN_TOOLTIP_BACKCOLOR1;Фоновый цвет предпросмотра: MAIN_TOOLTIP_BACKCOLOR2;Фоновый цвет предпросмотра: Белый\nГорячая клавиша: 9 MAIN_TOOLTIP_BEFOREAFTERLOCK;Заблокировать / Разблокировать предыдущий вид\n\nЗаблокировать: сохраняет предыдущий вид неизменным.\nПолезно для оценки общего эффекта от применения нескольких инструментов.\nК тому же, сравнения могут быть произведены на любом состоянии истории\n\nРазблокировать: предыдущий вид будет следовать сразу за следующим, показывая состояние изображения до применения текущего инструмента. MAIN_TOOLTIP_HIDEHP;Показать/скрыть левую панель (включая историю).\nГорячая клавиша l -MAIN_TOOLTIP_INDCLIPPEDH;Индикатор пересветов.\nГорячая клавиша: < -MAIN_TOOLTIP_INDCLIPPEDS;Индикатор затемнений.\nГорячая клавиша: > +MAIN_TOOLTIP_INDCLIPPEDH;Индикатор пересветов.\nГорячая клавиша: > +MAIN_TOOLTIP_INDCLIPPEDS;Индикатор затемнений.\nГорячая клавиша: < MAIN_TOOLTIP_PREVIEWB;Просмотреть канал синего.\nГорячая клавиша: b MAIN_TOOLTIP_PREVIEWFOCUSMASK;Просмотреть Маску резкости.\nГорячая клавиша: Shift-F\n\nБолее точна на изображениях с небольшой глубиной резкости, малым шумом и при большем приближении изображения\n\nДля улучшения определения на шумных изображениях используйте на маленьком зуме 10-30% MAIN_TOOLTIP_PREVIEWG;Просмотреть канал зеленого.\nГорячая клавиша: g diff --git a/rtdata/languages/Swedish b/rtdata/languages/Swedish index fbc55624d..34c32e632 100644 --- a/rtdata/languages/Swedish +++ b/rtdata/languages/Swedish @@ -698,8 +698,8 @@ MAIN_TOOLTIP_BACKCOLOR1;Bakgrundsfärg: Svart\nKortkommando: 9 MAIN_TOOLTIP_BACKCOLOR2;Bakgrundsfärg: Vit\nKortkommando: 9 MAIN_TOOLTIP_BEFOREAFTERLOCK;Lås / Lås upp före-vyn\n\nLås: behåll före-vyn oförändrad.\nAnvändbart för att utvärdera den sammanlagda effekten av flera stegs redigering. Dessutom kan jämförelser göras gentemot varje annat steg i historiken.\n\nLås upp: Före-vyn kommer hela tiden visa ett tidigare steg jämfört med efter-vyn, och visar därmed effekten av det verktyg som användes senast. MAIN_TOOLTIP_HIDEHP;Visa/göm den vänstra panelen. Kortkommando: l -MAIN_TOOLTIP_INDCLIPPEDH;Markera högdagerindikation.\nKortkommando: < -MAIN_TOOLTIP_INDCLIPPEDS;Markera skuggindikation.\nKortkommando: > +MAIN_TOOLTIP_INDCLIPPEDH;Markera högdagerindikation.\nKortkommando: > +MAIN_TOOLTIP_INDCLIPPEDS;Markera skuggindikation.\nKortkommando: < MAIN_TOOLTIP_PREVIEWB;Förhandsgranska den blå kanalen.\nGenväg: b MAIN_TOOLTIP_PREVIEWFOCUSMASK;Förhandsgranska fokusmasken.\nKortkommando: Shift-f\n\nNoggrannare på bilder med kort skärpedjup, lågt brus och där en hög zoom-grad är vald.\n\nFör att förbättra detekteringen för brusiga bilder, utvärdera vid en zoom-grad om 10-30%\n\nFörhandsvisningen görs långsammare med fokusmasken påslagen. MAIN_TOOLTIP_PREVIEWG;Förhandsgranska den gröna kanalen.\nGenväg: g diff --git a/rtdata/languages/default b/rtdata/languages/default index 968a8c0ed..d6f146dbb 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -938,8 +938,8 @@ MAIN_TOOLTIP_BACKCOLOR2;Background color of the preview: white\nShortcut: MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9 MAIN_TOOLTIP_BEFOREAFTERLOCK;Lock / Unlock the Before view\n\nLock: keep the Before view unchanged.\nUseful to evaluate the cumulative effect of multiple tools.\nAdditionally, comparisons can be made to any state in the History.\n\nUnlock: the Before view will follow the After view one step behind, showing the image before the effect of the currently used tool. MAIN_TOOLTIP_HIDEHP;Show/Hide the left panel (including the history).\nShortcut: l -MAIN_TOOLTIP_INDCLIPPEDH;Clipped highlight indication.\nShortcut: < -MAIN_TOOLTIP_INDCLIPPEDS;Clipped shadow indication.\nShortcut: > +MAIN_TOOLTIP_INDCLIPPEDH;Clipped highlight indication.\nShortcut: > +MAIN_TOOLTIP_INDCLIPPEDS;Clipped shadow indication.\nShortcut: < MAIN_TOOLTIP_PREVIEWB;Preview the blue channel.\nShortcut: b MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the focus mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\nZoom out to 10-30% to improve detection accuracy on noisy images. MAIN_TOOLTIP_PREVIEWG;Preview the green channel.\nShortcut: g From 37e7a705abd28c01350d99cb75b83bd70af96cc3 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Wed, 23 Oct 2019 20:22:03 +0200 Subject: [PATCH 084/208] Review of flatfield code, own compilation unit, use clip control value 0 when using auto clip control on already clipped image, code review --- rtdata/languages/default | 2 +- rtengine/CMakeLists.txt | 1 + rtengine/rawflatfield.cc | 559 +++++++++++++++++++++++++++++++++++++ rtengine/rawimagesource.cc | 552 ------------------------------------ rtengine/rawimagesource.h | 1 - rtgui/flatfield.cc | 2 +- 6 files changed, 562 insertions(+), 555 deletions(-) create mode 100644 rtengine/rawflatfield.cc diff --git a/rtdata/languages/default b/rtdata/languages/default index 968a8c0ed..cad717e6f 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1667,7 +1667,7 @@ TP_FLATFIELD_BT_HORIZONTAL;Horizontal TP_FLATFIELD_BT_VERTHORIZ;Vertical + Horizontal TP_FLATFIELD_BT_VERTICAL;Vertical TP_FLATFIELD_CLIPCONTROL;Clip control -TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, clip control can lead to color cast. +TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, value 0 is used. TP_FLATFIELD_LABEL;Flat-Field TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1. TP_GRADIENT_CENTER;Center diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt index 40ddaefbb..52ec61b2f 100644 --- a/rtengine/CMakeLists.txt +++ b/rtengine/CMakeLists.txt @@ -111,6 +111,7 @@ set(RTENGINESOURCEFILES processingjob.cc procparams.cc profilestore.cc + rawflatfield.cc rawimage.cc rawimagesource.cc rcd_demosaic.cc diff --git a/rtengine/rawflatfield.cc b/rtengine/rawflatfield.cc new file mode 100644 index 000000000..8d8ed0873 --- /dev/null +++ b/rtengine/rawflatfield.cc @@ -0,0 +1,559 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2004-2017 Gabor Horvath + * + * RawTherapee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RawTherapee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RawTherapee. If not, see . + */ +#include +#include + +#include "rtengine.h" +#include "rawimagesource.h" +#include "rawimage.h" +#include "procparams.h" +//#define BENCHMARK +//#include "StopWatch.h" +#include "opthelper.h" + +namespace { + +void cfaboxblur(float** riFlatFile, float* cfablur, int boxH, int boxW, int H, int W) +{ + + if (boxW < 0 || boxH < 0 || (boxW == 0 && boxH == 0)) { // nothing to blur or negative values + memcpy(cfablur, riFlatFile[0], W * H * sizeof(float)); + return; + } + + float *tmpBuffer = nullptr; + float *cfatmp = nullptr; + float *srcVertical = nullptr; + + + if (boxH > 0 && boxW > 0) { + // we need a temporary buffer if we have to blur both directions + tmpBuffer = (float (*)) calloc (H * W, sizeof * tmpBuffer); + } + + if (boxH == 0) { + // if boxH == 0 we can skip the vertical blur and process the horizontal blur from riFlatFile to cfablur without using a temporary buffer + cfatmp = cfablur; + } else { + cfatmp = tmpBuffer; + } + + if (boxW == 0) { + // if boxW == 0 we can skip the horizontal blur and process the vertical blur from riFlatFile to cfablur without using a temporary buffer + srcVertical = riFlatFile[0]; + } else { + srcVertical = cfatmp; + } + +#ifdef _OPENMP + #pragma omp parallel +#endif + { + + if (boxW > 0) { + //box blur cfa image; box size = BS + //horizontal blur +#ifdef _OPENMP + #pragma omp for +#endif + + for (int row = 0; row < H; row++) { + int len = boxW / 2 + 1; + cfatmp[row * W + 0] = riFlatFile[row][0] / len; + cfatmp[row * W + 1] = riFlatFile[row][1] / len; + + for (int j = 2; j <= boxW; j += 2) { + cfatmp[row * W + 0] += riFlatFile[row][j] / len; + cfatmp[row * W + 1] += riFlatFile[row][j + 1] / len; + } + + for (int col = 2; col <= boxW; col += 2) { + cfatmp[row * W + col] = (cfatmp[row * W + col - 2] * len + riFlatFile[row][boxW + col]) / (len + 1); + cfatmp[row * W + col + 1] = (cfatmp[row * W + col - 1] * len + riFlatFile[row][boxW + col + 1]) / (len + 1); + len ++; + } + + for (int col = boxW + 2; col < W - boxW; col++) { + cfatmp[row * W + col] = cfatmp[row * W + col - 2] + (riFlatFile[row][boxW + col] - cfatmp[row * W + col - boxW - 2]) / len; + } + + for (int col = W - boxW; col < W; col += 2) { + cfatmp[row * W + col] = (cfatmp[row * W + col - 2] * len - cfatmp[row * W + col - boxW - 2]) / (len - 1); + + if (col + 1 < W) { + cfatmp[row * W + col + 1] = (cfatmp[row * W + col - 1] * len - cfatmp[row * W + col - boxW - 1]) / (len - 1); + } + + len --; + } + } + } + + if (boxH > 0) { + //vertical blur +#ifdef __SSE2__ + const vfloat leninitv = F2V(boxH / 2 + 1); + const vfloat onev = F2V(1.f); +#ifdef _OPENMP + #pragma omp for nowait +#endif + + for (int col = 0; col < W - 7; col += 8) { + vfloat lenv = leninitv; + vfloat temp1v = LVFU(srcVertical[0 * W + col]) / lenv; + vfloat temp2v = LVFU(srcVertical[1 * W + col]) / lenv; + vfloat temp3v = LVFU(srcVertical[0 * W + col + 4]) / lenv; + vfloat temp4v = LVFU(srcVertical[1 * W + col + 4]) / lenv; + + for (int i = 2; i < boxH + 2; i += 2) { + temp1v += LVFU(srcVertical[i * W + col]) / lenv; + temp2v += LVFU(srcVertical[(i + 1) * W + col]) / lenv; + temp3v += LVFU(srcVertical[i * W + col + 4]) / lenv; + temp4v += LVFU(srcVertical[(i + 1) * W + col + 4]) / lenv; + } + + STVFU(cfablur[0 * W + col], temp1v); + STVFU(cfablur[1 * W + col], temp2v); + STVFU(cfablur[0 * W + col + 4], temp3v); + STVFU(cfablur[1 * W + col + 4], temp4v); + + int row; + for (row = 2; row < boxH + 2; row += 2) { + const vfloat lenp1v = lenv + onev; + temp1v = (temp1v * lenv + LVFU(srcVertical[(row + boxH) * W + col])) / lenp1v; + temp2v = (temp2v * lenv + LVFU(srcVertical[(row + boxH + 1) * W + col])) / lenp1v; + temp3v = (temp3v * lenv + LVFU(srcVertical[(row + boxH) * W + col + 4])) / lenp1v; + temp4v = (temp4v * lenv + LVFU(srcVertical[(row + boxH + 1) * W + col + 4])) / lenp1v; + STVFU(cfablur[row * W + col], temp1v); + STVFU(cfablur[(row + 1)*W + col], temp2v); + STVFU(cfablur[row * W + col + 4], temp3v); + STVFU(cfablur[(row + 1)*W + col + 4], temp4v); + lenv = lenp1v; + } + + for (; row < H - boxH - 1; row += 2) { + temp1v = temp1v + (LVFU(srcVertical[(row + boxH) * W + col]) - LVFU(srcVertical[(row - boxH - 2) * W + col])) / lenv; + temp2v = temp2v + (LVFU(srcVertical[(row + 1 + boxH) * W + col]) - LVFU(srcVertical[(row + 1 - boxH - 2) * W + col])) / lenv; + temp3v = temp3v + (LVFU(srcVertical[(row + boxH) * W + col + 4]) - LVFU(srcVertical[(row - boxH - 2) * W + col + 4])) / lenv; + temp4v = temp4v + (LVFU(srcVertical[(row + 1 + boxH) * W + col + 4]) - LVFU(srcVertical[(row + 1 - boxH - 2) * W + col + 4])) / lenv; + STVFU(cfablur[row * W + col], temp1v); + STVFU(cfablur[(row + 1)*W + col], temp2v); + STVFU(cfablur[row * W + col + 4], temp3v); + STVFU(cfablur[(row + 1)*W + col + 4], temp4v); + } + + if (row < H - boxH) { + temp1v = temp1v + (LVFU(srcVertical[(row + boxH) * W + col]) - LVFU(srcVertical[(row - boxH - 2) * W + col])) / lenv; + temp3v = temp3v + (LVFU(srcVertical[(row + boxH) * W + col + 4]) - LVFU(srcVertical[(row - boxH - 2) * W + col + 4])) / lenv; + STVFU(cfablur[row * W + col], temp1v); + STVFU(cfablur[row * W + col + 4], temp3v); + vfloat swapv = temp1v; + temp1v = temp2v; + temp2v = swapv; + swapv = temp3v; + temp3v = temp4v; + temp4v = swapv; + ++row; + } + + for (; row < H - 1; row += 2) { + const vfloat lenm1v = lenv - onev; + temp1v = (temp1v * lenv - LVFU(srcVertical[(row - boxH - 2) * W + col])) / lenm1v; + temp2v = (temp2v * lenv - LVFU(srcVertical[(row - boxH - 1) * W + col])) / lenm1v; + temp3v = (temp3v * lenv - LVFU(srcVertical[(row - boxH - 2) * W + col + 4])) / lenm1v; + temp4v = (temp4v * lenv - LVFU(srcVertical[(row - boxH - 1) * W + col + 4])) / lenm1v; + STVFU(cfablur[row * W + col], temp1v); + STVFU(cfablur[(row + 1)*W + col], temp2v); + STVFU(cfablur[row * W + col + 4], temp3v); + STVFU(cfablur[(row + 1)*W + col + 4], temp4v); + lenv = lenm1v; + } + + if (row < H) { + vfloat lenm1v = lenv - onev; + temp1v = (temp1v * lenv - LVFU(srcVertical[(row - boxH - 2) * W + col])) / lenm1v; + temp3v = (temp3v * lenv - LVFU(srcVertical[(row - boxH - 2) * W + col + 4])) / lenm1v; + STVFU(cfablur[(row)*W + col], temp1v); + STVFU(cfablur[(row)*W + col + 4], temp3v); + } + + } + +#ifdef _OPENMP + #pragma omp single +#endif + + for (int col = W - (W % 8); col < W; col++) { + int len = boxH / 2 + 1; + cfablur[0 * W + col] = srcVertical[0 * W + col] / len; + cfablur[1 * W + col] = srcVertical[1 * W + col] / len; + + for (int i = 2; i < boxH + 2; i += 2) { + cfablur[0 * W + col] += srcVertical[i * W + col] / len; + cfablur[1 * W + col] += srcVertical[(i + 1) * W + col] / len; + } + + for (int row = 2; row < boxH + 2; row += 2) { + cfablur[row * W + col] = (cfablur[(row - 2) * W + col] * len + srcVertical[(row + boxH) * W + col]) / (len + 1); + cfablur[(row + 1)*W + col] = (cfablur[(row - 1) * W + col] * len + srcVertical[(row + boxH + 1) * W + col]) / (len + 1); + len ++; + } + + for (int row = boxH + 2; row < H - boxH; row++) { + cfablur[row * W + col] = cfablur[(row - 2) * W + col] + (srcVertical[(row + boxH) * W + col] - srcVertical[(row - boxH - 2) * W + col]) / len; + } + + for (int row = H - boxH; row < H; row += 2) { + cfablur[row * W + col] = (cfablur[(row - 2) * W + col] * len - srcVertical[(row - boxH - 2) * W + col]) / (len - 1); + + if (row + 1 < H) { + cfablur[(row + 1)*W + col] = (cfablur[(row - 1) * W + col] * len - srcVertical[(row - boxH - 1) * W + col]) / (len - 1); + } + + len --; + } + } + +#else +#ifdef _OPENMP + #pragma omp for +#endif + + for (int col = 0; col < W; col++) { + int len = boxH / 2 + 1; + cfablur[0 * W + col] = srcVertical[0 * W + col] / len; + cfablur[1 * W + col] = srcVertical[1 * W + col] / len; + + for (int i = 2; i < boxH + 2; i += 2) { + cfablur[0 * W + col] += srcVertical[i * W + col] / len; + cfablur[1 * W + col] += srcVertical[(i + 1) * W + col] / len; + } + + for (int row = 2; row < boxH + 2; row += 2) { + cfablur[row * W + col] = (cfablur[(row - 2) * W + col] * len + srcVertical[(row + boxH) * W + col]) / (len + 1); + cfablur[(row + 1)*W + col] = (cfablur[(row - 1) * W + col] * len + srcVertical[(row + boxH + 1) * W + col]) / (len + 1); + len ++; + } + + for (int row = boxH + 2; row < H - boxH; row++) { + cfablur[row * W + col] = cfablur[(row - 2) * W + col] + (srcVertical[(row + boxH) * W + col] - srcVertical[(row - boxH - 2) * W + col]) / len; + } + + for (int row = H - boxH; row < H; row += 2) { + cfablur[row * W + col] = (cfablur[(row - 2) * W + col] * len - srcVertical[(row - boxH - 2) * W + col]) / (len - 1); + + if (row + 1 < H) { + cfablur[(row + 1)*W + col] = (cfablur[(row - 1) * W + col] * len - srcVertical[(row - boxH - 1) * W + col]) / (len - 1); + } + + len --; + } + } + +#endif + } + } + + if (tmpBuffer) { + free (tmpBuffer); + } +} + +} + +namespace rtengine +{ + +void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile, unsigned short black[4]) +{ +// BENCHFUN + float *cfablur = new float[H * W]; + int BS = raw.ff_BlurRadius; + BS += BS & 1; + + if (raw.ff_BlurType == RAWParams::getFlatFieldBlurTypeString(RAWParams::FlatFieldBlurType::V)) { + cfaboxblur(riFlatFile->data, cfablur, 2 * BS, 0, H, W); + } else if (raw.ff_BlurType == RAWParams::getFlatFieldBlurTypeString(RAWParams::FlatFieldBlurType::H)) { + cfaboxblur(riFlatFile->data, cfablur, 0, 2 * BS, H, W); + } else if (raw.ff_BlurType == RAWParams::getFlatFieldBlurTypeString(RAWParams::FlatFieldBlurType::VH)) { + //slightly more complicated blur if trying to correct both vertical and horizontal anomalies + cfaboxblur(riFlatFile->data, cfablur, BS, BS, H, W); //first do area blur to correct vignette + } else { //(raw.ff_BlurType == RAWParams::getFlatFieldBlurTypeString(RAWParams::area_ff)) + cfaboxblur(riFlatFile->data, cfablur, BS, BS, H, W); + } + + if (ri->getSensorType() == ST_BAYER || ri->get_colors() == 1) { + float refcolor[2][2]; + + // find center values by channel + for (int m = 0; m < 2; ++m) + for (int n = 0; n < 2; ++n) { + const int row = 2 * (H >> 2) + m; + const int col = 2 * (W >> 2) + n; + const int c = ri->get_colors() != 1 ? FC(row, col) : 0; + const int c4 = ri->get_colors() != 1 ? ((c == 1 && !(row & 1)) ? 3 : c) : 0; + refcolor[m][n] = std::max(0.0f, cfablur[row * W + col] - black[c4]); + } + + float limitFactor = 1.f; + + if (raw.ff_AutoClipControl) { + bool clippedBefore = false; + for (int m = 0; m < 2 && !clippedBefore; ++m) { + for (int n = 0; n < 2 && !clippedBefore; ++n) { + float maxval = 0.f; + const int c = ri->get_colors() != 1 ? FC(m, n) : 0; + const int c4 = ri->get_colors() != 1 ? ((c == 1 && !(m & 1)) ? 3 : c) : 0; + const float clipVal = ri->get_white(c4); +#ifdef _OPENMP + #pragma omp parallel for reduction(max:maxval) schedule(dynamic, 16) +#endif + for (int row = 0; row < H - m; row += 2) { + for (int col = 0; col < W - n && !clippedBefore; col += 2) { + const float rawVal = rawData[row + m][col + n]; + if (rawVal >= clipVal) { + clippedBefore = true; + break; + } + const float tempval = (rawVal - black[c4]) * (refcolor[m][n] / std::max(1e-5f, cfablur[(row + m) * W + col + n] - black[c4])); + maxval = std::max(maxval, tempval); + } + } + + // now we have the max value for the channel + // if it clips, calculate factor to avoid clipping + if (maxval + black[c4] >= ri->get_white(c4)) { + if (!clippedBefore) { + limitFactor = std::min(limitFactor, ri->get_white(c4) / (maxval + black[c4])); + } else { + limitFactor = 1.f; + } + } + } + } + flatFieldAutoClipValue = (1.f - limitFactor) * 100.f; // this value can be used to set the clip control slider in gui + } else { + limitFactor = std::max((float)(100 - raw.ff_clipControl) / 100.f, 0.01f); + } + + for (int m = 0; m < 2; ++m) + for (int n = 0; n < 2; ++n) { + refcolor[m][n] *= limitFactor; + } + + unsigned int c[2][2] {}; + unsigned int c4[2][2] {}; + if (ri->get_colors() != 1) { + for (int i = 0; i < 2; ++i) { + for (int j = 0; j < 2; ++j) { + c[i][j] = FC(i, j); + } + } + c4[0][0] = (c[0][0] == 1) ? 3 : c[0][0]; + c4[0][1] = (c[0][1] == 1) ? 3 : c[0][1]; + c4[1][0] = c[1][0]; + c4[1][1] = c[1][1]; + } + + constexpr float minValue = 1.f; // if the pixel value in the flat field is less or equal this value, no correction will be applied. + +#ifdef __SSE2__ + const vfloat refcolorv[2] = {_mm_set_ps(refcolor[0][1], refcolor[0][0], refcolor[0][1], refcolor[0][0]), + _mm_set_ps(refcolor[1][1], refcolor[1][0], refcolor[1][1], refcolor[1][0]) + }; + const vfloat blackv[2] = {_mm_set_ps(black[c4[0][1]], black[c4[0][0]], black[c4[0][1]], black[c4[0][0]]), + _mm_set_ps(black[c4[1][1]], black[c4[1][0]], black[c4[1][1]], black[c4[1][0]]) + }; + + const vfloat onev = F2V(1.f); + const vfloat minValuev = F2V(minValue); +#endif +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + + for (int row = 0; row < H; ++row) { + int col = 0; +#ifdef __SSE2__ + const vfloat rowBlackv = blackv[row & 1]; + const vfloat rowRefcolorv = refcolorv[row & 1]; + + for (; col < W - 3; col += 4) { + const vfloat blurv = LVFU(cfablur[(row) * W + col]) - rowBlackv; + vfloat vignettecorrv = rowRefcolorv / blurv; + vignettecorrv = vself(vmaskf_le(blurv, minValuev), onev, vignettecorrv); + const vfloat valv = LVFU(rawData[row][col]) - rowBlackv; + STVFU(rawData[row][col], valv * vignettecorrv + rowBlackv); + } + +#endif + + for (; col < W; ++col) { + const float blur = cfablur[(row) * W + col] - black[c4[row & 1][col & 1]]; + const float vignettecorr = blur <= minValue ? 1.f : refcolor[row & 1][col & 1] / blur; + rawData[row][col] = (rawData[row][col] - black[c4[row & 1][col & 1]]) * vignettecorr + black[c4[row & 1][col & 1]]; + } + } + } else if (ri->getSensorType() == ST_FUJI_XTRANS) { + float refcolor[3] = {0.f}; + int cCount[3] = {0}; + + // find center average values by channel + for (int m = -3; m < 3; ++m) + for (int n = -3; n < 3; ++n) { + const int row = 2 * (H >> 2) + m; + const int col = 2 * (W >> 2) + n; + const int c = riFlatFile->XTRANSFC(row, col); + refcolor[c] += std::max(0.0f, cfablur[row * W + col] - black[c]); + cCount[c] ++; + } + + for (int c = 0; c < 3; ++c) { + refcolor[c] = refcolor[c] / cCount[c]; + } + + float limitFactor = 1.f; + + if (raw.ff_AutoClipControl) { + // determine maximum calculated value to avoid clipping + bool clippedBefore = false; + const float clipVal = ri->get_white(0); + float maxval = 0.f; + // xtrans files have only one black level actually, so we can simplify the code a bit +#ifdef _OPENMP + #pragma omp parallel for reduction(max:maxval) schedule(dynamic,16) +#endif + for (int row = 0; row < H; ++row) { + for (int col = 0; col < W && !clippedBefore; ++col) { + const float rawVal = rawData[row][col]; + if (rawVal >= clipVal) { + clippedBefore = true; + break; + } + const float tempval = (rawVal - black[0]) * (refcolor[ri->XTRANSFC(row, col)] / std::max(1e-5f, cfablur[(row) * W + col] - black[0])); + maxval = std::max(maxval, tempval); + } + } + + // there's only one white level for xtrans + if (!clippedBefore && maxval + black[0] > ri->get_white(0)) { + limitFactor = ri->get_white(0) / (maxval + black[0]); + flatFieldAutoClipValue = (1.f - limitFactor) * 100.f; // this value can be used to set the clip control slider in gui + } + } else { + limitFactor = std::max((float)(100 - raw.ff_clipControl) / 100.f, 0.01f); + } + + + for (int c = 0; c < 3; ++c) { + refcolor[c] *= limitFactor; + } + + constexpr float minValue = 1.f; // if the pixel value in the flat field is less or equal this value, no correction will be applied. + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int row = 0; row < H; ++row) { + for (int col = 0; col < W; ++col) { + const int c = ri->XTRANSFC(row, col); + const float blur = cfablur[(row) * W + col] - black[c]; + const float vignettecorr = blur <= minValue ? 1.f : refcolor[c] / blur; + rawData[row][col] = (rawData[row][col] - black[c]) * vignettecorr + black[c]; + } + } + } + + if (raw.ff_BlurType == RAWParams::getFlatFieldBlurTypeString(RAWParams::FlatFieldBlurType::VH)) { + float *cfablur1 = new float[H * W]; + float *cfablur2 = new float[H * W]; + //slightly more complicated blur if trying to correct both vertical and horizontal anomalies + cfaboxblur(riFlatFile->data, cfablur1, 0, 2 * BS, H, W); //now do horizontal blur + cfaboxblur(riFlatFile->data, cfablur2, 2 * BS, 0, H, W); //now do vertical blur + + if (ri->getSensorType() == ST_BAYER || ri->get_colors() == 1) { + unsigned int c[2][2] {}; + unsigned int c4[2][2] {}; + if (ri->get_colors() != 1) { + for (int i = 0; i < 2; ++i) { + for (int j = 0; j < 2; ++j) { + c[i][j] = FC(i, j); + } + } + c4[0][0] = (c[0][0] == 1) ? 3 : c[0][0]; + c4[0][1] = (c[0][1] == 1) ? 3 : c[0][1]; + c4[1][0] = c[1][0]; + c4[1][1] = c[1][1]; + } + +#ifdef __SSE2__ + const vfloat blackv[2] = {_mm_set_ps(black[c4[0][1]], black[c4[0][0]], black[c4[0][1]], black[c4[0][0]]), + _mm_set_ps(black[c4[1][1]], black[c4[1][0]], black[c4[1][1]], black[c4[1][0]]) + }; + + const vfloat epsv = F2V(1e-5f); +#endif +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + + for (int row = 0; row < H; ++row) { + int col = 0; +#ifdef __SSE2__ + const vfloat rowBlackv = blackv[row & 1]; + + for (; col < W - 3; col += 4) { + const vfloat linecorrv = SQRV(vmaxf(LVFU(cfablur[row * W + col]) - rowBlackv, epsv)) / + (vmaxf(LVFU(cfablur1[row * W + col]) - rowBlackv, epsv) * vmaxf(LVFU(cfablur2[row * W + col]) - rowBlackv, epsv)); + const vfloat valv = LVFU(rawData[row][col]) - rowBlackv; + STVFU(rawData[row][col], valv * linecorrv + rowBlackv); + } + +#endif + + for (; col < W; ++col) { + const float linecorr = SQR(std::max(1e-5f, cfablur[row * W + col] - black[c4[row & 1][col & 1]])) / + (std::max(1e-5f, cfablur1[row * W + col] - black[c4[row & 1][col & 1]]) * std::max(1e-5f, cfablur2[row * W + col] - black[c4[row & 1][col & 1]])); + rawData[row][col] = (rawData[row][col] - black[c4[row & 1][col & 1]]) * linecorr + black[c4[row & 1][col & 1]]; + } + } + } else if (ri->getSensorType() == ST_FUJI_XTRANS) { +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int row = 0; row < H; ++row) { + for (int col = 0; col < W; ++col) { + const int c = ri->XTRANSFC(row, col); + const float hlinecorr = std::max(1e-5f, cfablur[(row) * W + col] - black[c]) / std::max(1e-5f, cfablur1[(row) * W + col] - black[c]); + const float vlinecorr = std::max(1e-5f, cfablur[(row) * W + col] - black[c]) / std::max(1e-5f, cfablur2[(row) * W + col] - black[c]); + rawData[row][col] = (rawData[row][col] - black[c]) * hlinecorr * vlinecorr + black[c]; + } + } + + } + + delete [] cfablur1; + delete [] cfablur2; + } + + delete [] cfablur; +} +} /* namespace */ diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 5f1d13c79..34a50b944 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -2386,311 +2386,6 @@ void RawImageSource::HLRecovery_Global(const ToneCurveParams &hrp) } - -void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile, unsigned short black[4]) -{ -// BENCHFUN - float *cfablur = (float (*)) malloc (H * W * sizeof * cfablur); - int BS = raw.ff_BlurRadius; - BS += BS & 1; - - //function call to cfabloxblur - if (raw.ff_BlurType == RAWParams::getFlatFieldBlurTypeString(RAWParams::FlatFieldBlurType::V)) { - cfaboxblur(riFlatFile, cfablur, 2 * BS, 0); - } else if (raw.ff_BlurType == RAWParams::getFlatFieldBlurTypeString(RAWParams::FlatFieldBlurType::H)) { - cfaboxblur(riFlatFile, cfablur, 0, 2 * BS); - } else if (raw.ff_BlurType == RAWParams::getFlatFieldBlurTypeString(RAWParams::FlatFieldBlurType::VH)) { - //slightly more complicated blur if trying to correct both vertical and horizontal anomalies - cfaboxblur(riFlatFile, cfablur, BS, BS); //first do area blur to correct vignette - } else { //(raw.ff_BlurType == RAWParams::getFlatFieldBlurTypeString(RAWParams::area_ff)) - cfaboxblur(riFlatFile, cfablur, BS, BS); - } - - if(ri->getSensorType() == ST_BAYER || ri->get_colors() == 1) { - float refcolor[2][2]; - - //find centre average values by channel - for (int m = 0; m < 2; m++) - for (int n = 0; n < 2; n++) { - int row = 2 * (H >> 2) + m; - int col = 2 * (W >> 2) + n; - int c = ri->get_colors() != 1 ? FC(row, col) : 0; - int c4 = ri->get_colors() != 1 ? (( c == 1 && !(row & 1) ) ? 3 : c) : 0; - refcolor[m][n] = max(0.0f, cfablur[row * W + col] - black[c4]); - } - - float limitFactor = 1.f; - - if(raw.ff_AutoClipControl) { - for (int m = 0; m < 2; m++) - for (int n = 0; n < 2; n++) { - float maxval = 0.f; - int c = ri->get_colors() != 1 ? FC(m, n) : 0; - int c4 = ri->get_colors() != 1 ? (( c == 1 && !(m & 1) ) ? 3 : c) : 0; -#ifdef _OPENMP - #pragma omp parallel -#endif - { - float maxvalthr = 0.f; -#ifdef _OPENMP - #pragma omp for -#endif - - for (int row = 0; row < H - m; row += 2) { - for (int col = 0; col < W - n; col += 2) { - float tempval = (rawData[row + m][col + n] - black[c4]) * ( refcolor[m][n] / max(1e-5f, cfablur[(row + m) * W + col + n] - black[c4]) ); - - if(tempval > maxvalthr) { - maxvalthr = tempval; - } - } - } - -#ifdef _OPENMP - #pragma omp critical -#endif - { - - if(maxvalthr > maxval) { - maxval = maxvalthr; - } - - } - } - - // now we have the max value for the channel - // if it clips, calculate factor to avoid clipping - if(maxval + black[c4] >= ri->get_white(c4)) { - limitFactor = min(limitFactor, ri->get_white(c4) / (maxval + black[c4])); - } - } - - flatFieldAutoClipValue = (1.f - limitFactor) * 100.f; // this value can be used to set the clip control slider in gui - } else { - limitFactor = max((float)(100 - raw.ff_clipControl) / 100.f, 0.01f); - } - - for (int m = 0; m < 2; m++) - for (int n = 0; n < 2; n++) { - refcolor[m][n] *= limitFactor; - } - - unsigned int c[2][2] {}; - unsigned int c4[2][2] {}; - if(ri->get_colors() != 1) { - for (int i = 0; i < 2; ++i) { - for(int j = 0; j < 2; ++j) { - c[i][j] = FC(i, j); - } - } - c4[0][0] = ( c[0][0] == 1) ? 3 : c[0][0]; - c4[0][1] = ( c[0][1] == 1) ? 3 : c[0][1]; - c4[1][0] = c[1][0]; - c4[1][1] = c[1][1]; - } - - constexpr float minValue = 1.f; // if the pixel value in the flat field is less or equal this value, no correction will be applied. - -#ifdef __SSE2__ - vfloat refcolorv[2] = {_mm_set_ps(refcolor[0][1], refcolor[0][0], refcolor[0][1], refcolor[0][0]), - _mm_set_ps(refcolor[1][1], refcolor[1][0], refcolor[1][1], refcolor[1][0]) - }; - vfloat blackv[2] = {_mm_set_ps(black[c4[0][1]], black[c4[0][0]], black[c4[0][1]], black[c4[0][0]]), - _mm_set_ps(black[c4[1][1]], black[c4[1][0]], black[c4[1][1]], black[c4[1][0]]) - }; - - vfloat onev = F2V(1.f); - vfloat minValuev = F2V(minValue); -#endif -#ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) -#endif - - for (int row = 0; row < H; row ++) { - int col = 0; -#ifdef __SSE2__ - vfloat rowBlackv = blackv[row & 1]; - vfloat rowRefcolorv = refcolorv[row & 1]; - - for (; col < W - 3; col += 4) { - vfloat blurv = LVFU(cfablur[(row) * W + col]) - rowBlackv; - vfloat vignettecorrv = rowRefcolorv / blurv; - vignettecorrv = vself(vmaskf_le(blurv, minValuev), onev, vignettecorrv); - vfloat valv = LVFU(rawData[row][col]); - valv -= rowBlackv; - STVFU(rawData[row][col], valv * vignettecorrv + rowBlackv); - } - -#endif - - for (; col < W; col ++) { - float blur = cfablur[(row) * W + col] - black[c4[row & 1][col & 1]]; - float vignettecorr = blur <= minValue ? 1.f : refcolor[row & 1][col & 1] / blur; - rawData[row][col] = (rawData[row][col] - black[c4[row & 1][col & 1]]) * vignettecorr + black[c4[row & 1][col & 1]]; - } - } - } else if(ri->getSensorType() == ST_FUJI_XTRANS) { - float refcolor[3] = {0.f}; - int cCount[3] = {0}; - - //find center ave values by channel - for (int m = -3; m < 3; m++) - for (int n = -3; n < 3; n++) { - int row = 2 * (H >> 2) + m; - int col = 2 * (W >> 2) + n; - int c = riFlatFile->XTRANSFC(row, col); - refcolor[c] += max(0.0f, cfablur[row * W + col] - black[c]); - cCount[c] ++; - } - - for(int c = 0; c < 3; c++) { - refcolor[c] = refcolor[c] / cCount[c]; - } - - float limitFactor = 1.f; - - if(raw.ff_AutoClipControl) { - // determine maximum calculated value to avoid clipping - float maxval = 0.f; - // xtrans files have only one black level actually, so we can simplify the code a bit -#ifdef _OPENMP - #pragma omp parallel -#endif - { - float maxvalthr = 0.f; -#ifdef _OPENMP - #pragma omp for schedule(dynamic,16) nowait -#endif - - for (int row = 0; row < H; row++) { - for (int col = 0; col < W; col++) { - float tempval = (rawData[row][col] - black[0]) * ( refcolor[ri->XTRANSFC(row, col)] / max(1e-5f, cfablur[(row) * W + col] - black[0]) ); - - if(tempval > maxvalthr) { - maxvalthr = tempval; - } - } - } - -#ifdef _OPENMP - #pragma omp critical -#endif - { - if(maxvalthr > maxval) { - maxval = maxvalthr; - } - } - } - - // there's only one white level for xtrans - if(maxval + black[0] > ri->get_white(0)) { - limitFactor = ri->get_white(0) / (maxval + black[0]); - flatFieldAutoClipValue = (1.f - limitFactor) * 100.f; // this value can be used to set the clip control slider in gui - } - } else { - limitFactor = max((float)(100 - raw.ff_clipControl) / 100.f, 0.01f); - } - - - for(int c = 0; c < 3; c++) { - refcolor[c] *= limitFactor; - } - - constexpr float minValue = 1.f; // if the pixel value in the flat field is less or equal this value, no correction will be applied. - -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int row = 0; row < H; row++) { - for (int col = 0; col < W; col++) { - int c = ri->XTRANSFC(row, col); - float blur = cfablur[(row) * W + col] - black[c]; - float vignettecorr = blur <= minValue ? 1.f : refcolor[c] / blur; - rawData[row][col] = (rawData[row][col] - black[c]) * vignettecorr + black[c]; - } - } - } - - if (raw.ff_BlurType == RAWParams::getFlatFieldBlurTypeString(RAWParams::FlatFieldBlurType::VH)) { - float *cfablur1 = (float (*)) malloc (H * W * sizeof * cfablur1); - float *cfablur2 = (float (*)) malloc (H * W * sizeof * cfablur2); - //slightly more complicated blur if trying to correct both vertical and horizontal anomalies - cfaboxblur(riFlatFile, cfablur1, 0, 2 * BS); //now do horizontal blur - cfaboxblur(riFlatFile, cfablur2, 2 * BS, 0); //now do vertical blur - - if(ri->getSensorType() == ST_BAYER || ri->get_colors() == 1) { - unsigned int c[2][2] {}; - unsigned int c4[2][2] {}; - if(ri->get_colors() != 1) { - for (int i = 0; i < 2; ++i) { - for(int j = 0; j < 2; ++j) { - c[i][j] = FC(i, j); - } - } - c4[0][0] = ( c[0][0] == 1) ? 3 : c[0][0]; - c4[0][1] = ( c[0][1] == 1) ? 3 : c[0][1]; - c4[1][0] = c[1][0]; - c4[1][1] = c[1][1]; - } - -#ifdef __SSE2__ - vfloat blackv[2] = {_mm_set_ps(black[c4[0][1]], black[c4[0][0]], black[c4[0][1]], black[c4[0][0]]), - _mm_set_ps(black[c4[1][1]], black[c4[1][0]], black[c4[1][1]], black[c4[1][0]]) - }; - - vfloat epsv = F2V(1e-5f); -#endif -#ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) -#endif - - for (int row = 0; row < H; row ++) { - int col = 0; -#ifdef __SSE2__ - vfloat rowBlackv = blackv[row & 1]; - - for (; col < W - 3; col += 4) { - vfloat linecorrv = SQRV(vmaxf(LVFU(cfablur[row * W + col]) - rowBlackv, epsv)) / - (vmaxf(LVFU(cfablur1[row * W + col]) - rowBlackv, epsv) * vmaxf(LVFU(cfablur2[row * W + col]) - rowBlackv, epsv)); - vfloat valv = LVFU(rawData[row][col]); - valv -= rowBlackv; - STVFU(rawData[row][col], valv * linecorrv + rowBlackv); - } - -#endif - - for (; col < W; col ++) { - float linecorr = SQR(max(1e-5f, cfablur[row * W + col] - black[c4[row & 1][col & 1]])) / - (max(1e-5f, cfablur1[row * W + col] - black[c4[row & 1][col & 1]]) * max(1e-5f, cfablur2[row * W + col] - black[c4[row & 1][col & 1]])) ; - rawData[row][col] = (rawData[row][col] - black[c4[row & 1][col & 1]]) * linecorr + black[c4[row & 1][col & 1]]; - } - } - } else if(ri->getSensorType() == ST_FUJI_XTRANS) { -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int row = 0; row < H; row++) { - for (int col = 0; col < W; col++) { - int c = ri->XTRANSFC(row, col); - float hlinecorr = (max(1e-5f, cfablur[(row) * W + col] - black[c]) / max(1e-5f, cfablur1[(row) * W + col] - black[c]) ); - float vlinecorr = (max(1e-5f, cfablur[(row) * W + col] - black[c]) / max(1e-5f, cfablur2[(row) * W + col] - black[c]) ); - rawData[row][col] = ((rawData[row][col] - black[c]) * hlinecorr * vlinecorr + black[c]); - } - } - - } - - free (cfablur1); - free (cfablur2); - } - - free (cfablur); -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - /* Copy original pixel data and * subtract dark frame (if present) from current image and apply flat field correction (if present) */ @@ -2782,253 +2477,6 @@ void RawImageSource::copyOriginalPixels(const RAWParams &raw, RawImage *src, Raw } } -void RawImageSource::cfaboxblur(RawImage *riFlatFile, float* cfablur, int boxH, int boxW) -{ - - if (boxW < 0 || boxH < 0 || (boxW == 0 && boxH == 0)) { // nothing to blur or negative values - memcpy(cfablur, riFlatFile->data[0], W * H * sizeof(float)); - return; - } - - float *tmpBuffer = nullptr; - float *cfatmp = nullptr; - float *srcVertical = nullptr; - - - if(boxH > 0 && boxW > 0) { - // we need a temporary buffer if we have to blur both directions - tmpBuffer = (float (*)) calloc (H * W, sizeof * tmpBuffer); - } - - if(boxH == 0) { - // if boxH == 0 we can skip the vertical blur and process the horizontal blur from riFlatFile to cfablur without using a temporary buffer - cfatmp = cfablur; - } else { - cfatmp = tmpBuffer; - } - - if(boxW == 0) { - // if boxW == 0 we can skip the horizontal blur and process the vertical blur from riFlatFile to cfablur without using a temporary buffer - srcVertical = riFlatFile->data[0]; - } else { - srcVertical = cfatmp; - } - -#ifdef _OPENMP - #pragma omp parallel -#endif - { - - if(boxW > 0) { - //box blur cfa image; box size = BS - //horizontal blur -#ifdef _OPENMP - #pragma omp for -#endif - - for (int row = 0; row < H; row++) { - int len = boxW / 2 + 1; - cfatmp[row * W + 0] = riFlatFile->data[row][0] / len; - cfatmp[row * W + 1] = riFlatFile->data[row][1] / len; - - for (int j = 2; j <= boxW; j += 2) { - cfatmp[row * W + 0] += riFlatFile->data[row][j] / len; - cfatmp[row * W + 1] += riFlatFile->data[row][j + 1] / len; - } - - for (int col = 2; col <= boxW; col += 2) { - cfatmp[row * W + col] = (cfatmp[row * W + col - 2] * len + riFlatFile->data[row][boxW + col]) / (len + 1); - cfatmp[row * W + col + 1] = (cfatmp[row * W + col - 1] * len + riFlatFile->data[row][boxW + col + 1]) / (len + 1); - len ++; - } - - for (int col = boxW + 2; col < W - boxW; col++) { - cfatmp[row * W + col] = cfatmp[row * W + col - 2] + (riFlatFile->data[row][boxW + col] - cfatmp[row * W + col - boxW - 2]) / len; - } - - for (int col = W - boxW; col < W; col += 2) { - cfatmp[row * W + col] = (cfatmp[row * W + col - 2] * len - cfatmp[row * W + col - boxW - 2]) / (len - 1); - - if (col + 1 < W) { - cfatmp[row * W + col + 1] = (cfatmp[row * W + col - 1] * len - cfatmp[row * W + col - boxW - 1]) / (len - 1); - } - - len --; - } - } - } - - if(boxH > 0) { - //vertical blur -#ifdef __SSE2__ - vfloat leninitv = F2V(boxH / 2 + 1); - vfloat onev = F2V( 1.0f ); - vfloat temp1v, temp2v, temp3v, temp4v, lenv, lenp1v, lenm1v; - int row; -#ifdef _OPENMP - #pragma omp for nowait -#endif - - for (int col = 0; col < W - 7; col += 8) { - lenv = leninitv; - temp1v = LVFU(srcVertical[0 * W + col]) / lenv; - temp2v = LVFU(srcVertical[1 * W + col]) / lenv; - temp3v = LVFU(srcVertical[0 * W + col + 4]) / lenv; - temp4v = LVFU(srcVertical[1 * W + col + 4]) / lenv; - - for (int i = 2; i < boxH + 2; i += 2) { - temp1v += LVFU(srcVertical[i * W + col]) / lenv; - temp2v += LVFU(srcVertical[(i + 1) * W + col]) / lenv; - temp3v += LVFU(srcVertical[i * W + col + 4]) / lenv; - temp4v += LVFU(srcVertical[(i + 1) * W + col + 4]) / lenv; - } - - STVFU(cfablur[0 * W + col], temp1v); - STVFU(cfablur[1 * W + col], temp2v); - STVFU(cfablur[0 * W + col + 4], temp3v); - STVFU(cfablur[1 * W + col + 4], temp4v); - - for (row = 2; row < boxH + 2; row += 2) { - lenp1v = lenv + onev; - temp1v = (temp1v * lenv + LVFU(srcVertical[(row + boxH) * W + col])) / lenp1v; - temp2v = (temp2v * lenv + LVFU(srcVertical[(row + boxH + 1) * W + col])) / lenp1v; - temp3v = (temp3v * lenv + LVFU(srcVertical[(row + boxH) * W + col + 4])) / lenp1v; - temp4v = (temp4v * lenv + LVFU(srcVertical[(row + boxH + 1) * W + col + 4])) / lenp1v; - STVFU(cfablur[row * W + col], temp1v); - STVFU(cfablur[(row + 1)*W + col], temp2v); - STVFU(cfablur[row * W + col + 4], temp3v); - STVFU(cfablur[(row + 1)*W + col + 4], temp4v); - lenv = lenp1v; - } - - for (; row < H - boxH - 1; row += 2) { - temp1v = temp1v + (LVFU(srcVertical[(row + boxH) * W + col]) - LVFU(srcVertical[(row - boxH - 2) * W + col])) / lenv; - temp2v = temp2v + (LVFU(srcVertical[(row + 1 + boxH) * W + col]) - LVFU(srcVertical[(row + 1 - boxH - 2) * W + col])) / lenv; - temp3v = temp3v + (LVFU(srcVertical[(row + boxH) * W + col + 4]) - LVFU(srcVertical[(row - boxH - 2) * W + col + 4])) / lenv; - temp4v = temp4v + (LVFU(srcVertical[(row + 1 + boxH) * W + col + 4]) - LVFU(srcVertical[(row + 1 - boxH - 2) * W + col + 4])) / lenv; - STVFU(cfablur[row * W + col], temp1v); - STVFU(cfablur[(row + 1)*W + col], temp2v); - STVFU(cfablur[row * W + col + 4], temp3v); - STVFU(cfablur[(row + 1)*W + col + 4], temp4v); - } - - for(; row < H - boxH; row++) { - temp1v = temp1v + (LVFU(srcVertical[(row + boxH) * W + col]) - LVFU(srcVertical[(row - boxH - 2) * W + col])) / lenv; - temp3v = temp3v + (LVFU(srcVertical[(row + boxH) * W + col + 4]) - LVFU(srcVertical[(row - boxH - 2) * W + col + 4])) / lenv; - STVFU(cfablur[row * W + col], temp1v); - STVFU(cfablur[row * W + col + 4], temp3v); - vfloat swapv = temp1v; - temp1v = temp2v; - temp2v = swapv; - swapv = temp3v; - temp3v = temp4v; - temp4v = swapv; - } - - for (; row < H - 1; row += 2) { - lenm1v = lenv - onev; - temp1v = (temp1v * lenv - LVFU(srcVertical[(row - boxH - 2) * W + col])) / lenm1v; - temp2v = (temp2v * lenv - LVFU(srcVertical[(row - boxH - 1) * W + col])) / lenm1v; - temp3v = (temp3v * lenv - LVFU(srcVertical[(row - boxH - 2) * W + col + 4])) / lenm1v; - temp4v = (temp4v * lenv - LVFU(srcVertical[(row - boxH - 1) * W + col + 4])) / lenm1v; - STVFU(cfablur[row * W + col], temp1v); - STVFU(cfablur[(row + 1)*W + col], temp2v); - STVFU(cfablur[row * W + col + 4], temp3v); - STVFU(cfablur[(row + 1)*W + col + 4], temp4v); - lenv = lenm1v; - } - - for(; row < H; row++) { - lenm1v = lenv - onev; - temp1v = (temp1v * lenv - LVFU(srcVertical[(row - boxH - 2) * W + col])) / lenm1v; - temp3v = (temp3v * lenv - LVFU(srcVertical[(row - boxH - 2) * W + col + 4])) / lenm1v; - STVFU(cfablur[(row)*W + col], temp1v); - STVFU(cfablur[(row)*W + col + 4], temp3v); - } - - } - -#ifdef _OPENMP - #pragma omp single -#endif - - for (int col = W - (W % 8); col < W; col++) { - int len = boxH / 2 + 1; - cfablur[0 * W + col] = srcVertical[0 * W + col] / len; - cfablur[1 * W + col] = srcVertical[1 * W + col] / len; - - for (int i = 2; i < boxH + 2; i += 2) { - cfablur[0 * W + col] += srcVertical[i * W + col] / len; - cfablur[1 * W + col] += srcVertical[(i + 1) * W + col] / len; - } - - for (int row = 2; row < boxH + 2; row += 2) { - cfablur[row * W + col] = (cfablur[(row - 2) * W + col] * len + srcVertical[(row + boxH) * W + col]) / (len + 1); - cfablur[(row + 1)*W + col] = (cfablur[(row - 1) * W + col] * len + srcVertical[(row + boxH + 1) * W + col]) / (len + 1); - len ++; - } - - for (int row = boxH + 2; row < H - boxH; row++) { - cfablur[row * W + col] = cfablur[(row - 2) * W + col] + (srcVertical[(row + boxH) * W + col] - srcVertical[(row - boxH - 2) * W + col]) / len; - } - - for (int row = H - boxH; row < H; row += 2) { - cfablur[row * W + col] = (cfablur[(row - 2) * W + col] * len - srcVertical[(row - boxH - 2) * W + col]) / (len - 1); - - if (row + 1 < H) { - cfablur[(row + 1)*W + col] = (cfablur[(row - 1) * W + col] * len - srcVertical[(row - boxH - 1) * W + col]) / (len - 1); - } - - len --; - } - } - -#else -#ifdef _OPENMP - #pragma omp for -#endif - - for (int col = 0; col < W; col++) { - int len = boxH / 2 + 1; - cfablur[0 * W + col] = srcVertical[0 * W + col] / len; - cfablur[1 * W + col] = srcVertical[1 * W + col] / len; - - for (int i = 2; i < boxH + 2; i += 2) { - cfablur[0 * W + col] += srcVertical[i * W + col] / len; - cfablur[1 * W + col] += srcVertical[(i + 1) * W + col] / len; - } - - for (int row = 2; row < boxH + 2; row += 2) { - cfablur[row * W + col] = (cfablur[(row - 2) * W + col] * len + srcVertical[(row + boxH) * W + col]) / (len + 1); - cfablur[(row + 1)*W + col] = (cfablur[(row - 1) * W + col] * len + srcVertical[(row + boxH + 1) * W + col]) / (len + 1); - len ++; - } - - for (int row = boxH + 2; row < H - boxH; row++) { - cfablur[row * W + col] = cfablur[(row - 2) * W + col] + (srcVertical[(row + boxH) * W + col] - srcVertical[(row - boxH - 2) * W + col]) / len; - } - - for (int row = H - boxH; row < H; row += 2) { - cfablur[row * W + col] = (cfablur[(row - 2) * W + col] * len - srcVertical[(row - boxH - 2) * W + col]) / (len - 1); - - if (row + 1 < H) { - cfablur[(row + 1)*W + col] = (cfablur[(row - 1) * W + col] * len - srcVertical[(row - boxH - 1) * W + col]) / (len - 1); - } - - len --; - } - } - -#endif - } - } - - if(tmpBuffer) { - free (tmpBuffer); - } -} - - // Scale original pixels into the range 0 65535 using black offsets and multipliers void RawImageSource::scaleColors(int winx, int winy, int winw, int winh, const RAWParams &raw, array2D &rawData) { diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index e52adea18..ecadec410 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -140,7 +140,6 @@ public: void processFlatField(const RAWParams &raw, RawImage *riFlatFile, unsigned short black[4]); void copyOriginalPixels(const RAWParams &raw, RawImage *ri, RawImage *riDark, RawImage *riFlatFile, array2D &rawData ); - void cfaboxblur (RawImage *riFlatFile, float* cfablur, int boxH, int boxW); void scaleColors (int winx, int winy, int winw, int winh, const RAWParams &raw, array2D &rawData); // raw for cblack void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const procparams::ToneCurveParams &hrp, const procparams::RAWParams &raw) override; diff --git a/rtgui/flatfield.cc b/rtgui/flatfield.cc index 03204c037..c0bd0555a 100644 --- a/rtgui/flatfield.cc +++ b/rtgui/flatfield.cc @@ -54,7 +54,7 @@ FlatField::FlatField () : FoldableToolPanel(this, "flatfield", M("TP_FLATFIELD_L flatFieldBlurRadius->show(); Gtk::HBox* hbffbt = Gtk::manage (new Gtk::HBox ()); - hbffbt->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_FLATFIELD_BLURTYPE") + ":"))); + hbffbt->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_FLATFIELD_BLURTYPE") + ":")), Gtk::PACK_SHRINK, 4); hbffbt->set_spacing(4); flatFieldBlurType = Gtk::manage (new MyComboBoxText ()); flatFieldBlurType->append(M("TP_FLATFIELD_BT_AREA")); From dc972ddb21005c16f4ec06c789e3213f32ec05fd Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Wed, 23 Oct 2019 20:32:41 +0200 Subject: [PATCH 085/208] Film Negative button and tooltip changes --- rtdata/languages/Catala | 4 ++-- rtdata/languages/Chinese (Simplified) | 4 ++-- rtdata/languages/Czech | 4 ++-- rtdata/languages/Deutsch | 4 ++-- rtdata/languages/English (UK) | 4 ++-- rtdata/languages/English (US) | 4 ++-- rtdata/languages/Espanol | 4 ++-- rtdata/languages/Francais | 4 ++-- rtdata/languages/Italiano | 4 ++-- rtdata/languages/Japanese | 4 ++-- rtdata/languages/Magyar | 4 ++-- rtdata/languages/Nederlands | 4 ++-- rtdata/languages/Polish | 4 ++-- rtdata/languages/Portugues | 4 ++-- rtdata/languages/Portugues (Brasil) | 4 ++-- rtdata/languages/Russian | 4 ++-- rtdata/languages/Serbian (Cyrilic Characters) | 4 ++-- rtdata/languages/Swedish | 4 ++-- rtdata/languages/default | 4 ++-- 19 files changed, 38 insertions(+), 38 deletions(-) diff --git a/rtdata/languages/Catala b/rtdata/languages/Catala index e702cbe49..a2d8012cd 100644 --- a/rtdata/languages/Catala +++ b/rtdata/languages/Catala @@ -1867,9 +1867,9 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_EXPOS_WHITEPOINT_LABEL;Raw White Points !TP_FILMNEGATIVE_BLUE;Blue ratio !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) -!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. +!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. !TP_FILMNEGATIVE_LABEL;Film Negative -!TP_FILMNEGATIVE_PICK;Pick white and black spots +!TP_FILMNEGATIVE_PICK;Pick neutral spots !TP_FILMNEGATIVE_RED;Red ratio !TP_FILMSIMULATION_LABEL;Film Simulation !TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now? diff --git a/rtdata/languages/Chinese (Simplified) b/rtdata/languages/Chinese (Simplified) index 387d8fb85..556f609ea 100644 --- a/rtdata/languages/Chinese (Simplified) +++ b/rtdata/languages/Chinese (Simplified) @@ -1814,9 +1814,9 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_EXPOS_WHITEPOINT_LABEL;Raw White Points !TP_FILMNEGATIVE_BLUE;Blue ratio !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) -!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. +!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. !TP_FILMNEGATIVE_LABEL;Film Negative -!TP_FILMNEGATIVE_PICK;Pick white and black spots +!TP_FILMNEGATIVE_PICK;Pick neutral spots !TP_FILMNEGATIVE_RED;Red ratio !TP_FILMSIMULATION_LABEL;Film Simulation !TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now? diff --git a/rtdata/languages/Czech b/rtdata/languages/Czech index f45b39ef2..af9ae0c88 100644 --- a/rtdata/languages/Czech +++ b/rtdata/languages/Czech @@ -2340,9 +2340,9 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !TP_DEHAZE_LUMINANCE;Luminance only !TP_FILMNEGATIVE_BLUE;Blue ratio !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) -!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. +!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. !TP_FILMNEGATIVE_LABEL;Film Negative -!TP_FILMNEGATIVE_PICK;Pick white and black spots +!TP_FILMNEGATIVE_PICK;Pick neutral spots !TP_FILMNEGATIVE_RED;Red ratio !TP_PDSHARPENING_LABEL;Capture Sharpening !TP_SHARPENING_GAMMA;Gamma diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index 2ec2a020d..4c60ad8d8 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -1724,9 +1724,9 @@ TP_EXPOS_BLACKPOINT_LABEL;Schwarzpunkt TP_EXPOS_WHITEPOINT_LABEL;Weißpunkt TP_FILMNEGATIVE_BLUE;Blauverhältnis TP_FILMNEGATIVE_GREEN;Bezugsexponent (Kontrast) -TP_FILMNEGATIVE_GUESS_TOOLTIP;Berechnet die Exponenten durch Auswahl zweier neutraler\nReferenzpunkte im Bild. Weiß (Hellgrau) und Schwarz (Dunkelgrau).\nDie Reihenfolge spielt keine Rolle. Die Exponenten werden aktualisiert,\nnachdem der zweite Punkt ausgewählt wurde. +TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. TP_FILMNEGATIVE_LABEL;Filmnegativ -TP_FILMNEGATIVE_PICK;Weißen und schwarzen Bereich auswählen +TP_FILMNEGATIVE_PICK;Pick neutral spots TP_FILMNEGATIVE_RED;Rotverhältnis TP_FILMSIMULATION_LABEL;Filmsimulation TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee sucht nach Hald-CLUT-Bildern, die für die Filmsimulation benötigt werden, in einem Ordner, der viel Zeit benötigt.\nGehen Sie zu\n< Einstellungen > Bildbearbeitung > Filmsimulation >\nund prüfen Sie welcher Order benutzt wird. Wählen Sie den Ordner aus, der nur die Hald-CLUT-Bilder beinhaltet, oder einen leeren Ordner, wenn Sie die Filsimulation nicht verwenden möchten.\n\nWeitere Informationen über die Filmsimulation finden Sie auf RawPedia.\n\nMöchten Sie die Suche beenden? diff --git a/rtdata/languages/English (UK) b/rtdata/languages/English (UK) index 01f23c1e9..b4c76fd22 100644 --- a/rtdata/languages/English (UK) +++ b/rtdata/languages/English (UK) @@ -1681,9 +1681,9 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_EXPOS_WHITEPOINT_LABEL;Raw White Points !TP_FILMNEGATIVE_BLUE;Blue ratio !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) -!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. +!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. !TP_FILMNEGATIVE_LABEL;Film Negative -!TP_FILMNEGATIVE_PICK;Pick white and black spots +!TP_FILMNEGATIVE_PICK;Pick neutral spots !TP_FILMNEGATIVE_RED;Red ratio !TP_FILMSIMULATION_LABEL;Film Simulation !TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now? diff --git a/rtdata/languages/English (US) b/rtdata/languages/English (US) index 0e80fb985..6aeae1a45 100644 --- a/rtdata/languages/English (US) +++ b/rtdata/languages/English (US) @@ -1652,9 +1652,9 @@ !TP_EXPOS_WHITEPOINT_LABEL;Raw White Points !TP_FILMNEGATIVE_BLUE;Blue ratio !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) -!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. +!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. !TP_FILMNEGATIVE_LABEL;Film Negative -!TP_FILMNEGATIVE_PICK;Pick white and black spots +!TP_FILMNEGATIVE_PICK;Pick neutral spots !TP_FILMNEGATIVE_RED;Red ratio !TP_FILMSIMULATION_LABEL;Film Simulation !TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now? diff --git a/rtdata/languages/Espanol b/rtdata/languages/Espanol index 478a9a9eb..211f968e2 100644 --- a/rtdata/languages/Espanol +++ b/rtdata/languages/Espanol @@ -2358,9 +2358,9 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !TP_DEHAZE_LUMINANCE;Luminance only !TP_FILMNEGATIVE_BLUE;Blue ratio !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) -!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. +!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. !TP_FILMNEGATIVE_LABEL;Film Negative -!TP_FILMNEGATIVE_PICK;Pick white and black spots +!TP_FILMNEGATIVE_PICK;Pick neutral spots !TP_FILMNEGATIVE_RED;Red ratio !TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected !TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index 60a7368d2..82ef3fcd2 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -2291,9 +2291,9 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !TP_DEHAZE_LUMINANCE;Luminance only !TP_FILMNEGATIVE_BLUE;Blue ratio !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) -!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. +!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. !TP_FILMNEGATIVE_LABEL;Film Negative -!TP_FILMNEGATIVE_PICK;Pick white and black spots +!TP_FILMNEGATIVE_PICK;Pick neutral spots !TP_FILMNEGATIVE_RED;Red ratio !TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected !TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected diff --git a/rtdata/languages/Italiano b/rtdata/languages/Italiano index f388332b8..4649aea62 100644 --- a/rtdata/languages/Italiano +++ b/rtdata/languages/Italiano @@ -1919,9 +1919,9 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_EXPOS_WHITEPOINT_LABEL;Raw White Points !TP_FILMNEGATIVE_BLUE;Blue ratio !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) -!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. +!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. !TP_FILMNEGATIVE_LABEL;Film Negative -!TP_FILMNEGATIVE_PICK;Pick white and black spots +!TP_FILMNEGATIVE_PICK;Pick neutral spots !TP_FILMNEGATIVE_RED;Red ratio !TP_FILMSIMULATION_LABEL;Film Simulation !TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now? diff --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese index 242ef7631..511f6daf0 100644 --- a/rtdata/languages/Japanese +++ b/rtdata/languages/Japanese @@ -1672,9 +1672,9 @@ TP_EXPOS_BLACKPOINT_LABEL;raw ブラック・ポイント TP_EXPOS_WHITEPOINT_LABEL;raw ホワイト・ポイント TP_FILMNEGATIVE_BLUE;ブルーの比率 TP_FILMNEGATIVE_GREEN;参考指数(コントラスト) -TP_FILMNEGATIVE_GUESS_TOOLTIP;画像の中でニュートラルな参考ポイントを2点選んで指数を計算します;白い(明るいグレー)1点と黒い(暗いグレー)1点を選びます。順番は関係ありません。2つ目のポイントが選択されると指数が更新されます。 +TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. TP_FILMNEGATIVE_LABEL;ネガフィルム -TP_FILMNEGATIVE_PICK;白と黒のポイントをピックアップする +TP_FILMNEGATIVE_PICK;Pick neutral spots TP_FILMNEGATIVE_RED;レッドの比率 TP_FILMSIMULATION_LABEL;フィルムシミュレーション TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapeeはフィルムシミュレーション機能に使う画像をHald CLUTフォルダーの中から探すよう設計されています(プログラムに組み込むにはフォルダーが大き過ぎるため)。\n変更するには、環境設定 > 画像処理 > フィルムシミュレーションと進み\nどのフォルダーが使われているか確認します。機能を利用する場合は、Hald CLUTだけが入っているフォルダーを指定するか、 この機能を使わない場合はそのフォルダーを空にしておきます。\n\n詳しくはRawPediaを参照して下さい。\n\nフィルム画像のスキャンを止めますか? diff --git a/rtdata/languages/Magyar b/rtdata/languages/Magyar index 11c48c3d9..8ee6e66e4 100644 --- a/rtdata/languages/Magyar +++ b/rtdata/languages/Magyar @@ -1832,9 +1832,9 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_EXPOS_WHITEPOINT_LABEL;Raw White Points !TP_FILMNEGATIVE_BLUE;Blue ratio !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) -!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. +!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. !TP_FILMNEGATIVE_LABEL;Film Negative -!TP_FILMNEGATIVE_PICK;Pick white and black spots +!TP_FILMNEGATIVE_PICK;Pick neutral spots !TP_FILMNEGATIVE_RED;Red ratio !TP_FILMSIMULATION_LABEL;Film Simulation !TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now? diff --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands index 12bce5305..ebfdbed9d 100644 --- a/rtdata/languages/Nederlands +++ b/rtdata/languages/Nederlands @@ -2246,9 +2246,9 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !TP_EXPOSURE_HISTMATCHING_TOOLTIP;Automatically adjust sliders and curves (except exposure compensation) to match the look of the embedded JPEG thumbnail. !TP_FILMNEGATIVE_BLUE;Blue ratio !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) -!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. +!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. !TP_FILMNEGATIVE_LABEL;Film Negative -!TP_FILMNEGATIVE_PICK;Pick white and black spots +!TP_FILMNEGATIVE_PICK;Pick neutral spots !TP_FILMNEGATIVE_RED;Red ratio !TP_ICM_WORKING_TRC;Tone response curve: !TP_ICM_WORKING_TRC_CUSTOM;Custom diff --git a/rtdata/languages/Polish b/rtdata/languages/Polish index 440093ef3..86461bf6d 100644 --- a/rtdata/languages/Polish +++ b/rtdata/languages/Polish @@ -1945,9 +1945,9 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_EXPOSURE_TCMODE_PERCEPTUAL;Perceptual !TP_FILMNEGATIVE_BLUE;Blue ratio !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) -!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. +!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. !TP_FILMNEGATIVE_LABEL;Film Negative -!TP_FILMNEGATIVE_PICK;Pick white and black spots +!TP_FILMNEGATIVE_PICK;Pick neutral spots !TP_FILMNEGATIVE_RED;Red ratio !TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now? !TP_ICM_APPLYBASELINEEXPOSUREOFFSET;Baseline exposure diff --git a/rtdata/languages/Portugues b/rtdata/languages/Portugues index 33d1e32a1..dea314f46 100644 --- a/rtdata/languages/Portugues +++ b/rtdata/languages/Portugues @@ -2290,9 +2290,9 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !TP_DEHAZE_LUMINANCE;Luminance only !TP_FILMNEGATIVE_BLUE;Blue ratio !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) -!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. +!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. !TP_FILMNEGATIVE_LABEL;Film Negative -!TP_FILMNEGATIVE_PICK;Pick white and black spots +!TP_FILMNEGATIVE_PICK;Pick neutral spots !TP_FILMNEGATIVE_RED;Red ratio !TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected !TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected diff --git a/rtdata/languages/Portugues (Brasil) b/rtdata/languages/Portugues (Brasil) index 794bc20d2..c6ff58310 100644 --- a/rtdata/languages/Portugues (Brasil) +++ b/rtdata/languages/Portugues (Brasil) @@ -1626,7 +1626,7 @@ TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Padrão Ponderado TP_EXPOS_BLACKPOINT_LABEL;Pontos Pretos Raw TP_EXPOS_WHITEPOINT_LABEL;Pontos Brancos Raw TP_FILMNEGATIVE_BLUE;Relação de azul -TP_FILMNEGATIVE_PICK;Escolher os pontos brancos e pretos +TP_FILMNEGATIVE_PICK;Pick neutral spots TP_FILMNEGATIVE_RED;Relação de vermelho TP_FILMSIMULATION_LABEL;Simulação de Filme TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee está configurado para procurar por imagens Hald CLUT, que são usadas para a ferramenta Simulação de Filme, numa pasta que está demorando para carregar.\nVá para Preferências > Processamento de Imagem > Simulação de Filme\npara ver qual pasta está sendo usada. Deves apontar RawTherapee para uma pasta que contenha apenas imagens Hald CLUT e nada mais, ou para uma pasta vazia, se não quiseres usar a ferramenta Simulação de Filme.\n\nLeia o artigo sobre Simulação de Filme na RawPedia para mais informações.\n\nDesejas cancelar a verificação agora? @@ -2293,7 +2293,7 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !TP_CROP_PPI;PPI !TP_DEHAZE_LUMINANCE;Luminance only !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) -!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. +!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. !TP_FILMNEGATIVE_LABEL;Film Negative !TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. !TP_LENSPROFILE_USE_HEADER;Correct diff --git a/rtdata/languages/Russian b/rtdata/languages/Russian index 0512fb37c..9f8f47da0 100644 --- a/rtdata/languages/Russian +++ b/rtdata/languages/Russian @@ -1990,9 +1990,9 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !TP_EXPOS_WHITEPOINT_LABEL;Raw White Points !TP_FILMNEGATIVE_BLUE;Blue ratio !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) -!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. +!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. !TP_FILMNEGATIVE_LABEL;Film Negative -!TP_FILMNEGATIVE_PICK;Pick white and black spots +!TP_FILMNEGATIVE_PICK;Pick neutral spots !TP_FILMNEGATIVE_RED;Red ratio !TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now? !TP_FLATFIELD_CLIPCONTROL;Clip control diff --git a/rtdata/languages/Serbian (Cyrilic Characters) b/rtdata/languages/Serbian (Cyrilic Characters) index 0e940be55..63b838201 100644 --- a/rtdata/languages/Serbian (Cyrilic Characters) +++ b/rtdata/languages/Serbian (Cyrilic Characters) @@ -1918,9 +1918,9 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_EXPOS_WHITEPOINT_LABEL;Raw White Points !TP_FILMNEGATIVE_BLUE;Blue ratio !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) -!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. +!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. !TP_FILMNEGATIVE_LABEL;Film Negative -!TP_FILMNEGATIVE_PICK;Pick white and black spots +!TP_FILMNEGATIVE_PICK;Pick neutral spots !TP_FILMNEGATIVE_RED;Red ratio !TP_FILMSIMULATION_LABEL;Film Simulation !TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now? diff --git a/rtdata/languages/Swedish b/rtdata/languages/Swedish index 34c32e632..b39d95e02 100644 --- a/rtdata/languages/Swedish +++ b/rtdata/languages/Swedish @@ -2133,9 +2133,9 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_EXPOSURE_HISTMATCHING_TOOLTIP;Automatically adjust sliders and curves (except exposure compensation) to match the look of the embedded JPEG thumbnail. !TP_FILMNEGATIVE_BLUE;Blue ratio !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) -!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. +!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. !TP_FILMNEGATIVE_LABEL;Film Negative -!TP_FILMNEGATIVE_PICK;Pick white and black spots +!TP_FILMNEGATIVE_PICK;Pick neutral spots !TP_FILMNEGATIVE_RED;Red ratio !TP_FLATFIELD_CLIPCONTROL;Clip control !TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, clip control can lead to color cast. diff --git a/rtdata/languages/default b/rtdata/languages/default index d6f146dbb..43660472f 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1651,9 +1651,9 @@ TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points TP_EXPOS_WHITEPOINT_LABEL;Raw White Points TP_FILMNEGATIVE_BLUE;Blue ratio TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) -TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked. +TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. TP_FILMNEGATIVE_LABEL;Film Negative -TP_FILMNEGATIVE_PICK;Pick white and black spots +TP_FILMNEGATIVE_PICK;Pick neutral spots TP_FILMNEGATIVE_RED;Red ratio TP_FILMSIMULATION_LABEL;Film Simulation TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now? From ff2e5da9e4f4cacc3609f3615589f250e9df4ccd Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Wed, 23 Oct 2019 20:51:08 +0200 Subject: [PATCH 086/208] generateTranslationDiffs --- rtdata/languages/Deutsch | 34 +++++++++++++++------------------- rtdata/languages/English (UK) | 2 +- 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index 4c60ad8d8..0ee886945 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -82,8 +82,8 @@ #81 15.04.2019 Erweiterung (TooWaBoo) RT 5.6 #82 25.05.2019 Erweiterung (TooWaBoo) RT 5.6 #83 06.07.2019 Erweiterung (TooWaBoo) RT 5.6 -#84 18.07.2019 Erweiterung (TooWaBoo) RT 5.6 #84 06.10.2019 Erweiterung (TooWaBoo) RT 5.7 +#84 18.07.2019 Erweiterung (TooWaBoo) RT 5.6 ABOUT_TAB_BUILD;Version ABOUT_TAB_CREDITS;Danksagungen @@ -809,6 +809,7 @@ HISTORY_MSG_490;(Dynamikkompression)\nIntensität HISTORY_MSG_491;(Weißabgleich) HISTORY_MSG_492;(RGB-Kurven) HISTORY_MSG_493;(L*a*b*) +HISTORY_MSG_494;(Eingangsschärfung) HISTORY_MSG_CLAMPOOG;(Belichtung) - Farben\nauf Farbraum beschränken HISTORY_MSG_COLORTONING_LABGRID_VALUE;(Farbanpassungen)\nL*a*b*-Farbkorrektur HISTORY_MSG_COLORTONING_LABREGION_AB;(Farbanpassungen)\nL*a*b*-Farbkorrektur\nBereich @@ -826,6 +827,7 @@ HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;(Farbanpassungen)\nL*a*b*-Farbkorrekt HISTORY_MSG_COLORTONING_LABREGION_SLOPE;(Farbanpassungen)\nL*a*b*-Farbkorrektur\nBereich - Steigung HISTORY_MSG_DEHAZE_DEPTH;(Bildschleier entfernen)\nTiefe HISTORY_MSG_DEHAZE_ENABLED;(Bildschleier entfernen) +HISTORY_MSG_DEHAZE_LUMINANCE;(Bildschleier entfernen)\nNur Luminanz HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;(Bildschleier entfernen)\nMaske anzeigen HISTORY_MSG_DEHAZE_STRENGTH;(Bildschleier entfernen)\nIntensität HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;(Sensor—Matrix)\nFarbinterpolation\nAuto-Kontrastschwelle @@ -846,6 +848,13 @@ HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;(Lokaler Kontrast)\nHelle Bereiche HISTORY_MSG_LOCALCONTRAST_RADIUS;(Lokaler Kontrast)\nRadius HISTORY_MSG_METADATA_MODE;(Metadaten)\nKopiermodus HISTORY_MSG_MICROCONTRAST_CONTRAST;(Mikrokontrast)\nKontrastschwelle +HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;(Eingangsschärfung)\nAuto-Schwelle +HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;(Eingangsschärfung)\nAuto-Radius +HISTORY_MSG_PDSHARPEN_CONTRAST;(Eingangsschärfung)\nKontrastschwelle +HISTORY_MSG_PDSHARPEN_GAMMA;(Eingangsschärfung)\nGamma +HISTORY_MSG_PDSHARPEN_ITERATIONS;(Eingangsschärfung)\nIterationen +HISTORY_MSG_PDSHARPEN_RADIUS;(Eingangsschärfung)\nRadius +HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;(Eingangsschärfung)\nRandschärfe erhöhen HISTORY_MSG_PIXELSHIFT_DEMOSAIC;(Sensor-Matrix)\nFarbinterpolation - PS\nBewegungsmethode HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;(Sensor-Matrix)\nVorverarbeitung\nRichtung HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;(Sensor-Matrix)\nVorverarbeitung\nPDAF-Zeilenfilter @@ -856,6 +865,7 @@ HISTORY_MSG_RAW_BORDER;(Sensor-Matrix)\nFarbinterpolation\nBildrand HISTORY_MSG_RESIZE_ALLOWUPSCALING;(Skalieren)\nHochskalieren zulassen HISTORY_MSG_SHARPENING_BLUR;(Schärfung)\nWeichzeichnerradius HISTORY_MSG_SHARPENING_CONTRAST;(Schärfung)\nKontrastschwelle +HISTORY_MSG_SHARPENING_GAMMA;(Schärfung) - Gamma HISTORY_MSG_SH_COLORSPACE;Farbraum HISTORY_MSG_SOFTLIGHT_ENABLED;(Weiches Licht) HISTORY_MSG_SOFTLIGHT_STRENGTH;(Weiches Licht)\nIntensität @@ -1614,6 +1624,7 @@ TP_DEFRINGE_RADIUS;Radius TP_DEFRINGE_THRESHOLD;Schwelle TP_DEHAZE_DEPTH;Tiefe TP_DEHAZE_LABEL;Bildschleier entfernen +TP_DEHAZE_LUMINANCE;Nur Luminanz TP_DEHAZE_SHOW_DEPTH_MAP;Maske anzeigen TP_DEHAZE_STRENGTH;Intensität TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto-Multizonen @@ -1876,6 +1887,7 @@ TP_PCVIGNETTE_ROUNDNESS;Form TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Form:\n0 = Rechteck\n50 = Ellipse\n100 = Kreis TP_PCVIGNETTE_STRENGTH;Intensität TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filterstärke in Blendenstufen (bezogen auf die Bildecken). +TP_PDSHARPENING_LABEL;Eingangsschärfung TP_PERSPECTIVE_HORIZONTAL;Horizontal TP_PERSPECTIVE_LABEL;Perspektive TP_PERSPECTIVE_VERTICAL;Vertikal @@ -2105,12 +2117,14 @@ TP_SHARPENING_BLUR;Weichzeichnerradius TP_SHARPENING_CONTRAST;Kontrastschwelle TP_SHARPENING_EDRADIUS;Radius TP_SHARPENING_EDTOLERANCE;Kantentoleranz +TP_SHARPENING_GAMMA;Gamma TP_SHARPENING_HALOCONTROL;Halokontrolle TP_SHARPENING_HCAMOUNT;Intensität TP_SHARPENING_LABEL;Schärfung TP_SHARPENING_METHOD;Methode TP_SHARPENING_ONLYEDGES;Nur Kanten schärfen TP_SHARPENING_RADIUS;Radius +TP_SHARPENING_RADIUS_BOOST;Randschärfe erhöhen TP_SHARPENING_RLD;RL-Dekonvolution TP_SHARPENING_RLD_AMOUNT;Intensität TP_SHARPENING_RLD_DAMPING;Dämpfung @@ -2372,21 +2386,3 @@ ZOOMPANEL_ZOOMFITSCREEN;An Bildschirm anpassen.\nTaste: Alt + f ZOOMPANEL_ZOOMIN;Hineinzoomen\nTaste: + ZOOMPANEL_ZOOMOUT;Herauszoomen\nTaste: - -!!!!!!!!!!!!!!!!!!!!!!!!! -! Untranslated keys follow; remove the ! prefix after an entry is translated. -!!!!!!!!!!!!!!!!!!!!!!!!! - -HISTORY_MSG_494;(Eingangsschärfung) -HISTORY_MSG_DEHAZE_LUMINANCE;(Bildschleier entfernen)\nNur Luminanz -HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;(Eingangsschärfung)\nAuto-Schwelle -HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;(Eingangsschärfung)\nAuto-Radius -HISTORY_MSG_PDSHARPEN_CONTRAST;(Eingangsschärfung)\nKontrastschwelle -HISTORY_MSG_PDSHARPEN_GAMMA;(Eingangsschärfung)\nGamma -HISTORY_MSG_PDSHARPEN_ITERATIONS;(Eingangsschärfung)\nIterationen -HISTORY_MSG_PDSHARPEN_RADIUS;(Eingangsschärfung)\nRadius -HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;(Eingangsschärfung)\nRandschärfe erhöhen -HISTORY_MSG_SHARPENING_GAMMA;(Schärfung) - Gamma -TP_DEHAZE_LUMINANCE;Nur Luminanz -TP_PDSHARPENING_LABEL;Eingangsschärfung -TP_SHARPENING_GAMMA;Gamma -TP_SHARPENING_RADIUS_BOOST;Randschärfe erhöhen diff --git a/rtdata/languages/English (UK) b/rtdata/languages/English (UK) index b4c76fd22..6c1398a16 100644 --- a/rtdata/languages/English (UK) +++ b/rtdata/languages/English (UK) @@ -88,6 +88,7 @@ TP_DIRPYREQUALIZER_ALGO;Skin Colour Range TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colours of the skin, minimizing the action on other colours\nLarge: avoid more artifacts. TP_DIRPYREQUALIZER_TOOLTIP;Attempts to reduce artifacts in the transitions between skin colours (hue, chroma, luma) and the rest of the image. TP_EXPOSURE_CLAMPOOG;Clip out-of-gamut colours +TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no colour) in the original scene. The patches should differ in brightness. Set the white balance afterwards. TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, clip control can lead to colour cast. TP_GRADIENT_CENTER;Centre TP_GRADIENT_CENTER_X;Centre X @@ -1681,7 +1682,6 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_EXPOS_WHITEPOINT_LABEL;Raw White Points !TP_FILMNEGATIVE_BLUE;Blue ratio !TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) -!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. !TP_FILMNEGATIVE_LABEL;Film Negative !TP_FILMNEGATIVE_PICK;Pick neutral spots !TP_FILMNEGATIVE_RED;Red ratio From ccf4b4c84313c33c88b1007e40f1b3f845611859 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Wed, 23 Oct 2019 23:14:08 +0200 Subject: [PATCH 087/208] flatfield: code review --- rtengine/rawflatfield.cc | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/rtengine/rawflatfield.cc b/rtengine/rawflatfield.cc index 8d8ed0873..f1c0222f0 100644 --- a/rtengine/rawflatfield.cc +++ b/rtengine/rawflatfield.cc @@ -15,7 +15,8 @@ * * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . - */ +*/ + #include #include @@ -73,7 +74,7 @@ void cfaboxblur(float** riFlatFile, float* cfablur, int boxH, int boxW, int H, i #pragma omp for #endif - for (int row = 0; row < H; row++) { + for (int row = 0; row < H; ++row) { int len = boxW / 2 + 1; cfatmp[row * W + 0] = riFlatFile[row][0] / len; cfatmp[row * W + 1] = riFlatFile[row][1] / len; @@ -199,7 +200,7 @@ void cfaboxblur(float** riFlatFile, float* cfablur, int boxH, int boxW, int H, i #pragma omp single #endif - for (int col = W - (W % 8); col < W; col++) { + for (int col = W - (W % 8); col < W; ++col) { int len = boxH / 2 + 1; cfablur[0 * W + col] = srcVertical[0 * W + col] / len; cfablur[1 * W + col] = srcVertical[1 * W + col] / len; @@ -215,7 +216,7 @@ void cfaboxblur(float** riFlatFile, float* cfablur, int boxH, int boxW, int H, i len ++; } - for (int row = boxH + 2; row < H - boxH; row++) { + for (int row = boxH + 2; row < H - boxH; ++row) { cfablur[row * W + col] = cfablur[(row - 2) * W + col] + (srcVertical[(row + boxH) * W + col] - srcVertical[(row - boxH - 2) * W + col]) / len; } @@ -235,7 +236,7 @@ void cfaboxblur(float** riFlatFile, float* cfablur, int boxH, int boxW, int H, i #pragma omp for #endif - for (int col = 0; col < W; col++) { + for (int col = 0; col < W; ++col) { int len = boxH / 2 + 1; cfablur[0 * W + col] = srcVertical[0 * W + col] / len; cfablur[1 * W + col] = srcVertical[1 * W + col] / len; @@ -251,7 +252,7 @@ void cfaboxblur(float** riFlatFile, float* cfablur, int boxH, int boxW, int H, i len ++; } - for (int row = boxH + 2; row < H - boxH; row++) { + for (int row = boxH + 2; row < H - boxH; ++row) { cfablur[row * W + col] = cfablur[(row - 2) * W + col] + (srcVertical[(row + boxH) * W + col] - srcVertical[(row - boxH - 2) * W + col]) / len; } From 91589191e052535199ab51ba7c303926ec26a07e Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Wed, 23 Oct 2019 23:33:29 +0200 Subject: [PATCH 088/208] Small Flat-Field UI cleanup --- rtgui/flatfield.cc | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/rtgui/flatfield.cc b/rtgui/flatfield.cc index c0bd0555a..03da558cb 100644 --- a/rtgui/flatfield.cc +++ b/rtgui/flatfield.cc @@ -32,18 +32,17 @@ using namespace rtengine::procparams; FlatField::FlatField () : FoldableToolPanel(this, "flatfield", M("TP_FLATFIELD_LABEL")) { hbff = Gtk::manage(new Gtk::HBox()); - hbff->set_spacing(2); flatFieldFile = Gtk::manage(new MyFileChooserButton(M("TP_FLATFIELD_LABEL"), Gtk::FILE_CHOOSER_ACTION_OPEN)); bindCurrentFolder (*flatFieldFile, options.lastFlatfieldDir); ffLabel = Gtk::manage(new Gtk::Label(M("GENERAL_FILE"))); flatFieldFileReset = Gtk::manage(new Gtk::Button()); flatFieldFileReset->set_image (*Gtk::manage(new RTImage ("cancel-small.png"))); - hbff->pack_start(*ffLabel, Gtk::PACK_SHRINK, 0); + hbff->pack_start(*ffLabel, Gtk::PACK_SHRINK); hbff->pack_start(*flatFieldFile); - hbff->pack_start(*flatFieldFileReset, Gtk::PACK_SHRINK, 0); + hbff->pack_start(*flatFieldFileReset, Gtk::PACK_SHRINK); flatFieldAutoSelect = Gtk::manage(new Gtk::CheckButton((M("TP_FLATFIELD_AUTOSELECT")))); - ffInfo = Gtk::manage(new Gtk::Label("")); - ffInfo->set_alignment(0, 0); //left align + ffInfo = Gtk::manage(new Gtk::Label("-")); + setExpandAlignProperties(ffInfo, true, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); flatFieldBlurRadius = Gtk::manage(new Adjuster (M("TP_FLATFIELD_BLURRADIUS"), 0, 200, 2, 32)); flatFieldBlurRadius->setAdjusterListener (this); @@ -54,15 +53,14 @@ FlatField::FlatField () : FoldableToolPanel(this, "flatfield", M("TP_FLATFIELD_L flatFieldBlurRadius->show(); Gtk::HBox* hbffbt = Gtk::manage (new Gtk::HBox ()); - hbffbt->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_FLATFIELD_BLURTYPE") + ":")), Gtk::PACK_SHRINK, 4); - hbffbt->set_spacing(4); + hbffbt->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_FLATFIELD_BLURTYPE") + ":")), Gtk::PACK_SHRINK); flatFieldBlurType = Gtk::manage (new MyComboBoxText ()); flatFieldBlurType->append(M("TP_FLATFIELD_BT_AREA")); flatFieldBlurType->append(M("TP_FLATFIELD_BT_VERTICAL")); flatFieldBlurType->append(M("TP_FLATFIELD_BT_HORIZONTAL")); flatFieldBlurType->append(M("TP_FLATFIELD_BT_VERTHORIZ")); flatFieldBlurType->set_active(0); - hbffbt->pack_end (*flatFieldBlurType); + hbffbt->pack_end (*flatFieldBlurType, Gtk::PACK_EXPAND_WIDGET); flatFieldClipControl = Gtk::manage (new Adjuster(M("TP_FLATFIELD_CLIPCONTROL"), 0., 100., 1., 0.)); flatFieldClipControl->setAdjusterListener(this); @@ -75,12 +73,12 @@ FlatField::FlatField () : FoldableToolPanel(this, "flatfield", M("TP_FLATFIELD_L flatFieldClipControl->show(); flatFieldClipControl->set_tooltip_markup (M("TP_FLATFIELD_CLIPCONTROL_TOOLTIP")); - pack_start( *hbff, Gtk::PACK_SHRINK, 0); - pack_start( *flatFieldAutoSelect, Gtk::PACK_SHRINK, 0); - pack_start( *ffInfo, Gtk::PACK_SHRINK, 0); - pack_start( *hbffbt, Gtk::PACK_SHRINK, 0); - pack_start( *flatFieldBlurRadius, Gtk::PACK_SHRINK, 0); - pack_start( *flatFieldClipControl, Gtk::PACK_SHRINK, 0); + pack_start( *hbff, Gtk::PACK_SHRINK); + pack_start( *flatFieldAutoSelect, Gtk::PACK_SHRINK); + pack_start( *ffInfo, Gtk::PACK_SHRINK); + pack_start( *hbffbt, Gtk::PACK_SHRINK); + pack_start( *flatFieldBlurRadius, Gtk::PACK_SHRINK); + pack_start( *flatFieldClipControl, Gtk::PACK_SHRINK); flatFieldFileconn = flatFieldFile->signal_file_set().connect ( sigc::mem_fun(*this, &FlatField::flatFieldFileChanged)); //, true); flatFieldFileReset->signal_clicked().connect( sigc::mem_fun(*this, &FlatField::flatFieldFile_Reset), true ); @@ -169,7 +167,7 @@ void FlatField::read(const rtengine::procparams::ProcParams* pp, const ParamsEdi ffInfo->set_text(Glib::ustring(M("TP_PREPROCESS_NO_FOUND"))); } } else { - ffInfo->set_text(""); + ffInfo->set_text("-"); } ffChanged = false; @@ -334,7 +332,7 @@ void FlatField::flatFieldFile_Reset() flatFieldFile->set_current_folder(options.lastFlatfieldDir); } - ffInfo->set_text(""); + ffInfo->set_text("-"); if (listener) { listener->panelChanged (EvFlatFieldFile, M("GENERAL_NONE") ); @@ -384,7 +382,7 @@ void FlatField::flatFieldAutoSelectChanged() ffInfo->set_text(Glib::ustring(M("TP_PREPROCESS_NO_FOUND"))); } } else { - ffInfo->set_text(""); + ffInfo->set_text("-"); } if (listener) { From 8dba371ebb0ece243360601ce496fd182461af06 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 24 Oct 2019 17:39:09 +0200 Subject: [PATCH 089/208] flatfield: code review --- rtengine/rawflatfield.cc | 190 +++++++++++++++++--------------------- rtengine/rawimagesource.h | 2 +- 2 files changed, 84 insertions(+), 108 deletions(-) diff --git a/rtengine/rawflatfield.cc b/rtengine/rawflatfield.cc index f1c0222f0..782a44b78 100644 --- a/rtengine/rawflatfield.cc +++ b/rtengine/rawflatfield.cc @@ -1,7 +1,7 @@ /* * This file is part of RawTherapee. * - * Copyright (c) 2004-2017 Gabor Horvath + * Copyright (c) 2004-2019 Gabor Horvath * * RawTherapee is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -17,12 +17,11 @@ * along with RawTherapee. If not, see . */ -#include +#include +#include #include -#include "rtengine.h" #include "rawimagesource.h" -#include "rawimage.h" #include "procparams.h" //#define BENCHMARK //#include "StopWatch.h" @@ -30,37 +29,25 @@ namespace { -void cfaboxblur(float** riFlatFile, float* cfablur, int boxH, int boxW, int H, int W) +void cfaboxblur(const float* const * riFlatFile, float* cfablur, int boxH, int boxW, int H, int W) { - if (boxW < 0 || boxH < 0 || (boxW == 0 && boxH == 0)) { // nothing to blur or negative values memcpy(cfablur, riFlatFile[0], W * H * sizeof(float)); return; } - float *tmpBuffer = nullptr; - float *cfatmp = nullptr; - float *srcVertical = nullptr; + std::unique_ptr tmpBuffer; + float *cfatmp = cfablur; if (boxH > 0 && boxW > 0) { // we need a temporary buffer if we have to blur both directions - tmpBuffer = (float (*)) calloc (H * W, sizeof * tmpBuffer); + tmpBuffer.reset(new float [H * W]); + cfatmp = tmpBuffer.get(); } - if (boxH == 0) { - // if boxH == 0 we can skip the vertical blur and process the horizontal blur from riFlatFile to cfablur without using a temporary buffer - cfatmp = cfablur; - } else { - cfatmp = tmpBuffer; - } - - if (boxW == 0) { - // if boxW == 0 we can skip the horizontal blur and process the vertical blur from riFlatFile to cfablur without using a temporary buffer - srcVertical = riFlatFile[0]; - } else { - srcVertical = cfatmp; - } + // if boxW == 0 we can skip the horizontal blur and process the vertical blur from riFlatFile to cfablur without using a temporary buffer + const float* srcVertical = boxW == 0 ? riFlatFile[0] : cfatmp; #ifdef _OPENMP #pragma omp parallel @@ -76,11 +63,11 @@ void cfaboxblur(float** riFlatFile, float* cfablur, int boxH, int boxW, int H, i for (int row = 0; row < H; ++row) { int len = boxW / 2 + 1; - cfatmp[row * W + 0] = riFlatFile[row][0] / len; + cfatmp[row * W] = riFlatFile[row][0] / len; cfatmp[row * W + 1] = riFlatFile[row][1] / len; for (int j = 2; j <= boxW; j += 2) { - cfatmp[row * W + 0] += riFlatFile[row][j] / len; + cfatmp[row * W] += riFlatFile[row][j] / len; cfatmp[row * W + 1] += riFlatFile[row][j + 1] / len; } @@ -90,8 +77,9 @@ void cfaboxblur(float** riFlatFile, float* cfablur, int boxH, int boxW, int H, i len ++; } + const float rlen = 1.f / len; for (int col = boxW + 2; col < W - boxW; col++) { - cfatmp[row * W + col] = cfatmp[row * W + col - 2] + (riFlatFile[row][boxW + col] - cfatmp[row * W + col - boxW - 2]) / len; + cfatmp[row * W + col] = cfatmp[row * W + col - 2] + (riFlatFile[row][boxW + col] - cfatmp[row * W + col - boxW - 2]) * rlen; } for (int col = W - boxW; col < W; col += 2) { @@ -117,10 +105,10 @@ void cfaboxblur(float** riFlatFile, float* cfablur, int boxH, int boxW, int H, i for (int col = 0; col < W - 7; col += 8) { vfloat lenv = leninitv; - vfloat temp1v = LVFU(srcVertical[0 * W + col]) / lenv; - vfloat temp2v = LVFU(srcVertical[1 * W + col]) / lenv; - vfloat temp3v = LVFU(srcVertical[0 * W + col + 4]) / lenv; - vfloat temp4v = LVFU(srcVertical[1 * W + col + 4]) / lenv; + vfloat temp1v = LVFU(srcVertical[col]) / lenv; + vfloat temp2v = LVFU(srcVertical[W + col]) / lenv; + vfloat temp3v = LVFU(srcVertical[col + 4]) / lenv; + vfloat temp4v = LVFU(srcVertical[W + col + 4]) / lenv; for (int i = 2; i < boxH + 2; i += 2) { temp1v += LVFU(srcVertical[i * W + col]) / lenv; @@ -129,10 +117,10 @@ void cfaboxblur(float** riFlatFile, float* cfablur, int boxH, int boxW, int H, i temp4v += LVFU(srcVertical[(i + 1) * W + col + 4]) / lenv; } - STVFU(cfablur[0 * W + col], temp1v); - STVFU(cfablur[1 * W + col], temp2v); - STVFU(cfablur[0 * W + col + 4], temp3v); - STVFU(cfablur[1 * W + col + 4], temp4v); + STVFU(cfablur[col], temp1v); + STVFU(cfablur[W + col], temp2v); + STVFU(cfablur[col + 4], temp3v); + STVFU(cfablur[W + col + 4], temp4v); int row; for (row = 2; row < boxH + 2; row += 2) { @@ -142,9 +130,9 @@ void cfaboxblur(float** riFlatFile, float* cfablur, int boxH, int boxW, int H, i temp3v = (temp3v * lenv + LVFU(srcVertical[(row + boxH) * W + col + 4])) / lenp1v; temp4v = (temp4v * lenv + LVFU(srcVertical[(row + boxH + 1) * W + col + 4])) / lenp1v; STVFU(cfablur[row * W + col], temp1v); - STVFU(cfablur[(row + 1)*W + col], temp2v); + STVFU(cfablur[(row + 1) * W + col], temp2v); STVFU(cfablur[row * W + col + 4], temp3v); - STVFU(cfablur[(row + 1)*W + col + 4], temp4v); + STVFU(cfablur[(row + 1) * W + col + 4], temp4v); lenv = lenp1v; } @@ -154,9 +142,9 @@ void cfaboxblur(float** riFlatFile, float* cfablur, int boxH, int boxW, int H, i temp3v = temp3v + (LVFU(srcVertical[(row + boxH) * W + col + 4]) - LVFU(srcVertical[(row - boxH - 2) * W + col + 4])) / lenv; temp4v = temp4v + (LVFU(srcVertical[(row + 1 + boxH) * W + col + 4]) - LVFU(srcVertical[(row + 1 - boxH - 2) * W + col + 4])) / lenv; STVFU(cfablur[row * W + col], temp1v); - STVFU(cfablur[(row + 1)*W + col], temp2v); + STVFU(cfablur[(row + 1) * W + col], temp2v); STVFU(cfablur[row * W + col + 4], temp3v); - STVFU(cfablur[(row + 1)*W + col + 4], temp4v); + STVFU(cfablur[(row + 1) * W + col + 4], temp4v); } if (row < H - boxH) { @@ -180,9 +168,9 @@ void cfaboxblur(float** riFlatFile, float* cfablur, int boxH, int boxW, int H, i temp3v = (temp3v * lenv - LVFU(srcVertical[(row - boxH - 2) * W + col + 4])) / lenm1v; temp4v = (temp4v * lenv - LVFU(srcVertical[(row - boxH - 1) * W + col + 4])) / lenm1v; STVFU(cfablur[row * W + col], temp1v); - STVFU(cfablur[(row + 1)*W + col], temp2v); + STVFU(cfablur[(row + 1) * W + col], temp2v); STVFU(cfablur[row * W + col + 4], temp3v); - STVFU(cfablur[(row + 1)*W + col + 4], temp4v); + STVFU(cfablur[(row + 1) * W + col + 4], temp4v); lenv = lenm1v; } @@ -190,8 +178,8 @@ void cfaboxblur(float** riFlatFile, float* cfablur, int boxH, int boxW, int H, i vfloat lenm1v = lenv - onev; temp1v = (temp1v * lenv - LVFU(srcVertical[(row - boxH - 2) * W + col])) / lenm1v; temp3v = (temp3v * lenv - LVFU(srcVertical[(row - boxH - 2) * W + col + 4])) / lenm1v; - STVFU(cfablur[(row)*W + col], temp1v); - STVFU(cfablur[(row)*W + col + 4], temp3v); + STVFU(cfablur[row * W + col], temp1v); + STVFU(cfablur[row * W + col + 4], temp3v); } } @@ -202,18 +190,18 @@ void cfaboxblur(float** riFlatFile, float* cfablur, int boxH, int boxW, int H, i for (int col = W - (W % 8); col < W; ++col) { int len = boxH / 2 + 1; - cfablur[0 * W + col] = srcVertical[0 * W + col] / len; - cfablur[1 * W + col] = srcVertical[1 * W + col] / len; + cfablur[col] = srcVertical[col] / len; + cfablur[W + col] = srcVertical[W + col] / len; for (int i = 2; i < boxH + 2; i += 2) { - cfablur[0 * W + col] += srcVertical[i * W + col] / len; - cfablur[1 * W + col] += srcVertical[(i + 1) * W + col] / len; + cfablur[col] += srcVertical[i * W + col] / len; + cfablur[W + col] += srcVertical[(i + 1) * W + col] / len; } for (int row = 2; row < boxH + 2; row += 2) { cfablur[row * W + col] = (cfablur[(row - 2) * W + col] * len + srcVertical[(row + boxH) * W + col]) / (len + 1); - cfablur[(row + 1)*W + col] = (cfablur[(row - 1) * W + col] * len + srcVertical[(row + boxH + 1) * W + col]) / (len + 1); - len ++; + cfablur[(row + 1) * W + col] = (cfablur[(row - 1) * W + col] * len + srcVertical[(row + boxH + 1) * W + col]) / (len + 1); + ++len; } for (int row = boxH + 2; row < H - boxH; ++row) { @@ -224,10 +212,9 @@ void cfaboxblur(float** riFlatFile, float* cfablur, int boxH, int boxW, int H, i cfablur[row * W + col] = (cfablur[(row - 2) * W + col] * len - srcVertical[(row - boxH - 2) * W + col]) / (len - 1); if (row + 1 < H) { - cfablur[(row + 1)*W + col] = (cfablur[(row - 1) * W + col] * len - srcVertical[(row - boxH - 1) * W + col]) / (len - 1); + cfablur[(row + 1) * W + col] = (cfablur[(row - 1) * W + col] * len - srcVertical[(row - boxH - 1) * W + col]) / (len - 1); } - - len --; + --len; } } @@ -238,18 +225,18 @@ void cfaboxblur(float** riFlatFile, float* cfablur, int boxH, int boxW, int H, i for (int col = 0; col < W; ++col) { int len = boxH / 2 + 1; - cfablur[0 * W + col] = srcVertical[0 * W + col] / len; - cfablur[1 * W + col] = srcVertical[1 * W + col] / len; + cfablur[col] = srcVertical[col] / len; + cfablur[W + col] = srcVertical[W + col] / len; for (int i = 2; i < boxH + 2; i += 2) { - cfablur[0 * W + col] += srcVertical[i * W + col] / len; - cfablur[1 * W + col] += srcVertical[(i + 1) * W + col] / len; + cfablur[col] += srcVertical[i * W + col] / len; + cfablur[W + col] += srcVertical[(i + 1) * W + col] / len; } for (int row = 2; row < boxH + 2; row += 2) { cfablur[row * W + col] = (cfablur[(row - 2) * W + col] * len + srcVertical[(row + boxH) * W + col]) / (len + 1); - cfablur[(row + 1)*W + col] = (cfablur[(row - 1) * W + col] * len + srcVertical[(row + boxH + 1) * W + col]) / (len + 1); - len ++; + cfablur[(row + 1) * W + col] = (cfablur[(row - 1) * W + col] * len + srcVertical[(row + boxH + 1) * W + col]) / (len + 1); + ++len; } for (int row = boxH + 2; row < H - boxH; ++row) { @@ -260,20 +247,14 @@ void cfaboxblur(float** riFlatFile, float* cfablur, int boxH, int boxW, int H, i cfablur[row * W + col] = (cfablur[(row - 2) * W + col] * len - srcVertical[(row - boxH - 2) * W + col]) / (len - 1); if (row + 1 < H) { - cfablur[(row + 1)*W + col] = (cfablur[(row - 1) * W + col] * len - srcVertical[(row - boxH - 1) * W + col]) / (len - 1); + cfablur[(row + 1) * W + col] = (cfablur[(row - 1) * W + col] * len - srcVertical[(row - boxH - 1) * W + col]) / (len - 1); } - - len --; + --len; } } - #endif } } - - if (tmpBuffer) { - free (tmpBuffer); - } } } @@ -281,22 +262,23 @@ void cfaboxblur(float** riFlatFile, float* cfablur, int boxH, int boxW, int H, i namespace rtengine { -void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile, unsigned short black[4]) +void RawImageSource::processFlatField(const RAWParams &raw, const RawImage *riFlatFile, const unsigned short black[4]) { // BENCHFUN - float *cfablur = new float[H * W]; - int BS = raw.ff_BlurRadius; - BS += BS & 1; + const float fblack[4] = {static_cast(black[0]), static_cast(black[1]), static_cast(black[2]), static_cast(black[3])}; + std::unique_ptr cfablur(new float[H * W]); + + const int BS = raw.ff_BlurRadius + (raw.ff_BlurRadius & 1); if (raw.ff_BlurType == RAWParams::getFlatFieldBlurTypeString(RAWParams::FlatFieldBlurType::V)) { - cfaboxblur(riFlatFile->data, cfablur, 2 * BS, 0, H, W); + cfaboxblur(riFlatFile->data, cfablur.get(), 2 * BS, 0, H, W); } else if (raw.ff_BlurType == RAWParams::getFlatFieldBlurTypeString(RAWParams::FlatFieldBlurType::H)) { - cfaboxblur(riFlatFile->data, cfablur, 0, 2 * BS, H, W); + cfaboxblur(riFlatFile->data, cfablur.get(), 0, 2 * BS, H, W); } else if (raw.ff_BlurType == RAWParams::getFlatFieldBlurTypeString(RAWParams::FlatFieldBlurType::VH)) { //slightly more complicated blur if trying to correct both vertical and horizontal anomalies - cfaboxblur(riFlatFile->data, cfablur, BS, BS, H, W); //first do area blur to correct vignette + cfaboxblur(riFlatFile->data, cfablur.get(), BS, BS, H, W); //first do area blur to correct vignette } else { //(raw.ff_BlurType == RAWParams::getFlatFieldBlurTypeString(RAWParams::area_ff)) - cfaboxblur(riFlatFile->data, cfablur, BS, BS, H, W); + cfaboxblur(riFlatFile->data, cfablur.get(), BS, BS, H, W); } if (ri->getSensorType() == ST_BAYER || ri->get_colors() == 1) { @@ -309,7 +291,7 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile const int col = 2 * (W >> 2) + n; const int c = ri->get_colors() != 1 ? FC(row, col) : 0; const int c4 = ri->get_colors() != 1 ? ((c == 1 && !(row & 1)) ? 3 : c) : 0; - refcolor[m][n] = std::max(0.0f, cfablur[row * W + col] - black[c4]); + refcolor[m][n] = std::max(0.0f, cfablur[row * W + col] - fblack[c4]); } float limitFactor = 1.f; @@ -332,16 +314,16 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile clippedBefore = true; break; } - const float tempval = (rawVal - black[c4]) * (refcolor[m][n] / std::max(1e-5f, cfablur[(row + m) * W + col + n] - black[c4])); + const float tempval = (rawVal - fblack[c4]) * (refcolor[m][n] / std::max(1e-5f, cfablur[(row + m) * W + col + n] - fblack[c4])); maxval = std::max(maxval, tempval); } } // now we have the max value for the channel // if it clips, calculate factor to avoid clipping - if (maxval + black[c4] >= ri->get_white(c4)) { + if (maxval + fblack[c4] >= ri->get_white(c4)) { if (!clippedBefore) { - limitFactor = std::min(limitFactor, ri->get_white(c4) / (maxval + black[c4])); + limitFactor = std::min(limitFactor, ri->get_white(c4) / (maxval + fblack[c4])); } else { limitFactor = 1.f; } @@ -350,7 +332,7 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile } flatFieldAutoClipValue = (1.f - limitFactor) * 100.f; // this value can be used to set the clip control slider in gui } else { - limitFactor = std::max((float)(100 - raw.ff_clipControl) / 100.f, 0.01f); + limitFactor = std::max((100 - raw.ff_clipControl) / 100.f, 0.01f); } for (int m = 0; m < 2; ++m) @@ -378,8 +360,8 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile const vfloat refcolorv[2] = {_mm_set_ps(refcolor[0][1], refcolor[0][0], refcolor[0][1], refcolor[0][0]), _mm_set_ps(refcolor[1][1], refcolor[1][0], refcolor[1][1], refcolor[1][0]) }; - const vfloat blackv[2] = {_mm_set_ps(black[c4[0][1]], black[c4[0][0]], black[c4[0][1]], black[c4[0][0]]), - _mm_set_ps(black[c4[1][1]], black[c4[1][0]], black[c4[1][1]], black[c4[1][0]]) + const vfloat blackv[2] = {_mm_set_ps(fblack[c4[0][1]], fblack[c4[0][0]], fblack[c4[0][1]], fblack[c4[0][0]]), + _mm_set_ps(fblack[c4[1][1]], fblack[c4[1][0]], fblack[c4[1][1]], fblack[c4[1][0]]) }; const vfloat onev = F2V(1.f); @@ -396,7 +378,7 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile const vfloat rowRefcolorv = refcolorv[row & 1]; for (; col < W - 3; col += 4) { - const vfloat blurv = LVFU(cfablur[(row) * W + col]) - rowBlackv; + const vfloat blurv = LVFU(cfablur[row * W + col]) - rowBlackv; vfloat vignettecorrv = rowRefcolorv / blurv; vignettecorrv = vself(vmaskf_le(blurv, minValuev), onev, vignettecorrv); const vfloat valv = LVFU(rawData[row][col]) - rowBlackv; @@ -406,9 +388,9 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile #endif for (; col < W; ++col) { - const float blur = cfablur[(row) * W + col] - black[c4[row & 1][col & 1]]; + const float blur = cfablur[row * W + col] - fblack[c4[row & 1][col & 1]]; const float vignettecorr = blur <= minValue ? 1.f : refcolor[row & 1][col & 1] / blur; - rawData[row][col] = (rawData[row][col] - black[c4[row & 1][col & 1]]) * vignettecorr + black[c4[row & 1][col & 1]]; + rawData[row][col] = (rawData[row][col] - fblack[c4[row & 1][col & 1]]) * vignettecorr + fblack[c4[row & 1][col & 1]]; } } } else if (ri->getSensorType() == ST_FUJI_XTRANS) { @@ -421,7 +403,7 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile const int row = 2 * (H >> 2) + m; const int col = 2 * (W >> 2) + n; const int c = riFlatFile->XTRANSFC(row, col); - refcolor[c] += std::max(0.0f, cfablur[row * W + col] - black[c]); + refcolor[c] += std::max(0.0f, cfablur[row * W + col] - fblack[c]); cCount[c] ++; } @@ -447,14 +429,14 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile clippedBefore = true; break; } - const float tempval = (rawVal - black[0]) * (refcolor[ri->XTRANSFC(row, col)] / std::max(1e-5f, cfablur[(row) * W + col] - black[0])); + const float tempval = (rawVal - fblack[0]) * (refcolor[ri->XTRANSFC(row, col)] / std::max(1e-5f, cfablur[(row) * W + col] - fblack[0])); maxval = std::max(maxval, tempval); } } // there's only one white level for xtrans - if (!clippedBefore && maxval + black[0] > ri->get_white(0)) { - limitFactor = ri->get_white(0) / (maxval + black[0]); + if (!clippedBefore && maxval + fblack[0] > ri->get_white(0)) { + limitFactor = ri->get_white(0) / (maxval + fblack[0]); flatFieldAutoClipValue = (1.f - limitFactor) * 100.f; // this value can be used to set the clip control slider in gui } } else { @@ -475,19 +457,19 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile for (int row = 0; row < H; ++row) { for (int col = 0; col < W; ++col) { const int c = ri->XTRANSFC(row, col); - const float blur = cfablur[(row) * W + col] - black[c]; + const float blur = cfablur[(row) * W + col] - fblack[c]; const float vignettecorr = blur <= minValue ? 1.f : refcolor[c] / blur; - rawData[row][col] = (rawData[row][col] - black[c]) * vignettecorr + black[c]; + rawData[row][col] = (rawData[row][col] - fblack[c]) * vignettecorr + fblack[c]; } } } if (raw.ff_BlurType == RAWParams::getFlatFieldBlurTypeString(RAWParams::FlatFieldBlurType::VH)) { - float *cfablur1 = new float[H * W]; - float *cfablur2 = new float[H * W]; + std::unique_ptr cfablur1(new float[H * W]); + std::unique_ptr cfablur2(new float[H * W]); //slightly more complicated blur if trying to correct both vertical and horizontal anomalies - cfaboxblur(riFlatFile->data, cfablur1, 0, 2 * BS, H, W); //now do horizontal blur - cfaboxblur(riFlatFile->data, cfablur2, 2 * BS, 0, H, W); //now do vertical blur + cfaboxblur(riFlatFile->data, cfablur1.get(), 0, 2 * BS, H, W); //now do horizontal blur + cfaboxblur(riFlatFile->data, cfablur2.get(), 2 * BS, 0, H, W); //now do vertical blur if (ri->getSensorType() == ST_BAYER || ri->get_colors() == 1) { unsigned int c[2][2] {}; @@ -505,8 +487,8 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile } #ifdef __SSE2__ - const vfloat blackv[2] = {_mm_set_ps(black[c4[0][1]], black[c4[0][0]], black[c4[0][1]], black[c4[0][0]]), - _mm_set_ps(black[c4[1][1]], black[c4[1][0]], black[c4[1][1]], black[c4[1][0]]) + const vfloat blackv[2] = {_mm_set_ps(fblack[c4[0][1]], fblack[c4[0][0]], fblack[c4[0][1]], fblack[c4[0][0]]), + _mm_set_ps(fblack[c4[1][1]], fblack[c4[1][0]], fblack[c4[1][1]], fblack[c4[1][0]]) }; const vfloat epsv = F2V(1e-5f); @@ -530,9 +512,9 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile #endif for (; col < W; ++col) { - const float linecorr = SQR(std::max(1e-5f, cfablur[row * W + col] - black[c4[row & 1][col & 1]])) / - (std::max(1e-5f, cfablur1[row * W + col] - black[c4[row & 1][col & 1]]) * std::max(1e-5f, cfablur2[row * W + col] - black[c4[row & 1][col & 1]])); - rawData[row][col] = (rawData[row][col] - black[c4[row & 1][col & 1]]) * linecorr + black[c4[row & 1][col & 1]]; + const float linecorr = SQR(std::max(1e-5f, cfablur[row * W + col] - fblack[c4[row & 1][col & 1]])) / + (std::max(1e-5f, cfablur1[row * W + col] - fblack[c4[row & 1][col & 1]]) * std::max(1e-5f, cfablur2[row * W + col] - fblack[c4[row & 1][col & 1]])); + rawData[row][col] = (rawData[row][col] - fblack[c4[row & 1][col & 1]]) * linecorr + fblack[c4[row & 1][col & 1]]; } } } else if (ri->getSensorType() == ST_FUJI_XTRANS) { @@ -543,18 +525,12 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile for (int row = 0; row < H; ++row) { for (int col = 0; col < W; ++col) { const int c = ri->XTRANSFC(row, col); - const float hlinecorr = std::max(1e-5f, cfablur[(row) * W + col] - black[c]) / std::max(1e-5f, cfablur1[(row) * W + col] - black[c]); - const float vlinecorr = std::max(1e-5f, cfablur[(row) * W + col] - black[c]) / std::max(1e-5f, cfablur2[(row) * W + col] - black[c]); - rawData[row][col] = (rawData[row][col] - black[c]) * hlinecorr * vlinecorr + black[c]; + const float hlinecorr = std::max(1e-5f, cfablur[(row) * W + col] - fblack[c]) / std::max(1e-5f, cfablur1[(row) * W + col] - fblack[c]); + const float vlinecorr = std::max(1e-5f, cfablur[(row) * W + col] - fblack[c]) / std::max(1e-5f, cfablur2[(row) * W + col] - fblack[c]); + rawData[row][col] = (rawData[row][col] - fblack[c]) * hlinecorr * vlinecorr + fblack[c]; } } - } - - delete [] cfablur1; - delete [] cfablur2; } - - delete [] cfablur; } } /* namespace */ diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index ecadec410..aff252842 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -138,7 +138,7 @@ public: return rgbSourceModified; // tracks whether cached rgb output of demosaic has been modified } - void processFlatField(const RAWParams &raw, RawImage *riFlatFile, unsigned short black[4]); + void processFlatField(const RAWParams &raw, const RawImage *riFlatFile, const unsigned short black[4]); void copyOriginalPixels(const RAWParams &raw, RawImage *ri, RawImage *riDark, RawImage *riFlatFile, array2D &rawData ); void scaleColors (int winx, int winy, int winw, int winh, const RAWParams &raw, array2D &rawData); // raw for cblack From 11f8672584ecb0b589bc4916c12980e0a4aee955 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sat, 26 Oct 2019 12:54:29 +0200 Subject: [PATCH 090/208] Fix bug in Capture Sharpening --- rtengine/capturesharpening.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index 38fe0897c..a080b4f36 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -668,7 +668,7 @@ BENCHFUN buildClipMaskBayer(rawData, W, H, clipMask, whites); const unsigned int fc[2] = {FC(0,0), FC(1,0)}; if (sharpeningParams.autoRadius) { - radius = calcRadiusBayer(rawData, W, H, 1000.f, clipVal, fc); + radius = std::min(calcRadiusBayer(rawData, W, H, 1000.f, clipVal, fc), 1.15f); } } else if (ri->getSensorType() == ST_FUJI_XTRANS) { float whites[6][6]; @@ -696,14 +696,14 @@ BENCHFUN } } if (sharpeningParams.autoRadius) { - radius = calcRadiusXtrans(rawData, W, H, 1000.f, clipVal, i, j); + radius = std::min(calcRadiusXtrans(rawData, W, H, 1000.f, clipVal, i, j), 1.15f); } } else if (ri->get_colors() == 1) { buildClipMaskMono(rawData, W, H, clipMask, (ri->get_white(0) - c_black[0]) * scale_mul[0] * clipLimit); if (sharpeningParams.autoRadius) { const unsigned int fc[2] = {0, 0}; - radius = calcRadiusBayer(rawData, W, H, 1000.f, clipVal, fc); + radius = std::min(calcRadiusBayer(rawData, W, H, 1000.f, clipVal, fc), 1.15f); } } From 0ee3873ce485fa0903f41aa7a657b4813548f953 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 28 Oct 2019 13:35:46 +0100 Subject: [PATCH 091/208] fix clang warning --- rtengine/guidedfilter.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rtengine/guidedfilter.cc b/rtengine/guidedfilter.cc index feb108198..70807424a 100644 --- a/rtengine/guidedfilter.cc +++ b/rtengine/guidedfilter.cc @@ -66,7 +66,12 @@ void guidedFilter(const array2D &guide, const array2D &src, array2 enum Op {MUL, DIVEPSILON, SUBMUL}; const auto apply = +#ifdef _OPENMP [multithread, epsilon](Op op, array2D &res, const array2D &a, const array2D &b, const array2D &c=array2D()) -> void +#else + // removed multithread to fix clang warning on msys2 clang builds, which don't support OpenMp + [epsilon](Op op, array2D &res, const array2D &a, const array2D &b, const array2D &c=array2D()) -> void +#endif { const int w = res.width(); const int h = res.height(); From 66191609d6206536ee884bc536fb49120796ddde Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 28 Oct 2019 15:17:25 +0100 Subject: [PATCH 092/208] Forward declare wavelet_decomposition --- rtengine/cplx_wavelet_dec.h | 6 +----- rtengine/cplx_wavelet_filter_coeffs.h | 2 +- rtengine/cplx_wavelet_level.h | 8 ++------ rtengine/improcfun.h | 3 ++- 4 files changed, 6 insertions(+), 13 deletions(-) diff --git a/rtengine/cplx_wavelet_dec.h b/rtengine/cplx_wavelet_dec.h index 91e71fcd5..c127a7adf 100644 --- a/rtengine/cplx_wavelet_dec.h +++ b/rtengine/cplx_wavelet_dec.h @@ -17,9 +17,7 @@ * 2010 Ilya Popov * 2012 Emil Martinec */ - -#ifndef CPLX_WAVELET_DEC_H_INCLUDED -#define CPLX_WAVELET_DEC_H_INCLUDED +#pragma once #include #include @@ -266,5 +264,3 @@ void wavelet_decomposition::reconstruct(E * dst, const float blend) } } - -#endif diff --git a/rtengine/cplx_wavelet_filter_coeffs.h b/rtengine/cplx_wavelet_filter_coeffs.h index 6b8255b89..6287fc03b 100644 --- a/rtengine/cplx_wavelet_filter_coeffs.h +++ b/rtengine/cplx_wavelet_filter_coeffs.h @@ -17,7 +17,7 @@ * 2012 Emil Martinec * 2014 Jacques Desmis */ - +#pragma once namespace rtengine { diff --git a/rtengine/cplx_wavelet_level.h b/rtengine/cplx_wavelet_level.h index 4c98addfe..8664606c6 100644 --- a/rtengine/cplx_wavelet_level.h +++ b/rtengine/cplx_wavelet_level.h @@ -17,10 +17,8 @@ * 2010 Ilya Popov * 2012 Emil Martinec * 2014 Ingo Weyrich - */ - -#ifndef CPLX_WAVELET_LEVEL_H_INCLUDED -#define CPLX_WAVELET_LEVEL_H_INCLUDED +*/ +#pragma once #include #include "rt_math.h" @@ -759,5 +757,3 @@ template template void wavelet_level::reconstruct_lev } #endif } - -#endif diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 684927e47..9b8d0f63f 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -31,13 +31,14 @@ #include "lcp.h" #include "dcp.h" #include "curves.h" -#include "cplx_wavelet_dec.h" #include "pipettebuffer.h" #include "gamutwarning.h" namespace rtengine { +class wavelet_decomposition; + namespace procparams { From eaf0eeff4e4020e8afb6e59216c3373e9444177f Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 28 Oct 2019 15:43:58 +0100 Subject: [PATCH 093/208] Forward declare CieImage --- rtengine/PF_correct_RT.cc | 1 + rtengine/cieimage.cc | 8 +++----- rtengine/cieimage.h | 6 +----- rtengine/dcrop.cc | 2 ++ rtengine/dirpyr_equalizer.cc | 2 ++ rtengine/improccoordinator.cc | 1 + rtengine/improcfun.cc | 1 + rtengine/improcfun.h | 3 +-- rtengine/ipsharpen.cc | 1 + rtengine/rtthumbnail.cc | 1 + rtengine/simpleprocess.cc | 1 + 11 files changed, 15 insertions(+), 12 deletions(-) diff --git a/rtengine/PF_correct_RT.cc b/rtengine/PF_correct_RT.cc index 7df042663..98c399bff 100644 --- a/rtengine/PF_correct_RT.cc +++ b/rtengine/PF_correct_RT.cc @@ -29,6 +29,7 @@ #include "gauss.h" #include "improcfun.h" +#include "cieimage.h" #include "sleef.c" #include "../rtgui/myflatcurve.h" #include "rt_math.h" diff --git a/rtengine/cieimage.cc b/rtengine/cieimage.cc index be122febf..f19808df7 100644 --- a/rtengine/cieimage.cc +++ b/rtengine/cieimage.cc @@ -1,5 +1,7 @@ #include "cieimage.h" -#include + +#include +#include namespace rtengine { @@ -10,7 +12,6 @@ CieImage::CieImage (int w, int h) : fromImage(false), W(w), H(h) M_p = new float*[H]; C_p = new float*[H]; sh_p = new float*[H]; - // ch_p = new float*[H]; h_p = new float*[H]; // Initialize the pointers to zero @@ -98,9 +99,6 @@ CieImage::CieImage (int w, int h) : fromImage(false), W(w), H(h) ++c; - // for (int i=0; i. */ -#ifndef _CIEIMAGE_H_ -#define _CIEIMAGE_H_ +#pragma once -#include "image16.h" #include "noncopyable.h" namespace rtengine @@ -39,7 +37,6 @@ public: float** M_p; float** C_p; float** sh_p; -// float** ch_p; float** h_p; CieImage (int w, int h); @@ -50,4 +47,3 @@ public: }; } -#endif diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 61b96b3a3..41e052b3e 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -17,6 +17,8 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ + +#include "cieimage.h" #include "curves.h" #include "dcrop.h" #include "mytime.h" diff --git a/rtengine/dirpyr_equalizer.cc b/rtengine/dirpyr_equalizer.cc index e822d8492..79f85a944 100644 --- a/rtengine/dirpyr_equalizer.cc +++ b/rtengine/dirpyr_equalizer.cc @@ -20,6 +20,8 @@ #include #include + +#include "cieimage.h" #include "improcfun.h" #include "array2D.h" #include "rt_math.h" diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 8b9e49124..5633f77fa 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -17,6 +17,7 @@ * along with RawTherapee. If not, see . */ #include "improccoordinator.h" +#include "cieimage.h" #include "curves.h" #include "mytime.h" #include "refreshmap.h" diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 5acf4e15d..56eaeaa55 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -24,6 +24,7 @@ #endif #include "alignedbuffer.h" +#include "cieimage.h" #include "rtengine.h" #include "improcfun.h" #include "curves.h" diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 9b8d0f63f..41e4704b9 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -26,7 +26,6 @@ #include "coord2d.h" #include "color.h" #include "labimage.h" -#include "cieimage.h" #include "LUT.h" #include "lcp.h" #include "dcp.h" @@ -36,7 +35,7 @@ namespace rtengine { - +class CieImage; class wavelet_decomposition; namespace procparams diff --git a/rtengine/ipsharpen.cc b/rtengine/ipsharpen.cc index 0b1332ec9..0ba94a7c4 100644 --- a/rtengine/ipsharpen.cc +++ b/rtengine/ipsharpen.cc @@ -18,6 +18,7 @@ */ #include "improcfun.h" +#include "cieimage.h" #include "gauss.h" #include "bilateral2.h" #include "jaggedarray.h" diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index 25f50980d..704721e3f 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -16,6 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ +#include "cieimage.h" #include "rtengine.h" #include "rtthumbnail.h" #include "../rtgui/options.h" diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 6dbb0e649..5a43e0a21 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -16,6 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ +#include "cieimage.h" #include "rtengine.h" #include "colortemp.h" #include "imagesource.h" From 22e5348db7560800a415913818c9b39528adff32 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 28 Oct 2019 17:17:15 +0100 Subject: [PATCH 094/208] Forward declare LabImage --- rtengine/FTblockDN.cc | 1 + rtengine/PF_correct_RT.cc | 1 + rtengine/color.h | 1 - rtengine/dcrop.cc | 1 + rtengine/imagefloat.cc | 1 + rtengine/imagefloat.h | 1 + rtengine/improccoordinator.cc | 1 + rtengine/improcfun.cc | 1 + rtengine/improcfun.h | 2 +- rtengine/iplab2rgb.cc | 1 + rtengine/iplabregions.cc | 1 + rtengine/iplocalcontrast.cc | 1 + rtengine/ipresize.cc | 1 + rtengine/ipshadowshighlights.cc | 1 + rtengine/ipsharpen.cc | 1 + rtengine/ipsoftlight.cc | 1 + rtengine/ipvibrance.cc | 1 + rtengine/ipwavelet.cc | 1 + rtengine/labimage.cc | 1 - rtengine/labimage.h | 6 +++--- rtengine/pipettebuffer.cc | 1 + rtengine/pipettebuffer.h | 1 + rtengine/rtthumbnail.cc | 1 + rtengine/simpleprocess.cc | 1 + 24 files changed, 24 insertions(+), 6 deletions(-) diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index 8fd0ba29e..117d8740a 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -30,6 +30,7 @@ #include "LUT.h" #include "array2D.h" #include "iccmatrices.h" +#include "labimage.h" #include "boxblur.h" #include "rt_math.h" #include "mytime.h" diff --git a/rtengine/PF_correct_RT.cc b/rtengine/PF_correct_RT.cc index 98c399bff..eb450dce9 100644 --- a/rtengine/PF_correct_RT.cc +++ b/rtengine/PF_correct_RT.cc @@ -30,6 +30,7 @@ #include "gauss.h" #include "improcfun.h" #include "cieimage.h" +#include "labimage.h" #include "sleef.c" #include "../rtgui/myflatcurve.h" #include "rt_math.h" diff --git a/rtengine/color.h b/rtengine/color.h index 2acf675d4..d0053470e 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -24,7 +24,6 @@ #include "rt_math.h" #include "LUT.h" -#include "labimage.h" #include "iccmatrices.h" #include "lcms2.h" #include "sleef.c" diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 41e052b3e..fe904527e 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -19,6 +19,7 @@ */ #include "cieimage.h" +#include "labimage.h" #include "curves.h" #include "dcrop.h" #include "mytime.h" diff --git a/rtengine/imagefloat.cc b/rtengine/imagefloat.cc index 8a9a511a6..0b67e0785 100644 --- a/rtengine/imagefloat.cc +++ b/rtengine/imagefloat.cc @@ -20,6 +20,7 @@ #include "imagefloat.h" #include "image16.h" #include "image8.h" +#include "labimage.h" #include #include "rtengine.h" #include "mytime.h" diff --git a/rtengine/imagefloat.h b/rtengine/imagefloat.h index 261a0677c..5250e16e8 100644 --- a/rtengine/imagefloat.h +++ b/rtengine/imagefloat.h @@ -31,6 +31,7 @@ using namespace procparams; class Image8; class Image16; +class LabImage; /* * Image type used by most tools; expected range: [0.0 ; 65535.0] diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 5633f77fa..c12e8132c 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -18,6 +18,7 @@ */ #include "improccoordinator.h" #include "cieimage.h" +#include "labimage.h" #include "curves.h" #include "mytime.h" #include "refreshmap.h" diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 56eaeaa55..e446f21a0 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -25,6 +25,7 @@ #include "alignedbuffer.h" #include "cieimage.h" +#include "labimage.h" #include "rtengine.h" #include "improcfun.h" #include "curves.h" diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 41e4704b9..05c06e0ef 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -25,7 +25,6 @@ #include "shmap.h" #include "coord2d.h" #include "color.h" -#include "labimage.h" #include "LUT.h" #include "lcp.h" #include "dcp.h" @@ -36,6 +35,7 @@ namespace rtengine { class CieImage; +class LabImage; class wavelet_decomposition; namespace procparams diff --git a/rtengine/iplab2rgb.cc b/rtengine/iplab2rgb.cc index 14aeb4049..8854331e4 100644 --- a/rtengine/iplab2rgb.cc +++ b/rtengine/iplab2rgb.cc @@ -17,6 +17,7 @@ * along with RawTherapee. If not, see . */ #include "rtengine.h" +#include "labimage.h" #include "improcfun.h" #include #include "iccstore.h" diff --git a/rtengine/iplabregions.cc b/rtengine/iplabregions.cc index af6567c3c..2462959bf 100644 --- a/rtengine/iplabregions.cc +++ b/rtengine/iplabregions.cc @@ -23,6 +23,7 @@ #endif #include "improcfun.h" +#include "labimage.h" #include "guidedfilter.h" #include "procparams.h" //#define BENCHMARK diff --git a/rtengine/iplocalcontrast.cc b/rtengine/iplocalcontrast.cc index 6143f48a3..4e6c32e7e 100644 --- a/rtengine/iplocalcontrast.cc +++ b/rtengine/iplocalcontrast.cc @@ -28,6 +28,7 @@ #include "array2D.h" #include "gauss.h" +#include "labimage.h" #include "improcfun.h" #include "procparams.h" diff --git a/rtengine/ipresize.cc b/rtengine/ipresize.cc index 0c1fb1ad8..601ec146d 100644 --- a/rtengine/ipresize.cc +++ b/rtengine/ipresize.cc @@ -20,6 +20,7 @@ #include "improcfun.h" #include "alignedbuffer.h" +#include "labimage.h" #include "opthelper.h" #include "rt_math.h" #include "procparams.h" diff --git a/rtengine/ipshadowshighlights.cc b/rtengine/ipshadowshighlights.cc index cddc8734b..7680ae6c7 100644 --- a/rtengine/ipshadowshighlights.cc +++ b/rtengine/ipshadowshighlights.cc @@ -22,6 +22,7 @@ #include "gauss.h" #include "guidedfilter.h" +#include "labimage.h" #include "opthelper.h" #include "procparams.h" #include "sleef.c" diff --git a/rtengine/ipsharpen.cc b/rtengine/ipsharpen.cc index 0ba94a7c4..1b3ab6270 100644 --- a/rtengine/ipsharpen.cc +++ b/rtengine/ipsharpen.cc @@ -19,6 +19,7 @@ #include "improcfun.h" #include "cieimage.h" +#include "labimage.h" #include "gauss.h" #include "bilateral2.h" #include "jaggedarray.h" diff --git a/rtengine/ipsoftlight.cc b/rtengine/ipsoftlight.cc index cd49e858f..e0dc6aa40 100644 --- a/rtengine/ipsoftlight.cc +++ b/rtengine/ipsoftlight.cc @@ -20,6 +20,7 @@ */ #include "improcfun.h" +#include "labimage.h" #include "procparams.h" diff --git a/rtengine/ipvibrance.cc b/rtengine/ipvibrance.cc index a7199064a..365dff587 100644 --- a/rtengine/ipvibrance.cc +++ b/rtengine/ipvibrance.cc @@ -23,6 +23,7 @@ #include "rtengine.h" #include "improcfun.h" #include "iccstore.h" +#include "labimage.h" #include "mytime.h" #include "../rtgui/thresholdselector.h" #include "curves.h" diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 6631aae32..078b9d585 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -30,6 +30,7 @@ #include "rtengine.h" #include "improcfun.h" +#include "labimage.h" #include "LUT.h" #include "array2D.h" #include "rt_math.h" diff --git a/rtengine/labimage.cc b/rtengine/labimage.cc index b31bc89a1..153af4c75 100644 --- a/rtengine/labimage.cc +++ b/rtengine/labimage.cc @@ -17,7 +17,6 @@ * along with RawTherapee. If not, see . */ -#include #include #include "labimage.h" diff --git a/rtengine/labimage.h b/rtengine/labimage.h index bcc2484ab..79f003b07 100644 --- a/rtengine/labimage.h +++ b/rtengine/labimage.h @@ -16,8 +16,9 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _LABIMAGE_H_ -#define _LABIMAGE_H_ +#pragma once + +#include namespace rtengine { @@ -45,4 +46,3 @@ public: }; } -#endif diff --git a/rtengine/pipettebuffer.cc b/rtengine/pipettebuffer.cc index d915381ef..11cf50ae9 100644 --- a/rtengine/pipettebuffer.cc +++ b/rtengine/pipettebuffer.cc @@ -20,6 +20,7 @@ #include "pipettebuffer.h" #include "imagefloat.h" +#include "labimage.h" #include "../rtgui/editcallbacks.h" diff --git a/rtengine/pipettebuffer.h b/rtengine/pipettebuffer.h index 01b24720c..ef8a5f69a 100644 --- a/rtengine/pipettebuffer.h +++ b/rtengine/pipettebuffer.h @@ -31,6 +31,7 @@ namespace rtengine { class Imagefloat; +class LabImage; /// @brief Structure that contains information about and pointers to the Edit buffer class PipetteBuffer diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index 704721e3f..b30bf3eb4 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -17,6 +17,7 @@ * along with RawTherapee. If not, see . */ #include "cieimage.h" +#include "labimage.h" #include "rtengine.h" #include "rtthumbnail.h" #include "../rtgui/options.h" diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 5a43e0a21..2eb640fca 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -17,6 +17,7 @@ * along with RawTherapee. If not, see . */ #include "cieimage.h" +#include "labimage.h" #include "rtengine.h" #include "colortemp.h" #include "imagesource.h" From 20726d5bfe505f206aa36ff8c900dbd0f3da77b0 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 28 Oct 2019 20:01:16 +0100 Subject: [PATCH 095/208] Forward declare Imagefloat --- rtengine/FTblockDN.cc | 1 + rtengine/dcp.cc | 1 + rtengine/dcp.h | 3 ++- rtengine/dcrop.cc | 1 + rtengine/dual_demosaic_RT.cc | 18 +++++++++--------- rtengine/filmnegativeproc.cc | 2 +- rtengine/image16.h | 2 +- rtengine/image8.cc | 1 + rtengine/image8.h | 2 +- rtengine/imagefloat.h | 5 +---- rtengine/imagesource.h | 10 +++++----- rtengine/improccoordinator.cc | 1 + rtengine/improcfun.h | 10 +++++----- rtengine/ipdehaze.cc | 1 + rtengine/iplab2rgb.cc | 1 + rtengine/ipresize.cc | 1 + rtengine/ipretinex.cc | 2 +- rtengine/ipsharpen.cc | 6 +++--- rtengine/iptransform.cc | 1 + rtengine/lcp.cc | 3 ++- rtengine/lcp.h | 12 ++++++++++-- rtengine/pixelshift.cc | 24 ++++++++++++------------ rtengine/rawimagesource.cc | 1 + rtengine/rawimagesource.h | 16 ++++++++-------- rtengine/rtlensfun.cc | 3 ++- rtengine/rtlensfun.h | 6 ++++-- rtengine/shmap.cc | 1 + rtengine/shmap.h | 4 ++-- rtengine/simpleprocess.cc | 1 + rtengine/stdimagesource.cc | 1 + rtengine/stdimagesource.h | 16 +++++++++++++--- rtengine/tmo_fattal02.cc | 1 + 32 files changed, 96 insertions(+), 62 deletions(-) diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index 117d8740a..8cd9a4086 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -30,6 +30,7 @@ #include "LUT.h" #include "array2D.h" #include "iccmatrices.h" +#include "imagefloat.h" #include "labimage.h" #include "boxblur.h" #include "rt_math.h" diff --git a/rtengine/dcp.cc b/rtengine/dcp.cc index 8127ebfcb..6376968e6 100644 --- a/rtengine/dcp.cc +++ b/rtengine/dcp.cc @@ -27,6 +27,7 @@ #include "cJSON.h" #include "iccmatrices.h" #include "iccstore.h" +#include "imagefloat.h" #include "improcfun.h" #include "rawimagesource.h" #include "rt_math.h" diff --git a/rtengine/dcp.h b/rtengine/dcp.h index 826f073a5..ba8be93eb 100644 --- a/rtengine/dcp.h +++ b/rtengine/dcp.h @@ -28,7 +28,6 @@ #include "../rtgui/threadutils.h" -#include "imagefloat.h" #include "curves.h" #include "colortemp.h" #include "noncopyable.h" @@ -36,6 +35,8 @@ namespace rtengine { +class Imagefloat; + class DCPProfile final { public: diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index fe904527e..bc09f5348 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -19,6 +19,7 @@ */ #include "cieimage.h" +#include "imagefloat.h" #include "labimage.h" #include "curves.h" #include "dcrop.h" diff --git a/rtengine/dual_demosaic_RT.cc b/rtengine/dual_demosaic_RT.cc index 60cce506b..895d7c6fc 100644 --- a/rtengine/dual_demosaic_RT.cc +++ b/rtengine/dual_demosaic_RT.cc @@ -37,22 +37,22 @@ using namespace std; namespace rtengine { -void RawImageSource::dual_demosaic_RT(bool isBayer, const RAWParams &raw, int winw, int winh, const array2D &rawData, array2D &red, array2D &green, array2D &blue, double &contrast, bool autoContrast) +void RawImageSource::dual_demosaic_RT(bool isBayer, const procparams::RAWParams &raw, int winw, int winh, const array2D &rawData, array2D &red, array2D &green, array2D &blue, double &contrast, bool autoContrast) { BENCHFUN if (contrast == 0.f && !autoContrast) { // contrast == 0.0 means only first demosaicer will be used if(isBayer) { - if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::AMAZEVNG4) ) { + if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::AMAZEVNG4) ) { amaze_demosaic_RT(0, 0, winw, winh, rawData, red, green, blue, options.chunkSizeAMAZE, options.measure); - } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::DCBVNG4) ) { + } else if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::DCBVNG4) ) { dcb_demosaic(raw.bayersensor.dcb_iterations, raw.bayersensor.dcb_enhance); - } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::RCDVNG4) ) { + } else if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCDVNG4) ) { rcd_demosaic(options.chunkSizeRCD, options.measure); } } else { - if (raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::FOUR_PASS) ) { + if (raw.xtranssensor.method == procparams::RAWParams::XTransSensor::getMethodString(procparams::RAWParams::XTransSensor::Method::FOUR_PASS) ) { xtrans_interpolate (3, true, options.chunkSizeXT, options.measure); } else { xtrans_interpolate (1, false, options.chunkSizeXT, options.measure); @@ -70,15 +70,15 @@ void RawImageSource::dual_demosaic_RT(bool isBayer, const RAWParams &raw, int wi if (isBayer) { vng4_demosaic(rawData, redTmp, greenTmp, blueTmp); - if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::AMAZEVNG4) || raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::PIXELSHIFT)) { + if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::AMAZEVNG4) || raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::PIXELSHIFT)) { amaze_demosaic_RT(0, 0, winw, winh, rawData, red, green, blue, options.chunkSizeAMAZE, options.measure); - } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::DCBVNG4) ) { + } else if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::DCBVNG4) ) { dcb_demosaic(raw.bayersensor.dcb_iterations, raw.bayersensor.dcb_enhance); - } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::RCDVNG4) ) { + } else if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCDVNG4) ) { rcd_demosaic(options.chunkSizeRCD, options.measure); } } else { - if (raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::FOUR_PASS) ) { + if (raw.xtranssensor.method == procparams::RAWParams::XTransSensor::getMethodString(procparams::RAWParams::XTransSensor::Method::FOUR_PASS) ) { xtrans_interpolate (3, true, options.chunkSizeXT, options.measure); } else { xtrans_interpolate (1, false, options.chunkSizeXT, options.measure); diff --git a/rtengine/filmnegativeproc.cc b/rtengine/filmnegativeproc.cc index 4293c6b2a..81de775a3 100644 --- a/rtengine/filmnegativeproc.cc +++ b/rtengine/filmnegativeproc.cc @@ -98,7 +98,7 @@ bool channelsAvg( } -bool rtengine::RawImageSource::getFilmNegativeExponents(Coord2D spotA, Coord2D spotB, int tran, const FilmNegativeParams ¤tParams, std::array& newExps) +bool rtengine::RawImageSource::getFilmNegativeExponents(Coord2D spotA, Coord2D spotB, int tran, const procparams::FilmNegativeParams ¤tParams, std::array& newExps) { newExps = { static_cast(currentParams.redRatio * currentParams.greenExp), diff --git a/rtengine/image16.h b/rtengine/image16.h index 07747a172..c16b7dd0d 100644 --- a/rtengine/image16.h +++ b/rtengine/image16.h @@ -24,12 +24,12 @@ #include "imageio.h" #include "rtengine.h" -#include "imagefloat.h" namespace rtengine { class Image8; +class Imagefloat; class Image16 : public IImage16, public ImageIO { diff --git a/rtengine/image8.cc b/rtengine/image8.cc index abcd4efae..fb71e94a4 100644 --- a/rtengine/image8.cc +++ b/rtengine/image8.cc @@ -19,6 +19,7 @@ #include #include #include "image8.h" +#include "imagefloat.h" #include "rtengine.h" using namespace rtengine; diff --git a/rtengine/image8.h b/rtengine/image8.h index 969627f69..2fa2528ed 100644 --- a/rtengine/image8.h +++ b/rtengine/image8.h @@ -24,10 +24,10 @@ #include "imageio.h" #include "rtengine.h" -#include "imagefloat.h" namespace rtengine { +class Imagefloat; class Image8 : public IImage8, public ImageIO { diff --git a/rtengine/imagefloat.h b/rtengine/imagefloat.h index 5250e16e8..4a2b2f7e1 100644 --- a/rtengine/imagefloat.h +++ b/rtengine/imagefloat.h @@ -19,11 +19,9 @@ // // A class representing a 16 bit rgb image with separate planes and 16 byte aligned data // -#ifndef _IMAGEFLOAT_ -#define _IMAGEFLOAT_ +#pragma once #include "imageio.h" -#include "rtengine.h" namespace rtengine { @@ -228,4 +226,3 @@ public: }; } -#endif diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index edc1102c4..065a2e582 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -29,12 +29,12 @@ #include "image16.h" #include "image8.h" #include "imagedata.h" -#include "imagefloat.h" #include "LUT.h" #include "rtengine.h" namespace rtengine { +class Imagefloat; namespace procparams { @@ -47,7 +47,7 @@ struct RAWParams; struct RetinexParams; struct ToneCurveParams; struct CaptureSharpeningParams; -} +}; class ImageMatrices { @@ -82,7 +82,7 @@ public: virtual int load (const Glib::ustring &fname) = 0; virtual void preprocess (const procparams::RAWParams &raw, const procparams::LensProfParams &lensProf, const procparams::CoarseTransformParams& coarse, bool prepareDenoise = true) {}; virtual void filmNegativeProcess (const procparams::FilmNegativeParams ¶ms) {}; - virtual bool getFilmNegativeExponents (Coord2D spotA, Coord2D spotB, int tran, const FilmNegativeParams& currentParams, std::array& newExps) { return false; }; + virtual bool getFilmNegativeExponents (Coord2D spotA, Coord2D spotB, int tran, const procparams::FilmNegativeParams& currentParams, std::array& newExps) { return false; }; virtual void demosaic (const procparams::RAWParams &raw, bool autoContrast, double &contrastThreshold, bool cache = false) {}; virtual void retinex (const procparams::ColorManagementParams& cmp, const procparams::RetinexParams &deh, const procparams::ToneCurveParams& Tc, LUTf & cdcurve, LUTf & mapcurve, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, multi_array2D &conversionBuffer, bool dehacontlutili, bool mapcontlutili, bool useHsl, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, LUTu &histLRETI) {}; virtual void retinexPrepareCurves (const procparams::RetinexParams &retinexParams, LUTf &cdcurve, LUTf &mapcurve, RetinextransmissionCurve &retinextransmissionCurve, RetinexgaintransmissionCurve &retinexgaintransmissionCurve, bool &retinexcontlutili, bool &mapcontlutili, bool &useHsl, LUTu & lhist16RETI, LUTu & histLRETI) {}; @@ -101,13 +101,13 @@ public: // use right after demosaicing image, add coarse transformation and put the result in the provided Imagefloat* - virtual void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const procparams::ToneCurveParams &hlp, const RAWParams &raw) = 0; + virtual void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const procparams::ToneCurveParams &hlp, const procparams::RAWParams &raw) = 0; virtual eSensorType getSensorType () const = 0; virtual bool isMono () const = 0; // true is ready to provide the AutoWB, i.e. when the image has been demosaiced for RawImageSource virtual bool isWBProviderReady () = 0; - virtual void convertColorSpace (Imagefloat* image, const ColorManagementParams &cmp, const ColorTemp &wb) = 0; // DIRTY HACK: this method is derived in rawimagesource and strimagesource, but (...,RAWParams raw) will be used ONLY for raw images + virtual void convertColorSpace (Imagefloat* image, const procparams::ColorManagementParams &cmp, const ColorTemp &wb) = 0; // DIRTY HACK: this method is derived in rawimagesource and strimagesource, but (...,RAWParams raw) will be used ONLY for raw images virtual void getAutoWBMultipliers (double &rm, double &gm, double &bm) = 0; virtual ColorTemp getWB () const = 0; virtual ColorTemp getSpotWB (std::vector &red, std::vector &green, std::vector &blue, int tran, double equal) = 0; diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index c12e8132c..d75f515bf 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -18,6 +18,7 @@ */ #include "improccoordinator.h" #include "cieimage.h" +#include "imagefloat.h" #include "labimage.h" #include "curves.h" #include "mytime.h" diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 05c06e0ef..80e750a26 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -19,7 +19,6 @@ #ifndef _IMPROCFUN_H_ #define _IMPROCFUN_H_ -#include "imagefloat.h" #include "image16.h" #include "image8.h" #include "shmap.h" @@ -35,6 +34,7 @@ namespace rtengine { class CieImage; +class Imagefloat; class LabImage; class wavelet_decomposition; @@ -57,7 +57,7 @@ class ImProcFunctions cmsHTRANSFORM monitorTransform; std::unique_ptr gamutWarning; - const ProcParams* params; + const procparams::ProcParams* params; double scale; bool multiThread; @@ -90,7 +90,7 @@ public: double lumimul[3]; - explicit ImProcFunctions(const ProcParams* iparams, bool imultiThread = true) + explicit ImProcFunctions(const procparams::ProcParams* iparams, bool imultiThread = true) : monitorTransform(nullptr), params(iparams), scale(1), multiThread(imultiThread), lumimul{} {} ~ImProcFunctions(); bool needsLuminanceOnly() @@ -122,7 +122,7 @@ public: void moyeqt(Imagefloat* working, float &moyS, float &eqty); void luminanceCurve(LabImage* lold, LabImage* lnew, LUTf &curve); - void ciecam_02float(CieImage* ncie, float adap, int pW, int pwb, LabImage* lab, const ProcParams* params, + void ciecam_02float(CieImage* ncie, float adap, int pW, int pwb, LabImage* lab, const procparams::ProcParams* params, const ColorAppearance & customColCurve1, const ColorAppearance & customColCurve, const ColorAppearance & customColCurve3, LUTu &histLCAM, LUTu &histCCAM, LUTf & CAMBrightCurveJ, LUTf & CAMBrightCurveQ, float &mean, int Iterates, int scale, bool execsharp, float &d, float &dj, float &yb, int rtt, bool showSharpMask = false); @@ -132,7 +132,7 @@ public: void sharpening(LabImage* lab, const procparams::SharpeningParams &sharpenParam, bool showMask = false); void sharpeningcam(CieImage* ncie, float** buffer, bool showMask = false); void transform(Imagefloat* original, Imagefloat* transformed, int cx, int cy, int sx, int sy, int oW, int oH, int fW, int fH, const FramesMetaData *metadata, int rawRotationDeg, bool fullImage); - float resizeScale(const ProcParams* params, int fw, int fh, int &imw, int &imh); + float resizeScale(const procparams::ProcParams* params, int fw, int fh, int &imw, int &imh); void lab2monitorRgb(LabImage* lab, Image8* image); void resize(Imagefloat* src, Imagefloat* dst, float dScale); void Lanczos(const LabImage* src, LabImage* dst, float scale); diff --git a/rtengine/ipdehaze.cc b/rtengine/ipdehaze.cc index e7bf71ba6..e3c86454f 100644 --- a/rtengine/ipdehaze.cc +++ b/rtengine/ipdehaze.cc @@ -33,6 +33,7 @@ #include #include "guidedfilter.h" +#include "imagefloat.h" #include "improcfun.h" #include "procparams.h" #include "rescale.h" diff --git a/rtengine/iplab2rgb.cc b/rtengine/iplab2rgb.cc index 8854331e4..c5c3f97d1 100644 --- a/rtengine/iplab2rgb.cc +++ b/rtengine/iplab2rgb.cc @@ -17,6 +17,7 @@ * along with RawTherapee. If not, see . */ #include "rtengine.h" +#include "imagefloat.h" #include "labimage.h" #include "improcfun.h" #include diff --git a/rtengine/ipresize.cc b/rtengine/ipresize.cc index 601ec146d..b31fcf864 100644 --- a/rtengine/ipresize.cc +++ b/rtengine/ipresize.cc @@ -20,6 +20,7 @@ #include "improcfun.h" #include "alignedbuffer.h" +#include "imagefloat.h" #include "labimage.h" #include "opthelper.h" #include "rt_math.h" diff --git a/rtengine/ipretinex.cc b/rtengine/ipretinex.cc index de6f4960a..e443b5bca 100644 --- a/rtengine/ipretinex.cc +++ b/rtengine/ipretinex.cc @@ -137,7 +137,7 @@ namespace rtengine extern const Settings* settings; -void RawImageSource::MSR(float** luminance, float** originalLuminance, float **exLuminance, const LUTf& mapcurve, bool mapcontlutili, int width, int height, const RetinexParams &deh, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax) +void RawImageSource::MSR(float** luminance, float** originalLuminance, float **exLuminance, const LUTf& mapcurve, bool mapcontlutili, int width, int height, const procparams::RetinexParams &deh, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax) { BENCHFUN if (!deh.enabled) { diff --git a/rtengine/ipsharpen.cc b/rtengine/ipsharpen.cc index 1b3ab6270..1223ff9ce 100644 --- a/rtengine/ipsharpen.cc +++ b/rtengine/ipsharpen.cc @@ -34,7 +34,7 @@ using namespace std; namespace { -void sharpenHaloCtrl (float** luminance, float** blurmap, float** base, float** blend, int W, int H, const SharpeningParams &sharpenParam) +void sharpenHaloCtrl (float** luminance, float** blurmap, float** base, float** blend, int W, int H, const procparams::SharpeningParams &sharpenParam) { const float scale = (100.f - sharpenParam.halocontrol_amount) * 0.01f; @@ -160,7 +160,7 @@ namespace rtengine extern const Settings* settings; -void ImProcFunctions::deconvsharpening (float** luminance, float** tmp, const float * const * blend, int W, int H, const SharpeningParams &sharpenParam, double Scale) +void ImProcFunctions::deconvsharpening (float** luminance, float** tmp, const float * const * blend, int W, int H, const procparams::SharpeningParams &sharpenParam, double Scale) { if (sharpenParam.deconvamount == 0 && sharpenParam.blurradius < 0.25f) { return; @@ -243,7 +243,7 @@ BENCHFUN delete blurbuffer; } -void ImProcFunctions::sharpening (LabImage* lab, const SharpeningParams &sharpenParam, bool showMask) +void ImProcFunctions::sharpening (LabImage* lab, const procparams::SharpeningParams &sharpenParam, bool showMask) { if ((!sharpenParam.enabled) || sharpenParam.amount < 1 || lab->W < 8 || lab->H < 8) { diff --git a/rtengine/iptransform.cc b/rtengine/iptransform.cc index 69b57d0ba..b6338b8d3 100644 --- a/rtengine/iptransform.cc +++ b/rtengine/iptransform.cc @@ -22,6 +22,7 @@ #include #endif +#include "imagefloat.h" #include "improcfun.h" #include "mytime.h" diff --git a/rtengine/lcp.cc b/rtengine/lcp.cc index b456fc478..ddf3e0643 100644 --- a/rtengine/lcp.cc +++ b/rtengine/lcp.cc @@ -31,6 +31,7 @@ #include "procparams.h" #include "settings.h" +#include "utils.h" namespace rtengine { @@ -984,7 +985,7 @@ rtengine::LCPMapper::LCPMapper( bool useCADistP, int fullWidth, int fullHeight, - const CoarseTransformParams& coarse, + const procparams::CoarseTransformParams& coarse, int rawRotationDeg ) : enableCA(false), diff --git a/rtengine/lcp.h b/rtengine/lcp.h index 30b7e5191..ebfa350ac 100644 --- a/rtengine/lcp.h +++ b/rtengine/lcp.h @@ -29,12 +29,20 @@ #include #include "cache.h" -#include "imagefloat.h" #include "opthelper.h" namespace rtengine { +namespace procparams +{ + +class ProcParams; + +struct CoarseTransformParams; + +} + enum class LCPCorrectionMode { VIGNETTE, DISTORTION, @@ -185,7 +193,7 @@ public: bool useCADistP, int fullWidth, int fullHeight, - const CoarseTransformParams& coarse, + const procparams::CoarseTransformParams& coarse, int rawRotationDeg ); diff --git a/rtengine/pixelshift.cc b/rtengine/pixelshift.cc index 4b93f3f61..abe6a0536 100644 --- a/rtengine/pixelshift.cc +++ b/rtengine/pixelshift.cc @@ -295,7 +295,7 @@ void calcFrameBrightnessFactor(unsigned int frame, uint32_t datalen, LUTu *histo using namespace std; using namespace rtengine; -void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RAWParams &rawParamsIn, unsigned int frame, const std::string &make, const std::string &model, float rawWpCorrection) +void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const procparams::RAWParams &rawParamsIn, unsigned int frame, const std::string &make, const std::string &model, float rawWpCorrection) { BENCHFUN if(numFrames != 4) { // fallback for non pixelshift files @@ -303,15 +303,15 @@ BENCHFUN return; } - RAWParams::BayerSensor bayerParams = rawParamsIn.bayersensor; + procparams::RAWParams::BayerSensor bayerParams = rawParamsIn.bayersensor; bool motionDetection = true; - if(bayerParams.pixelShiftMotionCorrectionMethod == RAWParams::BayerSensor::PSMotionCorrectionMethod::AUTO) { + if(bayerParams.pixelShiftMotionCorrectionMethod == procparams::RAWParams::BayerSensor::PSMotionCorrectionMethod::AUTO) { bool pixelShiftEqualBright = bayerParams.pixelShiftEqualBright; bayerParams.setPixelShiftDefaults(); bayerParams.pixelShiftEqualBright = pixelShiftEqualBright; - } else if(bayerParams.pixelShiftMotionCorrectionMethod == RAWParams::BayerSensor::PSMotionCorrectionMethod::OFF) { + } else if(bayerParams.pixelShiftMotionCorrectionMethod == procparams::RAWParams::BayerSensor::PSMotionCorrectionMethod::OFF) { motionDetection = false; bayerParams.pixelShiftShowMotion = false; } @@ -323,9 +323,9 @@ BENCHFUN if(motionDetection) { if(!showOnlyMask) { if(bayerParams.pixelShiftMedian) { // We need the demosaiced frames for motion correction - if (bayerParams.pixelShiftDemosaicMethod == bayerParams.getPSDemosaicMethodString(RAWParams::BayerSensor::PSDemosaicMethod::LMMSE)) { + if (bayerParams.pixelShiftDemosaicMethod == bayerParams.getPSDemosaicMethodString(procparams::RAWParams::BayerSensor::PSDemosaicMethod::LMMSE)) { lmmse_interpolate_omp(winw, winh, *(rawDataFrames[0]), red, green, blue, bayerParams.lmmse_iterations); - } else if (bayerParams.pixelShiftDemosaicMethod == bayerParams.getPSDemosaicMethodString(RAWParams::BayerSensor::PSDemosaicMethod::AMAZEVNG4)) { + } else if (bayerParams.pixelShiftDemosaicMethod == bayerParams.getPSDemosaicMethodString(procparams::RAWParams::BayerSensor::PSDemosaicMethod::AMAZEVNG4)) { dual_demosaic_RT (true, rawParamsIn, winw, winh, *(rawDataFrames[0]), red, green, blue, bayerParams.dualDemosaicContrast, true); } else { amaze_demosaic_RT(winx, winy, winw, winh, *(rawDataFrames[0]), red, green, blue, options.chunkSizeAMAZE, options.measure); @@ -335,9 +335,9 @@ BENCHFUN multi_array2D blueTmp(winw, winh); for(int i = 0; i < 3; i++) { - if (bayerParams.pixelShiftDemosaicMethod == bayerParams.getPSDemosaicMethodString(RAWParams::BayerSensor::PSDemosaicMethod::LMMSE)) { + if (bayerParams.pixelShiftDemosaicMethod == bayerParams.getPSDemosaicMethodString(procparams::RAWParams::BayerSensor::PSDemosaicMethod::LMMSE)) { lmmse_interpolate_omp(winw, winh, *(rawDataFrames[i + 1]), redTmp[i], greenTmp[i], blueTmp[i], bayerParams.lmmse_iterations); - } else if (bayerParams.pixelShiftDemosaicMethod == bayerParams.getPSDemosaicMethodString(RAWParams::BayerSensor::PSDemosaicMethod::AMAZEVNG4)) { + } else if (bayerParams.pixelShiftDemosaicMethod == bayerParams.getPSDemosaicMethodString(procparams::RAWParams::BayerSensor::PSDemosaicMethod::AMAZEVNG4)) { dual_demosaic_RT (true, rawParamsIn, winw, winh, *(rawDataFrames[i + 1]), redTmp[i], greenTmp[i], blueTmp[i], bayerParams.dualDemosaicContrast, true); } else { amaze_demosaic_RT(winx, winy, winw, winh, *(rawDataFrames[i + 1]), redTmp[i], greenTmp[i], blueTmp[i], options.chunkSizeAMAZE, options.measure); @@ -362,11 +362,11 @@ BENCHFUN } } } else { - if (bayerParams.pixelShiftDemosaicMethod == bayerParams.getPSDemosaicMethodString(RAWParams::BayerSensor::PSDemosaicMethod::LMMSE)) { + if (bayerParams.pixelShiftDemosaicMethod == bayerParams.getPSDemosaicMethodString(procparams::RAWParams::BayerSensor::PSDemosaicMethod::LMMSE)) { lmmse_interpolate_omp(winw, winh, rawData, red, green, blue, bayerParams.lmmse_iterations); - } else if (bayerParams.pixelShiftDemosaicMethod == bayerParams.getPSDemosaicMethodString(RAWParams::BayerSensor::PSDemosaicMethod::AMAZEVNG4)) { - RAWParams rawParamsTmp = rawParamsIn; - rawParamsTmp.bayersensor.method = RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::AMAZEVNG4); + } else if (bayerParams.pixelShiftDemosaicMethod == bayerParams.getPSDemosaicMethodString(procparams::RAWParams::BayerSensor::PSDemosaicMethod::AMAZEVNG4)) { + procparams::RAWParams rawParamsTmp = rawParamsIn; + rawParamsTmp.bayersensor.method = procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::AMAZEVNG4); dual_demosaic_RT (true, rawParamsTmp, winw, winh, rawData, red, green, blue, bayerParams.dualDemosaicContrast, true); } else { amaze_demosaic_RT(winx, winy, winw, winh, rawData, red, green, blue, options.chunkSizeAMAZE, options.measure); diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index ed1e45394..d7e8ac812 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -20,6 +20,7 @@ #include #include "rtengine.h" +#include "imagefloat.h" #include "rawimagesource.h" #include "rawimagesource_i.h" #include "jaggedarray.h" diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index 37d927445..ab8459f20 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -122,7 +122,7 @@ public: int load(const Glib::ustring &fname, bool firstFrameOnly); void preprocess (const procparams::RAWParams &raw, const procparams::LensProfParams &lensProf, const procparams::CoarseTransformParams& coarse, bool prepareDenoise = true) override; void filmNegativeProcess (const procparams::FilmNegativeParams ¶ms) override; - bool getFilmNegativeExponents (Coord2D spotA, Coord2D spotB, int tran, const FilmNegativeParams ¤tParams, std::array& newExps) override; + bool getFilmNegativeExponents (Coord2D spotA, Coord2D spotB, int tran, const procparams::FilmNegativeParams ¤tParams, std::array& newExps) override; void demosaic (const procparams::RAWParams &raw, bool autoContrast, double &contrastThreshold, bool cache = false) override; void retinex (const procparams::ColorManagementParams& cmp, const procparams::RetinexParams &deh, const procparams::ToneCurveParams& Tc, LUTf & cdcurve, LUTf & mapcurve, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, multi_array2D &conversionBuffer, bool dehacontlutili, bool mapcontlutili, bool useHsl, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, LUTu &histLRETI) override; void retinexPrepareCurves (const procparams::RetinexParams &retinexParams, LUTf &cdcurve, LUTf &mapcurve, RetinextransmissionCurve &retinextransmissionCurve, RetinexgaintransmissionCurve &retinexgaintransmissionCurve, bool &retinexcontlutili, bool &mapcontlutili, bool &useHsl, LUTu & lhist16RETI, LUTu & histLRETI) override; @@ -138,10 +138,10 @@ public: return rgbSourceModified; // tracks whether cached rgb output of demosaic has been modified } - void processFlatField(const RAWParams &raw, RawImage *riFlatFile, unsigned short black[4]); - void copyOriginalPixels(const RAWParams &raw, RawImage *ri, RawImage *riDark, RawImage *riFlatFile, array2D &rawData ); + void processFlatField(const procparams::RAWParams &raw, RawImage *riFlatFile, unsigned short black[4]); + void copyOriginalPixels(const procparams::RAWParams &raw, RawImage *ri, RawImage *riDark, RawImage *riFlatFile, array2D &rawData ); void cfaboxblur (RawImage *riFlatFile, float* cfablur, int boxH, int boxW); - void scaleColors (int winx, int winy, int winw, int winh, const RAWParams &raw, array2D &rawData); // raw for cblack + void scaleColors (int winx, int winy, int winw, int winh, const procparams::RAWParams &raw, array2D &rawData); // raw for cblack void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const procparams::ToneCurveParams &hrp, const procparams::RAWParams &raw) override; eSensorType getSensorType () const override @@ -195,13 +195,13 @@ public: void convertColorSpace(Imagefloat* image, const procparams::ColorManagementParams &cmp, const ColorTemp &wb) override; static bool findInputProfile(Glib::ustring inProfile, cmsHPROFILE embedded, std::string camName, DCPProfile **dcpProf, cmsHPROFILE& in); - static void colorSpaceConversion (Imagefloat* im, const ColorManagementParams& cmp, const ColorTemp &wb, double pre_mul[3], cmsHPROFILE embedded, cmsHPROFILE camprofile, double cam[3][3], const std::string &camName) + static void colorSpaceConversion (Imagefloat* im, const procparams::ColorManagementParams& cmp, const ColorTemp &wb, double pre_mul[3], cmsHPROFILE embedded, cmsHPROFILE camprofile, double cam[3][3], const std::string &camName) { colorSpaceConversion_ (im, cmp, wb, pre_mul, embedded, camprofile, cam, camName); } static void inverse33 (const double (*coeff)[3], double (*icoeff)[3]); - void MSR(float** luminance, float **originalLuminance, float **exLuminance, const LUTf& mapcurve, bool mapcontlutili, int width, int height, const RetinexParams &deh, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax); + void MSR(float** luminance, float **originalLuminance, float **exLuminance, const LUTf& mapcurve, bool mapcontlutili, int width, int height, const procparams::RetinexParams &deh, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax); void HLRecovery_inpaint (float** red, float** green, float** blue) override; static void HLRecovery_Luminance (float* rin, float* gin, float* bin, float* rout, float* gout, float* bout, int width, float maxval); static void HLRecovery_CIELab (float* rin, float* gin, float* bin, float* rout, float* gout, float* bout, int width, float maxval, double cam[3][3], double icam[3][3]); @@ -282,7 +282,7 @@ protected: void igv_interpolate(int winw, int winh); void lmmse_interpolate_omp(int winw, int winh, array2D &rawData, array2D &red, array2D &green, array2D &blue, int iterations); void amaze_demosaic_RT(int winx, int winy, int winw, int winh, const array2D &rawData, array2D &red, array2D &green, array2D &blue, size_t chunkSize = 1, bool measure = false);//Emil's code for AMaZE - void dual_demosaic_RT(bool isBayer, const RAWParams &raw, int winw, int winh, const array2D &rawData, array2D &red, array2D &green, array2D &blue, double &contrast, bool autoContrast = false); + void dual_demosaic_RT(bool isBayer, const procparams::RAWParams &raw, int winw, int winh, const array2D &rawData, array2D &red, array2D &green, array2D &blue, double &contrast, bool autoContrast = false); void fast_demosaic();//Emil's code for fast demosaicing void dcb_demosaic(int iterations, bool dcb_enhance); void ahd_demosaic(); @@ -307,7 +307,7 @@ protected: void xtransborder_interpolate (int border, array2D &red, array2D &green, array2D &blue); void xtrans_interpolate (const int passes, const bool useCieLab, size_t chunkSize = 1, bool measure = false); void fast_xtrans_interpolate (const array2D &rawData, array2D &red, array2D &green, array2D &blue); - void pixelshift(int winx, int winy, int winw, int winh, const RAWParams &rawParams, unsigned int frame, const std::string &make, const std::string &model, float rawWpCorrection); + void pixelshift(int winx, int winy, int winw, int winh, const procparams::RAWParams &rawParams, unsigned int frame, const std::string &make, const std::string &model, float rawWpCorrection); void hflip (Imagefloat* im); void vflip (Imagefloat* im); void getRawValues(int x, int y, int rotate, int &R, int &G, int &B) override; diff --git a/rtengine/rtlensfun.cc b/rtengine/rtlensfun.cc index 8c634eaa8..1fcb5ec26 100644 --- a/rtengine/rtlensfun.cc +++ b/rtengine/rtlensfun.cc @@ -19,6 +19,7 @@ */ #include "rtlensfun.h" +#include "imagedata.h" #include "procparams.h" #include "settings.h" #include @@ -500,7 +501,7 @@ std::unique_ptr LFDatabase::getModifier(const LFCamera &camera, cons } -std::unique_ptr LFDatabase::findModifier(const LensProfParams &lensProf, const FramesMetaData *idata, int width, int height, const CoarseTransformParams &coarse, int rawRotationDeg) +std::unique_ptr LFDatabase::findModifier(const procparams::LensProfParams &lensProf, const FramesMetaData *idata, int width, int height, const procparams::CoarseTransformParams &coarse, int rawRotationDeg) { Glib::ustring make, model, lens; float focallen = idata->getFocalLen(); diff --git a/rtengine/rtlensfun.h b/rtengine/rtlensfun.h index 092e2bf01..2a7571b58 100644 --- a/rtengine/rtlensfun.h +++ b/rtengine/rtlensfun.h @@ -32,11 +32,13 @@ namespace rtengine { +class FramesMetaData; + namespace procparams { +struct CoarseTransformParams; struct LensProfParams; - } class LFModifier final : @@ -119,7 +121,7 @@ public: LFCamera findCamera(const Glib::ustring &make, const Glib::ustring &model) const; LFLens findLens(const LFCamera &camera, const Glib::ustring &name) const; - static std::unique_ptr findModifier(const procparams::LensProfParams &lensProf, const FramesMetaData *idata, int width, int height, const CoarseTransformParams &coarse, int rawRotationDeg); + static std::unique_ptr findModifier(const procparams::LensProfParams &lensProf, const FramesMetaData *idata, int width, int height, const procparams::CoarseTransformParams &coarse, int rawRotationDeg); private: std::unique_ptr getModifier(const LFCamera &camera, const LFLens &lens, diff --git a/rtengine/shmap.cc b/rtengine/shmap.cc index 368442f2b..f654ab51d 100644 --- a/rtengine/shmap.cc +++ b/rtengine/shmap.cc @@ -18,6 +18,7 @@ */ #include "shmap.h" #include "gauss.h" +#include "imagefloat.h" #include "rtengine.h" #include "rt_math.h" #include "rawimagesource.h" diff --git a/rtengine/shmap.h b/rtengine/shmap.h index 539ef99ff..f07759a2c 100644 --- a/rtengine/shmap.h +++ b/rtengine/shmap.h @@ -19,12 +19,12 @@ #ifndef __SHMAP__ #define __SHMAP__ -#include "imagefloat.h" -#include "image16.h" +#include "LUT.h" #include "noncopyable.h" namespace rtengine { +class Imagefloat; class SHMap : public NonCopyable diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 2eb640fca..71edba62c 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -17,6 +17,7 @@ * along with RawTherapee. If not, see . */ #include "cieimage.h" +#include "imagefloat.h" #include "labimage.h" #include "rtengine.h" #include "colortemp.h" diff --git a/rtengine/stdimagesource.cc b/rtengine/stdimagesource.cc index 2ec1529f7..eddd12ae4 100644 --- a/rtengine/stdimagesource.cc +++ b/rtengine/stdimagesource.cc @@ -21,6 +21,7 @@ #include "color.h" #include "curves.h" #include "iccstore.h" +#include "imagefloat.h" #include "imageio.h" #include "mytime.h" #include "procparams.h" diff --git a/rtengine/stdimagesource.h b/rtengine/stdimagesource.h index 0dffe2fd0..2db2fdf57 100644 --- a/rtengine/stdimagesource.h +++ b/rtengine/stdimagesource.h @@ -23,6 +23,16 @@ namespace rtengine { +namespace procparams +{ + +class ProcParams; + +struct ToneCurveParams; +struct RAWParams; +struct ColorManagementParams; + +} class StdImageSource : public ImageSource { @@ -43,7 +53,7 @@ public: ~StdImageSource () override; int load (const Glib::ustring &fname) override; - void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hrp, const RAWParams &raw) override; + void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const procparams::ToneCurveParams &hrp, const procparams::RAWParams &raw) override; ColorTemp getWB () const override { return wb; @@ -87,8 +97,8 @@ public: plistener = pl; } - void convertColorSpace(Imagefloat* image, const ColorManagementParams &cmp, const ColorTemp &wb) override;// RAWParams raw will not be used for non-raw files (see imagesource.h) - static void colorSpaceConversion (Imagefloat* im, const ColorManagementParams &cmp, cmsHPROFILE embedded, IIOSampleFormat sampleFormat); + void convertColorSpace(Imagefloat* image, const procparams::ColorManagementParams &cmp, const ColorTemp &wb) override;// RAWParams raw will not be used for non-raw files (see imagesource.h) + static void colorSpaceConversion (Imagefloat* im, const procparams::ColorManagementParams &cmp, cmsHPROFILE embedded, IIOSampleFormat sampleFormat); bool isRGBSourceModified() const override { diff --git a/rtengine/tmo_fattal02.cc b/rtengine/tmo_fattal02.cc index 6b5460ffd..f1822b486 100644 --- a/rtengine/tmo_fattal02.cc +++ b/rtengine/tmo_fattal02.cc @@ -66,6 +66,7 @@ #include #include "array2D.h" +#include "imagefloat.h" #include "improcfun.h" #include "settings.h" #include "iccstore.h" From 54b6b53e128c636b4711801967cc951ff60522b9 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 28 Oct 2019 21:03:45 +0100 Subject: [PATCH 096/208] Reduce image16.h dependencies --- rtengine/dcrop.h | 1 - rtengine/image16.cc | 5 +++-- rtengine/image16.h | 5 +---- rtengine/imagesource.h | 1 - rtengine/improccoordinator.h | 1 - rtengine/improcfun.h | 1 - rtengine/stdimagesource.cc | 1 + 7 files changed, 5 insertions(+), 10 deletions(-) diff --git a/rtengine/dcrop.h b/rtengine/dcrop.h index 6ce034f3f..ff046dd68 100644 --- a/rtengine/dcrop.h +++ b/rtengine/dcrop.h @@ -22,7 +22,6 @@ #include "rtengine.h" #include "improcfun.h" #include "image8.h" -#include "image16.h" #include "imagesource.h" #include "procevents.h" #include "pipettebuffer.h" diff --git a/rtengine/image16.cc b/rtengine/image16.cc index 0cdcc578f..14ba4964d 100644 --- a/rtengine/image16.cc +++ b/rtengine/image16.cc @@ -16,11 +16,12 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ +#include + #include "image16.h" #include "imagefloat.h" #include "image8.h" -#include -#include "rtengine.h" +#include "rt_math.h" namespace { diff --git a/rtengine/image16.h b/rtengine/image16.h index c16b7dd0d..d0053cbfc 100644 --- a/rtengine/image16.h +++ b/rtengine/image16.h @@ -19,11 +19,9 @@ // // A class representing a 16 bit rgb image with separate planes and 16 byte aligned data // -#ifndef _IMAGE16_ -#define _IMAGE16_ +#pragma once #include "imageio.h" -#include "rtengine.h" namespace rtengine { @@ -109,4 +107,3 @@ public: }; } -#endif diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index 065a2e582..614e7c23c 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -26,7 +26,6 @@ #include "colortemp.h" #include "coord2d.h" #include "dcp.h" -#include "image16.h" #include "image8.h" #include "imagedata.h" #include "LUT.h" diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index 379a3fb20..2969184bc 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -24,7 +24,6 @@ #include "rtengine.h" #include "improcfun.h" #include "image8.h" -#include "image16.h" #include "imagesource.h" #include "procevents.h" #include "dcrop.h" diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 80e750a26..189722846 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -19,7 +19,6 @@ #ifndef _IMPROCFUN_H_ #define _IMPROCFUN_H_ -#include "image16.h" #include "image8.h" #include "shmap.h" #include "coord2d.h" diff --git a/rtengine/stdimagesource.cc b/rtengine/stdimagesource.cc index eddd12ae4..c0befef7f 100644 --- a/rtengine/stdimagesource.cc +++ b/rtengine/stdimagesource.cc @@ -21,6 +21,7 @@ #include "color.h" #include "curves.h" #include "iccstore.h" +#include "image16.h" #include "imagefloat.h" #include "imageio.h" #include "mytime.h" From e92a99350b83ab4ff129b57bcde32ed886dad75c Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 29 Oct 2019 11:44:00 +0100 Subject: [PATCH 097/208] Forward declare Image8 --- rtengine/dcrop.cc | 1 + rtengine/dcrop.h | 3 ++- rtengine/demosaic_algos.cc | 1 - rtengine/gamutwarning.cc | 4 +++- rtengine/gamutwarning.h | 3 ++- rtengine/image8.h | 5 +---- rtengine/imagesource.h | 1 - rtengine/improccoordinator.cc | 1 + rtengine/improccoordinator.h | 3 ++- rtengine/improcfun.h | 2 +- rtengine/iplab2rgb.cc | 1 + rtengine/stdimagesource.cc | 1 + rtengine/stdimagesource.h | 3 +++ 13 files changed, 18 insertions(+), 11 deletions(-) diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index bc09f5348..85074fd96 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -19,6 +19,7 @@ */ #include "cieimage.h" +#include "image8.h" #include "imagefloat.h" #include "labimage.h" #include "curves.h" diff --git a/rtengine/dcrop.h b/rtengine/dcrop.h index ff046dd68..c65c1e72f 100644 --- a/rtengine/dcrop.h +++ b/rtengine/dcrop.h @@ -21,7 +21,6 @@ #include "improccoordinator.h" #include "rtengine.h" #include "improcfun.h" -#include "image8.h" #include "imagesource.h" #include "procevents.h" #include "pipettebuffer.h" @@ -30,6 +29,8 @@ namespace rtengine { +class Image8; + using namespace procparams; class ImProcCoordinator; diff --git a/rtengine/demosaic_algos.cc b/rtengine/demosaic_algos.cc index 51db8bb3f..52e15be54 100644 --- a/rtengine/demosaic_algos.cc +++ b/rtengine/demosaic_algos.cc @@ -22,7 +22,6 @@ #include "rawimagesource.h" #include "rawimage.h" #include "mytime.h" -#include "image8.h" #include "rt_math.h" #include "color.h" #include "../rtgui/multilangmgr.h" diff --git a/rtengine/gamutwarning.cc b/rtengine/gamutwarning.cc index 3fc20d43a..fe6b7c0dc 100644 --- a/rtengine/gamutwarning.cc +++ b/rtengine/gamutwarning.cc @@ -23,9 +23,11 @@ * also distributed under the GPL V3+ */ -#include "gamutwarning.h" #include +#include "gamutwarning.h" +#include "image8.h" + namespace rtengine { GamutWarning::GamutWarning(cmsHPROFILE iprof, cmsHPROFILE gamutprof, RenderingIntent intent, bool gamutbpc): diff --git a/rtengine/gamutwarning.h b/rtengine/gamutwarning.h index e0aaa98d9..b7ac5e41d 100644 --- a/rtengine/gamutwarning.h +++ b/rtengine/gamutwarning.h @@ -27,10 +27,11 @@ #include "iccstore.h" #include "noncopyable.h" -#include "image8.h" namespace rtengine { +class Image8; + enum RenderingIntent : int; class GamutWarning: public NonCopyable { diff --git a/rtengine/image8.h b/rtengine/image8.h index 2fa2528ed..f125dccf8 100644 --- a/rtengine/image8.h +++ b/rtengine/image8.h @@ -19,11 +19,9 @@ // // A class representing a 8 bit rgb image without alpha channel // -#ifndef _IMAGE8_ -#define _IMAGE8_ +#pragma once #include "imageio.h" -#include "rtengine.h" namespace rtengine { @@ -104,4 +102,3 @@ public: }; } -#endif diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index 614e7c23c..428027bc0 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -26,7 +26,6 @@ #include "colortemp.h" #include "coord2d.h" #include "dcp.h" -#include "image8.h" #include "imagedata.h" #include "LUT.h" #include "rtengine.h" diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index d75f515bf..0ab015fd3 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -18,6 +18,7 @@ */ #include "improccoordinator.h" #include "cieimage.h" +#include "image8.h" #include "imagefloat.h" #include "labimage.h" #include "curves.h" diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index 2969184bc..e7199565b 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -23,7 +23,6 @@ #include "rtengine.h" #include "improcfun.h" -#include "image8.h" #include "imagesource.h" #include "procevents.h" #include "dcrop.h" @@ -33,6 +32,8 @@ namespace rtengine { +class Image8; + using namespace procparams; class Crop; diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 189722846..b3ba2ccb8 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -19,7 +19,6 @@ #ifndef _IMPROCFUN_H_ #define _IMPROCFUN_H_ -#include "image8.h" #include "shmap.h" #include "coord2d.h" #include "color.h" @@ -33,6 +32,7 @@ namespace rtengine { class CieImage; +class Image8; class Imagefloat; class LabImage; class wavelet_decomposition; diff --git a/rtengine/iplab2rgb.cc b/rtengine/iplab2rgb.cc index c5c3f97d1..451a68a3f 100644 --- a/rtengine/iplab2rgb.cc +++ b/rtengine/iplab2rgb.cc @@ -17,6 +17,7 @@ * along with RawTherapee. If not, see . */ #include "rtengine.h" +#include "image8.h" #include "imagefloat.h" #include "labimage.h" #include "improcfun.h" diff --git a/rtengine/stdimagesource.cc b/rtengine/stdimagesource.cc index c0befef7f..43628e074 100644 --- a/rtengine/stdimagesource.cc +++ b/rtengine/stdimagesource.cc @@ -21,6 +21,7 @@ #include "color.h" #include "curves.h" #include "iccstore.h" +#include "image8.h" #include "image16.h" #include "imagefloat.h" #include "imageio.h" diff --git a/rtengine/stdimagesource.h b/rtengine/stdimagesource.h index 2db2fdf57..632b84ccb 100644 --- a/rtengine/stdimagesource.h +++ b/rtengine/stdimagesource.h @@ -23,6 +23,9 @@ namespace rtengine { + +class ImageIO; + namespace procparams { From 3aa84c48da4d46509ac7c798a8f16c9d021a3cc9 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 29 Oct 2019 12:33:14 +0100 Subject: [PATCH 098/208] Forward declare ColorTemp --- rtengine/ahd_demosaic_RT.cc | 1 + rtengine/clutstore.cc | 1 + rtengine/colortemp.h | 4 +--- rtengine/dcp.h | 2 +- rtengine/dcrop.cc | 1 + rtengine/image16.cc | 1 + rtengine/image8.cc | 2 ++ rtengine/imagefloat.cc | 2 ++ rtengine/imageio.h | 2 +- rtengine/imagesource.h | 2 +- rtengine/improccoordinator.cc | 1 + rtengine/improccoordinator.h | 1 + rtengine/rawimagesource.h | 1 + rtengine/stdimagesource.h | 1 + rtgui/thumbnail.cc | 1 + 15 files changed, 17 insertions(+), 6 deletions(-) diff --git a/rtengine/ahd_demosaic_RT.cc b/rtengine/ahd_demosaic_RT.cc index b3a34295c..77e342c18 100644 --- a/rtengine/ahd_demosaic_RT.cc +++ b/rtengine/ahd_demosaic_RT.cc @@ -24,6 +24,7 @@ // #include +#include "colortemp.h" #include "rtengine.h" #include "rawimagesource.h" #include "rt_math.h" diff --git a/rtengine/clutstore.cc b/rtengine/clutstore.cc index 10b7a2c38..cd97ed9e9 100644 --- a/rtengine/clutstore.cc +++ b/rtengine/clutstore.cc @@ -2,6 +2,7 @@ #include "clutstore.h" +#include "colortemp.h" #include "iccstore.h" #include "imagefloat.h" #include "opthelper.h" diff --git a/rtengine/colortemp.h b/rtengine/colortemp.h index da83177be..a38e01072 100644 --- a/rtengine/colortemp.h +++ b/rtengine/colortemp.h @@ -16,8 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _COLORTEMP_ -#define _COLORTEMP_ +#pragma once #include #include @@ -207,4 +206,3 @@ public: }; } -#endif diff --git a/rtengine/dcp.h b/rtengine/dcp.h index ba8be93eb..062459e42 100644 --- a/rtengine/dcp.h +++ b/rtengine/dcp.h @@ -29,12 +29,12 @@ #include "../rtgui/threadutils.h" #include "curves.h" -#include "colortemp.h" #include "noncopyable.h" namespace rtengine { +class ColorTemp; class Imagefloat; class DCPProfile final diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 85074fd96..6d45d232b 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -18,6 +18,7 @@ * along with RawTherapee. If not, see . */ +#include "colortemp.h" #include "cieimage.h" #include "image8.h" #include "imagefloat.h" diff --git a/rtengine/image16.cc b/rtengine/image16.cc index 14ba4964d..a98d64d51 100644 --- a/rtengine/image16.cc +++ b/rtengine/image16.cc @@ -18,6 +18,7 @@ */ #include +#include "colortemp.h" #include "image16.h" #include "imagefloat.h" #include "image8.h" diff --git a/rtengine/image8.cc b/rtengine/image8.cc index fb71e94a4..3d0a8df06 100644 --- a/rtengine/image8.cc +++ b/rtengine/image8.cc @@ -18,6 +18,8 @@ */ #include #include + +#include "colortemp.h" #include "image8.h" #include "imagefloat.h" #include "rtengine.h" diff --git a/rtengine/imagefloat.cc b/rtengine/imagefloat.cc index 0b67e0785..3e80b617b 100644 --- a/rtengine/imagefloat.cc +++ b/rtengine/imagefloat.cc @@ -17,6 +17,8 @@ * along with RawTherapee. If not, see . */ #include + +#include "colortemp.h" #include "imagefloat.h" #include "image16.h" #include "image8.h" diff --git a/rtengine/imageio.h b/rtengine/imageio.h index 89c482ca3..baf456037 100644 --- a/rtengine/imageio.h +++ b/rtengine/imageio.h @@ -37,11 +37,11 @@ #include "../rtexif/rtexif.h" #include "imagedimensions.h" #include "iimage.h" -#include "colortemp.h" namespace rtengine { +class ColorTemp; class ProgressListener; class Imagefloat; diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index 428027bc0..0f7a2ff51 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -23,7 +23,6 @@ #include -#include "colortemp.h" #include "coord2d.h" #include "dcp.h" #include "imagedata.h" @@ -32,6 +31,7 @@ namespace rtengine { +class ColorTemp; class Imagefloat; namespace procparams diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 0ab015fd3..b0996c6dd 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -17,6 +17,7 @@ * along with RawTherapee. If not, see . */ #include "improccoordinator.h" + #include "cieimage.h" #include "image8.h" #include "imagefloat.h" diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index e7199565b..14e93b771 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -21,6 +21,7 @@ #include +#include "colortemp.h" #include "rtengine.h" #include "improcfun.h" #include "imagesource.h" diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index ab8459f20..6c8dff696 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -24,6 +24,7 @@ #include "array2D.h" #include "color.h" +#include "colortemp.h" #include "curves.h" #include "dcp.h" #include "iimage.h" diff --git a/rtengine/stdimagesource.h b/rtengine/stdimagesource.h index 632b84ccb..b70c6554b 100644 --- a/rtengine/stdimagesource.h +++ b/rtengine/stdimagesource.h @@ -19,6 +19,7 @@ #ifndef _STDIMAGESOURCE_ #define _STDIMAGESOURCE_ +#include "colortemp.h" #include "imagesource.h" namespace rtengine diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc index 7ec1fef4e..78928fdf4 100644 --- a/rtgui/thumbnail.cc +++ b/rtgui/thumbnail.cc @@ -24,6 +24,7 @@ #include #include #include +#include "../rtengine/colortemp.h" #include "../rtengine/imagedata.h" #include "../rtengine/procparams.h" #include From c11087c28d6df55330ad4b57880a8ccd5111eb75 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 29 Oct 2019 14:15:45 +0100 Subject: [PATCH 099/208] Cleanup curves.h includes --- rtengine/capturesharpening.cc | 5 ++--- rtengine/curves.h | 5 +---- rtengine/dcp.cc | 1 - rtengine/imagesource.h | 2 ++ rtengine/improcfun.cc | 1 + rtengine/improcfun.h | 10 +++++++++- rtengine/iplab2rgb.cc | 1 - rtengine/rawimagesource.h | 6 ++++-- rtengine/stdimagesource.cc | 1 - rtgui/navigator.cc | 1 - 10 files changed, 19 insertions(+), 14 deletions(-) diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index a080b4f36..63c42026e 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -22,7 +22,6 @@ #include "rtengine.h" #include "rawimagesource.h" #include "rt_math.h" -#include "improcfun.h" #include "procparams.h" #include "color.h" #include "gauss.h" @@ -605,13 +604,13 @@ BENCHFUN // special handling for small tiles at end of row or column for (int k = border, ii = endOfCol ? H - fullTileSize - border : i - border; k < fullTileSize - border; ++k) { for (int l = border, jj = endOfRow ? W - fullTileSize - border : j - border; l < fullTileSize - border; ++l) { - luminance[ii + k][jj + l] = rtengine::intp(blend[ii + k][jj + l], max(tmpIThr[k][l], 0.0f), luminance[ii + k][jj + l]); + luminance[ii + k][jj + l] = rtengine::intp(blend[ii + k][jj + l], std::max(tmpIThr[k][l], 0.0f), luminance[ii + k][jj + l]); } } } else { for (int ii = border; ii < fullTileSize - border; ++ii) { for (int jj = border; jj < fullTileSize - border; ++jj) { - luminance[i + ii - border][j + jj - border] = rtengine::intp(blend[i + ii - border][j + jj - border], max(tmpIThr[ii][jj], 0.0f), luminance[i + ii - border][j + jj - border]); + luminance[i + ii - border][j + jj - border] = rtengine::intp(blend[i + ii - border][j + jj - border], std::max(tmpIThr[ii][jj], 0.0f), luminance[i + ii - border][j + jj - border]); } } } diff --git a/rtengine/curves.h b/rtengine/curves.h index 25272d44c..b4c1b54d4 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -16,8 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef __CURVES_H__ -#define __CURVES_H__ +#pragma once #include #include @@ -1311,5 +1310,3 @@ inline void SatAndValueBlendingToneCurve::Apply (float& ir, float& ig, float& ib } #undef CLIPI - -#endif diff --git a/rtengine/dcp.cc b/rtengine/dcp.cc index 6376968e6..9fac31c99 100644 --- a/rtengine/dcp.cc +++ b/rtengine/dcp.cc @@ -28,7 +28,6 @@ #include "iccmatrices.h" #include "iccstore.h" #include "imagefloat.h" -#include "improcfun.h" #include "rawimagesource.h" #include "rt_math.h" diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index 0f7a2ff51..8597a8dc3 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -33,6 +33,8 @@ namespace rtengine { class ColorTemp; class Imagefloat; +class RetinextransmissionCurve; +class RetinexgaintransmissionCurve; namespace procparams { diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index e446f21a0..523683002 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -29,6 +29,7 @@ #include "rtengine.h" #include "improcfun.h" #include "curves.h" +#include "dcp.h" #include "mytime.h" #include "iccstore.h" #include "imagesource.h" diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index b3ba2ccb8..16b8e27b0 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -25,12 +25,20 @@ #include "LUT.h" #include "lcp.h" #include "dcp.h" -#include "curves.h" #include "pipettebuffer.h" #include "gamutwarning.h" namespace rtengine { +class ColorGradientCurve; +class OpacityCurve; +class ToneCurve; +class WavCurve; +class WavOpacityCurveRG; +class WavOpacityCurveBY; +class WavOpacityCurveW; +class WavOpacityCurveWL; + class CieImage; class Image8; class Imagefloat; diff --git a/rtengine/iplab2rgb.cc b/rtengine/iplab2rgb.cc index 451a68a3f..4298e41c9 100644 --- a/rtengine/iplab2rgb.cc +++ b/rtengine/iplab2rgb.cc @@ -26,7 +26,6 @@ #include "iccmatrices.h" #include "../rtgui/options.h" #include "settings.h" -#include "curves.h" #include "alignedbuffer.h" #include "color.h" #include "procparams.h" diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index 6c8dff696..771398fa0 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -25,8 +25,6 @@ #include "array2D.h" #include "color.h" #include "colortemp.h" -#include "curves.h" -#include "dcp.h" #include "iimage.h" #include "imagesource.h" #include "pixelsmap.h" @@ -36,6 +34,10 @@ namespace rtengine { +class DiagonalCurve; +class RetinextransmissionCurve; +class RetinexgaintransmissionCurve; + class RawImageSource : public ImageSource { private: diff --git a/rtengine/stdimagesource.cc b/rtengine/stdimagesource.cc index 43628e074..8e4c05ac8 100644 --- a/rtengine/stdimagesource.cc +++ b/rtengine/stdimagesource.cc @@ -19,7 +19,6 @@ #include "stdimagesource.h" #include "color.h" -#include "curves.h" #include "iccstore.h" #include "image8.h" #include "image16.h" diff --git a/rtgui/navigator.cc b/rtgui/navigator.cc index de07ffcd7..2cad9fdc1 100644 --- a/rtgui/navigator.cc +++ b/rtgui/navigator.cc @@ -21,7 +21,6 @@ #include "toolpanel.h" #include "../rtengine/iccmatrices.h" #include "../rtengine/iccstore.h" -#include "../rtengine/curves.h" #include "../rtengine/color.h" #include "../rtengine/rt_math.h" #include "options.h" From ed161c6288c2bd80443e7f5c16e6bb13a344a9f5 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 29 Oct 2019 15:21:02 +0100 Subject: [PATCH 100/208] Reduce rawimage.h dependencies --- rtengine/badpixels.cc | 1 + rtengine/capturesharpening.cc | 1 + rtengine/dcp.cc | 1 + rtengine/dfmanager.h | 1 + rtengine/eahd_demosaic.cc | 1 + rtengine/ffmanager.cc | 7 +++++++ rtengine/ffmanager.h | 11 +++-------- rtengine/filmnegativeproc.cc | 1 + rtengine/hphd_demosaic_RT.cc | 1 + rtengine/imagedata.h | 1 - rtengine/pdaflinesfilter.cc | 1 + rtengine/pdaflinesfilter.h | 2 ++ rtengine/rawimage.h | 5 +---- rtengine/rawimagesource.cc | 21 +++++++++++++++++++++ rtengine/rawimagesource.h | 24 ++++++------------------ rtengine/vng4_demosaic_RT.cc | 1 + rtengine/xtrans_demosaic.cc | 1 + rtgui/bayerpreprocess.h | 1 - rtgui/preprocess.h | 1 - rtgui/rawexposure.h | 1 - rtgui/xtransrawexposure.h | 1 - 21 files changed, 50 insertions(+), 35 deletions(-) diff --git a/rtengine/badpixels.cc b/rtengine/badpixels.cc index 79b8187f7..5f519f7c2 100644 --- a/rtengine/badpixels.cc +++ b/rtengine/badpixels.cc @@ -20,6 +20,7 @@ #include "array2D.h" #include "median.h" #include "pixelsmap.h" +#include "rawimage.h" #include "rawimagesource.h" namespace rtengine diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index 63c42026e..4eeca1f15 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -20,6 +20,7 @@ #include #include "rtengine.h" +#include "rawimage.h" #include "rawimagesource.h" #include "rt_math.h" #include "procparams.h" diff --git a/rtengine/dcp.cc b/rtengine/dcp.cc index 9fac31c99..78655dcf6 100644 --- a/rtengine/dcp.cc +++ b/rtengine/dcp.cc @@ -21,6 +21,7 @@ #include #include #include +#include #include "dcp.h" diff --git a/rtengine/dfmanager.h b/rtengine/dfmanager.h index 23ca97d14..e1fa38f77 100644 --- a/rtengine/dfmanager.h +++ b/rtengine/dfmanager.h @@ -30,6 +30,7 @@ namespace rtengine { +class RawImage; class dfInfo { public: diff --git a/rtengine/eahd_demosaic.cc b/rtengine/eahd_demosaic.cc index aa8fdf485..b87c0771d 100644 --- a/rtengine/eahd_demosaic.cc +++ b/rtengine/eahd_demosaic.cc @@ -20,6 +20,7 @@ #include #include "color.h" +#include "rawimage.h" #include "rawimagesource.h" #include "rawimagesource_i.h" #include "jaggedarray.h" diff --git a/rtengine/ffmanager.cc b/rtengine/ffmanager.cc index e1a9134a8..2dbc95055 100644 --- a/rtengine/ffmanager.cc +++ b/rtengine/ffmanager.cc @@ -50,6 +50,13 @@ inline ffInfo& ffInfo::operator =(const ffInfo &o) return *this; } +ffInfo::~ffInfo() +{ + if( ri ) { + delete ri; + } +} + bool ffInfo::operator <(const ffInfo &e2) const { if( this->maker.compare( e2.maker) >= 0 ) { diff --git a/rtengine/ffmanager.h b/rtengine/ffmanager.h index 537f8ee46..80ef5fa1c 100644 --- a/rtengine/ffmanager.h +++ b/rtengine/ffmanager.h @@ -19,16 +19,16 @@ #pragma once #include +#include #include #include #include -#include "rawimage.h" - namespace rtengine { +class RawImage; class ffInfo { public: @@ -48,13 +48,8 @@ public: ffInfo( const ffInfo &o) : pathname(o.pathname), maker(o.maker), model(o.model), lens(o.lens), aperture(o.aperture), focallength(o.focallength), timestamp(o.timestamp), ri(nullptr) {} - ~ffInfo() - { - if( ri ) { - delete ri; - } - } + ~ffInfo(); ffInfo &operator =(const ffInfo &o); bool operator <(const ffInfo &e2) const; diff --git a/rtengine/filmnegativeproc.cc b/rtengine/filmnegativeproc.cc index 81de775a3..1eae22ad6 100644 --- a/rtengine/filmnegativeproc.cc +++ b/rtengine/filmnegativeproc.cc @@ -23,6 +23,7 @@ #include #endif +#include "rawimage.h" #include "rawimagesource.h" #include "mytime.h" diff --git a/rtengine/hphd_demosaic_RT.cc b/rtengine/hphd_demosaic_RT.cc index 0e56eae48..342cd2b6b 100644 --- a/rtengine/hphd_demosaic_RT.cc +++ b/rtengine/hphd_demosaic_RT.cc @@ -18,6 +18,7 @@ */ #include +#include "rawimage.h" #include "rawimagesource.h" #include "rawimagesource_i.h" #include "jaggedarray.h" diff --git a/rtengine/imagedata.h b/rtengine/imagedata.h index 99caaf361..06c7f4edf 100644 --- a/rtengine/imagedata.h +++ b/rtengine/imagedata.h @@ -21,7 +21,6 @@ #include #include -#include "rawimage.h" #include #include #include "../rtexif/rtexif.h" diff --git a/rtengine/pdaflinesfilter.cc b/rtengine/pdaflinesfilter.cc index d0694fd11..350c6f758 100644 --- a/rtengine/pdaflinesfilter.cc +++ b/rtengine/pdaflinesfilter.cc @@ -19,6 +19,7 @@ */ #include "pdaflinesfilter.h" +#include "rawimage.h" #include "settings.h" #include #include "camconst.h" diff --git a/rtengine/pdaflinesfilter.h b/rtengine/pdaflinesfilter.h index 7f4c7985b..e2904716e 100644 --- a/rtengine/pdaflinesfilter.h +++ b/rtengine/pdaflinesfilter.h @@ -26,6 +26,8 @@ namespace rtengine { +class RawImage; + class PDAFLinesFilter: public rtengine::NonCopyable { public: diff --git a/rtengine/rawimage.h b/rtengine/rawimage.h index 9c6d42969..4537fdcab 100644 --- a/rtengine/rawimage.h +++ b/rtengine/rawimage.h @@ -16,8 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef __RAWIMAGE_H -#define __RAWIMAGE_H +#pragma once #include #include @@ -307,5 +306,3 @@ public: }; } - -#endif // __RAWIMAGE_H diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index d7e8ac812..ca324a5c1 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -21,6 +21,7 @@ #include "rtengine.h" #include "imagefloat.h" +#include "rawimage.h" #include "rawimagesource.h" #include "rawimagesource_i.h" #include "jaggedarray.h" @@ -501,6 +502,26 @@ RawImageSource::~RawImageSource () } } +unsigned RawImageSource::FC(int row, int col) const +{ + return ri->FC(row, col); +} + +eSensorType RawImageSource::getSensorType () const +{ + return ri != nullptr ? ri->getSensorType() : ST_NONE; +} + +bool RawImageSource::isMono() const +{ + return ri->get_colors() == 1; +} + +int RawImageSource::getRotateDegree() const +{ + return ri->get_rotateDegree(); +} + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% void RawImageSource::transformRect (const PreviewProps &pp, int tran, int &ssx1, int &ssy1, int &width, int &height, int &fw) diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index 771398fa0..118dcb559 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -33,7 +33,7 @@ namespace rtengine { - +class RawImage; class DiagonalCurve; class RetinextransmissionCurve; class RetinexgaintransmissionCurve; @@ -110,10 +110,7 @@ protected: void transformRect (const PreviewProps &pp, int tran, int &sx1, int &sy1, int &width, int &height, int &fw); void transformPosition (int x, int y, int tran, int& tx, int& ty); - unsigned FC(int row, int col) const - { - return ri->FC(row, col); - } + unsigned FC(int row, int col) const; inline void getRowStartEnd (int x, int &start, int &end); static void getProfilePreprocParams(cmsHPROFILE in, float& gammafac, float& lineFac, float& lineSum); @@ -147,15 +144,9 @@ public: void scaleColors (int winx, int winy, int winw, int winh, const procparams::RAWParams &raw, array2D &rawData); // raw for cblack void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const procparams::ToneCurveParams &hrp, const procparams::RAWParams &raw) override; - eSensorType getSensorType () const override - { - return ri != nullptr ? ri->getSensorType() : ST_NONE; - } - bool isMono () const override - { - return ri->get_colors() == 1; - } - ColorTemp getWB () const override + eSensorType getSensorType () const override; + bool isMono () const override; + ColorTemp getWB () const override { return camera_wb; } @@ -173,10 +164,7 @@ public: void getFullSize (int& w, int& h, int tr = TR_NONE) override; void getSize (const PreviewProps &pp, int& w, int& h) override; - int getRotateDegree() const override - { - return ri->get_rotateDegree(); - } + int getRotateDegree() const override; ImageMatrices* getImageMatrices () override { diff --git a/rtengine/vng4_demosaic_RT.cc b/rtengine/vng4_demosaic_RT.cc index 66413e4c7..384ec3219 100644 --- a/rtengine/vng4_demosaic_RT.cc +++ b/rtengine/vng4_demosaic_RT.cc @@ -21,6 +21,7 @@ //////////////////////////////////////////////////////////////// #include "rtengine.h" +#include "rawimage.h" #include "rawimagesource.h" #include "procparams.h" #include "../rtgui/multilangmgr.h" diff --git a/rtengine/xtrans_demosaic.cc b/rtengine/xtrans_demosaic.cc index 9a3b341cc..418d369b8 100644 --- a/rtengine/xtrans_demosaic.cc +++ b/rtengine/xtrans_demosaic.cc @@ -20,6 +20,7 @@ //////////////////////////////////////////////////////////////// #include "rtengine.h" +#include "rawimage.h" #include "rawimagesource.h" #include "rt_algo.h" #include "rt_math.h" diff --git a/rtgui/bayerpreprocess.h b/rtgui/bayerpreprocess.h index 5d2b101d9..9114c37d4 100644 --- a/rtgui/bayerpreprocess.h +++ b/rtgui/bayerpreprocess.h @@ -22,7 +22,6 @@ #include #include "adjuster.h" #include "toolpanel.h" -#include "../rtengine/rawimage.h" class BayerPreProcess : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel { diff --git a/rtgui/preprocess.h b/rtgui/preprocess.h index 015fa3650..cf4cc8857 100644 --- a/rtgui/preprocess.h +++ b/rtgui/preprocess.h @@ -24,7 +24,6 @@ #include "toolpanel.h" #include "adjuster.h" #include "guiutils.h" -#include "../rtengine/rawimage.h" class PreProcess : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel { diff --git a/rtgui/rawexposure.h b/rtgui/rawexposure.h index 1dafd4d64..339a054c9 100644 --- a/rtgui/rawexposure.h +++ b/rtgui/rawexposure.h @@ -22,7 +22,6 @@ #include #include "adjuster.h" #include "toolpanel.h" -#include "../rtengine/rawimage.h" class RAWExposure : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel { diff --git a/rtgui/xtransrawexposure.h b/rtgui/xtransrawexposure.h index 08cdcc8bf..4211e3e0c 100644 --- a/rtgui/xtransrawexposure.h +++ b/rtgui/xtransrawexposure.h @@ -22,7 +22,6 @@ #include #include "adjuster.h" #include "toolpanel.h" -#include "../rtengine/rawimage.h" class XTransRAWExposure : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel { From 068847eb5a2cac9478df9ba9a371ae0915d5018b Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 29 Oct 2019 21:06:27 +0100 Subject: [PATCH 101/208] Further cleanup of include dependencies --- rtengine/CMakeLists.txt | 1 - rtengine/LUT.h | 21 --------------------- rtengine/bilateral2.h | 1 - rtengine/camconst.cc | 3 +++ rtengine/camconst.h | 3 ++- rtengine/clutstore.h | 2 -- rtengine/color.h | 2 +- rtengine/curves.h | 2 +- rtengine/dcp.h | 2 +- rtengine/dfmanager.cc | 1 - rtengine/dynamicprofile.cc | 3 ++- rtengine/dynamicprofile.h | 2 +- rtengine/ffmanager.cc | 4 ++++ rtengine/iccstore.cc | 4 +++- rtengine/iccstore.h | 3 ++- rtengine/iimage.h | 2 +- rtengine/imagedata.h | 2 +- rtengine/imageio.h | 2 +- rtengine/imagesource.h | 2 +- rtengine/improcfun.cc | 3 +-- rtengine/iplab2rgb.cc | 2 +- rtengine/lcp.cc | 2 ++ rtengine/lcp.h | 2 +- rtengine/myfile.cc | 1 - rtengine/previewimage.h | 2 +- rtengine/procparams.h | 3 ++- rtengine/profilestore.cc | 4 ++++ rtengine/profilestore.h | 2 +- rtengine/rtengine.h | 2 +- rtengine/rtlensfun.h | 2 +- rtengine/rtthumbnail.cc | 2 +- rtengine/rtthumbnail.h | 2 +- rtengine/simpleprocess.cc | 2 +- rtexif/rtexif.h | 3 ++- rtgui/batchqueue.cc | 2 +- rtgui/bqentryupdater.h | 3 ++- rtgui/browserfilter.h | 3 ++- rtgui/cacheimagedata.h | 2 +- rtgui/extprog.cc | 2 ++ rtgui/filebrowser.cc | 2 +- rtgui/filmsimulation.h | 2 +- rtgui/histogrampanel.h | 2 +- rtgui/lensprofile.cc | 3 ++- rtgui/mycurve.h | 1 - rtgui/options.cc | 1 + rtgui/options.h | 2 +- rtgui/pathutils.cc | 2 ++ rtgui/pathutils.h | 14 ++------------ rtgui/pparamschangelistener.h | 2 +- rtgui/previewloader.h | 2 +- rtgui/profilestorecombobox.h | 2 +- rtgui/rtscalable.cc | 2 +- rtgui/thumbbrowserbase.cc | 2 +- rtgui/thumbimageupdater.h | 1 - rtgui/thumbnail.cc | 1 - rtgui/thumbnail.h | 2 +- rtgui/toolpanel.h | 2 +- 57 files changed, 70 insertions(+), 83 deletions(-) diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt index e39ccde8e..8ec208a2b 100644 --- a/rtengine/CMakeLists.txt +++ b/rtengine/CMakeLists.txt @@ -121,7 +121,6 @@ set(RTENGINESOURCEFILES rtthumbnail.cc shmap.cc simpleprocess.cc - slicer.cc stdimagesource.cc tmo_fattal02.cc utils.cc diff --git a/rtengine/LUT.h b/rtengine/LUT.h index 34f572f58..f1090eefa 100644 --- a/rtengine/LUT.h +++ b/rtengine/LUT.h @@ -64,7 +64,6 @@ #include #ifndef NDEBUG -#include #include #endif @@ -485,26 +484,6 @@ public: return (p1 + p2 * diff); } -#ifndef NDEBUG - // Debug facility ; dump the content of the LUT in a file. No control of the filename is done - void dump(Glib::ustring fname) - { - if (size) { - Glib::ustring fname_ = fname + ".xyz"; // TopSolid'Design "plot" file format - std::ofstream f (fname_.c_str()); - f << "$" << std::endl; - - for (unsigned int iter = 0; iter < size; iter++) { - f << iter << ", " << data[iter] << ", 0." << std::endl; - } - - f << "$" << std::endl; - f.close (); - } - } -#endif - - operator bool (void) const { return size > 0; diff --git a/rtengine/bilateral2.h b/rtengine/bilateral2.h index d0496810d..75fafc3ba 100644 --- a/rtengine/bilateral2.h +++ b/rtengine/bilateral2.h @@ -22,7 +22,6 @@ #include #include #include -#include #include "rtengine.h" #include "rt_math.h" diff --git a/rtengine/camconst.cc b/rtengine/camconst.cc index 43de5d688..93f0057f1 100644 --- a/rtengine/camconst.cc +++ b/rtengine/camconst.cc @@ -2,6 +2,9 @@ * This file is part of RawTherapee. */ #include "camconst.h" +#include +#include +#include #include "settings.h" #include "rt_math.h" #include diff --git a/rtengine/camconst.h b/rtengine/camconst.h index eb43da483..89180fbb5 100644 --- a/rtengine/camconst.h +++ b/rtengine/camconst.h @@ -4,8 +4,9 @@ #ifndef __CAMCONST__ #define __CAMCONST__ -#include +#include #include +#include namespace rtengine { diff --git a/rtengine/clutstore.h b/rtengine/clutstore.h index cd94bc18b..7c570df98 100644 --- a/rtengine/clutstore.h +++ b/rtengine/clutstore.h @@ -3,8 +3,6 @@ #include #include -#include - #include "cache.h" #include "alignedbuffer.h" #include "noncopyable.h" diff --git a/rtengine/color.h b/rtengine/color.h index d0053470e..abe67d906 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -20,7 +20,7 @@ #pragma once #include -#include +#include #include "rt_math.h" #include "LUT.h" diff --git a/rtengine/curves.h b/rtengine/curves.h index b4c1b54d4..ef25ff8d7 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -22,7 +22,7 @@ #include #include -#include +#include #include "rt_math.h" #include "../rtgui/mycurve.h" diff --git a/rtengine/dcp.h b/rtengine/dcp.h index 062459e42..922b88142 100644 --- a/rtengine/dcp.h +++ b/rtengine/dcp.h @@ -24,7 +24,7 @@ #include #include -#include +#include #include "../rtgui/threadutils.h" diff --git a/rtengine/dfmanager.cc b/rtengine/dfmanager.cc index 4877aacd8..fbeb2596e 100644 --- a/rtengine/dfmanager.cc +++ b/rtengine/dfmanager.cc @@ -19,7 +19,6 @@ #include "dfmanager.h" #include "../rtgui/options.h" #include -#include "../rtgui/guiutils.h" #include "rawimage.h" #include #include diff --git a/rtengine/dynamicprofile.cc b/rtengine/dynamicprofile.cc index af6ecd2ff..b9f76fa95 100644 --- a/rtengine/dynamicprofile.cc +++ b/rtengine/dynamicprofile.cc @@ -17,10 +17,11 @@ * along with RawTherapee. If not, see . */ -#include "../rtengine/dynamicprofile.h" +#include "dynamicprofile.h" #include #include +#include using namespace rtengine; using namespace rtengine::procparams; diff --git a/rtengine/dynamicprofile.h b/rtengine/dynamicprofile.h index aaffc5c4f..714f526f2 100644 --- a/rtengine/dynamicprofile.h +++ b/rtengine/dynamicprofile.h @@ -19,7 +19,7 @@ #ifndef _DYNAMICPROFILE_H_ #define _DYNAMICPROFILE_H_ -#include +#include #include #include "../rtgui/options.h" diff --git a/rtengine/ffmanager.cc b/rtengine/ffmanager.cc index 2dbc95055..dbbc25b81 100644 --- a/rtengine/ffmanager.cc +++ b/rtengine/ffmanager.cc @@ -16,6 +16,10 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ + +#include +#include + #include "ffmanager.h" #include "../rtgui/options.h" #include "rawimage.h" diff --git a/rtengine/iccstore.cc b/rtengine/iccstore.cc index a8d54b810..7151e244d 100644 --- a/rtengine/iccstore.cc +++ b/rtengine/iccstore.cc @@ -18,7 +18,9 @@ */ #include -#include +#include +#include +#include #include #ifdef WIN32 diff --git a/rtengine/iccstore.h b/rtengine/iccstore.h index 5c76660e5..cc67c6152 100644 --- a/rtengine/iccstore.h +++ b/rtengine/iccstore.h @@ -19,10 +19,11 @@ #pragma once #include +#include #include #include -#include +#include #include diff --git a/rtengine/iimage.h b/rtengine/iimage.h index b04b4bf9a..11eb3e482 100644 --- a/rtengine/iimage.h +++ b/rtengine/iimage.h @@ -19,7 +19,7 @@ #ifndef _IIMAGE_ #define _IIMAGE_ -#include +#include #include #include "rt_math.h" #include "alignedbuffer.h" diff --git a/rtengine/imagedata.h b/rtengine/imagedata.h index 06c7f4edf..ee8a3fc3c 100644 --- a/rtengine/imagedata.h +++ b/rtengine/imagedata.h @@ -22,7 +22,7 @@ #include #include #include -#include +#include #include "../rtexif/rtexif.h" #include #include "rtengine.h" diff --git a/rtengine/imageio.h b/rtengine/imageio.h index baf456037..c74756614 100644 --- a/rtengine/imageio.h +++ b/rtengine/imageio.h @@ -30,7 +30,7 @@ #include -#include +#include #include #include "rtengine.h" #include "imageformat.h" diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index 8597a8dc3..4a679f77e 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -21,7 +21,7 @@ #include #include -#include +#include #include "coord2d.h" #include "dcp.h" diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 523683002..90cd438d6 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -18,7 +18,7 @@ */ #include #include -#include +#include #ifdef _OPENMP #include #endif @@ -46,7 +46,6 @@ #include "StopWatch.h" #include "procparams.h" #include "../rtgui/ppversion.h" -#include "../rtgui/guiutils.h" #include "../rtgui/editcallbacks.h" #undef CLIPD diff --git a/rtengine/iplab2rgb.cc b/rtengine/iplab2rgb.cc index 4298e41c9..f2b337e01 100644 --- a/rtengine/iplab2rgb.cc +++ b/rtengine/iplab2rgb.cc @@ -21,7 +21,7 @@ #include "imagefloat.h" #include "labimage.h" #include "improcfun.h" -#include +#include #include "iccstore.h" #include "iccmatrices.h" #include "../rtgui/options.h" diff --git a/rtengine/lcp.cc b/rtengine/lcp.cc index ddf3e0643..e2442e094 100644 --- a/rtengine/lcp.cc +++ b/rtengine/lcp.cc @@ -20,6 +20,8 @@ #include #include +#include +#include #include #ifdef WIN32 diff --git a/rtengine/lcp.h b/rtengine/lcp.h index ebfa350ac..60df289e8 100644 --- a/rtengine/lcp.h +++ b/rtengine/lcp.h @@ -25,7 +25,7 @@ #include #include -#include +#include #include #include "cache.h" diff --git a/rtengine/myfile.cc b/rtengine/myfile.cc index 259e08565..aab45448a 100644 --- a/rtengine/myfile.cc +++ b/rtengine/myfile.cc @@ -18,7 +18,6 @@ */ #include "myfile.h" #include -#include // get mmap() sorted out #ifdef MYFILE_MMAP diff --git a/rtengine/previewimage.h b/rtengine/previewimage.h index 71ddefe8a..aac5eabe5 100644 --- a/rtengine/previewimage.h +++ b/rtengine/previewimage.h @@ -19,7 +19,7 @@ #ifndef _PREVIEWIMAGE_ #define _PREVIEWIMAGE_ -#include +#include #include namespace rtengine diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 734ca7556..57c27063e 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -23,7 +23,8 @@ #include #include -#include +#include +#include #include #include "noncopyable.h" diff --git a/rtengine/profilestore.cc b/rtengine/profilestore.cc index 5c38cf705..23e4d8321 100644 --- a/rtengine/profilestore.cc +++ b/rtengine/profilestore.cc @@ -16,6 +16,10 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ + +#include +#include + #include "profilestore.h" #include "dynamicprofile.h" diff --git a/rtengine/profilestore.h b/rtengine/profilestore.h index 384aa2a46..3b7bc7f9d 100644 --- a/rtengine/profilestore.h +++ b/rtengine/profilestore.h @@ -21,7 +21,7 @@ #include #include -#include +#include #include "rtengine.h" #include "noncopyable.h" diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index c188622af..f2c448805 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -22,7 +22,7 @@ #include #include -#include +#include #include diff --git a/rtengine/rtlensfun.h b/rtengine/rtlensfun.h index 2a7571b58..9c95ca3aa 100644 --- a/rtengine/rtlensfun.h +++ b/rtengine/rtlensfun.h @@ -23,7 +23,7 @@ #include #include -#include +#include #include diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index b30bf3eb4..7f232d8be 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -24,7 +24,7 @@ #include "image8.h" #include #include "curves.h" -#include +#include #include "improcfun.h" #include "colortemp.h" #include "mytime.h" diff --git a/rtengine/rtthumbnail.h b/rtengine/rtthumbnail.h index 8b3f27a8b..a1df25224 100644 --- a/rtengine/rtthumbnail.h +++ b/rtengine/rtthumbnail.h @@ -20,7 +20,7 @@ #define _THUMBPROCESSINGPARAMETERS_ #include "rawmetadatalocation.h" -#include +#include #include #include "image8.h" #include "image16.h" diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 71edba62c..b7bc46cb1 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -28,7 +28,7 @@ #include "clutstore.h" #include "processingjob.h" #include "procparams.h" -#include +#include #include "../rtgui/options.h" #include "rawimagesource.h" #include "../rtgui/multilangmgr.h" diff --git a/rtexif/rtexif.h b/rtexif/rtexif.h index f4b0e089e..e89260932 100644 --- a/rtexif/rtexif.h +++ b/rtexif/rtexif.h @@ -30,7 +30,8 @@ #include #include -#include +#include +#include #include "../rtengine/noncopyable.h" #include "../rtengine/rawmetadatalocation.h" diff --git a/rtgui/batchqueue.cc b/rtgui/batchqueue.cc index abb37b24d..ed9861ad6 100644 --- a/rtgui/batchqueue.cc +++ b/rtgui/batchqueue.cc @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include +#include #include #include #include diff --git a/rtgui/bqentryupdater.h b/rtgui/bqentryupdater.h index efd63f9de..9e3e09a51 100644 --- a/rtgui/bqentryupdater.h +++ b/rtgui/bqentryupdater.h @@ -19,7 +19,8 @@ #ifndef _BQENTRYUPDATER_ #define _BQENTRYUPDATER_ -#include +#include + #include "../rtengine/rtengine.h" #include "threadutils.h" #include "thumbnail.h" diff --git a/rtgui/browserfilter.h b/rtgui/browserfilter.h index f5dac180e..11bfd9920 100644 --- a/rtgui/browserfilter.h +++ b/rtgui/browserfilter.h @@ -19,8 +19,9 @@ #ifndef _BROWSERFILTER_ #define _BROWSERFILTER_ +#include + #include "exiffiltersettings.h" -#include class BrowserFilter { diff --git a/rtgui/cacheimagedata.h b/rtgui/cacheimagedata.h index 72bf55749..56b4ad434 100644 --- a/rtgui/cacheimagedata.h +++ b/rtgui/cacheimagedata.h @@ -19,7 +19,7 @@ #ifndef _CACHEIMAGEDATA_ #define _CACHEIMAGEDATA_ -#include +#include #include "options.h" #include "../rtengine/rtengine.h" #include "../rtengine/imageformat.h" diff --git a/rtgui/extprog.cc b/rtgui/extprog.cc index 00ea07713..a17bcdc6a 100644 --- a/rtgui/extprog.cc +++ b/rtgui/extprog.cc @@ -26,6 +26,8 @@ #include #endif +#include + #include "options.h" #include "multilangmgr.h" diff --git a/rtgui/filebrowser.cc b/rtgui/filebrowser.cc index f9afcef48..d4f5bb8ca 100644 --- a/rtgui/filebrowser.cc +++ b/rtgui/filebrowser.cc @@ -21,7 +21,7 @@ #include #include -#include +#include #include "filebrowser.h" diff --git a/rtgui/filmsimulation.h b/rtgui/filmsimulation.h index b5c9ffa6b..6eb0fd024 100644 --- a/rtgui/filmsimulation.h +++ b/rtgui/filmsimulation.h @@ -2,7 +2,7 @@ #define FILM_SIMULATION_INCLUDED #include -#include +#include #include #include "toolpanel.h" #include "guiutils.h" diff --git a/rtgui/histogrampanel.h b/rtgui/histogrampanel.h index 1515db97a..ef8d9368d 100644 --- a/rtgui/histogrampanel.h +++ b/rtgui/histogrampanel.h @@ -21,7 +21,7 @@ #include -#include +#include #include #include "../rtengine/LUT.h" #include "../rtengine/improccoordinator.h" diff --git a/rtgui/lensprofile.cc b/rtgui/lensprofile.cc index 389f15461..a6694287f 100644 --- a/rtgui/lensprofile.cc +++ b/rtgui/lensprofile.cc @@ -18,9 +18,10 @@ */ #include #include +#include #include -#include +#include #include "lensprofile.h" diff --git a/rtgui/mycurve.h b/rtgui/mycurve.h index 62d8d30f2..fd22660ea 100644 --- a/rtgui/mycurve.h +++ b/rtgui/mycurve.h @@ -26,7 +26,6 @@ #include "coloredbar.h" #include "coordinateadjuster.h" #include "../rtengine/LUT.h" -#include "guiutils.h" #include "options.h" #include "../rtengine/noncopyable.h" diff --git a/rtgui/options.cc b/rtgui/options.cc index 737607bcf..9757fa3b7 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -19,6 +19,7 @@ #include "options.h" #include #include +#include #include #include "multilangmgr.h" #include "addsetids.h" diff --git a/rtgui/options.h b/rtgui/options.h index 3bd83cd5b..990a32228 100644 --- a/rtgui/options.h +++ b/rtgui/options.h @@ -20,7 +20,7 @@ #define _OPTIONS_ #include -#include +#include #include "../rtengine/rtengine.h" #include diff --git a/rtgui/pathutils.cc b/rtgui/pathutils.cc index 71ff8b0b2..fc47a0e25 100644 --- a/rtgui/pathutils.cc +++ b/rtgui/pathutils.cc @@ -16,6 +16,8 @@ * along with RawTherapee. If not, see . */ +#include + #include "pathutils.h" diff --git a/rtgui/pathutils.h b/rtgui/pathutils.h index ed7d21984..482dfb82f 100644 --- a/rtgui/pathutils.h +++ b/rtgui/pathutils.h @@ -16,19 +16,9 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef __PATH_UTILS_ -#define __PATH_UTILS_ - -#include -#include -#include "../rtengine/rtengine.h" -#include "../rtengine/coord.h" -#include "rtimage.h" -#include -#include +#pragma once +#include // Removed from guiutils because used by rawtherapee-cli Glib::ustring removeExtension (const Glib::ustring& filename); Glib::ustring getExtension (const Glib::ustring& filename); - -#endif diff --git a/rtgui/pparamschangelistener.h b/rtgui/pparamschangelistener.h index 2c73ea3f6..bc3a5600b 100644 --- a/rtgui/pparamschangelistener.h +++ b/rtgui/pparamschangelistener.h @@ -20,7 +20,7 @@ #define _PPARAMSCHANGELISTENER_ #include "../rtengine/rtengine.h" -#include +#include #include "paramsedited.h" class PParamsChangeListener diff --git a/rtgui/previewloader.h b/rtgui/previewloader.h index 52dbee43c..ede509c0a 100644 --- a/rtgui/previewloader.h +++ b/rtgui/previewloader.h @@ -20,7 +20,7 @@ #define _PREVIEWLOADER_ #include -#include +#include #include "../rtengine/noncopyable.h" diff --git a/rtgui/profilestorecombobox.h b/rtgui/profilestorecombobox.h index 5d04813d6..cec67d188 100644 --- a/rtgui/profilestorecombobox.h +++ b/rtgui/profilestorecombobox.h @@ -21,7 +21,7 @@ #include #include -#include +#include #include "../rtengine/rtengine.h" #include "../rtengine/profilestore.h" diff --git a/rtgui/rtscalable.cc b/rtgui/rtscalable.cc index b37f2276f..fa92655ac 100644 --- a/rtgui/rtscalable.cc +++ b/rtgui/rtscalable.cc @@ -20,7 +20,7 @@ #include "rtscalable.h" #include #include -#include +#include #include #include #include "options.h" diff --git a/rtgui/thumbbrowserbase.cc b/rtgui/thumbbrowserbase.cc index adf451f05..f5f4076bb 100644 --- a/rtgui/thumbbrowserbase.cc +++ b/rtgui/thumbbrowserbase.cc @@ -16,7 +16,7 @@ */ #include -#include +#include #include "multilangmgr.h" #include "options.h" diff --git a/rtgui/thumbimageupdater.h b/rtgui/thumbimageupdater.h index 0e46b11d7..81636103e 100644 --- a/rtgui/thumbimageupdater.h +++ b/rtgui/thumbimageupdater.h @@ -19,7 +19,6 @@ #ifndef _THUMBIMAGEUPDATER_ #define _THUMBIMAGEUPDATER_ -#include #include #include "../rtengine/rtengine.h" diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc index 78928fdf4..531529d5c 100644 --- a/rtgui/thumbnail.cc +++ b/rtgui/thumbnail.cc @@ -23,7 +23,6 @@ #include "../rtengine/mytime.h" #include #include -#include #include "../rtengine/colortemp.h" #include "../rtengine/imagedata.h" #include "../rtengine/procparams.h" diff --git a/rtgui/thumbnail.h b/rtgui/thumbnail.h index ec5dbd249..b1c45fdfa 100644 --- a/rtgui/thumbnail.h +++ b/rtgui/thumbnail.h @@ -22,7 +22,7 @@ #include #include -#include +#include #include "cachemanager.h" #include "options.h" #include "../rtengine/rtengine.h" diff --git a/rtgui/toolpanel.h b/rtgui/toolpanel.h index 8d4a55eab..2c787d937 100644 --- a/rtgui/toolpanel.h +++ b/rtgui/toolpanel.h @@ -20,7 +20,7 @@ #define __TOOLPANEL__ #include -#include +#include #include "../rtengine/rtengine.h" #include "editbuffer.h" #include "guiutils.h" From dfa41d6947fa3e31d9f0f3e275121c4ee232f149 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 29 Oct 2019 21:09:37 +0100 Subject: [PATCH 102/208] removed rtengine/slicer.* --- rtengine/slicer.cc | 152 --------------------------------------------- rtengine/slicer.h | 63 ------------------- 2 files changed, 215 deletions(-) delete mode 100644 rtengine/slicer.cc delete mode 100644 rtengine/slicer.h diff --git a/rtengine/slicer.cc b/rtengine/slicer.cc deleted file mode 100644 index 96c0a0ee8..000000000 --- a/rtengine/slicer.cc +++ /dev/null @@ -1,152 +0,0 @@ -/* - * This file is part of RawTherapee. - * - * Copyright (c) 2004-2010 Gabor Horvath - * - * RawTherapee is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * RawTherapee is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with RawTherapee. If not, see . - */ - -#include -#include -#include "rt_math.h" - -#include "slicer.h" - -#ifdef _OPENMP -#include -#endif - -using namespace std; - -// If no parameter set, everything = 0 -> process all the image -Block::Block() -{ - posX = 0; - posY = 0; - width = 0; - height = 0; -} - -Block::Block(unsigned int x, unsigned int y, unsigned int w, unsigned int h) -{ - posX = x; - posY = y; - width = w; - height = h; -} - -/* - * Slice a sub-region to process in blocks who's size is given by the number of processor - * and the number of pixel per block (and hence the memory footprint) - */ -Slicer::Slicer(unsigned int imageWidth, unsigned int imageHeight, Block *subRegion, unsigned int pixels ) -{ - // If the sub-region has a portrait shape, X and Y coordinates are swapped for better result - // It will be swapped back when sending back the block coordinates - region.width = !(subRegion->width) ? imageWidth : subRegion->width; - region.height = !(subRegion->height) ? imageHeight : subRegion->height; // Assuming that the sub-region is under posY - - if (region.width < region.height) { - region.width = !(subRegion->height) ? imageHeight : subRegion->height; - region.height = !(subRegion->width) ? imageWidth : subRegion->width; // Assuming that the sub-region is under posY - portrait = true; - imWidth = imageHeight; - imHeight = imageWidth; - region.posX = subRegion->posY; - region.posY = subRegion->posX; - } else { - portrait = false; - imWidth = imageWidth; - imHeight = imageHeight; - region.posX = subRegion->posX; - region.posY = subRegion->posY; - } - - double subRegionRatio = (double)(region.width) / (double)(region.height); - - //total number of core/processor -#ifdef _OPENMP - unsigned int procNumber = omp_get_num_procs(); -#else - unsigned int procNumber = 1; -#endif - - //calculate the number of block - blockNumber = (double(region.width * region.height) / (double)pixels); - blockNumber = int((rtengine::max(blockNumber, 1U) + (double)procNumber / 2.) / procNumber) * procNumber; - vBlockNumber = (unsigned int)(sqrt((double)blockNumber / subRegionRatio) + 0.5); - vBlockNumber = CLAMP(vBlockNumber, 1, blockNumber); - hBlockNumber = (double)blockNumber / (double)vBlockNumber; - blockWidth = 1.0 / hBlockNumber; - - double maxPixelNumberX = (double)region.height / (double)vBlockNumber; - double maxPixelNumberY = (double)region.width / (double)((unsigned int)hBlockNumber); - - if (maxPixelNumberX - (double)((unsigned int)maxPixelNumberX) != 0.) { - maxPixelNumberX += 1.; - } - - if (maxPixelNumberY - (double)((unsigned int)maxPixelNumberY) != 0.) { - maxPixelNumberY += 1.; - } - - maxPixelNumber = (unsigned int)maxPixelNumberX * (unsigned int)maxPixelNumberY; - -} - -// return the absolute position and size of the requested block -void Slicer::get_block(unsigned int numBlock, Block *block) -{ - double roundingTradeOff = (hBlockNumber - (double)((int)hBlockNumber)) == 0.5 ? 2.1 : 2.0; - unsigned int alreadyCompletedLineNbr = (unsigned int)((double)(numBlock) * blockWidth + (blockWidth / roundingTradeOff)); - - unsigned int prevLineEnd = (unsigned int)((double)alreadyCompletedLineNbr * hBlockNumber + 0.5); - unsigned int myLineEnd = (unsigned int)((double)(alreadyCompletedLineNbr + 1) * hBlockNumber + 0.5); - - unsigned int nbrCellsOnMyLine = myLineEnd - prevLineEnd; - unsigned int cellOnMyLine = numBlock - prevLineEnd; - - unsigned int blockStart = (unsigned int)(((double)region.width / (double)nbrCellsOnMyLine) * (double)(cellOnMyLine)); - unsigned int blockEnd = (unsigned int)(((double)region.width / (double)nbrCellsOnMyLine) * (double)(cellOnMyLine + 1)); - block->width = blockEnd - blockStart; - block->posX = region.posX + blockStart; - - if (cellOnMyLine == (nbrCellsOnMyLine - 1)) { - // We make sure that the last block of the row take the rest of the remaining X space - block->width = region.posX + region.width - block->posX; - } - - blockStart = (unsigned int)(((double)region.height / (double)vBlockNumber) * (double)(alreadyCompletedLineNbr)); - blockEnd = (unsigned int)(((double)region.height / (double)vBlockNumber) * (double)(alreadyCompletedLineNbr + 1)); - block->height = blockEnd - blockStart; - block->posY = region.posY + blockStart; - - if (alreadyCompletedLineNbr == (vBlockNumber - 1)) { - block->height = region.posY + region.height - block->posY; - } - - if (portrait) { - // we swap back the X/Y coordinates - unsigned int temp; - - temp = block->posX; - block->posX = block->posY; - block->posY = temp; - - temp = block->width; - block->width = block->height; - block->height = temp; - - } -} diff --git a/rtengine/slicer.h b/rtengine/slicer.h deleted file mode 100644 index 658133e5f..000000000 --- a/rtengine/slicer.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * This file is part of RawTherapee. - * - * Copyright (c) 2004-2010 Gabor Horvath - * - * RawTherapee is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * RawTherapee is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with RawTherapee. If not, see . - */ -#ifndef _SLICER_ -#define _SLICER_ - -//The image is divided in blocks even on single processor machine, mainly to decrease memory consumption -//maximum number of pixel per block -#define PIXELS_PER_BLOCK 250000 - -/* - * Used to specify a subregion of an image and to specify a cell in this subregion - */ -class Block -{ -public: - unsigned int posX; - unsigned int posY; - unsigned int width; // If 0, use the full width of the image - unsigned int height; // If 0, use the full height of the image - Block(); - Block(unsigned int x, unsigned int y, unsigned int w, unsigned int h); -}; - -/* - * This class handle the best slicing of the image with a given number of pixels per block and the number of - * processor, and tries to create blocks as square as possible. There can be a different number of block on - * each line, and the pixel per block requested may be oversized by very few percents. - */ -class Slicer -{ -protected: - bool portrait; // Orientation of the sub-region - unsigned int imWidth; // Image width - unsigned int imHeight; // Image height - Block region; // Sub-region to process - double hBlockNumber; // Horizontal number of block for the sub-region - unsigned int vBlockNumber; // Vertical number of block for the sub-region - double blockWidth; - -public: - unsigned int blockNumber; // number of block for the sub-region - unsigned int maxPixelNumber; // number of pixel of the biggest block (for memory allocation purpose) - Slicer(unsigned int imageWidth, unsigned int imageHeight, Block *subRegion, unsigned int pixels); - void get_block(unsigned int blockId, Block *block); -}; - -#endif From 1acca23fe1e6edd4139b45d50a73608c1d92a52f Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 29 Oct 2019 22:45:26 +0100 Subject: [PATCH 103/208] Further cleanup of include dependencies --- rtengine/dynamicprofile.cc | 2 ++ rtengine/dynamicprofile.h | 2 +- rtengine/gamutwarning.cc | 1 + rtengine/gamutwarning.h | 3 ++- rtengine/histmatching.cc | 1 - rtengine/ipdehaze.cc | 1 + rtengine/iplabregions.cc | 1 + rtengine/ipshadowshighlights.cc | 1 + rtengine/ipsoftlight.cc | 1 + rtgui/dynamicprofilepanel.cc | 1 + rtgui/histogrampanel.cc | 3 --- rtgui/iccprofilecreator.cc | 1 + rtgui/navigator.cc | 2 -- rtgui/navigator.h | 1 - rtgui/preferences.cc | 1 + 15 files changed, 13 insertions(+), 9 deletions(-) diff --git a/rtengine/dynamicprofile.cc b/rtengine/dynamicprofile.cc index b9f76fa95..607b0b528 100644 --- a/rtengine/dynamicprofile.cc +++ b/rtengine/dynamicprofile.cc @@ -23,6 +23,8 @@ #include #include +#include "../rtgui/options.h" + using namespace rtengine; using namespace rtengine::procparams; diff --git a/rtengine/dynamicprofile.h b/rtengine/dynamicprofile.h index 714f526f2..e23c57b49 100644 --- a/rtengine/dynamicprofile.h +++ b/rtengine/dynamicprofile.h @@ -21,7 +21,7 @@ #include #include -#include "../rtgui/options.h" +#include "../rtengine/rtengine.h" class DynamicProfileRule { diff --git a/rtengine/gamutwarning.cc b/rtengine/gamutwarning.cc index fe6b7c0dc..290800f90 100644 --- a/rtengine/gamutwarning.cc +++ b/rtengine/gamutwarning.cc @@ -26,6 +26,7 @@ #include #include "gamutwarning.h" +#include "iccstore.h" #include "image8.h" namespace rtengine { diff --git a/rtengine/gamutwarning.h b/rtengine/gamutwarning.h index b7ac5e41d..4e34ed431 100644 --- a/rtengine/gamutwarning.h +++ b/rtengine/gamutwarning.h @@ -25,7 +25,8 @@ #pragma once -#include "iccstore.h" +#include + #include "noncopyable.h" namespace rtengine { diff --git a/rtengine/histmatching.cc b/rtengine/histmatching.cc index 212b11d00..e85f5ee13 100644 --- a/rtengine/histmatching.cc +++ b/rtengine/histmatching.cc @@ -23,7 +23,6 @@ #include "curves.h" #include "color.h" #include "rt_math.h" -#include "iccstore.h" #include "procparams.h" #include "../rtgui/mydiagonalcurve.h" #include "improcfun.h" diff --git a/rtengine/ipdehaze.cc b/rtengine/ipdehaze.cc index e3c86454f..7ca4d72ad 100644 --- a/rtengine/ipdehaze.cc +++ b/rtengine/ipdehaze.cc @@ -33,6 +33,7 @@ #include #include "guidedfilter.h" +#include "iccstore.h" #include "imagefloat.h" #include "improcfun.h" #include "procparams.h" diff --git a/rtengine/iplabregions.cc b/rtengine/iplabregions.cc index 2462959bf..d6b7294f6 100644 --- a/rtengine/iplabregions.cc +++ b/rtengine/iplabregions.cc @@ -22,6 +22,7 @@ #include #endif +#include "iccstore.h" #include "improcfun.h" #include "labimage.h" #include "guidedfilter.h" diff --git a/rtengine/ipshadowshighlights.cc b/rtengine/ipshadowshighlights.cc index 7680ae6c7..1e8842cbb 100644 --- a/rtengine/ipshadowshighlights.cc +++ b/rtengine/ipshadowshighlights.cc @@ -22,6 +22,7 @@ #include "gauss.h" #include "guidedfilter.h" +#include "iccstore.h" #include "labimage.h" #include "opthelper.h" #include "procparams.h" diff --git a/rtengine/ipsoftlight.cc b/rtengine/ipsoftlight.cc index e0dc6aa40..ab2e7c8b1 100644 --- a/rtengine/ipsoftlight.cc +++ b/rtengine/ipsoftlight.cc @@ -19,6 +19,7 @@ * along with RawTherapee. If not, see . */ +#include "iccstore.h" #include "improcfun.h" #include "labimage.h" diff --git a/rtgui/dynamicprofilepanel.cc b/rtgui/dynamicprofilepanel.cc index 38029af71..6acad07f9 100644 --- a/rtgui/dynamicprofilepanel.cc +++ b/rtgui/dynamicprofilepanel.cc @@ -18,6 +18,7 @@ */ #include "dynamicprofilepanel.h" +#include "options.h" #include "multilangmgr.h" #include "../rtengine/profilestore.h" #include "../rtengine/rtengine.h" diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 36803ddf2..74e473096 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -24,10 +24,7 @@ #include #include "../rtengine/LUT.h" #include "rtimage.h" -#include "../rtengine/improccoordinator.h" #include "../rtengine/color.h" -#include "../rtengine/opthelper.h" -#include "../rtengine/iccstore.h" using namespace rtengine; diff --git a/rtgui/iccprofilecreator.cc b/rtgui/iccprofilecreator.cc index 9efa4360b..2728a7611 100644 --- a/rtgui/iccprofilecreator.cc +++ b/rtgui/iccprofilecreator.cc @@ -19,6 +19,7 @@ */ #include #include "iccprofilecreator.h" +#include "../rtengine/iccstore.h" #include "multilangmgr.h" #include "cachemanager.h" #include "addsetids.h" diff --git a/rtgui/navigator.cc b/rtgui/navigator.cc index 2cad9fdc1..50946f32f 100644 --- a/rtgui/navigator.cc +++ b/rtgui/navigator.cc @@ -19,8 +19,6 @@ #include #include "navigator.h" #include "toolpanel.h" -#include "../rtengine/iccmatrices.h" -#include "../rtengine/iccstore.h" #include "../rtengine/color.h" #include "../rtengine/rt_math.h" #include "options.h" diff --git a/rtgui/navigator.h b/rtgui/navigator.h index eb4584f42..32ad68175 100644 --- a/rtgui/navigator.h +++ b/rtgui/navigator.h @@ -23,7 +23,6 @@ #include "previewwindow.h" #include "pointermotionlistener.h" #include "options.h" -#include "../rtengine/iccstore.h" class Navigator : public Gtk::Frame, public PointerMotionListener { diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index b4447fd44..3c0d1bedc 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -24,6 +24,7 @@ #include "addsetids.h" #include "../rtengine/dfmanager.h" #include "../rtengine/ffmanager.h" +#include "../rtengine/iccstore.h" #include #include "rtimage.h" #ifdef _OPENMP From 81575a6e364da5ed5b65f94ac093c2912cb358aa Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 29 Oct 2019 23:49:43 +0100 Subject: [PATCH 104/208] Further cleanup of include dependencies --- rtengine/bilateral2.h | 1 - rtengine/cfa_linedn_RT.cc | 1 - rtengine/ciecam02.cc | 2 +- rtengine/colortemp.cc | 6 +++++- rtengine/imagedata.h | 2 +- 5 files changed, 7 insertions(+), 5 deletions(-) diff --git a/rtengine/bilateral2.h b/rtengine/bilateral2.h index 75fafc3ba..f4b1a80e9 100644 --- a/rtengine/bilateral2.h +++ b/rtengine/bilateral2.h @@ -23,7 +23,6 @@ #include #include -#include "rtengine.h" #include "rt_math.h" #include "mytime.h" diff --git a/rtengine/cfa_linedn_RT.cc b/rtengine/cfa_linedn_RT.cc index 5f6e46f8f..3aef79133 100644 --- a/rtengine/cfa_linedn_RT.cc +++ b/rtengine/cfa_linedn_RT.cc @@ -24,7 +24,6 @@ #include -#include "rtengine.h" #include "rawimagesource.h" #include "rt_math.h" diff --git a/rtengine/ciecam02.cc b/rtengine/ciecam02.cc index dc71fee85..3219884ad 100644 --- a/rtengine/ciecam02.cc +++ b/rtengine/ciecam02.cc @@ -17,7 +17,7 @@ * along with RawTherapee. If not, see . */ #include "ciecam02.h" -#include "rtengine.h" +#include "rt_math.h" #include "curves.h" #include #include "sleef.c" diff --git a/rtengine/colortemp.cc b/rtengine/colortemp.cc index 3ddbdc28a..927d8423d 100644 --- a/rtengine/colortemp.cc +++ b/rtengine/colortemp.cc @@ -16,8 +16,12 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ + +#include + #include "colortemp.h" -#include "rtengine.h" +#include "iccmatrices.h" +#include "rt_math.h" #include #include #include diff --git a/rtengine/imagedata.h b/rtengine/imagedata.h index ee8a3fc3c..66c4285b9 100644 --- a/rtengine/imagedata.h +++ b/rtengine/imagedata.h @@ -23,9 +23,9 @@ #include #include #include +#include "imageio.h" #include "../rtexif/rtexif.h" #include -#include "rtengine.h" namespace rtengine { From d7ec033829068898bd3c790e03ea336955be7627 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Wed, 30 Oct 2019 09:30:21 +0100 Subject: [PATCH 105/208] Reduce `dcp.h` dependencies --- rtengine/FTblockDN.cc | 31 ++++++++++++-------- rtengine/PF_correct_RT.cc | 1 + rtengine/bilateral2.h | 25 ++++++++--------- rtengine/clutstore.cc | 3 ++ rtengine/dcp.cc | 12 ++++---- rtengine/dcp.h | 33 +++++++++++----------- rtengine/dcrop.cc | 10 ++++--- rtengine/dirpyr_equalizer.cc | 28 +++++++++--------- rtengine/dual_demosaic_RT.cc | 11 +++++--- rtengine/filmnegativeproc.cc | 1 + rtengine/imagedata.cc | 11 ++++++-- rtengine/imagesource.h | 11 ++++++-- rtengine/improccoordinator.cc | 29 +++++++++++-------- rtengine/improccoordinator.h | 13 +++++---- rtengine/improcfun.cc | 4 +-- rtengine/improcfun.h | 18 +++++++++--- rtengine/ipdehaze.cc | 2 +- rtengine/iplabregions.cc | 7 +++-- rtengine/ipretinex.cc | 3 +- rtengine/ipshadowshighlights.cc | 2 ++ rtengine/ipsharpen.cc | 19 +++++++------ rtengine/ipwavelet.cc | 17 +++++------ rtengine/pixelshift.cc | 13 +++++++-- rtengine/rawimagesource.cc | 36 +++++++++++++----------- rtengine/rawimagesource.h | 2 +- rtengine/rtthumbnail.cc | 50 ++++++++++++++++++--------------- rtengine/simpleprocess.cc | 4 +-- 27 files changed, 232 insertions(+), 164 deletions(-) diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index 8cd9a4086..b708f521a 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -23,27 +23,34 @@ //////////////////////////////////////////////////////////////// #include + #include -#include "../rtgui/threadutils.h" -#include "rtengine.h" -#include "improcfun.h" -#include "LUT.h" + #include "array2D.h" -#include "iccmatrices.h" -#include "imagefloat.h" -#include "labimage.h" #include "boxblur.h" -#include "rt_math.h" -#include "mytime.h" -#include "sleef.c" -#include "opthelper.h" #include "cplx_wavelet_dec.h" -#include "median.h" +#include "curves.h" +#include "iccmatrices.h" #include "iccstore.h" +#include "imagefloat.h" +#include "improcfun.h" +#include "labimage.h" +#include "LUT.h" +#include "median.h" +#include "mytime.h" +#include "opthelper.h" #include "procparams.h" +#include "rt_math.h" +#include "rtengine.h" +#include "sleef.c" + +#include "../rtgui/threadutils.h" +#include "../rtgui/options.h" + #ifdef _OPENMP #include #endif + //#define BENCHMARK #include "StopWatch.h" diff --git a/rtengine/PF_correct_RT.cc b/rtengine/PF_correct_RT.cc index eb450dce9..40b4933ae 100644 --- a/rtengine/PF_correct_RT.cc +++ b/rtengine/PF_correct_RT.cc @@ -30,6 +30,7 @@ #include "gauss.h" #include "improcfun.h" #include "cieimage.h" +#include "curves.h" #include "labimage.h" #include "sleef.c" #include "../rtgui/myflatcurve.h" diff --git a/rtengine/bilateral2.h b/rtengine/bilateral2.h index f4b1a80e9..a431bcecd 100644 --- a/rtengine/bilateral2.h +++ b/rtengine/bilateral2.h @@ -16,17 +16,18 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _BILATERAL2_ -#define _BILATERAL2_ +#pragma once +#include #include -#include #include - -#include "rt_math.h" -#include "mytime.h" +#include #include "array2D.h" +#include "LUT.h" +#include "mytime.h" +#include "rt_math.h" + #ifdef _OPENMP #include #endif @@ -571,7 +572,7 @@ template void bilateral (T** src, T** dst, int W, int H, int sigmar, do // calculate histogram at the beginning of the row rhist.clear(); - for (int x = MAX(0, row_from - r); x <= MIN(H, row_from + r); x++) + for (int x = std::max(0, row_from - r); x <= std::min(H, row_from + r); x++) for (int y = 0; y < r + 1; y++) { rhist[((int)src[x][y]) >> TRANSBIT]++; } @@ -582,12 +583,12 @@ template void bilateral (T** src, T** dst, int W, int H, int sigmar, do // calculate histogram at the beginning of the row if (i > r) - for (int x = 0; x <= MIN(H, r); x++) { + for (int x = 0; x <= std::min(H, r); x++) { rhist[((int)src[i - r - 1][x]) >> TRANSBIT]--; } if (i < H - r) - for (int x = 0; x <= MIN(H, r); x++) { + for (int x = 0; x <= std::min(H, r); x++) { rhist[((int)src[i + r][x]) >> TRANSBIT]++; } @@ -597,12 +598,12 @@ template void bilateral (T** src, T** dst, int W, int H, int sigmar, do // subtract pixels at the left and add pixels at the right if (j > r) - for (int x = MAX(0, i - r); x <= MIN(i + r, H - 1); x++) { + for (int x = std::max(0, i - r); x <= std::min(i + r, H - 1); x++) { hist[(int)(src[x][j - r - 1]) >> TRANSBIT]--; } if (j < W - r) - for (int x = MAX(0, i - r); x <= MIN(i + r, H - 1); x++) { + for (int x = std::max(0, i - r); x <= std::min(i + r, H - 1); x++) { hist[((int)src[x][j + r]) >> TRANSBIT]++; } @@ -641,5 +642,3 @@ template void bilateral (T** src, T** dst, int W, int H, int sigmar, do } #undef BINBIT #undef TRANSBIT - -#endif diff --git a/rtengine/clutstore.cc b/rtengine/clutstore.cc index cd97ed9e9..e3bd9c988 100644 --- a/rtengine/clutstore.cc +++ b/rtengine/clutstore.cc @@ -1,5 +1,8 @@ #include +#include +#include + #include "clutstore.h" #include "colortemp.h" diff --git a/rtengine/dcp.cc b/rtengine/dcp.cc index 78655dcf6..549fcf150 100644 --- a/rtengine/dcp.cc +++ b/rtengine/dcp.cc @@ -433,7 +433,7 @@ std::map getAliases(const Glib::ustring& profile_dir) } -struct DCPProfile::ApplyState::Data { +struct DCPProfileApplyState::Data { float pro_photo[3][3]; float work[3][3]; bool already_pro_photo; @@ -442,14 +442,12 @@ struct DCPProfile::ApplyState::Data { float bl_scale; }; -DCPProfile::ApplyState::ApplyState() : +DCPProfileApplyState::DCPProfileApplyState() : data(new Data{}) { } -DCPProfile::ApplyState::~ApplyState() -{ -} +DCPProfileApplyState::~DCPProfileApplyState() = default; DCPProfile::DCPProfile(const Glib::ustring& filename) : has_color_matrix_1(false), @@ -1149,7 +1147,7 @@ void DCPProfile::apply( } } -void DCPProfile::setStep2ApplyState(const Glib::ustring& working_space, bool use_tone_curve, bool apply_look_table, bool apply_baseline_exposure, ApplyState& as_out) +void DCPProfile::setStep2ApplyState(const Glib::ustring& working_space, bool use_tone_curve, bool apply_look_table, bool apply_baseline_exposure, DCPProfileApplyState& as_out) { as_out.data->use_tone_curve = use_tone_curve; as_out.data->apply_look_table = apply_look_table; @@ -1193,7 +1191,7 @@ void DCPProfile::setStep2ApplyState(const Glib::ustring& working_space, bool use } } -void DCPProfile::step2ApplyTile(float* rc, float* gc, float* bc, int width, int height, int tile_width, const ApplyState& as_in) const +void DCPProfile::step2ApplyTile(float* rc, float* gc, float* bc, int width, int height, int tile_width, const DCPProfileApplyState& as_in) const { #define FCLIP(a) ((a)>0.0?((a)<65535.5?(a):65535.5):0.0) diff --git a/rtengine/dcp.h b/rtengine/dcp.h index 922b88142..573349348 100644 --- a/rtengine/dcp.h +++ b/rtengine/dcp.h @@ -36,24 +36,11 @@ namespace rtengine class ColorTemp; class Imagefloat; +class DCPProfileApplyState; class DCPProfile final { public: - class ApplyState final - { - public: - ApplyState(); - ~ApplyState(); - - private: - struct Data; - - const std::unique_ptr data; - - friend class DCPProfile; - }; - struct Illuminants { short light_source_1; short light_source_2; @@ -87,8 +74,8 @@ public: const Matrix& cam_wb_matrix, bool apply_hue_sat_map = true ) const; - void setStep2ApplyState(const Glib::ustring& working_space, bool use_tone_curve, bool apply_look_table, bool apply_baseline_exposure, ApplyState& as_out); - void step2ApplyTile(float* r, float* g, float* b, int width, int height, int tile_width, const ApplyState& as_in) const; + void setStep2ApplyState(const Glib::ustring& working_space, bool use_tone_curve, bool apply_look_table, bool apply_baseline_exposure, DCPProfileApplyState& as_out); + void step2ApplyTile(float* r, float* g, float* b, int width, int height, int tile_width, const DCPProfileApplyState& as_in) const; private: struct HsbModify { @@ -149,6 +136,20 @@ private: AdobeToneCurve tone_curve; }; +class DCPProfileApplyState final +{ +public: + DCPProfileApplyState(); + ~DCPProfileApplyState(); + +private: + struct Data; + + const std::unique_ptr data; + + friend class DCPProfile; +}; + class DCPStore final : public NonCopyable { diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 6d45d232b..819a6d01e 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -18,17 +18,19 @@ * along with RawTherapee. If not, see . */ -#include "colortemp.h" #include "cieimage.h" +#include "colortemp.h" +#include "curves.h" +#include "dcp.h" +#include "dcrop.h" #include "image8.h" #include "imagefloat.h" #include "labimage.h" -#include "curves.h" -#include "dcrop.h" #include "mytime.h" #include "procparams.h" #include "refreshmap.h" #include "rt_math.h" + #include "../rtgui/editcallbacks.h" namespace @@ -830,7 +832,7 @@ void Crop::update(int todo) } } double rrm, ggm, bbm; - DCPProfile::ApplyState as; + DCPProfileApplyState as; DCPProfile *dcpProf = parent->imgsrc->getDCP(params.icm, as); LUTu histToneCurve; diff --git a/rtengine/dirpyr_equalizer.cc b/rtengine/dirpyr_equalizer.cc index 79f85a944..d40f9fce6 100644 --- a/rtengine/dirpyr_equalizer.cc +++ b/rtengine/dirpyr_equalizer.cc @@ -18,14 +18,16 @@ * */ -#include +#include #include +#include +#include "array2D.h" #include "cieimage.h" #include "improcfun.h" -#include "array2D.h" -#include "rt_math.h" #include "opthelper.h" +#include "rt_math.h" +#include "settings.h" namespace { @@ -73,8 +75,8 @@ void dirpyr_channel(const float * const * data_fine, float ** data_coarse, int w float val = 0.f; float norm = 0.f; - for (int inbr = max(0, i - scalewin); inbr <= min(height - 1, i + scalewin); inbr += scale) { - for (int jnbr = max(0, j - scalewin); jnbr <= j + scalewin; jnbr += scale) { + for (int inbr = std::max(0, i - scalewin); inbr <= std::min(height - 1, i + scalewin); inbr += scale) { + for (int jnbr = std::max(0, j - scalewin); jnbr <= j + scalewin; jnbr += scale) { const float dirwt = domker[(inbr - i) / scale + halfwin][(jnbr - j)/ scale + halfwin] * rangeFn(fabsf(data_fine[inbr][jnbr] - data_fine[i][j])); val += dirwt * data_fine[inbr][jnbr]; norm += dirwt; @@ -107,7 +109,7 @@ void dirpyr_channel(const float * const * data_fine, float ** data_coarse, int w float val = 0.f; float norm = 0.f; - for (int inbr = max(0, i - scalewin); inbr <= min(height - 1, i + scalewin); inbr += scale) { + for (int inbr = std::max(0, i - scalewin); inbr <= std::min(height - 1, i + scalewin); inbr += scale) { for (int jnbr = j - scalewin; jnbr <= j + scalewin; jnbr += scale) { const float dirwt = domker[(inbr - i) / scale + halfwin][(jnbr - j)/ scale + halfwin] * rangeFn(fabsf(data_fine[inbr][jnbr] - data_fine[i][j])); val += dirwt * data_fine[inbr][jnbr]; @@ -121,8 +123,8 @@ void dirpyr_channel(const float * const * data_fine, float ** data_coarse, int w float val = 0.f; float norm = 0.f; - for (int inbr = max(0, i - scalewin); inbr <= min(height - 1, i + scalewin); inbr += scale) { - for (int jnbr = j - scalewin; jnbr <= min(width - 1, j + scalewin); jnbr += scale) { + for (int inbr = std::max(0, i - scalewin); inbr <= std::min(height - 1, i + scalewin); inbr += scale) { + for (int jnbr = j - scalewin; jnbr <= std::min(width - 1, j + scalewin); jnbr += scale) { const float dirwt = domker[(inbr - i) / scale + halfwin][(jnbr - j)/ scale + halfwin] * rangeFn(fabsf(data_fine[inbr][jnbr] - data_fine[i][j])); val += dirwt * data_fine[inbr][jnbr]; norm += dirwt; @@ -151,8 +153,8 @@ void dirpyr_channel(const float * const * data_fine, float ** data_coarse, int w float val = 0.f; float norm = 0.f; - for (int inbr = max(0, i - scale); inbr <= min(height - 1, i + scale); inbr += scale) { - for (int jnbr = max(0, j - scale); jnbr <= j + scale; jnbr += scale) { + for (int inbr = std::max(0, i - scale); inbr <= std::min(height - 1, i + scale); inbr += scale) { + for (int jnbr = std::max(0, j - scale); jnbr <= j + scale; jnbr += scale) { const float dirwt = rangeFn(fabsf(data_fine[inbr][jnbr] - data_fine[i][j])); val += dirwt * data_fine[inbr][jnbr]; norm += dirwt; @@ -184,7 +186,7 @@ void dirpyr_channel(const float * const * data_fine, float ** data_coarse, int w float val = 0.f; float norm = 0.f; - for (int inbr = max(0, i - scale); inbr <= min(height - 1, i + scale); inbr += scale) { + for (int inbr = std::max(0, i - scale); inbr <= std::min(height - 1, i + scale); inbr += scale) { for (int jnbr = j - scale; jnbr <= j + scale; jnbr += scale) { const float dirwt = rangeFn(fabsf(data_fine[inbr][jnbr] - data_fine[i][j])); val += dirwt * data_fine[inbr][jnbr]; @@ -198,8 +200,8 @@ void dirpyr_channel(const float * const * data_fine, float ** data_coarse, int w float val = 0.f; float norm = 0.f; - for (int inbr = max(0, i - scale); inbr <= min(height - 1, i + scale); inbr += scale) { - for (int jnbr = j - scale; jnbr <= min(width - 1, j + scale); jnbr += scale) { + for (int inbr = std::max(0, i - scale); inbr <= std::min(height - 1, i + scale); inbr += scale) { + for (int jnbr = j - scale; jnbr <= std::min(width - 1, j + scale); jnbr += scale) { const float dirwt = rangeFn(fabsf(data_fine[inbr][jnbr] - data_fine[i][j])); val += dirwt * data_fine[inbr][jnbr]; norm += dirwt; diff --git a/rtengine/dual_demosaic_RT.cc b/rtengine/dual_demosaic_RT.cc index 895d7c6fc..8a3564279 100644 --- a/rtengine/dual_demosaic_RT.cc +++ b/rtengine/dual_demosaic_RT.cc @@ -24,13 +24,16 @@ //////////////////////////////////////////////////////////////// #include "jaggedarray.h" -#include "rtengine.h" -#include "rawimagesource.h" -#include "rt_math.h" #include "procparams.h" +#include "rawimagesource.h" +#include "rt_algo.h" +#include "rt_math.h" +#include "rtengine.h" + +#include "../rtgui/options.h" + //#define BENCHMARK #include "StopWatch.h" -#include "rt_algo.h" using namespace std; diff --git a/rtengine/filmnegativeproc.cc b/rtengine/filmnegativeproc.cc index 1eae22ad6..26c1314f4 100644 --- a/rtengine/filmnegativeproc.cc +++ b/rtengine/filmnegativeproc.cc @@ -26,6 +26,7 @@ #include "rawimage.h" #include "rawimagesource.h" +#include "coord.h" #include "mytime.h" #include "opthelper.h" #include "procparams.h" diff --git a/rtengine/imagedata.cc b/rtengine/imagedata.cc index 403f4708c..184e288e9 100644 --- a/rtengine/imagedata.cc +++ b/rtengine/imagedata.cc @@ -17,15 +17,20 @@ * along with RawTherapee. If not, see . */ #include + #include -#include + #include +#include + +#include + #include "imagedata.h" -#include "iptcpairs.h" #include "imagesource.h" -#include "rt_math.h" +#include "iptcpairs.h" #include "procparams.h" +#include "rt_math.h" #pragma GCC diagnostic warning "-Wextra" #define PRINT_HDR_PS_DETECTION 0 diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index 4a679f77e..6b5a22b63 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -24,17 +24,22 @@ #include #include "coord2d.h" -#include "dcp.h" #include "imagedata.h" #include "LUT.h" #include "rtengine.h" +template +class multi_array2D; + namespace rtengine { + class ColorTemp; +class DCPProfile; +class DCPProfileApplyState; class Imagefloat; -class RetinextransmissionCurve; class RetinexgaintransmissionCurve; +class RetinextransmissionCurve; namespace procparams { @@ -126,7 +131,7 @@ public: virtual ImageMatrices* getImageMatrices () = 0; virtual bool isRAW () const = 0; - virtual DCPProfile* getDCP (const procparams::ColorManagementParams &cmp, DCPProfile::ApplyState &as) + virtual DCPProfile* getDCP (const procparams::ColorManagementParams &cmp, DCPProfileApplyState &as) { return nullptr; }; diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index b0996c6dd..b55c6ee75 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -16,27 +16,32 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ +#include +#include +#include + #include "improccoordinator.h" #include "cieimage.h" +#include "color.h" +#include "colortemp.h" +#include "curves.h" +#include "dcp.h" +#include "iccstore.h" #include "image8.h" #include "imagefloat.h" -#include "labimage.h" -#include "curves.h" -#include "mytime.h" -#include "refreshmap.h" -#include "../rtgui/ppversion.h" -#include "colortemp.h" #include "improcfun.h" -#include "iccstore.h" +#include "labimage.h" +#include "mytime.h" #include "procparams.h" -#include -#include -#include -#include "color.h" +#include "refreshmap.h" + +#include "../rtgui/ppversion.h" + #ifdef _OPENMP #include #endif + namespace rtengine { @@ -736,7 +741,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) double ggm = 33.; double bbm = 33.; - DCPProfile::ApplyState as; + DCPProfileApplyState as; DCPProfile *dcpProf = imgsrc->getDCP(params->icm, as); ipf.rgbProc (oprevi, oprevl, nullptr, hltonecurve, shtonecurve, tonecurve, params->toneCurve.saturation, diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index 14e93b771..71bca1d8a 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -21,20 +21,21 @@ #include +#include "array2D.h" #include "colortemp.h" -#include "rtengine.h" -#include "improcfun.h" -#include "imagesource.h" -#include "procevents.h" +#include "curves.h" #include "dcrop.h" +#include "imagesource.h" +#include "improcfun.h" #include "LUT.h" +#include "procevents.h" +#include "rtengine.h" + #include "../rtgui/threadutils.h" namespace rtengine { -class Image8; - using namespace procparams; class Crop; diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 90cd438d6..c84027e6a 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -2050,7 +2050,7 @@ filmlike_clip (float *r, float *g, float *b) void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer *pipetteBuffer, LUTf & hltonecurve, LUTf & shtonecurve, LUTf & tonecurve, int sat, LUTf & rCurve, LUTf & gCurve, LUTf & bCurve, float satLimit, float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, bool opautili, LUTf & clToningcurve, LUTf & cl2Toningcurve, - const ToneCurve & customToneCurve1, const ToneCurve & customToneCurve2, const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, DCPProfile *dcpProf, const DCPProfile::ApplyState &asIn, LUTu &histToneCurve, size_t chunkSize, bool measure) + const ToneCurve & customToneCurve1, const ToneCurve & customToneCurve2, const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, DCPProfile *dcpProf, const DCPProfileApplyState &asIn, LUTu &histToneCurve, size_t chunkSize, bool measure) { rgbProc (working, lab, pipetteBuffer, hltonecurve, shtonecurve, tonecurve, sat, rCurve, gCurve, bCurve, satLimit, satLimitOpacity, ctColorCurve, ctOpacityCurve, opautili, clToningcurve, cl2Toningcurve, customToneCurve1, customToneCurve2, customToneCurvebw1, customToneCurvebw2, rrm, ggm, bbm, autor, autog, autob, params->toneCurve.expcomp, params->toneCurve.hlcompr, params->toneCurve.hlcomprthresh, dcpProf, asIn, histToneCurve, chunkSize, measure); } @@ -2058,7 +2058,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer // Process RGB image and convert to LAB space void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer *pipetteBuffer, LUTf & hltonecurve, LUTf & shtonecurve, LUTf & tonecurve, int sat, LUTf & rCurve, LUTf & gCurve, LUTf & bCurve, float satLimit, float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, bool opautili, LUTf & clToningcurve, LUTf & cl2Toningcurve, - const ToneCurve & customToneCurve1, const ToneCurve & customToneCurve2, const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, double expcomp, int hlcompr, int hlcomprthresh, DCPProfile *dcpProf, const DCPProfile::ApplyState &asIn, LUTu &histToneCurve, size_t chunkSize, bool measure) + const ToneCurve & customToneCurve1, const ToneCurve & customToneCurve2, const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, double expcomp, int hlcompr, int hlcomprthresh, DCPProfile *dcpProf, const DCPProfileApplyState &asIn, LUTu &histToneCurve, size_t chunkSize, bool measure) { std::unique_ptr stop; diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 16b8e27b0..a47ba2980 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -24,18 +24,27 @@ #include "color.h" #include "LUT.h" #include "lcp.h" -#include "dcp.h" #include "pipettebuffer.h" #include "gamutwarning.h" +template +class multi_array2D; + namespace rtengine { + +class ColorAppearance; class ColorGradientCurve; +class DCPProfile; +class DCPProfileApplyState; +class FlatCurve; +class FramesMetaData; +class NoiseCurve; class OpacityCurve; class ToneCurve; class WavCurve; -class WavOpacityCurveRG; class WavOpacityCurveBY; +class WavOpacityCurveRG; class WavOpacityCurveW; class WavOpacityCurveWL; @@ -50,6 +59,7 @@ namespace procparams class ProcParams; +struct ColorManagementParams; struct DirPyrDenoiseParams; struct SharpeningParams; struct VignettingParams; @@ -113,11 +123,11 @@ public: void updateColorProfiles(const Glib::ustring& monitorProfile, RenderingIntent monitorIntent, bool softProof, bool gamutCheck); void rgbProc(Imagefloat* working, LabImage* lab, PipetteBuffer *pipetteBuffer, LUTf & hltonecurve, LUTf & shtonecurve, LUTf & tonecurve, int sat, LUTf & rCurve, LUTf & gCurve, LUTf & bCurve, float satLimit, float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, bool opautili, LUTf & clcurve, LUTf & cl2curve, const ToneCurve & customToneCurve1, const ToneCurve & customToneCurve2, - const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, DCPProfile *dcpProf, const DCPProfile::ApplyState &asIn, LUTu &histToneCurve, size_t chunkSize = 1, bool measure = false); + const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, DCPProfile *dcpProf, const DCPProfileApplyState &asIn, LUTu &histToneCurve, size_t chunkSize = 1, bool measure = false); void rgbProc(Imagefloat* working, LabImage* lab, PipetteBuffer *pipetteBuffer, LUTf & hltonecurve, LUTf & shtonecurve, LUTf & tonecurve, int sat, LUTf & rCurve, LUTf & gCurve, LUTf & bCurve, float satLimit, float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, bool opautili, LUTf & clcurve, LUTf & cl2curve, const ToneCurve & customToneCurve1, const ToneCurve & customToneCurve2, const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, - double expcomp, int hlcompr, int hlcomprthresh, DCPProfile *dcpProf, const DCPProfile::ApplyState &asIn, LUTu &histToneCurve, size_t chunkSize = 1, bool measure = false); + double expcomp, int hlcompr, int hlcomprthresh, DCPProfile *dcpProf, const DCPProfileApplyState &asIn, LUTu &histToneCurve, size_t chunkSize = 1, bool measure = false); void labtoning(float r, float g, float b, float &ro, float &go, float &bo, int algm, int metchrom, int twoc, float satLimit, float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, LUTf & clToningcurve, LUTf & cl2Toningcurve, float iplow, float iphigh, double wp[3][3], double wip[3][3]); void toning2col(float r, float g, float b, float &ro, float &go, float &bo, float iplow, float iphigh, float rl, float gl, float bl, float rh, float gh, float bh, float SatLow, float SatHigh, float balanS, float balanH, float reducac, int mode, int preser, float strProtect); void toningsmh(float r, float g, float b, float &ro, float &go, float &bo, float RedLow, float GreenLow, float BlueLow, float RedMed, float GreenMed, float BlueMed, float RedHigh, float GreenHigh, float BlueHigh, float reducac, int mode, float strProtect); diff --git a/rtengine/ipdehaze.cc b/rtengine/ipdehaze.cc index 7ca4d72ad..ce5843da8 100644 --- a/rtengine/ipdehaze.cc +++ b/rtengine/ipdehaze.cc @@ -40,7 +40,7 @@ #include "rescale.h" #include "rt_math.h" -extern Options options; +#include "../rtgui/options.h" namespace rtengine { diff --git a/rtengine/iplabregions.cc b/rtengine/iplabregions.cc index d6b7294f6..932b7e18d 100644 --- a/rtengine/iplabregions.cc +++ b/rtengine/iplabregions.cc @@ -22,14 +22,17 @@ #include #endif +#include "curves.h" +#include "guidedfilter.h" #include "iccstore.h" #include "improcfun.h" #include "labimage.h" -#include "guidedfilter.h" #include "procparams.h" + +#include "sleef.c" + //#define BENCHMARK #include "StopWatch.h" -#include "sleef.c" namespace { diff --git a/rtengine/ipretinex.cc b/rtengine/ipretinex.cc index e443b5bca..ab3a632da 100644 --- a/rtengine/ipretinex.cc +++ b/rtengine/ipretinex.cc @@ -41,6 +41,7 @@ #include #include +#include "curves.h" #include "gauss.h" #include "improcfun.h" #include "jaggedarray.h" @@ -135,8 +136,6 @@ void mean_stddv2( float **dst, float &mean, float &stddv, int W_L, int H_L, floa namespace rtengine { -extern const Settings* settings; - void RawImageSource::MSR(float** luminance, float** originalLuminance, float **exLuminance, const LUTf& mapcurve, bool mapcontlutili, int width, int height, const procparams::RetinexParams &deh, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax) { BENCHFUN diff --git a/rtengine/ipshadowshighlights.cc b/rtengine/ipshadowshighlights.cc index 1e8842cbb..a1e91c4ab 100644 --- a/rtengine/ipshadowshighlights.cc +++ b/rtengine/ipshadowshighlights.cc @@ -20,12 +20,14 @@ #include "improcfun.h" +#include "curves.h" #include "gauss.h" #include "guidedfilter.h" #include "iccstore.h" #include "labimage.h" #include "opthelper.h" #include "procparams.h" + #include "sleef.c" namespace rtengine { diff --git a/rtengine/ipsharpen.cc b/rtengine/ipsharpen.cc index 1223ff9ce..8f63b59f6 100644 --- a/rtengine/ipsharpen.cc +++ b/rtengine/ipsharpen.cc @@ -17,19 +17,22 @@ * along with RawTherapee. If not, see . */ -#include "improcfun.h" -#include "cieimage.h" -#include "labimage.h" -#include "gauss.h" #include "bilateral2.h" +#include "cieimage.h" +#include "gauss.h" +#include "improcfun.h" #include "jaggedarray.h" -#include "rt_math.h" -#include "procparams.h" -#include "sleef.c" +#include "labimage.h" #include "opthelper.h" +#include "procparams.h" +#include "rt_algo.h" +#include "rt_math.h" +#include "settings.h" +#include "sleef.c" + //#define BENCHMARK #include "StopWatch.h" -#include "rt_algo.h" + using namespace std; namespace { diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 078b9d585..4cd16f90b 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -28,19 +28,20 @@ #include "../rtgui/threadutils.h" -#include "rtengine.h" +#include "array2D.h" +#include "curves.h" +#include "EdgePreservingDecomposition.h" +#include "iccstore.h" #include "improcfun.h" #include "labimage.h" #include "LUT.h" -#include "array2D.h" -#include "rt_math.h" -#include "mytime.h" -#include "sleef.c" -#include "opthelper.h" #include "median.h" -#include "EdgePreservingDecomposition.h" -#include "iccstore.h" +#include "mytime.h" +#include "opthelper.h" #include "procparams.h" +#include "rt_math.h" +#include "rtengine.h" +#include "sleef.c" #ifdef _OPENMP #include diff --git a/rtengine/pixelshift.cc b/rtengine/pixelshift.cc index abe6a0536..ca5e742fb 100644 --- a/rtengine/pixelshift.cc +++ b/rtengine/pixelshift.cc @@ -21,13 +21,20 @@ //////////////////////////////////////////////////////////////// #include -#include "rawimagesource.h" -#include "../rtgui/multilangmgr.h" -#include "procparams.h" +#include + +#include "array2D.h" #include "gauss.h" #include "median.h" +#include "procparams.h" +#include "rawimagesource.h" + +#include "../rtgui/multilangmgr.h" +#include "../rtgui/options.h" + //#define BENCHMARK #include "StopWatch.h" + namespace { diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index ca324a5c1..7d101ff5d 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -19,34 +19,38 @@ #include #include -#include "rtengine.h" -#include "imagefloat.h" -#include "rawimage.h" -#include "rawimagesource.h" -#include "rawimagesource_i.h" -#include "jaggedarray.h" -#include "median.h" -#include "rawimage.h" -#include "mytime.h" -#include "iccstore.h" +#include "camconst.h" +#include "color.h" #include "curves.h" +#include "dcp.h" #include "dfmanager.h" #include "ffmanager.h" -#include "dcp.h" -#include "rt_math.h" +#include "iccstore.h" +#include "imagefloat.h" #include "improcfun.h" -#include "rtlensfun.h" +#include "jaggedarray.h" +#include "median.h" +#include "mytime.h" #include "pdaflinesfilter.h" -#include "camconst.h" #include "procparams.h" -#include "color.h" +#include "rawimage.h" +#include "rawimage.h" +#include "rawimagesource_i.h" +#include "rawimagesource.h" +#include "rt_math.h" +#include "rtengine.h" +#include "rtlensfun.h" + //#define BENCHMARK //#include "StopWatch.h" + #ifdef _OPENMP #include #endif + #include "opthelper.h" #define clipretinex( val, minv, maxv ) (( val = (val < minv ? minv : val ) ) > maxv ? maxv : val ) + #undef CLIPD #define CLIPD(a) ((a)>0.0f?((a)<1.0f?(a):1.0f):0.0f) @@ -935,7 +939,7 @@ void RawImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* ima } } -DCPProfile *RawImageSource::getDCP(const ColorManagementParams &cmp, DCPProfile::ApplyState &as) +DCPProfile *RawImageSource::getDCP(const ColorManagementParams &cmp, DCPProfileApplyState &as) { if (cmp.inputProfile == "(camera)" || cmp.inputProfile == "(none)") { return nullptr; diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index 118dcb559..82e842ad3 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -182,7 +182,7 @@ public: void getAutoExpHistogram (LUTu & histogram, int& histcompr) override; void getRAWHistogram (LUTu & histRedRaw, LUTu & histGreenRaw, LUTu & histBlueRaw) override; void getAutoMatchedToneCurve(const procparams::ColorManagementParams &cp, std::vector &outCurve) override; - DCPProfile *getDCP(const procparams::ColorManagementParams &cmp, DCPProfile::ApplyState &as) override; + DCPProfile *getDCP(const procparams::ColorManagementParams &cmp, DCPProfileApplyState &as) override; void convertColorSpace(Imagefloat* image, const procparams::ColorManagementParams &cmp, const ColorTemp &wb) override; static bool findInputProfile(Glib::ustring inProfile, cmsHPROFILE embedded, std::string camName, DCPProfile **dcpProf, cmsHPROFILE& in); diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index 7f232d8be..d10e2b1dc 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -16,33 +16,39 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ +#include + +#include + +#include + +#include + #include "cieimage.h" +#include "colortemp.h" +#include "curves.h" +#include "dcp.h" +#include "iccmatrices.h" +#include "iccstore.h" +#include "image8.h" +#include "improccoordinator.h" +#include "improcfun.h" +#include "jpeg.h" #include "labimage.h" +#include "median.h" +#include "mytime.h" +#include "procparams.h" +#include "rawimage.h" +#include "rawimagesource.h" #include "rtengine.h" #include "rtthumbnail.h" -#include "../rtgui/options.h" -#include "image8.h" -#include -#include "curves.h" -#include -#include "improcfun.h" -#include "colortemp.h" -#include "mytime.h" -#include "utils.h" -#include "iccstore.h" -#include "iccmatrices.h" -#include "rawimagesource.h" -#include "stdimagesource.h" -#include -#include "rawimage.h" -#include "jpeg.h" -#include "../rtgui/ppversion.h" -#include "improccoordinator.h" #include "settings.h" -#include "procparams.h" -#include +#include "stdimagesource.h" #include "StopWatch.h" -#include "median.h" +#include "utils.h" + +#include "../rtgui/options.h" +#include "../rtgui/ppversion.h" namespace { @@ -1365,7 +1371,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT LabImage* labView = new LabImage (fw, fh); DCPProfile *dcpProf = nullptr; - DCPProfile::ApplyState as; + DCPProfileApplyState as; if (isRaw) { cmsHPROFILE dummy; diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index b7bc46cb1..978479304 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -17,6 +17,7 @@ * along with RawTherapee. If not, see . */ #include "cieimage.h" +#include "dcp.h" #include "imagefloat.h" #include "labimage.h" #include "rtengine.h" @@ -243,7 +244,6 @@ private: bool dehacontlutili = false; bool mapcontlutili = false; bool useHsl = false; -// multi_array2D conversionBuffer(1, 1); multi_array2D conversionBuffer (1, 1); imgsrc->retinexPrepareBuffers (params.icm, params.retinex, conversionBuffer, dummy); imgsrc->retinexPrepareCurves (params.retinex, cdcurve, mapcurve, dehatransmissionCurve, dehagaintransmissionCurve, dehacontlutili, mapcontlutili, useHsl, dummy, dummy ); @@ -998,7 +998,7 @@ private: } autor = -9000.f; // This will ask to compute the "auto" values for the B&W tool (have to be inferior to -5000) - DCPProfile::ApplyState as; + DCPProfileApplyState as; DCPProfile *dcpProf = imgsrc->getDCP (params.icm, as); LUTu histToneCurve; From 1d51016bdde96e08be9c553967eae87c41f3e223 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Wed, 30 Oct 2019 14:07:49 +0100 Subject: [PATCH 106/208] Fix some lgtm issues --- rtengine/CA_correct_RT.cc | 2 +- rtengine/array2D.h | 2 +- rtengine/capturesharpening.cc | 4 ++-- rtengine/cfa_linedn_RT.cc | 2 +- rtengine/demosaic_algos.cc | 16 ++++++++-------- rtengine/pixelshift.cc | 4 ++-- rtengine/tmo_fattal02.cc | 4 ++-- rtengine/vng4_demosaic_RT.cc | 2 +- 8 files changed, 18 insertions(+), 18 deletions(-) diff --git a/rtengine/CA_correct_RT.cc b/rtengine/CA_correct_RT.cc index a2d68402f..05fd806ca 100644 --- a/rtengine/CA_correct_RT.cc +++ b/rtengine/CA_correct_RT.cc @@ -198,7 +198,7 @@ float* RawImageSource::CA_correct_RT( //block CA shift values and weight assigned to block float* const blockwt = buffer + (height * width); - memset(blockwt, 0, vblsz * hblsz * (2 * 2 + 1) * sizeof(float)); + memset(blockwt, 0, static_cast(vblsz) * hblsz * (2 * 2 + 1) * sizeof(float)); float (*blockshifts)[2][2] = (float (*)[2][2])(blockwt + vblsz * hblsz); // Because we can't break parallel processing, we need a switch do handle the errors diff --git a/rtengine/array2D.h b/rtengine/array2D.h index 7713cd55c..d25e20a83 100644 --- a/rtengine/array2D.h +++ b/rtengine/array2D.h @@ -249,7 +249,7 @@ public: ar_realloc(w, h, offset); if (flags & ARRAY2D_CLEAR_DATA) { - memset(data + offset, 0, w * h * sizeof(T)); + memset(data + offset, 0, static_cast(w) * h * sizeof(T)); } } diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index 4eeca1f15..bbc0be50b 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -583,10 +583,10 @@ BENCHFUN } else { if (sigmaCornerOffset != 0.0) { const float distance = sqrt(rtengine::SQR(i + tileSize / 2 - H / 2) + rtengine::SQR(j + tileSize / 2 - W / 2)); - const float sigmaTile = sigma + distanceFactor * distance; + const float sigmaTile = static_cast(sigma) + distanceFactor * distance; if (sigmaTile >= 0.4f) { float lkernel7[7][7]; - compute7x7kernel(sigma + distanceFactor * distance, lkernel7); + compute7x7kernel(static_cast(sigma) + distanceFactor * distance, lkernel7); for (int k = 0; k < iterations - 1; ++k) { // apply 7x7 gaussian blur and divide luminance by result of gaussian blur gauss7x7div(tmpIThr, tmpThr, lumThr, fullTileSize, fullTileSize, lkernel7); diff --git a/rtengine/cfa_linedn_RT.cc b/rtengine/cfa_linedn_RT.cc index 3aef79133..ba26740c1 100644 --- a/rtengine/cfa_linedn_RT.cc +++ b/rtengine/cfa_linedn_RT.cc @@ -62,7 +62,7 @@ void RawImageSource::CLASS cfa_linedn(float noise, bool horizontal, bool vertica // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% float noisevar = SQR(3 * noise * 65535); // _noise_ (as a fraction of saturation) is input to the algorithm float noisevarm4 = 4.0f * noisevar; - float* RawDataTmp = (float*)malloc( width * height * sizeof(float)); + float* RawDataTmp = (float*)malloc(static_cast(width) * height * sizeof(float)); #ifdef _OPENMP #pragma omp parallel #endif diff --git a/rtengine/demosaic_algos.cc b/rtengine/demosaic_algos.cc index 52e15be54..f1b9cb5e8 100644 --- a/rtengine/demosaic_algos.cc +++ b/rtengine/demosaic_algos.cc @@ -77,7 +77,7 @@ void RawImageSource::ppg_demosaic() plistener->setProgress (0.0); } - image = (float (*)[4]) calloc (H * W, sizeof * image); + image = (float (*)[4]) calloc (static_cast(H) * W, sizeof * image); for (int ii = 0; ii < H; ii++) for (int jj = 0; jj < W; jj++) { @@ -375,9 +375,9 @@ void RawImageSource::jdl_interpolate_omp() // from "Lassus" int row, col, c, d, i, u = width, v = 2 * u, w = 3 * u, x = 4 * u, y = 5 * u, z = 6 * u, indx, (*dif)[2], (*chr)[2]; float f[4], g[4]; float (*image)[4]; - image = (float (*)[4]) calloc (width * height, sizeof * image); - dif = (int (*)[2]) calloc(width * height, sizeof * dif); - chr = (int (*)[2]) calloc(width * height, sizeof * chr); + image = (float (*)[4]) calloc (static_cast(width) * height, sizeof * image); + dif = (int (*)[2]) calloc(static_cast(width) * height, sizeof * dif); + chr = (int (*)[2]) calloc(static_cast(width) * height, sizeof * chr); if (plistener) { // this function seems to be unused @@ -542,14 +542,14 @@ void RawImageSource::lmmse_interpolate_omp(int winw, int winh, array2D &r float *rix[5]; float *qix[5]; - float *buffer = (float *)calloc(rr1 * cc1 * 5 * sizeof(float), 1); + float *buffer = (float *)calloc(static_cast(rr1) * cc1 * 5 * sizeof(float), 1); if(buffer == nullptr) { // allocation of big block of memory failed, try to get 5 smaller ones printf("lmmse_interpolate_omp: allocation of big memory block failed, try to get 5 smaller ones now...\n"); bool allocationFailed = false; for(int i = 0; i < 5; i++) { - qix[i] = (float *)calloc(rr1 * cc1 * sizeof(float), 1); + qix[i] = (float *)calloc(static_cast(rr1) * cc1 * sizeof(float), 1); if(!qix[i]) { // allocation of at least one small block failed allocationFailed = true; @@ -1144,7 +1144,7 @@ void RawImageSource::igv_interpolate(int winw, int winh) vdif = (float (*)) calloc( width * height / 2, sizeof * vdif ); hdif = (float (*)) calloc( width * height / 2, sizeof * hdif ); - chrarray = (float (*)) calloc( width * height, sizeof( float ) ); + chrarray = (float (*)) calloc(static_cast(width) * height, sizeof( float ) ); chr[0] = chrarray; chr[1] = chrarray + (width * height) / 2; @@ -2039,7 +2039,7 @@ void RawImageSource::refinement_lassus(int PassCount) t1e.set(); int u = W, v = 2 * u, w = 3 * u, x = 4 * u, y = 5 * u; float (*image)[3]; - image = (float(*)[3]) calloc(W * H, sizeof * image); + image = (float(*)[3]) calloc(static_cast(W) * H, sizeof * image); #ifdef _OPENMP #pragma omp parallel shared(image) #endif diff --git a/rtengine/pixelshift.cc b/rtengine/pixelshift.cc index ca5e742fb..9cb5844c2 100644 --- a/rtengine/pixelshift.cc +++ b/rtengine/pixelshift.cc @@ -114,9 +114,9 @@ void xorMasks(int xStart, int xEnd, int yStart, int yEnd, const array2D } } -void floodFill4Impl(int y, int x, int xStart, int xEnd, int yStart, int yEnd, array2D &mask, std::stack, std::vector>> &coordStack) +void floodFill4Impl(int yin, int xin, int xStart, int xEnd, int yStart, int yEnd, array2D &mask, std::stack, std::vector>> &coordStack) { - coordStack.emplace(x, y); + coordStack.emplace(xin, yin); while(!coordStack.empty()) { auto coord = coordStack.top(); diff --git a/rtengine/tmo_fattal02.cc b/rtengine/tmo_fattal02.cc index f1822b486..31671bd0c 100644 --- a/rtengine/tmo_fattal02.cc +++ b/rtengine/tmo_fattal02.cc @@ -1094,7 +1094,7 @@ void ImProcFunctions::ToneMapFattal02 (Imagefloat *rgb) float oldMedian; const float percentile = float(LIM(params->fattal.anchor, 1, 100)) / 100.f; - findMinMaxPercentile (Yr.data(), Yr.getRows() * Yr.getCols(), percentile, oldMedian, percentile, oldMedian, multiThread); + findMinMaxPercentile (Yr.data(), static_cast(Yr.getRows()) * Yr.getCols(), percentile, oldMedian, percentile, oldMedian, multiThread); // median filter on the deep shadows, to avoid boosting noise // because w2 >= w and h2 >= h, we can use the L buffer as temporary buffer for Median_Denoise() int w2 = find_fast_dim (w) + 1; @@ -1136,7 +1136,7 @@ void ImProcFunctions::ToneMapFattal02 (Imagefloat *rgb) const float wr = float(w2) / float(w); float newMedian; - findMinMaxPercentile (L.data(), L.getRows() * L.getCols(), percentile, newMedian, percentile, newMedian, multiThread); + findMinMaxPercentile (L.data(), static_cast(L.getRows()) * L.getCols(), percentile, newMedian, percentile, newMedian, multiThread); const float scale = (oldMedian == 0.f || newMedian == 0.f) ? 65535.f : (oldMedian / newMedian); // avoid Nan #ifdef _OPENMP diff --git a/rtengine/vng4_demosaic_RT.cc b/rtengine/vng4_demosaic_RT.cc index 384ec3219..aaaa1b9a6 100644 --- a/rtengine/vng4_demosaic_RT.cc +++ b/rtengine/vng4_demosaic_RT.cc @@ -103,7 +103,7 @@ void RawImageSource::vng4_demosaic (const array2D &rawData, array2D(height) * width, sizeof * image); int lcode[16][16][32]; float mul[16][16][8]; From ba8dda18365a8eb4db65b372fda5d2c0686c0fb3 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Wed, 30 Oct 2019 16:38:02 +0100 Subject: [PATCH 107/208] Further cleanup of include dependencies --- rtengine/dcp.cc | 1 + rtengine/iccstore.cc | 1 + rtengine/improccoordinator.cc | 2 ++ rtengine/iplab2rgb.cc | 1 - rtengine/ipwavelet.cc | 2 +- rtengine/procparams.h | 2 +- rtengine/rawimagesource.cc | 1 + rtengine/rtthumbnail.cc | 2 -- rtgui/batchqueue.h | 1 - rtgui/batchtoolpanelcoord.h | 3 ++- rtgui/blackwhite.cc | 1 + rtgui/colorappearance.cc | 1 + rtgui/colortoning.cc | 1 + rtgui/crop.cc | 2 -- rtgui/cropwindow.h | 6 +++++- rtgui/cursormanager.cc | 1 - rtgui/curveeditorgroup.cc | 1 + rtgui/defringe.cc | 1 + rtgui/diagonalcurveeditorsubgroup.cc | 1 + rtgui/dirpyrdenoise.cc | 4 ++-- rtgui/dirpyrdenoise.h | 1 - rtgui/filebrowser.cc | 2 -- rtgui/flatcurveeditorsubgroup.cc | 1 + rtgui/histogrampanel.cc | 2 -- rtgui/hsvequalizer.cc | 2 ++ rtgui/iccprofilecreator.cc | 2 -- rtgui/iccprofilecreator.h | 1 - rtgui/icmpanel.cc | 2 -- rtgui/inspector.cc | 2 -- rtgui/labcurve.cc | 2 ++ rtgui/lockablecolorpicker.cc | 2 -- rtgui/main-cli.cc | 2 -- rtgui/main.cc | 2 -- rtgui/mycurve.h | 1 - rtgui/navigator.cc | 2 -- rtgui/options.cc | 1 + rtgui/options.h | 12 +++++++----- rtgui/preferences.cc | 1 - rtgui/renamedlg.cc | 1 - rtgui/retinex.cc | 1 + rtgui/rgbcurves.cc | 2 ++ rtgui/rtimage.cc | 1 + rtgui/rtscalable.cc | 3 ++- rtgui/saveasdlg.cc | 2 -- rtgui/saveasdlg.h | 1 - rtgui/thumbnail.h | 1 - rtgui/tonecurve.cc | 1 + rtgui/vibrance.cc | 1 + rtgui/wavelet.cc | 2 +- rtgui/wavelet.h | 1 - 50 files changed, 44 insertions(+), 48 deletions(-) diff --git a/rtengine/dcp.cc b/rtengine/dcp.cc index 549fcf150..9dbee9375 100644 --- a/rtengine/dcp.cc +++ b/rtengine/dcp.cc @@ -31,6 +31,7 @@ #include "imagefloat.h" #include "rawimagesource.h" #include "rt_math.h" +#include "../rtgui/options.h" namespace rtengine { diff --git a/rtengine/iccstore.cc b/rtengine/iccstore.cc index 7151e244d..02a1fffac 100644 --- a/rtengine/iccstore.cc +++ b/rtengine/iccstore.cc @@ -35,6 +35,7 @@ #include "iccmatrices.h" +#include "../rtgui/guiutils.h" #include "../rtgui/options.h" #include "../rtgui/threadutils.h" #include "lcms2_plugin.h" diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index b55c6ee75..090c3376d 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -36,12 +36,14 @@ #include "procparams.h" #include "refreshmap.h" +#include "../rtgui/options.h" #include "../rtgui/ppversion.h" #ifdef _OPENMP #include #endif + namespace rtengine { diff --git a/rtengine/iplab2rgb.cc b/rtengine/iplab2rgb.cc index f2b337e01..6166c928e 100644 --- a/rtengine/iplab2rgb.cc +++ b/rtengine/iplab2rgb.cc @@ -24,7 +24,6 @@ #include #include "iccstore.h" #include "iccmatrices.h" -#include "../rtgui/options.h" #include "settings.h" #include "alignedbuffer.h" #include "color.h" diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 4cd16f90b..2ba6ec97b 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -42,6 +42,7 @@ #include "rt_math.h" #include "rtengine.h" #include "sleef.c" +#include "../rtgui/options.h" #ifdef _OPENMP #include @@ -56,7 +57,6 @@ #define epsilon 0.001f/(TS*TS) //tolerance - namespace rtengine { diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 57c27063e..015b487ff 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -20,11 +20,11 @@ #include #include +#include #include #include #include -#include #include #include "noncopyable.h" diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 7d101ff5d..347331467 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -40,6 +40,7 @@ #include "rt_math.h" #include "rtengine.h" #include "rtlensfun.h" +#include "../rtgui/options.h" //#define BENCHMARK //#include "StopWatch.h" diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index d10e2b1dc..4a7fb2d11 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -191,8 +191,6 @@ void scale_colors (rtengine::RawImage *ri, float scale_mul[4], float cblack[4], } -extern Options options; - namespace rtengine { diff --git a/rtgui/batchqueue.h b/rtgui/batchqueue.h index f61b7b5c4..7248ac793 100644 --- a/rtgui/batchqueue.h +++ b/rtgui/batchqueue.h @@ -26,7 +26,6 @@ #include "batchqueueentry.h" #include "lwbuttonset.h" -#include "options.h" #include "threadutils.h" #include "thumbbrowserbase.h" #include "../rtengine/noncopyable.h" diff --git a/rtgui/batchtoolpanelcoord.h b/rtgui/batchtoolpanelcoord.h index f03d1d4b2..53741be49 100644 --- a/rtgui/batchtoolpanelcoord.h +++ b/rtgui/batchtoolpanelcoord.h @@ -22,7 +22,8 @@ #include "thumbnail.h" #include "toolpanelcoord.h" #include "fileselectionchangelistener.h" -#include "../rtengine/rtengine.h" +#include "../rtengine/procparams.h" +#include "../rtengine/procevents.h" #include "paramsedited.h" #include "thumbnaillistener.h" diff --git a/rtgui/blackwhite.cc b/rtgui/blackwhite.cc index b5ecb96bd..482bf437f 100644 --- a/rtgui/blackwhite.cc +++ b/rtgui/blackwhite.cc @@ -23,6 +23,7 @@ #include "guiutils.h" #include "rtimage.h" +#include "options.h" #include "../rtengine/color.h" #include "../rtengine/procparams.h" diff --git a/rtgui/colorappearance.cc b/rtgui/colorappearance.cc index f8eb736d4..0d155e97b 100644 --- a/rtgui/colorappearance.cc +++ b/rtgui/colorappearance.cc @@ -21,6 +21,7 @@ #include "colorappearance.h" #include "guiutils.h" +#include "options.h" #include "../rtengine/color.h" #include "../rtengine/procparams.h" diff --git a/rtgui/colortoning.cc b/rtgui/colortoning.cc index e164739e5..f177602a3 100644 --- a/rtgui/colortoning.cc +++ b/rtgui/colortoning.cc @@ -6,6 +6,7 @@ #include "rtimage.h" #include "eventmapper.h" #include "labgrid.h" +#include "options.h" using namespace rtengine; using namespace rtengine::procparams; diff --git a/rtgui/crop.cc b/rtgui/crop.cc index b1780538e..3bdcf14cf 100644 --- a/rtgui/crop.cc +++ b/rtgui/crop.cc @@ -26,8 +26,6 @@ using namespace rtengine; using namespace rtengine::procparams; -extern Options options; - namespace { diff --git a/rtgui/cropwindow.h b/rtgui/cropwindow.h index 99b0fd897..be07db5c9 100644 --- a/rtgui/cropwindow.h +++ b/rtgui/cropwindow.h @@ -19,7 +19,6 @@ #ifndef _CROPWINDOW_ #define _CROPWINDOW_ -#include "../rtengine/rtengine.h" #include #include "lwbutton.h" #include "lwbuttonset.h" @@ -33,6 +32,11 @@ #include "editcoordsys.h" #include "../rtengine/noncopyable.h" +namespace rtengine { + +class Coord; + +} class CropWindow; class CropWindowListener diff --git a/rtgui/cursormanager.cc b/rtgui/cursormanager.cc index 76b4eabfb..e915150aa 100644 --- a/rtgui/cursormanager.cc +++ b/rtgui/cursormanager.cc @@ -18,7 +18,6 @@ */ #include "cursormanager.h" -#include "options.h" #include "rtimage.h" CursorManager mainWindowCursorManager; diff --git a/rtgui/curveeditorgroup.cc b/rtgui/curveeditorgroup.cc index 0e7205518..edad0349d 100644 --- a/rtgui/curveeditorgroup.cc +++ b/rtgui/curveeditorgroup.cc @@ -25,6 +25,7 @@ #include "flatcurveeditorsubgroup.h" #include "multilangmgr.h" #include "rtimage.h" +#include "options.h" CurveEditorGroup::CurveEditorGroup (Glib::ustring& curveDir, Glib::ustring groupLabel) : curveDir(curveDir), line(0), curve_reset(nullptr), displayedCurve(nullptr), flatSubGroup(nullptr), diagonalSubGroup(nullptr), cl(nullptr), numberOfPackedCurve(0) diff --git a/rtgui/defringe.cc b/rtgui/defringe.cc index 659d41960..8aa79dddd 100644 --- a/rtgui/defringe.cc +++ b/rtgui/defringe.cc @@ -20,6 +20,7 @@ #include #include "defringe.h" +#include "options.h" #include "../rtengine/procparams.h" diff --git a/rtgui/diagonalcurveeditorsubgroup.cc b/rtgui/diagonalcurveeditorsubgroup.cc index 21b42a6ce..cece9be66 100644 --- a/rtgui/diagonalcurveeditorsubgroup.cc +++ b/rtgui/diagonalcurveeditorsubgroup.cc @@ -31,6 +31,7 @@ #include "curveeditor.h" #include "diagonalcurveeditorsubgroup.h" #include "rtimage.h" +#include "options.h" #include "../rtengine/curves.h" diff --git a/rtgui/dirpyrdenoise.cc b/rtgui/dirpyrdenoise.cc index 2a0bba596..dd695eecf 100644 --- a/rtgui/dirpyrdenoise.cc +++ b/rtgui/dirpyrdenoise.cc @@ -21,14 +21,14 @@ #include "dirpyrdenoise.h" +#include "editbuffer.h" #include "guiutils.h" +#include "options.h" #include "../rtengine/procparams.h" -#include "editbuffer.h" using namespace rtengine; using namespace rtengine::procparams; -extern Options options; DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this, "dirpyrdenoise", M("TP_DIRPYRDENOISE_LABEL"), true, true), lastmedian(false) { diff --git a/rtgui/dirpyrdenoise.h b/rtgui/dirpyrdenoise.h index a513eb262..05304e4f7 100644 --- a/rtgui/dirpyrdenoise.h +++ b/rtgui/dirpyrdenoise.h @@ -26,7 +26,6 @@ #include "curveeditorgroup.h" #include "colorprovider.h" #include "guiutils.h" -#include "options.h" class EditDataProvider; diff --git a/rtgui/filebrowser.cc b/rtgui/filebrowser.cc index d4f5bb8ca..5817222dd 100644 --- a/rtgui/filebrowser.cc +++ b/rtgui/filebrowser.cc @@ -37,8 +37,6 @@ #include "../rtengine/ffmanager.h" #include "../rtengine/procparams.h" -extern Options options; - namespace { diff --git a/rtgui/flatcurveeditorsubgroup.cc b/rtgui/flatcurveeditorsubgroup.cc index 6dc3a1f5b..b5dc4f726 100644 --- a/rtgui/flatcurveeditorsubgroup.cc +++ b/rtgui/flatcurveeditorsubgroup.cc @@ -32,6 +32,7 @@ #include "curveeditor.h" #include "flatcurveeditorsubgroup.h" #include "rtimage.h" +#include "options.h" #include "../rtengine/curves.h" diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 74e473096..ddf60ca75 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -28,8 +28,6 @@ using namespace rtengine; -extern Options options; - // // diff --git a/rtgui/hsvequalizer.cc b/rtgui/hsvequalizer.cc index b6b5b04f2..b570a23ac 100644 --- a/rtgui/hsvequalizer.cc +++ b/rtgui/hsvequalizer.cc @@ -18,6 +18,8 @@ */ #include "hsvequalizer.h" +#include "options.h" + #include "../rtengine/color.h" #include "../rtengine/procparams.h" diff --git a/rtgui/iccprofilecreator.cc b/rtgui/iccprofilecreator.cc index 2728a7611..0ac0b79f3 100644 --- a/rtgui/iccprofilecreator.cc +++ b/rtgui/iccprofilecreator.cc @@ -29,8 +29,6 @@ #include #endif -extern Options options; - namespace rtengine { diff --git a/rtgui/iccprofilecreator.h b/rtgui/iccprofilecreator.h index b28ac29f2..950fcc01f 100644 --- a/rtgui/iccprofilecreator.h +++ b/rtgui/iccprofilecreator.h @@ -21,7 +21,6 @@ #include #include "adjuster.h" -#include "options.h" #include #include "rtwindow.h" diff --git a/rtgui/icmpanel.cc b/rtgui/icmpanel.cc index 012aeca78..99bd6cfca 100644 --- a/rtgui/icmpanel.cc +++ b/rtgui/icmpanel.cc @@ -32,8 +32,6 @@ using namespace rtengine; using namespace rtengine::procparams; -extern Options options; - ICMPanel::ICMPanel() : FoldableToolPanel(this, "icm", M("TP_ICM_LABEL")), iunchanged(nullptr), icmplistener(nullptr) { auto m = ProcEventMapper::getInstance(); diff --git a/rtgui/inspector.cc b/rtgui/inspector.cc index 8bd9862a7..ad2e424ec 100644 --- a/rtgui/inspector.cc +++ b/rtgui/inspector.cc @@ -24,8 +24,6 @@ #include "options.h" #include "../rtengine/previewimage.h" -extern Options options; - InspectorBuffer::InspectorBuffer(const Glib::ustring &imagePath) : currTransform(0), fromRaw(false) { if (!imagePath.empty() && Glib::file_test(imagePath, Glib::FILE_TEST_EXISTS) && !Glib::file_test(imagePath, Glib::FILE_TEST_IS_DIR)) { diff --git a/rtgui/labcurve.cc b/rtgui/labcurve.cc index 237f9ea9b..fd1065269 100644 --- a/rtgui/labcurve.cc +++ b/rtgui/labcurve.cc @@ -20,6 +20,8 @@ #include "labcurve.h" +#include "options.h" + #include "../rtengine/improcfun.h" #include "../rtengine/procparams.h" #include "editcallbacks.h" diff --git a/rtgui/lockablecolorpicker.cc b/rtgui/lockablecolorpicker.cc index ef16df6ec..a4f3dbdab 100644 --- a/rtgui/lockablecolorpicker.cc +++ b/rtgui/lockablecolorpicker.cc @@ -25,8 +25,6 @@ #include "multilangmgr.h" #include "navigator.h" -extern Options options; - LockableColorPicker::LockableColorPicker (CropWindow* cropWindow, Glib::ustring *oProfile, Glib::ustring *wProfile) : cropWindow(cropWindow), displayedValues(ColorPickerType::RGB), position(0, 0), size(Size::S15), outputProfile(oProfile), workingProfile(wProfile), validity(Validity::OUTSIDE), diff --git a/rtgui/main-cli.cc b/rtgui/main-cli.cc index 09aab1cff..8310867df 100644 --- a/rtgui/main-cli.cc +++ b/rtgui/main-cli.cc @@ -55,8 +55,6 @@ // Set this to 1 to make RT work when started with Eclipse and arguments, at least on Windows platform #define ECLIPSE_ARGS 0 -extern Options options; - // stores path to data files Glib::ustring argv0; Glib::ustring creditsPath; diff --git a/rtgui/main.cc b/rtgui/main.cc index 631d3db0a..997f20732 100644 --- a/rtgui/main.cc +++ b/rtgui/main.cc @@ -53,8 +53,6 @@ // Set this to 1 to make RT work when started with Eclipse and arguments, at least on Windows platform #define ECLIPSE_ARGS 0 -extern Options options; - // stores path to data files Glib::ustring argv0; Glib::ustring creditsPath; diff --git a/rtgui/mycurve.h b/rtgui/mycurve.h index fd22660ea..b5577e8dd 100644 --- a/rtgui/mycurve.h +++ b/rtgui/mycurve.h @@ -26,7 +26,6 @@ #include "coloredbar.h" #include "coordinateadjuster.h" #include "../rtengine/LUT.h" -#include "options.h" #include "../rtengine/noncopyable.h" #define RADIUS 3.5 /** radius of the control points ; must be x.5 to target the center of a pixel */ diff --git a/rtgui/navigator.cc b/rtgui/navigator.cc index 50946f32f..6a8137737 100644 --- a/rtgui/navigator.cc +++ b/rtgui/navigator.cc @@ -23,8 +23,6 @@ #include "../rtengine/rt_math.h" #include "options.h" -extern Options options; - using namespace rtengine; Navigator::Navigator () : currentRGBUnit(options.navRGBUnit), currentHSVUnit(options.navHSVUnit) diff --git a/rtgui/options.cc b/rtgui/options.cc index 9757fa3b7..8d8d52c83 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -19,6 +19,7 @@ #include "options.h" #include #include +#include #include #include #include "multilangmgr.h" diff --git a/rtgui/options.h b/rtgui/options.h index 990a32228..b2263f59c 100644 --- a/rtgui/options.h +++ b/rtgui/options.h @@ -16,12 +16,11 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _OPTIONS_ -#define _OPTIONS_ +#pragma once #include #include -#include "../rtengine/rtengine.h" +#include "../rtengine/settings.h" #include #define STARTUPDIR_CURRENT 0 @@ -103,6 +102,11 @@ enum PPLoadLocation {PLL_Cache = 0, PLL_Input = 1}; enum CPBKeyType {CPBKT_TID = 0, CPBKT_NAME = 1, CPBKT_TID_NAME = 2}; enum prevdemo_t {PD_Sidecar = 1, PD_Fast = 0}; +namespace Glib { + +class KeyFile; + +} class Options { public: @@ -447,5 +451,3 @@ extern bool gimpPlugin; extern bool remote; extern Glib::ustring versionString; extern Glib::ustring paramFileExtension; - -#endif diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index 3c0d1bedc..2676e0940 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -50,7 +50,6 @@ void placeSpinBox(Gtk::Container* where, Gtk::SpinButton* &spin, const std::stri } } -extern Options options; extern Glib::ustring argv0; Glib::RefPtr themecss; Glib::RefPtr fontcss; diff --git a/rtgui/renamedlg.cc b/rtgui/renamedlg.cc index 8f55b3653..81bcd86e5 100644 --- a/rtgui/renamedlg.cc +++ b/rtgui/renamedlg.cc @@ -18,7 +18,6 @@ */ #include "renamedlg.h" #include "multilangmgr.h" -#include "options.h" #include "rtimage.h" RenameDialog::RenameDialog (Gtk::Window* parent) diff --git a/rtgui/retinex.cc b/rtgui/retinex.cc index e074d7e9c..dddf1da20 100644 --- a/rtgui/retinex.cc +++ b/rtgui/retinex.cc @@ -4,6 +4,7 @@ #include "retinex.h" #include "mycurve.h" #include "rtimage.h" +#include "options.h" using namespace rtengine; using namespace rtengine::procparams; diff --git a/rtgui/rgbcurves.cc b/rtgui/rgbcurves.cc index 2350783e0..7af6cab97 100644 --- a/rtgui/rgbcurves.cc +++ b/rtgui/rgbcurves.cc @@ -18,6 +18,8 @@ */ #include "rgbcurves.h" +#include "options.h" + #include "../rtengine/procparams.h" using namespace rtengine; diff --git a/rtgui/rtimage.cc b/rtgui/rtimage.cc index e35a6d164..ff27dbbd3 100644 --- a/rtgui/rtimage.cc +++ b/rtgui/rtimage.cc @@ -20,6 +20,7 @@ #include "rtimage.h" +#include #include #include "options.h" diff --git a/rtgui/rtscalable.cc b/rtgui/rtscalable.cc index fa92655ac..b803ab270 100644 --- a/rtgui/rtscalable.cc +++ b/rtgui/rtscalable.cc @@ -25,11 +25,12 @@ #include #include "options.h" +#include "../rtengine/rt_math.h" + double RTScalable::dpi = 0.; int RTScalable::scale = 0; extern Glib::ustring argv0; -extern Options options; extern unsigned char initialGdkScale; extern float fontScale; Gtk::TextDirection RTScalable::direction = Gtk::TextDirection::TEXT_DIR_NONE; diff --git a/rtgui/saveasdlg.cc b/rtgui/saveasdlg.cc index 1b61d7d3d..5516bdf7c 100644 --- a/rtgui/saveasdlg.cc +++ b/rtgui/saveasdlg.cc @@ -26,8 +26,6 @@ #include "../rtengine/utils.h" -extern Options options; - namespace { diff --git a/rtgui/saveasdlg.h b/rtgui/saveasdlg.h index dd120337d..4097a3ae9 100644 --- a/rtgui/saveasdlg.h +++ b/rtgui/saveasdlg.h @@ -22,7 +22,6 @@ #include #include "adjuster.h" #include "saveformatpanel.h" -#include "options.h" class SaveAsDialog : public Gtk::Dialog, public FormatChangeListener { diff --git a/rtgui/thumbnail.h b/rtgui/thumbnail.h index b1c45fdfa..cacffbd58 100644 --- a/rtgui/thumbnail.h +++ b/rtgui/thumbnail.h @@ -24,7 +24,6 @@ #include #include "cachemanager.h" -#include "options.h" #include "../rtengine/rtengine.h" #include "../rtengine/rtthumbnail.h" #include "cacheimagedata.h" diff --git a/rtgui/tonecurve.cc b/rtgui/tonecurve.cc index fa1c80ed8..1f660f72a 100644 --- a/rtgui/tonecurve.cc +++ b/rtgui/tonecurve.cc @@ -25,6 +25,7 @@ #include "adjuster.h" #include "eventmapper.h" #include "ppversion.h" +#include "options.h" #include "../rtengine/procparams.h" #include "editcallbacks.h" diff --git a/rtgui/vibrance.cc b/rtgui/vibrance.cc index 461c4a79f..67052785a 100644 --- a/rtgui/vibrance.cc +++ b/rtgui/vibrance.cc @@ -18,6 +18,7 @@ */ #include "vibrance.h" +#include "options.h" #include "../rtengine/color.h" using namespace rtengine; diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 94f96e0cc..6e49d36b9 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -23,10 +23,10 @@ #include "editcallbacks.h" #include "guiutils.h" #include "rtimage.h" +#include "options.h" using namespace rtengine; using namespace rtengine::procparams; -extern Options options; namespace { diff --git a/rtgui/wavelet.h b/rtgui/wavelet.h index feec85fc9..20a0ba4e5 100644 --- a/rtgui/wavelet.h +++ b/rtgui/wavelet.h @@ -27,7 +27,6 @@ #include "thresholdadjuster.h" #include "colorprovider.h" #include "guiutils.h" -#include "options.h" class EditDataProvider; From 4dcee23cb34d5e8b093fb6bf7788505bf0a74451 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Wed, 30 Oct 2019 18:06:30 +0100 Subject: [PATCH 108/208] Fix broken lgtm build --- rtengine/settings.h | 7 ++----- rtgui/options.h | 1 + 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/rtengine/settings.h b/rtengine/settings.h index 8852c05c8..a32a1b7dd 100644 --- a/rtengine/settings.h +++ b/rtengine/settings.h @@ -16,9 +16,9 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _RTSETTINGS_ -#define _RTSETTINGS_ +#pragma once +#include namespace rtengine { @@ -97,6 +97,3 @@ public: static void destroy(Settings* s); }; } - -#endif - diff --git a/rtgui/options.h b/rtgui/options.h index b2263f59c..33d6b6f90 100644 --- a/rtgui/options.h +++ b/rtgui/options.h @@ -19,6 +19,7 @@ #pragma once #include +#include #include #include "../rtengine/settings.h" #include From 6935faa2583762d0ae383c302f09b75b965beb72 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Wed, 30 Oct 2019 22:12:06 +0100 Subject: [PATCH 109/208] Further cleanup of include dependencies --- rtengine/CA_correct_RT.cc | 5 +---- rtengine/FTblockDN.cc | 4 ---- rtengine/camconst.cc | 2 -- rtengine/ciecam02.cc | 4 ---- rtengine/color.cc | 2 -- rtengine/colortemp.cc | 2 -- rtengine/dcp.cc | 9 +-------- rtengine/dcrop.cc | 2 -- rtengine/demosaic_algos.cc | 2 -- rtengine/dfmanager.cc | 2 -- rtengine/dirpyr_equalizer.cc | 2 -- rtengine/dynamicprofile.cc | 6 +++--- rtengine/ffmanager.cc | 2 -- rtengine/filmnegativeproc.cc | 7 ------- rtengine/filmnegativethumb.cc | 8 -------- rtengine/hilite_recon.cc | 2 -- rtengine/iccstore.cc | 7 +------ rtengine/imageio.cc | 2 +- rtengine/improccoordinator.cc | 2 -- rtengine/improcfun.cc | 2 -- rtengine/init.cc | 2 +- rtengine/ipdehaze.cc | 10 +++++----- rtengine/iplab2rgb.cc | 2 -- rtengine/ipsharpen.cc | 2 -- rtengine/ipwavelet.cc | 2 -- rtengine/lcp.cc | 7 ------- rtengine/profilestore.cc | 12 ++++++------ rtengine/rawimage.cc | 2 -- rtengine/rawimagesource.cc | 1 - rtengine/rtengine.h | 2 +- rtengine/rtthumbnail.cc | 19 ++++++++----------- rtengine/settings.h | 1 + rtengine/shmap.cc | 2 -- rtengine/simpleprocess.cc | 1 - rtengine/stdimagesource.cc | 2 -- rtgui/adjuster.cc | 2 +- rtgui/cacheimagedata.cc | 11 ++++++----- rtgui/cachemanager.cc | 10 +++++----- rtgui/colorappearance.cc | 1 + rtgui/dirbrowser.cc | 4 ++-- rtgui/dynamicprofilepanel.cc | 4 ++-- rtgui/editwindow.h | 1 + rtgui/extprog.cc | 4 ++-- rtgui/fattaltonemap.cc | 1 + rtgui/filecatalog.cc | 4 ++-- rtgui/guiutils.h | 14 ++++++++++++-- rtgui/iccprofilecreator.cc | 7 ------- rtgui/inspector.cc | 1 + rtgui/inspector.h | 2 ++ rtgui/labgrid.cc | 1 + rtgui/lensprofile.cc | 10 +++++----- rtgui/main.cc | 2 +- rtgui/mycurve.cc | 1 + rtgui/mycurve.h | 1 + rtgui/mydiagonalcurve.cc | 1 + rtgui/myflatcurve.cc | 1 + rtgui/options.cc | 1 + rtgui/profilepanel.h | 3 ++- rtgui/rtimage.cc | 4 ++-- rtgui/rtscalable.cc | 4 ++-- rtgui/rtwindow.cc | 8 ++++---- rtgui/shcselector.cc | 3 +++ rtgui/thresholdselector.cc | 1 + rtgui/thumbnail.cc | 4 ++-- rtgui/toolbar.cc | 1 + rtgui/toolbar.h | 3 ++- rtgui/toolpanel.cc | 1 + rtgui/toolpanelcoord.cc | 1 + 68 files changed, 100 insertions(+), 158 deletions(-) diff --git a/rtengine/CA_correct_RT.cc b/rtengine/CA_correct_RT.cc index 05fd806ca..36b2fa05f 100644 --- a/rtengine/CA_correct_RT.cc +++ b/rtengine/CA_correct_RT.cc @@ -28,6 +28,7 @@ #include "gauss.h" #include "median.h" #include "StopWatch.h" + namespace { bool LinEqSolve(int nDim, double* pfMatr, double* pfVect, double* pfSolution) @@ -106,10 +107,6 @@ bool LinEqSolve(int nDim, double* pfMatr, double* pfVect, double* pfSolution) //end of linear equation solver } -namespace rtengine { - extern const Settings* settings; -} - using namespace std; using namespace rtengine; diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index b708f521a..02164aded 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -78,11 +78,7 @@ namespace rtengine */ -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -extern const Settings* settings; extern MyMutex *fftwMutex; diff --git a/rtengine/camconst.cc b/rtengine/camconst.cc index 93f0057f1..e8f7b1cbf 100644 --- a/rtengine/camconst.cc +++ b/rtengine/camconst.cc @@ -20,8 +20,6 @@ namespace rtengine { -extern const Settings* settings; - CameraConst::CameraConst() : pdafOffset(0) { memset(dcraw_matrix, 0, sizeof(dcraw_matrix)); diff --git a/rtengine/ciecam02.cc b/rtengine/ciecam02.cc index 3219884ad..0553c129e 100644 --- a/rtengine/ciecam02.cc +++ b/rtengine/ciecam02.cc @@ -34,10 +34,6 @@ namespace rtengine { -#ifdef _DEBUG -extern const Settings* settings; -#endif - void Ciecam02::curvecolorfloat (float satind, float satval, float &sres, float parsat) { if (satind > 0.f) { diff --git a/rtengine/color.cc b/rtengine/color.cc index 7a91f0073..20b2c7310 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -30,8 +30,6 @@ using namespace std; namespace rtengine { -extern const Settings* settings; - cmsToneCurve* Color::linearGammaTRC; LUTf Color::cachef; LUTf Color::cachefy; diff --git a/rtengine/colortemp.cc b/rtengine/colortemp.cc index 927d8423d..413880d49 100644 --- a/rtengine/colortemp.cc +++ b/rtengine/colortemp.cc @@ -31,8 +31,6 @@ namespace rtengine { -extern const Settings* settings; - static const double cie_colour_match_jd[97][3] = {//350nm to 830nm 5 nm J.Desmis 2° Standard Observer. {0.0000000, 0.000000, 0.000000}, {0.0000000, 0.000000, 0.000000}, {0.0001299, 0.0003917, 0.0006061}, {0.0002321, 0.000006965, 0.001086}, {0.0004149, 0.00001239, 0.001946}, {0.0007416, 0.00002202, 0.003846}, diff --git a/rtengine/dcp.cc b/rtengine/dcp.cc index 9dbee9375..ea4e40514 100644 --- a/rtengine/dcp.cc +++ b/rtengine/dcp.cc @@ -33,13 +33,6 @@ #include "rt_math.h" #include "../rtgui/options.h" -namespace rtengine -{ - -extern const Settings* settings; - -} - using namespace rtengine; using namespace rtexif; @@ -1868,7 +1861,7 @@ DCPProfile* DCPStore::getProfile(const Glib::ustring& filename) const if (res->isValid()) { // Add profile profile_cache[key] = res; - if (options.rtSettings.verbose) { + if (settings->verbose) { printf("DCP profile '%s' loaded from disk\n", filename.c_str()); } return res; diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 819a6d01e..06c9d59bd 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -48,8 +48,6 @@ constexpr T skips(T a, T b) namespace rtengine { -extern const Settings* settings; - Crop::Crop(ImProcCoordinator* parent, EditDataProvider *editDataProvider, bool isDetailWindow) : PipetteBuffer(editDataProvider), origCrop(nullptr), laboCrop(nullptr), labnCrop(nullptr), cropImg (nullptr), transCrop (nullptr), cieCrop (nullptr), diff --git a/rtengine/demosaic_algos.cc b/rtengine/demosaic_algos.cc index f1b9cb5e8..823260129 100644 --- a/rtengine/demosaic_algos.cc +++ b/rtengine/demosaic_algos.cc @@ -40,8 +40,6 @@ using namespace std; namespace rtengine { -extern const Settings* settings; - #undef ABS #define ABS(a) ((a)<0?-(a):(a)) diff --git a/rtengine/dfmanager.cc b/rtengine/dfmanager.cc index fbeb2596e..f5a7686e6 100644 --- a/rtengine/dfmanager.cc +++ b/rtengine/dfmanager.cc @@ -29,8 +29,6 @@ namespace rtengine { -extern const Settings* settings; - // *********************** class dfInfo ************************************** inline dfInfo& dfInfo::operator =(const dfInfo &o) diff --git a/rtengine/dirpyr_equalizer.cc b/rtengine/dirpyr_equalizer.cc index d40f9fce6..6fd4f002c 100644 --- a/rtengine/dirpyr_equalizer.cc +++ b/rtengine/dirpyr_equalizer.cc @@ -350,8 +350,6 @@ void idirpyr_eq_channelcam(const float * const * data_coarse, const float * cons namespace rtengine { -extern const Settings* settings; - void ImProcFunctions::dirpyr_equalizer(const float * const * src, float ** dst, int srcwidth, int srcheight, const float * const * l_a, const float * const * l_b, const double * mult, const double dirpyrThreshold, const double skinprot, float b_l, float t_l, float t_r, int scaleprev) { //sequence of scales diff --git a/rtengine/dynamicprofile.cc b/rtengine/dynamicprofile.cc index 607b0b528..402610ed1 100644 --- a/rtengine/dynamicprofile.cc +++ b/rtengine/dynamicprofile.cc @@ -179,7 +179,7 @@ bool DynamicProfileRules::loadRules() return false; } - if (options.rtSettings.verbose) { + if (settings->verbose) { printf ("loading dynamic profiles...\n"); } @@ -198,7 +198,7 @@ bool DynamicProfileRules::loadRules() return false; } - if (options.rtSettings.verbose) { + if (settings->verbose) { printf (" loading rule %d\n", serial); } @@ -228,7 +228,7 @@ bool DynamicProfileRules::loadRules() bool DynamicProfileRules::storeRules() { - if (options.rtSettings.verbose) { + if (settings->verbose) { printf ("saving dynamic profiles...\n"); } diff --git a/rtengine/ffmanager.cc b/rtengine/ffmanager.cc index dbbc25b81..d8b082dd1 100644 --- a/rtengine/ffmanager.cc +++ b/rtengine/ffmanager.cc @@ -30,8 +30,6 @@ namespace rtengine { -extern const Settings* settings; - // *********************** class ffInfo ************************************** inline ffInfo& ffInfo::operator =(const ffInfo &o) diff --git a/rtengine/filmnegativeproc.cc b/rtengine/filmnegativeproc.cc index 26c1314f4..f373f8c14 100644 --- a/rtengine/filmnegativeproc.cc +++ b/rtengine/filmnegativeproc.cc @@ -36,13 +36,6 @@ //#define BENCHMARK #include "StopWatch.h" -namespace rtengine -{ - -extern const Settings* settings; - -} - namespace { diff --git a/rtengine/filmnegativethumb.cc b/rtengine/filmnegativethumb.cc index 6a4da31b0..1e52300d4 100644 --- a/rtengine/filmnegativethumb.cc +++ b/rtengine/filmnegativethumb.cc @@ -22,19 +22,11 @@ #include "rtthumbnail.h" #include "opthelper.h" #include "rt_algo.h" -#include "rtengine.h" #include "settings.h" #include "procparams.h" #define BENCHMARK #include "StopWatch.h" -namespace rtengine -{ - -extern const Settings* settings; - -} - void rtengine::Thumbnail::processFilmNegative( const procparams::ProcParams ¶ms, const Imagefloat* baseImg, diff --git a/rtengine/hilite_recon.cc b/rtengine/hilite_recon.cc index 35dd74463..697a5e3d3 100644 --- a/rtengine/hilite_recon.cc +++ b/rtengine/hilite_recon.cc @@ -288,8 +288,6 @@ void boxblur_resamp(const float* const* src, float** dst, float** temp, int H, i namespace rtengine { -extern const Settings* settings; - void RawImageSource::HLRecovery_inpaint(float** red, float** green, float** blue) { double progress = 0.0; diff --git a/rtengine/iccstore.cc b/rtengine/iccstore.cc index 02a1fffac..02fe4c16d 100644 --- a/rtengine/iccstore.cc +++ b/rtengine/iccstore.cc @@ -34,6 +34,7 @@ #include "iccstore.h" #include "iccmatrices.h" +#include "utils.h" #include "../rtgui/guiutils.h" #include "../rtgui/options.h" @@ -44,12 +45,6 @@ #include "cJSON.h" #define inkc_constant 0x696E6B43 -namespace rtengine -{ - -extern const Settings* settings; - -} namespace { diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index f335f5be8..c586aabaf 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -810,7 +810,7 @@ int ImageIO::loadTIFF (const Glib::ustring &fname) * TIFFTAG_SMAXSAMPLEVALUE, but for now, we normalize the image to the * effective minimum and maximum values */ - if (options.rtSettings.verbose) { + if (settings->verbose) { printf("Information of \"%s\":\n", fname.c_str()); uint16 tiffDefaultScale, tiffBaselineExposure, tiffLinearResponseLimit; if (TIFFGetField(in, TIFFTAG_DEFAULTSCALE, &tiffDefaultScale)) { diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 090c3376d..c61b37341 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -47,8 +47,6 @@ namespace rtengine { -extern const Settings* settings; - ImProcCoordinator::ImProcCoordinator() : orig_prev(nullptr), oprevi(nullptr), diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index c84027e6a..886e49567 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -267,8 +267,6 @@ namespace rtengine using namespace procparams; -extern const Settings* settings; - ImProcFunctions::~ImProcFunctions () { if (monitorTransform) { diff --git a/rtengine/init.cc b/rtengine/init.cc index 8d3ee96cb..453374e3a 100644 --- a/rtengine/init.cc +++ b/rtengine/init.cc @@ -42,7 +42,7 @@ const Settings* settings; MyMutex* lcmsMutex = nullptr; MyMutex *fftwMutex = nullptr; -int init (const Settings* s, Glib::ustring baseDir, Glib::ustring userSettingsDir, bool loadAll) +int init (const Settings* s, const Glib::ustring& baseDir, const Glib::ustring& userSettingsDir, bool loadAll) { settings = s; ProcParams::init(); diff --git a/rtengine/ipdehaze.cc b/rtengine/ipdehaze.cc index ce5843da8..729282dbe 100644 --- a/rtengine/ipdehaze.cc +++ b/rtengine/ipdehaze.cc @@ -200,7 +200,7 @@ float estimate_ambient_light(const array2D &R, const array2D &G, c } } - if (options.rtSettings.verbose) { + if (settings->verbose) { std::cout << "dehaze: computing ambient light from " << patches.size() << " patches" << std::endl; } @@ -284,7 +284,7 @@ void ImProcFunctions::dehaze(Imagefloat *img) const int H = img->getHeight(); const float strength = LIM01(float(params->dehaze.strength) / 100.f * 0.9f); - if (options.rtSettings.verbose) { + if (settings->verbose) { std::cout << "dehaze: strength = " << strength << std::endl; } @@ -326,7 +326,7 @@ void ImProcFunctions::dehaze(Imagefloat *img) } if (min(ambient[0], ambient[1], ambient[2]) < 0.01f) { - if (options.rtSettings.verbose) { + if (settings->verbose) { std::cout << "dehaze: no haze detected" << std::endl; } restore(img, maxChannel, multiThread); @@ -334,7 +334,7 @@ void ImProcFunctions::dehaze(Imagefloat *img) } patchsize = max(max(W, H) / 600, 2); - if (options.rtSettings.verbose) { + if (settings->verbose) { std::cout << "dehaze: ambient light is " << ambient[0] << ", " << ambient[1] << ", " << ambient[2] << std::endl; @@ -349,7 +349,7 @@ void ImProcFunctions::dehaze(Imagefloat *img) array2D guideB(W, H, img->b.ptrs, ARRAY2D_BYREFERENCE); guidedFilter(guideB, dark, dark, radius, epsilon, multiThread); - if (options.rtSettings.verbose) { + if (settings->verbose) { std::cout << "dehaze: max distance is " << maxDistance << std::endl; } diff --git a/rtengine/iplab2rgb.cc b/rtengine/iplab2rgb.cc index 6166c928e..1d3f2f494 100644 --- a/rtengine/iplab2rgb.cc +++ b/rtengine/iplab2rgb.cc @@ -34,8 +34,6 @@ namespace rtengine extern void filmlike_clip(float *r, float *g, float *b); -extern const Settings* settings; - namespace { inline void copyAndClampLine(const float *src, unsigned char *dst, const int W) diff --git a/rtengine/ipsharpen.cc b/rtengine/ipsharpen.cc index 8f63b59f6..0758011bb 100644 --- a/rtengine/ipsharpen.cc +++ b/rtengine/ipsharpen.cc @@ -161,8 +161,6 @@ void dcdamping (float** aI, float** aO, float damping, int W, int H) namespace rtengine { -extern const Settings* settings; - void ImProcFunctions::deconvsharpening (float** luminance, float** tmp, const float * const * blend, int W, int H, const procparams::SharpeningParams &sharpenParam, double Scale) { if (sharpenParam.deconvamount == 0 && sharpenParam.blurradius < 0.25f) { diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 2ba6ec97b..d550664b9 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -60,8 +60,6 @@ namespace rtengine { -extern const Settings* settings; - struct cont_params { float mul[10]; int chrom; diff --git a/rtengine/lcp.cc b/rtengine/lcp.cc index e2442e094..0b73f6960 100644 --- a/rtengine/lcp.cc +++ b/rtengine/lcp.cc @@ -35,13 +35,6 @@ #include "settings.h" #include "utils.h" -namespace rtengine -{ - -extern const Settings* settings; - -} - class rtengine::LCPProfile::LCPPersModel { public: diff --git a/rtengine/profilestore.cc b/rtengine/profilestore.cc index 23e4d8321..7d937e736 100644 --- a/rtengine/profilestore.cc +++ b/rtengine/profilestore.cc @@ -160,7 +160,7 @@ void ProfileStore::_parseProfiles () if (findEntryFromFullPathU (options.defProfRaw) == nullptr) { options.setDefProfRawMissing (true); - if (options.rtSettings.verbose) { + if (settings->verbose) { printf ("WARNING: Default profile \"%s\" for raw images not found!\n", options.defProfRaw.c_str()); } } @@ -168,7 +168,7 @@ void ProfileStore::_parseProfiles () if (findEntryFromFullPathU (options.defProfImg) == nullptr) { options.setDefProfImgMissing (true); - if (options.rtSettings.verbose) { + if (settings->verbose) { printf ("WARNING: Default profile \"%s\" for standard images not found!\n", options.defProfImg.c_str()); } } @@ -220,7 +220,7 @@ bool ProfileStore::parseDir (Glib::ustring& realPath, Glib::ustring& virtualPath if (lastdot != Glib::ustring::npos && lastdot == currDir.length() - 4 && currDir.substr (lastdot).casefold() == paramFileExtension) { // file found - if ( options.rtSettings.verbose ) { + if (settings->verbose) { printf ("Processing file %s...", fname.c_str()); } @@ -233,7 +233,7 @@ bool ProfileStore::parseDir (Glib::ustring& realPath, Glib::ustring& virtualPath if (!res && pProf->pparams->ppVersion >= 220) { fileFound = true; - if ( options.rtSettings.verbose ) { + if (settings->verbose) { printf ("OK\n"); } @@ -244,7 +244,7 @@ bool ProfileStore::parseDir (Glib::ustring& realPath, Glib::ustring& virtualPath // map the partial profile partProfiles[filePSE] = pProf; //partProfiles.insert( std::pair (filePSE, pProf) ); - } else if ( options.rtSettings.verbose ) { + } else if (settings->verbose) { printf ("failed!\n"); } } @@ -522,7 +522,7 @@ PartialProfile *ProfileStore::loadDynamicProfile (const FramesMetaData *im) for (auto rule : dynamicRules) { if (rule.matches (im)) { - if (options.rtSettings.verbose) { + if (settings->verbose) { printf ("found matching profile %s\n", rule.profilepath.c_str()); } diff --git a/rtengine/rawimage.cc b/rtengine/rawimage.cc index 0134d4d16..a69a97ab7 100644 --- a/rtengine/rawimage.cc +++ b/rtengine/rawimage.cc @@ -19,8 +19,6 @@ namespace rtengine { -extern const Settings* settings; - RawImage::RawImage( const Glib::ustring &name ) : data(nullptr) , prefilters(0) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 347331467..0836a3832 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -426,7 +426,6 @@ void transLineD1x (const float* const red, const float* const green, const float namespace rtengine { -extern const Settings* settings; #undef ABS #undef DIST diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index f2c448805..389fe8355 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -562,7 +562,7 @@ public: * @param baseDir base directory of RT's installation dir * @param userSettingsDir RT's base directory in the user's settings dir * @param loadAll if false, don't load the various dependencies (profiles, HALDClut files, ...), they'll be loaded from disk each time they'll be used (launching time improvement) */ -int init (const Settings* s, Glib::ustring baseDir, Glib::ustring userSettingsDir, bool loadAll = true); +int init (const Settings* s, const Glib::ustring& baseDir, const Glib::ustring& userSettingsDir, bool loadAll = true); /** Cleanup the RT engine (static variables) */ void cleanup (); diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index 4a7fb2d11..3b6046b4e 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -47,7 +47,6 @@ #include "StopWatch.h" #include "utils.h" -#include "../rtgui/options.h" #include "../rtgui/ppversion.h" namespace @@ -194,8 +193,6 @@ void scale_colors (rtengine::RawImage *ri, float scale_mul[4], float cblack[4], namespace rtengine { -extern const Settings *settings; - using namespace procparams; Thumbnail* Thumbnail::loadFromImage (const Glib::ustring& fname, int &w, int &h, int fixwh, double wbEq, bool inspectorMode) @@ -335,7 +332,7 @@ Image8 *load_inspector_mode(const Glib::ustring &fname, RawMetaDataLocation &rml neutral.raw.bayersensor.method = RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::FAST); neutral.raw.xtranssensor.method = RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::FAST); neutral.icm.inputProfile = "(camera)"; - neutral.icm.workingProfile = options.rtSettings.srgb; + neutral.icm.workingProfile = settings->srgb; src.preprocess(neutral.raw, neutral.lensProf, neutral.coarse, false); double thresholdDummy = 0.f; @@ -434,7 +431,7 @@ Thumbnail* Thumbnail::loadQuickFromRaw (const Glib::ustring& fname, RawMetaDataL // did we succeed? if ( err ) { - if (options.rtSettings.verbose) { + if (settings->verbose) { std::cout << "Could not extract thumb from " << fname.c_str() << std::endl; } delete tpp; @@ -1242,7 +1239,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT ImProcFunctions ipf (¶ms, forHistogramMatching); // enable multithreading when forHistogramMatching is true ipf.setScale (sqrt (double (fw * fw + fh * fh)) / sqrt (double (thumbImg->getWidth() * thumbImg->getWidth() + thumbImg->getHeight() * thumbImg->getHeight()))*scale); - ipf.updateColorProfiles (ICCStore::getInstance()->getDefaultMonitorProfileName(), RenderingIntent(options.rtSettings.monitorIntent), false, false); + ipf.updateColorProfiles (ICCStore::getInstance()->getDefaultMonitorProfileName(), RenderingIntent(settings->monitorIntent), false, false); LUTu hist16 (65536); @@ -2132,11 +2129,11 @@ bool Thumbnail::readData (const Glib::ustring& fname) return true; } catch (Glib::Error &err) { - if (options.rtSettings.verbose) { + if (settings->verbose) { printf ("Thumbnail::readData / Error code %d while reading values from \"%s\":\n%s\n", err.code(), fname.c_str(), err.what().c_str()); } } catch (...) { - if (options.rtSettings.verbose) { + if (settings->verbose) { printf ("Thumbnail::readData / Unknown exception while trying to load \"%s\"!\n", fname.c_str()); } } @@ -2183,11 +2180,11 @@ bool Thumbnail::writeData (const Glib::ustring& fname) keyData = keyFile.to_data (); } catch (Glib::Error& err) { - if (options.rtSettings.verbose) { + if (settings->verbose) { printf ("Thumbnail::writeData / Error code %d while reading values from \"%s\":\n%s\n", err.code(), fname.c_str(), err.what().c_str()); } } catch (...) { - if (options.rtSettings.verbose) { + if (settings->verbose) { printf ("Thumbnail::writeData / Unknown exception while trying to save \"%s\"!\n", fname.c_str()); } } @@ -2199,7 +2196,7 @@ bool Thumbnail::writeData (const Glib::ustring& fname) FILE *f = g_fopen (fname.c_str (), "wt"); if (!f) { - if (options.rtSettings.verbose) { + if (settings->verbose) { printf ("Thumbnail::writeData / Error: unable to open file \"%s\" with write access!\n", fname.c_str()); } diff --git a/rtengine/settings.h b/rtengine/settings.h index a32a1b7dd..f261444c8 100644 --- a/rtengine/settings.h +++ b/rtengine/settings.h @@ -96,4 +96,5 @@ public: * @param s a pointer to the Settings instance to destroy. */ static void destroy(Settings* s); }; +extern const Settings* settings; } diff --git a/rtengine/shmap.cc b/rtengine/shmap.cc index f654ab51d..36582df39 100644 --- a/rtengine/shmap.cc +++ b/rtengine/shmap.cc @@ -29,8 +29,6 @@ namespace rtengine { -extern const Settings* settings; - SHMap::SHMap (int w, int h) : max_f(0.f), min_f(0.f), avg(0.f), W(w), H(h) { diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 978479304..2953fc34b 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -38,7 +38,6 @@ namespace rtengine { -extern const Settings* settings; namespace { diff --git a/rtengine/stdimagesource.cc b/rtengine/stdimagesource.cc index 8e4c05ac8..2e8846412 100644 --- a/rtengine/stdimagesource.cc +++ b/rtengine/stdimagesource.cc @@ -32,8 +32,6 @@ namespace rtengine { -extern const Settings* settings; - template void freeArray (T** a, int H) { for (int i = 0; i < H; i++) { diff --git a/rtgui/adjuster.cc b/rtgui/adjuster.cc index 5182cd825..91394e18d 100644 --- a/rtgui/adjuster.cc +++ b/rtgui/adjuster.cc @@ -20,7 +20,7 @@ #include #include #include "multilangmgr.h" -#include "../rtengine/rtengine.h" +#include "../rtengine/rt_math.h" #include "options.h" #include "guiutils.h" #include "rtimage.h" diff --git a/rtgui/cacheimagedata.cc b/rtgui/cacheimagedata.cc index d31b6c7a5..114508a95 100644 --- a/rtgui/cacheimagedata.cc +++ b/rtgui/cacheimagedata.cc @@ -23,6 +23,7 @@ #include #include "../rtengine/procparams.h" +#include "../rtengine/settings.h" CacheImageData::CacheImageData() : supported(false), @@ -223,11 +224,11 @@ int CacheImageData::load (const Glib::ustring& fname) return 0; } } catch (Glib::Error &err) { - if (options.rtSettings.verbose) { + if (rtengine::settings->verbose) { printf("CacheImageData::load / Error code %d while reading values from \"%s\":\n%s\n", err.code(), fname.c_str(), err.what().c_str()); } } catch (...) { - if (options.rtSettings.verbose) { + if (rtengine::settings->verbose) { printf("CacheImageData::load / Unknown exception while trying to load \"%s\"!\n", fname.c_str()); } } @@ -305,11 +306,11 @@ int CacheImageData::save (const Glib::ustring& fname) keyData = keyFile.to_data (); } catch (Glib::Error &err) { - if (options.rtSettings.verbose) { + if (rtengine::settings->verbose) { printf("CacheImageData::save / Error code %d while reading values from \"%s\":\n%s\n", err.code(), fname.c_str(), err.what().c_str()); } } catch (...) { - if (options.rtSettings.verbose) { + if (rtengine::settings->verbose) { printf("CacheImageData::save / Unknown exception while trying to save \"%s\"!\n", fname.c_str()); } } @@ -321,7 +322,7 @@ int CacheImageData::save (const Glib::ustring& fname) FILE *f = g_fopen (fname.c_str (), "wt"); if (!f) { - if (options.rtSettings.verbose) { + if (rtengine::settings->verbose) { printf("CacheImageData::save / Error: unable to open file \"%s\" with write access!\n", fname.c_str()); } diff --git a/rtgui/cachemanager.cc b/rtgui/cachemanager.cc index 419538656..9f6e111e5 100644 --- a/rtgui/cachemanager.cc +++ b/rtgui/cachemanager.cc @@ -32,8 +32,8 @@ #include "guiutils.h" #include "options.h" -#include "procparamchangers.h" #include "thumbnail.h" +#include "procparamchangers.h" namespace { @@ -64,7 +64,7 @@ void CacheManager::init () } } - if (error != 0 && options.rtSettings.verbose) { + if (error != 0 && rtengine::settings->verbose) { std::cerr << "Failed to create all cache directories: " << g_strerror(errno) << std::endl; } } @@ -191,7 +191,7 @@ void CacheManager::renameEntry (const std::string& oldfilename, const std::strin error |= g_rename (getCacheFileName ("embprofiles", oldfilename, ".icc", oldmd5).c_str (), getCacheFileName ("embprofiles", newfilename, ".icc", newmd5).c_str ()); error |= g_rename (getCacheFileName ("data", oldfilename, ".txt", oldmd5).c_str (), getCacheFileName ("data", newfilename, ".txt", newmd5).c_str ()); - if (error != 0 && options.rtSettings.verbose) { + if (error != 0 && rtengine::settings->verbose) { std::cerr << "Failed to rename all files for cache entry '" << oldfilename << "': " << g_strerror(errno) << std::endl; } @@ -263,7 +263,7 @@ void CacheManager::deleteDir (const Glib::ustring& dirName) const error |= g_remove (Glib::build_filename (baseDir, dirName, *entry).c_str ()); } - if (error != 0 && options.rtSettings.verbose) { + if (error != 0 && rtengine::settings->verbose) { std::cerr << "Failed to delete all entries in cache directory '" << dirName << "': " << g_strerror(errno) << std::endl; } @@ -288,7 +288,7 @@ void CacheManager::deleteFiles (const Glib::ustring& fname, const std::string& m error |= g_remove (getCacheFileName ("profiles", fname, paramFileExtension, md5).c_str ()); } - if (error != 0 && options.rtSettings.verbose) { + if (error != 0 && rtengine::settings->verbose) { std::cerr << "Failed to delete all files for cache entry '" << fname << "': " << g_strerror(errno) << std::endl; } } diff --git a/rtgui/colorappearance.cc b/rtgui/colorappearance.cc index 0d155e97b..450589fe9 100644 --- a/rtgui/colorappearance.cc +++ b/rtgui/colorappearance.cc @@ -22,6 +22,7 @@ #include "guiutils.h" #include "options.h" +#include "rtimage.h" #include "../rtengine/color.h" #include "../rtengine/procparams.h" diff --git a/rtgui/dirbrowser.cc b/rtgui/dirbrowser.cc index 32361d5c5..669528ac1 100644 --- a/rtgui/dirbrowser.cc +++ b/rtgui/dirbrowser.cc @@ -63,7 +63,7 @@ std::vector listSubDirs (const Glib::RefPtr& dir, bool subDirs.push_back (file->get_name ()); } catch (const Glib::Exception& exception) { - if (options.rtSettings.verbose) { + if (rtengine::settings->verbose) { std::cerr << exception.what().c_str() << std::endl; } @@ -72,7 +72,7 @@ std::vector listSubDirs (const Glib::RefPtr& dir, bool } catch (const Glib::Exception& exception) { - if (options.rtSettings.verbose) { + if (rtengine::settings->verbose) { std::cerr << "Failed to list subdirectories of \"" << dir->get_parse_name() << "\": " << exception.what () << std::endl; } diff --git a/rtgui/dynamicprofilepanel.cc b/rtgui/dynamicprofilepanel.cc index 6acad07f9..d7ed8ee97 100644 --- a/rtgui/dynamicprofilepanel.cc +++ b/rtgui/dynamicprofilepanel.cc @@ -18,11 +18,11 @@ */ #include "dynamicprofilepanel.h" -#include "options.h" #include "multilangmgr.h" #include "../rtengine/profilestore.h" #include "../rtengine/rtengine.h" #include "../rtengine/dynamicprofile.h" +#include "../rtengine/settings.h" #include #include @@ -616,7 +616,7 @@ void DynamicProfilePanel::save() if (!ProfileStore::getInstance()->storeRules()) { printf ("Error in saving dynamic profile rules\n"); - } else if (options.rtSettings.verbose) { + } else if (rtengine::settings->verbose) { printf ("Saved %d dynamic profile rules\n", int (rules.size())); } } diff --git a/rtgui/editwindow.h b/rtgui/editwindow.h index 8a2ade6ba..04999d149 100644 --- a/rtgui/editwindow.h +++ b/rtgui/editwindow.h @@ -20,6 +20,7 @@ #include #include "filepanel.h" #include "editorpanel.h" +#include "rtimage.h" #include class EditWindow : public Gtk::Window diff --git a/rtgui/extprog.cc b/rtgui/extprog.cc index a17bcdc6a..a7a757c1b 100644 --- a/rtgui/extprog.cc +++ b/rtgui/extprog.cc @@ -213,7 +213,7 @@ bool ExtProgStore::spawnCommandAsync (const Glib::ustring& cmd) } catch (const Glib::Exception& exception) { - if (options.rtSettings.verbose) { + if (rtengine::settings->verbose) { std::cerr << "Failed to execute \"" << cmd << "\": " << exception.what() << std::endl; } @@ -232,7 +232,7 @@ bool ExtProgStore::spawnCommandSync (const Glib::ustring& cmd) } catch (const Glib::Exception& exception) { - if (options.rtSettings.verbose) { + if (rtengine::settings->verbose) { std::cerr << "Failed to execute \"" << cmd << "\": " << exception.what() << std::endl; } diff --git a/rtgui/fattaltonemap.cc b/rtgui/fattaltonemap.cc index a0baf3531..89a1e9e30 100644 --- a/rtgui/fattaltonemap.cc +++ b/rtgui/fattaltonemap.cc @@ -23,6 +23,7 @@ #include "fattaltonemap.h" #include "eventmapper.h" +#include "rtimage.h" #include "../rtengine/procparams.h" diff --git a/rtgui/filecatalog.cc b/rtgui/filecatalog.cc index 674501322..8e8bcc216 100644 --- a/rtgui/filecatalog.cc +++ b/rtgui/filecatalog.cc @@ -602,7 +602,7 @@ std::vector FileCatalog::getFileList() names.push_back(Glib::build_filename(selectedDirectory, fname)); } catch (Glib::Exception& exception) { - if (options.rtSettings.verbose) { + if (rtengine::settings->verbose) { std::cerr << exception.what() << std::endl; } } @@ -610,7 +610,7 @@ std::vector FileCatalog::getFileList() } catch (Glib::Exception& exception) { - if (options.rtSettings.verbose) { + if (rtengine::settings->verbose) { std::cerr << "Failed to list directory \"" << selectedDirectory << "\": " << exception.what() << std::endl; } diff --git a/rtgui/guiutils.h b/rtgui/guiutils.h index b09e20abb..038131b9b 100644 --- a/rtgui/guiutils.h +++ b/rtgui/guiutils.h @@ -28,13 +28,23 @@ #include "../rtengine/coord.h" #include "../rtengine/noncopyable.h" -#include "../rtengine/rtengine.h" -#include "rtimage.h" +#include "threadutils.h" // for convenience... #include "pathutils.h" +namespace rtengine { +namespace procparams +{ + +class ProcParams; + +struct CropParams; +} +} + +class RTImage; Glib::ustring escapeHtmlChars(const Glib::ustring &src); bool removeIfThere (Gtk::Container* cont, Gtk::Widget* w, bool increference = true); diff --git a/rtgui/iccprofilecreator.cc b/rtgui/iccprofilecreator.cc index 0ac0b79f3..e3e1eadb4 100644 --- a/rtgui/iccprofilecreator.cc +++ b/rtgui/iccprofilecreator.cc @@ -29,13 +29,6 @@ #include #endif -namespace rtengine -{ - -extern const Settings* settings; - -} - const char* sTRCPreset[] = {"BT709_g2.2_s4.5", "sRGB_g2.4_s12.92", "linear_g1.0", "standard_g2.2", "standard_g1.8", "High_g1.3_s3.35", "Low_g2.6_s6.9", "Lab_g3.0s9.03296"}; //gamma free ICCProfileCreator::ICCProfileCreator(RTWindow *rtwindow) diff --git a/rtgui/inspector.cc b/rtgui/inspector.cc index ad2e424ec..50fa933e1 100644 --- a/rtgui/inspector.cc +++ b/rtgui/inspector.cc @@ -22,6 +22,7 @@ #include "cursormanager.h" #include "guiutils.h" #include "options.h" +#include "rtscalable.h" #include "../rtengine/previewimage.h" InspectorBuffer::InspectorBuffer(const Glib::ustring &imagePath) : currTransform(0), fromRaw(false) diff --git a/rtgui/inspector.h b/rtgui/inspector.h index 681b90aa3..6b3b2350b 100644 --- a/rtgui/inspector.h +++ b/rtgui/inspector.h @@ -22,6 +22,8 @@ #include #include "guiutils.h" #include "../rtengine/coord.h" +#include "../rtengine/coord2d.h" +#include "../rtengine/rt_math.h" class InspectorBuffer { diff --git a/rtgui/labgrid.cc b/rtgui/labgrid.cc index b6393f6f5..fa452815e 100644 --- a/rtgui/labgrid.cc +++ b/rtgui/labgrid.cc @@ -39,6 +39,7 @@ #include "labgrid.h" #include "options.h" +#include "rtimage.h" using rtengine::Color; diff --git a/rtgui/lensprofile.cc b/rtgui/lensprofile.cc index a6694287f..e2cdb5649 100644 --- a/rtgui/lensprofile.cc +++ b/rtgui/lensprofile.cc @@ -587,7 +587,7 @@ void LensProfilePanel::onCorrModeChanged(const Gtk::RadioButton* rbChanged) LensProfilePanel::LFDbHelper::LFDbHelper() { #ifdef _OPENMP -#pragma omp parallel sections if (!options.rtSettings.verbose) +#pragma omp parallel sections if (!settings->verbose) #endif { #ifdef _OPENMP @@ -609,7 +609,7 @@ LensProfilePanel::LFDbHelper::LFDbHelper() void LensProfilePanel::LFDbHelper::fillLensfunCameras() { - if (options.rtSettings.verbose) { + if (settings->verbose) { std::cout << "LENSFUN, scanning cameras:" << std::endl; } @@ -619,7 +619,7 @@ void LensProfilePanel::LFDbHelper::fillLensfunCameras() for (const auto& c : camlist) { camnames[c.getMake()].insert(c.getModel()); - if (options.rtSettings.verbose) { + if (settings->verbose) { std::cout << " found: " << c.getDisplayString().c_str() << std::endl; } } @@ -639,7 +639,7 @@ void LensProfilePanel::LFDbHelper::fillLensfunCameras() void LensProfilePanel::LFDbHelper::fillLensfunLenses() { - if (options.rtSettings.verbose) { + if (settings->verbose) { std::cout << "LENSFUN, scanning lenses:" << std::endl; } @@ -651,7 +651,7 @@ void LensProfilePanel::LFDbHelper::fillLensfunLenses() const auto& make = l.getMake(); lenses[make].insert(name); - if (options.rtSettings.verbose) { + if (settings->verbose) { std::cout << " found: " << l.getDisplayString().c_str() << std::endl; } } diff --git a/rtgui/main.cc b/rtgui/main.cc index 997f20732..58fdd12dc 100644 --- a/rtgui/main.cc +++ b/rtgui/main.cc @@ -218,7 +218,7 @@ bool init_rt() extProgStore->init(); SoundManager::init(); - if ( !options.rtSettings.verbose ) { + if (!rtengine::settings->verbose) { TIFFSetWarningHandler (nullptr); // avoid annoying message boxes } diff --git a/rtgui/mycurve.cc b/rtgui/mycurve.cc index 6c00e3f56..7401570c8 100644 --- a/rtgui/mycurve.cc +++ b/rtgui/mycurve.cc @@ -20,6 +20,7 @@ #include "../rtengine/curves.h" #include #include +#include "rtscalable.h" MyCurve::MyCurve () : pipetteR(-1.f), diff --git a/rtgui/mycurve.h b/rtgui/mycurve.h index b5577e8dd..73f16d227 100644 --- a/rtgui/mycurve.h +++ b/rtgui/mycurve.h @@ -53,6 +53,7 @@ enum SnapToType { class MyCurveIdleHelper; class CurveEditor; +class EditDataProvider; class MyCurve : public Gtk::DrawingArea, public BackBuffer, public ColorCaller, public CoordinateProvider, public rtengine::NonCopyable { diff --git a/rtgui/mydiagonalcurve.cc b/rtgui/mydiagonalcurve.cc index d393c7200..9aa52c67e 100644 --- a/rtgui/mydiagonalcurve.cc +++ b/rtgui/mydiagonalcurve.cc @@ -23,6 +23,7 @@ #include "mydiagonalcurve.h" #include "editcallbacks.h" +#include "rtscalable.h" #include "../rtengine/curves.h" diff --git a/rtgui/myflatcurve.cc b/rtgui/myflatcurve.cc index ec46908ce..f01fb0066 100644 --- a/rtgui/myflatcurve.cc +++ b/rtgui/myflatcurve.cc @@ -23,6 +23,7 @@ #include "myflatcurve.h" #include "editcallbacks.h" +#include "rtscalable.h" #include "../rtengine/curves.h" diff --git a/rtgui/options.cc b/rtgui/options.cc index 8d8d52c83..164637eb2 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -28,6 +28,7 @@ #include "version.h" #include "../rtengine/procparams.h" +#include "../rtengine/rtengine.h" #ifdef _OPENMP #include diff --git a/rtgui/profilepanel.h b/rtgui/profilepanel.h index c5717d523..1efafe10b 100644 --- a/rtgui/profilepanel.h +++ b/rtgui/profilepanel.h @@ -27,9 +27,10 @@ #include "partialpastedlg.h" #include "guiutils.h" #include "profilestorecombobox.h" -#include "rtimage.h" #include "../rtengine/noncopyable.h" +class RTImage; + class ProfilePanel : public Gtk::Grid, public PParamsChangeListener, public ProfileStoreListener, public rtengine::NonCopyable { diff --git a/rtgui/rtimage.cc b/rtgui/rtimage.cc index ff27dbbd3..44078ed3b 100644 --- a/rtgui/rtimage.cc +++ b/rtgui/rtimage.cc @@ -23,7 +23,7 @@ #include #include -#include "options.h" +#include "../rtengine/settings.h" namespace { @@ -215,7 +215,7 @@ Cairo::RefPtr RTImage::createImgSurfFromFile (const Glib::u } */ } catch (const Glib::Exception& exception) { - if (options.rtSettings.verbose) { + if (rtengine::settings->verbose) { std::cerr << "Failed to load image \"" << fileName << "\": " << exception.what() << std::endl; } } diff --git a/rtgui/rtscalable.cc b/rtgui/rtscalable.cc index b803ab270..a48a95fd2 100644 --- a/rtgui/rtscalable.cc +++ b/rtgui/rtscalable.cc @@ -23,9 +23,9 @@ #include #include #include -#include "options.h" #include "../rtengine/rt_math.h" +#include "options.h" double RTScalable::dpi = 0.; int RTScalable::scale = 0; @@ -102,7 +102,7 @@ void RTScalable::deleteDir(const Glib::ustring& path) error |= g_remove (Glib::build_filename (path, *entry).c_str()); } - if (error != 0 && options.rtSettings.verbose) { + if (error != 0 && rtengine::settings->verbose) { std::cerr << "Failed to delete all entries in '" << path << "': " << g_strerror(errno) << std::endl; } diff --git a/rtgui/rtwindow.cc b/rtgui/rtwindow.cc index fc9be32f7..3654e8af6 100644 --- a/rtgui/rtwindow.cc +++ b/rtgui/rtwindow.cc @@ -19,12 +19,12 @@ #include #include "rtwindow.h" -#include "options.h" #include "preferences.h" #include "iccprofilecreator.h" #include "cursormanager.h" #include "rtimage.h" #include "whitebalance.h" +#include "../rtengine/settings.h" float fontScale = 1.f; Glib::RefPtr cssForced; @@ -170,7 +170,7 @@ RTWindow::RTWindow () if (options.pseudoHiDPISupport) { fontScale = options.fontSize / (float)RTScalable::baseFontSize; } - if (options.rtSettings.verbose) { + if (rtengine::settings->verbose) { printf("\"Non-Default\" font size(%d) * scale(%d) / fontScale(%.3f)\n", options.fontSize, (int)initialGdkScale, fontScale); } } else { @@ -200,14 +200,14 @@ RTWindow::RTWindow () } if ((int)initialGdkScale > 1 || pt != RTScalable::baseFontSize) { css = Glib::ustring::compose ("* { font-size: %1pt}", pt * (int)initialGdkScale); - if (options.rtSettings.verbose) { + if (rtengine::settings->verbose) { printf("\"Default\" font size(%d) * scale(%d) / fontScale(%.3f)\n", pt, (int)initialGdkScale, fontScale); } } } } if (!css.empty()) { - if (options.rtSettings.verbose) { + if (rtengine::settings->verbose) { printf("CSS:\n%s\n\n", css.c_str()); } try { diff --git a/rtgui/shcselector.cc b/rtgui/shcselector.cc index 6137c3ec8..e8aca4071 100644 --- a/rtgui/shcselector.cc +++ b/rtgui/shcselector.cc @@ -17,9 +17,12 @@ * along with RawTherapee. If not, see . */ +#include + #include "shcselector.h" #include "multilangmgr.h" #include "mycurve.h" +#include "rtscalable.h" SHCSelector::SHCSelector() : movingPosition(-1), tmpX(0.0), tmpPos(0.0), wslider(0.0), cl(nullptr), coloredBar(RTO_Left2Right) { diff --git a/rtgui/thresholdselector.cc b/rtgui/thresholdselector.cc index b44425be4..35d08279c 100644 --- a/rtgui/thresholdselector.cc +++ b/rtgui/thresholdselector.cc @@ -24,6 +24,7 @@ #include "multilangmgr.h" #include "mycurve.h" +#include "rtscalable.h" #include "../rtengine/procparams.h" diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc index 531529d5c..09ffd11f7 100644 --- a/rtgui/thumbnail.cc +++ b/rtgui/thumbnail.cc @@ -19,7 +19,6 @@ #include "thumbnail.h" #include #include -#include "options.h" #include "../rtengine/mytime.h" #include #include @@ -29,6 +28,7 @@ #include #include "../rtengine/dynamicprofile.h" +#include "../rtengine/settings.h" #include "guiutils.h" #include "batchqueue.h" #include "extprog.h" @@ -299,7 +299,7 @@ rtengine::procparams::ProcParams* Thumbnail::createProcParamsForUpdate(bool retu // For the filename etc. do NOT use streams, since they are not UTF8 safe Glib::ustring cmdLine = options.CPBPath + Glib::ustring(" \"") + tmpFileName + Glib::ustring("\""); - if (options.rtSettings.verbose) { + if (rtengine::settings->verbose) { printf("Custom profile builder's command line: %s\n", Glib::ustring(cmdLine).c_str()); } diff --git a/rtgui/toolbar.cc b/rtgui/toolbar.cc index b8e0d64dc..38ade6566 100644 --- a/rtgui/toolbar.cc +++ b/rtgui/toolbar.cc @@ -20,6 +20,7 @@ #include "toolbar.h" #include "multilangmgr.h" #include "guiutils.h" +#include "rtimage.h" ToolBar::ToolBar () : showColPickers(true), listener (nullptr), pickerListener(nullptr) { diff --git a/rtgui/toolbar.h b/rtgui/toolbar.h index 52f4dcbd4..958aa80be 100644 --- a/rtgui/toolbar.h +++ b/rtgui/toolbar.h @@ -21,9 +21,10 @@ #include #include "toolenum.h" -#include "rtimage.h" #include "lockablecolorpicker.h" +class RTImage; + class ToolBarListener { diff --git a/rtgui/toolpanel.cc b/rtgui/toolpanel.cc index 27f68767e..b1282f523 100644 --- a/rtgui/toolpanel.cc +++ b/rtgui/toolpanel.cc @@ -19,6 +19,7 @@ #include "toolpanel.h" #include "toolpanelcoord.h" #include "guiutils.h" +#include "rtimage.h" #include "../rtengine/procparams.h" diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index deea489fe..1da43f6c0 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -19,6 +19,7 @@ #include "multilangmgr.h" #include "toolpanelcoord.h" #include "options.h" +#include "rtimage.h" #include "../rtengine/imagesource.h" #include "../rtengine/dfmanager.h" #include "../rtengine/ffmanager.h" From aacea7046c38c03282347c0d8774b93a473bd394 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Thu, 31 Oct 2019 08:56:38 +0100 Subject: [PATCH 110/208] Fix Clang warnings plus some cleanups --- rtengine/gamutwarning.cc | 4 ++-- rtengine/gamutwarning.h | 3 ++- rtengine/guidedfilter.cc | 13 ++++++++----- rtengine/guidedfilter.h | 3 ++- rtengine/histmatching.cc | 26 ++++++++++++++------------ rtengine/ipdehaze.cc | 8 ++++---- rtengine/iplabregions.cc | 3 ++- rtengine/iplocalcontrast.cc | 3 ++- rtengine/ipshadowshighlights.cc | 3 ++- rtengine/pdaflinesfilter.cc | 16 +++++++--------- rtengine/pdaflinesfilter.h | 8 +++++--- rtengine/refreshmap.cc | 3 ++- rtengine/refreshmap.h | 9 ++++----- rtengine/rescale.h | 4 ++-- rtengine/rtlensfun.cc | 12 ++++++------ rtengine/rtlensfun.h | 4 +++- rtengine/tmo_fattal02.cc | 21 ++++++++++----------- rtgui/cropwindow.h | 26 ++++++++++++++------------ rtgui/guiutils.h | 17 ++++++++--------- 19 files changed, 99 insertions(+), 87 deletions(-) diff --git a/rtengine/gamutwarning.cc b/rtengine/gamutwarning.cc index 290800f90..569ea3066 100644 --- a/rtengine/gamutwarning.cc +++ b/rtengine/gamutwarning.cc @@ -29,7 +29,8 @@ #include "iccstore.h" #include "image8.h" -namespace rtengine { +namespace rtengine +{ GamutWarning::GamutWarning(cmsHPROFILE iprof, cmsHPROFILE gamutprof, RenderingIntent intent, bool gamutbpc): lab2ref(nullptr), @@ -129,5 +130,4 @@ inline void GamutWarning::mark(Image8 *image, int y, int x) image->b(y, x) = 255; } - } // namespace rtengine diff --git a/rtengine/gamutwarning.h b/rtengine/gamutwarning.h index 4e34ed431..b940b911f 100644 --- a/rtengine/gamutwarning.h +++ b/rtengine/gamutwarning.h @@ -29,7 +29,8 @@ #include "noncopyable.h" -namespace rtengine { +namespace rtengine +{ class Image8; diff --git a/rtengine/guidedfilter.cc b/rtengine/guidedfilter.cc index 70807424a..6b2adb773 100644 --- a/rtengine/guidedfilter.cc +++ b/rtengine/guidedfilter.cc @@ -29,15 +29,19 @@ * available at https://arxiv.org/abs/1505.00996 */ -#include "guidedfilter.h" #include "boxblur.h" -#include "rescale.h" +#include "guidedfilter.h" #include "imagefloat.h" +#include "rescale.h" + #define BENCHMARK #include "StopWatch.h" -namespace rtengine { -namespace { +namespace rtengine +{ + +namespace +{ int calculate_subsampling(int w, int h, int r) { @@ -60,7 +64,6 @@ int calculate_subsampling(int w, int h, int r) } // namespace - void guidedFilter(const array2D &guide, const array2D &src, array2D &dst, int r, float epsilon, bool multithread, int subsampling) { enum Op {MUL, DIVEPSILON, SUBMUL}; diff --git a/rtengine/guidedfilter.h b/rtengine/guidedfilter.h index af8ed0901..d66396c6a 100644 --- a/rtengine/guidedfilter.h +++ b/rtengine/guidedfilter.h @@ -22,7 +22,8 @@ #include "array2D.h" -namespace rtengine { +namespace rtengine +{ void guidedFilter(const array2D &guide, const array2D &src, array2D &dst, int r, float epsilon, bool multithread, int subsampling=0); diff --git a/rtengine/histmatching.cc b/rtengine/histmatching.cc index e85f5ee13..622933149 100644 --- a/rtengine/histmatching.cc +++ b/rtengine/histmatching.cc @@ -18,22 +18,24 @@ * along with RawTherapee. If not, see . */ -#include "rawimagesource.h" -#include "rtthumbnail.h" -#include "curves.h" -#include "color.h" -#include "rt_math.h" -#include "procparams.h" -#include "../rtgui/mydiagonalcurve.h" -#include "improcfun.h" -//#define BENCHMARK -#include "StopWatch.h" #include +#include "color.h" +#include "curves.h" +#include "improcfun.h" +#include "procparams.h" +#include "rawimagesource.h" +#include "rt_math.h" +#include "rtthumbnail.h" +#include "settings.h" -namespace rtengine { +//#define BENCHMARK +#include "StopWatch.h" -extern const Settings *settings; +#include "../rtgui/mydiagonalcurve.h" + +namespace rtengine +{ namespace { diff --git a/rtengine/ipdehaze.cc b/rtengine/ipdehaze.cc index 729282dbe..c9579cf05 100644 --- a/rtengine/ipdehaze.cc +++ b/rtengine/ipdehaze.cc @@ -42,9 +42,11 @@ #include "../rtgui/options.h" -namespace rtengine { +namespace rtengine +{ -namespace { +namespace +{ float normalize(Imagefloat *rgb, bool multithread) { @@ -271,7 +273,6 @@ void extract_channels(Imagefloat *img, array2D &r, array2D &g, arr } // namespace - void ImProcFunctions::dehaze(Imagefloat *img) { if (!params->dehaze.enabled || params->dehaze.strength == 0.0) { @@ -431,5 +432,4 @@ void ImProcFunctions::dehaze(Imagefloat *img) } } - } // namespace rtengine diff --git a/rtengine/iplabregions.cc b/rtengine/iplabregions.cc index 932b7e18d..cea23bc6b 100644 --- a/rtengine/iplabregions.cc +++ b/rtengine/iplabregions.cc @@ -56,7 +56,8 @@ void fastlin2log(float *x, float factor, float base, int w) } -namespace rtengine { +namespace rtengine +{ void ImProcFunctions::labColorCorrectionRegions(LabImage *lab) { diff --git a/rtengine/iplocalcontrast.cc b/rtengine/iplocalcontrast.cc index 4e6c32e7e..d6f3ebb5b 100644 --- a/rtengine/iplocalcontrast.cc +++ b/rtengine/iplocalcontrast.cc @@ -32,7 +32,8 @@ #include "improcfun.h" #include "procparams.h" -namespace rtengine { +namespace rtengine +{ void ImProcFunctions::localContrast(LabImage *lab) { diff --git a/rtengine/ipshadowshighlights.cc b/rtengine/ipshadowshighlights.cc index a1e91c4ab..0eceb5a3b 100644 --- a/rtengine/ipshadowshighlights.cc +++ b/rtengine/ipshadowshighlights.cc @@ -30,7 +30,8 @@ #include "sleef.c" -namespace rtengine { +namespace rtengine +{ void ImProcFunctions::shadowsHighlights(LabImage *lab) { diff --git a/rtengine/pdaflinesfilter.cc b/rtengine/pdaflinesfilter.cc index 350c6f758..e788c6c83 100644 --- a/rtengine/pdaflinesfilter.cc +++ b/rtengine/pdaflinesfilter.cc @@ -18,18 +18,18 @@ * along with RawTherapee. If not, see . */ +#include + +#include "camconst.h" #include "pdaflinesfilter.h" #include "rawimage.h" #include "settings.h" -#include -#include "camconst.h" -namespace rtengine { +namespace rtengine +{ -extern const Settings *settings; - - -namespace { +namespace +{ class PDAFGreenEqulibrateThreshold: public RawImageSource::GreenEqulibrateThreshold { static constexpr float BASE_THRESHOLD = 0.5f; @@ -167,8 +167,6 @@ private: } // namespace - - PDAFLinesFilter::PDAFLinesFilter(RawImage *ri): ri_(ri), W_(ri->get_width()), diff --git a/rtengine/pdaflinesfilter.h b/rtengine/pdaflinesfilter.h index e2904716e..c3d8b47f4 100644 --- a/rtengine/pdaflinesfilter.h +++ b/rtengine/pdaflinesfilter.h @@ -21,10 +21,12 @@ #pragma once #include -#include "rawimagesource.h" -#include "noncopyable.h" -namespace rtengine { +#include "noncopyable.h" +#include "rawimagesource.h" + +namespace rtengine +{ class RawImage; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 6917d856e..b77eac29c 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -526,7 +526,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = { }; -namespace rtengine { +namespace rtengine +{ RefreshMapper::RefreshMapper(): next_event_(rtengine::NUMOFEVENTS) diff --git a/rtengine/refreshmap.h b/rtengine/refreshmap.h index 3f4831329..0f3e5ee90 100644 --- a/rtengine/refreshmap.h +++ b/rtengine/refreshmap.h @@ -16,10 +16,10 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef __REFRESHMAP__ -#define __REFRESHMAP__ +#pragma once #include + #include "procevents.h" // Use M_VOID if you wish to update the proc params without updating the preview at all ! @@ -80,7 +80,8 @@ extern int refreshmap[]; -namespace rtengine { +namespace rtengine +{ class RefreshMapper { public: @@ -97,5 +98,3 @@ private: }; } // namespace rtengine - -#endif diff --git a/rtengine/rescale.h b/rtengine/rescale.h index 8e1f99271..70974aa48 100644 --- a/rtengine/rescale.h +++ b/rtengine/rescale.h @@ -23,7 +23,8 @@ #include "array2D.h" #include "rt_math.h" -namespace rtengine { +namespace rtengine +{ inline float getBilinearValue(const array2D &src, float x, float y) { @@ -96,5 +97,4 @@ inline void rescaleNearest(const array2D &src, array2D &dst, bool } } - } // namespace rtengine diff --git a/rtengine/rtlensfun.cc b/rtengine/rtlensfun.cc index 1fcb5ec26..665fbd199 100644 --- a/rtengine/rtlensfun.cc +++ b/rtengine/rtlensfun.cc @@ -18,15 +18,15 @@ * along with RawTherapee. If not, see . */ -#include "rtlensfun.h" -#include "imagedata.h" -#include "procparams.h" -#include "settings.h" #include -namespace rtengine { +#include "imagedata.h" +#include "procparams.h" +#include "rtlensfun.h" +#include "settings.h" -extern const Settings *settings; +namespace rtengine +{ //----------------------------------------------------------------------------- // LFModifier diff --git a/rtengine/rtlensfun.h b/rtengine/rtlensfun.h index 9c95ca3aa..7dcd96007 100644 --- a/rtengine/rtlensfun.h +++ b/rtengine/rtlensfun.h @@ -30,7 +30,8 @@ #include "lcp.h" #include "noncopyable.h" -namespace rtengine { +namespace rtengine +{ class FramesMetaData; @@ -39,6 +40,7 @@ namespace procparams struct CoarseTransformParams; struct LensProfParams; + } class LFModifier final : diff --git a/rtengine/tmo_fattal02.cc b/rtengine/tmo_fattal02.cc index 31671bd0c..d28606edb 100644 --- a/rtengine/tmo_fattal02.cc +++ b/rtengine/tmo_fattal02.cc @@ -50,32 +50,32 @@ * $Id: tmo_fattal02.cpp,v 1.3 2008/11/04 23:43:08 rafm Exp $ */ - #ifdef _OPENMP #include #endif + +#include #include #include #include -#include -#include #include +#include -#include #include #include +#include #include "array2D.h" +#include "iccstore.h" #include "imagefloat.h" #include "improcfun.h" -#include "settings.h" -#include "iccstore.h" -#include "StopWatch.h" -#include "sleef.c" #include "opthelper.h" -#include "rt_algo.h" -#include "rescale.h" #include "procparams.h" +#include "rescale.h" +#include "rt_algo.h" +#include "settings.h" +#include "sleef.c" +#include "StopWatch.h" namespace rtengine { @@ -84,7 +84,6 @@ namespace rtengine * RT code ******************************************************************************/ -extern const Settings *settings; extern MyMutex *fftwMutex; using namespace std; diff --git a/rtgui/cropwindow.h b/rtgui/cropwindow.h index be07db5c9..db44a2508 100644 --- a/rtgui/cropwindow.h +++ b/rtgui/cropwindow.h @@ -16,27 +16,31 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _CROPWINDOW_ -#define _CROPWINDOW_ +#pragma once + +#include #include -#include "lwbutton.h" -#include "lwbuttonset.h" -#include "editenums.h" -#include "crophandler.h" -#include + #include "cropguilistener.h" -#include "pointermotionlistener.h" +#include "crophandler.h" #include "cursormanager.h" #include "editbuffer.h" #include "editcoordsys.h" +#include "editenums.h" +#include "lwbutton.h" +#include "lwbuttonset.h" +#include "pointermotionlistener.h" + #include "../rtengine/noncopyable.h" -namespace rtengine { +namespace rtengine +{ -class Coord; +struct Coord; } + class CropWindow; class CropWindowListener @@ -243,5 +247,3 @@ public: ImageArea* getImageArea(); }; - -#endif diff --git a/rtgui/guiutils.h b/rtgui/guiutils.h index 038131b9b..18b650b82 100644 --- a/rtgui/guiutils.h +++ b/rtgui/guiutils.h @@ -16,8 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef __GUI_UTILS_ -#define __GUI_UTILS_ +#pragma once #include #include @@ -26,22 +25,24 @@ #include +#include "pathutils.h" +#include "threadutils.h" + #include "../rtengine/coord.h" #include "../rtengine/noncopyable.h" -#include "threadutils.h" +namespace rtengine +{ -// for convenience... -#include "pathutils.h" - -namespace rtengine { namespace procparams { class ProcParams; struct CropParams; + } + } class RTImage; @@ -654,5 +655,3 @@ inline Gtk::Window& getToplevelWindow (Gtk::Widget* widget) { return *static_cast (widget->get_toplevel ()); } - -#endif From add5c790d68b4ad1df9c06226c7a7971ba29a3a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Thu, 31 Oct 2019 10:20:50 +0100 Subject: [PATCH 111/208] `#pragma once` for our headers plus drive-by formatting --- rtengine/LUT.h | 7 +- rtengine/alignedbuffer.h | 5 +- rtengine/array2D.h | 5 +- rtengine/calc_distort.h | 5 +- rtengine/camconst.h | 5 +- rtengine/ciecam02.h | 6 +- rtengine/coord.h | 5 +- rtengine/coord2d.h | 5 +- rtengine/dcraw.h | 6 +- rtengine/dynamicprofile.h | 5 +- rtengine/gauss.h | 5 +- rtengine/iccmatrices.h | 4 +- rtengine/iimage.h | 16 ++-- rtengine/imagedata.h | 13 +-- rtengine/imageformat.h | 5 +- rtengine/imageio.h | 35 +++++---- rtengine/improccoordinator.h | 5 +- rtengine/improcfun.h | 15 ++-- rtengine/iptcpairs.h | 7 +- rtengine/jpeg.h | 6 +- rtengine/myfile.h | 11 ++- rtengine/previewimage.h | 6 +- rtengine/processingjob.h | 7 +- rtengine/procevents.h | 20 ++--- rtengine/profilestore.h | 10 +-- rtengine/rawimagesource_i.h | 6 +- rtengine/rawmetadatalocation.h | 6 +- rtengine/rtthumbnail.h | 13 ++- rtengine/shmap.h | 6 +- rtengine/simpleprocess.h | 17 +--- rtengine/stdimagesource.h | 5 +- rtexif/rtexif.h | 5 +- rtgui/addsetids.h | 6 +- rtgui/adjuster.h | 6 +- rtgui/batchqueue.h | 9 +-- rtgui/batchqueuebuttonset.h | 8 +- rtgui/batchqueueentry.h | 13 ++- rtgui/batchqueuepanel.h | 8 +- rtgui/batchtoolpanelcoord.h | 14 ++-- rtgui/bayerpreprocess.h | 6 +- rtgui/bayerprocess.h | 14 ++-- rtgui/bayerrawexposure.h | 28 +++---- rtgui/blackwhite.h | 12 ++- rtgui/bqentryupdater.h | 8 +- rtgui/browserfilter.h | 6 +- rtgui/cacheimagedata.h | 12 +-- rtgui/cachemanager.h | 12 +-- rtgui/cacorrection.h | 11 +-- rtgui/checkbox.h | 6 +- rtgui/chmixer.h | 11 +-- rtgui/clipboard.h | 5 +- rtgui/coarsepanel.h | 10 +-- rtgui/colorappearance.h | 24 +++--- rtgui/coloredbar.h | 5 +- rtgui/colorprovider.h | 8 +- rtgui/colortoning.h | 15 ++-- rtgui/coordinateadjuster.h | 6 +- rtgui/crop.h | 11 ++- rtgui/cropguilistener.h | 5 +- rtgui/crophandler.h | 11 +-- rtgui/cursormanager.h | 6 +- rtgui/curveeditor.h | 12 +-- rtgui/curveeditorgroup.h | 13 ++- rtgui/curvelistener.h | 5 +- rtgui/darkframe.h | 17 ++-- rtgui/defringe.h | 19 +++-- rtgui/diagonalcurveeditorsubgroup.h | 13 +-- rtgui/dirbrowser.h | 6 +- rtgui/dirpyrdenoise.h | 10 +-- rtgui/dirpyrequalizer.h | 21 ++--- rtgui/distortion.h | 17 ++-- rtgui/dynamicprofilepanel.h | 12 +-- rtgui/editedstate.h | 6 +- rtgui/editenums.h | 5 +- rtgui/editid.h | 6 +- rtgui/editorpanel.h | 30 ++++--- rtgui/editwindow.h | 18 ++--- rtgui/epd.h | 11 +-- rtgui/exiffiltersettings.h | 6 +- rtgui/exifpanel.h | 9 +-- rtgui/exportpanel.h | 8 +- rtgui/extprog.h | 10 +-- rtgui/favoritbrowser.h | 16 ++-- rtgui/filebrowser.h | 22 +++--- rtgui/filebrowserentry.h | 10 +-- rtgui/filecatalog.h | 24 +++--- rtgui/filepanel.h | 22 +++--- rtgui/fileselectionchangelistener.h | 6 +- rtgui/fileselectionlistener.h | 8 +- rtgui/filethumbnailbuttonset.h | 12 +-- rtgui/filmsimulation.h | 21 ++--- rtgui/filterpanel.h | 6 +- rtgui/flatcurveeditorsubgroup.h | 11 +-- rtgui/flatfield.h | 12 +-- rtgui/gradient.h | 14 ++-- rtgui/histogrampanel.h | 20 ++--- rtgui/history.h | 11 ++- rtgui/hsvequalizer.h | 20 ++--- rtgui/icmpanel.h | 11 ++- rtgui/ilabel.h | 9 +-- rtgui/imagearea.h | 27 ++++--- rtgui/imageareapanel.h | 9 +-- rtgui/imageareatoollistener.h | 10 +-- rtgui/impulsedenoise.h | 11 +-- rtgui/indclippedpanel.h | 12 +-- rtgui/inspector.h | 7 +- rtgui/iptcpanel.h | 9 +-- rtgui/labcurve.h | 17 ++-- rtgui/lensgeom.h | 14 ++-- rtgui/lensgeomlistener.h | 5 +- rtgui/lockablecolorpicker.h | 8 +- rtgui/lwbutton.h | 6 +- rtgui/multilangmgr.h | 5 +- rtgui/mycurve.h | 14 ++-- rtgui/mydiagonalcurve.h | 17 ++-- rtgui/myflatcurve.h | 11 ++- rtgui/navigator.h | 16 ++-- rtgui/partialpastedlg.h | 7 +- rtgui/pcvignette.h | 11 +-- rtgui/perspective.h | 11 +-- rtgui/placesbrowser.h | 12 ++- rtgui/pointermotionlistener.h | 7 +- rtgui/popupbutton.h | 10 +-- rtgui/popupcommon.h | 9 ++- rtgui/popuptogglebutton.h | 10 +-- rtgui/pparamschangelistener.h | 12 ++- rtgui/preferences.h | 24 +++--- rtgui/preprocess.h | 14 ++-- rtgui/previewhandler.h | 9 +-- rtgui/previewloader.h | 10 +-- rtgui/previewmodepanel.h | 12 +-- rtgui/previewwindow.h | 19 ++--- rtgui/profilechangelistener.h | 6 +- rtgui/profilepanel.h | 22 +++--- rtgui/profilestorecombobox.h | 15 ++-- rtgui/progressconnector.h | 11 +-- rtgui/prsharpening.h | 12 +-- rtgui/rawcacorrection.h | 12 +-- rtgui/rawexposure.h | 11 +-- rtgui/recentbrowser.h | 15 ++-- rtgui/renamedlg.h | 10 +-- rtgui/resize.h | 8 +- rtgui/retinex.h | 22 +++--- rtgui/rgbcurves.h | 16 ++-- rtgui/rotate.h | 17 ++-- rtgui/rtwindow.h | 28 ++++--- rtgui/saveasdlg.h | 11 ++- rtgui/saveformatpanel.h | 7 +- rtgui/sensorbayer.h | 10 +-- rtgui/sensorxtrans.h | 10 +-- rtgui/shadowshighlights.h | 11 +-- rtgui/sharpenedge.h | 11 +-- rtgui/sharpening.h | 12 +-- rtgui/sharpenmicro.h | 11 +-- rtgui/shcselector.h | 7 +- rtgui/soundman.h | 8 +- rtgui/splash.h | 8 +- rtgui/threadutils.h | 5 +- rtgui/thresholdadjuster.h | 6 +- rtgui/thresholdselector.h | 14 ++-- rtgui/thumbbrowserbase.h | 19 ++--- rtgui/thumbimageupdater.h | 9 +-- rtgui/thumbnail.h | 16 ++-- rtgui/thumbnailbrowser.h | 8 +- rtgui/thumbnaillistener.h | 6 +- rtgui/tonecurve.h | 17 ++-- rtgui/toolbar.h | 8 +- rtgui/toolenum.h | 5 +- rtgui/toolpanel.h | 26 +++--- rtgui/toolpanelcoord.h | 118 ++++++++++++++-------------- rtgui/vibrance.h | 18 +++-- rtgui/vignetting.h | 11 +-- rtgui/wbprovider.h | 6 +- rtgui/whitebalance.h | 9 +-- rtgui/xtransprocess.h | 14 ++-- rtgui/xtransrawexposure.h | 11 +-- rtgui/zoompanel.h | 10 +-- 177 files changed, 946 insertions(+), 1158 deletions(-) diff --git a/rtengine/LUT.h b/rtengine/LUT.h index f1090eefa..d1ed67c2b 100644 --- a/rtengine/LUT.h +++ b/rtengine/LUT.h @@ -56,8 +56,7 @@ * LUTuc stands for LUT */ -#ifndef LUT_H_ -#define LUT_H_ +#pragma once #include #include @@ -67,9 +66,9 @@ #include #endif +#include "noncopyable.h" #include "opthelper.h" #include "rt_math.h" -#include "noncopyable.h" // Bit representations of flags enum { @@ -628,5 +627,3 @@ public: }; - -#endif /* LUT_H_ */ diff --git a/rtengine/alignedbuffer.h b/rtengine/alignedbuffer.h index b2c720bd8..05a965766 100644 --- a/rtengine/alignedbuffer.h +++ b/rtengine/alignedbuffer.h @@ -16,8 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _ALIGNEDBUFFER_ -#define _ALIGNEDBUFFER_ +#pragma once #include #include @@ -142,5 +141,3 @@ public: return unitSize ? allocatedSize / unitSize : 0; } }; - -#endif diff --git a/rtengine/array2D.h b/rtengine/array2D.h index d25e20a83..208dab1aa 100644 --- a/rtengine/array2D.h +++ b/rtengine/array2D.h @@ -52,8 +52,8 @@ * * !! locked arrays cannot be resized and cannot be unlocked again !! */ -#ifndef ARRAY2D_H_ -#define ARRAY2D_H_ +#pragma once + #include // for raise() #include @@ -313,4 +313,3 @@ public: return list[index]; } }; -#endif /* array2D_H_ */ diff --git a/rtengine/calc_distort.h b/rtengine/calc_distort.h index 711bf9515..7d0c5ef54 100644 --- a/rtengine/calc_distort.h +++ b/rtengine/calc_distort.h @@ -1,4 +1,3 @@ -#ifndef CALC_DISTORTION__H -#define CALC_DISTORTION__H +#pragma once + int calcDistortion (unsigned char* img1, unsigned char* img2, int ncols, int nrows, int nfactor, double &distortion); -#endif diff --git a/rtengine/camconst.h b/rtengine/camconst.h index 89180fbb5..1096e1767 100644 --- a/rtengine/camconst.h +++ b/rtengine/camconst.h @@ -1,8 +1,7 @@ /* * This file is part of RawTherapee. */ -#ifndef __CAMCONST__ -#define __CAMCONST__ +#pragma once #include #include @@ -73,5 +72,3 @@ public: }; } - -#endif diff --git a/rtengine/ciecam02.h b/rtengine/ciecam02.h index fea35ab12..68252f2f6 100644 --- a/rtengine/ciecam02.h +++ b/rtengine/ciecam02.h @@ -16,9 +16,10 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _CIECAM02_ -#define _CIECAM02_ +#pragma once + #include + #include "LUT.h" #include "opthelper.h" @@ -106,4 +107,3 @@ public: }; } -#endif diff --git a/rtengine/coord.h b/rtengine/coord.h index 5f16cf606..6a7decdda 100644 --- a/rtengine/coord.h +++ b/rtengine/coord.h @@ -17,8 +17,7 @@ * along with RawTherapee. If not, see . */ -#ifndef __COORD__ -#define __COORD__ +#pragma once namespace rtengine { @@ -253,5 +252,3 @@ inline const PolarCoord operator* (const double lhs, const PolarCoord& rhs) } } - -#endif diff --git a/rtengine/coord2d.h b/rtengine/coord2d.h index 252219e47..9f0784b9a 100644 --- a/rtengine/coord2d.h +++ b/rtengine/coord2d.h @@ -16,8 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef __COORD2D__ -#define __COORD2D__ +#pragma once namespace rtengine { @@ -35,5 +34,5 @@ public: y = y_; } }; + } -#endif diff --git a/rtengine/dcraw.h b/rtengine/dcraw.h index fdebda0cc..eaf1fe35e 100644 --- a/rtengine/dcraw.h +++ b/rtengine/dcraw.h @@ -17,8 +17,7 @@ * along with RawTherapee. If not, see . */ -#ifndef DCRAW_H -#define DCRAW_H +#pragma once #include "myfile.h" #include @@ -529,6 +528,3 @@ void shiftXtransMatrix( const int offsy, const int offsx) { void nikon_14bit_load_raw(); // ported from LibRaw }; - - -#endif //DCRAW_H diff --git a/rtengine/dynamicprofile.h b/rtengine/dynamicprofile.h index e23c57b49..9b893fae2 100644 --- a/rtengine/dynamicprofile.h +++ b/rtengine/dynamicprofile.h @@ -16,8 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _DYNAMICPROFILE_H_ -#define _DYNAMICPROFILE_H_ +#pragma once #include #include @@ -76,5 +75,3 @@ public: const std::vector &getRules(); void setRules (const std::vector &r); }; - -#endif // _DYNAMICPROFILE_H_ diff --git a/rtengine/gauss.h b/rtengine/gauss.h index f78762df3..e226bbc13 100644 --- a/rtengine/gauss.h +++ b/rtengine/gauss.h @@ -16,11 +16,8 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _GAUSS_H_ -#define _GAUSS_H_ +#pragma once enum eGaussType {GAUSS_STANDARD, GAUSS_MULT, GAUSS_DIV}; void gaussianBlur(float** src, float** dst, const int W, const int H, const double sigma, bool useBoxBlur = false, eGaussType gausstype = GAUSS_STANDARD, float** buffer2 = nullptr); - -#endif \ No newline at end of file diff --git a/rtengine/iccmatrices.h b/rtengine/iccmatrices.h index 3e0d0b5d6..5b9883421 100644 --- a/rtengine/iccmatrices.h +++ b/rtengine/iccmatrices.h @@ -16,8 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _ICCMATRICES_ -#define _ICCMATRICES_ +#pragma once // Bradford transform between illuminants constexpr double d65_d50[3][3] = { @@ -296,4 +295,3 @@ constexpr double d50_best[3][3] = { {-0.253000840399762, 0.0215532098817316,1.22569552576991} }; */ -#endif diff --git a/rtengine/iimage.h b/rtengine/iimage.h index 11eb3e482..3c39b7659 100644 --- a/rtengine/iimage.h +++ b/rtengine/iimage.h @@ -16,17 +16,19 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _IIMAGE_ -#define _IIMAGE_ +#pragma once + +#include #include -#include -#include "rt_math.h" + #include "alignedbuffer.h" +#include "color.h" +#include "coord2d.h" #include "imagedimensions.h" #include "LUT.h" -#include "coord2d.h" -#include "color.h" +#include "rt_math.h" + #include "../rtgui/threadutils.h" #define TR_NONE 0 @@ -1808,5 +1810,3 @@ public: }; } - -#endif diff --git a/rtengine/imagedata.h b/rtengine/imagedata.h index 66c4285b9..0b75e263b 100644 --- a/rtengine/imagedata.h +++ b/rtengine/imagedata.h @@ -16,17 +16,21 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef __IMAGEDATA_H__ -#define __IMAGEDATA_H__ +#pragma once #include #include #include +#include + #include -#include "imageio.h" -#include "../rtexif/rtexif.h" + #include +#include "imageio.h" + +#include "../rtexif/rtexif.h" + namespace rtengine { @@ -132,4 +136,3 @@ public: } -#endif diff --git a/rtengine/imageformat.h b/rtengine/imageformat.h index dc40cf147..f8fee4c59 100644 --- a/rtengine/imageformat.h +++ b/rtengine/imageformat.h @@ -16,8 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _IMAGEFORMAT_ -#define _IMAGEFORMAT_ +#pragma once namespace rtengine { @@ -51,5 +50,3 @@ typedef enum SensorType { } eSensorType; } - -#endif diff --git a/rtengine/imageio.h b/rtengine/imageio.h index c74756614..251187547 100644 --- a/rtengine/imageio.h +++ b/rtengine/imageio.h @@ -16,27 +16,31 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _IMAGEIO_ -#define _IMAGEIO_ - -#define IMIO_SUCCESS 0 -#define IMIO_CANNOTREADFILE 1 -#define IMIO_INVALIDHEADER 2 -#define IMIO_HEADERERROR 3 -#define IMIO_READERROR 4 -#define IMIO_VARIANTNOTSUPPORTED 5 -#define IMIO_FILETYPENOTSUPPORTED 6 -#define IMIO_CANNOTWRITEFILE 7 +#pragma once #include #include + #include -#include "rtengine.h" -#include "imageformat.h" -#include "../rtexif/rtexif.h" -#include "imagedimensions.h" + #include "iimage.h" +#include "imagedimensions.h" +#include "imageformat.h" +#include "rtengine.h" + +#include "../rtexif/rtexif.h" + +enum { + IMIO_SUCCESS, + IMIO_CANNOTREADFILE, + IMIO_INVALIDHEADER, + IMIO_HEADERERROR, + IMIO_READERROR, + IMIO_VARIANTNOTSUPPORTED, + IMIO_FILETYPENOTSUPPORTED, + IMIO_CANNOTWRITEFILE +}; namespace rtengine { @@ -111,4 +115,3 @@ public: }; } -#endif diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index 71bca1d8a..c416ebe67 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -16,8 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _IMPROCCOORDINATOR_H_ -#define _IMPROCCOORDINATOR_H_ +#pragma once #include @@ -410,5 +409,5 @@ public: } denoiseInfoStore; }; + } -#endif diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index a47ba2980..a8c3ededb 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -16,16 +16,15 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _IMPROCFUN_H_ -#define _IMPROCFUN_H_ +#pragma once -#include "shmap.h" -#include "coord2d.h" #include "color.h" -#include "LUT.h" -#include "lcp.h" -#include "pipettebuffer.h" +#include "coord2d.h" #include "gamutwarning.h" +#include "lcp.h" +#include "LUT.h" +#include "pipettebuffer.h" +#include "shmap.h" template class multi_array2D; @@ -272,5 +271,5 @@ public: void rgb2lab(const Imagefloat &src, LabImage &dst, const Glib::ustring &workingSpace); void lab2rgb(const LabImage &src, Imagefloat &dst, const Glib::ustring &workingSpace); }; + } -#endif diff --git a/rtengine/iptcpairs.h b/rtengine/iptcpairs.h index 21099735a..af45d7d38 100644 --- a/rtengine/iptcpairs.h +++ b/rtengine/iptcpairs.h @@ -16,9 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _IPTCPAIRS_ -#define _IPTCPAIRS_ - +#pragma once struct IptcPair { IptcTag tag; @@ -44,6 +42,3 @@ const IptcPair strTags[] = { {IPTC_TAG_ORIG_TRANS_REF, 32, "TransReference"}, {IPTC_TAG_DATE_CREATED, 8, "DateCreated"} }; - -#endif - diff --git a/rtengine/jpeg.h b/rtengine/jpeg.h index 99baecc5a..9b1f45f1d 100644 --- a/rtengine/jpeg.h +++ b/rtengine/jpeg.h @@ -1,5 +1,4 @@ -#ifndef _RT_JPEG_H -#define _RT_JPEG_H +#pragma once #include @@ -29,6 +28,3 @@ typedef struct { #ifdef __cplusplus } #endif - - -#endif diff --git a/rtengine/myfile.h b/rtengine/myfile.h index f2ed4150c..69e226b8b 100644 --- a/rtengine/myfile.h +++ b/rtengine/myfile.h @@ -16,13 +16,15 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _MYFILE_ -#define _MYFILE_ +#pragma once -#include #include #include + +#include + #include "rtengine.h" + struct IMFILE { int fd; ssize_t pos; @@ -134,6 +136,3 @@ inline unsigned char* fdata(int offset, IMFILE* f) int fscanf (IMFILE* f, const char* s ...); char* fgets (char* s, int n, IMFILE* f); - -#endif - diff --git a/rtengine/previewimage.h b/rtengine/previewimage.h index aac5eabe5..e6c3ea070 100644 --- a/rtengine/previewimage.h +++ b/rtengine/previewimage.h @@ -16,10 +16,10 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _PREVIEWIMAGE_ -#define _PREVIEWIMAGE_ +#pragma once #include + #include namespace rtengine @@ -52,5 +52,3 @@ public: }; } - -#endif diff --git a/rtengine/processingjob.h b/rtengine/processingjob.h index 004eb006f..6cdc6bd7c 100644 --- a/rtengine/processingjob.h +++ b/rtengine/processingjob.h @@ -16,11 +16,10 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _PROCESSINGJOB_ -#define _PROCESSINGJOB_ +#pragma once -#include "rtengine.h" #include "procparams.h" +#include "rtengine.h" namespace rtengine { @@ -55,5 +54,3 @@ public: }; } - -#endif diff --git a/rtengine/procevents.h b/rtengine/procevents.h index ca098f216..1b00d4218 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -16,15 +16,11 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef __PROCEVENT__ -#define __PROCEVENT__ +#pragma once namespace rtengine { - - - // Aligned so the first entry starts on line 30 enum ProcEventCode { EvPhotoLoaded = 0, @@ -540,13 +536,11 @@ private: }; -inline bool operator==(ProcEvent a, ProcEvent b) { return int(a) == int(b); } -inline bool operator==(ProcEvent a, ProcEventCode b) { return int(a) == int(b); } -inline bool operator==(ProcEventCode a, ProcEvent b) { return int(a) == int(b); } -inline bool operator!=(ProcEvent a, ProcEvent b) { return int(a) != int(b); } -inline bool operator!=(ProcEvent a, ProcEventCode b) { return int(a) != int(b); } -inline bool operator!=(ProcEventCode a, ProcEvent b) { return int(a) != int(b); } +inline bool operator ==(ProcEvent a, ProcEvent b) { return int(a) == int(b); } +inline bool operator ==(ProcEvent a, ProcEventCode b) { return int(a) == int(b); } +inline bool operator ==(ProcEventCode a, ProcEvent b) { return int(a) == int(b); } +inline bool operator !=(ProcEvent a, ProcEvent b) { return int(a) != int(b); } +inline bool operator !=(ProcEvent a, ProcEventCode b) { return int(a) != int(b); } +inline bool operator !=(ProcEventCode a, ProcEvent b) { return int(a) != int(b); } } -#endif - diff --git a/rtengine/profilestore.h b/rtengine/profilestore.h index 3b7bc7f9d..08afc88f3 100644 --- a/rtengine/profilestore.h +++ b/rtengine/profilestore.h @@ -16,16 +16,16 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _PROFILESTORE_ -#define _PROFILESTORE_ +#pragma once #include #include + #include -#include "rtengine.h" -#include "noncopyable.h" #include "dynamicprofile.h" +#include "noncopyable.h" +#include "rtengine.h" // forward decl namespace rtengine @@ -211,5 +211,3 @@ public: void dumpFolderList(); }; - -#endif diff --git a/rtengine/rawimagesource_i.h b/rtengine/rawimagesource_i.h index 485205d9d..47c6b5bab 100644 --- a/rtengine/rawimagesource_i.h +++ b/rtengine/rawimagesource_i.h @@ -16,9 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ - -#ifndef RAWIMAGESOURCE_I_H_INCLUDED -#define RAWIMAGESOURCE_I_H_INCLUDED +#pragma once #include "rawimagesource.h" @@ -184,5 +182,3 @@ inline void RawImageSource::interpolate_row_rb_mul_pp (const array2D &raw } } - -#endif diff --git a/rtengine/rawmetadatalocation.h b/rtengine/rawmetadatalocation.h index 559815a4f..894bc6bd2 100644 --- a/rtengine/rawmetadatalocation.h +++ b/rtengine/rawmetadatalocation.h @@ -16,8 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _RAWMETADATALOCATION_ -#define _RAWMETADATALOCATION_ +#pragma once namespace rtengine { @@ -36,6 +35,3 @@ public: }; } - -#endif - diff --git a/rtengine/rtthumbnail.h b/rtengine/rtthumbnail.h index a1df25224..473c74e7c 100644 --- a/rtengine/rtthumbnail.h +++ b/rtengine/rtthumbnail.h @@ -16,15 +16,17 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _THUMBPROCESSINGPARAMETERS_ -#define _THUMBPROCESSINGPARAMETERS_ +#pragma once -#include "rawmetadatalocation.h" #include + #include -#include "image8.h" + #include "image16.h" +#include "image8.h" #include "imagefloat.h" +#include "rawmetadatalocation.h" + #include "../rtgui/threadutils.h" namespace rtengine @@ -160,6 +162,3 @@ public: } }; } - -#endif - diff --git a/rtengine/shmap.h b/rtengine/shmap.h index f07759a2c..b40e872bb 100644 --- a/rtengine/shmap.h +++ b/rtengine/shmap.h @@ -16,14 +16,14 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef __SHMAP__ -#define __SHMAP__ +#pragma once #include "LUT.h" #include "noncopyable.h" namespace rtengine { + class Imagefloat; class SHMap : @@ -49,5 +49,5 @@ private: void dirpyr_shmap(float ** data_fine, float ** data_coarse, int width, int height, LUTf & rangefn, int level, int scale); }; + } -#endif diff --git a/rtengine/simpleprocess.h b/rtengine/simpleprocess.h index d6efe802d..9b41b4643 100644 --- a/rtengine/simpleprocess.h +++ b/rtengine/simpleprocess.h @@ -4,24 +4,11 @@ * * Created on September 18, 2010, 8:31 PM */ +#pragma once -#ifndef SIMPLEPROCESS_H -#define SIMPLEPROCESS_H - -#ifdef __cplusplus -extern "C" { -#endif - - - - -#ifdef __cplusplus -} -#endif namespace rtengine { extern Glib::Thread *batchThread; -} -#endif /* SIMPLEPROCESS_H */ +} diff --git a/rtengine/stdimagesource.h b/rtengine/stdimagesource.h index b70c6554b..b95328c80 100644 --- a/rtengine/stdimagesource.h +++ b/rtengine/stdimagesource.h @@ -16,8 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _STDIMAGESOURCE_ -#define _STDIMAGESOURCE_ +#pragma once #include "colortemp.h" #include "imagesource.h" @@ -118,5 +117,5 @@ public: void flushRGB () override; void captureSharpening(const procparams::CaptureSharpeningParams &sharpeningParams, bool showMask, double &conrastThreshold, double &radius) override {}; }; + } -#endif diff --git a/rtexif/rtexif.h b/rtexif/rtexif.h index e89260932..515c7569d 100644 --- a/rtexif/rtexif.h +++ b/rtexif/rtexif.h @@ -16,8 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _MEXIF3_ -#define _MEXIF3_ +#pragma once #include #include @@ -687,5 +686,5 @@ extern const TagAttrib kodakIfdAttribs[]; void parseKodakIfdTextualInfo (Tag *textualInfo, Tag* exif); extern const TagAttrib panasonicAttribs[]; extern const TagAttrib panasonicRawAttribs[]; + } -#endif diff --git a/rtgui/addsetids.h b/rtgui/addsetids.h index 6a4ea83d3..46cf19ed5 100644 --- a/rtgui/addsetids.h +++ b/rtgui/addsetids.h @@ -1,6 +1,4 @@ -#ifndef _ADDSETIDS_ -#define _ADDSETIDS_ - +#pragma once // UPDATE THE DEFAULT VALUE IN OPTIONS.CC int babehav[] TOO !!! @@ -146,5 +144,3 @@ enum { ADDSET_PARAM_NUM // THIS IS USED AS A DELIMITER!! }; - -#endif diff --git a/rtgui/adjuster.h b/rtgui/adjuster.h index 52857a3d2..1583bab69 100644 --- a/rtgui/adjuster.h +++ b/rtgui/adjuster.h @@ -16,10 +16,10 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _ADJUSTER_H_ -#define _ADJUSTER_H_ +#pragma once #include + #include "editedstate.h" #include "guiutils.h" @@ -130,5 +130,3 @@ public: void trimValue (int &val) const; void setLogScale(double base, double pivot, bool anchorMiddle = false); }; - -#endif diff --git a/rtgui/batchqueue.h b/rtgui/batchqueue.h index 7248ac793..a0c04abee 100644 --- a/rtgui/batchqueue.h +++ b/rtgui/batchqueue.h @@ -15,19 +15,18 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _BATCHQUEUE_ -#define _BATCHQUEUE_ +#pragma once #include #include -#include "../rtengine/rtengine.h" - #include "batchqueueentry.h" #include "lwbuttonset.h" #include "threadutils.h" #include "thumbbrowserbase.h" + +#include "../rtengine/rtengine.h" #include "../rtengine/noncopyable.h" class BatchQueueListener @@ -123,5 +122,3 @@ private: IdleRegister idle_register; }; - -#endif diff --git a/rtgui/batchqueuebuttonset.h b/rtgui/batchqueuebuttonset.h index 19479ccc1..17f582168 100644 --- a/rtgui/batchqueuebuttonset.h +++ b/rtgui/batchqueuebuttonset.h @@ -16,12 +16,12 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _BATCHQUEUEBUTTONSET_ -#define _BATCHQUEUEBUTTONSET_ +#pragma once + +#include #include "lwbuttonset.h" #include "rtsurface.h" -#include class BatchQueueEntry; class BatchQueueButtonSet : public LWButtonSet @@ -40,5 +40,3 @@ public: explicit BatchQueueButtonSet (BatchQueueEntry* myEntry); }; - -#endif diff --git a/rtgui/batchqueueentry.h b/rtgui/batchqueueentry.h index 03097e55e..d56c0e340 100644 --- a/rtgui/batchqueueentry.h +++ b/rtgui/batchqueueentry.h @@ -16,17 +16,18 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _BATCHQUEUEENTRY_ -#define _BATCHQUEUEENTRY_ +#pragma once #include #include -#include "../rtengine/rtengine.h" + +#include "bqentryupdater.h" #include "thumbbrowserentrybase.h" #include "thumbnail.h" -#include "bqentryupdater.h" + #include "../rtengine/noncopyable.h" +#include "../rtengine/rtengine.h" class BatchQueueEntry; struct BatchQueueEntryIdleHelper { @@ -77,7 +78,3 @@ public: void updateImage (guint8* img, int w, int h, int origw, int origh, guint8* newOPreview) override; void _updateImage (guint8* img, int w, int h); // inside gtk thread }; - - - -#endif diff --git a/rtgui/batchqueuepanel.h b/rtgui/batchqueuepanel.h index 2f8e27057..590ec2347 100644 --- a/rtgui/batchqueuepanel.h +++ b/rtgui/batchqueuepanel.h @@ -16,15 +16,15 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _BATCHQUEUEPANEL_ -#define _BATCHQUEUEPANEL_ +#pragma once #include #include + #include "batchqueue.h" -#include "saveformatpanel.h" #include "guiutils.h" +#include "saveformatpanel.h" class RTWindow; class FileCatalog; @@ -83,5 +83,3 @@ private: void formatChanged(const Glib::ustring& format) override; void updateTab (int qsize, int forceOrientation = 0); // forceOrientation=0: base on options / 1: horizontal / 2: vertical }; -#endif - diff --git a/rtgui/batchtoolpanelcoord.h b/rtgui/batchtoolpanelcoord.h index 53741be49..6c64e15ea 100644 --- a/rtgui/batchtoolpanelcoord.h +++ b/rtgui/batchtoolpanelcoord.h @@ -16,16 +16,16 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef __BATCHTOOLPANELCCORD__ -#define __BATCHTOOLPANELCCORD__ +#pragma once -#include "thumbnail.h" -#include "toolpanelcoord.h" #include "fileselectionchangelistener.h" -#include "../rtengine/procparams.h" -#include "../rtengine/procevents.h" #include "paramsedited.h" +#include "thumbnail.h" #include "thumbnaillistener.h" +#include "toolpanelcoord.h" + +#include "../rtengine/procevents.h" +#include "../rtengine/procparams.h" class FilePanel; class BatchToolPanelCoordinator : @@ -85,5 +85,3 @@ public: void optionsChanged (); }; - -#endif diff --git a/rtgui/bayerpreprocess.h b/rtgui/bayerpreprocess.h index 9114c37d4..c07bbcba4 100644 --- a/rtgui/bayerpreprocess.h +++ b/rtgui/bayerpreprocess.h @@ -16,10 +16,10 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _BAYERPREPROCESS_H_ -#define _BAYERPREPROCESS_H_ +#pragma once #include + #include "adjuster.h" #include "toolpanel.h" @@ -53,5 +53,3 @@ public: void lineDenoiseDirectionChanged(); void pdafLinesFilterChanged(); }; - -#endif diff --git a/rtgui/bayerprocess.h b/rtgui/bayerprocess.h index 893010e65..04985dc66 100644 --- a/rtgui/bayerprocess.h +++ b/rtgui/bayerprocess.h @@ -16,16 +16,22 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _BAYERPROCESS_H_ -#define _BAYERPROCESS_H_ +#pragma once #include + #include "adjuster.h" #include "checkbox.h" #include "guiutils.h" #include "toolpanel.h" -class BayerProcess : public ToolParamBlock, public AdjusterListener, public CheckBoxListener, public FoldableToolPanel, public rtengine::FrameCountListener, public rtengine::AutoContrastListener +class BayerProcess : + public ToolParamBlock, + public AdjusterListener, + public CheckBoxListener, + public FoldableToolPanel, + public rtengine::FrameCountListener, + public rtengine::AutoContrastListener { protected: @@ -89,5 +95,3 @@ public: void autoContrastChanged (double autoContrast) override; void FrameCountChanged(int n, int frameNum) override; }; - -#endif diff --git a/rtgui/bayerrawexposure.h b/rtgui/bayerrawexposure.h index 5825383be..247bf6ff0 100644 --- a/rtgui/bayerrawexposure.h +++ b/rtgui/bayerrawexposure.h @@ -16,26 +16,21 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _BAYERRAWEXPOSURE_H_ -#define _BAYERRAWEXPOSURE_H_ +#pragma once #include + #include "adjuster.h" #include "checkbox.h" #include "toolpanel.h" -class BayerRAWExposure : public ToolParamBlock, public AdjusterListener, public CheckBoxListener, public FoldableToolPanel +class BayerRAWExposure : + public ToolParamBlock, + public AdjusterListener, + public CheckBoxListener, + public FoldableToolPanel { - -protected: - Adjuster* PexBlack0; - Adjuster* PexBlack1; - Adjuster* PexBlack2; - Adjuster* PexBlack3; - CheckBox* PextwoGreen; - public: - BayerRAWExposure (); void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; @@ -46,6 +41,11 @@ public: void checkBoxToggled (CheckBox* c, CheckValue newval) override; void setAdjusterBehavior (bool pexblackadd); void trimValues (rtengine::procparams::ProcParams* pp) override; -}; -#endif +protected: + Adjuster* PexBlack0; + Adjuster* PexBlack1; + Adjuster* PexBlack2; + Adjuster* PexBlack3; + CheckBox* PextwoGreen; +}; diff --git a/rtgui/blackwhite.h b/rtgui/blackwhite.h index 36234cda5..9f504fd4f 100644 --- a/rtgui/blackwhite.h +++ b/rtgui/blackwhite.h @@ -16,17 +16,17 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _BLACKWHITE_H_ -#define _BLACKWHITE_H_ +#pragma once #include + #include "adjuster.h" -#include "toolpanel.h" -#include "guiutils.h" +#include "colorprovider.h" #include "curveeditor.h" #include "curveeditorgroup.h" +#include "guiutils.h" #include "mycurve.h" -#include "colorprovider.h" +#include "toolpanel.h" class EditDataProvider; @@ -144,5 +144,3 @@ private: IdleRegister idle_register; }; - -#endif diff --git a/rtgui/bqentryupdater.h b/rtgui/bqentryupdater.h index 9e3e09a51..6dbb4bedf 100644 --- a/rtgui/bqentryupdater.h +++ b/rtgui/bqentryupdater.h @@ -16,15 +16,15 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _BQENTRYUPDATER_ -#define _BQENTRYUPDATER_ +#pragma once #include -#include "../rtengine/rtengine.h" #include "threadutils.h" #include "thumbnail.h" +#include "../rtengine/rtengine.h" + class BQEntryUpdateListener { @@ -62,5 +62,3 @@ public: }; extern BatchQueueEntryUpdater batchQueueEntryUpdater; - -#endif diff --git a/rtgui/browserfilter.h b/rtgui/browserfilter.h index 11bfd9920..df9a94c11 100644 --- a/rtgui/browserfilter.h +++ b/rtgui/browserfilter.h @@ -16,8 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _BROWSERFILTER_ -#define _BROWSERFILTER_ +#pragma once #include @@ -25,7 +24,6 @@ class BrowserFilter { - public: bool showRanked[6]; bool showCLabeled[6]; @@ -42,5 +40,3 @@ public: BrowserFilter (); }; - -#endif diff --git a/rtgui/cacheimagedata.h b/rtgui/cacheimagedata.h index 56b4ad434..caab1de5b 100644 --- a/rtgui/cacheimagedata.h +++ b/rtgui/cacheimagedata.h @@ -16,17 +16,18 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _CACHEIMAGEDATA_ -#define _CACHEIMAGEDATA_ +#pragma once #include + #include "options.h" -#include "../rtengine/rtengine.h" + #include "../rtengine/imageformat.h" +#include "../rtengine/rtengine.h" -class CacheImageData: public rtengine::FramesMetaData +class CacheImageData : + public rtengine::FramesMetaData { - public: // basic information @@ -115,4 +116,3 @@ public: std::string getImageType (unsigned int frame) const override { return isPixelShift ? "PS" : isHDR ? "HDR" : "STD"; } rtengine::IIOSampleFormat getSampleFormat (unsigned int frame = 0) const override { return sampleFormat; } }; -#endif diff --git a/rtgui/cachemanager.h b/rtgui/cachemanager.h index 3e987866d..56370e966 100644 --- a/rtgui/cachemanager.h +++ b/rtgui/cachemanager.h @@ -16,18 +16,17 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _CACHEMANAGER_ -#define _CACHEMANAGER_ +#pragma once -#include #include +#include #include -#include "../rtengine/noncopyable.h" - #include "threadutils.h" +#include "../rtengine/noncopyable.h" + class Thumbnail; class CacheManager : @@ -70,6 +69,3 @@ public: }; #define cacheMgr CacheManager::getInstance() - -#endif - diff --git a/rtgui/cacorrection.h b/rtgui/cacorrection.h index f6e1f89e3..6e1667a00 100644 --- a/rtgui/cacorrection.h +++ b/rtgui/cacorrection.h @@ -16,14 +16,17 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _CACORRECTION_H_ -#define _CACORRECTION_H_ +#pragma once #include + #include "adjuster.h" #include "toolpanel.h" -class CACorrection : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel +class CACorrection : + public ToolParamBlock, + public AdjusterListener, + public FoldableToolPanel { protected: @@ -43,5 +46,3 @@ public: void setAdjusterBehavior (bool badd); void trimValues (rtengine::procparams::ProcParams* pp) override; }; - -#endif diff --git a/rtgui/checkbox.h b/rtgui/checkbox.h index 48324d4c8..45433300c 100644 --- a/rtgui/checkbox.h +++ b/rtgui/checkbox.h @@ -16,10 +16,10 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _CHECKBOX_H_ -#define _CHECKBOX_H_ +#pragma once #include + #include "editedstate.h" #include "guiutils.h" @@ -72,5 +72,3 @@ public: void set_tooltip_markup (const Glib::ustring& tooltip); */ }; - -#endif diff --git a/rtgui/chmixer.h b/rtgui/chmixer.h index 94f54ed3d..fb028cf14 100644 --- a/rtgui/chmixer.h +++ b/rtgui/chmixer.h @@ -16,14 +16,17 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _CHMIXER_H_ -#define _CHMIXER_H_ +#pragma once #include + #include "adjuster.h" #include "toolpanel.h" -class ChMixer : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel +class ChMixer : + public ToolParamBlock, + public AdjusterListener, + public FoldableToolPanel { protected: @@ -46,5 +49,3 @@ public: void trimValues (rtengine::procparams::ProcParams* pp) override; void enabledChanged() override; }; - -#endif diff --git a/rtgui/clipboard.h b/rtgui/clipboard.h index 4c0ec452f..d142808e9 100644 --- a/rtgui/clipboard.h +++ b/rtgui/clipboard.h @@ -16,8 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _CLIPBOARD_ -#define _CLIPBOARD_ +#pragma once #include #include @@ -80,5 +79,3 @@ private: }; extern Clipboard clipboard; - -#endif diff --git a/rtgui/coarsepanel.h b/rtgui/coarsepanel.h index 2da56b904..c028bbcad 100644 --- a/rtgui/coarsepanel.h +++ b/rtgui/coarsepanel.h @@ -16,13 +16,15 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef __COARSEPANEL__ -#define __COARSEPANEL__ +#pragma once #include + #include "toolpanel.h" -class CoarsePanel : public Gtk::HBox, public ToolPanel +class CoarsePanel : + public Gtk::HBox, + public ToolPanel { protected: @@ -46,5 +48,3 @@ public: void flipHorizontal (); void flipVertical (); }; - -#endif diff --git a/rtgui/colorappearance.h b/rtgui/colorappearance.h index da2e3c8b9..1f8fdef84 100644 --- a/rtgui/colorappearance.h +++ b/rtgui/colorappearance.h @@ -16,25 +16,25 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _COLORAPPEARANCE_H_ -#define _COLORAPPEARANCE_H_ +#pragma once #include + #include "adjuster.h" -#include "toolpanel.h" +#include "colorprovider.h" #include "curveeditor.h" #include "curveeditorgroup.h" -#include "mycurve.h" #include "guiutils.h" -#include "colorprovider.h" +#include "mycurve.h" +#include "toolpanel.h" class ColorAppearance final : - public ToolParamBlock, - public AdjusterListener, - public FoldableToolPanel, - public rtengine::AutoCamListener, - public CurveListener, - public ColorProvider + public ToolParamBlock, + public AdjusterListener, + public FoldableToolPanel, + public rtengine::AutoCamListener, + public CurveListener, + public ColorProvider { public: ColorAppearance (); @@ -173,5 +173,3 @@ private: IdleRegister idle_register; }; - -#endif diff --git a/rtgui/coloredbar.h b/rtgui/coloredbar.h index 089dfa8cd..6cc121cd5 100644 --- a/rtgui/coloredbar.h +++ b/rtgui/coloredbar.h @@ -16,8 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _COLOREDBAR_ -#define _COLOREDBAR_ +#pragma once #include "colorprovider.h" #include "guiutils.h" @@ -62,5 +61,3 @@ public: BackBuffer::setDirty(isDirty); } }; - -#endif diff --git a/rtgui/colorprovider.h b/rtgui/colorprovider.h index feea792b6..a84b1be27 100644 --- a/rtgui/colorprovider.h +++ b/rtgui/colorprovider.h @@ -16,8 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _COLORPROVIDER_ -#define _COLORPROVIDER_ +#pragma once #include @@ -61,10 +60,7 @@ public: */ class ColorProvider { - public: - virtual ~ColorProvider() {}; + virtual ~ColorProvider() = default; virtual void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller) {}; }; - -#endif diff --git a/rtgui/colortoning.h b/rtgui/colortoning.h index faba1e383..9c7a54488 100644 --- a/rtgui/colortoning.h +++ b/rtgui/colortoning.h @@ -1,18 +1,19 @@ /* * This file is part of RawTherapee. */ -#ifndef _COLORTONING_H_ -#define _COLORTONING_H_ +#pragma once #include + #include "adjuster.h" -#include "toolpanel.h" -#include "guiutils.h" +#include "colorprovider.h" #include "curveeditor.h" #include "curveeditorgroup.h" -#include "thresholdadjuster.h" -#include "colorprovider.h" +#include "guiutils.h" #include "labgrid.h" +#include "thresholdadjuster.h" +#include "toolpanel.h" + #include "../rtengine/procparams.h" class ColorToning final : @@ -166,5 +167,3 @@ private: IdleRegister idle_register; }; - -#endif diff --git a/rtgui/coordinateadjuster.h b/rtgui/coordinateadjuster.h index d705915ab..70fe42233 100644 --- a/rtgui/coordinateadjuster.h +++ b/rtgui/coordinateadjuster.h @@ -16,8 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _COORDINATEADJUSTER_ -#define _COORDINATEADJUSTER_ +#pragma once #include @@ -160,6 +159,3 @@ public: void stopNumericalAdjustment(); }; - - -#endif diff --git a/rtgui/crop.h b/rtgui/crop.h index 1bbad548d..b9221a803 100644 --- a/rtgui/crop.h +++ b/rtgui/crop.h @@ -16,14 +16,15 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _CROP_H_ -#define _CROP_H_ +#pragma once + +#include #include + #include "cropguilistener.h" -#include "toolpanel.h" #include "guiutils.h" -#include +#include "toolpanel.h" class CropPanelListener { @@ -129,5 +130,3 @@ private: IdleRegister idle_register; }; - -#endif diff --git a/rtgui/cropguilistener.h b/rtgui/cropguilistener.h index c20d6556a..a7e18683a 100644 --- a/rtgui/cropguilistener.h +++ b/rtgui/cropguilistener.h @@ -16,8 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef __CROPGUILISTENER__ -#define __CROPGUILISTENER__ +#pragma once class CropGUIListener { @@ -39,5 +38,3 @@ public: virtual bool inImageArea(int x, int y) = 0; virtual double getRatio() const = 0; }; - -#endif diff --git a/rtgui/crophandler.h b/rtgui/crophandler.h index 77355b868..d5da1cf6e 100644 --- a/rtgui/crophandler.h +++ b/rtgui/crophandler.h @@ -16,21 +16,20 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef __CROPHANDLER__ -#define __CROPHANDLER__ +#pragma once #include -#include #include +#include #include -#include "../rtengine/rtengine.h" #include "editbuffer.h" - #include "lockablecolorpicker.h" #include "threadutils.h" +#include "../rtengine/rtengine.h" + class EditSubscriber; class CropDisplayHandler @@ -139,5 +138,3 @@ private: IdleRegister idle_register; }; - -#endif diff --git a/rtgui/cursormanager.h b/rtgui/cursormanager.h index aec5110d1..38f198e32 100644 --- a/rtgui/cursormanager.h +++ b/rtgui/cursormanager.h @@ -16,8 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _CURSORMANAGER_ -#define _CURSORMANAGER_ +#pragma once #include @@ -89,6 +88,3 @@ public: extern CursorManager mainWindowCursorManager; extern CursorManager editWindowCursorManager; - -#endif - diff --git a/rtgui/curveeditor.h b/rtgui/curveeditor.h index bdd6d6b48..dd61bc910 100644 --- a/rtgui/curveeditor.h +++ b/rtgui/curveeditor.h @@ -16,21 +16,20 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _CURVEEDITOR_ -#define _CURVEEDITOR_ +#pragma once -#include "popuptogglebutton.h" -#include "../rtengine/LUT.h" #include "coloredbar.h" #include "editcallbacks.h" #include "mydiagonalcurve.h" #include "myflatcurve.h" +#include "popuptogglebutton.h" + +#include "../rtengine/LUT.h" #include "../rtengine/noncopyable.h" class CurveEditorGroup; class CurveEditorSubGroup; - /* *********************** Curve Editor *********************** */ @@ -182,7 +181,6 @@ public: class FlatCurveEditor : public CurveEditor { - friend class FlatCurveEditorSubGroup; protected: @@ -207,5 +205,3 @@ public: // set the reset curve for a given curve type. This is optional; all curve type have a default reset curve void setResetCurve(FlatCurveType cType, const std::vector &resetCurve); }; - -#endif diff --git a/rtgui/curveeditorgroup.h b/rtgui/curveeditorgroup.h index 6f7b98d9b..7c39ab186 100644 --- a/rtgui/curveeditorgroup.h +++ b/rtgui/curveeditorgroup.h @@ -16,18 +16,19 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _CURVEEDITORGROUP_ -#define _CURVEEDITORGROUP_ +#pragma once -#include #include #include + +#include + +#include "adjuster.h" #include "guiutils.h" #include "mycurve.h" -#include "myflatcurve.h" #include "mydiagonalcurve.h" +#include "myflatcurve.h" #include "shcselector.h" -#include "adjuster.h" class CurveEditor; class DiagonalCurveEditorSubGroup; @@ -169,5 +170,3 @@ protected: virtual const std::vector getCurveFromGUI (int type) = 0; }; - -#endif diff --git a/rtgui/curvelistener.h b/rtgui/curvelistener.h index 05a9a4e99..d99167a98 100644 --- a/rtgui/curvelistener.h +++ b/rtgui/curvelistener.h @@ -16,8 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _CURVELISTENER_ -#define _CURVELISTENER_ +#pragma once #include @@ -86,5 +85,3 @@ public: return retVal; } }; - -#endif diff --git a/rtgui/darkframe.h b/rtgui/darkframe.h index c576712a8..58ac904ff 100644 --- a/rtgui/darkframe.h +++ b/rtgui/darkframe.h @@ -16,24 +16,29 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _DARKFRAME_H_ -#define _DARKFRAME_H_ +#pragma once #include + #include -#include "toolpanel.h" -#include "../rtengine/rawimage.h" + #include "guiutils.h" +#include "toolpanel.h" + +#include "../rtengine/rawimage.h" class DFProvider { public: + virtual ~DFProvider() = default; virtual rtengine::RawImage* getDF() = 0; virtual Glib::ustring GetCurrentImageFilePath() = 0; // add other info here }; -class DarkFrame : public ToolParamBlock, public FoldableToolPanel +class DarkFrame : + public ToolParamBlock, + public FoldableToolPanel { protected: @@ -66,5 +71,3 @@ public: dfp = p; }; }; - -#endif diff --git a/rtgui/defringe.h b/rtgui/defringe.h index 8a6eb0753..5dd17b547 100644 --- a/rtgui/defringe.h +++ b/rtgui/defringe.h @@ -16,18 +16,23 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _DEFRINGE_H_ -#define _DEFRINGE_H_ +#pragma once #include + #include "adjuster.h" -#include "toolpanel.h" -#include "guiutils.h" +#include "colorprovider.h" #include "curveeditor.h" #include "curveeditorgroup.h" -#include "colorprovider.h" +#include "guiutils.h" +#include "toolpanel.h" -class Defringe : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, public CurveListener, public ColorProvider +class Defringe : + public ToolParamBlock, + public AdjusterListener, + public FoldableToolPanel, + public CurveListener, + public ColorProvider { protected: @@ -54,5 +59,3 @@ public: void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller) override; }; - -#endif diff --git a/rtgui/diagonalcurveeditorsubgroup.h b/rtgui/diagonalcurveeditorsubgroup.h index 077ef590e..21784578e 100644 --- a/rtgui/diagonalcurveeditorsubgroup.h +++ b/rtgui/diagonalcurveeditorsubgroup.h @@ -16,16 +16,21 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _DIAGONALCURVEEDITORSUBGROUP_ -#define _DIAGONALCURVEEDITORSUBGROUP_ +#pragma once #include + #include "curveeditorgroup.h" + #include "../rtengine/noncopyable.h" class DiagonalCurveEditor; -class DiagonalCurveEditorSubGroup : public CurveEditorSubGroup, public SHCListener, public AdjusterListener, public rtengine::NonCopyable +class DiagonalCurveEditorSubGroup : + public CurveEditorSubGroup, + public SHCListener, + public AdjusterListener, + public rtengine::NonCopyable { friend class DiagonalCurveEditor; @@ -111,5 +116,3 @@ protected: void setSubGroupRangeLabels(Glib::ustring r1, Glib::ustring r2, Glib::ustring r3, Glib::ustring r4); void setSubGroupBottomBarBgGradient(); }; - -#endif diff --git a/rtgui/dirbrowser.h b/rtgui/dirbrowser.h index 68422f8be..fa526c3a6 100644 --- a/rtgui/dirbrowser.h +++ b/rtgui/dirbrowser.h @@ -16,13 +16,13 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _DIRBROWSER_ -#define _DIRBROWSER_ +#pragma once #include #include #include "guiutils.h" + #ifdef WIN32 #include "windows.h" #endif @@ -110,5 +110,3 @@ inline DirBrowser::DirSelectionSignal DirBrowser::dirSelected () const { return dirSelectionSignal; } - -#endif diff --git a/rtgui/dirpyrdenoise.h b/rtgui/dirpyrdenoise.h index 05304e4f7..424104314 100644 --- a/rtgui/dirpyrdenoise.h +++ b/rtgui/dirpyrdenoise.h @@ -16,16 +16,16 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _DIRPYRDENOISE_H_ -#define _DIRPYRDENOISE_H_ +#pragma once #include + #include "adjuster.h" -#include "toolpanel.h" +#include "colorprovider.h" #include "curveeditor.h" #include "curveeditorgroup.h" -#include "colorprovider.h" #include "guiutils.h" +#include "toolpanel.h" class EditDataProvider; @@ -137,5 +137,3 @@ private: IdleRegister idle_register; }; - -#endif diff --git a/rtgui/dirpyrequalizer.h b/rtgui/dirpyrequalizer.h index e236dc29b..ff08f36bc 100644 --- a/rtgui/dirpyrequalizer.h +++ b/rtgui/dirpyrequalizer.h @@ -16,17 +16,20 @@ * * (C) 2010 Emil Martinec */ - -#ifndef DIRPYREQUALIZER_H_INCLUDED -#define DIRPYREQUALIZER_H_INCLUDED +#pragma once #include -#include "adjuster.h" -#include "toolpanel.h" -#include "thresholdadjuster.h" -#include "colorprovider.h" -class DirPyrEqualizer : public ToolParamBlock, public ThresholdAdjusterListener, public AdjusterListener, public FoldableToolPanel +#include "adjuster.h" +#include "colorprovider.h" +#include "thresholdadjuster.h" +#include "toolpanel.h" + +class DirPyrEqualizer : + public ToolParamBlock, + public ThresholdAdjusterListener, + public AdjusterListener, + public FoldableToolPanel { protected: @@ -77,5 +80,3 @@ public: void adjusterChanged(ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight) override; void adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) override; }; - -#endif diff --git a/rtgui/distortion.h b/rtgui/distortion.h index 5e1cf6a6b..dab20bbd9 100644 --- a/rtgui/distortion.h +++ b/rtgui/distortion.h @@ -16,15 +16,18 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _DISTORTION_H_ -#define _DISTORTION_H_ +#pragma once #include -#include "adjuster.h" -#include "toolpanel.h" -#include "lensgeomlistener.h" -class Distortion : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel +#include "adjuster.h" +#include "lensgeomlistener.h" +#include "toolpanel.h" + +class Distortion : + public ToolParamBlock, + public AdjusterListener, + public FoldableToolPanel { protected: @@ -51,5 +54,3 @@ public: rlistener = l; } }; - -#endif diff --git a/rtgui/dynamicprofilepanel.h b/rtgui/dynamicprofilepanel.h index fd4a6e80e..5796c9c85 100644 --- a/rtgui/dynamicprofilepanel.h +++ b/rtgui/dynamicprofilepanel.h @@ -16,14 +16,16 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _DYNAMICPROFILEPANEL_H_ -#define _DYNAMICPROFILEPANEL_H_ +#pragma once #include -#include "../rtengine/dynamicprofile.h" + #include "profilestorecombobox.h" -class DynamicProfilePanel: public Gtk::VBox +#include "../rtengine/dynamicprofile.h" + +class DynamicProfilePanel : + public Gtk::VBox { public: DynamicProfilePanel(); @@ -133,5 +135,3 @@ private: Gtk::Button button_edit_; Gtk::Button button_delete_; }; - -#endif // _DYNAMICPROFILEPANEL_H_ diff --git a/rtgui/editedstate.h b/rtgui/editedstate.h index 2cee07eb9..c34aaf539 100644 --- a/rtgui/editedstate.h +++ b/rtgui/editedstate.h @@ -16,10 +16,6 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _EDITEDSTATE_ -#define _EDITEDSTATE_ +#pragma once enum EditedState { UnEdited = 0, Edited = 1, Irrelevant = 2 }; - -#endif - diff --git a/rtgui/editenums.h b/rtgui/editenums.h index 8fc28e922..f1ade8bfc 100644 --- a/rtgui/editenums.h +++ b/rtgui/editenums.h @@ -16,8 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _EDITENUMS_ -#define _EDITENUMS_ +#pragma once enum ImgEditState {SNormal, SCropMove, SHandMove, SResizeW1, SResizeW2, SResizeH1, SResizeH2, SResizeTL, SResizeTR, SResizeBL, SResizeBR, SCropSelecting, SRotateSelecting, SCropWinMove, SCropFrameMove, SCropImgMove, SCropWinResize, SObservedMove, @@ -26,5 +25,3 @@ enum ImgEditState {SNormal, SCropMove, SHandMove, SResizeW1, SResizeW2, SResizeH enum CursorArea {CropWinButtons, CropToolBar, CropImage, ColorPicker, CropBorder, CropTop, CropTopLeft, CropTopRight, CropBottom, CropBottomLeft, CropBottomRight, CropLeft, CropRight, CropInside, CropResize, CropObserved }; - -#endif diff --git a/rtgui/editid.h b/rtgui/editid.h index 88d77f859..39dc2bf7c 100644 --- a/rtgui/editid.h +++ b/rtgui/editid.h @@ -16,9 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _EDITID_H_ -#define _EDITID_H_ - +#pragma once /// @brief List of pipette editing operation enum EditUniqueID : int { @@ -67,5 +65,3 @@ enum ObjectMode { OM_255, /// less or equal than 255 objects OM_65535 /// less or equal than 65535 objects }; - -#endif diff --git a/rtgui/editorpanel.h b/rtgui/editorpanel.h index c4349f693..ec59563e0 100644 --- a/rtgui/editorpanel.h +++ b/rtgui/editorpanel.h @@ -17,24 +17,25 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _EDITORPANEL_ -#define _EDITORPANEL_ +#pragma once #include -#include "imageareapanel.h" -#include "toolpanelcoord.h" -#include "profilepanel.h" -#include "../rtengine/rtengine.h" -#include "history.h" -#include "histogrampanel.h" -#include "thumbnail.h" -#include "saveasdlg.h" + #include "batchqueueentry.h" -#include "thumbnaillistener.h" -#include "navigator.h" -#include "progressconnector.h" #include "filepanel.h" +#include "histogrampanel.h" +#include "history.h" +#include "imageareapanel.h" +#include "navigator.h" +#include "profilepanel.h" +#include "progressconnector.h" +#include "saveasdlg.h" +#include "thumbnail.h" +#include "thumbnaillistener.h" +#include "toolpanelcoord.h" + #include "../rtengine/noncopyable.h" +#include "../rtengine/rtengine.h" class EditorPanel; class MyProgressBar; @@ -259,6 +260,3 @@ private: IdleRegister idle_register; }; - -#endif - diff --git a/rtgui/editwindow.h b/rtgui/editwindow.h index 04999d149..08e8c0199 100644 --- a/rtgui/editwindow.h +++ b/rtgui/editwindow.h @@ -14,16 +14,18 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _EDITWINDOW_ -#define _EDITWINDOW_ +#pragma once -#include -#include "filepanel.h" -#include "editorpanel.h" -#include "rtimage.h" #include -class EditWindow : public Gtk::Window +#include + +#include "editorpanel.h" +#include "filepanel.h" +#include "rtimage.h" + +class EditWindow : + public Gtk::Window { private: @@ -67,5 +69,3 @@ public: void set_title_decorated(Glib::ustring fname); void on_realize () override; }; - -#endif diff --git a/rtgui/epd.h b/rtgui/epd.h index d8781ef27..410004d89 100644 --- a/rtgui/epd.h +++ b/rtgui/epd.h @@ -16,14 +16,17 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _EPD_H_ -#define _EPD_H_ +#pragma once #include + #include "adjuster.h" #include "toolpanel.h" -class EdgePreservingDecompositionUI : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel +class EdgePreservingDecompositionUI : + public ToolParamBlock, + public AdjusterListener, + public FoldableToolPanel { protected: Adjuster *strength; @@ -45,5 +48,3 @@ public: void enabledChanged () override; void setAdjusterBehavior (bool stAdd, bool gAdd, bool esAdd, bool scAdd, bool rAdd); }; - -#endif diff --git a/rtgui/exiffiltersettings.h b/rtgui/exiffiltersettings.h index e820a2cac..5a25af6ad 100644 --- a/rtgui/exiffiltersettings.h +++ b/rtgui/exiffiltersettings.h @@ -16,8 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _EXIFFILTERSETTINGS_ -#define _EXIFFILTERSETTINGS_ +#pragma once #include #include @@ -51,6 +50,3 @@ public: ExifFilterSettings (); void clear (); }; - -#endif - diff --git a/rtgui/exifpanel.h b/rtgui/exifpanel.h index f054f37c7..2b173c884 100644 --- a/rtgui/exifpanel.h +++ b/rtgui/exifpanel.h @@ -16,8 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _EXIFPANEL_ -#define _EXIFPANEL_ +#pragma once #include @@ -25,7 +24,9 @@ #include "toolpanel.h" -class ExifPanel : public Gtk::VBox, public ToolPanel +class ExifPanel : + public Gtk::VBox, + public ToolPanel { private: @@ -114,5 +115,3 @@ public: void notifyListener(); }; - -#endif diff --git a/rtgui/exportpanel.h b/rtgui/exportpanel.h index d13ca08ad..f70e47386 100644 --- a/rtgui/exportpanel.h +++ b/rtgui/exportpanel.h @@ -17,12 +17,12 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _EXPORTPANEL_ -#define _EXPORTPANEL_ +#pragma once #include -#include "guiutils.h" + #include "adjuster.h" +#include "guiutils.h" class ExportPanelListener { @@ -122,5 +122,3 @@ public: listener = l; } }; - -#endif diff --git a/rtgui/extprog.h b/rtgui/extprog.h index ea2749a61..c5e00bb1b 100644 --- a/rtgui/extprog.h +++ b/rtgui/extprog.h @@ -16,14 +16,12 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ - -#ifndef _EXTPROG_ -#define _EXTPROG_ - -#include +#pragma once #include +#include + #include "threadutils.h" struct ExtProgAction @@ -74,5 +72,3 @@ inline const std::vector& ExtProgStore::getActions () const { return actions; } - -#endif diff --git a/rtgui/favoritbrowser.h b/rtgui/favoritbrowser.h index 292f17de6..7a73b98af 100644 --- a/rtgui/favoritbrowser.h +++ b/rtgui/favoritbrowser.h @@ -16,17 +16,19 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _FAVORITBROWSER_ -#define _FAVORITBROWSER_ +#pragma once #include + #include "dirbrowserremoteinterface.h" #include "dirselectionlistener.h" -class FavoritBrowser : public Gtk::VBox, public DirSelectionListener +class FavoritBrowser : + public Gtk::VBox, + public DirSelectionListener { - - class FavoritColumns : public Gtk::TreeModel::ColumnRecord + class FavoritColumns : + public Gtk::TreeModel::ColumnRecord { public: Gtk::TreeModelColumn > icon; @@ -61,7 +63,3 @@ public: void delPressed (); void selectionChanged (); }; - -#endif - - diff --git a/rtgui/filebrowser.h b/rtgui/filebrowser.h index 6911a944f..74b491957 100644 --- a/rtgui/filebrowser.h +++ b/rtgui/filebrowser.h @@ -16,25 +16,27 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _FILEBROWSER_ -#define _FILEBROWSER_ +#pragma once + +#include #include -#include -#include "thumbbrowserbase.h" -#include "exiffiltersettings.h" -#include "filebrowserentry.h" + #include "browserfilter.h" -#include "pparamschangelistener.h" -#include "partialpastedlg.h" +#include "exiffiltersettings.h" #include "exportpanel.h" #include "extprog.h" +#include "filebrowserentry.h" +#include "partialpastedlg.h" +#include "pparamschangelistener.h" #include "profilestorecombobox.h" +#include "thumbbrowserbase.h" + #include "../rtengine/noncopyable.h" -class ProfileStoreLabel; class FileBrowser; class FileBrowserEntry; +class ProfileStoreLabel; class FileBrowserListener { @@ -210,5 +212,3 @@ public: type_trash_changed trash_changed(); }; - -#endif diff --git a/rtgui/filebrowserentry.h b/rtgui/filebrowserentry.h index 646e8e67e..c7eebcd44 100644 --- a/rtgui/filebrowserentry.h +++ b/rtgui/filebrowserentry.h @@ -16,16 +16,13 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _FILEBROWSERENTRY_ -#define _FILEBROWSERENTRY_ +#pragma once #include #include #include -#include "../rtengine/rtengine.h" - #include "crophandler.h" #include "editenums.h" #include "filethumbnailbuttonset.h" @@ -34,8 +31,9 @@ #include "thumbimageupdater.h" #include "thumbnail.h" #include "thumbnaillistener.h" -#include "../rtengine/noncopyable.h" +#include "../rtengine/noncopyable.h" +#include "../rtengine/rtengine.h" class FileBrowserEntry; struct FileBrowserEntryIdleHelper { @@ -109,5 +107,3 @@ public: bool pressNotify (int button, int type, int bstate, int x, int y) override; bool releaseNotify (int button, int type, int bstate, int x, int y) override; }; - -#endif diff --git a/rtgui/filecatalog.h b/rtgui/filecatalog.h index 09e2cc1ed..c71658cca 100644 --- a/rtgui/filecatalog.h +++ b/rtgui/filecatalog.h @@ -16,22 +16,24 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _FILECATALOG_ -#define _FILECATALOG_ +#pragma once -#include "filebrowser.h" -#include "exiffiltersettings.h" -#include -#include "fileselectionlistener.h" #include -#include "fileselectionchangelistener.h" + +#include + #include "coarsepanel.h" -#include "toolbar.h" -#include "filterpanel.h" +#include "exiffiltersettings.h" #include "exportpanel.h" -#include "previewloader.h" +#include "filebrowser.h" +#include "fileselectionchangelistener.h" +#include "fileselectionlistener.h" +#include "filterpanel.h" #include "multilangmgr.h" +#include "previewloader.h" #include "threadutils.h" +#include "toolbar.h" + #include "../rtengine/noncopyable.h" class FilePanel; @@ -288,5 +290,3 @@ inline void FileCatalog::setDirSelector (const FileCatalog::DirSelectionSlot& se { this->selectDir = selectDir; } - -#endif diff --git a/rtgui/filepanel.h b/rtgui/filepanel.h index bdeb266f4..9ae91be4d 100644 --- a/rtgui/filepanel.h +++ b/rtgui/filepanel.h @@ -16,21 +16,22 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _FILEPANEL_ -#define _FILEPANEL_ +#pragma once #include + #include "batchtoolpanelcoord.h" -#include "filecatalog.h" #include "dirbrowser.h" -#include "fileselectionlistener.h" -#include "placesbrowser.h" -#include "recentbrowser.h" -#include "pparamschangelistener.h" -#include "history.h" -#include "filterpanel.h" #include "exportpanel.h" +#include "filecatalog.h" +#include "fileselectionlistener.h" +#include "filterpanel.h" +#include "history.h" +#include "placesbrowser.h" +#include "pparamschangelistener.h" #include "progressconnector.h" +#include "recentbrowser.h" + #include "../rtengine/noncopyable.h" class RTWindow; @@ -108,6 +109,3 @@ private: IdleRegister idle_register; }; - -#endif - diff --git a/rtgui/fileselectionchangelistener.h b/rtgui/fileselectionchangelistener.h index 1f3b8e612..64251c1bd 100644 --- a/rtgui/fileselectionchangelistener.h +++ b/rtgui/fileselectionchangelistener.h @@ -16,8 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _FILESELECTIONCHANGELISTENER_ -#define _FILESELECTIONCHANGELISTENER_ +#pragma once class Thumbnail; @@ -27,6 +26,3 @@ public: virtual ~FileSelectionChangeListener() = default; virtual void selectionChanged(const std::vector& selected) = 0; }; - -#endif - diff --git a/rtgui/fileselectionlistener.h b/rtgui/fileselectionlistener.h index a7f7fb284..394a35f51 100644 --- a/rtgui/fileselectionlistener.h +++ b/rtgui/fileselectionlistener.h @@ -16,11 +16,10 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _FILESELECTIONLISTENER_ -#define _FILESELECTIONLISTENER_ +#pragma once -class Thumbnail; class BatchQueueEntry; +class Thumbnail; class FileSelectionListener { @@ -29,6 +28,3 @@ public: virtual bool fileSelected(Thumbnail* thm) = 0; virtual bool addBatchQueueJobs(const std::vector& entries) = 0; }; - -#endif - diff --git a/rtgui/filethumbnailbuttonset.h b/rtgui/filethumbnailbuttonset.h index 102b573c8..f4fbc97ed 100644 --- a/rtgui/filethumbnailbuttonset.h +++ b/rtgui/filethumbnailbuttonset.h @@ -16,18 +16,20 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _FILETHUMBNAILBUTTONSET_ -#define _FILETHUMBNAILBUTTONSET_ +#pragma once #include -#include "lwbuttonset.h" #include + #include "filebrowserentry.h" +#include "lwbuttonset.h" #include "rtsurface.h" class FileBrowserEntry; -class FileThumbnailButtonSet : public LWButtonSet + +class FileThumbnailButtonSet : + public LWButtonSet { static bool iconsLoaded; @@ -55,5 +57,3 @@ public: void setInTrash (bool inTrash); }; - -#endif diff --git a/rtgui/filmsimulation.h b/rtgui/filmsimulation.h index 6eb0fd024..fc9e804e1 100644 --- a/rtgui/filmsimulation.h +++ b/rtgui/filmsimulation.h @@ -1,14 +1,17 @@ -#ifndef FILM_SIMULATION_INCLUDED -#define FILM_SIMULATION_INCLUDED +#pragma once + +#include #include -#include -#include -#include "toolpanel.h" -#include "guiutils.h" -#include "adjuster.h" -class ClutComboBox : public MyComboBox +#include + +#include "adjuster.h" +#include "guiutils.h" +#include "toolpanel.h" + +class ClutComboBox : + public MyComboBox { public: explicit ClutComboBox(const Glib::ustring &path); @@ -74,5 +77,3 @@ private: Adjuster *m_strength; }; - -#endif diff --git a/rtgui/filterpanel.h b/rtgui/filterpanel.h index e6e41a416..25a368b27 100644 --- a/rtgui/filterpanel.h +++ b/rtgui/filterpanel.h @@ -16,10 +16,10 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _FILTERPANEL_ -#define _FILTERPANEL_ +#pragma once #include + #include "exiffiltersettings.h" class FilterPanelListener @@ -79,5 +79,3 @@ public: enabled->set_active(enabledState); } }; - -#endif diff --git a/rtgui/flatcurveeditorsubgroup.h b/rtgui/flatcurveeditorsubgroup.h index e9253cd08..5b14f752a 100644 --- a/rtgui/flatcurveeditorsubgroup.h +++ b/rtgui/flatcurveeditorsubgroup.h @@ -16,16 +16,19 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _FLATCURVEEDITORSUBGROUP_ -#define _FLATCURVEEDITORSUBGROUP_ +#pragma once #include + #include "curveeditorgroup.h" + #include "../rtengine/noncopyable.h" class FlatCurveEditor; -class FlatCurveEditorSubGroup: public CurveEditorSubGroup, public rtengine::NonCopyable +class FlatCurveEditorSubGroup: + public CurveEditorSubGroup, + public rtengine::NonCopyable { friend class FlatCurveEditor; @@ -76,5 +79,3 @@ protected: void editPointToggled(Gtk::ToggleButton *button); void editToggled (Gtk::ToggleButton *button); }; - -#endif diff --git a/rtgui/flatfield.h b/rtgui/flatfield.h index b9997f65e..02cc9963f 100644 --- a/rtgui/flatfield.h +++ b/rtgui/flatfield.h @@ -16,15 +16,17 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _FLATFIELD_H_ -#define _FLATFIELD_H_ +#pragma once #include + #include + #include "adjuster.h" -#include "toolpanel.h" -#include "../rtengine/rawimage.h" #include "guiutils.h" +#include "toolpanel.h" + +#include "../rtengine/rawimage.h" class FFProvider { @@ -84,5 +86,3 @@ public: }; void flatFieldAutoClipValueChanged(int n = 0) override; }; - -#endif diff --git a/rtgui/gradient.h b/rtgui/gradient.h index 05a267a0d..834f08670 100644 --- a/rtgui/gradient.h +++ b/rtgui/gradient.h @@ -1,16 +1,20 @@ /* * This file is part of RawTherapee. */ -#ifndef _GRADIENT_H_ -#define _GRADIENT_H_ +#pragma once #include + #include "adjuster.h" #include "editcallbacks.h" -#include "toolpanel.h" #include "guiutils.h" +#include "toolpanel.h" -class Gradient : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, public EditSubscriber +class Gradient : + public ToolParamBlock, + public AdjusterListener, + public FoldableToolPanel, + public EditSubscriber { private: @@ -58,5 +62,3 @@ public: bool drag1(int modifierKey) override; void switchOffEditMode () override; }; - -#endif diff --git a/rtgui/histogrampanel.h b/rtgui/histogrampanel.h index ef8d9368d..92d0dc7b4 100644 --- a/rtgui/histogrampanel.h +++ b/rtgui/histogrampanel.h @@ -16,21 +16,23 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _HISTOGRAMPANEL_ -#define _HISTOGRAMPANEL_ - +#pragma once #include -#include -#include -#include "../rtengine/LUT.h" -#include "../rtengine/improccoordinator.h" -#include "guiutils.h" +#include + +#include + +#include "guiutils.h" #include "pointermotionlistener.h" + +#include "../rtengine/improccoordinator.h" +#include "../rtengine/LUT.h" #include "../rtengine/noncopyable.h" class HistogramArea; + struct HistogramAreaIdleHelper { HistogramArea* harea; bool destroyed; @@ -252,5 +254,3 @@ public: // drawModeListener interface void toggleButtonMode () override; }; - -#endif diff --git a/rtgui/history.h b/rtgui/history.h index abf0d1ba5..faebe4765 100644 --- a/rtgui/history.h +++ b/rtgui/history.h @@ -16,14 +16,15 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _HISTORY_ -#define _HISTORY_ +#pragma once #include -#include "../rtengine/rtengine.h" + +#include "paramsedited.h" #include "pparamschangelistener.h" #include "profilechangelistener.h" -#include "paramsedited.h" + +#include "../rtengine/rtengine.h" class HistoryBeforeLineListener { @@ -135,5 +136,3 @@ public: bmnum = 1; }; }; - -#endif diff --git a/rtgui/hsvequalizer.h b/rtgui/hsvequalizer.h index 2ffa9fa0f..7d313cc76 100644 --- a/rtgui/hsvequalizer.h +++ b/rtgui/hsvequalizer.h @@ -16,20 +16,22 @@ * * 2010 Ilya Popov */ - -#ifndef HSVEQUALIZER_H_INCLUDED -#define HSVEQUALIZER_H_INCLUDED +#pragma once #include + #include "adjuster.h" -#include "toolpanel.h" -#include "guiutils.h" +#include "colorprovider.h" #include "curveeditor.h" #include "curveeditorgroup.h" -#include "colorprovider.h" +#include "guiutils.h" +#include "toolpanel.h" - -class HSVEqualizer : public ToolParamBlock, public FoldableToolPanel, public CurveListener, public ColorProvider +class HSVEqualizer : + public ToolParamBlock, + public FoldableToolPanel, + public CurveListener, + public ColorProvider { protected: @@ -56,5 +58,3 @@ public: //void adjusterChanged (Adjuster* a, double newval); void enabledChanged() override; }; - -#endif diff --git a/rtgui/icmpanel.h b/rtgui/icmpanel.h index 9b4706ecd..5573bacb8 100644 --- a/rtgui/icmpanel.h +++ b/rtgui/icmpanel.h @@ -16,16 +16,17 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _ICMPANEL_ -#define _ICMPANEL_ +#pragma once #include + #include + #include "adjuster.h" #include "guiutils.h" - -#include "toolpanel.h" #include "popupbutton.h" +#include "toolpanel.h" + #include "../rtengine/imagedata.h" class ICMPanelListener @@ -148,5 +149,3 @@ public: icmplistener = ipl; } }; - -#endif diff --git a/rtgui/ilabel.h b/rtgui/ilabel.h index 06da470b1..cb9ca00be 100644 --- a/rtgui/ilabel.h +++ b/rtgui/ilabel.h @@ -16,12 +16,12 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _ILABEL_ -#define _ILABEL_ +#pragma once #include -class ILabel : public Gtk::DrawingArea +class ILabel : + public Gtk::DrawingArea { Glib::ustring label; @@ -32,6 +32,3 @@ public: void on_realize() override; void on_style_updated () override; }; - -#endif - diff --git a/rtgui/imagearea.h b/rtgui/imagearea.h index 375e3a536..28b52dcd2 100644 --- a/rtgui/imagearea.h +++ b/rtgui/imagearea.h @@ -16,24 +16,29 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef __IMAGEAREA_H__ -#define __IMAGEAREA_H__ +#pragma once #include + #include "cropguilistener.h" -#include "imageareapanel.h" -#include "editenums.h" -#include "toolbar.h" -#include "previewhandler.h" -#include "imageareatoollistener.h" #include "cropwindow.h" #include "editcallbacks.h" -#include "zoompanel.h" +#include "editenums.h" +#include "imageareapanel.h" +#include "imageareatoollistener.h" #include "indclippedpanel.h" +#include "previewhandler.h" #include "previewmodepanel.h" +#include "toolbar.h" +#include "zoompanel.h" class ImageAreaPanel; -class ImageArea : public Gtk::DrawingArea, public CropWindowListener, public EditDataProvider, public LockablePickerToolListener + +class ImageArea : + public Gtk::DrawingArea, + public CropWindowListener, + public EditDataProvider, + public LockablePickerToolListener { friend class ZoomPanel; @@ -158,7 +163,3 @@ public: return mainCropWindow; } }; - - - -#endif diff --git a/rtgui/imageareapanel.h b/rtgui/imageareapanel.h index 4ec3ffcf3..831371dbb 100644 --- a/rtgui/imageareapanel.h +++ b/rtgui/imageareapanel.h @@ -16,13 +16,14 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _IMAGEAREAPANEL_ -#define _IMAGEAREAPANEL_ +#pragma once #include "imagearea.h" class ImageArea; -class ImageAreaPanel : public Gtk::VBox + +class ImageAreaPanel : + public Gtk::VBox { protected: @@ -42,5 +43,3 @@ public: void setBeforeAfterViews (ImageAreaPanel* bef, ImageAreaPanel* aft); void syncBeforeAfterViews(); }; - -#endif diff --git a/rtgui/imageareatoollistener.h b/rtgui/imageareatoollistener.h index d387b595c..86fdca6a2 100644 --- a/rtgui/imageareatoollistener.h +++ b/rtgui/imageareatoollistener.h @@ -16,12 +16,11 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _IMAGEAREATOOLLISTENER_ -#define _IMAGEAREATOOLLISTENER_ +#pragma once -#include "toolbar.h" -#include "thumbnail.h" #include "cropguilistener.h" +#include "thumbnail.h" +#include "toolbar.h" class ImageAreaToolListener { @@ -36,6 +35,3 @@ public: virtual ToolBar* getToolBar() const = 0; virtual CropGUIListener* startCropEditing(Thumbnail* thm = nullptr) = 0; }; - -#endif - diff --git a/rtgui/impulsedenoise.h b/rtgui/impulsedenoise.h index 1ebdc430b..e3cfc619a 100644 --- a/rtgui/impulsedenoise.h +++ b/rtgui/impulsedenoise.h @@ -16,14 +16,17 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _IMPULSEDENOISE_H_ -#define _IMPULSEDENOISE_H_ +#pragma once #include + #include "adjuster.h" #include "toolpanel.h" -class ImpulseDenoise : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel +class ImpulseDenoise : + public ToolParamBlock, + public AdjusterListener, + public FoldableToolPanel { protected: @@ -45,5 +48,3 @@ public: void setAdjusterBehavior (bool threshadd); void trimValues (rtengine::procparams::ProcParams* pp) override; }; - -#endif diff --git a/rtgui/indclippedpanel.h b/rtgui/indclippedpanel.h index 54476af10..1017b58f1 100644 --- a/rtgui/indclippedpanel.h +++ b/rtgui/indclippedpanel.h @@ -15,14 +15,16 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _INDCLIPPEDPANEL_ -#define _INDCLIPPEDPANEL_ +#pragma once -#include #include +#include + class ImageArea; -class IndicateClippedPanel : public Gtk::HBox + +class IndicateClippedPanel : + public Gtk::HBox { protected: @@ -59,5 +61,3 @@ public: return indClippedH->get_active(); } }; - -#endif diff --git a/rtgui/inspector.h b/rtgui/inspector.h index 6b3b2350b..bb144834a 100644 --- a/rtgui/inspector.h +++ b/rtgui/inspector.h @@ -16,11 +16,12 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _INSPECTOR_ -#define _INSPECTOR_ +#pragma once #include + #include "guiutils.h" + #include "../rtengine/coord.h" #include "../rtengine/coord2d.h" #include "../rtengine/rt_math.h" @@ -101,5 +102,3 @@ public: void get_preferred_width_for_height_vfunc (int height, int &minimum_width, int &natural_width) const override; }; - -#endif diff --git a/rtgui/iptcpanel.h b/rtgui/iptcpanel.h index 0317314a1..15d117f87 100644 --- a/rtgui/iptcpanel.h +++ b/rtgui/iptcpanel.h @@ -16,8 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _IPTCPANEL_ -#define _IPTCPANEL_ +#pragma once #include @@ -26,7 +25,9 @@ #include "guiutils.h" #include "toolpanel.h" -class IPTCPanel : public Gtk::VBox, public ToolPanel +class IPTCPanel : + public Gtk::VBox, + public ToolPanel { private: @@ -92,5 +93,3 @@ public: void copyClicked (); void pasteClicked (); }; - -#endif diff --git a/rtgui/labcurve.h b/rtgui/labcurve.h index 51ba0fdd6..46f506d68 100644 --- a/rtgui/labcurve.h +++ b/rtgui/labcurve.h @@ -16,19 +16,24 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _LABCURVE_H_ -#define _LABCURVE_H_ +#pragma once #include + #include "adjuster.h" -#include "toolpanel.h" +#include "colorprovider.h" #include "curveeditor.h" #include "curveeditorgroup.h" -#include "colorprovider.h" +#include "toolpanel.h" class EditDataProvider; -class LCurve : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, public CurveListener, public ColorProvider +class LCurve : + public ToolParamBlock, + public AdjusterListener, + public FoldableToolPanel, + public CurveListener, + public ColorProvider { protected: @@ -97,5 +102,3 @@ public: void enabledChanged() override; }; - -#endif diff --git a/rtgui/lensgeom.h b/rtgui/lensgeom.h index 06b8e5689..e3352a506 100644 --- a/rtgui/lensgeom.h +++ b/rtgui/lensgeom.h @@ -16,14 +16,16 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _LENSGEOM_H_ -#define _LENSGEOM_H_ +#pragma once #include -#include "toolpanel.h" -#include "lensgeomlistener.h" -class LensGeometry : public ToolParamBlock, public FoldableToolPanel +#include "lensgeomlistener.h" +#include "toolpanel.h" + +class LensGeometry : + public ToolParamBlock, + public FoldableToolPanel { protected: @@ -58,5 +60,3 @@ public: private: IdleRegister idle_register; }; - -#endif diff --git a/rtgui/lensgeomlistener.h b/rtgui/lensgeomlistener.h index dbe58f1fa..7bfa0fb45 100644 --- a/rtgui/lensgeomlistener.h +++ b/rtgui/lensgeomlistener.h @@ -16,8 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _LENSGEOMLISTENER_H_ -#define _LENSGEOMLISTENER_H_ +#pragma once class LensGeomListener { @@ -27,5 +26,3 @@ public: virtual void autoCropRequested () = 0; virtual double autoDistorRequested () = 0; }; - -#endif diff --git a/rtgui/lockablecolorpicker.h b/rtgui/lockablecolorpicker.h index f1a63d533..eadf71773 100644 --- a/rtgui/lockablecolorpicker.h +++ b/rtgui/lockablecolorpicker.h @@ -16,13 +16,11 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ +#pragma once -#ifndef __COLORPICKER__ -#define __COLORPICKER__ - +#include "guiutils.h" #include "../rtengine/coord.h" -#include "guiutils.h" class CropWindow; @@ -93,5 +91,3 @@ public: bool cycleRGB (); bool cycleHSV (); }; - -#endif diff --git a/rtgui/lwbutton.h b/rtgui/lwbutton.h index 16e53a875..7a784e693 100644 --- a/rtgui/lwbutton.h +++ b/rtgui/lwbutton.h @@ -16,10 +16,10 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _LWBUTTON_ -#define _LWBUTTON_ +#pragma once #include + #include "rtsurface.h" class LWButton; @@ -78,5 +78,3 @@ public: void redraw (Cairo::RefPtr context); }; - -#endif diff --git a/rtgui/multilangmgr.h b/rtgui/multilangmgr.h index 0c76b4c01..902161eb2 100644 --- a/rtgui/multilangmgr.h +++ b/rtgui/multilangmgr.h @@ -16,8 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _MULTILANGMGR_ -#define _MULTILANGMGR_ +#pragma once #include #include @@ -45,5 +44,3 @@ inline Glib::ustring M (const std::string& key) { return langMgr.getStr (key); } - -#endif diff --git a/rtgui/mycurve.h b/rtgui/mycurve.h index 73f16d227..6bdfe4b66 100644 --- a/rtgui/mycurve.h +++ b/rtgui/mycurve.h @@ -16,15 +16,17 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _MYCURVE_ -#define _MYCURVE_ +#pragma once + +#include #include -#include -#include "curvelistener.h" -#include "cursormanager.h" + #include "coloredbar.h" #include "coordinateadjuster.h" +#include "cursormanager.h" +#include "curvelistener.h" + #include "../rtengine/LUT.h" #include "../rtengine/noncopyable.h" @@ -151,5 +153,3 @@ public: myCurve->setDirty(true); } }; - -#endif diff --git a/rtgui/mydiagonalcurve.h b/rtgui/mydiagonalcurve.h index 33fac6090..058c11e5a 100644 --- a/rtgui/mydiagonalcurve.h +++ b/rtgui/mydiagonalcurve.h @@ -16,16 +16,17 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _MYDIAGONALCURVE_ -#define _MYDIAGONALCURVE_ +#pragma once + +#include #include -#include -#include "curvelistener.h" -#include "cursormanager.h" -#include "mycurve.h" -#include "../rtengine/LUT.h" +#include "cursormanager.h" +#include "curvelistener.h" +#include "mycurve.h" + +#include "../rtengine/LUT.h" // For compatibility and simplicity reason, order shouldn't change, and must be identical to the order specified in the curveType widget enum DiagonalCurveType { @@ -101,5 +102,3 @@ public: void setPos(double pos, int chanIdx) override; void stopNumericalAdjustment() override; }; - -#endif diff --git a/rtgui/myflatcurve.h b/rtgui/myflatcurve.h index fa4466b8d..c4cbfa291 100644 --- a/rtgui/myflatcurve.h +++ b/rtgui/myflatcurve.h @@ -16,13 +16,14 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _MYFLATCURVE_ -#define _MYFLATCURVE_ +#pragma once + +#include #include -#include -#include "curvelistener.h" + #include "cursormanager.h" +#include "curvelistener.h" #include "mycurve.h" // For compatibility and simplicity reason, order shouldn't change, and must be identical to the order specified in the curveType widget @@ -138,5 +139,3 @@ public: void setPos(double pos, int chanIdx) override; void stopNumericalAdjustment() override; }; - -#endif diff --git a/rtgui/navigator.h b/rtgui/navigator.h index 32ad68175..953a0a44b 100644 --- a/rtgui/navigator.h +++ b/rtgui/navigator.h @@ -16,15 +16,17 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _NAVIGATOR_ -#define _NAVIGATOR_ +#pragma once #include -#include "previewwindow.h" -#include "pointermotionlistener.h" -#include "options.h" -class Navigator : public Gtk::Frame, public PointerMotionListener +#include "options.h" +#include "pointermotionlistener.h" +#include "previewwindow.h" + +class Navigator : + public Gtk::Frame, + public PointerMotionListener { typedef const double (*TMatrix)[3]; @@ -62,5 +64,3 @@ public: void getLABText (float l, float a, float b, Glib::ustring &sL, Glib::ustring &sA, Glib::ustring &sB) override; }; - -#endif diff --git a/rtgui/partialpastedlg.h b/rtgui/partialpastedlg.h index eebb08705..6c4228061 100644 --- a/rtgui/partialpastedlg.h +++ b/rtgui/partialpastedlg.h @@ -16,10 +16,10 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _PARTIALPASTEDLG_ -#define _PARTIALPASTEDLG_ +#pragma once #include + #include "../rtengine/rtengine.h" struct ParamsEdited; @@ -159,6 +159,3 @@ public: void rawToggled (); void advancedToggled (); }; - -#endif - diff --git a/rtgui/pcvignette.h b/rtgui/pcvignette.h index ce41ab75f..da0e02dc6 100644 --- a/rtgui/pcvignette.h +++ b/rtgui/pcvignette.h @@ -1,14 +1,17 @@ /* * This file is part of RawTherapee. */ -#ifndef _PCVIGNETTE_H_ -#define _PCVIGNETTE_H_ +#pragma once #include + #include "adjuster.h" #include "toolpanel.h" -class PCVignette : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel +class PCVignette : + public ToolParamBlock, + public AdjusterListener, + public FoldableToolPanel { protected: @@ -30,5 +33,3 @@ public: void setAdjusterBehavior (bool strengthadd, bool featheradd, bool roundnessadd); void trimValues (rtengine::procparams::ProcParams* pp) override; }; - -#endif diff --git a/rtgui/perspective.h b/rtgui/perspective.h index 9b36ed24d..618ad32cf 100644 --- a/rtgui/perspective.h +++ b/rtgui/perspective.h @@ -16,14 +16,17 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _PERSPECTIVE_PANEL_H_ -#define _PERSPECTIVE_PANEL_H_ +#pragma once #include + #include "adjuster.h" #include "toolpanel.h" -class PerspCorrection : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel +class PerspCorrection : + public ToolParamBlock, + public AdjusterListener, + public FoldableToolPanel { protected: @@ -43,5 +46,3 @@ public: void setAdjusterBehavior (bool badd); void trimValues (rtengine::procparams::ProcParams* pp) override; }; - -#endif diff --git a/rtgui/placesbrowser.h b/rtgui/placesbrowser.h index 6325bdb45..78c94969f 100644 --- a/rtgui/placesbrowser.h +++ b/rtgui/placesbrowser.h @@ -16,14 +16,16 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _PLACESBROWSER_ -#define _PLACESBROWSER_ +#pragma once #include + #include + #include "multilangmgr.h" -class PlacesBrowser : public Gtk::VBox +class PlacesBrowser : + public Gtk::VBox { public: typedef sigc::slot DirSelectionSlot; @@ -84,7 +86,3 @@ inline void PlacesBrowser::setDirSelector (const PlacesBrowser::DirSelectionSlot { this->selectDir = selectDir; } - -#endif - - diff --git a/rtgui/pointermotionlistener.h b/rtgui/pointermotionlistener.h index 0a2931262..26ca994b0 100644 --- a/rtgui/pointermotionlistener.h +++ b/rtgui/pointermotionlistener.h @@ -16,8 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _POINTERMOTIONLISTENER_ -#define _POINTERMOTIONLISTENER_ +#pragma once class PointerMotionListener { @@ -26,7 +25,7 @@ protected: sigc::signal sig_cycle_hsv; public: - virtual ~PointerMotionListener() {} + virtual ~PointerMotionListener() = default; virtual void pointerMoved (bool validPos, const Glib::ustring &profile, const Glib::ustring &profileW, int x, int y, int r, int g, int b, bool isRaw = false) = 0; virtual void getRGBText (int r, int g, int b, Glib::ustring &sR, Glib::ustring &sG, Glib::ustring &sB, bool isRaw = false) { sR = "--"; sG = "--"; sB = "--"; } virtual void getHSVText (float h, float s, float v, Glib::ustring &sH, Glib::ustring &sS, Glib::ustring &sV) { sH = "--"; sS = "--"; sV = "--"; } @@ -41,5 +40,3 @@ public: return sig_cycle_hsv; } }; - -#endif diff --git a/rtgui/popupbutton.h b/rtgui/popupbutton.h index fb0b66e0d..87b1b73a6 100644 --- a/rtgui/popupbutton.h +++ b/rtgui/popupbutton.h @@ -18,13 +18,15 @@ * * Class created by Jean-Christophe FRISCH, aka 'Hombre' */ -#ifndef _POPUPBUTTON_ -#define _POPUPBUTTON_ +#pragma once #include + #include "popupcommon.h" -class PopUpButton : public Gtk::Button, public PopUpCommon +class PopUpButton : + public Gtk::Button, + public PopUpCommon { public: @@ -40,5 +42,3 @@ private: bool nextOnClicked; }; - -#endif diff --git a/rtgui/popupcommon.h b/rtgui/popupcommon.h index 44ad0886a..b4cf4d7e0 100644 --- a/rtgui/popupcommon.h +++ b/rtgui/popupcommon.h @@ -18,19 +18,22 @@ * * Class created by Jean-Christophe FRISCH, aka 'Hombre' */ -#ifndef _POPUPCOMMON_ -#define _POPUPCOMMON_ +#pragma once #include + #include + #include namespace Gtk { + class Grid; class Menu; class Button; class ImageMenuItem; + } typedef struct _GdkEventButton GdkEventButton; @@ -101,5 +104,3 @@ inline int PopUpCommon::getSelected () const { return posToIndex(selected); } - -#endif diff --git a/rtgui/popuptogglebutton.h b/rtgui/popuptogglebutton.h index b2949a0b8..a97c75fa2 100644 --- a/rtgui/popuptogglebutton.h +++ b/rtgui/popuptogglebutton.h @@ -18,13 +18,15 @@ * * Class created by Jean-Christophe FRISCH, aka 'Hombre' */ -#ifndef _POPUPTOGGLEBUTTON_ -#define _POPUPTOGGLEBUTTON_ +#pragma once #include + #include "popupcommon.h" -class PopUpToggleButton : public Gtk::ToggleButton, public PopUpCommon +class PopUpToggleButton : + public Gtk::ToggleButton, + public PopUpCommon { public: @@ -32,5 +34,3 @@ public: void show (); void set_tooltip_text (const Glib::ustring &text); }; - -#endif diff --git a/rtgui/pparamschangelistener.h b/rtgui/pparamschangelistener.h index bc3a5600b..de590dd9f 100644 --- a/rtgui/pparamschangelistener.h +++ b/rtgui/pparamschangelistener.h @@ -16,12 +16,13 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _PPARAMSCHANGELISTENER_ -#define _PPARAMSCHANGELISTENER_ +#pragma once + +#include + +#include "paramsedited.h" #include "../rtengine/rtengine.h" -#include -#include "paramsedited.h" class PParamsChangeListener { @@ -43,6 +44,3 @@ public: virtual void beginBatchPParamsChange(int numberOfEntries) = 0; virtual void endBatchPParamsChange() = 0; }; - -#endif - diff --git a/rtgui/preferences.h b/rtgui/preferences.h index 6ca302fe8..62f7c53c1 100644 --- a/rtgui/preferences.h +++ b/rtgui/preferences.h @@ -16,20 +16,24 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef __PREFERENCES_H__ -#define __PREFERENCES_H__ +#pragma once + +#include #include -#include "adjuster.h" -#include "options.h" -#include -#include "rtwindow.h" -#include "dynamicprofilepanel.h" -class Preferences : public Gtk::Dialog, public ProfileStoreListener +#include "adjuster.h" +#include "dynamicprofilepanel.h" +#include "options.h" +#include "rtwindow.h" + +class Preferences : + public Gtk::Dialog, + public ProfileStoreListener { - class ExtensionColumns : public Gtk::TreeModel::ColumnRecord + class ExtensionColumns : + public Gtk::TreeModel::ColumnRecord { public: Gtk::TreeModelColumn enabled; @@ -303,5 +307,3 @@ public: // void selectICCProfileDir (); // void selectMonitorProfile (); }; - -#endif diff --git a/rtgui/preprocess.h b/rtgui/preprocess.h index cf4cc8857..3b337a450 100644 --- a/rtgui/preprocess.h +++ b/rtgui/preprocess.h @@ -16,16 +16,18 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _PREPROCESS_H_ -#define _PREPROCESS_H_ +#pragma once #include -//#include "adjuster.h" -#include "toolpanel.h" + #include "adjuster.h" #include "guiutils.h" +#include "toolpanel.h" -class PreProcess : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel +class PreProcess : + public ToolParamBlock, + public AdjusterListener, + public FoldableToolPanel { protected: @@ -53,5 +55,3 @@ public: //void setAdjusterBehavior (bool linedenoiseadd, bool greenequiladd); //void trimValues (rtengine::procparams::ProcParams* pp); }; - -#endif diff --git a/rtgui/previewhandler.h b/rtgui/previewhandler.h index 7fe7b96f4..d9c91f6ad 100644 --- a/rtgui/previewhandler.h +++ b/rtgui/previewhandler.h @@ -16,19 +16,18 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _PREVIEWHANDLER_ -#define _PREVIEWHANDLER_ +#pragma once #include #include #include -#include "threadutils.h" #include "guiutils.h" +#include "threadutils.h" -#include "../rtengine/rtengine.h" #include "../rtengine/noncopyable.h" +#include "../rtengine/rtengine.h" class PreviewListener { @@ -86,5 +85,3 @@ public: Glib::RefPtr getRoughImage (int desiredW, int desiredH, double& zoom); rtengine::procparams::CropParams getCropParams (); }; - -#endif diff --git a/rtgui/previewloader.h b/rtgui/previewloader.h index ede509c0a..3712dc3ff 100644 --- a/rtgui/previewloader.h +++ b/rtgui/previewloader.h @@ -16,16 +16,16 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _PREVIEWLOADER_ -#define _PREVIEWLOADER_ +#pragma once #include + #include -#include "../rtengine/noncopyable.h" - #include "filebrowserentry.h" +#include "../rtengine/noncopyable.h" + class PreviewLoaderListener { public: @@ -94,5 +94,3 @@ private: * To use: \c previewLoader->start() , */ #define previewLoader PreviewLoader::getInstance() - -#endif diff --git a/rtgui/previewmodepanel.h b/rtgui/previewmodepanel.h index b43e8484c..98160a5e3 100644 --- a/rtgui/previewmodepanel.h +++ b/rtgui/previewmodepanel.h @@ -15,14 +15,16 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _PREVIEWMODEPANEL_ -#define _PREVIEWMODEPANEL_ +#pragma once #include -#include "adjuster.h"//dev + +#include "adjuster.h" class ImageArea; -class PreviewModePanel : public Gtk::HBox + +class PreviewModePanel : + public Gtk::HBox { protected: @@ -83,5 +85,3 @@ public: int GetbackColor(); }; - -#endif diff --git a/rtgui/previewwindow.h b/rtgui/previewwindow.h index 64aa84afd..245f4a394 100644 --- a/rtgui/previewwindow.h +++ b/rtgui/previewwindow.h @@ -16,16 +16,19 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _PREVIEWWINDOW_ -#define _PREVIEWWINDOW_ +#pragma once #include -#include "previewhandler.h" -#include "cropwindow.h" -#include "guiutils.h" -#include "cursormanager.h" -class PreviewWindow : public Gtk::DrawingArea, public PreviewListener, public CropWindowListener +#include "cropwindow.h" +#include "cursormanager.h" +#include "guiutils.h" +#include "previewhandler.h" + +class PreviewWindow : + public Gtk::DrawingArea, + public PreviewListener, + public CropWindowListener { private: @@ -71,5 +74,3 @@ public: void cropZoomChanged(CropWindow* w) override; void initialImageArrived() override; }; - -#endif diff --git a/rtgui/profilechangelistener.h b/rtgui/profilechangelistener.h index fa7e1b877..c2e3f2654 100644 --- a/rtgui/profilechangelistener.h +++ b/rtgui/profilechangelistener.h @@ -16,8 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _PROFILECHANGELISTENER_ -#define _PROFILECHANGELISTENER_ +#pragma once #include @@ -48,6 +47,3 @@ public: ) = 0; virtual void setDefaults(const rtengine::procparams::ProcParams* defparams) = 0; }; - -#endif - diff --git a/rtgui/profilepanel.h b/rtgui/profilepanel.h index 1efafe10b..378b2a984 100644 --- a/rtgui/profilepanel.h +++ b/rtgui/profilepanel.h @@ -16,22 +16,28 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _PROFILEPANEL_ -#define _PROFILEPANEL_ +#pragma once + +#include #include -#include -#include "../rtengine/rtengine.h" + +#include "guiutils.h" +#include "partialpastedlg.h" #include "pparamschangelistener.h" #include "profilechangelistener.h" -#include "partialpastedlg.h" -#include "guiutils.h" #include "profilestorecombobox.h" + #include "../rtengine/noncopyable.h" +#include "../rtengine/rtengine.h" class RTImage; -class ProfilePanel : public Gtk::Grid, public PParamsChangeListener, public ProfileStoreListener, public rtengine::NonCopyable +class ProfilePanel : + public Gtk::Grid, + public PParamsChangeListener, + public ProfileStoreListener, + public rtengine::NonCopyable { private: @@ -107,5 +113,3 @@ public: void selection_changed (); void writeOptions(); }; - -#endif diff --git a/rtgui/profilestorecombobox.h b/rtgui/profilestorecombobox.h index cec67d188..447d2e157 100644 --- a/rtgui/profilestorecombobox.h +++ b/rtgui/profilestorecombobox.h @@ -16,20 +16,19 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _PROFILESTORECOMBOBOX_ -#define _PROFILESTORECOMBOBOX_ +#pragma once #include #include + #include -#include "../rtengine/rtengine.h" -#include "../rtengine/profilestore.h" - -#include "threadutils.h" -#include "paramsedited.h" #include "guiutils.h" +#include "paramsedited.h" +#include "threadutils.h" +#include "../rtengine/profilestore.h" +#include "../rtengine/rtengine.h" /** * @brief subclass of Gtk::Label with extra fields for Combobox and Menu, to link with a ProfileStoreEntry @@ -92,5 +91,3 @@ public: Gtk::TreeIter addRow (const ProfileStoreEntry *profileStoreEntry); void deleteRow (const ProfileStoreEntry *profileStoreEntry); }; - -#endif diff --git a/rtgui/progressconnector.h b/rtgui/progressconnector.h index 012039ba6..32a48473f 100644 --- a/rtgui/progressconnector.h +++ b/rtgui/progressconnector.h @@ -16,14 +16,16 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _PROGRESSCONNECTOR_ -#define _PROGRESSCONNECTOR_ +#pragma once + +#include #include -#include -#include "../rtengine/rtengine.h" + #include "guiutils.h" +#include "../rtengine/rtengine.h" + #undef THREAD_PRIORITY_NORMAL class PLDBridge : @@ -109,4 +111,3 @@ public: return retval; } }; -#endif diff --git a/rtgui/prsharpening.h b/rtgui/prsharpening.h index 9d37fa8ba..54f2f8063 100644 --- a/rtgui/prsharpening.h +++ b/rtgui/prsharpening.h @@ -16,15 +16,19 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _PRSHARPENING_H_ -#define _PRSHARPENING_H_ +#pragma once #include + #include "adjuster.h" #include "thresholdadjuster.h" #include "toolpanel.h" -class PrSharpening : public ToolParamBlock, public ThresholdAdjusterListener, public AdjusterListener, public FoldableToolPanel +class PrSharpening : + public ToolParamBlock, + public ThresholdAdjusterListener, + public AdjusterListener, + public FoldableToolPanel { protected: @@ -79,5 +83,3 @@ public: void setAdjusterBehavior (bool contrastadd, bool radiusadd, bool amountadd, bool dampingadd, bool iteradd, bool edgetoladd, bool haloctrladd); void trimValues (rtengine::procparams::ProcParams* pp) override; }; - -#endif diff --git a/rtgui/rawcacorrection.h b/rtgui/rawcacorrection.h index d3874d9f9..60c705b19 100644 --- a/rtgui/rawcacorrection.h +++ b/rtgui/rawcacorrection.h @@ -16,15 +16,19 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _RAWCACORRECTION_H_ -#define _RAWCACORRECTION_H_ +#pragma once #include + #include "adjuster.h" #include "checkbox.h" #include "toolpanel.h" -class RAWCACorr : public ToolParamBlock, public AdjusterListener, public CheckBoxListener, public FoldableToolPanel +class RAWCACorr : + public ToolParamBlock, + public AdjusterListener, + public CheckBoxListener, + public FoldableToolPanel { protected: @@ -52,5 +56,3 @@ public: void adjusterChanged (Adjuster* a, double newval) override; void checkBoxToggled (CheckBox* c, CheckValue newval) override; }; - -#endif diff --git a/rtgui/rawexposure.h b/rtgui/rawexposure.h index 339a054c9..75b3a9330 100644 --- a/rtgui/rawexposure.h +++ b/rtgui/rawexposure.h @@ -16,14 +16,17 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _RAWEXPOSURE_H_ -#define _RAWEXPOSURE_H_ +#pragma once #include + #include "adjuster.h" #include "toolpanel.h" -class RAWExposure : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel +class RAWExposure : + public ToolParamBlock, + public AdjusterListener, + public FoldableToolPanel { protected: @@ -43,5 +46,3 @@ public: void setAdjusterBehavior (bool pexposadd); void trimValues (rtengine::procparams::ProcParams* pp) override; }; - -#endif diff --git a/rtgui/recentbrowser.h b/rtgui/recentbrowser.h index 1ba2c17f4..68a7962f9 100644 --- a/rtgui/recentbrowser.h +++ b/rtgui/recentbrowser.h @@ -16,14 +16,15 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _RECENTBROWSER_ -#define _RECENTBROWSER_ +#pragma once #include -#include "multilangmgr.h" -#include "guiutils.h" -class RecentBrowser : public Gtk::VBox +#include "guiutils.h" +#include "multilangmgr.h" + +class RecentBrowser : + public Gtk::VBox { public: typedef sigc::slot DirSelectionSlot; @@ -47,7 +48,3 @@ inline void RecentBrowser::setDirSelector (const RecentBrowser::DirSelectionSlot { this->selectDir = selectDir; } - -#endif - - diff --git a/rtgui/renamedlg.h b/rtgui/renamedlg.h index a3e16ad0a..23f69391f 100644 --- a/rtgui/renamedlg.h +++ b/rtgui/renamedlg.h @@ -16,16 +16,17 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _RENAMEDLG_ -#define _RENAMEDLG_ +#pragma once #include + #include "cacheimagedata.h" #include "guiutils.h" #define RESPONSE_ALL 100 -class RenameDialog : public Gtk::Dialog +class RenameDialog : + public Gtk::Dialog { protected: @@ -43,6 +44,3 @@ public: Glib::ustring getNewName (); }; - -#endif - diff --git a/rtgui/resize.h b/rtgui/resize.h index 1d38ae674..41b54509e 100644 --- a/rtgui/resize.h +++ b/rtgui/resize.h @@ -16,14 +16,14 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _RESIZE_H_ -#define _RESIZE_H_ +#pragma once #include + #include "adjuster.h" #include "guiutils.h" -#include "toolpanel.h" #include "guiutils.h" +#include "toolpanel.h" class Resize final : public ToolParamBlock, @@ -86,5 +86,3 @@ private: static constexpr int MAX_SCALE = 16; // 16 to match the main preview max scale of 1600% }; - -#endif diff --git a/rtgui/retinex.h b/rtgui/retinex.h index 1be511cb3..c82c01d3e 100644 --- a/rtgui/retinex.h +++ b/rtgui/retinex.h @@ -1,21 +1,25 @@ /* * This file is part of RawTherapee. */ -#ifndef _RETINEX_H_ -#define _RETINEX_H_ +#pragma once #include + #include "adjuster.h" -#include "toolpanel.h" -#include "guiutils.h" +#include "colorprovider.h" #include "curveeditor.h" #include "curveeditorgroup.h" +#include "guiutils.h" #include "thresholdadjuster.h" -#include "colorprovider.h" - -class Retinex : public ToolParamBlock, public FoldableToolPanel, public rtengine::RetinexListener, public CurveListener, - public AdjusterListener, public ColorProvider +#include "toolpanel.h" +class Retinex : + public ToolParamBlock, + public FoldableToolPanel, + public rtengine::RetinexListener, + public CurveListener, + public AdjusterListener, + public ColorProvider { private: IdleRegister idle_register; @@ -141,5 +145,3 @@ private: void foldAllButMe (GdkEventButton* event, MyExpander *expander); }; - -#endif diff --git a/rtgui/rgbcurves.h b/rtgui/rgbcurves.h index e62fdd7c7..b73aa22b7 100644 --- a/rtgui/rgbcurves.h +++ b/rtgui/rgbcurves.h @@ -16,17 +16,21 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _RGBCURVES_H_ -#define _RGBCURVES_H_ +#pragma once #include + #include "adjuster.h" -#include "toolpanel.h" +#include "colorprovider.h" #include "curveeditor.h" #include "curveeditorgroup.h" -#include "colorprovider.h" +#include "toolpanel.h" -class RGBCurves : public ToolParamBlock, public FoldableToolPanel, public CurveListener, public ColorProvider +class RGBCurves : + public ToolParamBlock, + public FoldableToolPanel, + public CurveListener, + public ColorProvider { protected: @@ -66,5 +70,3 @@ public: void lumamodeChanged (); void enabledChanged() override; }; - -#endif diff --git a/rtgui/rotate.h b/rtgui/rotate.h index bd0613609..5730fd481 100644 --- a/rtgui/rotate.h +++ b/rtgui/rotate.h @@ -16,15 +16,18 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _ROTATE_H_ -#define _ROTATE_H_ +#pragma once #include -#include "adjuster.h" -#include "toolpanel.h" -#include "lensgeomlistener.h" -class Rotate : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel +#include "adjuster.h" +#include "lensgeomlistener.h" +#include "toolpanel.h" + +class Rotate : + public ToolParamBlock, + public AdjusterListener, + public FoldableToolPanel { protected: @@ -52,5 +55,3 @@ public: rlistener = l; } }; - -#endif diff --git a/rtgui/rtwindow.h b/rtgui/rtwindow.h index 93e1c31b9..05d0cc231 100644 --- a/rtgui/rtwindow.h +++ b/rtgui/rtwindow.h @@ -15,23 +15,29 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _RTWINDOW_ -#define _RTWINDOW_ +#pragma once + +#include #include -#include "filepanel.h" -#include "editorpanel.h" -#include "batchqueuepanel.h" -#include -#include "progressconnector.h" -#include "editwindow.h" -#include "splash.h" + #if defined(__APPLE__) #include #endif + +#include "batchqueuepanel.h" +#include "editorpanel.h" +#include "editwindow.h" +#include "filepanel.h" +#include "progressconnector.h" +#include "splash.h" + #include "../rtengine/noncopyable.h" -class RTWindow : public Gtk::Window, public rtengine::ProgressListener, public rtengine::NonCopyable +class RTWindow : + public Gtk::Window, + public rtengine::ProgressListener, + public rtengine::NonCopyable { private: @@ -125,5 +131,3 @@ public: void writeToolExpandedStatus (std::vector &tpOpen); }; - -#endif diff --git a/rtgui/saveasdlg.h b/rtgui/saveasdlg.h index 4097a3ae9..e4567f69b 100644 --- a/rtgui/saveasdlg.h +++ b/rtgui/saveasdlg.h @@ -16,14 +16,16 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _SAVEASDLG_ -#define _SAVEASDLG_ +#pragma once #include + #include "adjuster.h" #include "saveformatpanel.h" -class SaveAsDialog : public Gtk::Dialog, public FormatChangeListener +class SaveAsDialog : + public Gtk::Dialog, + public FormatChangeListener { protected: @@ -64,6 +66,3 @@ public: void formatChanged(const Glib::ustring& format) override; bool keyPressed (GdkEventKey* event); }; - - -#endif diff --git a/rtgui/saveformatpanel.h b/rtgui/saveformatpanel.h index ab5ffef3e..af9baa58a 100644 --- a/rtgui/saveformatpanel.h +++ b/rtgui/saveformatpanel.h @@ -16,13 +16,14 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef __SAVEFORMATPANEL_H__ -#define __SAVEFORMATPANEL_H__ +#pragma once #include + #include "adjuster.h" #include "guiutils.h" #include "options.h" + #include "../rtengine/noncopyable.h" class FormatChangeListener @@ -62,5 +63,3 @@ public: void formatChanged (); void adjusterChanged (Adjuster* a, double newval) override; }; - -#endif diff --git a/rtgui/sensorbayer.h b/rtgui/sensorbayer.h index 2d68411ce..3d6018181 100644 --- a/rtgui/sensorbayer.h +++ b/rtgui/sensorbayer.h @@ -16,13 +16,15 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _SENSORBAYER_H_ -#define _SENSORBAYER_H_ +#pragma once #include + #include "toolpanel.h" -class SensorBayer : public ToolParamBlock, public FoldableToolPanel +class SensorBayer : + public ToolParamBlock, + public FoldableToolPanel { protected: @@ -37,5 +39,3 @@ public: return packBox; } }; - -#endif diff --git a/rtgui/sensorxtrans.h b/rtgui/sensorxtrans.h index fbf71b401..c1cacb2f4 100644 --- a/rtgui/sensorxtrans.h +++ b/rtgui/sensorxtrans.h @@ -16,13 +16,15 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _SENSORXTRANS_H_ -#define _SENSORXTRANS_H_ +#pragma once #include + #include "toolpanel.h" -class SensorXTrans : public ToolParamBlock, public FoldableToolPanel +class SensorXTrans : + public ToolParamBlock, + public FoldableToolPanel { protected: @@ -37,5 +39,3 @@ public: return packBox; } }; - -#endif diff --git a/rtgui/shadowshighlights.h b/rtgui/shadowshighlights.h index d675f40d6..4f3ee7577 100644 --- a/rtgui/shadowshighlights.h +++ b/rtgui/shadowshighlights.h @@ -16,14 +16,17 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _SHADOWSHIGHLIGHTS_H_ -#define _SHADOWSHIGHLIGHTS_H_ +#pragma once #include + #include "adjuster.h" #include "toolpanel.h" -class ShadowsHighlights : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel +class ShadowsHighlights : + public ToolParamBlock, + public AdjusterListener, + public FoldableToolPanel { protected: @@ -53,5 +56,3 @@ public: void colorspaceChanged(); }; - -#endif diff --git a/rtgui/sharpenedge.h b/rtgui/sharpenedge.h index b136d8e5e..46a528153 100644 --- a/rtgui/sharpenedge.h +++ b/rtgui/sharpenedge.h @@ -21,14 +21,17 @@ * * */ -#ifndef _SHARPENEDGE_H_ -#define _SHARPENEDGE_H_ +#pragma once #include + #include "adjuster.h" #include "toolpanel.h" -class SharpenEdge : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel +class SharpenEdge : + public ToolParamBlock, + public AdjusterListener, + public FoldableToolPanel { protected: @@ -56,5 +59,3 @@ public: void chanthree_toggled (); }; - -#endif diff --git a/rtgui/sharpening.h b/rtgui/sharpening.h index ac846a2b6..e922e82c7 100644 --- a/rtgui/sharpening.h +++ b/rtgui/sharpening.h @@ -16,15 +16,19 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _SHARPENING_H_ -#define _SHARPENING_H_ +#pragma once #include + #include "adjuster.h" #include "thresholdadjuster.h" #include "toolpanel.h" -class Sharpening : public ToolParamBlock, public ThresholdAdjusterListener, public AdjusterListener, public FoldableToolPanel +class Sharpening : + public ToolParamBlock, + public ThresholdAdjusterListener, + public AdjusterListener, + public FoldableToolPanel { protected: @@ -82,5 +86,3 @@ public: void setAdjusterBehavior (bool contrastadd, bool radiusadd, bool amountadd, bool dampingadd, bool iteradd, bool edgetoladd, bool haloctrladd); void trimValues (rtengine::procparams::ProcParams* pp) override; }; - -#endif diff --git a/rtgui/sharpenmicro.h b/rtgui/sharpenmicro.h index 7c292413b..3120e6e7b 100644 --- a/rtgui/sharpenmicro.h +++ b/rtgui/sharpenmicro.h @@ -21,14 +21,17 @@ * * */ -#ifndef _SHARPENMICRO_H_ -#define _SHARPENMICRO_H_ +#pragma once #include + #include "adjuster.h" #include "toolpanel.h" -class SharpenMicro : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel +class SharpenMicro : + public ToolParamBlock, + public AdjusterListener, + public FoldableToolPanel { protected: @@ -60,5 +63,3 @@ public: }; - -#endif diff --git a/rtgui/shcselector.h b/rtgui/shcselector.h index d3ef2adb8..5c4421e0a 100644 --- a/rtgui/shcselector.h +++ b/rtgui/shcselector.h @@ -16,10 +16,10 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _SHCSELECTOR_ -#define _SHCSELECTOR_ +#pragma once #include + #include "coloredbar.h" class SHCListener @@ -82,6 +82,3 @@ public: bool reset (); void refresh(); }; - -#endif - diff --git a/rtgui/soundman.h b/rtgui/soundman.h index 6d065c87a..5eb6883e0 100644 --- a/rtgui/soundman.h +++ b/rtgui/soundman.h @@ -17,13 +17,13 @@ * along with RawTherapee. If not, see . * */ - -#ifndef _SOUNDMAN_ -#define _SOUNDMAN_ +#pragma once namespace Glib { + class ustring; + } class SoundManager @@ -32,5 +32,3 @@ public: static void init(); static void playSoundAsync(const Glib::ustring &sound); }; - -#endif diff --git a/rtgui/splash.h b/rtgui/splash.h index 29dbb62cf..363c51489 100644 --- a/rtgui/splash.h +++ b/rtgui/splash.h @@ -16,12 +16,12 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef __SPLASH__ -#define __SPLASH__ +#pragma once #include -class SplashImage : public Gtk::DrawingArea +class SplashImage : + public Gtk::DrawingArea { private: @@ -59,5 +59,3 @@ public: //virtual bool on_button_release_event (GdkEventButton* event); void closePressed(); }; - -#endif diff --git a/rtgui/threadutils.h b/rtgui/threadutils.h index f8107d74c..eae4a9ad2 100644 --- a/rtgui/threadutils.h +++ b/rtgui/threadutils.h @@ -16,8 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _THREADUTILS_ -#define _THREADUTILS_ +#pragma once // Uncomment this if you want to bypass the CMakeList options and force the values, but do not commit! //#undef TRACE_MYRWMUTEX @@ -307,5 +306,3 @@ inline MyWriterLock::~MyWriterLock () #define MYREADERLOCK_RELEASE(ln) ln.release(); #define MYWRITERLOCK_RELEASE(ln) ln.release(); #endif - -#endif /* _THREADUTILS_ */ diff --git a/rtgui/thresholdadjuster.h b/rtgui/thresholdadjuster.h index ea3822875..b28f68dee 100644 --- a/rtgui/thresholdadjuster.h +++ b/rtgui/thresholdadjuster.h @@ -16,10 +16,10 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _THRESHOLDADJUSTER_H_ -#define _THRESHOLDADJUSTER_H_ +#pragma once #include + #include "editedstate.h" #include "guiutils.h" #include "thresholdselector.h" @@ -160,5 +160,3 @@ public: // this set_tooltip_text method is to set_tooltip_markup, and text can contain markups void set_tooltip_text(const Glib::ustring& text); }; - -#endif diff --git a/rtgui/thresholdselector.h b/rtgui/thresholdselector.h index 6b9dda3d0..f948b56ad 100644 --- a/rtgui/thresholdselector.h +++ b/rtgui/thresholdselector.h @@ -16,14 +16,15 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _THRESHOLDSELECTOR_ -#define _THRESHOLDSELECTOR_ +#pragma once -#include "guiutils.h" -#include "../rtengine/procparams.h" -#include "coloredbar.h" #include +#include "coloredbar.h" +#include "guiutils.h" + +#include "../rtengine/procparams.h" + class ThresholdSelector; /* @@ -245,6 +246,3 @@ inline void ThresholdSelector::getPositions (Glib::ustring& botto bottomRight = Glib::ustring::format(std::fixed, std::setprecision(precisionBottom), shapePositionValue(TS_BOTTOMRIGHT)); topRight = Glib::ustring::format(std::fixed, std::setprecision(precisionTop), shapePositionValue(TS_TOPRIGHT)); } - -#endif - diff --git a/rtgui/thumbbrowserbase.h b/rtgui/thumbbrowserbase.h index 890c37c87..a5c51cf5f 100644 --- a/rtgui/thumbbrowserbase.h +++ b/rtgui/thumbbrowserbase.h @@ -16,23 +16,26 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _THUMBNAILBROWSERBASE_ -#define _THUMBNAILBROWSERBASE_ +#pragma once + +#include #include -#include "thumbbrowserentrybase.h" -#include -#include "options.h" + #include "guiutils.h" #include "inspector.h" +#include "options.h" +#include "thumbbrowserentrybase.h" /* * Class handling the list of ThumbBrowserEntry objects and their position in it's allocated space */ -class ThumbBrowserBase : public Gtk::Grid +class ThumbBrowserBase : + public Gtk::Grid { - class Internal : public Gtk::DrawingArea + class Internal : + public Gtk::DrawingArea { //Cairo::RefPtr cc; int ofsX, ofsY; @@ -253,5 +256,3 @@ public: } }; - -#endif diff --git a/rtgui/thumbimageupdater.h b/rtgui/thumbimageupdater.h index 81636103e..6c4171a87 100644 --- a/rtgui/thumbimageupdater.h +++ b/rtgui/thumbimageupdater.h @@ -16,16 +16,15 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _THUMBIMAGEUPDATER_ -#define _THUMBIMAGEUPDATER_ +#pragma once #include +#include "thumbbrowserentrybase.h" + #include "../rtengine/rtengine.h" #include "../rtengine/noncopyable.h" -#include "thumbbrowserentrybase.h" - class ThumbImageUpdateListener { public: @@ -100,5 +99,3 @@ private: * To use: \c thumbImageUpdater->start() , */ #define thumbImageUpdater ThumbImageUpdater::getInstance() - -#endif diff --git a/rtgui/thumbnail.h b/rtgui/thumbnail.h index cacffbd58..1a0f68409 100644 --- a/rtgui/thumbnail.h +++ b/rtgui/thumbnail.h @@ -16,21 +16,23 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _THUMBNAIL_ -#define _THUMBNAIL_ +#pragma once #include #include #include + +#include "cacheimagedata.h" #include "cachemanager.h" +#include "threadutils.h" +#include "thumbnaillistener.h" + #include "../rtengine/rtengine.h" #include "../rtengine/rtthumbnail.h" -#include "cacheimagedata.h" -#include "thumbnaillistener.h" -#include "threadutils.h" class CacheManager; + struct ParamsEdited; class Thumbnail @@ -184,7 +186,3 @@ public: bool openDefaultViewer(int destination); bool imageLoad(bool loading); }; - - -#endif - diff --git a/rtgui/thumbnailbrowser.h b/rtgui/thumbnailbrowser.h index 9d40d1f7d..ef953c0e9 100644 --- a/rtgui/thumbnailbrowser.h +++ b/rtgui/thumbnailbrowser.h @@ -16,12 +16,12 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _THUMBNAILBROWSER_ -#define _THUMBNAILBROWSER_ +#pragma once #include -#include "thumbnail.h" + #include "filecatalog.h" +#include "thumbnail.h" class ThumbBrowserEntry { @@ -97,5 +97,3 @@ public: void redraw (); void styleChanged (const Glib::RefPtr& style); }; - -#endif diff --git a/rtgui/thumbnaillistener.h b/rtgui/thumbnaillistener.h index 97503c420..18ac99dce 100644 --- a/rtgui/thumbnaillistener.h +++ b/rtgui/thumbnaillistener.h @@ -16,8 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _THUMBNAILLISTENER_ -#define _THUMBNAILLISTENER_ +#pragma once class Thumbnail; @@ -27,6 +26,3 @@ public: virtual ~ThumbnailListener() = default; virtual void procParamsChanged(Thumbnail* thm, int whoChangedIt) = 0; }; - -#endif - diff --git a/rtgui/tonecurve.h b/rtgui/tonecurve.h index fb08c02c2..b44a7ccab 100644 --- a/rtgui/tonecurve.h +++ b/rtgui/tonecurve.h @@ -16,20 +16,25 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _TONECURVE_H_ -#define _TONECURVE_H_ +#pragma once #include + #include "adjuster.h" -#include "toolpanel.h" #include "curveeditor.h" #include "curveeditorgroup.h" -#include "mycurve.h" #include "guiutils.h" +#include "mycurve.h" +#include "toolpanel.h" class EditDataProvider; -class ToneCurve : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, public rtengine::AutoExpListener, public CurveListener +class ToneCurve : + public ToolParamBlock, + public AdjusterListener, + public FoldableToolPanel, + public rtengine::AutoExpListener, + public CurveListener { private: IdleRegister idle_register; @@ -141,5 +146,3 @@ public: void methodChanged (); void clampOOGChanged(); }; - -#endif diff --git a/rtgui/toolbar.h b/rtgui/toolbar.h index 958aa80be..9f0a2818b 100644 --- a/rtgui/toolbar.h +++ b/rtgui/toolbar.h @@ -16,12 +16,12 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef __TOOLBAR_H__ -#define __TOOLBAR_H__ +#pragma once #include -#include "toolenum.h" + #include "lockablecolorpicker.h" +#include "toolenum.h" class RTImage; @@ -100,5 +100,3 @@ public: bool handleShortcutKey (GdkEventKey* event); void setBatchMode(); }; - -#endif diff --git a/rtgui/toolenum.h b/rtgui/toolenum.h index e90a0f685..c3bc873f1 100644 --- a/rtgui/toolenum.h +++ b/rtgui/toolenum.h @@ -16,9 +16,6 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _TOOLENUM_ -#define _TOOLENUM_ +#pragma once enum ToolMode {TMNone = -1, TMHand = 0, TMSpotWB = 1, TMCropSelect = 2, TMStraighten = 3, TMColorPicker = 4}; - -#endif diff --git a/rtgui/toolpanel.h b/rtgui/toolpanel.h index 2c787d937..aeb0f60a6 100644 --- a/rtgui/toolpanel.h +++ b/rtgui/toolpanel.h @@ -16,20 +16,22 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef __TOOLPANEL__ -#define __TOOLPANEL__ +#pragma once #include + #include -#include "../rtengine/rtengine.h" + #include "editbuffer.h" #include "guiutils.h" #include "multilangmgr.h" #include "paramsedited.h" -#include "../rtengine/noncopyable.h" -class ToolPanel; +#include "../rtengine/noncopyable.h" +#include "../rtengine/rtengine.h" + class FoldableToolPanel; +class ToolPanel; class ToolPanelListener { @@ -39,20 +41,23 @@ public: }; /// @brief This class control the space around the group of tools inside a tab, as well as the space separating each tool. */ -class ToolVBox : public Gtk::VBox +class ToolVBox : + public Gtk::VBox { public: ToolVBox(); }; /// @brief This class control the space around a tool's block of parameter. */ -class ToolParamBlock : public Gtk::VBox +class ToolParamBlock : + public Gtk::VBox { public: ToolParamBlock(); }; -class ToolPanel : public rtengine::NonCopyable +class ToolPanel : + public rtengine::NonCopyable { protected: @@ -136,7 +141,8 @@ public: } }; -class FoldableToolPanel : public ToolPanel +class FoldableToolPanel : + public ToolPanel { protected: @@ -218,5 +224,3 @@ public: return exp->signal_enabled_toggled(); } }; - -#endif diff --git a/rtgui/toolpanelcoord.h b/rtgui/toolpanelcoord.h index 3a4ddc05f..7b6e23937 100644 --- a/rtgui/toolpanelcoord.h +++ b/rtgui/toolpanelcoord.h @@ -16,75 +16,77 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef __TOOLPANELCCORD__ -#define __TOOLPANELCCORD__ +#pragma once -#include "../rtengine/rtengine.h" -#include "toolpanel.h" #include -#include "pparamschangelistener.h" -#include "profilechangelistener.h" -#include "imageareatoollistener.h" + #include -#include "whitebalance.h" -#include "coarsepanel.h" -#include "tonecurve.h" -#include "vibrance.h" -#include "colorappearance.h" -#include "shadowshighlights.h" -#include "impulsedenoise.h" -#include "defringe.h" -#include "dirpyrdenoise.h" -#include "epd.h" -#include "sharpening.h" -#include "labcurve.h" -#include "metadatapanel.h" -#include "crop.h" -#include "icmpanel.h" -#include "resize.h" -#include "chmixer.h" -#include "blackwhite.h" -#include "cacorrection.h" -#include "lensprofile.h" -#include "distortion.h" -#include "perspective.h" -#include "rotate.h" -#include "vignetting.h" -#include "retinex.h" -#include "gradient.h" -#include "pcvignette.h" -#include "toolbar.h" -#include "lensgeom.h" -#include "lensgeomlistener.h" -#include "wavelet.h" -#include "dirpyrequalizer.h" -#include "hsvequalizer.h" -#include "preprocess.h" + #include "bayerpreprocess.h" #include "bayerprocess.h" -#include "xtransprocess.h" +#include "bayerrawexposure.h" +#include "blackwhite.h" +#include "cacorrection.h" +#include "chmixer.h" +#include "coarsepanel.h" +#include "colorappearance.h" +#include "colortoning.h" +#include "crop.h" #include "darkframe.h" +#include "defringe.h" +#include "dehaze.h" +#include "dirpyrdenoise.h" +#include "dirpyrequalizer.h" +#include "distortion.h" +#include "epd.h" +#include "fattaltonemap.h" +#include "filmnegative.h" +#include "filmsimulation.h" #include "flatfield.h" -#include "sensorbayer.h" -#include "sensorxtrans.h" +#include "gradient.h" +#include "guiutils.h" +#include "hsvequalizer.h" +#include "icmpanel.h" +#include "imageareatoollistener.h" +#include "impulsedenoise.h" +#include "labcurve.h" +#include "lensgeom.h" +#include "lensgeomlistener.h" +#include "lensprofile.h" +#include "localcontrast.h" +#include "metadatapanel.h" +#include "pcvignette.h" +#include "pdsharpening.h" +#include "perspective.h" +#include "pparamschangelistener.h" +#include "preprocess.h" +#include "profilechangelistener.h" +#include "prsharpening.h" #include "rawcacorrection.h" #include "rawexposure.h" -#include "bayerrawexposure.h" -#include "xtransrawexposure.h" -#include "sharpenmicro.h" -#include "sharpenedge.h" +#include "resize.h" +#include "retinex.h" #include "rgbcurves.h" -#include "colortoning.h" -#include "filmsimulation.h" -#include "prsharpening.h" -#include "pdsharpening.h" -#include "fattaltonemap.h" -#include "localcontrast.h" +#include "rotate.h" +#include "sensorbayer.h" +#include "sensorxtrans.h" +#include "shadowshighlights.h" +#include "sharpenedge.h" +#include "sharpening.h" +#include "sharpenmicro.h" #include "softlight.h" -#include "dehaze.h" -#include "guiutils.h" -#include "filmnegative.h" +#include "tonecurve.h" +#include "toolbar.h" +#include "toolpanel.h" +#include "vibrance.h" +#include "vignetting.h" +#include "wavelet.h" +#include "whitebalance.h" +#include "xtransprocess.h" +#include "xtransrawexposure.h" + #include "../rtengine/noncopyable.h" +#include "../rtengine/rtengine.h" class ImageEditorCoordinator; @@ -331,5 +333,3 @@ public: private: IdleRegister idle_register; }; - -#endif diff --git a/rtgui/vibrance.h b/rtgui/vibrance.h index 606bfa80a..211f631f9 100644 --- a/rtgui/vibrance.h +++ b/rtgui/vibrance.h @@ -16,18 +16,23 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _VIBRANCE_ -#define _VIBRANCE_ +#pragma once #include + #include "adjuster.h" -#include "thresholdadjuster.h" #include "curveeditor.h" #include "curveeditorgroup.h" +#include "thresholdadjuster.h" #include "toolpanel.h" -class Vibrance : public ToolParamBlock, public AdjusterListener, public ThresholdCurveProvider, public ThresholdAdjusterListener, - public FoldableToolPanel, public CurveListener +class Vibrance : + public ToolParamBlock, + public AdjusterListener, + public ThresholdCurveProvider, + public ThresholdAdjusterListener, + public FoldableToolPanel, + public CurveListener { protected: @@ -76,6 +81,3 @@ public: void pastsattog_toggled (); std::vector getCurvePoints(ThresholdSelector* tAdjuster) const override; }; - - -#endif diff --git a/rtgui/vignetting.h b/rtgui/vignetting.h index 094869f67..8cc8c498b 100644 --- a/rtgui/vignetting.h +++ b/rtgui/vignetting.h @@ -16,14 +16,17 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _VIGNETTING_H_ -#define _VIGNETTING_H_ +#pragma once #include + #include "adjuster.h" #include "toolpanel.h" -class Vignetting : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel +class Vignetting : + public ToolParamBlock, + public AdjusterListener, + public FoldableToolPanel { protected: @@ -46,5 +49,3 @@ public: void setAdjusterBehavior (bool amountadd, bool radiusadd, bool strengthadd, bool centeradd); void trimValues (rtengine::procparams::ProcParams* pp) override; }; - -#endif diff --git a/rtgui/wbprovider.h b/rtgui/wbprovider.h index 31ba8331a..a56d93cd3 100644 --- a/rtgui/wbprovider.h +++ b/rtgui/wbprovider.h @@ -16,9 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _WBPROVIDER_ -#define _WBPROVIDER_ - +#pragma once class WBProvider { @@ -29,5 +27,3 @@ public: virtual void getCamWB (double& temp, double& green) {} virtual void spotWBRequested (int size) {} }; - -#endif diff --git a/rtgui/whitebalance.h b/rtgui/whitebalance.h index fd7efe7ce..5c0500b92 100644 --- a/rtgui/whitebalance.h +++ b/rtgui/whitebalance.h @@ -16,14 +16,15 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _WB_H_ -#define _WB_H_ +#pragma once #include -#include "toolpanel.h" + #include "adjuster.h" #include "guiutils.h" +#include "toolpanel.h" #include "wbprovider.h" + #include "../rtengine/procparams.h" class SpotWBListener @@ -123,5 +124,3 @@ public: void trimValues (rtengine::procparams::ProcParams* pp) override; void enabledChanged() override; }; - -#endif diff --git a/rtgui/xtransprocess.h b/rtgui/xtransprocess.h index dae93822f..b17b56b07 100644 --- a/rtgui/xtransprocess.h +++ b/rtgui/xtransprocess.h @@ -16,17 +16,21 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _XTRANSPROCESS_H_ -#define _XTRANSPROCESS_H_ +#pragma once #include + #include "adjuster.h" #include "checkbox.h" #include "guiutils.h" #include "toolpanel.h" - -class XTransProcess : public ToolParamBlock, public AdjusterListener, public CheckBoxListener, public FoldableToolPanel, public rtengine::AutoContrastListener +class XTransProcess : + public ToolParamBlock, + public AdjusterListener, + public CheckBoxListener, + public FoldableToolPanel, + public rtengine::AutoContrastListener { protected: @@ -64,5 +68,3 @@ public: void checkBoxToggled(CheckBox* c, CheckValue newval) override; void adjusterAutoToggled(Adjuster* a, bool newval) override; }; - -#endif diff --git a/rtgui/xtransrawexposure.h b/rtgui/xtransrawexposure.h index 4211e3e0c..46c418f2f 100644 --- a/rtgui/xtransrawexposure.h +++ b/rtgui/xtransrawexposure.h @@ -16,14 +16,17 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _XTRANSRAWEXPOSURE_H_ -#define _XTRANSRAWEXPOSURE_H_ +#pragma once #include + #include "adjuster.h" #include "toolpanel.h" -class XTransRAWExposure : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel +class XTransRAWExposure : + public ToolParamBlock, + public AdjusterListener, + public FoldableToolPanel { protected: @@ -45,5 +48,3 @@ public: void setAdjusterBehavior (bool pexblackadd); void trimValues (rtengine::procparams::ProcParams* pp) override; }; - -#endif diff --git a/rtgui/zoompanel.h b/rtgui/zoompanel.h index e1cb651e3..49e1e848d 100644 --- a/rtgui/zoompanel.h +++ b/rtgui/zoompanel.h @@ -16,13 +16,14 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _ZOOMPANEL_ -#define _ZOOMPANEL_ +#pragma once #include class ImageArea; -class ZoomPanel : public Gtk::Grid + +class ZoomPanel : + public Gtk::Grid { protected: @@ -48,6 +49,3 @@ public: void newCropClicked (); void refreshZoomLabel (); }; - -#endif - From c44e9dfa4448e9c9b89d9b8f5b32b57101be8737 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Thu, 31 Oct 2019 12:55:12 +0100 Subject: [PATCH 112/208] Add missing includes for latest GCC 9 --- rtengine/lcp.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rtengine/lcp.cc b/rtengine/lcp.cc index 0b73f6960..b42950eb4 100644 --- a/rtengine/lcp.cc +++ b/rtengine/lcp.cc @@ -18,6 +18,7 @@ */ #include +#include #include #include @@ -32,6 +33,7 @@ #include "lcp.h" #include "procparams.h" +#include "rt_math.h" #include "settings.h" #include "utils.h" From 284fe57159da24663c1899e30e4494d132d7985d Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 31 Oct 2019 13:29:12 +0100 Subject: [PATCH 113/208] Further reduction of include dependencies --- rtengine/FTblockDN.cc | 1 - rtengine/ahd_demosaic_RT.cc | 2 -- rtengine/amaze_demosaic_RT.cc | 1 - rtengine/dcraw.cc | 3 ++- rtengine/dcrop.cc | 1 - rtengine/demosaic_algos.cc | 1 - rtengine/dfmanager.cc | 18 +++++++++++++----- rtengine/dfmanager.h | 10 ++-------- rtengine/eahd_demosaic.cc | 2 -- rtengine/fast_demo.cc | 1 - rtengine/hphd_demosaic_RT.cc | 2 -- rtengine/iccstore.cc | 1 - rtengine/myfile.cc | 2 +- rtengine/myfile.h | 8 +++++++- rtengine/rawimage.cc | 1 + rtengine/rawimage.h | 1 + rtengine/rawimagesource.cc | 1 - rtengine/rcd_demosaic.cc | 1 - rtengine/vng4_demosaic_RT.cc | 1 - rtgui/darkframe.cc | 1 + rtgui/darkframe.h | 5 ++++- rtgui/flatfield.cc | 1 + rtgui/flatfield.h | 5 ++++- 23 files changed, 37 insertions(+), 33 deletions(-) diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index 02164aded..b6245fbce 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -41,7 +41,6 @@ #include "opthelper.h" #include "procparams.h" #include "rt_math.h" -#include "rtengine.h" #include "sleef.c" #include "../rtgui/threadutils.h" diff --git a/rtengine/ahd_demosaic_RT.cc b/rtengine/ahd_demosaic_RT.cc index 77e342c18..88ab0bf56 100644 --- a/rtengine/ahd_demosaic_RT.cc +++ b/rtengine/ahd_demosaic_RT.cc @@ -24,11 +24,9 @@ // #include -#include "colortemp.h" #include "rtengine.h" #include "rawimagesource.h" #include "rt_math.h" -#include "procparams.h" #include "../rtgui/multilangmgr.h" #include "median.h" //#define BENCHMARK diff --git a/rtengine/amaze_demosaic_RT.cc b/rtengine/amaze_demosaic_RT.cc index 43aef0f71..41c60d4ed 100644 --- a/rtengine/amaze_demosaic_RT.cc +++ b/rtengine/amaze_demosaic_RT.cc @@ -33,7 +33,6 @@ #include "sleef.c" #include "opthelper.h" #include "median.h" -#include "procparams.h" #include "StopWatch.h" namespace rtengine diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index eb206a15f..ae6f60cd1 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -26,12 +26,13 @@ /*RT*/#include /*RT*/#endif +#include #include #include #include "opthelper.h" //#define BENCHMARK #include "StopWatch.h" - +#include "utils.h" #include #include diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 06c9d59bd..fd3c42f6e 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -19,7 +19,6 @@ */ #include "cieimage.h" -#include "colortemp.h" #include "curves.h" #include "dcp.h" #include "dcrop.h" diff --git a/rtengine/demosaic_algos.cc b/rtengine/demosaic_algos.cc index 823260129..4058534da 100644 --- a/rtengine/demosaic_algos.cc +++ b/rtengine/demosaic_algos.cc @@ -25,7 +25,6 @@ #include "rt_math.h" #include "color.h" #include "../rtgui/multilangmgr.h" -#include "procparams.h" #include "sleef.c" #include "opthelper.h" #include "median.h" diff --git a/rtengine/dfmanager.cc b/rtengine/dfmanager.cc index f5a7686e6..798836edf 100644 --- a/rtengine/dfmanager.cc +++ b/rtengine/dfmanager.cc @@ -16,20 +16,28 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include "dfmanager.h" -#include "../rtgui/options.h" -#include -#include "rawimage.h" + #include #include #include -#include "imagedata.h" +#include #include +#include "dfmanager.h" +#include "../rtgui/options.h" +#include "rawimage.h" +#include "imagedata.h" + namespace rtengine { // *********************** class dfInfo ************************************** +dfInfo::~dfInfo() +{ + if( ri ) { + delete ri; + } +} inline dfInfo& dfInfo::operator =(const dfInfo &o) { diff --git a/rtengine/dfmanager.h b/rtengine/dfmanager.h index e1fa38f77..216dcfc53 100644 --- a/rtengine/dfmanager.h +++ b/rtengine/dfmanager.h @@ -19,13 +19,13 @@ #pragma once #include +#include #include #include #include #include "pixelsmap.h" -#include "rawimage.h" namespace rtengine { @@ -49,13 +49,7 @@ public: dfInfo( const dfInfo &o) : pathname(o.pathname), maker(o.maker), model(o.model), iso(o.iso), shutter(o.shutter), timestamp(o.timestamp), ri(nullptr) {} - ~dfInfo() - { - if( ri ) { - delete ri; - } - } - + ~dfInfo(); dfInfo &operator =(const dfInfo &o); bool operator <(const dfInfo &e2) const; diff --git a/rtengine/eahd_demosaic.cc b/rtengine/eahd_demosaic.cc index b87c0771d..c470eb297 100644 --- a/rtengine/eahd_demosaic.cc +++ b/rtengine/eahd_demosaic.cc @@ -24,11 +24,9 @@ #include "rawimagesource.h" #include "rawimagesource_i.h" #include "jaggedarray.h" -#include "rawimage.h" #include "iccmatrices.h" #include "rt_math.h" #include "../rtgui/multilangmgr.h" -#include "procparams.h" //#define BENCHMARK #include "StopWatch.h" diff --git a/rtengine/fast_demo.cc b/rtengine/fast_demo.cc index a40f107af..82176e59c 100644 --- a/rtengine/fast_demo.cc +++ b/rtengine/fast_demo.cc @@ -25,7 +25,6 @@ #include #include "rawimagesource.h" #include "../rtgui/multilangmgr.h" -#include "procparams.h" #include "opthelper.h" using namespace std; diff --git a/rtengine/hphd_demosaic_RT.cc b/rtengine/hphd_demosaic_RT.cc index 342cd2b6b..2b61bbe07 100644 --- a/rtengine/hphd_demosaic_RT.cc +++ b/rtengine/hphd_demosaic_RT.cc @@ -22,9 +22,7 @@ #include "rawimagesource.h" #include "rawimagesource_i.h" #include "jaggedarray.h" -#include "rawimage.h" #include "rt_math.h" -#include "procparams.h" #include "../rtgui/multilangmgr.h" #include "opthelper.h" //#define BENCHMARK diff --git a/rtengine/iccstore.cc b/rtengine/iccstore.cc index 02fe4c16d..aea03664e 100644 --- a/rtengine/iccstore.cc +++ b/rtengine/iccstore.cc @@ -36,7 +36,6 @@ #include "iccmatrices.h" #include "utils.h" -#include "../rtgui/guiutils.h" #include "../rtgui/options.h" #include "../rtgui/threadutils.h" #include "lcms2_plugin.h" diff --git a/rtengine/myfile.cc b/rtengine/myfile.cc index aab45448a..842766dcf 100644 --- a/rtengine/myfile.cc +++ b/rtengine/myfile.cc @@ -18,7 +18,7 @@ */ #include "myfile.h" #include - +#include "rtengine.h" // get mmap() sorted out #ifdef MYFILE_MMAP diff --git a/rtengine/myfile.h b/rtengine/myfile.h index 69e226b8b..88b9fa62a 100644 --- a/rtengine/myfile.h +++ b/rtengine/myfile.h @@ -23,7 +23,13 @@ #include -#include "rtengine.h" +#include "opthelper.h" + +namespace rtengine { + +class ProgressListener; + +} struct IMFILE { int fd; diff --git a/rtengine/rawimage.cc b/rtengine/rawimage.cc index a69a97ab7..4421e4af4 100644 --- a/rtengine/rawimage.cc +++ b/rtengine/rawimage.cc @@ -15,6 +15,7 @@ #include "settings.h" #include "camconst.h" #include "utils.h" +#include "rtengine.h" namespace rtengine { diff --git a/rtengine/rawimage.h b/rtengine/rawimage.h index 4537fdcab..09aaed7ad 100644 --- a/rtengine/rawimage.h +++ b/rtengine/rawimage.h @@ -21,6 +21,7 @@ #include #include #include +#include #include "dcraw.h" #include "imageformat.h" diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 0836a3832..0a36bdee8 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -34,7 +34,6 @@ #include "pdaflinesfilter.h" #include "procparams.h" #include "rawimage.h" -#include "rawimage.h" #include "rawimagesource_i.h" #include "rawimagesource.h" #include "rt_math.h" diff --git a/rtengine/rcd_demosaic.cc b/rtengine/rcd_demosaic.cc index 48c3ad334..63b5989ab 100644 --- a/rtengine/rcd_demosaic.cc +++ b/rtengine/rcd_demosaic.cc @@ -20,7 +20,6 @@ #include "rawimagesource.h" #include "rt_math.h" -#include "procparams.h" #include "../rtgui/multilangmgr.h" #include "opthelper.h" #include "StopWatch.h" diff --git a/rtengine/vng4_demosaic_RT.cc b/rtengine/vng4_demosaic_RT.cc index aaaa1b9a6..95fa58cef 100644 --- a/rtengine/vng4_demosaic_RT.cc +++ b/rtengine/vng4_demosaic_RT.cc @@ -23,7 +23,6 @@ #include "rtengine.h" #include "rawimage.h" #include "rawimagesource.h" -#include "procparams.h" #include "../rtgui/multilangmgr.h" //#define BENCHMARK #include "StopWatch.h" diff --git a/rtgui/darkframe.cc b/rtgui/darkframe.cc index af7ffeace..74ef1384a 100644 --- a/rtgui/darkframe.cc +++ b/rtgui/darkframe.cc @@ -25,6 +25,7 @@ #include "rtimage.h" #include "../rtengine/procparams.h" +#include "../rtengine/rawimage.h" using namespace rtengine; using namespace rtengine::procparams; diff --git a/rtgui/darkframe.h b/rtgui/darkframe.h index 58ac904ff..7bb6ed507 100644 --- a/rtgui/darkframe.h +++ b/rtgui/darkframe.h @@ -25,8 +25,11 @@ #include "guiutils.h" #include "toolpanel.h" -#include "../rtengine/rawimage.h" +namespace rtengine { +class RawImage; + +} class DFProvider { public: diff --git a/rtgui/flatfield.cc b/rtgui/flatfield.cc index 03204c037..932ec641c 100644 --- a/rtgui/flatfield.cc +++ b/rtgui/flatfield.cc @@ -25,6 +25,7 @@ #include "rtimage.h" #include "../rtengine/procparams.h" +#include "../rtengine/rawimage.h" using namespace rtengine; using namespace rtengine::procparams; diff --git a/rtgui/flatfield.h b/rtgui/flatfield.h index 02cc9963f..8b04a7948 100644 --- a/rtgui/flatfield.h +++ b/rtgui/flatfield.h @@ -26,8 +26,11 @@ #include "guiutils.h" #include "toolpanel.h" -#include "../rtengine/rawimage.h" +namespace rtengine { +class RawImage; + +} class FFProvider { public: From cac2eb53eff29a59793db4c2689693020d80fca8 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 31 Oct 2019 20:41:08 +0100 Subject: [PATCH 114/208] Further reduction of include dependencies --- rtengine/PF_correct_RT.cc | 2 +- rtengine/curves.h | 5 ++--- rtengine/dcp.cc | 3 +++ rtengine/dfmanager.cc | 5 ++--- rtengine/diagonalcurvetypes.h | 31 +++++++++++++++++++++++++++++ rtengine/dynamicprofile.cc | 1 + rtengine/ffmanager.cc | 4 +--- rtengine/flatcurvetypes.h | 29 +++++++++++++++++++++++++++ rtengine/histmatching.cc | 2 -- rtengine/imagedata.cc | 1 + rtengine/imageio.cc | 1 + rtengine/improccoordinator.cc | 1 + rtengine/improccoordinator.h | 5 +++++ rtengine/ipvibrance.cc | 1 - rtengine/myfile.h | 3 ++- rtengine/procparams.cc | 4 ++++ rtengine/rtengine.h | 1 - rtengine/rtthumbnail.cc | 2 ++ rtengine/simpleprocess.cc | 1 + rtengine/stdimagesource.cc | 1 + rtexif/rtexif.cc | 1 + rtexif/rtexif.h | 5 ++++- rtgui/adjuster.cc | 10 +++++----- rtgui/adjuster.h | 2 -- rtgui/batchqueue.cc | 1 + rtgui/bayerprocess.cc | 1 + rtgui/blackwhite.cc | 1 + rtgui/cacheimagedata.cc | 1 + rtgui/clipboard.h | 4 ++-- rtgui/colorappearance.cc | 1 + rtgui/colorprovider.h | 2 -- rtgui/curveeditor.h | 4 ++-- rtgui/curveeditorgroup.cc | 1 + rtgui/curveeditorgroup.h | 5 +++-- rtgui/darkframe.h | 4 +++- rtgui/diagonalcurveeditorsubgroup.h | 1 + rtgui/editorpanel.cc | 1 + rtgui/filecatalog.cc | 1 + rtgui/flatcurveeditorsubgroup.h | 1 + rtgui/flatfield.h | 4 +++- rtgui/guiutils.h | 1 - rtgui/iccprofilecreator.cc | 1 + rtgui/icmpanel.cc | 1 + rtgui/inspector.cc | 1 + rtgui/lockablecolorpicker.cc | 1 + rtgui/mydiagonalcurve.h | 12 +---------- rtgui/myflatcurve.h | 11 +--------- rtgui/options.cc | 2 ++ rtgui/options.h | 4 +++- rtgui/profilepanel.cc | 1 + rtgui/saveasdlg.cc | 1 + rtgui/thumbnail.cc | 1 + rtgui/tonecurve.cc | 1 + rtgui/whitebalance.h | 1 + 54 files changed, 137 insertions(+), 56 deletions(-) create mode 100644 rtengine/diagonalcurvetypes.h create mode 100644 rtengine/flatcurvetypes.h diff --git a/rtengine/PF_correct_RT.cc b/rtengine/PF_correct_RT.cc index 40b4933ae..e1d6ef808 100644 --- a/rtengine/PF_correct_RT.cc +++ b/rtengine/PF_correct_RT.cc @@ -33,7 +33,7 @@ #include "curves.h" #include "labimage.h" #include "sleef.c" -#include "../rtgui/myflatcurve.h" +#include "curves.h" #include "rt_math.h" #include "opthelper.h" #include "median.h" diff --git a/rtengine/curves.h b/rtengine/curves.h index ef25ff8d7..4d38e9cce 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -25,10 +25,9 @@ #include #include "rt_math.h" -#include "../rtgui/mycurve.h" -#include "../rtgui/myflatcurve.h" -#include "../rtgui/mydiagonalcurve.h" #include "color.h" +#include "flatcurvetypes.h" +#include "diagonalcurvetypes.h" #include "pipettebuffer.h" #include "noncopyable.h" #include "LUT.h" diff --git a/rtengine/dcp.cc b/rtengine/dcp.cc index ea4e40514..f15ae902f 100644 --- a/rtengine/dcp.cc +++ b/rtengine/dcp.cc @@ -22,6 +22,8 @@ #include #include #include +#include +#include #include "dcp.h" @@ -31,6 +33,7 @@ #include "imagefloat.h" #include "rawimagesource.h" #include "rt_math.h" +#include "utils.h" #include "../rtgui/options.h" using namespace rtengine; diff --git a/rtengine/dfmanager.cc b/rtengine/dfmanager.cc index 798836edf..1fb1d2e1b 100644 --- a/rtengine/dfmanager.cc +++ b/rtengine/dfmanager.cc @@ -27,6 +27,7 @@ #include "../rtgui/options.h" #include "rawimage.h" #include "imagedata.h" +#include "utils.h" namespace rtengine { @@ -34,9 +35,7 @@ namespace rtengine // *********************** class dfInfo ************************************** dfInfo::~dfInfo() { - if( ri ) { - delete ri; - } + delete ri; } inline dfInfo& dfInfo::operator =(const dfInfo &o) diff --git a/rtengine/diagonalcurvetypes.h b/rtengine/diagonalcurvetypes.h new file mode 100644 index 000000000..0d304957a --- /dev/null +++ b/rtengine/diagonalcurvetypes.h @@ -0,0 +1,31 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2004-2019 Gabor Horvath + * + * RawTherapee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RawTherapee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RawTherapee. If not, see . +*/ +#pragma once + +// For compatibility and simplicity reason, order shouldn't change, and must be identical to the order specified in the curveType widget +enum DiagonalCurveType { + DCT_Empty = -1, // Also used for identity curves + DCT_Linear, // 0 + DCT_Spline, // 1 + DCT_Parametric, // 2 + DCT_NURBS, // 3 + DCT_CatumullRom, // 4 + // Insert new curve type above this line + DCT_Unchanged // Must remain the last of the enum +}; diff --git a/rtengine/dynamicprofile.cc b/rtengine/dynamicprofile.cc index 402610ed1..0e3d75b43 100644 --- a/rtengine/dynamicprofile.cc +++ b/rtengine/dynamicprofile.cc @@ -22,6 +22,7 @@ #include #include #include +#include #include "../rtgui/options.h" diff --git a/rtengine/ffmanager.cc b/rtengine/ffmanager.cc index d8b082dd1..ce60277e1 100644 --- a/rtengine/ffmanager.cc +++ b/rtengine/ffmanager.cc @@ -54,9 +54,7 @@ inline ffInfo& ffInfo::operator =(const ffInfo &o) ffInfo::~ffInfo() { - if( ri ) { - delete ri; - } + delete ri; } bool ffInfo::operator <(const ffInfo &e2) const diff --git a/rtengine/flatcurvetypes.h b/rtengine/flatcurvetypes.h new file mode 100644 index 000000000..9efe0d259 --- /dev/null +++ b/rtengine/flatcurvetypes.h @@ -0,0 +1,29 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2004-2019 Gabor Horvath + * + * RawTherapee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RawTherapee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RawTherapee. If not, see . +*/ +#pragma once + +// For compatibility and simplicity reason, order shouldn't change, and must be identical to the order specified in the curveType widget +enum FlatCurveType { + FCT_Empty = -1, // Also used for identity curves + FCT_Linear, // 0 + FCT_MinMaxCPoints, // 1 + //FCT_Parametric, // 2 + // Insert new curve type above this line + FCT_Unchanged // Must remain the last of the enum +}; diff --git a/rtengine/histmatching.cc b/rtengine/histmatching.cc index 622933149..f5d16866e 100644 --- a/rtengine/histmatching.cc +++ b/rtengine/histmatching.cc @@ -32,8 +32,6 @@ //#define BENCHMARK #include "StopWatch.h" -#include "../rtgui/mydiagonalcurve.h" - namespace rtengine { diff --git a/rtengine/imagedata.cc b/rtengine/imagedata.cc index 184e288e9..d952dc8ba 100644 --- a/rtengine/imagedata.cc +++ b/rtengine/imagedata.cc @@ -31,6 +31,7 @@ #include "iptcpairs.h" #include "procparams.h" #include "rt_math.h" +#include "utils.h" #pragma GCC diagnostic warning "-Wextra" #define PRINT_HDR_PS_DETECTION 0 diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index c586aabaf..5927a23be 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -27,6 +27,7 @@ #include #include "rt_math.h" #include "procparams.h" +#include "utils.h" #include "../rtgui/options.h" #include "../rtgui/version.h" diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index c61b37341..729682b0f 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -19,6 +19,7 @@ #include #include #include +#include #include "improccoordinator.h" diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index c416ebe67..c27cfe76e 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -32,6 +32,11 @@ #include "../rtgui/threadutils.h" +namespace Glib +{ +class Thread; +} + namespace rtengine { diff --git a/rtengine/ipvibrance.cc b/rtengine/ipvibrance.cc index 365dff587..1c5c6c4d5 100644 --- a/rtengine/ipvibrance.cc +++ b/rtengine/ipvibrance.cc @@ -25,7 +25,6 @@ #include "iccstore.h" #include "labimage.h" #include "mytime.h" -#include "../rtgui/thresholdselector.h" #include "curves.h" #include "color.h" #include "procparams.h" diff --git a/rtengine/myfile.h b/rtengine/myfile.h index 88b9fa62a..7c498e556 100644 --- a/rtengine/myfile.h +++ b/rtengine/myfile.h @@ -25,7 +25,8 @@ #include "opthelper.h" -namespace rtengine { +namespace rtengine +{ class ProgressListener; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 8de7e2b55..df5ac40a9 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -22,9 +22,13 @@ #include #include +#include +#include +#include #include "curves.h" #include "procparams.h" +#include "utils.h" #include "../rtgui/multilangmgr.h" #include "../rtgui/options.h" diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index 389fe8355..d1300f023 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -33,7 +33,6 @@ #include "rawmetadatalocation.h" #include "rt_math.h" #include "settings.h" -#include "utils.h" #include "../rtexif/rtexif.h" diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index 3b6046b4e..d6ff53750 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -23,6 +23,8 @@ #include #include +#include +#include #include "cieimage.h" #include "colortemp.h" diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 2953fc34b..3c89fe48d 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -30,6 +30,7 @@ #include "processingjob.h" #include "procparams.h" #include +#include #include "../rtgui/options.h" #include "rawimagesource.h" #include "../rtgui/multilangmgr.h" diff --git a/rtengine/stdimagesource.cc b/rtengine/stdimagesource.cc index 2e8846412..1cb11e94d 100644 --- a/rtengine/stdimagesource.cc +++ b/rtengine/stdimagesource.cc @@ -26,6 +26,7 @@ #include "imageio.h" #include "mytime.h" #include "procparams.h" +#include "utils.h" #undef THREAD_PRIORITY_NORMAL diff --git a/rtexif/rtexif.cc b/rtexif/rtexif.cc index 4e3be8486..b2edc2842 100644 --- a/rtexif/rtexif.cc +++ b/rtexif/rtexif.cc @@ -29,6 +29,7 @@ #include #include +#include #include "rtexif.h" diff --git a/rtexif/rtexif.h b/rtexif/rtexif.h index 515c7569d..4c5a6cafe 100644 --- a/rtexif/rtexif.h +++ b/rtexif/rtexif.h @@ -29,12 +29,15 @@ #include #include -#include #include #include "../rtengine/noncopyable.h" #include "../rtengine/rawmetadatalocation.h" +namespace Glib +{ + class KeyFile; +} namespace rtengine { diff --git a/rtgui/adjuster.cc b/rtgui/adjuster.cc index 91394e18d..302a2de00 100644 --- a/rtgui/adjuster.cc +++ b/rtgui/adjuster.cc @@ -17,14 +17,14 @@ * along with RawTherapee. If not, see . */ #include "adjuster.h" + #include #include -#include "multilangmgr.h" -#include "../rtengine/rt_math.h" -#include "options.h" -#include "guiutils.h" -#include "rtimage.h" +#include "multilangmgr.h" +#include "options.h" +#include "rtimage.h" +#include "../rtengine/rt_math.h" namespace { diff --git a/rtgui/adjuster.h b/rtgui/adjuster.h index 1583bab69..9800dbac8 100644 --- a/rtgui/adjuster.h +++ b/rtgui/adjuster.h @@ -18,8 +18,6 @@ */ #pragma once -#include - #include "editedstate.h" #include "guiutils.h" diff --git a/rtgui/batchqueue.cc b/rtgui/batchqueue.cc index ed9861ad6..9fcaa28d1 100644 --- a/rtgui/batchqueue.cc +++ b/rtgui/batchqueue.cc @@ -34,6 +34,7 @@ #include "filecatalog.h" #include "batchqueuebuttonset.h" #include "guiutils.h" +#include "pathutils.h" #include "rtimage.h" #include diff --git a/rtgui/bayerprocess.cc b/rtgui/bayerprocess.cc index aa09067e4..4a57177e1 100644 --- a/rtgui/bayerprocess.cc +++ b/rtgui/bayerprocess.cc @@ -23,6 +23,7 @@ #include "options.h" #include "../rtengine/procparams.h" +#include "../rtengine/utils.h" using namespace rtengine; using namespace rtengine::procparams; diff --git a/rtgui/blackwhite.cc b/rtgui/blackwhite.cc index 482bf437f..b3ebea28a 100644 --- a/rtgui/blackwhite.cc +++ b/rtgui/blackwhite.cc @@ -27,6 +27,7 @@ #include "../rtengine/color.h" #include "../rtengine/procparams.h" +#include "../rtengine/utils.h" using namespace rtengine; using namespace rtengine::procparams; diff --git a/rtgui/cacheimagedata.cc b/rtgui/cacheimagedata.cc index 114508a95..d44ca28ec 100644 --- a/rtgui/cacheimagedata.cc +++ b/rtgui/cacheimagedata.cc @@ -19,6 +19,7 @@ #include "cacheimagedata.h" #include #include +#include #include "version.h" #include diff --git a/rtgui/clipboard.h b/rtgui/clipboard.h index d142808e9..7d25dd0d5 100644 --- a/rtgui/clipboard.h +++ b/rtgui/clipboard.h @@ -21,10 +21,10 @@ #include #include -#include "mydiagonalcurve.h" -#include "myflatcurve.h" #include "paramsedited.h" +#include "../rtengine/diagonalcurvetypes.h" +#include "../rtengine/flatcurvetypes.h" #include "../rtengine/rtengine.h" namespace rtengine diff --git a/rtgui/colorappearance.cc b/rtgui/colorappearance.cc index 450589fe9..094ffec2f 100644 --- a/rtgui/colorappearance.cc +++ b/rtgui/colorappearance.cc @@ -26,6 +26,7 @@ #include "../rtengine/color.h" #include "../rtengine/procparams.h" +#include "../rtengine/utils.h" #define MINTEMP0 2000 //1200 #define MAXTEMP0 12000 //12000 diff --git a/rtgui/colorprovider.h b/rtgui/colorprovider.h index a84b1be27..988b080bd 100644 --- a/rtgui/colorprovider.h +++ b/rtgui/colorprovider.h @@ -18,8 +18,6 @@ */ #pragma once -#include - class ColorProvider; /* diff --git a/rtgui/curveeditor.h b/rtgui/curveeditor.h index dd61bc910..535c1a86d 100644 --- a/rtgui/curveeditor.h +++ b/rtgui/curveeditor.h @@ -20,10 +20,10 @@ #include "coloredbar.h" #include "editcallbacks.h" -#include "mydiagonalcurve.h" -#include "myflatcurve.h" #include "popuptogglebutton.h" +#include "../rtengine/diagonalcurvetypes.h" +#include "../rtengine/flatcurvetypes.h" #include "../rtengine/LUT.h" #include "../rtengine/noncopyable.h" diff --git a/rtgui/curveeditorgroup.cc b/rtgui/curveeditorgroup.cc index edad0349d..06def0a8e 100644 --- a/rtgui/curveeditorgroup.cc +++ b/rtgui/curveeditorgroup.cc @@ -26,6 +26,7 @@ #include "multilangmgr.h" #include "rtimage.h" #include "options.h" +#include "pathutils.h" CurveEditorGroup::CurveEditorGroup (Glib::ustring& curveDir, Glib::ustring groupLabel) : curveDir(curveDir), line(0), curve_reset(nullptr), displayedCurve(nullptr), flatSubGroup(nullptr), diagonalSubGroup(nullptr), cl(nullptr), numberOfPackedCurve(0) diff --git a/rtgui/curveeditorgroup.h b/rtgui/curveeditorgroup.h index 7c39ab186..e3412546f 100644 --- a/rtgui/curveeditorgroup.h +++ b/rtgui/curveeditorgroup.h @@ -26,10 +26,11 @@ #include "adjuster.h" #include "guiutils.h" #include "mycurve.h" -#include "mydiagonalcurve.h" -#include "myflatcurve.h" #include "shcselector.h" +#include "../rtengine/diagonalcurvetypes.h" +#include "../rtengine/flatcurvetypes.h" + class CurveEditor; class DiagonalCurveEditorSubGroup; class FlatCurveEditorSubGroup; diff --git a/rtgui/darkframe.h b/rtgui/darkframe.h index 7bb6ed507..779caf16f 100644 --- a/rtgui/darkframe.h +++ b/rtgui/darkframe.h @@ -25,11 +25,13 @@ #include "guiutils.h" #include "toolpanel.h" -namespace rtengine { +namespace rtengine +{ class RawImage; } + class DFProvider { public: diff --git a/rtgui/diagonalcurveeditorsubgroup.h b/rtgui/diagonalcurveeditorsubgroup.h index 21784578e..184fa576f 100644 --- a/rtgui/diagonalcurveeditorsubgroup.h +++ b/rtgui/diagonalcurveeditorsubgroup.h @@ -25,6 +25,7 @@ #include "../rtengine/noncopyable.h" class DiagonalCurveEditor; +class MyDiagonalCurve; class DiagonalCurveEditorSubGroup : public CurveEditorSubGroup, diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index 6aab153a1..3c5182938 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -32,6 +32,7 @@ #include "progressconnector.h" #include "procparamchangers.h" #include "placesbrowser.h" +#include "pathutils.h" using namespace rtengine::procparams; diff --git a/rtgui/filecatalog.cc b/rtgui/filecatalog.cc index 8e8bcc216..fb8bd4923 100644 --- a/rtgui/filecatalog.cc +++ b/rtgui/filecatalog.cc @@ -36,6 +36,7 @@ #include "thumbimageupdater.h" #include "batchqueue.h" #include "placesbrowser.h" +#include "pathutils.h" using namespace std; diff --git a/rtgui/flatcurveeditorsubgroup.h b/rtgui/flatcurveeditorsubgroup.h index 5b14f752a..c358dde3b 100644 --- a/rtgui/flatcurveeditorsubgroup.h +++ b/rtgui/flatcurveeditorsubgroup.h @@ -25,6 +25,7 @@ #include "../rtengine/noncopyable.h" class FlatCurveEditor; +class MyFlatCurve; class FlatCurveEditorSubGroup: public CurveEditorSubGroup, diff --git a/rtgui/flatfield.h b/rtgui/flatfield.h index 8b04a7948..4308e938a 100644 --- a/rtgui/flatfield.h +++ b/rtgui/flatfield.h @@ -26,11 +26,13 @@ #include "guiutils.h" #include "toolpanel.h" -namespace rtengine { +namespace rtengine +{ class RawImage; } + class FFProvider { public: diff --git a/rtgui/guiutils.h b/rtgui/guiutils.h index 18b650b82..8764f4c6a 100644 --- a/rtgui/guiutils.h +++ b/rtgui/guiutils.h @@ -25,7 +25,6 @@ #include -#include "pathutils.h" #include "threadutils.h" #include "../rtengine/coord.h" diff --git a/rtgui/iccprofilecreator.cc b/rtgui/iccprofilecreator.cc index e3e1eadb4..d7f9499f6 100644 --- a/rtgui/iccprofilecreator.cc +++ b/rtgui/iccprofilecreator.cc @@ -24,6 +24,7 @@ #include "cachemanager.h" #include "addsetids.h" #include "../rtengine/color.h" +#include "pathutils.h" #include "rtimage.h" #ifdef _OPENMP #include diff --git a/rtgui/icmpanel.cc b/rtgui/icmpanel.cc index 99bd6cfca..3e3c0508c 100644 --- a/rtgui/icmpanel.cc +++ b/rtgui/icmpanel.cc @@ -23,6 +23,7 @@ #include "eventmapper.h" #include "guiutils.h" #include "options.h" +#include "pathutils.h" #include "rtimage.h" #include "../rtengine/dcp.h" diff --git a/rtgui/inspector.cc b/rtgui/inspector.cc index 50fa933e1..d38239cde 100644 --- a/rtgui/inspector.cc +++ b/rtgui/inspector.cc @@ -22,6 +22,7 @@ #include "cursormanager.h" #include "guiutils.h" #include "options.h" +#include "pathutils.h" #include "rtscalable.h" #include "../rtengine/previewimage.h" diff --git a/rtgui/lockablecolorpicker.cc b/rtgui/lockablecolorpicker.cc index a4f3dbdab..cb334c7e4 100644 --- a/rtgui/lockablecolorpicker.cc +++ b/rtgui/lockablecolorpicker.cc @@ -21,6 +21,7 @@ #include "options.h" #include "../rtengine/color.h" #include "../rtengine/rt_math.h" +#include "../rtengine/utils.h" #include "imagearea.h" #include "multilangmgr.h" #include "navigator.h" diff --git a/rtgui/mydiagonalcurve.h b/rtgui/mydiagonalcurve.h index 058c11e5a..d9f2518fb 100644 --- a/rtgui/mydiagonalcurve.h +++ b/rtgui/mydiagonalcurve.h @@ -27,18 +27,8 @@ #include "mycurve.h" #include "../rtengine/LUT.h" +#include "../rtengine/diagonalcurvetypes.h" -// For compatibility and simplicity reason, order shouldn't change, and must be identical to the order specified in the curveType widget -enum DiagonalCurveType { - DCT_Empty = -1, // Also used for identity curves - DCT_Linear, // 0 - DCT_Spline, // 1 - DCT_Parametric, // 2 - DCT_NURBS, // 3 - DCT_CatumullRom, // 4 - // Insert new curve type above this line - DCT_Unchanged // Must remain the last of the enum -}; class DiagonalCurveDescr { diff --git a/rtgui/myflatcurve.h b/rtgui/myflatcurve.h index c4cbfa291..88d651a05 100644 --- a/rtgui/myflatcurve.h +++ b/rtgui/myflatcurve.h @@ -25,16 +25,7 @@ #include "cursormanager.h" #include "curvelistener.h" #include "mycurve.h" - -// For compatibility and simplicity reason, order shouldn't change, and must be identical to the order specified in the curveType widget -enum FlatCurveType { - FCT_Empty = -1, // Also used for identity curves - FCT_Linear, // 0 - FCT_MinMaxCPoints, // 1 - //FCT_Parametric, // 2 - // Insert new curve type above this line - FCT_Unchanged // Must remain the last of the enum -}; +#include "../rtengine/flatcurvetypes.h" enum MouseOverAreas { FCT_Area_None = 1 << 0, // over a zone that don't have any diff --git a/rtgui/options.cc b/rtgui/options.cc index 164637eb2..f5b6b5b60 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -25,10 +25,12 @@ #include "multilangmgr.h" #include "addsetids.h" #include "guiutils.h" +#include "pathutils.h" #include "version.h" #include "../rtengine/procparams.h" #include "../rtengine/rtengine.h" +#include "../rtengine/utils.h" #ifdef _OPENMP #include diff --git a/rtgui/options.h b/rtgui/options.h index 33d6b6f90..c0ed2138b 100644 --- a/rtgui/options.h +++ b/rtgui/options.h @@ -103,11 +103,13 @@ enum PPLoadLocation {PLL_Cache = 0, PLL_Input = 1}; enum CPBKeyType {CPBKT_TID = 0, CPBKT_NAME = 1, CPBKT_TID_NAME = 2}; enum prevdemo_t {PD_Sidecar = 1, PD_Fast = 0}; -namespace Glib { +namespace Glib +{ class KeyFile; } + class Options { public: diff --git a/rtgui/profilepanel.cc b/rtgui/profilepanel.cc index fc418e5b7..723bbfd61 100644 --- a/rtgui/profilepanel.cc +++ b/rtgui/profilepanel.cc @@ -22,6 +22,7 @@ #include "multilangmgr.h" #include "options.h" #include "profilestorecombobox.h" +#include "pathutils.h" #include "rtimage.h" #include "../rtengine/procparams.h" diff --git a/rtgui/saveasdlg.cc b/rtgui/saveasdlg.cc index 5516bdf7c..ebf2f5b4a 100644 --- a/rtgui/saveasdlg.cc +++ b/rtgui/saveasdlg.cc @@ -22,6 +22,7 @@ #include "guiutils.h" #include "multilangmgr.h" +#include "pathutils.h" #include "rtimage.h" #include "../rtengine/utils.h" diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc index 09ffd11f7..7464244f7 100644 --- a/rtgui/thumbnail.cc +++ b/rtgui/thumbnail.cc @@ -32,6 +32,7 @@ #include "guiutils.h" #include "batchqueue.h" #include "extprog.h" +#include "pathutils.h" #include "profilestorecombobox.h" #include "procparamchangers.h" diff --git a/rtgui/tonecurve.cc b/rtgui/tonecurve.cc index 1f660f72a..68f3ee4de 100644 --- a/rtgui/tonecurve.cc +++ b/rtgui/tonecurve.cc @@ -28,6 +28,7 @@ #include "options.h" #include "../rtengine/procparams.h" +#include "../rtengine/utils.h" #include "editcallbacks.h" using namespace rtengine; diff --git a/rtgui/whitebalance.h b/rtgui/whitebalance.h index 5c0500b92..528c81d17 100644 --- a/rtgui/whitebalance.h +++ b/rtgui/whitebalance.h @@ -26,6 +26,7 @@ #include "wbprovider.h" #include "../rtengine/procparams.h" +#include "../rtengine/utils.h" class SpotWBListener { From 785273e7bfa2a079125946d646a4a07fa6177e48 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Fri, 1 Nov 2019 01:03:30 +0100 Subject: [PATCH 115/208] Further reduction of include dependencies --- rtengine/curves.cc | 2 +- rtengine/curves.h | 2 +- rtengine/dynamicprofile.cc | 1 + rtengine/dynamicprofile.h | 6 +++++- rtengine/profilestore.h | 3 ++- rtgui/batchqueueentry.h | 7 ++++++- rtgui/bqentryupdater.h | 10 +++++++++- rtgui/clipboard.h | 2 +- rtgui/main-cli.cc | 1 + rtgui/paramsedited.h | 14 +++++++++++++- rtgui/partialpastedlg.h | 12 +++++++++++- rtgui/pparamschangelistener.h | 15 ++++++++++++++- rtgui/profilechangelistener.h | 3 ++- rtgui/profilepanel.cc | 1 + rtgui/profilepanel.h | 16 +++++++++++++++- rtgui/profilestorecombobox.h | 1 - rtgui/thumbimageupdater.h | 13 ++++++++++++- rtgui/toolpanel.h | 13 +++++++++++++ rtgui/whitebalance.cc | 2 +- 19 files changed, 109 insertions(+), 15 deletions(-) diff --git a/rtengine/curves.cc b/rtengine/curves.cc index a7e3337c8..eb6cc57c3 100644 --- a/rtengine/curves.cc +++ b/rtengine/curves.cc @@ -514,7 +514,7 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou double shcompr, double br, double contr, const std::vector& curvePoints, const std::vector& curvePoints2, - LUTu & histogram, + const LUTu & histogram, LUTf & hlCurve, LUTf & shCurve, LUTf & outCurve, LUTu & outBeforeCCurveHistogram, ToneCurve & customToneCurve1, diff --git a/rtengine/curves.h b/rtengine/curves.h index 4d38e9cce..9c5a84eac 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -352,7 +352,7 @@ public: public: static void complexCurve (double ecomp, double black, double hlcompr, double hlcomprthresh, double shcompr, double br, double contr, const std::vector& curvePoints, const std::vector& curvePoints2, - LUTu & histogram, LUTf & hlCurve, LUTf & shCurve, LUTf & outCurve, LUTu & outBeforeCCurveHistogram, ToneCurve & outToneCurve, ToneCurve & outToneCurve2, + const LUTu & histogram, LUTf & hlCurve, LUTf & shCurve, LUTf & outCurve, LUTu & outBeforeCCurveHistogram, ToneCurve & outToneCurve, ToneCurve & outToneCurve2, int skip = 1); static void curveBW (const std::vector& curvePointsbw, const std::vector& curvePointsbw2, const LUTu & histogrambw, LUTu & outBeforeCCurveHistogrambw, diff --git a/rtengine/dynamicprofile.cc b/rtengine/dynamicprofile.cc index 0e3d75b43..617ec2747 100644 --- a/rtengine/dynamicprofile.cc +++ b/rtengine/dynamicprofile.cc @@ -24,6 +24,7 @@ #include #include +#include "rtengine.h" #include "../rtgui/options.h" using namespace rtengine; diff --git a/rtengine/dynamicprofile.h b/rtengine/dynamicprofile.h index 9b893fae2..d91b91aee 100644 --- a/rtengine/dynamicprofile.h +++ b/rtengine/dynamicprofile.h @@ -20,7 +20,11 @@ #include #include -#include "../rtengine/rtengine.h" + +namespace rtengine +{ + class FramesMetaData; +} class DynamicProfileRule { diff --git a/rtengine/profilestore.h b/rtengine/profilestore.h index 08afc88f3..ee913947f 100644 --- a/rtengine/profilestore.h +++ b/rtengine/profilestore.h @@ -25,7 +25,8 @@ #include "dynamicprofile.h" #include "noncopyable.h" -#include "rtengine.h" +#include "procparams.h" +#include "../rtgui/threadutils.h" // forward decl namespace rtengine diff --git a/rtgui/batchqueueentry.h b/rtgui/batchqueueentry.h index d56c0e340..bc93949e0 100644 --- a/rtgui/batchqueueentry.h +++ b/rtgui/batchqueueentry.h @@ -27,7 +27,12 @@ #include "thumbnail.h" #include "../rtengine/noncopyable.h" -#include "../rtengine/rtengine.h" +#include "../rtengine/procparams.h" + +namespace rtengine +{ + class ProcessingJob; +} class BatchQueueEntry; struct BatchQueueEntryIdleHelper { diff --git a/rtgui/bqentryupdater.h b/rtgui/bqentryupdater.h index 6dbb4bedf..1e71c0fc0 100644 --- a/rtgui/bqentryupdater.h +++ b/rtgui/bqentryupdater.h @@ -23,8 +23,16 @@ #include "threadutils.h" #include "thumbnail.h" -#include "../rtengine/rtengine.h" +namespace rtengine +{ +namespace procparams +{ +class ProcParams; + +} + +} class BQEntryUpdateListener { diff --git a/rtgui/clipboard.h b/rtgui/clipboard.h index 7d25dd0d5..5e0c4b67d 100644 --- a/rtgui/clipboard.h +++ b/rtgui/clipboard.h @@ -25,7 +25,6 @@ #include "../rtengine/diagonalcurvetypes.h" #include "../rtengine/flatcurvetypes.h" -#include "../rtengine/rtengine.h" namespace rtengine { @@ -34,6 +33,7 @@ namespace procparams { class PartialProfile; +class IPTCPairs; } diff --git a/rtgui/main-cli.cc b/rtgui/main-cli.cc index 8310867df..c60cba070 100644 --- a/rtgui/main-cli.cc +++ b/rtgui/main-cli.cc @@ -33,6 +33,7 @@ #include #include "../rtengine/procparams.h" #include "../rtengine/profilestore.h" +#include "../rtengine/rtengine.h" #include "options.h" #include "soundman.h" #include "rtimage.h" diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index e435e2291..ec83e82cd 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -20,7 +20,19 @@ #include -#include "../rtengine/rtengine.h" +namespace rtengine +{ + +namespace procparams +{ + +class ProcParams; + +struct PartialProfile; + +} + +} struct GeneralParamsEdited { bool rank; diff --git a/rtgui/partialpastedlg.h b/rtgui/partialpastedlg.h index 6c4228061..da6c9251a 100644 --- a/rtgui/partialpastedlg.h +++ b/rtgui/partialpastedlg.h @@ -20,7 +20,17 @@ #include -#include "../rtengine/rtengine.h" +namespace rtengine +{ +namespace procparams +{ + +class ProcParams; + + +} + +} struct ParamsEdited; diff --git a/rtgui/pparamschangelistener.h b/rtgui/pparamschangelistener.h index de590dd9f..5d457e882 100644 --- a/rtgui/pparamschangelistener.h +++ b/rtgui/pparamschangelistener.h @@ -22,7 +22,20 @@ #include "paramsedited.h" -#include "../rtengine/rtengine.h" +namespace rtengine +{ + +class ProcEvent; + +namespace procparams +{ + +class ProcParams; + + +} + +} class PParamsChangeListener { diff --git a/rtgui/profilechangelistener.h b/rtgui/profilechangelistener.h index c2e3f2654..58c565393 100644 --- a/rtgui/profilechangelistener.h +++ b/rtgui/profilechangelistener.h @@ -20,14 +20,15 @@ #include -#include "../rtengine/rtengine.h" namespace rtengine { +class ProcEvent; namespace procparams { +class ProcParams; class PartialProfile; } diff --git a/rtgui/profilepanel.cc b/rtgui/profilepanel.cc index 723bbfd61..53e1cd583 100644 --- a/rtgui/profilepanel.cc +++ b/rtgui/profilepanel.cc @@ -26,6 +26,7 @@ #include "rtimage.h" #include "../rtengine/procparams.h" +#include "../rtengine/procevents.h" using namespace rtengine; using namespace rtengine::procparams; diff --git a/rtgui/profilepanel.h b/rtgui/profilepanel.h index 378b2a984..1e1a249bb 100644 --- a/rtgui/profilepanel.h +++ b/rtgui/profilepanel.h @@ -29,8 +29,22 @@ #include "profilestorecombobox.h" #include "../rtengine/noncopyable.h" -#include "../rtengine/rtengine.h" +namespace rtengine +{ + +class ProcEvent; + +namespace procparams +{ + +class ProcParams; + +struct PartialProfile; + +} + +} class RTImage; class ProfilePanel : diff --git a/rtgui/profilestorecombobox.h b/rtgui/profilestorecombobox.h index 447d2e157..6a74f8f71 100644 --- a/rtgui/profilestorecombobox.h +++ b/rtgui/profilestorecombobox.h @@ -28,7 +28,6 @@ #include "threadutils.h" #include "../rtengine/profilestore.h" -#include "../rtengine/rtengine.h" /** * @brief subclass of Gtk::Label with extra fields for Combobox and Menu, to link with a ProfileStoreEntry diff --git a/rtgui/thumbimageupdater.h b/rtgui/thumbimageupdater.h index 6c4171a87..cdf65bd62 100644 --- a/rtgui/thumbimageupdater.h +++ b/rtgui/thumbimageupdater.h @@ -22,9 +22,20 @@ #include "thumbbrowserentrybase.h" -#include "../rtengine/rtengine.h" #include "../rtengine/noncopyable.h" +namespace rtengine +{ + class IImage8; + +namespace procparams +{ + + struct CropParams; + +} + +} class ThumbImageUpdateListener { public: diff --git a/rtgui/toolpanel.h b/rtgui/toolpanel.h index aeb0f60a6..ee4f00e52 100644 --- a/rtgui/toolpanel.h +++ b/rtgui/toolpanel.h @@ -30,6 +30,19 @@ #include "../rtengine/noncopyable.h" #include "../rtengine/rtengine.h" +class ParamsEdited; + +namespace rtengine +{ + class ProcEvent; + +namespace procparams +{ + +class ProcParams; +} +} + class FoldableToolPanel; class ToolPanel; diff --git a/rtgui/whitebalance.cc b/rtgui/whitebalance.cc index 109fb7502..2ab09c10a 100644 --- a/rtgui/whitebalance.cc +++ b/rtgui/whitebalance.cc @@ -55,7 +55,7 @@ void WhiteBalance::init () void WhiteBalance::cleanup () { - for (unsigned int i = 0; i < toUnderlying(WBEntry::Type::CUSTOM) + 1; i++) { + for (int i = 0; i < toUnderlying(WBEntry::Type::CUSTOM) + 1; i++) { wbPixbufs[i].reset(); } } From 962f81f6bcf6dd96b9362078bf605b5522cb5884 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Fri, 1 Nov 2019 12:51:08 +0100 Subject: [PATCH 116/208] Further reduction of include dependencies --- rtgui/batchqueue.cc | 1 + rtgui/bqentryupdater.cc | 20 ++++++++++++-- rtgui/bqentryupdater.h | 4 +-- rtgui/guiutils.cc | 10 ------- rtgui/guiutils.h | 1 - rtgui/main.cc | 1 + rtgui/previewloader.cc | 2 ++ rtgui/previewloader.h | 4 +-- rtgui/previewwindow.cc | 2 +- rtgui/rtwindow.cc | 1 + rtgui/thumbnail.cc | 47 ++++++++++++++++++++++++++++++++ rtgui/thumbnail.h | 59 +++++++++++++---------------------------- 12 files changed, 93 insertions(+), 59 deletions(-) diff --git a/rtgui/batchqueue.cc b/rtgui/batchqueue.cc index 9fcaa28d1..acb45c266 100644 --- a/rtgui/batchqueue.cc +++ b/rtgui/batchqueue.cc @@ -28,6 +28,7 @@ #include #include +#include "cachemanager.h" #include "thumbnail.h" #include "batchqueue.h" #include "multilangmgr.h" diff --git a/rtgui/bqentryupdater.cc b/rtgui/bqentryupdater.cc index 21a0f5ad0..8f5687b81 100644 --- a/rtgui/bqentryupdater.cc +++ b/rtgui/bqentryupdater.cc @@ -17,8 +17,24 @@ * along with RawTherapee. If not, see . */ #include "bqentryupdater.h" -#include + #include "guiutils.h" +#include "../rtengine/utils.h" + +namespace +{ + +void thumbInterp(const unsigned char* src, int sw, int sh, unsigned char* dst, int dw, int dh) +{ + + if (options.thumbInterp == 0) { + rtengine::nearestInterp (src, sw, sh, dst, dw, dh); + } else if (options.thumbInterp == 1) { + rtengine::bilinearInterp (src, sw, sh, dst, dw, dh); + } +} + +} BatchQueueEntryUpdater batchQueueEntryUpdater; @@ -27,7 +43,7 @@ BatchQueueEntryUpdater::BatchQueueEntryUpdater () { } -void BatchQueueEntryUpdater::process (guint8* oimg, int ow, int oh, int newh, BQEntryUpdateListener* listener, rtengine::ProcParams* pparams, Thumbnail* thumbnail) +void BatchQueueEntryUpdater::process (guint8* oimg, int ow, int oh, int newh, BQEntryUpdateListener* listener, rtengine::procparams::ProcParams* pparams, Thumbnail* thumbnail) { if (!oimg && (!pparams || !thumbnail)) { //printf("WARNING! !oimg && (!pparams || !thumbnail)\n"); diff --git a/rtgui/bqentryupdater.h b/rtgui/bqentryupdater.h index 1e71c0fc0..4cbbf6e59 100644 --- a/rtgui/bqentryupdater.h +++ b/rtgui/bqentryupdater.h @@ -48,7 +48,7 @@ class BatchQueueEntryUpdater guint8* oimg; int ow, oh, newh; BQEntryUpdateListener* listener; - rtengine::ProcParams* pparams; + rtengine::procparams::ProcParams* pparams; Thumbnail* thumbnail; }; @@ -62,7 +62,7 @@ protected: public: BatchQueueEntryUpdater (); - void process (guint8* oimg, int ow, int oh, int newh, BQEntryUpdateListener* listener, rtengine::ProcParams* pparams = nullptr, Thumbnail* thumbnail = nullptr); + void process (guint8* oimg, int ow, int oh, int newh, BQEntryUpdateListener* listener, rtengine::procparams::ProcParams* pparams = nullptr, Thumbnail* thumbnail = nullptr); void removeJobs (BQEntryUpdateListener* listener); void terminate (); diff --git a/rtgui/guiutils.cc b/rtgui/guiutils.cc index 189cf6178..d6ede26da 100644 --- a/rtgui/guiutils.cc +++ b/rtgui/guiutils.cc @@ -217,16 +217,6 @@ bool removeIfThere (Gtk::Container* cont, Gtk::Widget* w, bool increference) } } -void thumbInterp (const unsigned char* src, int sw, int sh, unsigned char* dst, int dw, int dh) -{ - - if (options.thumbInterp == 0) { - rtengine::nearestInterp (src, sw, sh, dst, dw, dh); - } else if (options.thumbInterp == 1) { - rtengine::bilinearInterp (src, sw, sh, dst, dw, dh); - } -} - bool confirmOverwrite (Gtk::Window& parent, const std::string& filename) { bool safe = true; diff --git a/rtgui/guiutils.h b/rtgui/guiutils.h index 8764f4c6a..97c72513b 100644 --- a/rtgui/guiutils.h +++ b/rtgui/guiutils.h @@ -48,7 +48,6 @@ class RTImage; Glib::ustring escapeHtmlChars(const Glib::ustring &src); bool removeIfThere (Gtk::Container* cont, Gtk::Widget* w, bool increference = true); -void thumbInterp (const unsigned char* src, int sw, int sh, unsigned char* dst, int dw, int dh); bool confirmOverwrite (Gtk::Window& parent, const std::string& filename); void writeFailed (Gtk::Window& parent, const std::string& filename); void drawCrop (Cairo::RefPtr cr, int imx, int imy, int imw, int imh, int startx, int starty, double scale, const rtengine::procparams::CropParams& cparams, bool drawGuide = true, bool useBgColor = true, bool fullImageVisible = true); diff --git a/rtgui/main.cc b/rtgui/main.cc index 58fdd12dc..1bb840e1e 100644 --- a/rtgui/main.cc +++ b/rtgui/main.cc @@ -33,6 +33,7 @@ #include #include #include +#include "cachemanager.h" #include "options.h" #include "soundman.h" #include "rtimage.h" diff --git a/rtgui/previewloader.cc b/rtgui/previewloader.cc index 67de50113..a808e1f71 100644 --- a/rtgui/previewloader.cc +++ b/rtgui/previewloader.cc @@ -18,6 +18,8 @@ */ #include +#include "cachemanager.h" +#include "filebrowserentry.h" #include "previewloader.h" #include "guiutils.h" #include "threadutils.h" diff --git a/rtgui/previewloader.h b/rtgui/previewloader.h index 3712dc3ff..9a74ee2eb 100644 --- a/rtgui/previewloader.h +++ b/rtgui/previewloader.h @@ -22,10 +22,10 @@ #include -#include "filebrowserentry.h" - #include "../rtengine/noncopyable.h" +class FileBrowserEntry; + class PreviewLoaderListener { public: diff --git a/rtgui/previewwindow.cc b/rtgui/previewwindow.cc index 54d785313..c813f04a2 100644 --- a/rtgui/previewwindow.cc +++ b/rtgui/previewwindow.cc @@ -88,7 +88,7 @@ void PreviewWindow::updatePreviewImage () cc->fill(); if (previewHandler->getCropParams().enabled) { - rtengine::CropParams cparams = previewHandler->getCropParams(); + rtengine::procparams::CropParams cparams = previewHandler->getCropParams(); switch (options.cropGuides) { case Options::CROP_GUIDE_NONE: cparams.guide = "None"; diff --git a/rtgui/rtwindow.cc b/rtgui/rtwindow.cc index 3654e8af6..45d07c4af 100644 --- a/rtgui/rtwindow.cc +++ b/rtgui/rtwindow.cc @@ -19,6 +19,7 @@ #include #include "rtwindow.h" +#include "cachemanager.h" #include "preferences.h" #include "iccprofilecreator.h" #include "cursormanager.h" diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc index 7464244f7..bb911534a 100644 --- a/rtgui/thumbnail.cc +++ b/rtgui/thumbnail.cc @@ -15,6 +15,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ +#include "cachemanager.h" #include "multilangmgr.h" #include "thumbnail.h" #include @@ -25,6 +26,7 @@ #include "../rtengine/colortemp.h" #include "../rtengine/imagedata.h" #include "../rtengine/procparams.h" +#include "../rtengine/rtthumbnail.h" #include #include "../rtengine/dynamicprofile.h" @@ -1151,3 +1153,48 @@ bool Thumbnail::imageLoad(bool loading) return false; } + +void Thumbnail::getCamWB(double& temp, double& green) const +{ + if (tpp) { + tpp->getCamWB (temp, green); + } else { + temp = green = -1.0; + } +} + +void Thumbnail::getSpotWB(int x, int y, int rect, double& temp, double& green) +{ + if (tpp) { + tpp->getSpotWB (getProcParams(), x, y, rect, temp, green); + } else { + temp = green = -1.0; + } +} + +void Thumbnail::applyAutoExp (rtengine::procparams::ProcParams& pparams) +{ + if (tpp) { + tpp->applyAutoExp (pparams); + } +} + +const CacheImageData* Thumbnail::getCacheImageData() +{ + return &cfs; +} + +std::string Thumbnail::getMD5() const +{ + return cfs.md5; +} + +bool Thumbnail::isQuick() const +{ + return cfs.thumbImgType == CacheImageData::QUICK_THUMBNAIL; +} + +bool Thumbnail::isPParamsValid() const +{ + return pparamsValid; +} diff --git a/rtgui/thumbnail.h b/rtgui/thumbnail.h index 1a0f68409..aee5ee0a6 100644 --- a/rtgui/thumbnail.h +++ b/rtgui/thumbnail.h @@ -24,13 +24,21 @@ #include #include "cacheimagedata.h" -#include "cachemanager.h" #include "threadutils.h" #include "thumbnaillistener.h" -#include "../rtengine/rtengine.h" -#include "../rtengine/rtthumbnail.h" +namespace rtengine +{ +class Thumbnail; +namespace procparams +{ + +class ProcParams; + +} + +} class CacheManager; struct ParamsEdited; @@ -98,14 +106,8 @@ public: void notifylisterners_procParamsChanged(int whoChangedIt); - bool isQuick() const - { - return cfs.thumbImgType == CacheImageData::QUICK_THUMBNAIL; - } - bool isPParamsValid() const - { - return pparamsValid; - } + bool isQuick() const; + bool isPParamsValid() const; bool isRecentlySaved () const; void imageDeveloped (); void imageEnqueued (); @@ -123,29 +125,10 @@ public: const Glib::ustring& getExifString () const; const Glib::ustring& getDateTimeString () const; - void getCamWB (double& temp, double& green) const - { - if (tpp) { - tpp->getCamWB (temp, green); - } else { - temp = green = -1.0; - } - } + void getCamWB (double& temp, double& green) const; void getAutoWB (double& temp, double& green, double equal, double tempBias); - void getSpotWB (int x, int y, int rect, double& temp, double& green) - { - if (tpp) { - tpp->getSpotWB (getProcParams(), x, y, rect, temp, green); - } else { - temp = green = -1.0; - } - } - void applyAutoExp (rtengine::procparams::ProcParams& pparams) - { - if (tpp) { - tpp->applyAutoExp (pparams); - } - } + void getSpotWB (int x, int y, int rect, double& temp, double& green); + void applyAutoExp (rtengine::procparams::ProcParams& pparams); ThFileType getType (); Glib::ustring getFileName () const @@ -156,14 +139,8 @@ public: bool isSupported (); - const CacheImageData* getCacheImageData() - { - return &cfs; - } - std::string getMD5 () const - { - return cfs.md5; - } + const CacheImageData* getCacheImageData(); + std::string getMD5 () const; int getRank () const; void setRank (int rank); From e682b364b51febfbe7e53f67658d65987b62acdd Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Fri, 1 Nov 2019 14:51:33 +0100 Subject: [PATCH 117/208] Further reduction of include dependencies --- rtengine/bilateral2.h | 1 - rtengine/color.cc | 5 ++++- rtengine/imagefloat.cc | 1 - rtengine/improccoordinator.cc | 1 - rtengine/improcfun.cc | 5 ++++- rtengine/iptransform.cc | 1 - rtengine/ipvibrance.cc | 1 - rtengine/ipwavelet.cc | 1 - rtengine/profilestore.h | 3 ++- rtgui/batchqueueentry.h | 11 +++++++++-- rtgui/clipboard.cc | 1 + rtgui/clipboard.h | 6 +++--- rtgui/cropwindow.cc | 4 +++- rtgui/filebrowser.cc | 1 + rtgui/filebrowser.h | 2 +- rtgui/pparamschangelistener.h | 2 +- rtgui/profilepanel.cc | 1 + rtgui/profilepanel.h | 4 +++- rtgui/profilestorecombobox.h | 4 +--- rtgui/thumbbrowserbase.cc | 1 - rtgui/thumbbrowserentrybase.cc | 2 -- rtgui/thumbnail.cc | 8 ++++++-- rtgui/toolpanel.h | 2 -- 23 files changed, 40 insertions(+), 28 deletions(-) diff --git a/rtengine/bilateral2.h b/rtengine/bilateral2.h index a431bcecd..ecdcc7fe5 100644 --- a/rtengine/bilateral2.h +++ b/rtengine/bilateral2.h @@ -25,7 +25,6 @@ #include "array2D.h" #include "LUT.h" -#include "mytime.h" #include "rt_math.h" #ifdef _OPENMP diff --git a/rtengine/color.cc b/rtengine/color.cc index 20b2c7310..8437a36b1 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -20,11 +20,14 @@ #include "rtengine.h" #include "color.h" #include "iccmatrices.h" -#include "mytime.h" #include "sleef.c" #include "opthelper.h" #include "iccstore.h" +#ifdef _DEBUG +#include "mytime.h" +#endif + using namespace std; namespace rtengine diff --git a/rtengine/imagefloat.cc b/rtengine/imagefloat.cc index 3e80b617b..1da91a4b4 100644 --- a/rtengine/imagefloat.cc +++ b/rtengine/imagefloat.cc @@ -25,7 +25,6 @@ #include "labimage.h" #include #include "rtengine.h" -#include "mytime.h" #include "iccstore.h" #include "alignedbuffer.h" #include "rt_math.h" diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 729682b0f..d5242f4df 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -33,7 +33,6 @@ #include "imagefloat.h" #include "improcfun.h" #include "labimage.h" -#include "mytime.h" #include "procparams.h" #include "refreshmap.h" diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 886e49567..b1bff49a0 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -30,7 +30,6 @@ #include "improcfun.h" #include "curves.h" #include "dcp.h" -#include "mytime.h" #include "iccstore.h" #include "imagesource.h" #include "rtthumbnail.h" @@ -48,6 +47,10 @@ #include "../rtgui/ppversion.h" #include "../rtgui/editcallbacks.h" +#ifdef _DEBUG +#include "mytime.h" +#endif + #undef CLIPD #define CLIPD(a) ((a)>0.0f?((a)<1.0f?(a):1.0f):0.0f) diff --git a/rtengine/iptransform.cc b/rtengine/iptransform.cc index b6338b8d3..640fab2a6 100644 --- a/rtengine/iptransform.cc +++ b/rtengine/iptransform.cc @@ -25,7 +25,6 @@ #include "imagefloat.h" #include "improcfun.h" -#include "mytime.h" #include "procparams.h" #include "rt_math.h" #include "rtengine.h" diff --git a/rtengine/ipvibrance.cc b/rtengine/ipvibrance.cc index 1c5c6c4d5..b46cfb413 100644 --- a/rtengine/ipvibrance.cc +++ b/rtengine/ipvibrance.cc @@ -24,7 +24,6 @@ #include "improcfun.h" #include "iccstore.h" #include "labimage.h" -#include "mytime.h" #include "curves.h" #include "color.h" #include "procparams.h" diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index d550664b9..78a4dd509 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -36,7 +36,6 @@ #include "labimage.h" #include "LUT.h" #include "median.h" -#include "mytime.h" #include "opthelper.h" #include "procparams.h" #include "rt_math.h" diff --git a/rtengine/profilestore.h b/rtengine/profilestore.h index ee913947f..460facb72 100644 --- a/rtengine/profilestore.h +++ b/rtengine/profilestore.h @@ -25,7 +25,6 @@ #include "dynamicprofile.h" #include "noncopyable.h" -#include "procparams.h" #include "../rtgui/threadutils.h" // forward decl @@ -35,6 +34,8 @@ namespace rtengine namespace procparams { +class ProcParams; + class AutoPartialProfile; class PartialProfile; diff --git a/rtgui/batchqueueentry.h b/rtgui/batchqueueentry.h index bc93949e0..3161bded4 100644 --- a/rtgui/batchqueueentry.h +++ b/rtgui/batchqueueentry.h @@ -27,11 +27,18 @@ #include "thumbnail.h" #include "../rtengine/noncopyable.h" -#include "../rtengine/procparams.h" namespace rtengine { - class ProcessingJob; +class ProcessingJob; + +namespace procparams +{ + +class ProcParams; + +} + } class BatchQueueEntry; diff --git a/rtgui/clipboard.cc b/rtgui/clipboard.cc index 4cd50f574..f64f2ed07 100644 --- a/rtgui/clipboard.cc +++ b/rtgui/clipboard.cc @@ -18,6 +18,7 @@ */ #include "clipboard.h" +#include "paramsedited.h" #include "../rtengine/procparams.h" Clipboard clipboard; diff --git a/rtgui/clipboard.h b/rtgui/clipboard.h index 5e0c4b67d..1faf0b4d3 100644 --- a/rtgui/clipboard.h +++ b/rtgui/clipboard.h @@ -21,17 +21,17 @@ #include #include -#include "paramsedited.h" - #include "../rtengine/diagonalcurvetypes.h" #include "../rtengine/flatcurvetypes.h" +class ParamsEdited; + namespace rtengine { namespace procparams { - +class ProcParams; class PartialProfile; class IPTCPairs; diff --git a/rtgui/cropwindow.cc b/rtgui/cropwindow.cc index ef682cf1f..f0f4cbcba 100644 --- a/rtgui/cropwindow.cc +++ b/rtgui/cropwindow.cc @@ -17,6 +17,9 @@ * along with RawTherapee. If not, see . */ #include +#ifdef WIN32 +#include +#endif #include "cropwindow.h" @@ -32,7 +35,6 @@ #include "editwidgets.h" #include "../rtengine/dcrop.h" -#include "../rtengine/mytime.h" #include "../rtengine/procparams.h" #include "../rtengine/rt_math.h" diff --git a/rtgui/filebrowser.cc b/rtgui/filebrowser.cc index 5817222dd..bfd614ffd 100644 --- a/rtgui/filebrowser.cc +++ b/rtgui/filebrowser.cc @@ -29,6 +29,7 @@ #include "clipboard.h" #include "multilangmgr.h" #include "options.h" +#include "profilestorecombobox.h" #include "procparamchangers.h" #include "rtimage.h" #include "threadutils.h" diff --git a/rtgui/filebrowser.h b/rtgui/filebrowser.h index 74b491957..dc671fe85 100644 --- a/rtgui/filebrowser.h +++ b/rtgui/filebrowser.h @@ -29,7 +29,7 @@ #include "filebrowserentry.h" #include "partialpastedlg.h" #include "pparamschangelistener.h" -#include "profilestorecombobox.h" +#include "../rtengine/profilestore.h" #include "thumbbrowserbase.h" #include "../rtengine/noncopyable.h" diff --git a/rtgui/pparamschangelistener.h b/rtgui/pparamschangelistener.h index 5d457e882..449ebfca5 100644 --- a/rtgui/pparamschangelistener.h +++ b/rtgui/pparamschangelistener.h @@ -20,7 +20,7 @@ #include -#include "paramsedited.h" +class ParamsEdited; namespace rtengine { diff --git a/rtgui/profilepanel.cc b/rtgui/profilepanel.cc index 53e1cd583..4c8e30e44 100644 --- a/rtgui/profilepanel.cc +++ b/rtgui/profilepanel.cc @@ -22,6 +22,7 @@ #include "multilangmgr.h" #include "options.h" #include "profilestorecombobox.h" +#include "paramsedited.h" #include "pathutils.h" #include "rtimage.h" diff --git a/rtgui/profilepanel.h b/rtgui/profilepanel.h index 1e1a249bb..73d3a1949 100644 --- a/rtgui/profilepanel.h +++ b/rtgui/profilepanel.h @@ -26,10 +26,12 @@ #include "partialpastedlg.h" #include "pparamschangelistener.h" #include "profilechangelistener.h" -#include "profilestorecombobox.h" +#include "../rtengine/profilestore.h" #include "../rtengine/noncopyable.h" +class ProfileStoreComboBox; + namespace rtengine { diff --git a/rtgui/profilestorecombobox.h b/rtgui/profilestorecombobox.h index 6a74f8f71..bfd713235 100644 --- a/rtgui/profilestorecombobox.h +++ b/rtgui/profilestorecombobox.h @@ -24,11 +24,9 @@ #include #include "guiutils.h" -#include "paramsedited.h" #include "threadutils.h" -#include "../rtengine/profilestore.h" - +class ProfileStoreEntry; /** * @brief subclass of Gtk::Label with extra fields for Combobox and Menu, to link with a ProfileStoreEntry */ diff --git a/rtgui/thumbbrowserbase.cc b/rtgui/thumbbrowserbase.cc index f5f4076bb..b660afc61 100644 --- a/rtgui/thumbbrowserbase.cc +++ b/rtgui/thumbbrowserbase.cc @@ -22,7 +22,6 @@ #include "options.h" #include "thumbbrowserbase.h" -#include "../rtengine/mytime.h" #include "../rtengine/rt_math.h" using namespace std; diff --git a/rtgui/thumbbrowserentrybase.cc b/rtgui/thumbbrowserentrybase.cc index 9d74fbd79..12059c72e 100644 --- a/rtgui/thumbbrowserentrybase.cc +++ b/rtgui/thumbbrowserentrybase.cc @@ -21,8 +21,6 @@ #include "options.h" #include "thumbbrowserbase.h" -#include "../rtengine/mytime.h" - namespace { diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc index bb911534a..d5038bba5 100644 --- a/rtgui/thumbnail.cc +++ b/rtgui/thumbnail.cc @@ -15,12 +15,15 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ +#ifdef WIN32 +#include +#endif + #include "cachemanager.h" #include "multilangmgr.h" #include "thumbnail.h" #include #include -#include "../rtengine/mytime.h" #include #include #include "../rtengine/colortemp.h" @@ -30,12 +33,13 @@ #include #include "../rtengine/dynamicprofile.h" +#include "../rtengine/profilestore.h" #include "../rtengine/settings.h" #include "guiutils.h" #include "batchqueue.h" #include "extprog.h" #include "pathutils.h" -#include "profilestorecombobox.h" +#include "paramsedited.h" #include "procparamchangers.h" using namespace rtengine::procparams; diff --git a/rtgui/toolpanel.h b/rtgui/toolpanel.h index ee4f00e52..627200835 100644 --- a/rtgui/toolpanel.h +++ b/rtgui/toolpanel.h @@ -30,8 +30,6 @@ #include "../rtengine/noncopyable.h" #include "../rtengine/rtengine.h" -class ParamsEdited; - namespace rtengine { class ProcEvent; From d731e172c2bdb86c0fb6326cc2bf91856bbb8c56 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Fri, 1 Nov 2019 16:15:59 +0100 Subject: [PATCH 118/208] Further reduction of include dependencies --- rtengine/EdgePreservingDecomposition.cc | 1 - rtengine/LUT.h | 1 - rtengine/dcp.cc | 1 + rtengine/imagedata.cc | 1 + rtengine/imagedata.h | 6 +++++- rtengine/imageio.cc | 1 + rtengine/imageio.h | 16 ++++++++++++++-- rtengine/improccoordinator.cc | 1 + rtengine/improcfun.h | 5 +++-- rtengine/lcp.cc | 1 + rtengine/lcp.h | 1 - rtengine/rtengine.h | 9 +++++++-- rtgui/exifpanel.h | 1 + rtgui/resize.cc | 3 +++ rtgui/thumbnail.cc | 1 + rtgui/toolpanelcoord.cc | 1 + rtgui/toolpanelcoord.h | 2 +- 17 files changed, 41 insertions(+), 11 deletions(-) diff --git a/rtengine/EdgePreservingDecomposition.cc b/rtengine/EdgePreservingDecomposition.cc index 85b7ce243..85770826e 100644 --- a/rtengine/EdgePreservingDecomposition.cc +++ b/rtengine/EdgePreservingDecomposition.cc @@ -5,7 +5,6 @@ #include #endif #include "sleef.c" -#include "opthelper.h" #define DIAGONALS 5 #define DIAGONALSP1 6 diff --git a/rtengine/LUT.h b/rtengine/LUT.h index d1ed67c2b..a80e5996d 100644 --- a/rtengine/LUT.h +++ b/rtengine/LUT.h @@ -66,7 +66,6 @@ #include #endif -#include "noncopyable.h" #include "opthelper.h" #include "rt_math.h" diff --git a/rtengine/dcp.cc b/rtengine/dcp.cc index f15ae902f..d3ab1b3f1 100644 --- a/rtengine/dcp.cc +++ b/rtengine/dcp.cc @@ -34,6 +34,7 @@ #include "rawimagesource.h" #include "rt_math.h" #include "utils.h" +#include "../rtexif/rtexif.h" #include "../rtgui/options.h" using namespace rtengine; diff --git a/rtengine/imagedata.cc b/rtengine/imagedata.cc index d952dc8ba..24cfefde9 100644 --- a/rtengine/imagedata.cc +++ b/rtengine/imagedata.cc @@ -32,6 +32,7 @@ #include "procparams.h" #include "rt_math.h" #include "utils.h" +#include "../rtexif/rtexif.h" #pragma GCC diagnostic warning "-Wextra" #define PRINT_HDR_PS_DETECTION 0 diff --git a/rtengine/imagedata.h b/rtengine/imagedata.h index 0b75e263b..ff8ed4b86 100644 --- a/rtengine/imagedata.h +++ b/rtengine/imagedata.h @@ -29,7 +29,11 @@ #include "imageio.h" -#include "../rtexif/rtexif.h" +namespace rtexif +{ + +class TagDirectory; +} namespace rtengine { diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index 5927a23be..fce181c3f 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -30,6 +30,7 @@ #include "utils.h" #include "../rtgui/options.h" #include "../rtgui/version.h" +#include "../rtexif/rtexif.h" #ifdef WIN32 #include diff --git a/rtengine/imageio.h b/rtengine/imageio.h index 251187547..d9afa926f 100644 --- a/rtengine/imageio.h +++ b/rtengine/imageio.h @@ -29,8 +29,6 @@ #include "imageformat.h" #include "rtengine.h" -#include "../rtexif/rtexif.h" - enum { IMIO_SUCCESS, IMIO_CANNOTREADFILE, @@ -42,6 +40,13 @@ enum { IMIO_CANNOTWRITEFILE }; +namespace rtexif +{ + +class TagDirectory; + +} + namespace rtengine { @@ -49,6 +54,13 @@ class ColorTemp; class ProgressListener; class Imagefloat; +namespace procparams +{ + +class ExifPairs; + +} + class ImageIO : virtual public ImageDatas { diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index d5242f4df..bed101e0d 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -33,6 +33,7 @@ #include "imagefloat.h" #include "improcfun.h" #include "labimage.h" +#include "lcp.h" #include "procparams.h" #include "refreshmap.h" diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index a8c3ededb..2c4efbfe9 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -18,17 +18,17 @@ */ #pragma once +#include + #include "color.h" #include "coord2d.h" #include "gamutwarning.h" -#include "lcp.h" #include "LUT.h" #include "pipettebuffer.h" #include "shmap.h" template class multi_array2D; - namespace rtengine { @@ -38,6 +38,7 @@ class DCPProfile; class DCPProfileApplyState; class FlatCurve; class FramesMetaData; +class LensCorrection; class NoiseCurve; class OpacityCurve; class ToneCurve; diff --git a/rtengine/lcp.cc b/rtengine/lcp.cc index b42950eb4..57a87c1f1 100644 --- a/rtengine/lcp.cc +++ b/rtengine/lcp.cc @@ -32,6 +32,7 @@ #include "lcp.h" +#include "opthelper.h" #include "procparams.h" #include "rt_math.h" #include "settings.h" diff --git a/rtengine/lcp.h b/rtengine/lcp.h index 60df289e8..69fd43932 100644 --- a/rtengine/lcp.h +++ b/rtengine/lcp.h @@ -29,7 +29,6 @@ #include #include "cache.h" -#include "opthelper.h" namespace rtengine { diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index d1300f023..287759009 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -21,6 +21,7 @@ #include #include #include +#include #include @@ -34,8 +35,6 @@ #include "rt_math.h" #include "settings.h" -#include "../rtexif/rtexif.h" - #include "../rtgui/threadutils.h" /** @@ -45,6 +44,12 @@ */ class EditDataProvider; +namespace rtexif +{ + +class TagDirectory; + +} namespace rtengine { diff --git a/rtgui/exifpanel.h b/rtgui/exifpanel.h index 2b173c884..0894c21ad 100644 --- a/rtgui/exifpanel.h +++ b/rtgui/exifpanel.h @@ -23,6 +23,7 @@ #include #include "toolpanel.h" +#include "../rtexif/rtexif.h" class ExifPanel : public Gtk::VBox, diff --git a/rtgui/resize.cc b/rtgui/resize.cc index 456b924ef..a65875426 100644 --- a/rtgui/resize.cc +++ b/rtgui/resize.cc @@ -16,6 +16,9 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ + +#include + #include "resize.h" #include "eventmapper.h" diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc index d5038bba5..cd7470263 100644 --- a/rtgui/thumbnail.cc +++ b/rtgui/thumbnail.cc @@ -35,6 +35,7 @@ #include "../rtengine/dynamicprofile.h" #include "../rtengine/profilestore.h" #include "../rtengine/settings.h" +#include "../rtexif/rtexif.h" #include "guiutils.h" #include "batchqueue.h" #include "extprog.h" diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index 1da43f6c0..e774e3d39 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -18,6 +18,7 @@ */ #include "multilangmgr.h" #include "toolpanelcoord.h" +#include "metadatapanel.h" #include "options.h" #include "rtimage.h" #include "../rtengine/imagesource.h" diff --git a/rtgui/toolpanelcoord.h b/rtgui/toolpanelcoord.h index 7b6e23937..4313f6d12 100644 --- a/rtgui/toolpanelcoord.h +++ b/rtgui/toolpanelcoord.h @@ -54,7 +54,6 @@ #include "lensgeomlistener.h" #include "lensprofile.h" #include "localcontrast.h" -#include "metadatapanel.h" #include "pcvignette.h" #include "pdsharpening.h" #include "perspective.h" @@ -89,6 +88,7 @@ #include "../rtengine/rtengine.h" class ImageEditorCoordinator; +class MetaDataPanel; class ToolPanelCoordinator : public ToolPanelListener, From b58d38fc62787d2141597379ded7498c3f86a4d3 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Fri, 1 Nov 2019 17:17:29 +0100 Subject: [PATCH 119/208] Fix clang warnings --- rtgui/clipboard.h | 2 +- rtgui/paramsedited.h | 2 +- rtgui/pparamschangelistener.h | 2 +- rtgui/profilepanel.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/rtgui/clipboard.h b/rtgui/clipboard.h index 1faf0b4d3..0a1c8e2fa 100644 --- a/rtgui/clipboard.h +++ b/rtgui/clipboard.h @@ -24,7 +24,7 @@ #include "../rtengine/diagonalcurvetypes.h" #include "../rtengine/flatcurvetypes.h" -class ParamsEdited; +struct ParamsEdited; namespace rtengine { diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index ec83e82cd..86bffe48d 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -28,7 +28,7 @@ namespace procparams class ProcParams; -struct PartialProfile; +class PartialProfile; } diff --git a/rtgui/pparamschangelistener.h b/rtgui/pparamschangelistener.h index 449ebfca5..56ac5f605 100644 --- a/rtgui/pparamschangelistener.h +++ b/rtgui/pparamschangelistener.h @@ -20,7 +20,7 @@ #include -class ParamsEdited; +struct ParamsEdited; namespace rtengine { diff --git a/rtgui/profilepanel.h b/rtgui/profilepanel.h index 73d3a1949..b3c968682 100644 --- a/rtgui/profilepanel.h +++ b/rtgui/profilepanel.h @@ -42,7 +42,7 @@ namespace procparams class ProcParams; -struct PartialProfile; +class PartialProfile; } From c1f9120ef46c9398c68be3e023cce52edd8a5be1 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Fri, 1 Nov 2019 21:20:52 +0100 Subject: [PATCH 120/208] Further reduction of include dependencies --- rtengine/bilateral2.h | 4 -- rtgui/batchqueueentry.cc | 2 + rtgui/batchqueueentry.h | 4 +- rtgui/batchtoolpanelcoord.cc | 1 + rtgui/batchtoolpanelcoord.h | 2 +- rtgui/bqentryupdater.cc | 2 + rtgui/bqentryupdater.h | 3 +- rtgui/colorappearance.h | 1 - rtgui/editorpanel.cc | 1 + rtgui/editorpanel.h | 2 +- rtgui/filebrowser.cc | 1 + rtgui/filebrowserentry.cc | 1 + rtgui/filebrowserentry.h | 3 +- rtgui/filecatalog.cc | 1 + rtgui/filepanel.cc | 1 + rtgui/histogrampanel.h | 1 - rtgui/imageareatoollistener.h | 2 +- rtgui/previewwindow.cc | 1 + rtgui/rtwindow.cc | 1 + rtgui/thumbbrowserentrybase.h | 4 +- rtgui/thumbimageupdater.cc | 1 + rtgui/thumbnailbrowser.h | 99 ----------------------------------- rtgui/tonecurve.h | 1 - 23 files changed, 26 insertions(+), 113 deletions(-) delete mode 100644 rtgui/thumbnailbrowser.h diff --git a/rtengine/bilateral2.h b/rtengine/bilateral2.h index ecdcc7fe5..53e18fb20 100644 --- a/rtengine/bilateral2.h +++ b/rtengine/bilateral2.h @@ -27,10 +27,6 @@ #include "LUT.h" #include "rt_math.h" -#ifdef _OPENMP -#include -#endif - using namespace rtengine; // This seems ugly, but way faster than any other solutions I tried diff --git a/rtgui/batchqueueentry.cc b/rtgui/batchqueueentry.cc index 424c8e486..90079b2cc 100644 --- a/rtgui/batchqueueentry.cc +++ b/rtgui/batchqueueentry.cc @@ -25,8 +25,10 @@ #include "rtimage.h" #include "multilangmgr.h" #include "thumbbrowserbase.h" +#include "thumbnail.h" #include "../rtengine/procparams.h" +#include "../rtengine/rtengine.h" bool BatchQueueEntry::iconsLoaded(false); Glib::RefPtr BatchQueueEntry::savedAsIcon; diff --git a/rtgui/batchqueueentry.h b/rtgui/batchqueueentry.h index 3161bded4..c4cd48615 100644 --- a/rtgui/batchqueueentry.h +++ b/rtgui/batchqueueentry.h @@ -23,11 +23,13 @@ #include #include "bqentryupdater.h" +#include "options.h" #include "thumbbrowserentrybase.h" -#include "thumbnail.h" #include "../rtengine/noncopyable.h" +class Thumbnail; + namespace rtengine { class ProcessingJob; diff --git a/rtgui/batchtoolpanelcoord.cc b/rtgui/batchtoolpanelcoord.cc index 87320892e..760614d5e 100644 --- a/rtgui/batchtoolpanelcoord.cc +++ b/rtgui/batchtoolpanelcoord.cc @@ -22,6 +22,7 @@ #include "filepanel.h" #include "procparamchangers.h" #include "addsetids.h" +#include "thumbnail.h" using namespace rtengine::procparams; diff --git a/rtgui/batchtoolpanelcoord.h b/rtgui/batchtoolpanelcoord.h index 6c64e15ea..7a5fe77ed 100644 --- a/rtgui/batchtoolpanelcoord.h +++ b/rtgui/batchtoolpanelcoord.h @@ -20,7 +20,6 @@ #include "fileselectionchangelistener.h" #include "paramsedited.h" -#include "thumbnail.h" #include "thumbnaillistener.h" #include "toolpanelcoord.h" @@ -28,6 +27,7 @@ #include "../rtengine/procparams.h" class FilePanel; +class Thumbnail; class BatchToolPanelCoordinator : public ToolPanelCoordinator, public FileSelectionChangeListener, diff --git a/rtgui/bqentryupdater.cc b/rtgui/bqentryupdater.cc index 8f5687b81..61683e158 100644 --- a/rtgui/bqentryupdater.cc +++ b/rtgui/bqentryupdater.cc @@ -19,6 +19,8 @@ #include "bqentryupdater.h" #include "guiutils.h" +#include "options.h" +#include "thumbnail.h" #include "../rtengine/utils.h" namespace diff --git a/rtgui/bqentryupdater.h b/rtgui/bqentryupdater.h index 4cbbf6e59..dfd42aff1 100644 --- a/rtgui/bqentryupdater.h +++ b/rtgui/bqentryupdater.h @@ -21,7 +21,8 @@ #include #include "threadutils.h" -#include "thumbnail.h" + +class Thumbnail; namespace rtengine { diff --git a/rtgui/colorappearance.h b/rtgui/colorappearance.h index 1f8fdef84..3d82ee831 100644 --- a/rtgui/colorappearance.h +++ b/rtgui/colorappearance.h @@ -25,7 +25,6 @@ #include "curveeditor.h" #include "curveeditorgroup.h" #include "guiutils.h" -#include "mycurve.h" #include "toolpanel.h" class ColorAppearance final : diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index 3c5182938..c7d8436ef 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -33,6 +33,7 @@ #include "procparamchangers.h" #include "placesbrowser.h" #include "pathutils.h" +#include "thumbnail.h" using namespace rtengine::procparams; diff --git a/rtgui/editorpanel.h b/rtgui/editorpanel.h index ec59563e0..00f1a942e 100644 --- a/rtgui/editorpanel.h +++ b/rtgui/editorpanel.h @@ -30,7 +30,6 @@ #include "profilepanel.h" #include "progressconnector.h" #include "saveasdlg.h" -#include "thumbnail.h" #include "thumbnaillistener.h" #include "toolpanelcoord.h" @@ -39,6 +38,7 @@ class EditorPanel; class MyProgressBar; +class Thumbnail; struct EditorPanelIdleHelper { EditorPanel* epanel; diff --git a/rtgui/filebrowser.cc b/rtgui/filebrowser.cc index bfd614ffd..3dcb573ca 100644 --- a/rtgui/filebrowser.cc +++ b/rtgui/filebrowser.cc @@ -33,6 +33,7 @@ #include "procparamchangers.h" #include "rtimage.h" #include "threadutils.h" +#include "thumbnail.h" #include "../rtengine/dfmanager.h" #include "../rtengine/ffmanager.h" diff --git a/rtgui/filebrowserentry.cc b/rtgui/filebrowserentry.cc index 44146b990..4d31d625e 100644 --- a/rtgui/filebrowserentry.cc +++ b/rtgui/filebrowserentry.cc @@ -27,6 +27,7 @@ #include "rtimage.h" #include "threadutils.h" #include "thumbbrowserbase.h" +#include "thumbnail.h" #include "../rtengine/procparams.h" diff --git a/rtgui/filebrowserentry.h b/rtgui/filebrowserentry.h index c7eebcd44..1bdbb2ecb 100644 --- a/rtgui/filebrowserentry.h +++ b/rtgui/filebrowserentry.h @@ -29,13 +29,14 @@ #include "imageareatoollistener.h" #include "thumbbrowserentrybase.h" #include "thumbimageupdater.h" -#include "thumbnail.h" #include "thumbnaillistener.h" #include "../rtengine/noncopyable.h" #include "../rtengine/rtengine.h" class FileBrowserEntry; +class Thumbnail; + struct FileBrowserEntryIdleHelper { FileBrowserEntry* fbentry; bool destroyed; diff --git a/rtgui/filecatalog.cc b/rtgui/filecatalog.cc index fb8bd4923..923a15e8d 100644 --- a/rtgui/filecatalog.cc +++ b/rtgui/filecatalog.cc @@ -37,6 +37,7 @@ #include "batchqueue.h" #include "placesbrowser.h" #include "pathutils.h" +#include "thumbnail.h" using namespace std; diff --git a/rtgui/filepanel.cc b/rtgui/filepanel.cc index 3e23cbc5d..0c401a701 100644 --- a/rtgui/filepanel.cc +++ b/rtgui/filepanel.cc @@ -21,6 +21,7 @@ #include "rtwindow.h" #include "inspector.h" #include "placesbrowser.h" +#include "thumbnail.h" FilePanel::FilePanel () : parent(nullptr), error(0) { diff --git a/rtgui/histogrampanel.h b/rtgui/histogrampanel.h index 92d0dc7b4..23b065534 100644 --- a/rtgui/histogrampanel.h +++ b/rtgui/histogrampanel.h @@ -27,7 +27,6 @@ #include "guiutils.h" #include "pointermotionlistener.h" -#include "../rtengine/improccoordinator.h" #include "../rtengine/LUT.h" #include "../rtengine/noncopyable.h" diff --git a/rtgui/imageareatoollistener.h b/rtgui/imageareatoollistener.h index 86fdca6a2..3c753a5e0 100644 --- a/rtgui/imageareatoollistener.h +++ b/rtgui/imageareatoollistener.h @@ -19,9 +19,9 @@ #pragma once #include "cropguilistener.h" -#include "thumbnail.h" #include "toolbar.h" +class Thumbnail; class ImageAreaToolListener { diff --git a/rtgui/previewwindow.cc b/rtgui/previewwindow.cc index c813f04a2..3f787a16b 100644 --- a/rtgui/previewwindow.cc +++ b/rtgui/previewwindow.cc @@ -20,6 +20,7 @@ #include "guiutils.h" #include "imagearea.h" #include "cursormanager.h" +#include "options.h" #include "../rtengine/procparams.h" diff --git a/rtgui/rtwindow.cc b/rtgui/rtwindow.cc index 45d07c4af..2db0ef192 100644 --- a/rtgui/rtwindow.cc +++ b/rtgui/rtwindow.cc @@ -24,6 +24,7 @@ #include "iccprofilecreator.h" #include "cursormanager.h" #include "rtimage.h" +#include "thumbnail.h" #include "whitebalance.h" #include "../rtengine/settings.h" diff --git a/rtgui/thumbbrowserentrybase.h b/rtgui/thumbbrowserentrybase.h index 5f018eefd..dbc6cf73e 100644 --- a/rtgui/thumbbrowserentrybase.h +++ b/rtgui/thumbbrowserentrybase.h @@ -26,8 +26,10 @@ #include "guiutils.h" #include "lwbuttonset.h" #include "threadutils.h" -#include "thumbnail.h" +#include "../rtengine/coord2d.h" + +class Thumbnail; class ThumbBrowserBase; class ThumbBrowserEntryBase { diff --git a/rtgui/thumbimageupdater.cc b/rtgui/thumbimageupdater.cc index 182eba704..bf230fe63 100644 --- a/rtgui/thumbimageupdater.cc +++ b/rtgui/thumbimageupdater.cc @@ -26,6 +26,7 @@ #include "guiutils.h" #include "threadutils.h" +#include "thumbnail.h" #include "../rtengine/procparams.h" diff --git a/rtgui/thumbnailbrowser.h b/rtgui/thumbnailbrowser.h deleted file mode 100644 index ef953c0e9..000000000 --- a/rtgui/thumbnailbrowser.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * This file is part of RawTherapee. - * - * Copyright (c) 2004-2010 Gabor Horvath - * - * RawTherapee is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * RawTherapee is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with RawTherapee. If not, see . - */ -#pragma once - -#include - -#include "filecatalog.h" -#include "thumbnail.h" - -class ThumbBrowserEntry -{ - -public: -// set by arrangeFiles(): - int width; // minimal width - int height; // minimal height - int exp_width; // ararnged width - int startx; // x coord. in the widget - int starty; // y coord. in the widget -// thumbnail preview properties: - int prew; // width of the thumbnail - int preh; // height of the thumbnail - guint8* preview; -// file and directory attributes: - Glib::ustring filename; - Glib::ustring shortname; - Glib::ustring dirname; -// the associated thumbnail instance: - Thumbnail* thumbnail; - - ThumbBrowserEntry (Thumbnail* thm, Glib::ustring fname, Glib::ustring sname, Glib::ustring dname, int h) - : thumbnail(thm), filename(fname), shortname(sname), dirname(dname), preh(h) - { - preview = thumbnail ? (guint8*) thumbnail->getThumbnailImage (prew, preh) : NULL; - } - - bool operator< (FileDescr& other) - { - return shortname > other.shortname; - } -}; - -class ThumbBrowser : public Gtk::DrawingArea -{ - -protected: - int dx, dy, w, h; - - Gdk::RGBA black; - Gdk::RGBA white; - Gdk::RGBA blue; - Gdk::RGBA bluew; - - std::vector fd; - std::vector selected; - - int rowHeight; - int numOfRows; - - ThumbBrowserListener* tbl; - - void arrangeFiles (int rows); - -public: - - ThumbBrowser (); - - void addEntry (ThumbBrowserEntry* entry); - void setThumbBrowserListener (ThumbBrowserListener* l) - { - tbl = l; - } - - virtual void on_realize(); - virtual bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr); - virtual bool on_button_press_event (GdkEventButton* event); - virtual bool on_button_release_event (GdkEventButton* event); - virtual void previewReady (FileDescr* fdn); - - void resized (Gtk::Allocation& req); - void redraw (); - void styleChanged (const Glib::RefPtr& style); -}; diff --git a/rtgui/tonecurve.h b/rtgui/tonecurve.h index b44a7ccab..cba810e15 100644 --- a/rtgui/tonecurve.h +++ b/rtgui/tonecurve.h @@ -24,7 +24,6 @@ #include "curveeditor.h" #include "curveeditorgroup.h" #include "guiutils.h" -#include "mycurve.h" #include "toolpanel.h" class EditDataProvider; From f02f5c4a69e5e74ebdd7f02d7c2aea1da09b2687 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Fri, 1 Nov 2019 22:57:20 +0100 Subject: [PATCH 121/208] Fix two lgtm issues --- rtgui/editorpanel.cc | 46 +++++++++++--------------------------------- rtgui/rtwindow.cc | 7 +++---- 2 files changed, 14 insertions(+), 39 deletions(-) diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index c7d8436ef..9ae613ebd 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -891,41 +891,17 @@ EditorPanel::~EditorPanel () delete vboxright; //delete saveAsDialog; - if (catalogPane) { - delete catalogPane; - } - - if (iTopPanel_1_Show) { - delete iTopPanel_1_Show; - } - - if (iTopPanel_1_Hide) { - delete iTopPanel_1_Hide; - } - - if (iHistoryShow) { - delete iHistoryShow; - } - - if (iHistoryHide) { - delete iHistoryHide; - } - - if (iBeforeLockON) { - delete iBeforeLockON; - } - - if (iBeforeLockOFF) { - delete iBeforeLockOFF; - } - - if (iRightPanel_1_Show) { - delete iRightPanel_1_Show; - } - - if (iRightPanel_1_Hide) { - delete iRightPanel_1_Hide; - } + delete catalogPane; + delete iTopPanel_1_Show; + delete iTopPanel_1_Hide; + delete iHistoryShow; + delete iHistoryHide; + delete iBeforeLockON; + delete iBeforeLockOFF; + delete iRightPanel_1_Show; + delete iRightPanel_1_Hide; + delete iShowHideSidePanels_exit; + delete iShowHideSidePanels; } void EditorPanel::leftPaneButtonReleased (GdkEventButton *event) diff --git a/rtgui/rtwindow.cc b/rtgui/rtwindow.cc index 2db0ef192..9f5357644 100644 --- a/rtgui/rtwindow.cc +++ b/rtgui/rtwindow.cc @@ -458,10 +458,9 @@ RTWindow::~RTWindow() g_object_unref (osxApp); #endif - if (fpanel) { - delete fpanel; - } - + delete fpanel; + delete iFullscreen; + delete iFullscreen_exit; RTImage::cleanup(); } From afeca7f5f9df5d92327e4cedd7116102a655eef1 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sat, 2 Nov 2019 00:18:48 +0100 Subject: [PATCH 122/208] Fix lgtm issues --- rtgui/editorpanel.cc | 12 ++++++------ rtgui/editorpanel.h | 2 +- rtgui/rtwindow.cc | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index 9ae613ebd..3328dcd65 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -1108,7 +1108,7 @@ Glib::ustring EditorPanel::getShortName () } } -Glib::ustring EditorPanel::getFileName () +Glib::ustring EditorPanel::getFileName () const { if (openThm) { return openThm->getFileName (); @@ -2012,9 +2012,9 @@ bool EditorPanel::idle_sendToGimp ( ProgressConnector *p if (img) { // get file name base - Glib::ustring shortname = removeExtension (Glib::path_get_basename (fname)); - Glib::ustring dirname = Glib::get_tmp_dir (); - Glib::ustring fname = Glib::build_filename (dirname, shortname); + const Glib::ustring shortname = removeExtension (Glib::path_get_basename (fname)); + const Glib::ustring dirname = Glib::get_tmp_dir (); + const Glib::ustring lfname = Glib::build_filename (dirname, shortname); SaveFormat sf; sf.format = "tif"; @@ -2023,13 +2023,13 @@ bool EditorPanel::idle_sendToGimp ( ProgressConnector *p sf.tiffUncompressed = true; sf.saveParams = true; - Glib::ustring fileName = Glib::ustring::compose ("%1.%2", fname, sf.format); + Glib::ustring fileName = Glib::ustring::compose ("%1.%2", lfname, sf.format); // TODO: Just list all file with a suitable name instead of brute force... int tries = 1; while (Glib::file_test (fileName, Glib::FILE_TEST_EXISTS) && tries < 1000) { - fileName = Glib::ustring::compose ("%1-%2.%3", fname, tries, sf.format); + fileName = Glib::ustring::compose ("%1-%2.%3", lfname, tries, sf.format); tries++; } diff --git a/rtgui/editorpanel.h b/rtgui/editorpanel.h index 00f1a942e..2f6c01a31 100644 --- a/rtgui/editorpanel.h +++ b/rtgui/editorpanel.h @@ -150,7 +150,7 @@ public: void saveProfile (); Glib::ustring getShortName (); - Glib::ustring getFileName (); + Glib::ustring getFileName () const; bool handleShortcutKey (GdkEventKey* event); bool getIsProcessing() const diff --git a/rtgui/rtwindow.cc b/rtgui/rtwindow.cc index 9f5357644..ed1ae8d6c 100644 --- a/rtgui/rtwindow.cc +++ b/rtgui/rtwindow.cc @@ -653,8 +653,8 @@ void RTWindow::remEditorPanel (EditorPanel* ep) set_title_decorated (""); } else { - EditorPanel* ep = static_cast (mainNB->get_nth_page (mainNB->get_current_page())); - set_title_decorated (ep->getFileName()); + const EditorPanel* lep = static_cast (mainNB->get_nth_page (mainNB->get_current_page())); + set_title_decorated (lep->getFileName()); } // TODO: ask what to do: close & apply, close & apply selection, close & revert, cancel From b3b1008270d92fff3b29f1da7351623f836f5107 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sat, 2 Nov 2019 17:29:26 +0100 Subject: [PATCH 123/208] Further reduction of include dependencies --- CMakeLists.txt | 1 + rtgui/CMakeLists.txt | 1 - rtgui/batchqueue.h | 1 + rtgui/batchqueuebuttonset.cc | 2 + rtgui/batchqueuebuttonset.h | 3 +- rtgui/batchtoolpanelcoord.cc | 4 ++ rtgui/cropwindow.cc | 1 + rtgui/editbuffer.h | 4 -- rtgui/editorpanel.cc | 2 + rtgui/editorpanel.h | 2 +- rtgui/editwidgets.cc | 2 + rtgui/editwidgets.h | 4 +- rtgui/editwindow.cc | 1 + rtgui/filebrowser.h | 1 + rtgui/filecatalog.cc | 1 + rtgui/filepanel.cc | 2 + rtgui/filepanel.h | 2 +- rtgui/filethumbnailbuttonset.cc | 2 + rtgui/filethumbnailbuttonset.h | 2 +- rtgui/iccprofilecreator.cc | 10 +++-- rtgui/iccprofilecreator.h | 5 ++- rtgui/ilabel.cc | 66 --------------------------------- rtgui/ilabel.h | 34 ----------------- rtgui/imagearea.cc | 1 + rtgui/lwbutton.cc | 1 + rtgui/lwbutton.h | 2 - rtgui/lwbuttonset.cc | 2 + rtgui/lwbuttonset.h | 3 +- rtgui/main.cc | 4 ++ rtgui/preferences.cc | 2 + rtgui/preferences.h | 5 ++- rtgui/previewwindow.cc | 1 + rtgui/progressconnector.h | 2 +- rtgui/renamedlg.cc | 1 + rtgui/renamedlg.h | 3 +- rtgui/rtwindow.cc | 10 +++++ rtgui/rtwindow.h | 13 +++---- rtgui/thumbbrowserbase.cc | 1 + 38 files changed, 75 insertions(+), 129 deletions(-) delete mode 100644 rtgui/ilabel.cc delete mode 100644 rtgui/ilabel.h diff --git a/CMakeLists.txt b/CMakeLists.txt index b5626512a..d7368f115 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -89,6 +89,7 @@ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${PROC_FLAGS}") # Stop compilation on typos such as std:swap (missing colon will be detected as unused label): set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=unused-label") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=delete-incomplete") # Special treatment for x87 and x86-32 SSE (see GitHub issue #4324) include(FindX87Math) diff --git a/rtgui/CMakeLists.txt b/rtgui/CMakeLists.txt index edc2b8202..4b21ce421 100644 --- a/rtgui/CMakeLists.txt +++ b/rtgui/CMakeLists.txt @@ -79,7 +79,6 @@ set(NONCLISOURCEFILES hsvequalizer.cc iccprofilecreator.cc icmpanel.cc - ilabel.cc imagearea.cc imageareapanel.cc impulsedenoise.cc diff --git a/rtgui/batchqueue.h b/rtgui/batchqueue.h index a0c04abee..9ae615965 100644 --- a/rtgui/batchqueue.h +++ b/rtgui/batchqueue.h @@ -22,6 +22,7 @@ #include #include "batchqueueentry.h" +#include "lwbutton.h" #include "lwbuttonset.h" #include "threadutils.h" #include "thumbbrowserbase.h" diff --git a/rtgui/batchqueuebuttonset.cc b/rtgui/batchqueuebuttonset.cc index a8be9eedf..969a55079 100644 --- a/rtgui/batchqueuebuttonset.cc +++ b/rtgui/batchqueuebuttonset.cc @@ -18,8 +18,10 @@ */ #include "batchqueuebuttonset.h" +#include "lwbutton.h" #include "multilangmgr.h" #include "rtimage.h" +#include "rtsurface.h" bool BatchQueueButtonSet::iconsLoaded = false; diff --git a/rtgui/batchqueuebuttonset.h b/rtgui/batchqueuebuttonset.h index 17f582168..fb45df518 100644 --- a/rtgui/batchqueuebuttonset.h +++ b/rtgui/batchqueuebuttonset.h @@ -21,9 +21,10 @@ #include #include "lwbuttonset.h" -#include "rtsurface.h" class BatchQueueEntry; +class RTSurface; + class BatchQueueButtonSet : public LWButtonSet { diff --git a/rtgui/batchtoolpanelcoord.cc b/rtgui/batchtoolpanelcoord.cc index 760614d5e..8aed3e96f 100644 --- a/rtgui/batchtoolpanelcoord.cc +++ b/rtgui/batchtoolpanelcoord.cc @@ -16,6 +16,10 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ + +#include "bayerpreprocess.h" +#include "bayerprocess.h" + #include "multilangmgr.h" #include "batchtoolpanelcoord.h" #include "options.h" diff --git a/rtgui/cropwindow.cc b/rtgui/cropwindow.cc index f0f4cbcba..f44e78a56 100644 --- a/rtgui/cropwindow.cc +++ b/rtgui/cropwindow.cc @@ -33,6 +33,7 @@ #include "editcallbacks.h" #include "editbuffer.h" #include "editwidgets.h" +#include "rtsurface.h" #include "../rtengine/dcrop.h" #include "../rtengine/procparams.h" diff --git a/rtgui/editbuffer.h b/rtgui/editbuffer.h index 77afb6449..046ab7364 100644 --- a/rtgui/editbuffer.h +++ b/rtgui/editbuffer.h @@ -22,10 +22,6 @@ #include "../rtengine/coord.h" #include -#ifdef GUIVERSION -#include "rtsurface.h" -#endif - class EditDataProvider; class EditSubscriber; diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index 3328dcd65..108b11ea3 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -23,6 +23,7 @@ #include "../rtengine/imagesource.h" #include "../rtengine/iccstore.h" +#include "batchqueue.h" #include "soundman.h" #include "rtimage.h" #include "rtwindow.h" @@ -34,6 +35,7 @@ #include "placesbrowser.h" #include "pathutils.h" #include "thumbnail.h" +#include "toolpanelcoord.h" using namespace rtengine::procparams; diff --git a/rtgui/editorpanel.h b/rtgui/editorpanel.h index 2f6c01a31..b577b858f 100644 --- a/rtgui/editorpanel.h +++ b/rtgui/editorpanel.h @@ -31,7 +31,6 @@ #include "progressconnector.h" #include "saveasdlg.h" #include "thumbnaillistener.h" -#include "toolpanelcoord.h" #include "../rtengine/noncopyable.h" #include "../rtengine/rtengine.h" @@ -39,6 +38,7 @@ class EditorPanel; class MyProgressBar; class Thumbnail; +class ToolPanelCoordinator; struct EditorPanelIdleHelper { EditorPanel* epanel; diff --git a/rtgui/editwidgets.cc b/rtgui/editwidgets.cc index a7996ee42..f7c748744 100644 --- a/rtgui/editwidgets.cc +++ b/rtgui/editwidgets.cc @@ -18,8 +18,10 @@ */ #include "editwidgets.h" + #include "editbuffer.h" #include "editcallbacks.h" +#include "rtsurface.h" #include "../rtengine/rt_math.h" RGBColor Geometry::getInnerLineColor () diff --git a/rtgui/editwidgets.h b/rtgui/editwidgets.h index 9154db31f..d31451ecb 100644 --- a/rtgui/editwidgets.h +++ b/rtgui/editwidgets.h @@ -20,12 +20,14 @@ #ifdef GUIVERSION -#include "rtsurface.h" +#include + #include "editbuffer.h" #include "editcoordsys.h" #include "../rtengine/coord.h" class ObjectMOBuffer; +class RTSurface; /** @file * diff --git a/rtgui/editwindow.cc b/rtgui/editwindow.cc index 50a1484cf..11c0be4e2 100644 --- a/rtgui/editwindow.cc +++ b/rtgui/editwindow.cc @@ -16,6 +16,7 @@ */ #include "editwindow.h" +#include "../rtengine/procparams.h" #include "options.h" #include "preferences.h" #include "cursormanager.h" diff --git a/rtgui/filebrowser.h b/rtgui/filebrowser.h index dc671fe85..b941ea9df 100644 --- a/rtgui/filebrowser.h +++ b/rtgui/filebrowser.h @@ -27,6 +27,7 @@ #include "exportpanel.h" #include "extprog.h" #include "filebrowserentry.h" +#include "lwbutton.h" #include "partialpastedlg.h" #include "pparamschangelistener.h" #include "../rtengine/profilestore.h" diff --git a/rtgui/filecatalog.cc b/rtgui/filecatalog.cc index 923a15e8d..5e93631e5 100644 --- a/rtgui/filecatalog.cc +++ b/rtgui/filecatalog.cc @@ -25,6 +25,7 @@ #include #include "../rtengine/rt_math.h" +#include "../rtengine/procparams.h" #include "guiutils.h" #include "options.h" diff --git a/rtgui/filepanel.cc b/rtgui/filepanel.cc index 0c401a701..8f45343de 100644 --- a/rtgui/filepanel.cc +++ b/rtgui/filepanel.cc @@ -18,6 +18,8 @@ */ #include "filepanel.h" +#include "batchtoolpanelcoord.h" +#include "editorpanel.h" #include "rtwindow.h" #include "inspector.h" #include "placesbrowser.h" diff --git a/rtgui/filepanel.h b/rtgui/filepanel.h index 9ae91be4d..9db9d99b7 100644 --- a/rtgui/filepanel.h +++ b/rtgui/filepanel.h @@ -20,7 +20,6 @@ #include -#include "batchtoolpanelcoord.h" #include "dirbrowser.h" #include "exportpanel.h" #include "filecatalog.h" @@ -34,6 +33,7 @@ #include "../rtengine/noncopyable.h" +class BatchToolPanelCoordinator; class RTWindow; class FilePanel final : diff --git a/rtgui/filethumbnailbuttonset.cc b/rtgui/filethumbnailbuttonset.cc index ef497a535..bb64675a1 100644 --- a/rtgui/filethumbnailbuttonset.cc +++ b/rtgui/filethumbnailbuttonset.cc @@ -20,6 +20,8 @@ #include "rtimage.h" #include "multilangmgr.h" +#include "lwbutton.h" +#include "rtsurface.h" bool FileThumbnailButtonSet::iconsLoaded = false; diff --git a/rtgui/filethumbnailbuttonset.h b/rtgui/filethumbnailbuttonset.h index f4fbc97ed..66d5b5f67 100644 --- a/rtgui/filethumbnailbuttonset.h +++ b/rtgui/filethumbnailbuttonset.h @@ -24,9 +24,9 @@ #include "filebrowserentry.h" #include "lwbuttonset.h" -#include "rtsurface.h" class FileBrowserEntry; +class RTSurface; class FileThumbnailButtonSet : public LWButtonSet diff --git a/rtgui/iccprofilecreator.cc b/rtgui/iccprofilecreator.cc index d7f9499f6..a8f9be007 100644 --- a/rtgui/iccprofilecreator.cc +++ b/rtgui/iccprofilecreator.cc @@ -17,18 +17,20 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ + +#include +#include + #include #include "iccprofilecreator.h" #include "../rtengine/iccstore.h" #include "multilangmgr.h" #include "cachemanager.h" -#include "addsetids.h" #include "../rtengine/color.h" +#include "options.h" #include "pathutils.h" #include "rtimage.h" -#ifdef _OPENMP -#include -#endif +#include "rtwindow.h" const char* sTRCPreset[] = {"BT709_g2.2_s4.5", "sRGB_g2.4_s12.92", "linear_g1.0", "standard_g2.2", "standard_g1.8", "High_g1.3_s3.35", "Low_g2.6_s6.9", "Lab_g3.0s9.03296"}; //gamma free diff --git a/rtgui/iccprofilecreator.h b/rtgui/iccprofilecreator.h index 950fcc01f..2cd19e14f 100644 --- a/rtgui/iccprofilecreator.h +++ b/rtgui/iccprofilecreator.h @@ -19,10 +19,13 @@ */ #pragma once +#include + #include #include "adjuster.h" #include -#include "rtwindow.h" + +class RTWindow; class ICCProfileCreator : public Gtk::Dialog, public AdjusterListener { diff --git a/rtgui/ilabel.cc b/rtgui/ilabel.cc deleted file mode 100644 index 9dfd50b89..000000000 --- a/rtgui/ilabel.cc +++ /dev/null @@ -1,66 +0,0 @@ -/* - * This file is part of RawTherapee. - * - * Copyright (c) 2004-2010 Gabor Horvath - * - * RawTherapee is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * RawTherapee is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with RawTherapee. If not, see . - */ -#include "ilabel.h" - -ILabel::ILabel (const Glib::ustring &lab) : label(lab) {} - -void ILabel::on_realize() -{ - - Gtk::DrawingArea::on_realize(); - add_events(Gdk::EXPOSURE_MASK); - - Glib::RefPtr fn = create_pango_layout(label); - fn->set_markup (label); - int labw, labh; - fn->get_pixel_size (labw, labh); - set_size_request (2 + labw, 2 + labh); -} - -bool ILabel::on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) -{ - - Glib::RefPtr style = get_style_context (); - - Gtk::StateFlags state = get_state_flags(); - Gdk::RGBA c = style->get_background_color(state); - cr->set_source_rgb (c.get_red(), c.get_green(), c.get_blue()); - cr->rectangle (0, 0, get_width (), get_height()); - cr->fill (); - - Glib::RefPtr fn = create_pango_layout (label); - fn->set_markup (label); - cr->move_to(1., 1.); - fn->add_to_cairo_context(cr); - c = style->get_color (state); - cr->set_source_rgb (c.get_red(), c.get_green(), c.get_blue()); - cr->fill(); - - return true; -} - -void ILabel::on_style_updated () -{ - - Glib::RefPtr fn = create_pango_layout(label); - fn->set_markup (label); - int labw, labh; - fn->get_pixel_size (labw, labh); - set_size_request (2 + labw, 2 + labh); -} diff --git a/rtgui/ilabel.h b/rtgui/ilabel.h deleted file mode 100644 index cb9ca00be..000000000 --- a/rtgui/ilabel.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * This file is part of RawTherapee. - * - * Copyright (c) 2004-2010 Gabor Horvath - * - * RawTherapee is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * RawTherapee is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with RawTherapee. If not, see . - */ -#pragma once - -#include - -class ILabel : - public Gtk::DrawingArea -{ - - Glib::ustring label; - -public: - explicit ILabel (const Glib::ustring &lab); - bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) override; - void on_realize() override; - void on_style_updated () override; -}; diff --git a/rtgui/imagearea.cc b/rtgui/imagearea.cc index b086f8baf..0be6982f9 100644 --- a/rtgui/imagearea.cc +++ b/rtgui/imagearea.cc @@ -25,6 +25,7 @@ #include "../rtengine/refreshmap.h" #include "../rtengine/procparams.h" #include "options.h" +#include "rtscalable.h" ImageArea::ImageArea (ImageAreaPanel* p) : parent(p), fullImageWidth(0), fullImageHeight(0) { diff --git a/rtgui/lwbutton.cc b/rtgui/lwbutton.cc index b5c10c532..c6c75584d 100644 --- a/rtgui/lwbutton.cc +++ b/rtgui/lwbutton.cc @@ -18,6 +18,7 @@ */ #include "lwbutton.h" #include "guiutils.h" +#include "rtsurface.h" LWButton::LWButton (Cairo::RefPtr i, int aCode, void* aData, Alignment ha, Alignment va, Glib::ustring* tooltip) : xpos(0), ypos(0), halign(ha), valign(va), icon(i), bgr(0.0), bgg(0.0), bgb(0.0), fgr(0.0), fgg(0.0), fgb(0.0), state(Normal), listener(nullptr), actionCode(aCode), actionData(aData), toolTip(tooltip) diff --git a/rtgui/lwbutton.h b/rtgui/lwbutton.h index 7a784e693..a98f1fe46 100644 --- a/rtgui/lwbutton.h +++ b/rtgui/lwbutton.h @@ -19,9 +19,7 @@ #pragma once #include - #include "rtsurface.h" - class LWButton; class LWButtonListener diff --git a/rtgui/lwbuttonset.cc b/rtgui/lwbuttonset.cc index a03b3064b..f475cf0b3 100644 --- a/rtgui/lwbuttonset.cc +++ b/rtgui/lwbuttonset.cc @@ -17,6 +17,8 @@ * along with RawTherapee. If not, see . */ #include "lwbuttonset.h" +#include "lwbutton.h" +#include "rtscalable.h" LWButtonSet::LWButtonSet () : aw(0), ah(0), ax(-1), ay(-1) { diff --git a/rtgui/lwbuttonset.h b/rtgui/lwbuttonset.h index 07d17a135..63bc5a01b 100644 --- a/rtgui/lwbuttonset.h +++ b/rtgui/lwbuttonset.h @@ -19,9 +19,10 @@ #pragma once #include -#include "lwbutton.h" #include +class LWButton; +class LWButtonListener; class LWButtonSet { diff --git a/rtgui/main.cc b/rtgui/main.cc index 1bb840e1e..ae34fc8d0 100644 --- a/rtgui/main.cc +++ b/rtgui/main.cc @@ -34,12 +34,16 @@ #include #include #include "cachemanager.h" +#include "editorpanel.h" +#include "filecatalog.h" +#include "filepanel.h" #include "options.h" #include "soundman.h" #include "rtimage.h" #include "version.h" #include "extprog.h" #include "../rtengine/dynamicprofile.h" +#include "../rtengine/procparams.h" #ifndef WIN32 #include diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index 2676e0940..0bce37af2 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -25,8 +25,10 @@ #include "../rtengine/dfmanager.h" #include "../rtengine/ffmanager.h" #include "../rtengine/iccstore.h" +#include "../rtengine/procparams.h" #include #include "rtimage.h" +#include "rtwindow.h" #ifdef _OPENMP #include #endif diff --git a/rtgui/preferences.h b/rtgui/preferences.h index 62f7c53c1..b4b90e669 100644 --- a/rtgui/preferences.h +++ b/rtgui/preferences.h @@ -25,7 +25,10 @@ #include "adjuster.h" #include "dynamicprofilepanel.h" #include "options.h" -#include "rtwindow.h" +#include "../rtengine/profilestore.h" + +class RTWindow; +class Splash; class Preferences : public Gtk::Dialog, diff --git a/rtgui/previewwindow.cc b/rtgui/previewwindow.cc index 3f787a16b..6268fe3d2 100644 --- a/rtgui/previewwindow.cc +++ b/rtgui/previewwindow.cc @@ -21,6 +21,7 @@ #include "imagearea.h" #include "cursormanager.h" #include "options.h" +#include "rtscalable.h" #include "../rtengine/procparams.h" diff --git a/rtgui/progressconnector.h b/rtgui/progressconnector.h index 32a48473f..eb6eb3a66 100644 --- a/rtgui/progressconnector.h +++ b/rtgui/progressconnector.h @@ -23,7 +23,7 @@ #include #include "guiutils.h" - +#include "multilangmgr.h" #include "../rtengine/rtengine.h" #undef THREAD_PRIORITY_NORMAL diff --git a/rtgui/renamedlg.cc b/rtgui/renamedlg.cc index 81bcd86e5..8908d3419 100644 --- a/rtgui/renamedlg.cc +++ b/rtgui/renamedlg.cc @@ -17,6 +17,7 @@ * along with RawTherapee. If not, see . */ #include "renamedlg.h" +#include "cacheimagedata.h" #include "multilangmgr.h" #include "rtimage.h" diff --git a/rtgui/renamedlg.h b/rtgui/renamedlg.h index 23f69391f..f9447fbac 100644 --- a/rtgui/renamedlg.h +++ b/rtgui/renamedlg.h @@ -20,11 +20,12 @@ #include -#include "cacheimagedata.h" #include "guiutils.h" #define RESPONSE_ALL 100 +class CacheImageData; + class RenameDialog : public Gtk::Dialog { diff --git a/rtgui/rtwindow.cc b/rtgui/rtwindow.cc index ed1ae8d6c..c3d735e8f 100644 --- a/rtgui/rtwindow.cc +++ b/rtgui/rtwindow.cc @@ -23,10 +23,15 @@ #include "preferences.h" #include "iccprofilecreator.h" #include "cursormanager.h" +#include "editwindow.h" #include "rtimage.h" #include "thumbnail.h" #include "whitebalance.h" #include "../rtengine/settings.h" +#include "batchqueuepanel.h" +#include "editorpanel.h" +#include "filepanel.h" +#include "filmsimulation.h" float fontScale = 1.f; Glib::RefPtr cssForced; @@ -1163,3 +1168,8 @@ void RTWindow::createSetmEditor() mainNB->append_page (*epanel, *editorLabelGrid); } + +bool RTWindow::isSingleTabMode() const +{ + return !options.tabbedUI && ! (options.multiDisplayMode > 0); +} diff --git a/rtgui/rtwindow.h b/rtgui/rtwindow.h index 05d0cc231..39e1581e3 100644 --- a/rtgui/rtwindow.h +++ b/rtgui/rtwindow.h @@ -25,15 +25,15 @@ #include #endif -#include "batchqueuepanel.h" -#include "editorpanel.h" -#include "editwindow.h" -#include "filepanel.h" #include "progressconnector.h" #include "splash.h" #include "../rtengine/noncopyable.h" +class BatchQueueEntry; +class BatchQueuePanel; +class EditorPanel; +class FilePanel; class RTWindow : public Gtk::Window, public rtengine::ProgressListener, @@ -55,10 +55,7 @@ private: Gtk::Image *iFullscreen, *iFullscreen_exit; - bool isSingleTabMode() - { - return !options.tabbedUI && ! (options.multiDisplayMode > 0); - }; + bool isSingleTabMode() const; bool on_expose_event_epanel (GdkEventExpose* event); bool on_expose_event_fpanel (GdkEventExpose* event); diff --git a/rtgui/thumbbrowserbase.cc b/rtgui/thumbbrowserbase.cc index b660afc61..9832b5730 100644 --- a/rtgui/thumbbrowserbase.cc +++ b/rtgui/thumbbrowserbase.cc @@ -20,6 +20,7 @@ #include "multilangmgr.h" #include "options.h" +#include "rtscalable.h" #include "thumbbrowserbase.h" #include "../rtengine/rt_math.h" From 6335b68a809f31cf20cbed9982dd87eabda0e02d Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 3 Nov 2019 14:52:42 +0100 Subject: [PATCH 124/208] Further reduction of include dependencies --- rtengine/FTblockDN.cc | 1 + rtengine/PF_correct_RT.cc | 1 + rtengine/ciecam02.h | 7 ++- rtengine/curves.h | 46 +------------------ rtengine/dcp.cc | 1 + rtengine/dirpyr_equalizer.cc | 2 + rtengine/dual_demosaic_RT.cc | 1 + rtengine/filmnegativeproc.cc | 2 +- rtengine/filmnegativethumb.cc | 2 + rtengine/iccstore.h | 2 - rtengine/iimage.cc | 4 ++ rtengine/iimage.h | 27 +++++------ rtengine/imagesource.h | 5 +++ rtengine/improcfun.cc | 1 + rtengine/improcfun.h | 8 +++- rtengine/init.cc | 1 + rtengine/ipdehaze.cc | 1 + rtengine/iplabregions.cc | 1 + rtengine/ipretinex.cc | 1 + rtengine/ipshadowshighlights.cc | 1 + rtengine/ipsoftlight.cc | 1 + rtengine/ipwavelet.cc | 1 + rtengine/pixelshift.cc | 2 +- rtengine/previewimage.cc | 1 + rtengine/procparams.cc | 1 + rtengine/rawimagesource.h | 1 - rtengine/rtengine.h | 6 ++- rtengine/rtthumbnail.cc | 1 + rtengine/rtthumbnail.h | 1 + rtengine/satandvalueblendingcurve.h | 70 +++++++++++++++++++++++++++++ rtengine/shmap.cc | 1 + rtengine/shmap.h | 6 ++- rtengine/tmo_fattal02.cc | 1 + rtengine/xtrans_demosaic.cc | 1 + rtgui/bayerexposre.h | 0 rtgui/bayerexposure.h | 0 rtgui/colortoning.cc | 1 + rtgui/defringe.cc | 1 + rtgui/dirpyrdenoise.cc | 1 + rtgui/dirpyrequalizer.cc | 2 + rtgui/labcurve.cc | 1 + rtgui/labgrid.cc | 1 + rtgui/mydiagonalcurve.h | 5 ++- rtgui/retinex.cc | 1 + rtgui/wavelet.cc | 1 + 45 files changed, 154 insertions(+), 69 deletions(-) create mode 100644 rtengine/satandvalueblendingcurve.h create mode 100644 rtgui/bayerexposre.h create mode 100644 rtgui/bayerexposure.h diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index b6245fbce..6e1ddf8b4 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -29,6 +29,7 @@ #include "array2D.h" #include "boxblur.h" #include "cplx_wavelet_dec.h" +#include "color.h" #include "curves.h" #include "iccmatrices.h" #include "iccstore.h" diff --git a/rtengine/PF_correct_RT.cc b/rtengine/PF_correct_RT.cc index e1d6ef808..c851d3d09 100644 --- a/rtengine/PF_correct_RT.cc +++ b/rtengine/PF_correct_RT.cc @@ -30,6 +30,7 @@ #include "gauss.h" #include "improcfun.h" #include "cieimage.h" +#include "color.h" #include "curves.h" #include "labimage.h" #include "sleef.c" diff --git a/rtengine/ciecam02.h b/rtengine/ciecam02.h index 68252f2f6..5f5dd9bca 100644 --- a/rtengine/ciecam02.h +++ b/rtengine/ciecam02.h @@ -20,9 +20,14 @@ #include -#include "LUT.h" #include "opthelper.h" +template +class LUT; + +using LUTu = LUT; +using LUTf = LUT; + namespace rtengine { diff --git a/rtengine/curves.h b/rtengine/curves.h index 9c5a84eac..b8b72d0eb 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -25,13 +25,12 @@ #include #include "rt_math.h" -#include "color.h" #include "flatcurvetypes.h" #include "diagonalcurvetypes.h" #include "pipettebuffer.h" #include "noncopyable.h" #include "LUT.h" - +#include "sleef.c" #define CURVES_MIN_POLY_POINTS 1000 #include "rt_math.h" @@ -894,12 +893,6 @@ public: float *r, float *g, float *b) const; }; -class SatAndValueBlendingToneCurve : public ToneCurve -{ -public: - void Apply(float& r, float& g, float& b) const; -}; - class WeightedStdToneCurve : public ToneCurve { private: @@ -1269,43 +1262,6 @@ inline void WeightedStdToneCurve::BatchApply(const size_t start, const size_t en #endif } -// Tone curve modifying the value channel only, preserving hue and saturation -// values in 0xffff space -inline void SatAndValueBlendingToneCurve::Apply (float& ir, float& ig, float& ib) const -{ - - assert (lutToneCurve); - - float r = CLIP(ir); - float g = CLIP(ig); - float b = CLIP(ib); - - const float lum = (r + g + b) / 3.f; - const float newLum = lutToneCurve[lum]; - - if (newLum == lum) { - return; - } - - float h, s, v; - Color::rgb2hsvtc(r, g, b, h, s, v); - - float dV; - if (newLum > lum) { - // Linearly targeting Value = 1 and Saturation = 0 - const float coef = (newLum - lum) / (65535.f - lum); - dV = (1.f - v) * coef; - s *= 1.f - coef; - } else { - // Linearly targeting Value = 0 - const float coef = (newLum - lum) / lum ; - dV = v * coef; - } - Color::hsv2rgbdcp(h, s, v + dV, r, g, b); - - setUnlessOOG(ir, ig, ib, r, g, b); -} - } #undef CLIPI diff --git a/rtengine/dcp.cc b/rtengine/dcp.cc index d3ab1b3f1..11fe306b8 100644 --- a/rtengine/dcp.cc +++ b/rtengine/dcp.cc @@ -28,6 +28,7 @@ #include "dcp.h" #include "cJSON.h" +#include "color.h" #include "iccmatrices.h" #include "iccstore.h" #include "imagefloat.h" diff --git a/rtengine/dirpyr_equalizer.cc b/rtengine/dirpyr_equalizer.cc index 6fd4f002c..1f62badcb 100644 --- a/rtengine/dirpyr_equalizer.cc +++ b/rtengine/dirpyr_equalizer.cc @@ -24,7 +24,9 @@ #include "array2D.h" #include "cieimage.h" +#include "color.h" #include "improcfun.h" +#include "LUT.h" #include "opthelper.h" #include "rt_math.h" #include "settings.h" diff --git a/rtengine/dual_demosaic_RT.cc b/rtengine/dual_demosaic_RT.cc index 8a3564279..b5839ee8b 100644 --- a/rtengine/dual_demosaic_RT.cc +++ b/rtengine/dual_demosaic_RT.cc @@ -23,6 +23,7 @@ // //////////////////////////////////////////////////////////////// +#include "color.h" #include "jaggedarray.h" #include "procparams.h" #include "rawimagesource.h" diff --git a/rtengine/filmnegativeproc.cc b/rtengine/filmnegativeproc.cc index f373f8c14..73156d1e3 100644 --- a/rtengine/filmnegativeproc.cc +++ b/rtengine/filmnegativeproc.cc @@ -32,7 +32,7 @@ #include "procparams.h" #include "rt_algo.h" #include "rtengine.h" - +#include "sleef.c" //#define BENCHMARK #include "StopWatch.h" diff --git a/rtengine/filmnegativethumb.cc b/rtengine/filmnegativethumb.cc index 1e52300d4..fa50e93bf 100644 --- a/rtengine/filmnegativethumb.cc +++ b/rtengine/filmnegativethumb.cc @@ -18,9 +18,11 @@ */ #include +#include "LUT.h" #include "rtengine.h" #include "rtthumbnail.h" #include "opthelper.h" +#include "sleef.c" #include "rt_algo.h" #include "settings.h" #include "procparams.h" diff --git a/rtengine/iccstore.h b/rtengine/iccstore.h index cc67c6152..731a155bb 100644 --- a/rtengine/iccstore.h +++ b/rtengine/iccstore.h @@ -27,8 +27,6 @@ #include -#include "color.h" - namespace rtengine { diff --git a/rtengine/iimage.cc b/rtengine/iimage.cc index a1ec979a1..a8bcf9368 100644 --- a/rtengine/iimage.cc +++ b/rtengine/iimage.cc @@ -17,6 +17,7 @@ * along with RawTherapee. If not, see . */ +#include "color.h" #include "procparams.h" #include "rtengine.h" @@ -45,3 +46,6 @@ int rtengine::getCoarseBitMask( const procparams::CoarseTransformParams &coarse) return tr; } +int rtengine::igammasrgb(float in) { + return Color::igamma_srgb(in); +} diff --git a/rtengine/iimage.h b/rtengine/iimage.h index 3c39b7659..73e38b45f 100644 --- a/rtengine/iimage.h +++ b/rtengine/iimage.h @@ -21,9 +21,9 @@ #include #include +#include #include "alignedbuffer.h" -#include "color.h" #include "coord2d.h" #include "imagedimensions.h" #include "LUT.h" @@ -59,6 +59,7 @@ extern const char sImage16[]; extern const char sImagefloat[]; int getCoarseBitMask(const procparams::CoarseTransformParams& coarse); +int igammasrgb(float in); enum TypeInterpolation { TI_Nearest, TI_Bilinear }; @@ -964,9 +965,9 @@ public: convertTo(r(i, j), r_); convertTo(g(i, j), g_); convertTo(b(i, j), b_); - histogram[(int)Color::igamma_srgb (r_) >> histcompr]++; - histogram[(int)Color::igamma_srgb (g_) >> histcompr]++; - histogram[(int)Color::igamma_srgb (b_) >> histcompr]++; + histogram[igammasrgb (r_) >> histcompr]++; + histogram[igammasrgb (g_) >> histcompr]++; + histogram[igammasrgb (b_) >> histcompr]++; } } @@ -982,9 +983,9 @@ public: convertTo(r(i, j), r_); convertTo(g(i, j), g_); convertTo(b(i, j), b_); - int rtemp = Color::igamma_srgb (r_); - int gtemp = Color::igamma_srgb (g_); - int btemp = Color::igamma_srgb (b_); + int rtemp = igammasrgb (r_); + int gtemp = igammasrgb (g_); + int btemp = igammasrgb (b_); histogram[rtemp >> compression]++; histogram[gtemp >> compression] += 2; @@ -1573,9 +1574,9 @@ public: convertTo(r(i, j), r_); convertTo(g(i, j), g_); convertTo(b(i, j), b_); - histogram[(int)Color::igamma_srgb (r_) >> histcompr]++; - histogram[(int)Color::igamma_srgb (g_) >> histcompr]++; - histogram[(int)Color::igamma_srgb (b_) >> histcompr]++; + histogram[igammasrgb (r_) >> histcompr]++; + histogram[igammasrgb (g_) >> histcompr]++; + histogram[igammasrgb (b_) >> histcompr]++; } } @@ -1591,9 +1592,9 @@ public: convertTo(r(i, j), r_); convertTo(g(i, j), g_); convertTo(b(i, j), b_); - int rtemp = Color::igamma_srgb (r_); - int gtemp = Color::igamma_srgb (g_); - int btemp = Color::igamma_srgb (b_); + int rtemp = igammasrgb (r_); + int gtemp = igammasrgb (g_); + int btemp = igammasrgb (b_); histogram[rtemp >> compression]++; histogram[gtemp >> compression] += 2; diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index 6b5a22b63..e0c26aa9f 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -28,6 +28,11 @@ #include "LUT.h" #include "rtengine.h" +template +class LUT; + +using LUTf = LUT; + template class multi_array2D; diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index b1bff49a0..b58c60780 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -42,6 +42,7 @@ #include "improccoordinator.h" #include "clutstore.h" #include "ciecam02.h" +#include "satandvalueblendingcurve.h" #include "StopWatch.h" #include "procparams.h" #include "../rtgui/ppversion.h" diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 2c4efbfe9..2229987a1 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -20,13 +20,17 @@ #include -#include "color.h" #include "coord2d.h" #include "gamutwarning.h" -#include "LUT.h" #include "pipettebuffer.h" #include "shmap.h" +template +class LUT; + +using LUTu = LUT; +using LUTf = LUT; + template class multi_array2D; namespace rtengine diff --git a/rtengine/init.cc b/rtengine/init.cc index 453374e3a..1a00f7ff6 100644 --- a/rtengine/init.cc +++ b/rtengine/init.cc @@ -18,6 +18,7 @@ */ #include #include "../rtgui/profilestorecombobox.h" +#include "color.h" #include "rtengine.h" #include "iccstore.h" #include "dcp.h" diff --git a/rtengine/ipdehaze.cc b/rtengine/ipdehaze.cc index c9579cf05..28a0f2d57 100644 --- a/rtengine/ipdehaze.cc +++ b/rtengine/ipdehaze.cc @@ -32,6 +32,7 @@ #include #include +#include "color.h" #include "guidedfilter.h" #include "iccstore.h" #include "imagefloat.h" diff --git a/rtengine/iplabregions.cc b/rtengine/iplabregions.cc index cea23bc6b..305a449ee 100644 --- a/rtengine/iplabregions.cc +++ b/rtengine/iplabregions.cc @@ -22,6 +22,7 @@ #include #endif +#include "color.h" #include "curves.h" #include "guidedfilter.h" #include "iccstore.h" diff --git a/rtengine/ipretinex.cc b/rtengine/ipretinex.cc index ab3a632da..b5d504a99 100644 --- a/rtengine/ipretinex.cc +++ b/rtengine/ipretinex.cc @@ -41,6 +41,7 @@ #include #include +#include "color.h" #include "curves.h" #include "gauss.h" #include "improcfun.h" diff --git a/rtengine/ipshadowshighlights.cc b/rtengine/ipshadowshighlights.cc index 0eceb5a3b..45031da53 100644 --- a/rtengine/ipshadowshighlights.cc +++ b/rtengine/ipshadowshighlights.cc @@ -20,6 +20,7 @@ #include "improcfun.h" +#include "color.h" #include "curves.h" #include "gauss.h" #include "guidedfilter.h" diff --git a/rtengine/ipsoftlight.cc b/rtengine/ipsoftlight.cc index ab2e7c8b1..41d0d48bf 100644 --- a/rtengine/ipsoftlight.cc +++ b/rtengine/ipsoftlight.cc @@ -19,6 +19,7 @@ * along with RawTherapee. If not, see . */ +#include "color.h" #include "iccstore.h" #include "improcfun.h" #include "labimage.h" diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 78a4dd509..08b317e4c 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -29,6 +29,7 @@ #include "../rtgui/threadutils.h" #include "array2D.h" +#include "color.h" #include "curves.h" #include "EdgePreservingDecomposition.h" #include "iccstore.h" diff --git a/rtengine/pixelshift.cc b/rtengine/pixelshift.cc index 9cb5844c2..7a6b6db41 100644 --- a/rtengine/pixelshift.cc +++ b/rtengine/pixelshift.cc @@ -28,7 +28,7 @@ #include "median.h" #include "procparams.h" #include "rawimagesource.h" - +#include "sleef.c" #include "../rtgui/multilangmgr.h" #include "../rtgui/options.h" diff --git a/rtengine/previewimage.cc b/rtengine/previewimage.cc index 7216e6a34..de1603f1c 100644 --- a/rtengine/previewimage.cc +++ b/rtengine/previewimage.cc @@ -19,6 +19,7 @@ #include "previewimage.h" +#include "color.h" #include "iimage.h" #include "iimage.h" #include "procparams.h" diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index df5ac40a9..c09da1e84 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -26,6 +26,7 @@ #include #include +#include "color.h" #include "curves.h" #include "procparams.h" #include "utils.h" diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index 82e842ad3..f876fecb4 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -23,7 +23,6 @@ #include #include "array2D.h" -#include "color.h" #include "colortemp.h" #include "iimage.h" #include "imagesource.h" diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index 287759009..0473622c4 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -29,7 +29,6 @@ #include "iimage.h" #include "imageformat.h" -#include "LUT.h" #include "procevents.h" #include "rawmetadatalocation.h" #include "rt_math.h" @@ -43,6 +42,11 @@ * */ +template +class LUT; + +using LUTu = LUT; + class EditDataProvider; namespace rtexif { diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index d6ff53750..b1953bb3d 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -27,6 +27,7 @@ #include #include "cieimage.h" +#include "color.h" #include "colortemp.h" #include "curves.h" #include "dcp.h" diff --git a/rtengine/rtthumbnail.h b/rtengine/rtthumbnail.h index 473c74e7c..dcc9596f6 100644 --- a/rtengine/rtthumbnail.h +++ b/rtengine/rtthumbnail.h @@ -25,6 +25,7 @@ #include "image16.h" #include "image8.h" #include "imagefloat.h" +#include "LUT.h" #include "rawmetadatalocation.h" #include "../rtgui/threadutils.h" diff --git a/rtengine/satandvalueblendingcurve.h b/rtengine/satandvalueblendingcurve.h new file mode 100644 index 000000000..c610652b4 --- /dev/null +++ b/rtengine/satandvalueblendingcurve.h @@ -0,0 +1,70 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2004-2010 Gabor Horvath + * + * RawTherapee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RawTherapee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RawTherapee. If not, see . + */ +#pragma once + +#include "color.h" +#include "curves.h" + +namespace rtengine +{ + +class SatAndValueBlendingToneCurve : public ToneCurve +{ +public: + void Apply(float& r, float& g, float& b) const; +}; + +// Tone curve modifying the value channel only, preserving hue and saturation +// values in 0xffff space +inline void SatAndValueBlendingToneCurve::Apply (float& ir, float& ig, float& ib) const +{ + + assert (lutToneCurve); + + float r = CLIP(ir); + float g = CLIP(ig); + float b = CLIP(ib); + + const float lum = (r + g + b) / 3.f; + const float newLum = lutToneCurve[lum]; + + if (newLum == lum) { + return; + } + + float h, s, v; + Color::rgb2hsvtc(r, g, b, h, s, v); + + float dV; + if (newLum > lum) { + // Linearly targeting Value = 1 and Saturation = 0 + const float coef = (newLum - lum) / (65535.f - lum); + dV = (1.f - v) * coef; + s *= 1.f - coef; + } else { + // Linearly targeting Value = 0 + const float coef = (newLum - lum) / lum ; + dV = v * coef; + } + Color::hsv2rgbdcp(h, s, v + dV, r, g, b); + + setUnlessOOG(ir, ig, ib, r, g, b); +} + +} diff --git a/rtengine/shmap.cc b/rtengine/shmap.cc index 36582df39..d0c34e925 100644 --- a/rtengine/shmap.cc +++ b/rtengine/shmap.cc @@ -22,6 +22,7 @@ #include "rtengine.h" #include "rt_math.h" #include "rawimagesource.h" +#include "sleef.c" #include "jaggedarray.h" #undef THREAD_PRIORITY_NORMAL #include "opthelper.h" diff --git a/rtengine/shmap.h b/rtengine/shmap.h index b40e872bb..5373b8302 100644 --- a/rtengine/shmap.h +++ b/rtengine/shmap.h @@ -18,9 +18,13 @@ */ #pragma once -#include "LUT.h" #include "noncopyable.h" +template +class LUT; + +using LUTf = LUT; + namespace rtengine { diff --git a/rtengine/tmo_fattal02.cc b/rtengine/tmo_fattal02.cc index d28606edb..173171e0e 100644 --- a/rtengine/tmo_fattal02.cc +++ b/rtengine/tmo_fattal02.cc @@ -66,6 +66,7 @@ #include #include "array2D.h" +#include "color.h" #include "iccstore.h" #include "imagefloat.h" #include "improcfun.h" diff --git a/rtengine/xtrans_demosaic.cc b/rtengine/xtrans_demosaic.cc index 418d369b8..c1a526535 100644 --- a/rtengine/xtrans_demosaic.cc +++ b/rtengine/xtrans_demosaic.cc @@ -19,6 +19,7 @@ // //////////////////////////////////////////////////////////////// +#include "color.h" #include "rtengine.h" #include "rawimage.h" #include "rawimagesource.h" diff --git a/rtgui/bayerexposre.h b/rtgui/bayerexposre.h new file mode 100644 index 000000000..e69de29bb diff --git a/rtgui/bayerexposure.h b/rtgui/bayerexposure.h new file mode 100644 index 000000000..e69de29bb diff --git a/rtgui/colortoning.cc b/rtgui/colortoning.cc index f177602a3..1a6a9b918 100644 --- a/rtgui/colortoning.cc +++ b/rtgui/colortoning.cc @@ -7,6 +7,7 @@ #include "eventmapper.h" #include "labgrid.h" #include "options.h" +#include "../rtengine/color.h" using namespace rtengine; using namespace rtengine::procparams; diff --git a/rtgui/defringe.cc b/rtgui/defringe.cc index 8aa79dddd..7114f9a52 100644 --- a/rtgui/defringe.cc +++ b/rtgui/defringe.cc @@ -22,6 +22,7 @@ #include "defringe.h" #include "options.h" +#include "../rtengine/color.h" #include "../rtengine/procparams.h" using namespace rtengine; diff --git a/rtgui/dirpyrdenoise.cc b/rtgui/dirpyrdenoise.cc index dd695eecf..b429dfc9f 100644 --- a/rtgui/dirpyrdenoise.cc +++ b/rtgui/dirpyrdenoise.cc @@ -25,6 +25,7 @@ #include "guiutils.h" #include "options.h" +#include "../rtengine/color.h" #include "../rtengine/procparams.h" using namespace rtengine; diff --git a/rtgui/dirpyrequalizer.cc b/rtgui/dirpyrequalizer.cc index fc03c83ad..fd0268efa 100644 --- a/rtgui/dirpyrequalizer.cc +++ b/rtgui/dirpyrequalizer.cc @@ -19,6 +19,8 @@ #include "dirpyrequalizer.h" +#include "../rtengine/color.h" + using namespace rtengine; using namespace rtengine::procparams; diff --git a/rtgui/labcurve.cc b/rtgui/labcurve.cc index fd1065269..bd4b27f14 100644 --- a/rtgui/labcurve.cc +++ b/rtgui/labcurve.cc @@ -22,6 +22,7 @@ #include "options.h" +#include "../rtengine/color.h" #include "../rtengine/improcfun.h" #include "../rtengine/procparams.h" #include "editcallbacks.h" diff --git a/rtgui/labgrid.cc b/rtgui/labgrid.cc index fa452815e..516dbb825 100644 --- a/rtgui/labgrid.cc +++ b/rtgui/labgrid.cc @@ -38,6 +38,7 @@ #include "labgrid.h" +#include "../rtengine/color.h" #include "options.h" #include "rtimage.h" diff --git a/rtgui/mydiagonalcurve.h b/rtgui/mydiagonalcurve.h index d9f2518fb..a71c0565c 100644 --- a/rtgui/mydiagonalcurve.h +++ b/rtgui/mydiagonalcurve.h @@ -26,9 +26,12 @@ #include "curvelistener.h" #include "mycurve.h" -#include "../rtengine/LUT.h" #include "../rtengine/diagonalcurvetypes.h" +template +class LUT; + +using LUTf = LUT; class DiagonalCurveDescr { diff --git a/rtgui/retinex.cc b/rtgui/retinex.cc index dddf1da20..33f1c2f6a 100644 --- a/rtgui/retinex.cc +++ b/rtgui/retinex.cc @@ -5,6 +5,7 @@ #include "mycurve.h" #include "rtimage.h" #include "options.h" +#include "../rtengine/color.h" using namespace rtengine; using namespace rtengine::procparams; diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 6e49d36b9..4fd3a7b8f 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -24,6 +24,7 @@ #include "guiutils.h" #include "rtimage.h" #include "options.h" +#include "../rtengine/color.h" using namespace rtengine; using namespace rtengine::procparams; From e66ed090a71a3c420944d112d4ff94628eb6282b Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 3 Nov 2019 14:53:57 +0100 Subject: [PATCH 125/208] remove two accidently committed files --- rtgui/bayerexposre.h | 0 rtgui/bayerexposure.h | 0 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 rtgui/bayerexposre.h delete mode 100644 rtgui/bayerexposure.h diff --git a/rtgui/bayerexposre.h b/rtgui/bayerexposre.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/rtgui/bayerexposure.h b/rtgui/bayerexposure.h deleted file mode 100644 index e69de29bb..000000000 From ee6dd7d0d1f88d06ee825f1454bdc4715f226159 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 3 Nov 2019 16:14:16 +0100 Subject: [PATCH 126/208] reduce dependencies --- rtengine/capturesharpening.cc | 3 --- rtengine/curves.cc | 3 --- rtengine/filmnegativeproc.cc | 4 ---- rtengine/iplabregions.cc | 4 ---- rtengine/iplocalcontrast.cc | 4 ---- rtengine/iptransform.cc | 4 ---- rtengine/ipvibrance.cc | 4 ---- 7 files changed, 26 deletions(-) diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index bbc0be50b..80693c8b7 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -29,9 +29,6 @@ #include "rt_algo.h" //#define BENCHMARK #include "StopWatch.h" -#ifdef _OPENMP -#include -#endif #include "opthelper.h" #include "../rtgui/multilangmgr.h" diff --git a/rtengine/curves.cc b/rtengine/curves.cc index eb6cc57c3..b2105a091 100644 --- a/rtengine/curves.cc +++ b/rtengine/curves.cc @@ -23,9 +23,6 @@ #include #include #include -#ifdef _OPENMP -#include -#endif #include "rt_math.h" diff --git a/rtengine/filmnegativeproc.cc b/rtengine/filmnegativeproc.cc index 73156d1e3..1ceff7e20 100644 --- a/rtengine/filmnegativeproc.cc +++ b/rtengine/filmnegativeproc.cc @@ -19,10 +19,6 @@ #include #include -#ifdef _OPENMP -#include -#endif - #include "rawimage.h" #include "rawimagesource.h" diff --git a/rtengine/iplabregions.cc b/rtengine/iplabregions.cc index 305a449ee..e3755f0fc 100644 --- a/rtengine/iplabregions.cc +++ b/rtengine/iplabregions.cc @@ -18,10 +18,6 @@ * along with RawTherapee. If not, see . */ -#ifdef _OPENMP -#include -#endif - #include "color.h" #include "curves.h" #include "guidedfilter.h" diff --git a/rtengine/iplocalcontrast.cc b/rtengine/iplocalcontrast.cc index d6f3ebb5b..daeb142dd 100644 --- a/rtengine/iplocalcontrast.cc +++ b/rtengine/iplocalcontrast.cc @@ -22,10 +22,6 @@ * along with RawTherapee. If not, see . */ -#ifdef _OPENMP -#include -#endif - #include "array2D.h" #include "gauss.h" #include "labimage.h" diff --git a/rtengine/iptransform.cc b/rtengine/iptransform.cc index 640fab2a6..b6ffcec1c 100644 --- a/rtengine/iptransform.cc +++ b/rtengine/iptransform.cc @@ -18,10 +18,6 @@ */ #include -#ifdef _OPENMP -#include -#endif - #include "imagefloat.h" #include "improcfun.h" diff --git a/rtengine/ipvibrance.cc b/rtengine/ipvibrance.cc index b46cfb413..14e5f3c44 100644 --- a/rtengine/ipvibrance.cc +++ b/rtengine/ipvibrance.cc @@ -28,10 +28,6 @@ #include "color.h" #include "procparams.h" #include "StopWatch.h" -#ifdef _OPENMP -#include -#endif - using namespace std; From ec3ba6d9b8764b8fd728b01ce679bb639862a778 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 3 Nov 2019 17:03:40 +0100 Subject: [PATCH 127/208] renamed sleef.c to sleef.h --- rtengine/EdgePreservingDecomposition.cc | 2 +- rtengine/FTblockDN.cc | 2 +- rtengine/PF_correct_RT.cc | 2 +- rtengine/amaze_demosaic_RT.cc | 2 +- rtengine/ciecam02.cc | 2 +- rtengine/color.cc | 2 +- rtengine/color.h | 2 +- rtengine/colortemp.cc | 2 +- rtengine/curves.h | 2 +- rtengine/demosaic_algos.cc | 2 +- rtengine/filmnegativeproc.cc | 2 +- rtengine/filmnegativethumb.cc | 2 +- rtengine/impulse_denoise.cc | 2 +- rtengine/iplabregions.cc | 3 +-- rtengine/ipresize.cc | 2 +- rtengine/ipshadowshighlights.cc | 3 +-- rtengine/ipsharpen.cc | 2 +- rtengine/iptransform.cc | 2 +- rtengine/ipwavelet.cc | 2 +- rtengine/pixelshift.cc | 2 +- rtengine/rt_algo.cc | 2 +- rtengine/shmap.cc | 2 +- rtengine/{sleef.c => sleef.h} | 6 +----- rtengine/tmo_fattal02.cc | 2 +- 24 files changed, 24 insertions(+), 30 deletions(-) rename rtengine/{sleef.c => sleef.h} (99%) diff --git a/rtengine/EdgePreservingDecomposition.cc b/rtengine/EdgePreservingDecomposition.cc index 85770826e..700181e1d 100644 --- a/rtengine/EdgePreservingDecomposition.cc +++ b/rtengine/EdgePreservingDecomposition.cc @@ -4,7 +4,7 @@ #ifdef _OPENMP #include #endif -#include "sleef.c" +#include "sleef.h" #define DIAGONALS 5 #define DIAGONALSP1 6 diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index 6e1ddf8b4..ea0565b21 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -42,7 +42,7 @@ #include "opthelper.h" #include "procparams.h" #include "rt_math.h" -#include "sleef.c" +#include "sleef.h" #include "../rtgui/threadutils.h" #include "../rtgui/options.h" diff --git a/rtengine/PF_correct_RT.cc b/rtengine/PF_correct_RT.cc index c851d3d09..9a95b8e2f 100644 --- a/rtengine/PF_correct_RT.cc +++ b/rtengine/PF_correct_RT.cc @@ -33,7 +33,7 @@ #include "color.h" #include "curves.h" #include "labimage.h" -#include "sleef.c" +#include "sleef.h" #include "curves.h" #include "rt_math.h" #include "opthelper.h" diff --git a/rtengine/amaze_demosaic_RT.cc b/rtengine/amaze_demosaic_RT.cc index 41c60d4ed..11ff1f5a0 100644 --- a/rtengine/amaze_demosaic_RT.cc +++ b/rtengine/amaze_demosaic_RT.cc @@ -30,7 +30,7 @@ #include "rawimagesource.h" #include "rt_math.h" #include "../rtgui/multilangmgr.h" -#include "sleef.c" +#include "sleef.h" #include "opthelper.h" #include "median.h" #include "StopWatch.h" diff --git a/rtengine/ciecam02.cc b/rtengine/ciecam02.cc index 0553c129e..8314e5e8f 100644 --- a/rtengine/ciecam02.cc +++ b/rtengine/ciecam02.cc @@ -20,7 +20,7 @@ #include "rt_math.h" #include "curves.h" #include -#include "sleef.c" +#include "sleef.h" #ifdef _DEBUG #include "settings.h" diff --git a/rtengine/color.cc b/rtengine/color.cc index 8437a36b1..8d20fb9ba 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -20,7 +20,7 @@ #include "rtengine.h" #include "color.h" #include "iccmatrices.h" -#include "sleef.c" +#include "sleef.h" #include "opthelper.h" #include "iccstore.h" diff --git a/rtengine/color.h b/rtengine/color.h index abe67d906..a89778157 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -26,7 +26,7 @@ #include "LUT.h" #include "iccmatrices.h" #include "lcms2.h" -#include "sleef.c" +#include "sleef.h" #define SAT(a,b,c) ((float)max(a,b,c)-(float)min(a,b,c))/(float)max(a,b,c) diff --git a/rtengine/colortemp.cc b/rtengine/colortemp.cc index 413880d49..02d3e0e6d 100644 --- a/rtengine/colortemp.cc +++ b/rtengine/colortemp.cc @@ -25,7 +25,7 @@ #include #include #include -#include "sleef.c" +#include "sleef.h" #include "settings.h" namespace rtengine diff --git a/rtengine/curves.h b/rtengine/curves.h index b8b72d0eb..bc8193b76 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -30,7 +30,7 @@ #include "pipettebuffer.h" #include "noncopyable.h" #include "LUT.h" -#include "sleef.c" +#include "sleef.h" #define CURVES_MIN_POLY_POINTS 1000 #include "rt_math.h" diff --git a/rtengine/demosaic_algos.cc b/rtengine/demosaic_algos.cc index 4058534da..45779fc9c 100644 --- a/rtengine/demosaic_algos.cc +++ b/rtengine/demosaic_algos.cc @@ -25,7 +25,7 @@ #include "rt_math.h" #include "color.h" #include "../rtgui/multilangmgr.h" -#include "sleef.c" +#include "sleef.h" #include "opthelper.h" #include "median.h" //#define BENCHMARK diff --git a/rtengine/filmnegativeproc.cc b/rtengine/filmnegativeproc.cc index 1ceff7e20..86bad00f7 100644 --- a/rtengine/filmnegativeproc.cc +++ b/rtengine/filmnegativeproc.cc @@ -28,7 +28,7 @@ #include "procparams.h" #include "rt_algo.h" #include "rtengine.h" -#include "sleef.c" +#include "sleef.h" //#define BENCHMARK #include "StopWatch.h" diff --git a/rtengine/filmnegativethumb.cc b/rtengine/filmnegativethumb.cc index fa50e93bf..b31432a55 100644 --- a/rtengine/filmnegativethumb.cc +++ b/rtengine/filmnegativethumb.cc @@ -22,7 +22,7 @@ #include "rtengine.h" #include "rtthumbnail.h" #include "opthelper.h" -#include "sleef.c" +#include "sleef.h" #include "rt_algo.h" #include "settings.h" #include "procparams.h" diff --git a/rtengine/impulse_denoise.cc b/rtengine/impulse_denoise.cc index c08f55700..20229e714 100644 --- a/rtengine/impulse_denoise.cc +++ b/rtengine/impulse_denoise.cc @@ -22,7 +22,7 @@ #include "labimage.h" #include "improcfun.h" #include "cieimage.h" -#include "sleef.c" +#include "sleef.h" #include "opthelper.h" #include "gauss.h" diff --git a/rtengine/iplabregions.cc b/rtengine/iplabregions.cc index e3755f0fc..1768101c8 100644 --- a/rtengine/iplabregions.cc +++ b/rtengine/iplabregions.cc @@ -25,8 +25,7 @@ #include "improcfun.h" #include "labimage.h" #include "procparams.h" - -#include "sleef.c" +#include "sleef.h" //#define BENCHMARK #include "StopWatch.h" diff --git a/rtengine/ipresize.cc b/rtengine/ipresize.cc index b31fcf864..b9e234b63 100644 --- a/rtengine/ipresize.cc +++ b/rtengine/ipresize.cc @@ -25,7 +25,7 @@ #include "opthelper.h" #include "rt_math.h" #include "procparams.h" -#include "sleef.c" +#include "sleef.h" //#define PROFILE diff --git a/rtengine/ipshadowshighlights.cc b/rtengine/ipshadowshighlights.cc index 45031da53..a602c5460 100644 --- a/rtengine/ipshadowshighlights.cc +++ b/rtengine/ipshadowshighlights.cc @@ -28,8 +28,7 @@ #include "labimage.h" #include "opthelper.h" #include "procparams.h" - -#include "sleef.c" +#include "sleef.h" namespace rtengine { diff --git a/rtengine/ipsharpen.cc b/rtengine/ipsharpen.cc index 0758011bb..a35476d3a 100644 --- a/rtengine/ipsharpen.cc +++ b/rtengine/ipsharpen.cc @@ -28,7 +28,7 @@ #include "rt_algo.h" #include "rt_math.h" #include "settings.h" -#include "sleef.c" +#include "sleef.h" //#define BENCHMARK #include "StopWatch.h" diff --git a/rtengine/iptransform.cc b/rtengine/iptransform.cc index b6ffcec1c..a4f304413 100644 --- a/rtengine/iptransform.cc +++ b/rtengine/iptransform.cc @@ -25,7 +25,7 @@ #include "rt_math.h" #include "rtengine.h" #include "rtlensfun.h" -#include "sleef.c" +#include "sleef.h" using namespace std; diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 08b317e4c..91c7d6c44 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -41,7 +41,7 @@ #include "procparams.h" #include "rt_math.h" #include "rtengine.h" -#include "sleef.c" +#include "sleef.h" #include "../rtgui/options.h" #ifdef _OPENMP diff --git a/rtengine/pixelshift.cc b/rtengine/pixelshift.cc index 7a6b6db41..0d83d7af3 100644 --- a/rtengine/pixelshift.cc +++ b/rtengine/pixelshift.cc @@ -28,7 +28,7 @@ #include "median.h" #include "procparams.h" #include "rawimagesource.h" -#include "sleef.c" +#include "sleef.h" #include "../rtgui/multilangmgr.h" #include "../rtgui/options.h" diff --git a/rtengine/rt_algo.cc b/rtengine/rt_algo.cc index aadbac7f7..b02e75461 100644 --- a/rtengine/rt_algo.cc +++ b/rtengine/rt_algo.cc @@ -31,7 +31,7 @@ #include "opthelper.h" #include "rt_algo.h" #include "rt_math.h" -#include "sleef.c" +#include "sleef.h" namespace { float calcBlendFactor(float val, float threshold) { diff --git a/rtengine/shmap.cc b/rtengine/shmap.cc index d0c34e925..44096d965 100644 --- a/rtengine/shmap.cc +++ b/rtengine/shmap.cc @@ -22,7 +22,7 @@ #include "rtengine.h" #include "rt_math.h" #include "rawimagesource.h" -#include "sleef.c" +#include "sleef.h" #include "jaggedarray.h" #undef THREAD_PRIORITY_NORMAL #include "opthelper.h" diff --git a/rtengine/sleef.c b/rtengine/sleef.h similarity index 99% rename from rtengine/sleef.c rename to rtengine/sleef.h index a01aef5b9..30c059010 100644 --- a/rtengine/sleef.c +++ b/rtengine/sleef.h @@ -6,9 +6,7 @@ // This version contains modifications made by Ingo Weyrich // //////////////////////////////////////////////////////////////// - -#ifndef _SLEEFC_ -#define _SLEEFC_ +#pragma once #include #include @@ -1275,5 +1273,3 @@ __inline float xlog2lin(float x, float base) constexpr float one(1); return (pow_F(base, x) - one) / (base - one); } - -#endif diff --git a/rtengine/tmo_fattal02.cc b/rtengine/tmo_fattal02.cc index 173171e0e..feba5c95f 100644 --- a/rtengine/tmo_fattal02.cc +++ b/rtengine/tmo_fattal02.cc @@ -75,7 +75,7 @@ #include "rescale.h" #include "rt_algo.h" #include "settings.h" -#include "sleef.c" +#include "sleef.h" #include "StopWatch.h" namespace rtengine From 9f3251eb561d750692149d6d0a7f691b7d08e36f Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 3 Nov 2019 23:30:34 +0100 Subject: [PATCH 128/208] fix lgtm issue --- rtengine/rawflatfield.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/rawflatfield.cc b/rtengine/rawflatfield.cc index 04012debf..05b3be408 100644 --- a/rtengine/rawflatfield.cc +++ b/rtengine/rawflatfield.cc @@ -33,7 +33,7 @@ namespace { void cfaboxblur(const float* const * riFlatFile, float* cfablur, int boxH, int boxW, int H, int W) { if (boxW < 0 || boxH < 0 || (boxW == 0 && boxH == 0)) { // nothing to blur or negative values - memcpy(cfablur, riFlatFile[0], W * H * sizeof(float)); + memcpy(cfablur, riFlatFile[0], static_cast(W) * H * sizeof(float)); return; } From 7ef19b51264191b919da76fb11718ac193b9da32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Mon, 4 Nov 2019 14:48:06 +0100 Subject: [PATCH 129/208] Fix GCC 9.2.1 build --- rtengine/ciecam02.h | 1 + 1 file changed, 1 insertion(+) diff --git a/rtengine/ciecam02.h b/rtengine/ciecam02.h index 5f5dd9bca..8b532fba0 100644 --- a/rtengine/ciecam02.h +++ b/rtengine/ciecam02.h @@ -19,6 +19,7 @@ #pragma once #include +#include #include "opthelper.h" From 0544d15b16a1dd9fa4d1ee4eb160e021b77d8f86 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 4 Nov 2019 15:10:28 +0100 Subject: [PATCH 130/208] Fix slowdown when creating thumb from non-raw file --- rtengine/iimage.cc | 7 ++-- rtengine/iimage.h | 95 +++++++++++++++++++++++++++++++++------------- 2 files changed, 73 insertions(+), 29 deletions(-) diff --git a/rtengine/iimage.cc b/rtengine/iimage.cc index a8bcf9368..f4a2a6523 100644 --- a/rtengine/iimage.cc +++ b/rtengine/iimage.cc @@ -46,6 +46,7 @@ int rtengine::getCoarseBitMask( const procparams::CoarseTransformParams &coarse) return tr; } -int rtengine::igammasrgb(float in) { - return Color::igamma_srgb(in); -} + +const LUTf& rtengine::getigammatab() { + return Color::igammatab_srgb; +} \ No newline at end of file diff --git a/rtengine/iimage.h b/rtengine/iimage.h index 73e38b45f..7309dd91f 100644 --- a/rtengine/iimage.h +++ b/rtengine/iimage.h @@ -59,7 +59,7 @@ extern const char sImage16[]; extern const char sImagefloat[]; int getCoarseBitMask(const procparams::CoarseTransformParams& coarse); -int igammasrgb(float in); +const LUTf& getigammatab(); enum TypeInterpolation { TI_Nearest, TI_Bilinear }; @@ -958,17 +958,35 @@ public: histogram(65536 >> histcompr); histogram.clear(); + const LUTf& igammatab = getigammatab(); - for (int i = 0; i < height; i++) - for (int j = 0; j < width; j++) { - float r_, g_, b_; - convertTo(r(i, j), r_); - convertTo(g(i, j), g_); - convertTo(b(i, j), b_); - histogram[igammasrgb (r_) >> histcompr]++; - histogram[igammasrgb (g_) >> histcompr]++; - histogram[igammasrgb (b_) >> histcompr]++; +#ifdef _OPENMP + #pragma omp parallel +#endif + { + LUTu histThr(histogram.getSize()); + histThr.clear(); +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) nowait +#endif + for (int i = 0; i < height; i++) { + for (int j = 0; j < width; j++) { + float r_, g_, b_; + convertTo(r(i, j), r_); + convertTo(g(i, j), g_); + convertTo(b(i, j), b_); + histThr[static_cast(igammatab[r_]) >> histcompr]++; + histThr[static_cast(igammatab[g_]) >> histcompr]++; + histThr[static_cast(igammatab[b_]) >> histcompr]++; + } } +#ifdef _OPENMP + #pragma omp critical +#endif + { + histogram += histThr; + } + } } void computeHistogramAutoWB (double &avg_r, double &avg_g, double &avg_b, int &n, LUTu &histogram, const int compression) const override @@ -976,16 +994,16 @@ public: histogram.clear(); avg_r = avg_g = avg_b = 0.; n = 0; - + const LUTf& igammatab = getigammatab(); for (unsigned int i = 0; i < (unsigned int)(height); i++) for (unsigned int j = 0; j < (unsigned int)(width); j++) { float r_, g_, b_; convertTo(r(i, j), r_); convertTo(g(i, j), g_); convertTo(b(i, j), b_); - int rtemp = igammasrgb (r_); - int gtemp = igammasrgb (g_); - int btemp = igammasrgb (b_); + int rtemp = igammatab[r_]; + int gtemp = igammatab[g_]; + int btemp = igammatab[b_]; histogram[rtemp >> compression]++; histogram[gtemp >> compression] += 2; @@ -1012,6 +1030,9 @@ public: int n = 0; //int p = 6; +#ifdef _OPENMP + #pragma omp parallel for reduction(+:avg_r,avg_g,avg_b,n) schedule(dynamic,16) +#endif for (unsigned int i = 0; i < (unsigned int)(height); i++) for (unsigned int j = 0; j < (unsigned int)(width); j++) { float r_, g_, b_; @@ -1567,17 +1588,35 @@ public: histogram(65536 >> histcompr); histogram.clear(); + const LUTf& igammatab = getigammatab(); - for (int i = 0; i < height; i++) - for (int j = 0; j < width; j++) { - float r_, g_, b_; - convertTo(r(i, j), r_); - convertTo(g(i, j), g_); - convertTo(b(i, j), b_); - histogram[igammasrgb (r_) >> histcompr]++; - histogram[igammasrgb (g_) >> histcompr]++; - histogram[igammasrgb (b_) >> histcompr]++; +#ifdef _OPENMP + #pragma omp parallel +#endif + { + LUTu histThr(histogram.getSize()); + histThr.clear(); +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) nowait +#endif + for (int i = 0; i < height; i++) { + for (int j = 0; j < width; j++) { + float r_, g_, b_; + convertTo(r(i, j), r_); + convertTo(g(i, j), g_); + convertTo(b(i, j), b_); + histThr[static_cast(igammatab[r_]) >> histcompr]++; + histThr[static_cast(igammatab[g_]) >> histcompr]++; + histThr[static_cast(igammatab[b_]) >> histcompr]++; + } } +#ifdef _OPENMP + #pragma omp critical +#endif + { + histogram += histThr; + } + } } void computeHistogramAutoWB (double &avg_r, double &avg_g, double &avg_b, int &n, LUTu &histogram, const int compression) const override @@ -1585,6 +1624,7 @@ public: histogram.clear(); avg_r = avg_g = avg_b = 0.; n = 0; + const LUTf& igammatab = getigammatab(); for (unsigned int i = 0; i < (unsigned int)(height); i++) for (unsigned int j = 0; j < (unsigned int)(width); j++) { @@ -1592,9 +1632,9 @@ public: convertTo(r(i, j), r_); convertTo(g(i, j), g_); convertTo(b(i, j), b_); - int rtemp = igammasrgb (r_); - int gtemp = igammasrgb (g_); - int btemp = igammasrgb (b_); + int rtemp = igammatab[r_]; + int gtemp = igammatab[g_]; + int btemp = igammatab[b_]; histogram[rtemp >> compression]++; histogram[gtemp >> compression] += 2; @@ -1621,6 +1661,9 @@ public: int n = 0; //int p = 6; +#ifdef _OPENMP + #pragma omp parallel for reduction(+:avg_r,avg_g,avg_b,n) schedule(dynamic,16) +#endif for (unsigned int i = 0; i < (unsigned int)(height); i++) for (unsigned int j = 0; j < (unsigned int)(width); j++) { float r_, g_, b_; From 14ef271a3608870cb927bedb2685ee73a67f63e1 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 4 Nov 2019 15:11:49 +0100 Subject: [PATCH 131/208] Add missing line ending --- rtengine/iimage.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/iimage.cc b/rtengine/iimage.cc index f4a2a6523..7548fc8bf 100644 --- a/rtengine/iimage.cc +++ b/rtengine/iimage.cc @@ -49,4 +49,4 @@ int rtengine::getCoarseBitMask( const procparams::CoarseTransformParams &coarse) const LUTf& rtengine::getigammatab() { return Color::igammatab_srgb; -} \ No newline at end of file +} From d3e7f6a59177fd46af2aeeabd55b6def814e44a4 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 5 Nov 2019 19:06:08 +0100 Subject: [PATCH 132/208] Capture sharpening: some cleanups --- rtengine/capturesharpening.cc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index 80693c8b7..f574fa45f 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -25,7 +25,6 @@ #include "rt_math.h" #include "procparams.h" #include "color.h" -#include "gauss.h" #include "rt_algo.h" //#define BENCHMARK #include "StopWatch.h" @@ -510,6 +509,7 @@ float calcRadiusXtrans(const float * const *rawData, int W, int H, float lowerLi } return std::sqrt((1.f / (std::log(1.f / maxRatio))) / -2.f); } + void CaptureDeconvSharpening (float** luminance, float** oldLuminance, const float * const * blend, int W, int H, double sigma, double sigmaCornerOffset, int iterations, rtengine::ProgressListener* plistener, double startVal, double endVal) { BENCHFUN @@ -651,13 +651,13 @@ BENCHFUN const float clipVal = (ri->get_white(1) - ri->get_cblack(1)) * scale_mul[1]; - array2D& redVals = redCache ? *redCache : red; - array2D& greenVals = greenCache ? *greenCache : green; - array2D& blueVals = blueCache ? *blueCache : blue; + const array2D& redVals = redCache ? *redCache : red; + const array2D& greenVals = greenCache ? *greenCache : green; + const array2D& blueVals = blueCache ? *blueCache : blue; array2D clipMask(W, H); constexpr float clipLimit = 0.95f; - if (ri->getSensorType() == ST_BAYER) { + if (getSensorType() == ST_BAYER) { const float whites[2][2] = { {(ri->get_white(FC(0,0)) - c_black[FC(0,0)]) * scale_mul[FC(0,0)] * clipLimit, (ri->get_white(FC(0,1)) - c_black[FC(0,1)]) * scale_mul[FC(0,1)] * clipLimit}, {(ri->get_white(FC(1,0)) - c_black[FC(1,0)]) * scale_mul[FC(1,0)] * clipLimit, (ri->get_white(FC(1,1)) - c_black[FC(1,1)]) * scale_mul[FC(1,1)] * clipLimit} @@ -667,7 +667,7 @@ BENCHFUN if (sharpeningParams.autoRadius) { radius = std::min(calcRadiusBayer(rawData, W, H, 1000.f, clipVal, fc), 1.15f); } - } else if (ri->getSensorType() == ST_FUJI_XTRANS) { + } else if (getSensorType() == ST_FUJI_XTRANS) { float whites[6][6]; for (int i = 0; i < 6; ++i) { for (int j = 0; j < 6; ++j) { From 03c0d6c86cb0a3d83c241cdd77ccca85126473ac Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 5 Nov 2019 20:31:17 +0100 Subject: [PATCH 133/208] Some cleanups, also fix some fallouts from reduce_include_dependencies branch --- rtengine/CA_correct_RT.cc | 102 ++++++------ rtengine/ahd_demosaic_RT.cc | 15 +- rtengine/amaze_demosaic_RT.cc | 64 ++++---- rtengine/badpixels.cc | 10 +- rtengine/demosaic_algos.cc | 287 +--------------------------------- rtengine/fast_demo.cc | 40 +++-- rtengine/filmnegativeproc.cc | 1 + rtengine/hphd_demosaic_RT.cc | 2 +- rtengine/improccoordinator.cc | 1 - rtengine/improcfun.cc | 1 - rtengine/pdaflinesfilter.cc | 1 + rtengine/pixelshift.cc | 23 +-- rtengine/rawimagesource.h | 7 +- rtengine/rcd_demosaic.cc | 24 ++- rtengine/rtthumbnail.cc | 5 - rtengine/vng4_demosaic_RT.cc | 2 +- 16 files changed, 175 insertions(+), 410 deletions(-) diff --git a/rtengine/CA_correct_RT.cc b/rtengine/CA_correct_RT.cc index 36b2fa05f..4dc2019c1 100644 --- a/rtengine/CA_correct_RT.cc +++ b/rtengine/CA_correct_RT.cc @@ -29,6 +29,13 @@ #include "median.h" #include "StopWatch.h" +namespace +{ +unsigned fc(const unsigned int cfa[2][2], int r, int c) { + return cfa[r & 1][c & 1]; +} +} + namespace { bool LinEqSolve(int nDim, double* pfMatr, double* pfVect, double* pfSolution) @@ -135,6 +142,7 @@ float* RawImageSource::CA_correct_RT( } // multithreaded and vectorized by Ingo Weyrich + const unsigned int cfa[2][2] = {{FC(0,0), FC(0,1)}, {FC(1,0), FC(1,1)}}; constexpr int ts = 128; constexpr int tsh = ts / 2; constexpr int cb = 2; // 2 pixels border will be excluded from correction @@ -145,7 +153,7 @@ float* RawImageSource::CA_correct_RT( // Test for RGB cfa for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { - if (FC(i, j) == 3) { + if (fc(cfa, i, j) == 3) { std::cout << "CA correction supports only RGB Colour filter arrays" << std::endl; return buffer; } @@ -164,7 +172,7 @@ float* RawImageSource::CA_correct_RT( #pragma omp parallel for #endif for (int i = cb; i < H - cb; ++i) { - for (int j = cb + (FC(i, 0) & 1); j < W - cb; j += 2) { + for (int j = cb + (fc(cfa, i, 0) & 1); j < W - cb; j += 2) { (*oldraw)[i - cb][(j - cb) / 2] = rawData[i][j]; } } @@ -317,12 +325,12 @@ float* RawImageSource::CA_correct_RT( int cc = ccmin; int col = cc + left; #ifdef __SSE2__ - int c0 = FC(rr, cc); + int c0 = fc(cfa, rr, cc); if (c0 == 1) { rgb[c0][rr * ts + cc] = rawData[row][col] / 65535.f; cc++; col++; - c0 = FC(rr, cc); + c0 = fc(cfa, rr, cc); } int indx1 = rr * ts + cc; for (; cc < ccmax - 7; cc+=8, col+=8, indx1 += 8) { @@ -335,7 +343,7 @@ float* RawImageSource::CA_correct_RT( } #endif for (; cc < ccmax; cc++, col++) { - int c = FC(rr, cc); + int c = fc(cfa, rr, cc); int indx1 = rr * ts + cc; rgb[c][indx1 >> ((c & 1) ^ 1)] = rawData[row][col] / 65535.f; } @@ -345,7 +353,7 @@ float* RawImageSource::CA_correct_RT( if (rrmin > 0) { for (int rr = 0; rr < border; rr++) { for (int cc = ccmin; cc < ccmax; cc++) { - int c = FC(rr, cc); + int c = fc(cfa, rr, cc); rgb[c][(rr * ts + cc) >> ((c & 1) ^ 1)] = rgb[c][((border2 - rr) * ts + cc) >> ((c & 1) ^ 1)]; } } @@ -354,7 +362,7 @@ float* RawImageSource::CA_correct_RT( if (rrmax < rr1) { for (int rr = 0; rr < border; rr++) { for (int cc = ccmin; cc < ccmax; cc++) { - int c = FC(rr, cc); + int c = fc(cfa, rr, cc); rgb[c][((rrmax + rr)*ts + cc) >> ((c & 1) ^ 1)] = rawData[(height - rr - 2)][left + cc] / 65535.f; } } @@ -363,7 +371,7 @@ float* RawImageSource::CA_correct_RT( if (ccmin > 0) { for (int rr = rrmin; rr < rrmax; rr++) { for (int cc = 0; cc < border; cc++) { - int c = FC(rr, cc); + int c = fc(cfa, rr, cc); rgb[c][(rr * ts + cc) >> ((c & 1) ^ 1)] = rgb[c][(rr * ts + border2 - cc) >> ((c & 1) ^ 1)]; } } @@ -372,7 +380,7 @@ float* RawImageSource::CA_correct_RT( if (ccmax < cc1) { for (int rr = rrmin; rr < rrmax; rr++) { for (int cc = 0; cc < border; cc++) { - int c = FC(rr, cc); + int c = fc(cfa, rr, cc); rgb[c][(rr * ts + ccmax + cc) >> ((c & 1) ^ 1)] = rawData[(top + rr)][(width - cc - 2)] / 65535.f; } } @@ -382,7 +390,7 @@ float* RawImageSource::CA_correct_RT( if (rrmin > 0 && ccmin > 0) { for (int rr = 0; rr < border; rr++) { for (int cc = 0; cc < border; cc++) { - int c = FC(rr, cc); + int c = fc(cfa, rr, cc); rgb[c][(rr * ts + cc) >> ((c & 1) ^ 1)] = rawData[border2 - rr][border2 - cc] / 65535.f; } } @@ -391,7 +399,7 @@ float* RawImageSource::CA_correct_RT( if (rrmax < rr1 && ccmax < cc1) { for (int rr = 0; rr < border; rr++) { for (int cc = 0; cc < border; cc++) { - int c = FC(rr, cc); + int c = fc(cfa, rr, cc); rgb[c][((rrmax + rr)*ts + ccmax + cc) >> ((c & 1) ^ 1)] = rawData[(height - rr - 2)][(width - cc - 2)] / 65535.f; } } @@ -400,7 +408,7 @@ float* RawImageSource::CA_correct_RT( if (rrmin > 0 && ccmax < cc1) { for (int rr = 0; rr < border; rr++) { for (int cc = 0; cc < border; cc++) { - int c = FC(rr, cc); + int c = fc(cfa, rr, cc); rgb[c][(rr * ts + ccmax + cc) >> ((c & 1) ^ 1)] = rawData[(border2 - rr)][(width - cc - 2)] / 65535.f; } } @@ -409,7 +417,7 @@ float* RawImageSource::CA_correct_RT( if (rrmax < rr1 && ccmin > 0) { for (int rr = 0; rr < border; rr++) { for (int cc = 0; cc < border; cc++) { - int c = FC(rr, cc); + int c = fc(cfa, rr, cc); rgb[c][((rrmax + rr)*ts + cc) >> ((c & 1) ^ 1)] = rawData[(height - rr - 2)][(border2 - cc)] / 65535.f; } } @@ -424,9 +432,9 @@ float* RawImageSource::CA_correct_RT( #endif for (int rr = 3; rr < rr1 - 3; rr++) { int row = rr + top; - int cc = 3 + (FC(rr,3) & 1); + int cc = 3 + (fc(cfa, rr,3) & 1); int indx = rr * ts + cc; - int c = FC(rr,cc); + int c = fc(cfa, rr,cc); #ifdef __SSE2__ for (; cc < cc1 - 9; cc+=8, indx+=8) { //compute directional weights using image gradients @@ -460,7 +468,7 @@ float* RawImageSource::CA_correct_RT( } if (row > -1 && row < height) { - int offset = (FC(row,max(left + 3, 0)) & 1); + int offset = (fc(cfa, row,max(left + 3, 0)) & 1); int col = max(left + 3, 0) + offset; int indx = rr * ts + 3 - (left < 0 ? (left+3) : 0) + offset; #ifdef __SSE2__ @@ -478,9 +486,9 @@ float* RawImageSource::CA_correct_RT( vfloat zd25v = F2V(0.25f); #endif for (int rr = 4; rr < rr1 - 4; rr++) { - int cc = 4 + (FC(rr, 2) & 1); + int cc = 4 + (fc(cfa, rr, 2) & 1); int indx = rr * ts + cc; - int c = FC(rr, cc); + int c = fc(cfa, rr, cc); #ifdef __SSE2__ for (; cc < cc1 - 10; cc += 8, indx += 8) { vfloat rgb1v = LC2VFU(rgb[1][indx]); @@ -544,9 +552,9 @@ float* RawImageSource::CA_correct_RT( // along line segments, find the point along each segment that minimizes the colour variance // averaged over the tile; evaluate for up/down and left/right away from R/B grid point for (int rr = 8; rr < rr1 - 8; rr++) { - int cc = 8 + (FC(rr, 2) & 1); + int cc = 8 + (fc(cfa, rr, 2) & 1); int indx = rr * ts + cc; - int c = FC(rr, cc); + int c = fc(cfa, rr, cc); #ifdef __SSE2__ vfloat coeff00v = ZEROV; vfloat coeff01v = ZEROV; @@ -868,14 +876,14 @@ float* RawImageSource::CA_correct_RT( int indx = row * width + col; int indx1 = rr * ts + cc; #ifdef __SSE2__ - int c = FC(rr, cc); + int c = fc(cfa, rr, cc); if (c & 1) { rgb[1][indx1] = rawData[row][col] / 65535.f; indx++; indx1++; cc++; col++; - c = FC(rr, cc); + c = fc(cfa, rr, cc); } for (; cc < ccmax - 7; cc += 8, col += 8, indx += 8, indx1 += 8) { vfloat val1v = LVFU(rawData[row][col]) / c65535v; @@ -887,7 +895,7 @@ float* RawImageSource::CA_correct_RT( } #endif for (; cc < ccmax; cc++, col++, indx++, indx1++) { - int c = FC(rr, cc); + int c = fc(cfa, rr, cc); rgb[c][indx1 >> ((c & 1) ^ 1)] = rawData[row][col] / 65535.f; if ((c & 1) == 0) { @@ -900,7 +908,7 @@ float* RawImageSource::CA_correct_RT( if (rrmin > 0) { for (int rr = 0; rr < border; rr++) { for (int cc = ccmin; cc < ccmax; cc++) { - int c = FC(rr, cc); + int c = fc(cfa, rr, cc); rgb[c][(rr * ts + cc) >> ((c & 1) ^ 1)] = rgb[c][((border2 - rr) * ts + cc) >> ((c & 1) ^ 1)]; rgb[1][rr * ts + cc] = rgb[1][(border2 - rr) * ts + cc]; } @@ -910,7 +918,7 @@ float* RawImageSource::CA_correct_RT( if (rrmax < rr1) { for (int rr = 0; rr < std::min(border, rr1 - rrmax); rr++) { for (int cc = ccmin; cc < ccmax; cc++) { - int c = FC(rr, cc); + int c = fc(cfa, rr, cc); rgb[c][((rrmax + rr)*ts + cc) >> ((c & 1) ^ 1)] = (rawData[(height - rr - 2)][left + cc]) / 65535.f; if ((c & 1) == 0) { rgb[1][(rrmax + rr)*ts + cc] = Gtmp[((height - rr - 2) * width + left + cc) >> 1]; @@ -922,7 +930,7 @@ float* RawImageSource::CA_correct_RT( if (ccmin > 0) { for (int rr = rrmin; rr < rrmax; rr++) { for (int cc = 0; cc < border; cc++) { - int c = FC(rr, cc); + int c = fc(cfa, rr, cc); rgb[c][(rr * ts + cc) >> ((c & 1) ^ 1)] = rgb[c][(rr * ts + border2 - cc) >> ((c & 1) ^ 1)]; rgb[1][rr * ts + cc] = rgb[1][rr * ts + border2 - cc]; } @@ -932,7 +940,7 @@ float* RawImageSource::CA_correct_RT( if (ccmax < cc1) { for (int rr = rrmin; rr < rrmax; rr++) { for (int cc = 0; cc < std::min(border, cc1 - ccmax); cc++) { - int c = FC(rr, cc); + int c = fc(cfa, rr, cc); rgb[c][(rr * ts + ccmax + cc) >> ((c & 1) ^ 1)] = (rawData[(top + rr)][(width - cc - 2)]) / 65535.f; if ((c & 1) == 0) { rgb[1][rr * ts + ccmax + cc] = Gtmp[((top + rr) * width + (width - cc - 2)) >> 1]; @@ -945,7 +953,7 @@ float* RawImageSource::CA_correct_RT( if (rrmin > 0 && ccmin > 0) { for (int rr = 0; rr < border; rr++) { for (int cc = 0; cc < border; cc++) { - int c = FC(rr, cc); + int c = fc(cfa, rr, cc); rgb[c][(rr * ts + cc) >> ((c & 1) ^ 1)] = (rawData[border2 - rr][border2 - cc]) / 65535.f; if ((c & 1) == 0) { rgb[1][rr * ts + cc] = Gtmp[((border2 - rr) * width + border2 - cc) >> 1]; @@ -957,7 +965,7 @@ float* RawImageSource::CA_correct_RT( if (rrmax < rr1 && ccmax < cc1) { for (int rr = 0; rr < std::min(border, rr1 - rrmax); rr++) { for (int cc = 0; cc < std::min(border, cc1 - ccmax); cc++) { - int c = FC(rr, cc); + int c = fc(cfa, rr, cc); rgb[c][((rrmax + rr)*ts + ccmax + cc) >> ((c & 1) ^ 1)] = (rawData[(height - rr - 2)][(width - cc - 2)]) / 65535.f; if ((c & 1) == 0) { rgb[1][(rrmax + rr)*ts + ccmax + cc] = Gtmp[((height - rr - 2) * width + (width - cc - 2)) >> 1]; @@ -969,7 +977,7 @@ float* RawImageSource::CA_correct_RT( if (rrmin > 0 && ccmax < cc1) { for (int rr = 0; rr < border; rr++) { for (int cc = 0; cc < std::min(border, cc1 - ccmax); cc++) { - int c = FC(rr, cc); + int c = fc(cfa, rr, cc); rgb[c][(rr * ts + ccmax + cc) >> ((c & 1) ^ 1)] = (rawData[(border2 - rr)][(width - cc - 2)]) / 65535.f; if ((c & 1) == 0) { rgb[1][rr * ts + ccmax + cc] = Gtmp[((border2 - rr) * width + (width - cc - 2)) >> 1]; @@ -981,7 +989,7 @@ float* RawImageSource::CA_correct_RT( if (rrmax < rr1 && ccmin > 0) { for (int rr = 0; rr < std::min(border, rr1 - rrmax); rr++) { for (int cc = 0; cc < border; cc++) { - int c = FC(rr, cc); + int c = fc(cfa, rr, cc); rgb[c][((rrmax + rr)*ts + cc) >> ((c & 1) ^ 1)] = (rawData[(height - rr - 2)][(border2 - cc)]) / 65535.f; if ((c & 1) == 0) { rgb[1][(rrmax + rr)*ts + cc] = Gtmp[((height - rr - 2) * width + (border2 - cc)) >> 1]; @@ -998,7 +1006,7 @@ float* RawImageSource::CA_correct_RT( #endif //manual CA correction; use red/blue slider values to set CA shift parameters for (int rr = 3; rr < rr1 - 3; rr++) { - int cc = 3 + FC(rr, 1), c = FC(rr,cc), indx = rr * ts + cc; + int cc = 3 + fc(cfa, rr, 1), c = fc(cfa, rr,cc), indx = rr * ts + cc; #ifdef __SSE2__ for (; cc < cc1 - 10; cc += 8, indx += 8) { //compute directional weights using image gradients @@ -1079,8 +1087,8 @@ float* RawImageSource::CA_correct_RT( } for (int rr = 4; rr < rr1 - 4; rr++) { - int cc = 4 + (FC(rr, 2) & 1); - int c = FC(rr, cc); + int cc = 4 + (fc(cfa, rr, 2) & 1); + int c = fc(cfa, rr, cc); int indx = (rr * ts + cc) >> 1; int indxfc = (rr + shiftvfloor[c]) * ts + cc + shifthceil[c]; int indxff = (rr + shiftvfloor[c]) * ts + cc + shifthfloor[c]; @@ -1129,8 +1137,8 @@ float* RawImageSource::CA_correct_RT( vfloat epsv = F2V(eps); #endif for (int rr = 8; rr < rr1 - 8; rr++) { - int cc = 8 + (FC(rr, 2) & 1); - int c = FC(rr, cc); + int cc = 8 + (fc(cfa, rr, 2) & 1); + int c = fc(cfa, rr, cc); int GRBdir0 = GRBdir[0][c]; int GRBdir1 = GRBdir[1][c]; #ifdef __SSE2__ @@ -1167,7 +1175,7 @@ float* RawImageSource::CA_correct_RT( STVFU(rgb[c][indx >> 1], RBint); } #endif - for (int c = FC(rr, cc), indx = rr * ts + cc; cc < cc1 - 8; cc += 2, indx += 2) { + for (int c = fc(cfa, rr, cc), indx = rr * ts + cc; cc < cc1 - 8; cc += 2, indx += 2) { float grbdiffold = rgb[1][indx] - rgb[c][indx >> 1]; //interpolate colour difference from optical R/B locations to grid locations @@ -1209,9 +1217,9 @@ float* RawImageSource::CA_correct_RT( // copy CA corrected results to temporary image matrix for (int rr = border; rr < rr1 - border; rr++) { - int c = FC(rr + top, left + border + (FC(rr + top, 2) & 1)); + int c = fc(cfa, rr + top, left + border + (fc(cfa, rr + top, 2) & 1)); int row = rr + top; - int cc = border + (FC(rr, 2) & 1); + int cc = border + (fc(cfa, rr, 2) & 1); int indx = (row * width + cc + left) >> 1; int indx1 = (rr * ts + cc) >> 1; #ifdef __SSE2__ @@ -1246,7 +1254,7 @@ float* RawImageSource::CA_correct_RT( #endif for (int row = cb; row < height - cb; row++) { - int col = cb + (FC(row, 0) & 1); + int col = cb + (fc(cfa, row, 0) & 1); int indx = (row * width + col) >> 1; #ifdef __SSE2__ for (; col < width - 7 - cb; col += 8, indx += 4) { @@ -1281,8 +1289,8 @@ float* RawImageSource::CA_correct_RT( #pragma omp for #endif for (int i = 0; i < H - 2 * cb; ++i) { - const int firstCol = FC(i, 0) & 1; - const int colour = FC(i, firstCol); + const int firstCol = fc(cfa, i, 0) & 1; + const int colour = fc(cfa, i, firstCol); const array2D* nonGreen = colour == 0 ? redFactor : blueFactor; int j = firstCol; #ifdef __SSE2__ @@ -1314,9 +1322,9 @@ float* RawImageSource::CA_correct_RT( if (W % 2) { // odd width => factors for one channel are not set in last column => use value of preceding column - const int ngRow = 1 - (FC(0, 0) & 1); - const int ngCol = FC(ngRow, 0) & 1; - const int colour = FC(ngRow, ngCol); + const int ngRow = 1 - (fc(cfa, 0, 0) & 1); + const int ngCol = fc(cfa, ngRow, 0) & 1; + const int colour = fc(cfa, ngRow, ngCol); const array2D* nonGreen = colour == 0 ? redFactor : blueFactor; for (int i = 0; i < (H + 1 - 2 * cb) / 2; ++i) { (*nonGreen)[i][(W - 2 * cb + 1) / 2 - 1] = (*nonGreen)[i][(W - 2* cb + 1) / 2 - 2]; @@ -1333,8 +1341,8 @@ float* RawImageSource::CA_correct_RT( #pragma omp for #endif for (int i = 0; i < H - 2 * cb; ++i) { - const int firstCol = FC(i, 0) & 1; - const int colour = FC(i, firstCol); + const int firstCol = fc(cfa, i, 0) & 1; + const int colour = fc(cfa, i, firstCol); const array2D* nonGreen = colour == 0 ? redFactor : blueFactor; for (int j = firstCol; j < W - 2 * cb; j += 2) { rawData[i + cb][j + cb] *= (*nonGreen)[i / 2][j / 2]; diff --git a/rtengine/ahd_demosaic_RT.cc b/rtengine/ahd_demosaic_RT.cc index 88ab0bf56..064dfd6e1 100644 --- a/rtengine/ahd_demosaic_RT.cc +++ b/rtengine/ahd_demosaic_RT.cc @@ -32,6 +32,12 @@ //#define BENCHMARK #include "StopWatch.h" +namespace +{ +unsigned fc(const unsigned int cfa[2][2], int r, int c) { + return cfa[r & 1][c & 1]; +} +} namespace rtengine { #define TS 144 @@ -39,6 +45,7 @@ void RawImageSource::ahd_demosaic() { BENCHFUN + const unsigned int cfa[2][2] = {{FC(0,0), FC(0,1)}, {FC(1,0), FC(1,1)}}; constexpr int dirs[4] = { -1, 1, -TS, TS }; float xyz_cam[3][3]; LUTf cbrt(65536); @@ -73,7 +80,7 @@ void RawImageSource::ahd_demosaic() } } } - border_interpolate2(W, H, 5, rawData, red, green, blue); + border_interpolate(W, H, 5, rawData, red, green, blue); #ifdef _OPENMP @@ -93,7 +100,7 @@ void RawImageSource::ahd_demosaic() for (int left = 2; left < width - 5; left += TS - 6) { // Interpolate green horizontally and vertically: for (int row = top; row < top + TS && row < height - 2; row++) { - for (int col = left + (FC(row, left) & 1); col < std::min(left + TS, width - 2); col += 2) { + for (int col = left + (fc(cfa, row, left) & 1); col < std::min(left + TS, width - 2); col += 2) { auto pix = &rawData[row][col]; float val0 = 0.25f * ((pix[-1] + pix[0] + pix[1]) * 2 - pix[-2] - pix[2]) ; @@ -107,12 +114,12 @@ void RawImageSource::ahd_demosaic() // Interpolate red and blue, and convert to CIELab: for (int d = 0; d < 2; d++) for (int row = top + 1; row < top + TS - 1 && row < height - 3; row++) { - int cng = FC(row + 1, FC(row + 1, 0) & 1); + int cng = fc(cfa, row + 1, fc(cfa, row + 1, 0) & 1); for (int col = left + 1; col < std::min(left + TS - 1, width - 3); col++) { auto pix = &rawData[row][col]; auto rix = &rgb[d][row - top][col - left]; auto lix = lab[d][row - top][col - left]; - if (FC(row, col) == 1) { + if (fc(cfa, row, col) == 1) { rix[0][2 - cng] = CLIP(pix[0] + (0.5f * (pix[-1] + pix[1] - rix[-1][1] - rix[1][1] ) )); rix[0][cng] = CLIP(pix[0] + (0.5f * (pix[-width] + pix[width] diff --git a/rtengine/amaze_demosaic_RT.cc b/rtengine/amaze_demosaic_RT.cc index 11ff1f5a0..24c463458 100644 --- a/rtengine/amaze_demosaic_RT.cc +++ b/rtengine/amaze_demosaic_RT.cc @@ -35,6 +35,13 @@ #include "median.h" #include "StopWatch.h" +namespace +{ +unsigned fc(const unsigned int cfa[2][2], int r, int c) { + return cfa[r & 1][c & 1]; +} +} + namespace rtengine { @@ -55,6 +62,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c plistener->setProgress(progress); } + const unsigned int cfarray[2][2] = {{FC(0,0), FC(0,1)}, {FC(1,0), FC(1,1)}}; const int width = winw, height = winh; const float clip_pt = 1.0 / initialGain; const float clip_pt8 = 0.8 / initialGain; @@ -73,8 +81,8 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c int ex, ey; //determine GRBG coset; (ey,ex) is the offset of the R subarray - if (FC(0, 0) == 1) { //first pixel is G - if (FC(0, 1) == 0) { + if (fc(cfarray, 0, 0) == 1) { //first pixel is G + if (fc(cfarray, 0, 1) == 0) { ey = 0; ex = 1; } else { @@ -82,7 +90,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c ex = 0; } } else {//first pixel is R or B - if (FC(0, 0) == 0) { + if (fc(cfarray, 0, 0) == 0) { ey = 0; ex = 0; } else { @@ -372,7 +380,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c #ifdef __SSE2__ vfloat sgnv; - if( !(FC(4, 4) & 1) ) { + if( !(fc(cfarray, 4, 4) & 1) ) { sgnv = _mm_set_ps( 1.f, -1.f, 1.f, -1.f ); } else { sgnv = _mm_set_ps( -1.f, 1.f, -1.f, 1.f ); @@ -439,7 +447,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c #else for (int rr = 4; rr < rr1 - 4; rr++) { - bool fcswitch = FC(rr, 4) & 1; + bool fcswitch = fc(cfarray, rr, 4) & 1; for (int cc = 4, indx = rr * ts + cc; cc < cc1 - 4; cc++, indx++) { @@ -531,7 +539,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c vfloat clip_ptv = F2V( clip_pt ); vfloat sgn3v; - if( !(FC(4, 4) & 1) ) { + if( !(fc(cfarray, 4, 4) & 1) ) { sgnv = _mm_set_ps( 1.f, -1.f, 1.f, -1.f ); } else { sgnv = _mm_set_ps( -1.f, 1.f, -1.f, 1.f ); @@ -589,7 +597,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c #else for (int rr = 4; rr < rr1 - 4; rr++) { - for (int cc = 4, indx = rr * ts + cc, c = FC(rr, cc) & 1; cc < cc1 - 4; cc++, indx++) { + for (int cc = 4, indx = rr * ts + cc, c = fc(cfarray, rr, cc) & 1; cc < cc1 - 4; cc++, indx++) { float hcdvar = 3.f * (SQR(hcd[indx - 2]) + SQR(hcd[indx]) + SQR(hcd[indx + 2])) - SQR(hcd[indx - 2] + hcd[indx] + hcd[indx + 2]); float hcdaltvar = 3.f * (SQR(hcdalt[indx - 2]) + SQR(hcdalt[indx]) + SQR(hcdalt[indx + 2])) - SQR(hcdalt[indx - 2] + hcdalt[indx] + hcdalt[indx + 2]); float vcdvar = 3.f * (SQR(vcd[indx - v2]) + SQR(vcd[indx]) + SQR(vcd[indx + v2])) - SQR(vcd[indx - v2] + vcd[indx] + vcd[indx + v2]); @@ -685,7 +693,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c vfloat epssqv = F2V( epssq ); for (int rr = 6; rr < rr1 - 6; rr++) { - for (int indx = rr * ts + 6 + (FC(rr, 2) & 1); indx < rr * ts + cc1 - 6; indx += 8) { + for (int indx = rr * ts + 6 + (fc(cfarray, rr, 2) & 1); indx < rr * ts + cc1 - 6; indx += 8) { //compute colour difference variances in cardinal directions vfloat tempv = LC2VFU(vcd[indx]); vfloat uavev = tempv + LC2VFU(vcd[indx - v1]) + LC2VFU(vcd[indx - v2]) + LC2VFU(vcd[indx - v3]); @@ -731,7 +739,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c #else for (int rr = 6; rr < rr1 - 6; rr++) { - for (int cc = 6 + (FC(rr, 2) & 1), indx = rr * ts + cc; cc < cc1 - 6; cc += 2, indx += 2) { + for (int cc = 6 + (fc(cfarray, rr, 2) & 1), indx = rr * ts + cc; cc < cc1 - 6; cc += 2, indx += 2) { //compute colour difference variances in cardinal directions @@ -793,7 +801,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c // precompute nyquist for (int rr = 6; rr < rr1 - 6; rr++) { - int cc = 6 + (FC(rr, 2) & 1); + int cc = 6 + (fc(cfarray, rr, 2) & 1); int indx = rr * ts + cc; #ifdef __SSE2__ @@ -856,7 +864,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c int nyendcol = 0; for (int rr = 6; rr < rr1 - 6; rr++) { - for (int cc = 6 + (FC(rr, 2) & 1), indx = rr * ts + cc; cc < cc1 - 6; cc += 2, indx += 2) { + for (int cc = 6 + (fc(cfarray, rr, 2) & 1), indx = rr * ts + cc; cc < cc1 - 6; cc += 2, indx += 2) { //nyquist texture test: ask if difference of vcd compared to hcd is larger or smaller than RGGB gradients if(nyqutest[indx >> 1] > 0.f) { @@ -907,7 +915,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c #else - for (int indx = rr * ts + nystartcol + (FC(rr, 2) & 1); indx < rr * ts + nyendcol; indx += 2) { + for (int indx = rr * ts + nystartcol + (fc(cfarray, rr, 2) & 1); indx < rr * ts + nyendcol; indx += 2) { unsigned int nyquisttemp = (nyquist[(indx - v2) >> 1] + nyquist[(indx - m1) >> 1] + nyquist[(indx + p1) >> 1] + nyquist[(indx - 2) >> 1] + nyquist[(indx + 2) >> 1] + nyquist[(indx - p1) >> 1] + nyquist[(indx + m1) >> 1] + nyquist[(indx + v2) >> 1]); @@ -922,7 +930,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c // in areas of Nyquist texture, do area interpolation for (int rr = nystartrow; rr < nyendrow; rr++) - for (int indx = rr * ts + nystartcol + (FC(rr, 2) & 1); indx < rr * ts + nyendcol; indx += 2) { + for (int indx = rr * ts + nystartcol + (fc(cfarray, rr, 2) & 1); indx < rr * ts + nyendcol; indx += 2) { if (nyquist2[indx >> 1]) { // area interpolation @@ -962,7 +970,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c //populate G at R/B sites for (int rr = 8; rr < rr1 - 8; rr++) - for (int indx = rr * ts + 8 + (FC(rr, 2) & 1); indx < rr * ts + cc1 - 8; indx += 2) { + for (int indx = rr * ts + 8 + (fc(cfarray, rr, 2) & 1); indx < rr * ts + cc1 - 8; indx += 2) { //first ask if one gets more directional discrimination from nearby B/R sites float hvwtalt = xdivf(hvwt[(indx - m1) >> 1] + hvwt[(indx + p1) >> 1] + hvwt[(indx - p1) >> 1] + hvwt[(indx + m1) >> 1], 2); @@ -985,7 +993,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c // refine Nyquist areas using G curvatures if(doNyquist) { for (int rr = nystartrow; rr < nyendrow; rr++) - for (int indx = rr * ts + nystartcol + (FC(rr, 2) & 1); indx < rr * ts + nyendcol; indx += 2) { + for (int indx = rr * ts + nystartcol + (fc(cfarray, rr, 2) & 1); indx < rr * ts + nyendcol; indx += 2) { if (nyquist2[indx >> 1]) { //local averages (over Nyquist pixels only) of G curvature squared @@ -1008,7 +1016,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c #ifdef __SSE2__ for (int rr = 6; rr < rr1 - 6; rr++) { - if((FC(rr, 2) & 1) == 0) { + if((fc(cfarray, rr, 2) & 1) == 0) { for (int cc = 6, indx = rr * ts + cc; cc < cc1 - 6; cc += 8, indx += 8) { vfloat tempv = LC2VFU(cfa[indx + 1]); vfloat Dgrbsq1pv = (SQRV(tempv - LC2VFU(cfa[indx + 1 - p1])) + SQRV(tempv - LC2VFU(cfa[indx + 1 + p1]))); @@ -1034,7 +1042,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c #else for (int rr = 6; rr < rr1 - 6; rr++) { - if((FC(rr, 2) & 1) == 0) { + if((fc(cfarray, rr, 2) & 1) == 0) { for (int cc = 6, indx = rr * ts + cc; cc < cc1 - 6; cc += 2, indx += 2) { delp[indx >> 1] = fabsf(cfa[indx + p1] - cfa[indx - p1]); delm[indx >> 1] = fabsf(cfa[indx + m1] - cfa[indx - m1]); @@ -1063,7 +1071,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c for (int rr = 8; rr < rr1 - 8; rr++) { #ifdef __SSE2__ - for (int indx = rr * ts + 8 + (FC(rr, 2) & 1), indx1 = indx >> 1; indx < rr * ts + cc1 - 8; indx += 8, indx1 += 4) { + for (int indx = rr * ts + 8 + (fc(cfarray, rr, 2) & 1), indx1 = indx >> 1; indx < rr * ts + cc1 - 8; indx += 8, indx1 += 4) { //diagonal colour ratios vfloat cfav = LC2VFU(cfa[indx]); @@ -1128,7 +1136,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c #else - for (int cc = 8 + (FC(rr, 2) & 1), indx = rr * ts + cc, indx1 = indx >> 1; cc < cc1 - 8; cc += 2, indx += 2, indx1++) { + for (int cc = 8 + (fc(cfarray, rr, 2) & 1), indx = rr * ts + cc, indx1 = indx >> 1; cc < cc1 - 8; cc += 2, indx += 2, indx1++) { //diagonal colour ratios float crse = xmul2f(cfa[indx + m1]) / (eps + cfa[indx] + (cfa[indx + m2])); @@ -1218,7 +1226,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c for (int rr = 10; rr < rr1 - 10; rr++) #ifdef __SSE2__ - for (int indx = rr * ts + 10 + (FC(rr, 2) & 1), indx1 = indx >> 1; indx < rr * ts + cc1 - 10; indx += 8, indx1 += 4) { + for (int indx = rr * ts + 10 + (fc(cfarray, rr, 2) & 1), indx1 = indx >> 1; indx < rr * ts + cc1 - 10; indx += 8, indx1 += 4) { //first ask if one gets more directional discrimination from nearby B/R sites vfloat pmwtaltv = zd25v * (LVFU(pmwt[(indx - m1) >> 1]) + LVFU(pmwt[(indx + p1) >> 1]) + LVFU(pmwt[(indx - p1) >> 1]) + LVFU(pmwt[(indx + m1) >> 1])); @@ -1230,7 +1238,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c #else - for (int cc = 10 + (FC(rr, 2) & 1), indx = rr * ts + cc, indx1 = indx >> 1; cc < cc1 - 10; cc += 2, indx += 2, indx1++) { + for (int cc = 10 + (fc(cfarray, rr, 2) & 1), indx = rr * ts + cc, indx1 = indx >> 1; cc < cc1 - 10; cc += 2, indx += 2, indx1++) { //first ask if one gets more directional discrimination from nearby B/R sites float pmwtalt = xdivf(pmwt[(indx - m1) >> 1] + pmwt[(indx + p1) >> 1] + pmwt[(indx - p1) >> 1] + pmwt[(indx + m1) >> 1], 2); @@ -1246,7 +1254,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c for (int rr = 12; rr < rr1 - 12; rr++) #ifdef __SSE2__ - for (int indx = rr * ts + 12 + (FC(rr, 2) & 1), indx1 = indx >> 1; indx < rr * ts + cc1 - 12; indx += 8, indx1 += 4) { + for (int indx = rr * ts + 12 + (fc(cfarray, rr, 2) & 1), indx1 = indx >> 1; indx < rr * ts + cc1 - 12; indx += 8, indx1 += 4) { vmask copymask = vmaskf_ge(vabsf(zd5v - LVFU(pmwt[indx1])), vabsf(zd5v - LVFU(hvwt[indx1]))); if(_mm_movemask_ps((vfloat)copymask)) { // if for any of the 4 pixels the condition is true, do the maths for all 4 pixels and mask the unused out at the end @@ -1301,7 +1309,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c #else - for (int cc = 12 + (FC(rr, 2) & 1), indx = rr * ts + cc, indx1 = indx >> 1; cc < cc1 - 12; cc += 2, indx += 2, indx1++) { + for (int cc = 12 + (fc(cfarray, rr, 2) & 1), indx = rr * ts + cc, indx1 = indx >> 1; cc < cc1 - 12; cc += 2, indx += 2, indx1++) { if (fabsf(0.5f - pmwt[indx >> 1]) < fabsf(0.5f - hvwt[indx >> 1]) ) { continue; @@ -1399,7 +1407,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c for (int rr = 14; rr < rr1 - 14; rr++) #ifdef __SSE2__ - for (int cc = 14 + (FC(rr, 2) & 1), indx = rr * ts + cc, c = 1 - FC(rr, cc) / 2; cc < cc1 - 14; cc += 8, indx += 8) { + for (int cc = 14 + (fc(cfarray, rr, 2) & 1), indx = rr * ts + cc, c = 1 - fc(cfarray, rr, cc) / 2; cc < cc1 - 14; cc += 8, indx += 8) { vfloat tempv = epsv + vabsf(LVFU(Dgrb[c][(indx - m1) >> 1]) - LVFU(Dgrb[c][(indx + m1) >> 1])); vfloat temp2v = epsv + vabsf(LVFU(Dgrb[c][(indx + p1) >> 1]) - LVFU(Dgrb[c][(indx - p1) >> 1])); vfloat wtnwv = onev / (tempv + vabsf(LVFU(Dgrb[c][(indx - m1) >> 1]) - LVFU(Dgrb[c][(indx - m3) >> 1])) + vabsf(LVFU(Dgrb[c][(indx + m1) >> 1]) - LVFU(Dgrb[c][(indx - m3) >> 1]))); @@ -1415,7 +1423,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c #else - for (int cc = 14 + (FC(rr, 2) & 1), indx = rr * ts + cc, c = 1 - FC(rr, cc) / 2; cc < cc1 - 14; cc += 2, indx += 2) { + for (int cc = 14 + (fc(cfarray, rr, 2) & 1), indx = rr * ts + cc, c = 1 - fc(cfarray, rr, cc) / 2; cc < cc1 - 14; cc += 2, indx += 2) { float wtnw = 1.f / (eps + fabsf(Dgrb[c][(indx - m1) >> 1] - Dgrb[c][(indx + m1) >> 1]) + fabsf(Dgrb[c][(indx - m1) >> 1] - Dgrb[c][(indx - m3) >> 1]) + fabsf(Dgrb[c][(indx + m1) >> 1] - Dgrb[c][(indx - m3) >> 1])); float wtne = 1.f / (eps + fabsf(Dgrb[c][(indx + p1) >> 1] - Dgrb[c][(indx - p1) >> 1]) + fabsf(Dgrb[c][(indx + p1) >> 1] - Dgrb[c][(indx + p3) >> 1]) + fabsf(Dgrb[c][(indx - p1) >> 1] - Dgrb[c][(indx + p3) >> 1])); float wtsw = 1.f / (eps + fabsf(Dgrb[c][(indx - p1) >> 1] - Dgrb[c][(indx + p1) >> 1]) + fabsf(Dgrb[c][(indx - p1) >> 1] - Dgrb[c][(indx + m3) >> 1]) + fabsf(Dgrb[c][(indx + p1) >> 1] - Dgrb[c][(indx - p3) >> 1])); @@ -1434,7 +1442,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c vfloat twov = F2V(2.f); vmask selmask; - if((FC(16, 2) & 1) == 1) { + if((fc(cfarray, 16, 2) & 1) == 1) { selmask = _mm_set_epi32(0xffffffff, 0, 0xffffffff, 0); offset = 1; } else { @@ -1509,7 +1517,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c #else - if((FC(rr, 2) & 1) == 1) { + if((fc(cfarray, rr, 2) & 1) == 1) { for (; indx < rr * ts + cc1 - 16 - (cc1 & 1); indx++, col++) { float temp = 1.f / (hvwt[(indx - v1) >> 1] + 2.f - hvwt[(indx + 1) >> 1] - hvwt[(indx - 1) >> 1] + hvwt[(indx + v1) >> 1]); red[row][col] = 65535.f * (rgbgreen[indx] - ((hvwt[(indx - v1) >> 1]) * Dgrb[0][(indx - v1) >> 1] + (1.f - hvwt[(indx + 1) >> 1]) * Dgrb[0][(indx + 1) >> 1] + (1.f - hvwt[(indx - 1) >> 1]) * Dgrb[0][(indx - 1) >> 1] + (hvwt[(indx + v1) >> 1]) * Dgrb[0][(indx + v1) >> 1]) * @@ -1591,7 +1599,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c free(buffer); } if(border < 4) { - border_interpolate2(W, H, 3, rawData, red, green, blue); + border_interpolate(W, H, 3, rawData, red, green, blue); } if(plistener) { diff --git a/rtengine/badpixels.cc b/rtengine/badpixels.cc index 5f519f7c2..2710cb28d 100644 --- a/rtengine/badpixels.cc +++ b/rtengine/badpixels.cc @@ -23,6 +23,13 @@ #include "rawimage.h" #include "rawimagesource.h" +namespace +{ +unsigned fc(const unsigned int cfa[2][2], int r, int c) { + return cfa[r & 1][c & 1]; +} +} + namespace rtengine { @@ -31,6 +38,7 @@ namespace rtengine */ int RawImageSource::interpolateBadPixelsBayer(const PixelsMap &bitmapBads, array2D &rawData) { + const unsigned int cfarray[2][2] = {{FC(0,0), FC(0,1)}, {FC(1,0), FC(1,1)}}; constexpr float eps = 1.f; int counter = 0; @@ -54,7 +62,7 @@ int RawImageSource::interpolateBadPixelsBayer(const PixelsMap &bitmapBads, array float wtdsum = 0.f, norm = 0.f; // diagonal interpolation - if (FC(row, col) == 1) { + if (fc(cfarray, row, col) == 1) { // green channel. We can use closer pixels than for red or blue channel. Distance to center pixel is sqrt(2) => weighting is 0.70710678 // For green channel following pixels will be used for interpolation. Pixel to be interpolated is in center. // 1 means that pixel is used in this step, if itself and his counterpart are not marked bad diff --git a/rtengine/demosaic_algos.cc b/rtengine/demosaic_algos.cc index 45779fc9c..d547d3431 100644 --- a/rtengine/demosaic_algos.cc +++ b/rtengine/demosaic_algos.cc @@ -55,158 +55,7 @@ namespace rtengine #define FORCC for (unsigned int c=0; c < colors; c++) -/* - Patterned Pixel Grouping Interpolation by Alain Desbiolles -*/ -void RawImageSource::ppg_demosaic() -{ - int width = W, height = H; - int dir[5] = { 1, width, -1, -width, 1 }; - int row, col, diff[2] = {}, guess[2], c, d, i; - float (*pix)[4]; - - float (*image)[4]; - - if (plistener) { - // looks like ppg isn't supported anymore - //plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::ppg))); - plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), M("GENERAL_NA"))); - plistener->setProgress (0.0); - } - - image = (float (*)[4]) calloc (static_cast(H) * W, sizeof * image); - - for (int ii = 0; ii < H; ii++) - for (int jj = 0; jj < W; jj++) { - image[ii * W + jj][fc(ii, jj)] = rawData[ii][jj]; - } - - border_interpolate(3, image); - - /* Fill in the green layer with gradients and pattern recognition: */ - for (row = 3; row < height - 3; row++) { - for (col = 3 + (FC(row, 3) & 1), c = FC(row, col); col < width - 3; col += 2) { - pix = image + row * width + col; - - for (i = 0; (d = dir[i]) > 0; i++) { - guess[i] = (pix[-d][1] + pix[0][c] + pix[d][1]) * 2 - - pix[-2 * d][c] - pix[2 * d][c]; - diff[i] = ( ABS(pix[-2 * d][c] - pix[ 0][c]) + - ABS(pix[ 2 * d][c] - pix[ 0][c]) + - ABS(pix[ -d][1] - pix[ d][1]) ) * 3 + - ( ABS(pix[ 3 * d][1] - pix[ d][1]) + - ABS(pix[-3 * d][1] - pix[-d][1]) ) * 2; - } - - d = dir[i = diff[0] > diff[1]]; - pix[0][1] = median(static_cast(guess[i] >> 2), pix[d][1], pix[-d][1]); - } - - if(plistener) { - plistener->setProgress(0.33 * row / (height - 3)); - } - } - - /* Calculate red and blue for each green pixel: */ - for (row = 1; row < height - 1; row++) { - for (col = 1 + (FC(row, 2) & 1), c = FC(row, col + 1); col < width - 1; col += 2) { - pix = image + row * width + col; - - for (i = 0; (d = dir[i]) > 0; c = 2 - c, i++) - pix[0][c] = CLIP(0.5 * (pix[-d][c] + pix[d][c] + 2 * pix[0][1] - - pix[-d][1] - pix[d][1]) ); - } - - if(plistener) { - plistener->setProgress(0.33 + 0.33 * row / (height - 1)); - } - } - - /* Calculate blue for red pixels and vice versa: */ - for (row = 1; row < height - 1; row++) { - for (col = 1 + (FC(row, 1) & 1), c = 2 - FC(row, col); col < width - 1; col += 2) { - pix = image + row * width + col; - - for (i = 0; (d = dir[i] + dir[i + 1]) > 0; i++) { - diff[i] = ABS(pix[-d][c] - pix[d][c]) + - ABS(pix[-d][1] - pix[0][1]) + - ABS(pix[ d][1] - pix[0][1]); - guess[i] = pix[-d][c] + pix[d][c] + 2 * pix[0][1] - - pix[-d][1] - pix[d][1]; - } - - if (diff[0] != diff[1]) { - pix[0][c] = CLIP(guess[diff[0] > diff[1]] / 2); - } else { - pix[0][c] = CLIP((guess[0] + guess[1]) / 4); - } - } - - if(plistener) { - plistener->setProgress(0.67 + 0.33 * row / (height - 1)); - } - } - - red(W, H); - - for (int i = 0; i < H; i++) - for (int j = 0; j < W; j++) { - red[i][j] = image[i * W + j][0]; - } - - green(W, H); - - for (int i = 0; i < H; i++) - for (int j = 0; j < W; j++) { - green[i][j] = image[i * W + j][1]; - } - - blue(W, H); - - for (int i = 0; i < H; i++) - for (int j = 0; j < W; j++) { - blue[i][j] = image[i * W + j][2]; - } - - free (image); -} - -void RawImageSource::border_interpolate(unsigned int border, float (*image)[4], unsigned int start, unsigned int end) -{ - unsigned row, col, y, x, f; - float sum[8]; - unsigned int width = W, height = H; - unsigned int colors = 3; - - if (end == 0 ) { - end = H; - } - - for (row = start; row < end; row++) - for (col = 0; col < width; col++) { - if (col == border && row >= border && row < height - border) { - col = width - border; - } - - memset (sum, 0, sizeof sum); - - for (y = row - 1; y != row + 2; y++) - for (x = col - 1; x != col + 2; x++) - if (y < height && x < width) { - f = fc(y, x); - sum[f] += image[y * width + x][f]; - sum[f + 4]++; - } - - f = fc(row, col); - - FORCC if (c != f && sum[c + 4]) { - image[row * width + col][c] = sum[c] / sum[c + 4]; - } - } -} - -void RawImageSource::border_interpolate2( int winw, int winh, int lborders, const array2D &rawData, array2D &red, array2D &green, array2D &blue) +void RawImageSource::border_interpolate( int winw, int winh, int lborders, const array2D &rawData, array2D &red, array2D &green, array2D &blue) { int bord = lborders; int width = winw; @@ -361,129 +210,6 @@ void RawImageSource::border_interpolate2( int winw, int winh, int lborders, cons } -// Joint Demosaicing and Denoising using High Order Interpolation Techniques -// Revision 0.9.1a - 09/02/2010 - Contact info: luis.sanz.rodriguez@gmail.com -// Copyright Luis Sanz Rodriguez 2010 -// Adapted to RawTherapee by Jacques Desmis 3/2013 - -void RawImageSource::jdl_interpolate_omp() // from "Lassus" -{ - int width = W, height = H; - int row, col, c, d, i, u = width, v = 2 * u, w = 3 * u, x = 4 * u, y = 5 * u, z = 6 * u, indx, (*dif)[2], (*chr)[2]; - float f[4], g[4]; - float (*image)[4]; - image = (float (*)[4]) calloc (static_cast(width) * height, sizeof * image); - dif = (int (*)[2]) calloc(static_cast(width) * height, sizeof * dif); - chr = (int (*)[2]) calloc(static_cast(width) * height, sizeof * chr); - - if (plistener) { - // this function seems to be unused - //plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::jdl))); - plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), M("GENERAL_NA"))); - plistener->setProgress (0.0); - } - -#ifdef _OPENMP - #pragma omp parallel shared(image,width,height,u,w,v,y,x,z,dif,chr) private(row,col,f,g,indx,c,d,i) -#endif - { -#ifdef _OPENMP - #pragma omp for -#endif - - for (int ii = 0; ii < height; ii++) - for (int jj = 0; jj < width; jj++) { - image[ii * width + jj][fc(ii, jj)] = rawData[ii][jj]; - } - - border_interpolate(6, image); - -#ifdef _OPENMP - #pragma omp for -#endif - - for (row = 5; row < height - 5; row++) - for (col = 5 + (FC(row, 1) & 1), indx = row * width + col, c = FC(row, col); col < u - 5; col += 2, indx += 2) { - f[0] = 1.f + abs(image[indx - u][1] - image[indx - w][1]) + abs(image[indx - u][1] - image[indx + u][1]) + abs(image[indx][c] - image[indx - v][c]) + abs(image[indx - v][c] - image[indx - x][c]); - f[1] = 1.f + abs(image[indx + 1][1] - image[indx + 3][1]) + abs(image[indx + 1][1] - image[indx - 1][1]) + abs(image[indx][c] - image[indx + 2][c]) + abs(image[indx + 2][c] - image[indx + 4][c]); - f[2] = 1.f + abs(image[indx - 1][1] - image[indx - 3][1]) + abs(image[indx - 1][1] - image[indx + 1][1]) + abs(image[indx][c] - image[indx - 2][c]) + abs(image[indx - 2][c] - image[indx - 4][c]); - f[3] = 1.f + abs(image[indx + u][1] - image[indx + w][1]) + abs(image[indx + u][1] - image[indx - u][1]) + abs(image[indx][c] - image[indx + v][c]) + abs(image[indx + v][c] - image[indx + x][c]); - g[0] = CLIP((22.f * image[indx - u][1] + 22.f * image[indx - w][1] + 2.f * image[indx - y][1] + 2.f * image[indx + u][1] + 40.f * image[indx][c] - 32.f * image[indx - v][c] - 8.f * image[indx - x][c]) / 48.f); - g[1] = CLIP((22.f * image[indx + 1][1] + 22.f * image[indx + 3][1] + 2.f * image[indx + 5][1] + 2.f * image[indx - 1][1] + 40.f * image[indx][c] - 32.f * image[indx + 2][c] - 8.f * image[indx + 4][c]) / 48.f); - g[2] = CLIP((22.f * image[indx - 1][1] + 22.f * image[indx - 3][1] + 2.f * image[indx - 5][1] + 2.f * image[indx + 1][1] + 40.f * image[indx][c] - 32.f * image[indx - 2][c] - 8.f * image[indx - 4][c]) / 48.f); - g[3] = CLIP((22.f * image[indx + u][1] + 22.f * image[indx + w][1] + 2.f * image[indx + y][1] + 2.f * image[indx - u][1] + 40.f * image[indx][c] - 32.f * image[indx + v][c] - 8.f * image[indx + x][c]) / 48.f); - dif[indx][0] = CLIP((f[3] * g[0] + f[0] * g[3]) / (f[0] + f[3])) - image[indx][c]; - dif[indx][1] = CLIP((f[2] * g[1] + f[1] * g[2]) / (f[1] + f[2])) - image[indx][c]; - } - -#ifdef _OPENMP - #pragma omp for -#endif - - for (row = 6; row < height - 6; row++) - for (col = 6 + (FC(row, 2) & 1), indx = row * width + col, c = FC(row, col) / 2; col < u - 6; col += 2, indx += 2) { - f[0] = 1.f + 78.f * SQR((float)dif[indx][0]) + 69.f * (SQR((float) dif[indx - v][0]) + SQR((float)dif[indx + v][0])) + 51.f * (SQR((float)dif[indx - x][0]) + SQR((float)dif[indx + x][0])) + 21.f * (SQR((float)dif[indx - z][0]) + SQR((float)dif[indx + z][0])) - 6.f * SQR((float)dif[indx - v][0] + dif[indx][0] + dif[indx + v][0]) - 10.f * (SQR((float)dif[indx - x][0] + dif[indx - v][0] + dif[indx][0]) + SQR((float)dif[indx][0] + dif[indx + v][0] + dif[indx + x][0])) - 7.f * (SQR((float)dif[indx - z][0] + dif[indx - x][0] + dif[indx - v][0]) + SQR((float)dif[indx + v][0] + dif[indx + x][0] + dif[indx + z][0])); - f[1] = 1.f + 78.f * SQR((float)dif[indx][1]) + 69.f * (SQR((float)dif[indx - 2][1]) + SQR((float)dif[indx + 2][1])) + 51.f * (SQR((float)dif[indx - 4][1]) + SQR((float)dif[indx + 4][1])) + 21.f * (SQR((float)dif[indx - 6][1]) + SQR((float)dif[indx + 6][1])) - 6.f * SQR((float)dif[indx - 2][1] + dif[indx][1] + dif[indx + 2][1]) - 10.f * (SQR((float)dif[indx - 4][1] + dif[indx - 2][1] + dif[indx][1]) + SQR((float)dif[indx][1] + dif[indx + 2][1] + dif[indx + 4][1])) - 7.f * (SQR((float)dif[indx - 6][1] + dif[indx - 4][1] + dif[indx - 2][1]) + SQR((float)dif[indx + 2][1] + dif[indx + 4][1] + dif[indx + 6][1])); - g[0] = median(0.725f * dif[indx][0] + 0.1375f * dif[indx - v][0] + 0.1375f * dif[indx + v][0], static_cast(dif[indx - v][0]), static_cast(dif[indx + v][0])); - g[1] = median(0.725f * dif[indx][1] + 0.1375f * dif[indx - 2][1] + 0.1375f * dif[indx + 2][1], static_cast(dif[indx - 2][1]), static_cast(dif[indx + 2][1])); - chr[indx][c] = (f[1] * g[0] + f[0] * g[1]) / (f[0] + f[1]); - } - -#ifdef _OPENMP - #pragma omp for -#endif - - for (row = 6; row < height - 6; row++) - for (col = 6 + (FC(row, 2) & 1), indx = row * width + col, c = 1 - FC(row, col) / 2, d = 2 * c; col < u - 6; col += 2, indx += 2) { - f[0] = 1.f / (float)(1.f + fabs((float)chr[indx - u - 1][c] - chr[indx + u + 1][c]) + fabs((float)chr[indx - u - 1][c] - chr[indx - w - 3][c]) + fabs((float)chr[indx + u + 1][c] - chr[indx - w - 3][c])); - f[1] = 1.f / (float)(1.f + fabs((float)chr[indx - u + 1][c] - chr[indx + u - 1][c]) + fabs((float)chr[indx - u + 1][c] - chr[indx - w + 3][c]) + fabs((float)chr[indx + u - 1][c] - chr[indx - w + 3][c])); - f[2] = 1.f / (float)(1.f + fabs((float)chr[indx + u - 1][c] - chr[indx - u + 1][c]) + fabs((float)chr[indx + u - 1][c] - chr[indx + w + 3][c]) + fabs((float)chr[indx - u + 1][c] - chr[indx + w - 3][c])); - f[3] = 1.f / (float)(1.f + fabs((float)chr[indx + u + 1][c] - chr[indx - u - 1][c]) + fabs((float)chr[indx + u + 1][c] - chr[indx + w - 3][c]) + fabs((float)chr[indx - u - 1][c] - chr[indx + w + 3][c])); - g[0] = median(chr[indx - u - 1][c], chr[indx - w - 1][c], chr[indx - u - 3][c]); - g[1] = median(chr[indx - u + 1][c], chr[indx - w + 1][c], chr[indx - u + 3][c]); - g[2] = median(chr[indx + u - 1][c], chr[indx + w - 1][c], chr[indx + u - 3][c]); - g[3] = median(chr[indx + u + 1][c], chr[indx + w + 1][c], chr[indx + u + 3][c]); - chr[indx][c] = (f[0] * g[0] + f[1] * g[1] + f[2] * g[2] + f[3] * g[3]) / (f[0] + f[1] + f[2] + f[3]); - image[indx][1] = CLIP(image[indx][2 - d] + chr[indx][1 - c]); - image[indx][d] = CLIP(image[indx][1] - chr[indx][c]); - } - -#ifdef _OPENMP - #pragma omp for -#endif - - for (row = 6; row < height - 6; row++) - for (col = 6 + (FC(row, 1) & 1), indx = row * width + col, c = FC(row, col + 1) / 2, d = 2 * c; col < u - 6; col += 2, indx += 2) - for(i = 0; i <= 1; c = 1 - c, d = 2 * c, i++) { - f[0] = 1.f / (float)(1.f + fabs((float)chr[indx - u][c] - chr[indx + u][c]) + fabs((float)chr[indx - u][c] - chr[indx - w][c]) + fabs((float)chr[indx + u][c] - chr[indx - w][c])); - f[1] = 1.f / (float)(1.f + fabs((float)chr[indx + 1][c] - chr[indx - 1][c]) + fabs((float)chr[indx + 1][c] - chr[indx + 3][c]) + fabs((float)chr[indx - 1][c] - chr[indx + 3][c])); - f[2] = 1.f / (float)(1.f + fabs((float)chr[indx - 1][c] - chr[indx + 1][c]) + fabs((float)chr[indx - 1][c] - chr[indx - 3][c]) + fabs((float)chr[indx + 1][c] - chr[indx - 3][c])); - f[3] = 1.f / (float)(1.f + fabs((float)chr[indx + u][c] - chr[indx - u][c]) + fabs((float)chr[indx + u][c] - chr[indx + w][c]) + fabs((float)chr[indx - u][c] - chr[indx + w][c])); - g[0] = 0.875f * chr[indx - u][c] + 0.125f * chr[indx - w][c]; - g[1] = 0.875f * chr[indx + 1][c] + 0.125f * chr[indx + 3][c]; - g[2] = 0.875f * chr[indx - 1][c] + 0.125f * chr[indx - 3][c]; - g[3] = 0.875f * chr[indx + u][c] + 0.125f * chr[indx + w][c]; - image[indx][d] = CLIP(image[indx][1] - (f[0] * g[0] + f[1] * g[1] + f[2] * g[2] + f[3] * g[3]) / (f[0] + f[1] + f[2] + f[3])); - } - -#ifdef _OPENMP - #pragma omp for -#endif - - for (int ii = 0; ii < height; ii++) { - for (int jj = 0; jj < width; jj++) { - red[ii][jj] = CLIP(image[ii * width + jj][0]); - green[ii][jj] = CLIP(image[ii * width + jj][1]); - blue[ii][jj] = CLIP(image[ii * width + jj][2]); - } - } - } // End of parallelization - free (image); - free(dif); - free(chr); - //RawImageSource::refinement_lassus(); -} - // LSMME demosaicing algorithm // L. Zhang and X. Wu, // Color demozaicing via directional Linear Minimum Mean Square-error Estimation, @@ -1503,7 +1229,7 @@ void RawImageSource::igv_interpolate(int winw, int winh) } } }// End of parallelization - border_interpolate2(winw, winh, 8, rawData, red, green, blue); + border_interpolate(winw, winh, 8, rawData, red, green, blue); if (plistener) { plistener->setProgress (1.0); @@ -1560,8 +1286,6 @@ void RawImageSource::igv_interpolate(int winw, int winh) rgb[c][indx] = CLIP(rawData[row][col]); //rawData = RT data } -// border_interpolate2(7, rgb); - #ifdef _OPENMP #pragma omp single #endif @@ -1736,9 +1460,6 @@ void RawImageSource::igv_interpolate(int winw, int winh) if (plistener) { plistener->setProgress (0.91); } - - //Interpolate borders -// border_interpolate2(7, rgb); } /* #ifdef _OPENMP @@ -1766,7 +1487,7 @@ void RawImageSource::igv_interpolate(int winw, int winh) blue [row][col] = CLIP(rgb[1][indx] - 65535.f * chr[1][indx]); } }// End of parallelization - border_interpolate2(winw, winh, 8, rawData, red, green, blue); + border_interpolate(winw, winh, 8, rawData, red, green, blue); if (plistener) { @@ -2809,7 +2530,7 @@ BENCHFUN free(buffer0); } - border_interpolate2(W, H, 1, rawData, red, green, blue); + border_interpolate(W, H, 1, rawData, red, green, blue); if(plistener) { plistener->setProgress (1.0); } diff --git a/rtengine/fast_demo.cc b/rtengine/fast_demo.cc index 82176e59c..aaa5ceb02 100644 --- a/rtengine/fast_demo.cc +++ b/rtengine/fast_demo.cc @@ -30,6 +30,13 @@ using namespace std; using namespace rtengine; +namespace +{ +unsigned fc(const unsigned int cfa[2][2], int r, int c) { + return cfa[r & 1][c & 1]; +} +} + #define TS 224 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -66,6 +73,7 @@ void RawImageSource::fast_demosaic() } + const unsigned int cfarray[2][2] = {{FC(0,0), FC(0,1)}, {FC(1,0), FC(1,1)}}; const int bord = 5; float clip_pt = 4 * 65535 * initialGain; @@ -116,12 +124,12 @@ void RawImageSource::fast_demosaic() for (int i1 = imin; i1 < imax; i1++) for (int j1 = jmin; j1 < j + 2; j1++) { - int c = FC(i1, j1); + int c = fc(cfarray, i1, j1); sum[c] += rawData[i1][j1]; sum[c + 3]++; } - int c = FC(i, j); + int c = fc(cfarray, i, j); if (c == 1) { red[i][j] = sum[0] / sum[3]; @@ -149,12 +157,12 @@ void RawImageSource::fast_demosaic() for (int i1 = imin; i1 < imax; i1++) for (int j1 = j - 1; j1 < jmax; j1++) { - int c = FC(i1, j1); + int c = fc(cfarray, i1, j1); sum[c] += rawData[i1][j1]; sum[c + 3]++; } - int c = FC(i, j); + int c = fc(cfarray, i, j); if (c == 1) { red[i][j] = sum[0] / sum[3]; @@ -192,12 +200,12 @@ void RawImageSource::fast_demosaic() for (int i1 = max(0, i - 1); i1 < i + 2; i1++) for (int j1 = j - 1; j1 < j + 2; j1++) { - int c = FC(i1, j1); + int c = fc(cfarray, i1, j1); sum[c] += rawData[i1][j1]; sum[c + 3]++; } - int c = FC(i, j); + int c = fc(cfarray, i, j); if (c == 1) { red[i][j] = sum[0] / sum[3]; @@ -223,12 +231,12 @@ void RawImageSource::fast_demosaic() for (int i1 = i - 1; i1 < min(i + 2, H); i1++) for (int j1 = j - 1; j1 < j + 2; j1++) { - int c = FC(i1, j1); + int c = fc(cfarray, i1, j1); sum[c] += rawData[i1][j1]; sum[c + 3]++; } - int c = FC(i, j); + int c = fc(cfarray, i, j); if (c == 1) { red[i][j] = sum[0] / sum[3]; @@ -281,7 +289,7 @@ void RawImageSource::fast_demosaic() vmask selmask; vmask andmask = _mm_set_epi32( 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff ); - if(FC(top, left) == 1) { + if(fc(cfarray, top, left) == 1) { selmask = _mm_set_epi32( 0, 0xffffffff, 0, 0xffffffff ); } else { selmask = _mm_set_epi32( 0xffffffff, 0, 0xffffffff, 0 ); @@ -311,7 +319,7 @@ void RawImageSource::fast_demosaic() for (; j < right; j++, cc++) { - if (FC(i, j) == 1) { + if (fc(cfarray, i, j) == 1) { greentile[rr * TS + cc] = rawData[i][j]; } else { @@ -332,7 +340,7 @@ void RawImageSource::fast_demosaic() #else for (int j = left, cc = 0; j < right; j++, cc++) { - if (FC(i, j) == 1) { + if (fc(cfarray, i, j) == 1) { greentile[rr * TS + cc] = rawData[i][j]; } else { //compute directional weights using image gradients @@ -358,7 +366,7 @@ void RawImageSource::fast_demosaic() #endif for (int i = top + 1, rr = 1; i < bottom - 1; i++, rr++) { - if (FC(i, left + (FC(i, 2) & 1) + 1) == 0) + if (fc(cfarray, i, left + (fc(cfarray, i, 2) & 1) + 1) == 0) #ifdef __SSE2__ for (int j = left + 1, cc = 1; j < right - 1; j += 4, cc += 4) { //interpolate B/R colors at R/B sites @@ -368,7 +376,7 @@ void RawImageSource::fast_demosaic() #else - for (int cc = (FC(i, 2) & 1) + 1, j = left + cc; j < right - 1; j += 2, cc += 2) { + for (int cc = (fc(cfarray, i, 2) & 1) + 1, j = left + cc; j < right - 1; j += 2, cc += 2) { //interpolate B/R colors at R/B sites bluetile[rr * TS + cc] = greentile[rr * TS + cc] - 0.25f * ((greentile[(rr - 1) * TS + (cc - 1)] + greentile[(rr - 1) * TS + (cc + 1)] + greentile[(rr + 1) * TS + cc + 1] + greentile[(rr + 1) * TS + cc - 1]) - min(clip_pt, rawData[i - 1][j - 1] + rawData[i - 1][j + 1] + rawData[i + 1][j + 1] + rawData[i + 1][j - 1])); @@ -385,7 +393,7 @@ void RawImageSource::fast_demosaic() #else - for (int cc = (FC(i, 2) & 1) + 1, j = left + cc; j < right - 1; j += 2, cc += 2) { + for (int cc = (fc(cfarray, i, 2) & 1) + 1, j = left + cc; j < right - 1; j += 2, cc += 2) { //interpolate B/R colors at R/B sites redtile[rr * TS + cc] = greentile[rr * TS + cc] - 0.25f * ((greentile[(rr - 1) * TS + cc - 1] + greentile[(rr - 1) * TS + cc + 1] + greentile[(rr + 1) * TS + cc + 1] + greentile[(rr + 1) * TS + cc - 1]) - min(clip_pt, rawData[i - 1][j - 1] + rawData[i - 1][j + 1] + rawData[i + 1][j + 1] + rawData[i + 1][j - 1])); @@ -404,7 +412,7 @@ void RawImageSource::fast_demosaic() for (int i = top + 2, rr = 2; i < bottom - 2; i++, rr++) { #ifdef __SSE2__ - for (int cc = 2 + (FC(i, 2) & 1), j = left + cc; j < right - 2; j += 4, cc += 4) { + for (int cc = 2 + (fc(cfarray, i, 2) & 1), j = left + cc; j < right - 2; j += 4, cc += 4) { // no need to take care about the borders of the tile. There's enough free space. //interpolate R and B colors at G sites greenv = LVFU(greentile[rr * TS + cc]); @@ -428,7 +436,7 @@ void RawImageSource::fast_demosaic() #else - for (int cc = 2 + (FC(i, 2) & 1), j = left + cc; j < right - 2; j += 2, cc += 2) { + for (int cc = 2 + (fc(cfarray, i, 2) & 1), j = left + cc; j < right - 2; j += 2, cc += 2) { //interpolate R and B colors at G sites redtile[rr * TS + cc] = greentile[rr * TS + cc] - 0.25f * ((greentile[(rr - 1) * TS + cc] - redtile[(rr - 1) * TS + cc]) + (greentile[(rr + 1) * TS + cc] - redtile[(rr + 1) * TS + cc]) + (greentile[rr * TS + cc - 1] - redtile[rr * TS + cc - 1]) + (greentile[rr * TS + cc + 1] - redtile[rr * TS + cc + 1])); diff --git a/rtengine/filmnegativeproc.cc b/rtengine/filmnegativeproc.cc index 86bad00f7..1f27983ed 100644 --- a/rtengine/filmnegativeproc.cc +++ b/rtengine/filmnegativeproc.cc @@ -25,6 +25,7 @@ #include "coord.h" #include "mytime.h" #include "opthelper.h" +#include "pixelsmap.h" #include "procparams.h" #include "rt_algo.h" #include "rtengine.h" diff --git a/rtengine/hphd_demosaic_RT.cc b/rtengine/hphd_demosaic_RT.cc index 2b61bbe07..5e05b128e 100644 --- a/rtengine/hphd_demosaic_RT.cc +++ b/rtengine/hphd_demosaic_RT.cc @@ -352,7 +352,7 @@ void RawImageSource::hphd_demosaic () interpolate_row_rb_mul_pp(rawData, red[i], blue[i], green[i - 1], green[i], green[i + 1], i, 1.0, 1.0, 1.0, 0, W, 1); } - border_interpolate2(W, H, 4, rawData, red, green, blue); + border_interpolate(W, H, 4, rawData, red, green, blue); if (plistener) { plistener->setProgress(1.0); diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index bed101e0d..90d280117 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -38,7 +38,6 @@ #include "refreshmap.h" #include "../rtgui/options.h" -#include "../rtgui/ppversion.h" #ifdef _OPENMP #include diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index b58c60780..e10d7f690 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -45,7 +45,6 @@ #include "satandvalueblendingcurve.h" #include "StopWatch.h" #include "procparams.h" -#include "../rtgui/ppversion.h" #include "../rtgui/editcallbacks.h" #ifdef _DEBUG diff --git a/rtengine/pdaflinesfilter.cc b/rtengine/pdaflinesfilter.cc index e788c6c83..8ac0d3091 100644 --- a/rtengine/pdaflinesfilter.cc +++ b/rtengine/pdaflinesfilter.cc @@ -22,6 +22,7 @@ #include "camconst.h" #include "pdaflinesfilter.h" +#include "pixelsmap.h" #include "rawimage.h" #include "settings.h" diff --git a/rtengine/pixelshift.cc b/rtengine/pixelshift.cc index 0d83d7af3..ff529697b 100644 --- a/rtengine/pixelshift.cc +++ b/rtengine/pixelshift.cc @@ -38,6 +38,10 @@ namespace { +unsigned fc(const unsigned int cfa[2][2], int r, int c) { + return cfa[r & 1][c & 1]; +} + float greenDiff(float a, float b, float stddevFactor, float eperIso, float nreadIso, float prnu) { // calculate the difference between two green samples @@ -323,6 +327,7 @@ BENCHFUN bayerParams.pixelShiftShowMotion = false; } + const unsigned int cfarray[2][2] = {{FC(0,0), FC(0,1)}, {FC(1,0), FC(1,1)}}; const bool showMotion = bayerParams.pixelShiftShowMotion; const bool showOnlyMask = bayerParams.pixelShiftShowMotionMaskOnly && showMotion; const float smoothFactor = 1.0 - bayerParams.pixelShiftSmoothFactor; @@ -641,11 +646,11 @@ BENCHFUN for(int i = winy + 1; i < winh - 1; ++i) { int j = winx + 1; - int c = FC(i, j); + int c = fc(cfarray, i, j); - bool bluerow = (c + FC(i, j + 1)) == 3; + bool bluerow = (c + fc(cfarray, i, j + 1)) == 3; - for(int j = winx + 1, offset = FC(i, j) & 1; j < winw - 1; ++j, offset ^= 1) { + for(int j = winx + 1, offset = fc(cfarray, i, j) & 1; j < winw - 1; ++j, offset ^= 1) { (*histogreenThr[1 - offset])[(*rawDataFrames[1 - offset])[i - offset + 1][j]]++; (*histogreenThr[3 - offset])[(*rawDataFrames[3 - offset])[i + offset][j + 1]]++; @@ -726,9 +731,9 @@ BENCHFUN }; int ng = 0; int j = winx + 1; - int c = FC(i, j); + int c = fc(cfarray, i, j); - if((c + FC(i, j + 1)) == 3) { + if((c + fc(cfarray, i, j + 1)) == 3) { // row with blue pixels => swap destination pointers for non green pixels std::swap(nonGreenDest0, nonGreenDest1); ng ^= 1; @@ -783,7 +788,7 @@ BENCHFUN for(int i = winy + border - offsY; i < winh - (border + offsY); ++i) { // offset to keep the code short. It changes its value between 0 and 1 for each iteration of the loop - unsigned int offset = FC(i, winx + border - offsX) & 1; + unsigned int offset = fc(cfarray, i, winx + border - offsX) & 1; for(int j = winx + border - offsX; j < winw - (border + offsX); ++j, offset ^= 1) { psMask[i][j] = noMotion; @@ -919,7 +924,7 @@ BENCHFUN float *blueDest = blue[i + offsY]; // offset to keep the code short. It changes its value between 0 and 1 for each iteration of the loop - unsigned int offset = FC(i, winx + border - offsX) & 1; + unsigned int offset = fc(cfarray, i, winx + border - offsX) & 1; for(int j = winx + border - offsX; j < winw - (border + offsX); ++j, offset ^= 1) { if(showOnlyMask) { @@ -969,9 +974,9 @@ BENCHFUN float *nonGreenDest1 = blue[i]; int ng = 0; int j = winx + 1; - int c = FC(i, j); + int c = fc(cfarray, i, j); - if((c + FC(i, j + 1)) == 3) { + if((c + fc(cfarray, i, j + 1)) == 3) { // row with blue pixels => swap destination pointers for non green pixels std::swap(nonGreenDest0, nonGreenDest1); ng ^= 1; diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index 452ca8bfe..f7d905357 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -26,12 +26,12 @@ #include "colortemp.h" #include "iimage.h" #include "imagesource.h" -#include "pixelsmap.h" #define HR_SCALE 2 namespace rtengine { +class PixelsMap; class RawImage; class DiagonalCurve; class RetinextransmissionCurve; @@ -266,8 +266,6 @@ protected: void eahd_demosaic(); void hphd_demosaic(); void vng4_demosaic(const array2D &rawData, array2D &red, array2D &green, array2D &blue); - void ppg_demosaic(); - void jdl_interpolate_omp(); void igv_interpolate(int winw, int winh); void lmmse_interpolate_omp(int winw, int winh, array2D &rawData, array2D &red, array2D &green, array2D &blue, int iterations); void amaze_demosaic_RT(int winx, int winy, int winw, int winh, const array2D &rawData, array2D &red, array2D &green, array2D &blue, size_t chunkSize = 1, bool measure = false);//Emil's code for AMaZE @@ -276,8 +274,7 @@ protected: void dcb_demosaic(int iterations, bool dcb_enhance); void ahd_demosaic(); void rcd_demosaic(size_t chunkSize = 1, bool measure = false); - void border_interpolate(unsigned int border, float (*image)[4], unsigned int start = 0, unsigned int end = 0); - void border_interpolate2(int winw, int winh, int lborders, const array2D &rawData, array2D &red, array2D &green, array2D &blue); + void border_interpolate(int winw, int winh, int lborders, const array2D &rawData, array2D &red, array2D &green, array2D &blue); void dcb_initTileLimits(int &colMin, int &rowMin, int &colMax, int &rowMax, int x0, int y0, int border); void fill_raw( float (*cache )[3], int x0, int y0, float** rawData); void fill_border( float (*cache )[3], int border, int x0, int y0); diff --git a/rtengine/rcd_demosaic.cc b/rtengine/rcd_demosaic.cc index 63b5989ab..4ceb92b26 100644 --- a/rtengine/rcd_demosaic.cc +++ b/rtengine/rcd_demosaic.cc @@ -26,6 +26,13 @@ using namespace std; +namespace +{ +unsigned fc(const unsigned int cfa[2][2], int r, int c) { + return cfa[r & 1][c & 1]; +} +} + namespace rtengine { @@ -55,6 +62,7 @@ void RawImageSource::rcd_demosaic(size_t chunkSize, bool measure) plistener->setProgress(progress); } + const unsigned int cfarray[2][2] = {{FC(0,0), FC(0,1)}, {FC(1,0), FC(1,1)}}; constexpr int rcdBorder = 9; constexpr int tileSize = 214; constexpr int tileSizeN = tileSize - 2 * rcdBorder; @@ -97,8 +105,8 @@ void RawImageSource::rcd_demosaic(size_t chunkSize, bool measure) for (int row = rowStart; row < rowEnd; row++) { int indx = (row - rowStart) * tileSize; - int c0 = FC(row, colStart); - int c1 = FC(row, colStart + 1); + int c0 = fc(cfarray, row, colStart); + int c1 = fc(cfarray, row, colStart + 1); int col = colStart; for (; col < colEnd - 1; col+=2, indx+=2) { @@ -131,7 +139,7 @@ void RawImageSource::rcd_demosaic(size_t chunkSize, bool measure) // Step 2.1: Low pass filter incorporating green, red and blue local samples from the raw data for (int row = 2; row < tileRows - 2; row++) { - for (int col = 2 + (FC(row, 0) & 1), indx = row * tileSize + col; col < tilecols - 2; col += 2, indx += 2) { + for (int col = 2 + (fc(cfarray, row, 0) & 1), indx = row * tileSize + col; col < tilecols - 2; col += 2, indx += 2) { lpf[indx>>1] = 0.25f * cfa[indx] + 0.125f * (cfa[indx - w1] + cfa[indx + w1] + cfa[indx - 1] + cfa[indx + 1]) + 0.0625f * (cfa[indx - w1 - 1] + cfa[indx - w1 + 1] + cfa[indx + w1 - 1] + cfa[indx + w1 + 1]); } } @@ -141,7 +149,7 @@ void RawImageSource::rcd_demosaic(size_t chunkSize, bool measure) */ // Step 3.1: Populate the green channel at blue and red CFA positions for (int row = 4; row < tileRows - 4; row++) { - for (int col = 4 + (FC(row, 0) & 1), indx = row * tileSize + col; col < tilecols - 4; col += 2, indx += 2) { + for (int col = 4 + (fc(cfarray, row, 0) & 1), indx = row * tileSize + col; col < tilecols - 4; col += 2, indx += 2) { // Refined vertical and horizontal local discrimination float VH_Central_Value = VH_Dir[indx]; @@ -176,7 +184,7 @@ void RawImageSource::rcd_demosaic(size_t chunkSize, bool measure) // Step 4.1: Calculate P/Q diagonal local discrimination for (int row = rcdBorder - 4; row < tileRows - rcdBorder + 4; row++) { - for (int col = rcdBorder - 4 + (FC(row, rcdBorder) & 1), indx = row * tileSize + col; col < tilecols - rcdBorder + 4; col += 2, indx += 2) { + for (int col = rcdBorder - 4 + (fc(cfarray, row, rcdBorder) & 1), indx = row * tileSize + col; col < tilecols - rcdBorder + 4; col += 2, indx += 2) { const float cfai = cfa[indx]; float P_Stat = max(epssq, - 18.f * cfai * (cfa[indx - w1 - 1] + cfa[indx + w1 + 1] + 2.f * (cfa[indx - w2 - 2] + cfa[indx + w2 + 2]) - cfa[indx - w3 - 3] - cfa[indx + w3 + 3]) - 2.f * cfai * (cfa[indx - w4 - 4] + cfa[indx + w4 + 4] - 19.f * cfai) - cfa[indx - w1 - 1] * (70.f * cfa[indx + w1 + 1] - 12.f * cfa[indx - w2 - 2] + 24.f * cfa[indx + w2 + 2] - 38.f * cfa[indx - w3 - 3] + 16.f * cfa[indx + w3 + 3] + 12.f * cfa[indx - w4 - 4] - 6.f * cfa[indx + w4 + 4] + 46.f * cfa[indx - w1 - 1]) + cfa[indx + w1 + 1] * (24.f * cfa[indx - w2 - 2] - 12.f * cfa[indx + w2 + 2] + 16.f * cfa[indx - w3 - 3] - 38.f * cfa[indx + w3 + 3] - 6.f * cfa[indx - w4 - 4] + 12.f * cfa[indx + w4 + 4] + 46.f * cfa[indx + w1 + 1]) + cfa[indx - w2 - 2] * (14.f * cfa[indx + w2 + 2] - 12.f * cfa[indx + w3 + 3] - 2.f * (cfa[indx - w4 - 4] - cfa[indx + w4 + 4]) + 11.f * cfa[indx - w2 - 2]) - cfa[indx + w2 + 2] * (12.f * cfa[indx - w3 - 3] + 2.f * (cfa[indx - w4 - 4] - cfa[indx + w4 + 4]) + 11.f * cfa[indx + w2 + 2]) + cfa[indx - w3 - 3] * (2.f * cfa[indx + w3 + 3] - 6.f * cfa[indx - w4 - 4] + 10.f * cfa[indx - w3 - 3]) - cfa[indx + w3 + 3] * (6.f * cfa[indx + w4 + 4] + 10.f * cfa[indx + w3 + 3]) + cfa[indx - w4 - 4] * cfa[indx - w4 - 4] + cfa[indx + w4 + 4] * cfa[indx + w4 + 4]); @@ -189,7 +197,7 @@ void RawImageSource::rcd_demosaic(size_t chunkSize, bool measure) // Step 4.2: Populate the red and blue channels at blue and red CFA positions for (int row = rcdBorder - 3; row < tileRows - rcdBorder + 3; row++) { - for (int col = rcdBorder - 3 + (FC(row, rcdBorder - 1) & 1), indx = row * tileSize + col, c = 2 - FC(row, col); col < tilecols - rcdBorder + 3; col += 2, indx += 2) { + for (int col = rcdBorder - 3 + (fc(cfarray, row, rcdBorder - 1) & 1), indx = row * tileSize + col, c = 2 - fc(cfarray, row, col); col < tilecols - rcdBorder + 3; col += 2, indx += 2) { // Refined P/Q diagonal local discrimination float PQ_Central_Value = PQ_Dir[indx]; @@ -221,7 +229,7 @@ void RawImageSource::rcd_demosaic(size_t chunkSize, bool measure) // Step 4.3: Populate the red and blue channels at green CFA positions for (int row = rcdBorder; row < tileRows - rcdBorder; row++) { - for (int col = rcdBorder + (FC(row, rcdBorder - 1) & 1), indx = row * tileSize + col; col < tilecols - rcdBorder; col += 2, indx += 2) { + for (int col = rcdBorder + (fc(cfarray, row, rcdBorder - 1) & 1), indx = row * tileSize + col; col < tilecols - rcdBorder; col += 2, indx += 2) { // Refined vertical and horizontal local discrimination float VH_Central_Value = VH_Dir[indx]; @@ -296,7 +304,7 @@ void RawImageSource::rcd_demosaic(size_t chunkSize, bool measure) free(PQ_Dir); } - border_interpolate2(W, H, rcdBorder, rawData, red, green, blue); + border_interpolate(W, H, rcdBorder, rawData, red, green, blue); if (plistener) { plistener->setProgress(1); diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index b1953bb3d..0cdcbf6ed 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -31,15 +31,12 @@ #include "colortemp.h" #include "curves.h" #include "dcp.h" -#include "iccmatrices.h" #include "iccstore.h" #include "image8.h" -#include "improccoordinator.h" #include "improcfun.h" #include "jpeg.h" #include "labimage.h" #include "median.h" -#include "mytime.h" #include "procparams.h" #include "rawimage.h" #include "rawimagesource.h" @@ -50,8 +47,6 @@ #include "StopWatch.h" #include "utils.h" -#include "../rtgui/ppversion.h" - namespace { diff --git a/rtengine/vng4_demosaic_RT.cc b/rtengine/vng4_demosaic_RT.cc index 95fa58cef..47982b6da 100644 --- a/rtengine/vng4_demosaic_RT.cc +++ b/rtengine/vng4_demosaic_RT.cc @@ -384,7 +384,7 @@ void RawImageSource::vng4_demosaic (const array2D &rawData, array2D Date: Tue, 5 Nov 2019 23:06:45 +0100 Subject: [PATCH 134/208] Added FUJIFILM X-T2 dual-illuminant DCP, closes #5513 --- rtdata/dcpprofiles/FUJIFILM X-T2.dcp | Bin 0 -> 1102950 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 rtdata/dcpprofiles/FUJIFILM X-T2.dcp diff --git a/rtdata/dcpprofiles/FUJIFILM X-T2.dcp b/rtdata/dcpprofiles/FUJIFILM X-T2.dcp new file mode 100644 index 0000000000000000000000000000000000000000..5a4e11688f02b386d134365929562b2617f628b3 GIT binary patch literal 1102950 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

  • wQoT|XZ>Wh%ptiYvJ7h%7>JuZ{ff?upX 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

    3q^#5x@rMqath_x$8Vz8^Al2~FY`j`2hT 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

    w}TB#VdX0ZIJof95>Pr>){gL0DOf`?T+ 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

    )kt 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 q>l*y+e;7 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

      21YY;cE0P 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 z

      T*U~E9V@3tdSlXlZ0naxE6yu~d`4wKt;HyR!P#@9>SrxH-X7E{zp}ymt zmqGkj-!ydT>q@#d9(-&~67*inG11YI-}C1rPCTI;BV`T$a$gLZQ;#rt{A~X6t_byg z8TOmN4{ml`jmr)D^Z$Goo_A+j>+w6c2E?^&hx^Rzlq7T&dx9PY`km z#m-XhEot90@hShF$7wGSVzu+8IIi7Flq@evBD*}B*2oUfSo66rl`o{*gB2>=yn>nUT)hJS2X;s)zryddy$3UM2^Mw#!7H@uFkD5mcG2z5Z#(}UUB*&x)LHNRp>1!_ zHHS# zn+{`%BR0G^%V*q3!lF6Ounmvphftp}`kV`beg^ROwWGiurTK$f&b;z=IPz8Q$bGVf zzoH$Eil3g?+rgAiuMuLHn>B&&`B~ukl7Amw)kolY!0~o`!VZCFW#2|_=5K-LGUMmm zo*IGY?mx@8ul2%Op?m2ZCmJB|+_KIA={i7qq^V;9-x#1f7 z)ZF@vic`g3`tQ2Iw&}p%*k1O3WSx0fOz->0kwn=lEs|YHi!Hn6+-D>^AN!UyvV;(# zy_xn+lB7KnY0*NGnsc6ML#t4BLWD%w$@07BJfA;&f1l5FeXr|%o$qPPyyl+!+|Tpe z3*5(j>2nVb%gr~H!qwY{U~%G2c@L{vNN4bzw@|6bLHq=4@a#3-M5idg@)c~?#WTJm z`bBL8jbQBU3_o@I7WFp14-ejAzZ46#q8S<2A$<+z)NTGQ-*mMA95632#r%o9^W!Wi zs&IvdrmOM{;}rNZ+#Sw#y&&Jto`hjIi=p^Zf;_lA2Bx}6U{Y;}Jg;{Q+**pc2#kw- zM?y604f27B0qf*@yGMf=_J@RBR`NmbDd(!}k@8R#`n>bIt|w0!PdUF#?k1mr{ZJM5 z8Q1YMS=NL4jYqln2>XI^PRJ%C`VZw?ubWEtFqHFN%Lua0fclN!#dbvBmii5C??L3U z(|+MKiw%$QkJ_n!zULb%vRO@;|Lr#{5BHY8-(CSl+YiCUhlk}6D@$QuCFU{ixg)oE zQwH6}I6?W|ZbjjX>me-439hINEb1B607w5gLAJ6%k!|xMNZ5*bFGB|uE%K>_x0o+_ z=v4Qjts@BRo{aq^`h1tad6)xRFo!v(?SXvWo)nlK+PEF<B=8u)$l@BQ6V8>8gcmL^8R5Gaw@_e13M$fS5 zwxTn{*TanR|i|_;2qJ6dB$sgLJz_z29 zv;MV8-ucie=(f}qlqX)4zj%}Y7G7>Jdv$_*yk8uAnBxI|u9i`pJj%r|S`e!zwsqoyKwn7OzRNC5<=w>0Kus57T(#-n4XbX9Qi3sJuNw z!iLcGi1NW5q|t%K$+e~9NlH8AyzxLaU%ZO?kdp=)jB+B4@oHC{1+B@H|Jx7!+1{3i zgzrKrZ~;546ZI{BbDrBvTOQ?63(oi)95^Oio_whs^U4lE&g3U@-P~djSs`0j?IN`u za!}5}9EQE-MQJyy;WzHxbzi7cwAMQxTCX{SL-bd<>6;vwcRU|# z%9PJto&iRxxVQW+QoeOZD&~W`!>I{Aa=Ybc;i(hGbv`@gkF8E)y?`ft8n8s3*7p<) zH^I7|c^2}lFNyFNbI0w{hs$4kB*F`vjefL3Q=Z&CLHJz0gMN|tBhiB1d!>$;ZaFUK zuE#Hs!c9j7O}a*sM4XwTu*m^sPGqEMkf0a*oI%EopwGlN6EsL)DfQL1dkgpl8q~I5 zWj?pC#(F5l-yUV2fy|NWStmF;xzQGO@HT4OV@*8S>|d1m-<%^Y`^)buKZL1A z4nd@Uw7h)HZ5Z9x33SH4kypA`LQ9epxWDXQ^lo`648|Bk)=R7CImhD+YiCF-sGGDKk_h^yQ(Sgt$Y^pNBP3>w@UISHfMy- zdwtYBGIY{OL5~@jK{g$v@$=5-LF95T>O+pK-9RksXzUS|F@~f!hYI%(KCVm(_fsEY zd_9Y|wWB_y&omT>J6oth~*u9EJ^bgQML7{dXSVyJxz5t^t9eIi8TBXCj}UQ2?LaC2&4mNAA;b34F13>zZj- zdE76Y3G3K;Q2)(Y_RU=G+V3}v|8WRlR*wAjq>s?O%?ZwJ?pQSI)GO$LxmE32 zGWquH4Pf4iy&#;zPh(N*;R4;XUqijy>^^e6KHntVNg`9e$N88G8v-vEF#V*j%!5 zcn(a$eA$5*yRInDgh66lUu{$dmpy9gPx~997OG%H;(N!&lg@I zTTPo#c7l%&3`O1Ib)HQc=ncWhcEFE3_8~8UL8zr)E7_~x-QYE{z5Jz&9kCd5xBnmK zMJgiso=eKCwSg17D=d(c!G9nP*Lv~K)8xz6e1h;jSnvJVRX)4v4d^Dhg3gW^^0Kkd z;LI(o7k)WVE~|J5{jkSf_#$Pwb9Ft4_j$r1`Ez2KbOW@bkv>ruz$DriTGMuue;#ECJoDlQ zk@}^nf_^_MmT#3%&fg=lxq#`^SI1_LW_}%_oL?`(X_eimub%D|07iqTum1g|92zcD z&Q|NYvuAQ~_AlD4(@Ar7%m;t?gq+8$cVN#w@P$a!8W~ya1_SKjgL$z>@_O0g#Ae#l^L0M=1j z&mr>sJZSdz#@+%`$ohXS!1Lw4kQr!7jvvi}A0qS5;LqRME*nXjAOeT^o1+PIZkO3TYMVpSx|c{o5H$i;yEy~-5X=Ueprir z^ia2dX4v+}m{*AUZ_exQOqahDsj;dDoM2%L$ba@xW_RT}!|ib$fLT_00y#v|&0dx8E zeZi~O2fmv)3;dq>L-6wL{Qd~axn)EiNAf7=>Fsa1)ee;Ns5~=%b1da-;JJ|>KZSCx z{prC6Y^0nY5BKDU;%uOy_*@&MwUmdts(HgFm^Rwz|aBU)i?DzS+>(%R^zDf$aOEP%- z=wdiF*bA=PCiA8%Wti`VHB`S6c$2|-F#oPMe0PcA^+R%?(i>|gH^%b%KQjeiaaUW7 z%-==*^G+R>s3#-|*Z;V0Cf~PE|7>XPMjk#mfjt_rb~VA7Xw-*8JDwXFjz35&vO*#2 ztS{td?juV!1cM*e&%gY(n{>)o^f~Z_@$+^PojHE6q`xn~%`L>c(g!a0@&#Fkb)@4u zjQ6nj(Ei{R(S$Ev{0hb-NwG($0q+&l06(y1UNdJ1FLt;G*?9IaplmSjT5=P%Vy^n= z$|3v~t4ipk^Dk6*fm>B+ByVDWNze&uzxet5c|q?Dn@lDT zr}4&@DGub99gR1>#D$W(mNee*c^gHt3Ta%I&_9lhbUX$#)(3#2eF`q8LP4s6dHn4; zB&mNegc|HmvN?}b;jEtNm^agS z{{mTv^8}4My$j0_k|aIQi%%IZC?xU{U6Svwd(xV5>1vY zcZbKi8QijGJ=lE++&|ktR2<|2H8e)+~#&L*T$OX?a7=x zL6G$ZvmKNbmWsOrB+56tvrl5#%P$V^XXU23f8pEqOG4-pvIPOEnrl$DB$c6Tig> z_x$N{k+gcyJtf`4`NYqY#?OZ~E7J z@i>3r8TJ6$_l``RkM`(~y<%h^$*A{OZ)=TvR$lMOG|U;1FUDH&XK%>XQct*ywc%F9 zZ^*AEtQ!#f!5!P@M1ncgo2>l)hw}_8P5#$p9rj|o2MivP%T04oXFbNU>^#qzyzI!%9)$6Lql`;9gUpruVgBwR{H9fH!siVSPUfer zd?sk6f){+UalN1uJFAiNA1eeMa#f#ndtD^x;)^3l()lZb9)EH?>F_5<(4TeY5>acK zpciy;AX}x$f{u(iN?zTfKKagtG!j!ueX>PILS`+eKKbtCO48Ye`sCkTt4YUuG{!Jr zT|=yK=BnbmtBJcs^5y<80`t*pbsv&$<9s3Loj+Vt{zM{vc*C!Be@L9DDsPPO2Fp4A zFu1V0JQMd$-G}?b0BaSwju)OAkMf5f`&8u4nB#d5Yw`;+n@Oq9L8x8#zyA52qb5Hv zSBD+b+Y`3sU*Vn>YOvCC5-_=#%9$VU!OAv!!FsPk7ls0M3?lmZ##H*tc&0 zxNd2{yq$yKi!uM-{(0LA4Ss=0hixv$9#TI!F3wDoeVv7UjazcKGxDBn%{ebn`dP?T z*Q>JY8hl{uu^KKoP=(dsg>^M5p8P_!-@<2)UipA8|EF2dQG|#Joj`dqW`pl(1+4PV#k@UYTTzAmjP9B}5oQHRDCh0kp^N>OQBuS6@jg2QF z$+s(s!u=s6oirp+zwz=GAugS$->|c|NkZ;Ydk#AMh>S3#eq-UVCuBADMOJ)YkKhS8 z(3P&cT}v9s{k?SEJ@qV=+1^qd|_kqC(d`WDl5j<)M+`xpP1S%yr$~wFZ|iKSAstJv>&-Ji~8hI2gi|= z2i3y$nYXM+;4bQur+-~cf)C1s>+5!|C51=nv+qj8R`Pi(U7Ji@vya^1X)O1`OhWoP zQ@;`MGKeJZrkvenF~re_a<1x?L0*2Le&hN~8L7EJIXm|%CpUE{=T0YU$S&*)tzhz? zvWlFzNA3ApWCckdMmej+-6keD2T5_yWz83aXQ_UC4Rgq6QO+xN-6q#odI<<(Odcc)cB>g^p_Dz1c5!Wv?#@HdXBSR8sEEhOpKY4V9`i+Hh z4|3)X^&5TF{mJMal=IJ1M@gS0l=Ic{STgfD^&4fWXUNp=bWh{if%BvwHcyz+r?b+9XjB=#UzCtZMVjF#1xSld?Bw3P4eX=aWf>d(U zC!g*=i|AWXpPb)!Avyh;KKt_drNqRT#u)jz%Skz&8!A56$I|7bs`!+kuU}t9j;hj_ zc~!wCQkoDYT+g+2ByXLlf3~ReC2diZ^X)rf6UavoP4O(r~|oQdUOvhpV7{5UU+WY|&8yD=|1Y1)4| z+vWA-2foy12Vq^z?15J~cPnkyXC$sEc9d}^r)sh7tPlL?`hZ(IMT-@opC9Sq&2M_y zS>SBlU(QE=ZWZ3=AiEEIzYb3XJ(lZ5thQ619Ns>dgqD^G*8^oEiGEK`(1ofK$(0!D zD{|Q>%DKmrePmZDKAa_rrq_%2#zI1>Fj%K5FyT5`XFa_%~06UkahIhS=XCMin)<>vu_E+|x2{mA4N2yv_&aOSn$k!aMP_>Q8!!uO#8k@cg#Vtp4A@|*Jj^RI|mWNao~oBY&SLfj`%&JG?M$e1$9 zc}mVMaxRQ=zMStwE~QY;N}Z+TVE}y&>Nj|j`@bpYy`6TGmzyc)tmP|6&AY({;uZ{A(L z#;{!Yx7IN~`A4|_tauNt_qvjhJ~XZvRiaMDY|a+0-!9Q5v-8sgz5V(CGARFyp!ppJ zWZy>WD}0Zdl6y(q<%?#lO{tIO8z^nfH?!cDf|5^>;-GBEI*cMqX<7eD!7ubgW zow&V@zhFn#dQHWz_%9r_;ok$=dEG74hWBW7A!GFD^R8}xPm&;|Hrx+m@AnZjt|$x{ zNTSWCuXr%ch^+2KW9GMRV@OIj%6Xi{RC2X10Ea+4>2|uG>weX%dbI14#8FE3#`d;LBI8Yn5 zUsuK_=}{Zj{&ts7(x*0jYRFrD#sq4^yKrx6`#@^L{%PGvLJYOx(?*&^Cyd(gn-qQ0 zSWJDz`4fiZj2ewGOg4=s``qbTTeoBq+1{UWw!R}GYg;JiZy!V?;yLAPRyvUcv{BAo z4j2>DHp=@AKdCy^m5qJSXW7|IM5F;fu{(iPDQG;r$=4QYSqn)P}dM z(<7ayQlGrDc`(^Ih;o(>F(OUsl(WGCQ&ONs<7dljW@O1|8sp8WHX+}qP+zTDYe04w zQC}UqQlCWQK8=E#_nY1%{Q~8@)I*7ka-p2n?Vs~Gk0|G5k)`~+8;-*L8F|Nf(MtRO za6a0ngfIsa;W43q|U*3EMwc*M8kMg&-&{*QM zej+b9N&SOK%z55KM%mgK%6J!h%64i{IlnoS+U?_u^}N;}%Jcn(r~L8+%JWdcYu*TZ z;4AnP>c8XvIY@bW{nNtB&r_a8J>KvRU8oJaeRLzZ>^#5U&gW_0Mj`w>XzKeOQ}S z9uV@V;XIX|23$>$%ZoWtDw`M_ez`Ho#EZ#{)_mP|UvkHbBD#pe}| zInI~#qMX<29OElDQqG>65A*J?soic`=f}_a_u04Zpa-8;{4eK7dtQt^B81m5Tf>X~ z%_EgtPvgfsP|oug>+@k)U$3}Fd(>6Veh!U2LW{Kv8qBEv+dp@?SjgF3QD={9dcfkT zGr5mw+cU9FVZsL;4tn)tGqGRfy#qVA%l*2uik_wKd+y|X+CK_Bn{Mpo_NzV=^pAWO zu9rrIpsRLxb8b>jcn@<&26M?DsNZ;Yl;h?srG8^zObK_Gp?>3Fk1B4eDfP+D%kFY& za>_ZTwvij%OgZ=I+s3(_pq#JI`^7yDqMSQ!>&z#~j|l&k^_MQZ>t5=Ir_WR7R|Qi) z>>Timi^Sgk3MP|Rz2vO&Dd+mi>zr&WwdbVxY;N!)%DMOSIPTIg%6ZS*AnyBIYR~WL zc5ui2C}(EgIIhbu$~mj`v8-_yWjo01n?*D4Cj47}b5`;>!|A*AWHYPXv8Gs$dmXI7 z<|a#_?j|Sur&^1hlIaT;Wh&ewIpypwc_iD&einG9T)rS{8~sSoA4)@Ica19ry>iK3%r#3wIOjptTGRoFUwpb*` zd2x!@xjXfU=&~i{+?19pT4G8$XUE+X&8(xGjrzP0b+VwG?y7InLDm8^4wB zOJjnkQqCqvc&4&|?h#Fv++sAMsjsLheZhSFNNsrd;djiDnaipG;=rb;|kShZsgxOgWpWhBBviQ_lO`y_mN+6F~8O$p@}v*8iI$ zJ+Q@#x!#l7Gn1VxT8A^m6!-jX&t-X=Iq5CzZJpu{)AJo=0cpM2yO>|0X0_Hr?U4ps zJ5S}j}-T>@AVHeX(F}f z9Cf zt@tQ9@rrU*8E4LPUi)3(yfEF48LjzL;JiHc2-CN)M$p%i(wM0?iv-S(_LVX5?Uw~T zV)RqyOP_3kdGOGEj{($I@_o-Boaqi&1rY}DC5MLwWDdo;5vpqF6J zZH>E`-w{6q&NB=nnNt?e1hzvBE-}t^Hv~OLr;aIaC>GepD}7={zRDLgaqR|7BjvpD zmo5a4OcR&~>@k8Lj>*FN%>F(O%$HEkuA$Rm(h16W{KqA*+njQK*=_?p7gEkYZTCXK zJIc8YZKcy->YwFmK9Gs?VHKaMg*~Y#!eqLff?1~TePEcGwH^`GI3!|J@yDSrxwzvq_|MnYU zPm^TUZK~|gE$$$DxJzVvwmUoW2j;};X)_VIJ=mz3KCoBAmWe9q#ftDX6GlcdmwUAf zoa=oGn3Rjp1YLCd2_s!tD{yYq>I4JUlnDCE%s#Mf`4xe)t+yc*j>-{qec2=kSxGrB z|1bwE{@uebS6d6UqbTQ!i#y@Q1j;$-EcW2wso&Vv+aCh!so$7ua|FuWDd#n9kubQ7 z+H>u`cu4l9oTu$d0pag8HLWKQtQ(V@>EiU*A0tUB!J$#XTdmnq`SNlR}|m zzg(1UF{k#t_F6ZYog?KuNoOMye28+Mqhu)RxctAIx#9~JtIvFc!elqt(n*UMEoz6n z?h+WB?8csXH=1(O&>3Ui6<`$oOcD;!3BpbL35ZlqrB>zz&QxxU&qhblMr8XhW1JLbw5_% zyq;vk-j$Jp9;hS7To7u*AqT3#tT(mc@h0~nvj?@|&Y>@$@iKkhm7jQz{lBR1U4%8h zq5pDwy5%Fp|9d87@v{Ul`Bh-(x_&XNDx_>9-WW4Ks;O3rZ;%l@lT~nTZqAdLT2jtc z_j<|}yHU;?tEVxW_fXC*&1$0Mz5mNOW<{Q;YjPumVQ%fU&vO|iohAry@`RP!W0}YM zn&4fO6tr7zGQ;>L&{Oe&vKO7qPVn9MpW=-V&P;*6<8fwTO1K0G)UE$F&MxbCrx5cD6j z2Vnf}h`{`Yp@SGlV zb~oi5CwpXZq}o~dUjFva>lPR@xhL!3$5B_fX&_;8P4B|HHk=W&Cy#LrLVXi^{mWXJ z_K3UC_}mN1u4;jA`dz5Nys1BD&0!OJ5Bh!bhuZo@@U^@`U~V;g53~;B1-5Ow{BUiM zE9eJ3Bcc1RbU{~To`u=z$pYu#llfrwHD1ssrd7h|niGOv_WBWwP7fD2XJgJnN^mIs zEAI!@3^lkR{T7b$R-N529~jFT1d`4aDMaQEtAL7Ubp zvAxoQ1kO4SR9VB37{B8^mFnv3JWZ?(LcM;DHhXHKkD%9d)?+uvQ=V@F`>~NzD67V& zDr~(M)zbXaupfJTDZY!`#qK+)3J~)`7dWH?~{y2uj}x1gA2g&bmpi^CFJ2+{mO;=%+Jb7P0tPv3Xb;ogIwoLV70Rn=He`p-%}*Ot>a-1>aAr*z^HGo zptas7LgmtQL629-fi=5N3)=5$G0wh=6Ld!PZOjjf6!cJ^MtEy~RL~>)eFUSZ!!R3P z^A?`xq@4^BvDyR%<9`w2QeyEj{6gtNr)dUd`gYai+bvrrqq?!!hH zOR4r&W+fsi%*5-Xs#3sx2Id{1E`eOe;EoS4sL$_>mFZohoTu35$sR>g&TDQDlj)~Z z&g-_B7vA-zoI5-94D*f( zx@}rH46QyaXq$I+aK9)>&=J=f0GI&y2mf~afHyb;%}>x18rxtD=1(cEufzUWk=b6b z5cM*L@6d69RM1h2pMVyweHGW&H3q}S^*DPA^||@S8JmYbFc0;vh(H-B!}+kN=V!&r zO2egs9(l33Ffhqe&=a<8k%et{6YK#h?oGXF=qz0So3mV-XKv0cgHY@@tCJhS6pg(O z>mRv+?}jAi_uMFz<8ThfZ-Nzm_<6lzJdy<%khPIJ+)!b zn@U*Wgt5?<5isp4FTDR=1`ITYWRS?#iEAlIHq1Gxu(3dC3VCP6b zScca%n~JgC&j*&HJ}bKhFY~=%1?qOS3Q%7zg_WpPI$Q!{^tY=~f2-IEqj27qLLUv2 zF#EB-S)m8TO_4RH((B4f%Vb{e%*ruXUyO5)&igkozm}9kG0rivF8akxDc}V@N5A%fQGvMvAFG=F z*uNxQVB-B{B!pWh3p(CK4DCDP1wKP;mcnK634u@a)-Bk_F7@{FIbP)JJ?I) zXO8wM4S{ex+uwv*yVpbr!d$N{sLgAwnHFCk*oOMl@XLjNFy633UB`Vcv;`^bM6ES( zp~c=wXoIM)m3H9rwqqYe)IOmL3%k$5xdEvE=Dbh-nE7PGgNiTKw04m&$}@|=1p5i- zrL1A}mlT5>_gFiZtV0_vfwJ4!S99xL#<#WvzT@xkXQ(gp%)1nFYJK3VZ6srQq6`d{ z`NOLvsm%N|Uf^bu#4(%Qa|LcXYi~2#R5Ju_lUKiG!h@0pZqt`4L3UBRz^(U2b@&-{ zLg2Qh>p)Ol6)xD1-$@hrIU!WwW*9#aN3?bjlRUu( z98s^IHKy>(P@G|k+GGb`=#PCyT~XVF-I&^#<^dk44_}zgMM_-26Ln*+Zk!v|VSA(g zo3n{dE0bh#1+M<%4EBzDnG?SY!R3i7To_=+ob1QJ&`b}w_g#ze?$3kHP6?RCt24`< z@$hg2&S|UCVV0dE@DcaKmpvNBlqSic1NQtq+jAmwCY~2~Hr|-WXdTEE7&@M{Wt`PB z1cvn^CCsHO$pXVWPGL+Zg9L$LhxF@C7)2G_gc{0`LO-#wuHh*aR| zQS_4uPm~Hgo1UL$M!)tF7@GXNCX!WqgBRYPnvzkt=Asw)qptciLN*cS5d@=dd88pr zIfH#J8XLxvrJt*AS`?9c2h2^MV9*xHk@{C#Q$`f3Hkke#lww?n-IZrSq7GLJ8w5QEo;{rM={yv7X@P+z(9h1*ti2u`BD zsWFL<#X8Lt)PHksmZ`!fmvo4%bb@Dd)-$e`&%?eu*w@;yT;#!Lf@L3fs94!mv~fr_ zoLlS(kFE_XWNt2Ag`8bnfjZ`*S zY1CKWm~pA#3FlDvJF%a;U+f~x@hrd|_;>0ZAq%fRn-tF9tvLvJsQ>2d{#Fa;c$@+= z?1Qv^{3fRBLhN&B=mKpM&WSp%NQP_JANYZ7<@OyWxbLUF2c3a^yPki;}W`2qmcwTGv=Zfkggx|ZdO%ONAHca@vZ`csb zO}`g{qlYlRy()<7s2v1{P#3HT;ErK!mK*AeDL!0KwJ%6e-wg2LwteyjU({>&dvFsm z*Ej^VO(e1^^nwV~FLSnWzNid{96Ju@Jt?lA-NnV7kO&NyY6f#5`B-O$*CVnB zm;J~I3Q;>bZsn(h?gtLFtHyP{G-~Tyn~{ zM$|Ur7(8*oexaqQQ{iX?495O`|Mc{gDPQcv*)dUK* z+G%S&*ZriwV5;EoCWr73{||&%_`0?4Cl6>9%CZsEG)dSpDNBu zUzp9^t@eUc)c4fRa?WR@a1nK1{Z#H9*7YiQMl(fR3-&`TM!lfs52xR95a)BE|GyEy zAFy^1=Fg65eanmH?G|CkbQK)HS|8__Ltwi!g_)a_z~n*L!$hYK_bpL^GYwoJ^S1@3 z-YS7HbP+zpT%IU3jhg+x@q(0&7u*dBK)P~1Yd0Vsn@C>yPgz(SC*~1Iew~FraJ?8I# z7Sw-pwrg4is&$T_yZR7hR3$Ty&bWZqlS7bDFr1m}<_2yyPGDqtS!5RD4$r?jVLfnv z(F3Ums9-z$xA-fGnYILeWMMqhSBERaGx}CbH-O@i+*e#X7?`-joeox9w6_<`sK$Sz_i9dp=TA~o z30UXs;_M52aSkQcRPXfQtg$Z8a|8Z=fxg@soI$VfvD^L$;O31B5n_O_7Jp88aj@{r z8n`cjJG3Pba`2wK$^h<^A=X8qJ{jQ8ZM}xGX;8aY`f}OJy>Lcg0OWl4;VwV+6l`^r zY5=Dx!+zCxebSj@+?UjY(1iNOk!;RX>HzOiM{i%k-`}zmKA=_!3gxX%Zxd!x{}1PB z3(=Q20>9u8&dNQ(yjX;N(QxkD^}_?01I?~bFUFqRR@EY>X6!Fsf&Qe(M>IYX`v;?K zJKGNut=97Z{v^%-s*A7~f5-#El(DD51&t~8*c&@{J@yGyK3Le^!xO}jF3{o1yF$$c zo}kIQz@UDnGUY3t@M9?UcMVx1^WBW|)^FlG1(~;O6t0DT4swU3$D(8`uH!oP#PzLO zwrtxEUpS?Xy$&{3$n>@aLwG&Tc>VQK=KLd6V0*5$BX>99u)tPYqQZU73>Mg~@1o3Q zXa)*wpXPj*O|kbA*naSOC_DSvTVNY{FH^Q2*DQCCRYt`YnIGEEQ`BwA35DYsMISy~ z51L%Fct70{KB4wVJ|Q|~xEFq*wmY|l%l&8v9dYmIu=_6A#T{Ef_5bZ74Re?Wg;tL6 zWY!_raV(U%ioMBe$RXIXwi{EAH7j$l@BEaLM6|E3C;Y-%m%_1!MeBBY!bR-o-$}MY zRG#SxJI`W28CL^Q&I?blz_WyrXMS4T)R({p?Avd1>x#uZtVdiQ<^r>CNiCX6B@m7A z(DvA27T?$7ehKRe9<`BEO)=KGjdl7n8^7gm$LAF1?hbB^Sp|blu?}^GC(NETwy+KB z^Om;Yvn02^@bkJ5*p6qYJzh@5$oJB*7y#>2%9H`6~mP-V-D_(A4Jeu5bW&-|=MILj1q%(X) z{cEur1TH@SoseP2jD_%G)*k4N+WgBVXzOAJ8mK>{HG-|vMsWNt`5(VAezH2){o?_F z;V$scoIOljH!1$MT)^>kAEpcLhp#kth5qK%qWK+gwm=B}ezru4j!wgv^Q|jv5Zj76 zdU(Ntf3U|<>?qO4BAhdR-VH1*yNH%3d1Ieu>^a=`y2Z-v-f-;{uARDuTJ*#Gz~S>e zAh>b7Mf*D+SY(R5%5~07&9n1^(V7y7fZ2s(W`*G156**}_N{RL@(_qb?qzaDRxS;K zc+_FR zJuTXs3E3)v+o<<>Yr)vV?(hipIqVTQ9)F9kQ0G@y!7Tkl@EP^ZNqTJIp#z|F)EgEJ z+sHrmLm+hWUP&jrwoDp}%S|T*+{Q9!Fdt zSl1W~he)CAD$cC*m4n@NiY+0b>?C} zCR@V-xRB-rW)W`in7s)m&+uFkV~<&-uc5uaHLqu`((cZhdSicr zukNr`U6<7}_JJod517FWWAjpd(GTIw){CRq<+?#IcZ?Sdb+BYDZGs^YKfC$%HSCPa zKuAF?vpm4=T!qhk)Omisth$arTv1%Vdz3AGi~bz-+un)nGdzd7fqHXJ2K&U+8y=!A znOewJ&Xz(G>Xya|_8IF5A5q^L^@M%>73ZHItF*i?>}}kW=!IHCRaLyW5B5Ss{cN|s zxM`{*n4|vLI$CTw`vA;Do!7KfY~2x`U8w)&d?f|@q4aYByAT(szln3pt0mAIdv3H8 zoq@w!q>!%d3ahGWfz6e|1bbIFx$Y+{{V0X9Qk*+nsL5)N_5ziGZg9qB1p9Cs&aQRB zd6efE_EHSa-M;At19mNCf7E!vz|rooFMT^3_y>O%63of@;m#hx&s$N6X9~uF*e3*I zYE=(VeR7PQg8XNo&A+*sz_y*jz4~3Az-FYfF{%C#ihXq3cjmL~!XWIy?+p#PHEiU2 ze0HJUqV4W_!O`A9o1jl0sEG` zM;#~{E`~=^_=UP;+!*n*ub!ZWtd>u<5D!ds2R+m=UuKE5uwLF2_3=+j#lG>*z@oNT zvPx{0{_Ju=u;bk<_Q_rJGb(N{rDY3S*$Zc&uXBT5k0tClOPoQU;|81T zkFWuF?y0Qe4g+QJ?EXYNV_bxBb@vQ*5AG){#b>IoRRNpVioMhByTd52>+By*ZwT+{ z0cN>(*dOL-|6=SPIQk{KJk}fTzwv-u%AeUN>^CzFW5-uLJBb}e1;Pd7^JjB!aR|oe zGSo*$4G=GW?+4dWJ1CooV>|jm9qNg{CW=#WF8y=V+Ka5jGqLZW!iGzX7K_7nqEAC^ z<}GW*&U!ds74_hI+r$RG5->zPXyrb!DaQU&6gtCEoG=)l8>pwLI*T`B&n<=i)O13e zlXwW6v3C1!d!BMJ3-f;tf&~3WC)rgvf5Q`+<>;q+sIbOy5?G3Ttd@;1W`FjO0xWR_ zTeE-I0*t}lB)Wohp#!@xQVJ#S@mZ!E#EvMJ!a&9i<_E^I%aw4i;3%G<7iO>lqi_cL zV>bxM;n)`|yPPhBUAir}10~XZ<`cX=PuO;*8ficW64&K^)eA z=XyVI{?x;+;+S@vt3KQV{N}2Q9dLfD|0WNR{Ol`EbHX`1>Jmuu86wUc> zf6G(+K@~rHr8S7JTlzt71s`s%_zm_3)It4X{wi^6yblaS{d@Q}@%!iAV1)Ww?g8tXNRof6q@Gg0X>u?c}0B@i1hd(2JXs#Sao3Vc)9% zop06g6M=Ub2jNMm3p6V~hM7-1(eBVc-_~ZiC<%Cfb-`J}z}j?0o?=&6_+T4rjORYh z0l2Td!JpmihwtIGE5usGvK_D=PrSYx=W*vOo?^!gFZf#E4pO2m z-hq2NgI{7k&&2`ab8WcB8SMeiI}OFR2YbWQBoC;$W+v8|gnnK_0)-F8iM^NlVgCRx z@EB()UWL6J6r6uQT_T={y)krAkH29fZp5{r!rv|*wO9OmkPnPNeLlope0Mh5HR`9A zyv1g9Qo*)gPYVz~#8_V8E52(7i+dl&noHEqlS9SrYLxTP#&hCmwF7Xk2hN@s{-gCN z`^T2SCG0J_2>r%P^LMbnmjrV2T(DpEU^er-1Xg4J)e|e{vs*E49gcIsI{F-9A1stY zn1d^nzYSw!@ccI>4|5Wt𝔞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∓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

      tcxIXVa$AI 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

      x;X`h8DPaqq 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 vlIu_BC)QLO?Ct;oC+J#<>Z~Mp_;1L3# Date: Wed, 6 Nov 2019 13:13:44 +0100 Subject: [PATCH 135/208] dcraw: reduce memory usage --- rtengine/dcraw.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rtengine/dcraw.h b/rtengine/dcraw.h index eaf1fe35e..5e17b47ab 100644 --- a/rtengine/dcraw.h +++ b/rtengine/dcraw.h @@ -167,8 +167,7 @@ protected: float cam_mul[4], pre_mul[4], cmatrix[3][4], rgb_cam[3][4]; - int histogram[4][0x2000]; - void (DCraw::*write_thumb)(), (DCraw::*write_fun)(); + void (DCraw::*write_thumb)(); void (DCraw::*load_raw)(), (DCraw::*thumb_load_raw)(); jmp_buf failure; From e12b58cfcf32c62823f1ffbd32291d7997576b0c Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Wed, 6 Nov 2019 14:40:05 +0100 Subject: [PATCH 136/208] Decode standard Panasonic DC-S1 and DC-S1R files (pixelshift files are not supported yet), #5204 --- rtengine/camconst.json | 5 ++ rtengine/dcraw.cc | 171 +++++++++++++++++++++++++++++++++++++++++ rtengine/dcraw.h | 15 ++++ 3 files changed, 191 insertions(+) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index 3393dec9f..169b0b0b7 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -2142,6 +2142,11 @@ Camera constants: } }, + { // Quality B, per ISO info missing + "make_model": [ "Panasonic DC-S1", "Panasonic DC-S1R" ], + "ranges": { "white": 16383 } + }, + { // Quality B, per ISO info missing "make_model": "PENTAX K-x", "dcraw_matrix": [ 8843,-2837,-625,-5025,12644,2668,-411,1234,7410 ], // adobe dcp d65 diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index ae6f60cd1..7278f867f 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -2757,6 +2757,10 @@ void CLASS panasonic_load_raw() } } } + } else if (RT_pana_info.encoding == 6) { + panasonicC6_load_raw(); + } else if (RT_pana_info.encoding == 7) { + panasonicC7_load_raw(); } else { for (row=0; row < height; row++) for (col=0; col < raw_width; col++) { @@ -10759,6 +10763,173 @@ void CLASS nikon_14bit_load_raw() free(buf); } +// Code adapted from libraw +/* -*- C++ -*- + * Copyright 2019 LibRaw LLC (info@libraw.org) + * + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + + */ + +void CLASS pana_cs6_page_decoder::read_page() +{ + if (!buffer || (maxoffset - lastoffset < 16)) + ; +#define wbuffer(i) ((unsigned short)buffer[lastoffset + 15 - i]) + pixelbuffer[0] = (wbuffer(0) << 6) | (wbuffer(1) >> 2); // 14 bit + pixelbuffer[1] = + (((wbuffer(1) & 0x3) << 12) | (wbuffer(2) << 4) | (wbuffer(3) >> 4)) & + 0x3fff; + pixelbuffer[2] = (wbuffer(3) >> 2) & 0x3; + pixelbuffer[3] = ((wbuffer(3) & 0x3) << 8) | wbuffer(4); + pixelbuffer[4] = (wbuffer(5) << 2) | (wbuffer(6) >> 6); + pixelbuffer[5] = ((wbuffer(6) & 0x3f) << 4) | (wbuffer(7) >> 4); + pixelbuffer[6] = (wbuffer(7) >> 2) & 0x3; + pixelbuffer[7] = ((wbuffer(7) & 0x3) << 8) | wbuffer(8); + pixelbuffer[8] = ((wbuffer(9) << 2) & 0x3fc) | (wbuffer(10) >> 6); + pixelbuffer[9] = ((wbuffer(10) << 4) | (wbuffer(11) >> 4)) & 0x3ff; + pixelbuffer[10] = (wbuffer(11) >> 2) & 0x3; + pixelbuffer[11] = ((wbuffer(11) & 0x3) << 8) | wbuffer(12); + pixelbuffer[12] = (((wbuffer(13) << 2) & 0x3fc) | wbuffer(14) >> 6) & 0x3ff; + pixelbuffer[13] = ((wbuffer(14) << 4) | (wbuffer(15) >> 4)) & 0x3ff; +#undef wbuffer + current = 0; + lastoffset += 16; +} + +void CLASS panasonicC6_load_raw() +{ + const int rowstep = 16; + const int blocksperrow = raw_width / 11; + const int rowbytes = blocksperrow * 16; + unsigned char *iobuf = (unsigned char *)malloc(rowbytes * rowstep); + merror(iobuf, "panasonicC6_load_raw()"); + + for (int row = 0; row < raw_height - rowstep + 1; + row += rowstep) + { + int rowstoread = MIN(rowstep, raw_height - row); + fread (iobuf, rowbytes, rowstoread, ifp); +// if (libraw_internal_data.internal_data.input->read( +// iobuf, rowbytes, rowstoread) != rowstoread) +// throw LIBRAW_EXCEPTION_IO_EOF; + pana_cs6_page_decoder page(iobuf, rowbytes * rowstoread); + for (int crow = 0, col = 0; crow < rowstoread; crow++, col = 0) + { + unsigned short *rowptr = &raw_image[(row + crow) * raw_width]; + for (int rblock = 0; rblock < blocksperrow; rblock++) + { + page.read_page(); + unsigned oddeven[2] = {0, 0}, nonzero[2] = {0, 0}; + unsigned pmul = 0, pixel_base = 0; + for (int pix = 0; pix < 11; pix++) + { + if (pix % 3 == 2) + { + unsigned base = page.nextpixel(); + if (base > 3); +// throw LIBRAW_EXCEPTION_IO_CORRUPT; // not possible b/c of 2-bit + // field, but.... + if (base == 3) + base = 4; + pixel_base = 0x200 << base; + pmul = 1 << base; + } + unsigned epixel = page.nextpixel(); + if (oddeven[pix % 2]) + { + epixel *= pmul; + if (pixel_base < 0x2000 && nonzero[pix % 2] > pixel_base) + epixel += nonzero[pix % 2] - pixel_base; + nonzero[pix % 2] = epixel; + } + else + { + oddeven[pix % 2] = epixel; + if (epixel) + nonzero[pix % 2] = epixel; + else + epixel = nonzero[pix % 2]; + } + unsigned spix = epixel - 0xf; + if (spix <= 0xffff) + rowptr[col++] = spix & 0xffff; + else + { + epixel = (((signed int)(epixel + 0x7ffffff1)) >> 0x1f); + rowptr[col++] = epixel & 0x3fff; + } + } + } + } + } + free(iobuf); + tiff_bps = RT_pana_info.bpp; +} + +void CLASS panasonicC7_load_raw() +{ + const int rowstep = 16; + int pixperblock = RT_pana_info.bpp == 14 ? 9 : 10; + int rowbytes = raw_width / pixperblock * 16; + unsigned char *iobuf = (unsigned char *)malloc(rowbytes * rowstep); + merror(iobuf, "panasonicC7_load_raw()"); + for (int row = 0; row < raw_height - rowstep + 1; + row += rowstep) + { + int rowstoread = MIN(rowstep, raw_height - row); + fread (iobuf, rowbytes, rowstoread, ifp); + unsigned char *bytes = iobuf; + for (int crow = 0; crow < rowstoread; crow++) + { + unsigned short *rowptr = &raw_image[(row + crow)]; + for (int col = 0; col < raw_width - pixperblock + 1; + col += pixperblock, bytes += 16) + { + if (RT_pana_info.bpp == 14) + { + rowptr[col] = bytes[0] + ((bytes[1] & 0x3F) << 8); + rowptr[col + 1] = + (bytes[1] >> 6) + 4 * (bytes[2]) + ((bytes[3] & 0xF) << 10); + rowptr[col + 2] = + (bytes[3] >> 4) + 16 * (bytes[4]) + ((bytes[5] & 3) << 12); + rowptr[col + 3] = ((bytes[5] & 0xFC) >> 2) + (bytes[6] << 6); + rowptr[col + 4] = bytes[7] + ((bytes[8] & 0x3F) << 8); + rowptr[col + 5] = + (bytes[8] >> 6) + 4 * bytes[9] + ((bytes[10] & 0xF) << 10); + rowptr[col + 6] = + (bytes[10] >> 4) + 16 * bytes[11] + ((bytes[12] & 3) << 12); + rowptr[col + 7] = ((bytes[12] & 0xFC) >> 2) + (bytes[13] << 6); + rowptr[col + 8] = bytes[14] + ((bytes[15] & 0x3F) << 8); + } + else if (RT_pana_info.bpp == + 12) // have not seen in the wild yet + { + rowptr[col] = ((bytes[1] & 0xF) << 8) + bytes[0]; + rowptr[col + 1] = 16 * bytes[2] + (bytes[1] >> 4); + rowptr[col + 2] = ((bytes[4] & 0xF) << 8) + bytes[3]; + rowptr[col + 3] = 16 * bytes[5] + (bytes[4] >> 4); + rowptr[col + 4] = ((bytes[7] & 0xF) << 8) + bytes[6]; + rowptr[col + 5] = 16 * bytes[8] + (bytes[7] >> 4); + rowptr[col + 6] = ((bytes[10] & 0xF) << 8) + bytes[9]; + rowptr[col + 7] = 16 * bytes[11] + (bytes[10] >> 4); + rowptr[col + 8] = ((bytes[13] & 0xF) << 8) + bytes[12]; + rowptr[col + 9] = 16 * bytes[14] + (bytes[13] >> 4); + } + } + } + } + free(iobuf); + tiff_bps = RT_pana_info.bpp; +} + //----------------------------------------------------------------------------- /* RT: Delete from here */ diff --git a/rtengine/dcraw.h b/rtengine/dcraw.h index 5e17b47ab..522cc798d 100644 --- a/rtengine/dcraw.h +++ b/rtengine/dcraw.h @@ -411,6 +411,21 @@ private: unsigned encoding; }; +class pana_cs6_page_decoder +{ + unsigned int pixelbuffer[14], lastoffset, maxoffset; + unsigned char current, *buffer; + public: + pana_cs6_page_decoder(unsigned char *_buffer, unsigned int bsize) + : lastoffset(0), maxoffset(bsize), current(0), buffer(_buffer) + { + } + void read_page(); // will throw IO error if not enough space in buffer + unsigned int nextpixel() { return current < 14 ? pixelbuffer[current++] : 0; } +}; +void panasonicC6_load_raw(); +void panasonicC7_load_raw(); + void canon_rmf_load_raw(); void panasonic_load_raw(); void olympus_load_raw(); From 70a00d335acf5d3331da6c6c1e959d09ea91f443 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Wed, 6 Nov 2019 14:53:50 +0100 Subject: [PATCH 137/208] better white level for panasonic dc-s1 --- rtengine/camconst.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index 169b0b0b7..32e8bc628 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -2144,7 +2144,7 @@ Camera constants: { // Quality B, per ISO info missing "make_model": [ "Panasonic DC-S1", "Panasonic DC-S1R" ], - "ranges": { "white": 16383 } + "ranges": { "white": 16225 } }, { // Quality B, per ISO info missing From 2da0990433462eda5b099a7b57581012fbf3fdc6 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Wed, 6 Nov 2019 23:07:41 +0100 Subject: [PATCH 138/208] make own compilation unit for panasonic decoders --- rtengine/CMakeLists.txt | 1 + rtengine/dcraw.cc | 260 ------------------------------- rtengine/dcraw.h | 12 -- rtengine/panasonic_decoders.cc | 276 +++++++++++++++++++++++++++++++++ 4 files changed, 277 insertions(+), 272 deletions(-) create mode 100644 rtengine/panasonic_decoders.cc diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt index 07b0d9f84..c37341c8b 100644 --- a/rtengine/CMakeLists.txt +++ b/rtengine/CMakeLists.txt @@ -104,6 +104,7 @@ set(RTENGINESOURCEFILES lj92.c loadinitial.cc myfile.cc + panasonic_decoders.cc pdaflinesfilter.cc PF_correct_RT.cc pipettebuffer.cc diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index 7278f867f..b81594dc4 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -2688,97 +2688,6 @@ void CLASS canon_rmf_load_raw() maximum = curve[0x3ff]; } -unsigned CLASS pana_bits_t::operator() (int nbits, unsigned *bytes) -{ -/*RT static uchar buf[0x4000]; */ -/*RT static int vbits;*/ - int byte; - - if (!nbits && !bytes) return vbits=0; - if (!vbits) { - fread (buf+load_flags, 1, 0x4000-load_flags, ifp); - fread (buf, 1, load_flags, ifp); - } - if (encoding == 5) { - for (byte = 0; byte < 16; byte++) - { - bytes[byte] = buf[vbits++]; - vbits &= 0x3FFF; - } - return 0; - } else { - vbits = (vbits - nbits) & 0x1ffff; - byte = vbits >> 3 ^ 0x3ff0; - return (buf[byte] | buf[byte+1] << 8) >> (vbits & 7) & ~(-1 << nbits); - } -} - -void CLASS panasonic_load_raw() -{ - pana_bits_t pana_bits(ifp,load_flags, RT_pana_info.encoding); - int row, col, i, j, sh=0, pred[2], nonz[2]; - unsigned bytes[16] = {}; - ushort *raw_block_data; - - pana_bits(0, 0); - int enc_blck_size = RT_pana_info.bpp == 12 ? 10 : 9; - if (RT_pana_info.encoding == 5) { - for (row = 0; row < raw_height; row++) - { - raw_block_data = raw_image + row * raw_width; - - for (col = 0; col < raw_width; col += enc_blck_size) { - pana_bits(0, bytes); - - if (RT_pana_info.bpp == 12) { - raw_block_data[col] = ((bytes[1] & 0xF) << 8) + bytes[0]; - raw_block_data[col + 1] = 16 * bytes[2] + (bytes[1] >> 4); - raw_block_data[col + 2] = ((bytes[4] & 0xF) << 8) + bytes[3]; - raw_block_data[col + 3] = 16 * bytes[5] + (bytes[4] >> 4); - raw_block_data[col + 4] = ((bytes[7] & 0xF) << 8) + bytes[6]; - raw_block_data[col + 5] = 16 * bytes[8] + (bytes[7] >> 4); - raw_block_data[col + 6] = ((bytes[10] & 0xF) << 8) + bytes[9]; - raw_block_data[col + 7] = 16 * bytes[11] + (bytes[10] >> 4); - raw_block_data[col + 8] = ((bytes[13] & 0xF) << 8) + bytes[12]; - raw_block_data[col + 9] = 16 * bytes[14] + (bytes[13] >> 4); - } - else if (RT_pana_info.bpp == 14) { - raw_block_data[col] = bytes[0] + ((bytes[1] & 0x3F) << 8); - raw_block_data[col + 1] = (bytes[1] >> 6) + 4 * (bytes[2]) + - ((bytes[3] & 0xF) << 10); - raw_block_data[col + 2] = (bytes[3] >> 4) + 16 * (bytes[4]) + - ((bytes[5] & 3) << 12); - raw_block_data[col + 3] = ((bytes[5] & 0xFC) >> 2) + (bytes[6] << 6); - raw_block_data[col + 4] = bytes[7] + ((bytes[8] & 0x3F) << 8); - raw_block_data[col + 5] = (bytes[8] >> 6) + 4 * bytes[9] + ((bytes[10] & 0xF) << 10); - raw_block_data[col + 6] = (bytes[10] >> 4) + 16 * bytes[11] + ((bytes[12] & 3) << 12); - raw_block_data[col + 7] = ((bytes[12] & 0xFC) >> 2) + (bytes[13] << 6); - raw_block_data[col + 8] = bytes[14] + ((bytes[15] & 0x3F) << 8); - } - } - } - } else if (RT_pana_info.encoding == 6) { - panasonicC6_load_raw(); - } else if (RT_pana_info.encoding == 7) { - panasonicC7_load_raw(); - } else { - for (row=0; row < height; row++) - for (col=0; col < raw_width; col++) { - if ((i = col % 14) == 0) - pred[0] = pred[1] = nonz[0] = nonz[1] = 0; - if (i % 3 == 2) sh = 4 >> (3 - pana_bits(2)); - if (nonz[i & 1]) { - if ((j = pana_bits(8))) { - if ((pred[i & 1] -= 0x80 << sh) < 0 || sh == 4) - pred[i & 1] &= ~(-1 << sh); - pred[i & 1] += j << sh; - } - } else if ((nonz[i & 1] = pana_bits(8)) || i > 11) - pred[i & 1] = nonz[i & 1] << 4 | pana_bits(4); - if ((RAW(row,col) = pred[col & 1]) > 4098 && col < width) derror(); - } - } -} void CLASS olympus_load_raw() { @@ -10763,175 +10672,6 @@ void CLASS nikon_14bit_load_raw() free(buf); } -// Code adapted from libraw -/* -*- C++ -*- - * Copyright 2019 LibRaw LLC (info@libraw.org) - * - LibRaw is free software; you can redistribute it and/or modify - it under the terms of the one of two licenses as you choose: - -1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 - (See file LICENSE.LGPL provided in LibRaw distribution archive for details). - -2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 - (See file LICENSE.CDDL provided in LibRaw distribution archive for details). - - */ - -void CLASS pana_cs6_page_decoder::read_page() -{ - if (!buffer || (maxoffset - lastoffset < 16)) - ; -#define wbuffer(i) ((unsigned short)buffer[lastoffset + 15 - i]) - pixelbuffer[0] = (wbuffer(0) << 6) | (wbuffer(1) >> 2); // 14 bit - pixelbuffer[1] = - (((wbuffer(1) & 0x3) << 12) | (wbuffer(2) << 4) | (wbuffer(3) >> 4)) & - 0x3fff; - pixelbuffer[2] = (wbuffer(3) >> 2) & 0x3; - pixelbuffer[3] = ((wbuffer(3) & 0x3) << 8) | wbuffer(4); - pixelbuffer[4] = (wbuffer(5) << 2) | (wbuffer(6) >> 6); - pixelbuffer[5] = ((wbuffer(6) & 0x3f) << 4) | (wbuffer(7) >> 4); - pixelbuffer[6] = (wbuffer(7) >> 2) & 0x3; - pixelbuffer[7] = ((wbuffer(7) & 0x3) << 8) | wbuffer(8); - pixelbuffer[8] = ((wbuffer(9) << 2) & 0x3fc) | (wbuffer(10) >> 6); - pixelbuffer[9] = ((wbuffer(10) << 4) | (wbuffer(11) >> 4)) & 0x3ff; - pixelbuffer[10] = (wbuffer(11) >> 2) & 0x3; - pixelbuffer[11] = ((wbuffer(11) & 0x3) << 8) | wbuffer(12); - pixelbuffer[12] = (((wbuffer(13) << 2) & 0x3fc) | wbuffer(14) >> 6) & 0x3ff; - pixelbuffer[13] = ((wbuffer(14) << 4) | (wbuffer(15) >> 4)) & 0x3ff; -#undef wbuffer - current = 0; - lastoffset += 16; -} - -void CLASS panasonicC6_load_raw() -{ - const int rowstep = 16; - const int blocksperrow = raw_width / 11; - const int rowbytes = blocksperrow * 16; - unsigned char *iobuf = (unsigned char *)malloc(rowbytes * rowstep); - merror(iobuf, "panasonicC6_load_raw()"); - - for (int row = 0; row < raw_height - rowstep + 1; - row += rowstep) - { - int rowstoread = MIN(rowstep, raw_height - row); - fread (iobuf, rowbytes, rowstoread, ifp); -// if (libraw_internal_data.internal_data.input->read( -// iobuf, rowbytes, rowstoread) != rowstoread) -// throw LIBRAW_EXCEPTION_IO_EOF; - pana_cs6_page_decoder page(iobuf, rowbytes * rowstoread); - for (int crow = 0, col = 0; crow < rowstoread; crow++, col = 0) - { - unsigned short *rowptr = &raw_image[(row + crow) * raw_width]; - for (int rblock = 0; rblock < blocksperrow; rblock++) - { - page.read_page(); - unsigned oddeven[2] = {0, 0}, nonzero[2] = {0, 0}; - unsigned pmul = 0, pixel_base = 0; - for (int pix = 0; pix < 11; pix++) - { - if (pix % 3 == 2) - { - unsigned base = page.nextpixel(); - if (base > 3); -// throw LIBRAW_EXCEPTION_IO_CORRUPT; // not possible b/c of 2-bit - // field, but.... - if (base == 3) - base = 4; - pixel_base = 0x200 << base; - pmul = 1 << base; - } - unsigned epixel = page.nextpixel(); - if (oddeven[pix % 2]) - { - epixel *= pmul; - if (pixel_base < 0x2000 && nonzero[pix % 2] > pixel_base) - epixel += nonzero[pix % 2] - pixel_base; - nonzero[pix % 2] = epixel; - } - else - { - oddeven[pix % 2] = epixel; - if (epixel) - nonzero[pix % 2] = epixel; - else - epixel = nonzero[pix % 2]; - } - unsigned spix = epixel - 0xf; - if (spix <= 0xffff) - rowptr[col++] = spix & 0xffff; - else - { - epixel = (((signed int)(epixel + 0x7ffffff1)) >> 0x1f); - rowptr[col++] = epixel & 0x3fff; - } - } - } - } - } - free(iobuf); - tiff_bps = RT_pana_info.bpp; -} - -void CLASS panasonicC7_load_raw() -{ - const int rowstep = 16; - int pixperblock = RT_pana_info.bpp == 14 ? 9 : 10; - int rowbytes = raw_width / pixperblock * 16; - unsigned char *iobuf = (unsigned char *)malloc(rowbytes * rowstep); - merror(iobuf, "panasonicC7_load_raw()"); - for (int row = 0; row < raw_height - rowstep + 1; - row += rowstep) - { - int rowstoread = MIN(rowstep, raw_height - row); - fread (iobuf, rowbytes, rowstoread, ifp); - unsigned char *bytes = iobuf; - for (int crow = 0; crow < rowstoread; crow++) - { - unsigned short *rowptr = &raw_image[(row + crow)]; - for (int col = 0; col < raw_width - pixperblock + 1; - col += pixperblock, bytes += 16) - { - if (RT_pana_info.bpp == 14) - { - rowptr[col] = bytes[0] + ((bytes[1] & 0x3F) << 8); - rowptr[col + 1] = - (bytes[1] >> 6) + 4 * (bytes[2]) + ((bytes[3] & 0xF) << 10); - rowptr[col + 2] = - (bytes[3] >> 4) + 16 * (bytes[4]) + ((bytes[5] & 3) << 12); - rowptr[col + 3] = ((bytes[5] & 0xFC) >> 2) + (bytes[6] << 6); - rowptr[col + 4] = bytes[7] + ((bytes[8] & 0x3F) << 8); - rowptr[col + 5] = - (bytes[8] >> 6) + 4 * bytes[9] + ((bytes[10] & 0xF) << 10); - rowptr[col + 6] = - (bytes[10] >> 4) + 16 * bytes[11] + ((bytes[12] & 3) << 12); - rowptr[col + 7] = ((bytes[12] & 0xFC) >> 2) + (bytes[13] << 6); - rowptr[col + 8] = bytes[14] + ((bytes[15] & 0x3F) << 8); - } - else if (RT_pana_info.bpp == - 12) // have not seen in the wild yet - { - rowptr[col] = ((bytes[1] & 0xF) << 8) + bytes[0]; - rowptr[col + 1] = 16 * bytes[2] + (bytes[1] >> 4); - rowptr[col + 2] = ((bytes[4] & 0xF) << 8) + bytes[3]; - rowptr[col + 3] = 16 * bytes[5] + (bytes[4] >> 4); - rowptr[col + 4] = ((bytes[7] & 0xF) << 8) + bytes[6]; - rowptr[col + 5] = 16 * bytes[8] + (bytes[7] >> 4); - rowptr[col + 6] = ((bytes[10] & 0xF) << 8) + bytes[9]; - rowptr[col + 7] = 16 * bytes[11] + (bytes[10] >> 4); - rowptr[col + 8] = ((bytes[13] & 0xF) << 8) + bytes[12]; - rowptr[col + 9] = 16 * bytes[14] + (bytes[13] >> 4); - } - } - } - } - free(iobuf); - tiff_bps = RT_pana_info.bpp; -} - -//----------------------------------------------------------------------------- - /* RT: Delete from here */ /*RT*/#undef SQR /*RT*/#undef MAX diff --git a/rtengine/dcraw.h b/rtengine/dcraw.h index 522cc798d..3d753d876 100644 --- a/rtengine/dcraw.h +++ b/rtengine/dcraw.h @@ -411,18 +411,6 @@ private: unsigned encoding; }; -class pana_cs6_page_decoder -{ - unsigned int pixelbuffer[14], lastoffset, maxoffset; - unsigned char current, *buffer; - public: - pana_cs6_page_decoder(unsigned char *_buffer, unsigned int bsize) - : lastoffset(0), maxoffset(bsize), current(0), buffer(_buffer) - { - } - void read_page(); // will throw IO error if not enough space in buffer - unsigned int nextpixel() { return current < 14 ? pixelbuffer[current++] : 0; } -}; void panasonicC6_load_raw(); void panasonicC7_load_raw(); diff --git a/rtengine/panasonic_decoders.cc b/rtengine/panasonic_decoders.cc new file mode 100644 index 000000000..8949a0851 --- /dev/null +++ b/rtengine/panasonic_decoders.cc @@ -0,0 +1,276 @@ + +#include "StopWatch.h" +#include +#include "dcraw.h" +// Code adapted from libraw +/* -*- C++ -*- + * Copyright 2019 LibRaw LLC (info@libraw.org) + * + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + +*/ + + +unsigned DCraw::pana_bits_t::operator() (int nbits, unsigned *bytes) +{ + int byte; + + if (!nbits && !bytes) { + return vbits=0; + } + if (!vbits) { + fread (buf+load_flags, 1, 0x4000-load_flags, ifp); + fread (buf, 1, load_flags, ifp); + } + if (encoding == 5) { + for (byte = 0; byte < 16; byte++) + { + bytes[byte] = buf[vbits++]; + vbits &= 0x3FFF; + } + return 0; + } else { + vbits = (vbits - nbits) & 0x1ffff; + byte = vbits >> 3 ^ 0x3ff0; + return (buf[byte] | buf[byte+1] << 8) >> (vbits & 7) & ~(-1 << nbits); + } +} + +class pana_cs6_page_decoder +{ + unsigned int pixelbuffer[14], lastoffset, maxoffset; + unsigned char current, *buffer; + public: + pana_cs6_page_decoder(unsigned char *_buffer, unsigned int bsize) + : lastoffset(0), maxoffset(bsize), current(0), buffer(_buffer) + { + } + void read_page(); // will throw IO error if not enough space in buffer + unsigned int nextpixel() { return current < 14 ? pixelbuffer[current++] : 0; } +}; + +#define wbuffer(i) ((unsigned short)buffer[lastoffset + 15 - i]) + +void pana_cs6_page_decoder::read_page() +{ + if (!buffer || (maxoffset - lastoffset < 16)) + ; + pixelbuffer[0] = (wbuffer(0) << 6) | (wbuffer(1) >> 2); // 14 bit + pixelbuffer[1] = (((wbuffer(1) & 0x3) << 12) | (wbuffer(2) << 4) | (wbuffer(3) >> 4)) & 0x3fff; + pixelbuffer[2] = (wbuffer(3) >> 2) & 0x3; + pixelbuffer[3] = ((wbuffer(3) & 0x3) << 8) | wbuffer(4); + pixelbuffer[4] = (wbuffer(5) << 2) | (wbuffer(6) >> 6); + pixelbuffer[5] = ((wbuffer(6) & 0x3f) << 4) | (wbuffer(7) >> 4); + pixelbuffer[6] = (wbuffer(7) >> 2) & 0x3; + pixelbuffer[7] = ((wbuffer(7) & 0x3) << 8) | wbuffer(8); + pixelbuffer[8] = ((wbuffer(9) << 2) & 0x3fc) | (wbuffer(10) >> 6); + pixelbuffer[9] = ((wbuffer(10) << 4) | (wbuffer(11) >> 4)) & 0x3ff; + pixelbuffer[10] = (wbuffer(11) >> 2) & 0x3; + pixelbuffer[11] = ((wbuffer(11) & 0x3) << 8) | wbuffer(12); + pixelbuffer[12] = (((wbuffer(13) << 2) & 0x3fc) | wbuffer(14) >> 6) & 0x3ff; + pixelbuffer[13] = ((wbuffer(14) << 4) | (wbuffer(15) >> 4)) & 0x3ff; + current = 0; + lastoffset += 16; +} +#undef wbuffer + +void DCraw::panasonic_load_raw() +{ +StopWatch Stop1("panasonic_load_raw"); + pana_bits_t pana_bits(ifp,load_flags, RT_pana_info.encoding); + int row, col, i, j, sh=0, pred[2], nonz[2]; + unsigned bytes[16] = {}; + + pana_bits(0, 0); + int enc_blck_size = RT_pana_info.bpp == 12 ? 10 : 9; + if (RT_pana_info.encoding == 5 || RT_pana_info.encoding == 7) { + for (row = 0; row < raw_height; row++) { + ushort* raw_block_data = raw_image + row * raw_width; + + for (col = 0; col < raw_width; col += enc_blck_size) { + pana_bits(0, bytes); + + if (RT_pana_info.bpp == 12) { + raw_block_data[col] = ((bytes[1] & 0xF) << 8) + bytes[0]; + raw_block_data[col + 1] = 16 * bytes[2] + (bytes[1] >> 4); + raw_block_data[col + 2] = ((bytes[4] & 0xF) << 8) + bytes[3]; + raw_block_data[col + 3] = 16 * bytes[5] + (bytes[4] >> 4); + raw_block_data[col + 4] = ((bytes[7] & 0xF) << 8) + bytes[6]; + raw_block_data[col + 5] = 16 * bytes[8] + (bytes[7] >> 4); + raw_block_data[col + 6] = ((bytes[10] & 0xF) << 8) + bytes[9]; + raw_block_data[col + 7] = 16 * bytes[11] + (bytes[10] >> 4); + raw_block_data[col + 8] = ((bytes[13] & 0xF) << 8) + bytes[12]; + raw_block_data[col + 9] = 16 * bytes[14] + (bytes[13] >> 4); + } + else if (RT_pana_info.bpp == 14) { + raw_block_data[col] = bytes[0] + ((bytes[1] & 0x3F) << 8); + raw_block_data[col + 1] = (bytes[1] >> 6) + 4 * (bytes[2]) + + ((bytes[3] & 0xF) << 10); + raw_block_data[col + 2] = (bytes[3] >> 4) + 16 * (bytes[4]) + + ((bytes[5] & 3) << 12); + raw_block_data[col + 3] = ((bytes[5] & 0xFC) >> 2) + (bytes[6] << 6); + raw_block_data[col + 4] = bytes[7] + ((bytes[8] & 0x3F) << 8); + raw_block_data[col + 5] = (bytes[8] >> 6) + 4 * bytes[9] + ((bytes[10] & 0xF) << 10); + raw_block_data[col + 6] = (bytes[10] >> 4) + 16 * bytes[11] + ((bytes[12] & 3) << 12); + raw_block_data[col + 7] = ((bytes[12] & 0xFC) >> 2) + (bytes[13] << 6); + raw_block_data[col + 8] = bytes[14] + ((bytes[15] & 0x3F) << 8); + } + } + } + } else if (RT_pana_info.encoding == 6) { + panasonicC6_load_raw(); + } else if (RT_pana_info.encoding == 7) { + panasonicC7_load_raw(); + } else { + for (row=0; row < height; row++) + for (col=0; col < raw_width; col++) { + if ((i = col % 14) == 0) + pred[0] = pred[1] = nonz[0] = nonz[1] = 0; + if (i % 3 == 2) sh = 4 >> (3 - pana_bits(2)); + if (nonz[i & 1]) { + if ((j = pana_bits(8))) { + if ((pred[i & 1] -= 0x80 << sh) < 0 || sh == 4) + pred[i & 1] &= ~(-1 << sh); + pred[i & 1] += j << sh; + } + } else if ((nonz[i & 1] = pana_bits(8)) || i > 11) + pred[i & 1] = nonz[i & 1] << 4 | pana_bits(4); + if ((raw_image[(row)*raw_width+(col)] = pred[col & 1]) > 4098 && col < width) derror(); + } + } +} + +void DCraw::panasonicC6_load_raw() +{ + const int rowstep = 16; + const int blocksperrow = raw_width / 11; + const int rowbytes = blocksperrow * 16; + unsigned char *iobuf = (unsigned char *)malloc(rowbytes * rowstep); + merror(iobuf, "panasonicC6_load_raw()"); + + for (int row = 0; row < raw_height - rowstep + 1; + row += rowstep) + { + int rowstoread = MIN(rowstep, raw_height - row); + fread (iobuf, rowbytes, rowstoread, ifp); +// if (libraw_internal_data.internal_data.input->read( +// iobuf, rowbytes, rowstoread) != rowstoread) +// throw LIBRAW_EXCEPTION_IO_EOF; + pana_cs6_page_decoder page(iobuf, rowbytes * rowstoread); + for (int crow = 0, col = 0; crow < rowstoread; crow++, col = 0) + { + unsigned short *rowptr = &raw_image[(row + crow) * raw_width]; + for (int rblock = 0; rblock < blocksperrow; rblock++) + { + page.read_page(); + unsigned oddeven[2] = {0, 0}, nonzero[2] = {0, 0}; + unsigned pmul = 0, pixel_base = 0; + for (int pix = 0; pix < 11; pix++) + { + if (pix % 3 == 2) + { + unsigned base = page.nextpixel(); + if (base > 3); +// throw LIBRAW_EXCEPTION_IO_CORRUPT; // not possible b/c of 2-bit + // field, but.... + if (base == 3) + base = 4; + pixel_base = 0x200 << base; + pmul = 1 << base; + } + unsigned epixel = page.nextpixel(); + if (oddeven[pix % 2]) + { + epixel *= pmul; + if (pixel_base < 0x2000 && nonzero[pix % 2] > pixel_base) + epixel += nonzero[pix % 2] - pixel_base; + nonzero[pix % 2] = epixel; + } + else + { + oddeven[pix % 2] = epixel; + if (epixel) + nonzero[pix % 2] = epixel; + else + epixel = nonzero[pix % 2]; + } + unsigned spix = epixel - 0xf; + if (spix <= 0xffff) + rowptr[col++] = spix & 0xffff; + else + { + epixel = (((signed int)(epixel + 0x7ffffff1)) >> 0x1f); + rowptr[col++] = epixel & 0x3fff; + } + } + } + } + } + free(iobuf); + tiff_bps = RT_pana_info.bpp; +} + +void DCraw::panasonicC7_load_raw() +{ + constexpr int rowstep = 16; + const int pixperblock = RT_pana_info.bpp == 14 ? 9 : 10; + const int rowbytes = raw_width / pixperblock * 16; + + unsigned char *iobuf = (unsigned char *)malloc(rowbytes * rowstep); + merror(iobuf, "panasonicC7_load_raw()"); + for (int row = 0; row < raw_height - rowstep + 1; row += rowstep) { + const int rowstoread = MIN(rowstep, raw_height - row); + fread (iobuf, rowbytes, rowstoread, ifp); + unsigned char *bytes = iobuf; + for (int crow = 0; crow < rowstoread; crow++) { + unsigned short *rowptr = &raw_image[row + crow]; + for (int col = 0; col < raw_width - pixperblock + 1; col += pixperblock, bytes += 16) { + if (RT_pana_info.bpp == 14) { + rowptr[col] = bytes[0] + ((bytes[1] & 0x3F) << 8); + rowptr[col + 1] = (bytes[1] >> 6) + 4 * (bytes[2]) + ((bytes[3] & 0xF) << 10); + rowptr[col + 2] = (bytes[3] >> 4) + 16 * (bytes[4]) + ((bytes[5] & 3) << 12); + rowptr[col + 3] = ((bytes[5] & 0xFC) >> 2) + (bytes[6] << 6); + rowptr[col + 4] = bytes[7] + ((bytes[8] & 0x3F) << 8); + rowptr[col + 5] = (bytes[8] >> 6) + 4 * bytes[9] + ((bytes[10] & 0xF) << 10); + rowptr[col + 6] = (bytes[10] >> 4) + 16 * bytes[11] + ((bytes[12] & 3) << 12); + rowptr[col + 7] = ((bytes[12] & 0xFC) >> 2) + (bytes[13] << 6); + rowptr[col + 8] = bytes[14] + ((bytes[15] & 0x3F) << 8); + } else if (RT_pana_info.bpp == 12) { // have not seen in the wild yet + rowptr[col] = ((bytes[1] & 0xF) << 8) + bytes[0]; + rowptr[col + 1] = 16 * bytes[2] + (bytes[1] >> 4); + rowptr[col + 2] = ((bytes[4] & 0xF) << 8) + bytes[3]; + rowptr[col + 3] = 16 * bytes[5] + (bytes[4] >> 4); + rowptr[col + 4] = ((bytes[7] & 0xF) << 8) + bytes[6]; + rowptr[col + 5] = 16 * bytes[8] + (bytes[7] >> 4); + rowptr[col + 6] = ((bytes[10] & 0xF) << 8) + bytes[9]; + rowptr[col + 7] = 16 * bytes[11] + (bytes[10] >> 4); + rowptr[col + 8] = ((bytes[13] & 0xF) << 8) + bytes[12]; + rowptr[col + 9] = 16 * bytes[14] + (bytes[13] >> 4); + } + } + } + } + free(iobuf); + tiff_bps = RT_pana_info.bpp; +} + +//----------------------------------------------------------------------------- + +/* RT: Delete from here */ +/*RT*/#undef SQR +/*RT*/#undef MAX +/*RT*/#undef MIN +/*RT*/#undef ABS +/*RT*/#undef LIM +/*RT*/#undef ULIM +/*RT*/#undef CLIP +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif From 254d9494de3248d882a6fd3ab52d778fadac83d7 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Wed, 6 Nov 2019 23:12:52 +0100 Subject: [PATCH 139/208] cleanup --- rtengine/panasonic_decoders.cc | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/rtengine/panasonic_decoders.cc b/rtengine/panasonic_decoders.cc index 8949a0851..709f60ab7 100644 --- a/rtengine/panasonic_decoders.cc +++ b/rtengine/panasonic_decoders.cc @@ -260,17 +260,3 @@ void DCraw::panasonicC7_load_raw() free(iobuf); tiff_bps = RT_pana_info.bpp; } - -//----------------------------------------------------------------------------- - -/* RT: Delete from here */ -/*RT*/#undef SQR -/*RT*/#undef MAX -/*RT*/#undef MIN -/*RT*/#undef ABS -/*RT*/#undef LIM -/*RT*/#undef ULIM -/*RT*/#undef CLIP -#ifdef __GNUC__ -#pragma GCC diagnostic pop -#endif From bc6280afdf95818501e6b063fc63221257168615 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 7 Nov 2019 15:39:03 +0100 Subject: [PATCH 140/208] Fix decoding of Panasonic Highres files, #5204 --- rtengine/panasonic_decoders.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtengine/panasonic_decoders.cc b/rtengine/panasonic_decoders.cc index 709f60ab7..5630ae3f2 100644 --- a/rtengine/panasonic_decoders.cc +++ b/rtengine/panasonic_decoders.cc @@ -90,7 +90,7 @@ StopWatch Stop1("panasonic_load_raw"); pana_bits(0, 0); int enc_blck_size = RT_pana_info.bpp == 12 ? 10 : 9; - if (RT_pana_info.encoding == 5 || RT_pana_info.encoding == 7) { + if (RT_pana_info.encoding == 5) { for (row = 0; row < raw_height; row++) { ushort* raw_block_data = raw_image + row * raw_width; @@ -230,7 +230,7 @@ void DCraw::panasonicC7_load_raw() fread (iobuf, rowbytes, rowstoread, ifp); unsigned char *bytes = iobuf; for (int crow = 0; crow < rowstoread; crow++) { - unsigned short *rowptr = &raw_image[row + crow]; + ushort *rowptr = &raw_image[(row + crow) * raw_width]; for (int col = 0; col < raw_width - pixperblock + 1; col += pixperblock, bytes += 16) { if (RT_pana_info.bpp == 14) { rowptr[col] = bytes[0] + ((bytes[1] & 0x3F) << 8); From ffa461d3de7d7c7a73619d6c786f5989b06fb3e7 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 7 Nov 2019 18:47:11 +0100 Subject: [PATCH 141/208] Bottleneck when loading Panasonic RW2 files, #5517 --- rtexif/rtexif.cc | 21 +++++++++++---------- rtexif/rtexif.h | 9 +++++++-- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/rtexif/rtexif.cc b/rtexif/rtexif.cc index b2edc2842..89ff6cd33 100644 --- a/rtexif/rtexif.cc +++ b/rtexif/rtexif.cc @@ -54,13 +54,13 @@ Interpreter stdInterpreter; //----------------------------------------------------------------------------- TagDirectory::TagDirectory () - : attribs (ifdAttribs), order (HOSTORDER), parent (nullptr) {} + : attribs (ifdAttribs), order (HOSTORDER), parent (nullptr), parseJPEG(true) {} TagDirectory::TagDirectory (TagDirectory* p, const TagAttrib* ta, ByteOrder border) - : attribs (ta), order (border), parent (p) {} + : attribs (ta), order (border), parent (p), parseJPEG(true) {} -TagDirectory::TagDirectory (TagDirectory* p, FILE* f, int base, const TagAttrib* ta, ByteOrder border, bool skipIgnored) - : attribs (ta), order (border), parent (p) +TagDirectory::TagDirectory (TagDirectory* p, FILE* f, int base, const TagAttrib* ta, ByteOrder border, bool skipIgnored, bool parseJpeg) + : attribs (ta), order (border), parent (p), parseJPEG(parseJpeg) { int numOfTags = get2 (f, order); @@ -980,9 +980,10 @@ Tag::Tag (TagDirectory* p, FILE* f, int base) } } - if (tag == 0x002e) { // location of the embedded preview image in raw files of Panasonic cameras + if (parent->getParseJpeg() && tag == 0x002e) { // location of the embedded preview image in raw files of Panasonic cameras ExifManager eManager(f, nullptr, true); const auto fpos = ftell(f); + if (fpos >= 0) { eManager.parseJPEG(fpos); // try to parse the exif data from the preview image @@ -1239,7 +1240,7 @@ defsubdirs: for (size_t j = 0, i = 0; j < count; j++, i++) { int newpos = base + toInt (j * 4, LONG); fseek (f, newpos, SEEK_SET); - directory[i] = new TagDirectory (parent, f, base, attrib->subdirAttribs, order); + directory[i] = new TagDirectory (parent, f, base, attrib->subdirAttribs, order, true, parent->getParseJpeg()); } // set the terminating NULL @@ -1374,7 +1375,7 @@ bool Tag::parseMakerNote (FILE* f, int base, ByteOrder bom ) value = new unsigned char[12]; fread (value, 1, 12, f); directory = new TagDirectory*[2]; - directory[0] = new TagDirectory (parent, f, base, panasonicAttribs, bom); + directory[0] = new TagDirectory (parent, f, base, panasonicAttribs, bom, true, parent->getParseJpeg()); directory[1] = nullptr; } else { return false; @@ -2777,7 +2778,7 @@ void ExifManager::parseStd (bool skipIgnored) { parse(false, skipIgnored); } -void ExifManager::parse (bool isRaw, bool skipIgnored) +void ExifManager::parse (bool isRaw, bool skipIgnored, bool parseJpeg) { int ifdOffset = IFDOffset; @@ -2806,7 +2807,7 @@ void ExifManager::parse (bool isRaw, bool skipIgnored) fseek (f, rml->exifBase + ifdOffset, SEEK_SET); // first read the IFD directory - TagDirectory* root = new TagDirectory (nullptr, f, rml->exifBase, ifdAttribs, order, skipIgnored); + TagDirectory* root = new TagDirectory (nullptr, f, rml->exifBase, ifdAttribs, order, skipIgnored, parseJpeg); // fix ISO issue with nikon and panasonic cameras Tag* make = root->getTag ("Make"); @@ -3174,7 +3175,7 @@ void ExifManager::parseJPEG (int offset) rml.reset(new rtengine::RawMetaDataLocation(0)); } rml->exifBase = tiffbase; - parse (false); + parse (false, true, false); if (rmlCreated) { rml.reset(); } diff --git a/rtexif/rtexif.h b/rtexif/rtexif.h index 4c5a6cafe..c37533352 100644 --- a/rtexif/rtexif.h +++ b/rtexif/rtexif.h @@ -119,11 +119,12 @@ protected: const TagAttrib* attribs; // descriptor table to decode the tags ByteOrder order; // byte order TagDirectory* parent; // parent directory (NULL if root) + bool parseJPEG; static Glib::ustring getDumpKey (int tagID, const Glib::ustring &tagName); public: TagDirectory (); - TagDirectory (TagDirectory* p, FILE* f, int base, const TagAttrib* ta, ByteOrder border, bool skipIgnored = true); + TagDirectory (TagDirectory* p, FILE* f, int base, const TagAttrib* ta, ByteOrder border, bool skipIgnored = true, bool parseJpeg = true); TagDirectory (TagDirectory* p, const TagAttrib* ta, ByteOrder border); virtual ~TagDirectory (); @@ -135,6 +136,10 @@ public: { return parent; } + inline bool getParseJpeg() const + { + return parseJPEG; + } TagDirectory* getRoot (); inline int getCount () const { @@ -346,7 +351,7 @@ class ExifManager Tag* saveCIFFMNTag (TagDirectory* root, int len, const char* name); void parseCIFF (int length, TagDirectory* root); - void parse (bool isRaw, bool skipIgnored = true); + void parse (bool isRaw, bool skipIgnored = true, bool parseJpeg = true); public: FILE* f; From 9ac34eb33cb999fd105d5c35286970ce8cb4ec08 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 7 Nov 2019 19:35:02 +0100 Subject: [PATCH 142/208] panasonic decoders: cleanup --- rtengine/panasonic_decoders.cc | 250 ++++++++++++++++++--------------- 1 file changed, 133 insertions(+), 117 deletions(-) diff --git a/rtengine/panasonic_decoders.cc b/rtengine/panasonic_decoders.cc index 5630ae3f2..37f586a6b 100644 --- a/rtengine/panasonic_decoders.cc +++ b/rtengine/panasonic_decoders.cc @@ -1,7 +1,23 @@ +/* + * This file is part of RawTherapee. + * + * RawTherapee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RawTherapee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RawTherapee. If not, see . +*/ -#include "StopWatch.h" #include #include "dcraw.h" + // Code adapted from libraw /* -*- C++ -*- * Copyright 2019 LibRaw LLC (info@libraw.org) @@ -17,7 +33,6 @@ */ - unsigned DCraw::pana_bits_t::operator() (int nbits, unsigned *bytes) { int byte; @@ -45,15 +60,18 @@ unsigned DCraw::pana_bits_t::operator() (int nbits, unsigned *bytes) class pana_cs6_page_decoder { - unsigned int pixelbuffer[14], lastoffset, maxoffset; - unsigned char current, *buffer; - public: - pana_cs6_page_decoder(unsigned char *_buffer, unsigned int bsize) + unsigned int pixelbuffer[14], lastoffset, maxoffset; + unsigned char current, *buffer; +public: + pana_cs6_page_decoder(unsigned char *_buffer, unsigned int bsize) : lastoffset(0), maxoffset(bsize), current(0), buffer(_buffer) - { - } - void read_page(); // will throw IO error if not enough space in buffer - unsigned int nextpixel() { return current < 14 ? pixelbuffer[current++] : 0; } + { + } + void read_page(); // will throw IO error if not enough space in buffer + unsigned int nextpixel() + { + return current < 14 ? pixelbuffer[current++] : 0; + } }; #define wbuffer(i) ((unsigned short)buffer[lastoffset + 15 - i]) @@ -83,44 +101,39 @@ void pana_cs6_page_decoder::read_page() void DCraw::panasonic_load_raw() { -StopWatch Stop1("panasonic_load_raw"); - pana_bits_t pana_bits(ifp,load_flags, RT_pana_info.encoding); - int row, col, i, j, sh=0, pred[2], nonz[2]; - unsigned bytes[16] = {}; - - pana_bits(0, 0); int enc_blck_size = RT_pana_info.bpp == 12 ? 10 : 9; if (RT_pana_info.encoding == 5) { - for (row = 0; row < raw_height; row++) { + pana_bits_t pana_bits(ifp, load_flags, RT_pana_info.encoding); + pana_bits(0, 0); + unsigned bytes[16] = {}; + for (int row = 0; row < raw_height; ++row) { ushort* raw_block_data = raw_image + row * raw_width; - for (col = 0; col < raw_width; col += enc_blck_size) { + for (int col = 0; col < raw_width; col += enc_blck_size) { pana_bits(0, bytes); if (RT_pana_info.bpp == 12) { - raw_block_data[col] = ((bytes[1] & 0xF) << 8) + bytes[0]; - raw_block_data[col + 1] = 16 * bytes[2] + (bytes[1] >> 4); - raw_block_data[col + 2] = ((bytes[4] & 0xF) << 8) + bytes[3]; - raw_block_data[col + 3] = 16 * bytes[5] + (bytes[4] >> 4); - raw_block_data[col + 4] = ((bytes[7] & 0xF) << 8) + bytes[6]; - raw_block_data[col + 5] = 16 * bytes[8] + (bytes[7] >> 4); - raw_block_data[col + 6] = ((bytes[10] & 0xF) << 8) + bytes[9]; - raw_block_data[col + 7] = 16 * bytes[11] + (bytes[10] >> 4); - raw_block_data[col + 8] = ((bytes[13] & 0xF) << 8) + bytes[12]; - raw_block_data[col + 9] = 16 * bytes[14] + (bytes[13] >> 4); + raw_block_data[col] = ((bytes[1] & 0xF) << 8) + bytes[0]; + raw_block_data[col + 1] = 16 * bytes[2] + (bytes[1] >> 4); + raw_block_data[col + 2] = ((bytes[4] & 0xF) << 8) + bytes[3]; + raw_block_data[col + 3] = 16 * bytes[5] + (bytes[4] >> 4); + raw_block_data[col + 4] = ((bytes[7] & 0xF) << 8) + bytes[6]; + raw_block_data[col + 5] = 16 * bytes[8] + (bytes[7] >> 4); + raw_block_data[col + 6] = ((bytes[10] & 0xF) << 8) + bytes[9]; + raw_block_data[col + 7] = 16 * bytes[11] + (bytes[10] >> 4); + raw_block_data[col + 8] = ((bytes[13] & 0xF) << 8) + bytes[12]; + raw_block_data[col + 9] = 16 * bytes[14] + (bytes[13] >> 4); } else if (RT_pana_info.bpp == 14) { - raw_block_data[col] = bytes[0] + ((bytes[1] & 0x3F) << 8); - raw_block_data[col + 1] = (bytes[1] >> 6) + 4 * (bytes[2]) + - ((bytes[3] & 0xF) << 10); - raw_block_data[col + 2] = (bytes[3] >> 4) + 16 * (bytes[4]) + - ((bytes[5] & 3) << 12); - raw_block_data[col + 3] = ((bytes[5] & 0xFC) >> 2) + (bytes[6] << 6); - raw_block_data[col + 4] = bytes[7] + ((bytes[8] & 0x3F) << 8); - raw_block_data[col + 5] = (bytes[8] >> 6) + 4 * bytes[9] + ((bytes[10] & 0xF) << 10); - raw_block_data[col + 6] = (bytes[10] >> 4) + 16 * bytes[11] + ((bytes[12] & 3) << 12); - raw_block_data[col + 7] = ((bytes[12] & 0xFC) >> 2) + (bytes[13] << 6); - raw_block_data[col + 8] = bytes[14] + ((bytes[15] & 0x3F) << 8); + raw_block_data[col] = bytes[0] + ((bytes[1] & 0x3F) << 8); + raw_block_data[col + 1] = (bytes[1] >> 6) + 4 * (bytes[2]) + ((bytes[3] & 0xF) << 10); + raw_block_data[col + 2] = (bytes[3] >> 4) + 16 * (bytes[4]) + ((bytes[5] & 3) << 12); + raw_block_data[col + 3] = ((bytes[5] & 0xFC) >> 2) + (bytes[6] << 6); + raw_block_data[col + 4] = bytes[7] + ((bytes[8] & 0x3F) << 8); + raw_block_data[col + 5] = (bytes[8] >> 6) + 4 * bytes[9] + ((bytes[10] & 0xF) << 10); + raw_block_data[col + 6] = (bytes[10] >> 4) + 16 * bytes[11] + ((bytes[12] & 3) << 12); + raw_block_data[col + 7] = ((bytes[12] & 0xFC) >> 2) + (bytes[13] << 6); + raw_block_data[col + 8] = bytes[14] + ((bytes[15] & 0x3F) << 8); } } } @@ -129,92 +142,95 @@ StopWatch Stop1("panasonic_load_raw"); } else if (RT_pana_info.encoding == 7) { panasonicC7_load_raw(); } else { - for (row=0; row < height; row++) - for (col=0; col < raw_width; col++) { - if ((i = col % 14) == 0) - pred[0] = pred[1] = nonz[0] = nonz[1] = 0; - if (i % 3 == 2) sh = 4 >> (3 - pana_bits(2)); - if (nonz[i & 1]) { - if ((j = pana_bits(8))) { - if ((pred[i & 1] -= 0x80 << sh) < 0 || sh == 4) - pred[i & 1] &= ~(-1 << sh); - pred[i & 1] += j << sh; - } - } else if ((nonz[i & 1] = pana_bits(8)) || i > 11) - pred[i & 1] = nonz[i & 1] << 4 | pana_bits(4); - if ((raw_image[(row)*raw_width+(col)] = pred[col & 1]) > 4098 && col < width) derror(); - } + pana_bits_t pana_bits(ifp, load_flags, RT_pana_info.encoding); + pana_bits(0, 0); + int sh = 0, pred[2], nonz[2]; + for (int row = 0; row < height; ++row) { + for (int col = 0; col < raw_width; ++col) { + int i; + if ((i = col % 14) == 0) { + pred[0] = pred[1] = nonz[0] = nonz[1] = 0; + } + if (i % 3 == 2) { + sh = 4 >> (3 - pana_bits(2)); + } + if (nonz[i & 1]) { + int j; + if ((j = pana_bits(8))) { + if ((pred[i & 1] -= 0x80 << sh) < 0 || sh == 4) { + pred[i & 1] &= ~(-1 << sh); + } + pred[i & 1] += j << sh; + } + } else if ((nonz[i & 1] = pana_bits(8)) || i > 11) { + pred[i & 1] = nonz[i & 1] << 4 | pana_bits(4); + } + if ((raw_image[(row)*raw_width+(col)] = pred[col & 1]) > 4098 && col < width) { + derror(); + } + } + } } } void DCraw::panasonicC6_load_raw() { - const int rowstep = 16; - const int blocksperrow = raw_width / 11; - const int rowbytes = blocksperrow * 16; - unsigned char *iobuf = (unsigned char *)malloc(rowbytes * rowstep); - merror(iobuf, "panasonicC6_load_raw()"); + constexpr int rowstep = 16; + const int blocksperrow = raw_width / 11; + const int rowbytes = blocksperrow * 16; + unsigned char *iobuf = (unsigned char *)malloc(rowbytes * rowstep); + merror(iobuf, "panasonicC6_load_raw()"); - for (int row = 0; row < raw_height - rowstep + 1; - row += rowstep) - { - int rowstoread = MIN(rowstep, raw_height - row); - fread (iobuf, rowbytes, rowstoread, ifp); -// if (libraw_internal_data.internal_data.input->read( -// iobuf, rowbytes, rowstoread) != rowstoread) -// throw LIBRAW_EXCEPTION_IO_EOF; - pana_cs6_page_decoder page(iobuf, rowbytes * rowstoread); - for (int crow = 0, col = 0; crow < rowstoread; crow++, col = 0) - { - unsigned short *rowptr = &raw_image[(row + crow) * raw_width]; - for (int rblock = 0; rblock < blocksperrow; rblock++) - { - page.read_page(); - unsigned oddeven[2] = {0, 0}, nonzero[2] = {0, 0}; - unsigned pmul = 0, pixel_base = 0; - for (int pix = 0; pix < 11; pix++) - { - if (pix % 3 == 2) - { - unsigned base = page.nextpixel(); - if (base > 3); -// throw LIBRAW_EXCEPTION_IO_CORRUPT; // not possible b/c of 2-bit - // field, but.... - if (base == 3) - base = 4; - pixel_base = 0x200 << base; - pmul = 1 << base; - } - unsigned epixel = page.nextpixel(); - if (oddeven[pix % 2]) - { - epixel *= pmul; - if (pixel_base < 0x2000 && nonzero[pix % 2] > pixel_base) - epixel += nonzero[pix % 2] - pixel_base; - nonzero[pix % 2] = epixel; - } - else - { - oddeven[pix % 2] = epixel; - if (epixel) - nonzero[pix % 2] = epixel; - else - epixel = nonzero[pix % 2]; - } - unsigned spix = epixel - 0xf; - if (spix <= 0xffff) - rowptr[col++] = spix & 0xffff; - else - { - epixel = (((signed int)(epixel + 0x7ffffff1)) >> 0x1f); - rowptr[col++] = epixel & 0x3fff; - } + for (int row = 0; row < raw_height - rowstep + 1; row += rowstep) { + const int rowstoread = MIN(rowstep, raw_height - row); + fread(iobuf, rowbytes, rowstoread, ifp); + pana_cs6_page_decoder page(iobuf, rowbytes * rowstoread); + for (int crow = 0, col = 0; crow < rowstoread; ++crow, col = 0) { + unsigned short *rowptr = &raw_image[(row + crow) * raw_width]; + for (int rblock = 0; rblock < blocksperrow; rblock++) { + page.read_page(); + unsigned oddeven[2] = {0, 0}, nonzero[2] = {0, 0}; + unsigned pmul = 0, pixel_base = 0; + for (int pix = 0; pix < 11; ++pix) { + if (pix % 3 == 2) { + unsigned base = page.nextpixel(); + if (base > 3) { + derror(); + } + if (base == 3) { + base = 4; + } + pixel_base = 0x200 << base; + pmul = 1 << base; + } + unsigned epixel = page.nextpixel(); + if (oddeven[pix % 2]) { + epixel *= pmul; + if (pixel_base < 0x2000 && nonzero[pix % 2] > pixel_base) { + epixel += nonzero[pix % 2] - pixel_base; + } + nonzero[pix % 2] = epixel; + } else { + oddeven[pix % 2] = epixel; + if (epixel) { + nonzero[pix % 2] = epixel; + } else { + epixel = nonzero[pix % 2]; + } + } + const unsigned spix = epixel - 0xf; + if (spix <= 0xffff) { + rowptr[col++] = spix & 0xffff; + } else { + epixel = (((signed int)(epixel + 0x7ffffff1)) >> 0x1f); + rowptr[col++] = epixel & 0x3fff; + } + } + } } - } } - } - free(iobuf); - tiff_bps = RT_pana_info.bpp; + free(iobuf); + tiff_bps = RT_pana_info.bpp; } void DCraw::panasonicC7_load_raw() From e5258e6f60ae118d11c04ebcd4f6fbb906623adf Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Fri, 8 Nov 2019 20:22:18 +0100 Subject: [PATCH 143/208] reduce rtgui/inspector.h dependencies --- rtgui/inspector.cc | 1 + rtgui/inspector.h | 1 - rtgui/thumbbrowserbase.cc | 1 + rtgui/thumbbrowserbase.h | 4 +++- rtgui/thumbbrowserentrybase.cc | 1 + 5 files changed, 6 insertions(+), 2 deletions(-) diff --git a/rtgui/inspector.cc b/rtgui/inspector.cc index d38239cde..9002cc389 100644 --- a/rtgui/inspector.cc +++ b/rtgui/inspector.cc @@ -25,6 +25,7 @@ #include "pathutils.h" #include "rtscalable.h" #include "../rtengine/previewimage.h" +#include "../rtengine/rt_math.h" InspectorBuffer::InspectorBuffer(const Glib::ustring &imagePath) : currTransform(0), fromRaw(false) { diff --git a/rtgui/inspector.h b/rtgui/inspector.h index bb144834a..8338259bf 100644 --- a/rtgui/inspector.h +++ b/rtgui/inspector.h @@ -24,7 +24,6 @@ #include "../rtengine/coord.h" #include "../rtengine/coord2d.h" -#include "../rtengine/rt_math.h" class InspectorBuffer { diff --git a/rtgui/thumbbrowserbase.cc b/rtgui/thumbbrowserbase.cc index 9832b5730..2774cd206 100644 --- a/rtgui/thumbbrowserbase.cc +++ b/rtgui/thumbbrowserbase.cc @@ -18,6 +18,7 @@ #include +#include "inspector.h" #include "multilangmgr.h" #include "options.h" #include "rtscalable.h" diff --git a/rtgui/thumbbrowserbase.h b/rtgui/thumbbrowserbase.h index a5c51cf5f..5a55aeeca 100644 --- a/rtgui/thumbbrowserbase.h +++ b/rtgui/thumbbrowserbase.h @@ -23,13 +23,15 @@ #include #include "guiutils.h" -#include "inspector.h" #include "options.h" #include "thumbbrowserentrybase.h" /* * Class handling the list of ThumbBrowserEntry objects and their position in it's allocated space */ + +class Inspector; + class ThumbBrowserBase : public Gtk::Grid { diff --git a/rtgui/thumbbrowserentrybase.cc b/rtgui/thumbbrowserentrybase.cc index 12059c72e..3840c8bf9 100644 --- a/rtgui/thumbbrowserentrybase.cc +++ b/rtgui/thumbbrowserentrybase.cc @@ -20,6 +20,7 @@ #include "options.h" #include "thumbbrowserbase.h" +#include "../rtengine/rt_math.h" namespace { From 587652283dc520bc66d8803f396647d1a527cad9 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sat, 9 Nov 2019 16:51:54 +0100 Subject: [PATCH 144/208] further reduction of include dependencies, also finalised some classes --- rtengine/pipettebuffer.h | 1 - rtgui/batchqueue.cc | 1 + rtgui/batchqueue.h | 3 ++- rtgui/batchqueuepanel.h | 1 + rtgui/bayerpreprocess.h | 2 +- rtgui/bayerprocess.h | 2 +- rtgui/bayerrawexposure.h | 2 +- rtgui/blackwhite.cc | 2 ++ rtgui/blackwhite.h | 7 ++++--- rtgui/cacorrection.h | 2 +- rtgui/chmixer.h | 2 +- rtgui/coarsepanel.h | 2 +- rtgui/colorappearance.cc | 2 ++ rtgui/colorappearance.h | 7 +++++-- rtgui/colortoning.cc | 2 ++ rtgui/colortoning.h | 10 +++++++--- rtgui/curveeditor.cc | 1 + rtgui/curveeditor.h | 6 +++--- rtgui/curveeditorgroup.cc | 1 + rtgui/curveeditorgroup.h | 2 +- rtgui/darkframe.h | 2 +- rtgui/defringe.cc | 2 ++ rtgui/defringe.h | 8 +++++--- rtgui/dehaze.h | 2 +- rtgui/diagonalcurveeditorsubgroup.cc | 1 + rtgui/dirpyrdenoise.cc | 2 ++ rtgui/dirpyrdenoise.h | 6 ++++-- rtgui/dirpyrequalizer.h | 2 +- rtgui/distortion.h | 2 +- rtgui/editbuffer.h | 7 ++++++- rtgui/editorpanel.cc | 1 + rtgui/editorpanel.h | 3 ++- rtgui/epd.h | 2 +- rtgui/fattaltonemap.h | 2 +- rtgui/filebrowserentry.cc | 2 ++ rtgui/filecatalog.cc | 1 + rtgui/filethumbnailbuttonset.h | 1 - rtgui/filmnegative.h | 3 +-- rtgui/filmsimulation.h | 2 +- rtgui/flatcurveeditorsubgroup.cc | 1 + rtgui/flatfield.h | 2 +- rtgui/gradient.h | 2 +- rtgui/hsvequalizer.cc | 2 ++ rtgui/hsvequalizer.h | 9 ++++++--- rtgui/icmpanel.h | 2 +- rtgui/imageareatoollistener.h | 5 ++--- rtgui/impulsedenoise.h | 2 +- rtgui/labcurve.cc | 2 ++ rtgui/labcurve.h | 8 +++++--- rtgui/labgrid.h | 2 +- rtgui/lensgeom.h | 2 +- rtgui/lensprofile.h | 1 - rtgui/localcontrast.h | 2 +- rtgui/pcvignette.h | 2 +- rtgui/perspective.h | 2 +- rtgui/pparamschangelistener.h | 8 ++++++-- rtgui/preprocess.h | 2 +- rtgui/profilechangelistener.h | 6 +++++- rtgui/prsharpening.h | 2 +- rtgui/rawcacorrection.h | 2 +- rtgui/rawexposure.h | 4 +--- rtgui/retinex.cc | 3 +++ rtgui/retinex.h | 9 +++++++-- rtgui/rgbcurves.cc | 2 ++ rtgui/rgbcurves.h | 8 +++++--- rtgui/rotate.cc | 1 + rtgui/rotate.h | 4 ++-- rtgui/rtwindow.cc | 1 + rtgui/sensorbayer.h | 2 +- rtgui/sensorxtrans.h | 2 +- rtgui/shadowshighlights.h | 2 +- rtgui/sharpenedge.h | 2 +- rtgui/sharpening.h | 2 +- rtgui/sharpenmicro.h | 2 +- rtgui/softlight.h | 2 +- rtgui/thumbbrowserbase.cc | 1 + rtgui/thumbbrowserbase.h | 2 +- rtgui/thumbimageupdater.cc | 1 + rtgui/thumbimageupdater.h | 4 +++- rtgui/tonecurve.cc | 2 ++ rtgui/tonecurve.h | 8 +++++--- rtgui/toolbar.h | 2 +- rtgui/toolpanel.h | 3 --- rtgui/toolpanelcoord.cc | 1 + rtgui/vibrance.cc | 3 +++ rtgui/vibrance.h | 8 +++++--- rtgui/vignetting.h | 2 +- rtgui/wavelet.cc | 2 ++ rtgui/wavelet.h | 9 ++++++--- rtgui/whitebalance.h | 2 +- rtgui/xtransprocess.h | 2 +- rtgui/xtransrawexposure.h | 2 +- 92 files changed, 177 insertions(+), 98 deletions(-) diff --git a/rtengine/pipettebuffer.h b/rtengine/pipettebuffer.h index ef8a5f69a..79b6dd8c5 100644 --- a/rtengine/pipettebuffer.h +++ b/rtengine/pipettebuffer.h @@ -19,7 +19,6 @@ #pragma once #include "array2D.h" -#include "coord.h" #include "iimage.h" class EditDataProvider; diff --git a/rtgui/batchqueue.cc b/rtgui/batchqueue.cc index acb45c266..afbec9efb 100644 --- a/rtgui/batchqueue.cc +++ b/rtgui/batchqueue.cc @@ -31,6 +31,7 @@ #include "cachemanager.h" #include "thumbnail.h" #include "batchqueue.h" +#include "batchqueueentry.h" #include "multilangmgr.h" #include "filecatalog.h" #include "batchqueuebuttonset.h" diff --git a/rtgui/batchqueue.h b/rtgui/batchqueue.h index 9ae615965..f0289faa4 100644 --- a/rtgui/batchqueue.h +++ b/rtgui/batchqueue.h @@ -21,7 +21,6 @@ #include -#include "batchqueueentry.h" #include "lwbutton.h" #include "lwbuttonset.h" #include "threadutils.h" @@ -30,6 +29,8 @@ #include "../rtengine/rtengine.h" #include "../rtengine/noncopyable.h" +class BatchQueueEntry; + class BatchQueueListener { diff --git a/rtgui/batchqueuepanel.h b/rtgui/batchqueuepanel.h index 590ec2347..7c0a367d4 100644 --- a/rtgui/batchqueuepanel.h +++ b/rtgui/batchqueuepanel.h @@ -29,6 +29,7 @@ class RTWindow; class FileCatalog; class Thumbnail; + class BatchQueuePanel : public Gtk::VBox, public BatchQueueListener, public FormatChangeListener diff --git a/rtgui/bayerpreprocess.h b/rtgui/bayerpreprocess.h index c07bbcba4..16b469626 100644 --- a/rtgui/bayerpreprocess.h +++ b/rtgui/bayerpreprocess.h @@ -23,7 +23,7 @@ #include "adjuster.h" #include "toolpanel.h" -class BayerPreProcess : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel +class BayerPreProcess final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel { protected: diff --git a/rtgui/bayerprocess.h b/rtgui/bayerprocess.h index 04985dc66..5c7498986 100644 --- a/rtgui/bayerprocess.h +++ b/rtgui/bayerprocess.h @@ -25,7 +25,7 @@ #include "guiutils.h" #include "toolpanel.h" -class BayerProcess : +class BayerProcess final : public ToolParamBlock, public AdjusterListener, public CheckBoxListener, diff --git a/rtgui/bayerrawexposure.h b/rtgui/bayerrawexposure.h index 247bf6ff0..eb18aa0e3 100644 --- a/rtgui/bayerrawexposure.h +++ b/rtgui/bayerrawexposure.h @@ -24,7 +24,7 @@ #include "checkbox.h" #include "toolpanel.h" -class BayerRAWExposure : +class BayerRAWExposure final : public ToolParamBlock, public AdjusterListener, public CheckBoxListener, diff --git a/rtgui/blackwhite.cc b/rtgui/blackwhite.cc index b3ebea28a..596d99607 100644 --- a/rtgui/blackwhite.cc +++ b/rtgui/blackwhite.cc @@ -21,6 +21,8 @@ #include "blackwhite.h" +#include "curveeditor.h" +#include "curveeditorgroup.h" #include "guiutils.h" #include "rtimage.h" #include "options.h" diff --git a/rtgui/blackwhite.h b/rtgui/blackwhite.h index 9f504fd4f..1aed86997 100644 --- a/rtgui/blackwhite.h +++ b/rtgui/blackwhite.h @@ -22,13 +22,14 @@ #include "adjuster.h" #include "colorprovider.h" -#include "curveeditor.h" -#include "curveeditorgroup.h" +#include "curvelistener.h" #include "guiutils.h" -#include "mycurve.h" #include "toolpanel.h" +class DiagonalCurveEditor; +class CurveEditorGroup; class EditDataProvider; +class FlatCurveEditor; class BlackWhite final : public ToolParamBlock, diff --git a/rtgui/cacorrection.h b/rtgui/cacorrection.h index 6e1667a00..12d6396eb 100644 --- a/rtgui/cacorrection.h +++ b/rtgui/cacorrection.h @@ -23,7 +23,7 @@ #include "adjuster.h" #include "toolpanel.h" -class CACorrection : +class CACorrection final: public ToolParamBlock, public AdjusterListener, public FoldableToolPanel diff --git a/rtgui/chmixer.h b/rtgui/chmixer.h index fb028cf14..d80b89cf7 100644 --- a/rtgui/chmixer.h +++ b/rtgui/chmixer.h @@ -23,7 +23,7 @@ #include "adjuster.h" #include "toolpanel.h" -class ChMixer : +class ChMixer final: public ToolParamBlock, public AdjusterListener, public FoldableToolPanel diff --git a/rtgui/coarsepanel.h b/rtgui/coarsepanel.h index c028bbcad..b7b4f8cf7 100644 --- a/rtgui/coarsepanel.h +++ b/rtgui/coarsepanel.h @@ -22,7 +22,7 @@ #include "toolpanel.h" -class CoarsePanel : +class CoarsePanel final : public Gtk::HBox, public ToolPanel { diff --git a/rtgui/colorappearance.cc b/rtgui/colorappearance.cc index 094ffec2f..9a6bee524 100644 --- a/rtgui/colorappearance.cc +++ b/rtgui/colorappearance.cc @@ -20,6 +20,8 @@ #include "colorappearance.h" +#include "curveeditor.h" +#include "curveeditorgroup.h" #include "guiutils.h" #include "options.h" #include "rtimage.h" diff --git a/rtgui/colorappearance.h b/rtgui/colorappearance.h index 3d82ee831..170212ffe 100644 --- a/rtgui/colorappearance.h +++ b/rtgui/colorappearance.h @@ -22,11 +22,14 @@ #include "adjuster.h" #include "colorprovider.h" -#include "curveeditor.h" -#include "curveeditorgroup.h" +#include "curvelistener.h" #include "guiutils.h" #include "toolpanel.h" +class DiagonalCurveEditor; +class CurveEditorGroup; +class CurveEditor; + class ColorAppearance final : public ToolParamBlock, public AdjusterListener, diff --git a/rtgui/colortoning.cc b/rtgui/colortoning.cc index 1a6a9b918..59768a6ce 100644 --- a/rtgui/colortoning.cc +++ b/rtgui/colortoning.cc @@ -2,6 +2,8 @@ * This file is part of RawTherapee. */ #include "colortoning.h" +#include "curveeditor.h" +#include "curveeditorgroup.h" #include "mycurve.h" #include "rtimage.h" #include "eventmapper.h" diff --git a/rtgui/colortoning.h b/rtgui/colortoning.h index 9c7a54488..f1024f41c 100644 --- a/rtgui/colortoning.h +++ b/rtgui/colortoning.h @@ -7,15 +7,19 @@ #include "adjuster.h" #include "colorprovider.h" -#include "curveeditor.h" -#include "curveeditorgroup.h" +#include "curvelistener.h" #include "guiutils.h" -#include "labgrid.h" #include "thresholdadjuster.h" #include "toolpanel.h" #include "../rtengine/procparams.h" +class CurveEditor; +class CurveEditorGroup; +class DiagonalCurveEditor; +class FlatCurveEditor; +class LabGrid; + class ColorToning final : public ToolParamBlock, public FoldableToolPanel, diff --git a/rtgui/curveeditor.cc b/rtgui/curveeditor.cc index 2b3c100e0..8dc88473e 100644 --- a/rtgui/curveeditor.cc +++ b/rtgui/curveeditor.cc @@ -21,6 +21,7 @@ #include #include "guiutils.h" #include "multilangmgr.h" +#include "popuptogglebutton.h" #include "../rtengine/LUT.h" #include diff --git a/rtgui/curveeditor.h b/rtgui/curveeditor.h index 535c1a86d..baae8f492 100644 --- a/rtgui/curveeditor.h +++ b/rtgui/curveeditor.h @@ -20,7 +20,6 @@ #include "coloredbar.h" #include "editcallbacks.h" -#include "popuptogglebutton.h" #include "../rtengine/diagonalcurvetypes.h" #include "../rtengine/flatcurvetypes.h" @@ -29,6 +28,7 @@ class CurveEditorGroup; class CurveEditorSubGroup; +class PopUpToggleButton; /* *********************** Curve Editor *********************** @@ -143,7 +143,7 @@ public: */ -class DiagonalCurveEditor : public CurveEditor +class DiagonalCurveEditor final : public CurveEditor { friend class DiagonalCurveEditorSubGroup; @@ -179,7 +179,7 @@ public: */ -class FlatCurveEditor : public CurveEditor +class FlatCurveEditor final : public CurveEditor { friend class FlatCurveEditorSubGroup; diff --git a/rtgui/curveeditorgroup.cc b/rtgui/curveeditorgroup.cc index 06def0a8e..cad49d331 100644 --- a/rtgui/curveeditorgroup.cc +++ b/rtgui/curveeditorgroup.cc @@ -24,6 +24,7 @@ #include "diagonalcurveeditorsubgroup.h" #include "flatcurveeditorsubgroup.h" #include "multilangmgr.h" +#include "popuptogglebutton.h" #include "rtimage.h" #include "options.h" #include "pathutils.h" diff --git a/rtgui/curveeditorgroup.h b/rtgui/curveeditorgroup.h index e3412546f..7a5d3a074 100644 --- a/rtgui/curveeditorgroup.h +++ b/rtgui/curveeditorgroup.h @@ -41,7 +41,7 @@ class FlatCurveEditorSubGroup; * - to start a new line of curve button, use the 'newLine' method * - if you add more than one curve, you must add a "CurveEditor* ce" parameter to your listener */ -class CurveEditorGroup : public Gtk::Grid, public CurveListener +class CurveEditorGroup final : public Gtk::Grid, public CurveListener { friend class CurveEditor; diff --git a/rtgui/darkframe.h b/rtgui/darkframe.h index 779caf16f..30696e3db 100644 --- a/rtgui/darkframe.h +++ b/rtgui/darkframe.h @@ -41,7 +41,7 @@ public: // add other info here }; -class DarkFrame : +class DarkFrame final: public ToolParamBlock, public FoldableToolPanel { diff --git a/rtgui/defringe.cc b/rtgui/defringe.cc index 7114f9a52..cdec88edc 100644 --- a/rtgui/defringe.cc +++ b/rtgui/defringe.cc @@ -20,6 +20,8 @@ #include #include "defringe.h" +#include "curveeditor.h" +#include "curveeditorgroup.h" #include "options.h" #include "../rtengine/color.h" diff --git a/rtgui/defringe.h b/rtgui/defringe.h index 5dd17b547..ebf1eecd8 100644 --- a/rtgui/defringe.h +++ b/rtgui/defringe.h @@ -22,12 +22,14 @@ #include "adjuster.h" #include "colorprovider.h" -#include "curveeditor.h" -#include "curveeditorgroup.h" +#include "curvelistener.h" #include "guiutils.h" #include "toolpanel.h" -class Defringe : +class CurveEditorGroup; +class FlatCurveEditor; + +class Defringe final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, diff --git a/rtgui/dehaze.h b/rtgui/dehaze.h index 6a9d31cd1..79d2e015c 100644 --- a/rtgui/dehaze.h +++ b/rtgui/dehaze.h @@ -23,7 +23,7 @@ #include "adjuster.h" #include "toolpanel.h" -class Dehaze: public ToolParamBlock, public AdjusterListener, public FoldableToolPanel +class Dehaze final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel { private: Adjuster *strength; diff --git a/rtgui/diagonalcurveeditorsubgroup.cc b/rtgui/diagonalcurveeditorsubgroup.cc index cece9be66..eed6c63d3 100644 --- a/rtgui/diagonalcurveeditorsubgroup.cc +++ b/rtgui/diagonalcurveeditorsubgroup.cc @@ -32,6 +32,7 @@ #include "diagonalcurveeditorsubgroup.h" #include "rtimage.h" #include "options.h" +#include "popuptogglebutton.h" #include "../rtengine/curves.h" diff --git a/rtgui/dirpyrdenoise.cc b/rtgui/dirpyrdenoise.cc index b429dfc9f..7129542d1 100644 --- a/rtgui/dirpyrdenoise.cc +++ b/rtgui/dirpyrdenoise.cc @@ -21,6 +21,8 @@ #include "dirpyrdenoise.h" +#include "curveeditor.h" +#include "curveeditorgroup.h" #include "editbuffer.h" #include "guiutils.h" #include "options.h" diff --git a/rtgui/dirpyrdenoise.h b/rtgui/dirpyrdenoise.h index 424104314..c754e705c 100644 --- a/rtgui/dirpyrdenoise.h +++ b/rtgui/dirpyrdenoise.h @@ -22,11 +22,13 @@ #include "adjuster.h" #include "colorprovider.h" -#include "curveeditor.h" -#include "curveeditorgroup.h" +#include "curvelistener.h" #include "guiutils.h" #include "toolpanel.h" +class CurveEditor; +class CurveEditorGroup; +class FlatCurveEditor; class EditDataProvider; class DirPyrDenoise final : diff --git a/rtgui/dirpyrequalizer.h b/rtgui/dirpyrequalizer.h index ff08f36bc..84924099e 100644 --- a/rtgui/dirpyrequalizer.h +++ b/rtgui/dirpyrequalizer.h @@ -25,7 +25,7 @@ #include "thresholdadjuster.h" #include "toolpanel.h" -class DirPyrEqualizer : +class DirPyrEqualizer final : public ToolParamBlock, public ThresholdAdjusterListener, public AdjusterListener, diff --git a/rtgui/distortion.h b/rtgui/distortion.h index dab20bbd9..7ef33d73a 100644 --- a/rtgui/distortion.h +++ b/rtgui/distortion.h @@ -24,7 +24,7 @@ #include "lensgeomlistener.h" #include "toolpanel.h" -class Distortion : +class Distortion final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel diff --git a/rtgui/editbuffer.h b/rtgui/editbuffer.h index 046ab7364..a5cf8d0e4 100644 --- a/rtgui/editbuffer.h +++ b/rtgui/editbuffer.h @@ -19,9 +19,14 @@ #pragma once #include "editid.h" -#include "../rtengine/coord.h" #include +namespace rtengine { + +struct Coord; + +} + class EditDataProvider; class EditSubscriber; diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index 108b11ea3..87f4a0b94 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -24,6 +24,7 @@ #include "../rtengine/imagesource.h" #include "../rtengine/iccstore.h" #include "batchqueue.h" +#include "batchqueueentry.h" #include "soundman.h" #include "rtimage.h" #include "rtwindow.h" diff --git a/rtgui/editorpanel.h b/rtgui/editorpanel.h index b577b858f..e348222a5 100644 --- a/rtgui/editorpanel.h +++ b/rtgui/editorpanel.h @@ -21,7 +21,6 @@ #include -#include "batchqueueentry.h" #include "filepanel.h" #include "histogrampanel.h" #include "history.h" @@ -35,7 +34,9 @@ #include "../rtengine/noncopyable.h" #include "../rtengine/rtengine.h" +class BatchQueueEntry; class EditorPanel; +class FilePanel; class MyProgressBar; class Thumbnail; class ToolPanelCoordinator; diff --git a/rtgui/epd.h b/rtgui/epd.h index 410004d89..6a5160623 100644 --- a/rtgui/epd.h +++ b/rtgui/epd.h @@ -23,7 +23,7 @@ #include "adjuster.h" #include "toolpanel.h" -class EdgePreservingDecompositionUI : +class EdgePreservingDecompositionUI final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel diff --git a/rtgui/fattaltonemap.h b/rtgui/fattaltonemap.h index 9f788351c..3d36ec7d2 100644 --- a/rtgui/fattaltonemap.h +++ b/rtgui/fattaltonemap.h @@ -23,7 +23,7 @@ #include "adjuster.h" #include "toolpanel.h" -class FattalToneMapping: public ToolParamBlock, public AdjusterListener, public FoldableToolPanel +class FattalToneMapping final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel { protected: Adjuster *threshold; diff --git a/rtgui/filebrowserentry.cc b/rtgui/filebrowserentry.cc index 4d31d625e..9da4044c1 100644 --- a/rtgui/filebrowserentry.cc +++ b/rtgui/filebrowserentry.cc @@ -21,6 +21,7 @@ #include #include +#include "cropguilistener.h" #include "cursormanager.h" #include "guiutils.h" #include "inspector.h" @@ -28,6 +29,7 @@ #include "threadutils.h" #include "thumbbrowserbase.h" #include "thumbnail.h" +#include "toolbar.h" #include "../rtengine/procparams.h" diff --git a/rtgui/filecatalog.cc b/rtgui/filecatalog.cc index 5e93631e5..a2622e52c 100644 --- a/rtgui/filecatalog.cc +++ b/rtgui/filecatalog.cc @@ -36,6 +36,7 @@ #include "renamedlg.h" #include "thumbimageupdater.h" #include "batchqueue.h" +#include "batchqueueentry.h" #include "placesbrowser.h" #include "pathutils.h" #include "thumbnail.h" diff --git a/rtgui/filethumbnailbuttonset.h b/rtgui/filethumbnailbuttonset.h index 66d5b5f67..868d3b58a 100644 --- a/rtgui/filethumbnailbuttonset.h +++ b/rtgui/filethumbnailbuttonset.h @@ -22,7 +22,6 @@ #include -#include "filebrowserentry.h" #include "lwbuttonset.h" class FileBrowserEntry; diff --git a/rtgui/filmnegative.h b/rtgui/filmnegative.h index 85919bef9..bca155ceb 100644 --- a/rtgui/filmnegative.h +++ b/rtgui/filmnegative.h @@ -26,7 +26,6 @@ #include "editcallbacks.h" #include "guiutils.h" #include "toolpanel.h" -#include "wbprovider.h" class FilmNegProvider { @@ -36,7 +35,7 @@ public: virtual bool getFilmNegativeExponents(rtengine::Coord spotA, rtengine::Coord spotB, std::array& newExps) = 0; }; -class FilmNegative : +class FilmNegative final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, diff --git a/rtgui/filmsimulation.h b/rtgui/filmsimulation.h index fc9e804e1..cfe7016bb 100644 --- a/rtgui/filmsimulation.h +++ b/rtgui/filmsimulation.h @@ -10,7 +10,7 @@ #include "guiutils.h" #include "toolpanel.h" -class ClutComboBox : +class ClutComboBox final : public MyComboBox { public: diff --git a/rtgui/flatcurveeditorsubgroup.cc b/rtgui/flatcurveeditorsubgroup.cc index b5dc4f726..4e0591ac3 100644 --- a/rtgui/flatcurveeditorsubgroup.cc +++ b/rtgui/flatcurveeditorsubgroup.cc @@ -33,6 +33,7 @@ #include "flatcurveeditorsubgroup.h" #include "rtimage.h" #include "options.h" +#include "popuptogglebutton.h" #include "../rtengine/curves.h" diff --git a/rtgui/flatfield.h b/rtgui/flatfield.h index 4308e938a..d20a96acd 100644 --- a/rtgui/flatfield.h +++ b/rtgui/flatfield.h @@ -42,7 +42,7 @@ public: // add other info here }; -class FlatField : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, public rtengine::FlatFieldAutoClipListener +class FlatField final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, public rtengine::FlatFieldAutoClipListener { protected: diff --git a/rtgui/gradient.h b/rtgui/gradient.h index 834f08670..f2be47ccc 100644 --- a/rtgui/gradient.h +++ b/rtgui/gradient.h @@ -10,7 +10,7 @@ #include "guiutils.h" #include "toolpanel.h" -class Gradient : +class Gradient final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, diff --git a/rtgui/hsvequalizer.cc b/rtgui/hsvequalizer.cc index b570a23ac..ee3eb90a7 100644 --- a/rtgui/hsvequalizer.cc +++ b/rtgui/hsvequalizer.cc @@ -18,6 +18,8 @@ */ #include "hsvequalizer.h" +#include "curveeditor.h" +#include "curveeditorgroup.h" #include "options.h" #include "../rtengine/color.h" diff --git a/rtgui/hsvequalizer.h b/rtgui/hsvequalizer.h index 7d313cc76..987fd20b2 100644 --- a/rtgui/hsvequalizer.h +++ b/rtgui/hsvequalizer.h @@ -22,12 +22,15 @@ #include "adjuster.h" #include "colorprovider.h" -#include "curveeditor.h" -#include "curveeditorgroup.h" +#include "curvelistener.h" #include "guiutils.h" #include "toolpanel.h" -class HSVEqualizer : +class CurveEditor; +class CurveEditorGroup; +class FlatCurveEditor; + +class HSVEqualizer final : public ToolParamBlock, public FoldableToolPanel, public CurveListener, diff --git a/rtgui/icmpanel.h b/rtgui/icmpanel.h index 5573bacb8..cc46c5d37 100644 --- a/rtgui/icmpanel.h +++ b/rtgui/icmpanel.h @@ -36,7 +36,7 @@ public: virtual void saveInputICCReference(const Glib::ustring& fname, bool apply_wb) = 0; }; -class ICMPanel : +class ICMPanel final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel diff --git a/rtgui/imageareatoollistener.h b/rtgui/imageareatoollistener.h index 3c753a5e0..b022aa4b7 100644 --- a/rtgui/imageareatoollistener.h +++ b/rtgui/imageareatoollistener.h @@ -18,10 +18,9 @@ */ #pragma once -#include "cropguilistener.h" -#include "toolbar.h" - +class CropGUIListener; class Thumbnail; +class ToolBar; class ImageAreaToolListener { diff --git a/rtgui/impulsedenoise.h b/rtgui/impulsedenoise.h index e3cfc619a..b8acafcfc 100644 --- a/rtgui/impulsedenoise.h +++ b/rtgui/impulsedenoise.h @@ -23,7 +23,7 @@ #include "adjuster.h" #include "toolpanel.h" -class ImpulseDenoise : +class ImpulseDenoise final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel diff --git a/rtgui/labcurve.cc b/rtgui/labcurve.cc index bd4b27f14..491b02c4c 100644 --- a/rtgui/labcurve.cc +++ b/rtgui/labcurve.cc @@ -20,6 +20,8 @@ #include "labcurve.h" +#include "curveeditor.h" +#include "curveeditorgroup.h" #include "options.h" #include "../rtengine/color.h" diff --git a/rtgui/labcurve.h b/rtgui/labcurve.h index 46f506d68..e8488a8c6 100644 --- a/rtgui/labcurve.h +++ b/rtgui/labcurve.h @@ -22,13 +22,15 @@ #include "adjuster.h" #include "colorprovider.h" -#include "curveeditor.h" -#include "curveeditorgroup.h" +#include "curvelistener.h" #include "toolpanel.h" +class CurveEditorGroup; +class DiagonalCurveEditor; class EditDataProvider; +class FlatCurveEditor; -class LCurve : +class LCurve final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, diff --git a/rtgui/labgrid.h b/rtgui/labgrid.h index 227b4cacc..4693c897c 100644 --- a/rtgui/labgrid.h +++ b/rtgui/labgrid.h @@ -43,7 +43,7 @@ #include "toolpanel.h" -class LabGridArea: public Gtk::DrawingArea, public BackBuffer { +class LabGridArea final : public Gtk::DrawingArea, public BackBuffer { private: rtengine::ProcEvent evt; Glib::ustring evtMsg; diff --git a/rtgui/lensgeom.h b/rtgui/lensgeom.h index e3352a506..18b31a619 100644 --- a/rtgui/lensgeom.h +++ b/rtgui/lensgeom.h @@ -23,7 +23,7 @@ #include "lensgeomlistener.h" #include "toolpanel.h" -class LensGeometry : +class LensGeometry final : public ToolParamBlock, public FoldableToolPanel { diff --git a/rtgui/lensprofile.h b/rtgui/lensprofile.h index 7e740e26e..7b5b7343c 100644 --- a/rtgui/lensprofile.h +++ b/rtgui/lensprofile.h @@ -21,7 +21,6 @@ #include #include "guiutils.h" -#include "lensgeom.h" #include "toolpanel.h" class LensProfilePanel final : diff --git a/rtgui/localcontrast.h b/rtgui/localcontrast.h index b23bac697..d1d25fb3d 100644 --- a/rtgui/localcontrast.h +++ b/rtgui/localcontrast.h @@ -23,7 +23,7 @@ #include "adjuster.h" #include "toolpanel.h" -class LocalContrast: public ToolParamBlock, public AdjusterListener, public FoldableToolPanel +class LocalContrast final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel { private: Adjuster *radius; diff --git a/rtgui/pcvignette.h b/rtgui/pcvignette.h index da0e02dc6..87915703f 100644 --- a/rtgui/pcvignette.h +++ b/rtgui/pcvignette.h @@ -8,7 +8,7 @@ #include "adjuster.h" #include "toolpanel.h" -class PCVignette : +class PCVignette final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel diff --git a/rtgui/perspective.h b/rtgui/perspective.h index 618ad32cf..0564479de 100644 --- a/rtgui/perspective.h +++ b/rtgui/perspective.h @@ -23,7 +23,7 @@ #include "adjuster.h" #include "toolpanel.h" -class PerspCorrection : +class PerspCorrection final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel diff --git a/rtgui/pparamschangelistener.h b/rtgui/pparamschangelistener.h index 56ac5f605..e255b9657 100644 --- a/rtgui/pparamschangelistener.h +++ b/rtgui/pparamschangelistener.h @@ -18,10 +18,14 @@ */ #pragma once -#include - struct ParamsEdited; +namespace Glib +{ + +class ustring; + +} namespace rtengine { diff --git a/rtgui/preprocess.h b/rtgui/preprocess.h index 3b337a450..d10ff5223 100644 --- a/rtgui/preprocess.h +++ b/rtgui/preprocess.h @@ -24,7 +24,7 @@ #include "guiutils.h" #include "toolpanel.h" -class PreProcess : +class PreProcess final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel diff --git a/rtgui/profilechangelistener.h b/rtgui/profilechangelistener.h index 58c565393..656566867 100644 --- a/rtgui/profilechangelistener.h +++ b/rtgui/profilechangelistener.h @@ -18,8 +18,12 @@ */ #pragma once -#include +namespace Glib +{ +class ustring; + +} namespace rtengine { diff --git a/rtgui/prsharpening.h b/rtgui/prsharpening.h index 54f2f8063..9738a5cd4 100644 --- a/rtgui/prsharpening.h +++ b/rtgui/prsharpening.h @@ -24,7 +24,7 @@ #include "thresholdadjuster.h" #include "toolpanel.h" -class PrSharpening : +class PrSharpening final : public ToolParamBlock, public ThresholdAdjusterListener, public AdjusterListener, diff --git a/rtgui/rawcacorrection.h b/rtgui/rawcacorrection.h index 60c705b19..3c95602a7 100644 --- a/rtgui/rawcacorrection.h +++ b/rtgui/rawcacorrection.h @@ -24,7 +24,7 @@ #include "checkbox.h" #include "toolpanel.h" -class RAWCACorr : +class RAWCACorr final: public ToolParamBlock, public AdjusterListener, public CheckBoxListener, diff --git a/rtgui/rawexposure.h b/rtgui/rawexposure.h index 75b3a9330..33c897113 100644 --- a/rtgui/rawexposure.h +++ b/rtgui/rawexposure.h @@ -23,7 +23,7 @@ #include "adjuster.h" #include "toolpanel.h" -class RAWExposure : +class RAWExposure final: public ToolParamBlock, public AdjusterListener, public FoldableToolPanel @@ -32,8 +32,6 @@ class RAWExposure : protected: Adjuster* PexPos; -private: -// Gtk::CheckButton* PextwoGreen; public: RAWExposure (); diff --git a/rtgui/retinex.cc b/rtgui/retinex.cc index 33f1c2f6a..c78be375f 100644 --- a/rtgui/retinex.cc +++ b/rtgui/retinex.cc @@ -2,6 +2,9 @@ * This file is part of RawTherapee. */ #include "retinex.h" + +#include "curveeditor.h" +#include "curveeditorgroup.h" #include "mycurve.h" #include "rtimage.h" #include "options.h" diff --git a/rtgui/retinex.h b/rtgui/retinex.h index c82c01d3e..ff524f854 100644 --- a/rtgui/retinex.h +++ b/rtgui/retinex.h @@ -7,13 +7,18 @@ #include "adjuster.h" #include "colorprovider.h" -#include "curveeditor.h" +#include "curvelistener.h" #include "curveeditorgroup.h" #include "guiutils.h" #include "thresholdadjuster.h" #include "toolpanel.h" -class Retinex : +class CurveEditor; +class CurveEditorGroup; +class DiagonalCurveEditor; +class FlatCurveEditor; + +class Retinex final : public ToolParamBlock, public FoldableToolPanel, public rtengine::RetinexListener, diff --git a/rtgui/rgbcurves.cc b/rtgui/rgbcurves.cc index 7af6cab97..d501cf449 100644 --- a/rtgui/rgbcurves.cc +++ b/rtgui/rgbcurves.cc @@ -18,6 +18,8 @@ */ #include "rgbcurves.h" +#include "curveeditor.h" +#include "curveeditorgroup.h" #include "options.h" #include "../rtengine/procparams.h" diff --git a/rtgui/rgbcurves.h b/rtgui/rgbcurves.h index b73aa22b7..5ed2ea540 100644 --- a/rtgui/rgbcurves.h +++ b/rtgui/rgbcurves.h @@ -22,11 +22,13 @@ #include "adjuster.h" #include "colorprovider.h" -#include "curveeditor.h" -#include "curveeditorgroup.h" +#include "curvelistener.h" #include "toolpanel.h" -class RGBCurves : +class CurveEditorGroup; +class DiagonalCurveEditor; + +class RGBCurves final : public ToolParamBlock, public FoldableToolPanel, public CurveListener, diff --git a/rtgui/rotate.cc b/rtgui/rotate.cc index 7436186c3..06c53cd4e 100644 --- a/rtgui/rotate.cc +++ b/rtgui/rotate.cc @@ -21,6 +21,7 @@ #include "rotate.h" #include "guiutils.h" +#include "lensgeomlistener.h" #include "rtimage.h" #include "../rtengine/procparams.h" diff --git a/rtgui/rotate.h b/rtgui/rotate.h index 5730fd481..41e10eb4d 100644 --- a/rtgui/rotate.h +++ b/rtgui/rotate.h @@ -21,10 +21,10 @@ #include #include "adjuster.h" -#include "lensgeomlistener.h" #include "toolpanel.h" -class Rotate : +class LensGeomListener; +class Rotate final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel diff --git a/rtgui/rtwindow.cc b/rtgui/rtwindow.cc index c3d735e8f..ae7072d88 100644 --- a/rtgui/rtwindow.cc +++ b/rtgui/rtwindow.cc @@ -29,6 +29,7 @@ #include "whitebalance.h" #include "../rtengine/settings.h" #include "batchqueuepanel.h" +#include "batchqueueentry.h" #include "editorpanel.h" #include "filepanel.h" #include "filmsimulation.h" diff --git a/rtgui/sensorbayer.h b/rtgui/sensorbayer.h index 3d6018181..2401bf760 100644 --- a/rtgui/sensorbayer.h +++ b/rtgui/sensorbayer.h @@ -22,7 +22,7 @@ #include "toolpanel.h" -class SensorBayer : +class SensorBayer final : public ToolParamBlock, public FoldableToolPanel { diff --git a/rtgui/sensorxtrans.h b/rtgui/sensorxtrans.h index c1cacb2f4..eee014f6c 100644 --- a/rtgui/sensorxtrans.h +++ b/rtgui/sensorxtrans.h @@ -22,7 +22,7 @@ #include "toolpanel.h" -class SensorXTrans : +class SensorXTrans final: public ToolParamBlock, public FoldableToolPanel { diff --git a/rtgui/shadowshighlights.h b/rtgui/shadowshighlights.h index 4f3ee7577..7bb0bb01c 100644 --- a/rtgui/shadowshighlights.h +++ b/rtgui/shadowshighlights.h @@ -23,7 +23,7 @@ #include "adjuster.h" #include "toolpanel.h" -class ShadowsHighlights : +class ShadowsHighlights final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel diff --git a/rtgui/sharpenedge.h b/rtgui/sharpenedge.h index 46a528153..a813d86e1 100644 --- a/rtgui/sharpenedge.h +++ b/rtgui/sharpenedge.h @@ -28,7 +28,7 @@ #include "adjuster.h" #include "toolpanel.h" -class SharpenEdge : +class SharpenEdge final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel diff --git a/rtgui/sharpening.h b/rtgui/sharpening.h index e922e82c7..bd5e6f1b7 100644 --- a/rtgui/sharpening.h +++ b/rtgui/sharpening.h @@ -24,7 +24,7 @@ #include "thresholdadjuster.h" #include "toolpanel.h" -class Sharpening : +class Sharpening final: public ToolParamBlock, public ThresholdAdjusterListener, public AdjusterListener, diff --git a/rtgui/sharpenmicro.h b/rtgui/sharpenmicro.h index 3120e6e7b..23224dd60 100644 --- a/rtgui/sharpenmicro.h +++ b/rtgui/sharpenmicro.h @@ -28,7 +28,7 @@ #include "adjuster.h" #include "toolpanel.h" -class SharpenMicro : +class SharpenMicro final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel diff --git a/rtgui/softlight.h b/rtgui/softlight.h index a584d3a73..710da4e34 100644 --- a/rtgui/softlight.h +++ b/rtgui/softlight.h @@ -23,7 +23,7 @@ #include "adjuster.h" #include "toolpanel.h" -class SoftLight: public ToolParamBlock, public AdjusterListener, public FoldableToolPanel +class SoftLight final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel { private: Adjuster *strength; diff --git a/rtgui/thumbbrowserbase.cc b/rtgui/thumbbrowserbase.cc index 2774cd206..c9329cf91 100644 --- a/rtgui/thumbbrowserbase.cc +++ b/rtgui/thumbbrowserbase.cc @@ -23,6 +23,7 @@ #include "options.h" #include "rtscalable.h" #include "thumbbrowserbase.h" +#include "thumbbrowserentrybase.h" #include "../rtengine/rt_math.h" diff --git a/rtgui/thumbbrowserbase.h b/rtgui/thumbbrowserbase.h index 5a55aeeca..d6bafaf69 100644 --- a/rtgui/thumbbrowserbase.h +++ b/rtgui/thumbbrowserbase.h @@ -24,13 +24,13 @@ #include "guiutils.h" #include "options.h" -#include "thumbbrowserentrybase.h" /* * Class handling the list of ThumbBrowserEntry objects and their position in it's allocated space */ class Inspector; +class ThumbBrowserEntryBase; class ThumbBrowserBase : public Gtk::Grid diff --git a/rtgui/thumbimageupdater.cc b/rtgui/thumbimageupdater.cc index bf230fe63..03606bb3d 100644 --- a/rtgui/thumbimageupdater.cc +++ b/rtgui/thumbimageupdater.cc @@ -23,6 +23,7 @@ #include #include "thumbimageupdater.h" +#include "thumbbrowserentrybase.h" #include "guiutils.h" #include "threadutils.h" diff --git a/rtgui/thumbimageupdater.h b/rtgui/thumbimageupdater.h index cdf65bd62..a2e2ecb19 100644 --- a/rtgui/thumbimageupdater.h +++ b/rtgui/thumbimageupdater.h @@ -20,7 +20,6 @@ #include -#include "thumbbrowserentrybase.h" #include "../rtengine/noncopyable.h" @@ -36,6 +35,9 @@ namespace procparams } } + +class ThumbBrowserEntryBase; + class ThumbImageUpdateListener { public: diff --git a/rtgui/tonecurve.cc b/rtgui/tonecurve.cc index 68f3ee4de..dc9b17fa9 100644 --- a/rtgui/tonecurve.cc +++ b/rtgui/tonecurve.cc @@ -23,6 +23,8 @@ #include "tonecurve.h" #include "adjuster.h" +#include "curveeditor.h" +#include "curveeditorgroup.h" #include "eventmapper.h" #include "ppversion.h" #include "options.h" diff --git a/rtgui/tonecurve.h b/rtgui/tonecurve.h index cba810e15..e0482c5da 100644 --- a/rtgui/tonecurve.h +++ b/rtgui/tonecurve.h @@ -21,14 +21,16 @@ #include #include "adjuster.h" -#include "curveeditor.h" -#include "curveeditorgroup.h" +#include "curvelistener.h" #include "guiutils.h" #include "toolpanel.h" +class CurveEditor; +class CurveEditorGroup; +class DiagonalCurveEditor; class EditDataProvider; -class ToneCurve : +class ToneCurve final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, diff --git a/rtgui/toolbar.h b/rtgui/toolbar.h index 9f0a2818b..e6d99f819 100644 --- a/rtgui/toolbar.h +++ b/rtgui/toolbar.h @@ -37,7 +37,7 @@ public: virtual void editModeSwitchedOff() = 0; }; -class ToolBar : public Gtk::HBox +class ToolBar final : public Gtk::HBox { private: std::unique_ptr handimg; diff --git a/rtgui/toolpanel.h b/rtgui/toolpanel.h index 627200835..0f002e048 100644 --- a/rtgui/toolpanel.h +++ b/rtgui/toolpanel.h @@ -41,9 +41,6 @@ class ProcParams; } } -class FoldableToolPanel; -class ToolPanel; - class ToolPanelListener { public: diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index e774e3d39..a636994b2 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -21,6 +21,7 @@ #include "metadatapanel.h" #include "options.h" #include "rtimage.h" + #include "../rtengine/imagesource.h" #include "../rtengine/dfmanager.h" #include "../rtengine/ffmanager.h" diff --git a/rtgui/vibrance.cc b/rtgui/vibrance.cc index 67052785a..4a9fab3d3 100644 --- a/rtgui/vibrance.cc +++ b/rtgui/vibrance.cc @@ -18,6 +18,9 @@ */ #include "vibrance.h" + +#include "curveeditor.h" +#include "curveeditorgroup.h" #include "options.h" #include "../rtengine/color.h" diff --git a/rtgui/vibrance.h b/rtgui/vibrance.h index 211f631f9..12acc7948 100644 --- a/rtgui/vibrance.h +++ b/rtgui/vibrance.h @@ -21,12 +21,14 @@ #include #include "adjuster.h" -#include "curveeditor.h" -#include "curveeditorgroup.h" +#include "curvelistener.h" #include "thresholdadjuster.h" #include "toolpanel.h" -class Vibrance : +class CurveEditorGroup; +class DiagonalCurveEditor; + +class Vibrance final : public ToolParamBlock, public AdjusterListener, public ThresholdCurveProvider, diff --git a/rtgui/vignetting.h b/rtgui/vignetting.h index 8cc8c498b..be7765094 100644 --- a/rtgui/vignetting.h +++ b/rtgui/vignetting.h @@ -23,7 +23,7 @@ #include "adjuster.h" #include "toolpanel.h" -class Vignetting : +class Vignetting final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 4fd3a7b8f..3981457e6 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -20,6 +20,8 @@ #include "wavelet.h" #include +#include "curveeditor.h" +#include "curveeditorgroup.h" #include "editcallbacks.h" #include "guiutils.h" #include "rtimage.h" diff --git a/rtgui/wavelet.h b/rtgui/wavelet.h index 20a0ba4e5..6551b58d4 100644 --- a/rtgui/wavelet.h +++ b/rtgui/wavelet.h @@ -22,15 +22,18 @@ #include #include "adjuster.h" #include "toolpanel.h" -#include "curveeditor.h" -#include "curveeditorgroup.h" +#include "curvelistener.h" #include "thresholdadjuster.h" #include "colorprovider.h" #include "guiutils.h" +class CurveEditor; +class CurveEditorGroup; +class DiagonalCurveEditor; class EditDataProvider; +class FlatCurveEditor; -class Wavelet : +class Wavelet final : public ToolParamBlock, public ThresholdAdjusterListener, public AdjusterListener, diff --git a/rtgui/whitebalance.h b/rtgui/whitebalance.h index 528c81d17..b4d09f119 100644 --- a/rtgui/whitebalance.h +++ b/rtgui/whitebalance.h @@ -35,7 +35,7 @@ public: virtual void spotWBRequested(int size) = 0; }; -class WhiteBalance : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, public rtengine::AutoWBListener +class WhiteBalance final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, public rtengine::AutoWBListener { enum WB_LabelType { diff --git a/rtgui/xtransprocess.h b/rtgui/xtransprocess.h index b17b56b07..d6cb120e0 100644 --- a/rtgui/xtransprocess.h +++ b/rtgui/xtransprocess.h @@ -25,7 +25,7 @@ #include "guiutils.h" #include "toolpanel.h" -class XTransProcess : +class XTransProcess final : public ToolParamBlock, public AdjusterListener, public CheckBoxListener, diff --git a/rtgui/xtransrawexposure.h b/rtgui/xtransrawexposure.h index 46c418f2f..a8daf6972 100644 --- a/rtgui/xtransrawexposure.h +++ b/rtgui/xtransrawexposure.h @@ -23,7 +23,7 @@ #include "adjuster.h" #include "toolpanel.h" -class XTransRAWExposure : +class XTransRAWExposure final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel From d32c570383fde892d2afa785978a1f7fb4ca2c78 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 10 Nov 2019 16:05:24 +0100 Subject: [PATCH 145/208] Capture sharpening: removed gamma --- rtengine/capturesharpening.cc | 12 +++--- rtengine/color.h | 8 ++-- rtengine/procparams.cc | 5 --- rtengine/procparams.h | 1 - rtgui/batchtoolpanelcoord.cc | 2 +- rtgui/paramsedited.cc | 8 +--- rtgui/paramsedited.h | 1 - rtgui/pdsharpening.cc | 76 +++++++++-------------------------- rtgui/pdsharpening.h | 4 +- 9 files changed, 30 insertions(+), 87 deletions(-) diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index f574fa45f..357a8593f 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -543,7 +543,9 @@ BENCHFUN array2D tmpIThr(fullTileSize, fullTileSize); array2D tmpThr(fullTileSize, fullTileSize); array2D lumThr(fullTileSize, fullTileSize); -#pragma omp for schedule(dynamic,2) collapse(2) +#ifdef _OPENMP + #pragma omp for schedule(dynamic,2) collapse(2) +#endif for (int i = border; i < H - border; i+= tileSize) { for(int j = border; j < W - border; j+= tileSize) { const bool endOfCol = (i + tileSize + border) >= H; @@ -754,14 +756,13 @@ BENCHFUN array2D& L = Lbuffer ? *Lbuffer : red; array2D& YOld = YOldbuffer ? * YOldbuffer : green; array2D& YNew = YNewbuffer ? * YNewbuffer : blue; - const float gamma = sharpeningParams.gamma; #ifdef _OPENMP #pragma omp parallel for schedule(dynamic, 16) #endif for (int i = 0; i < H; ++i) { Color::RGB2L(redVals[i], greenVals[i], blueVals[i], L[i], xyz_rgb, W); - Color::RGB2Y(redVals[i], greenVals[i], blueVals[i], YOld[i], YNew[i], gamma, W); + Color::RGB2Y(redVals[i], greenVals[i], blueVals[i], YOld[i], YNew[i], W); } if (plistener) { plistener->setProgress(0.1); @@ -784,9 +785,8 @@ BENCHFUN for (int i = 0; i < H; ++i) { int j = 0; #ifdef __SSE2__ - const vfloat gammav = F2V(gamma); for (; j < W - 3; j += 4) { - const vfloat factor = pow_F(vmaxf(LVFU(YNew[i][j]), ZEROV) / vmaxf(LVFU(YOld[i][j]), F2V(0.00001f)), gammav); + const vfloat factor = vmaxf(LVFU(YNew[i][j]), ZEROV) / vmaxf(LVFU(YOld[i][j]), F2V(0.00001f)); STVFU(red[i][j], LVFU(redVals[i][j]) * factor); STVFU(green[i][j], LVFU(greenVals[i][j]) * factor); STVFU(blue[i][j], LVFU(blueVals[i][j]) * factor); @@ -794,7 +794,7 @@ BENCHFUN #endif for (; j < W; ++j) { - const float factor = pow_F(std::max(YNew[i][j], 0.f) / std::max(YOld[i][j], 0.00001f), gamma); + const float factor = std::max(YNew[i][j], 0.f) / std::max(YOld[i][j], 0.00001f); red[i][j] = redVals[i][j] * factor; green[i][j] = greenVals[i][j] * factor; blue[i][j] = blueVals[i][j] * factor; diff --git a/rtengine/color.h b/rtengine/color.h index a89778157..d9c344c27 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -1808,11 +1808,9 @@ public: return (hr); } - static inline void RGB2Y(const float* R, const float* G, const float* B, float* Y1, float * Y2, float gamma, int W) { - gamma = 1.f / gamma; + static inline void RGB2Y(const float* R, const float* G, const float* B, float* Y1, float * Y2, int W) { int i = 0; #ifdef __SSE2__ - const vfloat gammav = F2V(gamma); const vfloat c1v = F2V(0.2627f); const vfloat c2v = F2V(0.6780f); const vfloat c3v = F2V(0.0593f); @@ -1820,7 +1818,7 @@ public: const vfloat Rv = vmaxf(LVFU(R[i]), ZEROV); const vfloat Gv = vmaxf(LVFU(G[i]), ZEROV); const vfloat Bv = vmaxf(LVFU(B[i]), ZEROV); - vfloat yv = pow_F(c1v * Rv + c2v * Gv + c3v * Bv, gammav); + vfloat yv = c1v * Rv + c2v * Gv + c3v * Bv; STVFU(Y1[i], yv); STVFU(Y2[i], yv); } @@ -1829,7 +1827,7 @@ public: const float r = std::max(R[i], 0.f); const float g = std::max(G[i], 0.f); const float b = std::max(B[i], 0.f); - Y1[i] = Y2[i] = pow_F(0.2627f * r + 0.6780f * g + 0.0593f * b, gamma); + Y1[i] = Y2[i] = 0.2627f * r + 0.6780f * g + 0.0593f * b; } } diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index c09da1e84..1492797d6 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -1159,7 +1159,6 @@ CaptureSharpeningParams::CaptureSharpeningParams() : autoContrast(true), autoRadius(true), contrast(10.0), - gamma(1.00), deconvradius(0.75), deconvradiusOffset(0.0), deconviter(20) @@ -1171,7 +1170,6 @@ bool CaptureSharpeningParams::operator ==(const CaptureSharpeningParams& other) return enabled == other.enabled && contrast == other.contrast - && gamma == other.gamma && autoContrast == other.autoContrast && autoRadius == other.autoRadius && deconvradius == other.deconvradius @@ -3383,7 +3381,6 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->pdsharpening.contrast, "PostDemosaicSharpening", "Contrast", pdsharpening.contrast, keyFile); saveToKeyfile(!pedited || pedited->pdsharpening.autoContrast, "PostDemosaicSharpening", "AutoContrast", pdsharpening.autoContrast, keyFile); saveToKeyfile(!pedited || pedited->pdsharpening.autoRadius, "PostDemosaicSharpening", "AutoRadius", pdsharpening.autoRadius, keyFile); - saveToKeyfile(!pedited || pedited->pdsharpening.gamma, "PostDemosaicSharpening", "DeconvGamma", pdsharpening.gamma, keyFile); saveToKeyfile(!pedited || pedited->pdsharpening.deconvradius, "PostDemosaicSharpening", "DeconvRadius", pdsharpening.deconvradius, keyFile); saveToKeyfile(!pedited || pedited->pdsharpening.deconvradiusOffset, "PostDemosaicSharpening", "DeconvRadiusOffset", pdsharpening.deconvradiusOffset, keyFile); saveToKeyfile(!pedited || pedited->pdsharpening.deconviter, "PostDemosaicSharpening", "DeconvIterations", pdsharpening.deconviter, keyFile); @@ -4473,8 +4470,6 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "PostDemosaicSharpening", "Contrast", pedited, pdsharpening.contrast, pedited->pdsharpening.contrast); assignFromKeyfile(keyFile, "PostDemosaicSharpening", "AutoContrast", pedited, pdsharpening.autoContrast, pedited->pdsharpening.autoContrast); assignFromKeyfile(keyFile, "PostDemosaicSharpening", "AutoRadius", pedited, pdsharpening.autoRadius, pedited->pdsharpening.autoRadius); - - assignFromKeyfile(keyFile, "PostDemosaicSharpening", "DeconvGamma", pedited, pdsharpening.gamma, pedited->pdsharpening.gamma); assignFromKeyfile(keyFile, "PostDemosaicSharpening", "DeconvRadius", pedited, pdsharpening.deconvradius, pedited->pdsharpening.deconvradius); assignFromKeyfile(keyFile, "PostDemosaicSharpening", "DeconvRadiusOffset", pedited, pdsharpening.deconvradiusOffset, pedited->pdsharpening.deconvradiusOffset); assignFromKeyfile(keyFile, "PostDemosaicSharpening", "DeconvIterations", pedited, pdsharpening.deconviter, pedited->pdsharpening.deconviter); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 015b487ff..0473fe272 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -548,7 +548,6 @@ struct CaptureSharpeningParams { bool autoContrast; bool autoRadius; double contrast; - double gamma; double deconvradius; double deconvradiusOffset; int deconviter; diff --git a/rtgui/batchtoolpanelcoord.cc b/rtgui/batchtoolpanelcoord.cc index 8aed3e96f..2824a285c 100644 --- a/rtgui/batchtoolpanelcoord.cc +++ b/rtgui/batchtoolpanelcoord.cc @@ -157,7 +157,7 @@ void BatchToolPanelCoordinator::initSession () cacorrection->setAdjusterBehavior (false); sharpening->setAdjusterBehavior (false, false, false, false, false, false, false); prsharpening->setAdjusterBehavior (false, false, false, false, false, false, false); - pdSharpening->setAdjusterBehavior (false, false, false, false); + pdSharpening->setAdjusterBehavior (false, false, false); sharpenEdge->setAdjusterBehavior (false, false); sharpenMicro->setAdjusterBehavior (false, false, false); epd->setAdjusterBehavior (false, false, false, false, false); diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 74bf975de..fbee97009 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -169,7 +169,6 @@ void ParamsEdited::set(bool v) pdsharpening.contrast = v; pdsharpening.autoContrast = v; pdsharpening.autoRadius = v; - pdsharpening.gamma = v; pdsharpening.deconvradius = v; pdsharpening.deconvradiusOffset = v; pdsharpening.deconviter = v; @@ -756,7 +755,6 @@ void ParamsEdited::initFrom(const std::vector& pdsharpening.contrast = pdsharpening.contrast && p.pdsharpening.contrast == other.pdsharpening.contrast; pdsharpening.autoContrast = pdsharpening.autoContrast && p.pdsharpening.autoContrast == other.pdsharpening.autoContrast; pdsharpening.autoRadius = pdsharpening.autoRadius && p.pdsharpening.autoRadius == other.pdsharpening.autoRadius; - pdsharpening.gamma = pdsharpening.gamma && p.pdsharpening.gamma == other.pdsharpening.gamma; pdsharpening.deconvradius = pdsharpening.deconvradius && p.pdsharpening.deconvradius == other.pdsharpening.deconvradius; pdsharpening.deconvradiusOffset = pdsharpening.deconvradiusOffset && p.pdsharpening.deconvradiusOffset == other.pdsharpening.deconvradiusOffset; pdsharpening.deconviter = pdsharpening.deconviter && p.pdsharpening.deconviter == other.pdsharpening.deconviter; @@ -1742,10 +1740,6 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.pdsharpening.autoRadius = mods.pdsharpening.autoRadius; } - if (pdsharpening.gamma) { - toEdit.pdsharpening.gamma = dontforceSet && options.baBehav[ADDSET_SHARP_GAMMA] ? toEdit.pdsharpening.gamma + mods.pdsharpening.gamma : mods.pdsharpening.gamma; - } - if (pdsharpening.deconvradius) { toEdit.pdsharpening.deconvradius = dontforceSet && options.baBehav[ADDSET_SHARP_RADIUS] ? toEdit.pdsharpening.deconvradius + mods.pdsharpening.deconvradius : mods.pdsharpening.deconvradius; } @@ -3307,5 +3301,5 @@ bool FilmNegativeParamsEdited::isUnchanged() const bool CaptureSharpeningParamsEdited::isUnchanged() const { - return enabled && contrast && autoContrast && autoRadius && gamma && deconvradius && deconvradiusOffset && deconviter; + return enabled && contrast && autoContrast && autoRadius && deconvradius && deconvradiusOffset && deconviter; } \ No newline at end of file diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 86bffe48d..6c129040c 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -215,7 +215,6 @@ struct CaptureSharpeningParamsEdited { bool contrast; bool autoContrast; bool autoRadius; - bool gamma; bool deconvradius; bool deconvradiusOffset; bool deconviter; diff --git a/rtgui/pdsharpening.cc b/rtgui/pdsharpening.cc index d0ccc43a8..ad982b82e 100644 --- a/rtgui/pdsharpening.cc +++ b/rtgui/pdsharpening.cc @@ -37,7 +37,6 @@ PdSharpening::PdSharpening() : { auto m = ProcEventMapper::getInstance(); EvPdShrContrast = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_CONTRAST"); - EvPdSharpenGamma = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_GAMMA"); EvPdShrDRadius = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_RADIUS"); EvPdShrDRadiusOffset = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_RADIUS_BOOST"); EvPdShrDIterations = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_ITERATIONS"); @@ -57,17 +56,14 @@ PdSharpening::PdSharpening() : pack_start(*hb); Gtk::VBox* rld = Gtk::manage(new Gtk::VBox()); - gamma = Gtk::manage(new Adjuster(M("TP_SHARPENING_GAMMA"), 0.5, 6.0, 0.05, 1.00)); dradius = Gtk::manage(new Adjuster(M("TP_SHARPENING_RADIUS"), 0.4, 1.15, 0.01, 0.75)); dradius->addAutoButton(); dradius->setAutoValue(true); dradiusOffset = Gtk::manage(new Adjuster(M("TP_SHARPENING_RADIUS_BOOST"), -0.5, 0.5, 0.01, 0.0)); diter = Gtk::manage(new Adjuster(M("TP_SHARPENING_RLD_ITERATIONS"), 1, 100, 1, 20)); - rld->pack_start(*gamma); rld->pack_start(*dradius); rld->pack_start(*dradiusOffset); rld->pack_start(*diter); - gamma->show(); dradius->show(); dradiusOffset->show(); diter->show(); @@ -76,13 +72,11 @@ PdSharpening::PdSharpening() : dradius->setAdjusterListener(this); dradiusOffset->setAdjusterListener(this); - gamma->setAdjusterListener(this); diter->setAdjusterListener(this); contrast->delay = std::max(contrast->delay, options.adjusterMaxDelay); dradius->delay = std::max(dradius->delay, options.adjusterMaxDelay); dradiusOffset->delay = std::max(dradiusOffset->delay, options.adjusterMaxDelay); - gamma->delay = std::max(gamma->delay, options.adjusterMaxDelay); diter->delay = std::max(diter->delay, options.adjusterMaxDelay); } @@ -101,7 +95,6 @@ void PdSharpening::read(const ProcParams* pp, const ParamsEdited* pedited) contrast->setEditedState(pedited->pdsharpening.contrast ? Edited : UnEdited); contrast->setAutoInconsistent(multiImage && !pedited->pdsharpening.autoContrast); dradius->setAutoInconsistent(multiImage && !pedited->pdsharpening.autoRadius); - gamma->setEditedState(pedited->pdsharpening.gamma ? Edited : UnEdited); dradius->setEditedState(pedited->pdsharpening.deconvradius ? Edited : UnEdited); dradiusOffset->setEditedState(pedited->pdsharpening.deconvradiusOffset ? Edited : UnEdited); diter->setEditedState(pedited->pdsharpening.deconviter ? Edited : UnEdited); @@ -113,7 +106,6 @@ void PdSharpening::read(const ProcParams* pp, const ParamsEdited* pedited) contrast->setValue(pp->pdsharpening.contrast); contrast->setAutoValue(pp->pdsharpening.autoContrast); - gamma->setValue(pp->pdsharpening.gamma); dradius->setValue(pp->pdsharpening.deconvradius); dradius->setAutoValue(pp->pdsharpening.autoRadius); dradiusOffset->setValue(pp->pdsharpening.deconvradiusOffset); @@ -130,7 +122,6 @@ void PdSharpening::write(ProcParams* pp, ParamsEdited* pedited) pp->pdsharpening.contrast = contrast->getValue(); pp->pdsharpening.autoContrast = contrast->getAutoValue(); pp->pdsharpening.enabled = getEnabled(); - pp->pdsharpening.gamma = gamma->getValue(); pp->pdsharpening.deconvradius = dradius->getValue(); pp->pdsharpening.autoRadius = dradius->getAutoValue(); pp->pdsharpening.deconvradiusOffset = dradiusOffset->getValue(); @@ -139,7 +130,6 @@ void PdSharpening::write(ProcParams* pp, ParamsEdited* pedited) if (pedited) { pedited->pdsharpening.contrast = contrast->getEditedState(); pedited->pdsharpening.autoContrast = !contrast->getAutoInconsistent(); - pedited->pdsharpening.gamma = gamma->getEditedState(); pedited->pdsharpening.deconvradius = dradius->getEditedState(); pedited->pdsharpening.autoRadius = !dradius->getAutoInconsistent(); pedited->pdsharpening.deconvradiusOffset = dradiusOffset->getEditedState(); @@ -152,20 +142,17 @@ void PdSharpening::setDefaults(const ProcParams* defParams, const ParamsEdited* { contrast->setDefault(defParams->pdsharpening.contrast); - gamma->setDefault(defParams->pdsharpening.gamma); dradius->setDefault(defParams->pdsharpening.deconvradius); dradiusOffset->setDefault(defParams->pdsharpening.deconvradiusOffset); diter->setDefault(defParams->pdsharpening.deconviter); if (pedited) { contrast->setDefaultEditedState(pedited->pdsharpening.contrast ? Edited : UnEdited); - gamma->setDefaultEditedState(pedited->pdsharpening.gamma ? Edited : UnEdited); dradius->setDefaultEditedState(pedited->pdsharpening.deconvradius ? Edited : UnEdited); dradiusOffset->setDefaultEditedState(pedited->pdsharpening.deconvradiusOffset ? Edited : UnEdited); diter->setDefaultEditedState(pedited->pdsharpening.deconviter ? Edited : UnEdited); } else { contrast->setDefaultEditedState(Irrelevant); - gamma->setDefaultEditedState(Irrelevant); dradius->setDefaultEditedState(Irrelevant); dradiusOffset->setDefaultEditedState(Irrelevant); diter->setDefaultEditedState(Irrelevant); @@ -178,7 +165,7 @@ void PdSharpening::adjusterChanged(Adjuster* a, double newval) Glib::ustring costr; - if (a == gamma || a == dradius || a == dradiusOffset) { + if (a == dradius || a == dradiusOffset) { costr = Glib::ustring::format(std::setw(3), std::fixed, std::setprecision(2), a->getValue()); } else { costr = Glib::ustring::format((int)a->getValue()); @@ -186,8 +173,6 @@ void PdSharpening::adjusterChanged(Adjuster* a, double newval) if (a == contrast) { listener->panelChanged(EvPdShrContrast, costr); - } else if (a == gamma) { - listener->panelChanged(EvPdSharpenGamma, costr); } else if (a == dradius) { listener->panelChanged(EvPdShrDRadius, costr); } else if (a == dradiusOffset) { @@ -217,17 +202,15 @@ void PdSharpening::setBatchMode(bool batchMode) ToolPanel::setBatchMode(batchMode); contrast->showEditedCB(); - gamma->showEditedCB(); dradius->showEditedCB(); dradiusOffset->showEditedCB(); diter->showEditedCB(); } -void PdSharpening::setAdjusterBehavior(bool contrastadd, bool gammaadd, bool radiusadd, bool iteradd) +void PdSharpening::setAdjusterBehavior(bool contrastadd, bool radiusadd, bool iteradd) { contrast->setAddMode(contrastadd); - gamma->setAddMode(gammaadd); dradius->setAddMode(radiusadd); dradiusOffset->setAddMode(radiusadd); diter->setAddMode(iteradd); @@ -237,7 +220,6 @@ void PdSharpening::trimValues(rtengine::procparams::ProcParams* pp) { contrast->trimValue(pp->pdsharpening.contrast); - gamma->trimValue(pp->pdsharpening.gamma); dradius->trimValue(pp->pdsharpening.deconvradius); dradiusOffset->trimValue(pp->pdsharpening.deconvradiusOffset); diter->trimValue(pp->pdsharpening.deconviter); @@ -271,47 +253,25 @@ void PdSharpening::autoRadiusChanged(double autoRadius) void PdSharpening::adjusterAutoToggled(Adjuster* a, bool newval) { - if (a == contrast) { - if (multiImage) { - if (contrast->getAutoInconsistent()) { - contrast->setAutoInconsistent(false); - contrast->setAutoValue(false); - } else if (lastAutoContrast) { - contrast->setAutoInconsistent(true); - } - - lastAutoContrast = contrast->getAutoValue(); + if (multiImage) { + if (a->getAutoInconsistent()) { + a->setAutoInconsistent(false); + a->setAutoValue(false); + } else if (lastAutoRadius) { + a->setAutoInconsistent(true); } - if (listener) { - if (contrast->getAutoInconsistent()) { - listener->panelChanged(EvPdShrAutoContrast, M("GENERAL_UNCHANGED")); - } else if (contrast->getAutoValue()) { - listener->panelChanged(EvPdShrAutoContrast, M("GENERAL_ENABLED")); - } else { - listener->panelChanged(EvPdShrAutoContrast, M("GENERAL_DISABLED")); - } - } - } else { // must be dradius - if (multiImage) { - if (dradius->getAutoInconsistent()) { - dradius->setAutoInconsistent(false); - dradius->setAutoValue(false); - } else if (lastAutoRadius) { - dradius->setAutoInconsistent(true); - } + (a == contrast ? lastAutoContrast : lastAutoRadius) = a->getAutoValue(); + } - lastAutoRadius = dradius->getAutoValue(); - } - - if (listener) { - if (dradius->getAutoInconsistent()) { - listener->panelChanged(EvPdShrAutoRadius, M("GENERAL_UNCHANGED")); - } else if (dradius->getAutoValue()) { - listener->panelChanged(EvPdShrAutoRadius, M("GENERAL_ENABLED")); - } else { - listener->panelChanged(EvPdShrAutoRadius, M("GENERAL_DISABLED")); - } + if (listener) { + const auto event = (a == contrast ? EvPdShrAutoContrast : EvPdShrAutoRadius); + if (a->getAutoInconsistent()) { + listener->panelChanged(event, M("GENERAL_UNCHANGED")); + } else if (a->getAutoValue()) { + listener->panelChanged(event, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(event, M("GENERAL_DISABLED")); } } } diff --git a/rtgui/pdsharpening.h b/rtgui/pdsharpening.h index f621fd0a5..61d80503f 100644 --- a/rtgui/pdsharpening.h +++ b/rtgui/pdsharpening.h @@ -26,7 +26,6 @@ class PdSharpening final : public ToolParamBlock, public AdjusterListener, publi protected: Adjuster* contrast; - Adjuster* gamma; Adjuster* dradius; Adjuster* dradiusOffset; Adjuster* diter; @@ -36,7 +35,6 @@ protected: rtengine::ProcEvent EvPdShrContrast; rtengine::ProcEvent EvPdShrDRadius; rtengine::ProcEvent EvPdShrDRadiusOffset; - rtengine::ProcEvent EvPdSharpenGamma; rtengine::ProcEvent EvPdShrDIterations; rtengine::ProcEvent EvPdShrAutoContrast; rtengine::ProcEvent EvPdShrAutoRadius; @@ -59,6 +57,6 @@ public: void autoContrastChanged (double autoContrast) override; void autoRadiusChanged (double autoRadius) override; - void setAdjusterBehavior (bool contrastadd, bool gammaadd, bool radiusadd, bool iteradds); + void setAdjusterBehavior (bool contrastadd, bool radiusadd, bool iteradds); void trimValues (rtengine::procparams::ProcParams* pp) override; }; From faa324ebf7e77f066c23c11a5d0e5c6f101d32ba Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Sun, 10 Nov 2019 23:13:15 +0100 Subject: [PATCH 146/208] Panasonic DC-S1 / DC-S1R white levels, #5204 Based on measurements from supplied white frames of the DC-S1, and non-white frame raw files with clipping from various sources on the internet of the DC-S1R. --- rtengine/camconst.json | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index 32e8bc628..3463bfcc9 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -2142,9 +2142,22 @@ Camera constants: } }, - { // Quality B, per ISO info missing - "make_model": [ "Panasonic DC-S1", "Panasonic DC-S1R" ], - "ranges": { "white": 16225 } + { // Quality B, issue #5204. Missing ISO 50, 64 and 80 and I expect the WL to differ for these ISO values + "make_model": [ "Panasonic DC-S1" ], + "dcraw_matrix": [ 9744, -3905, -779, -4899, 12807, 2324, -798, 1630, 5827 ], // ColorMatrix2 using illuminant D65 from Adobe DNG Converter 11.4 + "ranges": { "white": 16320 } + }, + + { // Quality X, issue #5204. No white frames available. + "make_model": [ "Panasonic DC-S1R" ], + "dcraw_matrix": [ 11822, -5321, -1249, -5958, 15114, 766, -614, 1264, 7043 ], // ColorMatrix2 using illuminant D65 from Adobe DNG Converter 11.4 + "ranges": { + "white": [ + { "iso": 50, "levels": 9500 }, + { "iso": [64, 80], "levels": 11600 }, + { "iso": 100, "levels": 16336 } + ] + } }, { // Quality B, per ISO info missing From af4bf34b6baaef0522e79c4968ebcdff0006fe70 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 11 Nov 2019 15:52:31 +0100 Subject: [PATCH 147/208] Capture sharpening: cleanup --- rtengine/capturesharpening.cc | 126 ++++++++++++++++------------------ 1 file changed, 58 insertions(+), 68 deletions(-) diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index 357a8593f..b1e1657b4 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -99,33 +99,48 @@ void compute3x3kernel(float sigma, float kernel[3][3]) { } } -inline void gauss3x3div (float** RESTRICT src, float** RESTRICT dst, float** RESTRICT divBuffer, const int W, const int H, const float kernel[3][3]) +inline void initTile(float** dst, const int tileSize) +{ + + // first rows + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < tileSize; ++j) { + dst[i][j] = 1.f; + } + } + + // left and right border + for (int i = 3; i < tileSize - 3; ++i) { + dst[i][0] = dst[i][1] = dst[i][2] = 1.f; + dst[i][tileSize - 3] = dst[i][tileSize - 2] = dst[i][tileSize - 1] = 1.f; + } + + // last rows + for (int i = tileSize - 3 ; i < tileSize; ++i) { + for (int j = 0; j < tileSize; ++j) { + dst[i][j] = 1.f; + } + } +} + +inline void gauss3x3div (float** RESTRICT src, float** RESTRICT dst, float** RESTRICT divBuffer, const int tileSize, const float kernel[3][3]) { const float c11 = kernel[0][0]; const float c10 = kernel[0][1]; const float c00 = kernel[1][1]; - for (int i = 1; i < H - 1; i++) { - dst[i][0] = 1.f; - for (int j = 1; j < W - 1; j++) { + for (int i = 1; i < tileSize - 1; i++) { + for (int j = 1; j < tileSize - 1; j++) { const float val = c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) + c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) + c00 * src[i][j]; dst[i][j] = divBuffer[i][j] / std::max(val, 0.00001f); } - dst[i][W - 1] = 1.f; - } - // first and last row - for (int j = 0; j < W; ++j) { - dst[0][j] = 1.f; - } - for (int j = 0; j < W; ++j) { - dst[H - 1][j] = 1.f; } } -inline void gauss5x5div (float** RESTRICT src, float** RESTRICT dst, float** RESTRICT divBuffer, const int W, const int H, const float kernel[5][5]) +inline void gauss5x5div (float** RESTRICT src, float** RESTRICT dst, float** RESTRICT divBuffer, const int tileSize, const float kernel[5][5]) { const float c21 = kernel[0][1]; @@ -134,10 +149,9 @@ inline void gauss5x5div (float** RESTRICT src, float** RESTRICT dst, float** RES const float c10 = kernel[1][2]; const float c00 = kernel[2][2]; - for (int i = 2; i < H - 2; ++i) { - dst[i][0] = dst[i][1] = 1.f; + for (int i = 2; i < tileSize - 2; ++i) { // I tried hand written SSE code but gcc vectorizes better - for (int j = 2; j < W - 2; ++j) { + for (int j = 2; j < tileSize - 2; ++j) { const float val = c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) + c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) + c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) + @@ -146,23 +160,10 @@ inline void gauss5x5div (float** RESTRICT src, float** RESTRICT dst, float** RES dst[i][j] = divBuffer[i][j] / std::max(val, 0.00001f); } - dst[i][W - 2] = dst[i][W - 1] = 1.f; - } - - // first and last rows - for (int i = 0; i < 2; ++i) { - for (int j = 0; j < W; ++j) { - dst[i][j] = 1.f; - } - } - for (int i = H - 2 ; i < H; ++i) { - for (int j = 0; j < W; ++j) { - dst[i][j] = 1.f; - } } } -inline void gauss7x7div(float** RESTRICT src, float** RESTRICT dst, float** RESTRICT divBuffer, const int W, const int H, const float kernel[7][7]) +inline void gauss7x7div(float** RESTRICT src, float** RESTRICT dst, float** RESTRICT divBuffer, const int tileSize, const float kernel[7][7]) { const float c31 = kernel[0][2]; @@ -174,10 +175,9 @@ inline void gauss7x7div(float** RESTRICT src, float** RESTRICT dst, float** REST const float c10 = kernel[2][3]; const float c00 = kernel[3][3]; - for (int i = 3; i < H - 3; ++i) { - dst[i][0] = dst[i][1] = dst[i][2] = 1.f; + for (int i = 3; i < tileSize - 3; ++i) { // I tried hand written SSE code but gcc vectorizes better - for (int j = 3; j < W - 3; ++j) { + for (int j = 3; j < tileSize - 3; ++j) { const float val = c31 * (src[i - 3][j - 1] + src[i - 3][j + 1] + src[i - 1][j - 3] + src[i - 1][j + 3] + src[i + 1][j - 3] + src[i + 1][j + 3] + src[i + 3][j - 1] + src[i + 3][j + 1]) + c30 * (src[i - 3][j] + src[i][j - 3] + src[i][j + 3] + src[i + 3][j]) + c22 * (src[i - 2][j - 2] + src[i - 2][j + 2] + src[i + 2][j - 2] + src[i + 2][j + 2]) + @@ -189,30 +189,17 @@ inline void gauss7x7div(float** RESTRICT src, float** RESTRICT dst, float** REST dst[i][j] = divBuffer[i][j] / std::max(val, 0.00001f); } - dst[i][W - 3] = dst[i][W - 2] = dst[i][W - 1] = 1.f; - } - - // first and last rows - for (int i = 0; i < 3; ++i) { - for (int j = 0; j < W; ++j) { - dst[i][j] = 1.f; - } - } - for (int i = H - 3 ; i < H; ++i) { - for (int j = 0; j < W; ++j) { - dst[i][j] = 1.f; - } } } -inline void gauss3x3mult(float** RESTRICT src, float** RESTRICT dst, const int W, const int H, const float kernel[3][3]) +inline void gauss3x3mult(float** RESTRICT src, float** RESTRICT dst, const int tileSize, const float kernel[3][3]) { const float c11 = kernel[0][0]; const float c10 = kernel[0][1]; const float c00 = kernel[1][1]; - for (int i = 1; i < H - 1; i++) { - for (int j = 1; j < W - 1; j++) { + for (int i = 1; i < tileSize - 1; i++) { + for (int j = 1; j < tileSize - 1; j++) { const float val = c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) + c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) + c00 * src[i][j]; @@ -222,7 +209,7 @@ inline void gauss3x3mult(float** RESTRICT src, float** RESTRICT dst, const int W } -inline void gauss5x5mult (float** RESTRICT src, float** RESTRICT dst, const int W, const int H, const float kernel[5][5]) +inline void gauss5x5mult (float** RESTRICT src, float** RESTRICT dst, const int tileSize, const float kernel[5][5]) { const float c21 = kernel[0][1]; @@ -231,9 +218,9 @@ inline void gauss5x5mult (float** RESTRICT src, float** RESTRICT dst, const int const float c10 = kernel[1][2]; const float c00 = kernel[2][2]; - for (int i = 2; i < H - 2; ++i) { + for (int i = 2; i < tileSize - 2; ++i) { // I tried hand written SSE code but gcc vectorizes better - for (int j = 2; j < W - 2; ++j) { + for (int j = 2; j < tileSize - 2; ++j) { const float val = c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) + c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) + c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) + @@ -245,7 +232,7 @@ inline void gauss5x5mult (float** RESTRICT src, float** RESTRICT dst, const int } } -inline void gauss7x7mult(float** RESTRICT src, float** RESTRICT dst, const int W, const int H, const float kernel[7][7]) +inline void gauss7x7mult(float** RESTRICT src, float** RESTRICT dst, const int tileSize, const float kernel[7][7]) { const float c31 = kernel[0][2]; @@ -257,9 +244,9 @@ inline void gauss7x7mult(float** RESTRICT src, float** RESTRICT dst, const int W const float c10 = kernel[2][3]; const float c00 = kernel[3][3]; - for (int i = 3; i < H - 3; ++i) { + for (int i = 3; i < tileSize - 3; ++i) { // I tried hand written SSE code but gcc vectorizes better - for (int j = 3; j < W - 3; ++j) { + for (int j = 3; j < tileSize - 3; ++j) { const float val = c31 * (src[i - 3][j - 1] + src[i - 3][j + 1] + src[i - 1][j - 3] + src[i - 1][j + 3] + src[i + 1][j - 3] + src[i + 1][j + 3] + src[i + 3][j - 1] + src[i + 3][j + 1]) + c30 * (src[i - 3][j] + src[i][j - 3] + src[i][j + 3] + src[i + 3][j]) + c22 * (src[i - 2][j - 2] + src[i - 2][j + 2] + src[i + 2][j - 2] + src[i + 2][j + 2]) + @@ -543,6 +530,7 @@ BENCHFUN array2D tmpIThr(fullTileSize, fullTileSize); array2D tmpThr(fullTileSize, fullTileSize); array2D lumThr(fullTileSize, fullTileSize); + initTile(tmpThr, fullTileSize); #ifdef _OPENMP #pragma omp for schedule(dynamic,2) collapse(2) #endif @@ -570,14 +558,14 @@ BENCHFUN if (is3x3) { for (int k = 0; k < iterations; ++k) { // apply 3x3 gaussian blur and divide luminance by result of gaussian blur - gauss3x3div(tmpIThr, tmpThr, lumThr, fullTileSize, fullTileSize, kernel3); - gauss3x3mult(tmpThr, tmpIThr, fullTileSize, fullTileSize, kernel3); + gauss3x3div(tmpIThr, tmpThr, lumThr, fullTileSize, kernel3); + gauss3x3mult(tmpThr, tmpIThr, fullTileSize, kernel3); } } else if (is5x5) { for (int k = 0; k < iterations; ++k) { // apply 5x5 gaussian blur and divide luminance by result of gaussian blur - gauss5x5div(tmpIThr, tmpThr, lumThr, fullTileSize, fullTileSize, kernel5); - gauss5x5mult(tmpThr, tmpIThr, fullTileSize, fullTileSize, kernel5); + gauss5x5div(tmpIThr, tmpThr, lumThr, fullTileSize, kernel5); + gauss5x5mult(tmpThr, tmpIThr, fullTileSize, kernel5); } } else { if (sigmaCornerOffset != 0.0) { @@ -586,17 +574,17 @@ BENCHFUN if (sigmaTile >= 0.4f) { float lkernel7[7][7]; compute7x7kernel(static_cast(sigma) + distanceFactor * distance, lkernel7); - for (int k = 0; k < iterations - 1; ++k) { + for (int k = 0; k < iterations; ++k) { // apply 7x7 gaussian blur and divide luminance by result of gaussian blur - gauss7x7div(tmpIThr, tmpThr, lumThr, fullTileSize, fullTileSize, lkernel7); - gauss7x7mult(tmpThr, tmpIThr, fullTileSize, fullTileSize, lkernel7); + gauss7x7div(tmpIThr, tmpThr, lumThr, fullTileSize, lkernel7); + gauss7x7mult(tmpThr, tmpIThr, fullTileSize, lkernel7); } } } else { for (int k = 0; k < iterations; ++k) { // apply 7x7 gaussian blur and divide luminance by result of gaussian blur - gauss7x7div(tmpIThr, tmpThr, lumThr, fullTileSize, fullTileSize, kernel7); - gauss7x7mult(tmpThr, tmpIThr, fullTileSize, fullTileSize, kernel7); + gauss7x7div(tmpIThr, tmpThr, lumThr, fullTileSize, kernel7); + gauss7x7mult(tmpThr, tmpIThr, fullTileSize, kernel7); } } } @@ -643,7 +631,7 @@ void RawImageSource::captureSharpening(const procparams::CaptureSharpeningParams plistener->setProgress(0.0); } BENCHFUN - const float xyz_rgb[3][3] = { // XYZ from RGB + constexpr float xyz_rgb[3][3] = { // XYZ from RGB { 0.412453, 0.357580, 0.180423 }, { 0.212671, 0.715160, 0.072169 }, { 0.019334, 0.119193, 0.950227 } @@ -659,6 +647,8 @@ BENCHFUN array2D clipMask(W, H); constexpr float clipLimit = 0.95f; + constexpr float maxSigma = 1.15f; + if (getSensorType() == ST_BAYER) { const float whites[2][2] = { {(ri->get_white(FC(0,0)) - c_black[FC(0,0)]) * scale_mul[FC(0,0)] * clipLimit, (ri->get_white(FC(0,1)) - c_black[FC(0,1)]) * scale_mul[FC(0,1)] * clipLimit}, @@ -667,7 +657,7 @@ BENCHFUN buildClipMaskBayer(rawData, W, H, clipMask, whites); const unsigned int fc[2] = {FC(0,0), FC(1,0)}; if (sharpeningParams.autoRadius) { - radius = std::min(calcRadiusBayer(rawData, W, H, 1000.f, clipVal, fc), 1.15f); + radius = std::min(calcRadiusBayer(rawData, W, H, 1000.f, clipVal, fc), maxSigma); } } else if (getSensorType() == ST_FUJI_XTRANS) { float whites[6][6]; @@ -695,14 +685,14 @@ BENCHFUN } } if (sharpeningParams.autoRadius) { - radius = std::min(calcRadiusXtrans(rawData, W, H, 1000.f, clipVal, i, j), 1.15f); + radius = std::min(calcRadiusXtrans(rawData, W, H, 1000.f, clipVal, i, j), maxSigma); } } else if (ri->get_colors() == 1) { buildClipMaskMono(rawData, W, H, clipMask, (ri->get_white(0) - c_black[0]) * scale_mul[0] * clipLimit); if (sharpeningParams.autoRadius) { const unsigned int fc[2] = {0, 0}; - radius = std::min(calcRadiusBayer(rawData, W, H, 1000.f, clipVal, fc), 1.15f); + radius = std::min(calcRadiusBayer(rawData, W, H, 1000.f, clipVal, fc), maxSigma); } } From 174f5e95ff1daa684a034f55961b6244e9acd164 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 12 Nov 2019 00:19:04 +0100 Subject: [PATCH 148/208] Capture sharpening: revome transations related to gamma! --- rtdata/languages/default | 3 --- 1 file changed, 3 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index f21a352f0..f1ed6ed5f 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -768,7 +768,6 @@ HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold -HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost @@ -782,7 +781,6 @@ HISTORY_MSG_RAW_BORDER;Raw border HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold -HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength @@ -2032,7 +2030,6 @@ TP_SHARPENING_BLUR;Blur radius TP_SHARPENING_CONTRAST;Contrast threshold TP_SHARPENING_EDRADIUS;Radius TP_SHARPENING_EDTOLERANCE;Edge tolerance -TP_SHARPENING_GAMMA;Gamma TP_SHARPENING_HALOCONTROL;Halo control TP_SHARPENING_HCAMOUNT;Amount TP_SHARPENING_LABEL;Sharpening From e525f5bec19802b048753c13a3aaa634964ec269 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 12 Nov 2019 14:37:15 +0100 Subject: [PATCH 149/208] Capture sharpening: added range-adjuster to exclude bright areas from sharpening --- rtengine/capturesharpening.cc | 2 +- rtengine/procparams.cc | 6 +++++- rtengine/procparams.h | 1 + rtgui/addsetids.h | 2 +- rtgui/batchtoolpanelcoord.cc | 2 +- rtgui/paramsedited.cc | 8 +++++++- rtgui/paramsedited.h | 1 + rtgui/pdsharpening.cc | 26 +++++++++++++++++++++++++- rtgui/pdsharpening.h | 4 +++- 9 files changed, 45 insertions(+), 7 deletions(-) diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index b1e1657b4..82e8abb20 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -646,7 +646,7 @@ BENCHFUN const array2D& blueVals = blueCache ? *blueCache : blue; array2D clipMask(W, H); - constexpr float clipLimit = 0.95f; + const float clipLimit = sharpeningParams.deconvrange / 100.f; constexpr float maxSigma = 1.15f; if (getSensorType() == ST_BAYER) { diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 1492797d6..9714b97e5 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -1161,7 +1161,8 @@ CaptureSharpeningParams::CaptureSharpeningParams() : contrast(10.0), deconvradius(0.75), deconvradiusOffset(0.0), - deconviter(20) + deconviter(20), + deconvrange(95) { } @@ -1173,6 +1174,7 @@ bool CaptureSharpeningParams::operator ==(const CaptureSharpeningParams& other) && autoContrast == other.autoContrast && autoRadius == other.autoRadius && deconvradius == other.deconvradius + && deconvrange == other.deconvrange && deconvradiusOffset == other.deconvradiusOffset && deconviter == other.deconviter; } @@ -3383,6 +3385,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->pdsharpening.autoRadius, "PostDemosaicSharpening", "AutoRadius", pdsharpening.autoRadius, keyFile); saveToKeyfile(!pedited || pedited->pdsharpening.deconvradius, "PostDemosaicSharpening", "DeconvRadius", pdsharpening.deconvradius, keyFile); saveToKeyfile(!pedited || pedited->pdsharpening.deconvradiusOffset, "PostDemosaicSharpening", "DeconvRadiusOffset", pdsharpening.deconvradiusOffset, keyFile); + saveToKeyfile(!pedited || pedited->pdsharpening.deconvrange, "PostDemosaicSharpening", "DeconvRange", pdsharpening.deconvrange, keyFile); saveToKeyfile(!pedited || pedited->pdsharpening.deconviter, "PostDemosaicSharpening", "DeconvIterations", pdsharpening.deconviter, keyFile); // Post resize sharpening @@ -4472,6 +4475,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "PostDemosaicSharpening", "AutoRadius", pedited, pdsharpening.autoRadius, pedited->pdsharpening.autoRadius); assignFromKeyfile(keyFile, "PostDemosaicSharpening", "DeconvRadius", pedited, pdsharpening.deconvradius, pedited->pdsharpening.deconvradius); assignFromKeyfile(keyFile, "PostDemosaicSharpening", "DeconvRadiusOffset", pedited, pdsharpening.deconvradiusOffset, pedited->pdsharpening.deconvradiusOffset); + assignFromKeyfile(keyFile, "PostDemosaicSharpening", "DeconvRange", pedited, pdsharpening.deconvrange, pedited->pdsharpening.deconvrange); assignFromKeyfile(keyFile, "PostDemosaicSharpening", "DeconvIterations", pedited, pdsharpening.deconviter, pedited->pdsharpening.deconviter); } diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 0473fe272..b32f66e4f 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -551,6 +551,7 @@ struct CaptureSharpeningParams { double deconvradius; double deconvradiusOffset; int deconviter; + int deconvrange; CaptureSharpeningParams(); diff --git a/rtgui/addsetids.h b/rtgui/addsetids.h index 46cf19ed5..b1fd2bfed 100644 --- a/rtgui/addsetids.h +++ b/rtgui/addsetids.h @@ -140,7 +140,7 @@ enum { ADDSET_XTRANS_FALSE_COLOR_SUPPRESSION, ADDSET_SOFTLIGHT_STRENGTH, ADDSET_DEHAZE_STRENGTH, - ADDSET_SHARP_GAMMA, + ADDSET_SHARP_RANGE, ADDSET_PARAM_NUM // THIS IS USED AS A DELIMITER!! }; diff --git a/rtgui/batchtoolpanelcoord.cc b/rtgui/batchtoolpanelcoord.cc index 2824a285c..8aed3e96f 100644 --- a/rtgui/batchtoolpanelcoord.cc +++ b/rtgui/batchtoolpanelcoord.cc @@ -157,7 +157,7 @@ void BatchToolPanelCoordinator::initSession () cacorrection->setAdjusterBehavior (false); sharpening->setAdjusterBehavior (false, false, false, false, false, false, false); prsharpening->setAdjusterBehavior (false, false, false, false, false, false, false); - pdSharpening->setAdjusterBehavior (false, false, false); + pdSharpening->setAdjusterBehavior (false, false, false, false); sharpenEdge->setAdjusterBehavior (false, false); sharpenMicro->setAdjusterBehavior (false, false, false); epd->setAdjusterBehavior (false, false, false, false, false); diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index fbee97009..f31adedde 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -172,6 +172,7 @@ void ParamsEdited::set(bool v) pdsharpening.deconvradius = v; pdsharpening.deconvradiusOffset = v; pdsharpening.deconviter = v; + pdsharpening.deconvrange = v; prsharpening.enabled = v; prsharpening.contrast = v; prsharpening.radius = v; @@ -758,6 +759,7 @@ void ParamsEdited::initFrom(const std::vector& pdsharpening.deconvradius = pdsharpening.deconvradius && p.pdsharpening.deconvradius == other.pdsharpening.deconvradius; pdsharpening.deconvradiusOffset = pdsharpening.deconvradiusOffset && p.pdsharpening.deconvradiusOffset == other.pdsharpening.deconvradiusOffset; pdsharpening.deconviter = pdsharpening.deconviter && p.pdsharpening.deconviter == other.pdsharpening.deconviter; + pdsharpening.deconvrange = pdsharpening.deconvrange && p.pdsharpening.deconvrange == other.pdsharpening.deconvrange; prsharpening.enabled = prsharpening.enabled && p.prsharpening.enabled == other.prsharpening.enabled; prsharpening.contrast = prsharpening.contrast && p.prsharpening.contrast == other.prsharpening.contrast; prsharpening.radius = prsharpening.radius && p.prsharpening.radius == other.prsharpening.radius; @@ -1752,6 +1754,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.pdsharpening.deconviter = dontforceSet && options.baBehav[ADDSET_SHARP_ITER] ? toEdit.pdsharpening.deconviter + mods.pdsharpening.deconviter : mods.pdsharpening.deconviter; } + if (pdsharpening.deconvrange) { + toEdit.pdsharpening.deconvrange = dontforceSet && options.baBehav[ADDSET_SHARP_RANGE] ? toEdit.pdsharpening.deconvrange + mods.pdsharpening.deconvrange : mods.pdsharpening.deconvrange; + } + if (prsharpening.enabled) { toEdit.prsharpening.enabled = mods.prsharpening.enabled; } @@ -3301,5 +3307,5 @@ bool FilmNegativeParamsEdited::isUnchanged() const bool CaptureSharpeningParamsEdited::isUnchanged() const { - return enabled && contrast && autoContrast && autoRadius && deconvradius && deconvradiusOffset && deconviter; + return enabled && contrast && autoContrast && autoRadius && deconvradius && deconvradiusOffset && deconviter && deconvrange; } \ No newline at end of file diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 6c129040c..1a708329a 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -218,6 +218,7 @@ struct CaptureSharpeningParamsEdited { bool deconvradius; bool deconvradiusOffset; bool deconviter; + bool deconvrange; bool isUnchanged() const; }; diff --git a/rtgui/pdsharpening.cc b/rtgui/pdsharpening.cc index ad982b82e..02fe56033 100644 --- a/rtgui/pdsharpening.cc +++ b/rtgui/pdsharpening.cc @@ -24,6 +24,7 @@ #include "eventmapper.h" #include "options.h" +#include "rtimage.h" #include "../rtengine/procparams.h" @@ -37,6 +38,7 @@ PdSharpening::PdSharpening() : { auto m = ProcEventMapper::getInstance(); EvPdShrContrast = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_CONTRAST"); + EvPdShrRange = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_RANGE"); EvPdShrDRadius = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_RADIUS"); EvPdShrDRadiusOffset = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_RADIUS_BOOST"); EvPdShrDIterations = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_ITERATIONS"); @@ -53,6 +55,14 @@ PdSharpening::PdSharpening() : pack_start(*contrast); contrast->show(); + Gtk::Image *al = Gtk::manage(new RTImage("circle-black-small.png")); + Gtk::Image *ar = Gtk::manage(new RTImage("circle-white-small.png")); + range = Gtk::manage(new Adjuster(M("TP_SHARPENING_RANGE"), 0, 100, 1, 95, al, ar)); + range->setAdjusterListener(this); + + pack_start(*range); + range->show(); + pack_start(*hb); Gtk::VBox* rld = Gtk::manage(new Gtk::VBox()); @@ -73,8 +83,10 @@ PdSharpening::PdSharpening() : dradius->setAdjusterListener(this); dradiusOffset->setAdjusterListener(this); diter->setAdjusterListener(this); + range->setAdjusterListener(this); contrast->delay = std::max(contrast->delay, options.adjusterMaxDelay); + range->delay = std::max(range->delay, options.adjusterMaxDelay); dradius->delay = std::max(dradius->delay, options.adjusterMaxDelay); dradiusOffset->delay = std::max(dradiusOffset->delay, options.adjusterMaxDelay); diter->delay = std::max(diter->delay, options.adjusterMaxDelay); @@ -98,6 +110,7 @@ void PdSharpening::read(const ProcParams* pp, const ParamsEdited* pedited) dradius->setEditedState(pedited->pdsharpening.deconvradius ? Edited : UnEdited); dradiusOffset->setEditedState(pedited->pdsharpening.deconvradiusOffset ? Edited : UnEdited); diter->setEditedState(pedited->pdsharpening.deconviter ? Edited : UnEdited); + range->setEditedState(pedited->pdsharpening.deconvrange ? Edited : UnEdited); set_inconsistent(multiImage && !pedited->pdsharpening.enabled); } @@ -110,6 +123,7 @@ void PdSharpening::read(const ProcParams* pp, const ParamsEdited* pedited) dradius->setAutoValue(pp->pdsharpening.autoRadius); dradiusOffset->setValue(pp->pdsharpening.deconvradiusOffset); diter->setValue(pp->pdsharpening.deconviter); + range->setValue(pp->pdsharpening.deconvrange); lastAutoContrast = pp->pdsharpening.autoContrast; lastAutoRadius = pp->pdsharpening.autoRadius; @@ -126,6 +140,7 @@ void PdSharpening::write(ProcParams* pp, ParamsEdited* pedited) pp->pdsharpening.autoRadius = dradius->getAutoValue(); pp->pdsharpening.deconvradiusOffset = dradiusOffset->getValue(); pp->pdsharpening.deconviter =(int)diter->getValue(); + pp->pdsharpening.deconvrange =(int)range->getValue(); if (pedited) { pedited->pdsharpening.contrast = contrast->getEditedState(); @@ -134,6 +149,7 @@ void PdSharpening::write(ProcParams* pp, ParamsEdited* pedited) pedited->pdsharpening.autoRadius = !dradius->getAutoInconsistent(); pedited->pdsharpening.deconvradiusOffset = dradiusOffset->getEditedState(); pedited->pdsharpening.deconviter = diter->getEditedState(); + pedited->pdsharpening.deconvrange = range->getEditedState(); pedited->pdsharpening.enabled = !get_inconsistent(); } } @@ -145,17 +161,20 @@ void PdSharpening::setDefaults(const ProcParams* defParams, const ParamsEdited* dradius->setDefault(defParams->pdsharpening.deconvradius); dradiusOffset->setDefault(defParams->pdsharpening.deconvradiusOffset); diter->setDefault(defParams->pdsharpening.deconviter); + range->setDefault(defParams->pdsharpening.deconvrange); if (pedited) { contrast->setDefaultEditedState(pedited->pdsharpening.contrast ? Edited : UnEdited); dradius->setDefaultEditedState(pedited->pdsharpening.deconvradius ? Edited : UnEdited); dradiusOffset->setDefaultEditedState(pedited->pdsharpening.deconvradiusOffset ? Edited : UnEdited); diter->setDefaultEditedState(pedited->pdsharpening.deconviter ? Edited : UnEdited); + range->setDefaultEditedState(pedited->pdsharpening.deconvrange ? Edited : UnEdited); } else { contrast->setDefaultEditedState(Irrelevant); dradius->setDefaultEditedState(Irrelevant); dradiusOffset->setDefaultEditedState(Irrelevant); diter->setDefaultEditedState(Irrelevant); + range->setDefaultEditedState(Irrelevant); } } @@ -179,6 +198,8 @@ void PdSharpening::adjusterChanged(Adjuster* a, double newval) listener->panelChanged(EvPdShrDRadiusOffset, costr); } else if (a == diter) { listener->panelChanged(EvPdShrDIterations, costr); + } else if (a == range) { + listener->panelChanged(EvPdShrRange, costr); } } } @@ -205,15 +226,17 @@ void PdSharpening::setBatchMode(bool batchMode) dradius->showEditedCB(); dradiusOffset->showEditedCB(); diter->showEditedCB(); + range->showEditedCB(); } -void PdSharpening::setAdjusterBehavior(bool contrastadd, bool radiusadd, bool iteradd) +void PdSharpening::setAdjusterBehavior(bool contrastadd, bool radiusadd, bool iteradd, bool rangeadd) { contrast->setAddMode(contrastadd); dradius->setAddMode(radiusadd); dradiusOffset->setAddMode(radiusadd); diter->setAddMode(iteradd); + range->setAddMode(rangeadd); } void PdSharpening::trimValues(rtengine::procparams::ProcParams* pp) @@ -223,6 +246,7 @@ void PdSharpening::trimValues(rtengine::procparams::ProcParams* pp) dradius->trimValue(pp->pdsharpening.deconvradius); dradiusOffset->trimValue(pp->pdsharpening.deconvradiusOffset); diter->trimValue(pp->pdsharpening.deconviter); + range->trimValue(pp->pdsharpening.deconvrange); } void PdSharpening::autoContrastChanged(double autoContrast) diff --git a/rtgui/pdsharpening.h b/rtgui/pdsharpening.h index 61d80503f..b22e26fab 100644 --- a/rtgui/pdsharpening.h +++ b/rtgui/pdsharpening.h @@ -26,6 +26,7 @@ class PdSharpening final : public ToolParamBlock, public AdjusterListener, publi protected: Adjuster* contrast; + Adjuster* range; Adjuster* dradius; Adjuster* dradiusOffset; Adjuster* diter; @@ -33,6 +34,7 @@ protected: bool lastAutoContrast; bool lastAutoRadius; rtengine::ProcEvent EvPdShrContrast; + rtengine::ProcEvent EvPdShrRange; rtengine::ProcEvent EvPdShrDRadius; rtengine::ProcEvent EvPdShrDRadiusOffset; rtengine::ProcEvent EvPdShrDIterations; @@ -57,6 +59,6 @@ public: void autoContrastChanged (double autoContrast) override; void autoRadiusChanged (double autoRadius) override; - void setAdjusterBehavior (bool contrastadd, bool radiusadd, bool iteradds); + void setAdjusterBehavior (bool contrastadd, bool radiusadd, bool iteradd, bool rangeadd); void trimValues (rtengine::procparams::ProcParams* pp) override; }; From 4857566d258ffaaf12e03bf17df4bb90b2e505f0 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 12 Nov 2019 18:06:55 +0100 Subject: [PATCH 150/208] Capture sharpening: add range label to default file --- rtdata/languages/default | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rtdata/languages/default b/rtdata/languages/default index f1ed6ed5f..bdc3fc8a0 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -771,6 +771,7 @@ HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost +HISTORY_MSG_PDSHARPEN_RANGE;CS - Range HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter @@ -2037,6 +2038,7 @@ TP_SHARPENING_METHOD;Method TP_SHARPENING_ONLYEDGES;Sharpen only edges TP_SHARPENING_RADIUS;Radius TP_SHARPENING_RADIUS_BOOST;Corner radius boost +TP_SHARPENING_RANGE;Range TP_SHARPENING_RLD;RL Deconvolution TP_SHARPENING_RLD_AMOUNT;Amount TP_SHARPENING_RLD_DAMPING;Damping From a4909dc09e610b02beeddc8f01b329ed1b3711e7 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Tue, 12 Nov 2019 22:49:07 +0100 Subject: [PATCH 151/208] Panasonic DC-S1 white levels update Updated white levels for ISO 50, 64 and 80, based on raw files from issue #5204 --- rtengine/camconst.json | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index 3463bfcc9..f2db455a3 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -1,4 +1,5 @@ /* +vim: set syntax=javascript: DO NOT EDIT THIS FILE! @@ -2142,10 +2143,17 @@ Camera constants: } }, - { // Quality B, issue #5204. Missing ISO 50, 64 and 80 and I expect the WL to differ for these ISO values + { // Quality A, issue #5204. "make_model": [ "Panasonic DC-S1" ], "dcraw_matrix": [ 9744, -3905, -779, -4899, 12807, 2324, -798, 1630, 5827 ], // ColorMatrix2 using illuminant D65 from Adobe DNG Converter 11.4 - "ranges": { "white": 16320 } + "ranges": { + "white": [ + { "iso": 50, "levels": 8400 }, // LENR 8000 + { "iso": 64, "levels": 10450 }, // LENR 10000 + { "iso": 80, "levels": 13050 }, // LENR 12400 + { "iso": 100, "levels": 16320 } + ] + } }, { // Quality X, issue #5204. No white frames available. From 3be7016517f2fe5989aa9a35969d5e0e99e47608 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Wed, 13 Nov 2019 21:05:24 +0100 Subject: [PATCH 152/208] Capture sharpening: Remove range adjuster and introduce --- rtdata/languages/default | 4 +-- rtengine/capturesharpening.cc | 66 ++++++++++++++++++++++++++++++----- rtengine/procparams.cc | 8 ++--- rtengine/procparams.h | 2 +- rtgui/addsetids.h | 1 - rtgui/batchtoolpanelcoord.cc | 2 +- rtgui/paramsedited.cc | 10 +++--- rtgui/paramsedited.h | 2 +- rtgui/pdsharpening.cc | 43 ++++++++++------------- rtgui/pdsharpening.h | 16 ++++++--- 10 files changed, 102 insertions(+), 52 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index bdc3fc8a0..da4d5c804 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -767,11 +767,11 @@ HISTORY_MSG_METADATA_MODE;Metadata copy mode HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost -HISTORY_MSG_PDSHARPEN_RANGE;CS - Range HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter @@ -2033,12 +2033,12 @@ TP_SHARPENING_EDRADIUS;Radius TP_SHARPENING_EDTOLERANCE;Edge tolerance TP_SHARPENING_HALOCONTROL;Halo control TP_SHARPENING_HCAMOUNT;Amount +TP_SHARPENING_ITERCHECK;Auto limit iterations TP_SHARPENING_LABEL;Sharpening TP_SHARPENING_METHOD;Method TP_SHARPENING_ONLYEDGES;Sharpen only edges TP_SHARPENING_RADIUS;Radius TP_SHARPENING_RADIUS_BOOST;Corner radius boost -TP_SHARPENING_RANGE;Range TP_SHARPENING_RLD;RL Deconvolution TP_SHARPENING_RLD_AMOUNT;Amount TP_SHARPENING_RLD_DAMPING;Damping diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index 82e8abb20..60f83a652 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -497,7 +497,30 @@ float calcRadiusXtrans(const float * const *rawData, int W, int H, float lowerLi return std::sqrt((1.f / (std::log(1.f / maxRatio))) / -2.f); } -void CaptureDeconvSharpening (float** luminance, float** oldLuminance, const float * const * blend, int W, int H, double sigma, double sigmaCornerOffset, int iterations, rtengine::ProgressListener* plistener, double startVal, double endVal) +bool checkForStop(float** tmpIThr, float** iterCheck, int fullTileSize, int border) +{ + bool stopped = false; + for (int ii = border; !stopped && ii < fullTileSize - border; ++ii) { +#ifdef __SSE2__ + for (int jj = border; jj < fullTileSize - border; jj += 4) { + if (_mm_movemask_ps((vfloat)vmaskf_lt(vmul2f(LVFU(tmpIThr[ii][jj])), LVFU(iterCheck[ii - border][jj - border])))) { + stopped = true; + break; + } + } +#else + for (int jj = border; jj < fullTileSize - border; ++jj) { + if (tmpIThr[ii][jj] * xxx < luminance[i + ii - border][j + jj - border] * clipmask[i + ii - border][j + jj - border]) { + stopped = true; + break; + } + } +#endif + } + return stopped; +} + +void CaptureDeconvSharpening (float ** clipmask, float** luminance, float** oldLuminance, const float * const * blend, int W, int H, double sigma, double sigmaCornerOffset, int iterations, bool checkIterStop, rtengine::ProgressListener* plistener, double startVal, double endVal) { BENCHFUN const bool is5x5 = (sigma <= 0.84 && sigmaCornerOffset == 0.0); @@ -513,7 +536,7 @@ BENCHFUN compute7x7kernel(sigma, kernel7); } - constexpr int tileSize = 194; + constexpr int tileSize = 32; constexpr int border = 5; constexpr int fullTileSize = tileSize + 2 * border; const float cornerRadius = std::min(1.15f, sigma + sigmaCornerOffset); @@ -522,6 +545,7 @@ BENCHFUN double progress = startVal; const double progressStep = (endVal - startVal) * rtengine::SQR(tileSize) / (W * H); + #ifdef _OPENMP #pragma omp parallel #endif @@ -530,9 +554,10 @@ BENCHFUN array2D tmpIThr(fullTileSize, fullTileSize); array2D tmpThr(fullTileSize, fullTileSize); array2D lumThr(fullTileSize, fullTileSize); + array2D iterCheck(tileSize, tileSize); initTile(tmpThr, fullTileSize); #ifdef _OPENMP - #pragma omp for schedule(dynamic,2) collapse(2) + #pragma omp for schedule(dynamic,16) collapse(2) #endif for (int i = border; i < H - border; i+= tileSize) { for(int j = border; j < W - border; j+= tileSize) { @@ -541,6 +566,11 @@ BENCHFUN // fill tiles if (endOfRow || endOfCol) { // special handling for small tiles at end of row or column + for (int k = 0, ii = endOfCol ? H - fullTileSize + border : i; k < tileSize; ++k, ++ii) { + for (int l = 0, jj = endOfRow ? W - fullTileSize + border : j; l < tileSize; ++l, ++jj) { + iterCheck[k][l] = oldLuminance[ii][jj] * clipmask[ii][jj]; + } + } for (int k = 0, ii = endOfCol ? H - fullTileSize : i; k < fullTileSize; ++k, ++ii) { for (int l = 0, jj = endOfRow ? W - fullTileSize : j; l < fullTileSize; ++l, ++jj) { tmpIThr[k][l] = oldLuminance[ii - border][jj - border]; @@ -548,6 +578,11 @@ BENCHFUN } } } else { + for (int ii = 0; ii < tileSize; ++ii) { + for (int jj = 0; jj < tileSize; ++jj) { + iterCheck[ii][jj] = oldLuminance[i + ii][j + jj] * clipmask[i + ii][j + jj]; + } + } for (int ii = i; ii < i + fullTileSize; ++ii) { for (int jj = j; jj < j + fullTileSize; ++jj) { tmpIThr[ii - i][jj - j] = oldLuminance[ii - border][jj - border]; @@ -555,17 +590,24 @@ BENCHFUN } } } + bool stopped = false; if (is3x3) { - for (int k = 0; k < iterations; ++k) { + for (int k = 0; k < iterations && !stopped; ++k) { // apply 3x3 gaussian blur and divide luminance by result of gaussian blur gauss3x3div(tmpIThr, tmpThr, lumThr, fullTileSize, kernel3); gauss3x3mult(tmpThr, tmpIThr, fullTileSize, kernel3); + if (checkIterStop) { + stopped = checkForStop(tmpIThr, iterCheck, fullTileSize, border); + } } } else if (is5x5) { - for (int k = 0; k < iterations; ++k) { + for (int k = 0; k < iterations && !stopped; ++k) { // apply 5x5 gaussian blur and divide luminance by result of gaussian blur gauss5x5div(tmpIThr, tmpThr, lumThr, fullTileSize, kernel5); gauss5x5mult(tmpThr, tmpIThr, fullTileSize, kernel5); + if (checkIterStop) { + stopped = checkForStop(tmpIThr, iterCheck, fullTileSize, border); + } } } else { if (sigmaCornerOffset != 0.0) { @@ -574,17 +616,23 @@ BENCHFUN if (sigmaTile >= 0.4f) { float lkernel7[7][7]; compute7x7kernel(static_cast(sigma) + distanceFactor * distance, lkernel7); - for (int k = 0; k < iterations; ++k) { + for (int k = 0; k < iterations && !stopped; ++k) { // apply 7x7 gaussian blur and divide luminance by result of gaussian blur gauss7x7div(tmpIThr, tmpThr, lumThr, fullTileSize, lkernel7); gauss7x7mult(tmpThr, tmpIThr, fullTileSize, lkernel7); + if (checkIterStop) { + stopped = checkForStop(tmpIThr, iterCheck, fullTileSize, border); + } } } } else { - for (int k = 0; k < iterations; ++k) { + for (int k = 0; k < iterations && !stopped; ++k) { // apply 7x7 gaussian blur and divide luminance by result of gaussian blur gauss7x7div(tmpIThr, tmpThr, lumThr, fullTileSize, kernel7); gauss7x7mult(tmpThr, tmpIThr, fullTileSize, kernel7); + if (checkIterStop) { + stopped = checkForStop(tmpIThr, iterCheck, fullTileSize, border); + } } } } @@ -646,7 +694,7 @@ BENCHFUN const array2D& blueVals = blueCache ? *blueCache : blue; array2D clipMask(W, H); - const float clipLimit = sharpeningParams.deconvrange / 100.f; + constexpr float clipLimit = 0.95f; constexpr float maxSigma = 1.15f; if (getSensorType() == ST_BAYER) { @@ -765,7 +813,7 @@ BENCHFUN } conrastThreshold = contrast * 100.f; - CaptureDeconvSharpening(YNew, YOld, blend, W, H, radius, sharpeningParams.deconvradiusOffset, sharpeningParams.deconviter, plistener, 0.2, 0.9); + CaptureDeconvSharpening(clipMask, YNew, YOld, blend, W, H, radius, sharpeningParams.deconvradiusOffset, sharpeningParams.deconviter, sharpeningParams.deconvitercheck, plistener, 0.2, 0.9); if (plistener) { plistener->setProgress(0.9); } diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 9714b97e5..9483c6a02 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -1162,7 +1162,7 @@ CaptureSharpeningParams::CaptureSharpeningParams() : deconvradius(0.75), deconvradiusOffset(0.0), deconviter(20), - deconvrange(95) + deconvitercheck(true) { } @@ -1174,7 +1174,7 @@ bool CaptureSharpeningParams::operator ==(const CaptureSharpeningParams& other) && autoContrast == other.autoContrast && autoRadius == other.autoRadius && deconvradius == other.deconvradius - && deconvrange == other.deconvrange + && deconvitercheck == other.deconvitercheck && deconvradiusOffset == other.deconvradiusOffset && deconviter == other.deconviter; } @@ -3385,7 +3385,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->pdsharpening.autoRadius, "PostDemosaicSharpening", "AutoRadius", pdsharpening.autoRadius, keyFile); saveToKeyfile(!pedited || pedited->pdsharpening.deconvradius, "PostDemosaicSharpening", "DeconvRadius", pdsharpening.deconvradius, keyFile); saveToKeyfile(!pedited || pedited->pdsharpening.deconvradiusOffset, "PostDemosaicSharpening", "DeconvRadiusOffset", pdsharpening.deconvradiusOffset, keyFile); - saveToKeyfile(!pedited || pedited->pdsharpening.deconvrange, "PostDemosaicSharpening", "DeconvRange", pdsharpening.deconvrange, keyFile); + saveToKeyfile(!pedited || pedited->pdsharpening.deconvitercheck, "PostDemosaicSharpening", "DeconvIterCheck", pdsharpening.deconvitercheck, keyFile); saveToKeyfile(!pedited || pedited->pdsharpening.deconviter, "PostDemosaicSharpening", "DeconvIterations", pdsharpening.deconviter, keyFile); // Post resize sharpening @@ -4475,7 +4475,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "PostDemosaicSharpening", "AutoRadius", pedited, pdsharpening.autoRadius, pedited->pdsharpening.autoRadius); assignFromKeyfile(keyFile, "PostDemosaicSharpening", "DeconvRadius", pedited, pdsharpening.deconvradius, pedited->pdsharpening.deconvradius); assignFromKeyfile(keyFile, "PostDemosaicSharpening", "DeconvRadiusOffset", pedited, pdsharpening.deconvradiusOffset, pedited->pdsharpening.deconvradiusOffset); - assignFromKeyfile(keyFile, "PostDemosaicSharpening", "DeconvRange", pedited, pdsharpening.deconvrange, pedited->pdsharpening.deconvrange); + assignFromKeyfile(keyFile, "PostDemosaicSharpening", "DeconvIterCheck", pedited, pdsharpening.deconvitercheck, pedited->pdsharpening.deconvitercheck); assignFromKeyfile(keyFile, "PostDemosaicSharpening", "DeconvIterations", pedited, pdsharpening.deconviter, pedited->pdsharpening.deconviter); } diff --git a/rtengine/procparams.h b/rtengine/procparams.h index b32f66e4f..01c54ffc5 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -551,7 +551,7 @@ struct CaptureSharpeningParams { double deconvradius; double deconvradiusOffset; int deconviter; - int deconvrange; + bool deconvitercheck; CaptureSharpeningParams(); diff --git a/rtgui/addsetids.h b/rtgui/addsetids.h index b1fd2bfed..05150517f 100644 --- a/rtgui/addsetids.h +++ b/rtgui/addsetids.h @@ -140,7 +140,6 @@ enum { ADDSET_XTRANS_FALSE_COLOR_SUPPRESSION, ADDSET_SOFTLIGHT_STRENGTH, ADDSET_DEHAZE_STRENGTH, - ADDSET_SHARP_RANGE, ADDSET_PARAM_NUM // THIS IS USED AS A DELIMITER!! }; diff --git a/rtgui/batchtoolpanelcoord.cc b/rtgui/batchtoolpanelcoord.cc index 8aed3e96f..2824a285c 100644 --- a/rtgui/batchtoolpanelcoord.cc +++ b/rtgui/batchtoolpanelcoord.cc @@ -157,7 +157,7 @@ void BatchToolPanelCoordinator::initSession () cacorrection->setAdjusterBehavior (false); sharpening->setAdjusterBehavior (false, false, false, false, false, false, false); prsharpening->setAdjusterBehavior (false, false, false, false, false, false, false); - pdSharpening->setAdjusterBehavior (false, false, false, false); + pdSharpening->setAdjusterBehavior (false, false, false); sharpenEdge->setAdjusterBehavior (false, false); sharpenMicro->setAdjusterBehavior (false, false, false); epd->setAdjusterBehavior (false, false, false, false, false); diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index f31adedde..82132008a 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -172,7 +172,7 @@ void ParamsEdited::set(bool v) pdsharpening.deconvradius = v; pdsharpening.deconvradiusOffset = v; pdsharpening.deconviter = v; - pdsharpening.deconvrange = v; + pdsharpening.deconvitercheck = v; prsharpening.enabled = v; prsharpening.contrast = v; prsharpening.radius = v; @@ -759,7 +759,7 @@ void ParamsEdited::initFrom(const std::vector& pdsharpening.deconvradius = pdsharpening.deconvradius && p.pdsharpening.deconvradius == other.pdsharpening.deconvradius; pdsharpening.deconvradiusOffset = pdsharpening.deconvradiusOffset && p.pdsharpening.deconvradiusOffset == other.pdsharpening.deconvradiusOffset; pdsharpening.deconviter = pdsharpening.deconviter && p.pdsharpening.deconviter == other.pdsharpening.deconviter; - pdsharpening.deconvrange = pdsharpening.deconvrange && p.pdsharpening.deconvrange == other.pdsharpening.deconvrange; + pdsharpening.deconvitercheck = pdsharpening.deconvitercheck && p.pdsharpening.deconvitercheck == other.pdsharpening.deconvitercheck; prsharpening.enabled = prsharpening.enabled && p.prsharpening.enabled == other.prsharpening.enabled; prsharpening.contrast = prsharpening.contrast && p.prsharpening.contrast == other.prsharpening.contrast; prsharpening.radius = prsharpening.radius && p.prsharpening.radius == other.prsharpening.radius; @@ -1754,8 +1754,8 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.pdsharpening.deconviter = dontforceSet && options.baBehav[ADDSET_SHARP_ITER] ? toEdit.pdsharpening.deconviter + mods.pdsharpening.deconviter : mods.pdsharpening.deconviter; } - if (pdsharpening.deconvrange) { - toEdit.pdsharpening.deconvrange = dontforceSet && options.baBehav[ADDSET_SHARP_RANGE] ? toEdit.pdsharpening.deconvrange + mods.pdsharpening.deconvrange : mods.pdsharpening.deconvrange; + if (pdsharpening.deconvitercheck) { + toEdit.pdsharpening.deconvitercheck = mods.pdsharpening.deconvitercheck; } if (prsharpening.enabled) { @@ -3307,5 +3307,5 @@ bool FilmNegativeParamsEdited::isUnchanged() const bool CaptureSharpeningParamsEdited::isUnchanged() const { - return enabled && contrast && autoContrast && autoRadius && deconvradius && deconvradiusOffset && deconviter && deconvrange; + return enabled && contrast && autoContrast && autoRadius && deconvradius && deconvradiusOffset && deconviter && deconvitercheck; } \ No newline at end of file diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 1a708329a..01a3e4efe 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -218,7 +218,7 @@ struct CaptureSharpeningParamsEdited { bool deconvradius; bool deconvradiusOffset; bool deconviter; - bool deconvrange; + bool deconvitercheck; bool isUnchanged() const; }; diff --git a/rtgui/pdsharpening.cc b/rtgui/pdsharpening.cc index 02fe56033..4f5416c82 100644 --- a/rtgui/pdsharpening.cc +++ b/rtgui/pdsharpening.cc @@ -38,7 +38,7 @@ PdSharpening::PdSharpening() : { auto m = ProcEventMapper::getInstance(); EvPdShrContrast = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_CONTRAST"); - EvPdShrRange = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_RANGE"); + EvPdShrCheckIter = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_CHECKITER"); EvPdShrDRadius = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_RADIUS"); EvPdShrDRadiusOffset = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_RADIUS_BOOST"); EvPdShrDIterations = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_ITERATIONS"); @@ -55,14 +55,6 @@ PdSharpening::PdSharpening() : pack_start(*contrast); contrast->show(); - Gtk::Image *al = Gtk::manage(new RTImage("circle-black-small.png")); - Gtk::Image *ar = Gtk::manage(new RTImage("circle-white-small.png")); - range = Gtk::manage(new Adjuster(M("TP_SHARPENING_RANGE"), 0, 100, 1, 95, al, ar)); - range->setAdjusterListener(this); - - pack_start(*range); - range->show(); - pack_start(*hb); Gtk::VBox* rld = Gtk::manage(new Gtk::VBox()); @@ -71,22 +63,25 @@ PdSharpening::PdSharpening() : dradius->setAutoValue(true); dradiusOffset = Gtk::manage(new Adjuster(M("TP_SHARPENING_RADIUS_BOOST"), -0.5, 0.5, 0.01, 0.0)); diter = Gtk::manage(new Adjuster(M("TP_SHARPENING_RLD_ITERATIONS"), 1, 100, 1, 20)); + itercheck = Gtk::manage(new CheckBox(M("TP_SHARPENING_ITERCHECK"), multiImage)); + itercheck->setCheckBoxListener(this); + rld->pack_start(*dradius); rld->pack_start(*dradiusOffset); rld->pack_start(*diter); + rld->pack_start(*itercheck); dradius->show(); dradiusOffset->show(); diter->show(); + itercheck->show(); rld->show(); pack_start(*rld); dradius->setAdjusterListener(this); dradiusOffset->setAdjusterListener(this); diter->setAdjusterListener(this); - range->setAdjusterListener(this); contrast->delay = std::max(contrast->delay, options.adjusterMaxDelay); - range->delay = std::max(range->delay, options.adjusterMaxDelay); dradius->delay = std::max(dradius->delay, options.adjusterMaxDelay); dradiusOffset->delay = std::max(dradiusOffset->delay, options.adjusterMaxDelay); diter->delay = std::max(diter->delay, options.adjusterMaxDelay); @@ -110,7 +105,7 @@ void PdSharpening::read(const ProcParams* pp, const ParamsEdited* pedited) dradius->setEditedState(pedited->pdsharpening.deconvradius ? Edited : UnEdited); dradiusOffset->setEditedState(pedited->pdsharpening.deconvradiusOffset ? Edited : UnEdited); diter->setEditedState(pedited->pdsharpening.deconviter ? Edited : UnEdited); - range->setEditedState(pedited->pdsharpening.deconvrange ? Edited : UnEdited); + itercheck->setEdited(pedited->pdsharpening.deconvitercheck); set_inconsistent(multiImage && !pedited->pdsharpening.enabled); } @@ -123,7 +118,8 @@ void PdSharpening::read(const ProcParams* pp, const ParamsEdited* pedited) dradius->setAutoValue(pp->pdsharpening.autoRadius); dradiusOffset->setValue(pp->pdsharpening.deconvradiusOffset); diter->setValue(pp->pdsharpening.deconviter); - range->setValue(pp->pdsharpening.deconvrange); + itercheck->setValue(pp->pdsharpening.deconvitercheck); + lastAutoContrast = pp->pdsharpening.autoContrast; lastAutoRadius = pp->pdsharpening.autoRadius; @@ -140,7 +136,7 @@ void PdSharpening::write(ProcParams* pp, ParamsEdited* pedited) pp->pdsharpening.autoRadius = dradius->getAutoValue(); pp->pdsharpening.deconvradiusOffset = dradiusOffset->getValue(); pp->pdsharpening.deconviter =(int)diter->getValue(); - pp->pdsharpening.deconvrange =(int)range->getValue(); + pp->pdsharpening.deconvitercheck = itercheck->getLastActive(); if (pedited) { pedited->pdsharpening.contrast = contrast->getEditedState(); @@ -149,7 +145,7 @@ void PdSharpening::write(ProcParams* pp, ParamsEdited* pedited) pedited->pdsharpening.autoRadius = !dradius->getAutoInconsistent(); pedited->pdsharpening.deconvradiusOffset = dradiusOffset->getEditedState(); pedited->pdsharpening.deconviter = diter->getEditedState(); - pedited->pdsharpening.deconvrange = range->getEditedState(); + pedited->pdsharpening.deconvitercheck = !itercheck->get_inconsistent(); pedited->pdsharpening.enabled = !get_inconsistent(); } } @@ -161,20 +157,24 @@ void PdSharpening::setDefaults(const ProcParams* defParams, const ParamsEdited* dradius->setDefault(defParams->pdsharpening.deconvradius); dradiusOffset->setDefault(defParams->pdsharpening.deconvradiusOffset); diter->setDefault(defParams->pdsharpening.deconviter); - range->setDefault(defParams->pdsharpening.deconvrange); if (pedited) { contrast->setDefaultEditedState(pedited->pdsharpening.contrast ? Edited : UnEdited); dradius->setDefaultEditedState(pedited->pdsharpening.deconvradius ? Edited : UnEdited); dradiusOffset->setDefaultEditedState(pedited->pdsharpening.deconvradiusOffset ? Edited : UnEdited); diter->setDefaultEditedState(pedited->pdsharpening.deconviter ? Edited : UnEdited); - range->setDefaultEditedState(pedited->pdsharpening.deconvrange ? Edited : UnEdited); } else { contrast->setDefaultEditedState(Irrelevant); dradius->setDefaultEditedState(Irrelevant); dradiusOffset->setDefaultEditedState(Irrelevant); diter->setDefaultEditedState(Irrelevant); - range->setDefaultEditedState(Irrelevant); + } +} + +void PdSharpening::checkBoxToggled (CheckBox* c, CheckValue newval) +{ + if (listener) { + listener->panelChanged (EvPdShrCheckIter, itercheck->getLastActive() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED")); } } @@ -198,8 +198,6 @@ void PdSharpening::adjusterChanged(Adjuster* a, double newval) listener->panelChanged(EvPdShrDRadiusOffset, costr); } else if (a == diter) { listener->panelChanged(EvPdShrDIterations, costr); - } else if (a == range) { - listener->panelChanged(EvPdShrRange, costr); } } } @@ -226,17 +224,15 @@ void PdSharpening::setBatchMode(bool batchMode) dradius->showEditedCB(); dradiusOffset->showEditedCB(); diter->showEditedCB(); - range->showEditedCB(); } -void PdSharpening::setAdjusterBehavior(bool contrastadd, bool radiusadd, bool iteradd, bool rangeadd) +void PdSharpening::setAdjusterBehavior(bool contrastadd, bool radiusadd, bool iteradd) { contrast->setAddMode(contrastadd); dradius->setAddMode(radiusadd); dradiusOffset->setAddMode(radiusadd); diter->setAddMode(iteradd); - range->setAddMode(rangeadd); } void PdSharpening::trimValues(rtengine::procparams::ProcParams* pp) @@ -246,7 +242,6 @@ void PdSharpening::trimValues(rtengine::procparams::ProcParams* pp) dradius->trimValue(pp->pdsharpening.deconvradius); dradiusOffset->trimValue(pp->pdsharpening.deconvradiusOffset); diter->trimValue(pp->pdsharpening.deconviter); - range->trimValue(pp->pdsharpening.deconvrange); } void PdSharpening::autoContrastChanged(double autoContrast) diff --git a/rtgui/pdsharpening.h b/rtgui/pdsharpening.h index b22e26fab..7d971eaee 100644 --- a/rtgui/pdsharpening.h +++ b/rtgui/pdsharpening.h @@ -19,22 +19,29 @@ #pragma once #include "adjuster.h" +#include "checkbox.h" #include "toolpanel.h" -class PdSharpening final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, public rtengine::AutoContrastListener, public rtengine::AutoRadiusListener +class PdSharpening final : + public ToolParamBlock, + public AdjusterListener, + public FoldableToolPanel, + public rtengine::AutoContrastListener, + public rtengine::AutoRadiusListener, + public CheckBoxListener { protected: Adjuster* contrast; - Adjuster* range; Adjuster* dradius; Adjuster* dradiusOffset; Adjuster* diter; + CheckBox* itercheck; bool lastAutoContrast; bool lastAutoRadius; rtengine::ProcEvent EvPdShrContrast; - rtengine::ProcEvent EvPdShrRange; + rtengine::ProcEvent EvPdShrCheckIter; rtengine::ProcEvent EvPdShrDRadius; rtengine::ProcEvent EvPdShrDRadiusOffset; rtengine::ProcEvent EvPdShrDIterations; @@ -59,6 +66,7 @@ public: void autoContrastChanged (double autoContrast) override; void autoRadiusChanged (double autoRadius) override; - void setAdjusterBehavior (bool contrastadd, bool radiusadd, bool iteradd, bool rangeadd); + void setAdjusterBehavior (bool contrastadd, bool radiusadd, bool iteradd); void trimValues (rtengine::procparams::ProcParams* pp) override; + void checkBoxToggled(CheckBox* c, CheckValue newval) override; }; From c2ed31991bd8faee2882c7f997c5a663e82c5518 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 14 Nov 2019 11:57:55 +0100 Subject: [PATCH 153/208] Capture sharpening: fix broken non SSE build --- rtengine/capturesharpening.cc | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index 60f83a652..2866839bf 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -503,14 +503,14 @@ bool checkForStop(float** tmpIThr, float** iterCheck, int fullTileSize, int bord for (int ii = border; !stopped && ii < fullTileSize - border; ++ii) { #ifdef __SSE2__ for (int jj = border; jj < fullTileSize - border; jj += 4) { - if (_mm_movemask_ps((vfloat)vmaskf_lt(vmul2f(LVFU(tmpIThr[ii][jj])), LVFU(iterCheck[ii - border][jj - border])))) { + if (_mm_movemask_ps((vfloat)vmaskf_lt(LVFU(tmpIThr[ii][jj]), LVFU(iterCheck[ii - border][jj - border])))) { stopped = true; break; } } #else for (int jj = border; jj < fullTileSize - border; ++jj) { - if (tmpIThr[ii][jj] * xxx < luminance[i + ii - border][j + jj - border] * clipmask[i + ii - border][j + jj - border]) { + if (tmpIThr[ii][jj] < iterCheck[ii - border][jj - border]) { stopped = true; break; } @@ -566,9 +566,11 @@ BENCHFUN // fill tiles if (endOfRow || endOfCol) { // special handling for small tiles at end of row or column - for (int k = 0, ii = endOfCol ? H - fullTileSize + border : i; k < tileSize; ++k, ++ii) { - for (int l = 0, jj = endOfRow ? W - fullTileSize + border : j; l < tileSize; ++l, ++jj) { - iterCheck[k][l] = oldLuminance[ii][jj] * clipmask[ii][jj]; + if (checkIterStop) { + for (int k = 0, ii = endOfCol ? H - fullTileSize + border : i; k < tileSize; ++k, ++ii) { + for (int l = 0, jj = endOfRow ? W - fullTileSize + border : j; l < tileSize; ++l, ++jj) { + iterCheck[k][l] = oldLuminance[ii][jj] * clipmask[ii][jj] * 0.5f; + } } } for (int k = 0, ii = endOfCol ? H - fullTileSize : i; k < fullTileSize; ++k, ++ii) { @@ -578,9 +580,11 @@ BENCHFUN } } } else { - for (int ii = 0; ii < tileSize; ++ii) { - for (int jj = 0; jj < tileSize; ++jj) { - iterCheck[ii][jj] = oldLuminance[i + ii][j + jj] * clipmask[i + ii][j + jj]; + if (checkIterStop) { + for (int ii = 0; ii < tileSize; ++ii) { + for (int jj = 0; jj < tileSize; ++jj) { + iterCheck[ii][jj] = oldLuminance[i + ii][j + jj] * clipmask[i + ii][j + jj] * 0.5f; + } } } for (int ii = i; ii < i + fullTileSize; ++ii) { From f041573d4dc2143d3e131bcbe236966cb9fa3a75 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sat, 16 Nov 2019 16:06:31 +0100 Subject: [PATCH 154/208] Capture sharpening: improve auto radius calculation for xtrans --- rtengine/capturesharpening.cc | 112 ++++++++++++++++++++++++++++++---- 1 file changed, 101 insertions(+), 11 deletions(-) diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index 2866839bf..e271de2e6 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -409,8 +409,85 @@ float calcRadiusXtrans(const float * const *rawData, int W, int H, float lowerLi #ifdef _OPENMP #pragma omp parallel for reduction(max:maxRatio) schedule(dynamic, 16) #endif - for (int row = starty + 3; row < H - 4; row += 3) { - for (int col = startx + 3; col < W - 4; col += 3) { + for (int row = starty + 2; row < H - 4; row += 3) { + for (int col = startx + 2; col < W - 4; col += 3) { + const float valp1p1 = rawData[row + 1][col + 1]; + const bool squareClipped = rtengine::max(valp1p1, rawData[row + 1][col + 2], rawData[row + 2][col + 1], rawData[row + 2][col + 2]) >= upperLimit; + const float greenSolitary = rawData[row][col]; + if (greenSolitary > 1.f && std::max(rawData[row - 1][col - 1], rawData[row - 1][col + 1]) < upperLimit) { + if (greenSolitary < upperLimit) { + const float valp1m1 = rawData[row + 1][col - 1]; + if (valp1m1 > 1.f && rtengine::max(rawData[row + 1][col - 2], valp1m1, rawData[row + 2][col - 2], rawData[row + 1][col - 1]) < upperLimit) { + const float maxVal = std::max(greenSolitary, valp1m1); + if (maxVal > lowerLimit) { + const float minVal = std::min(greenSolitary, valp1m1); + if (UNLIKELY(maxVal > maxRatio * minVal)) { + maxRatio = maxVal / minVal; + } + } + } + if (valp1p1 > 1.f && !squareClipped) { + const float maxVal = std::max(greenSolitary, valp1p1); + if (maxVal > lowerLimit) { + const float minVal = std::min(greenSolitary, valp1p1); + if (UNLIKELY(maxVal > maxRatio * minVal)) { + maxRatio = maxVal / minVal; + } + } + } + } + } + if (!squareClipped) { + const float valp2p2 = rawData[row + 2][col + 2]; + if (valp2p2 > 1.f) { + if (valp1p1 > 1.f) { + const float maxVal = std::max(valp1p1, valp2p2); + if (maxVal > lowerLimit) { + const float minVal = std::min(valp1p1, valp2p2); + if (UNLIKELY(maxVal > maxRatio * minVal)) { + maxRatio = maxVal / minVal; + } + } + } + const float greenSolitaryRight = rawData[row + 3][col + 3]; + if (rtengine::max(greenSolitaryRight, rawData[row + 4][col + 2], rawData[row + 4][col + 4]) < upperLimit) { + if (greenSolitaryRight > 1.f) { + const float maxVal = std::max(greenSolitaryRight, valp2p2); + if (maxVal > lowerLimit) { + const float minVal = std::min(greenSolitaryRight, valp2p2); + if (UNLIKELY(maxVal > maxRatio * minVal)) { + maxRatio = maxVal / minVal; + } + } + } + } + } + const float valp1p2 = rawData[row + 1][col + 2]; + const float valp2p1 = rawData[row + 2][col + 1]; + if (valp2p1 > 1.f) { + if (valp1p2 > 1.f) { + const float maxVal = std::max(valp1p2, valp2p1); + if (maxVal > lowerLimit) { + const float minVal = std::min(valp1p2, valp2p1); + if (UNLIKELY(maxVal > maxRatio * minVal)) { + maxRatio = maxVal / minVal; + } + } + } + const float greenSolitaryLeft = rawData[row + 3][col]; + if (rtengine::max(greenSolitaryLeft, rawData[row + 4][col - 1], rawData[row + 4][col + 1]) < upperLimit) { + if (greenSolitaryLeft > 1.f) { + const float maxVal = std::max(greenSolitaryLeft, valp2p1); + if (maxVal > lowerLimit) { + const float minVal = std::min(greenSolitaryLeft, valp2p1); + if (UNLIKELY(maxVal > maxRatio * minVal)) { + maxRatio = maxVal / minVal; + } + } + } + } + } + } const float valtl = rawData[row][col]; const float valtr = rawData[row][col + 1]; const float valbl = rawData[row + 1][col]; @@ -494,7 +571,7 @@ float calcRadiusXtrans(const float * const *rawData, int W, int H, float lowerLi } } } - return std::sqrt((1.f / (std::log(1.f / maxRatio))) / -2.f); + return std::sqrt((1.f / (std::log(1.f / maxRatio) / 2.f)) / -2.f); } bool checkForStop(float** tmpIThr, float** iterCheck, int fullTileSize, int border) @@ -618,14 +695,27 @@ BENCHFUN const float distance = sqrt(rtengine::SQR(i + tileSize / 2 - H / 2) + rtengine::SQR(j + tileSize / 2 - W / 2)); const float sigmaTile = static_cast(sigma) + distanceFactor * distance; if (sigmaTile >= 0.4f) { - float lkernel7[7][7]; - compute7x7kernel(static_cast(sigma) + distanceFactor * distance, lkernel7); - for (int k = 0; k < iterations && !stopped; ++k) { - // apply 7x7 gaussian blur and divide luminance by result of gaussian blur - gauss7x7div(tmpIThr, tmpThr, lumThr, fullTileSize, lkernel7); - gauss7x7mult(tmpThr, tmpIThr, fullTileSize, lkernel7); - if (checkIterStop) { - stopped = checkForStop(tmpIThr, iterCheck, fullTileSize, border); + if (sigmaTile > 0.84) { // have to use 7x7 kernel + float lkernel7[7][7]; + compute7x7kernel(static_cast(sigma) + distanceFactor * distance, lkernel7); + for (int k = 0; k < iterations && !stopped; ++k) { + // apply 7x7 gaussian blur and divide luminance by result of gaussian blur + gauss7x7div(tmpIThr, tmpThr, lumThr, fullTileSize, lkernel7); + gauss7x7mult(tmpThr, tmpIThr, fullTileSize, lkernel7); + if (checkIterStop) { + stopped = checkForStop(tmpIThr, iterCheck, fullTileSize, border); + } + } + } else { // can use 5x5 kernel + float lkernel7[5][5]; + compute5x5kernel(static_cast(sigma) + distanceFactor * distance, lkernel7); + for (int k = 0; k < iterations && !stopped; ++k) { + // apply 7x7 gaussian blur and divide luminance by result of gaussian blur + gauss5x5div(tmpIThr, tmpThr, lumThr, fullTileSize, lkernel7); + gauss5x5mult(tmpThr, tmpIThr, fullTileSize, lkernel7); + if (checkIterStop) { + stopped = checkForStop(tmpIThr, iterCheck, fullTileSize, border); + } } } } From 4c99d3b78b03684cdf251f6f1b275e6574f7602b Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 17 Nov 2019 13:58:43 +0100 Subject: [PATCH 155/208] Segfault in before/after mode, fixes #5529 --- rtengine/boxblur.cc | 1 + rtengine/cplx_wavelet_level.h | 2 +- rtengine/ipwavelet.cc | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/rtengine/boxblur.cc b/rtengine/boxblur.cc index 491ffae14..045c7ac3f 100644 --- a/rtengine/boxblur.cc +++ b/rtengine/boxblur.cc @@ -33,6 +33,7 @@ void boxblur(float** src, float** dst, int radius, int W, int H, bool multiThrea { //box blur using rowbuffers and linebuffers instead of a full size buffer + radius = rtengine::min(radius, W - 1, H - 1); if (radius == 0) { if (src != dst) { #ifdef _OPENMP diff --git a/rtengine/cplx_wavelet_level.h b/rtengine/cplx_wavelet_level.h index 8664606c6..09b4e4a88 100644 --- a/rtengine/cplx_wavelet_level.h +++ b/rtengine/cplx_wavelet_level.h @@ -272,7 +272,7 @@ template void wavelet_level::SynthesisFilterHaarVertical (const T #pragma omp for nowait #endif - for(int i = 0; i < skip; i++) + for(int i = 0; i < std::min(skip, height); i++) { for(int j = 0; j < width; j++) { dst[width * i + j] = (srcLo[i * width + j] + srcHi[i * width + j]); diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 91c7d6c44..7c0dc368b 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -1195,7 +1195,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const b = 327.68f * Chprov * sincosv.x; //aply Munsell } else {//general case L = labco->L[i1][j1]; - const float Lin = labco->L[i1][j1]; + const float Lin = std::max(0.f, L); if(wavclCurve && cp.finena) { labco->L[i1][j1] = (0.5f * Lin + 1.5f * wavclCurve[Lin]) / 2.f; //apply contrast curve From 62eb970aeeb6a472c7fd990e1128175d997127c6 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 17 Nov 2019 14:13:28 +0100 Subject: [PATCH 156/208] Capture sharpening: xtrans auto radius calculation bugfix --- rtengine/capturesharpening.cc | 81 ----------------------------------- 1 file changed, 81 deletions(-) diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index e271de2e6..55d2d3378 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -488,87 +488,6 @@ float calcRadiusXtrans(const float * const *rawData, int W, int H, float lowerLi } } } - const float valtl = rawData[row][col]; - const float valtr = rawData[row][col + 1]; - const float valbl = rawData[row + 1][col]; - const float valbr = rawData[row + 1][col + 1]; - if (valtl > 1.f) { - const float maxValtltr = std::max(valtl, valtr); - if (valtr > 1.f && maxValtltr > lowerLimit) { - const float minVal = std::min(valtl, valtr); - if (UNLIKELY(maxValtltr > maxRatio * minVal)) { - bool clipped = false; - if (maxValtltr == valtl) { // check for influence by clipped green in neighborhood - if (rtengine::max(rawData[row - 1][col - 1], valtr, valbl, valbr) >= upperLimit) { - clipped = true; - } - } else { // check for influence by clipped green in neighborhood - if (rtengine::max(rawData[row - 1][col + 2], valtl, valbl, valbr) >= upperLimit) { - clipped = true; - } - } - if (!clipped) { - maxRatio = maxValtltr / minVal; - } - } - } - const float maxValtlbl = std::max(valtl, valbl); - if (valbl > 1.f && maxValtlbl > lowerLimit) { - const float minVal = std::min(valtl, valbl); - if (UNLIKELY(maxValtlbl > maxRatio * minVal)) { - bool clipped = false; - if (maxValtlbl == valtl) { // check for influence by clipped green in neighborhood - if (rtengine::max(rawData[row - 1][col - 1], valtr, valbl, valbr) >= upperLimit) { - clipped = true; - } - } else { // check for influence by clipped green in neighborhood - if (rtengine::max(valtl, valtr, rawData[row + 2][col - 1], valbr) >= upperLimit) { - clipped = true; - } - } - if (!clipped) { - maxRatio = maxValtlbl / minVal; - } - } - } - } - if (valbr > 1.f) { - const float maxValblbr = std::max(valbl, valbr); - if (valbl > 1.f && maxValblbr > lowerLimit) { - const float minVal = std::min(valbl, valbr); - if (UNLIKELY(maxValblbr > maxRatio * minVal)) { - bool clipped = false; - if (maxValblbr == valbr) { // check for influence by clipped green in neighborhood - if (rtengine::max(valtl, valtr, valbl, rawData[row + 2][col + 2]) >= upperLimit) { - clipped = true; - } - } else { // check for influence by clipped green in neighborhood - if (rtengine::max(valtl, valtr, rawData[row + 2][col - 1], valbr) >= upperLimit) { - clipped = true; - } - } - if (!clipped) { - maxRatio = maxValblbr / minVal; - } - } - } - const float maxValtrbr = std::max(valtr, valbr); - if (valtr > 1.f && maxValtrbr > lowerLimit) { - const float minVal = std::min(valtr, valbr); - if (UNLIKELY(maxValtrbr > maxRatio * minVal)) { - if (maxValtrbr == valbr) { // check for influence by clipped green in neighborhood - if (rtengine::max(valtl, valtr, valbl, rawData[row + 2][col + 2]) >= upperLimit) { - continue; - } - } else { // check for influence by clipped green in neighborhood - if (rtengine::max(rawData[row - 1][col + 2], valtl, valbl, valbr) >= upperLimit) { - continue; - } - } - maxRatio = maxValtrbr / minVal; - } - } - } } } return std::sqrt((1.f / (std::log(1.f / maxRatio) / 2.f)) / -2.f); From 3eb1d241c91371fb58b52ba9c8ebb1e72bdad2f7 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 18 Nov 2019 20:13:12 +0100 Subject: [PATCH 157/208] findHotDeadPixels: speedup and reduced memory usage --- rtengine/badpixels.cc | 272 +++++++++++++++++++++++++++++------------- 1 file changed, 187 insertions(+), 85 deletions(-) diff --git a/rtengine/badpixels.cc b/rtengine/badpixels.cc index 2710cb28d..578459189 100644 --- a/rtengine/badpixels.cc +++ b/rtengine/badpixels.cc @@ -22,7 +22,8 @@ #include "pixelsmap.h" #include "rawimage.h" #include "rawimagesource.h" - +#define BENCHMARK +#include "StopWatch.h" namespace { unsigned fc(const unsigned int cfa[2][2], int r, int c) { @@ -445,126 +446,227 @@ int RawImageSource::interpolateBadPixelsXtrans(const PixelsMap &bitmapBads) /* Search for hot or dead pixels in the image and update the map * For each pixel compare its value to the average of similar color surrounding * (Taken from Emil Martinec idea) - * (Optimized by Ingo Weyrich 2013 and 2015) + * (Optimized by Ingo Weyrich 2013, 2015 and 2019) */ int RawImageSource::findHotDeadPixels(PixelsMap &bpMap, const float thresh, const bool findHotPixels, const bool findDeadPixels) const { + BENCHFUN const float varthresh = (20.0 * (thresh / 100.0) + 1.0) / 24.f; - // allocate temporary buffer - float* cfablur = new float[H * W]; - // counter for dead or hot pixels int counter = 0; #ifdef _OPENMP - #pragma omp parallel + #pragma omp parallel reduction(+:counter) #endif { + array2D cfablur(W, 5); + // zero left and right border + for (int i = 0; i < 5; ++i) { + cfablur[i][0] = cfablur[i][1] = cfablur[i][W - 2] = cfablur[i][W - 1]; + } + int firstRow = -1; + int lastRow = -1; + #ifdef _OPENMP - #pragma omp for schedule(dynamic,16) nowait + // note, static scheduling is important in this implementation + #pragma omp for schedule(static) nowait #endif for (int i = 2; i < H - 2; i++) { - for (int j = 2; j < W - 2; j++) { + if (firstRow == -1) { + firstRow = i; + if (firstRow == 2) { + for (int i = 0; i < 2; ++i) { + for (int j = 0; j < W; ++j) { + cfablur[i][j] = 0.f; + } + } + } else { + for (int row = firstRow - 2; row < firstRow; ++row) { + int destRow = row % 5; + int j = 2; + #ifdef __SSE2__ + for (; j < W - 5; j += 4) { + const vfloat tempv = median(LVFU(rawData[row - 2][j - 2]), LVFU(rawData[row - 2][j]), LVFU(rawData[row - 2][j + 2]), + LVFU(rawData[row][j - 2]), LVFU(rawData[row][j]), LVFU(rawData[row][j + 2]), + LVFU(rawData[row + 2][j - 2]), LVFU(rawData[row + 2][j]), LVFU(rawData[row + 2][j + 2])); + STVFU(cfablur[destRow][j], LVFU(rawData[row][j]) - tempv); + } + #endif + for (; j < W - 2; j++) { + const float temp = median(rawData[row - 2][j - 2], rawData[row - 2][j], rawData[row - 2][j + 2], + rawData[row][j - 2], rawData[row][j], rawData[row][j + 2], + rawData[row + 2][j - 2], rawData[row + 2][j], rawData[row + 2][j + 2]); + cfablur[destRow][j] = rawData[row][j] - temp; + } + } + } + } + lastRow = i; + const int destRow = i % 5; + int j = 2; +#ifdef __SSE2__ + for (; j < W - 5; j += 4) { + const vfloat tempv = median(LVFU(rawData[i - 2][j - 2]), LVFU(rawData[i - 2][j]), LVFU(rawData[i - 2][j + 2]), + LVFU(rawData[i][j - 2]), LVFU(rawData[i][j]), LVFU(rawData[i][j + 2]), + LVFU(rawData[i + 2][j - 2]), LVFU(rawData[i + 2][j]), LVFU(rawData[i + 2][j + 2])); + STVFU(cfablur[destRow][j], LVFU(rawData[i][j]) - tempv); + } +#endif + for (; j < W - 2; j++) { const float temp = median(rawData[i - 2][j - 2], rawData[i - 2][j], rawData[i - 2][j + 2], rawData[i][j - 2], rawData[i][j], rawData[i][j + 2], rawData[i + 2][j - 2], rawData[i + 2][j], rawData[i + 2][j + 2]); - cfablur[i * W + j] = rawData[i][j] - temp; - } - } - - // process borders. Former version calculated the median using mirrored border which does not make sense because the original pixel loses weight - // Setting the difference between pixel and median for border pixels to zero should do the job not worse then former version -#ifdef _OPENMP - #pragma omp single -#endif - { - for (int i = 0; i < 2; ++i) { - for (int j = 0; j < W; ++j) { - cfablur[i * W + j] = 0.f; - } + cfablur[destRow][j] = rawData[i][j] - temp; } - for (int i = 2; i < H - 2; ++i) { - for (int j = 0; j < 2; ++j) { - cfablur[i * W + j] = 0.f; - } + if (i - 1 > firstRow) { + const int rr = i - 2; + const int rrm2 = (rr - 2) % 5; + const int rrm1 = (rr - 1) % 5; + const int rr0 = rr % 5; + const int rrp1 = (rr + 1) % 5; + const int rrp2 = (rr + 2) % 5; + for (int cc = 2; cc < W - 2; ++cc) { + //evaluate pixel for heat/death + float pixdev = cfablur[rr0][cc]; - for (int j = W - 2; j < W; ++j) { - cfablur[i * W + j] = 0.f; - } - } + if (pixdev == 0.f) { + continue; + } - for (int i = H - 2; i < H; ++i) { - for (int j = 0; j < W; ++j) { - cfablur[i * W + j] = 0.f; - } - } - } + if ((!findDeadPixels) && pixdev < 0) { + continue; + } -#ifdef _OPENMP - #pragma omp barrier // barrier because of nowait clause above + if ((!findHotPixels) && pixdev > 0) { + continue; + } - #pragma omp for reduction(+:counter) schedule(dynamic,16) -#endif - - //cfa pixel heat/death evaluation - for (int rr = 2; rr < H - 2; ++rr) { - for (int cc = 2, rrmWpcc = rr * W + 2; cc < W - 2; ++cc, ++rrmWpcc) { - //evaluate pixel for heat/death - float pixdev = cfablur[rrmWpcc]; - - if (pixdev == 0.f) { - continue; - } - - if ((!findDeadPixels) && pixdev < 0) { - continue; - } - - if ((!findHotPixels) && pixdev > 0) { - continue; - } - - pixdev = fabsf(pixdev); - float hfnbrave = -pixdev; + pixdev = fabsf(pixdev); + float hfnbrave = -pixdev; #ifdef __SSE2__ - // sum up 5*4 = 20 values using SSE - // 10 fabs function calls and 10 float additions with SSE - vfloat sum = vabsf(LVFU(cfablur[(rr - 2) * W + cc - 2])) + vabsf(LVFU(cfablur[(rr - 1) * W + cc - 2])); - sum += vabsf(LVFU(cfablur[(rr) * W + cc - 2])); - sum += vabsf(LVFU(cfablur[(rr + 1) * W + cc - 2])); - sum += vabsf(LVFU(cfablur[(rr + 2) * W + cc - 2])); - // horizontally add the values and add the result to hfnbrave - hfnbrave += vhadd(sum); - - // add remaining 5 values of last column - for (int mm = rr - 2; mm <= rr + 2; ++mm) { - hfnbrave += fabsf(cfablur[mm * W + cc + 2]); - } + // sum up 5*4 = 20 values using SSE + // 10 fabs function calls and 10 float additions with SSE + vfloat sum1 = vabsf(LVFU(cfablur[rrm2][cc - 2])) + vabsf(LVFU(cfablur[rrm1][cc - 2])); + vfloat sum2 = vabsf(LVFU(cfablur[rr0][cc - 2])) + vabsf(LVFU(cfablur[rrp1][cc - 2])); + sum1 += vabsf(LVFU(cfablur[rrp2][cc - 2])); + // horizontally add the values and add the result to hfnbrave + hfnbrave += vhadd(sum1 + sum2); + // add remaining 5 values of last column + hfnbrave += fabsf(cfablur[rrm2][cc + 2]); + hfnbrave += fabsf(cfablur[rrm1][cc + 2]); + hfnbrave += fabsf(cfablur[rr0][cc + 2]); + hfnbrave += fabsf(cfablur[rrp1][cc + 2]); + hfnbrave += fabsf(cfablur[rrp2][cc + 2]); #else - // 25 fabs function calls and 25 float additions without SSE - for (int mm = rr - 2; mm <= rr + 2; ++mm) { + // 25 fabs function calls and 25 float additions without SSE for (int nn = cc - 2; nn <= cc + 2; ++nn) { - hfnbrave += fabsf(cfablur[mm * W + nn]); + hfnbrave += fabsf(cfablur[rrm2][nn]); + hfnbrave += fabsf(cfablur[rrm1][nn]); + hfnbrave += fabsf(cfablur[rr0][nn]); + hfnbrave += fabsf(cfablur[rrp1][nn]); + hfnbrave += fabsf(cfablur[rrp2][nn]); + } +#endif + if (pixdev > varthresh * hfnbrave) { + // mark the pixel as "bad" + bpMap.set(cc, rr); + counter++; + } + } //end of pixel evaluation + } + } + + if (lastRow > 0 && lastRow < H - 2) { + //cfa pixel heat/death evaluation + for (int rr = lastRow - 1; rr < lastRow + 1; ++rr) { + const int i = rr + 2; + const int destRow = i % 5; + if (i >= H - 2) { + for (int j = 2; j < W - 2; j++) { + cfablur[destRow][j] = 0.f; + } + } else { + int j = 2; +#ifdef __SSE2__ + for (; j < W - 5; j += 4) { + const vfloat tempv = median(LVFU(rawData[i - 2][j - 2]), LVFU(rawData[i - 2][j]), LVFU(rawData[i - 2][j + 2]), + LVFU(rawData[i][j - 2]), LVFU(rawData[i][j]), LVFU(rawData[i][j + 2]), + LVFU(rawData[i + 2][j - 2]), LVFU(rawData[i + 2][j]), LVFU(rawData[i + 2][j + 2])); + STVFU(cfablur[destRow][j], LVFU(rawData[i][j]) - tempv); + } +#endif + for (; j < W - 2; j++) { + const float temp = median(rawData[i - 2][j - 2], rawData[i - 2][j], rawData[i - 2][j + 2], + rawData[i][j - 2], rawData[i][j], rawData[i][j + 2], + rawData[i + 2][j - 2], rawData[i + 2][j], rawData[i + 2][j + 2]); + cfablur[destRow][j] = rawData[i][j] - temp; } } -#endif + const int rrm2 = (rr - 2) % 5; + const int rrm1 = (rr - 1) % 5; + const int rr0 = rr % 5; + const int rrp1 = (rr + 1) % 5; + const int rrp2 = (rr + 2) % 5; + for (int cc = 2; cc < W - 2; ++cc) { + //evaluate pixel for heat/death + float pixdev = cfablur[rr0][cc]; - if (pixdev > varthresh * hfnbrave) { - // mark the pixel as "bad" - bpMap.set(cc, rr); - counter++; - } - }//end of pixel evaluation + if (pixdev == 0.f) { + continue; + } + + if ((!findDeadPixels) && pixdev < 0) { + continue; + } + + if ((!findHotPixels) && pixdev > 0) { + continue; + } + + pixdev = fabsf(pixdev); + float hfnbrave = -pixdev; + +#ifdef __SSE2__ + // sum up 5*4 = 20 values using SSE + // 10 fabs function calls and 10 float additions with SSE + vfloat sum1 = vabsf(LVFU(cfablur[rrm2][cc - 2])) + vabsf(LVFU(cfablur[rrm1][cc - 2])); + vfloat sum2 = vabsf(LVFU(cfablur[rr0][cc - 2])) + vabsf(LVFU(cfablur[rrp1][cc - 2])); + sum1 += vabsf(LVFU(cfablur[rrp2][cc - 2])); + // horizontally add the values and add the result to hfnbrave + hfnbrave += vhadd(sum1 + sum2); + + // add remaining 5 values of last column + hfnbrave += fabsf(cfablur[rrm2][cc + 2]); + hfnbrave += fabsf(cfablur[rrm1][cc + 2]); + hfnbrave += fabsf(cfablur[rr0][cc + 2]); + hfnbrave += fabsf(cfablur[rrp1][cc + 2]); + hfnbrave += fabsf(cfablur[rrp2][cc + 2]); +#else + // 25 fabs function calls and 25 float additions without SSE + for (int nn = cc - 2; nn <= cc + 2; ++nn) { + hfnbrave += fabsf(cfablur[rrm2][nn]); + hfnbrave += fabsf(cfablur[rrm1][nn]); + hfnbrave += fabsf(cfablur[rr0][nn]); + hfnbrave += fabsf(cfablur[rrp1][nn]); + hfnbrave += fabsf(cfablur[rrp2][nn]); + } +#endif + if (pixdev > varthresh * hfnbrave) { + // mark the pixel as "bad" + bpMap.set(cc, rr); + counter++; + } + }//end of pixel evaluation + } } }//end of parallel processing - delete [] cfablur; return counter; } From cbfda6b12546ac029f97dec2738d4bef7aab25f1 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 18 Nov 2019 21:08:56 +0100 Subject: [PATCH 158/208] clean array2D.h dependencies --- rtengine/guidedfilter.h | 3 ++- rtengine/iplabregions.cc | 1 + rtengine/ipshadowshighlights.cc | 1 + rtengine/pipettebuffer.h | 1 - 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/rtengine/guidedfilter.h b/rtengine/guidedfilter.h index d66396c6a..2d8b70369 100644 --- a/rtengine/guidedfilter.h +++ b/rtengine/guidedfilter.h @@ -20,11 +20,12 @@ #pragma once -#include "array2D.h" +template class array2D; namespace rtengine { + void guidedFilter(const array2D &guide, const array2D &src, array2D &dst, int r, float epsilon, bool multithread, int subsampling=0); } // namespace rtengine diff --git a/rtengine/iplabregions.cc b/rtengine/iplabregions.cc index 1768101c8..6526419f5 100644 --- a/rtengine/iplabregions.cc +++ b/rtengine/iplabregions.cc @@ -18,6 +18,7 @@ * along with RawTherapee. If not, see . */ +#include "array2D.h" #include "color.h" #include "curves.h" #include "guidedfilter.h" diff --git a/rtengine/ipshadowshighlights.cc b/rtengine/ipshadowshighlights.cc index a602c5460..5c5b6b324 100644 --- a/rtengine/ipshadowshighlights.cc +++ b/rtengine/ipshadowshighlights.cc @@ -20,6 +20,7 @@ #include "improcfun.h" +#include "array2D.h" #include "color.h" #include "curves.h" #include "gauss.h" diff --git a/rtengine/pipettebuffer.h b/rtengine/pipettebuffer.h index 79b6dd8c5..6f017a196 100644 --- a/rtengine/pipettebuffer.h +++ b/rtengine/pipettebuffer.h @@ -18,7 +18,6 @@ */ #pragma once -#include "array2D.h" #include "iimage.h" class EditDataProvider; From 0cf3f16dfa58b4fcefd6d49965f8337333f076a4 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 19 Nov 2019 19:19:49 +0100 Subject: [PATCH 159/208] Basic Canon CR3 support. Only decoding, still no CR3 exif support. Ported from ART. Kudos to agriggio and libraw --- rtdata/options/options.lin | 4 +- rtdata/options/options.osx | 4 +- rtdata/options/options.win | 4 +- rtengine/CMakeLists.txt | 1 + rtengine/camconst.json | 5 + rtengine/canon_cr3_decoder.cc | 3120 +++++++++++++++++++++++++++++++++ rtengine/dcraw.cc | 357 +++- rtengine/dcraw.h | 45 + 8 files changed, 3525 insertions(+), 15 deletions(-) create mode 100644 rtengine/canon_cr3_decoder.cc diff --git a/rtdata/options/options.lin b/rtdata/options/options.lin index 1d2f9faac..580390b28 100644 --- a/rtdata/options/options.lin +++ b/rtdata/options/options.lin @@ -12,8 +12,8 @@ MultiUser=true [File Browser] # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) -ParseExtensions=3fr;arw;arq;cr2;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; -ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;1;1;1;1;1;1;1;1;1;1; +ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; +ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;1;1;1;1;1;1;1;1;1;1; [Output] PathTemplate=%p1/converted/%f diff --git a/rtdata/options/options.osx b/rtdata/options/options.osx index 11c5da4c8..58e0a5604 100644 --- a/rtdata/options/options.osx +++ b/rtdata/options/options.osx @@ -12,8 +12,8 @@ MultiUser=true [File Browser] # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) -ParseExtensions=3fr;arw;arq;cr2;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; -ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;1;1;1;1;1;1;1;1;1;1; +ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; +ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;1;1;1;1;1;1;1;1;1;1; [Output] PathTemplate=%p1/converted/%f diff --git a/rtdata/options/options.win b/rtdata/options/options.win index a4a767bf4..a54e021b1 100644 --- a/rtdata/options/options.win +++ b/rtdata/options/options.win @@ -14,8 +14,8 @@ UseSystemTheme=false [File Browser] # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) -ParseExtensions=3fr;arw;arq;cr2;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; -ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;1;1;1;1;1;1;1;1;1;1; +ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; +ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;1;1;1;1;1;1;1;1;1;1; [Output] PathTemplate=%p1/converted/%f diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt index c37341c8b..f58afde5e 100644 --- a/rtengine/CMakeLists.txt +++ b/rtengine/CMakeLists.txt @@ -34,6 +34,7 @@ set(RTENGINESOURCEFILES amaze_demosaic_RT.cc badpixels.cc boxblur.cc + canon_cr3_decoder.cc CA_correct_RT.cc calc_distort.cc camconst.cc diff --git a/rtengine/camconst.json b/rtengine/camconst.json index f2db455a3..45233fc16 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -1138,6 +1138,11 @@ Camera constants: } }, + { // Quality C, only raw crop + "make_model": [ "Canon EOS M6 Mark II", "Canon EOS 90D" ], + "raw_crop": [ 144, 72, 6984, 4660 ] + }, + // Canon Powershot { // Quality C, CHDK DNGs, raw frame correction "make_model": "Canon PowerShot A3100 IS", diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc new file mode 100644 index 000000000..9d3e0a62d --- /dev/null +++ b/rtengine/canon_cr3_decoder.cc @@ -0,0 +1,3120 @@ +/* -*- C++ -*- + * + * This file is part of ART. + * + * ART is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * ART is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with ART. If not, see . +*/ + +#include +#include "dcraw.h" + +#ifdef __GNUC__ // silence warning +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsign-compare" +#pragma GCC diagnostic ignored "-Wunused-variable" +#pragma GCC diagnostic ignored "-Wunused-but-set-variable" +#endif + +// Code adapted from libraw +/* -*- C++ -*- + * Copyright 2019 LibRaw LLC (info@libraw.org) + * + LibRaw is free software; you can redistribute it and/or modify + it under the terms of the one of two licenses as you choose: + +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + +*/ + + +void DCraw::parse_canon_cr3() +{ + int err; + unsigned long long szAtomList; + short nesting = -1; + short nTrack = -1; + short TrackType; + char AtomNameStack[128]; + strcpy(make, "Canon"); + + szAtomList = ifp->size; + err = parseCR3(0ULL, szAtomList, nesting, AtomNameStack, nTrack, TrackType); + if ((err == 0 || err == -14) && + nTrack >= 0) // no error, or too deep nesting + selectCRXTrack(nTrack); +} + +#define LIBRAW_CRXTRACKS_MAXCOUNT RT_canon_CR3_data.CRXTRACKS_MAXCOUNT + +void DCraw::selectCRXTrack(short maxTrack) +{ + if (maxTrack < 0) + return; + INT64 bitcounts[LIBRAW_CRXTRACKS_MAXCOUNT], maxbitcount = 0; + uint32_t maxjpegbytes = 0; + memset(bitcounts, 0, sizeof(bitcounts)); + for (int i = 0; i <= maxTrack && i < LIBRAW_CRXTRACKS_MAXCOUNT; i++) + { + CanonCR3Data::crx_data_header_t *d = &RT_canon_CR3_data.crx_header[i]; + if (d->MediaType == 1) // RAW + { + bitcounts[i] = INT64(d->nBits) * INT64(d->f_width) * INT64(d->f_height); + if (bitcounts[i] > maxbitcount) + maxbitcount = bitcounts[i]; + } + else if (d->MediaType == 2) // JPEG + { + if (d->MediaSize > maxjpegbytes) + { + maxjpegbytes = d->MediaSize; + thumb_offset = d->MediaOffset; + thumb_length = d->MediaSize; + } + } + } + if (maxbitcount < 8) + return; + int framei = -1, framecnt = 0; + for (int i = 0; i <= maxTrack && i < LIBRAW_CRXTRACKS_MAXCOUNT; i++) + { + if (bitcounts[i] == maxbitcount) + { + if (framecnt <= shot_select) + framei = i; + framecnt++; + } + } + is_raw = framecnt; + if (framei >= 0 && framei < LIBRAW_CRXTRACKS_MAXCOUNT) + { + CanonCR3Data::crx_data_header_t *d = + &RT_canon_CR3_data.crx_header[framei]; + data_offset = d->MediaOffset; + //data_size = d->MediaSize; + raw_width = d->f_width; + raw_height = d->f_height; + load_raw = &DCraw::crxLoadRaw; + switch (d->cfaLayout) + { + case 0: + filters = 0x94949494; + break; + case 1: + filters = 0x61616161; + break; + case 2: + filters = 0x49494949; + break; + case 3: + filters = 0x16161616; + break; + } + + RT_canon_CR3_data.crx_track_selected = framei; + + int tiff_idx = -1; + INT64 tpixels = 0; + for (int i = 0; i < tiff_nifds; i++) + if (INT64(tiff_ifd[i].height) * INT64(tiff_ifd[i].height) > tpixels) + { + tpixels = INT64(tiff_ifd[i].height) * INT64(tiff_ifd[i].height); + tiff_idx = i; + } + if (tiff_idx >= 0) + flip = tiff_ifd[tiff_idx].flip; + } +} + +#define FORC4 for (c=0; c < 4; c++) + +#define bad_hdr \ + (((order != 0x4d4d) && (order != 0x4949)) || (get2() != 0x002a) || \ + (get4() != 0x00000008)) +int DCraw::parseCR3(unsigned long long oAtomList, + unsigned long long szAtomList, short &nesting, + char *AtomNameStack, short &nTrack, short &TrackType) +{ + /* + Atom starts with 4 bytes for Atom size and 4 bytes containing Atom name + Atom size includes the length of the header and the size of all "contained" + Atoms if Atom size == 1, Atom has the extended size stored in 8 bytes located + after the Atom name if Atom size == 0, it is the last top-level Atom extending + to the end of the file Atom name is often a 4 symbol mnemonic, but can be a + 4-byte integer + */ + const char UIID_Canon[17] = + "\x85\xc0\xb6\x87\x82\x0f\x11\xe0\x81\x11\xf4\xce\x46\x2b\x6a\x48"; + const char UIID_Preview[17] = + "\xea\xf4\x2b\x5e\x1c\x98\x4b\x88\xb9\xfb\xb7\xdc\x40\x6e\x4d\x16"; + + /* + AtomType = 0 - unknown: "unk." + AtomType = 1 - container atom: "cont" + AtomType = 2 - leaf atom: "leaf" + AtomType = 3 - can be container, can be leaf: "both" + */ + const char sAtomeType[4][5] = {"unk.", "cont", "leaf", "both"}; + short AtomType; + static const struct + { + char AtomName[5]; + short AtomType; + } AtomNamesList[] = { + {"dinf", 1}, + {"edts", 1}, + {"fiin", 1}, + {"ipro", 1}, + {"iprp", 1}, + {"mdia", 1}, + {"meco", 1}, + {"mere", 1}, + {"mfra", 1}, + {"minf", 1}, + {"moof", 1}, + {"moov", 1}, + {"mvex", 1}, + {"paen", 1}, + {"schi", 1}, + {"sinf", 1}, + {"skip", 1}, + {"stbl", 1}, + {"stsd", 1}, + {"strk", 1}, + {"tapt", 1}, + {"traf", 1}, + {"trak", 1}, + + {"cdsc", 2}, + {"colr", 2}, + {"dimg", 2}, + // {"dref", 2}, + {"free", 2}, + {"frma", 2}, + {"ftyp", 2}, + {"hdlr", 2}, + {"hvcC", 2}, + {"iinf", 2}, + {"iloc", 2}, + {"infe", 2}, + {"ipco", 2}, + {"ipma", 2}, + {"iref", 2}, + {"irot", 2}, + {"ispe", 2}, + {"meta", 2}, + {"mvhd", 2}, + {"pitm", 2}, + {"pixi", 2}, + {"schm", 2}, + {"thmb", 2}, + {"tkhd", 2}, + {"url ", 2}, + {"urn ", 2}, + + {"CCTP", 1}, + {"CRAW", 1}, + + {"JPEG", 2}, + {"CDI1", 2}, + {"CMP1", 2}, + + {"CNCV", 2}, + {"CCDT", 2}, + {"CTBO", 2}, + {"CMT1", 2}, + {"CMT2", 2}, + {"CMT3", 2}, + {"CMT4", 2}, + {"THMB", 2}, + {"co64", 2}, + {"mdat", 2}, + {"mdhd", 2}, + {"nmhd", 2}, + {"stsc", 2}, + {"stsz", 2}, + {"stts", 2}, + {"vmhd", 2}, + + {"dref", 3}, + {"uuid", 3}, + }; + + const char sHandlerType[5][5] = {"unk.", "soun", "vide", "hint", "meta"}; + + int c, err = 0; + + ushort tL; // Atom length represented in 4 or 8 bytes + char nmAtom[5]; // Atom name + unsigned long long oAtom, szAtom; // Atom offset and Atom size + unsigned long long oAtomContent, + szAtomContent; // offset and size of Atom content + unsigned long long lHdr; + + char UIID[16]; + uchar CMP1[36]; + char HandlerType[5], MediaFormatID[5]; + unsigned ImageWidth, ImageHeight; + long relpos_inDir, relpos_inBox; + unsigned szItem, Tag, lTag; + ushort tItem; + + nmAtom[0] = MediaFormatID[0] = nmAtom[4] = MediaFormatID[4] = '\0'; + strcpy(HandlerType, sHandlerType[0]); + ImageWidth = ImageHeight = 0U; + oAtom = oAtomList; + nesting++; + if (nesting > 31) + return -14; // too deep nesting + short s_order = order; + + while ((oAtom + 8ULL) <= (oAtomList + szAtomList)) + { + lHdr = 0ULL; + err = 0; + order = 0x4d4d; + fseek(ifp, oAtom, SEEK_SET); + szAtom = get4(); + FORC4 nmAtom[c] = AtomNameStack[nesting * 4 + c] = fgetc(ifp); + AtomNameStack[(nesting + 1) * 4] = '\0'; + tL = 4; + AtomType = 0; + + for (c = 0; c < sizeof AtomNamesList / sizeof *AtomNamesList; c++) + if (!strcmp(nmAtom, AtomNamesList[c].AtomName)) + { + AtomType = AtomNamesList[c].AtomType; + break; + } + + if (!AtomType) + { + err = 1; + } + + if (szAtom == 0ULL) + { + if (nesting != 0) + { + err = -2; + goto fin; + } + szAtom = szAtomList - oAtom; + oAtomContent = oAtom + 8ULL; + szAtomContent = szAtom - 8ULL; + } + else if (szAtom == 1ULL) + { + if ((oAtom + 16ULL) > (oAtomList + szAtomList)) + { + err = -3; + goto fin; + } + tL = 8; + szAtom = (((unsigned long long)get4()) << 32) | get4(); + oAtomContent = oAtom + 16ULL; + szAtomContent = szAtom - 16ULL; + } + else + { + oAtomContent = oAtom + 8ULL; + szAtomContent = szAtom - 8ULL; + } + + if (!strcmp(nmAtom, "trak")) + { + nTrack++; + TrackType = 0; + if (nTrack >= LIBRAW_CRXTRACKS_MAXCOUNT) + break; + } + if (!strcmp(AtomNameStack, "moovuuid")) + { + lHdr = 16ULL; + fread(UIID, 1, lHdr, ifp); + if (!strncmp(UIID, UIID_Canon, lHdr)) + { + AtomType = 1; + } + else + fseek(ifp, -lHdr, SEEK_CUR); + } + else if (!strcmp(AtomNameStack, "moovuuidCCTP")) + { + lHdr = 12ULL; + } + else if (!strcmp(AtomNameStack, "moovuuidCMT1")) + { + short q_order = order; + order = get2(); + if ((tL != 4) || bad_hdr) + { + err = -4; + goto fin; + } + parse_tiff_ifd(oAtomContent); + order = q_order; + } + else if (!strcmp(AtomNameStack, "moovuuidCMT2")) + { + short q_order = order; + order = get2(); + if ((tL != 4) || bad_hdr) + { + err = -5; + goto fin; + } + parse_exif(oAtomContent); + order = q_order; + } + else if (!strcmp(AtomNameStack, "moovuuidCMT3")) + { + short q_order = order; + order = get2(); + if ((tL != 4) || bad_hdr) + { + err = -6; + goto fin; + } + fseek(ifp, -12L, SEEK_CUR); + parse_makernote(oAtomContent, 0); + order = q_order; + } + else if (!strcmp(AtomNameStack, "moovuuidCMT4")) + { + short q_order = order; + order = get2(); + if ((tL != 4) || bad_hdr) + { + err = -6; + goto fin; + } + INT64 off = ftell(ifp); + parse_gps(oAtomContent); + fseek(ifp, off, SEEK_SET); +// parse_gps_libraw(oAtomContent); + order = q_order; + } + else if (!strcmp(AtomNameStack, "moovtrakmdiahdlr")) + { + fseek(ifp, 8L, SEEK_CUR); + FORC4 HandlerType[c] = fgetc(ifp); + for (c = 1; c < sizeof sHandlerType / sizeof *sHandlerType; c++) + if (!strcmp(HandlerType, sHandlerType[c])) + { + TrackType = c; + break; + } + } + else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsd")) + { + if (szAtomContent >= 16) + { + fseek(ifp, 12L, SEEK_CUR); + lHdr = 8; + } + else + { + err = -7; + goto fin; + } + FORC4 MediaFormatID[c] = fgetc(ifp); + if ((TrackType == 2) && (!strcmp(MediaFormatID, "CRAW"))) + { + if (szAtomContent >= 44) + fseek(ifp, 24L, SEEK_CUR); + else + { + err = -8; + goto fin; + } + } + else + { + AtomType = 2; // only continue for CRAW + lHdr = 0; + } +#define current_track RT_canon_CR3_data.crx_header[nTrack] + + ImageWidth = get2(); + ImageHeight = get2(); + } + else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAW")) + { + lHdr = 82; + } + else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAWCMP1")) + { + if (szAtomContent >= 40) + fread(CMP1, 1, 36, ifp); + else + { + err = -7; + goto fin; + } + if (!crxParseImageHeader(CMP1, nTrack)) + current_track.MediaType = 1; + } + else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAWJPEG")) + { + current_track.MediaType = 2; + } + else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsz")) + { + if (szAtomContent == 12) + fseek(ifp, 4L, SEEK_CUR); + else if (szAtomContent == 16) + fseek(ifp, 12L, SEEK_CUR); + else + { + err = -9; + goto fin; + } + current_track.MediaSize = get4(); + } + else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblco64")) + { + if (szAtomContent == 16) + fseek(ifp, 8L, SEEK_CUR); + else + { + err = -10; + goto fin; + } + current_track.MediaOffset = (((unsigned long long)get4()) << 32) | get4(); + } + + if (current_track.MediaSize && current_track.MediaOffset && + ((oAtom + szAtom) >= (oAtomList + szAtomList)) && + !strncmp(AtomNameStack, "moovtrakmdiaminfstbl", 20)) + { + if ((TrackType == 4) && (!strcmp(MediaFormatID, "CTMD"))) + { + order = 0x4949; + relpos_inDir = 0L; + while (relpos_inDir + 6 < current_track.MediaSize) + { + fseek(ifp, current_track.MediaOffset + relpos_inDir, SEEK_SET); + szItem = get4(); + tItem = get2(); + if ((relpos_inDir + szItem) > current_track.MediaSize) + { + err = -11; + goto fin; + } + if ((tItem == 7) || (tItem == 8) || (tItem == 9)) + { + relpos_inBox = relpos_inDir + 12L; + while (relpos_inBox + 8 < relpos_inDir + szItem) + { + fseek(ifp, current_track.MediaOffset + relpos_inBox, SEEK_SET); + lTag = get4(); + Tag = get4(); + if (lTag < 8) + { + err = -12; + goto fin; + } + else if ((relpos_inBox + lTag) > (relpos_inDir + szItem)) + { + err = -11; + goto fin; + } + if ((Tag == 0x927c) && ((tItem == 7) || (tItem == 8))) + { + fseek(ifp, current_track.MediaOffset + relpos_inBox + 8L, + SEEK_SET); + short q_order = order; + order = get2(); + if (bad_hdr) + { + err = -13; + goto fin; + } + fseek(ifp, -8L, SEEK_CUR); + RT_canon_CR3_data.CR3_CTMDtag = 1; + parse_makernote(current_track.MediaOffset + relpos_inBox + 8, + 0); + RT_canon_CR3_data.CR3_CTMDtag = 0; + order = q_order; + } + relpos_inBox += lTag; + } + } + relpos_inDir += szItem; + } + order = 0x4d4d; + } + } +#undef current_track + if (AtomType == 1) + { + err = parseCR3(oAtomContent + lHdr, szAtomContent - lHdr, nesting, + AtomNameStack, nTrack, TrackType); + if (err) + goto fin; + } + oAtom += szAtom; + } + +fin: + nesting--; + if (nesting >= 0) + AtomNameStack[nesting * 4] = '\0'; + order = s_order; + return err; +} +#undef bad_hdr + + +//----------------------------------------------------------------------------- + +#ifdef _abs +#undef _abs +#undef _min +#undef _constrain +#endif +#define _abs(x) (((x) ^ ((int32_t)(x) >> 31)) - ((int32_t)(x) >> 31)) +#define _min(a, b) ((a) < (b) ? (a) : (b)) +#define _constrain(x, l, u) ((x) < (l) ? (l) : ((x) > (u) ? (u) : (x))) + +#if defined(__clang__) || defined(__GNUG__) +#define libraw_inline inline __attribute__((always_inline)) +#elif defined(_MSC_VER) && _MSC_VER > 1400 +#define libraw_inline __forceinline +#else +#define libraw_inline inline +#endif + +namespace { + +static unsigned sgetn (int n, unsigned char *s) +{ + unsigned result = 0; + + while (n-- > 0) { + result = (result << 8) | (*s++); + } + + return result; +} + +// this should be divisible by 4 +#define CRX_BUF_SIZE 0x10000 +#if !defined(_WIN32) || (defined (__GNUC__) && !defined(__INTRINSIC_SPECIAL__BitScanReverse)) +/* __INTRINSIC_SPECIAL__BitScanReverse found in MinGW32-W64 v7.30 headers, may be there is a better solution? */ +typedef uint32_t DWORD; +typedef uint8_t byte; +libraw_inline void _BitScanReverse(DWORD *Index, unsigned long Mask) +{ + *Index = sizeof(unsigned long) * 8 - 1 - __builtin_clzl(Mask); +} +#define _byteswap_ulong(x) __builtin_bswap32(x) +#endif + +#ifdef LIBRAW_USE_OPENMP +# undef LIBRAW_USE_OPENMP +#endif + +#define LIBRAW_EXCEPTION_IO_EOF std::exception() + +struct LibRaw_abstract_datastream { + IMFILE *ifp; + + void lock() {} + void unlock() {} + void seek(int p, int how) { fseek(ifp, p, how); } + int read(void* dst, int es, int count) + { return fread(dst, es, count, ifp); } +}; + +struct CrxBitstream +{ + uint8_t mdatBuf[CRX_BUF_SIZE]; + uint64_t mdatSize; + uint64_t curBufOffset; + uint32_t curPos; + uint32_t curBufSize; + uint32_t bitData; + int32_t bitsLeft; + LibRaw_abstract_datastream *input; +}; + +struct CrxBandParam +{ + CrxBitstream bitStream; + int16_t subbandWidth; + int16_t subbandHeight; + int32_t roundedBitsMask; + int32_t roundedBits; + int16_t curLine; + int32_t *lineBuf0; + int32_t *lineBuf1; + int32_t *lineBuf2; + int32_t sParam; + int32_t kParam; + int32_t *paramData; + int32_t *nonProgrData; + int8_t supportsPartial; +}; + +struct CrxWaveletTransform +{ + int32_t *subband0Buf; + int32_t *subband1Buf; + int32_t *subband2Buf; + int32_t *subband3Buf; + int32_t *lineBuf[8]; + int16_t curLine; + int16_t curH; + int8_t fltTapH; + int16_t height; + int16_t width; +}; + +struct CrxSubband +{ + CrxBandParam *bandParam; + uint64_t mdatOffset; + uint8_t *bandBuf; + int32_t bandSize; + uint64_t dataSize; + int8_t supportsPartial; + int32_t quantValue; + uint16_t width; + uint16_t height; + int32_t paramK; + int64_t dataOffset; +}; + +struct CrxPlaneComp +{ + byte *compBuf; + CrxSubband *subBands; + CrxWaveletTransform *waveletTransform; + int8_t compNumber; + int64_t dataOffset; + int32_t compSize; + int8_t supportsPartial; + int32_t roundedBitsMask; + int8_t tileFlag; +}; + +struct CrxTile +{ + CrxPlaneComp *comps; + int8_t tileFlag; + int8_t tileNumber; + int64_t dataOffset; + int32_t tileSize; + uint16_t width; + uint16_t height; +}; + +struct CrxImage +{ + uint8_t nPlanes; + uint16_t planeWidth; + uint16_t planeHeight; + uint8_t samplePrecision; + uint8_t subbandCount; + uint8_t levels; + uint8_t nBits; + uint8_t encType; + uint8_t tileCols; + uint8_t tileRows; + CrxTile *tiles; + uint64_t mdatOffset; + uint64_t mdatSize; + int16_t *outBufs[4]; // one per plane + int16_t *planeBuf; + LibRaw_abstract_datastream *input; +}; + +enum TileFlags +{ + E_HAS_TILES_ON_THE_RIGHT = 1, + E_HAS_TILES_ON_THE_LEFT = 2, + E_HAS_TILES_ON_THE_BOTTOM = 4, + E_HAS_TILES_ON_THE_TOP = 8 +}; + +int32_t exCoefNumTbl[0x120] = { + // level 1 + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // level 2 + 1, 1, 3, 3, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 3, 2, 1, 0, 1, 0, 0, 0, 0, 0, 1, + 2, 4, 4, 2, 1, 2, 1, 0, 0, 0, 0, 1, 1, 4, 3, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, + 3, 3, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 3, 2, 1, 0, 1, 0, 0, 0, 0, 0, 1, 2, 4, + 4, 2, 1, 2, 1, 0, 0, 0, 0, 1, 1, 4, 3, 1, 1, 1, 1, 0, 0, 0, 0, + + // level 3 + 1, 1, 7, 7, 1, 1, 3, 3, 1, 1, 1, 1, 1, 0, 7, 6, 1, 0, 3, 2, 1, 0, 1, 0, 1, + 2, 10, 10, 2, 2, 5, 4, 2, 1, 2, 1, 1, 1, 10, 9, 1, 2, 4, 4, 2, 1, 2, 1, 1, + 1, 9, 9, 1, 2, 4, 4, 2, 1, 2, 1, 1, 0, 9, 8, 1, 1, 4, 3, 1, 1, 1, 1, 1, 2, + 8, 8, 2, 1, 4, 3, 1, 1, 1, 1, 1, 1, 8, 7, 1, 1, 3, 3, 1, 1, 1, 1}; + +uint32_t JS[32] = {1, 1, 1, 1, 2, 2, 2, 2, + 4, 4, 4, 4, 8, 8, 8, 8, + 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, + 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000}; + +uint32_t J[32] = {0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, + 2, 3, 3, 3, 3, 4, 4, 5, 5, 6, 6, + 7, 7, 8, 9, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F}; + +static inline void crxFillBuffer(CrxBitstream *bitStrm) +{ + if (bitStrm->curPos >= bitStrm->curBufSize && bitStrm->mdatSize) + { + bitStrm->curPos = 0; + bitStrm->curBufOffset += bitStrm->curBufSize; +#ifdef LIBRAW_USE_OPENMP +#pragma omp critical +#endif + { +#ifndef LIBRAW_USE_OPENMP + bitStrm->input->lock(); +#endif + bitStrm->input->seek(bitStrm->curBufOffset, SEEK_SET); + bitStrm->curBufSize = bitStrm->input->read( + bitStrm->mdatBuf, 1, _min(bitStrm->mdatSize, CRX_BUF_SIZE)); +#ifndef LIBRAW_USE_OPENMP + bitStrm->input->unlock(); +#endif + if (bitStrm->curBufSize < 1) // nothing read + throw LIBRAW_EXCEPTION_IO_EOF; + bitStrm->mdatSize -= bitStrm->curBufSize; + } + } +} + +libraw_inline int crxBitstreamGetZeros(CrxBitstream *bitStrm) +{ + uint32_t bitData = bitStrm->bitData; + uint32_t nonZeroBit = 0; + uint64_t nextData = 0; + int32_t result = 0; + + if (bitStrm->bitData) + { + _BitScanReverse((DWORD *)&nonZeroBit, (DWORD)bitStrm->bitData); + result = 31 - nonZeroBit; + bitStrm->bitData <<= 32 - nonZeroBit; + bitStrm->bitsLeft -= 32 - nonZeroBit; + } + else + { + uint32_t bitsLeft = bitStrm->bitsLeft; + while (1) + { + while (bitStrm->curPos + 4 <= bitStrm->curBufSize) + { + nextData = + _byteswap_ulong(*(uint32_t *)(bitStrm->mdatBuf + bitStrm->curPos)); + bitStrm->curPos += 4; + crxFillBuffer(bitStrm); + if (nextData) + { + _BitScanReverse((DWORD *)&nonZeroBit, (DWORD)nextData); + result = bitsLeft + 31 - nonZeroBit; + bitStrm->bitData = nextData << (32 - nonZeroBit); + bitStrm->bitsLeft = nonZeroBit; + return result; + } + bitsLeft += 32; + } + if (bitStrm->curBufSize < bitStrm->curPos + 1) + break; // error + nextData = bitStrm->mdatBuf[bitStrm->curPos++]; + crxFillBuffer(bitStrm); + if (nextData) + break; + bitsLeft += 8; + } + _BitScanReverse((DWORD *)&nonZeroBit, (DWORD)nextData); + result = (uint32_t)(bitsLeft + 7 - nonZeroBit); + bitStrm->bitData = nextData << (32 - nonZeroBit); + bitStrm->bitsLeft = nonZeroBit; + } + return result; +} + +libraw_inline uint32_t crxBitstreamGetBits(CrxBitstream *bitStrm, int bits) +{ + int bitsLeft = bitStrm->bitsLeft; + uint32_t bitData = bitStrm->bitData; + uint32_t nextWord; + uint8_t nextByte; + uint32_t result; + + if (bitsLeft < bits) + { + // get them from stream + if (bitStrm->curPos + 4 <= bitStrm->curBufSize) + { + nextWord = + _byteswap_ulong(*(uint32_t *)(bitStrm->mdatBuf + bitStrm->curPos)); + bitStrm->curPos += 4; + crxFillBuffer(bitStrm); + bitStrm->bitsLeft = 32 - (bits - bitsLeft); + result = ((nextWord >> bitsLeft) | bitData) >> (32 - bits); + bitStrm->bitData = nextWord << (bits - bitsLeft); + return result; + } + // less than a word left - read byte at a time + do + { + if (bitStrm->curPos >= bitStrm->curBufSize) + break; // error + bitsLeft += 8; + nextByte = bitStrm->mdatBuf[bitStrm->curPos++]; + crxFillBuffer(bitStrm); + bitData |= nextByte << (32 - bitsLeft); + } while (bitsLeft < bits); + } + result = bitData >> (32 - bits); // 32-bits + bitStrm->bitData = bitData << bits; + bitStrm->bitsLeft = bitsLeft - bits; + return result; +} + +libraw_inline int crxPredictKParameter(int32_t prevK, int32_t bitCode, + int32_t maxVal = 0) +{ + int32_t newKParam = prevK - (bitCode < (1 << prevK >> 1)) + + ((bitCode >> prevK) > 2) + ((bitCode >> prevK) > 5); + + return !maxVal || newKParam < maxVal ? newKParam : maxVal; +} + +libraw_inline void crxDecodeSymbolL1(CrxBandParam *param, + int32_t doMedianPrediction, + int32_t notEOL = 0) +{ + if (doMedianPrediction) + { + int32_t symb[4]; + + int32_t delta = param->lineBuf0[1] - param->lineBuf0[0]; + symb[2] = param->lineBuf1[0]; + symb[0] = symb[1] = delta + symb[2]; + symb[3] = param->lineBuf0[1]; + + param->lineBuf1[1] = + symb[(((param->lineBuf0[0] < param->lineBuf1[0]) ^ (delta < 0)) << 1) + + ((param->lineBuf1[0] < param->lineBuf0[1]) ^ (delta < 0))]; + } + else + param->lineBuf1[1] = param->lineBuf0[1]; + + // get next error symbol + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + if (bitCode >= 41) + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + else if (param->kParam) + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | + (bitCode << param->kParam); + + // add converted (+/-) error code to predicted value + param->lineBuf1[1] += -(bitCode & 1) ^ (bitCode >> 1); + + // for not end of the line - use one symbol ahead to estimate next K + if (notEOL) + { + int32_t nextDelta = (param->lineBuf0[2] - param->lineBuf0[1]) << 1; + bitCode = (bitCode + _abs(nextDelta)) >> 1; + ++param->lineBuf0; + } + + // update K parameter + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + + ++param->lineBuf1; +} + +int crxDecodeLine(CrxBandParam *param) +{ + int length = param->subbandWidth; + + param->lineBuf1[0] = param->lineBuf0[1]; + for (; length > 1; --length) + { + if (param->lineBuf1[0] != param->lineBuf0[1] || + param->lineBuf1[0] != param->lineBuf0[2]) + { + crxDecodeSymbolL1(param, 1, 1); + } + else + { + int nSyms = 0; + if (crxBitstreamGetBits(¶m->bitStream, 1)) + { + nSyms = 1; + while (crxBitstreamGetBits(¶m->bitStream, 1)) + { + nSyms += JS[param->sParam]; + if (nSyms > length) + { + nSyms = length; + break; + } + if (param->sParam < 31) + ++param->sParam; + if (nSyms == length) + break; + } + + if (nSyms < length) + { + if (J[param->sParam]) + nSyms += crxBitstreamGetBits(¶m->bitStream, J[param->sParam]); + if (param->sParam > 0) + --param->sParam; + if (nSyms > length) + return -1; + } + + length -= nSyms; + + // copy symbol nSyms times + param->lineBuf0 += nSyms; + + // copy symbol nSyms times + while (nSyms-- > 0) + { + param->lineBuf1[1] = param->lineBuf1[0]; + ++param->lineBuf1; + } + } + + if (length > 0) + crxDecodeSymbolL1(param, 0, (length > 1)); + } + } + + if (length == 1) + crxDecodeSymbolL1(param, 1, 0); + + param->lineBuf1[1] = param->lineBuf1[0] + 1; + + return 0; +} + +libraw_inline void crxDecodeSymbolL1Rounded(CrxBandParam *param, + int32_t doSym = 1, + int32_t doCode = 1) +{ + int32_t sym = param->lineBuf0[1]; + + if (doSym) + { + // calculate the next symbol gradient + int32_t symb[4]; + int32_t deltaH = param->lineBuf0[1] - param->lineBuf0[0]; + symb[2] = param->lineBuf1[0]; + symb[0] = symb[1] = deltaH + symb[2]; + symb[3] = param->lineBuf0[1]; + sym = + symb[(((param->lineBuf0[0] < param->lineBuf1[0]) ^ (deltaH < 0)) << 1) + + ((param->lineBuf1[0] < param->lineBuf0[1]) ^ (deltaH < 0))]; + } + + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + if (bitCode >= 41) + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + else if (param->kParam) + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | + (bitCode << param->kParam); + int32_t code = -(bitCode & 1) ^ (bitCode >> 1); + param->lineBuf1[1] = param->roundedBitsMask * 2 * code + (code >> 31) + sym; + + if (doCode) + { + if (param->lineBuf0[2] > param->lineBuf0[1]) + code = (param->lineBuf0[2] - param->lineBuf0[1] + param->roundedBitsMask - + 1) >> + param->roundedBits; + else + code = -( + (param->lineBuf0[1] - param->lineBuf0[2] + param->roundedBitsMask) >> + param->roundedBits); + + param->kParam = crxPredictKParameter(param->kParam, + (bitCode + 2 * _abs(code)) >> 1, 15); + } + else + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + + ++param->lineBuf1; +} + +int crxDecodeLineRounded(CrxBandParam *param) +{ + int32_t valueReached = 0; + + param->lineBuf0[0] = param->lineBuf0[1]; + param->lineBuf1[0] = param->lineBuf0[1]; + int32_t length = param->subbandWidth; + + for (; length > 1; --length) + { + if (_abs(param->lineBuf0[2] - param->lineBuf0[1]) > param->roundedBitsMask) + { + crxDecodeSymbolL1Rounded(param); + ++param->lineBuf0; + valueReached = 1; + } + else if (valueReached || _abs(param->lineBuf0[0] - param->lineBuf1[0]) > + param->roundedBitsMask) + { + crxDecodeSymbolL1Rounded(param); + ++param->lineBuf0; + valueReached = 0; + } + else + { + int nSyms = 0; + if (crxBitstreamGetBits(¶m->bitStream, 1)) + { + nSyms = 1; + while (crxBitstreamGetBits(¶m->bitStream, 1)) + { + nSyms += JS[param->sParam]; + if (nSyms > length) + { + nSyms = length; + break; + } + if (param->sParam < 31) + ++param->sParam; + if (nSyms == length) + break; + } + if (nSyms < length) + { + if (J[param->sParam]) + nSyms += crxBitstreamGetBits(¶m->bitStream, J[param->sParam]); + if (param->sParam > 0) + --param->sParam; + } + if (nSyms > length) + return -1; + } + length -= nSyms; + + // copy symbol nSyms times + param->lineBuf0 += nSyms; + + // copy symbol nSyms times + while (nSyms-- > 0) + { + param->lineBuf1[1] = param->lineBuf1[0]; + ++param->lineBuf1; + } + + if (length > 1) + { + crxDecodeSymbolL1Rounded(param, 0); + ++param->lineBuf0; + valueReached = _abs(param->lineBuf0[1] - param->lineBuf0[0]) > + param->roundedBitsMask; + } + else if (length == 1) + crxDecodeSymbolL1Rounded(param, 0, 0); + } + } + if (length == 1) + crxDecodeSymbolL1Rounded(param, 1, 0); + + param->lineBuf1[1] = param->lineBuf1[0] + 1; + + return 0; +} + +int crxDecodeLineNoRefPrevLine(CrxBandParam *param) +{ + int32_t i = 0; + + for (; i < param->subbandWidth - 1; i++) + { + if (param->lineBuf0[i + 2] | param->lineBuf0[i + 1] | param->lineBuf1[i]) + { + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + if (bitCode >= 41) + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + else if (param->kParam) + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | + (bitCode << param->kParam); + param->lineBuf1[i + 1] = -(bitCode & 1) ^ (bitCode >> 1); + param->kParam = crxPredictKParameter(param->kParam, bitCode); + if (param->lineBuf2[i + 1] - param->kParam <= 1) + { + if (param->kParam >= 15) + param->kParam = 15; + } + else + ++param->kParam; + } + else + { + int nSyms = 0; + if (crxBitstreamGetBits(¶m->bitStream, 1)) + { + nSyms = 1; + if (i != param->subbandWidth - 1) + { + while (crxBitstreamGetBits(¶m->bitStream, 1)) + { + nSyms += JS[param->sParam]; + if (i + nSyms > param->subbandWidth) + { + nSyms = param->subbandWidth - i; + break; + } + if (param->sParam < 31) + ++param->sParam; + if (i + nSyms == param->subbandWidth) + break; + } + if (i + nSyms < param->subbandWidth) + { + if (J[param->sParam]) + nSyms += crxBitstreamGetBits(¶m->bitStream, J[param->sParam]); + if (param->sParam > 0) + --param->sParam; + } + if (i + nSyms > param->subbandWidth) + return -1; + } + } + else if (i > param->subbandWidth) + return -1; + + if (nSyms > 0) + { + memset(param->lineBuf1 + i + 1, 0, nSyms * sizeof(int32_t)); + memset(param->lineBuf2 + i, 0, nSyms * sizeof(int32_t)); + i += nSyms; + } + + if (i >= param->subbandWidth - 1) + { + if (i == param->subbandWidth - 1) + { + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + if (bitCode >= 41) + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + else if (param->kParam) + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | + (bitCode << param->kParam); + param->lineBuf1[i + 1] = -((bitCode + 1) & 1) ^ ((bitCode + 1) >> 1); + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + param->lineBuf2[i] = param->kParam; + } + continue; + } + else + { + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + if (bitCode >= 41) + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + else if (param->kParam) + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | + (bitCode << param->kParam); + param->lineBuf1[i + 1] = -((bitCode + 1) & 1) ^ ((bitCode + 1) >> 1); + param->kParam = crxPredictKParameter(param->kParam, bitCode); + if (param->lineBuf2[i + 1] - param->kParam <= 1) + { + if (param->kParam >= 15) + param->kParam = 15; + } + else + ++param->kParam; + } + } + param->lineBuf2[i] = param->kParam; + } + if (i == param->subbandWidth - 1) + { + int32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + if (bitCode >= 41) + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + else if (param->kParam) + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | + (bitCode << param->kParam); + param->lineBuf1[i + 1] = -(bitCode & 1) ^ (bitCode >> 1); + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + param->lineBuf2[i] = param->kParam; + } + + return 0; +} + +int crxDecodeTopLine(CrxBandParam *param) +{ + param->lineBuf1[0] = 0; + + int32_t length = param->subbandWidth; + + // read the line from bitstream + for (; length > 1; --length) + { + if (param->lineBuf1[0]) + param->lineBuf1[1] = param->lineBuf1[0]; + else + { + int nSyms = 0; + if (crxBitstreamGetBits(¶m->bitStream, 1)) + { + nSyms = 1; + while (crxBitstreamGetBits(¶m->bitStream, 1)) + { + nSyms += JS[param->sParam]; + if (nSyms > length) + { + nSyms = length; + break; + } + if (param->sParam < 31) + ++param->sParam; + if (nSyms == length) + break; + } + if (nSyms < length) + { + if (J[param->sParam]) + nSyms += crxBitstreamGetBits(¶m->bitStream, J[param->sParam]); + if (param->sParam > 0) + --param->sParam; + if (nSyms > length) + return -1; + } + + length -= nSyms; + + // copy symbol nSyms times + while (nSyms-- > 0) + { + param->lineBuf1[1] = param->lineBuf1[0]; + ++param->lineBuf1; + } + + if (length <= 0) + break; + } + + param->lineBuf1[1] = 0; + } + + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + if (bitCode >= 41) + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + else if (param->kParam) + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | + (bitCode << param->kParam); + param->lineBuf1[1] += -(bitCode & 1) ^ (bitCode >> 1); + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + ++param->lineBuf1; + } + + if (length == 1) + { + param->lineBuf1[1] = param->lineBuf1[0]; + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + if (bitCode >= 41) + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + else if (param->kParam) + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | + (bitCode << param->kParam); + param->lineBuf1[1] += -(bitCode & 1) ^ (bitCode >> 1); + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + ++param->lineBuf1; + } + + param->lineBuf1[1] = param->lineBuf1[0] + 1; + + return 0; +} + +int crxDecodeTopLineRounded(CrxBandParam *param) +{ + param->lineBuf1[0] = 0; + + int32_t length = param->subbandWidth; + + // read the line from bitstream + for (; length > 1; --length) + { + if (_abs(param->lineBuf1[0]) > param->roundedBitsMask) + param->lineBuf1[1] = param->lineBuf1[0]; + else + { + int nSyms = 0; + if (crxBitstreamGetBits(¶m->bitStream, 1)) + { + nSyms = 1; + while (crxBitstreamGetBits(¶m->bitStream, 1)) + { + nSyms += JS[param->sParam]; + if (nSyms > length) + { + nSyms = length; + break; + } + if (param->sParam < 31) + ++param->sParam; + if (nSyms == length) + break; + } + if (nSyms < length) + { + if (J[param->sParam]) + nSyms += crxBitstreamGetBits(¶m->bitStream, J[param->sParam]); + if (param->sParam > 0) + --param->sParam; + if (nSyms > length) + return -1; + } + } + + length -= nSyms; + + // copy symbol nSyms times + while (nSyms-- > 0) + { + param->lineBuf1[1] = param->lineBuf1[0]; + ++param->lineBuf1; + } + + if (length <= 0) + break; + + param->lineBuf1[1] = 0; + } + + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + if (bitCode >= 41) + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + else if (param->kParam) + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | + (bitCode << param->kParam); + + int32_t sVal = -(bitCode & 1) ^ (bitCode >> 1); + param->lineBuf1[1] += param->roundedBitsMask * 2 * sVal + (sVal >> 31); + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + ++param->lineBuf1; + } + + if (length == 1) + { + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + if (bitCode >= 41) + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + else if (param->kParam) + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | + (bitCode << param->kParam); + int32_t sVal = -(bitCode & 1) ^ (bitCode >> 1); + param->lineBuf1[1] += param->roundedBitsMask * 2 * sVal + (sVal >> 31); + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + ++param->lineBuf1; + } + + param->lineBuf1[1] = param->lineBuf1[0] + 1; + + return 0; +} + +int crxDecodeTopLineNoRefPrevLine(CrxBandParam *param) +{ + param->lineBuf0[0] = 0; + param->lineBuf1[0] = 0; + int32_t length = param->subbandWidth; + for (; length > 1; --length) + { + if (param->lineBuf1[0]) + { + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + if (bitCode >= 41) + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + else if (param->kParam) + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | + (bitCode << param->kParam); + param->lineBuf1[1] = -(bitCode & 1) ^ (bitCode >> 1); + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + } + else + { + int nSyms = 0; + if (crxBitstreamGetBits(¶m->bitStream, 1)) + { + nSyms = 1; + while (crxBitstreamGetBits(¶m->bitStream, 1)) + { + nSyms += JS[param->sParam]; + if (nSyms > length) + { + nSyms = length; + break; + } + if (param->sParam < 31) + ++param->sParam; + if (nSyms == length) + break; + } + if (nSyms < length) + { + if (J[param->sParam]) + nSyms += crxBitstreamGetBits(¶m->bitStream, J[param->sParam]); + if (param->sParam > 0) + --param->sParam; + if (nSyms > length) + return -1; + } + } + + length -= nSyms; + + // copy symbol nSyms times + while (nSyms-- > 0) + { + param->lineBuf2[0] = 0; + param->lineBuf1[1] = 0; + ++param->lineBuf1; + ++param->lineBuf2; + } + + if (length <= 0) + break; + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + if (bitCode >= 41) + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + else if (param->kParam) + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | + (bitCode << param->kParam); + param->lineBuf1[1] = -((bitCode + 1) & 1) ^ ((bitCode + 1) >> 1); + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + } + param->lineBuf2[0] = param->kParam; + ++param->lineBuf2; + ++param->lineBuf1; + } + + if (length == 1) + { + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + if (bitCode >= 41) + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + else if (param->kParam) + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | + (bitCode << param->kParam); + param->lineBuf1[1] = -(bitCode & 1) ^ (bitCode >> 1); + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + param->lineBuf2[0] = param->kParam; + ++param->lineBuf1; + } + + param->lineBuf1[1] = 0; + + return 0; +} + +int crxDecodeLine(CrxBandParam *param, uint8_t *bandBuf) +{ + if (!param || !bandBuf) + return -1; + if (param->curLine >= param->subbandHeight) + return -1; + + if (param->curLine == 0) + { + int32_t lineLength = param->subbandWidth + 2; + + param->sParam = 0; + param->kParam = 0; + if (param->supportsPartial) + { + if (param->roundedBitsMask <= 0) + { + param->lineBuf0 = (int32_t *)param->paramData; + param->lineBuf1 = param->lineBuf0 + lineLength; + int32_t *lineBuf = param->lineBuf1 + 1; + if (crxDecodeTopLine(param)) + return -1; + memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); + ++param->curLine; + } + else + { + param->roundedBits = 1; + if (param->roundedBitsMask & ~1) + { + while (param->roundedBitsMask >> param->roundedBits) + ++param->roundedBits; + } + param->lineBuf0 = (int32_t *)param->paramData; + param->lineBuf1 = param->lineBuf0 + lineLength; + int32_t *lineBuf = param->lineBuf1 + 1; + if (crxDecodeTopLineRounded(param)) + return -1; + memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); + ++param->curLine; + } + } + else + { + param->lineBuf2 = (int32_t *)param->nonProgrData; + param->lineBuf0 = (int32_t *)param->paramData; + param->lineBuf1 = param->lineBuf0 + lineLength; + int32_t *lineBuf = param->lineBuf1 + 1; + if (crxDecodeTopLineNoRefPrevLine(param)) + return -1; + memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); + ++param->curLine; + } + } + else if (!param->supportsPartial) + { + int32_t lineLength = param->subbandWidth + 2; + param->lineBuf2 = (int32_t *)param->nonProgrData; + if (param->curLine & 1) + { + param->lineBuf1 = (int32_t *)param->paramData; + param->lineBuf0 = param->lineBuf1 + lineLength; + } + else + { + param->lineBuf0 = (int32_t *)param->paramData; + param->lineBuf1 = param->lineBuf0 + lineLength; + } + int32_t *lineBuf = param->lineBuf1 + 1; + if (crxDecodeLineNoRefPrevLine(param)) + return -1; + memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); + ++param->curLine; + } + else if (param->roundedBitsMask <= 0) + { + int32_t lineLength = param->subbandWidth + 2; + if (param->curLine & 1) + { + param->lineBuf1 = (int32_t *)param->paramData; + param->lineBuf0 = param->lineBuf1 + lineLength; + } + else + { + param->lineBuf0 = (int32_t *)param->paramData; + param->lineBuf1 = param->lineBuf0 + lineLength; + } + int32_t *lineBuf = param->lineBuf1 + 1; + if (crxDecodeLine(param)) + return -1; + memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); + ++param->curLine; + } + else + { + int32_t lineLength = param->subbandWidth + 2; + if (param->curLine & 1) + { + param->lineBuf1 = (int32_t *)param->paramData; + param->lineBuf0 = param->lineBuf1 + lineLength; + } + else + { + param->lineBuf0 = (int32_t *)param->paramData; + param->lineBuf1 = param->lineBuf0 + lineLength; + } + int32_t *lineBuf = param->lineBuf1 + 1; + if (crxDecodeLineRounded(param)) + return -1; + memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); + ++param->curLine; + } + return 0; +} + +int crxDecodeLineWithIQuantization(CrxSubband *subband) +{ + int32_t q_step_tbl[6] = {0x28, 0x2D, 0x33, 0x39, 0x40, 0x48}; + + if (!subband->dataSize) + { + memset(subband->bandBuf, 0, subband->bandSize); + return 0; + } + + if (subband->supportsPartial) + { + uint32_t bitCode = crxBitstreamGetZeros(&subband->bandParam->bitStream); + if (bitCode >= 23) + bitCode = crxBitstreamGetBits(&subband->bandParam->bitStream, 8); + else if (subband->paramK) + bitCode = + crxBitstreamGetBits(&subband->bandParam->bitStream, subband->paramK) | + (bitCode << subband->paramK); + + subband->quantValue += + -(bitCode & 1) ^ (bitCode >> 1); // converting encoded to signed integer + subband->paramK = crxPredictKParameter(subband->paramK, bitCode); + if (subband->paramK > 7) + return -1; + } + if (crxDecodeLine(subband->bandParam, subband->bandBuf)) + return -1; + + if (subband->width <= 0) + return 0LL; + + // update subband buffers + int32_t *bandBuf = (int32_t *)subband->bandBuf; + int32_t qScale = + q_step_tbl[subband->quantValue % 6] >> (6 - subband->quantValue / 6); + if (subband->quantValue / 6 >= 6) + qScale = q_step_tbl[subband->quantValue % 6] * + (1 << (subband->quantValue / 6 + 26)); + + if (qScale != 1) + for (int32_t i = 0; i < subband->width; i++) + bandBuf[i] *= qScale; + + return 0; +} + +void crxHorizontal53(int32_t *lineBufLA, int32_t *lineBufLB, + CrxWaveletTransform *wavelet, uint32_t tileFlag) +{ + int32_t *band0Buf = wavelet->subband0Buf; + int32_t *band1Buf = wavelet->subband1Buf; + int32_t *band2Buf = wavelet->subband2Buf; + int32_t *band3Buf = wavelet->subband3Buf; + + if (wavelet->width <= 1) + { + lineBufLA[0] = band0Buf[0]; + lineBufLB[0] = band2Buf[0]; + } + else + { + if (tileFlag & E_HAS_TILES_ON_THE_LEFT) + { + lineBufLA[0] = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufLB[0] = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + ++band1Buf; + ++band3Buf; + } + else + { + lineBufLA[0] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + lineBufLB[0] = band2Buf[0] - ((band3Buf[0] + 1) >> 1); + } + ++band0Buf; + ++band2Buf; + + for (int i = 0; i < wavelet->width - 3; i += 2) + { + int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufLA[1] = band1Buf[0] + ((delta + lineBufLA[0]) >> 1); + lineBufLA[2] = delta; + + delta = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + lineBufLB[1] = band3Buf[0] + ((delta + lineBufLB[0]) >> 1); + lineBufLB[2] = delta; + + ++band0Buf; + ++band1Buf; + ++band2Buf; + ++band3Buf; + lineBufLA += 2; + lineBufLB += 2; + } + if (tileFlag & E_HAS_TILES_ON_THE_RIGHT) + { + int32_t deltaA = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufLA[1] = band1Buf[0] + ((deltaA + lineBufLA[0]) >> 1); + + int32_t deltaB = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + lineBufLB[1] = band3Buf[0] + ((deltaB + lineBufLB[0]) >> 1); + + if (wavelet->width & 1) + { + lineBufLA[2] = deltaA; + lineBufLB[2] = deltaB; + } + } + else if (wavelet->width & 1) + { + lineBufLA[1] = + band1Buf[0] + + ((lineBufLA[0] + band0Buf[0] - ((band1Buf[0] + 1) >> 1)) >> 1); + lineBufLA[2] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + + lineBufLB[1] = + band3Buf[0] + + ((lineBufLB[0] + band2Buf[0] - ((band3Buf[0] + 1) >> 1)) >> 1); + lineBufLB[2] = band2Buf[0] - ((band3Buf[0] + 1) >> 1); + } + else + { + lineBufLA[1] = lineBufLA[0] + band1Buf[0]; + lineBufLB[1] = lineBufLB[0] + band3Buf[0]; + } + } +} + +int32_t *crxIdwt53FilterGetLine(CrxPlaneComp *comp, int32_t level) +{ + int32_t *result = comp->waveletTransform[level] + .lineBuf[(comp->waveletTransform[level].fltTapH - + comp->waveletTransform[level].curH + 5) % + 5 + + 3]; + comp->waveletTransform[level].curH--; + return result; +} + +int crxIdwt53FilterDecode(CrxPlaneComp *comp, int32_t level) +{ + if (comp->waveletTransform[level].curH) + return 0; + + CrxSubband *sband = comp->subBands + 3 * level; + + if (comp->waveletTransform[level].height - 3 <= + comp->waveletTransform[level].curLine && + !(comp->tileFlag & E_HAS_TILES_ON_THE_BOTTOM)) + { + if (comp->waveletTransform[level].height & 1) + { + if (level) + { + if (crxIdwt53FilterDecode(comp, level - 1)) + return -1; + } + else if (crxDecodeLineWithIQuantization(sband)) + return -1; + + if (crxDecodeLineWithIQuantization(sband + 1)) + return -1; + } + } + else + { + if (level) + { + if (crxIdwt53FilterDecode(comp, level - 1)) + return -1; + } + else if (crxDecodeLineWithIQuantization(sband)) // LL band + return -1; + + if (crxDecodeLineWithIQuantization(sband + 1) || // HL band + crxDecodeLineWithIQuantization(sband + 2) || // LH band + crxDecodeLineWithIQuantization(sband + 3)) // HH band + return -1; + } + + return 0; +} + +int crxIdwt53FilterTransform(CrxPlaneComp *comp, uint32_t level) +{ + CrxWaveletTransform *wavelet = comp->waveletTransform + level; + + if (wavelet->curH) + return 0; + + if (wavelet->curLine >= wavelet->height - 3) + { + if (!(comp->tileFlag & E_HAS_TILES_ON_THE_BOTTOM)) + { + if (wavelet->height & 1) + { + if (level) + { + if (!wavelet[-1].curH) + if (crxIdwt53FilterTransform(comp, level - 1)) + return -1; + wavelet->subband0Buf = crxIdwt53FilterGetLine(comp, level - 1); + } + int32_t *band0Buf = wavelet->subband0Buf; + int32_t *band1Buf = wavelet->subband1Buf; + int32_t *lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; + int32_t *lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; + int32_t *lineBufH2 = wavelet->lineBuf[(wavelet->fltTapH + 2) % 5 + 3]; + + int32_t *lineBufL0 = wavelet->lineBuf[0]; + int32_t *lineBufL1 = wavelet->lineBuf[1]; + wavelet->lineBuf[1] = wavelet->lineBuf[2]; + wavelet->lineBuf[2] = lineBufL1; + + // process L bands + if (wavelet->width <= 1) + { + lineBufL0[0] = band0Buf[0]; + } + else + { + if (comp->tileFlag & E_HAS_TILES_ON_THE_LEFT) + { + lineBufL0[0] = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + ++band1Buf; + } + else + { + lineBufL0[0] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + } + ++band0Buf; + for (int i = 0; i < wavelet->width - 3; i += 2) + { + int32_t delta = + band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufL0[1] = band1Buf[0] + ((lineBufL0[0] + delta) >> 1); + lineBufL0[2] = delta; + ++band0Buf; + ++band1Buf; + lineBufL0 += 2; + } + if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) + { + int32_t delta = + band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufL0[1] = band1Buf[0] + ((lineBufL0[0] + delta) >> 1); + if (wavelet->width & 1) + lineBufL0[2] = delta; + } + else if (wavelet->width & 1) + { + int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + lineBufL0[1] = band1Buf[0] + ((lineBufL0[0] + delta) >> 1); + lineBufL0[2] = delta; + } + else + lineBufL0[1] = band1Buf[0] + lineBufL0[0]; + } + + // process H bands + lineBufL0 = wavelet->lineBuf[0]; + lineBufL1 = wavelet->lineBuf[1]; + for (int32_t i = 0; i < wavelet->width; i++) + { + int32_t delta = lineBufL0[i] - ((lineBufL1[i] + 1) >> 1); + lineBufH1[i] = lineBufL1[i] + ((delta + lineBufH0[i]) >> 1); + lineBufH2[i] = delta; + } + wavelet->curH += 3; + wavelet->curLine += 3; + wavelet->fltTapH = (wavelet->fltTapH + 3) % 5; + } + else + { + int32_t *lineBufL2 = wavelet->lineBuf[2]; + int32_t *lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; + int32_t *lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; + wavelet->lineBuf[1] = lineBufL2; + wavelet->lineBuf[2] = wavelet->lineBuf[1]; + + for (int32_t i = 0; i < wavelet->width; i++) + lineBufH1[i] = lineBufH0[i] + lineBufL2[i]; + + wavelet->curH += 2; + wavelet->curLine += 2; + wavelet->fltTapH = (wavelet->fltTapH + 2) % 5; + } + } + } + else + { + if (level) + { + if (!wavelet[-1].curH && crxIdwt53FilterTransform(comp, level - 1)) + return -1; + wavelet->subband0Buf = crxIdwt53FilterGetLine(comp, level - 1); + } + + int32_t *band0Buf = wavelet->subband0Buf; + int32_t *band1Buf = wavelet->subband1Buf; + int32_t *band2Buf = wavelet->subband2Buf; + int32_t *band3Buf = wavelet->subband3Buf; + + int32_t *lineBufL0 = wavelet->lineBuf[0]; + int32_t *lineBufL1 = wavelet->lineBuf[1]; + int32_t *lineBufL2 = wavelet->lineBuf[2]; + int32_t *lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; + int32_t *lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; + int32_t *lineBufH2 = wavelet->lineBuf[(wavelet->fltTapH + 2) % 5 + 3]; + + wavelet->lineBuf[1] = wavelet->lineBuf[2]; + wavelet->lineBuf[2] = lineBufL1; + + // process L bands + if (wavelet->width <= 1) + { + lineBufL0[0] = band0Buf[0]; + lineBufL1[0] = band2Buf[0]; + } + else + { + if (comp->tileFlag & E_HAS_TILES_ON_THE_LEFT) + { + lineBufL0[0] = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufL1[0] = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + ++band1Buf; + ++band3Buf; + } + else + { + lineBufL0[0] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + lineBufL1[0] = band2Buf[0] - ((band3Buf[0] + 1) >> 1); + } + ++band0Buf; + ++band2Buf; + for (int i = 0; i < wavelet->width - 3; i += 2) + { + int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufL0[1] = band1Buf[0] + ((delta + lineBufL0[0]) >> 1); + lineBufL0[2] = delta; + + delta = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + lineBufL1[1] = band3Buf[0] + ((delta + lineBufL1[0]) >> 1); + lineBufL1[2] = delta; + + ++band0Buf; + ++band1Buf; + ++band2Buf; + ++band3Buf; + lineBufL0 += 2; + lineBufL1 += 2; + } + if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) + { + int32_t deltaA = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufL0[1] = band1Buf[0] + ((deltaA + lineBufL0[0]) >> 1); + + int32_t deltaB = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + lineBufL1[1] = band3Buf[0] + ((deltaB + lineBufL1[0]) >> 1); + + if (wavelet->width & 1) + { + lineBufL0[2] = deltaA; + lineBufL1[2] = deltaB; + } + } + else if (wavelet->width & 1) + { + int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + lineBufL0[1] = band1Buf[0] + ((delta + lineBufL0[0]) >> 1); + lineBufL0[2] = delta; + + delta = band2Buf[0] - ((band3Buf[0] + 1) >> 1); + lineBufL1[1] = band3Buf[0] + ((delta + lineBufL1[0]) >> 1); + lineBufL1[2] = delta; + } + else + { + lineBufL0[1] = lineBufL0[0] + band1Buf[0]; + lineBufL1[1] = lineBufL1[0] + band3Buf[0]; + } + } + + // process H bands + lineBufL0 = wavelet->lineBuf[0]; + lineBufL1 = wavelet->lineBuf[1]; + lineBufL2 = wavelet->lineBuf[2]; + for (int32_t i = 0; i < wavelet->width; i++) + { + int32_t delta = lineBufL0[i] - ((lineBufL2[i] + lineBufL1[i] + 2) >> 2); + lineBufH1[i] = lineBufL1[i] + ((delta + lineBufH0[i]) >> 1); + lineBufH2[i] = delta; + } + if (wavelet->curLine >= wavelet->height - 3 && wavelet->height & 1) + { + wavelet->curH += 3; + wavelet->curLine += 3; + wavelet->fltTapH = (wavelet->fltTapH + 3) % 5; + } + else + { + wavelet->curH += 2; + wavelet->curLine += 2; + wavelet->fltTapH = (wavelet->fltTapH + 2) % 5; + } + } + + return 0; +} + +int crxIdwt53FilterInitialize(CrxPlaneComp *comp, int32_t prevLevel) +{ + if (prevLevel < 0) + return 0; + + for (int curLevel = 0, curBand = 0; curLevel < prevLevel + 1; + curLevel++, curBand += 3) + { + CrxWaveletTransform *wavelet = comp->waveletTransform + curLevel; + if (curLevel) + wavelet[0].subband0Buf = crxIdwt53FilterGetLine(comp, curLevel - 1); + else if (crxDecodeLineWithIQuantization(comp->subBands + curBand)) + return -1; + + int32_t *lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; + if (wavelet->height > 1) + { + if (crxDecodeLineWithIQuantization(comp->subBands + curBand + 1) || + crxDecodeLineWithIQuantization(comp->subBands + curBand + 2) || + crxDecodeLineWithIQuantization(comp->subBands + curBand + 3)) + return -1; + + int32_t *lineBufL0 = wavelet->lineBuf[0]; + int32_t *lineBufL1 = wavelet->lineBuf[1]; + int32_t *lineBufL2 = wavelet->lineBuf[2]; + + if (comp->tileFlag & E_HAS_TILES_ON_THE_TOP) + { + crxHorizontal53(lineBufL0, wavelet->lineBuf[1], wavelet, + comp->tileFlag); + if (crxDecodeLineWithIQuantization(comp->subBands + curBand + 3) || + crxDecodeLineWithIQuantization(comp->subBands + curBand + 2)) + return -1; + + int32_t *band2Buf = wavelet->subband2Buf; + int32_t *band3Buf = wavelet->subband3Buf; + + // process L band + if (wavelet->width <= 1) + lineBufL2[0] = band2Buf[0]; + else + { + if (comp->tileFlag & E_HAS_TILES_ON_THE_LEFT) + { + lineBufL2[0] = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + ++band3Buf; + } + else + lineBufL2[0] = band2Buf[0] - ((band3Buf[0] + 1) >> 1); + + ++band2Buf; + + for (int i = 0; i < wavelet->width - 3; i += 2) + { + int32_t delta = + band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + lineBufL2[1] = band3Buf[0] + ((lineBufL2[0] + delta) >> 1); + lineBufL2[2] = delta; + + ++band2Buf; + ++band3Buf; + lineBufL2 += 2; + } + if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) + { + int32_t delta = + band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + lineBufL2[1] = band3Buf[0] + ((lineBufL2[0] + delta) >> 1); + if (wavelet->width & 1) + lineBufL2[2] = delta; + } + else if (wavelet->width & 1) + { + int32_t delta = band2Buf[0] - ((band3Buf[0] + 1) >> 1); + + lineBufL2[1] = band3Buf[0] + ((lineBufL2[0] + delta) >> 1); + lineBufL2[2] = delta; + } + else + { + lineBufL2[1] = band3Buf[0] + lineBufL2[0]; + } + } + + // process H band + for (int32_t i = 0; i < wavelet->width; i++) + lineBufH0[i] = + lineBufL0[i] - ((lineBufL1[i] + lineBufL2[i] + 2) >> 2); + } + else + { + crxHorizontal53(lineBufL0, wavelet->lineBuf[2], wavelet, + comp->tileFlag); + for (int i = 0; i < wavelet->width; i++) + lineBufH0[i] = lineBufL0[i] - ((lineBufL2[i] + 1) >> 1); + } + + if (crxIdwt53FilterDecode(comp, curLevel) || + crxIdwt53FilterTransform(comp, curLevel)) + return -1; + } + else + { + if (crxDecodeLineWithIQuantization(comp->subBands + curBand + 1)) + return -1; + + int32_t *band0Buf = wavelet->subband0Buf; + int32_t *band1Buf = wavelet->subband1Buf; + + // process H band + if (wavelet->width <= 1) + lineBufH0[0] = band0Buf[0]; + else + { + if (comp->tileFlag & E_HAS_TILES_ON_THE_LEFT) + { + lineBufH0[0] = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + ++band1Buf; + } + else + lineBufH0[0] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + + ++band0Buf; + + for (int i = 0; i < wavelet->width - 3; i += 2) + { + int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufH0[1] = band1Buf[0] + ((lineBufH0[0] + delta) >> 1); + lineBufH0[2] = delta; + + ++band0Buf; + ++band1Buf; + lineBufH0 += 2; + } + + if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) + { + int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufH0[1] = band1Buf[0] + ((lineBufH0[0] + delta) >> 1); + lineBufH0[2] = delta; + } + else if (wavelet->width & 1) + { + int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + lineBufH0[1] = band1Buf[0] + ((lineBufH0[0] + delta) >> 1); + lineBufH0[2] = delta; + } + else + { + lineBufH0[1] = band1Buf[0] + lineBufH0[0]; + } + } + ++wavelet->curLine; + ++wavelet->curH; + wavelet->fltTapH = (wavelet->fltTapH + 1) % 5; + } + } + + return 0; +} + +void crxFreeSubbandData(CrxImage *image, CrxPlaneComp *comp) +{ + if (comp->compBuf) + { + free(comp->compBuf); + comp->compBuf = 0; + } + + if (!comp->subBands) + return; + + for (int32_t i = 0; i < image->subbandCount; i++) + { + if (comp->subBands[i].bandParam) + { + free(comp->subBands[i].bandParam); + comp->subBands[i].bandParam = 0LL; + } + comp->subBands[i].bandBuf = 0; + comp->subBands[i].bandSize = 0; + } +} + +void crxConvertPlaneLine(CrxImage *img, int imageRow, int imageCol = 0, + int plane = 0, int32_t *lineData = 0, + int lineLength = 0) +{ + if (lineData) + { + uint64_t rawOffset = 4 * img->planeWidth * imageRow + 2 * imageCol; + if (img->encType == 1) + { + int32_t maxVal = 1 << (img->nBits - 1); + int32_t minVal = -maxVal; + --maxVal; + for (int i = 0; i < lineLength; i++) + img->outBufs[plane][rawOffset + 2 * i] = + _constrain(lineData[i], minVal, maxVal); + } + else if (img->encType == 3) + { + // copy to intermediate planeBuf + rawOffset = plane * img->planeWidth * img->planeHeight + + img->planeWidth * imageRow + imageCol; + for (int i = 0; i < lineLength; i++) + img->planeBuf[rawOffset + i] = lineData[i]; + } + else if (img->nPlanes == 4) + { + int32_t median = 1 << (img->nBits - 1); + int32_t maxVal = (1 << img->nBits) - 1; + for (int i = 0; i < lineLength; i++) + img->outBufs[plane][rawOffset + 2 * i] = + _constrain(median + lineData[i], 0, maxVal); + } + else if (img->nPlanes == 1) + { + int32_t maxVal = (1 << img->nBits) - 1; + int32_t median = 1 << (img->nBits - 1); + rawOffset = img->planeWidth * imageRow + imageCol; + for (int i = 0; i < lineLength; i++) + img->outBufs[0][rawOffset + i] = + _constrain(median + lineData[i], 0, maxVal); + } + } + else if (img->encType == 3 && img->planeBuf) + { + int32_t planeSize = img->planeWidth * img->planeHeight; + int16_t *plane0 = img->planeBuf + imageRow * img->planeWidth; + int16_t *plane1 = plane0 + planeSize; + int16_t *plane2 = plane1 + planeSize; + int16_t *plane3 = plane2 + planeSize; + + int32_t median = 1 << (img->nBits - 1) << 10; + int32_t maxVal = (1 << img->nBits) - 1; + uint32_t rawLineOffset = 4 * img->planeWidth * imageRow; + + // for this stage - all except imageRow is ignored + for (int i = 0; i < img->planeWidth; i++) + { + int32_t gr = + median + (plane0[i] << 10) - 168 * plane1[i] - 585 * plane3[i]; + int32_t val = 0; + if (gr < 0) + gr = -(((_abs(gr) + 512) >> 9) & ~1); + else + gr = ((_abs(gr) + 512) >> 9) & ~1; + + // Essentially R = round(median + P0 + 1.474*P3) + val = (median + (plane0[i] << 10) + 1510 * plane3[i] + 512) >> 10; + img->outBufs[0][rawLineOffset + 2 * i] = _constrain(val, 0, maxVal); + // Essentially G1 = round(median + P0 + P2 - 0.164*P1 - 0.571*P3) + val = (plane2[i] + gr + 1) >> 1; + img->outBufs[1][rawLineOffset + 2 * i] = _constrain(val, 0, maxVal); + // Essentially G1 = round(median + P0 - P2 - 0.164*P1 - 0.571*P3) + val = (gr - plane2[i] + 1) >> 1; + img->outBufs[2][rawLineOffset + 2 * i] = _constrain(val, 0, maxVal); + // Essentially B = round(median + P0 + 1.881*P1) + val = (median + (plane0[i] << 10) + 1927 * plane1[i] + 512) >> 10; + img->outBufs[3][rawLineOffset + 2 * i] = _constrain(val, 0, maxVal); + } + } +} + +int crxParamInit(CrxBandParam **param, uint64_t subbandMdatOffset, + uint64_t subbandDataSize, uint32_t subbandWidth, + uint32_t subbandHeight, int32_t supportsPartial, + uint32_t roundedBitsMask, LibRaw_abstract_datastream *input) +{ + int32_t progrDataSize = supportsPartial ? 0 : sizeof(int32_t) * subbandWidth; + int32_t paramLength = 2 * subbandWidth + 4; + uint8_t *paramBuf = (uint8_t *)calloc( + 1, sizeof(CrxBandParam) + sizeof(int32_t) * paramLength + progrDataSize); + + if (!paramBuf) + return -1; + + *param = (CrxBandParam *)paramBuf; + + paramBuf += sizeof(CrxBandParam); + + (*param)->paramData = (int32_t *)paramBuf; + (*param)->nonProgrData = + progrDataSize ? (*param)->paramData + paramLength : 0; + (*param)->subbandWidth = subbandWidth; + (*param)->subbandHeight = subbandHeight; + (*param)->roundedBits = 0; + (*param)->curLine = 0; + (*param)->roundedBitsMask = roundedBitsMask; + (*param)->supportsPartial = supportsPartial; + (*param)->bitStream.bitData = 0; + (*param)->bitStream.bitsLeft = 0; + (*param)->bitStream.mdatSize = subbandDataSize; + (*param)->bitStream.curPos = 0; + (*param)->bitStream.curBufSize = 0; + (*param)->bitStream.curBufOffset = subbandMdatOffset; + (*param)->bitStream.input = input; + + crxFillBuffer(&(*param)->bitStream); + + return 0; +} + +int crxSetupSubbandData(CrxImage *img, CrxPlaneComp *planeComp, + const CrxTile *tile, uint32_t mdatOffset) +{ + long compDataSize = 0; + long waveletDataOffset = 0; + long compCoeffDataOffset = 0; + int32_t toSubbands = 3 * img->levels + 1; + int32_t transformWidth = 0; + + CrxSubband *subbands = planeComp->subBands; + + // calculate sizes + for (int32_t subbandNum = 0; subbandNum < toSubbands; subbandNum++) + { + subbands[subbandNum].bandSize = + subbands[subbandNum].width * sizeof(int32_t); // 4bytes + compDataSize += subbands[subbandNum].bandSize; + } + + if (img->levels) + { + int32_t encLevels = img->levels ? img->levels : 1; + waveletDataOffset = (compDataSize + 7) & ~7; + compDataSize = + (sizeof(CrxWaveletTransform) * encLevels + waveletDataOffset + 7) & ~7; + compCoeffDataOffset = compDataSize; + + // calc wavelet line buffer sizes (always at one level up from current) + for (int level = 0; level < img->levels; ++level) + if (level < img->levels - 1) + compDataSize += 8 * sizeof(int32_t) * + planeComp->subBands[3 * (level + 1) + 2].width; + else + compDataSize += 8 * sizeof(int32_t) * tile->width; + } + + // buffer allocation + planeComp->compBuf = (uint8_t *)malloc(compDataSize); + if (!planeComp->compBuf) + return -1; + + // subbands buffer and sizes initialisation + uint64_t subbandMdatOffset = img->mdatOffset + mdatOffset; + uint8_t *subbandBuf = planeComp->compBuf; + + for (int32_t subbandNum = 0; subbandNum < toSubbands; subbandNum++) + { + subbands[subbandNum].bandBuf = subbandBuf; + subbandBuf += subbands[subbandNum].bandSize; + subbands[subbandNum].mdatOffset = + subbandMdatOffset + subbands[subbandNum].dataOffset; + } + + // wavelet data initialisation + if (img->levels) + { + CrxWaveletTransform *waveletTransforms = + (CrxWaveletTransform *)(planeComp->compBuf + waveletDataOffset); + int32_t *paramData = (int32_t *)(planeComp->compBuf + compCoeffDataOffset); + + planeComp->waveletTransform = waveletTransforms; + waveletTransforms[0].subband0Buf = (int32_t *)subbands->bandBuf; + + for (int level = 0; level < img->levels; ++level) + { + int32_t band = 3 * level + 1; + + if (level >= img->levels - 1) + { + waveletTransforms[level].height = tile->height; + transformWidth = tile->width; + } + else + { + waveletTransforms[level].height = subbands[band + 3].height; + transformWidth = subbands[band + 4].width; + } + waveletTransforms[level].width = transformWidth; + waveletTransforms[level].lineBuf[0] = paramData; + waveletTransforms[level].lineBuf[1] = + waveletTransforms[level].lineBuf[0] + transformWidth; + waveletTransforms[level].lineBuf[2] = + waveletTransforms[level].lineBuf[1] + transformWidth; + waveletTransforms[level].lineBuf[3] = + waveletTransforms[level].lineBuf[2] + transformWidth; + waveletTransforms[level].lineBuf[4] = + waveletTransforms[level].lineBuf[3] + transformWidth; + waveletTransforms[level].lineBuf[5] = + waveletTransforms[level].lineBuf[4] + transformWidth; + waveletTransforms[level].lineBuf[6] = + waveletTransforms[level].lineBuf[5] + transformWidth; + waveletTransforms[level].lineBuf[7] = + waveletTransforms[level].lineBuf[6] + transformWidth; + waveletTransforms[level].curLine = 0; + waveletTransforms[level].curH = 0; + waveletTransforms[level].fltTapH = 0; + waveletTransforms[level].subband1Buf = (int32_t *)subbands[band].bandBuf; + waveletTransforms[level].subband2Buf = + (int32_t *)subbands[band + 1].bandBuf; + waveletTransforms[level].subband3Buf = + (int32_t *)subbands[band + 2].bandBuf; + + paramData = waveletTransforms[level].lineBuf[7] + transformWidth; + } + } + + // decoding params and bitstream initialisation + for (int32_t subbandNum = 0; subbandNum < toSubbands; subbandNum++) + { + if (subbands[subbandNum].dataSize) + { + int32_t supportsPartial = 0; + uint32_t roundedBitsMask = 0; + + if (planeComp->supportsPartial && subbandNum == 0) + { + roundedBitsMask = planeComp->roundedBitsMask; + supportsPartial = 1; + } + if (crxParamInit(&subbands[subbandNum].bandParam, + subbands[subbandNum].mdatOffset, + subbands[subbandNum].dataSize, + subbands[subbandNum].width, subbands[subbandNum].height, + supportsPartial, roundedBitsMask, img->input)) + return -1; + } + } + + return 0; +} + +} // namespace + + +int DCraw::crxDecodePlane(void *p, uint32_t planeNumber) +{ + CrxImage *img = (CrxImage *)p; + int imageRow = 0; + for (int tRow = 0; tRow < img->tileRows; tRow++) + { + int imageCol = 0; + for (int tCol = 0; tCol < img->tileCols; tCol++) + { + CrxTile *tile = img->tiles + tRow * img->tileRows + tCol; + CrxPlaneComp *planeComp = tile->comps + planeNumber; + uint64_t tileMdatOffset = tile->dataOffset + planeComp->dataOffset; + + // decode single tile + if (crxSetupSubbandData(img, planeComp, tile, tileMdatOffset)) + return -1; + + if (img->levels) + { + if (crxIdwt53FilterInitialize(planeComp, img->levels - 1)) + return -1; + for (int i = 0; i < tile->height; ++i) + { + if (crxIdwt53FilterDecode(planeComp, img->levels - 1) || + crxIdwt53FilterTransform(planeComp, img->levels - 1)) + return -1; + int32_t *lineData = + crxIdwt53FilterGetLine(planeComp, img->levels - 1); + crxConvertPlaneLine(img, imageRow + i, imageCol, planeNumber, + lineData, tile->width); + } + } + else + { + // we have the only subband in this case + if (!planeComp->subBands->dataSize) + { + memset(planeComp->subBands->bandBuf, 0, + planeComp->subBands->bandSize); + return 0; + } + + for (int i = 0; i < tile->height; ++i) + { + if (crxDecodeLine(planeComp->subBands->bandParam, + planeComp->subBands->bandBuf)) + return -1; + int32_t *lineData = (int32_t *)planeComp->subBands->bandBuf; + crxConvertPlaneLine(img, imageRow + i, imageCol, planeNumber, + lineData, tile->width); + } + } + imageCol += tile->width; + } + imageRow += img->tiles[tRow * img->tileRows].height; + } + + return 0; +} + + +namespace { + +typedef DCraw::CanonCR3Data::crx_data_header_t crx_data_header_t; + + +int crxReadSubbandHeaders(crx_data_header_t *hdr, CrxImage *img, CrxTile *tile, + CrxPlaneComp *comp, uint8_t **subbandMdatPtr, + uint32_t *mdatSize) +{ + CrxSubband *band = comp->subBands + img->subbandCount - 1; // set to last band + uint32_t bandHeight = tile->height; + uint32_t bandWidth = tile->width; + int32_t bandWidthExCoef = 0; + int32_t bandHeightExCoef = 0; + if (img->levels) + { + // Build up subband sequences to crxDecode to a level in a header + + // Coefficient structure is a bit unclear and convoluted: + // 3 levels max - 8 groups (for tile width rounded to 8 bytes) + // of 3 band per level 4 sets of coefficients for each + int32_t *rowExCoef = + exCoefNumTbl + 0x60 * (img->levels - 1) + 12 * (tile->width & 7); + int32_t *colExCoef = + exCoefNumTbl + 0x60 * (img->levels - 1) + 12 * (tile->height & 7); + for (int level = 0; level < img->levels; ++level) + { + int32_t widthOddPixel = bandWidth & 1; + int32_t heightOddPixel = bandHeight & 1; + bandWidth = (widthOddPixel + bandWidth) >> 1; + bandHeight = (heightOddPixel + bandHeight) >> 1; + + int32_t bandWidthExCoef0 = 0; + int32_t bandWidthExCoef1 = 0; + int32_t bandHeightExCoef0 = 0; + int32_t bandHeightExCoef1 = 0; + if (tile->tileFlag & E_HAS_TILES_ON_THE_RIGHT) + { + bandWidthExCoef0 = rowExCoef[0]; + bandWidthExCoef1 = rowExCoef[1]; + } + if (tile->tileFlag & E_HAS_TILES_ON_THE_LEFT) + ++bandWidthExCoef0; + if (tile->tileFlag & E_HAS_TILES_ON_THE_BOTTOM) + { + bandHeightExCoef0 = colExCoef[0]; + bandHeightExCoef1 = colExCoef[1]; + } + if (tile->tileFlag & E_HAS_TILES_ON_THE_TOP) + ++bandHeightExCoef0; + + band[0].width = bandWidth + bandWidthExCoef0 - widthOddPixel; + band[0].height = bandHeight + bandHeightExCoef0 - heightOddPixel; + + band[-1].width = bandWidth + bandWidthExCoef1; + band[-1].height = bandHeight + bandHeightExCoef0 - heightOddPixel; + + band[-2].width = bandWidth + bandWidthExCoef0 - widthOddPixel; + band[-2].height = bandHeight + bandHeightExCoef1; + + rowExCoef += 4; + colExCoef += 4; + band -= 3; + } + bandWidthExCoef = bandHeightExCoef = 0; + if (tile->tileFlag & E_HAS_TILES_ON_THE_RIGHT) + bandWidthExCoef = + exCoefNumTbl[0x60 * (img->levels - 1) + 12 * (tile->width & 7) + + 4 * (img->levels - 1) + 1]; + if (tile->tileFlag & E_HAS_TILES_ON_THE_BOTTOM) + bandHeightExCoef = + exCoefNumTbl[0x60 * (img->levels - 1) + 12 * (tile->height & 7) + + 4 * (img->levels - 1) + 1]; + } + band->width = bandWidthExCoef + bandWidth; + band->height = bandHeightExCoef + bandHeight; + + if (!img->subbandCount) + return 0; + int32_t curSubband = 0; + int32_t subbandOffset = 0; + band = comp->subBands; + for (int curSubband = 0; curSubband < img->subbandCount; curSubband++, band++) + { + if (*mdatSize < 0xC) + return -1; + + if (sgetn(2, *subbandMdatPtr) != 0xFF03) + return -1; + + uint32_t bitData = sgetn(4, *subbandMdatPtr + 8); + uint32_t subbandSize = sgetn(4, *subbandMdatPtr + 4); + + if (curSubband != bitData >> 28) + { + band->dataSize = subbandSize; + return -1; + } + band->dataSize = subbandSize - (bitData & 0x7FF); + band->supportsPartial = bitData & 0x8000 ? 1 : 0; + band->dataOffset = subbandOffset; + band->quantValue = (bitData >> 19) & 0xFF; + band->paramK = 0; + band->bandParam = 0; + band->bandBuf = 0; + band->bandSize = 0; + + subbandOffset += subbandSize; + + *subbandMdatPtr += 0xC; + *mdatSize -= 0xC; + } + return 0; +} + +int crxReadImageHeaders(crx_data_header_t *hdr, CrxImage *img, uint8_t *mdatPtr, + uint32_t mdatSize) +{ + int nTiles = img->tileRows * img->tileCols; + + if (!nTiles) + return -1; + + if (!img->tiles) + { + img->tiles = (CrxTile *)malloc( + sizeof(CrxTile) * nTiles + + sizeof(CrxPlaneComp) * nTiles * img->nPlanes + + sizeof(CrxSubband) * nTiles * img->nPlanes * img->subbandCount); + if (!img->tiles) + return -1; + + // memory areas in allocated chunk + CrxTile *tile = img->tiles; + CrxPlaneComp *comps = (CrxPlaneComp *)(tile + nTiles); + CrxSubband *bands = (CrxSubband *)(comps + img->nPlanes * nTiles); + + for (int curTile = 0; curTile < nTiles; curTile++, tile++) + { + tile->tileFlag = 0; // tile neighbouring flags + tile->tileNumber = curTile; + tile->tileSize = 0; + tile->comps = comps + curTile * img->nPlanes; + + if ((curTile + 1) % img->tileCols) + { + // not the last tile in a tile row + tile->width = hdr->tileWidth; + if (img->tileCols > 1) + { + tile->tileFlag = E_HAS_TILES_ON_THE_RIGHT; + if (curTile % img->tileCols) + // not the first tile in tile row + tile->tileFlag |= E_HAS_TILES_ON_THE_LEFT; + } + } + else + { + // last tile in a tile row + tile->width = img->planeWidth - hdr->tileWidth * (img->tileCols - 1); + if (img->tileCols > 1) + tile->tileFlag = E_HAS_TILES_ON_THE_LEFT; + } + if (curTile < nTiles - img->tileCols) + { + // in first tile row + tile->height = hdr->tileHeight; + if (img->tileRows > 1) + { + tile->tileFlag |= E_HAS_TILES_ON_THE_BOTTOM; + if (curTile >= img->tileCols) + tile->tileFlag |= E_HAS_TILES_ON_THE_TOP; + } + } + else + { + // non first tile row + tile->height = img->planeHeight - hdr->tileHeight * (img->tileRows - 1); + if (img->tileRows > 1) + tile->tileFlag |= E_HAS_TILES_ON_THE_TOP; + } + if (img->nPlanes) + { + CrxPlaneComp *comp = tile->comps; + CrxSubband *band = bands + curTile * img->nPlanes * img->subbandCount; + + for (int curComp = 0; curComp < img->nPlanes; curComp++, comp++) + { + comp->compNumber = curComp; + comp->supportsPartial = 1; + comp->tileFlag = tile->tileFlag; + comp->subBands = band; + comp->compBuf = 0; + comp->waveletTransform = 0; + if (img->subbandCount) + { + for (int curBand = 0; curBand < img->subbandCount; + curBand++, band++) + { + band->supportsPartial = 0; + band->quantValue = 4; + band->bandParam = 0; + band->dataSize = 0; + } + } + } + } + } + } + + uint32_t tileOffset = 0; + uint32_t dataSize = mdatSize; + uint8_t *dataPtr = mdatPtr; + CrxTile *tile = img->tiles; + + for (int curTile = 0; curTile < nTiles; curTile++, tile++) + { + if (dataSize < 0xC) + return -1; + + if (sgetn(2, dataPtr) != 0xFF01) + return -1; + if (sgetn(2, dataPtr + 8) != curTile) + return -1; + + dataSize -= 0xC; + + tile->tileSize = sgetn(4, dataPtr + 4); + tile->dataOffset = tileOffset; + + int32_t hdrExtraBytes = sgetn(2, dataPtr + 2) - 8; + tileOffset += tile->tileSize; + dataPtr += hdrExtraBytes + 0xC; + dataSize -= hdrExtraBytes; + + uint32_t compOffset = 0; + CrxPlaneComp *comp = tile->comps; + + for (int compNum = 0; compNum < img->nPlanes; compNum++, comp++) + { + if (dataSize < 0xC) + return -1; + + if (sgetn(2, dataPtr) != 0xFF02) + return -1; + if (compNum != dataPtr[8] >> 4) + return -1; + + comp->compSize = sgetn(4, dataPtr + 4); + + int32_t compHdrRoundedBits = (dataPtr[8] >> 1) & 3; + comp->supportsPartial = (dataPtr[8] & 8) != 0; + + comp->dataOffset = compOffset; + comp->tileFlag = tile->tileFlag; + + compOffset += comp->compSize; + dataSize -= 0xC; + dataPtr += 0xC; + + comp->roundedBitsMask = 0; + + if (compHdrRoundedBits) + { + if (img->levels || !comp->supportsPartial) + return -1; + + comp->roundedBitsMask = 1 << (compHdrRoundedBits - 1); + } + + if (crxReadSubbandHeaders(hdr, img, tile, comp, &dataPtr, &dataSize)) + return -1; + } + } + return 0; +} + +int crxSetupImageData(crx_data_header_t *hdr, CrxImage *img, int16_t *outBuf, + uint64_t mdatOffset, uint32_t mdatSize, + uint8_t *mdatHdrPtr) +{ + int IncrBitTable[32] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0}; + + img->planeWidth = hdr->f_width; + img->planeHeight = hdr->f_height; + + if (hdr->tileWidth < 0x16 || hdr->tileHeight < 0x16 || + img->planeWidth > 0x7FFF || img->planeHeight > 0x7FFF) + return -1; + + img->tileCols = (img->planeWidth + hdr->tileWidth - 1) / hdr->tileWidth; + img->tileRows = (img->planeHeight + hdr->tileHeight - 1) / hdr->tileHeight; + + if (img->tileCols > 0xFF || img->tileRows > 0xFF || + img->planeWidth - hdr->tileWidth * (img->tileCols - 1) < 0x16 || + img->planeHeight - hdr->tileHeight * (img->tileRows - 1) < 0x16) + return -1; + + img->tiles = 0; + img->levels = hdr->imageLevels; + img->subbandCount = 3 * img->levels + 1; // 3 bands per level + one last LL + img->nPlanes = hdr->nPlanes; + img->nBits = hdr->nBits; + img->encType = hdr->encType; + img->samplePrecision = hdr->nBits + IncrBitTable[4 * hdr->encType + 2] + 1; + img->mdatOffset = mdatOffset + hdr->mdatHdrSize; + img->mdatSize = mdatSize; + img->planeBuf = 0; + img->outBufs[0] = img->outBufs[1] = img->outBufs[2] = img->outBufs[3] = 0; + + // The encoding type 3 needs all 4 planes to be decoded to generate row of + // RGGB values. It seems to be using some other colour space for raw encoding + // It is a massive buffer so ideallly it will need a different approach: + // decode planes line by line and convert single line then without + // intermediate plane buffer. At the moment though it's too many changes so + // left as is. + if (img->encType == 3 && img->nPlanes == 4 && img->nBits > 8) + { + img->planeBuf = + (int16_t *)malloc(img->planeHeight * img->planeWidth * img->nPlanes * + ((img->samplePrecision + 7) >> 3)); + if (!img->planeBuf) + return -1; + } + + int32_t rowSize = 2 * img->planeWidth; + + if (img->nPlanes == 1) + img->outBufs[0] = outBuf; + else + switch (hdr->cfaLayout) + { + case 0: + // R G + // G B + img->outBufs[0] = outBuf; + img->outBufs[1] = outBuf + 1; + img->outBufs[2] = outBuf + rowSize; + img->outBufs[3] = img->outBufs[2] + 1; + break; + case 1: + // G R + // B G + img->outBufs[1] = outBuf; + img->outBufs[0] = outBuf + 1; + img->outBufs[3] = outBuf + rowSize; + img->outBufs[2] = img->outBufs[3] + 1; + break; + case 2: + // G B + // R G + img->outBufs[2] = outBuf; + img->outBufs[3] = outBuf + 1; + img->outBufs[0] = outBuf + rowSize; + img->outBufs[1] = img->outBufs[0] + 1; + break; + case 3: + // B G + // G R + img->outBufs[3] = outBuf; + img->outBufs[2] = outBuf + 1; + img->outBufs[1] = outBuf + rowSize; + img->outBufs[0] = img->outBufs[1] + 1; + break; + } + + // read header + return crxReadImageHeaders(hdr, img, mdatHdrPtr, mdatSize); +} + +int crxFreeImageData(CrxImage *img) +{ + CrxTile *tile = img->tiles; + int nTiles = img->tileRows * img->tileCols; + + if (img->tiles) + { + for (int32_t curTile = 0; curTile < nTiles; curTile++, tile++) + if (tile[curTile].comps) + for (int32_t curPlane = 0; curPlane < img->nPlanes; curPlane++) + crxFreeSubbandData(img, tile[curTile].comps + curPlane); + free(img->tiles); + img->tiles = 0; + } + + if (img->planeBuf) + { + free(img->planeBuf); + img->planeBuf = 0; + } + + return 0; +} + +} // namespace + +void DCraw::crxLoadDecodeLoop(void *img, int nPlanes) +{ +#ifdef LIBRAW_USE_OPENMP + int results[4]; // nPlanes is always <= 4 +#pragma omp parallel for + for (int32_t plane = 0; plane < nPlanes; ++plane) + results[plane] = crxDecodePlane(img, plane); + + for (int32_t plane = 0; plane < nPlanes; ++plane) + if (results[plane]) + derror(); +#else + for (int32_t plane = 0; plane < nPlanes; ++plane) + if (crxDecodePlane(img, plane)) + derror(); +#endif +} + +void DCraw::crxConvertPlaneLineDf(void *p, int imageRow) +{ + crxConvertPlaneLine((CrxImage *)p, imageRow); +} + +void DCraw::crxLoadFinalizeLoopE3(void *p, int planeHeight) +{ +#ifdef LIBRAW_USE_OPENMP +#pragma omp parallel for +#endif + for (int i = 0; i < planeHeight; ++i) + crxConvertPlaneLineDf(p, i); +} + +void DCraw::crxLoadRaw() +{ + CrxImage img; + if (RT_canon_CR3_data.crx_track_selected < 0 || + RT_canon_CR3_data.crx_track_selected >= + LIBRAW_CRXTRACKS_MAXCOUNT) + derror(); + crx_data_header_t hdr = + RT_canon_CR3_data + .crx_header[RT_canon_CR3_data.crx_track_selected]; + + LibRaw_abstract_datastream input = { ifp }; + img.input = &input; //libraw_internal_data.internal_data.input; + + // update sizes for the planes + if (hdr.nPlanes == 4) + { + hdr.f_width >>= 1; + hdr.f_height >>= 1; + hdr.tileWidth >>= 1; + hdr.tileHeight >>= 1; + } + +// /*imgdata.color.*/maximum = (1 << hdr.nBits) - 1; + + uint8_t *hdrBuf = (uint8_t *)malloc(hdr.mdatHdrSize); + + // read image header +#ifdef LIBRAW_USE_OPENMP +#pragma omp critical +#endif + { +#ifndef LIBRAW_USE_OPENMP + /*libraw_internal_data.internal_data.input->*/input.lock(); +#endif + /*libraw_internal_data.internal_data.input->*/input.seek( + data_offset, SEEK_SET); + /*libraw_internal_data.internal_data.input->*/input.read(hdrBuf, 1, hdr.mdatHdrSize); +#ifndef LIBRAW_USE_OPENMP + /*libraw_internal_data.internal_data.input->*/input.unlock(); +#endif + } + + // parse and setup the image data + if (crxSetupImageData(&hdr, &img, (int16_t *)raw_image, + hdr.MediaOffset/*data_offset*/, + hdr.MediaSize/*RT_canon_CR3_data.data_size*/, hdrBuf)) + derror(); + free(hdrBuf); + + crxLoadDecodeLoop(&img, hdr.nPlanes); + + if (img.encType == 3) + crxLoadFinalizeLoopE3(&img, img.planeHeight); + + crxFreeImageData(&img); +} + +int DCraw::crxParseImageHeader(uchar *cmp1TagData, int nTrack) +{ + if (nTrack < 0 || nTrack >= LIBRAW_CRXTRACKS_MAXCOUNT) + return -1; + if (!cmp1TagData) + return -1; + + crx_data_header_t *hdr = + &RT_canon_CR3_data.crx_header[nTrack]; + + hdr->version = sgetn(2, cmp1TagData + 4); + hdr->f_width = sgetn(4, cmp1TagData + 8); + hdr->f_height = sgetn(4, cmp1TagData + 12); + hdr->tileWidth = sgetn(4, cmp1TagData + 16); + hdr->tileHeight = sgetn(4, cmp1TagData + 20); + hdr->nBits = cmp1TagData[24]; + hdr->nPlanes = cmp1TagData[25] >> 4; + hdr->cfaLayout = cmp1TagData[25] & 0xF; + hdr->encType = cmp1TagData[26] >> 4; + hdr->imageLevels = cmp1TagData[26] & 0xF; + hdr->hasTileCols = cmp1TagData[27] >> 7; + hdr->hasTileRows = (cmp1TagData[27] >> 6) & 1; + hdr->mdatHdrSize = sgetn(4, cmp1TagData + 28); + + // validation + if (hdr->version != 0x100 || !hdr->mdatHdrSize) + return -1; + if (hdr->encType == 1) + { + if (hdr->nBits > 15) + return -1; + } + else + { + if (hdr->encType && hdr->encType != 3) + return -1; + if (hdr->nBits > 14) + return -1; + } + + if (hdr->nPlanes == 1) + { + if (hdr->cfaLayout || hdr->encType) + return -1; + if (hdr->nBits != 8) + return -1; + } + else if (hdr->nPlanes != 4 || hdr->f_width & 1 || hdr->f_height & 1 || + hdr->tileWidth & 1 || hdr->tileHeight & 1 || hdr->cfaLayout > 3u || + (hdr->encType && hdr->encType != 1 && hdr->encType != 3) || + hdr->nBits == 8) + return -1; + + if (hdr->tileWidth > hdr->f_width || hdr->tileHeight > hdr->f_height) + return -1; + + if (hdr->imageLevels > 3 || hdr->hasTileCols > 1 || hdr->hasTileRows > 1) + return -1; + return 0; +} + +#undef _abs +#undef _min +#undef _constrain +#undef libraw_inline +#undef LIBRAW_CRXTRACKS_MAXCOUNT + +#ifdef __GNUC__ // silence warning +#pragma GCC diagnostic pop +#endif diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index b81594dc4..0e95a3b1e 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -5595,13 +5595,26 @@ nf: order = 0x4949; else if (!strcmp (buf,"AOC") || !strcmp (buf,"QVC")) fseek (ifp, -4, SEEK_CUR); + // ALB -- taken from LibRaw ------------------------------------------------ + else if (!strncmp(buf, "CMT3", 4)) + { + order = sget2((uchar *)(buf + 4)); + fseek(ifp, 2L, SEEK_CUR); + } + else if (RT_canon_CR3_data.CR3_CTMDtag) + { + order = sget2((uchar *)buf); + fseek(ifp, -2L, SEEK_CUR); + } + // ------------------------------------------------------------------------- + else { fseek (ifp, -10, SEEK_CUR); if (!strncmp(make,"SAMSUNG",7)) base = ftell(ifp); } entries = get2(); - if (entries > 1000) return; + if (entries > 2000) return; morder = order; while (entries--) { order = morder; @@ -5806,16 +5819,335 @@ get2_256: parse_thumb_note (base, 136, 137); } if (tag == 0x4001 && len > 500) { - i = len == 582 ? 50 : len == 653 ? 68 : len == 5120 ? 142 : 126; - fseek (ifp, i, SEEK_CUR); - FORC4 cam_mul[c ^ (c >> 1)] = get2(); - for (i+=18; i <= len; i+=10) { - get2(); - FORC4 sraw_mul[c ^ (c >> 1)] = get2(); - if (sraw_mul[1] == 1170) break; + // i = len == 582 ? 50 : len == 653 ? 68 : len == 5120 ? 142 : 126; + // fseek (ifp, i, SEEK_CUR); + // FORC4 cam_mul[c ^ (c >> 1)] = get2(); + // for (i+=18; i <= len; i+=10) { + // get2(); + // FORC4 sraw_mul[c ^ (c >> 1)] = get2(); + // if (sraw_mul[1] == 1170) break; + // } + // -- ALB -- adapted from LibRaw -------------------------------------- + int bls = 0; + long int offsetChannelBlackLevel = 0L; + long int offsetChannelBlackLevel2 = 0L; + long int offsetWhiteLevels = 0L; + struct { + int AverageBlackLevel; + int ColorDataSubVer; + int NormalWhiteLevel; + int SpecularWhiteLevel; + } imCanon = { 0, 0, 0, 0 }; + long int save1 = ftell(ifp); + + switch (len) + { + + case 582: + // imCanon.ColorDataVer = 1; // 20D / 350D + + fseek(ifp, save1 + (0x0019 << 1), SEEK_SET); + FORC4 cam_mul[c ^ (c >> 1)] = (float)get2(); + // fseek(ifp, save1 + (0x001e << 1), SEEK_SET); + // FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Auto][c ^ (c >> 1)] = get2(); + // fseek(ifp, save1 + (0x0041 << 1), SEEK_SET); + // FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Custom1][c ^ (c >> 1)] = get2(); + // fseek(ifp, save1 + (0x0046 << 1), SEEK_SET); + // FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Custom2][c ^ (c >> 1)] = get2(); + + // fseek(ifp, save1 + (0x0023 << 1), SEEK_SET); + // Canon_WBpresets(2, 2); + // fseek(ifp, save1 + (0x004b << 1), SEEK_SET); + // Canon_WBCTpresets(1); // ABCT + offsetChannelBlackLevel = save1 + (0x00a6 << 1); + break; + + case 653: + // imCanon.ColorDataVer = 2; // 1Dmk2 / 1DsMK2 + + // fseek(ifp, save1 + (0x0018 << 1), SEEK_SET); + // FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Auto][c ^ (c >> 1)] = get2(); + fseek(ifp, save1 + (0x0022 << 1), SEEK_SET); + FORC4 cam_mul[c ^ (c >> 1)] = (float)get2(); + // fseek(ifp, save1 + (0x0090 << 1), SEEK_SET); + // FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Custom1][c ^ (c >> 1)] = get2(); + // fseek(ifp, save1 + (0x0095 << 1), SEEK_SET); + // FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Custom2][c ^ (c >> 1)] = get2(); + // fseek(ifp, save1 + (0x009a << 1), SEEK_SET); + // FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Custom3][c ^ (c >> 1)] = get2(); + + // fseek(ifp, save1 + (0x0027 << 1), SEEK_SET); + // Canon_WBpresets(2, 12); + // fseek(ifp, save1 + (0x00a4 << 1), SEEK_SET); + // Canon_WBCTpresets(1); // ABCT + offsetChannelBlackLevel = save1 + (0x011e << 1); + break; + + case 796: + // imCanon.ColorDataVer = 3; // 1DmkIIN / 5D / 30D / 400D + // imCanon.ColorDataSubVer = get2(); + + fseek(ifp, save1 + (0x003f << 1), SEEK_SET); + FORC4 cam_mul[c ^ (c >> 1)] = (float)get2(); + // fseek(ifp, save1 + (0x0044 << 1), SEEK_SET); + // FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Auto][c ^ (c >> 1)] = get2(); + // fseek(ifp, save1 + (0x0049 << 1), SEEK_SET); + // FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Measured][c ^ (c >> 1)] = get2(); + // fseek(ifp, save1 + (0x0071 << 1), SEEK_SET); + // FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Custom1][c ^ (c >> 1)] = get2(); + // fseek(ifp, save1 + (0x0076 << 1), SEEK_SET); + // FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Custom2][c ^ (c >> 1)] = get2(); + // fseek(ifp, save1 + (0x007b << 1), SEEK_SET); + // FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Custom3][c ^ (c >> 1)] = get2(); + // fseek(ifp, save1 + (0x0080 << 1), SEEK_SET); + // FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Custom][c ^ (c >> 1)] = get2(); + + // fseek(ifp, save1 + (0x004e << 1), SEEK_SET); + // Canon_WBpresets(2, 12); + // fseek(ifp, save1 + (0x0085 << 1), SEEK_SET); + // Canon_WBCTpresets(0); // BCAT + offsetChannelBlackLevel = save1 + (0x00c4 << 1); + break; + + // 1DmkIII / 1DSmkIII / 1DmkIV / 5DmkII + // 7D / 40D / 50D / 60D / 450D / 500D + // 550D / 1000D / 1100D + case 674: + case 692: + case 702: + case 1227: + case 1250: + case 1251: + case 1337: + case 1338: + case 1346: + // imCanon.ColorDataVer = 4; + imCanon.ColorDataSubVer = get2(); + + fseek(ifp, save1 + (0x003f << 1), SEEK_SET); + FORC4 cam_mul[c ^ (c >> 1)] = (float)get2(); + // fseek(ifp, save1 + (0x0044 << 1), SEEK_SET); + // FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Auto][c ^ (c >> 1)] = get2(); + // fseek(ifp, save1 + (0x0049 << 1), SEEK_SET); + // FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Measured][c ^ (c >> 1)] = get2(); + + fseek(ifp, save1 + (0x004e << 1), SEEK_SET); + FORC4 sraw_mul[c ^ (c >> 1)] = get2(); + // fseek(ifp, save1 + (0x0053 << 1), SEEK_SET); + // Canon_WBpresets(2, 12); + // fseek(ifp, save1 + (0x00a8 << 1), SEEK_SET); + // Canon_WBCTpresets(0); // BCAT + + if ((imCanon.ColorDataSubVer == 4) || + (imCanon.ColorDataSubVer == 5)) + { + offsetChannelBlackLevel = save1 + (0x02b4 << 1); + offsetWhiteLevels = save1 + (0x02b8 << 1); } + else if ((imCanon.ColorDataSubVer == 6) || + (imCanon.ColorDataSubVer == 7)) + { + offsetChannelBlackLevel = save1 + (0x02cb << 1); + offsetWhiteLevels = save1 + (0x02cf << 1); + } + else if (imCanon.ColorDataSubVer == 9) + { + offsetChannelBlackLevel = save1 + (0x02cf << 1); + offsetWhiteLevels = save1 + (0x02d3 << 1); + } + else + offsetChannelBlackLevel = save1 + (0x00e7 << 1); + break; + + case 5120: // PowerShot G10, G12, G5 X, G7 X, G9 X, EOS M3, EOS M5, EOS M6 + // imCanon.ColorDataVer = 5; + imCanon.ColorDataSubVer = get2(); + + fseek(ifp, save1 + (0x0047 << 1), SEEK_SET); + FORC4 cam_mul[c ^ (c >> 1)] = (float)get2(); + + if (imCanon.ColorDataSubVer == 0xfffc) + { // -4: G7 X Mark II, G9 X Mark II, G1 X Mark III, M5, M100, M6 + // fseek(ifp, save1 + (0x004f << 1), SEEK_SET); + // FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Auto][c ^ (c >> 1)] = get2(); + // fseek(ifp, 8, SEEK_CUR); + // FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Measured][c ^ (c >> 1)] = + // get2(); + // fseek(ifp, 8, SEEK_CUR); + // FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Other][c ^ (c >> 1)] = get2(); + // fseek(ifp, 8, SEEK_CUR); + // Canon_WBpresets(8, 24); + // fseek(ifp, 168, SEEK_CUR); + // FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_FL_WW][c ^ (c >> 1)] = get2(); + // fseek(ifp, 24, SEEK_CUR); + // Canon_WBCTpresets(2); // BCADT + offsetChannelBlackLevel = save1 + (0x014d << 1); + offsetWhiteLevels = save1 + (0x0569 << 1); + } + else if (imCanon.ColorDataSubVer == 0xfffd) + { // -3: M10/M3/G1 X/G1 X II/G10/G11/G12/G15/G16/G3 X/G5 X/G7 X/G9 + // X/S100/S110/S120/S90/S95/SX1 IX/SX50 HS/SX60 HS + // fseek(ifp, save1 + (0x004c << 1), SEEK_SET); + // FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Auto][c ^ (c >> 1)] = get2(); + // get2(); + // FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Measured][c ^ (c >> 1)] = + // get2(); + // get2(); + // FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Other][c ^ (c >> 1)] = get2(); + // get2(); + // Canon_WBpresets(2, 12); + // fseek(ifp, save1 + (0x00ba << 1), SEEK_SET); + // Canon_WBCTpresets(2); // BCADT + offsetChannelBlackLevel = save1 + (0x0108 << 1); + } + break; + + case 1273: + case 1275: + // imCanon.ColorDataVer = 6; // 600D / 1200D + imCanon.ColorDataSubVer = get2(); + + fseek(ifp, save1 + (0x003f << 1), SEEK_SET); + FORC4 cam_mul[c ^ (c >> 1)] = (float)get2(); + // fseek(ifp, save1 + (0x0044 << 1), SEEK_SET); + // FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Auto][c ^ (c >> 1)] = get2(); + // fseek(ifp, save1 + (0x0049 << 1), SEEK_SET); + // FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Measured][c ^ (c >> 1)] = get2(); + + fseek(ifp, save1 + (0x0062 << 1), SEEK_SET); + FORC4 sraw_mul[c ^ (c >> 1)] = get2(); + // fseek(ifp, save1 + (0x0067 << 1), SEEK_SET); + // Canon_WBpresets(2, 12); + // fseek(ifp, save1 + (0x00bc << 1), SEEK_SET); + // Canon_WBCTpresets(0); // BCAT + offsetChannelBlackLevel = save1 + (0x01df << 1); + offsetWhiteLevels = save1 + (0x01e3 << 1); + break; + + // 1DX / 5DmkIII / 6D / 100D / 650D / 700D / EOS M / 7DmkII / 750D / 760D + case 1312: + case 1313: + case 1316: + case 1506: + // imCanon.ColorDataVer = 7; + imCanon.ColorDataSubVer = get2(); + + fseek(ifp, save1 + (0x003f << 1), SEEK_SET); + FORC4 cam_mul[c ^ (c >> 1)] = (float)get2(); + // fseek(ifp, save1 + (0x0044 << 1), SEEK_SET); + // FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Auto][c ^ (c >> 1)] = get2(); + // fseek(ifp, save1 + (0x0049 << 1), SEEK_SET); + // FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Measured][c ^ (c >> 1)] = get2(); + + fseek(ifp, save1 + (0x007b << 1), SEEK_SET); + FORC4 sraw_mul[c ^ (c >> 1)] = get2(); + // fseek(ifp, save1 + (0x0080 << 1), SEEK_SET); + // Canon_WBpresets(2, 12); + // fseek(ifp, save1 + (0x00d5 << 1), SEEK_SET); + // Canon_WBCTpresets(0); // BCAT + + if (imCanon.ColorDataSubVer == 10) + { + offsetChannelBlackLevel = save1 + (0x01f8 << 1); + offsetWhiteLevels = save1 + (0x01fc << 1); + } + else if (imCanon.ColorDataSubVer == 11) + { + offsetChannelBlackLevel = save1 + (0x02d8 << 1); + offsetWhiteLevels = save1 + (0x02dc << 1); + } + break; + + // 5DS / 5DS R / 80D / 1300D / 1500D / 3000D / 5D4 / 800D / 77D / 6D II / + // 200D + case 1560: + case 1592: + case 1353: + case 1602: + // imCanon.ColorDataVer = 8; + imCanon.ColorDataSubVer = get2(); + + fseek(ifp, save1 + (0x003f << 1), SEEK_SET); + FORC4 cam_mul[c ^ (c >> 1)] = (float)get2(); + // fseek(ifp, save1 + (0x0044 << 1), SEEK_SET); + // FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Auto][c ^ (c >> 1)] = get2(); + // fseek(ifp, save1 + (0x0049 << 1), SEEK_SET); + // FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Measured][c ^ (c >> 1)] = get2(); + + fseek(ifp, save1 + (0x0080 << 1), SEEK_SET); + FORC4 sraw_mul[c ^ (c >> 1)] = get2(); + // fseek(ifp, save1 + (0x0085 << 1), SEEK_SET); + // Canon_WBpresets(2, 12); + // fseek(ifp, save1 + (0x0107 << 1), SEEK_SET); + // Canon_WBCTpresets(0); // BCAT + + if (imCanon.ColorDataSubVer == 14) + { // 1300D / 1500D / 3000D + offsetChannelBlackLevel = save1 + (0x022c << 1); + offsetWhiteLevels = save1 + (0x0230 << 1); + } + else + { + offsetChannelBlackLevel = save1 + (0x030a << 1); + offsetWhiteLevels = save1 + (0x030e << 1); + } + break; + + case 1820: // M50, ColorDataSubVer 16 + case 1824: // EOS R, SX740HS, ColorDataSubVer 17 + case 1816: // EOS RP, SX70HS, ColorDataSubVer 18; + // EOS M6 Mark II, EOS 90D, G7XmkIII, ColorDataSubVer 19 + // imCanon.ColorDataVer = 9; + imCanon.ColorDataSubVer = get2(); + + fseek(ifp, save1 + (0x0047 << 1), SEEK_SET); + FORC4 cam_mul[c ^ (c >> 1)] = (float)get2(); + // get2(); + // FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Auto][c ^ (c >> 1)] = get2(); + // get2(); + // FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Measured][c ^ (c >> 1)] = get2(); + // fseek(ifp, save1 + (0x0088 << 1), SEEK_SET); + // Canon_WBpresets(2, 12); + // fseek(ifp, save1 + (0x010a << 1), SEEK_SET); + // Canon_WBCTpresets(0); + offsetChannelBlackLevel = save1 + (0x0318 << 1); + offsetChannelBlackLevel2 = save1 + (0x0149 << 1); + offsetWhiteLevels = save1 + (0x031c << 1); + break; } - if (tag == 0x4021 && get4() && get4()) + + if (offsetChannelBlackLevel) + { + fseek(ifp, offsetChannelBlackLevel, SEEK_SET); + FORC4 + bls += (cblack/*imCanon.ChannelBlackLevel*/[c ^ (c >> 1)] = get2()); + imCanon.AverageBlackLevel = bls / 4; + // RT_blacklevel_from_constant = ThreeValBool::F; + } + if (offsetWhiteLevels) + { + if ((offsetWhiteLevels - offsetChannelBlackLevel) != 8L) + fseek(ifp, offsetWhiteLevels, SEEK_SET); + imCanon.NormalWhiteLevel = get2(); + imCanon.SpecularWhiteLevel = get2(); + // FORC4 + // imgdata.color.linear_max[c] = imCanon.SpecularWhiteLevel; + maximum = imCanon.SpecularWhiteLevel; + // RT_whitelevel_from_constant = ThreeValBool::F; + } + + if(!imCanon.AverageBlackLevel && offsetChannelBlackLevel2) + { + fseek(ifp, offsetChannelBlackLevel2, SEEK_SET); + FORC4 + bls += (cblack/*imCanon.ChannelBlackLevel*/[c ^ (c >> 1)] = get2()); + imCanon.AverageBlackLevel = bls / 4; + // RT_blacklevel_from_constant = ThreeValBool::F; + } + fseek(ifp, save1, SEEK_SET); + + //--------------------------------------------------------------------- + } if (tag == 0x4021 && get4() && get4()) FORC4 cam_mul[c] = 1024; if (tag == 0xa021) FORC4 cam_mul[c ^ (c >> 1)] = get4(); @@ -9313,6 +9645,13 @@ void CLASS identify() parse_foveon(); else if (!memcmp (head,"CI",2)) parse_cine(); + //--- RT ---------------------------------------------------------------- + else if (!memcmp(head + 4, "ftypcrx ", 8)) { + std::cout << "11111 : " << 11111 << std::endl; + + parse_canon_cr3(); + } + //------------------------------------------------------------------------- if (make[0] == 0) for (zero_fsize=i=0; i < sizeof table / sizeof *table; i++) if (fsize == table[i].fsize) { diff --git a/rtengine/dcraw.h b/rtengine/dcraw.h index 3d753d876..75570b065 100644 --- a/rtengine/dcraw.h +++ b/rtengine/dcraw.h @@ -164,6 +164,35 @@ protected: PanasonicRW2Info(): bpp(0), encoding(0) {} }; PanasonicRW2Info RT_pana_info; +public: + struct CanonCR3Data { + // contents of tag CMP1 for relevant track in CR3 file + struct crx_data_header_t { + int32_t version; + int32_t f_width; + int32_t f_height; + int32_t tileWidth; + int32_t tileHeight; + int32_t nBits; + int32_t nPlanes; + int32_t cfaLayout; + int32_t encType; + int32_t imageLevels; + int32_t hasTileCols; + int32_t hasTileRows; + int32_t mdatHdrSize; + // Not from header, but from datastream + uint32_t MediaSize; + INT64 MediaOffset; + uint32_t MediaType; /* 1 -> /C/RAW, 2-> JPEG */ + }; + static constexpr size_t CRXTRACKS_MAXCOUNT = 16; + crx_data_header_t crx_header[CRXTRACKS_MAXCOUNT]; + int crx_track_selected; + short CR3_CTMDtag; + }; +protected: + CanonCR3Data RT_canon_CR3_data; float cam_mul[4], pre_mul[4], cmatrix[3][4], rgb_cam[3][4]; @@ -529,4 +558,20 @@ void shiftXtransMatrix( const int offsy, const int offsx) { void nikon_14bit_load_raw(); // ported from LibRaw +//----------------------------------------------------------------------------- +// Canon CR3 support ported from LibRaw +//----------------------------------------------------------------------------- +void parse_canon_cr3(); +void selectCRXTrack(short maxTrack); +int parseCR3(unsigned long long oAtomList, + unsigned long long szAtomList, short &nesting, + char *AtomNameStack, short &nTrack, short &TrackType); +int crxDecodePlane(void *p, uint32_t planeNumber); +void crxLoadDecodeLoop(void *img, int nPlanes); +void crxConvertPlaneLineDf(void *p, int imageRow); +void crxLoadFinalizeLoopE3(void *p, int planeHeight); +void crxLoadRaw(); +int crxParseImageHeader(uchar *cmp1TagData, int nTrack); +//----------------------------------------------------------------------------- + }; From 0d9df36b88d5390d0e41e3271a14be3a28654803 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 19 Nov 2019 20:11:36 +0100 Subject: [PATCH 160/208] raw crop for Canon EOS R --- rtengine/camconst.json | 5 +++++ rtengine/dcraw.cc | 2 -- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index 45233fc16..9bdd8e1e3 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -1143,6 +1143,11 @@ Camera constants: "raw_crop": [ 144, 72, 6984, 4660 ] }, + { // Quality C, only raw crop + "make_model": [ "Canon EOS R" ], + "raw_crop": [ 144, 46, 6744, 4500 ] + }, + // Canon Powershot { // Quality C, CHDK DNGs, raw frame correction "make_model": "Canon PowerShot A3100 IS", diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index 0e95a3b1e..b8da498b2 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -9647,8 +9647,6 @@ void CLASS identify() parse_cine(); //--- RT ---------------------------------------------------------------- else if (!memcmp(head + 4, "ftypcrx ", 8)) { - std::cout << "11111 : " << 11111 << std::endl; - parse_canon_cr3(); } //------------------------------------------------------------------------- From c21d1420983cf4832dcfc88e7ce13db073419497 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 19 Nov 2019 21:39:24 +0100 Subject: [PATCH 161/208] canon_cr3_decoder: enabled multithreaded decode --- rtengine/canon_cr3_decoder.cc | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index 9d3e0a62d..359243ed5 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -18,7 +18,6 @@ #include #include "dcraw.h" - #ifdef __GNUC__ // silence warning #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wsign-compare" @@ -626,9 +625,6 @@ libraw_inline void _BitScanReverse(DWORD *Index, unsigned long Mask) #define _byteswap_ulong(x) __builtin_bswap32(x) #endif -#ifdef LIBRAW_USE_OPENMP -# undef LIBRAW_USE_OPENMP -#endif #define LIBRAW_EXCEPTION_IO_EOF std::exception() @@ -787,17 +783,17 @@ static inline void crxFillBuffer(CrxBitstream *bitStrm) { bitStrm->curPos = 0; bitStrm->curBufOffset += bitStrm->curBufSize; -#ifdef LIBRAW_USE_OPENMP +#ifdef _OPENMP #pragma omp critical #endif { -#ifndef LIBRAW_USE_OPENMP +#ifndef _OPENMP bitStrm->input->lock(); #endif bitStrm->input->seek(bitStrm->curBufOffset, SEEK_SET); bitStrm->curBufSize = bitStrm->input->read( bitStrm->mdatBuf, 1, _min(bitStrm->mdatSize, CRX_BUF_SIZE)); -#ifndef LIBRAW_USE_OPENMP +#ifndef _OPENMP bitStrm->input->unlock(); #endif if (bitStrm->curBufSize < 1) // nothing read @@ -2960,7 +2956,7 @@ int crxFreeImageData(CrxImage *img) void DCraw::crxLoadDecodeLoop(void *img, int nPlanes) { -#ifdef LIBRAW_USE_OPENMP +#ifdef _OPENMP int results[4]; // nPlanes is always <= 4 #pragma omp parallel for for (int32_t plane = 0; plane < nPlanes; ++plane) @@ -2983,7 +2979,7 @@ void DCraw::crxConvertPlaneLineDf(void *p, int imageRow) void DCraw::crxLoadFinalizeLoopE3(void *p, int planeHeight) { -#ifdef LIBRAW_USE_OPENMP +#ifdef _OPENMP #pragma omp parallel for #endif for (int i = 0; i < planeHeight; ++i) @@ -3018,17 +3014,17 @@ void DCraw::crxLoadRaw() uint8_t *hdrBuf = (uint8_t *)malloc(hdr.mdatHdrSize); // read image header -#ifdef LIBRAW_USE_OPENMP +#ifdef _OPENMP #pragma omp critical #endif { -#ifndef LIBRAW_USE_OPENMP +#ifndef _OPENMP /*libraw_internal_data.internal_data.input->*/input.lock(); #endif /*libraw_internal_data.internal_data.input->*/input.seek( data_offset, SEEK_SET); /*libraw_internal_data.internal_data.input->*/input.read(hdrBuf, 1, hdr.mdatHdrSize); -#ifndef LIBRAW_USE_OPENMP +#ifndef _OPENMP /*libraw_internal_data.internal_data.input->*/input.unlock(); #endif } From 5e393f205207f17e5b3f067ba4431dd5acabf662 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Wed, 20 Nov 2019 11:35:59 +0100 Subject: [PATCH 162/208] Fix CR3 decoding on big endian platforms and some warnings from cppcheck --- rtengine/canon_cr3_decoder.cc | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index 359243ed5..f10a7c083 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -17,6 +17,7 @@ */ #include + #include "dcraw.h" #ifdef __GNUC__ // silence warning #pragma GCC diagnostic push @@ -587,7 +588,7 @@ fin: #undef _min #undef _constrain #endif -#define _abs(x) (((x) ^ ((int32_t)(x) >> 31)) - ((int32_t)(x) >> 31)) +#define _abs(x) ((x) < 0 ? -(x) : (x)) #define _min(a, b) ((a) < (b) ? (a) : (b)) #define _constrain(x, l, u) ((x) < (l) ? (l) : ((x) > (u) ? (u) : (x))) @@ -622,7 +623,14 @@ libraw_inline void _BitScanReverse(DWORD *Index, unsigned long Mask) { *Index = sizeof(unsigned long) * 8 - 1 - __builtin_clzl(Mask); } -#define _byteswap_ulong(x) __builtin_bswap32(x) +uint32_t _byteswap_ulong(uint32_t x) +{ + #if BYTE_ORDER == BIG_ENDIAN + return x; + #else + return __builtin_bswap32(x); + #endif +} #endif @@ -1041,7 +1049,7 @@ libraw_inline void crxDecodeSymbolL1Rounded(CrxBandParam *param, bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); int32_t code = -(bitCode & 1) ^ (bitCode >> 1); - param->lineBuf1[1] = param->roundedBitsMask * 2 * code + (code >> 31) + sym; + param->lineBuf1[1] = param->roundedBitsMask * 2 * code + static_cast(code < 0) + sym; if (doCode) { From 04443345649fad73f250526c5672dab1208a2b32 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Wed, 20 Nov 2019 14:51:43 +0100 Subject: [PATCH 163/208] Segfault in before/after mode, #5529 --- rtengine/FTblockDN.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index ea0565b21..121c8189d 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -1599,9 +1599,9 @@ BENCHFUN Color::Lab2RGBLimit(labdn->L[i1], labdn->a[i1], labdn->b[i1], labdn->L[i1], labdn->a[i1], labdn->b[i1], wip, 9000000.f, 1.f + qhighFactor * realred, 1.f + qhighFactor * realblue, width); for (int j = tileleft; j < tileright; ++j) { int j1 = j - tileleft; - float r_ = labdn->L[i1][j1]; - float g_ = labdn->a[i1][j1]; - float b_ = labdn->b[i1][j1]; + float r_ = std::max(0.f, labdn->L[i1][j1]); + float g_ = std::max(0.f, labdn->a[i1][j1]); + float b_ = std::max(0.f, labdn->b[i1][j1]); //inverse gamma standard (slider) r_ = r_ < 32768.f ? igamcurve[r_] : (Color::gammanf(r_ / 32768.f, igam) * 65535.f); g_ = g_ < 32768.f ? igamcurve[g_] : (Color::gammanf(g_ / 32768.f, igam) * 65535.f); From f42efdb2e0b6f76149f3a08fd53835b480755773 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Wed, 20 Nov 2019 14:58:46 +0100 Subject: [PATCH 164/208] Use better endianness check (by @heckflosse) --- rtengine/canon_cr3_decoder.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index f10a7c083..248cdd294 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -625,11 +625,11 @@ libraw_inline void _BitScanReverse(DWORD *Index, unsigned long Mask) } uint32_t _byteswap_ulong(uint32_t x) { - #if BYTE_ORDER == BIG_ENDIAN - return x; - #else - return __builtin_bswap32(x); - #endif +#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + return x; +#else + return __builtin_bswap32(x); +#endif } #endif From 6039f1e3001bcd106d141d6fa9e68f3371e74148 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Wed, 20 Nov 2019 15:52:25 +0100 Subject: [PATCH 165/208] Tackle warnings --- rtengine/canon_cr3_decoder.cc | 102 +++++++++++++++++++--------------- rtengine/dcraw.h | 8 +-- 2 files changed, 61 insertions(+), 49 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index 248cdd294..e945a4ab8 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -1,4 +1,24 @@ -/* -*- C++ -*- +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2019 RawTherapee development team + * + * RawTherapee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RawTherapee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RawTherapee. If not, see . + */ + +// Code adapted from ART +/* * * This file is part of ART. * @@ -16,16 +36,6 @@ * along with ART. If not, see . */ -#include - -#include "dcraw.h" -#ifdef __GNUC__ // silence warning -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wsign-compare" -#pragma GCC diagnostic ignored "-Wunused-variable" -#pragma GCC diagnostic ignored "-Wunused-but-set-variable" -#endif - // Code adapted from libraw /* -*- C++ -*- * Copyright 2019 LibRaw LLC (info@libraw.org) @@ -41,13 +51,17 @@ */ +#include +#include + +#include "dcraw.h" void DCraw::parse_canon_cr3() { int err; unsigned long long szAtomList; short nesting = -1; - short nTrack = -1; + unsigned short nTrack = 0; short TrackType; char AtomNameStack[128]; strcpy(make, "Canon"); @@ -61,14 +75,14 @@ void DCraw::parse_canon_cr3() #define LIBRAW_CRXTRACKS_MAXCOUNT RT_canon_CR3_data.CRXTRACKS_MAXCOUNT -void DCraw::selectCRXTrack(short maxTrack) +void DCraw::selectCRXTrack(unsigned short maxTrack) { if (maxTrack < 0) return; INT64 bitcounts[LIBRAW_CRXTRACKS_MAXCOUNT], maxbitcount = 0; uint32_t maxjpegbytes = 0; memset(bitcounts, 0, sizeof(bitcounts)); - for (int i = 0; i <= maxTrack && i < LIBRAW_CRXTRACKS_MAXCOUNT; i++) + for (unsigned int i = 0; i <= maxTrack && i < LIBRAW_CRXTRACKS_MAXCOUNT; i++) { CanonCR3Data::crx_data_header_t *d = &RT_canon_CR3_data.crx_header[i]; if (d->MediaType == 1) // RAW @@ -89,18 +103,21 @@ void DCraw::selectCRXTrack(short maxTrack) } if (maxbitcount < 8) return; - int framei = -1, framecnt = 0; - for (int i = 0; i <= maxTrack && i < LIBRAW_CRXTRACKS_MAXCOUNT; i++) + bool has_framei = false; + unsigned int framei = 0, framecnt = 0; + for (unsigned int i = 0; i <= maxTrack && i < LIBRAW_CRXTRACKS_MAXCOUNT; i++) { if (bitcounts[i] == maxbitcount) { - if (framecnt <= shot_select) + if (framecnt <= shot_select) { + has_framei = true; framei = i; + } framecnt++; } } is_raw = framecnt; - if (framei >= 0 && framei < LIBRAW_CRXTRACKS_MAXCOUNT) + if (has_framei && framei < LIBRAW_CRXTRACKS_MAXCOUNT) { CanonCR3Data::crx_data_header_t *d = &RT_canon_CR3_data.crx_header[framei]; @@ -129,7 +146,7 @@ void DCraw::selectCRXTrack(short maxTrack) int tiff_idx = -1; INT64 tpixels = 0; - for (int i = 0; i < tiff_nifds; i++) + for (unsigned int i = 0; i < tiff_nifds; i++) if (INT64(tiff_ifd[i].height) * INT64(tiff_ifd[i].height) > tpixels) { tpixels = INT64(tiff_ifd[i].height) * INT64(tiff_ifd[i].height); @@ -147,7 +164,7 @@ void DCraw::selectCRXTrack(short maxTrack) (get4() != 0x00000008)) int DCraw::parseCR3(unsigned long long oAtomList, unsigned long long szAtomList, short &nesting, - char *AtomNameStack, short &nTrack, short &TrackType) + char *AtomNameStack, unsigned short &nTrack, short &TrackType) { /* Atom starts with 4 bytes for Atom size and 4 bytes containing Atom name @@ -159,8 +176,8 @@ int DCraw::parseCR3(unsigned long long oAtomList, */ const char UIID_Canon[17] = "\x85\xc0\xb6\x87\x82\x0f\x11\xe0\x81\x11\xf4\xce\x46\x2b\x6a\x48"; - const char UIID_Preview[17] = - "\xea\xf4\x2b\x5e\x1c\x98\x4b\x88\xb9\xfb\xb7\xdc\x40\x6e\x4d\x16"; +// const char UIID_Preview[17] = +// "\xea\xf4\x2b\x5e\x1c\x98\x4b\x88\xb9\xfb\xb7\xdc\x40\x6e\x4d\x16"; /* AtomType = 0 - unknown: "unk." @@ -168,7 +185,7 @@ int DCraw::parseCR3(unsigned long long oAtomList, AtomType = 2 - leaf atom: "leaf" AtomType = 3 - can be container, can be leaf: "both" */ - const char sAtomeType[4][5] = {"unk.", "cont", "leaf", "both"}; +// const char sAtomeType[4][5] = {"unk.", "cont", "leaf", "both"}; short AtomType; static const struct { @@ -256,7 +273,8 @@ int DCraw::parseCR3(unsigned long long oAtomList, const char sHandlerType[5][5] = {"unk.", "soun", "vide", "hint", "meta"}; - int c, err = 0; + unsigned int c; + int err = 0; ushort tL; // Atom length represented in 4 or 8 bytes char nmAtom[5]; // Atom name @@ -268,14 +286,14 @@ int DCraw::parseCR3(unsigned long long oAtomList, char UIID[16]; uchar CMP1[36]; char HandlerType[5], MediaFormatID[5]; - unsigned ImageWidth, ImageHeight; +// unsigned ImageWidth, ImageHeight; long relpos_inDir, relpos_inBox; unsigned szItem, Tag, lTag; ushort tItem; nmAtom[0] = MediaFormatID[0] = nmAtom[4] = MediaFormatID[4] = '\0'; strcpy(HandlerType, sHandlerType[0]); - ImageWidth = ImageHeight = 0U; +// ImageWidth = ImageHeight = 0U; oAtom = oAtomList; nesting++; if (nesting > 31) @@ -450,8 +468,8 @@ int DCraw::parseCR3(unsigned long long oAtomList, } #define current_track RT_canon_CR3_data.crx_header[nTrack] - ImageWidth = get2(); - ImageHeight = get2(); +// ImageWidth = get2(); +// ImageHeight = get2(); } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAW")) { @@ -813,7 +831,7 @@ static inline void crxFillBuffer(CrxBitstream *bitStrm) libraw_inline int crxBitstreamGetZeros(CrxBitstream *bitStrm) { - uint32_t bitData = bitStrm->bitData; +// uint32_t bitData = bitStrm->bitData; uint32_t nonZeroBit = 0; uint64_t nextData = 0; int32_t result = 0; @@ -2049,7 +2067,7 @@ int crxIdwt53FilterTransform(CrxPlaneComp *comp, uint32_t level) lineBufH1[i] = lineBufL1[i] + ((delta + lineBufH0[i]) >> 1); lineBufH2[i] = delta; } - if (wavelet->curLine >= wavelet->height - 3 && wavelet->height & 1) + if (wavelet->curLine >= wavelet->height - 3 && (wavelet->height & 1)) { wavelet->curH += 3; wavelet->curLine += 3; @@ -2644,10 +2662,9 @@ int crxReadSubbandHeaders(crx_data_header_t *hdr, CrxImage *img, CrxTile *tile, if (!img->subbandCount) return 0; - int32_t curSubband = 0; int32_t subbandOffset = 0; band = comp->subBands; - for (int curSubband = 0; curSubband < img->subbandCount; curSubband++, band++) + for (unsigned int curSubband = 0; curSubband < img->subbandCount; curSubband++, band++) { if (*mdatSize < 0xC) return -1; @@ -2683,7 +2700,7 @@ int crxReadSubbandHeaders(crx_data_header_t *hdr, CrxImage *img, CrxTile *tile, int crxReadImageHeaders(crx_data_header_t *hdr, CrxImage *img, uint8_t *mdatPtr, uint32_t mdatSize) { - int nTiles = img->tileRows * img->tileCols; + unsigned int nTiles = img->tileRows * img->tileCols; if (!nTiles) return -1; @@ -2702,7 +2719,7 @@ int crxReadImageHeaders(crx_data_header_t *hdr, CrxImage *img, uint8_t *mdatPtr, CrxPlaneComp *comps = (CrxPlaneComp *)(tile + nTiles); CrxSubband *bands = (CrxSubband *)(comps + img->nPlanes * nTiles); - for (int curTile = 0; curTile < nTiles; curTile++, tile++) + for (unsigned int curTile = 0; curTile < nTiles; curTile++, tile++) { tile->tileFlag = 0; // tile neighbouring flags tile->tileNumber = curTile; @@ -2780,7 +2797,7 @@ int crxReadImageHeaders(crx_data_header_t *hdr, CrxImage *img, uint8_t *mdatPtr, uint8_t *dataPtr = mdatPtr; CrxTile *tile = img->tiles; - for (int curTile = 0; curTile < nTiles; curTile++, tile++) + for (unsigned int curTile = 0; curTile < nTiles; curTile++, tile++) { if (dataSize < 0xC) return -1; @@ -2997,8 +3014,7 @@ void DCraw::crxLoadFinalizeLoopE3(void *p, int planeHeight) void DCraw::crxLoadRaw() { CrxImage img; - if (RT_canon_CR3_data.crx_track_selected < 0 || - RT_canon_CR3_data.crx_track_selected >= + if (RT_canon_CR3_data.crx_track_selected >= LIBRAW_CRXTRACKS_MAXCOUNT) derror(); crx_data_header_t hdr = @@ -3052,9 +3068,9 @@ void DCraw::crxLoadRaw() crxFreeImageData(&img); } -int DCraw::crxParseImageHeader(uchar *cmp1TagData, int nTrack) +int DCraw::crxParseImageHeader(uchar *cmp1TagData, unsigned int nTrack) { - if (nTrack < 0 || nTrack >= LIBRAW_CRXTRACKS_MAXCOUNT) + if (nTrack >= LIBRAW_CRXTRACKS_MAXCOUNT) return -1; if (!cmp1TagData) return -1; @@ -3099,8 +3115,8 @@ int DCraw::crxParseImageHeader(uchar *cmp1TagData, int nTrack) if (hdr->nBits != 8) return -1; } - else if (hdr->nPlanes != 4 || hdr->f_width & 1 || hdr->f_height & 1 || - hdr->tileWidth & 1 || hdr->tileHeight & 1 || hdr->cfaLayout > 3u || + else if (hdr->nPlanes != 4 || (hdr->f_width & 1) || (hdr->f_height & 1) || + (hdr->tileWidth & 1) || (hdr->tileHeight & 1) || hdr->cfaLayout > 3 || (hdr->encType && hdr->encType != 1 && hdr->encType != 3) || hdr->nBits == 8) return -1; @@ -3118,7 +3134,3 @@ int DCraw::crxParseImageHeader(uchar *cmp1TagData, int nTrack) #undef _constrain #undef libraw_inline #undef LIBRAW_CRXTRACKS_MAXCOUNT - -#ifdef __GNUC__ // silence warning -#pragma GCC diagnostic pop -#endif diff --git a/rtengine/dcraw.h b/rtengine/dcraw.h index 75570b065..5b91d7e8b 100644 --- a/rtengine/dcraw.h +++ b/rtengine/dcraw.h @@ -188,7 +188,7 @@ public: }; static constexpr size_t CRXTRACKS_MAXCOUNT = 16; crx_data_header_t crx_header[CRXTRACKS_MAXCOUNT]; - int crx_track_selected; + unsigned int crx_track_selected; short CR3_CTMDtag; }; protected: @@ -562,16 +562,16 @@ void nikon_14bit_load_raw(); // ported from LibRaw // Canon CR3 support ported from LibRaw //----------------------------------------------------------------------------- void parse_canon_cr3(); -void selectCRXTrack(short maxTrack); +void selectCRXTrack(unsigned short maxTrack); int parseCR3(unsigned long long oAtomList, unsigned long long szAtomList, short &nesting, - char *AtomNameStack, short &nTrack, short &TrackType); + char *AtomNameStack, unsigned short &nTrack, short &TrackType); int crxDecodePlane(void *p, uint32_t planeNumber); void crxLoadDecodeLoop(void *img, int nPlanes); void crxConvertPlaneLineDf(void *p, int imageRow); void crxLoadFinalizeLoopE3(void *p, int planeHeight); void crxLoadRaw(); -int crxParseImageHeader(uchar *cmp1TagData, int nTrack); +int crxParseImageHeader(uchar *cmp1TagData, unsigned int nTrack); //----------------------------------------------------------------------------- }; From fb01435e3f65eff5a52642d5131f9159eff21df7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Wed, 20 Nov 2019 16:05:24 +0100 Subject: [PATCH 166/208] Consider side effects of `get2()` --- rtengine/canon_cr3_decoder.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index e945a4ab8..b69821280 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -468,8 +468,8 @@ int DCraw::parseCR3(unsigned long long oAtomList, } #define current_track RT_canon_CR3_data.crx_header[nTrack] -// ImageWidth = get2(); -// ImageHeight = get2(); + /*ImageWidth = */get2(); + /*ImageHeight = */get2(); } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAW")) { From d986a56c50d008372e7fac565a94a81c7a07c19f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Thu, 21 Nov 2019 08:48:33 +0100 Subject: [PATCH 167/208] Fix LGTM warnings --- rtengine/canon_cr3_decoder.cc | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index b69821280..b616a2b42 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -68,8 +68,7 @@ void DCraw::parse_canon_cr3() szAtomList = ifp->size; err = parseCR3(0ULL, szAtomList, nesting, AtomNameStack, nTrack, TrackType); - if ((err == 0 || err == -14) && - nTrack >= 0) // no error, or too deep nesting + if (err == 0 || err == -14) // no error, or too deep nesting selectCRXTrack(nTrack); } @@ -77,8 +76,6 @@ void DCraw::parse_canon_cr3() void DCraw::selectCRXTrack(unsigned short maxTrack) { - if (maxTrack < 0) - return; INT64 bitcounts[LIBRAW_CRXTRACKS_MAXCOUNT], maxbitcount = 0; uint32_t maxjpegbytes = 0; memset(bitcounts, 0, sizeof(bitcounts)); @@ -117,7 +114,7 @@ void DCraw::selectCRXTrack(unsigned short maxTrack) } } is_raw = framecnt; - if (has_framei && framei < LIBRAW_CRXTRACKS_MAXCOUNT) + if (has_framei) { CanonCR3Data::crx_data_header_t *d = &RT_canon_CR3_data.crx_header[framei]; From 319ed6cdd5ac3dbcf5c5b2c7165652a55a34b4e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Thu, 21 Nov 2019 09:57:29 +0100 Subject: [PATCH 168/208] Style with uncrustify, astyle, and clang-tidy --- rtengine/canon_cr3_decoder.cc | 5543 +++++++++++++++++---------------- 1 file changed, 2828 insertions(+), 2715 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index b616a2b42..01bca72f8 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -19,7 +19,7 @@ // Code adapted from ART /* - * + * * This file is part of ART. * * ART is free software: you can redistribute it and/or modify @@ -68,535 +68,530 @@ void DCraw::parse_canon_cr3() szAtomList = ifp->size; err = parseCR3(0ULL, szAtomList, nesting, AtomNameStack, nTrack, TrackType); - if (err == 0 || err == -14) // no error, or too deep nesting + + if (err == 0 || err == -14) { // no error, or too deep nesting selectCRXTrack(nTrack); + } } #define LIBRAW_CRXTRACKS_MAXCOUNT RT_canon_CR3_data.CRXTRACKS_MAXCOUNT void DCraw::selectCRXTrack(unsigned short maxTrack) { - INT64 bitcounts[LIBRAW_CRXTRACKS_MAXCOUNT], maxbitcount = 0; - uint32_t maxjpegbytes = 0; - memset(bitcounts, 0, sizeof(bitcounts)); - for (unsigned int i = 0; i <= maxTrack && i < LIBRAW_CRXTRACKS_MAXCOUNT; i++) - { - CanonCR3Data::crx_data_header_t *d = &RT_canon_CR3_data.crx_header[i]; - if (d->MediaType == 1) // RAW - { - bitcounts[i] = INT64(d->nBits) * INT64(d->f_width) * INT64(d->f_height); - if (bitcounts[i] > maxbitcount) - maxbitcount = bitcounts[i]; - } - else if (d->MediaType == 2) // JPEG - { - if (d->MediaSize > maxjpegbytes) - { - maxjpegbytes = d->MediaSize; - thumb_offset = d->MediaOffset; - thumb_length = d->MediaSize; - } - } - } - if (maxbitcount < 8) - return; - bool has_framei = false; - unsigned int framei = 0, framecnt = 0; - for (unsigned int i = 0; i <= maxTrack && i < LIBRAW_CRXTRACKS_MAXCOUNT; i++) - { - if (bitcounts[i] == maxbitcount) - { - if (framecnt <= shot_select) { - has_framei = true; - framei = i; - } - framecnt++; - } - } - is_raw = framecnt; - if (has_framei) - { - CanonCR3Data::crx_data_header_t *d = - &RT_canon_CR3_data.crx_header[framei]; - data_offset = d->MediaOffset; - //data_size = d->MediaSize; - raw_width = d->f_width; - raw_height = d->f_height; - load_raw = &DCraw::crxLoadRaw; - switch (d->cfaLayout) - { - case 0: - filters = 0x94949494; - break; - case 1: - filters = 0x61616161; - break; - case 2: - filters = 0x49494949; - break; - case 3: - filters = 0x16161616; - break; + INT64 bitcounts[LIBRAW_CRXTRACKS_MAXCOUNT], maxbitcount = 0; + uint32_t maxjpegbytes = 0; + memset(bitcounts, 0, sizeof(bitcounts)); + + for (unsigned int i = 0; i <= maxTrack && i < LIBRAW_CRXTRACKS_MAXCOUNT; i++) { + CanonCR3Data::crx_data_header_t* d = &RT_canon_CR3_data.crx_header[i]; + + if (d->MediaType == 1) {// RAW + bitcounts[i] = INT64(d->nBits) * INT64(d->f_width) * INT64(d->f_height); + + if (bitcounts[i] > maxbitcount) { + maxbitcount = bitcounts[i]; + } + } else if (d->MediaType == 2) {// JPEG + if (d->MediaSize > maxjpegbytes) { + maxjpegbytes = d->MediaSize; + thumb_offset = d->MediaOffset; + thumb_length = d->MediaSize; + } + } } - RT_canon_CR3_data.crx_track_selected = framei; + if (maxbitcount < 8) { + return; + } - int tiff_idx = -1; - INT64 tpixels = 0; - for (unsigned int i = 0; i < tiff_nifds; i++) - if (INT64(tiff_ifd[i].height) * INT64(tiff_ifd[i].height) > tpixels) - { - tpixels = INT64(tiff_ifd[i].height) * INT64(tiff_ifd[i].height); - tiff_idx = i; - } - if (tiff_idx >= 0) - flip = tiff_ifd[tiff_idx].flip; - } + bool has_framei = false; + unsigned int framei = 0, framecnt = 0; + + for (unsigned int i = 0; i <= maxTrack && i < LIBRAW_CRXTRACKS_MAXCOUNT; i++) { + if (bitcounts[i] == maxbitcount) { + if (framecnt <= shot_select) { + has_framei = true; + framei = i; + } + + framecnt++; + } + } + + is_raw = framecnt; + + if (has_framei) { + CanonCR3Data::crx_data_header_t* d = + &RT_canon_CR3_data.crx_header[framei]; + data_offset = d->MediaOffset; + // data_size = d->MediaSize; + raw_width = d->f_width; + raw_height = d->f_height; + load_raw = &DCraw::crxLoadRaw; + + switch (d->cfaLayout) { + case 0: { + filters = 0x94949494; + break; + } + + case 1: { + filters = 0x61616161; + break; + } + + case 2: { + filters = 0x49494949; + break; + } + + case 3: { + filters = 0x16161616; + break; + } + } + + RT_canon_CR3_data.crx_track_selected = framei; + + int tiff_idx = -1; + INT64 tpixels = 0; + + for (unsigned int i = 0; i < tiff_nifds; i++) { + if (INT64(tiff_ifd[i].height) * INT64(tiff_ifd[i].height) > tpixels) { + tpixels = INT64(tiff_ifd[i].height) * INT64(tiff_ifd[i].height); + tiff_idx = i; + } + } + + if (tiff_idx >= 0) { + flip = tiff_ifd[tiff_idx].flip; + } + } } -#define FORC4 for (c=0; c < 4; c++) +#define FORC4 for (c = 0; c < 4; c++) #define bad_hdr \ - (((order != 0x4d4d) && (order != 0x4949)) || (get2() != 0x002a) || \ - (get4() != 0x00000008)) + (((order != 0x4d4d) && (order != 0x4949)) || (get2() != 0x002a) || \ + (get4() != 0x00000008)) int DCraw::parseCR3(unsigned long long oAtomList, - unsigned long long szAtomList, short &nesting, - char *AtomNameStack, unsigned short &nTrack, short &TrackType) + unsigned long long szAtomList, short& nesting, + char* AtomNameStack, unsigned short& nTrack, short& TrackType) { - /* - Atom starts with 4 bytes for Atom size and 4 bytes containing Atom name - Atom size includes the length of the header and the size of all "contained" - Atoms if Atom size == 1, Atom has the extended size stored in 8 bytes located - after the Atom name if Atom size == 0, it is the last top-level Atom extending - to the end of the file Atom name is often a 4 symbol mnemonic, but can be a - 4-byte integer - */ - const char UIID_Canon[17] = - "\x85\xc0\xb6\x87\x82\x0f\x11\xe0\x81\x11\xf4\xce\x46\x2b\x6a\x48"; + /* + Atom starts with 4 bytes for Atom size and 4 bytes containing Atom name + Atom size includes the length of the header and the size of all "contained" + Atoms if Atom size == 1, Atom has the extended size stored in 8 bytes located + after the Atom name if Atom size == 0, it is the last top-level Atom extending + to the end of the file Atom name is often a 4 symbol mnemonic, but can be a + 4-byte integer + */ + const char UIID_Canon[17] = + "\x85\xc0\xb6\x87\x82\x0f\x11\xe0\x81\x11\xf4\xce\x46\x2b\x6a\x48"; // const char UIID_Preview[17] = // "\xea\xf4\x2b\x5e\x1c\x98\x4b\x88\xb9\xfb\xb7\xdc\x40\x6e\x4d\x16"; - /* - AtomType = 0 - unknown: "unk." - AtomType = 1 - container atom: "cont" - AtomType = 2 - leaf atom: "leaf" - AtomType = 3 - can be container, can be leaf: "both" - */ + /* + AtomType = 0 - unknown: "unk." + AtomType = 1 - container atom: "cont" + AtomType = 2 - leaf atom: "leaf" + AtomType = 3 - can be container, can be leaf: "both" + */ // const char sAtomeType[4][5] = {"unk.", "cont", "leaf", "both"}; - short AtomType; - static const struct - { - char AtomName[5]; short AtomType; - } AtomNamesList[] = { - {"dinf", 1}, - {"edts", 1}, - {"fiin", 1}, - {"ipro", 1}, - {"iprp", 1}, - {"mdia", 1}, - {"meco", 1}, - {"mere", 1}, - {"mfra", 1}, - {"minf", 1}, - {"moof", 1}, - {"moov", 1}, - {"mvex", 1}, - {"paen", 1}, - {"schi", 1}, - {"sinf", 1}, - {"skip", 1}, - {"stbl", 1}, - {"stsd", 1}, - {"strk", 1}, - {"tapt", 1}, - {"traf", 1}, - {"trak", 1}, + static const struct { + char AtomName[5]; + short AtomType; + } AtomNamesList[] = { + {"dinf", 1}, + {"edts", 1}, + {"fiin", 1}, + {"ipro", 1}, + {"iprp", 1}, + {"mdia", 1}, + {"meco", 1}, + {"mere", 1}, + {"mfra", 1}, + {"minf", 1}, + {"moof", 1}, + {"moov", 1}, + {"mvex", 1}, + {"paen", 1}, + {"schi", 1}, + {"sinf", 1}, + {"skip", 1}, + {"stbl", 1}, + {"stsd", 1}, + {"strk", 1}, + {"tapt", 1}, + {"traf", 1}, + {"trak", 1}, - {"cdsc", 2}, - {"colr", 2}, - {"dimg", 2}, - // {"dref", 2}, - {"free", 2}, - {"frma", 2}, - {"ftyp", 2}, - {"hdlr", 2}, - {"hvcC", 2}, - {"iinf", 2}, - {"iloc", 2}, - {"infe", 2}, - {"ipco", 2}, - {"ipma", 2}, - {"iref", 2}, - {"irot", 2}, - {"ispe", 2}, - {"meta", 2}, - {"mvhd", 2}, - {"pitm", 2}, - {"pixi", 2}, - {"schm", 2}, - {"thmb", 2}, - {"tkhd", 2}, - {"url ", 2}, - {"urn ", 2}, + {"cdsc", 2}, + {"colr", 2}, + {"dimg", 2}, + // {"dref", 2}, + {"free", 2}, + {"frma", 2}, + {"ftyp", 2}, + {"hdlr", 2}, + {"hvcC", 2}, + {"iinf", 2}, + {"iloc", 2}, + {"infe", 2}, + {"ipco", 2}, + {"ipma", 2}, + {"iref", 2}, + {"irot", 2}, + {"ispe", 2}, + {"meta", 2}, + {"mvhd", 2}, + {"pitm", 2}, + {"pixi", 2}, + {"schm", 2}, + {"thmb", 2}, + {"tkhd", 2}, + {"url ", 2}, + {"urn ", 2}, - {"CCTP", 1}, - {"CRAW", 1}, + {"CCTP", 1}, + {"CRAW", 1}, - {"JPEG", 2}, - {"CDI1", 2}, - {"CMP1", 2}, + {"JPEG", 2}, + {"CDI1", 2}, + {"CMP1", 2}, - {"CNCV", 2}, - {"CCDT", 2}, - {"CTBO", 2}, - {"CMT1", 2}, - {"CMT2", 2}, - {"CMT3", 2}, - {"CMT4", 2}, - {"THMB", 2}, - {"co64", 2}, - {"mdat", 2}, - {"mdhd", 2}, - {"nmhd", 2}, - {"stsc", 2}, - {"stsz", 2}, - {"stts", 2}, - {"vmhd", 2}, + {"CNCV", 2}, + {"CCDT", 2}, + {"CTBO", 2}, + {"CMT1", 2}, + {"CMT2", 2}, + {"CMT3", 2}, + {"CMT4", 2}, + {"THMB", 2}, + {"co64", 2}, + {"mdat", 2}, + {"mdhd", 2}, + {"nmhd", 2}, + {"stsc", 2}, + {"stsz", 2}, + {"stts", 2}, + {"vmhd", 2}, - {"dref", 3}, - {"uuid", 3}, - }; + {"dref", 3}, + {"uuid", 3}, + }; - const char sHandlerType[5][5] = {"unk.", "soun", "vide", "hint", "meta"}; + const char sHandlerType[5][5] = {"unk.", "soun", "vide", "hint", "meta"}; - unsigned int c; - int err = 0; + unsigned int c; + int err = 0; - ushort tL; // Atom length represented in 4 or 8 bytes - char nmAtom[5]; // Atom name - unsigned long long oAtom, szAtom; // Atom offset and Atom size - unsigned long long oAtomContent, - szAtomContent; // offset and size of Atom content - unsigned long long lHdr; + ushort tL; // Atom length represented in 4 or 8 bytes + char nmAtom[5]; // Atom name + unsigned long long oAtom, szAtom; // Atom offset and Atom size + unsigned long long oAtomContent, + szAtomContent; // offset and size of Atom content + unsigned long long lHdr; - char UIID[16]; - uchar CMP1[36]; - char HandlerType[5], MediaFormatID[5]; + char UIID[16]; + uchar CMP1[36]; + char HandlerType[5], MediaFormatID[5]; // unsigned ImageWidth, ImageHeight; - long relpos_inDir, relpos_inBox; - unsigned szItem, Tag, lTag; - ushort tItem; + long relpos_inDir, relpos_inBox; + unsigned szItem, Tag, lTag; + ushort tItem; - nmAtom[0] = MediaFormatID[0] = nmAtom[4] = MediaFormatID[4] = '\0'; - strcpy(HandlerType, sHandlerType[0]); + nmAtom[0] = MediaFormatID[0] = nmAtom[4] = MediaFormatID[4] = '\0'; + strcpy(HandlerType, sHandlerType[0]); // ImageWidth = ImageHeight = 0U; - oAtom = oAtomList; - nesting++; - if (nesting > 31) - return -14; // too deep nesting - short s_order = order; + oAtom = oAtomList; + nesting++; - while ((oAtom + 8ULL) <= (oAtomList + szAtomList)) - { - lHdr = 0ULL; - err = 0; - order = 0x4d4d; - fseek(ifp, oAtom, SEEK_SET); - szAtom = get4(); - FORC4 nmAtom[c] = AtomNameStack[nesting * 4 + c] = fgetc(ifp); - AtomNameStack[(nesting + 1) * 4] = '\0'; - tL = 4; - AtomType = 0; - - for (c = 0; c < sizeof AtomNamesList / sizeof *AtomNamesList; c++) - if (!strcmp(nmAtom, AtomNamesList[c].AtomName)) - { - AtomType = AtomNamesList[c].AtomType; - break; - } - - if (!AtomType) - { - err = 1; + if (nesting > 31) { + return -14; // too deep nesting } - if (szAtom == 0ULL) - { - if (nesting != 0) - { - err = -2; - goto fin; - } - szAtom = szAtomList - oAtom; - oAtomContent = oAtom + 8ULL; - szAtomContent = szAtom - 8ULL; - } - else if (szAtom == 1ULL) - { - if ((oAtom + 16ULL) > (oAtomList + szAtomList)) - { - err = -3; - goto fin; - } - tL = 8; - szAtom = (((unsigned long long)get4()) << 32) | get4(); - oAtomContent = oAtom + 16ULL; - szAtomContent = szAtom - 16ULL; - } - else - { - oAtomContent = oAtom + 8ULL; - szAtomContent = szAtom - 8ULL; - } + short s_order = order; - if (!strcmp(nmAtom, "trak")) - { - nTrack++; - TrackType = 0; - if (nTrack >= LIBRAW_CRXTRACKS_MAXCOUNT) - break; - } - if (!strcmp(AtomNameStack, "moovuuid")) - { - lHdr = 16ULL; - fread(UIID, 1, lHdr, ifp); - if (!strncmp(UIID, UIID_Canon, lHdr)) - { - AtomType = 1; - } - else - fseek(ifp, -lHdr, SEEK_CUR); - } - else if (!strcmp(AtomNameStack, "moovuuidCCTP")) - { - lHdr = 12ULL; - } - else if (!strcmp(AtomNameStack, "moovuuidCMT1")) - { - short q_order = order; - order = get2(); - if ((tL != 4) || bad_hdr) - { - err = -4; - goto fin; - } - parse_tiff_ifd(oAtomContent); - order = q_order; - } - else if (!strcmp(AtomNameStack, "moovuuidCMT2")) - { - short q_order = order; - order = get2(); - if ((tL != 4) || bad_hdr) - { - err = -5; - goto fin; - } - parse_exif(oAtomContent); - order = q_order; - } - else if (!strcmp(AtomNameStack, "moovuuidCMT3")) - { - short q_order = order; - order = get2(); - if ((tL != 4) || bad_hdr) - { - err = -6; - goto fin; - } - fseek(ifp, -12L, SEEK_CUR); - parse_makernote(oAtomContent, 0); - order = q_order; - } - else if (!strcmp(AtomNameStack, "moovuuidCMT4")) - { - short q_order = order; - order = get2(); - if ((tL != 4) || bad_hdr) - { - err = -6; - goto fin; - } - INT64 off = ftell(ifp); - parse_gps(oAtomContent); - fseek(ifp, off, SEEK_SET); + while ((oAtom + 8ULL) <= (oAtomList + szAtomList)) { + lHdr = 0ULL; + err = 0; + order = 0x4d4d; + fseek(ifp, oAtom, SEEK_SET); + szAtom = get4(); + FORC4 nmAtom[c] = AtomNameStack[nesting * 4 + c] = fgetc(ifp); + AtomNameStack[(nesting + 1) * 4] = '\0'; + tL = 4; + AtomType = 0; + + for (c = 0; c < sizeof AtomNamesList / sizeof * AtomNamesList; c++) { + if (!strcmp(nmAtom, AtomNamesList[c].AtomName)) { + AtomType = AtomNamesList[c].AtomType; + break; + } + } + + if (!AtomType) { + err = 1; + } + + if (szAtom == 0ULL) { + if (nesting != 0) { + err = -2; + goto fin; + } + + szAtom = szAtomList - oAtom; + oAtomContent = oAtom + 8ULL; + szAtomContent = szAtom - 8ULL; + } else if (szAtom == 1ULL) { + if ((oAtom + 16ULL) > (oAtomList + szAtomList)) { + err = -3; + goto fin; + } + + tL = 8; + szAtom = (((unsigned long long)get4()) << 32) | get4(); + oAtomContent = oAtom + 16ULL; + szAtomContent = szAtom - 16ULL; + } else { + oAtomContent = oAtom + 8ULL; + szAtomContent = szAtom - 8ULL; + } + + if (!strcmp(nmAtom, "trak")) { + nTrack++; + TrackType = 0; + + if (nTrack >= LIBRAW_CRXTRACKS_MAXCOUNT) { + break; + } + } + + if (!strcmp(AtomNameStack, "moovuuid")) { + lHdr = 16ULL; + fread(UIID, 1, lHdr, ifp); + + if (!strncmp(UIID, UIID_Canon, lHdr)) { + AtomType = 1; + } else { + fseek(ifp, -lHdr, SEEK_CUR); + } + } else if (!strcmp(AtomNameStack, "moovuuidCCTP")) { + lHdr = 12ULL; + } else if (!strcmp(AtomNameStack, "moovuuidCMT1")) { + short q_order = order; + order = get2(); + + if ((tL != 4) || bad_hdr) { + err = -4; + goto fin; + } + + parse_tiff_ifd(oAtomContent); + order = q_order; + } else if (!strcmp(AtomNameStack, "moovuuidCMT2")) { + short q_order = order; + order = get2(); + + if ((tL != 4) || bad_hdr) { + err = -5; + goto fin; + } + + parse_exif(oAtomContent); + order = q_order; + } else if (!strcmp(AtomNameStack, "moovuuidCMT3")) { + short q_order = order; + order = get2(); + + if ((tL != 4) || bad_hdr) { + err = -6; + goto fin; + } + + fseek(ifp, -12L, SEEK_CUR); + parse_makernote(oAtomContent, 0); + order = q_order; + } else if (!strcmp(AtomNameStack, "moovuuidCMT4")) { + short q_order = order; + order = get2(); + + if ((tL != 4) || bad_hdr) { + err = -6; + goto fin; + } + + INT64 off = ftell(ifp); + parse_gps(oAtomContent); + fseek(ifp, off, SEEK_SET); // parse_gps_libraw(oAtomContent); - order = q_order; - } - else if (!strcmp(AtomNameStack, "moovtrakmdiahdlr")) - { - fseek(ifp, 8L, SEEK_CUR); - FORC4 HandlerType[c] = fgetc(ifp); - for (c = 1; c < sizeof sHandlerType / sizeof *sHandlerType; c++) - if (!strcmp(HandlerType, sHandlerType[c])) - { - TrackType = c; - break; - } - } - else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsd")) - { - if (szAtomContent >= 16) - { - fseek(ifp, 12L, SEEK_CUR); - lHdr = 8; - } - else - { - err = -7; - goto fin; - } - FORC4 MediaFormatID[c] = fgetc(ifp); - if ((TrackType == 2) && (!strcmp(MediaFormatID, "CRAW"))) - { - if (szAtomContent >= 44) - fseek(ifp, 24L, SEEK_CUR); - else - { - err = -8; - goto fin; - } - } - else - { - AtomType = 2; // only continue for CRAW - lHdr = 0; - } + order = q_order; + } else if (!strcmp(AtomNameStack, "moovtrakmdiahdlr")) { + fseek(ifp, 8L, SEEK_CUR); + FORC4 HandlerType[c] = fgetc(ifp); + + for (c = 1; c < sizeof sHandlerType / sizeof * sHandlerType; c++) { + if (!strcmp(HandlerType, sHandlerType[c])) { + TrackType = c; + break; + } + } + } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsd")) { + if (szAtomContent >= 16) { + fseek(ifp, 12L, SEEK_CUR); + lHdr = 8; + } else { + err = -7; + goto fin; + } + + FORC4 MediaFormatID[c] = fgetc(ifp); + + if ((TrackType == 2) && (!strcmp(MediaFormatID, "CRAW"))) { + if (szAtomContent >= 44) { + fseek(ifp, 24L, SEEK_CUR); + } else { + err = -8; + goto fin; + } + } else { + AtomType = 2; // only continue for CRAW + lHdr = 0; + } + #define current_track RT_canon_CR3_data.crx_header[nTrack] - /*ImageWidth = */get2(); - /*ImageHeight = */get2(); - } - else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAW")) - { - lHdr = 82; - } - else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAWCMP1")) - { - if (szAtomContent >= 40) - fread(CMP1, 1, 36, ifp); - else - { - err = -7; - goto fin; - } - if (!crxParseImageHeader(CMP1, nTrack)) - current_track.MediaType = 1; - } - else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAWJPEG")) - { - current_track.MediaType = 2; - } - else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsz")) - { - if (szAtomContent == 12) - fseek(ifp, 4L, SEEK_CUR); - else if (szAtomContent == 16) - fseek(ifp, 12L, SEEK_CUR); - else - { - err = -9; - goto fin; - } - current_track.MediaSize = get4(); - } - else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblco64")) - { - if (szAtomContent == 16) - fseek(ifp, 8L, SEEK_CUR); - else - { - err = -10; - goto fin; - } - current_track.MediaOffset = (((unsigned long long)get4()) << 32) | get4(); - } - - if (current_track.MediaSize && current_track.MediaOffset && - ((oAtom + szAtom) >= (oAtomList + szAtomList)) && - !strncmp(AtomNameStack, "moovtrakmdiaminfstbl", 20)) - { - if ((TrackType == 4) && (!strcmp(MediaFormatID, "CTMD"))) - { - order = 0x4949; - relpos_inDir = 0L; - while (relpos_inDir + 6 < current_track.MediaSize) - { - fseek(ifp, current_track.MediaOffset + relpos_inDir, SEEK_SET); - szItem = get4(); - tItem = get2(); - if ((relpos_inDir + szItem) > current_track.MediaSize) - { - err = -11; - goto fin; - } - if ((tItem == 7) || (tItem == 8) || (tItem == 9)) - { - relpos_inBox = relpos_inDir + 12L; - while (relpos_inBox + 8 < relpos_inDir + szItem) - { - fseek(ifp, current_track.MediaOffset + relpos_inBox, SEEK_SET); - lTag = get4(); - Tag = get4(); - if (lTag < 8) - { - err = -12; + /*ImageWidth = */ get2(); + /*ImageHeight = */ get2(); + } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAW")) { + lHdr = 82; + } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAWCMP1")) { + if (szAtomContent >= 40) { + fread(CMP1, 1, 36, ifp); + } else { + err = -7; goto fin; - } - else if ((relpos_inBox + lTag) > (relpos_inDir + szItem)) - { - err = -11; - goto fin; - } - if ((Tag == 0x927c) && ((tItem == 7) || (tItem == 8))) - { - fseek(ifp, current_track.MediaOffset + relpos_inBox + 8L, - SEEK_SET); - short q_order = order; - order = get2(); - if (bad_hdr) - { - err = -13; - goto fin; - } - fseek(ifp, -8L, SEEK_CUR); - RT_canon_CR3_data.CR3_CTMDtag = 1; - parse_makernote(current_track.MediaOffset + relpos_inBox + 8, - 0); - RT_canon_CR3_data.CR3_CTMDtag = 0; - order = q_order; - } - relpos_inBox += lTag; } - } - relpos_inDir += szItem; + + if (!crxParseImageHeader(CMP1, nTrack)) { + current_track.MediaType = 1; + } + } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAWJPEG")) { + current_track.MediaType = 2; + } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsz")) { + if (szAtomContent == 12) { + fseek(ifp, 4L, SEEK_CUR); + } else if (szAtomContent == 16) { + fseek(ifp, 12L, SEEK_CUR); + } else { + err = -9; + goto fin; + } + + current_track.MediaSize = get4(); + } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblco64")) { + if (szAtomContent == 16) { + fseek(ifp, 8L, SEEK_CUR); + } else { + err = -10; + goto fin; + } + + current_track.MediaOffset = (((unsigned long long)get4()) << 32) | get4(); } - order = 0x4d4d; - } - } + + if (current_track.MediaSize && current_track.MediaOffset && + ((oAtom + szAtom) >= (oAtomList + szAtomList)) && + !strncmp(AtomNameStack, "moovtrakmdiaminfstbl", 20)) { + if ((TrackType == 4) && (!strcmp(MediaFormatID, "CTMD"))) { + order = 0x4949; + relpos_inDir = 0L; + + while (relpos_inDir + 6 < current_track.MediaSize) { + fseek(ifp, current_track.MediaOffset + relpos_inDir, SEEK_SET); + szItem = get4(); + tItem = get2(); + + if ((relpos_inDir + szItem) > current_track.MediaSize) { + err = -11; + goto fin; + } + + if ((tItem == 7) || (tItem == 8) || (tItem == 9)) { + relpos_inBox = relpos_inDir + 12L; + + while (relpos_inBox + 8 < relpos_inDir + szItem) { + fseek(ifp, current_track.MediaOffset + relpos_inBox, SEEK_SET); + lTag = get4(); + Tag = get4(); + + if (lTag < 8) { + err = -12; + goto fin; + } else if ((relpos_inBox + lTag) > (relpos_inDir + szItem)) { + err = -11; + goto fin; + } + + if ((Tag == 0x927c) && ((tItem == 7) || (tItem == 8))) { + fseek(ifp, current_track.MediaOffset + relpos_inBox + 8L, + SEEK_SET); + short q_order = order; + order = get2(); + + if (bad_hdr) { + err = -13; + goto fin; + } + + fseek(ifp, -8L, SEEK_CUR); + RT_canon_CR3_data.CR3_CTMDtag = 1; + parse_makernote(current_track.MediaOffset + relpos_inBox + 8, + 0); + RT_canon_CR3_data.CR3_CTMDtag = 0; + order = q_order; + } + + relpos_inBox += lTag; + } + } + + relpos_inDir += szItem; + } + + order = 0x4d4d; + } + } + #undef current_track - if (AtomType == 1) - { - err = parseCR3(oAtomContent + lHdr, szAtomContent - lHdr, nesting, - AtomNameStack, nTrack, TrackType); - if (err) - goto fin; + + if (AtomType == 1) { + err = parseCR3(oAtomContent + lHdr, szAtomContent - lHdr, nesting, + AtomNameStack, nTrack, TrackType); + + if (err) { + goto fin; + } + } + + oAtom += szAtom; } - oAtom += szAtom; - } fin: - nesting--; - if (nesting >= 0) - AtomNameStack[nesting * 4] = '\0'; - order = s_order; - return err; + nesting--; + + if (nesting >= 0) { + AtomNameStack[nesting * 4] = '\0'; + } + + order = s_order; + return err; } #undef bad_hdr - -//----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- #ifdef _abs #undef _abs @@ -607,17 +602,17 @@ fin: #define _min(a, b) ((a) < (b) ? (a) : (b)) #define _constrain(x, l, u) ((x) < (l) ? (l) : ((x) > (u) ? (u) : (x))) -#if defined(__clang__) || defined(__GNUG__) +#if defined (__clang__) || defined (__GNUG__) #define libraw_inline inline __attribute__((always_inline)) -#elif defined(_MSC_VER) && _MSC_VER > 1400 +#elif defined (_MSC_VER) && _MSC_VER > 1400 #define libraw_inline __forceinline #else #define libraw_inline inline #endif -namespace { - -static unsigned sgetn (int n, unsigned char *s) +namespace +{ +static unsigned sgetn(int n, unsigned char* s) { unsigned result = 0; @@ -630,13 +625,13 @@ static unsigned sgetn (int n, unsigned char *s) // this should be divisible by 4 #define CRX_BUF_SIZE 0x10000 -#if !defined(_WIN32) || (defined (__GNUC__) && !defined(__INTRINSIC_SPECIAL__BitScanReverse)) +#if !defined (_WIN32) || (defined (__GNUC__) && !defined (__INTRINSIC_SPECIAL__BitScanReverse)) /* __INTRINSIC_SPECIAL__BitScanReverse found in MinGW32-W64 v7.30 headers, may be there is a better solution? */ -typedef uint32_t DWORD; -typedef uint8_t byte; -libraw_inline void _BitScanReverse(DWORD *Index, unsigned long Mask) +using DWORD = uint32_t; +using byte = uint8_t; +libraw_inline void _BitScanReverse(DWORD* Index, unsigned long Mask) { - *Index = sizeof(unsigned long) * 8 - 1 - __builtin_clzl(Mask); + *Index = sizeof(unsigned long) * 8 - 1 - __builtin_clzl(Mask); } uint32_t _byteswap_ulong(uint32_t x) { @@ -648,128 +643,128 @@ uint32_t _byteswap_ulong(uint32_t x) } #endif - #define LIBRAW_EXCEPTION_IO_EOF std::exception() struct LibRaw_abstract_datastream { - IMFILE *ifp; - - void lock() {} - void unlock() {} - void seek(int p, int how) { fseek(ifp, p, how); } + IMFILE* ifp; + + void lock() + { + } + void unlock() + { + } + void seek(int p, int how) + { + fseek(ifp, p, how); + } int read(void* dst, int es, int count) - { return fread(dst, es, count, ifp); } + { + return fread(dst, es, count, ifp); + } }; -struct CrxBitstream -{ - uint8_t mdatBuf[CRX_BUF_SIZE]; - uint64_t mdatSize; - uint64_t curBufOffset; - uint32_t curPos; - uint32_t curBufSize; - uint32_t bitData; - int32_t bitsLeft; - LibRaw_abstract_datastream *input; +struct CrxBitstream { + uint8_t mdatBuf[CRX_BUF_SIZE]; + uint64_t mdatSize; + uint64_t curBufOffset; + uint32_t curPos; + uint32_t curBufSize; + uint32_t bitData; + int32_t bitsLeft; + LibRaw_abstract_datastream* input; }; -struct CrxBandParam -{ - CrxBitstream bitStream; - int16_t subbandWidth; - int16_t subbandHeight; - int32_t roundedBitsMask; - int32_t roundedBits; - int16_t curLine; - int32_t *lineBuf0; - int32_t *lineBuf1; - int32_t *lineBuf2; - int32_t sParam; - int32_t kParam; - int32_t *paramData; - int32_t *nonProgrData; - int8_t supportsPartial; +struct CrxBandParam { + CrxBitstream bitStream; + int16_t subbandWidth; + int16_t subbandHeight; + int32_t roundedBitsMask; + int32_t roundedBits; + int16_t curLine; + int32_t* lineBuf0; + int32_t* lineBuf1; + int32_t* lineBuf2; + int32_t sParam; + int32_t kParam; + int32_t* paramData; + int32_t* nonProgrData; + int8_t supportsPartial; }; -struct CrxWaveletTransform -{ - int32_t *subband0Buf; - int32_t *subband1Buf; - int32_t *subband2Buf; - int32_t *subband3Buf; - int32_t *lineBuf[8]; - int16_t curLine; - int16_t curH; - int8_t fltTapH; - int16_t height; - int16_t width; +struct CrxWaveletTransform { + int32_t* subband0Buf; + int32_t* subband1Buf; + int32_t* subband2Buf; + int32_t* subband3Buf; + int32_t* lineBuf[8]; + int16_t curLine; + int16_t curH; + int8_t fltTapH; + int16_t height; + int16_t width; }; -struct CrxSubband -{ - CrxBandParam *bandParam; - uint64_t mdatOffset; - uint8_t *bandBuf; - int32_t bandSize; - uint64_t dataSize; - int8_t supportsPartial; - int32_t quantValue; - uint16_t width; - uint16_t height; - int32_t paramK; - int64_t dataOffset; +struct CrxSubband { + CrxBandParam* bandParam; + uint64_t mdatOffset; + uint8_t* bandBuf; + int32_t bandSize; + uint64_t dataSize; + int8_t supportsPartial; + int32_t quantValue; + uint16_t width; + uint16_t height; + int32_t paramK; + int64_t dataOffset; }; -struct CrxPlaneComp -{ - byte *compBuf; - CrxSubband *subBands; - CrxWaveletTransform *waveletTransform; - int8_t compNumber; - int64_t dataOffset; - int32_t compSize; - int8_t supportsPartial; - int32_t roundedBitsMask; - int8_t tileFlag; +struct CrxPlaneComp { + byte* compBuf; + CrxSubband* subBands; + CrxWaveletTransform* waveletTransform; + int8_t compNumber; + int64_t dataOffset; + int32_t compSize; + int8_t supportsPartial; + int32_t roundedBitsMask; + int8_t tileFlag; }; -struct CrxTile -{ - CrxPlaneComp *comps; - int8_t tileFlag; - int8_t tileNumber; - int64_t dataOffset; - int32_t tileSize; - uint16_t width; - uint16_t height; +struct CrxTile { + CrxPlaneComp* comps; + int8_t tileFlag; + int8_t tileNumber; + int64_t dataOffset; + int32_t tileSize; + uint16_t width; + uint16_t height; }; -struct CrxImage -{ - uint8_t nPlanes; - uint16_t planeWidth; - uint16_t planeHeight; - uint8_t samplePrecision; - uint8_t subbandCount; - uint8_t levels; - uint8_t nBits; - uint8_t encType; - uint8_t tileCols; - uint8_t tileRows; - CrxTile *tiles; - uint64_t mdatOffset; - uint64_t mdatSize; - int16_t *outBufs[4]; // one per plane - int16_t *planeBuf; - LibRaw_abstract_datastream *input; +struct CrxImage { + uint8_t nPlanes; + uint16_t planeWidth; + uint16_t planeHeight; + uint8_t samplePrecision; + uint8_t subbandCount; + uint8_t levels; + uint8_t nBits; + uint8_t encType; + uint8_t tileCols; + uint8_t tileRows; + CrxTile* tiles; + uint64_t mdatOffset; + uint64_t mdatSize; + int16_t* outBufs[4];// one per plane + int16_t* planeBuf; + LibRaw_abstract_datastream* input; }; -enum TileFlags -{ - E_HAS_TILES_ON_THE_RIGHT = 1, - E_HAS_TILES_ON_THE_LEFT = 2, - E_HAS_TILES_ON_THE_BOTTOM = 4, - E_HAS_TILES_ON_THE_TOP = 8 +enum TileFlags { + E_HAS_TILES_ON_THE_RIGHT = 1, + E_HAS_TILES_ON_THE_LEFT = 2, + E_HAS_TILES_ON_THE_BOTTOM = 4, + E_HAS_TILES_ON_THE_TOP = 8 }; int32_t exCoefNumTbl[0x120] = { @@ -789,2341 +784,2459 @@ int32_t exCoefNumTbl[0x120] = { 1, 1, 7, 7, 1, 1, 3, 3, 1, 1, 1, 1, 1, 0, 7, 6, 1, 0, 3, 2, 1, 0, 1, 0, 1, 2, 10, 10, 2, 2, 5, 4, 2, 1, 2, 1, 1, 1, 10, 9, 1, 2, 4, 4, 2, 1, 2, 1, 1, 1, 9, 9, 1, 2, 4, 4, 2, 1, 2, 1, 1, 0, 9, 8, 1, 1, 4, 3, 1, 1, 1, 1, 1, 2, - 8, 8, 2, 1, 4, 3, 1, 1, 1, 1, 1, 1, 8, 7, 1, 1, 3, 3, 1, 1, 1, 1}; + 8, 8, 2, 1, 4, 3, 1, 1, 1, 1, 1, 1, 8, 7, 1, 1, 3, 3, 1, 1, 1, 1 +}; uint32_t JS[32] = {1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 8, 8, 8, 8, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, - 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000}; + 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000 + }; uint32_t J[32] = {0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 6, 6, - 7, 7, 8, 9, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F}; + 7, 7, 8, 9, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F + }; -static inline void crxFillBuffer(CrxBitstream *bitStrm) +static inline void crxFillBuffer(CrxBitstream* bitStrm) { - if (bitStrm->curPos >= bitStrm->curBufSize && bitStrm->mdatSize) - { - bitStrm->curPos = 0; - bitStrm->curBufOffset += bitStrm->curBufSize; + if (bitStrm->curPos >= bitStrm->curBufSize && bitStrm->mdatSize) { + bitStrm->curPos = 0; + bitStrm->curBufOffset += bitStrm->curBufSize; #ifdef _OPENMP -#pragma omp critical + #pragma omp critical #endif - { + { #ifndef _OPENMP - bitStrm->input->lock(); + bitStrm->input->lock(); #endif - bitStrm->input->seek(bitStrm->curBufOffset, SEEK_SET); - bitStrm->curBufSize = bitStrm->input->read( - bitStrm->mdatBuf, 1, _min(bitStrm->mdatSize, CRX_BUF_SIZE)); + bitStrm->input->seek(bitStrm->curBufOffset, SEEK_SET); + bitStrm->curBufSize = bitStrm->input->read( + bitStrm->mdatBuf, 1, _min(bitStrm->mdatSize, CRX_BUF_SIZE)); #ifndef _OPENMP - bitStrm->input->unlock(); + bitStrm->input->unlock(); #endif - if (bitStrm->curBufSize < 1) // nothing read - throw LIBRAW_EXCEPTION_IO_EOF; - bitStrm->mdatSize -= bitStrm->curBufSize; + + if (bitStrm->curBufSize < 1) { // nothing read + throw LIBRAW_EXCEPTION_IO_EOF; + } + + bitStrm->mdatSize -= bitStrm->curBufSize; + } } - } } -libraw_inline int crxBitstreamGetZeros(CrxBitstream *bitStrm) +libraw_inline int crxBitstreamGetZeros(CrxBitstream* bitStrm) { // uint32_t bitData = bitStrm->bitData; - uint32_t nonZeroBit = 0; - uint64_t nextData = 0; - int32_t result = 0; + uint32_t nonZeroBit = 0; + uint64_t nextData = 0; + int32_t result = 0; - if (bitStrm->bitData) - { - _BitScanReverse((DWORD *)&nonZeroBit, (DWORD)bitStrm->bitData); - result = 31 - nonZeroBit; - bitStrm->bitData <<= 32 - nonZeroBit; - bitStrm->bitsLeft -= 32 - nonZeroBit; - } - else - { - uint32_t bitsLeft = bitStrm->bitsLeft; - while (1) - { - while (bitStrm->curPos + 4 <= bitStrm->curBufSize) - { - nextData = - _byteswap_ulong(*(uint32_t *)(bitStrm->mdatBuf + bitStrm->curPos)); - bitStrm->curPos += 4; - crxFillBuffer(bitStrm); - if (nextData) - { - _BitScanReverse((DWORD *)&nonZeroBit, (DWORD)nextData); - result = bitsLeft + 31 - nonZeroBit; - bitStrm->bitData = nextData << (32 - nonZeroBit); - bitStrm->bitsLeft = nonZeroBit; - return result; + if (bitStrm->bitData) { + _BitScanReverse((DWORD*)&nonZeroBit, (DWORD)bitStrm->bitData); + result = 31 - nonZeroBit; + bitStrm->bitData <<= 32 - nonZeroBit; + bitStrm->bitsLeft -= 32 - nonZeroBit; + } else { + uint32_t bitsLeft = bitStrm->bitsLeft; + + while (true) { + while (bitStrm->curPos + 4 <= bitStrm->curBufSize) { + nextData = + _byteswap_ulong(*(uint32_t*)(bitStrm->mdatBuf + bitStrm->curPos)); + bitStrm->curPos += 4; + crxFillBuffer(bitStrm); + + if (nextData) { + _BitScanReverse((DWORD*)&nonZeroBit, (DWORD)nextData); + result = bitsLeft + 31 - nonZeroBit; + bitStrm->bitData = nextData << (32 - nonZeroBit); + bitStrm->bitsLeft = nonZeroBit; + return result; + } + + bitsLeft += 32; + } + + if (bitStrm->curBufSize < bitStrm->curPos + 1) { + break; // error + } + + nextData = bitStrm->mdatBuf[bitStrm->curPos++]; + crxFillBuffer(bitStrm); + + if (nextData) { + break; + } + + bitsLeft += 8; } - bitsLeft += 32; - } - if (bitStrm->curBufSize < bitStrm->curPos + 1) - break; // error - nextData = bitStrm->mdatBuf[bitStrm->curPos++]; - crxFillBuffer(bitStrm); - if (nextData) - break; - bitsLeft += 8; + + _BitScanReverse((DWORD*)&nonZeroBit, (DWORD)nextData); + result = (uint32_t)(bitsLeft + 7 - nonZeroBit); + bitStrm->bitData = nextData << (32 - nonZeroBit); + bitStrm->bitsLeft = nonZeroBit; } - _BitScanReverse((DWORD *)&nonZeroBit, (DWORD)nextData); - result = (uint32_t)(bitsLeft + 7 - nonZeroBit); - bitStrm->bitData = nextData << (32 - nonZeroBit); - bitStrm->bitsLeft = nonZeroBit; - } - return result; + + return result; } -libraw_inline uint32_t crxBitstreamGetBits(CrxBitstream *bitStrm, int bits) +libraw_inline uint32_t crxBitstreamGetBits(CrxBitstream* bitStrm, int bits) { - int bitsLeft = bitStrm->bitsLeft; - uint32_t bitData = bitStrm->bitData; - uint32_t nextWord; - uint8_t nextByte; - uint32_t result; + int bitsLeft = bitStrm->bitsLeft; + uint32_t bitData = bitStrm->bitData; + uint32_t nextWord; + uint8_t nextByte; + uint32_t result; - if (bitsLeft < bits) - { - // get them from stream - if (bitStrm->curPos + 4 <= bitStrm->curBufSize) - { - nextWord = - _byteswap_ulong(*(uint32_t *)(bitStrm->mdatBuf + bitStrm->curPos)); - bitStrm->curPos += 4; - crxFillBuffer(bitStrm); - bitStrm->bitsLeft = 32 - (bits - bitsLeft); - result = ((nextWord >> bitsLeft) | bitData) >> (32 - bits); - bitStrm->bitData = nextWord << (bits - bitsLeft); - return result; + if (bitsLeft < bits) { + // get them from stream + if (bitStrm->curPos + 4 <= bitStrm->curBufSize) { + nextWord = + _byteswap_ulong(*(uint32_t*)(bitStrm->mdatBuf + bitStrm->curPos)); + bitStrm->curPos += 4; + crxFillBuffer(bitStrm); + bitStrm->bitsLeft = 32 - (bits - bitsLeft); + result = ((nextWord >> bitsLeft) | bitData) >> (32 - bits); + bitStrm->bitData = nextWord << (bits - bitsLeft); + return result; + } + + // less than a word left - read byte at a time + do { + if (bitStrm->curPos >= bitStrm->curBufSize) { + break; // error + } + + bitsLeft += 8; + nextByte = bitStrm->mdatBuf[bitStrm->curPos++]; + crxFillBuffer(bitStrm); + bitData |= nextByte << (32 - bitsLeft); + } while (bitsLeft < bits); } - // less than a word left - read byte at a time - do - { - if (bitStrm->curPos >= bitStrm->curBufSize) - break; // error - bitsLeft += 8; - nextByte = bitStrm->mdatBuf[bitStrm->curPos++]; - crxFillBuffer(bitStrm); - bitData |= nextByte << (32 - bitsLeft); - } while (bitsLeft < bits); - } - result = bitData >> (32 - bits); // 32-bits - bitStrm->bitData = bitData << bits; - bitStrm->bitsLeft = bitsLeft - bits; - return result; + + result = bitData >> (32 - bits);// 32-bits + bitStrm->bitData = bitData << bits; + bitStrm->bitsLeft = bitsLeft - bits; + return result; } libraw_inline int crxPredictKParameter(int32_t prevK, int32_t bitCode, int32_t maxVal = 0) { - int32_t newKParam = prevK - (bitCode < (1 << prevK >> 1)) + - ((bitCode >> prevK) > 2) + ((bitCode >> prevK) > 5); + int32_t newKParam = prevK - (bitCode < (1 << prevK >> 1)) + + ((bitCode >> prevK) > 2) + ((bitCode >> prevK) > 5); - return !maxVal || newKParam < maxVal ? newKParam : maxVal; + return !maxVal || newKParam < maxVal ? newKParam : maxVal; } -libraw_inline void crxDecodeSymbolL1(CrxBandParam *param, +libraw_inline void crxDecodeSymbolL1(CrxBandParam* param, int32_t doMedianPrediction, int32_t notEOL = 0) { - if (doMedianPrediction) - { - int32_t symb[4]; + if (doMedianPrediction) { + int32_t symb[4]; - int32_t delta = param->lineBuf0[1] - param->lineBuf0[0]; - symb[2] = param->lineBuf1[0]; - symb[0] = symb[1] = delta + symb[2]; - symb[3] = param->lineBuf0[1]; + int32_t delta = param->lineBuf0[1] - param->lineBuf0[0]; + symb[2] = param->lineBuf1[0]; + symb[0] = symb[1] = delta + symb[2]; + symb[3] = param->lineBuf0[1]; - param->lineBuf1[1] = - symb[(((param->lineBuf0[0] < param->lineBuf1[0]) ^ (delta < 0)) << 1) + - ((param->lineBuf1[0] < param->lineBuf0[1]) ^ (delta < 0))]; - } - else - param->lineBuf1[1] = param->lineBuf0[1]; - - // get next error symbol - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); - if (bitCode >= 41) - bitCode = crxBitstreamGetBits(¶m->bitStream, 21); - else if (param->kParam) - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); - - // add converted (+/-) error code to predicted value - param->lineBuf1[1] += -(bitCode & 1) ^ (bitCode >> 1); - - // for not end of the line - use one symbol ahead to estimate next K - if (notEOL) - { - int32_t nextDelta = (param->lineBuf0[2] - param->lineBuf0[1]) << 1; - bitCode = (bitCode + _abs(nextDelta)) >> 1; - ++param->lineBuf0; - } - - // update K parameter - param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); - - ++param->lineBuf1; -} - -int crxDecodeLine(CrxBandParam *param) -{ - int length = param->subbandWidth; - - param->lineBuf1[0] = param->lineBuf0[1]; - for (; length > 1; --length) - { - if (param->lineBuf1[0] != param->lineBuf0[1] || - param->lineBuf1[0] != param->lineBuf0[2]) - { - crxDecodeSymbolL1(param, 1, 1); + param->lineBuf1[1] = + symb[(((param->lineBuf0[0] < param->lineBuf1[0]) ^ (delta < 0)) << 1) + + ((param->lineBuf1[0] < param->lineBuf0[1]) ^ (delta < 0))]; + } else { + param->lineBuf1[1] = param->lineBuf0[1]; } - else - { - int nSyms = 0; - if (crxBitstreamGetBits(¶m->bitStream, 1)) - { - nSyms = 1; - while (crxBitstreamGetBits(¶m->bitStream, 1)) - { - nSyms += JS[param->sParam]; - if (nSyms > length) - { - nSyms = length; - break; - } - if (param->sParam < 31) - ++param->sParam; - if (nSyms == length) - break; - } - if (nSyms < length) - { - if (J[param->sParam]) - nSyms += crxBitstreamGetBits(¶m->bitStream, J[param->sParam]); - if (param->sParam > 0) - --param->sParam; - if (nSyms > length) - return -1; - } + // get next error symbol + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); - length -= nSyms; - - // copy symbol nSyms times - param->lineBuf0 += nSyms; - - // copy symbol nSyms times - while (nSyms-- > 0) - { - param->lineBuf1[1] = param->lineBuf1[0]; - ++param->lineBuf1; - } - } - - if (length > 0) - crxDecodeSymbolL1(param, 0, (length > 1)); - } - } - - if (length == 1) - crxDecodeSymbolL1(param, 1, 0); - - param->lineBuf1[1] = param->lineBuf1[0] + 1; - - return 0; -} - -libraw_inline void crxDecodeSymbolL1Rounded(CrxBandParam *param, - int32_t doSym = 1, - int32_t doCode = 1) -{ - int32_t sym = param->lineBuf0[1]; - - if (doSym) - { - // calculate the next symbol gradient - int32_t symb[4]; - int32_t deltaH = param->lineBuf0[1] - param->lineBuf0[0]; - symb[2] = param->lineBuf1[0]; - symb[0] = symb[1] = deltaH + symb[2]; - symb[3] = param->lineBuf0[1]; - sym = - symb[(((param->lineBuf0[0] < param->lineBuf1[0]) ^ (deltaH < 0)) << 1) + - ((param->lineBuf1[0] < param->lineBuf0[1]) ^ (deltaH < 0))]; - } - - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); - if (bitCode >= 41) - bitCode = crxBitstreamGetBits(¶m->bitStream, 21); - else if (param->kParam) - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); - int32_t code = -(bitCode & 1) ^ (bitCode >> 1); - param->lineBuf1[1] = param->roundedBitsMask * 2 * code + static_cast(code < 0) + sym; - - if (doCode) - { - if (param->lineBuf0[2] > param->lineBuf0[1]) - code = (param->lineBuf0[2] - param->lineBuf0[1] + param->roundedBitsMask - - 1) >> - param->roundedBits; - else - code = -( - (param->lineBuf0[1] - param->lineBuf0[2] + param->roundedBitsMask) >> - param->roundedBits); - - param->kParam = crxPredictKParameter(param->kParam, - (bitCode + 2 * _abs(code)) >> 1, 15); - } - else - param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); - - ++param->lineBuf1; -} - -int crxDecodeLineRounded(CrxBandParam *param) -{ - int32_t valueReached = 0; - - param->lineBuf0[0] = param->lineBuf0[1]; - param->lineBuf1[0] = param->lineBuf0[1]; - int32_t length = param->subbandWidth; - - for (; length > 1; --length) - { - if (_abs(param->lineBuf0[2] - param->lineBuf0[1]) > param->roundedBitsMask) - { - crxDecodeSymbolL1Rounded(param); - ++param->lineBuf0; - valueReached = 1; - } - else if (valueReached || _abs(param->lineBuf0[0] - param->lineBuf1[0]) > - param->roundedBitsMask) - { - crxDecodeSymbolL1Rounded(param); - ++param->lineBuf0; - valueReached = 0; - } - else - { - int nSyms = 0; - if (crxBitstreamGetBits(¶m->bitStream, 1)) - { - nSyms = 1; - while (crxBitstreamGetBits(¶m->bitStream, 1)) - { - nSyms += JS[param->sParam]; - if (nSyms > length) - { - nSyms = length; - break; - } - if (param->sParam < 31) - ++param->sParam; - if (nSyms == length) - break; - } - if (nSyms < length) - { - if (J[param->sParam]) - nSyms += crxBitstreamGetBits(¶m->bitStream, J[param->sParam]); - if (param->sParam > 0) - --param->sParam; - } - if (nSyms > length) - return -1; - } - length -= nSyms; - - // copy symbol nSyms times - param->lineBuf0 += nSyms; - - // copy symbol nSyms times - while (nSyms-- > 0) - { - param->lineBuf1[1] = param->lineBuf1[0]; - ++param->lineBuf1; - } - - if (length > 1) - { - crxDecodeSymbolL1Rounded(param, 0); - ++param->lineBuf0; - valueReached = _abs(param->lineBuf0[1] - param->lineBuf0[0]) > - param->roundedBitsMask; - } - else if (length == 1) - crxDecodeSymbolL1Rounded(param, 0, 0); - } - } - if (length == 1) - crxDecodeSymbolL1Rounded(param, 1, 0); - - param->lineBuf1[1] = param->lineBuf1[0] + 1; - - return 0; -} - -int crxDecodeLineNoRefPrevLine(CrxBandParam *param) -{ - int32_t i = 0; - - for (; i < param->subbandWidth - 1; i++) - { - if (param->lineBuf0[i + 2] | param->lineBuf0[i + 1] | param->lineBuf1[i]) - { - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); - if (bitCode >= 41) + if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); - else if (param->kParam) + } else if (param->kParam) { bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); - param->lineBuf1[i + 1] = -(bitCode & 1) ^ (bitCode >> 1); - param->kParam = crxPredictKParameter(param->kParam, bitCode); - if (param->lineBuf2[i + 1] - param->kParam <= 1) - { - if (param->kParam >= 15) - param->kParam = 15; - } - else - ++param->kParam; } - else - { - int nSyms = 0; - if (crxBitstreamGetBits(¶m->bitStream, 1)) - { - nSyms = 1; - if (i != param->subbandWidth - 1) - { - while (crxBitstreamGetBits(¶m->bitStream, 1)) - { - nSyms += JS[param->sParam]; - if (i + nSyms > param->subbandWidth) - { - nSyms = param->subbandWidth - i; - break; + + // add converted (+/-) error code to predicted value + param->lineBuf1[1] += -(bitCode & 1) ^ (bitCode >> 1); + + // for not end of the line - use one symbol ahead to estimate next K + if (notEOL) { + int32_t nextDelta = (param->lineBuf0[2] - param->lineBuf0[1]) << 1; + bitCode = (bitCode + _abs(nextDelta)) >> 1; + ++param->lineBuf0; + } + + // update K parameter + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + + ++param->lineBuf1; +} + +int crxDecodeLine(CrxBandParam* param) +{ + int length = param->subbandWidth; + + param->lineBuf1[0] = param->lineBuf0[1]; + + for (; length > 1; --length) { + if (param->lineBuf1[0] != param->lineBuf0[1] || + param->lineBuf1[0] != param->lineBuf0[2]) { + crxDecodeSymbolL1(param, 1, 1); + } else { + int nSyms = 0; + + if (crxBitstreamGetBits(¶m->bitStream, 1)) { + nSyms = 1; + + while (crxBitstreamGetBits(¶m->bitStream, 1)) { + nSyms += JS[param->sParam]; + + if (nSyms > length) { + nSyms = length; + break; + } + + if (param->sParam < 31) { + ++param->sParam; + } + + if (nSyms == length) { + break; + } + } + + if (nSyms < length) { + if (J[param->sParam]) { + nSyms += crxBitstreamGetBits(¶m->bitStream, J[param->sParam]); + } + + if (param->sParam > 0) { + --param->sParam; + } + + if (nSyms > length) { + return -1; + } + } + + length -= nSyms; + + // copy symbol nSyms times + param->lineBuf0 += nSyms; + + // copy symbol nSyms times + while (nSyms-- > 0) { + param->lineBuf1[1] = param->lineBuf1[0]; + ++param->lineBuf1; + } + } + + if (length > 0) { + crxDecodeSymbolL1(param, 0, (length > 1)); } - if (param->sParam < 31) - ++param->sParam; - if (i + nSyms == param->subbandWidth) - break; - } - if (i + nSyms < param->subbandWidth) - { - if (J[param->sParam]) - nSyms += crxBitstreamGetBits(¶m->bitStream, J[param->sParam]); - if (param->sParam > 0) - --param->sParam; - } - if (i + nSyms > param->subbandWidth) - return -1; } - } - else if (i > param->subbandWidth) - return -1; + } - if (nSyms > 0) - { - memset(param->lineBuf1 + i + 1, 0, nSyms * sizeof(int32_t)); - memset(param->lineBuf2 + i, 0, nSyms * sizeof(int32_t)); - i += nSyms; - } + if (length == 1) { + crxDecodeSymbolL1(param, 1, 0); + } - if (i >= param->subbandWidth - 1) - { - if (i == param->subbandWidth - 1) - { - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); - if (bitCode >= 41) + param->lineBuf1[1] = param->lineBuf1[0] + 1; + + return 0; +} + +libraw_inline void crxDecodeSymbolL1Rounded(CrxBandParam* param, + int32_t doSym = 1, + int32_t doCode = 1) +{ + int32_t sym = param->lineBuf0[1]; + + if (doSym) { + // calculate the next symbol gradient + int32_t symb[4]; + int32_t deltaH = param->lineBuf0[1] - param->lineBuf0[0]; + symb[2] = param->lineBuf1[0]; + symb[0] = symb[1] = deltaH + symb[2]; + symb[3] = param->lineBuf0[1]; + sym = + symb[(((param->lineBuf0[0] < param->lineBuf1[0]) ^ (deltaH < 0)) << 1) + + ((param->lineBuf1[0] < param->lineBuf0[1]) ^ (deltaH < 0))]; + } + + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + + if (bitCode >= 41) { + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + } else if (param->kParam) { + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | + (bitCode << param->kParam); + } + + int32_t code = -(bitCode & 1) ^ (bitCode >> 1); + param->lineBuf1[1] = param->roundedBitsMask * 2 * code + static_cast(code < 0) + sym; + + if (doCode) { + if (param->lineBuf0[2] > param->lineBuf0[1]) { + code = (param->lineBuf0[2] - param->lineBuf0[1] + param->roundedBitsMask - + 1) >> + param->roundedBits; + } else { + code = -( + (param->lineBuf0[1] - param->lineBuf0[2] + param->roundedBitsMask) >> + param->roundedBits); + } + + param->kParam = crxPredictKParameter(param->kParam, + (bitCode + 2 * _abs(code)) >> 1, 15); + } else { + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + } + + ++param->lineBuf1; +} + +int crxDecodeLineRounded(CrxBandParam* param) +{ + int32_t valueReached = 0; + + param->lineBuf0[0] = param->lineBuf0[1]; + param->lineBuf1[0] = param->lineBuf0[1]; + int32_t length = param->subbandWidth; + + for (; length > 1; --length) { + if (_abs(param->lineBuf0[2] - param->lineBuf0[1]) > param->roundedBitsMask) { + crxDecodeSymbolL1Rounded(param); + ++param->lineBuf0; + valueReached = 1; + } else if (valueReached || _abs(param->lineBuf0[0] - param->lineBuf1[0]) > + param->roundedBitsMask) { + crxDecodeSymbolL1Rounded(param); + ++param->lineBuf0; + valueReached = 0; + } else { + int nSyms = 0; + + if (crxBitstreamGetBits(¶m->bitStream, 1)) { + nSyms = 1; + + while (crxBitstreamGetBits(¶m->bitStream, 1)) { + nSyms += JS[param->sParam]; + + if (nSyms > length) { + nSyms = length; + break; + } + + if (param->sParam < 31) { + ++param->sParam; + } + + if (nSyms == length) { + break; + } + } + + if (nSyms < length) { + if (J[param->sParam]) { + nSyms += crxBitstreamGetBits(¶m->bitStream, J[param->sParam]); + } + + if (param->sParam > 0) { + --param->sParam; + } + } + + if (nSyms > length) { + return -1; + } + } + + length -= nSyms; + + // copy symbol nSyms times + param->lineBuf0 += nSyms; + + // copy symbol nSyms times + while (nSyms-- > 0) { + param->lineBuf1[1] = param->lineBuf1[0]; + ++param->lineBuf1; + } + + if (length > 1) { + crxDecodeSymbolL1Rounded(param, 0); + ++param->lineBuf0; + valueReached = _abs(param->lineBuf0[1] - param->lineBuf0[0]) > + param->roundedBitsMask; + } else if (length == 1) { + crxDecodeSymbolL1Rounded(param, 0, 0); + } + } + } + + if (length == 1) { + crxDecodeSymbolL1Rounded(param, 1, 0); + } + + param->lineBuf1[1] = param->lineBuf1[0] + 1; + + return 0; +} + +int crxDecodeLineNoRefPrevLine(CrxBandParam* param) +{ + int32_t i = 0; + + for (; i < param->subbandWidth - 1; i++) { + if (param->lineBuf0[i + 2] | param->lineBuf0[i + 1] | param->lineBuf1[i]) { + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + + if (bitCode >= 41) { + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + } else if (param->kParam) { + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | + (bitCode << param->kParam); + } + + param->lineBuf1[i + 1] = -(bitCode & 1) ^ (bitCode >> 1); + param->kParam = crxPredictKParameter(param->kParam, bitCode); + + if (param->lineBuf2[i + 1] - param->kParam <= 1) { + if (param->kParam >= 15) { + param->kParam = 15; + } + } else { + ++param->kParam; + } + } else { + int nSyms = 0; + + if (crxBitstreamGetBits(¶m->bitStream, 1)) { + nSyms = 1; + + if (i != param->subbandWidth - 1) { + while (crxBitstreamGetBits(¶m->bitStream, 1)) { + nSyms += JS[param->sParam]; + + if (i + nSyms > param->subbandWidth) { + nSyms = param->subbandWidth - i; + break; + } + + if (param->sParam < 31) { + ++param->sParam; + } + + if (i + nSyms == param->subbandWidth) { + break; + } + } + + if (i + nSyms < param->subbandWidth) { + if (J[param->sParam]) { + nSyms += crxBitstreamGetBits(¶m->bitStream, J[param->sParam]); + } + + if (param->sParam > 0) { + --param->sParam; + } + } + + if (i + nSyms > param->subbandWidth) { + return -1; + } + } + } else if (i > param->subbandWidth) { + return -1; + } + + if (nSyms > 0) { + memset(param->lineBuf1 + i + 1, 0, nSyms * sizeof(int32_t)); + memset(param->lineBuf2 + i, 0, nSyms * sizeof(int32_t)); + i += nSyms; + } + + if (i >= param->subbandWidth - 1) { + if (i == param->subbandWidth - 1) { + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + + if (bitCode >= 41) { + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + } else if (param->kParam) { + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | + (bitCode << param->kParam); + } + + param->lineBuf1[i + 1] = -((bitCode + 1) & 1) ^ ((bitCode + 1) >> 1); + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + param->lineBuf2[i] = param->kParam; + } + + continue; + } else { + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + + if (bitCode >= 41) { + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + } else if (param->kParam) { + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | + (bitCode << param->kParam); + } + + param->lineBuf1[i + 1] = -((bitCode + 1) & 1) ^ ((bitCode + 1) >> 1); + param->kParam = crxPredictKParameter(param->kParam, bitCode); + + if (param->lineBuf2[i + 1] - param->kParam <= 1) { + if (param->kParam >= 15) { + param->kParam = 15; + } + } else { + ++param->kParam; + } + } + } + + param->lineBuf2[i] = param->kParam; + } + + if (i == param->subbandWidth - 1) { + int32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + + if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); - else if (param->kParam) + } else if (param->kParam) { bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); - param->lineBuf1[i + 1] = -((bitCode + 1) & 1) ^ ((bitCode + 1) >> 1); - param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); - param->lineBuf2[i] = param->kParam; } - continue; - } - else - { + + param->lineBuf1[i + 1] = -(bitCode & 1) ^ (bitCode >> 1); + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + param->lineBuf2[i] = param->kParam; + } + + return 0; +} + +int crxDecodeTopLine(CrxBandParam* param) +{ + param->lineBuf1[0] = 0; + + int32_t length = param->subbandWidth; + + // read the line from bitstream + for (; length > 1; --length) { + if (param->lineBuf1[0]) { + param->lineBuf1[1] = param->lineBuf1[0]; + } else { + int nSyms = 0; + + if (crxBitstreamGetBits(¶m->bitStream, 1)) { + nSyms = 1; + + while (crxBitstreamGetBits(¶m->bitStream, 1)) { + nSyms += JS[param->sParam]; + + if (nSyms > length) { + nSyms = length; + break; + } + + if (param->sParam < 31) { + ++param->sParam; + } + + if (nSyms == length) { + break; + } + } + + if (nSyms < length) { + if (J[param->sParam]) { + nSyms += crxBitstreamGetBits(¶m->bitStream, J[param->sParam]); + } + + if (param->sParam > 0) { + --param->sParam; + } + + if (nSyms > length) { + return -1; + } + } + + length -= nSyms; + + // copy symbol nSyms times + while (nSyms-- > 0) { + param->lineBuf1[1] = param->lineBuf1[0]; + ++param->lineBuf1; + } + + if (length <= 0) { + break; + } + } + + param->lineBuf1[1] = 0; + } + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); - if (bitCode >= 41) - bitCode = crxBitstreamGetBits(¶m->bitStream, 21); - else if (param->kParam) - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); - param->lineBuf1[i + 1] = -((bitCode + 1) & 1) ^ ((bitCode + 1) >> 1); - param->kParam = crxPredictKParameter(param->kParam, bitCode); - if (param->lineBuf2[i + 1] - param->kParam <= 1) - { - if (param->kParam >= 15) - param->kParam = 15; - } - else - ++param->kParam; - } - } - param->lineBuf2[i] = param->kParam; - } - if (i == param->subbandWidth - 1) - { - int32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); - if (bitCode >= 41) - bitCode = crxBitstreamGetBits(¶m->bitStream, 21); - else if (param->kParam) - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); - param->lineBuf1[i + 1] = -(bitCode & 1) ^ (bitCode >> 1); - param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); - param->lineBuf2[i] = param->kParam; - } - return 0; -} - -int crxDecodeTopLine(CrxBandParam *param) -{ - param->lineBuf1[0] = 0; - - int32_t length = param->subbandWidth; - - // read the line from bitstream - for (; length > 1; --length) - { - if (param->lineBuf1[0]) - param->lineBuf1[1] = param->lineBuf1[0]; - else - { - int nSyms = 0; - if (crxBitstreamGetBits(¶m->bitStream, 1)) - { - nSyms = 1; - while (crxBitstreamGetBits(¶m->bitStream, 1)) - { - nSyms += JS[param->sParam]; - if (nSyms > length) - { - nSyms = length; - break; - } - if (param->sParam < 31) - ++param->sParam; - if (nSyms == length) - break; - } - if (nSyms < length) - { - if (J[param->sParam]) - nSyms += crxBitstreamGetBits(¶m->bitStream, J[param->sParam]); - if (param->sParam > 0) - --param->sParam; - if (nSyms > length) - return -1; + if (bitCode >= 41) { + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + } else if (param->kParam) { + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | + (bitCode << param->kParam); } - length -= nSyms; - - // copy symbol nSyms times - while (nSyms-- > 0) - { - param->lineBuf1[1] = param->lineBuf1[0]; - ++param->lineBuf1; - } - - if (length <= 0) - break; - } - - param->lineBuf1[1] = 0; + param->lineBuf1[1] += -(bitCode & 1) ^ (bitCode >> 1); + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + ++param->lineBuf1; } - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); - if (bitCode >= 41) - bitCode = crxBitstreamGetBits(¶m->bitStream, 21); - else if (param->kParam) - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); - param->lineBuf1[1] += -(bitCode & 1) ^ (bitCode >> 1); - param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); - ++param->lineBuf1; - } - - if (length == 1) - { - param->lineBuf1[1] = param->lineBuf1[0]; - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); - if (bitCode >= 41) - bitCode = crxBitstreamGetBits(¶m->bitStream, 21); - else if (param->kParam) - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); - param->lineBuf1[1] += -(bitCode & 1) ^ (bitCode >> 1); - param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); - ++param->lineBuf1; - } - - param->lineBuf1[1] = param->lineBuf1[0] + 1; - - return 0; -} - -int crxDecodeTopLineRounded(CrxBandParam *param) -{ - param->lineBuf1[0] = 0; - - int32_t length = param->subbandWidth; - - // read the line from bitstream - for (; length > 1; --length) - { - if (_abs(param->lineBuf1[0]) > param->roundedBitsMask) - param->lineBuf1[1] = param->lineBuf1[0]; - else - { - int nSyms = 0; - if (crxBitstreamGetBits(¶m->bitStream, 1)) - { - nSyms = 1; - while (crxBitstreamGetBits(¶m->bitStream, 1)) - { - nSyms += JS[param->sParam]; - if (nSyms > length) - { - nSyms = length; - break; - } - if (param->sParam < 31) - ++param->sParam; - if (nSyms == length) - break; - } - if (nSyms < length) - { - if (J[param->sParam]) - nSyms += crxBitstreamGetBits(¶m->bitStream, J[param->sParam]); - if (param->sParam > 0) - --param->sParam; - if (nSyms > length) - return -1; - } - } - - length -= nSyms; - - // copy symbol nSyms times - while (nSyms-- > 0) - { + if (length == 1) { param->lineBuf1[1] = param->lineBuf1[0]; + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + + if (bitCode >= 41) { + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + } else if (param->kParam) { + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | + (bitCode << param->kParam); + } + + param->lineBuf1[1] += -(bitCode & 1) ^ (bitCode >> 1); + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); ++param->lineBuf1; - } - - if (length <= 0) - break; - - param->lineBuf1[1] = 0; } - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); - if (bitCode >= 41) - bitCode = crxBitstreamGetBits(¶m->bitStream, 21); - else if (param->kParam) - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); + param->lineBuf1[1] = param->lineBuf1[0] + 1; - int32_t sVal = -(bitCode & 1) ^ (bitCode >> 1); - param->lineBuf1[1] += param->roundedBitsMask * 2 * sVal + (sVal >> 31); - param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); - ++param->lineBuf1; - } - - if (length == 1) - { - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); - if (bitCode >= 41) - bitCode = crxBitstreamGetBits(¶m->bitStream, 21); - else if (param->kParam) - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); - int32_t sVal = -(bitCode & 1) ^ (bitCode >> 1); - param->lineBuf1[1] += param->roundedBitsMask * 2 * sVal + (sVal >> 31); - param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); - ++param->lineBuf1; - } - - param->lineBuf1[1] = param->lineBuf1[0] + 1; - - return 0; + return 0; } -int crxDecodeTopLineNoRefPrevLine(CrxBandParam *param) +int crxDecodeTopLineRounded(CrxBandParam* param) { - param->lineBuf0[0] = 0; - param->lineBuf1[0] = 0; - int32_t length = param->subbandWidth; - for (; length > 1; --length) - { - if (param->lineBuf1[0]) - { - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); - if (bitCode >= 41) - bitCode = crxBitstreamGetBits(¶m->bitStream, 21); - else if (param->kParam) - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); - param->lineBuf1[1] = -(bitCode & 1) ^ (bitCode >> 1); - param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); - } - else - { - int nSyms = 0; - if (crxBitstreamGetBits(¶m->bitStream, 1)) - { - nSyms = 1; - while (crxBitstreamGetBits(¶m->bitStream, 1)) - { - nSyms += JS[param->sParam]; - if (nSyms > length) - { - nSyms = length; - break; - } - if (param->sParam < 31) - ++param->sParam; - if (nSyms == length) - break; + param->lineBuf1[0] = 0; + + int32_t length = param->subbandWidth; + + // read the line from bitstream + for (; length > 1; --length) { + if (_abs(param->lineBuf1[0]) > param->roundedBitsMask) { + param->lineBuf1[1] = param->lineBuf1[0]; + } else { + int nSyms = 0; + + if (crxBitstreamGetBits(¶m->bitStream, 1)) { + nSyms = 1; + + while (crxBitstreamGetBits(¶m->bitStream, 1)) { + nSyms += JS[param->sParam]; + + if (nSyms > length) { + nSyms = length; + break; + } + + if (param->sParam < 31) { + ++param->sParam; + } + + if (nSyms == length) { + break; + } + } + + if (nSyms < length) { + if (J[param->sParam]) { + nSyms += crxBitstreamGetBits(¶m->bitStream, J[param->sParam]); + } + + if (param->sParam > 0) { + --param->sParam; + } + + if (nSyms > length) { + return -1; + } + } + } + + length -= nSyms; + + // copy symbol nSyms times + while (nSyms-- > 0) { + param->lineBuf1[1] = param->lineBuf1[0]; + ++param->lineBuf1; + } + + if (length <= 0) { + break; + } + + param->lineBuf1[1] = 0; } - if (nSyms < length) - { - if (J[param->sParam]) - nSyms += crxBitstreamGetBits(¶m->bitStream, J[param->sParam]); - if (param->sParam > 0) - --param->sParam; - if (nSyms > length) + + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + + if (bitCode >= 41) { + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + } else if (param->kParam) { + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | + (bitCode << param->kParam); + } + + int32_t sVal = -(bitCode & 1) ^ (bitCode >> 1); + param->lineBuf1[1] += param->roundedBitsMask * 2 * sVal + (sVal >> 31); + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + ++param->lineBuf1; + } + + if (length == 1) { + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + + if (bitCode >= 41) { + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + } else if (param->kParam) { + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | + (bitCode << param->kParam); + } + + int32_t sVal = -(bitCode & 1) ^ (bitCode >> 1); + param->lineBuf1[1] += param->roundedBitsMask * 2 * sVal + (sVal >> 31); + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + ++param->lineBuf1; + } + + param->lineBuf1[1] = param->lineBuf1[0] + 1; + + return 0; +} + +int crxDecodeTopLineNoRefPrevLine(CrxBandParam* param) +{ + param->lineBuf0[0] = 0; + param->lineBuf1[0] = 0; + int32_t length = param->subbandWidth; + + for (; length > 1; --length) { + if (param->lineBuf1[0]) { + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + + if (bitCode >= 41) { + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + } else if (param->kParam) { + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | + (bitCode << param->kParam); + } + + param->lineBuf1[1] = -(bitCode & 1) ^ (bitCode >> 1); + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + } else { + int nSyms = 0; + + if (crxBitstreamGetBits(¶m->bitStream, 1)) { + nSyms = 1; + + while (crxBitstreamGetBits(¶m->bitStream, 1)) { + nSyms += JS[param->sParam]; + + if (nSyms > length) { + nSyms = length; + break; + } + + if (param->sParam < 31) { + ++param->sParam; + } + + if (nSyms == length) { + break; + } + } + + if (nSyms < length) { + if (J[param->sParam]) { + nSyms += crxBitstreamGetBits(¶m->bitStream, J[param->sParam]); + } + + if (param->sParam > 0) { + --param->sParam; + } + + if (nSyms > length) { + return -1; + } + } + } + + length -= nSyms; + + // copy symbol nSyms times + while (nSyms-- > 0) { + param->lineBuf2[0] = 0; + param->lineBuf1[1] = 0; + ++param->lineBuf1; + ++param->lineBuf2; + } + + if (length <= 0) { + break; + } + + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + + if (bitCode >= 41) { + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + } else if (param->kParam) { + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | + (bitCode << param->kParam); + } + + param->lineBuf1[1] = -((bitCode + 1) & 1) ^ ((bitCode + 1) >> 1); + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + } + + param->lineBuf2[0] = param->kParam; + ++param->lineBuf2; + ++param->lineBuf1; + } + + if (length == 1) { + uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + + if (bitCode >= 41) { + bitCode = crxBitstreamGetBits(¶m->bitStream, 21); + } else if (param->kParam) { + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | + (bitCode << param->kParam); + } + + param->lineBuf1[1] = -(bitCode & 1) ^ (bitCode >> 1); + param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); + param->lineBuf2[0] = param->kParam; + ++param->lineBuf1; + } + + param->lineBuf1[1] = 0; + + return 0; +} + +int crxDecodeLine(CrxBandParam* param, uint8_t* bandBuf) +{ + if (!param || !bandBuf) { + return -1; + } + + if (param->curLine >= param->subbandHeight) { + return -1; + } + + if (param->curLine == 0) { + int32_t lineLength = param->subbandWidth + 2; + + param->sParam = 0; + param->kParam = 0; + + if (param->supportsPartial) { + if (param->roundedBitsMask <= 0) { + param->lineBuf0 = (int32_t*)param->paramData; + param->lineBuf1 = param->lineBuf0 + lineLength; + int32_t* lineBuf = param->lineBuf1 + 1; + + if (crxDecodeTopLine(param)) { + return -1; + } + + memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); + ++param->curLine; + } else { + param->roundedBits = 1; + + if (param->roundedBitsMask & ~1) { + while (param->roundedBitsMask >> param->roundedBits) { + ++param->roundedBits; + } + } + + param->lineBuf0 = (int32_t*)param->paramData; + param->lineBuf1 = param->lineBuf0 + lineLength; + int32_t* lineBuf = param->lineBuf1 + 1; + + if (crxDecodeTopLineRounded(param)) { + return -1; + } + + memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); + ++param->curLine; + } + } else { + param->lineBuf2 = (int32_t*)param->nonProgrData; + param->lineBuf0 = (int32_t*)param->paramData; + param->lineBuf1 = param->lineBuf0 + lineLength; + int32_t* lineBuf = param->lineBuf1 + 1; + + if (crxDecodeTopLineNoRefPrevLine(param)) { + return -1; + } + + memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); + ++param->curLine; + } + } else if (!param->supportsPartial) { + int32_t lineLength = param->subbandWidth + 2; + param->lineBuf2 = (int32_t*)param->nonProgrData; + + if (param->curLine & 1) { + param->lineBuf1 = (int32_t*)param->paramData; + param->lineBuf0 = param->lineBuf1 + lineLength; + } else { + param->lineBuf0 = (int32_t*)param->paramData; + param->lineBuf1 = param->lineBuf0 + lineLength; + } + + int32_t* lineBuf = param->lineBuf1 + 1; + + if (crxDecodeLineNoRefPrevLine(param)) { return -1; } - } - length -= nSyms; - - // copy symbol nSyms times - while (nSyms-- > 0) - { - param->lineBuf2[0] = 0; - param->lineBuf1[1] = 0; - ++param->lineBuf1; - ++param->lineBuf2; - } - - if (length <= 0) - break; - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); - if (bitCode >= 41) - bitCode = crxBitstreamGetBits(¶m->bitStream, 21); - else if (param->kParam) - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); - param->lineBuf1[1] = -((bitCode + 1) & 1) ^ ((bitCode + 1) >> 1); - param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); - } - param->lineBuf2[0] = param->kParam; - ++param->lineBuf2; - ++param->lineBuf1; - } - - if (length == 1) - { - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); - if (bitCode >= 41) - bitCode = crxBitstreamGetBits(¶m->bitStream, 21); - else if (param->kParam) - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); - param->lineBuf1[1] = -(bitCode & 1) ^ (bitCode >> 1); - param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); - param->lineBuf2[0] = param->kParam; - ++param->lineBuf1; - } - - param->lineBuf1[1] = 0; - - return 0; -} - -int crxDecodeLine(CrxBandParam *param, uint8_t *bandBuf) -{ - if (!param || !bandBuf) - return -1; - if (param->curLine >= param->subbandHeight) - return -1; - - if (param->curLine == 0) - { - int32_t lineLength = param->subbandWidth + 2; - - param->sParam = 0; - param->kParam = 0; - if (param->supportsPartial) - { - if (param->roundedBitsMask <= 0) - { - param->lineBuf0 = (int32_t *)param->paramData; - param->lineBuf1 = param->lineBuf0 + lineLength; - int32_t *lineBuf = param->lineBuf1 + 1; - if (crxDecodeTopLine(param)) - return -1; memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); ++param->curLine; - } - else - { - param->roundedBits = 1; - if (param->roundedBitsMask & ~1) - { - while (param->roundedBitsMask >> param->roundedBits) - ++param->roundedBits; + } else if (param->roundedBitsMask <= 0) { + int32_t lineLength = param->subbandWidth + 2; + + if (param->curLine & 1) { + param->lineBuf1 = (int32_t*)param->paramData; + param->lineBuf0 = param->lineBuf1 + lineLength; + } else { + param->lineBuf0 = (int32_t*)param->paramData; + param->lineBuf1 = param->lineBuf0 + lineLength; } - param->lineBuf0 = (int32_t *)param->paramData; - param->lineBuf1 = param->lineBuf0 + lineLength; - int32_t *lineBuf = param->lineBuf1 + 1; - if (crxDecodeTopLineRounded(param)) - return -1; + + int32_t* lineBuf = param->lineBuf1 + 1; + + if (crxDecodeLine(param)) { + return -1; + } + memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); ++param->curLine; - } - } - else - { - param->lineBuf2 = (int32_t *)param->nonProgrData; - param->lineBuf0 = (int32_t *)param->paramData; - param->lineBuf1 = param->lineBuf0 + lineLength; - int32_t *lineBuf = param->lineBuf1 + 1; - if (crxDecodeTopLineNoRefPrevLine(param)) - return -1; - memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); - ++param->curLine; - } - } - else if (!param->supportsPartial) - { - int32_t lineLength = param->subbandWidth + 2; - param->lineBuf2 = (int32_t *)param->nonProgrData; - if (param->curLine & 1) - { - param->lineBuf1 = (int32_t *)param->paramData; - param->lineBuf0 = param->lineBuf1 + lineLength; - } - else - { - param->lineBuf0 = (int32_t *)param->paramData; - param->lineBuf1 = param->lineBuf0 + lineLength; - } - int32_t *lineBuf = param->lineBuf1 + 1; - if (crxDecodeLineNoRefPrevLine(param)) - return -1; - memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); - ++param->curLine; - } - else if (param->roundedBitsMask <= 0) - { - int32_t lineLength = param->subbandWidth + 2; - if (param->curLine & 1) - { - param->lineBuf1 = (int32_t *)param->paramData; - param->lineBuf0 = param->lineBuf1 + lineLength; - } - else - { - param->lineBuf0 = (int32_t *)param->paramData; - param->lineBuf1 = param->lineBuf0 + lineLength; - } - int32_t *lineBuf = param->lineBuf1 + 1; - if (crxDecodeLine(param)) - return -1; - memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); - ++param->curLine; - } - else - { - int32_t lineLength = param->subbandWidth + 2; - if (param->curLine & 1) - { - param->lineBuf1 = (int32_t *)param->paramData; - param->lineBuf0 = param->lineBuf1 + lineLength; - } - else - { - param->lineBuf0 = (int32_t *)param->paramData; - param->lineBuf1 = param->lineBuf0 + lineLength; - } - int32_t *lineBuf = param->lineBuf1 + 1; - if (crxDecodeLineRounded(param)) - return -1; - memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); - ++param->curLine; - } - return 0; -} + } else { + int32_t lineLength = param->subbandWidth + 2; -int crxDecodeLineWithIQuantization(CrxSubband *subband) -{ - int32_t q_step_tbl[6] = {0x28, 0x2D, 0x33, 0x39, 0x40, 0x48}; - - if (!subband->dataSize) - { - memset(subband->bandBuf, 0, subband->bandSize); - return 0; - } - - if (subband->supportsPartial) - { - uint32_t bitCode = crxBitstreamGetZeros(&subband->bandParam->bitStream); - if (bitCode >= 23) - bitCode = crxBitstreamGetBits(&subband->bandParam->bitStream, 8); - else if (subband->paramK) - bitCode = - crxBitstreamGetBits(&subband->bandParam->bitStream, subband->paramK) | - (bitCode << subband->paramK); - - subband->quantValue += - -(bitCode & 1) ^ (bitCode >> 1); // converting encoded to signed integer - subband->paramK = crxPredictKParameter(subband->paramK, bitCode); - if (subband->paramK > 7) - return -1; - } - if (crxDecodeLine(subband->bandParam, subband->bandBuf)) - return -1; - - if (subband->width <= 0) - return 0LL; - - // update subband buffers - int32_t *bandBuf = (int32_t *)subband->bandBuf; - int32_t qScale = - q_step_tbl[subband->quantValue % 6] >> (6 - subband->quantValue / 6); - if (subband->quantValue / 6 >= 6) - qScale = q_step_tbl[subband->quantValue % 6] * - (1 << (subband->quantValue / 6 + 26)); - - if (qScale != 1) - for (int32_t i = 0; i < subband->width; i++) - bandBuf[i] *= qScale; - - return 0; -} - -void crxHorizontal53(int32_t *lineBufLA, int32_t *lineBufLB, - CrxWaveletTransform *wavelet, uint32_t tileFlag) -{ - int32_t *band0Buf = wavelet->subband0Buf; - int32_t *band1Buf = wavelet->subband1Buf; - int32_t *band2Buf = wavelet->subband2Buf; - int32_t *band3Buf = wavelet->subband3Buf; - - if (wavelet->width <= 1) - { - lineBufLA[0] = band0Buf[0]; - lineBufLB[0] = band2Buf[0]; - } - else - { - if (tileFlag & E_HAS_TILES_ON_THE_LEFT) - { - lineBufLA[0] = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); - lineBufLB[0] = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); - ++band1Buf; - ++band3Buf; - } - else - { - lineBufLA[0] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); - lineBufLB[0] = band2Buf[0] - ((band3Buf[0] + 1) >> 1); - } - ++band0Buf; - ++band2Buf; - - for (int i = 0; i < wavelet->width - 3; i += 2) - { - int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); - lineBufLA[1] = band1Buf[0] + ((delta + lineBufLA[0]) >> 1); - lineBufLA[2] = delta; - - delta = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); - lineBufLB[1] = band3Buf[0] + ((delta + lineBufLB[0]) >> 1); - lineBufLB[2] = delta; - - ++band0Buf; - ++band1Buf; - ++band2Buf; - ++band3Buf; - lineBufLA += 2; - lineBufLB += 2; - } - if (tileFlag & E_HAS_TILES_ON_THE_RIGHT) - { - int32_t deltaA = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); - lineBufLA[1] = band1Buf[0] + ((deltaA + lineBufLA[0]) >> 1); - - int32_t deltaB = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); - lineBufLB[1] = band3Buf[0] + ((deltaB + lineBufLB[0]) >> 1); - - if (wavelet->width & 1) - { - lineBufLA[2] = deltaA; - lineBufLB[2] = deltaB; - } - } - else if (wavelet->width & 1) - { - lineBufLA[1] = - band1Buf[0] + - ((lineBufLA[0] + band0Buf[0] - ((band1Buf[0] + 1) >> 1)) >> 1); - lineBufLA[2] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); - - lineBufLB[1] = - band3Buf[0] + - ((lineBufLB[0] + band2Buf[0] - ((band3Buf[0] + 1) >> 1)) >> 1); - lineBufLB[2] = band2Buf[0] - ((band3Buf[0] + 1) >> 1); - } - else - { - lineBufLA[1] = lineBufLA[0] + band1Buf[0]; - lineBufLB[1] = lineBufLB[0] + band3Buf[0]; - } - } -} - -int32_t *crxIdwt53FilterGetLine(CrxPlaneComp *comp, int32_t level) -{ - int32_t *result = comp->waveletTransform[level] - .lineBuf[(comp->waveletTransform[level].fltTapH - - comp->waveletTransform[level].curH + 5) % - 5 + - 3]; - comp->waveletTransform[level].curH--; - return result; -} - -int crxIdwt53FilterDecode(CrxPlaneComp *comp, int32_t level) -{ - if (comp->waveletTransform[level].curH) - return 0; - - CrxSubband *sband = comp->subBands + 3 * level; - - if (comp->waveletTransform[level].height - 3 <= - comp->waveletTransform[level].curLine && - !(comp->tileFlag & E_HAS_TILES_ON_THE_BOTTOM)) - { - if (comp->waveletTransform[level].height & 1) - { - if (level) - { - if (crxIdwt53FilterDecode(comp, level - 1)) - return -1; - } - else if (crxDecodeLineWithIQuantization(sband)) - return -1; - - if (crxDecodeLineWithIQuantization(sband + 1)) - return -1; - } - } - else - { - if (level) - { - if (crxIdwt53FilterDecode(comp, level - 1)) - return -1; - } - else if (crxDecodeLineWithIQuantization(sband)) // LL band - return -1; - - if (crxDecodeLineWithIQuantization(sband + 1) || // HL band - crxDecodeLineWithIQuantization(sband + 2) || // LH band - crxDecodeLineWithIQuantization(sband + 3)) // HH band - return -1; - } - - return 0; -} - -int crxIdwt53FilterTransform(CrxPlaneComp *comp, uint32_t level) -{ - CrxWaveletTransform *wavelet = comp->waveletTransform + level; - - if (wavelet->curH) - return 0; - - if (wavelet->curLine >= wavelet->height - 3) - { - if (!(comp->tileFlag & E_HAS_TILES_ON_THE_BOTTOM)) - { - if (wavelet->height & 1) - { - if (level) - { - if (!wavelet[-1].curH) - if (crxIdwt53FilterTransform(comp, level - 1)) - return -1; - wavelet->subband0Buf = crxIdwt53FilterGetLine(comp, level - 1); + if (param->curLine & 1) { + param->lineBuf1 = (int32_t*)param->paramData; + param->lineBuf0 = param->lineBuf1 + lineLength; + } else { + param->lineBuf0 = (int32_t*)param->paramData; + param->lineBuf1 = param->lineBuf0 + lineLength; } - int32_t *band0Buf = wavelet->subband0Buf; - int32_t *band1Buf = wavelet->subband1Buf; - int32_t *lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; - int32_t *lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; - int32_t *lineBufH2 = wavelet->lineBuf[(wavelet->fltTapH + 2) % 5 + 3]; - int32_t *lineBufL0 = wavelet->lineBuf[0]; - int32_t *lineBufL1 = wavelet->lineBuf[1]; + int32_t* lineBuf = param->lineBuf1 + 1; + + if (crxDecodeLineRounded(param)) { + return -1; + } + + memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); + ++param->curLine; + } + + return 0; +} + +int crxDecodeLineWithIQuantization(CrxSubband* subband) +{ + int32_t q_step_tbl[6] = {0x28, 0x2D, 0x33, 0x39, 0x40, 0x48}; + + if (!subband->dataSize) { + memset(subband->bandBuf, 0, subband->bandSize); + return 0; + } + + if (subband->supportsPartial) { + uint32_t bitCode = crxBitstreamGetZeros(&subband->bandParam->bitStream); + + if (bitCode >= 23) { + bitCode = crxBitstreamGetBits(&subband->bandParam->bitStream, 8); + } else if (subband->paramK) { + bitCode = + crxBitstreamGetBits(&subband->bandParam->bitStream, subband->paramK) | + (bitCode << subband->paramK); + } + + subband->quantValue += + -(bitCode & 1) ^ (bitCode >> 1);// converting encoded to signed integer + subband->paramK = crxPredictKParameter(subband->paramK, bitCode); + + if (subband->paramK > 7) { + return -1; + } + } + + if (crxDecodeLine(subband->bandParam, subband->bandBuf)) { + return -1; + } + + if (subband->width <= 0) { + return 0LL; + } + + // update subband buffers + int32_t* bandBuf = (int32_t*)subband->bandBuf; + int32_t qScale = + q_step_tbl[subband->quantValue % 6] >> (6 - subband->quantValue / 6); + + if (subband->quantValue / 6 >= 6) { + qScale = q_step_tbl[subband->quantValue % 6] * + (1 << (subband->quantValue / 6 + 26)); + } + + if (qScale != 1) { + for (int32_t i = 0; i < subband->width; i++) { + bandBuf[i] *= qScale; + } + } + + return 0; +} + +void crxHorizontal53(int32_t* lineBufLA, int32_t* lineBufLB, + CrxWaveletTransform* wavelet, uint32_t tileFlag) +{ + int32_t* band0Buf = wavelet->subband0Buf; + int32_t* band1Buf = wavelet->subband1Buf; + int32_t* band2Buf = wavelet->subband2Buf; + int32_t* band3Buf = wavelet->subband3Buf; + + if (wavelet->width <= 1) { + lineBufLA[0] = band0Buf[0]; + lineBufLB[0] = band2Buf[0]; + } else { + if (tileFlag & E_HAS_TILES_ON_THE_LEFT) { + lineBufLA[0] = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufLB[0] = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + ++band1Buf; + ++band3Buf; + } else { + lineBufLA[0] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + lineBufLB[0] = band2Buf[0] - ((band3Buf[0] + 1) >> 1); + } + + ++band0Buf; + ++band2Buf; + + for (int i = 0; i < wavelet->width - 3; i += 2) { + int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufLA[1] = band1Buf[0] + ((delta + lineBufLA[0]) >> 1); + lineBufLA[2] = delta; + + delta = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + lineBufLB[1] = band3Buf[0] + ((delta + lineBufLB[0]) >> 1); + lineBufLB[2] = delta; + + ++band0Buf; + ++band1Buf; + ++band2Buf; + ++band3Buf; + lineBufLA += 2; + lineBufLB += 2; + } + + if (tileFlag & E_HAS_TILES_ON_THE_RIGHT) { + int32_t deltaA = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufLA[1] = band1Buf[0] + ((deltaA + lineBufLA[0]) >> 1); + + int32_t deltaB = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + lineBufLB[1] = band3Buf[0] + ((deltaB + lineBufLB[0]) >> 1); + + if (wavelet->width & 1) { + lineBufLA[2] = deltaA; + lineBufLB[2] = deltaB; + } + } else if (wavelet->width & 1) { + lineBufLA[1] = + band1Buf[0] + + ((lineBufLA[0] + band0Buf[0] - ((band1Buf[0] + 1) >> 1)) >> 1); + lineBufLA[2] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + + lineBufLB[1] = + band3Buf[0] + + ((lineBufLB[0] + band2Buf[0] - ((band3Buf[0] + 1) >> 1)) >> 1); + lineBufLB[2] = band2Buf[0] - ((band3Buf[0] + 1) >> 1); + } else { + lineBufLA[1] = lineBufLA[0] + band1Buf[0]; + lineBufLB[1] = lineBufLB[0] + band3Buf[0]; + } + } +} + +int32_t* crxIdwt53FilterGetLine(CrxPlaneComp* comp, int32_t level) +{ + int32_t* result = comp->waveletTransform[level] + .lineBuf[(comp->waveletTransform[level].fltTapH - + comp->waveletTransform[level].curH + 5) % + 5 + + 3]; + comp->waveletTransform[level].curH--; + return result; +} + +int crxIdwt53FilterDecode(CrxPlaneComp* comp, int32_t level) +{ + if (comp->waveletTransform[level].curH) { + return 0; + } + + CrxSubband* sband = comp->subBands + 3 * level; + + if (comp->waveletTransform[level].height - 3 <= + comp->waveletTransform[level].curLine && + !(comp->tileFlag & E_HAS_TILES_ON_THE_BOTTOM)) { + if (comp->waveletTransform[level].height & 1) { + if (level) { + if (crxIdwt53FilterDecode(comp, level - 1)) { + return -1; + } + } else if (crxDecodeLineWithIQuantization(sband)) { + return -1; + } + + if (crxDecodeLineWithIQuantization(sband + 1)) { + return -1; + } + } + } else { + if (level) { + if (crxIdwt53FilterDecode(comp, level - 1)) { + return -1; + } + } else if (crxDecodeLineWithIQuantization(sband)) {// LL band + return -1; + } + + if (crxDecodeLineWithIQuantization(sband + 1) ||// HL band + crxDecodeLineWithIQuantization(sband + 2) ||// LH band + crxDecodeLineWithIQuantization(sband + 3)) {// HH band + return -1; + } + } + + return 0; +} + +int crxIdwt53FilterTransform(CrxPlaneComp* comp, uint32_t level) +{ + CrxWaveletTransform* wavelet = comp->waveletTransform + level; + + if (wavelet->curH) { + return 0; + } + + if (wavelet->curLine >= wavelet->height - 3) { + if (!(comp->tileFlag & E_HAS_TILES_ON_THE_BOTTOM)) { + if (wavelet->height & 1) { + if (level) { + if (!wavelet[-1].curH) { + if (crxIdwt53FilterTransform(comp, level - 1)) { + return -1; + } + } + + wavelet->subband0Buf = crxIdwt53FilterGetLine(comp, level - 1); + } + + int32_t* band0Buf = wavelet->subband0Buf; + int32_t* band1Buf = wavelet->subband1Buf; + int32_t* lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; + int32_t* lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; + int32_t* lineBufH2 = wavelet->lineBuf[(wavelet->fltTapH + 2) % 5 + 3]; + + int32_t* lineBufL0 = wavelet->lineBuf[0]; + int32_t* lineBufL1 = wavelet->lineBuf[1]; + wavelet->lineBuf[1] = wavelet->lineBuf[2]; + wavelet->lineBuf[2] = lineBufL1; + + // process L bands + if (wavelet->width <= 1) { + lineBufL0[0] = band0Buf[0]; + } else { + if (comp->tileFlag & E_HAS_TILES_ON_THE_LEFT) { + lineBufL0[0] = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + ++band1Buf; + } else { + lineBufL0[0] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + } + + ++band0Buf; + + for (int i = 0; i < wavelet->width - 3; i += 2) { + int32_t delta = + band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufL0[1] = band1Buf[0] + ((lineBufL0[0] + delta) >> 1); + lineBufL0[2] = delta; + ++band0Buf; + ++band1Buf; + lineBufL0 += 2; + } + + if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) { + int32_t delta = + band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufL0[1] = band1Buf[0] + ((lineBufL0[0] + delta) >> 1); + + if (wavelet->width & 1) { + lineBufL0[2] = delta; + } + } else if (wavelet->width & 1) { + int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + lineBufL0[1] = band1Buf[0] + ((lineBufL0[0] + delta) >> 1); + lineBufL0[2] = delta; + } else { + lineBufL0[1] = band1Buf[0] + lineBufL0[0]; + } + } + + // process H bands + lineBufL0 = wavelet->lineBuf[0]; + lineBufL1 = wavelet->lineBuf[1]; + + for (int32_t i = 0; i < wavelet->width; i++) { + int32_t delta = lineBufL0[i] - ((lineBufL1[i] + 1) >> 1); + lineBufH1[i] = lineBufL1[i] + ((delta + lineBufH0[i]) >> 1); + lineBufH2[i] = delta; + } + + wavelet->curH += 3; + wavelet->curLine += 3; + wavelet->fltTapH = (wavelet->fltTapH + 3) % 5; + } else { + int32_t* lineBufL2 = wavelet->lineBuf[2]; + int32_t* lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; + int32_t* lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; + wavelet->lineBuf[1] = lineBufL2; + wavelet->lineBuf[2] = wavelet->lineBuf[1]; + + for (int32_t i = 0; i < wavelet->width; i++) { + lineBufH1[i] = lineBufH0[i] + lineBufL2[i]; + } + + wavelet->curH += 2; + wavelet->curLine += 2; + wavelet->fltTapH = (wavelet->fltTapH + 2) % 5; + } + } + } else { + if (level) { + if (!wavelet[-1].curH && crxIdwt53FilterTransform(comp, level - 1)) { + return -1; + } + + wavelet->subband0Buf = crxIdwt53FilterGetLine(comp, level - 1); + } + + int32_t* band0Buf = wavelet->subband0Buf; + int32_t* band1Buf = wavelet->subband1Buf; + int32_t* band2Buf = wavelet->subband2Buf; + int32_t* band3Buf = wavelet->subband3Buf; + + int32_t* lineBufL0 = wavelet->lineBuf[0]; + int32_t* lineBufL1 = wavelet->lineBuf[1]; + int32_t* lineBufL2 = wavelet->lineBuf[2]; + int32_t* lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; + int32_t* lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; + int32_t* lineBufH2 = wavelet->lineBuf[(wavelet->fltTapH + 2) % 5 + 3]; + wavelet->lineBuf[1] = wavelet->lineBuf[2]; wavelet->lineBuf[2] = lineBufL1; // process L bands - if (wavelet->width <= 1) - { - lineBufL0[0] = band0Buf[0]; - } - else - { - if (comp->tileFlag & E_HAS_TILES_ON_THE_LEFT) - { - lineBufL0[0] = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); - ++band1Buf; - } - else - { - lineBufL0[0] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); - } - ++band0Buf; - for (int i = 0; i < wavelet->width - 3; i += 2) - { - int32_t delta = - band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); - lineBufL0[1] = band1Buf[0] + ((lineBufL0[0] + delta) >> 1); - lineBufL0[2] = delta; + if (wavelet->width <= 1) { + lineBufL0[0] = band0Buf[0]; + lineBufL1[0] = band2Buf[0]; + } else { + if (comp->tileFlag & E_HAS_TILES_ON_THE_LEFT) { + lineBufL0[0] = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufL1[0] = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + ++band1Buf; + ++band3Buf; + } else { + lineBufL0[0] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + lineBufL1[0] = band2Buf[0] - ((band3Buf[0] + 1) >> 1); + } + ++band0Buf; - ++band1Buf; - lineBufL0 += 2; - } - if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) - { - int32_t delta = - band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); - lineBufL0[1] = band1Buf[0] + ((lineBufL0[0] + delta) >> 1); - if (wavelet->width & 1) - lineBufL0[2] = delta; - } - else if (wavelet->width & 1) - { - int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); - lineBufL0[1] = band1Buf[0] + ((lineBufL0[0] + delta) >> 1); - lineBufL0[2] = delta; - } - else - lineBufL0[1] = band1Buf[0] + lineBufL0[0]; + ++band2Buf; + + for (int i = 0; i < wavelet->width - 3; i += 2) { + int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufL0[1] = band1Buf[0] + ((delta + lineBufL0[0]) >> 1); + lineBufL0[2] = delta; + + delta = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + lineBufL1[1] = band3Buf[0] + ((delta + lineBufL1[0]) >> 1); + lineBufL1[2] = delta; + + ++band0Buf; + ++band1Buf; + ++band2Buf; + ++band3Buf; + lineBufL0 += 2; + lineBufL1 += 2; + } + + if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) { + int32_t deltaA = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufL0[1] = band1Buf[0] + ((deltaA + lineBufL0[0]) >> 1); + + int32_t deltaB = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + lineBufL1[1] = band3Buf[0] + ((deltaB + lineBufL1[0]) >> 1); + + if (wavelet->width & 1) { + lineBufL0[2] = deltaA; + lineBufL1[2] = deltaB; + } + } else if (wavelet->width & 1) { + int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + lineBufL0[1] = band1Buf[0] + ((delta + lineBufL0[0]) >> 1); + lineBufL0[2] = delta; + + delta = band2Buf[0] - ((band3Buf[0] + 1) >> 1); + lineBufL1[1] = band3Buf[0] + ((delta + lineBufL1[0]) >> 1); + lineBufL1[2] = delta; + } else { + lineBufL0[1] = lineBufL0[0] + band1Buf[0]; + lineBufL1[1] = lineBufL1[0] + band3Buf[0]; + } } // process H bands lineBufL0 = wavelet->lineBuf[0]; lineBufL1 = wavelet->lineBuf[1]; - for (int32_t i = 0; i < wavelet->width; i++) - { - int32_t delta = lineBufL0[i] - ((lineBufL1[i] + 1) >> 1); - lineBufH1[i] = lineBufL1[i] + ((delta + lineBufH0[i]) >> 1); - lineBufH2[i] = delta; + lineBufL2 = wavelet->lineBuf[2]; + + for (int32_t i = 0; i < wavelet->width; i++) { + int32_t delta = lineBufL0[i] - ((lineBufL2[i] + lineBufL1[i] + 2) >> 2); + lineBufH1[i] = lineBufL1[i] + ((delta + lineBufH0[i]) >> 1); + lineBufH2[i] = delta; } - wavelet->curH += 3; - wavelet->curLine += 3; - wavelet->fltTapH = (wavelet->fltTapH + 3) % 5; - } - else - { - int32_t *lineBufL2 = wavelet->lineBuf[2]; - int32_t *lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; - int32_t *lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; - wavelet->lineBuf[1] = lineBufL2; - wavelet->lineBuf[2] = wavelet->lineBuf[1]; - for (int32_t i = 0; i < wavelet->width; i++) - lineBufH1[i] = lineBufH0[i] + lineBufL2[i]; - - wavelet->curH += 2; - wavelet->curLine += 2; - wavelet->fltTapH = (wavelet->fltTapH + 2) % 5; - } - } - } - else - { - if (level) - { - if (!wavelet[-1].curH && crxIdwt53FilterTransform(comp, level - 1)) - return -1; - wavelet->subband0Buf = crxIdwt53FilterGetLine(comp, level - 1); - } - - int32_t *band0Buf = wavelet->subband0Buf; - int32_t *band1Buf = wavelet->subband1Buf; - int32_t *band2Buf = wavelet->subband2Buf; - int32_t *band3Buf = wavelet->subband3Buf; - - int32_t *lineBufL0 = wavelet->lineBuf[0]; - int32_t *lineBufL1 = wavelet->lineBuf[1]; - int32_t *lineBufL2 = wavelet->lineBuf[2]; - int32_t *lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; - int32_t *lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; - int32_t *lineBufH2 = wavelet->lineBuf[(wavelet->fltTapH + 2) % 5 + 3]; - - wavelet->lineBuf[1] = wavelet->lineBuf[2]; - wavelet->lineBuf[2] = lineBufL1; - - // process L bands - if (wavelet->width <= 1) - { - lineBufL0[0] = band0Buf[0]; - lineBufL1[0] = band2Buf[0]; - } - else - { - if (comp->tileFlag & E_HAS_TILES_ON_THE_LEFT) - { - lineBufL0[0] = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); - lineBufL1[0] = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); - ++band1Buf; - ++band3Buf; - } - else - { - lineBufL0[0] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); - lineBufL1[0] = band2Buf[0] - ((band3Buf[0] + 1) >> 1); - } - ++band0Buf; - ++band2Buf; - for (int i = 0; i < wavelet->width - 3; i += 2) - { - int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); - lineBufL0[1] = band1Buf[0] + ((delta + lineBufL0[0]) >> 1); - lineBufL0[2] = delta; - - delta = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); - lineBufL1[1] = band3Buf[0] + ((delta + lineBufL1[0]) >> 1); - lineBufL1[2] = delta; - - ++band0Buf; - ++band1Buf; - ++band2Buf; - ++band3Buf; - lineBufL0 += 2; - lineBufL1 += 2; - } - if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) - { - int32_t deltaA = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); - lineBufL0[1] = band1Buf[0] + ((deltaA + lineBufL0[0]) >> 1); - - int32_t deltaB = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); - lineBufL1[1] = band3Buf[0] + ((deltaB + lineBufL1[0]) >> 1); - - if (wavelet->width & 1) - { - lineBufL0[2] = deltaA; - lineBufL1[2] = deltaB; + if (wavelet->curLine >= wavelet->height - 3 && (wavelet->height & 1)) { + wavelet->curH += 3; + wavelet->curLine += 3; + wavelet->fltTapH = (wavelet->fltTapH + 3) % 5; + } else { + wavelet->curH += 2; + wavelet->curLine += 2; + wavelet->fltTapH = (wavelet->fltTapH + 2) % 5; } - } - else if (wavelet->width & 1) - { - int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); - lineBufL0[1] = band1Buf[0] + ((delta + lineBufL0[0]) >> 1); - lineBufL0[2] = delta; - - delta = band2Buf[0] - ((band3Buf[0] + 1) >> 1); - lineBufL1[1] = band3Buf[0] + ((delta + lineBufL1[0]) >> 1); - lineBufL1[2] = delta; - } - else - { - lineBufL0[1] = lineBufL0[0] + band1Buf[0]; - lineBufL1[1] = lineBufL1[0] + band3Buf[0]; - } } - // process H bands - lineBufL0 = wavelet->lineBuf[0]; - lineBufL1 = wavelet->lineBuf[1]; - lineBufL2 = wavelet->lineBuf[2]; - for (int32_t i = 0; i < wavelet->width; i++) - { - int32_t delta = lineBufL0[i] - ((lineBufL2[i] + lineBufL1[i] + 2) >> 2); - lineBufH1[i] = lineBufL1[i] + ((delta + lineBufH0[i]) >> 1); - lineBufH2[i] = delta; - } - if (wavelet->curLine >= wavelet->height - 3 && (wavelet->height & 1)) - { - wavelet->curH += 3; - wavelet->curLine += 3; - wavelet->fltTapH = (wavelet->fltTapH + 3) % 5; - } - else - { - wavelet->curH += 2; - wavelet->curLine += 2; - wavelet->fltTapH = (wavelet->fltTapH + 2) % 5; - } - } - - return 0; -} - -int crxIdwt53FilterInitialize(CrxPlaneComp *comp, int32_t prevLevel) -{ - if (prevLevel < 0) return 0; - - for (int curLevel = 0, curBand = 0; curLevel < prevLevel + 1; - curLevel++, curBand += 3) - { - CrxWaveletTransform *wavelet = comp->waveletTransform + curLevel; - if (curLevel) - wavelet[0].subband0Buf = crxIdwt53FilterGetLine(comp, curLevel - 1); - else if (crxDecodeLineWithIQuantization(comp->subBands + curBand)) - return -1; - - int32_t *lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; - if (wavelet->height > 1) - { - if (crxDecodeLineWithIQuantization(comp->subBands + curBand + 1) || - crxDecodeLineWithIQuantization(comp->subBands + curBand + 2) || - crxDecodeLineWithIQuantization(comp->subBands + curBand + 3)) - return -1; - - int32_t *lineBufL0 = wavelet->lineBuf[0]; - int32_t *lineBufL1 = wavelet->lineBuf[1]; - int32_t *lineBufL2 = wavelet->lineBuf[2]; - - if (comp->tileFlag & E_HAS_TILES_ON_THE_TOP) - { - crxHorizontal53(lineBufL0, wavelet->lineBuf[1], wavelet, - comp->tileFlag); - if (crxDecodeLineWithIQuantization(comp->subBands + curBand + 3) || - crxDecodeLineWithIQuantization(comp->subBands + curBand + 2)) - return -1; - - int32_t *band2Buf = wavelet->subband2Buf; - int32_t *band3Buf = wavelet->subband3Buf; - - // process L band - if (wavelet->width <= 1) - lineBufL2[0] = band2Buf[0]; - else - { - if (comp->tileFlag & E_HAS_TILES_ON_THE_LEFT) - { - lineBufL2[0] = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); - ++band3Buf; - } - else - lineBufL2[0] = band2Buf[0] - ((band3Buf[0] + 1) >> 1); - - ++band2Buf; - - for (int i = 0; i < wavelet->width - 3; i += 2) - { - int32_t delta = - band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); - lineBufL2[1] = band3Buf[0] + ((lineBufL2[0] + delta) >> 1); - lineBufL2[2] = delta; - - ++band2Buf; - ++band3Buf; - lineBufL2 += 2; - } - if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) - { - int32_t delta = - band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); - lineBufL2[1] = band3Buf[0] + ((lineBufL2[0] + delta) >> 1); - if (wavelet->width & 1) - lineBufL2[2] = delta; - } - else if (wavelet->width & 1) - { - int32_t delta = band2Buf[0] - ((band3Buf[0] + 1) >> 1); - - lineBufL2[1] = band3Buf[0] + ((lineBufL2[0] + delta) >> 1); - lineBufL2[2] = delta; - } - else - { - lineBufL2[1] = band3Buf[0] + lineBufL2[0]; - } - } - - // process H band - for (int32_t i = 0; i < wavelet->width; i++) - lineBufH0[i] = - lineBufL0[i] - ((lineBufL1[i] + lineBufL2[i] + 2) >> 2); - } - else - { - crxHorizontal53(lineBufL0, wavelet->lineBuf[2], wavelet, - comp->tileFlag); - for (int i = 0; i < wavelet->width; i++) - lineBufH0[i] = lineBufL0[i] - ((lineBufL2[i] + 1) >> 1); - } - - if (crxIdwt53FilterDecode(comp, curLevel) || - crxIdwt53FilterTransform(comp, curLevel)) - return -1; - } - else - { - if (crxDecodeLineWithIQuantization(comp->subBands + curBand + 1)) - return -1; - - int32_t *band0Buf = wavelet->subband0Buf; - int32_t *band1Buf = wavelet->subband1Buf; - - // process H band - if (wavelet->width <= 1) - lineBufH0[0] = band0Buf[0]; - else - { - if (comp->tileFlag & E_HAS_TILES_ON_THE_LEFT) - { - lineBufH0[0] = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); - ++band1Buf; - } - else - lineBufH0[0] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); - - ++band0Buf; - - for (int i = 0; i < wavelet->width - 3; i += 2) - { - int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); - lineBufH0[1] = band1Buf[0] + ((lineBufH0[0] + delta) >> 1); - lineBufH0[2] = delta; - - ++band0Buf; - ++band1Buf; - lineBufH0 += 2; - } - - if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) - { - int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); - lineBufH0[1] = band1Buf[0] + ((lineBufH0[0] + delta) >> 1); - lineBufH0[2] = delta; - } - else if (wavelet->width & 1) - { - int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); - lineBufH0[1] = band1Buf[0] + ((lineBufH0[0] + delta) >> 1); - lineBufH0[2] = delta; - } - else - { - lineBufH0[1] = band1Buf[0] + lineBufH0[0]; - } - } - ++wavelet->curLine; - ++wavelet->curH; - wavelet->fltTapH = (wavelet->fltTapH + 1) % 5; - } - } - - return 0; } -void crxFreeSubbandData(CrxImage *image, CrxPlaneComp *comp) +int crxIdwt53FilterInitialize(CrxPlaneComp* comp, int32_t prevLevel) { - if (comp->compBuf) - { - free(comp->compBuf); - comp->compBuf = 0; - } - - if (!comp->subBands) - return; - - for (int32_t i = 0; i < image->subbandCount; i++) - { - if (comp->subBands[i].bandParam) - { - free(comp->subBands[i].bandParam); - comp->subBands[i].bandParam = 0LL; + if (prevLevel < 0) { + return 0; } - comp->subBands[i].bandBuf = 0; - comp->subBands[i].bandSize = 0; - } + + for (int curLevel = 0, curBand = 0; curLevel < prevLevel + 1; + curLevel++, curBand += 3) { + CrxWaveletTransform* wavelet = comp->waveletTransform + curLevel; + + if (curLevel) { + wavelet[0].subband0Buf = crxIdwt53FilterGetLine(comp, curLevel - 1); + } else if (crxDecodeLineWithIQuantization(comp->subBands + curBand)) { + return -1; + } + + int32_t* lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; + + if (wavelet->height > 1) { + if (crxDecodeLineWithIQuantization(comp->subBands + curBand + 1) || + crxDecodeLineWithIQuantization(comp->subBands + curBand + 2) || + crxDecodeLineWithIQuantization(comp->subBands + curBand + 3)) { + return -1; + } + + int32_t* lineBufL0 = wavelet->lineBuf[0]; + int32_t* lineBufL1 = wavelet->lineBuf[1]; + int32_t* lineBufL2 = wavelet->lineBuf[2]; + + if (comp->tileFlag & E_HAS_TILES_ON_THE_TOP) { + crxHorizontal53(lineBufL0, wavelet->lineBuf[1], wavelet, + comp->tileFlag); + + if (crxDecodeLineWithIQuantization(comp->subBands + curBand + 3) || + crxDecodeLineWithIQuantization(comp->subBands + curBand + 2)) { + return -1; + } + + int32_t* band2Buf = wavelet->subband2Buf; + int32_t* band3Buf = wavelet->subband3Buf; + + // process L band + if (wavelet->width <= 1) { + lineBufL2[0] = band2Buf[0]; + } else { + if (comp->tileFlag & E_HAS_TILES_ON_THE_LEFT) { + lineBufL2[0] = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + ++band3Buf; + } else { + lineBufL2[0] = band2Buf[0] - ((band3Buf[0] + 1) >> 1); + } + + ++band2Buf; + + for (int i = 0; i < wavelet->width - 3; i += 2) { + int32_t delta = + band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + lineBufL2[1] = band3Buf[0] + ((lineBufL2[0] + delta) >> 1); + lineBufL2[2] = delta; + + ++band2Buf; + ++band3Buf; + lineBufL2 += 2; + } + + if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) { + int32_t delta = + band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + lineBufL2[1] = band3Buf[0] + ((lineBufL2[0] + delta) >> 1); + + if (wavelet->width & 1) { + lineBufL2[2] = delta; + } + } else if (wavelet->width & 1) { + int32_t delta = band2Buf[0] - ((band3Buf[0] + 1) >> 1); + + lineBufL2[1] = band3Buf[0] + ((lineBufL2[0] + delta) >> 1); + lineBufL2[2] = delta; + } else { + lineBufL2[1] = band3Buf[0] + lineBufL2[0]; + } + } + + // process H band + for (int32_t i = 0; i < wavelet->width; i++) { + lineBufH0[i] = + lineBufL0[i] - ((lineBufL1[i] + lineBufL2[i] + 2) >> 2); + } + } else { + crxHorizontal53(lineBufL0, wavelet->lineBuf[2], wavelet, + comp->tileFlag); + + for (int i = 0; i < wavelet->width; i++) { + lineBufH0[i] = lineBufL0[i] - ((lineBufL2[i] + 1) >> 1); + } + } + + if (crxIdwt53FilterDecode(comp, curLevel) || + crxIdwt53FilterTransform(comp, curLevel)) { + return -1; + } + } else { + if (crxDecodeLineWithIQuantization(comp->subBands + curBand + 1)) { + return -1; + } + + int32_t* band0Buf = wavelet->subband0Buf; + int32_t* band1Buf = wavelet->subband1Buf; + + // process H band + if (wavelet->width <= 1) { + lineBufH0[0] = band0Buf[0]; + } else { + if (comp->tileFlag & E_HAS_TILES_ON_THE_LEFT) { + lineBufH0[0] = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + ++band1Buf; + } else { + lineBufH0[0] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + } + + ++band0Buf; + + for (int i = 0; i < wavelet->width - 3; i += 2) { + int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufH0[1] = band1Buf[0] + ((lineBufH0[0] + delta) >> 1); + lineBufH0[2] = delta; + + ++band0Buf; + ++band1Buf; + lineBufH0 += 2; + } + + if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) { + int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + lineBufH0[1] = band1Buf[0] + ((lineBufH0[0] + delta) >> 1); + lineBufH0[2] = delta; + } else if (wavelet->width & 1) { + int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + lineBufH0[1] = band1Buf[0] + ((lineBufH0[0] + delta) >> 1); + lineBufH0[2] = delta; + } else { + lineBufH0[1] = band1Buf[0] + lineBufH0[0]; + } + } + + ++wavelet->curLine; + ++wavelet->curH; + wavelet->fltTapH = (wavelet->fltTapH + 1) % 5; + } + } + + return 0; } -void crxConvertPlaneLine(CrxImage *img, int imageRow, int imageCol = 0, - int plane = 0, int32_t *lineData = 0, +void crxFreeSubbandData(CrxImage* image, CrxPlaneComp* comp) +{ + if (comp->compBuf) { + free(comp->compBuf); + comp->compBuf = nullptr; + } + + if (!comp->subBands) { + return; + } + + for (int32_t i = 0; i < image->subbandCount; i++) { + if (comp->subBands[i].bandParam) { + free(comp->subBands[i].bandParam); + comp->subBands[i].bandParam = nullptr; + } + + comp->subBands[i].bandBuf = nullptr; + comp->subBands[i].bandSize = 0; + } +} + +void crxConvertPlaneLine(CrxImage* img, int imageRow, int imageCol = 0, + int plane = 0, const int32_t* lineData = nullptr, int lineLength = 0) { - if (lineData) - { - uint64_t rawOffset = 4 * img->planeWidth * imageRow + 2 * imageCol; - if (img->encType == 1) - { - int32_t maxVal = 1 << (img->nBits - 1); - int32_t minVal = -maxVal; - --maxVal; - for (int i = 0; i < lineLength; i++) - img->outBufs[plane][rawOffset + 2 * i] = - _constrain(lineData[i], minVal, maxVal); - } - else if (img->encType == 3) - { - // copy to intermediate planeBuf - rawOffset = plane * img->planeWidth * img->planeHeight + - img->planeWidth * imageRow + imageCol; - for (int i = 0; i < lineLength; i++) - img->planeBuf[rawOffset + i] = lineData[i]; - } - else if (img->nPlanes == 4) - { - int32_t median = 1 << (img->nBits - 1); - int32_t maxVal = (1 << img->nBits) - 1; - for (int i = 0; i < lineLength; i++) - img->outBufs[plane][rawOffset + 2 * i] = - _constrain(median + lineData[i], 0, maxVal); - } - else if (img->nPlanes == 1) - { - int32_t maxVal = (1 << img->nBits) - 1; - int32_t median = 1 << (img->nBits - 1); - rawOffset = img->planeWidth * imageRow + imageCol; - for (int i = 0; i < lineLength; i++) - img->outBufs[0][rawOffset + i] = - _constrain(median + lineData[i], 0, maxVal); - } - } - else if (img->encType == 3 && img->planeBuf) - { - int32_t planeSize = img->planeWidth * img->planeHeight; - int16_t *plane0 = img->planeBuf + imageRow * img->planeWidth; - int16_t *plane1 = plane0 + planeSize; - int16_t *plane2 = plane1 + planeSize; - int16_t *plane3 = plane2 + planeSize; + if (lineData) { + uint64_t rawOffset = 4 * img->planeWidth * imageRow + 2 * imageCol; - int32_t median = 1 << (img->nBits - 1) << 10; - int32_t maxVal = (1 << img->nBits) - 1; - uint32_t rawLineOffset = 4 * img->planeWidth * imageRow; + if (img->encType == 1) { + int32_t maxVal = 1 << (img->nBits - 1); + int32_t minVal = -maxVal; + --maxVal; - // for this stage - all except imageRow is ignored - for (int i = 0; i < img->planeWidth; i++) - { - int32_t gr = - median + (plane0[i] << 10) - 168 * plane1[i] - 585 * plane3[i]; - int32_t val = 0; - if (gr < 0) - gr = -(((_abs(gr) + 512) >> 9) & ~1); - else - gr = ((_abs(gr) + 512) >> 9) & ~1; + for (int i = 0; i < lineLength; i++) { + img->outBufs[plane][rawOffset + 2 * i] = + _constrain(lineData[i], minVal, maxVal); + } + } else if (img->encType == 3) { + // copy to intermediate planeBuf + rawOffset = plane * img->planeWidth * img->planeHeight + + img->planeWidth * imageRow + imageCol; - // Essentially R = round(median + P0 + 1.474*P3) - val = (median + (plane0[i] << 10) + 1510 * plane3[i] + 512) >> 10; - img->outBufs[0][rawLineOffset + 2 * i] = _constrain(val, 0, maxVal); - // Essentially G1 = round(median + P0 + P2 - 0.164*P1 - 0.571*P3) - val = (plane2[i] + gr + 1) >> 1; - img->outBufs[1][rawLineOffset + 2 * i] = _constrain(val, 0, maxVal); - // Essentially G1 = round(median + P0 - P2 - 0.164*P1 - 0.571*P3) - val = (gr - plane2[i] + 1) >> 1; - img->outBufs[2][rawLineOffset + 2 * i] = _constrain(val, 0, maxVal); - // Essentially B = round(median + P0 + 1.881*P1) - val = (median + (plane0[i] << 10) + 1927 * plane1[i] + 512) >> 10; - img->outBufs[3][rawLineOffset + 2 * i] = _constrain(val, 0, maxVal); + for (int i = 0; i < lineLength; i++) { + img->planeBuf[rawOffset + i] = lineData[i]; + } + } else if (img->nPlanes == 4) { + int32_t median = 1 << (img->nBits - 1); + int32_t maxVal = (1 << img->nBits) - 1; + + for (int i = 0; i < lineLength; i++) { + img->outBufs[plane][rawOffset + 2 * i] = + _constrain(median + lineData[i], 0, maxVal); + } + } else if (img->nPlanes == 1) { + int32_t maxVal = (1 << img->nBits) - 1; + int32_t median = 1 << (img->nBits - 1); + rawOffset = img->planeWidth * imageRow + imageCol; + + for (int i = 0; i < lineLength; i++) { + img->outBufs[0][rawOffset + i] = + _constrain(median + lineData[i], 0, maxVal); + } + } + } else if (img->encType == 3 && img->planeBuf) { + int32_t planeSize = img->planeWidth * img->planeHeight; + int16_t* plane0 = img->planeBuf + imageRow * img->planeWidth; + int16_t* plane1 = plane0 + planeSize; + int16_t* plane2 = plane1 + planeSize; + int16_t* plane3 = plane2 + planeSize; + + int32_t median = 1 << (img->nBits - 1) << 10; + int32_t maxVal = (1 << img->nBits) - 1; + uint32_t rawLineOffset = 4 * img->planeWidth * imageRow; + + // for this stage - all except imageRow is ignored + for (int i = 0; i < img->planeWidth; i++) { + int32_t gr = + median + (plane0[i] << 10) - 168 * plane1[i] - 585 * plane3[i]; + int32_t val = 0; + + if (gr < 0) { + gr = -(((_abs(gr) + 512) >> 9) & ~1); + } else { + gr = ((_abs(gr) + 512) >> 9) & ~1; + } + + // Essentially R = round(median + P0 + 1.474*P3) + val = (median + (plane0[i] << 10) + 1510 * plane3[i] + 512) >> 10; + img->outBufs[0][rawLineOffset + 2 * i] = _constrain(val, 0, maxVal); + // Essentially G1 = round(median + P0 + P2 - 0.164*P1 - 0.571*P3) + val = (plane2[i] + gr + 1) >> 1; + img->outBufs[1][rawLineOffset + 2 * i] = _constrain(val, 0, maxVal); + // Essentially G1 = round(median + P0 - P2 - 0.164*P1 - 0.571*P3) + val = (gr - plane2[i] + 1) >> 1; + img->outBufs[2][rawLineOffset + 2 * i] = _constrain(val, 0, maxVal); + // Essentially B = round(median + P0 + 1.881*P1) + val = (median + (plane0[i] << 10) + 1927 * plane1[i] + 512) >> 10; + img->outBufs[3][rawLineOffset + 2 * i] = _constrain(val, 0, maxVal); + } } - } } -int crxParamInit(CrxBandParam **param, uint64_t subbandMdatOffset, +int crxParamInit(CrxBandParam** param, uint64_t subbandMdatOffset, uint64_t subbandDataSize, uint32_t subbandWidth, uint32_t subbandHeight, int32_t supportsPartial, - uint32_t roundedBitsMask, LibRaw_abstract_datastream *input) + uint32_t roundedBitsMask, LibRaw_abstract_datastream* input) { - int32_t progrDataSize = supportsPartial ? 0 : sizeof(int32_t) * subbandWidth; - int32_t paramLength = 2 * subbandWidth + 4; - uint8_t *paramBuf = (uint8_t *)calloc( - 1, sizeof(CrxBandParam) + sizeof(int32_t) * paramLength + progrDataSize); + int32_t progrDataSize = supportsPartial ? 0 : sizeof(int32_t) * subbandWidth; + int32_t paramLength = 2 * subbandWidth + 4; + uint8_t* paramBuf = (uint8_t*)calloc( + 1, sizeof(CrxBandParam) + sizeof(int32_t) * paramLength + progrDataSize); - if (!paramBuf) - return -1; - - *param = (CrxBandParam *)paramBuf; - - paramBuf += sizeof(CrxBandParam); - - (*param)->paramData = (int32_t *)paramBuf; - (*param)->nonProgrData = - progrDataSize ? (*param)->paramData + paramLength : 0; - (*param)->subbandWidth = subbandWidth; - (*param)->subbandHeight = subbandHeight; - (*param)->roundedBits = 0; - (*param)->curLine = 0; - (*param)->roundedBitsMask = roundedBitsMask; - (*param)->supportsPartial = supportsPartial; - (*param)->bitStream.bitData = 0; - (*param)->bitStream.bitsLeft = 0; - (*param)->bitStream.mdatSize = subbandDataSize; - (*param)->bitStream.curPos = 0; - (*param)->bitStream.curBufSize = 0; - (*param)->bitStream.curBufOffset = subbandMdatOffset; - (*param)->bitStream.input = input; - - crxFillBuffer(&(*param)->bitStream); - - return 0; -} - -int crxSetupSubbandData(CrxImage *img, CrxPlaneComp *planeComp, - const CrxTile *tile, uint32_t mdatOffset) -{ - long compDataSize = 0; - long waveletDataOffset = 0; - long compCoeffDataOffset = 0; - int32_t toSubbands = 3 * img->levels + 1; - int32_t transformWidth = 0; - - CrxSubband *subbands = planeComp->subBands; - - // calculate sizes - for (int32_t subbandNum = 0; subbandNum < toSubbands; subbandNum++) - { - subbands[subbandNum].bandSize = - subbands[subbandNum].width * sizeof(int32_t); // 4bytes - compDataSize += subbands[subbandNum].bandSize; - } - - if (img->levels) - { - int32_t encLevels = img->levels ? img->levels : 1; - waveletDataOffset = (compDataSize + 7) & ~7; - compDataSize = - (sizeof(CrxWaveletTransform) * encLevels + waveletDataOffset + 7) & ~7; - compCoeffDataOffset = compDataSize; - - // calc wavelet line buffer sizes (always at one level up from current) - for (int level = 0; level < img->levels; ++level) - if (level < img->levels - 1) - compDataSize += 8 * sizeof(int32_t) * - planeComp->subBands[3 * (level + 1) + 2].width; - else - compDataSize += 8 * sizeof(int32_t) * tile->width; - } - - // buffer allocation - planeComp->compBuf = (uint8_t *)malloc(compDataSize); - if (!planeComp->compBuf) - return -1; - - // subbands buffer and sizes initialisation - uint64_t subbandMdatOffset = img->mdatOffset + mdatOffset; - uint8_t *subbandBuf = planeComp->compBuf; - - for (int32_t subbandNum = 0; subbandNum < toSubbands; subbandNum++) - { - subbands[subbandNum].bandBuf = subbandBuf; - subbandBuf += subbands[subbandNum].bandSize; - subbands[subbandNum].mdatOffset = - subbandMdatOffset + subbands[subbandNum].dataOffset; - } - - // wavelet data initialisation - if (img->levels) - { - CrxWaveletTransform *waveletTransforms = - (CrxWaveletTransform *)(planeComp->compBuf + waveletDataOffset); - int32_t *paramData = (int32_t *)(planeComp->compBuf + compCoeffDataOffset); - - planeComp->waveletTransform = waveletTransforms; - waveletTransforms[0].subband0Buf = (int32_t *)subbands->bandBuf; - - for (int level = 0; level < img->levels; ++level) - { - int32_t band = 3 * level + 1; - - if (level >= img->levels - 1) - { - waveletTransforms[level].height = tile->height; - transformWidth = tile->width; - } - else - { - waveletTransforms[level].height = subbands[band + 3].height; - transformWidth = subbands[band + 4].width; - } - waveletTransforms[level].width = transformWidth; - waveletTransforms[level].lineBuf[0] = paramData; - waveletTransforms[level].lineBuf[1] = - waveletTransforms[level].lineBuf[0] + transformWidth; - waveletTransforms[level].lineBuf[2] = - waveletTransforms[level].lineBuf[1] + transformWidth; - waveletTransforms[level].lineBuf[3] = - waveletTransforms[level].lineBuf[2] + transformWidth; - waveletTransforms[level].lineBuf[4] = - waveletTransforms[level].lineBuf[3] + transformWidth; - waveletTransforms[level].lineBuf[5] = - waveletTransforms[level].lineBuf[4] + transformWidth; - waveletTransforms[level].lineBuf[6] = - waveletTransforms[level].lineBuf[5] + transformWidth; - waveletTransforms[level].lineBuf[7] = - waveletTransforms[level].lineBuf[6] + transformWidth; - waveletTransforms[level].curLine = 0; - waveletTransforms[level].curH = 0; - waveletTransforms[level].fltTapH = 0; - waveletTransforms[level].subband1Buf = (int32_t *)subbands[band].bandBuf; - waveletTransforms[level].subband2Buf = - (int32_t *)subbands[band + 1].bandBuf; - waveletTransforms[level].subband3Buf = - (int32_t *)subbands[band + 2].bandBuf; - - paramData = waveletTransforms[level].lineBuf[7] + transformWidth; - } - } - - // decoding params and bitstream initialisation - for (int32_t subbandNum = 0; subbandNum < toSubbands; subbandNum++) - { - if (subbands[subbandNum].dataSize) - { - int32_t supportsPartial = 0; - uint32_t roundedBitsMask = 0; - - if (planeComp->supportsPartial && subbandNum == 0) - { - roundedBitsMask = planeComp->roundedBitsMask; - supportsPartial = 1; - } - if (crxParamInit(&subbands[subbandNum].bandParam, - subbands[subbandNum].mdatOffset, - subbands[subbandNum].dataSize, - subbands[subbandNum].width, subbands[subbandNum].height, - supportsPartial, roundedBitsMask, img->input)) + if (!paramBuf) { return -1; } - } - return 0; -} + *param = (CrxBandParam*)paramBuf; -} // namespace + paramBuf += sizeof(CrxBandParam); + (*param)->paramData = (int32_t*)paramBuf; + (*param)->nonProgrData = + progrDataSize ? (*param)->paramData + paramLength : nullptr; + (*param)->subbandWidth = subbandWidth; + (*param)->subbandHeight = subbandHeight; + (*param)->roundedBits = 0; + (*param)->curLine = 0; + (*param)->roundedBitsMask = roundedBitsMask; + (*param)->supportsPartial = supportsPartial; + (*param)->bitStream.bitData = 0; + (*param)->bitStream.bitsLeft = 0; + (*param)->bitStream.mdatSize = subbandDataSize; + (*param)->bitStream.curPos = 0; + (*param)->bitStream.curBufSize = 0; + (*param)->bitStream.curBufOffset = subbandMdatOffset; + (*param)->bitStream.input = input; -int DCraw::crxDecodePlane(void *p, uint32_t planeNumber) -{ - CrxImage *img = (CrxImage *)p; - int imageRow = 0; - for (int tRow = 0; tRow < img->tileRows; tRow++) - { - int imageCol = 0; - for (int tCol = 0; tCol < img->tileCols; tCol++) - { - CrxTile *tile = img->tiles + tRow * img->tileRows + tCol; - CrxPlaneComp *planeComp = tile->comps + planeNumber; - uint64_t tileMdatOffset = tile->dataOffset + planeComp->dataOffset; + crxFillBuffer(&(*param)->bitStream); - // decode single tile - if (crxSetupSubbandData(img, planeComp, tile, tileMdatOffset)) - return -1; - - if (img->levels) - { - if (crxIdwt53FilterInitialize(planeComp, img->levels - 1)) - return -1; - for (int i = 0; i < tile->height; ++i) - { - if (crxIdwt53FilterDecode(planeComp, img->levels - 1) || - crxIdwt53FilterTransform(planeComp, img->levels - 1)) - return -1; - int32_t *lineData = - crxIdwt53FilterGetLine(planeComp, img->levels - 1); - crxConvertPlaneLine(img, imageRow + i, imageCol, planeNumber, - lineData, tile->width); - } - } - else - { - // we have the only subband in this case - if (!planeComp->subBands->dataSize) - { - memset(planeComp->subBands->bandBuf, 0, - planeComp->subBands->bandSize); - return 0; - } - - for (int i = 0; i < tile->height; ++i) - { - if (crxDecodeLine(planeComp->subBands->bandParam, - planeComp->subBands->bandBuf)) - return -1; - int32_t *lineData = (int32_t *)planeComp->subBands->bandBuf; - crxConvertPlaneLine(img, imageRow + i, imageCol, planeNumber, - lineData, tile->width); - } - } - imageCol += tile->width; - } - imageRow += img->tiles[tRow * img->tileRows].height; - } - - return 0; -} - - -namespace { - -typedef DCraw::CanonCR3Data::crx_data_header_t crx_data_header_t; - - -int crxReadSubbandHeaders(crx_data_header_t *hdr, CrxImage *img, CrxTile *tile, - CrxPlaneComp *comp, uint8_t **subbandMdatPtr, - uint32_t *mdatSize) -{ - CrxSubband *band = comp->subBands + img->subbandCount - 1; // set to last band - uint32_t bandHeight = tile->height; - uint32_t bandWidth = tile->width; - int32_t bandWidthExCoef = 0; - int32_t bandHeightExCoef = 0; - if (img->levels) - { - // Build up subband sequences to crxDecode to a level in a header - - // Coefficient structure is a bit unclear and convoluted: - // 3 levels max - 8 groups (for tile width rounded to 8 bytes) - // of 3 band per level 4 sets of coefficients for each - int32_t *rowExCoef = - exCoefNumTbl + 0x60 * (img->levels - 1) + 12 * (tile->width & 7); - int32_t *colExCoef = - exCoefNumTbl + 0x60 * (img->levels - 1) + 12 * (tile->height & 7); - for (int level = 0; level < img->levels; ++level) - { - int32_t widthOddPixel = bandWidth & 1; - int32_t heightOddPixel = bandHeight & 1; - bandWidth = (widthOddPixel + bandWidth) >> 1; - bandHeight = (heightOddPixel + bandHeight) >> 1; - - int32_t bandWidthExCoef0 = 0; - int32_t bandWidthExCoef1 = 0; - int32_t bandHeightExCoef0 = 0; - int32_t bandHeightExCoef1 = 0; - if (tile->tileFlag & E_HAS_TILES_ON_THE_RIGHT) - { - bandWidthExCoef0 = rowExCoef[0]; - bandWidthExCoef1 = rowExCoef[1]; - } - if (tile->tileFlag & E_HAS_TILES_ON_THE_LEFT) - ++bandWidthExCoef0; - if (tile->tileFlag & E_HAS_TILES_ON_THE_BOTTOM) - { - bandHeightExCoef0 = colExCoef[0]; - bandHeightExCoef1 = colExCoef[1]; - } - if (tile->tileFlag & E_HAS_TILES_ON_THE_TOP) - ++bandHeightExCoef0; - - band[0].width = bandWidth + bandWidthExCoef0 - widthOddPixel; - band[0].height = bandHeight + bandHeightExCoef0 - heightOddPixel; - - band[-1].width = bandWidth + bandWidthExCoef1; - band[-1].height = bandHeight + bandHeightExCoef0 - heightOddPixel; - - band[-2].width = bandWidth + bandWidthExCoef0 - widthOddPixel; - band[-2].height = bandHeight + bandHeightExCoef1; - - rowExCoef += 4; - colExCoef += 4; - band -= 3; - } - bandWidthExCoef = bandHeightExCoef = 0; - if (tile->tileFlag & E_HAS_TILES_ON_THE_RIGHT) - bandWidthExCoef = - exCoefNumTbl[0x60 * (img->levels - 1) + 12 * (tile->width & 7) + - 4 * (img->levels - 1) + 1]; - if (tile->tileFlag & E_HAS_TILES_ON_THE_BOTTOM) - bandHeightExCoef = - exCoefNumTbl[0x60 * (img->levels - 1) + 12 * (tile->height & 7) + - 4 * (img->levels - 1) + 1]; - } - band->width = bandWidthExCoef + bandWidth; - band->height = bandHeightExCoef + bandHeight; - - if (!img->subbandCount) return 0; - int32_t subbandOffset = 0; - band = comp->subBands; - for (unsigned int curSubband = 0; curSubband < img->subbandCount; curSubband++, band++) - { - if (*mdatSize < 0xC) - return -1; - - if (sgetn(2, *subbandMdatPtr) != 0xFF03) - return -1; - - uint32_t bitData = sgetn(4, *subbandMdatPtr + 8); - uint32_t subbandSize = sgetn(4, *subbandMdatPtr + 4); - - if (curSubband != bitData >> 28) - { - band->dataSize = subbandSize; - return -1; - } - band->dataSize = subbandSize - (bitData & 0x7FF); - band->supportsPartial = bitData & 0x8000 ? 1 : 0; - band->dataOffset = subbandOffset; - band->quantValue = (bitData >> 19) & 0xFF; - band->paramK = 0; - band->bandParam = 0; - band->bandBuf = 0; - band->bandSize = 0; - - subbandOffset += subbandSize; - - *subbandMdatPtr += 0xC; - *mdatSize -= 0xC; - } - return 0; } -int crxReadImageHeaders(crx_data_header_t *hdr, CrxImage *img, uint8_t *mdatPtr, +int crxSetupSubbandData(CrxImage* img, CrxPlaneComp* planeComp, + const CrxTile* tile, uint32_t mdatOffset) +{ + long compDataSize = 0; + long waveletDataOffset = 0; + long compCoeffDataOffset = 0; + int32_t toSubbands = 3 * img->levels + 1; + int32_t transformWidth = 0; + + CrxSubband* subbands = planeComp->subBands; + + // calculate sizes + for (int32_t subbandNum = 0; subbandNum < toSubbands; subbandNum++) { + subbands[subbandNum].bandSize = + subbands[subbandNum].width * sizeof(int32_t); // 4bytes + compDataSize += subbands[subbandNum].bandSize; + } + + if (img->levels) { + int32_t encLevels = img->levels ? img->levels : 1; + waveletDataOffset = (compDataSize + 7) & ~7; + compDataSize = + (sizeof(CrxWaveletTransform) * encLevels + waveletDataOffset + 7) & ~7; + compCoeffDataOffset = compDataSize; + + // calc wavelet line buffer sizes (always at one level up from current) + for (int level = 0; level < img->levels; ++level) { + if (level < img->levels - 1) { + compDataSize += 8 * sizeof(int32_t) * + planeComp->subBands[3 * (level + 1) + 2].width; + } else { + compDataSize += 8 * sizeof(int32_t) * tile->width; + } + } + } + + // buffer allocation + planeComp->compBuf = (uint8_t*)malloc(compDataSize); + + if (!planeComp->compBuf) { + return -1; + } + + // subbands buffer and sizes initialisation + uint64_t subbandMdatOffset = img->mdatOffset + mdatOffset; + uint8_t* subbandBuf = planeComp->compBuf; + + for (int32_t subbandNum = 0; subbandNum < toSubbands; subbandNum++) { + subbands[subbandNum].bandBuf = subbandBuf; + subbandBuf += subbands[subbandNum].bandSize; + subbands[subbandNum].mdatOffset = + subbandMdatOffset + subbands[subbandNum].dataOffset; + } + + // wavelet data initialisation + if (img->levels) { + CrxWaveletTransform* waveletTransforms = + (CrxWaveletTransform*)(planeComp->compBuf + waveletDataOffset); + int32_t* paramData = (int32_t*)(planeComp->compBuf + compCoeffDataOffset); + + planeComp->waveletTransform = waveletTransforms; + waveletTransforms[0].subband0Buf = (int32_t*)subbands->bandBuf; + + for (int level = 0; level < img->levels; ++level) { + int32_t band = 3 * level + 1; + + if (level >= img->levels - 1) { + waveletTransforms[level].height = tile->height; + transformWidth = tile->width; + } else { + waveletTransforms[level].height = subbands[band + 3].height; + transformWidth = subbands[band + 4].width; + } + + waveletTransforms[level].width = transformWidth; + waveletTransforms[level].lineBuf[0] = paramData; + waveletTransforms[level].lineBuf[1] = + waveletTransforms[level].lineBuf[0] + transformWidth; + waveletTransforms[level].lineBuf[2] = + waveletTransforms[level].lineBuf[1] + transformWidth; + waveletTransforms[level].lineBuf[3] = + waveletTransforms[level].lineBuf[2] + transformWidth; + waveletTransforms[level].lineBuf[4] = + waveletTransforms[level].lineBuf[3] + transformWidth; + waveletTransforms[level].lineBuf[5] = + waveletTransforms[level].lineBuf[4] + transformWidth; + waveletTransforms[level].lineBuf[6] = + waveletTransforms[level].lineBuf[5] + transformWidth; + waveletTransforms[level].lineBuf[7] = + waveletTransforms[level].lineBuf[6] + transformWidth; + waveletTransforms[level].curLine = 0; + waveletTransforms[level].curH = 0; + waveletTransforms[level].fltTapH = 0; + waveletTransforms[level].subband1Buf = (int32_t*)subbands[band].bandBuf; + waveletTransforms[level].subband2Buf = + (int32_t*)subbands[band + 1].bandBuf; + waveletTransforms[level].subband3Buf = + (int32_t*)subbands[band + 2].bandBuf; + + paramData = waveletTransforms[level].lineBuf[7] + transformWidth; + } + } + + // decoding params and bitstream initialisation + for (int32_t subbandNum = 0; subbandNum < toSubbands; subbandNum++) { + if (subbands[subbandNum].dataSize) { + int32_t supportsPartial = 0; + uint32_t roundedBitsMask = 0; + + if (planeComp->supportsPartial && subbandNum == 0) { + roundedBitsMask = planeComp->roundedBitsMask; + supportsPartial = 1; + } + + if (crxParamInit(&subbands[subbandNum].bandParam, + subbands[subbandNum].mdatOffset, + subbands[subbandNum].dataSize, + subbands[subbandNum].width, subbands[subbandNum].height, + supportsPartial, roundedBitsMask, img->input)) { + return -1; + } + } + } + + return 0; +} +} // namespace + +int DCraw::crxDecodePlane(void* p, uint32_t planeNumber) +{ + CrxImage* img = (CrxImage*)p; + int imageRow = 0; + + for (int tRow = 0; tRow < img->tileRows; tRow++) { + int imageCol = 0; + + for (int tCol = 0; tCol < img->tileCols; tCol++) { + CrxTile* tile = img->tiles + tRow * img->tileRows + tCol; + CrxPlaneComp* planeComp = tile->comps + planeNumber; + uint64_t tileMdatOffset = tile->dataOffset + planeComp->dataOffset; + + // decode single tile + if (crxSetupSubbandData(img, planeComp, tile, tileMdatOffset)) { + return -1; + } + + if (img->levels) { + if (crxIdwt53FilterInitialize(planeComp, img->levels - 1)) { + return -1; + } + + for (int i = 0; i < tile->height; ++i) { + if (crxIdwt53FilterDecode(planeComp, img->levels - 1) || + crxIdwt53FilterTransform(planeComp, img->levels - 1)) { + return -1; + } + + int32_t* lineData = + crxIdwt53FilterGetLine(planeComp, img->levels - 1); + crxConvertPlaneLine(img, imageRow + i, imageCol, planeNumber, + lineData, tile->width); + } + } else { + // we have the only subband in this case + if (!planeComp->subBands->dataSize) { + memset(planeComp->subBands->bandBuf, 0, + planeComp->subBands->bandSize); + return 0; + } + + for (int i = 0; i < tile->height; ++i) { + if (crxDecodeLine(planeComp->subBands->bandParam, + planeComp->subBands->bandBuf)) { + return -1; + } + + int32_t* lineData = (int32_t*)planeComp->subBands->bandBuf; + crxConvertPlaneLine(img, imageRow + i, imageCol, planeNumber, + lineData, tile->width); + } + } + + imageCol += tile->width; + } + + imageRow += img->tiles[tRow * img->tileRows].height; + } + + return 0; +} + +namespace +{ +using crx_data_header_t = DCraw::CanonCR3Data::crx_data_header_t; + +int crxReadSubbandHeaders(crx_data_header_t* hdr, CrxImage* img, CrxTile* tile, + CrxPlaneComp* comp, uint8_t** subbandMdatPtr, + uint32_t* mdatSize) +{ + CrxSubband* band = comp->subBands + img->subbandCount - 1; // set to last band + uint32_t bandHeight = tile->height; + uint32_t bandWidth = tile->width; + int32_t bandWidthExCoef = 0; + int32_t bandHeightExCoef = 0; + + if (img->levels) { + // Build up subband sequences to crxDecode to a level in a header + + // Coefficient structure is a bit unclear and convoluted: + // 3 levels max - 8 groups (for tile width rounded to 8 bytes) + // of 3 band per level 4 sets of coefficients for each + int32_t* rowExCoef = + exCoefNumTbl + 0x60 * (img->levels - 1) + 12 * (tile->width & 7); + int32_t* colExCoef = + exCoefNumTbl + 0x60 * (img->levels - 1) + 12 * (tile->height & 7); + + for (int level = 0; level < img->levels; ++level) { + int32_t widthOddPixel = bandWidth & 1; + int32_t heightOddPixel = bandHeight & 1; + bandWidth = (widthOddPixel + bandWidth) >> 1; + bandHeight = (heightOddPixel + bandHeight) >> 1; + + int32_t bandWidthExCoef0 = 0; + int32_t bandWidthExCoef1 = 0; + int32_t bandHeightExCoef0 = 0; + int32_t bandHeightExCoef1 = 0; + + if (tile->tileFlag & E_HAS_TILES_ON_THE_RIGHT) { + bandWidthExCoef0 = rowExCoef[0]; + bandWidthExCoef1 = rowExCoef[1]; + } + + if (tile->tileFlag & E_HAS_TILES_ON_THE_LEFT) { + ++bandWidthExCoef0; + } + + if (tile->tileFlag & E_HAS_TILES_ON_THE_BOTTOM) { + bandHeightExCoef0 = colExCoef[0]; + bandHeightExCoef1 = colExCoef[1]; + } + + if (tile->tileFlag & E_HAS_TILES_ON_THE_TOP) { + ++bandHeightExCoef0; + } + + band[0].width = bandWidth + bandWidthExCoef0 - widthOddPixel; + band[0].height = bandHeight + bandHeightExCoef0 - heightOddPixel; + + band[-1].width = bandWidth + bandWidthExCoef1; + band[-1].height = bandHeight + bandHeightExCoef0 - heightOddPixel; + + band[-2].width = bandWidth + bandWidthExCoef0 - widthOddPixel; + band[-2].height = bandHeight + bandHeightExCoef1; + + rowExCoef += 4; + colExCoef += 4; + band -= 3; + } + + bandWidthExCoef = bandHeightExCoef = 0; + + if (tile->tileFlag & E_HAS_TILES_ON_THE_RIGHT) { + bandWidthExCoef = + exCoefNumTbl[0x60 * (img->levels - 1) + 12 * (tile->width & 7) + + 4 * (img->levels - 1) + 1]; + } + + if (tile->tileFlag & E_HAS_TILES_ON_THE_BOTTOM) { + bandHeightExCoef = + exCoefNumTbl[0x60 * (img->levels - 1) + 12 * (tile->height & 7) + + 4 * (img->levels - 1) + 1]; + } + } + + band->width = bandWidthExCoef + bandWidth; + band->height = bandHeightExCoef + bandHeight; + + if (!img->subbandCount) { + return 0; + } + + int32_t subbandOffset = 0; + band = comp->subBands; + + for (unsigned int curSubband = 0; curSubband < img->subbandCount; curSubband++, band++) { + if (*mdatSize < 0xC) { + return -1; + } + + if (sgetn(2, *subbandMdatPtr) != 0xFF03) { + return -1; + } + + uint32_t bitData = sgetn(4, *subbandMdatPtr + 8); + uint32_t subbandSize = sgetn(4, *subbandMdatPtr + 4); + + if (curSubband != bitData >> 28) { + band->dataSize = subbandSize; + return -1; + } + + band->dataSize = subbandSize - (bitData & 0x7FF); + band->supportsPartial = bitData & 0x8000 ? 1 : 0; + band->dataOffset = subbandOffset; + band->quantValue = (bitData >> 19) & 0xFF; + band->paramK = 0; + band->bandParam = nullptr; + band->bandBuf = nullptr; + band->bandSize = 0; + + subbandOffset += subbandSize; + + *subbandMdatPtr += 0xC; + *mdatSize -= 0xC; + } + + return 0; +} + +int crxReadImageHeaders(crx_data_header_t* hdr, CrxImage* img, uint8_t* mdatPtr, uint32_t mdatSize) { - unsigned int nTiles = img->tileRows * img->tileCols; + unsigned int nTiles = img->tileRows * img->tileCols; - if (!nTiles) - return -1; + if (!nTiles) { + return -1; + } - if (!img->tiles) - { - img->tiles = (CrxTile *)malloc( - sizeof(CrxTile) * nTiles + - sizeof(CrxPlaneComp) * nTiles * img->nPlanes + - sizeof(CrxSubband) * nTiles * img->nPlanes * img->subbandCount); - if (!img->tiles) - return -1; + if (!img->tiles) { + img->tiles = (CrxTile*)malloc( + sizeof(CrxTile) * nTiles + + sizeof(CrxPlaneComp) * nTiles * img->nPlanes + + sizeof(CrxSubband) * nTiles * img->nPlanes * img->subbandCount); - // memory areas in allocated chunk - CrxTile *tile = img->tiles; - CrxPlaneComp *comps = (CrxPlaneComp *)(tile + nTiles); - CrxSubband *bands = (CrxSubband *)(comps + img->nPlanes * nTiles); - - for (unsigned int curTile = 0; curTile < nTiles; curTile++, tile++) - { - tile->tileFlag = 0; // tile neighbouring flags - tile->tileNumber = curTile; - tile->tileSize = 0; - tile->comps = comps + curTile * img->nPlanes; - - if ((curTile + 1) % img->tileCols) - { - // not the last tile in a tile row - tile->width = hdr->tileWidth; - if (img->tileCols > 1) - { - tile->tileFlag = E_HAS_TILES_ON_THE_RIGHT; - if (curTile % img->tileCols) - // not the first tile in tile row - tile->tileFlag |= E_HAS_TILES_ON_THE_LEFT; + if (!img->tiles) { + return -1; } - } - else - { - // last tile in a tile row - tile->width = img->planeWidth - hdr->tileWidth * (img->tileCols - 1); - if (img->tileCols > 1) - tile->tileFlag = E_HAS_TILES_ON_THE_LEFT; - } - if (curTile < nTiles - img->tileCols) - { - // in first tile row - tile->height = hdr->tileHeight; - if (img->tileRows > 1) - { - tile->tileFlag |= E_HAS_TILES_ON_THE_BOTTOM; - if (curTile >= img->tileCols) - tile->tileFlag |= E_HAS_TILES_ON_THE_TOP; - } - } - else - { - // non first tile row - tile->height = img->planeHeight - hdr->tileHeight * (img->tileRows - 1); - if (img->tileRows > 1) - tile->tileFlag |= E_HAS_TILES_ON_THE_TOP; - } - if (img->nPlanes) - { - CrxPlaneComp *comp = tile->comps; - CrxSubband *band = bands + curTile * img->nPlanes * img->subbandCount; - for (int curComp = 0; curComp < img->nPlanes; curComp++, comp++) - { - comp->compNumber = curComp; - comp->supportsPartial = 1; - comp->tileFlag = tile->tileFlag; - comp->subBands = band; - comp->compBuf = 0; - comp->waveletTransform = 0; - if (img->subbandCount) - { - for (int curBand = 0; curBand < img->subbandCount; - curBand++, band++) - { - band->supportsPartial = 0; - band->quantValue = 4; - band->bandParam = 0; - band->dataSize = 0; + // memory areas in allocated chunk + CrxTile* tile = img->tiles; + CrxPlaneComp* comps = (CrxPlaneComp*)(tile + nTiles); + CrxSubband* bands = (CrxSubband*)(comps + img->nPlanes * nTiles); + + for (unsigned int curTile = 0; curTile < nTiles; curTile++, tile++) { + tile->tileFlag = 0; // tile neighbouring flags + tile->tileNumber = curTile; + tile->tileSize = 0; + tile->comps = comps + curTile * img->nPlanes; + + if ((curTile + 1) % img->tileCols) { + // not the last tile in a tile row + tile->width = hdr->tileWidth; + + if (img->tileCols > 1) { + tile->tileFlag = E_HAS_TILES_ON_THE_RIGHT; + + if (curTile % img->tileCols) { + // not the first tile in tile row + tile->tileFlag |= E_HAS_TILES_ON_THE_LEFT; + } + } + } else { + // last tile in a tile row + tile->width = img->planeWidth - hdr->tileWidth * (img->tileCols - 1); + + if (img->tileCols > 1) { + tile->tileFlag = E_HAS_TILES_ON_THE_LEFT; + } + } + + if (curTile < nTiles - img->tileCols) { + // in first tile row + tile->height = hdr->tileHeight; + + if (img->tileRows > 1) { + tile->tileFlag |= E_HAS_TILES_ON_THE_BOTTOM; + + if (curTile >= img->tileCols) { + tile->tileFlag |= E_HAS_TILES_ON_THE_TOP; + } + } + } else { + // non first tile row + tile->height = img->planeHeight - hdr->tileHeight * (img->tileRows - 1); + + if (img->tileRows > 1) { + tile->tileFlag |= E_HAS_TILES_ON_THE_TOP; + } + } + + if (img->nPlanes) { + CrxPlaneComp* comp = tile->comps; + CrxSubband* band = bands + curTile * img->nPlanes * img->subbandCount; + + for (int curComp = 0; curComp < img->nPlanes; curComp++, comp++) { + comp->compNumber = curComp; + comp->supportsPartial = 1; + comp->tileFlag = tile->tileFlag; + comp->subBands = band; + comp->compBuf = nullptr; + comp->waveletTransform = nullptr; + + if (img->subbandCount) { + for (int curBand = 0; curBand < img->subbandCount; + curBand++, band++) { + band->supportsPartial = 0; + band->quantValue = 4; + band->bandParam = nullptr; + band->dataSize = 0; + } + } + } } - } } - } } - } - uint32_t tileOffset = 0; - uint32_t dataSize = mdatSize; - uint8_t *dataPtr = mdatPtr; - CrxTile *tile = img->tiles; + uint32_t tileOffset = 0; + uint32_t dataSize = mdatSize; + uint8_t* dataPtr = mdatPtr; + CrxTile* tile = img->tiles; - for (unsigned int curTile = 0; curTile < nTiles; curTile++, tile++) - { - if (dataSize < 0xC) - return -1; + for (unsigned int curTile = 0; curTile < nTiles; curTile++, tile++) { + if (dataSize < 0xC) { + return -1; + } - if (sgetn(2, dataPtr) != 0xFF01) - return -1; - if (sgetn(2, dataPtr + 8) != curTile) - return -1; + if (sgetn(2, dataPtr) != 0xFF01) { + return -1; + } - dataSize -= 0xC; + if (sgetn(2, dataPtr + 8) != curTile) { + return -1; + } - tile->tileSize = sgetn(4, dataPtr + 4); - tile->dataOffset = tileOffset; + dataSize -= 0xC; - int32_t hdrExtraBytes = sgetn(2, dataPtr + 2) - 8; - tileOffset += tile->tileSize; - dataPtr += hdrExtraBytes + 0xC; - dataSize -= hdrExtraBytes; + tile->tileSize = sgetn(4, dataPtr + 4); + tile->dataOffset = tileOffset; - uint32_t compOffset = 0; - CrxPlaneComp *comp = tile->comps; + int32_t hdrExtraBytes = sgetn(2, dataPtr + 2) - 8; + tileOffset += tile->tileSize; + dataPtr += hdrExtraBytes + 0xC; + dataSize -= hdrExtraBytes; - for (int compNum = 0; compNum < img->nPlanes; compNum++, comp++) - { - if (dataSize < 0xC) - return -1; + uint32_t compOffset = 0; + CrxPlaneComp* comp = tile->comps; - if (sgetn(2, dataPtr) != 0xFF02) - return -1; - if (compNum != dataPtr[8] >> 4) - return -1; + for (int compNum = 0; compNum < img->nPlanes; compNum++, comp++) { + if (dataSize < 0xC) { + return -1; + } - comp->compSize = sgetn(4, dataPtr + 4); + if (sgetn(2, dataPtr) != 0xFF02) { + return -1; + } - int32_t compHdrRoundedBits = (dataPtr[8] >> 1) & 3; - comp->supportsPartial = (dataPtr[8] & 8) != 0; + if (compNum != dataPtr[8] >> 4) { + return -1; + } - comp->dataOffset = compOffset; - comp->tileFlag = tile->tileFlag; + comp->compSize = sgetn(4, dataPtr + 4); - compOffset += comp->compSize; - dataSize -= 0xC; - dataPtr += 0xC; + int32_t compHdrRoundedBits = (dataPtr[8] >> 1) & 3; + comp->supportsPartial = (dataPtr[8] & 8) != 0; - comp->roundedBitsMask = 0; + comp->dataOffset = compOffset; + comp->tileFlag = tile->tileFlag; - if (compHdrRoundedBits) - { - if (img->levels || !comp->supportsPartial) - return -1; + compOffset += comp->compSize; + dataSize -= 0xC; + dataPtr += 0xC; - comp->roundedBitsMask = 1 << (compHdrRoundedBits - 1); - } + comp->roundedBitsMask = 0; - if (crxReadSubbandHeaders(hdr, img, tile, comp, &dataPtr, &dataSize)) - return -1; + if (compHdrRoundedBits) { + if (img->levels || !comp->supportsPartial) { + return -1; + } + + comp->roundedBitsMask = 1 << (compHdrRoundedBits - 1); + } + + if (crxReadSubbandHeaders(hdr, img, tile, comp, &dataPtr, &dataSize)) { + return -1; + } + } } - } - return 0; + + return 0; } -int crxSetupImageData(crx_data_header_t *hdr, CrxImage *img, int16_t *outBuf, +int crxSetupImageData(crx_data_header_t* hdr, CrxImage* img, int16_t* outBuf, uint64_t mdatOffset, uint32_t mdatSize, - uint8_t *mdatHdrPtr) + uint8_t* mdatHdrPtr) { - int IncrBitTable[32] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, - 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0}; + int IncrBitTable[32] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0 + }; - img->planeWidth = hdr->f_width; - img->planeHeight = hdr->f_height; + img->planeWidth = hdr->f_width; + img->planeHeight = hdr->f_height; - if (hdr->tileWidth < 0x16 || hdr->tileHeight < 0x16 || - img->planeWidth > 0x7FFF || img->planeHeight > 0x7FFF) - return -1; - - img->tileCols = (img->planeWidth + hdr->tileWidth - 1) / hdr->tileWidth; - img->tileRows = (img->planeHeight + hdr->tileHeight - 1) / hdr->tileHeight; - - if (img->tileCols > 0xFF || img->tileRows > 0xFF || - img->planeWidth - hdr->tileWidth * (img->tileCols - 1) < 0x16 || - img->planeHeight - hdr->tileHeight * (img->tileRows - 1) < 0x16) - return -1; - - img->tiles = 0; - img->levels = hdr->imageLevels; - img->subbandCount = 3 * img->levels + 1; // 3 bands per level + one last LL - img->nPlanes = hdr->nPlanes; - img->nBits = hdr->nBits; - img->encType = hdr->encType; - img->samplePrecision = hdr->nBits + IncrBitTable[4 * hdr->encType + 2] + 1; - img->mdatOffset = mdatOffset + hdr->mdatHdrSize; - img->mdatSize = mdatSize; - img->planeBuf = 0; - img->outBufs[0] = img->outBufs[1] = img->outBufs[2] = img->outBufs[3] = 0; - - // The encoding type 3 needs all 4 planes to be decoded to generate row of - // RGGB values. It seems to be using some other colour space for raw encoding - // It is a massive buffer so ideallly it will need a different approach: - // decode planes line by line and convert single line then without - // intermediate plane buffer. At the moment though it's too many changes so - // left as is. - if (img->encType == 3 && img->nPlanes == 4 && img->nBits > 8) - { - img->planeBuf = - (int16_t *)malloc(img->planeHeight * img->planeWidth * img->nPlanes * - ((img->samplePrecision + 7) >> 3)); - if (!img->planeBuf) - return -1; - } - - int32_t rowSize = 2 * img->planeWidth; - - if (img->nPlanes == 1) - img->outBufs[0] = outBuf; - else - switch (hdr->cfaLayout) - { - case 0: - // R G - // G B - img->outBufs[0] = outBuf; - img->outBufs[1] = outBuf + 1; - img->outBufs[2] = outBuf + rowSize; - img->outBufs[3] = img->outBufs[2] + 1; - break; - case 1: - // G R - // B G - img->outBufs[1] = outBuf; - img->outBufs[0] = outBuf + 1; - img->outBufs[3] = outBuf + rowSize; - img->outBufs[2] = img->outBufs[3] + 1; - break; - case 2: - // G B - // R G - img->outBufs[2] = outBuf; - img->outBufs[3] = outBuf + 1; - img->outBufs[0] = outBuf + rowSize; - img->outBufs[1] = img->outBufs[0] + 1; - break; - case 3: - // B G - // G R - img->outBufs[3] = outBuf; - img->outBufs[2] = outBuf + 1; - img->outBufs[1] = outBuf + rowSize; - img->outBufs[0] = img->outBufs[1] + 1; - break; + if (hdr->tileWidth < 0x16 || hdr->tileHeight < 0x16 || + img->planeWidth > 0x7FFF || img->planeHeight > 0x7FFF) { + return -1; } - // read header - return crxReadImageHeaders(hdr, img, mdatHdrPtr, mdatSize); + img->tileCols = (img->planeWidth + hdr->tileWidth - 1) / hdr->tileWidth; + img->tileRows = (img->planeHeight + hdr->tileHeight - 1) / hdr->tileHeight; + + if (img->tileCols > 0xFF || img->tileRows > 0xFF || + img->planeWidth - hdr->tileWidth * (img->tileCols - 1) < 0x16 || + img->planeHeight - hdr->tileHeight * (img->tileRows - 1) < 0x16) { + return -1; + } + + img->tiles = nullptr; + img->levels = hdr->imageLevels; + img->subbandCount = 3 * img->levels + 1;// 3 bands per level + one last LL + img->nPlanes = hdr->nPlanes; + img->nBits = hdr->nBits; + img->encType = hdr->encType; + img->samplePrecision = hdr->nBits + IncrBitTable[4 * hdr->encType + 2] + 1; + img->mdatOffset = mdatOffset + hdr->mdatHdrSize; + img->mdatSize = mdatSize; + img->planeBuf = nullptr; + img->outBufs[0] = img->outBufs[1] = img->outBufs[2] = img->outBufs[3] = nullptr; + + // The encoding type 3 needs all 4 planes to be decoded to generate row of + // RGGB values. It seems to be using some other colour space for raw encoding + // It is a massive buffer so ideallly it will need a different approach: + // decode planes line by line and convert single line then without + // intermediate plane buffer. At the moment though it's too many changes so + // left as is. + if (img->encType == 3 && img->nPlanes == 4 && img->nBits > 8) { + img->planeBuf = + (int16_t*)malloc(img->planeHeight * img->planeWidth * img->nPlanes * + ((img->samplePrecision + 7) >> 3)); + + if (!img->planeBuf) { + return -1; + } + } + + int32_t rowSize = 2 * img->planeWidth; + + if (img->nPlanes == 1) { + img->outBufs[0] = outBuf; + } else { + switch (hdr->cfaLayout) { + case 0: { + // R G + // G B + img->outBufs[0] = outBuf; + img->outBufs[1] = outBuf + 1; + img->outBufs[2] = outBuf + rowSize; + img->outBufs[3] = img->outBufs[2] + 1; + break; + } + + case 1: { + // G R + // B G + img->outBufs[1] = outBuf; + img->outBufs[0] = outBuf + 1; + img->outBufs[3] = outBuf + rowSize; + img->outBufs[2] = img->outBufs[3] + 1; + break; + } + + case 2: { + // G B + // R G + img->outBufs[2] = outBuf; + img->outBufs[3] = outBuf + 1; + img->outBufs[0] = outBuf + rowSize; + img->outBufs[1] = img->outBufs[0] + 1; + break; + } + + case 3: { + // B G + // G R + img->outBufs[3] = outBuf; + img->outBufs[2] = outBuf + 1; + img->outBufs[1] = outBuf + rowSize; + img->outBufs[0] = img->outBufs[1] + 1; + break; + } + } + } + + // read header + return crxReadImageHeaders(hdr, img, mdatHdrPtr, mdatSize); } -int crxFreeImageData(CrxImage *img) +int crxFreeImageData(CrxImage* img) { - CrxTile *tile = img->tiles; - int nTiles = img->tileRows * img->tileCols; + CrxTile* tile = img->tiles; + int nTiles = img->tileRows * img->tileCols; - if (img->tiles) - { - for (int32_t curTile = 0; curTile < nTiles; curTile++, tile++) - if (tile[curTile].comps) - for (int32_t curPlane = 0; curPlane < img->nPlanes; curPlane++) - crxFreeSubbandData(img, tile[curTile].comps + curPlane); - free(img->tiles); - img->tiles = 0; - } + if (img->tiles) { + for (int32_t curTile = 0; curTile < nTiles; curTile++, tile++) { + if (tile[curTile].comps) { + for (int32_t curPlane = 0; curPlane < img->nPlanes; curPlane++) { + crxFreeSubbandData(img, tile[curTile].comps + curPlane); + } + } + } - if (img->planeBuf) - { - free(img->planeBuf); - img->planeBuf = 0; - } + free(img->tiles); + img->tiles = nullptr; + } - return 0; + if (img->planeBuf) { + free(img->planeBuf); + img->planeBuf = nullptr; + } + + return 0; } +} // namespace -} // namespace - -void DCraw::crxLoadDecodeLoop(void *img, int nPlanes) +void DCraw::crxLoadDecodeLoop(void* img, int nPlanes) { #ifdef _OPENMP - int results[4]; // nPlanes is always <= 4 -#pragma omp parallel for - for (int32_t plane = 0; plane < nPlanes; ++plane) - results[plane] = crxDecodePlane(img, plane); + int results[4]; // nPlanes is always <= 4 + #pragma omp parallel for + + for (int32_t plane = 0; plane < nPlanes; ++plane) { + results[plane] = crxDecodePlane(img, plane); + } + + for (int32_t plane = 0; plane < nPlanes; ++plane) { + if (results[plane]) { + derror(); + } + } - for (int32_t plane = 0; plane < nPlanes; ++plane) - if (results[plane]) - derror(); #else - for (int32_t plane = 0; plane < nPlanes; ++plane) - if (crxDecodePlane(img, plane)) - derror(); + + for (int32_t plane = 0; plane < nPlanes; ++plane) { + if (crxDecodePlane(img, plane)) { + derror(); + } + } + #endif } -void DCraw::crxConvertPlaneLineDf(void *p, int imageRow) +void DCraw::crxConvertPlaneLineDf(void* p, int imageRow) { - crxConvertPlaneLine((CrxImage *)p, imageRow); + crxConvertPlaneLine((CrxImage*)p, imageRow); } -void DCraw::crxLoadFinalizeLoopE3(void *p, int planeHeight) +void DCraw::crxLoadFinalizeLoopE3(void* p, int planeHeight) { #ifdef _OPENMP -#pragma omp parallel for + #pragma omp parallel for #endif - for (int i = 0; i < planeHeight; ++i) - crxConvertPlaneLineDf(p, i); + + for (int i = 0; i < planeHeight; ++i) { + crxConvertPlaneLineDf(p, i); + } } void DCraw::crxLoadRaw() { - CrxImage img; - if (RT_canon_CR3_data.crx_track_selected >= - LIBRAW_CRXTRACKS_MAXCOUNT) - derror(); - crx_data_header_t hdr = - RT_canon_CR3_data - .crx_header[RT_canon_CR3_data.crx_track_selected]; + CrxImage img; - LibRaw_abstract_datastream input = { ifp }; - img.input = &input; //libraw_internal_data.internal_data.input; + if (RT_canon_CR3_data.crx_track_selected >= + LIBRAW_CRXTRACKS_MAXCOUNT) { + derror(); + } - // update sizes for the planes - if (hdr.nPlanes == 4) - { - hdr.f_width >>= 1; - hdr.f_height >>= 1; - hdr.tileWidth >>= 1; - hdr.tileHeight >>= 1; - } + crx_data_header_t hdr = + RT_canon_CR3_data + .crx_header[RT_canon_CR3_data.crx_track_selected]; + + LibRaw_abstract_datastream input = {ifp}; + img.input = &input; // libraw_internal_data.internal_data.input; + + // update sizes for the planes + if (hdr.nPlanes == 4) { + hdr.f_width >>= 1; + hdr.f_height >>= 1; + hdr.tileWidth >>= 1; + hdr.tileHeight >>= 1; + } // /*imgdata.color.*/maximum = (1 << hdr.nBits) - 1; - uint8_t *hdrBuf = (uint8_t *)malloc(hdr.mdatHdrSize); + uint8_t* hdrBuf = (uint8_t*)malloc(hdr.mdatHdrSize); - // read image header + // read image header #ifdef _OPENMP -#pragma omp critical + #pragma omp critical #endif - { + { #ifndef _OPENMP - /*libraw_internal_data.internal_data.input->*/input.lock(); + /*libraw_internal_data.internal_data.input->*/ input.lock(); #endif - /*libraw_internal_data.internal_data.input->*/input.seek( - data_offset, SEEK_SET); - /*libraw_internal_data.internal_data.input->*/input.read(hdrBuf, 1, hdr.mdatHdrSize); + /*libraw_internal_data.internal_data.input->*/ input.seek( + data_offset, SEEK_SET); + /*libraw_internal_data.internal_data.input->*/ input.read(hdrBuf, 1, hdr.mdatHdrSize); #ifndef _OPENMP - /*libraw_internal_data.internal_data.input->*/input.unlock(); + /*libraw_internal_data.internal_data.input->*/ input.unlock(); #endif - } + } - // parse and setup the image data - if (crxSetupImageData(&hdr, &img, (int16_t *)raw_image, - hdr.MediaOffset/*data_offset*/, - hdr.MediaSize/*RT_canon_CR3_data.data_size*/, hdrBuf)) - derror(); - free(hdrBuf); + // parse and setup the image data + if (crxSetupImageData(&hdr, &img, (int16_t*)raw_image, + hdr.MediaOffset /*data_offset*/, + hdr.MediaSize /*RT_canon_CR3_data.data_size*/, hdrBuf)) { + derror(); + } - crxLoadDecodeLoop(&img, hdr.nPlanes); + free(hdrBuf); - if (img.encType == 3) - crxLoadFinalizeLoopE3(&img, img.planeHeight); + crxLoadDecodeLoop(&img, hdr.nPlanes); - crxFreeImageData(&img); + if (img.encType == 3) { + crxLoadFinalizeLoopE3(&img, img.planeHeight); + } + + crxFreeImageData(&img); } -int DCraw::crxParseImageHeader(uchar *cmp1TagData, unsigned int nTrack) +int DCraw::crxParseImageHeader(uchar* cmp1TagData, unsigned int nTrack) { - if (nTrack >= LIBRAW_CRXTRACKS_MAXCOUNT) - return -1; - if (!cmp1TagData) - return -1; + if (nTrack >= LIBRAW_CRXTRACKS_MAXCOUNT) { + return -1; + } - crx_data_header_t *hdr = - &RT_canon_CR3_data.crx_header[nTrack]; + if (!cmp1TagData) { + return -1; + } - hdr->version = sgetn(2, cmp1TagData + 4); - hdr->f_width = sgetn(4, cmp1TagData + 8); - hdr->f_height = sgetn(4, cmp1TagData + 12); - hdr->tileWidth = sgetn(4, cmp1TagData + 16); - hdr->tileHeight = sgetn(4, cmp1TagData + 20); - hdr->nBits = cmp1TagData[24]; - hdr->nPlanes = cmp1TagData[25] >> 4; - hdr->cfaLayout = cmp1TagData[25] & 0xF; - hdr->encType = cmp1TagData[26] >> 4; - hdr->imageLevels = cmp1TagData[26] & 0xF; - hdr->hasTileCols = cmp1TagData[27] >> 7; - hdr->hasTileRows = (cmp1TagData[27] >> 6) & 1; - hdr->mdatHdrSize = sgetn(4, cmp1TagData + 28); + crx_data_header_t* hdr = + &RT_canon_CR3_data.crx_header[nTrack]; - // validation - if (hdr->version != 0x100 || !hdr->mdatHdrSize) - return -1; - if (hdr->encType == 1) - { - if (hdr->nBits > 15) - return -1; - } - else - { - if (hdr->encType && hdr->encType != 3) - return -1; - if (hdr->nBits > 14) - return -1; - } + hdr->version = sgetn(2, cmp1TagData + 4); + hdr->f_width = sgetn(4, cmp1TagData + 8); + hdr->f_height = sgetn(4, cmp1TagData + 12); + hdr->tileWidth = sgetn(4, cmp1TagData + 16); + hdr->tileHeight = sgetn(4, cmp1TagData + 20); + hdr->nBits = cmp1TagData[24]; + hdr->nPlanes = cmp1TagData[25] >> 4; + hdr->cfaLayout = cmp1TagData[25] & 0xF; + hdr->encType = cmp1TagData[26] >> 4; + hdr->imageLevels = cmp1TagData[26] & 0xF; + hdr->hasTileCols = cmp1TagData[27] >> 7; + hdr->hasTileRows = (cmp1TagData[27] >> 6) & 1; + hdr->mdatHdrSize = sgetn(4, cmp1TagData + 28); - if (hdr->nPlanes == 1) - { - if (hdr->cfaLayout || hdr->encType) - return -1; - if (hdr->nBits != 8) - return -1; - } - else if (hdr->nPlanes != 4 || (hdr->f_width & 1) || (hdr->f_height & 1) || - (hdr->tileWidth & 1) || (hdr->tileHeight & 1) || hdr->cfaLayout > 3 || - (hdr->encType && hdr->encType != 1 && hdr->encType != 3) || - hdr->nBits == 8) - return -1; + // validation + if (hdr->version != 0x100 || !hdr->mdatHdrSize) { + return -1; + } - if (hdr->tileWidth > hdr->f_width || hdr->tileHeight > hdr->f_height) - return -1; + if (hdr->encType == 1) { + if (hdr->nBits > 15) { + return -1; + } + } else { + if (hdr->encType && hdr->encType != 3) { + return -1; + } - if (hdr->imageLevels > 3 || hdr->hasTileCols > 1 || hdr->hasTileRows > 1) - return -1; - return 0; + if (hdr->nBits > 14) { + return -1; + } + } + + if (hdr->nPlanes == 1) { + if (hdr->cfaLayout || hdr->encType) { + return -1; + } + + if (hdr->nBits != 8) { + return -1; + } + } else if (hdr->nPlanes != 4 || (hdr->f_width & 1) || (hdr->f_height & 1) || + (hdr->tileWidth & 1) || (hdr->tileHeight & 1) || hdr->cfaLayout > 3 || + (hdr->encType && hdr->encType != 1 && hdr->encType != 3) || + hdr->nBits == 8) { + return -1; + } + + if (hdr->tileWidth > hdr->f_width || hdr->tileHeight > hdr->f_height) { + return -1; + } + + if (hdr->imageLevels > 3 || hdr->hasTileCols > 1 || hdr->hasTileRows > 1) { + return -1; + } + + return 0; } #undef _abs From 0b5b9b0f3e0cca4cbdfbd0dc24a0e5d2caa8f4b8 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 21 Nov 2019 15:37:55 +0100 Subject: [PATCH 169/208] findHotDeadPixels: further speedup and cleanup, #5531 --- rtengine/badpixels.cc | 167 ++++++++++++------------------------------ 1 file changed, 45 insertions(+), 122 deletions(-) diff --git a/rtengine/badpixels.cc b/rtengine/badpixels.cc index 578459189..0ae63a618 100644 --- a/rtengine/badpixels.cc +++ b/rtengine/badpixels.cc @@ -22,13 +22,39 @@ #include "pixelsmap.h" #include "rawimage.h" #include "rawimagesource.h" -#define BENCHMARK +//#define BENCHMARK #include "StopWatch.h" + namespace { unsigned fc(const unsigned int cfa[2][2], int r, int c) { return cfa[r & 1][c & 1]; } + +inline void sum5x5(const array2D& in, int col, float &sum) { +#ifdef __SSE2__ + // sum up 5*4 = 20 values using SSE + // 10 fabs function calls and 10 float additions with SSE + const vfloat sumv = (vabsf(LVFU(in[0][col])) + vabsf(LVFU(in[1][col]))) + + (vabsf(LVFU(in[2][col])) + vabsf(LVFU(in[3][col]))) + + vabsf(LVFU(in[4][col])); + // horizontally add the values and add the result to hfnbrave + sum += vhadd(sumv); + + // add remaining 5 values of last column + sum += (fabsf(in[0][col + 4]) + fabsf(in[1][col + 4])) + + (fabsf(in[2][col + 4]) + fabsf(in[3][col + 4])) + + fabsf(in[4][col + 4]); +#else + // 25 fabs function calls and 25 float additions without SSE + for (int nn = col; nn < col + 5; ++nn) { + sum += (fabsf(in[0][nn]) + fabsf(in[1][nn])) + + (fabsf(in[2][nn]) + fabsf(in[3][nn])) + + fabsf(in[4][nn]); + } +#endif + +} } namespace rtengine @@ -446,8 +472,8 @@ int RawImageSource::interpolateBadPixelsXtrans(const PixelsMap &bitmapBads) /* Search for hot or dead pixels in the image and update the map * For each pixel compare its value to the average of similar color surrounding * (Taken from Emil Martinec idea) - * (Optimized by Ingo Weyrich 2013, 2015 and 2019) - */ + * (Optimized by Ingo Weyrich 2013, 2015, and 2019) +*/ int RawImageSource::findHotDeadPixels(PixelsMap &bpMap, const float thresh, const bool findHotPixels, const bool findDeadPixels) const { BENCHFUN @@ -460,11 +486,7 @@ int RawImageSource::findHotDeadPixels(PixelsMap &bpMap, const float thresh, cons #pragma omp parallel reduction(+:counter) #endif { - array2D cfablur(W, 5); - // zero left and right border - for (int i = 0; i < 5; ++i) { - cfablur[i][0] = cfablur[i][1] = cfablur[i][W - 2] = cfablur[i][W - 1]; - } + array2D cfablur(W, 5, ARRAY2D_CLEAR_DATA); int firstRow = -1; int lastRow = -1; @@ -473,28 +495,13 @@ int RawImageSource::findHotDeadPixels(PixelsMap &bpMap, const float thresh, cons #pragma omp for schedule(static) nowait #endif - for (int i = 2; i < H - 2; i++) { + for (int i = 2; i < H - 2; ++i) { if (firstRow == -1) { firstRow = i; - if (firstRow == 2) { - for (int i = 0; i < 2; ++i) { - for (int j = 0; j < W; ++j) { - cfablur[i][j] = 0.f; - } - } - } else { + if (firstRow > 2) { for (int row = firstRow - 2; row < firstRow; ++row) { - int destRow = row % 5; - int j = 2; - #ifdef __SSE2__ - for (; j < W - 5; j += 4) { - const vfloat tempv = median(LVFU(rawData[row - 2][j - 2]), LVFU(rawData[row - 2][j]), LVFU(rawData[row - 2][j + 2]), - LVFU(rawData[row][j - 2]), LVFU(rawData[row][j]), LVFU(rawData[row][j + 2]), - LVFU(rawData[row + 2][j - 2]), LVFU(rawData[row + 2][j]), LVFU(rawData[row + 2][j + 2])); - STVFU(cfablur[destRow][j], LVFU(rawData[row][j]) - tempv); - } - #endif - for (; j < W - 2; j++) { + const int destRow = row % 5; + for (int j = 2; j < W - 2; ++j) { const float temp = median(rawData[row - 2][j - 2], rawData[row - 2][j], rawData[row - 2][j + 2], rawData[row][j - 2], rawData[row][j], rawData[row][j + 2], rawData[row + 2][j - 2], rawData[row + 2][j], rawData[row + 2][j + 2]); @@ -505,16 +512,7 @@ int RawImageSource::findHotDeadPixels(PixelsMap &bpMap, const float thresh, cons } lastRow = i; const int destRow = i % 5; - int j = 2; -#ifdef __SSE2__ - for (; j < W - 5; j += 4) { - const vfloat tempv = median(LVFU(rawData[i - 2][j - 2]), LVFU(rawData[i - 2][j]), LVFU(rawData[i - 2][j + 2]), - LVFU(rawData[i][j - 2]), LVFU(rawData[i][j]), LVFU(rawData[i][j + 2]), - LVFU(rawData[i + 2][j - 2]), LVFU(rawData[i + 2][j]), LVFU(rawData[i + 2][j + 2])); - STVFU(cfablur[destRow][j], LVFU(rawData[i][j]) - tempv); - } -#endif - for (; j < W - 2; j++) { + for (int j = 2; j < W - 2; ++j) { const float temp = median(rawData[i - 2][j - 2], rawData[i - 2][j], rawData[i - 2][j + 2], rawData[i][j - 2], rawData[i][j], rawData[i][j + 2], rawData[i + 2][j - 2], rawData[i + 2][j], rawData[i + 2][j + 2]); @@ -523,60 +521,26 @@ int RawImageSource::findHotDeadPixels(PixelsMap &bpMap, const float thresh, cons if (i - 1 > firstRow) { const int rr = i - 2; - const int rrm2 = (rr - 2) % 5; - const int rrm1 = (rr - 1) % 5; const int rr0 = rr % 5; - const int rrp1 = (rr + 1) % 5; - const int rrp2 = (rr + 2) % 5; for (int cc = 2; cc < W - 2; ++cc) { //evaluate pixel for heat/death float pixdev = cfablur[rr0][cc]; - if (pixdev == 0.f) { + if (!findDeadPixels && pixdev <= 0.f) { continue; } - if ((!findDeadPixels) && pixdev < 0) { - continue; - } - - if ((!findHotPixels) && pixdev > 0) { + if (!findHotPixels && pixdev >= 0.f) { continue; } pixdev = fabsf(pixdev); float hfnbrave = -pixdev; - -#ifdef __SSE2__ - // sum up 5*4 = 20 values using SSE - // 10 fabs function calls and 10 float additions with SSE - vfloat sum1 = vabsf(LVFU(cfablur[rrm2][cc - 2])) + vabsf(LVFU(cfablur[rrm1][cc - 2])); - vfloat sum2 = vabsf(LVFU(cfablur[rr0][cc - 2])) + vabsf(LVFU(cfablur[rrp1][cc - 2])); - sum1 += vabsf(LVFU(cfablur[rrp2][cc - 2])); - // horizontally add the values and add the result to hfnbrave - hfnbrave += vhadd(sum1 + sum2); - - // add remaining 5 values of last column - hfnbrave += fabsf(cfablur[rrm2][cc + 2]); - hfnbrave += fabsf(cfablur[rrm1][cc + 2]); - hfnbrave += fabsf(cfablur[rr0][cc + 2]); - hfnbrave += fabsf(cfablur[rrp1][cc + 2]); - hfnbrave += fabsf(cfablur[rrp2][cc + 2]); -#else - - // 25 fabs function calls and 25 float additions without SSE - for (int nn = cc - 2; nn <= cc + 2; ++nn) { - hfnbrave += fabsf(cfablur[rrm2][nn]); - hfnbrave += fabsf(cfablur[rrm1][nn]); - hfnbrave += fabsf(cfablur[rr0][nn]); - hfnbrave += fabsf(cfablur[rrp1][nn]); - hfnbrave += fabsf(cfablur[rrp2][nn]); - } -#endif + sum5x5(cfablur, cc - 2, hfnbrave); if (pixdev > varthresh * hfnbrave) { // mark the pixel as "bad" bpMap.set(cc, rr); - counter++; + ++counter; } } //end of pixel evaluation } @@ -592,16 +556,7 @@ int RawImageSource::findHotDeadPixels(PixelsMap &bpMap, const float thresh, cons cfablur[destRow][j] = 0.f; } } else { - int j = 2; -#ifdef __SSE2__ - for (; j < W - 5; j += 4) { - const vfloat tempv = median(LVFU(rawData[i - 2][j - 2]), LVFU(rawData[i - 2][j]), LVFU(rawData[i - 2][j + 2]), - LVFU(rawData[i][j - 2]), LVFU(rawData[i][j]), LVFU(rawData[i][j + 2]), - LVFU(rawData[i + 2][j - 2]), LVFU(rawData[i + 2][j]), LVFU(rawData[i + 2][j + 2])); - STVFU(cfablur[destRow][j], LVFU(rawData[i][j]) - tempv); - } -#endif - for (; j < W - 2; j++) { + for (int j = 2; j < W - 2; ++j) { const float temp = median(rawData[i - 2][j - 2], rawData[i - 2][j], rawData[i - 2][j + 2], rawData[i][j - 2], rawData[i][j], rawData[i][j + 2], rawData[i + 2][j - 2], rawData[i + 2][j], rawData[i + 2][j + 2]); @@ -609,64 +564,32 @@ int RawImageSource::findHotDeadPixels(PixelsMap &bpMap, const float thresh, cons } } - const int rrm2 = (rr - 2) % 5; - const int rrm1 = (rr - 1) % 5; const int rr0 = rr % 5; - const int rrp1 = (rr + 1) % 5; - const int rrp2 = (rr + 2) % 5; for (int cc = 2; cc < W - 2; ++cc) { //evaluate pixel for heat/death float pixdev = cfablur[rr0][cc]; - if (pixdev == 0.f) { + if (!findDeadPixels && pixdev <= 0.f) { continue; } - if ((!findDeadPixels) && pixdev < 0) { - continue; - } - - if ((!findHotPixels) && pixdev > 0) { + if (!findHotPixels && pixdev >= 0.f) { continue; } pixdev = fabsf(pixdev); float hfnbrave = -pixdev; - -#ifdef __SSE2__ - // sum up 5*4 = 20 values using SSE - // 10 fabs function calls and 10 float additions with SSE - vfloat sum1 = vabsf(LVFU(cfablur[rrm2][cc - 2])) + vabsf(LVFU(cfablur[rrm1][cc - 2])); - vfloat sum2 = vabsf(LVFU(cfablur[rr0][cc - 2])) + vabsf(LVFU(cfablur[rrp1][cc - 2])); - sum1 += vabsf(LVFU(cfablur[rrp2][cc - 2])); - // horizontally add the values and add the result to hfnbrave - hfnbrave += vhadd(sum1 + sum2); - - // add remaining 5 values of last column - hfnbrave += fabsf(cfablur[rrm2][cc + 2]); - hfnbrave += fabsf(cfablur[rrm1][cc + 2]); - hfnbrave += fabsf(cfablur[rr0][cc + 2]); - hfnbrave += fabsf(cfablur[rrp1][cc + 2]); - hfnbrave += fabsf(cfablur[rrp2][cc + 2]); -#else - // 25 fabs function calls and 25 float additions without SSE - for (int nn = cc - 2; nn <= cc + 2; ++nn) { - hfnbrave += fabsf(cfablur[rrm2][nn]); - hfnbrave += fabsf(cfablur[rrm1][nn]); - hfnbrave += fabsf(cfablur[rr0][nn]); - hfnbrave += fabsf(cfablur[rrp1][nn]); - hfnbrave += fabsf(cfablur[rrp2][nn]); - } -#endif + sum5x5(cfablur, cc - 2, hfnbrave); if (pixdev > varthresh * hfnbrave) { // mark the pixel as "bad" bpMap.set(cc, rr); - counter++; + ++counter; } }//end of pixel evaluation } } }//end of parallel processing + return counter; } From 9bd53a5cc91d16d363802bf32d12bb8babd5af81 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 21 Nov 2019 16:23:39 +0100 Subject: [PATCH 170/208] Dual demosaic: reduce memory usage by width * height * 4 byte --- rtengine/dual_demosaic_RT.cc | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/rtengine/dual_demosaic_RT.cc b/rtengine/dual_demosaic_RT.cc index b5839ee8b..0d9999e18 100644 --- a/rtengine/dual_demosaic_RT.cc +++ b/rtengine/dual_demosaic_RT.cc @@ -33,7 +33,7 @@ #include "../rtgui/options.h" -//#define BENCHMARK +#define BENCHMARK #include "StopWatch.h" using namespace std; @@ -66,14 +66,9 @@ void RawImageSource::dual_demosaic_RT(bool isBayer, const procparams::RAWParams return; } - array2D redTmp(winw, winh); - array2D greenTmp(winw, winh); - array2D blueTmp(winw, winh); array2D L(winw, winh); if (isBayer) { - vng4_demosaic(rawData, redTmp, greenTmp, blueTmp); - if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::AMAZEVNG4) || raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::PIXELSHIFT)) { amaze_demosaic_RT(0, 0, winw, winh, rawData, red, green, blue, options.chunkSizeAMAZE, options.measure); } else if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::DCBVNG4) ) { @@ -87,7 +82,6 @@ void RawImageSource::dual_demosaic_RT(bool isBayer, const procparams::RAWParams } else { xtrans_interpolate (1, false, options.chunkSizeXT, options.measure); } - fast_xtrans_interpolate(rawData, redTmp, greenTmp, blueTmp); } const float xyz_rgb[3][3] = { // XYZ from RGB @@ -114,6 +108,17 @@ void RawImageSource::dual_demosaic_RT(bool isBayer, const procparams::RAWParams buildBlendMask(L, blend, winw, winh, contrastf, 1.f, autoContrast); contrast = contrastf * 100.f; + array2D& redTmp = L; // L is not needed anymore => reuse it + array2D greenTmp(winw, winh); + array2D blueTmp(winw, winh); + + if (isBayer) { + vng4_demosaic(rawData, redTmp, greenTmp, blueTmp); + } else { + fast_xtrans_interpolate(rawData, redTmp, greenTmp, blueTmp); + } + + // the following is split into 3 loops intentionally to avoid cache conflicts on CPUs with only 4-way cache #ifdef _OPENMP #pragma omp parallel for From 8b5533cfcb153c56d5755c83874b8a2f243aa87b Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 21 Nov 2019 16:28:45 +0100 Subject: [PATCH 171/208] Dual demosaic: disable timing code --- rtengine/dual_demosaic_RT.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/dual_demosaic_RT.cc b/rtengine/dual_demosaic_RT.cc index 0d9999e18..69d1a189a 100644 --- a/rtengine/dual_demosaic_RT.cc +++ b/rtengine/dual_demosaic_RT.cc @@ -33,7 +33,7 @@ #include "../rtgui/options.h" -#define BENCHMARK +//#define BENCHMARK #include "StopWatch.h" using namespace std; From ff9eeb4744d6ec571a8e335129c0106135304933 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 21 Nov 2019 18:09:14 +0100 Subject: [PATCH 172/208] Capture Sharpening missing from Parameters to save partial processing profile dialog box, fixes #5487 --- rtgui/partialpastedlg.cc | 18 ++++++++++++++++++ rtgui/partialpastedlg.h | 2 ++ 2 files changed, 20 insertions(+) diff --git a/rtgui/partialpastedlg.cc b/rtgui/partialpastedlg.cc index a7d2bd0d1..22f608ae4 100644 --- a/rtgui/partialpastedlg.cc +++ b/rtgui/partialpastedlg.cc @@ -136,6 +136,8 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren raw_ca_avoid_colourshift = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT"))); //--- filmNegative = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_FILMNEGATIVE")) ); + //--- + captureSharpening = Gtk::manage (new Gtk::CheckButton (M("TP_PDSHARPENING_LABEL")) ); Gtk::VBox* vboxes[8]; Gtk::HSeparator* hseps[8]; @@ -253,6 +255,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren vboxes[7]->pack_start (*raw_ca_avoid_colourshift, Gtk::PACK_SHRINK, 2); vboxes[7]->pack_start (*Gtk::manage (new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 0); vboxes[7]->pack_start (*filmNegative, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*captureSharpening, Gtk::PACK_SHRINK, 2); Gtk::VBox* vbCol1 = Gtk::manage (new Gtk::VBox ()); Gtk::VBox* vbCol2 = Gtk::manage (new Gtk::VBox ()); @@ -402,6 +405,8 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren raw_ca_avoid_colourshiftconn = raw_ca_avoid_colourshift->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); //--- filmNegativeConn = filmNegative->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); + //--- + captureSharpeningConn = captureSharpening->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); add_button (M("GENERAL_OK"), Gtk::RESPONSE_OK); add_button (M("GENERAL_CANCEL"), Gtk::RESPONSE_CANCEL); @@ -474,6 +479,7 @@ void PartialPasteDlg::rawToggled () ConnectionBlocker raw_caredblueBlocker(raw_caredblueConn); ConnectionBlocker raw_ca_avoid_colourshiftBlocker(raw_ca_avoid_colourshiftconn); ConnectionBlocker filmNegativeBlocker(filmNegativeConn); + ConnectionBlocker captureSharpeningBlocker(captureSharpeningConn); raw->set_inconsistent (false); @@ -503,6 +509,7 @@ void PartialPasteDlg::rawToggled () raw_caredblue->set_active (raw->get_active ()); raw_ca_avoid_colourshift->set_active (raw->get_active ()); filmNegative->set_active (raw->get_active()); + captureSharpening->set_active (raw->get_active()); } void PartialPasteDlg::basicToggled () @@ -981,6 +988,17 @@ void PartialPasteDlg::applyPaste (rtengine::procparams::ProcParams* dstPP, Param filterPE.filmNegative.blueRatio = falsePE.filmNegative.blueRatio; } + if (!captureSharpening->get_active ()) { + filterPE.pdsharpening.enabled = falsePE.pdsharpening.enabled; + filterPE.pdsharpening.contrast = falsePE.pdsharpening.contrast; + filterPE.pdsharpening.autoContrast = falsePE.pdsharpening.autoContrast; + filterPE.pdsharpening.autoRadius = falsePE.pdsharpening.autoRadius; + filterPE.pdsharpening.deconvradius = falsePE.pdsharpening.deconvradius; + filterPE.pdsharpening.deconvradiusOffset = falsePE.pdsharpening.deconvradiusOffset; + filterPE.pdsharpening.deconviter = falsePE.pdsharpening.deconviter; + filterPE.pdsharpening.deconvitercheck = falsePE.pdsharpening.deconvitercheck; + } + if (dstPE) { *dstPE = filterPE; } diff --git a/rtgui/partialpastedlg.h b/rtgui/partialpastedlg.h index da6c9251a..1403e7c1b 100644 --- a/rtgui/partialpastedlg.h +++ b/rtgui/partialpastedlg.h @@ -141,6 +141,7 @@ public: Gtk::CheckButton* ff_ClipControl; Gtk::CheckButton* filmNegative; + Gtk::CheckButton* captureSharpening; sigc::connection everythingConn, basicConn, detailConn, colorConn, lensConn, compositionConn, metaConn, rawConn, advancedConn; @@ -153,6 +154,7 @@ public: sigc::connection df_fileConn, df_AutoSelectConn, ff_fileConn, ff_AutoSelectConn, ff_BlurRadiusConn, ff_BlurTypeConn, ff_ClipControlConn; sigc::connection raw_caredblueConn, raw_ca_autocorrectConn, raw_ca_avoid_colourshiftconn, raw_hotpix_filtConn, raw_deadpix_filtConn, raw_pdaf_lines_filterConn, raw_linenoiseConn, raw_greenthreshConn, raw_ccStepsConn, raw_methodConn, raw_borderConn, raw_imagenumConn, raw_dcb_iterationsConn, raw_lmmse_iterationsConn, raw_pixelshiftConn, raw_dcb_enhanceConn, raw_exposConn, raw_blackConn; sigc::connection filmNegativeConn; + sigc::connection captureSharpeningConn; public: PartialPasteDlg (const Glib::ustring &title, Gtk::Window* parent); From 89d8c341a6c3f571edce0961c2d48497b7e5d572 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 21 Nov 2019 19:36:16 +0100 Subject: [PATCH 173/208] Some code cleanups --- rtengine/dcrop.cc | 14 +----- rtengine/image8.cc | 8 ++-- rtengine/improccoordinator.cc | 87 +---------------------------------- rtengine/improcfun.h | 1 - rtengine/ipretinex.cc | 1 + rtengine/iptransform.cc | 2 +- rtengine/shmap.cc | 2 +- rtengine/shmap.h | 2 +- 8 files changed, 11 insertions(+), 106 deletions(-) diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index fd3c42f6e..a6889b954 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -195,18 +195,8 @@ void Crop::update(int todo) params.dirpyrDenoise.getCurves(noiseLCurve, noiseCCurve); - int tilesize; - int overlap; - - if (settings->leveldnti == 0) { - tilesize = 1024; - overlap = 128; - } - - if (settings->leveldnti == 1) { - tilesize = 768; - overlap = 96; - } + const int tilesize = settings->leveldnti == 0 ? 1024 : 768; + const int overlap = settings->leveldnti == 0 ? 128 : 96; int numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip; diff --git a/rtengine/image8.cc b/rtengine/image8.cc index 3d0a8df06..66ad8b60f 100644 --- a/rtengine/image8.cc +++ b/rtengine/image8.cc @@ -233,10 +233,10 @@ void Image8::getStdImage (const ColorTemp &ctemp, int tran, Imagefloat* image, P lineB[dst_x] = CLIP(bm * btot); } else { // computing a special factor for this incomplete sub-region - float area = src_sub_width * src_sub_height; - lineR[dst_x] = CLIP(rm2 * rtot / area); - lineG[dst_x] = CLIP(gm2 * gtot / area); - lineB[dst_x] = CLIP(bm2 * btot / area); + float larea = src_sub_width * src_sub_height; + lineR[dst_x] = CLIP(rm2 * rtot / larea); + lineG[dst_x] = CLIP(gm2 * gtot / larea); + lineB[dst_x] = CLIP(bm2 * btot / larea); } } } diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 90d280117..a4ca0ea0b 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -230,9 +230,6 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) MyMutex::MyLock processingLock(mProcessing); - constexpr int numofphases = 14; - int readyphase = 0; - bool highDetailNeeded = options.prevdemo == PD_Sidecar ? true : (todo & M_HIGHQUAL); // Check if any detail crops need high detail. If not, take a fast path short cut @@ -273,8 +270,6 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) //rp.deadPixelFilter = rp.hotPixelFilter = false; } - progress("Applying white balance, color correction & sRGB conversion...", 100 * readyphase / numofphases); - if (frameCountListener) { frameCountListener->FrameCountChanged(imgsrc->getFrameCount(), params->raw.bayersensor.imageNum); } @@ -533,8 +528,6 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) ipf.firstAnalysis(orig_prev, *params, vhist16); } - readyphase++; - if ((todo & M_HDR) && (params->fattal.enabled || params->dehaze.enabled)) { if (fattal_11_dcrop_cache) { delete fattal_11_dcrop_cache; @@ -551,7 +544,6 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) oprevi = orig_prev; - progress("Rotate / Distortion...", 100 * readyphase / numofphases); // Remove transformation if unneeded bool needstransform = ipf.needsTransform(); @@ -577,11 +569,6 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) ipf.lab2rgb(labcbdl, *oprevi, params->icm.workingProfile); } - readyphase++; - progress("Preparing shadow/highlight map...", 100 * readyphase / numofphases); - - readyphase++; - if (todo & M_AUTOEXP) { if (params->toneCurve.autoexp) { LUTu aehist; @@ -618,8 +605,6 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } } - progress("Exposure curve & CIELAB conversion...", 100 * readyphase / numofphases); - if (todo & (M_AUTOEXP | M_RGBCURVE)) { if (params->icm.workingTRC == "Custom") { //exec TRC IN free if (oprevi == orig_prev) { @@ -767,8 +752,6 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) params->crop.mapToResized(pW, pH, scale, x1, x2, y1, y2); } - readyphase++; - if (todo & (M_LUMACURVE | M_CROP)) { LUTu lhist16(32768); lhist16.clear(); @@ -811,8 +794,6 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) if (todo & (M_LUMINANCE + M_COLOR)) { nprevl->CopyFrom(oprevl); - progress("Applying Color Boost...", 100 * readyphase / numofphases); - histCCurve.clear(); histLCurve.clear(); ipf.chromiLuminanceCurve(nullptr, pW, nprevl, nprevl, chroma_acurve, chroma_bcurve, satcurve, lhskcurve, clcurve, lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, histCCurve, histLCurve); @@ -823,72 +804,22 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) ipf.EPDToneMap(nprevl, 0, scale); } - // for all treatments Defringe, Sharpening, Contrast detail , Microcontrast they are activated if "CIECAM" function are disabled - readyphase++; - - /* Issue 2785, disabled some 1:1 tools - if (scale==1) { - if((params->colorappearance.enabled && !settings->autocielab) || (!params->colorappearance.enabled)){ - progress ("Denoising luminance impulse...",100*readyphase/numofphases); - ipf.impulsedenoise (nprevl); - readyphase++; - } - if((params->colorappearance.enabled && !settings->autocielab) || (!params->colorappearance.enabled)){ - progress ("Defringing...",100*readyphase/numofphases); - ipf.defringe (nprevl); - readyphase++; - } - if (params->sharpenEdge.enabled) { - progress ("Edge sharpening...",100*readyphase/numofphases); - ipf.MLsharpen (nprevl); - readyphase++; - } - if (params->sharpenMicro.enabled) { - if(( params->colorappearance.enabled && !settings->autocielab) || (!params->colorappearance.enabled)){ - progress ("Microcontrast...",100*readyphase/numofphases); - ipf.MLmicrocontrast (nprevl); - readyphase++; - } - } - if(((params->colorappearance.enabled && !settings->autocielab) || (!params->colorappearance.enabled)) && params->sharpening.enabled) { - progress ("Sharpening...",100*readyphase/numofphases); - - float **buffer = new float*[pH]; - for (int i=0; idirpyrequalizer.cbdlMethod == "aft") { if (((params->colorappearance.enabled && !settings->autocielab) || (!params->colorappearance.enabled))) { - progress("Pyramid wavelet...", 100 * readyphase / numofphases); ipf.dirpyrequalizer(nprevl, scale); - //ipf.Lanczoslab (ip_wavelet(LabImage * lab, LabImage * dst, const procparams::EqualizerParams & eqparams), nprevl, 1.f/scale); - readyphase++; } } wavcontlutili = false; - //CurveFactory::curveWavContL ( wavcontlutili,params->wavelet.lcurve, wavclCurve, LUTu & histogramwavcl, LUTu & outBeforeWavCLurveHistogram,int skip); CurveFactory::curveWavContL(wavcontlutili, params->wavelet.wavclCurve, wavclCurve, scale == 1 ? 1 : 16); if ((params->wavelet.enabled)) { WaveletParams WaveParams = params->wavelet; - // WaveParams.getCurves(wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY); WaveParams.getCurves(wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); int kall = 0; - progress("Wavelet...", 100 * readyphase / numofphases); - // ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, scale); ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale); } @@ -896,7 +827,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) ipf.softLight(nprevl); if (params->colorappearance.enabled) { - //L histo and Chroma histo for ciecam + // L histo and Chroma histo for ciecam // histogram well be for Lab (Lch) values, because very difficult to do with J,Q, M, s, C int x1, y1, x2, y2; params->crop.mapToResized(pW, pH, scale, x1, x2, y1, y2); @@ -977,8 +908,6 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) if (params->colorappearance.autoybscen && acListener && params->colorappearance.enabled) { acListener->ybCamChanged((int) yb); //real value Yb scene } - - readyphase++; } else { // CIECAM is disabled, we free up its image buffer to save some space if (ncie) { @@ -1013,8 +942,6 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } if (panningRelatedChange || (todo & M_MONITOR)) { - progress("Conversion to RGB...", 100 * readyphase / numofphases); - if ((todo != CROP && todo != MINUPDATE) || (todo & M_MONITOR)) { MyMutex::MyLock prevImgLock(previmg->getMutex()); @@ -1026,7 +953,6 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) delete workimg; workimg = ipf.lab2rgb(nprevl, 0, 0, pW, pH, params->icm); } catch (char * str) { - progress("Error converting file...", 0); return; } } @@ -1045,8 +971,6 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) imageListener->imageReady(params->crop); } - readyphase++; - if (hListener) { updateLRGBHistograms(); hListener->histogramChanged(histRed, histGreen, histBlue, histLuma, histToneCurve, histLCurve, histCCurve, /*histCLurve, histLLCurve,*/ histLCAM, histCCAM, histRedRaw, histGreenRaw, histBlueRaw, histChroma, histLRETI); @@ -1209,15 +1133,6 @@ void ImProcCoordinator::updateLRGBHistograms() } -void ImProcCoordinator::progress(Glib::ustring str, int pr) -{ - - /* if (plistener) { - plistener->setProgressStr (str); - plistener->setProgress ((double)pr / 100.0); - }*/ -} - bool ImProcCoordinator::getAutoWB(double& temp, double& green, double equal, double tempBias) { diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 2229987a1..c95ebeb4e 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -23,7 +23,6 @@ #include "coord2d.h" #include "gamutwarning.h" #include "pipettebuffer.h" -#include "shmap.h" template class LUT; diff --git a/rtengine/ipretinex.cc b/rtengine/ipretinex.cc index b5d504a99..84f33482f 100644 --- a/rtengine/ipretinex.cc +++ b/rtengine/ipretinex.cc @@ -51,6 +51,7 @@ #include "procparams.h" #include "rawimagesource.h" #include "rtengine.h" +#include "shmap.h" #include "StopWatch.h" namespace diff --git a/rtengine/iptransform.cc b/rtengine/iptransform.cc index a4f304413..b1531cc9c 100644 --- a/rtengine/iptransform.cc +++ b/rtengine/iptransform.cc @@ -220,7 +220,7 @@ bool ImProcFunctions::transCoord (int W, int H, const std::vector &src, blue.push_back (Coord2D (src[i].x, src[i].y)); } - return clipped; + return false; } double oW = W, oH = H; diff --git a/rtengine/shmap.cc b/rtengine/shmap.cc index 44096d965..abdcc42a4 100644 --- a/rtengine/shmap.cc +++ b/rtengine/shmap.cc @@ -351,7 +351,7 @@ void SHMap::forceStat (float max_, float min_, float avg_) avg = avg_; } -void SHMap::dirpyr_shmap(float ** data_fine, float ** data_coarse, int width, int height, LUTf & rangefn, int level, int scale) +void SHMap::dirpyr_shmap(float ** data_fine, float ** data_coarse, int width, int height, const LUTf& rangefn, int level, int scale) { //scale is spacing of directional averaging weights diff --git a/rtengine/shmap.h b/rtengine/shmap.h index 5373b8302..68e352b23 100644 --- a/rtengine/shmap.h +++ b/rtengine/shmap.h @@ -50,7 +50,7 @@ private: void fillLuminance( Imagefloat * img, float **luminance, double lumi[3] ); void fillLuminanceL( float ** L, float **luminance ); - void dirpyr_shmap(float ** data_fine, float ** data_coarse, int width, int height, LUTf & rangefn, int level, int scale); + void dirpyr_shmap(float ** data_fine, float ** data_coarse, int width, int height, const LUTf& rangefn, int level, int scale); }; From 7b54c7f2a42da28f38bdaf5399c0ef3e339e58dc Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 21 Nov 2019 21:36:57 +0100 Subject: [PATCH 174/208] Some code cleanups --- rtengine/cJSON.c | 6 ++---- rtengine/ciecam02.cc | 2 +- rtengine/ciecam02.h | 2 +- rtengine/improccoordinator.h | 1 - rtengine/panasonic_decoders.cc | 2 +- 5 files changed, 5 insertions(+), 8 deletions(-) diff --git a/rtengine/cJSON.c b/rtengine/cJSON.c index fb8ce27e8..130c8e2a5 100644 --- a/rtengine/cJSON.c +++ b/rtengine/cJSON.c @@ -445,9 +445,7 @@ static unsigned char* ensure(printbuffer * const p, size_t needed) p->buffer = NULL; return NULL; - } - if (newbuffer) - { + } else { memcpy(newbuffer, p->buffer, p->offset + 1); } p->hooks.deallocate(p->buffer); @@ -1436,7 +1434,7 @@ fail: static cJSON_bool print_array(const cJSON * const item, printbuffer * const output_buffer) { unsigned char *output_pointer = NULL; - size_t length = 0; + size_t length; cJSON *current_element = item->child; if (output_buffer == NULL) diff --git a/rtengine/ciecam02.cc b/rtengine/ciecam02.cc index 8314e5e8f..c7e49b2ed 100644 --- a/rtengine/ciecam02.cc +++ b/rtengine/ciecam02.cc @@ -404,7 +404,7 @@ void Ciecam02::calculate_abfloat ( vfloat &aa, vfloat &bb, vfloat h, vfloat e, v #endif void Ciecam02::initcam1float (float yb, float pilotd, float f, float la, float xw, float yw, float zw, float &n, float &d, float &nbb, float &ncb, - float &cz, float &aw, float &wh, float &pfl, float &fl, float &c) + float &cz, float &aw, float &wh, float &pfl, float &fl, float c) { n = yb / yw; diff --git a/rtengine/ciecam02.h b/rtengine/ciecam02.h index 8b532fba0..75ccfaa8c 100644 --- a/rtengine/ciecam02.h +++ b/rtengine/ciecam02.h @@ -84,7 +84,7 @@ public: * Forward transform from XYZ to CIECAM02 JCh. */ static void initcam1float (float yb, float pilotd, float f, float la, float xw, float yw, float zw, float &n, float &d, float &nbb, float &ncb, - float &cz, float &aw, float &wh, float &pfl, float &fl, float &c); + float &cz, float &aw, float &wh, float &pfl, float &fl, float c); static void initcam2float (float yb, float pilotd, float f, float la, float xw, float yw, float zw, float &n, float &d, float &nbb, float &ncb, float &cz, float &aw, float &fl); diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index c27cfe76e..96d1f80ce 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -186,7 +186,6 @@ protected: MyMutex minit; // to gain mutually exclusive access to ... to what exactly? - void progress (Glib::ustring str, int pr); void reallocAll (); void updateLRGBHistograms (); void setScale (int prevscale); diff --git a/rtengine/panasonic_decoders.cc b/rtengine/panasonic_decoders.cc index 37f586a6b..bbbfb7c20 100644 --- a/rtengine/panasonic_decoders.cc +++ b/rtengine/panasonic_decoders.cc @@ -64,7 +64,7 @@ class pana_cs6_page_decoder unsigned char current, *buffer; public: pana_cs6_page_decoder(unsigned char *_buffer, unsigned int bsize) - : lastoffset(0), maxoffset(bsize), current(0), buffer(_buffer) + : pixelbuffer{}, lastoffset(0), maxoffset(bsize), current(0), buffer(_buffer) { } void read_page(); // will throw IO error if not enough space in buffer From 2ae5f198d7237cbec8649123ed2b0e0e94de5f6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Fri, 22 Nov 2019 10:40:01 +0100 Subject: [PATCH 175/208] Cleanups for the first few lines --- rtengine/canon_cr3_decoder.cc | 730 +++++++++++++++++----------------- 1 file changed, 375 insertions(+), 355 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index 01bca72f8..609f0c849 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -51,42 +51,40 @@ */ +#include +#include #include -#include #include "dcraw.h" void DCraw::parse_canon_cr3() { - int err; - unsigned long long szAtomList; + strncpy(make, "Canon", sizeof(make)); + + unsigned long long szAtomList = ifp->size; short nesting = -1; + char AtomNameStack[128]; unsigned short nTrack = 0; short TrackType; - char AtomNameStack[128]; - strcpy(make, "Canon"); - szAtomList = ifp->size; - err = parseCR3(0ULL, szAtomList, nesting, AtomNameStack, nTrack, TrackType); + const int err = parseCR3(0, szAtomList, nesting, AtomNameStack, nTrack, TrackType); if (err == 0 || err == -14) { // no error, or too deep nesting selectCRXTrack(nTrack); } } -#define LIBRAW_CRXTRACKS_MAXCOUNT RT_canon_CR3_data.CRXTRACKS_MAXCOUNT - void DCraw::selectCRXTrack(unsigned short maxTrack) { - INT64 bitcounts[LIBRAW_CRXTRACKS_MAXCOUNT], maxbitcount = 0; - uint32_t maxjpegbytes = 0; - memset(bitcounts, 0, sizeof(bitcounts)); + std::int64_t bitcounts[RT_canon_CR3_data.CRXTRACKS_MAXCOUNT] = {}; + std::int64_t maxbitcount = 0; + std::uint32_t maxjpegbytes = 0; - for (unsigned int i = 0; i <= maxTrack && i < LIBRAW_CRXTRACKS_MAXCOUNT; i++) { - CanonCR3Data::crx_data_header_t* d = &RT_canon_CR3_data.crx_header[i]; + for (unsigned int i = 0; i <= maxTrack && i < RT_canon_CR3_data.CRXTRACKS_MAXCOUNT; ++i) { + CanonCR3Data::crx_data_header_t* const d = &RT_canon_CR3_data.crx_header[i]; if (d->MediaType == 1) {// RAW - bitcounts[i] = INT64(d->nBits) * INT64(d->f_width) * INT64(d->f_height); + bitcounts[i] = std::int64_t(d->nBits) * std::int64_t(d->f_width) * std::int64_t(d->f_height); if (bitcounts[i] > maxbitcount) { maxbitcount = bitcounts[i]; @@ -105,9 +103,10 @@ void DCraw::selectCRXTrack(unsigned short maxTrack) } bool has_framei = false; - unsigned int framei = 0, framecnt = 0; + unsigned int framei = 0; + unsigned int framecnt = 0; - for (unsigned int i = 0; i <= maxTrack && i < LIBRAW_CRXTRACKS_MAXCOUNT; i++) { + for (unsigned int i = 0; i <= maxTrack && i < RT_canon_CR3_data.CRXTRACKS_MAXCOUNT; ++i) { if (bitcounts[i] == maxbitcount) { if (framecnt <= shot_select) { has_framei = true; @@ -121,8 +120,7 @@ void DCraw::selectCRXTrack(unsigned short maxTrack) is_raw = framecnt; if (has_framei) { - CanonCR3Data::crx_data_header_t* d = - &RT_canon_CR3_data.crx_header[framei]; + CanonCR3Data::crx_data_header_t* const d = &RT_canon_CR3_data.crx_header[framei]; data_offset = d->MediaOffset; // data_size = d->MediaSize; raw_width = d->f_width; @@ -154,11 +152,11 @@ void DCraw::selectCRXTrack(unsigned short maxTrack) RT_canon_CR3_data.crx_track_selected = framei; int tiff_idx = -1; - INT64 tpixels = 0; + std::int64_t tpixels = 0; for (unsigned int i = 0; i < tiff_nifds; i++) { - if (INT64(tiff_ifd[i].height) * INT64(tiff_ifd[i].height) > tpixels) { - tpixels = INT64(tiff_ifd[i].height) * INT64(tiff_ifd[i].height); + if (std::int64_t(tiff_ifd[i].height) * std::int64_t(tiff_ifd[i].height) > tpixels) { + tpixels = std::int64_t(tiff_ifd[i].height) * std::int64_t(tiff_ifd[i].height); tiff_idx = i; } } @@ -169,14 +167,14 @@ void DCraw::selectCRXTrack(unsigned short maxTrack) } } -#define FORC4 for (c = 0; c < 4; c++) - -#define bad_hdr \ - (((order != 0x4d4d) && (order != 0x4949)) || (get2() != 0x002a) || \ - (get4() != 0x00000008)) -int DCraw::parseCR3(unsigned long long oAtomList, - unsigned long long szAtomList, short& nesting, - char* AtomNameStack, unsigned short& nTrack, short& TrackType) +int DCraw::parseCR3( + unsigned long long oAtomList, + unsigned long long szAtomList, + short& nesting, + char* AtomNameStack, + unsigned short& nTrack, + short& TrackType +) { /* Atom starts with 4 bytes for Atom size and 4 bytes containing Atom name @@ -289,17 +287,22 @@ int DCraw::parseCR3(unsigned long long oAtomList, ushort tL; // Atom length represented in 4 or 8 bytes char nmAtom[5]; // Atom name - unsigned long long oAtom, szAtom; // Atom offset and Atom size - unsigned long long oAtomContent, - szAtomContent; // offset and size of Atom content + unsigned long long oAtom; + unsigned long long szAtom; // Atom offset and Atom size + unsigned long long oAtomContent; + unsigned long long szAtomContent; // offset and size of Atom content unsigned long long lHdr; char UIID[16]; uchar CMP1[36]; - char HandlerType[5], MediaFormatID[5]; + char HandlerType[5]; + char MediaFormatID[5]; // unsigned ImageWidth, ImageHeight; - long relpos_inDir, relpos_inBox; - unsigned szItem, Tag, lTag; + long relpos_inDir; + long relpos_inBox; + unsigned szItem; + unsigned Tag; + unsigned lTag; ushort tItem; nmAtom[0] = MediaFormatID[0] = nmAtom[4] = MediaFormatID[4] = '\0'; @@ -314,13 +317,27 @@ int DCraw::parseCR3(unsigned long long oAtomList, short s_order = order; + const auto is_bad_header = + [this]() -> bool + { + return + ( + order != 0x4D4D + && order != 0x4949 + ) + || get2() != 0x002A + || get4() != 0x00000008; + }; + while ((oAtom + 8ULL) <= (oAtomList + szAtomList)) { lHdr = 0ULL; err = 0; order = 0x4d4d; fseek(ifp, oAtom, SEEK_SET); szAtom = get4(); - FORC4 nmAtom[c] = AtomNameStack[nesting * 4 + c] = fgetc(ifp); + for (c = 0; c < 4; c++) { + nmAtom[c] = AtomNameStack[nesting * 4 + c] = fgetc(ifp); + } AtomNameStack[(nesting + 1) * 4] = '\0'; tL = 4; AtomType = 0; @@ -364,7 +381,7 @@ int DCraw::parseCR3(unsigned long long oAtomList, nTrack++; TrackType = 0; - if (nTrack >= LIBRAW_CRXTRACKS_MAXCOUNT) { + if (nTrack >= RT_canon_CR3_data.CRXTRACKS_MAXCOUNT) { break; } } @@ -384,7 +401,7 @@ int DCraw::parseCR3(unsigned long long oAtomList, short q_order = order; order = get2(); - if ((tL != 4) || bad_hdr) { + if ((tL != 4) || is_bad_header()) { err = -4; goto fin; } @@ -395,7 +412,7 @@ int DCraw::parseCR3(unsigned long long oAtomList, short q_order = order; order = get2(); - if ((tL != 4) || bad_hdr) { + if ((tL != 4) || is_bad_header()) { err = -5; goto fin; } @@ -406,7 +423,7 @@ int DCraw::parseCR3(unsigned long long oAtomList, short q_order = order; order = get2(); - if ((tL != 4) || bad_hdr) { + if ((tL != 4) || is_bad_header()) { err = -6; goto fin; } @@ -418,19 +435,21 @@ int DCraw::parseCR3(unsigned long long oAtomList, short q_order = order; order = get2(); - if ((tL != 4) || bad_hdr) { + if ((tL != 4) || is_bad_header()) { err = -6; goto fin; } - INT64 off = ftell(ifp); + std::int64_t off = ftell(ifp); parse_gps(oAtomContent); fseek(ifp, off, SEEK_SET); // parse_gps_libraw(oAtomContent); order = q_order; } else if (!strcmp(AtomNameStack, "moovtrakmdiahdlr")) { fseek(ifp, 8L, SEEK_CUR); - FORC4 HandlerType[c] = fgetc(ifp); + for (c = 0; c < 4; c++) { + HandlerType[c] = fgetc(ifp); + } for (c = 1; c < sizeof sHandlerType / sizeof * sHandlerType; c++) { if (!strcmp(HandlerType, sHandlerType[c])) { @@ -447,7 +466,9 @@ int DCraw::parseCR3(unsigned long long oAtomList, goto fin; } - FORC4 MediaFormatID[c] = fgetc(ifp); + for (c = 0; c < 4; c++) { + MediaFormatID[c] = fgetc(ifp); + } if ((TrackType == 2) && (!strcmp(MediaFormatID, "CRAW"))) { if (szAtomContent >= 44) { @@ -541,7 +562,7 @@ int DCraw::parseCR3(unsigned long long oAtomList, short q_order = order; order = get2(); - if (bad_hdr) { + if (is_bad_header()) { err = -13; goto fin; } @@ -627,13 +648,13 @@ static unsigned sgetn(int n, unsigned char* s) #define CRX_BUF_SIZE 0x10000 #if !defined (_WIN32) || (defined (__GNUC__) && !defined (__INTRINSIC_SPECIAL__BitScanReverse)) /* __INTRINSIC_SPECIAL__BitScanReverse found in MinGW32-W64 v7.30 headers, may be there is a better solution? */ -using DWORD = uint32_t; -using byte = uint8_t; +using DWORD = std::uint32_t; +using byte = std::uint8_t; libraw_inline void _BitScanReverse(DWORD* Index, unsigned long Mask) { *Index = sizeof(unsigned long) * 8 - 1 - __builtin_clzl(Mask); } -uint32_t _byteswap_ulong(uint32_t x) +std::uint32_t _byteswap_ulong(std::uint32_t x) { #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ return x; @@ -665,98 +686,98 @@ struct LibRaw_abstract_datastream { }; struct CrxBitstream { - uint8_t mdatBuf[CRX_BUF_SIZE]; - uint64_t mdatSize; - uint64_t curBufOffset; - uint32_t curPos; - uint32_t curBufSize; - uint32_t bitData; - int32_t bitsLeft; + std::uint8_t mdatBuf[CRX_BUF_SIZE]; + std::uint64_t mdatSize; + std::uint64_t curBufOffset; + std::uint32_t curPos; + std::uint32_t curBufSize; + std::uint32_t bitData; + std::int32_t bitsLeft; LibRaw_abstract_datastream* input; }; struct CrxBandParam { CrxBitstream bitStream; - int16_t subbandWidth; - int16_t subbandHeight; - int32_t roundedBitsMask; - int32_t roundedBits; - int16_t curLine; - int32_t* lineBuf0; - int32_t* lineBuf1; - int32_t* lineBuf2; - int32_t sParam; - int32_t kParam; - int32_t* paramData; - int32_t* nonProgrData; - int8_t supportsPartial; + std::int16_t subbandWidth; + std::int16_t subbandHeight; + std::int32_t roundedBitsMask; + std::int32_t roundedBits; + std::int16_t curLine; + std::int32_t* lineBuf0; + std::int32_t* lineBuf1; + std::int32_t* lineBuf2; + std::int32_t sParam; + std::int32_t kParam; + std::int32_t* paramData; + std::int32_t* nonProgrData; + std::int8_t supportsPartial; }; struct CrxWaveletTransform { - int32_t* subband0Buf; - int32_t* subband1Buf; - int32_t* subband2Buf; - int32_t* subband3Buf; - int32_t* lineBuf[8]; - int16_t curLine; - int16_t curH; - int8_t fltTapH; - int16_t height; - int16_t width; + std::int32_t* subband0Buf; + std::int32_t* subband1Buf; + std::int32_t* subband2Buf; + std::int32_t* subband3Buf; + std::int32_t* lineBuf[8]; + std::int16_t curLine; + std::int16_t curH; + std::int8_t fltTapH; + std::int16_t height; + std::int16_t width; }; struct CrxSubband { CrxBandParam* bandParam; - uint64_t mdatOffset; - uint8_t* bandBuf; - int32_t bandSize; - uint64_t dataSize; - int8_t supportsPartial; - int32_t quantValue; - uint16_t width; - uint16_t height; - int32_t paramK; - int64_t dataOffset; + std::uint64_t mdatOffset; + std::uint8_t* bandBuf; + std::int32_t bandSize; + std::uint64_t dataSize; + std::int8_t supportsPartial; + std::int32_t quantValue; + std::uint16_t width; + std::uint16_t height; + std::int32_t paramK; + std::int64_t dataOffset; }; struct CrxPlaneComp { byte* compBuf; CrxSubband* subBands; CrxWaveletTransform* waveletTransform; - int8_t compNumber; - int64_t dataOffset; - int32_t compSize; - int8_t supportsPartial; - int32_t roundedBitsMask; - int8_t tileFlag; + std::int8_t compNumber; + std::int64_t dataOffset; + std::int32_t compSize; + std::int8_t supportsPartial; + std::int32_t roundedBitsMask; + std::int8_t tileFlag; }; struct CrxTile { CrxPlaneComp* comps; - int8_t tileFlag; - int8_t tileNumber; - int64_t dataOffset; - int32_t tileSize; - uint16_t width; - uint16_t height; + std::int8_t tileFlag; + std::int8_t tileNumber; + std::int64_t dataOffset; + std::int32_t tileSize; + std::uint16_t width; + std::uint16_t height; }; struct CrxImage { - uint8_t nPlanes; - uint16_t planeWidth; - uint16_t planeHeight; - uint8_t samplePrecision; - uint8_t subbandCount; - uint8_t levels; - uint8_t nBits; - uint8_t encType; - uint8_t tileCols; - uint8_t tileRows; + std::uint8_t nPlanes; + std::uint16_t planeWidth; + std::uint16_t planeHeight; + std::uint8_t samplePrecision; + std::uint8_t subbandCount; + std::uint8_t levels; + std::uint8_t nBits; + std::uint8_t encType; + std::uint8_t tileCols; + std::uint8_t tileRows; CrxTile* tiles; - uint64_t mdatOffset; - uint64_t mdatSize; - int16_t* outBufs[4];// one per plane - int16_t* planeBuf; + std::uint64_t mdatOffset; + std::uint64_t mdatSize; + std::int16_t* outBufs[4];// one per plane + std::int16_t* planeBuf; LibRaw_abstract_datastream* input; }; @@ -767,7 +788,7 @@ enum TileFlags { E_HAS_TILES_ON_THE_TOP = 8 }; -int32_t exCoefNumTbl[0x120] = { +std::int32_t exCoefNumTbl[0x120] = { // level 1 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, @@ -787,13 +808,13 @@ int32_t exCoefNumTbl[0x120] = { 8, 8, 2, 1, 4, 3, 1, 1, 1, 1, 1, 1, 8, 7, 1, 1, 3, 3, 1, 1, 1, 1 }; -uint32_t JS[32] = {1, 1, 1, 1, 2, 2, 2, 2, +std::uint32_t JS[32] = {1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 8, 8, 8, 8, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000 }; -uint32_t J[32] = {0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, +std::uint32_t J[32] = {0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F }; @@ -828,10 +849,10 @@ static inline void crxFillBuffer(CrxBitstream* bitStrm) libraw_inline int crxBitstreamGetZeros(CrxBitstream* bitStrm) { -// uint32_t bitData = bitStrm->bitData; - uint32_t nonZeroBit = 0; - uint64_t nextData = 0; - int32_t result = 0; +// std::uint32_t bitData = bitStrm->bitData; + std::uint32_t nonZeroBit = 0; + std::uint64_t nextData = 0; + std::int32_t result = 0; if (bitStrm->bitData) { _BitScanReverse((DWORD*)&nonZeroBit, (DWORD)bitStrm->bitData); @@ -839,12 +860,12 @@ libraw_inline int crxBitstreamGetZeros(CrxBitstream* bitStrm) bitStrm->bitData <<= 32 - nonZeroBit; bitStrm->bitsLeft -= 32 - nonZeroBit; } else { - uint32_t bitsLeft = bitStrm->bitsLeft; + std::uint32_t bitsLeft = bitStrm->bitsLeft; while (true) { while (bitStrm->curPos + 4 <= bitStrm->curBufSize) { nextData = - _byteswap_ulong(*(uint32_t*)(bitStrm->mdatBuf + bitStrm->curPos)); + _byteswap_ulong(*(std::uint32_t*)(bitStrm->mdatBuf + bitStrm->curPos)); bitStrm->curPos += 4; crxFillBuffer(bitStrm); @@ -874,7 +895,7 @@ libraw_inline int crxBitstreamGetZeros(CrxBitstream* bitStrm) } _BitScanReverse((DWORD*)&nonZeroBit, (DWORD)nextData); - result = (uint32_t)(bitsLeft + 7 - nonZeroBit); + result = (std::uint32_t)(bitsLeft + 7 - nonZeroBit); bitStrm->bitData = nextData << (32 - nonZeroBit); bitStrm->bitsLeft = nonZeroBit; } @@ -882,19 +903,19 @@ libraw_inline int crxBitstreamGetZeros(CrxBitstream* bitStrm) return result; } -libraw_inline uint32_t crxBitstreamGetBits(CrxBitstream* bitStrm, int bits) +libraw_inline std::uint32_t crxBitstreamGetBits(CrxBitstream* bitStrm, int bits) { int bitsLeft = bitStrm->bitsLeft; - uint32_t bitData = bitStrm->bitData; - uint32_t nextWord; - uint8_t nextByte; - uint32_t result; + std::uint32_t bitData = bitStrm->bitData; + std::uint32_t nextWord; + std::uint8_t nextByte; + std::uint32_t result; if (bitsLeft < bits) { // get them from stream if (bitStrm->curPos + 4 <= bitStrm->curBufSize) { nextWord = - _byteswap_ulong(*(uint32_t*)(bitStrm->mdatBuf + bitStrm->curPos)); + _byteswap_ulong(*(std::uint32_t*)(bitStrm->mdatBuf + bitStrm->curPos)); bitStrm->curPos += 4; crxFillBuffer(bitStrm); bitStrm->bitsLeft = 32 - (bits - bitsLeft); @@ -922,23 +943,23 @@ libraw_inline uint32_t crxBitstreamGetBits(CrxBitstream* bitStrm, int bits) return result; } -libraw_inline int crxPredictKParameter(int32_t prevK, int32_t bitCode, - int32_t maxVal = 0) +libraw_inline int crxPredictKParameter(std::int32_t prevK, std::int32_t bitCode, + std::int32_t maxVal = 0) { - int32_t newKParam = prevK - (bitCode < (1 << prevK >> 1)) + + std::int32_t newKParam = prevK - (bitCode < (1 << prevK >> 1)) + ((bitCode >> prevK) > 2) + ((bitCode >> prevK) > 5); return !maxVal || newKParam < maxVal ? newKParam : maxVal; } libraw_inline void crxDecodeSymbolL1(CrxBandParam* param, - int32_t doMedianPrediction, - int32_t notEOL = 0) + std::int32_t doMedianPrediction, + std::int32_t notEOL = 0) { if (doMedianPrediction) { - int32_t symb[4]; + std::int32_t symb[4]; - int32_t delta = param->lineBuf0[1] - param->lineBuf0[0]; + std::int32_t delta = param->lineBuf0[1] - param->lineBuf0[0]; symb[2] = param->lineBuf1[0]; symb[0] = symb[1] = delta + symb[2]; symb[3] = param->lineBuf0[1]; @@ -951,7 +972,7 @@ libraw_inline void crxDecodeSymbolL1(CrxBandParam* param, } // get next error symbol - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + std::uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); @@ -965,7 +986,7 @@ libraw_inline void crxDecodeSymbolL1(CrxBandParam* param, // for not end of the line - use one symbol ahead to estimate next K if (notEOL) { - int32_t nextDelta = (param->lineBuf0[2] - param->lineBuf0[1]) << 1; + std::int32_t nextDelta = (param->lineBuf0[2] - param->lineBuf0[1]) << 1; bitCode = (bitCode + _abs(nextDelta)) >> 1; ++param->lineBuf0; } @@ -1051,15 +1072,15 @@ int crxDecodeLine(CrxBandParam* param) } libraw_inline void crxDecodeSymbolL1Rounded(CrxBandParam* param, - int32_t doSym = 1, - int32_t doCode = 1) + std::int32_t doSym = 1, + std::int32_t doCode = 1) { - int32_t sym = param->lineBuf0[1]; + std::int32_t sym = param->lineBuf0[1]; if (doSym) { // calculate the next symbol gradient - int32_t symb[4]; - int32_t deltaH = param->lineBuf0[1] - param->lineBuf0[0]; + std::int32_t symb[4]; + std::int32_t deltaH = param->lineBuf0[1] - param->lineBuf0[0]; symb[2] = param->lineBuf1[0]; symb[0] = symb[1] = deltaH + symb[2]; symb[3] = param->lineBuf0[1]; @@ -1068,7 +1089,7 @@ libraw_inline void crxDecodeSymbolL1Rounded(CrxBandParam* param, ((param->lineBuf1[0] < param->lineBuf0[1]) ^ (deltaH < 0))]; } - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + std::uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); @@ -1077,7 +1098,7 @@ libraw_inline void crxDecodeSymbolL1Rounded(CrxBandParam* param, (bitCode << param->kParam); } - int32_t code = -(bitCode & 1) ^ (bitCode >> 1); + std::int32_t code = -(bitCode & 1) ^ (bitCode >> 1); param->lineBuf1[1] = param->roundedBitsMask * 2 * code + static_cast(code < 0) + sym; if (doCode) { @@ -1102,11 +1123,11 @@ libraw_inline void crxDecodeSymbolL1Rounded(CrxBandParam* param, int crxDecodeLineRounded(CrxBandParam* param) { - int32_t valueReached = 0; + std::int32_t valueReached = 0; param->lineBuf0[0] = param->lineBuf0[1]; param->lineBuf1[0] = param->lineBuf0[1]; - int32_t length = param->subbandWidth; + std::int32_t length = param->subbandWidth; for (; length > 1; --length) { if (_abs(param->lineBuf0[2] - param->lineBuf0[1]) > param->roundedBitsMask) { @@ -1189,11 +1210,11 @@ int crxDecodeLineRounded(CrxBandParam* param) int crxDecodeLineNoRefPrevLine(CrxBandParam* param) { - int32_t i = 0; + std::int32_t i = 0; for (; i < param->subbandWidth - 1; i++) { if (param->lineBuf0[i + 2] | param->lineBuf0[i + 1] | param->lineBuf1[i]) { - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + std::uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); @@ -1255,14 +1276,14 @@ int crxDecodeLineNoRefPrevLine(CrxBandParam* param) } if (nSyms > 0) { - memset(param->lineBuf1 + i + 1, 0, nSyms * sizeof(int32_t)); - memset(param->lineBuf2 + i, 0, nSyms * sizeof(int32_t)); + memset(param->lineBuf1 + i + 1, 0, nSyms * sizeof(std::int32_t)); + memset(param->lineBuf2 + i, 0, nSyms * sizeof(std::int32_t)); i += nSyms; } if (i >= param->subbandWidth - 1) { if (i == param->subbandWidth - 1) { - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + std::uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); @@ -1278,7 +1299,7 @@ int crxDecodeLineNoRefPrevLine(CrxBandParam* param) continue; } else { - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + std::uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); @@ -1304,7 +1325,7 @@ int crxDecodeLineNoRefPrevLine(CrxBandParam* param) } if (i == param->subbandWidth - 1) { - int32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + std::int32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); @@ -1325,7 +1346,7 @@ int crxDecodeTopLine(CrxBandParam* param) { param->lineBuf1[0] = 0; - int32_t length = param->subbandWidth; + std::int32_t length = param->subbandWidth; // read the line from bitstream for (; length > 1; --length) { @@ -1384,7 +1405,7 @@ int crxDecodeTopLine(CrxBandParam* param) param->lineBuf1[1] = 0; } - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + std::uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); @@ -1400,7 +1421,7 @@ int crxDecodeTopLine(CrxBandParam* param) if (length == 1) { param->lineBuf1[1] = param->lineBuf1[0]; - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + std::uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); @@ -1423,7 +1444,7 @@ int crxDecodeTopLineRounded(CrxBandParam* param) { param->lineBuf1[0] = 0; - int32_t length = param->subbandWidth; + std::int32_t length = param->subbandWidth; // read the line from bitstream for (; length > 1; --length) { @@ -1482,7 +1503,7 @@ int crxDecodeTopLineRounded(CrxBandParam* param) param->lineBuf1[1] = 0; } - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + std::uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); @@ -1491,14 +1512,14 @@ int crxDecodeTopLineRounded(CrxBandParam* param) (bitCode << param->kParam); } - int32_t sVal = -(bitCode & 1) ^ (bitCode >> 1); + std::int32_t sVal = -(bitCode & 1) ^ (bitCode >> 1); param->lineBuf1[1] += param->roundedBitsMask * 2 * sVal + (sVal >> 31); param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); ++param->lineBuf1; } if (length == 1) { - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + std::uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); @@ -1507,7 +1528,7 @@ int crxDecodeTopLineRounded(CrxBandParam* param) (bitCode << param->kParam); } - int32_t sVal = -(bitCode & 1) ^ (bitCode >> 1); + std::int32_t sVal = -(bitCode & 1) ^ (bitCode >> 1); param->lineBuf1[1] += param->roundedBitsMask * 2 * sVal + (sVal >> 31); param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); ++param->lineBuf1; @@ -1522,11 +1543,11 @@ int crxDecodeTopLineNoRefPrevLine(CrxBandParam* param) { param->lineBuf0[0] = 0; param->lineBuf1[0] = 0; - int32_t length = param->subbandWidth; + std::int32_t length = param->subbandWidth; for (; length > 1; --length) { if (param->lineBuf1[0]) { - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + std::uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); @@ -1589,7 +1610,7 @@ int crxDecodeTopLineNoRefPrevLine(CrxBandParam* param) break; } - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + std::uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); @@ -1608,7 +1629,7 @@ int crxDecodeTopLineNoRefPrevLine(CrxBandParam* param) } if (length == 1) { - uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); + std::uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); @@ -1628,7 +1649,7 @@ int crxDecodeTopLineNoRefPrevLine(CrxBandParam* param) return 0; } -int crxDecodeLine(CrxBandParam* param, uint8_t* bandBuf) +int crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) { if (!param || !bandBuf) { return -1; @@ -1639,22 +1660,22 @@ int crxDecodeLine(CrxBandParam* param, uint8_t* bandBuf) } if (param->curLine == 0) { - int32_t lineLength = param->subbandWidth + 2; + std::int32_t lineLength = param->subbandWidth + 2; param->sParam = 0; param->kParam = 0; if (param->supportsPartial) { if (param->roundedBitsMask <= 0) { - param->lineBuf0 = (int32_t*)param->paramData; + param->lineBuf0 = (std::int32_t*)param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; - int32_t* lineBuf = param->lineBuf1 + 1; + std::int32_t* lineBuf = param->lineBuf1 + 1; if (crxDecodeTopLine(param)) { return -1; } - memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); + memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(std::int32_t)); ++param->curLine; } else { param->roundedBits = 1; @@ -1665,87 +1686,87 @@ int crxDecodeLine(CrxBandParam* param, uint8_t* bandBuf) } } - param->lineBuf0 = (int32_t*)param->paramData; + param->lineBuf0 = (std::int32_t*)param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; - int32_t* lineBuf = param->lineBuf1 + 1; + std::int32_t* lineBuf = param->lineBuf1 + 1; if (crxDecodeTopLineRounded(param)) { return -1; } - memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); + memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(std::int32_t)); ++param->curLine; } } else { - param->lineBuf2 = (int32_t*)param->nonProgrData; - param->lineBuf0 = (int32_t*)param->paramData; + param->lineBuf2 = (std::int32_t*)param->nonProgrData; + param->lineBuf0 = (std::int32_t*)param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; - int32_t* lineBuf = param->lineBuf1 + 1; + std::int32_t* lineBuf = param->lineBuf1 + 1; if (crxDecodeTopLineNoRefPrevLine(param)) { return -1; } - memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); + memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(std::int32_t)); ++param->curLine; } } else if (!param->supportsPartial) { - int32_t lineLength = param->subbandWidth + 2; - param->lineBuf2 = (int32_t*)param->nonProgrData; + std::int32_t lineLength = param->subbandWidth + 2; + param->lineBuf2 = (std::int32_t*)param->nonProgrData; if (param->curLine & 1) { - param->lineBuf1 = (int32_t*)param->paramData; + param->lineBuf1 = (std::int32_t*)param->paramData; param->lineBuf0 = param->lineBuf1 + lineLength; } else { - param->lineBuf0 = (int32_t*)param->paramData; + param->lineBuf0 = (std::int32_t*)param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; } - int32_t* lineBuf = param->lineBuf1 + 1; + std::int32_t* lineBuf = param->lineBuf1 + 1; if (crxDecodeLineNoRefPrevLine(param)) { return -1; } - memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); + memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(std::int32_t)); ++param->curLine; } else if (param->roundedBitsMask <= 0) { - int32_t lineLength = param->subbandWidth + 2; + std::int32_t lineLength = param->subbandWidth + 2; if (param->curLine & 1) { - param->lineBuf1 = (int32_t*)param->paramData; + param->lineBuf1 = (std::int32_t*)param->paramData; param->lineBuf0 = param->lineBuf1 + lineLength; } else { - param->lineBuf0 = (int32_t*)param->paramData; + param->lineBuf0 = (std::int32_t*)param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; } - int32_t* lineBuf = param->lineBuf1 + 1; + std::int32_t* lineBuf = param->lineBuf1 + 1; if (crxDecodeLine(param)) { return -1; } - memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); + memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(std::int32_t)); ++param->curLine; } else { - int32_t lineLength = param->subbandWidth + 2; + std::int32_t lineLength = param->subbandWidth + 2; if (param->curLine & 1) { - param->lineBuf1 = (int32_t*)param->paramData; + param->lineBuf1 = (std::int32_t*)param->paramData; param->lineBuf0 = param->lineBuf1 + lineLength; } else { - param->lineBuf0 = (int32_t*)param->paramData; + param->lineBuf0 = (std::int32_t*)param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; } - int32_t* lineBuf = param->lineBuf1 + 1; + std::int32_t* lineBuf = param->lineBuf1 + 1; if (crxDecodeLineRounded(param)) { return -1; } - memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(int32_t)); + memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(std::int32_t)); ++param->curLine; } @@ -1754,7 +1775,7 @@ int crxDecodeLine(CrxBandParam* param, uint8_t* bandBuf) int crxDecodeLineWithIQuantization(CrxSubband* subband) { - int32_t q_step_tbl[6] = {0x28, 0x2D, 0x33, 0x39, 0x40, 0x48}; + std::int32_t q_step_tbl[6] = {0x28, 0x2D, 0x33, 0x39, 0x40, 0x48}; if (!subband->dataSize) { memset(subband->bandBuf, 0, subband->bandSize); @@ -1762,7 +1783,7 @@ int crxDecodeLineWithIQuantization(CrxSubband* subband) } if (subband->supportsPartial) { - uint32_t bitCode = crxBitstreamGetZeros(&subband->bandParam->bitStream); + std::uint32_t bitCode = crxBitstreamGetZeros(&subband->bandParam->bitStream); if (bitCode >= 23) { bitCode = crxBitstreamGetBits(&subband->bandParam->bitStream, 8); @@ -1790,8 +1811,8 @@ int crxDecodeLineWithIQuantization(CrxSubband* subband) } // update subband buffers - int32_t* bandBuf = (int32_t*)subband->bandBuf; - int32_t qScale = + std::int32_t* bandBuf = (std::int32_t*)subband->bandBuf; + std::int32_t qScale = q_step_tbl[subband->quantValue % 6] >> (6 - subband->quantValue / 6); if (subband->quantValue / 6 >= 6) { @@ -1800,7 +1821,7 @@ int crxDecodeLineWithIQuantization(CrxSubband* subband) } if (qScale != 1) { - for (int32_t i = 0; i < subband->width; i++) { + for (std::int32_t i = 0; i < subband->width; i++) { bandBuf[i] *= qScale; } } @@ -1808,13 +1829,13 @@ int crxDecodeLineWithIQuantization(CrxSubband* subband) return 0; } -void crxHorizontal53(int32_t* lineBufLA, int32_t* lineBufLB, - CrxWaveletTransform* wavelet, uint32_t tileFlag) +void crxHorizontal53(std::int32_t* lineBufLA, std::int32_t* lineBufLB, + CrxWaveletTransform* wavelet, std::uint32_t tileFlag) { - int32_t* band0Buf = wavelet->subband0Buf; - int32_t* band1Buf = wavelet->subband1Buf; - int32_t* band2Buf = wavelet->subband2Buf; - int32_t* band3Buf = wavelet->subband3Buf; + std::int32_t* band0Buf = wavelet->subband0Buf; + std::int32_t* band1Buf = wavelet->subband1Buf; + std::int32_t* band2Buf = wavelet->subband2Buf; + std::int32_t* band3Buf = wavelet->subband3Buf; if (wavelet->width <= 1) { lineBufLA[0] = band0Buf[0]; @@ -1834,7 +1855,7 @@ void crxHorizontal53(int32_t* lineBufLA, int32_t* lineBufLB, ++band2Buf; for (int i = 0; i < wavelet->width - 3; i += 2) { - int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + std::int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); lineBufLA[1] = band1Buf[0] + ((delta + lineBufLA[0]) >> 1); lineBufLA[2] = delta; @@ -1851,10 +1872,10 @@ void crxHorizontal53(int32_t* lineBufLA, int32_t* lineBufLB, } if (tileFlag & E_HAS_TILES_ON_THE_RIGHT) { - int32_t deltaA = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + std::int32_t deltaA = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); lineBufLA[1] = band1Buf[0] + ((deltaA + lineBufLA[0]) >> 1); - int32_t deltaB = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + std::int32_t deltaB = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); lineBufLB[1] = band3Buf[0] + ((deltaB + lineBufLB[0]) >> 1); if (wavelet->width & 1) { @@ -1878,9 +1899,9 @@ void crxHorizontal53(int32_t* lineBufLA, int32_t* lineBufLB, } } -int32_t* crxIdwt53FilterGetLine(CrxPlaneComp* comp, int32_t level) +std::int32_t* crxIdwt53FilterGetLine(CrxPlaneComp* comp, std::int32_t level) { - int32_t* result = comp->waveletTransform[level] + std::int32_t* result = comp->waveletTransform[level] .lineBuf[(comp->waveletTransform[level].fltTapH - comp->waveletTransform[level].curH + 5) % 5 + @@ -1889,7 +1910,7 @@ int32_t* crxIdwt53FilterGetLine(CrxPlaneComp* comp, int32_t level) return result; } -int crxIdwt53FilterDecode(CrxPlaneComp* comp, int32_t level) +int crxIdwt53FilterDecode(CrxPlaneComp* comp, std::int32_t level) { if (comp->waveletTransform[level].curH) { return 0; @@ -1932,7 +1953,7 @@ int crxIdwt53FilterDecode(CrxPlaneComp* comp, int32_t level) return 0; } -int crxIdwt53FilterTransform(CrxPlaneComp* comp, uint32_t level) +int crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) { CrxWaveletTransform* wavelet = comp->waveletTransform + level; @@ -1953,14 +1974,14 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, uint32_t level) wavelet->subband0Buf = crxIdwt53FilterGetLine(comp, level - 1); } - int32_t* band0Buf = wavelet->subband0Buf; - int32_t* band1Buf = wavelet->subband1Buf; - int32_t* lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; - int32_t* lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; - int32_t* lineBufH2 = wavelet->lineBuf[(wavelet->fltTapH + 2) % 5 + 3]; + std::int32_t* band0Buf = wavelet->subband0Buf; + std::int32_t* band1Buf = wavelet->subband1Buf; + std::int32_t* lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; + std::int32_t* lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; + std::int32_t* lineBufH2 = wavelet->lineBuf[(wavelet->fltTapH + 2) % 5 + 3]; - int32_t* lineBufL0 = wavelet->lineBuf[0]; - int32_t* lineBufL1 = wavelet->lineBuf[1]; + std::int32_t* lineBufL0 = wavelet->lineBuf[0]; + std::int32_t* lineBufL1 = wavelet->lineBuf[1]; wavelet->lineBuf[1] = wavelet->lineBuf[2]; wavelet->lineBuf[2] = lineBufL1; @@ -1978,7 +1999,7 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, uint32_t level) ++band0Buf; for (int i = 0; i < wavelet->width - 3; i += 2) { - int32_t delta = + std::int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); lineBufL0[1] = band1Buf[0] + ((lineBufL0[0] + delta) >> 1); lineBufL0[2] = delta; @@ -1988,7 +2009,7 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, uint32_t level) } if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) { - int32_t delta = + std::int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); lineBufL0[1] = band1Buf[0] + ((lineBufL0[0] + delta) >> 1); @@ -1996,7 +2017,7 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, uint32_t level) lineBufL0[2] = delta; } } else if (wavelet->width & 1) { - int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + std::int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); lineBufL0[1] = band1Buf[0] + ((lineBufL0[0] + delta) >> 1); lineBufL0[2] = delta; } else { @@ -2008,8 +2029,8 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, uint32_t level) lineBufL0 = wavelet->lineBuf[0]; lineBufL1 = wavelet->lineBuf[1]; - for (int32_t i = 0; i < wavelet->width; i++) { - int32_t delta = lineBufL0[i] - ((lineBufL1[i] + 1) >> 1); + for (std::int32_t i = 0; i < wavelet->width; i++) { + std::int32_t delta = lineBufL0[i] - ((lineBufL1[i] + 1) >> 1); lineBufH1[i] = lineBufL1[i] + ((delta + lineBufH0[i]) >> 1); lineBufH2[i] = delta; } @@ -2018,13 +2039,13 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, uint32_t level) wavelet->curLine += 3; wavelet->fltTapH = (wavelet->fltTapH + 3) % 5; } else { - int32_t* lineBufL2 = wavelet->lineBuf[2]; - int32_t* lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; - int32_t* lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; + std::int32_t* lineBufL2 = wavelet->lineBuf[2]; + std::int32_t* lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; + std::int32_t* lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; wavelet->lineBuf[1] = lineBufL2; wavelet->lineBuf[2] = wavelet->lineBuf[1]; - for (int32_t i = 0; i < wavelet->width; i++) { + for (std::int32_t i = 0; i < wavelet->width; i++) { lineBufH1[i] = lineBufH0[i] + lineBufL2[i]; } @@ -2042,17 +2063,17 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, uint32_t level) wavelet->subband0Buf = crxIdwt53FilterGetLine(comp, level - 1); } - int32_t* band0Buf = wavelet->subband0Buf; - int32_t* band1Buf = wavelet->subband1Buf; - int32_t* band2Buf = wavelet->subband2Buf; - int32_t* band3Buf = wavelet->subband3Buf; + std::int32_t* band0Buf = wavelet->subband0Buf; + std::int32_t* band1Buf = wavelet->subband1Buf; + std::int32_t* band2Buf = wavelet->subband2Buf; + std::int32_t* band3Buf = wavelet->subband3Buf; - int32_t* lineBufL0 = wavelet->lineBuf[0]; - int32_t* lineBufL1 = wavelet->lineBuf[1]; - int32_t* lineBufL2 = wavelet->lineBuf[2]; - int32_t* lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; - int32_t* lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; - int32_t* lineBufH2 = wavelet->lineBuf[(wavelet->fltTapH + 2) % 5 + 3]; + std::int32_t* lineBufL0 = wavelet->lineBuf[0]; + std::int32_t* lineBufL1 = wavelet->lineBuf[1]; + std::int32_t* lineBufL2 = wavelet->lineBuf[2]; + std::int32_t* lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; + std::int32_t* lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; + std::int32_t* lineBufH2 = wavelet->lineBuf[(wavelet->fltTapH + 2) % 5 + 3]; wavelet->lineBuf[1] = wavelet->lineBuf[2]; wavelet->lineBuf[2] = lineBufL1; @@ -2076,7 +2097,7 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, uint32_t level) ++band2Buf; for (int i = 0; i < wavelet->width - 3; i += 2) { - int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + std::int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); lineBufL0[1] = band1Buf[0] + ((delta + lineBufL0[0]) >> 1); lineBufL0[2] = delta; @@ -2093,10 +2114,10 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, uint32_t level) } if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) { - int32_t deltaA = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + std::int32_t deltaA = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); lineBufL0[1] = band1Buf[0] + ((deltaA + lineBufL0[0]) >> 1); - int32_t deltaB = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + std::int32_t deltaB = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); lineBufL1[1] = band3Buf[0] + ((deltaB + lineBufL1[0]) >> 1); if (wavelet->width & 1) { @@ -2104,7 +2125,7 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, uint32_t level) lineBufL1[2] = deltaB; } } else if (wavelet->width & 1) { - int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + std::int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); lineBufL0[1] = band1Buf[0] + ((delta + lineBufL0[0]) >> 1); lineBufL0[2] = delta; @@ -2122,8 +2143,8 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, uint32_t level) lineBufL1 = wavelet->lineBuf[1]; lineBufL2 = wavelet->lineBuf[2]; - for (int32_t i = 0; i < wavelet->width; i++) { - int32_t delta = lineBufL0[i] - ((lineBufL2[i] + lineBufL1[i] + 2) >> 2); + for (std::int32_t i = 0; i < wavelet->width; i++) { + std::int32_t delta = lineBufL0[i] - ((lineBufL2[i] + lineBufL1[i] + 2) >> 2); lineBufH1[i] = lineBufL1[i] + ((delta + lineBufH0[i]) >> 1); lineBufH2[i] = delta; } @@ -2142,7 +2163,7 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, uint32_t level) return 0; } -int crxIdwt53FilterInitialize(CrxPlaneComp* comp, int32_t prevLevel) +int crxIdwt53FilterInitialize(CrxPlaneComp* comp, std::int32_t prevLevel) { if (prevLevel < 0) { return 0; @@ -2158,7 +2179,7 @@ int crxIdwt53FilterInitialize(CrxPlaneComp* comp, int32_t prevLevel) return -1; } - int32_t* lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; + std::int32_t* lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; if (wavelet->height > 1) { if (crxDecodeLineWithIQuantization(comp->subBands + curBand + 1) || @@ -2167,9 +2188,9 @@ int crxIdwt53FilterInitialize(CrxPlaneComp* comp, int32_t prevLevel) return -1; } - int32_t* lineBufL0 = wavelet->lineBuf[0]; - int32_t* lineBufL1 = wavelet->lineBuf[1]; - int32_t* lineBufL2 = wavelet->lineBuf[2]; + std::int32_t* lineBufL0 = wavelet->lineBuf[0]; + std::int32_t* lineBufL1 = wavelet->lineBuf[1]; + std::int32_t* lineBufL2 = wavelet->lineBuf[2]; if (comp->tileFlag & E_HAS_TILES_ON_THE_TOP) { crxHorizontal53(lineBufL0, wavelet->lineBuf[1], wavelet, @@ -2180,8 +2201,8 @@ int crxIdwt53FilterInitialize(CrxPlaneComp* comp, int32_t prevLevel) return -1; } - int32_t* band2Buf = wavelet->subband2Buf; - int32_t* band3Buf = wavelet->subband3Buf; + std::int32_t* band2Buf = wavelet->subband2Buf; + std::int32_t* band3Buf = wavelet->subband3Buf; // process L band if (wavelet->width <= 1) { @@ -2197,7 +2218,7 @@ int crxIdwt53FilterInitialize(CrxPlaneComp* comp, int32_t prevLevel) ++band2Buf; for (int i = 0; i < wavelet->width - 3; i += 2) { - int32_t delta = + std::int32_t delta = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); lineBufL2[1] = band3Buf[0] + ((lineBufL2[0] + delta) >> 1); lineBufL2[2] = delta; @@ -2208,7 +2229,7 @@ int crxIdwt53FilterInitialize(CrxPlaneComp* comp, int32_t prevLevel) } if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) { - int32_t delta = + std::int32_t delta = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); lineBufL2[1] = band3Buf[0] + ((lineBufL2[0] + delta) >> 1); @@ -2216,7 +2237,7 @@ int crxIdwt53FilterInitialize(CrxPlaneComp* comp, int32_t prevLevel) lineBufL2[2] = delta; } } else if (wavelet->width & 1) { - int32_t delta = band2Buf[0] - ((band3Buf[0] + 1) >> 1); + std::int32_t delta = band2Buf[0] - ((band3Buf[0] + 1) >> 1); lineBufL2[1] = band3Buf[0] + ((lineBufL2[0] + delta) >> 1); lineBufL2[2] = delta; @@ -2226,7 +2247,7 @@ int crxIdwt53FilterInitialize(CrxPlaneComp* comp, int32_t prevLevel) } // process H band - for (int32_t i = 0; i < wavelet->width; i++) { + for (std::int32_t i = 0; i < wavelet->width; i++) { lineBufH0[i] = lineBufL0[i] - ((lineBufL1[i] + lineBufL2[i] + 2) >> 2); } @@ -2248,8 +2269,8 @@ int crxIdwt53FilterInitialize(CrxPlaneComp* comp, int32_t prevLevel) return -1; } - int32_t* band0Buf = wavelet->subband0Buf; - int32_t* band1Buf = wavelet->subband1Buf; + std::int32_t* band0Buf = wavelet->subband0Buf; + std::int32_t* band1Buf = wavelet->subband1Buf; // process H band if (wavelet->width <= 1) { @@ -2265,7 +2286,7 @@ int crxIdwt53FilterInitialize(CrxPlaneComp* comp, int32_t prevLevel) ++band0Buf; for (int i = 0; i < wavelet->width - 3; i += 2) { - int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + std::int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); lineBufH0[1] = band1Buf[0] + ((lineBufH0[0] + delta) >> 1); lineBufH0[2] = delta; @@ -2275,11 +2296,11 @@ int crxIdwt53FilterInitialize(CrxPlaneComp* comp, int32_t prevLevel) } if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) { - int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + std::int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); lineBufH0[1] = band1Buf[0] + ((lineBufH0[0] + delta) >> 1); lineBufH0[2] = delta; } else if (wavelet->width & 1) { - int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + std::int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); lineBufH0[1] = band1Buf[0] + ((lineBufH0[0] + delta) >> 1); lineBufH0[2] = delta; } else { @@ -2307,7 +2328,7 @@ void crxFreeSubbandData(CrxImage* image, CrxPlaneComp* comp) return; } - for (int32_t i = 0; i < image->subbandCount; i++) { + for (std::int32_t i = 0; i < image->subbandCount; i++) { if (comp->subBands[i].bandParam) { free(comp->subBands[i].bandParam); comp->subBands[i].bandParam = nullptr; @@ -2319,15 +2340,15 @@ void crxFreeSubbandData(CrxImage* image, CrxPlaneComp* comp) } void crxConvertPlaneLine(CrxImage* img, int imageRow, int imageCol = 0, - int plane = 0, const int32_t* lineData = nullptr, + int plane = 0, const std::int32_t* lineData = nullptr, int lineLength = 0) { if (lineData) { - uint64_t rawOffset = 4 * img->planeWidth * imageRow + 2 * imageCol; + std::uint64_t rawOffset = 4 * img->planeWidth * imageRow + 2 * imageCol; if (img->encType == 1) { - int32_t maxVal = 1 << (img->nBits - 1); - int32_t minVal = -maxVal; + std::int32_t maxVal = 1 << (img->nBits - 1); + std::int32_t minVal = -maxVal; --maxVal; for (int i = 0; i < lineLength; i++) { @@ -2343,16 +2364,16 @@ void crxConvertPlaneLine(CrxImage* img, int imageRow, int imageCol = 0, img->planeBuf[rawOffset + i] = lineData[i]; } } else if (img->nPlanes == 4) { - int32_t median = 1 << (img->nBits - 1); - int32_t maxVal = (1 << img->nBits) - 1; + std::int32_t median = 1 << (img->nBits - 1); + std::int32_t maxVal = (1 << img->nBits) - 1; for (int i = 0; i < lineLength; i++) { img->outBufs[plane][rawOffset + 2 * i] = _constrain(median + lineData[i], 0, maxVal); } } else if (img->nPlanes == 1) { - int32_t maxVal = (1 << img->nBits) - 1; - int32_t median = 1 << (img->nBits - 1); + std::int32_t maxVal = (1 << img->nBits) - 1; + std::int32_t median = 1 << (img->nBits - 1); rawOffset = img->planeWidth * imageRow + imageCol; for (int i = 0; i < lineLength; i++) { @@ -2361,21 +2382,21 @@ void crxConvertPlaneLine(CrxImage* img, int imageRow, int imageCol = 0, } } } else if (img->encType == 3 && img->planeBuf) { - int32_t planeSize = img->planeWidth * img->planeHeight; - int16_t* plane0 = img->planeBuf + imageRow * img->planeWidth; - int16_t* plane1 = plane0 + planeSize; - int16_t* plane2 = plane1 + planeSize; - int16_t* plane3 = plane2 + planeSize; + std::int32_t planeSize = img->planeWidth * img->planeHeight; + std::int16_t* plane0 = img->planeBuf + imageRow * img->planeWidth; + std::int16_t* plane1 = plane0 + planeSize; + std::int16_t* plane2 = plane1 + planeSize; + std::int16_t* plane3 = plane2 + planeSize; - int32_t median = 1 << (img->nBits - 1) << 10; - int32_t maxVal = (1 << img->nBits) - 1; - uint32_t rawLineOffset = 4 * img->planeWidth * imageRow; + std::int32_t median = 1 << (img->nBits - 1) << 10; + std::int32_t maxVal = (1 << img->nBits) - 1; + std::uint32_t rawLineOffset = 4 * img->planeWidth * imageRow; // for this stage - all except imageRow is ignored for (int i = 0; i < img->planeWidth; i++) { - int32_t gr = + std::int32_t gr = median + (plane0[i] << 10) - 168 * plane1[i] - 585 * plane3[i]; - int32_t val = 0; + std::int32_t val = 0; if (gr < 0) { gr = -(((_abs(gr) + 512) >> 9) & ~1); @@ -2399,15 +2420,15 @@ void crxConvertPlaneLine(CrxImage* img, int imageRow, int imageCol = 0, } } -int crxParamInit(CrxBandParam** param, uint64_t subbandMdatOffset, - uint64_t subbandDataSize, uint32_t subbandWidth, - uint32_t subbandHeight, int32_t supportsPartial, - uint32_t roundedBitsMask, LibRaw_abstract_datastream* input) +int crxParamInit(CrxBandParam** param, std::uint64_t subbandMdatOffset, + std::uint64_t subbandDataSize, std::uint32_t subbandWidth, + std::uint32_t subbandHeight, std::int32_t supportsPartial, + std::uint32_t roundedBitsMask, LibRaw_abstract_datastream* input) { - int32_t progrDataSize = supportsPartial ? 0 : sizeof(int32_t) * subbandWidth; - int32_t paramLength = 2 * subbandWidth + 4; - uint8_t* paramBuf = (uint8_t*)calloc( - 1, sizeof(CrxBandParam) + sizeof(int32_t) * paramLength + progrDataSize); + std::int32_t progrDataSize = supportsPartial ? 0 : sizeof(std::int32_t) * subbandWidth; + std::int32_t paramLength = 2 * subbandWidth + 4; + std::uint8_t* paramBuf = (std::uint8_t*)calloc( + 1, sizeof(CrxBandParam) + sizeof(std::int32_t) * paramLength + progrDataSize); if (!paramBuf) { return -1; @@ -2417,7 +2438,7 @@ int crxParamInit(CrxBandParam** param, uint64_t subbandMdatOffset, paramBuf += sizeof(CrxBandParam); - (*param)->paramData = (int32_t*)paramBuf; + (*param)->paramData = (std::int32_t*)paramBuf; (*param)->nonProgrData = progrDataSize ? (*param)->paramData + paramLength : nullptr; (*param)->subbandWidth = subbandWidth; @@ -2440,25 +2461,25 @@ int crxParamInit(CrxBandParam** param, uint64_t subbandMdatOffset, } int crxSetupSubbandData(CrxImage* img, CrxPlaneComp* planeComp, - const CrxTile* tile, uint32_t mdatOffset) + const CrxTile* tile, std::uint32_t mdatOffset) { long compDataSize = 0; long waveletDataOffset = 0; long compCoeffDataOffset = 0; - int32_t toSubbands = 3 * img->levels + 1; - int32_t transformWidth = 0; + std::int32_t toSubbands = 3 * img->levels + 1; + std::int32_t transformWidth = 0; CrxSubband* subbands = planeComp->subBands; // calculate sizes - for (int32_t subbandNum = 0; subbandNum < toSubbands; subbandNum++) { + for (std::int32_t subbandNum = 0; subbandNum < toSubbands; subbandNum++) { subbands[subbandNum].bandSize = - subbands[subbandNum].width * sizeof(int32_t); // 4bytes + subbands[subbandNum].width * sizeof(std::int32_t); // 4bytes compDataSize += subbands[subbandNum].bandSize; } if (img->levels) { - int32_t encLevels = img->levels ? img->levels : 1; + std::int32_t encLevels = img->levels ? img->levels : 1; waveletDataOffset = (compDataSize + 7) & ~7; compDataSize = (sizeof(CrxWaveletTransform) * encLevels + waveletDataOffset + 7) & ~7; @@ -2467,26 +2488,26 @@ int crxSetupSubbandData(CrxImage* img, CrxPlaneComp* planeComp, // calc wavelet line buffer sizes (always at one level up from current) for (int level = 0; level < img->levels; ++level) { if (level < img->levels - 1) { - compDataSize += 8 * sizeof(int32_t) * + compDataSize += 8 * sizeof(std::int32_t) * planeComp->subBands[3 * (level + 1) + 2].width; } else { - compDataSize += 8 * sizeof(int32_t) * tile->width; + compDataSize += 8 * sizeof(std::int32_t) * tile->width; } } } // buffer allocation - planeComp->compBuf = (uint8_t*)malloc(compDataSize); + planeComp->compBuf = (std::uint8_t*)malloc(compDataSize); if (!planeComp->compBuf) { return -1; } // subbands buffer and sizes initialisation - uint64_t subbandMdatOffset = img->mdatOffset + mdatOffset; - uint8_t* subbandBuf = planeComp->compBuf; + std::uint64_t subbandMdatOffset = img->mdatOffset + mdatOffset; + std::uint8_t* subbandBuf = planeComp->compBuf; - for (int32_t subbandNum = 0; subbandNum < toSubbands; subbandNum++) { + for (std::int32_t subbandNum = 0; subbandNum < toSubbands; subbandNum++) { subbands[subbandNum].bandBuf = subbandBuf; subbandBuf += subbands[subbandNum].bandSize; subbands[subbandNum].mdatOffset = @@ -2497,13 +2518,13 @@ int crxSetupSubbandData(CrxImage* img, CrxPlaneComp* planeComp, if (img->levels) { CrxWaveletTransform* waveletTransforms = (CrxWaveletTransform*)(planeComp->compBuf + waveletDataOffset); - int32_t* paramData = (int32_t*)(planeComp->compBuf + compCoeffDataOffset); + std::int32_t* paramData = (std::int32_t*)(planeComp->compBuf + compCoeffDataOffset); planeComp->waveletTransform = waveletTransforms; - waveletTransforms[0].subband0Buf = (int32_t*)subbands->bandBuf; + waveletTransforms[0].subband0Buf = (std::int32_t*)subbands->bandBuf; for (int level = 0; level < img->levels; ++level) { - int32_t band = 3 * level + 1; + std::int32_t band = 3 * level + 1; if (level >= img->levels - 1) { waveletTransforms[level].height = tile->height; @@ -2532,21 +2553,21 @@ int crxSetupSubbandData(CrxImage* img, CrxPlaneComp* planeComp, waveletTransforms[level].curLine = 0; waveletTransforms[level].curH = 0; waveletTransforms[level].fltTapH = 0; - waveletTransforms[level].subband1Buf = (int32_t*)subbands[band].bandBuf; + waveletTransforms[level].subband1Buf = (std::int32_t*)subbands[band].bandBuf; waveletTransforms[level].subband2Buf = - (int32_t*)subbands[band + 1].bandBuf; + (std::int32_t*)subbands[band + 1].bandBuf; waveletTransforms[level].subband3Buf = - (int32_t*)subbands[band + 2].bandBuf; + (std::int32_t*)subbands[band + 2].bandBuf; paramData = waveletTransforms[level].lineBuf[7] + transformWidth; } } // decoding params and bitstream initialisation - for (int32_t subbandNum = 0; subbandNum < toSubbands; subbandNum++) { + for (std::int32_t subbandNum = 0; subbandNum < toSubbands; subbandNum++) { if (subbands[subbandNum].dataSize) { - int32_t supportsPartial = 0; - uint32_t roundedBitsMask = 0; + std::int32_t supportsPartial = 0; + std::uint32_t roundedBitsMask = 0; if (planeComp->supportsPartial && subbandNum == 0) { roundedBitsMask = planeComp->roundedBitsMask; @@ -2567,7 +2588,7 @@ int crxSetupSubbandData(CrxImage* img, CrxPlaneComp* planeComp, } } // namespace -int DCraw::crxDecodePlane(void* p, uint32_t planeNumber) +int DCraw::crxDecodePlane(void* p, std::uint32_t planeNumber) { CrxImage* img = (CrxImage*)p; int imageRow = 0; @@ -2578,7 +2599,7 @@ int DCraw::crxDecodePlane(void* p, uint32_t planeNumber) for (int tCol = 0; tCol < img->tileCols; tCol++) { CrxTile* tile = img->tiles + tRow * img->tileRows + tCol; CrxPlaneComp* planeComp = tile->comps + planeNumber; - uint64_t tileMdatOffset = tile->dataOffset + planeComp->dataOffset; + std::uint64_t tileMdatOffset = tile->dataOffset + planeComp->dataOffset; // decode single tile if (crxSetupSubbandData(img, planeComp, tile, tileMdatOffset)) { @@ -2596,7 +2617,7 @@ int DCraw::crxDecodePlane(void* p, uint32_t planeNumber) return -1; } - int32_t* lineData = + std::int32_t* lineData = crxIdwt53FilterGetLine(planeComp, img->levels - 1); crxConvertPlaneLine(img, imageRow + i, imageCol, planeNumber, lineData, tile->width); @@ -2615,7 +2636,7 @@ int DCraw::crxDecodePlane(void* p, uint32_t planeNumber) return -1; } - int32_t* lineData = (int32_t*)planeComp->subBands->bandBuf; + std::int32_t* lineData = (std::int32_t*)planeComp->subBands->bandBuf; crxConvertPlaneLine(img, imageRow + i, imageCol, planeNumber, lineData, tile->width); } @@ -2635,14 +2656,14 @@ namespace using crx_data_header_t = DCraw::CanonCR3Data::crx_data_header_t; int crxReadSubbandHeaders(crx_data_header_t* hdr, CrxImage* img, CrxTile* tile, - CrxPlaneComp* comp, uint8_t** subbandMdatPtr, - uint32_t* mdatSize) + CrxPlaneComp* comp, std::uint8_t** subbandMdatPtr, + std::uint32_t* mdatSize) { CrxSubband* band = comp->subBands + img->subbandCount - 1; // set to last band - uint32_t bandHeight = tile->height; - uint32_t bandWidth = tile->width; - int32_t bandWidthExCoef = 0; - int32_t bandHeightExCoef = 0; + std::uint32_t bandHeight = tile->height; + std::uint32_t bandWidth = tile->width; + std::int32_t bandWidthExCoef = 0; + std::int32_t bandHeightExCoef = 0; if (img->levels) { // Build up subband sequences to crxDecode to a level in a header @@ -2650,21 +2671,21 @@ int crxReadSubbandHeaders(crx_data_header_t* hdr, CrxImage* img, CrxTile* tile, // Coefficient structure is a bit unclear and convoluted: // 3 levels max - 8 groups (for tile width rounded to 8 bytes) // of 3 band per level 4 sets of coefficients for each - int32_t* rowExCoef = + std::int32_t* rowExCoef = exCoefNumTbl + 0x60 * (img->levels - 1) + 12 * (tile->width & 7); - int32_t* colExCoef = + std::int32_t* colExCoef = exCoefNumTbl + 0x60 * (img->levels - 1) + 12 * (tile->height & 7); for (int level = 0; level < img->levels; ++level) { - int32_t widthOddPixel = bandWidth & 1; - int32_t heightOddPixel = bandHeight & 1; + std::int32_t widthOddPixel = bandWidth & 1; + std::int32_t heightOddPixel = bandHeight & 1; bandWidth = (widthOddPixel + bandWidth) >> 1; bandHeight = (heightOddPixel + bandHeight) >> 1; - int32_t bandWidthExCoef0 = 0; - int32_t bandWidthExCoef1 = 0; - int32_t bandHeightExCoef0 = 0; - int32_t bandHeightExCoef1 = 0; + std::int32_t bandWidthExCoef0 = 0; + std::int32_t bandWidthExCoef1 = 0; + std::int32_t bandHeightExCoef0 = 0; + std::int32_t bandHeightExCoef1 = 0; if (tile->tileFlag & E_HAS_TILES_ON_THE_RIGHT) { bandWidthExCoef0 = rowExCoef[0]; @@ -2720,7 +2741,7 @@ int crxReadSubbandHeaders(crx_data_header_t* hdr, CrxImage* img, CrxTile* tile, return 0; } - int32_t subbandOffset = 0; + std::int32_t subbandOffset = 0; band = comp->subBands; for (unsigned int curSubband = 0; curSubband < img->subbandCount; curSubband++, band++) { @@ -2732,8 +2753,8 @@ int crxReadSubbandHeaders(crx_data_header_t* hdr, CrxImage* img, CrxTile* tile, return -1; } - uint32_t bitData = sgetn(4, *subbandMdatPtr + 8); - uint32_t subbandSize = sgetn(4, *subbandMdatPtr + 4); + std::uint32_t bitData = sgetn(4, *subbandMdatPtr + 8); + std::uint32_t subbandSize = sgetn(4, *subbandMdatPtr + 4); if (curSubband != bitData >> 28) { band->dataSize = subbandSize; @@ -2758,8 +2779,8 @@ int crxReadSubbandHeaders(crx_data_header_t* hdr, CrxImage* img, CrxTile* tile, return 0; } -int crxReadImageHeaders(crx_data_header_t* hdr, CrxImage* img, uint8_t* mdatPtr, - uint32_t mdatSize) +int crxReadImageHeaders(crx_data_header_t* hdr, CrxImage* img, std::uint8_t* mdatPtr, + std::uint32_t mdatSize) { unsigned int nTiles = img->tileRows * img->tileCols; @@ -2855,9 +2876,9 @@ int crxReadImageHeaders(crx_data_header_t* hdr, CrxImage* img, uint8_t* mdatPtr, } } - uint32_t tileOffset = 0; - uint32_t dataSize = mdatSize; - uint8_t* dataPtr = mdatPtr; + std::uint32_t tileOffset = 0; + std::uint32_t dataSize = mdatSize; + std::uint8_t* dataPtr = mdatPtr; CrxTile* tile = img->tiles; for (unsigned int curTile = 0; curTile < nTiles; curTile++, tile++) { @@ -2878,12 +2899,12 @@ int crxReadImageHeaders(crx_data_header_t* hdr, CrxImage* img, uint8_t* mdatPtr, tile->tileSize = sgetn(4, dataPtr + 4); tile->dataOffset = tileOffset; - int32_t hdrExtraBytes = sgetn(2, dataPtr + 2) - 8; + std::int32_t hdrExtraBytes = sgetn(2, dataPtr + 2) - 8; tileOffset += tile->tileSize; dataPtr += hdrExtraBytes + 0xC; dataSize -= hdrExtraBytes; - uint32_t compOffset = 0; + std::uint32_t compOffset = 0; CrxPlaneComp* comp = tile->comps; for (int compNum = 0; compNum < img->nPlanes; compNum++, comp++) { @@ -2901,7 +2922,7 @@ int crxReadImageHeaders(crx_data_header_t* hdr, CrxImage* img, uint8_t* mdatPtr, comp->compSize = sgetn(4, dataPtr + 4); - int32_t compHdrRoundedBits = (dataPtr[8] >> 1) & 3; + std::int32_t compHdrRoundedBits = (dataPtr[8] >> 1) & 3; comp->supportsPartial = (dataPtr[8] & 8) != 0; comp->dataOffset = compOffset; @@ -2930,9 +2951,9 @@ int crxReadImageHeaders(crx_data_header_t* hdr, CrxImage* img, uint8_t* mdatPtr, return 0; } -int crxSetupImageData(crx_data_header_t* hdr, CrxImage* img, int16_t* outBuf, - uint64_t mdatOffset, uint32_t mdatSize, - uint8_t* mdatHdrPtr) +int crxSetupImageData(crx_data_header_t* hdr, CrxImage* img, std::int16_t* outBuf, + std::uint64_t mdatOffset, std::uint32_t mdatSize, + std::uint8_t* mdatHdrPtr) { int IncrBitTable[32] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0 @@ -2975,7 +2996,7 @@ int crxSetupImageData(crx_data_header_t* hdr, CrxImage* img, int16_t* outBuf, // left as is. if (img->encType == 3 && img->nPlanes == 4 && img->nBits > 8) { img->planeBuf = - (int16_t*)malloc(img->planeHeight * img->planeWidth * img->nPlanes * + (std::int16_t*)malloc(img->planeHeight * img->planeWidth * img->nPlanes * ((img->samplePrecision + 7) >> 3)); if (!img->planeBuf) { @@ -2983,7 +3004,7 @@ int crxSetupImageData(crx_data_header_t* hdr, CrxImage* img, int16_t* outBuf, } } - int32_t rowSize = 2 * img->planeWidth; + std::int32_t rowSize = 2 * img->planeWidth; if (img->nPlanes == 1) { img->outBufs[0] = outBuf; @@ -3041,9 +3062,9 @@ int crxFreeImageData(CrxImage* img) int nTiles = img->tileRows * img->tileCols; if (img->tiles) { - for (int32_t curTile = 0; curTile < nTiles; curTile++, tile++) { + for (std::int32_t curTile = 0; curTile < nTiles; curTile++, tile++) { if (tile[curTile].comps) { - for (int32_t curPlane = 0; curPlane < img->nPlanes; curPlane++) { + for (std::int32_t curPlane = 0; curPlane < img->nPlanes; curPlane++) { crxFreeSubbandData(img, tile[curTile].comps + curPlane); } } @@ -3068,11 +3089,11 @@ void DCraw::crxLoadDecodeLoop(void* img, int nPlanes) int results[4]; // nPlanes is always <= 4 #pragma omp parallel for - for (int32_t plane = 0; plane < nPlanes; ++plane) { + for (std::int32_t plane = 0; plane < nPlanes; ++plane) { results[plane] = crxDecodePlane(img, plane); } - for (int32_t plane = 0; plane < nPlanes; ++plane) { + for (std::int32_t plane = 0; plane < nPlanes; ++plane) { if (results[plane]) { derror(); } @@ -3080,7 +3101,7 @@ void DCraw::crxLoadDecodeLoop(void* img, int nPlanes) #else - for (int32_t plane = 0; plane < nPlanes; ++plane) { + for (std::int32_t plane = 0; plane < nPlanes; ++plane) { if (crxDecodePlane(img, plane)) { derror(); } @@ -3110,7 +3131,7 @@ void DCraw::crxLoadRaw() CrxImage img; if (RT_canon_CR3_data.crx_track_selected >= - LIBRAW_CRXTRACKS_MAXCOUNT) { + RT_canon_CR3_data.CRXTRACKS_MAXCOUNT) { derror(); } @@ -3131,7 +3152,7 @@ void DCraw::crxLoadRaw() // /*imgdata.color.*/maximum = (1 << hdr.nBits) - 1; - uint8_t* hdrBuf = (uint8_t*)malloc(hdr.mdatHdrSize); + std::uint8_t* hdrBuf = (std::uint8_t*)malloc(hdr.mdatHdrSize); // read image header #ifdef _OPENMP @@ -3150,7 +3171,7 @@ void DCraw::crxLoadRaw() } // parse and setup the image data - if (crxSetupImageData(&hdr, &img, (int16_t*)raw_image, + if (crxSetupImageData(&hdr, &img, (std::int16_t*)raw_image, hdr.MediaOffset /*data_offset*/, hdr.MediaSize /*RT_canon_CR3_data.data_size*/, hdrBuf)) { derror(); @@ -3169,7 +3190,7 @@ void DCraw::crxLoadRaw() int DCraw::crxParseImageHeader(uchar* cmp1TagData, unsigned int nTrack) { - if (nTrack >= LIBRAW_CRXTRACKS_MAXCOUNT) { + if (nTrack >= RT_canon_CR3_data.CRXTRACKS_MAXCOUNT) { return -1; } @@ -3243,4 +3264,3 @@ int DCraw::crxParseImageHeader(uchar* cmp1TagData, unsigned int nTrack) #undef _min #undef _constrain #undef libraw_inline -#undef LIBRAW_CRXTRACKS_MAXCOUNT From 81f9ab73152c8896fd59c37e3adb1b8e3d563563 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Fri, 22 Nov 2019 14:37:10 +0100 Subject: [PATCH 176/208] Regression in Olympus E-M10MarkII raw black levels, fixes #5535 --- rtengine/dcraw.h | 1 + 1 file changed, 1 insertion(+) diff --git a/rtengine/dcraw.h b/rtengine/dcraw.h index 75570b065..0265219c7 100644 --- a/rtengine/dcraw.h +++ b/rtengine/dcraw.h @@ -68,6 +68,7 @@ public: gamm[0]=0.45;gamm[1]=4.5;gamm[2]=gamm[3]=gamm[4]=gamm[5]=0; user_mul[0]=user_mul[1]=user_mul[2]=user_mul[3]=0; greybox[0]=greybox[1]=0; greybox[2]=greybox[3]= UINT_MAX; + RT_canon_CR3_data.CR3_CTMDtag = 0; } protected: From 614458c3c6b1a5478634b70375a6553ea6c74d1f Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Fri, 22 Nov 2019 17:26:44 +0100 Subject: [PATCH 177/208] added support for Sony A7rIV 16-shot pixel-shift files, ported from ART, thanks to @agriggio --- rtengine/camconst.json | 2 +- rtengine/dcraw.cc | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index 9bdd8e1e3..c0d833db7 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -2516,7 +2516,7 @@ Camera constants: { // Quality C, "make_model": "Sony ILCE-7RM4", - "raw_crop": [ 0, 0, 9568, 0 ] // full raw frame 9600x6376 - 32 rightmost columns are garbage + "raw_crop": [ 0, 0, -32, 0 ] // full raw frame 9600x6376 - 32 rightmost columns are garbage. Using -32 instead of 9568 to support also 16-shot pixelshift files }, { // Quality B, color matrix copied from a7rm2 diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index b8da498b2..d5348286c 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -7015,7 +7015,8 @@ int CLASS parse_tiff (int base) void CLASS apply_tiff() { - int max_samp=0, ties=0, os, ns, raw=-1, thm=-1, i; + int max_samp=0, ties=0, /*os, ns,*/ raw=-1, thm=-1, i; + uint64_t os, ns; // RT struct jhead jh; thumb_misc = 16; @@ -7045,6 +7046,7 @@ void CLASS apply_tiff() } if ((tiff_ifd[i].comp != 6 || tiff_ifd[i].samples != 3) && (tiff_ifd[i].width | tiff_ifd[i].height) < 0x10000 && + (unsigned)tiff_ifd[i].bps < 33 && (unsigned)tiff_ifd[i].samples < 13 && // RT ns && ((ns > os && (ties = 1)) || (ns == os && shot_select == ties++))) { raw_width = tiff_ifd[i].width; @@ -7112,7 +7114,7 @@ void CLASS apply_tiff() load_raw = &CLASS olympus_load_raw; // ------- RT ------- if (!strncmp(make,"SONY",4) && - !strncmp(model,"ILCE-7RM3",9) && + (!strncmp(model,"ILCE-7RM3",9) || !strncmp(model,"ILCE-7RM4",9)) && tiff_samples == 4 && tiff_ifd[raw].bytes == raw_width*raw_height*tiff_samples*2) { load_raw = &CLASS sony_arq_load_raw; From 23e60371ed29706b0780416b62134335405b1e76 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 24 Nov 2019 23:09:23 +0100 Subject: [PATCH 178/208] Use capture sharpening for pixelshift profiles --- rtdata/profiles/Pixel Shift/PS ISO Low.pp3 | 17 +++++------------ rtdata/profiles/Pixel Shift/PS No Motion.pp3 | 17 +++++------------ 2 files changed, 10 insertions(+), 24 deletions(-) diff --git a/rtdata/profiles/Pixel Shift/PS ISO Low.pp3 b/rtdata/profiles/Pixel Shift/PS ISO Low.pp3 index 5587b19e0..286b5a289 100644 --- a/rtdata/profiles/Pixel Shift/PS ISO Low.pp3 +++ b/rtdata/profiles/Pixel Shift/PS ISO Low.pp3 @@ -1,18 +1,8 @@ [Sharpening] -Enabled=true -Contrast=5 -Method=rld -DeconvRadius=0.75 -DeconvAmount=100 -DeconvDamping=0 -DeconvIterations=30 +Enabled=false [SharpenMicro] -Enabled=true -Contrast=15 -Matrix=false -Strength=20 -Uniformity=5 +Enabled=false [RAW] CA=true @@ -38,3 +28,6 @@ pixelShiftBlur=true pixelShiftSmoothFactor=0.69999999999999996 pixelShiftLmmse=false pixelShiftNonGreenCross=true + +[PostDemosaicSharpening] +Enabled=true diff --git a/rtdata/profiles/Pixel Shift/PS No Motion.pp3 b/rtdata/profiles/Pixel Shift/PS No Motion.pp3 index f1d889f97..0975251e2 100644 --- a/rtdata/profiles/Pixel Shift/PS No Motion.pp3 +++ b/rtdata/profiles/Pixel Shift/PS No Motion.pp3 @@ -1,18 +1,8 @@ [Sharpening] -Enabled=true -Contrast=5 -Method=rld -DeconvRadius=0.75 -DeconvAmount=100 -DeconvDamping=0 -DeconvIterations=30 +Enabled=false [SharpenMicro] -Enabled=true -Contrast=15 -Matrix=false -Strength=20 -Uniformity=5 +Enabled=false [RAW] CA=true @@ -22,3 +12,6 @@ Method=pixelshift PixelShiftMotion=0 PixelShiftMotionCorrection=5 PixelShiftMotionCorrectionMethod=0 + +[PostDemosaicSharpening] +Enabled=true From f054ed00e8f08cd256288b901fb3576a1f321618 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 25 Nov 2019 01:00:49 +0100 Subject: [PATCH 179/208] Pixelshift: optionally use RCD+VNG4 for motion parts --- rtengine/pixelshift.cc | 8 ++++++++ rtengine/procparams.cc | 1 + rtengine/procparams.h | 1 + 3 files changed, 10 insertions(+) diff --git a/rtengine/pixelshift.cc b/rtengine/pixelshift.cc index ff529697b..2e98b7b22 100644 --- a/rtengine/pixelshift.cc +++ b/rtengine/pixelshift.cc @@ -339,6 +339,8 @@ BENCHFUN lmmse_interpolate_omp(winw, winh, *(rawDataFrames[0]), red, green, blue, bayerParams.lmmse_iterations); } else if (bayerParams.pixelShiftDemosaicMethod == bayerParams.getPSDemosaicMethodString(procparams::RAWParams::BayerSensor::PSDemosaicMethod::AMAZEVNG4)) { dual_demosaic_RT (true, rawParamsIn, winw, winh, *(rawDataFrames[0]), red, green, blue, bayerParams.dualDemosaicContrast, true); + } else if (bayerParams.pixelShiftDemosaicMethod == bayerParams.getPSDemosaicMethodString(procparams::RAWParams::BayerSensor::PSDemosaicMethod::RCDVNG4)) { + dual_demosaic_RT (true, rawParamsIn, winw, winh, *(rawDataFrames[0]), red, green, blue, bayerParams.dualDemosaicContrast, true); } else { amaze_demosaic_RT(winx, winy, winw, winh, *(rawDataFrames[0]), red, green, blue, options.chunkSizeAMAZE, options.measure); } @@ -351,6 +353,8 @@ BENCHFUN lmmse_interpolate_omp(winw, winh, *(rawDataFrames[i + 1]), redTmp[i], greenTmp[i], blueTmp[i], bayerParams.lmmse_iterations); } else if (bayerParams.pixelShiftDemosaicMethod == bayerParams.getPSDemosaicMethodString(procparams::RAWParams::BayerSensor::PSDemosaicMethod::AMAZEVNG4)) { dual_demosaic_RT (true, rawParamsIn, winw, winh, *(rawDataFrames[i + 1]), redTmp[i], greenTmp[i], blueTmp[i], bayerParams.dualDemosaicContrast, true); + } else if (bayerParams.pixelShiftDemosaicMethod == bayerParams.getPSDemosaicMethodString(procparams::RAWParams::BayerSensor::PSDemosaicMethod::RCDVNG4)) { + dual_demosaic_RT (true, rawParamsIn, winw, winh, *(rawDataFrames[i + 1]), redTmp[i], greenTmp[i], blueTmp[i], bayerParams.dualDemosaicContrast, true); } else { amaze_demosaic_RT(winx, winy, winw, winh, *(rawDataFrames[i + 1]), redTmp[i], greenTmp[i], blueTmp[i], options.chunkSizeAMAZE, options.measure); } @@ -380,6 +384,10 @@ BENCHFUN procparams::RAWParams rawParamsTmp = rawParamsIn; rawParamsTmp.bayersensor.method = procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::AMAZEVNG4); dual_demosaic_RT (true, rawParamsTmp, winw, winh, rawData, red, green, blue, bayerParams.dualDemosaicContrast, true); + } else if (bayerParams.pixelShiftDemosaicMethod == bayerParams.getPSDemosaicMethodString(procparams::RAWParams::BayerSensor::PSDemosaicMethod::RCDVNG4)) { + procparams::RAWParams rawParamsTmp = rawParamsIn; + rawParamsTmp.bayersensor.method = procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCDVNG4); + dual_demosaic_RT (true, rawParamsTmp, winw, winh, rawData, red, green, blue, bayerParams.dualDemosaicContrast, true); } else { amaze_demosaic_RT(winx, winy, winw, winh, rawData, red, green, blue, options.chunkSizeAMAZE, options.measure); } diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 9483c6a02..ba6fc237b 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2672,6 +2672,7 @@ const std::vector& RAWParams::BayerSensor::getPSDemosaicMethodStrin static const std::vector method_strings { "amaze", "amazevng4", + "rcdvng4", "lmmse" }; return method_strings; diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 01c54ffc5..c41e55872 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1388,6 +1388,7 @@ struct RAWParams { enum class PSDemosaicMethod { AMAZE, AMAZEVNG4, + RCDVNG4, LMMSE }; From e89b6be76e08f8f3e6aaa85eca7ed9d29d19bf7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Tue, 26 Nov 2019 09:52:51 +0100 Subject: [PATCH 180/208] `DCraw::parseCR3()` cleanup --- rtengine/canon_cr3_decoder.cc | 170 ++++++++++++++++++---------------- 1 file changed, 90 insertions(+), 80 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index 609f0c849..3fe221097 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -280,12 +280,17 @@ int DCraw::parseCR3( {"uuid", 3}, }; - const char sHandlerType[5][5] = {"unk.", "soun", "vide", "hint", "meta"}; + const char sHandlerType[5][5] = { + "unk.", + "soun", + "vide", + "hint", + "meta" + }; - unsigned int c; int err = 0; - ushort tL; // Atom length represented in 4 or 8 bytes + unsigned short tL; // Atom length represented in 4 or 8 bytes char nmAtom[5]; // Atom name unsigned long long oAtom; unsigned long long szAtom; // Atom offset and Atom size @@ -297,19 +302,19 @@ int DCraw::parseCR3( uchar CMP1[36]; char HandlerType[5]; char MediaFormatID[5]; -// unsigned ImageWidth, ImageHeight; +// unsigned int ImageWidth, ImageHeight; long relpos_inDir; long relpos_inBox; - unsigned szItem; - unsigned Tag; - unsigned lTag; - ushort tItem; + unsigned int szItem; + unsigned int Tag; + unsigned int lTag; + unsigned short tItem; nmAtom[0] = MediaFormatID[0] = nmAtom[4] = MediaFormatID[4] = '\0'; - strcpy(HandlerType, sHandlerType[0]); + strncpy(HandlerType, sHandlerType[0], sizeof(HandlerType)); // ImageWidth = ImageHeight = 0U; oAtom = oAtomList; - nesting++; + ++nesting; if (nesting > 31) { return -14; // too deep nesting @@ -329,20 +334,20 @@ int DCraw::parseCR3( || get4() != 0x00000008; }; - while ((oAtom + 8ULL) <= (oAtomList + szAtomList)) { - lHdr = 0ULL; + while ((oAtom + 8) <= (oAtomList + szAtomList)) { + lHdr = 0U; err = 0; - order = 0x4d4d; + order = 0x4D4D; fseek(ifp, oAtom, SEEK_SET); szAtom = get4(); - for (c = 0; c < 4; c++) { + for (unsigned int c = 0; c < 4; ++c) { nmAtom[c] = AtomNameStack[nesting * 4 + c] = fgetc(ifp); } AtomNameStack[(nesting + 1) * 4] = '\0'; tL = 4; AtomType = 0; - for (c = 0; c < sizeof AtomNamesList / sizeof * AtomNamesList; c++) { + for (unsigned int c = 0; c < sizeof(AtomNamesList) / sizeof(*AtomNamesList); ++c) { if (!strcmp(nmAtom, AtomNamesList[c].AtomName)) { AtomType = AtomNamesList[c].AtomType; break; @@ -353,28 +358,28 @@ int DCraw::parseCR3( err = 1; } - if (szAtom == 0ULL) { + if (szAtom == 0) { if (nesting != 0) { err = -2; goto fin; } szAtom = szAtomList - oAtom; - oAtomContent = oAtom + 8ULL; - szAtomContent = szAtom - 8ULL; - } else if (szAtom == 1ULL) { - if ((oAtom + 16ULL) > (oAtomList + szAtomList)) { + oAtomContent = oAtom + 8; + szAtomContent = szAtom - 8; + } else if (szAtom == 1) { + if ((oAtom + 16) > (oAtomList + szAtomList)) { err = -3; goto fin; } tL = 8; - szAtom = (((unsigned long long)get4()) << 32) | get4(); - oAtomContent = oAtom + 16ULL; - szAtomContent = szAtom - 16ULL; + szAtom = (static_cast(get4()) << 32) | get4(); + oAtomContent = oAtom + 16; + szAtomContent = szAtom - 16; } else { - oAtomContent = oAtom + 8ULL; - szAtomContent = szAtom - 8ULL; + oAtomContent = oAtom + 8; + szAtomContent = szAtom - 8; } if (!strcmp(nmAtom, "trak")) { @@ -387,7 +392,7 @@ int DCraw::parseCR3( } if (!strcmp(AtomNameStack, "moovuuid")) { - lHdr = 16ULL; + lHdr = 16; fread(UIID, 1, lHdr, ifp); if (!strncmp(UIID, UIID_Canon, lHdr)) { @@ -396,12 +401,12 @@ int DCraw::parseCR3( fseek(ifp, -lHdr, SEEK_CUR); } } else if (!strcmp(AtomNameStack, "moovuuidCCTP")) { - lHdr = 12ULL; + lHdr = 12; } else if (!strcmp(AtomNameStack, "moovuuidCMT1")) { - short q_order = order; + const short q_order = order; order = get2(); - if ((tL != 4) || is_bad_header()) { + if (tL != 4 || is_bad_header()) { err = -4; goto fin; } @@ -409,10 +414,10 @@ int DCraw::parseCR3( parse_tiff_ifd(oAtomContent); order = q_order; } else if (!strcmp(AtomNameStack, "moovuuidCMT2")) { - short q_order = order; + const short q_order = order; order = get2(); - if ((tL != 4) || is_bad_header()) { + if (tL != 4 || is_bad_header()) { err = -5; goto fin; } @@ -420,10 +425,10 @@ int DCraw::parseCR3( parse_exif(oAtomContent); order = q_order; } else if (!strcmp(AtomNameStack, "moovuuidCMT3")) { - short q_order = order; + const short q_order = order; order = get2(); - if ((tL != 4) || is_bad_header()) { + if (tL != 4 || is_bad_header()) { err = -6; goto fin; } @@ -432,26 +437,26 @@ int DCraw::parseCR3( parse_makernote(oAtomContent, 0); order = q_order; } else if (!strcmp(AtomNameStack, "moovuuidCMT4")) { - short q_order = order; + const short q_order = order; order = get2(); - if ((tL != 4) || is_bad_header()) { + if (tL != 4 || is_bad_header()) { err = -6; goto fin; } - std::int64_t off = ftell(ifp); + const std::int64_t off = ftell(ifp); // FIXME: ftell() returns int parse_gps(oAtomContent); - fseek(ifp, off, SEEK_SET); + fseek(ifp, off, SEEK_SET); // FIXME: fseek() takes int offset // parse_gps_libraw(oAtomContent); order = q_order; } else if (!strcmp(AtomNameStack, "moovtrakmdiahdlr")) { - fseek(ifp, 8L, SEEK_CUR); - for (c = 0; c < 4; c++) { + fseek(ifp, 8, SEEK_CUR); + for (unsigned int c = 0; c < 4; ++c) { HandlerType[c] = fgetc(ifp); } - for (c = 1; c < sizeof sHandlerType / sizeof * sHandlerType; c++) { + for (unsigned int c = 1; c < sizeof(sHandlerType) / sizeof(*sHandlerType); ++c) { if (!strcmp(HandlerType, sHandlerType[c])) { TrackType = c; break; @@ -466,13 +471,13 @@ int DCraw::parseCR3( goto fin; } - for (c = 0; c < 4; c++) { + for (unsigned int c = 0; c < 4; ++c) { MediaFormatID[c] = fgetc(ifp); } - if ((TrackType == 2) && (!strcmp(MediaFormatID, "CRAW"))) { + if (TrackType == 2 && !strcmp(MediaFormatID, "CRAW")) { if (szAtomContent >= 44) { - fseek(ifp, 24L, SEEK_CUR); + fseek(ifp, 24, SEEK_CUR); } else { err = -8; goto fin; @@ -482,8 +487,6 @@ int DCraw::parseCR3( lHdr = 0; } -#define current_track RT_canon_CR3_data.crx_header[nTrack] - /*ImageWidth = */ get2(); /*ImageHeight = */ get2(); } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAW")) { @@ -497,69 +500,81 @@ int DCraw::parseCR3( } if (!crxParseImageHeader(CMP1, nTrack)) { - current_track.MediaType = 1; + RT_canon_CR3_data.crx_header[nTrack].MediaType = 1; } } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAWJPEG")) { - current_track.MediaType = 2; + RT_canon_CR3_data.crx_header[nTrack].MediaType = 2; } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsz")) { if (szAtomContent == 12) { - fseek(ifp, 4L, SEEK_CUR); + fseek(ifp, 4, SEEK_CUR); } else if (szAtomContent == 16) { - fseek(ifp, 12L, SEEK_CUR); + fseek(ifp, 12, SEEK_CUR); } else { err = -9; goto fin; } - current_track.MediaSize = get4(); + RT_canon_CR3_data.crx_header[nTrack].MediaSize = get4(); } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblco64")) { if (szAtomContent == 16) { - fseek(ifp, 8L, SEEK_CUR); + fseek(ifp, 8, SEEK_CUR); } else { err = -10; goto fin; } - current_track.MediaOffset = (((unsigned long long)get4()) << 32) | get4(); + RT_canon_CR3_data.crx_header[nTrack].MediaOffset = (static_cast(get4()) << 32) | get4(); } - if (current_track.MediaSize && current_track.MediaOffset && - ((oAtom + szAtom) >= (oAtomList + szAtomList)) && - !strncmp(AtomNameStack, "moovtrakmdiaminfstbl", 20)) { - if ((TrackType == 4) && (!strcmp(MediaFormatID, "CTMD"))) { + if ( + RT_canon_CR3_data.crx_header[nTrack].MediaSize + && RT_canon_CR3_data.crx_header[nTrack].MediaOffset + && oAtom + szAtom >= oAtomList + szAtomList + && !strncmp(AtomNameStack, "moovtrakmdiaminfstbl", 20) + ) { + if (TrackType == 4 && !strcmp(MediaFormatID, "CTMD")) { order = 0x4949; - relpos_inDir = 0L; + relpos_inDir = 0; - while (relpos_inDir + 6 < current_track.MediaSize) { - fseek(ifp, current_track.MediaOffset + relpos_inDir, SEEK_SET); + while (relpos_inDir + 6 < RT_canon_CR3_data.crx_header[nTrack].MediaSize) { + fseek(ifp, RT_canon_CR3_data.crx_header[nTrack].MediaOffset + relpos_inDir, SEEK_SET); szItem = get4(); tItem = get2(); - if ((relpos_inDir + szItem) > current_track.MediaSize) { + if ((relpos_inDir + szItem) > RT_canon_CR3_data.crx_header[nTrack].MediaSize) { err = -11; goto fin; } - if ((tItem == 7) || (tItem == 8) || (tItem == 9)) { - relpos_inBox = relpos_inDir + 12L; + if ( + tItem == 7 + || tItem == 8 + || tItem == 9 + ) { + relpos_inBox = relpos_inDir + 12; while (relpos_inBox + 8 < relpos_inDir + szItem) { - fseek(ifp, current_track.MediaOffset + relpos_inBox, SEEK_SET); + fseek(ifp, RT_canon_CR3_data.crx_header[nTrack].MediaOffset + relpos_inBox, SEEK_SET); lTag = get4(); Tag = get4(); if (lTag < 8) { err = -12; goto fin; - } else if ((relpos_inBox + lTag) > (relpos_inDir + szItem)) { + } else if (relpos_inBox + lTag > relpos_inDir + szItem) { err = -11; goto fin; } - if ((Tag == 0x927c) && ((tItem == 7) || (tItem == 8))) { - fseek(ifp, current_track.MediaOffset + relpos_inBox + 8L, - SEEK_SET); - short q_order = order; + if ( + Tag == 0x927C + && ( + tItem == 7 + || tItem == 8 + ) + ) { + fseek(ifp, RT_canon_CR3_data.crx_header[nTrack].MediaOffset + relpos_inBox + 8, SEEK_SET); + const short q_order = order; order = get2(); if (is_bad_header()) { @@ -567,10 +582,9 @@ int DCraw::parseCR3( goto fin; } - fseek(ifp, -8L, SEEK_CUR); + fseek(ifp, -8, SEEK_CUR); RT_canon_CR3_data.CR3_CTMDtag = 1; - parse_makernote(current_track.MediaOffset + relpos_inBox + 8, - 0); + parse_makernote(RT_canon_CR3_data.crx_header[nTrack].MediaOffset + relpos_inBox + 8, 0); RT_canon_CR3_data.CR3_CTMDtag = 0; order = q_order; } @@ -582,15 +596,12 @@ int DCraw::parseCR3( relpos_inDir += szItem; } - order = 0x4d4d; + order = 0x4D4D; } } -#undef current_track - if (AtomType == 1) { - err = parseCR3(oAtomContent + lHdr, szAtomContent - lHdr, nesting, - AtomNameStack, nTrack, TrackType); + err = parseCR3(oAtomContent + lHdr, szAtomContent - lHdr, nesting, AtomNameStack, nTrack, TrackType); if (err) { goto fin; @@ -601,7 +612,7 @@ int DCraw::parseCR3( } fin: - nesting--; + --nesting; if (nesting >= 0) { AtomNameStack[nesting * 4] = '\0'; @@ -610,7 +621,6 @@ fin: order = s_order; return err; } -#undef bad_hdr // ----------------------------------------------------------------------------- @@ -633,9 +643,9 @@ fin: namespace { -static unsigned sgetn(int n, unsigned char* s) +static unsigned int sgetn(int n, unsigned char* s) { - unsigned result = 0; + unsigned int result = 0; while (n-- > 0) { result = (result << 8) | (*s++); From 2a4891827d1112cec001293bc03808dbbb45ab95 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 26 Nov 2019 15:25:11 +0100 Subject: [PATCH 181/208] Some cleanups --- rtengine/improcfun.cc | 64 +++++++++++++++-------------- rtengine/improcfun.h | 25 ++++++----- rtengine/pdaflinesfilter.cc | 4 +- rtengine/pdaflinesfilter.h | 4 +- rtengine/simpleprocess.cc | 23 ++--------- rtgui/adjuster.cc | 4 +- rtgui/adjuster.h | 2 +- rtgui/batchqueue.cc | 5 +-- rtgui/batchqueuepanel.cc | 1 - rtgui/bayerprocess.cc | 2 +- rtgui/bayerprocess.h | 2 +- rtgui/colorappearance.cc | 2 +- rtgui/colorappearance.h | 2 +- rtgui/cropwindow.cc | 2 +- rtgui/cropwindow.h | 2 +- rtgui/curveeditorgroup.h | 1 - rtgui/diagonalcurveeditorsubgroup.h | 2 +- rtgui/editwidgets.h | 4 +- rtgui/editwindow.cc | 2 - rtgui/exportpanel.h | 1 - rtgui/extprog.cc | 15 ++----- rtgui/filebrowser.cc | 6 +-- rtgui/filebrowserentry.cc | 2 +- rtgui/filebrowserentry.h | 1 - rtgui/filecatalog.cc | 5 +-- rtgui/flatfield.cc | 2 +- rtgui/flatfield.h | 2 +- rtgui/guiutils.cc | 7 ++-- rtgui/histogrampanel.cc | 4 +- rtgui/histogrampanel.h | 4 +- rtgui/hsvequalizer.h | 2 - rtgui/lockablecolorpicker.cc | 6 +-- rtgui/lockablecolorpicker.h | 6 +-- rtgui/lwbutton.cc | 2 +- rtgui/mydiagonalcurve.cc | 3 +- rtgui/mydiagonalcurve.h | 2 +- rtgui/myflatcurve.cc | 1 - rtgui/pdsharpening.cc | 2 +- rtgui/pdsharpening.h | 2 +- rtgui/preferences.cc | 2 +- rtgui/preferences.h | 3 +- rtgui/previewmodepanel.h | 2 - rtgui/previewwindow.cc | 2 +- rtgui/progressconnector.h | 6 +-- rtgui/rgbcurves.h | 1 - rtgui/rtwindow.cc | 13 ++---- rtgui/saveasdlg.h | 1 - rtgui/thumbnail.cc | 15 +++---- rtgui/thumbnail.h | 2 +- rtgui/toolbar.cc | 1 + rtgui/toolbar.h | 2 +- rtgui/xtransprocess.cc | 2 +- rtgui/xtransprocess.h | 2 +- 53 files changed, 120 insertions(+), 162 deletions(-) diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index e10d7f690..4170021ea 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -869,7 +869,9 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw mean = (sum / ((height) * width)) / 327.68f; //for Yb for all image...if one day "pipette" we can adapt Yb for each zone } } - +#ifdef _OPENMP + static_cast(numThreads); // to silence cppcheck warning +#endif //evaluate lightness, contrast } @@ -1469,8 +1471,8 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw if (ciedata) { //only with improccoordinator // Data for J Q M s and C histograms int posl, posc; - float brli = 327.f; - float chsacol = 327.f; + float brli; + float chsacol; float libr; float colch; @@ -2049,17 +2051,25 @@ filmlike_clip (float *r, float *g, float *b) } } -void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer *pipetteBuffer, LUTf & hltonecurve, LUTf & shtonecurve, LUTf & tonecurve, - int sat, LUTf & rCurve, LUTf & gCurve, LUTf & bCurve, float satLimit, float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, bool opautili, LUTf & clToningcurve, LUTf & cl2Toningcurve, - const ToneCurve & customToneCurve1, const ToneCurve & customToneCurve2, const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, DCPProfile *dcpProf, const DCPProfileApplyState &asIn, LUTu &histToneCurve, size_t chunkSize, bool measure) +void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer *pipetteBuffer, const LUTf& hltonecurve, const LUTf& shtonecurve, const LUTf& tonecurve, + int sat, const LUTf& rCurve, const LUTf& gCurve, const LUTf& bCurve, float satLimit, float satLimitOpacity, + const ColorGradientCurve& ctColorCurve, const OpacityCurve& ctOpacityCurve, bool opautili, const LUTf& clToningcurve, const LUTf& cl2Toningcurve, + const ToneCurve& customToneCurve1, const ToneCurve& customToneCurve2, const ToneCurve& customToneCurvebw1, const ToneCurve& customToneCurvebw2, + double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, DCPProfile *dcpProf, const DCPProfileApplyState& asIn, + LUTu& histToneCurve, size_t chunkSize, bool measure) { - rgbProc (working, lab, pipetteBuffer, hltonecurve, shtonecurve, tonecurve, sat, rCurve, gCurve, bCurve, satLimit, satLimitOpacity, ctColorCurve, ctOpacityCurve, opautili, clToningcurve, cl2Toningcurve, customToneCurve1, customToneCurve2, customToneCurvebw1, customToneCurvebw2, rrm, ggm, bbm, autor, autog, autob, params->toneCurve.expcomp, params->toneCurve.hlcompr, params->toneCurve.hlcomprthresh, dcpProf, asIn, histToneCurve, chunkSize, measure); + rgbProc(working, lab, pipetteBuffer, hltonecurve, shtonecurve, tonecurve, sat, rCurve, gCurve, bCurve, satLimit, satLimitOpacity, ctColorCurve, ctOpacityCurve, opautili, + clToningcurve, cl2Toningcurve, customToneCurve1, customToneCurve2, customToneCurvebw1, customToneCurvebw2, rrm, ggm, bbm, autor, autog, autob, + params->toneCurve.expcomp, params->toneCurve.hlcompr, params->toneCurve.hlcomprthresh, dcpProf, asIn, histToneCurve, chunkSize, measure); } // Process RGB image and convert to LAB space -void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer *pipetteBuffer, LUTf & hltonecurve, LUTf & shtonecurve, LUTf & tonecurve, - int sat, LUTf & rCurve, LUTf & gCurve, LUTf & bCurve, float satLimit, float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, bool opautili, LUTf & clToningcurve, LUTf & cl2Toningcurve, - const ToneCurve & customToneCurve1, const ToneCurve & customToneCurve2, const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, double expcomp, int hlcompr, int hlcomprthresh, DCPProfile *dcpProf, const DCPProfileApplyState &asIn, LUTu &histToneCurve, size_t chunkSize, bool measure) +void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer *pipetteBuffer, const LUTf& hltonecurve, const LUTf& shtonecurve, const LUTf& tonecurve, + int sat, const LUTf& rCurve, const LUTf& gCurve, const LUTf& bCurve, float satLimit, float satLimitOpacity, + const ColorGradientCurve& ctColorCurve, const OpacityCurve& ctOpacityCurve, bool opautili, const LUTf& clToningcurve, const LUTf& cl2Toningcurve, + const ToneCurve& customToneCurve1, const ToneCurve& customToneCurve2, const ToneCurve& customToneCurvebw1, const ToneCurve& customToneCurvebw2, + double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, double expcomp, int hlcompr, int hlcomprthresh, + DCPProfile *dcpProf, const DCPProfileApplyState& asIn, LUTu& histToneCurve, size_t chunkSize, bool measure) { std::unique_ptr stop; @@ -3758,10 +3768,9 @@ void ImProcFunctions::toningsmh(float r, float g, float b, float &ro, float &go, float rlo; //0.4 0.5 float rlm; //1.1 float rlh; //1.1 - float rlob; //for BW old mode if (mode == 0) { //colour - rlo = rlob = strProtect; //0.5 ==> 0.75 + rlo = strProtect; //0.5 ==> 0.75 rlh = 2.2f * strProtect; rlm = 1.5f * strProtect; constexpr float v0 = 0.15f; @@ -3778,7 +3787,6 @@ void ImProcFunctions::toningsmh(float r, float g, float b, float &ro, float &go, } } else { //bw coefficient to preserve same results as before for satlimtopacity = 0.5 (default) rlo = strProtect * 0.8f; //0.4 - rlob = strProtect; //0.5 rlm = strProtect * 2.2f; //1.1 rlh = strProtect * 2.4f; //1.2 if (v > 0.15f) { @@ -4080,7 +4088,7 @@ void ImProcFunctions::toning2col (float r, float g, float b, float &ro, float &g * @param iplow iphigh [0..1] luminance * @param wp wip 3x3 matrix and inverse conversion rgb XYZ **/ -void ImProcFunctions::labtoning (float r, float g, float b, float &ro, float &go, float &bo, int algm, int metchrom, int twoc, float satLimit, float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, LUTf & clToningcurve, LUTf & cl2Toningcurve, float iplow, float iphigh, double wp[3][3], double wip[3][3] ) +void ImProcFunctions::labtoning (float r, float g, float b, float &ro, float &go, float &bo, int algm, int metchrom, int twoc, float satLimit, float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, const LUTf & clToningcurve, const LUTf & cl2Toningcurve, float iplow, float iphigh, double wp[3][3], double wip[3][3] ) { ro = CLIP(r); go = CLIP(g); @@ -4139,7 +4147,7 @@ void ImProcFunctions::labtoning (float r, float g, float b, float &ro, float &go } -void ImProcFunctions::luminanceCurve (LabImage* lold, LabImage* lnew, LUTf & curve) +void ImProcFunctions::luminanceCurve (LabImage* lold, LabImage* lnew, const LUTf& curve) { int W = lold->W; @@ -4159,7 +4167,7 @@ void ImProcFunctions::luminanceCurve (LabImage* lold, LabImage* lnew, LUTf & cur -void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW, LabImage* lold, LabImage* lnew, LUTf & acurve, LUTf & bcurve, LUTf & satcurve, LUTf & lhskcurve, LUTf & clcurve, LUTf & curve, bool utili, bool autili, bool butili, bool ccutili, bool cclutili, bool clcutili, LUTu &histCCurve, LUTu &histLCurve) +void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW, LabImage* lold, LabImage* lnew, const LUTf& acurve, const LUTf& bcurve, const LUTf& satcurve, const LUTf& lhskcurve, const LUTf& clcurve, LUTf & curve, bool utili, bool autili, bool butili, bool ccutili, bool cclutili, bool clcutili, LUTu &histCCurve, LUTu &histLCurve) { int W = lold->W; @@ -5353,7 +5361,7 @@ void ImProcFunctions::getAutoExp (const LUTu &histogram, int histcompr, double int imax = 65536 >> histcompr; int overex = 0; float sum = 0.f, hisum = 0.f, losum = 0.f; - float ave = 0.f, hidev = 0.f, lodev = 0.f; + float ave = 0.f; //find average luminance histogram.getSumAndAverage (sum, ave); @@ -5381,36 +5389,32 @@ void ImProcFunctions::getAutoExp (const LUTu &histogram, int histcompr, double float octile[8] = {0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f}, ospread = 0.f; count = 0; - int i = 0; + int j = 0; - for (; i < min ((int)ave, imax); i++) { + for (; j < min ((int)ave, imax); ++j) { if (count < 8) { - octile[count] += histogram[i]; + octile[count] += histogram[j]; if (octile[count] > sum / 8.f || (count == 7 && octile[count] > sum / 16.f)) { - octile[count] = xlog (1. + (float)i) / log (2.f); + octile[count] = xlog (1. + (float)j) / log (2.f); count++;// = min(count+1,7); } } - //lodev += SQR(ave-i)*histogram[i]; - lodev += (xlog (ave + 1.f) - xlog ((float)i + 1.)) * histogram[i]; - losum += histogram[i]; + losum += histogram[j]; } - for (; i < imax; i++) { + for (; j < imax; ++j) { if (count < 8) { - octile[count] += histogram[i]; + octile[count] += histogram[j]; if (octile[count] > sum / 8.f || (count == 7 && octile[count] > sum / 16.f)) { - octile[count] = xlog (1. + (float)i) / log (2.f); + octile[count] = xlog (1. + (float)j) / log (2.f); count++;// = min(count+1,7); } } - //hidev += SQR(i-ave)*histogram[i]; - hidev += (xlog ((float)i + 1.) - xlog (ave + 1.f)) * histogram[i]; - hisum += histogram[i]; + hisum += histogram[j]; } diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index c95ebeb4e..661f399ef 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -124,14 +124,19 @@ public: void firstAnalysis(const Imagefloat* const working, const procparams::ProcParams ¶ms, LUTu & vhist16); void updateColorProfiles(const Glib::ustring& monitorProfile, RenderingIntent monitorIntent, bool softProof, bool gamutCheck); - void rgbProc(Imagefloat* working, LabImage* lab, PipetteBuffer *pipetteBuffer, LUTf & hltonecurve, LUTf & shtonecurve, LUTf & tonecurve, - int sat, LUTf & rCurve, LUTf & gCurve, LUTf & bCurve, float satLimit, float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, bool opautili, LUTf & clcurve, LUTf & cl2curve, const ToneCurve & customToneCurve1, const ToneCurve & customToneCurve2, - const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, DCPProfile *dcpProf, const DCPProfileApplyState &asIn, LUTu &histToneCurve, size_t chunkSize = 1, bool measure = false); - void rgbProc(Imagefloat* working, LabImage* lab, PipetteBuffer *pipetteBuffer, LUTf & hltonecurve, LUTf & shtonecurve, LUTf & tonecurve, - int sat, LUTf & rCurve, LUTf & gCurve, LUTf & bCurve, float satLimit, float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, bool opautili, LUTf & clcurve, LUTf & cl2curve, const ToneCurve & customToneCurve1, const ToneCurve & customToneCurve2, - const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, - double expcomp, int hlcompr, int hlcomprthresh, DCPProfile *dcpProf, const DCPProfileApplyState &asIn, LUTu &histToneCurve, size_t chunkSize = 1, bool measure = false); - void labtoning(float r, float g, float b, float &ro, float &go, float &bo, int algm, int metchrom, int twoc, float satLimit, float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, LUTf & clToningcurve, LUTf & cl2Toningcurve, float iplow, float iphigh, double wp[3][3], double wip[3][3]); + void rgbProc(Imagefloat* working, LabImage* lab, PipetteBuffer *pipetteBuffer, const LUTf& hltonecurve, const LUTf& shtonecurve, const LUTf& tonecurve, + int sat, const LUTf& rCurve, const LUTf& gCurve, const LUTf& bCurve, float satLimit, float satLimitOpacity, const ColorGradientCurve& ctColorCurve, + const OpacityCurve& ctOpacityCurve, bool opautili, const LUTf& clcurve, const LUTf& cl2curve, const ToneCurve& customToneCurve1, + const ToneCurve& customToneCurve2, const ToneCurve& customToneCurvebw1, const ToneCurve& customToneCurvebw2, + double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, DCPProfile *dcpProf, + const DCPProfileApplyState& asIn, LUTu& histToneCurve, size_t chunkSize = 1, bool measure = false); + void rgbProc(Imagefloat* working, LabImage* lab, PipetteBuffer *pipetteBuffer, const LUTf& hltonecurve, const LUTf& shtonecurve, const LUTf& tonecurve, + int sat, const LUTf& rCurve, const LUTf& gCurve, const LUTf& bCurve, float satLimit, float satLimitOpacity, const ColorGradientCurve& ctColorCurve, + const OpacityCurve& ctOpacityCurve, bool opautili, const LUTf& clcurve, const LUTf& cl2curve, const ToneCurve& customToneCurve1, + const ToneCurve& customToneCurve2, const ToneCurve& customToneCurvebw1, const ToneCurve& customToneCurvebw2, + double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, double expcomp, int hlcompr, + int hlcomprthresh, DCPProfile *dcpProf, const DCPProfileApplyState& asIn, LUTu& histToneCurve, size_t chunkSize = 1, bool measure = false); + void labtoning(float r, float g, float b, float &ro, float &go, float &bo, int algm, int metchrom, int twoc, float satLimit, float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, const LUTf & clToningcurve, const LUTf & cl2Toningcurve, float iplow, float iphigh, double wp[3][3], double wip[3][3]); void toning2col(float r, float g, float b, float &ro, float &go, float &bo, float iplow, float iphigh, float rl, float gl, float bl, float rh, float gh, float bh, float SatLow, float SatHigh, float balanS, float balanH, float reducac, int mode, int preser, float strProtect); void toningsmh(float r, float g, float b, float &ro, float &go, float &bo, float RedLow, float GreenLow, float BlueLow, float RedMed, float GreenMed, float BlueMed, float RedHigh, float GreenHigh, float BlueHigh, float reducac, int mode, float strProtect); void toningsmh2(float r, float g, float b, float &ro, float &go, float &bo, float low[3], float satLow, float med[3], float satMed, float high[3], float satHigh, float reducac, int mode, int preser); @@ -141,12 +146,12 @@ public: void retreavergb(float &r, float &g, float &b); void moyeqt(Imagefloat* working, float &moyS, float &eqty); - void luminanceCurve(LabImage* lold, LabImage* lnew, LUTf &curve); + void luminanceCurve(LabImage* lold, LabImage* lnew, const LUTf &curve); void ciecam_02float(CieImage* ncie, float adap, int pW, int pwb, LabImage* lab, const procparams::ProcParams* params, const ColorAppearance & customColCurve1, const ColorAppearance & customColCurve, const ColorAppearance & customColCurve3, LUTu &histLCAM, LUTu &histCCAM, LUTf & CAMBrightCurveJ, LUTf & CAMBrightCurveQ, float &mean, int Iterates, int scale, bool execsharp, float &d, float &dj, float &yb, int rtt, bool showSharpMask = false); - void chromiLuminanceCurve(PipetteBuffer *pipetteBuffer, int pW, LabImage* lold, LabImage* lnew, LUTf &acurve, LUTf &bcurve, LUTf & satcurve, LUTf & satclcurve, LUTf &clcurve, LUTf &curve, bool utili, bool autili, bool butili, bool ccutili, bool cclutili, bool clcutili, LUTu &histCCurve, LUTu &histLurve); + void chromiLuminanceCurve(PipetteBuffer *pipetteBuffer, int pW, LabImage* lold, LabImage* lnew, const LUTf& acurve, const LUTf& bcurve, const LUTf& satcurve, const LUTf& satclcurve, const LUTf& clcurve, LUTf &curve, bool utili, bool autili, bool butili, bool ccutili, bool cclutili, bool clcutili, LUTu &histCCurve, LUTu &histLurve); void vibrance(LabImage* lab); //Jacques' vibrance // void colorCurve (LabImage* lold, LabImage* lnew); void sharpening(LabImage* lab, const procparams::SharpeningParams &sharpenParam, bool showMask = false); diff --git a/rtengine/pdaflinesfilter.cc b/rtengine/pdaflinesfilter.cc index 8ac0d3091..1eddbc1ea 100644 --- a/rtengine/pdaflinesfilter.cc +++ b/rtengine/pdaflinesfilter.cc @@ -206,7 +206,7 @@ std::unique_ptr PDAFLinesFilter::lineD } -int PDAFLinesFilter::markLine(array2D &rawData, PixelsMap &bpMap, int y) +int PDAFLinesFilter::markLine(const array2D &rawData, PixelsMap &bpMap, int y) { rowmap_.clear(); rowmap_.resize((W_+1)/2, false); @@ -258,7 +258,7 @@ int PDAFLinesFilter::markLine(array2D &rawData, PixelsMap &bpMap, int y) } -int PDAFLinesFilter::mark(array2D &rawData, PixelsMap &bpMap) +int PDAFLinesFilter::mark(const array2D &rawData, PixelsMap &bpMap) { if (pattern_.empty()) { diff --git a/rtengine/pdaflinesfilter.h b/rtengine/pdaflinesfilter.h index c3d8b47f4..707eb9371 100644 --- a/rtengine/pdaflinesfilter.h +++ b/rtengine/pdaflinesfilter.h @@ -36,12 +36,12 @@ public: explicit PDAFLinesFilter(RawImage *ri); ~PDAFLinesFilter(); - int mark(array2D &rawData, PixelsMap &bpMap); + int mark(const array2D &rawData, PixelsMap &bpMap); RawImageSource::GreenEqulibrateThreshold &greenEqThreshold(); std::unique_ptr lineDenoiseRowBlender(); private: - int markLine(array2D &rawData, PixelsMap &bpMap, int y); + int markLine(const array2D& rawData, PixelsMap &bpMap, int y); RawImage *ri_; int W_; diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 3c89fe48d..c35fc7431 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -802,17 +802,7 @@ private: void stage_denoise() { - procparams::ProcParams& params = job->pparams; - //ImProcFunctions ipf (¶ms, true); - ImProcFunctions &ipf = * (ipf_p.get()); - - // perform luma/chroma denoise -// CieImage *cieView; -// NoisCurve noiseLCurve; -// bool lldenoiseutili=false; -// Imagefloat *calclum ; -// params.dirpyrDenoise.getCurves(noiseLCurve, lldenoiseutili); -// if (params.dirpyrDenoise.enabled && lldenoiseutili) { + const procparams::ProcParams& params = job->pparams; DirPyrDenoiseParams denoiseParams = params.dirpyrDenoise; // make a copy because we cheat here @@ -845,9 +835,7 @@ private: } if (denoiseParams.enabled) { - // CurveFactory::denoiseLL(lldenoiseutili, denoiseParams.lcurve, Noisecurve,1); - //denoiseParams.getCurves(noiseLCurve); -// ipf.RGB_denoise(baseImg, baseImg, calclum, imgsrc->isRAW(), denoiseParams, params.defringe, imgsrc->getDirPyrDenoiseExpComp(), noiseLCurve, lldenoiseutili); + ImProcFunctions &ipf = * (ipf_p.get()); float nresi, highresi; int kall = 2; ipf.RGB_denoise (kall, baseImg, baseImg, calclum, ch_M, max_r, max_b, imgsrc->isRAW(), denoiseParams, imgsrc->getDirPyrDenoiseExpComp(), noiseLCurve, noiseCCurve, nresi, highresi); @@ -869,7 +857,7 @@ private: void stage_transform() { - procparams::ProcParams& params = job->pparams; + const procparams::ProcParams& params = job->pparams; //ImProcFunctions ipf (¶ms, true); ImProcFunctions &ipf = * (ipf_p.get()); @@ -1084,13 +1072,10 @@ private: ipf.vibrance (labView); ipf.labColorCorrectionRegions(labView); - if ((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) { - ipf.impulsedenoise (labView); - } - // for all treatments Defringe, Sharpening, Contrast detail ,Microcontrast they are activated if "CIECAM" function are disabled if ((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) { + ipf.impulsedenoise (labView); ipf.defringe (labView); } diff --git a/rtgui/adjuster.cc b/rtgui/adjuster.cc index 302a2de00..2267a9fc1 100644 --- a/rtgui/adjuster.cc +++ b/rtgui/adjuster.cc @@ -246,7 +246,7 @@ void Adjuster::autoToggled () } if (adjusterListener != nullptr && !blocked) { - adjusterListener->adjusterAutoToggled(this, automatic->get_active()); + adjusterListener->adjusterAutoToggled(this); } } @@ -493,7 +493,7 @@ bool Adjuster::notifyListenerAutoToggled () { if (adjusterListener != nullptr && !blocked) { - adjusterListener->adjusterAutoToggled(this, automatic->get_active()); + adjusterListener->adjusterAutoToggled(this); } return false; diff --git a/rtgui/adjuster.h b/rtgui/adjuster.h index 9800dbac8..59250bc81 100644 --- a/rtgui/adjuster.h +++ b/rtgui/adjuster.h @@ -28,7 +28,7 @@ class AdjusterListener public: virtual ~AdjusterListener() = default; virtual void adjusterChanged (Adjuster* a, double newval) = 0; - virtual void adjusterAutoToggled (Adjuster* a, bool newval) {} + virtual void adjusterAutoToggled (Adjuster* a) {} }; typedef double(*double2double_fun)(double val); diff --git a/rtgui/batchqueue.cc b/rtgui/batchqueue.cc index afbec9efb..0b2f5de14 100644 --- a/rtgui/batchqueue.cc +++ b/rtgui/batchqueue.cc @@ -344,9 +344,8 @@ bool BatchQueue::loadBatchQueue () auto job = rtengine::ProcessingJob::create (source, thumb->getType () == FT_Raw, pparams, fast); - auto prevh = getMaxThumbnailHeight (); - auto prevw = prevh; - thumb->getThumbnailSize (prevw, prevh, &pparams); + const auto prevh = getMaxThumbnailHeight (); + const auto prevw = thumb->getThumbnailWidth(prevh, &pparams); auto entry = new BatchQueueEntry (job, pparams, source, prevw, prevh, thumb, options.overwriteOutputFile); thumb->decreaseRef (); // Removing the refCount acquired by cacheMgr->getEntry diff --git a/rtgui/batchqueuepanel.cc b/rtgui/batchqueuepanel.cc index 9107aaaa8..f7a73a30b 100644 --- a/rtgui/batchqueuepanel.cc +++ b/rtgui/batchqueuepanel.cc @@ -18,7 +18,6 @@ */ #include "batchqueuepanel.h" #include "options.h" -#include "preferences.h" #include "multilangmgr.h" #include "rtwindow.h" #include "soundman.h" diff --git a/rtgui/bayerprocess.cc b/rtgui/bayerprocess.cc index 4a57177e1..5b5cfe9c4 100644 --- a/rtgui/bayerprocess.cc +++ b/rtgui/bayerprocess.cc @@ -672,7 +672,7 @@ void BayerProcess::checkBoxToggled (CheckBox* c, CheckValue newval) } } -void BayerProcess::adjusterAutoToggled(Adjuster* a, bool newval) +void BayerProcess::adjusterAutoToggled(Adjuster* a) { if (multiImage) { if (dualDemosaicContrast->getAutoInconsistent()) { diff --git a/rtgui/bayerprocess.h b/rtgui/bayerprocess.h index 5c7498986..f8348e02b 100644 --- a/rtgui/bayerprocess.h +++ b/rtgui/bayerprocess.h @@ -88,7 +88,7 @@ public: void methodChanged(); void imageNumberChanged(); void adjusterChanged(Adjuster* a, double newval) override; - void adjusterAutoToggled (Adjuster* a, bool newval) override; + void adjusterAutoToggled (Adjuster* a) override; void checkBoxToggled(CheckBox* c, CheckValue newval) override; void pixelShiftMotionMethodChanged(); void pixelShiftDemosaicMethodChanged(); diff --git a/rtgui/colorappearance.cc b/rtgui/colorappearance.cc index 9a6bee524..62f6eee2c 100644 --- a/rtgui/colorappearance.cc +++ b/rtgui/colorappearance.cc @@ -1565,7 +1565,7 @@ void ColorAppearance::adjusterChanged(Adjuster* a, double newval) } } -void ColorAppearance::adjusterAutoToggled(Adjuster* a, bool newval) +void ColorAppearance::adjusterAutoToggled(Adjuster* a) { if (multiImage) { if (degree->getAutoInconsistent()) { diff --git a/rtgui/colorappearance.h b/rtgui/colorappearance.h index 170212ffe..c42bca774 100644 --- a/rtgui/colorappearance.h +++ b/rtgui/colorappearance.h @@ -47,7 +47,7 @@ public: void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; void setBatchMode (bool batchMode) override; void adjusterChanged (Adjuster* a, double newval) override; - void adjusterAutoToggled (Adjuster* a, bool newval) override; + void adjusterAutoToggled (Adjuster* a) override; // void adjusterAdapToggled (Adjuster* a, bool newval); void enabledChanged () override; void surroundChanged (); diff --git a/rtgui/cropwindow.cc b/rtgui/cropwindow.cc index f44e78a56..417786e5b 100644 --- a/rtgui/cropwindow.cc +++ b/rtgui/cropwindow.cc @@ -259,7 +259,7 @@ void CropWindow::getCropAnchorPosition (int& x, int& y) cropHandler.getAnchorPosition(x, y); } -void CropWindow::setCropAnchorPosition (int& x, int& y) +void CropWindow::setCropAnchorPosition (int x, int y) { cropHandler.setAnchorPosition(x, y); } diff --git a/rtgui/cropwindow.h b/rtgui/cropwindow.h index db44a2508..0a66506a4 100644 --- a/rtgui/cropwindow.h +++ b/rtgui/cropwindow.h @@ -224,7 +224,7 @@ public: void centerCrop (bool update = true); void getCropSize (int& w, int& h); void getCropAnchorPosition (int& w, int& h); - void setCropAnchorPosition (int& w, int& h); + void setCropAnchorPosition (int w, int h); // listeners void setCropGUIListener (CropGUIListener* cgl); diff --git a/rtgui/curveeditorgroup.h b/rtgui/curveeditorgroup.h index 7a5d3a074..5ef13656b 100644 --- a/rtgui/curveeditorgroup.h +++ b/rtgui/curveeditorgroup.h @@ -23,7 +23,6 @@ #include -#include "adjuster.h" #include "guiutils.h" #include "mycurve.h" #include "shcselector.h" diff --git a/rtgui/diagonalcurveeditorsubgroup.h b/rtgui/diagonalcurveeditorsubgroup.h index 184fa576f..a077da807 100644 --- a/rtgui/diagonalcurveeditorsubgroup.h +++ b/rtgui/diagonalcurveeditorsubgroup.h @@ -21,7 +21,7 @@ #include #include "curveeditorgroup.h" - +#include "adjuster.h" #include "../rtengine/noncopyable.h" class DiagonalCurveEditor; diff --git a/rtgui/editwidgets.h b/rtgui/editwidgets.h index d31451ecb..c902f136a 100644 --- a/rtgui/editwidgets.h +++ b/rtgui/editwidgets.h @@ -285,7 +285,7 @@ public: rtengine::Coord end; Line (); - Line (rtengine::Coord& begin, rtengine::Coord& end); + Line (const rtengine::Coord& begin, const rtengine::Coord& end); Line (int beginX, int beginY, int endX, int endY); void drawOuterGeometry (Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem) override; @@ -532,7 +532,7 @@ inline Circle::Circle (int centerX, int centerY, int radius, bool filled, radiusInImageSpace) { } -inline Line::Line (rtengine::Coord& begin, rtengine::Coord& end) : +inline Line::Line (const rtengine::Coord& begin, const rtengine::Coord& end) : begin (begin), end (end) { } diff --git a/rtgui/editwindow.cc b/rtgui/editwindow.cc index 11c0be4e2..d4bbdb9ba 100644 --- a/rtgui/editwindow.cc +++ b/rtgui/editwindow.cc @@ -18,11 +18,9 @@ #include "editwindow.h" #include "../rtengine/procparams.h" #include "options.h" -#include "preferences.h" #include "cursormanager.h" #include "rtwindow.h" #include -#include "rtimage.h" #include "threadutils.h" extern Glib::ustring argv0; diff --git a/rtgui/exportpanel.h b/rtgui/exportpanel.h index f70e47386..7ae7e043c 100644 --- a/rtgui/exportpanel.h +++ b/rtgui/exportpanel.h @@ -21,7 +21,6 @@ #include -#include "adjuster.h" #include "guiutils.h" class ExportPanelListener diff --git a/rtgui/extprog.cc b/rtgui/extprog.cc index a7a757c1b..fc6e06f72 100644 --- a/rtgui/extprog.cc +++ b/rtgui/extprog.cc @@ -137,13 +137,11 @@ bool ExtProgStore::searchProgram (const Glib::ustring& name, action.name = name; action.target = (allowRaw ? 1 : 2); - auto& filePath = action.filePathEXE; - if (maxVer > 0) { for (auto ver = maxVer; ver >= 0; ver--) { - filePath = progFilesDir + "\\" + Glib::ustring::compose(exePath, ver); + auto filePath = progFilesDir + "\\" + Glib::ustring::compose(exePath, ver); if (Glib::file_test (filePath, Glib::FILE_TEST_EXISTS)) { break; @@ -157,14 +155,12 @@ bool ExtProgStore::searchProgram (const Glib::ustring& name, break; } } - - filePath.clear (); } } else { do { - filePath = progFilesDir + "\\" + exePath; + auto filePath = progFilesDir + "\\" + exePath; if (Glib::file_test (filePath, Glib::FILE_TEST_EXISTS)) { break; @@ -178,9 +174,6 @@ bool ExtProgStore::searchProgram (const Glib::ustring& name, break; } } - - filePath.clear (); - } while (false); } @@ -279,9 +272,9 @@ bool ExtProgStore::openInGimp (const Glib::ustring& fileName) for (auto ver = 12; ver >= 0; --ver) { executable = Glib::build_filename (options.gimpDir, "bin", Glib::ustring::compose (Glib::ustring("gimp-2.%1.exe"), ver)); - auto success = ShellExecute( NULL, "open", executable.c_str(), fileName.c_str(), NULL, SW_SHOWNORMAL ); + auto lsuccess = ShellExecute( NULL, "open", executable.c_str(), fileName.c_str(), NULL, SW_SHOWNORMAL ); - if ((uintptr_t)success > 32) { + if ((uintptr_t)lsuccess > 32) { return true; } } diff --git a/rtgui/filebrowser.cc b/rtgui/filebrowser.cc index 3dcb573ca..d774cdb28 100644 --- a/rtgui/filebrowser.cc +++ b/rtgui/filebrowser.cc @@ -114,16 +114,16 @@ void findOriginalEntries (const std::vector& entries) // Find the original image for each bucket for (BasenameIterator bucket = byBasename.begin (); bucket != byBasename.end (); ++bucket) { - const EntryVector& entries = bucket->second; + const EntryVector& lentries = bucket->second; ThumbBrowserEntryBase* original = nullptr; // Select the most likely original in a first pass... - for (EntryIterator entry = entries.begin (); entry != entries.end (); ++entry) { + for (EntryIterator entry = lentries.begin (); entry != lentries.end (); ++entry) { original = selectOriginalEntry (original, *entry); } // ...and link all other images to it in a second pass. - for (EntryIterator entry = entries.begin (); entry != entries.end (); ++entry) { + for (EntryIterator entry = lentries.begin (); entry != lentries.end (); ++entry) { (*entry)->setOriginal (*entry != original ? original : nullptr); } } diff --git a/rtgui/filebrowserentry.cc b/rtgui/filebrowserentry.cc index 9da4044c1..3129e93e2 100644 --- a/rtgui/filebrowserentry.cc +++ b/rtgui/filebrowserentry.cc @@ -118,7 +118,7 @@ void FileBrowserEntry::calcThumbnailSize () { if (thumbnail) { - thumbnail->getThumbnailSize (prew, preh); + prew = thumbnail->getThumbnailWidth(preh); } } diff --git a/rtgui/filebrowserentry.h b/rtgui/filebrowserentry.h index 1bdbb2ecb..ea5140ed6 100644 --- a/rtgui/filebrowserentry.h +++ b/rtgui/filebrowserentry.h @@ -23,7 +23,6 @@ #include -#include "crophandler.h" #include "editenums.h" #include "filethumbnailbuttonset.h" #include "imageareatoollistener.h" diff --git a/rtgui/filecatalog.cc b/rtgui/filecatalog.cc index a2622e52c..ce9883cdb 100644 --- a/rtgui/filecatalog.cc +++ b/rtgui/filecatalog.cc @@ -1222,9 +1222,8 @@ void FileCatalog::developRequested(const std::vector& tbe, bo rtengine::ProcessingJob* pjob = rtengine::ProcessingJob::create (fbe->filename, th->getType() == FT_Raw, params, fastmode && options.fastexport_use_fast_pipeline); - int pw; - int ph = BatchQueue::calcMaxThumbnailHeight(); - th->getThumbnailSize (pw, ph); + const int ph = BatchQueue::calcMaxThumbnailHeight(); + const int pw = th->getThumbnailWidth(ph); // processThumbImage is the processing intensive part, but adding to queue must be ordered //#pragma omp ordered diff --git a/rtgui/flatfield.cc b/rtgui/flatfield.cc index ff0c0f9dd..7433fd4de 100644 --- a/rtgui/flatfield.cc +++ b/rtgui/flatfield.cc @@ -252,7 +252,7 @@ void FlatField::adjusterChanged(Adjuster* a, double newval) } } -void FlatField::adjusterAutoToggled (Adjuster* a, bool newval) +void FlatField::adjusterAutoToggled (Adjuster* a) { if (multiImage) { if (flatFieldClipControl->getAutoInconsistent()) { diff --git a/rtgui/flatfield.h b/rtgui/flatfield.h index d20a96acd..5cbc49684 100644 --- a/rtgui/flatfield.h +++ b/rtgui/flatfield.h @@ -79,7 +79,7 @@ public: void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; void adjusterChanged (Adjuster* a, double newval) override; - void adjusterAutoToggled (Adjuster* a, bool newval) override; + void adjusterAutoToggled (Adjuster* a) override; void flatFieldFileChanged (); void flatFieldFile_Reset (); void flatFieldAutoSelectChanged (); diff --git a/rtgui/guiutils.cc b/rtgui/guiutils.cc index d6ede26da..7051dbeea 100644 --- a/rtgui/guiutils.cc +++ b/rtgui/guiutils.cc @@ -946,22 +946,21 @@ bool MyScrolledWindow::on_scroll_event (GdkEventScroll* event) const double lowerBound = adjust->get_lower(); double value = adjust->get_value(); double step = adjust->get_step_increment(); - double value2 = 0.; if (event->direction == GDK_SCROLL_DOWN) { - value2 = rtengine::min(value + step, upperBound); + double value2 = rtengine::min(value + step, upperBound); if (value2 != value) { scroll->set_value(value2); } } else if (event->direction == GDK_SCROLL_UP) { - value2 = rtengine::max(value - step, lowerBound); + double value2 = rtengine::max(value - step, lowerBound); if (value2 != value) { scroll->set_value(value2); } } else if (event->direction == GDK_SCROLL_SMOOTH) { - value2 = rtengine::LIM(value + event->delta_y * step, lowerBound, upperBound); + double value2 = rtengine::LIM(value + event->delta_y * step, lowerBound, upperBound); if (value2 != value) { scroll->set_value(value2); diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index ddf60ca75..dd0cbde46 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -983,7 +983,7 @@ void HistogramArea::on_realize () } void HistogramArea::drawCurve(Cairo::RefPtr &cr, - LUTu & data, double scale, int hsize, int vsize) + const LUTu & data, double scale, int hsize, int vsize) { double s = RTScalable::getScale(); @@ -1013,7 +1013,7 @@ void HistogramArea::drawCurve(Cairo::RefPtr &cr, } void HistogramArea::drawMarks(Cairo::RefPtr &cr, - LUTu & data, double scale, int hsize, int & ui, int & oi) + const LUTu & data, double scale, int hsize, int & ui, int & oi) { int s = 8 * RTScalable::getScale(); diff --git a/rtgui/histogrampanel.h b/rtgui/histogrampanel.h index 23b065534..4fd21bcc2 100644 --- a/rtgui/histogrampanel.h +++ b/rtgui/histogrampanel.h @@ -165,8 +165,8 @@ public: type_signal_factor_changed signal_factor_changed(); private: - void drawCurve(Cairo::RefPtr &cr, LUTu & data, double scale, int hsize, int vsize); - void drawMarks(Cairo::RefPtr &cr, LUTu & data, double scale, int hsize, int & ui, int & oi); + void drawCurve(Cairo::RefPtr &cr, const LUTu & data, double scale, int hsize, int vsize); + void drawMarks(Cairo::RefPtr &cr, const LUTu & data, double scale, int hsize, int & ui, int & oi); Gtk::SizeRequestMode get_request_mode_vfunc () const override; void get_preferred_height_vfunc (int& minimum_height, int& natural_height) const override; void get_preferred_width_vfunc (int &minimum_width, int &natural_width) const override; diff --git a/rtgui/hsvequalizer.h b/rtgui/hsvequalizer.h index 987fd20b2..77c1ee1b0 100644 --- a/rtgui/hsvequalizer.h +++ b/rtgui/hsvequalizer.h @@ -20,7 +20,6 @@ #include -#include "adjuster.h" #include "colorprovider.h" #include "curvelistener.h" #include "guiutils.h" @@ -58,6 +57,5 @@ public: void autoOpenCurve () override; void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller) override; - //void adjusterChanged (Adjuster* a, double newval); void enabledChanged() override; }; diff --git a/rtgui/lockablecolorpicker.cc b/rtgui/lockablecolorpicker.cc index cb334c7e4..a544ea991 100644 --- a/rtgui/lockablecolorpicker.cc +++ b/rtgui/lockablecolorpicker.cc @@ -240,7 +240,7 @@ void LockableColorPicker::updateBackBuffer () } -void LockableColorPicker::draw (Cairo::RefPtr &cr) +void LockableColorPicker::draw (const Cairo::RefPtr &cr) { if (validity == Validity::OUTSIDE) { return; @@ -284,7 +284,7 @@ void LockableColorPicker::setRGB (const float R, const float G, const float B, c } } -void LockableColorPicker::getImagePosition (rtengine::Coord &imgPos) +void LockableColorPicker::getImagePosition (rtengine::Coord &imgPos) const { imgPos = position; } @@ -328,7 +328,7 @@ void LockableColorPicker::setSize (Size newSize) } } -LockableColorPicker::Size LockableColorPicker::getSize () +LockableColorPicker::Size LockableColorPicker::getSize () const { return size; } diff --git a/rtgui/lockablecolorpicker.h b/rtgui/lockablecolorpicker.h index eadf71773..7f320f8b6 100644 --- a/rtgui/lockablecolorpicker.h +++ b/rtgui/lockablecolorpicker.h @@ -74,14 +74,14 @@ public: LockableColorPicker (CropWindow* cropWindow, Glib::ustring *oProfile, Glib::ustring *wProfile); - void draw (Cairo::RefPtr &cr); + void draw (const Cairo::RefPtr &cr); // Used to update the RGB color, the HSV values will be updated accordingly void setPosition (const rtengine::Coord &newPos); void setRGB (const float R, const float G, const float B, const float previewR, const float previewG, const float previewB); - void getImagePosition (rtengine::Coord &imgPos); + void getImagePosition (rtengine::Coord &imgPos) const; void getScreenPosition (rtengine::Coord &screenPos); - Size getSize (); + Size getSize () const; bool isOver (int x, int y); void setValidity (Validity isValid); void setSize (Size newSize); diff --git a/rtgui/lwbutton.cc b/rtgui/lwbutton.cc index c6c75584d..26d36f9e0 100644 --- a/rtgui/lwbutton.cc +++ b/rtgui/lwbutton.cc @@ -153,7 +153,7 @@ bool LWButton::releaseNotify (int x, int y) { bool in = inside (x, y); - State nstate = state; + State nstate; bool action = false; if (in && (state == Pressed_In || state == Pressed_Out)) { diff --git a/rtgui/mydiagonalcurve.cc b/rtgui/mydiagonalcurve.cc index 9aa52c67e..abd339ce0 100644 --- a/rtgui/mydiagonalcurve.cc +++ b/rtgui/mydiagonalcurve.cc @@ -592,7 +592,6 @@ bool MyDiagonalCurve::handleEvents (GdkEvent* event) curve.x.insert (itx, 0); curve.y.insert (ity, 0); - num++; // the graph is refreshed only if a new point is created curve.x.at(closest_point) = clampedX; @@ -1504,7 +1503,7 @@ void MyDiagonalCurve::setActiveParam (int ac) queue_draw (); } -void MyDiagonalCurve::updateBackgroundHistogram (LUTu & hist) +void MyDiagonalCurve::updateBackgroundHistogram (const LUTu & hist) { if (hist) { //memcpy (bghist, hist, 256*sizeof(unsigned int)); diff --git a/rtgui/mydiagonalcurve.h b/rtgui/mydiagonalcurve.h index a71c0565c..b38373006 100644 --- a/rtgui/mydiagonalcurve.h +++ b/rtgui/mydiagonalcurve.h @@ -85,7 +85,7 @@ public: bool handleEvents (GdkEvent* event) override; void setActiveParam (int ac); void reset (const std::vector &resetCurve, double identityValue = 0.5) override; - void updateBackgroundHistogram (LUTu & hist); + void updateBackgroundHistogram (const LUTu & hist); void pipetteMouseOver (CurveEditor *ce, EditDataProvider *provider, int modifierKey) override; bool pipetteButton1Pressed(EditDataProvider *provider, int modifierKey) override; diff --git a/rtgui/myflatcurve.cc b/rtgui/myflatcurve.cc index f01fb0066..362d34f35 100644 --- a/rtgui/myflatcurve.cc +++ b/rtgui/myflatcurve.cc @@ -653,7 +653,6 @@ bool MyFlatCurve::handleEvents (GdkEvent* event) curve.y.insert (ity, 0); curve.leftTangent.insert (itlt, 0); curve.rightTangent.insert (itrt, 0); - num++; if (mod_type & GDK_CONTROL_MASK) { clampedY = point.getVal01(clampedX); diff --git a/rtgui/pdsharpening.cc b/rtgui/pdsharpening.cc index 4f5416c82..18fa7aa2a 100644 --- a/rtgui/pdsharpening.cc +++ b/rtgui/pdsharpening.cc @@ -270,7 +270,7 @@ void PdSharpening::autoRadiusChanged(double autoRadius) ); } -void PdSharpening::adjusterAutoToggled(Adjuster* a, bool newval) +void PdSharpening::adjusterAutoToggled(Adjuster* a) { if (multiImage) { if (a->getAutoInconsistent()) { diff --git a/rtgui/pdsharpening.h b/rtgui/pdsharpening.h index 7d971eaee..eb0576ceb 100644 --- a/rtgui/pdsharpening.h +++ b/rtgui/pdsharpening.h @@ -59,7 +59,7 @@ public: void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; void setBatchMode (bool batchMode) override; - void adjusterAutoToggled (Adjuster* a, bool newval) override; + void adjusterAutoToggled (Adjuster* a) override; void adjusterChanged (Adjuster* a, double newval) override; void enabledChanged () override; diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index 0bce37af2..68ef3b9ce 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -128,7 +128,7 @@ Preferences::~Preferences () get_size (options.preferencesWidth, options.preferencesHeight); } -int Preferences::getThemeRowNumber (Glib::ustring& longThemeFName) +int Preferences::getThemeRowNumber (const Glib::ustring& longThemeFName) { if (regex->match (longThemeFName + ".css", matchInfo)) { diff --git a/rtgui/preferences.h b/rtgui/preferences.h index b4b90e669..76a104ffa 100644 --- a/rtgui/preferences.h +++ b/rtgui/preferences.h @@ -22,7 +22,6 @@ #include -#include "adjuster.h" #include "dynamicprofilepanel.h" #include "options.h" #include "../rtengine/profilestore.h" @@ -249,7 +248,7 @@ class Preferences : void switchFontTo (const Glib::ustring &newFontFamily, const int newFontSize); bool splashClosed (GdkEventAny* event); - int getThemeRowNumber (Glib::ustring& longThemeFName); + int getThemeRowNumber (const Glib::ustring& longThemeFName); void appendBehavList (Gtk::TreeModel::iterator& parent, Glib::ustring label, int id, bool set); diff --git a/rtgui/previewmodepanel.h b/rtgui/previewmodepanel.h index 98160a5e3..4121dfb92 100644 --- a/rtgui/previewmodepanel.h +++ b/rtgui/previewmodepanel.h @@ -19,8 +19,6 @@ #include -#include "adjuster.h" - class ImageArea; class PreviewModePanel : diff --git a/rtgui/previewwindow.cc b/rtgui/previewwindow.cc index 6268fe3d2..67fa87e0c 100644 --- a/rtgui/previewwindow.cc +++ b/rtgui/previewwindow.cc @@ -230,7 +230,7 @@ bool PreviewWindow::on_motion_notify_event (GdkEventMotion* event) if (x>imgX || y>imgY || w < imgW || h < imgH) { bool inside = event->x > x - 6 && event->x < x + w - 1 + 6 && event->y > y - 6 && event->y < y + h - 1 + 6; - CursorShape newType = cursor_type; + CursorShape newType; if (isMoving) { mainCropWin->remoteMove ((event->x - press_x) / zoom, (event->y - press_y) / zoom); diff --git a/rtgui/progressconnector.h b/rtgui/progressconnector.h index eb6eb3a66..45575177f 100644 --- a/rtgui/progressconnector.h +++ b/rtgui/progressconnector.h @@ -79,9 +79,9 @@ class ProgressConnector static int emitEndSignalUI (void* data) { - sigc::signal0* opEnd = (sigc::signal0*) data; - int r = opEnd->emit (); - delete opEnd; + sigc::signal0* lopEnd = (sigc::signal0*) data; + int r = lopEnd->emit (); + delete lopEnd; return r; } diff --git a/rtgui/rgbcurves.h b/rtgui/rgbcurves.h index 5ed2ea540..edc80eb41 100644 --- a/rtgui/rgbcurves.h +++ b/rtgui/rgbcurves.h @@ -20,7 +20,6 @@ #include -#include "adjuster.h" #include "colorprovider.h" #include "curvelistener.h" #include "toolpanel.h" diff --git a/rtgui/rtwindow.cc b/rtgui/rtwindow.cc index ae7072d88..6d338f388 100644 --- a/rtgui/rtwindow.cc +++ b/rtgui/rtwindow.cc @@ -44,14 +44,14 @@ extern unsigned char initialGdkScale; static gboolean osx_should_quit_cb (GtkosxApplication *app, gpointer data) { - RTWindow *rtWin = (RTWindow *)data; + RTWindow *rtWin = static_cast(data); return rtWin->on_delete_event (0); } static void osx_will_quit_cb (GtkosxApplication *app, gpointer data) { - RTWindow *rtWin = (RTWindow *)data; + RTWindow *rtWin = static_cast(data); rtWin->on_delete_event (0); gtk_main_quit (); } @@ -75,7 +75,7 @@ bool RTWindow::osxFileOpenEvent (Glib::ustring path) static gboolean osx_open_file_cb (GtkosxApplication *app, gchar *path_, gpointer data) { - RTWindow *rtWin = (RTWindow *)data; + RTWindow *rtWin = static_cast(data); if (!argv1.empty()) { // skip handling if we have a file argument or else we get double open of same file @@ -232,13 +232,6 @@ RTWindow::RTWindow () } } -#ifndef NDEBUG - else if (!screen) { - printf ("ERROR: Can't get default screen!\n"); - } - -#endif - // ------- end loading theme files RTScalable::init(this); diff --git a/rtgui/saveasdlg.h b/rtgui/saveasdlg.h index e4567f69b..448b37fd7 100644 --- a/rtgui/saveasdlg.h +++ b/rtgui/saveasdlg.h @@ -20,7 +20,6 @@ #include -#include "adjuster.h" #include "saveformatpanel.h" class SaveAsDialog : diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc index cd7470263..fc1df1b4b 100644 --- a/rtgui/thumbnail.cc +++ b/rtgui/thumbnail.cc @@ -590,10 +590,8 @@ void Thumbnail::decreaseRef () cachemgr->closeThumbnail (this); } -void Thumbnail::getThumbnailSize (int &w, int &h, const rtengine::procparams::ProcParams *pparams) +int Thumbnail::getThumbnailWidth (const int &h, const rtengine::procparams::ProcParams *pparams) const { - MyMutex::MyLock lock(mutex); - int tw_ = tw; int th_ = th; float imgRatio_ = imgRatio; @@ -613,20 +611,17 @@ void Thumbnail::getThumbnailSize (int &w, int &h, const rtengine::procparams::Pr if (thisCoarse != ppCoarse) { // different orientation -> swapping width & height - int tmp = th_; - th_ = tw_; - tw_ = tmp; - + std::swap(th_, tw_); if (imgRatio_ >= 0.0001f) { imgRatio_ = 1.f / imgRatio_; } } } - if (imgRatio_ > 0.) { - w = (int)(imgRatio_ * (float)h); + if (imgRatio_ > 0.f) { + return imgRatio_ * h; } else { - w = tw_ * h / th_; + return tw_ * h / th_; } } diff --git a/rtgui/thumbnail.h b/rtgui/thumbnail.h index aee5ee0a6..7e466bf07 100644 --- a/rtgui/thumbnail.h +++ b/rtgui/thumbnail.h @@ -119,7 +119,7 @@ public: // unsigned char* getThumbnailImage (int &w, int &h, int fixwh=1); // fixwh = 0: fix w and calculate h, =1: fix h and calculate w rtengine::IImage8* processThumbImage (const rtengine::procparams::ProcParams& pparams, int h, double& scale); rtengine::IImage8* upgradeThumbImage (const rtengine::procparams::ProcParams& pparams, int h, double& scale); - void getThumbnailSize (int &w, int &h, const rtengine::procparams::ProcParams *pparams = nullptr); + int getThumbnailWidth (const int &h, const rtengine::procparams::ProcParams *pparams = nullptr) const; void getFinalSize (const rtengine::procparams::ProcParams& pparams, int& w, int& h); void getOriginalSize (int& w, int& h); diff --git a/rtgui/toolbar.cc b/rtgui/toolbar.cc index 38ade6566..99c4196c6 100644 --- a/rtgui/toolbar.cc +++ b/rtgui/toolbar.cc @@ -20,6 +20,7 @@ #include "toolbar.h" #include "multilangmgr.h" #include "guiutils.h" +#include "lockablecolorpicker.h" #include "rtimage.h" ToolBar::ToolBar () : showColPickers(true), listener (nullptr), pickerListener(nullptr) diff --git a/rtgui/toolbar.h b/rtgui/toolbar.h index e6d99f819..8ec6bb615 100644 --- a/rtgui/toolbar.h +++ b/rtgui/toolbar.h @@ -20,10 +20,10 @@ #include -#include "lockablecolorpicker.h" #include "toolenum.h" class RTImage; +class LockablePickerToolListener; class ToolBarListener { diff --git a/rtgui/xtransprocess.cc b/rtgui/xtransprocess.cc index 52c46be65..a371bad88 100644 --- a/rtgui/xtransprocess.cc +++ b/rtgui/xtransprocess.cc @@ -225,7 +225,7 @@ void XTransProcess::adjusterChanged(Adjuster* a, double newval) } } -void XTransProcess::adjusterAutoToggled(Adjuster* a, bool newval) +void XTransProcess::adjusterAutoToggled(Adjuster* a) { if (multiImage) { if (dualDemosaicContrast->getAutoInconsistent()) { diff --git a/rtgui/xtransprocess.h b/rtgui/xtransprocess.h index d6cb120e0..fc0dd7502 100644 --- a/rtgui/xtransprocess.h +++ b/rtgui/xtransprocess.h @@ -66,5 +66,5 @@ public: void autoContrastChanged (double autoContrast) override; void adjusterChanged(Adjuster* a, double newval) override; void checkBoxToggled(CheckBox* c, CheckValue newval) override; - void adjusterAutoToggled(Adjuster* a, bool newval) override; + void adjusterAutoToggled(Adjuster* a) override; }; From 79431ffa1dee0debf61eb0a1e2d92da608212307 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 26 Nov 2019 19:42:48 +0100 Subject: [PATCH 182/208] Some changes suggested by @Floessie --- rtengine/improcfun.cc | 4 ++-- rtgui/batchqueue.cc | 2 +- rtgui/batchqueue.h | 2 +- rtgui/extprog.cc | 20 ++++++++++++-------- rtgui/filebrowser.cc | 35 +++++++++++++++-------------------- rtgui/filebrowser.h | 2 +- rtgui/guiutils.cc | 6 +++--- rtgui/lockablecolorpicker.cc | 2 +- rtgui/lockablecolorpicker.h | 2 +- rtgui/progressconnector.h | 4 ++-- rtgui/rtwindow.cc | 2 +- rtgui/thumbbrowserbase.cc | 2 +- rtgui/thumbbrowserbase.h | 2 +- rtgui/thumbnail.cc | 2 +- rtgui/thumbnail.h | 2 +- 15 files changed, 44 insertions(+), 45 deletions(-) diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 4170021ea..40c2de0bd 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -5396,7 +5396,7 @@ void ImProcFunctions::getAutoExp (const LUTu &histogram, int histcompr, double octile[count] += histogram[j]; if (octile[count] > sum / 8.f || (count == 7 && octile[count] > sum / 16.f)) { - octile[count] = xlog (1. + (float)j) / log (2.f); + octile[count] = xlog (1. + j) / log (2.f); count++;// = min(count+1,7); } } @@ -5409,7 +5409,7 @@ void ImProcFunctions::getAutoExp (const LUTu &histogram, int histcompr, double octile[count] += histogram[j]; if (octile[count] > sum / 8.f || (count == 7 && octile[count] > sum / 16.f)) { - octile[count] = xlog (1. + (float)j) / log (2.f); + octile[count] = xlog (1. + j) / log (2.f); count++;// = min(count+1,7); } } diff --git a/rtgui/batchqueue.cc b/rtgui/batchqueue.cc index 0b2f5de14..8b4583877 100644 --- a/rtgui/batchqueue.cc +++ b/rtgui/batchqueue.cc @@ -147,7 +147,7 @@ int BatchQueue::getThumbnailHeight () return std::max(std::min(options.thumbSizeQueue, 200), 10); } -void BatchQueue::rightClicked (ThumbBrowserEntryBase* entry) +void BatchQueue::rightClicked () { pmenu.popup (3, this->eventTime); } diff --git a/rtgui/batchqueue.h b/rtgui/batchqueue.h index f0289faa4..5cde37748 100644 --- a/rtgui/batchqueue.h +++ b/rtgui/batchqueue.h @@ -74,7 +74,7 @@ public: void error(const Glib::ustring& descr) override; rtengine::ProcessingJob* imageReady(rtengine::IImagefloat* img) override; - void rightClicked (ThumbBrowserEntryBase* entry) override; + void rightClicked () override; void doubleClicked (ThumbBrowserEntryBase* entry) override; bool keyPressed (GdkEventKey* event) override; void buttonPressed (LWButton* button, int actionCode, void* actionData) override; diff --git a/rtgui/extprog.cc b/rtgui/extprog.cc index fc6e06f72..e7d0988fb 100644 --- a/rtgui/extprog.cc +++ b/rtgui/extprog.cc @@ -137,43 +137,47 @@ bool ExtProgStore::searchProgram (const Glib::ustring& name, action.name = name; action.target = (allowRaw ? 1 : 2); + auto& filePath = action.filePathEXE; + if (maxVer > 0) { for (auto ver = maxVer; ver >= 0; ver--) { - auto filePath = progFilesDir + "\\" + Glib::ustring::compose(exePath, ver); + filePath = progFilesDir + "\\" + Glib::ustring::compose(exePath, ver); - if (Glib::file_test (filePath, Glib::FILE_TEST_EXISTS)) { + if (Glib::file_test(filePath, Glib::FILE_TEST_EXISTS)) { break; } - if (!exePath86.empty ()) { + if (!exePath86.empty()) { filePath = progFilesDirx86 + "\\" + Glib::ustring::compose(exePath86, ver); - if (Glib::file_test (filePath, Glib::FILE_TEST_EXISTS)) { + if (Glib::file_test(filePath, Glib::FILE_TEST_EXISTS)) { break; } } + filePath.clear(); } } else { do { - auto filePath = progFilesDir + "\\" + exePath; + filePath = progFilesDir + "\\" + exePath; - if (Glib::file_test (filePath, Glib::FILE_TEST_EXISTS)) { + if (Glib::file_test(filePath, Glib::FILE_TEST_EXISTS)) { break; } - if (!exePath86.empty ()) { + if (!exePath86.empty()) { filePath = progFilesDirx86 + "\\" + exePath86; - if (Glib::file_test (filePath, Glib::FILE_TEST_EXISTS)) { + if (Glib::file_test(filePath, Glib::FILE_TEST_EXISTS)) { break; } } + filePath.clear(); } while (false); } diff --git a/rtgui/filebrowser.cc b/rtgui/filebrowser.cc index d774cdb28..caa60ebbc 100644 --- a/rtgui/filebrowser.cc +++ b/rtgui/filebrowser.cc @@ -90,41 +90,36 @@ ThumbBrowserEntryBase* selectOriginalEntry (ThumbBrowserEntryBase* original, Thu void findOriginalEntries (const std::vector& entries) { - typedef std::vector EntryVector; - typedef EntryVector::const_iterator EntryIterator; - typedef std::map BasenameMap; - typedef BasenameMap::const_iterator BasenameIterator; - // Sort all entries into buckets by basename without extension - BasenameMap byBasename; + std::map> byBasename; - for (EntryIterator entry = entries.begin (); entry != entries.end (); ++entry) { - const Glib::ustring basename = Glib::path_get_basename ((*entry)->filename.lowercase()); + for (const auto entry : entries) { + const auto basename = Glib::path_get_basename(entry->filename.lowercase()); - const Glib::ustring::size_type pos = basename.find_last_of ('.'); - if (pos >= basename.length () - 1) { - (*entry)->setOriginal (nullptr); + const auto pos = basename.find_last_of('.'); + if (pos >= basename.length() - 1) { + entry->setOriginal(nullptr); continue; } - const Glib::ustring withoutExtension = basename.substr (0, pos); + const auto withoutExtension = basename.substr(0, pos); - byBasename[withoutExtension].push_back (*entry); + byBasename[withoutExtension].push_back(entry); } // Find the original image for each bucket - for (BasenameIterator bucket = byBasename.begin (); bucket != byBasename.end (); ++bucket) { - const EntryVector& lentries = bucket->second; + for (const auto& bucket : byBasename) { + const auto& lentries = bucket.second; ThumbBrowserEntryBase* original = nullptr; // Select the most likely original in a first pass... - for (EntryIterator entry = lentries.begin (); entry != lentries.end (); ++entry) { - original = selectOriginalEntry (original, *entry); + for (const auto entry : lentries) { + original = selectOriginalEntry(original, entry); } // ...and link all other images to it in a second pass. - for (EntryIterator entry = lentries.begin (); entry != lentries.end (); ++entry) { - (*entry)->setOriginal (*entry != original ? original : nullptr); + for (const auto entry : lentries) { + entry->setOriginal(entry != original ? original : nullptr); } } } @@ -487,7 +482,7 @@ FileBrowser::~FileBrowser () delete[] amiExtProg; } -void FileBrowser::rightClicked (ThumbBrowserEntryBase* entry) +void FileBrowser::rightClicked () { { diff --git a/rtgui/filebrowser.h b/rtgui/filebrowser.h index b941ea9df..fe4877a31 100644 --- a/rtgui/filebrowser.h +++ b/rtgui/filebrowser.h @@ -174,7 +174,7 @@ public: void buttonPressed (LWButton* button, int actionCode, void* actionData) override; void redrawNeeded (LWButton* button) override; bool checkFilter (ThumbBrowserEntryBase* entry) const override; - void rightClicked (ThumbBrowserEntryBase* entry) override; + void rightClicked () override; void doubleClicked (ThumbBrowserEntryBase* entry) override; bool keyPressed (GdkEventKey* event) override; diff --git a/rtgui/guiutils.cc b/rtgui/guiutils.cc index 7051dbeea..02a28607f 100644 --- a/rtgui/guiutils.cc +++ b/rtgui/guiutils.cc @@ -948,19 +948,19 @@ bool MyScrolledWindow::on_scroll_event (GdkEventScroll* event) double step = adjust->get_step_increment(); if (event->direction == GDK_SCROLL_DOWN) { - double value2 = rtengine::min(value + step, upperBound); + const double value2 = rtengine::min(value + step, upperBound); if (value2 != value) { scroll->set_value(value2); } } else if (event->direction == GDK_SCROLL_UP) { - double value2 = rtengine::max(value - step, lowerBound); + const double value2 = rtengine::max(value - step, lowerBound); if (value2 != value) { scroll->set_value(value2); } } else if (event->direction == GDK_SCROLL_SMOOTH) { - double value2 = rtengine::LIM(value + event->delta_y * step, lowerBound, upperBound); + const double value2 = rtengine::LIM(value + event->delta_y * step, lowerBound, upperBound); if (value2 != value) { scroll->set_value(value2); diff --git a/rtgui/lockablecolorpicker.cc b/rtgui/lockablecolorpicker.cc index a544ea991..071847424 100644 --- a/rtgui/lockablecolorpicker.cc +++ b/rtgui/lockablecolorpicker.cc @@ -289,7 +289,7 @@ void LockableColorPicker::getImagePosition (rtengine::Coord &imgPos) const imgPos = position; } -void LockableColorPicker::getScreenPosition (rtengine::Coord &screenPos) +void LockableColorPicker::getScreenPosition (rtengine::Coord &screenPos) const { if (cropWindow) { cropWindow->imageCoordToScreen(position.x, position.y, screenPos.x, screenPos.y); diff --git a/rtgui/lockablecolorpicker.h b/rtgui/lockablecolorpicker.h index 7f320f8b6..77d2e8e9f 100644 --- a/rtgui/lockablecolorpicker.h +++ b/rtgui/lockablecolorpicker.h @@ -80,7 +80,7 @@ public: void setPosition (const rtengine::Coord &newPos); void setRGB (const float R, const float G, const float B, const float previewR, const float previewG, const float previewB); void getImagePosition (rtengine::Coord &imgPos) const; - void getScreenPosition (rtengine::Coord &screenPos); + void getScreenPosition (rtengine::Coord &screenPos) const; Size getSize () const; bool isOver (int x, int y); void setValidity (Validity isValid); diff --git a/rtgui/progressconnector.h b/rtgui/progressconnector.h index 45575177f..f4d1d8f7e 100644 --- a/rtgui/progressconnector.h +++ b/rtgui/progressconnector.h @@ -79,8 +79,8 @@ class ProgressConnector static int emitEndSignalUI (void* data) { - sigc::signal0* lopEnd = (sigc::signal0*) data; - int r = lopEnd->emit (); + const sigc::signal0* lopEnd = reinterpret_cast*>(data); + const int r = lopEnd->emit (); delete lopEnd; return r; diff --git a/rtgui/rtwindow.cc b/rtgui/rtwindow.cc index 6d338f388..5ab3ab85d 100644 --- a/rtgui/rtwindow.cc +++ b/rtgui/rtwindow.cc @@ -44,7 +44,7 @@ extern unsigned char initialGdkScale; static gboolean osx_should_quit_cb (GtkosxApplication *app, gpointer data) { - RTWindow *rtWin = static_cast(data); + RTWindow * const rtWin = static_cast(data); return rtWin->on_delete_event (0); } diff --git a/rtgui/thumbbrowserbase.cc b/rtgui/thumbbrowserbase.cc index c9329cf91..5f75ab413 100644 --- a/rtgui/thumbbrowserbase.cc +++ b/rtgui/thumbbrowserbase.cc @@ -967,7 +967,7 @@ void ThumbBrowserBase::buttonPressed (int x, int y, int button, GdkEventType typ } MYWRITERLOCK_RELEASE(l); - rightClicked (fileDescr); + rightClicked (); } } // end of MYWRITERLOCK(l, entryRW); diff --git a/rtgui/thumbbrowserbase.h b/rtgui/thumbbrowserbase.h index d6bafaf69..b4caac0a9 100644 --- a/rtgui/thumbbrowserbase.h +++ b/rtgui/thumbbrowserbase.h @@ -225,7 +225,7 @@ public: { return true; } - virtual void rightClicked (ThumbBrowserEntryBase* entry) {} + virtual void rightClicked () = 0; virtual void doubleClicked (ThumbBrowserEntryBase* entry) {} virtual bool keyPressed (GdkEventKey* event) { diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc index fc1df1b4b..bcf578143 100644 --- a/rtgui/thumbnail.cc +++ b/rtgui/thumbnail.cc @@ -590,7 +590,7 @@ void Thumbnail::decreaseRef () cachemgr->closeThumbnail (this); } -int Thumbnail::getThumbnailWidth (const int &h, const rtengine::procparams::ProcParams *pparams) const +int Thumbnail::getThumbnailWidth (const int h, const rtengine::procparams::ProcParams *pparams) const { int tw_ = tw; int th_ = th; diff --git a/rtgui/thumbnail.h b/rtgui/thumbnail.h index 7e466bf07..c22c80cea 100644 --- a/rtgui/thumbnail.h +++ b/rtgui/thumbnail.h @@ -119,7 +119,7 @@ public: // unsigned char* getThumbnailImage (int &w, int &h, int fixwh=1); // fixwh = 0: fix w and calculate h, =1: fix h and calculate w rtengine::IImage8* processThumbImage (const rtengine::procparams::ProcParams& pparams, int h, double& scale); rtengine::IImage8* upgradeThumbImage (const rtengine::procparams::ProcParams& pparams, int h, double& scale); - int getThumbnailWidth (const int &h, const rtengine::procparams::ProcParams *pparams = nullptr) const; + int getThumbnailWidth (int h, const rtengine::procparams::ProcParams *pparams = nullptr) const; void getFinalSize (const rtengine::procparams::ProcParams& pparams, int& w, int& h); void getOriginalSize (int& w, int& h); From 4f153a6d72b0a09ed4e58df230a05695ea75805d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Wed, 27 Nov 2019 09:49:13 +0100 Subject: [PATCH 183/208] Fix warnings --- rtengine/canon_cr3_decoder.cc | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index 3fe221097..4698f72c0 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -303,8 +303,8 @@ int DCraw::parseCR3( char HandlerType[5]; char MediaFormatID[5]; // unsigned int ImageWidth, ImageHeight; - long relpos_inDir; - long relpos_inBox; + unsigned long relpos_inDir; + unsigned long relpos_inBox; unsigned int szItem; unsigned int Tag; unsigned int lTag; @@ -2663,9 +2663,10 @@ int DCraw::crxDecodePlane(void* p, std::uint32_t planeNumber) namespace { + using crx_data_header_t = DCraw::CanonCR3Data::crx_data_header_t; -int crxReadSubbandHeaders(crx_data_header_t* hdr, CrxImage* img, CrxTile* tile, +int crxReadSubbandHeaders(CrxImage* img, CrxTile* tile, CrxPlaneComp* comp, std::uint8_t** subbandMdatPtr, std::uint32_t* mdatSize) { @@ -2952,7 +2953,7 @@ int crxReadImageHeaders(crx_data_header_t* hdr, CrxImage* img, std::uint8_t* mda comp->roundedBitsMask = 1 << (compHdrRoundedBits - 1); } - if (crxReadSubbandHeaders(hdr, img, tile, comp, &dataPtr, &dataSize)) { + if (crxReadSubbandHeaders(img, tile, comp, &dataPtr, &dataSize)) { return -1; } } @@ -2980,9 +2981,7 @@ int crxSetupImageData(crx_data_header_t* hdr, CrxImage* img, std::int16_t* outBu img->tileCols = (img->planeWidth + hdr->tileWidth - 1) / hdr->tileWidth; img->tileRows = (img->planeHeight + hdr->tileHeight - 1) / hdr->tileHeight; - if (img->tileCols > 0xFF || img->tileRows > 0xFF || - img->planeWidth - hdr->tileWidth * (img->tileCols - 1) < 0x16 || - img->planeHeight - hdr->tileHeight * (img->tileRows - 1) < 0x16) { + if (img->planeWidth - hdr->tileWidth * (img->tileCols - 1) < 0x16 || img->planeHeight - hdr->tileHeight * (img->tileRows - 1) < 0x16) { return -1; } From 97960f335f362264f5aa79f15a896678752bbfa6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Wed, 27 Nov 2019 10:32:43 +0100 Subject: [PATCH 184/208] Fix silly error and with it the Clang build --- rtengine/canon_cr3_decoder.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index 4698f72c0..f32258469 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -76,7 +76,7 @@ void DCraw::parse_canon_cr3() void DCraw::selectCRXTrack(unsigned short maxTrack) { - std::int64_t bitcounts[RT_canon_CR3_data.CRXTRACKS_MAXCOUNT] = {}; + std::int64_t bitcounts[CanonCR3Data::CRXTRACKS_MAXCOUNT] = {}; std::int64_t maxbitcount = 0; std::uint32_t maxjpegbytes = 0; From 04b08741ee7f99c91e8c25255e997c9c28a1026b Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Wed, 27 Nov 2019 18:55:20 +0100 Subject: [PATCH 185/208] Further cleanups --- rtengine/lcp.cc | 1 - rtengine/mytime.h | 2 +- rtgui/cachemanager.cc | 2 +- rtgui/crophandler.h | 1 - rtgui/cropwindow.cc | 1 + rtgui/cropwindow.h | 2 +- rtgui/dirbrowser.h | 4 ---- rtgui/editorpanel.cc | 7 +++++++ rtgui/editorpanel.h | 3 +-- rtgui/editwidgets.h | 2 +- rtgui/editwindow.cc | 3 +++ rtgui/editwindow.h | 5 +++-- rtgui/extprog.cc | 6 +++--- rtgui/filebrowser.h | 1 - rtgui/filecatalog.cc | 2 ++ rtgui/filecatalog.h | 6 +++--- rtgui/filepanel.cc | 5 +++++ rtgui/filepanel.h | 2 +- rtgui/main.cc | 1 + rtgui/navigator.cc | 1 + rtgui/navigator.h | 3 ++- rtgui/placesbrowser.h | 2 -- rtgui/recentbrowser.h | 1 - rtgui/rtwindow.h | 1 + rtgui/toolpanel.h | 1 - 25 files changed, 38 insertions(+), 27 deletions(-) diff --git a/rtengine/lcp.cc b/rtengine/lcp.cc index 57a87c1f1..7fec79717 100644 --- a/rtengine/lcp.cc +++ b/rtengine/lcp.cc @@ -27,7 +27,6 @@ #ifdef WIN32 #include -#include #endif #include "lcp.h" diff --git a/rtengine/mytime.h b/rtengine/mytime.h index 80fb0899a..787fefcc3 100644 --- a/rtengine/mytime.h +++ b/rtengine/mytime.h @@ -19,7 +19,7 @@ #pragma once #ifdef WIN32 -#include +#include #elif defined __APPLE__ #include #else diff --git a/rtgui/cachemanager.cc b/rtgui/cachemanager.cc index 9f6e111e5..c37964e23 100644 --- a/rtgui/cachemanager.cc +++ b/rtgui/cachemanager.cc @@ -25,7 +25,7 @@ #include #ifdef WIN32 -#include +#include #endif #include "cachemanager.h" diff --git a/rtgui/crophandler.h b/rtgui/crophandler.h index d5da1cf6e..98c925b67 100644 --- a/rtgui/crophandler.h +++ b/rtgui/crophandler.h @@ -24,7 +24,6 @@ #include -#include "editbuffer.h" #include "lockablecolorpicker.h" #include "threadutils.h" diff --git a/rtgui/cropwindow.cc b/rtgui/cropwindow.cc index 417786e5b..b00032191 100644 --- a/rtgui/cropwindow.cc +++ b/rtgui/cropwindow.cc @@ -33,6 +33,7 @@ #include "editcallbacks.h" #include "editbuffer.h" #include "editwidgets.h" +#include "pointermotionlistener.h" #include "rtsurface.h" #include "../rtengine/dcrop.h" diff --git a/rtgui/cropwindow.h b/rtgui/cropwindow.h index 0a66506a4..491124ad5 100644 --- a/rtgui/cropwindow.h +++ b/rtgui/cropwindow.h @@ -30,7 +30,6 @@ #include "editenums.h" #include "lwbutton.h" #include "lwbuttonset.h" -#include "pointermotionlistener.h" #include "../rtengine/noncopyable.h" @@ -42,6 +41,7 @@ struct Coord; } class CropWindow; +class PointerMotionListener; class CropWindowListener { diff --git a/rtgui/dirbrowser.h b/rtgui/dirbrowser.h index fa526c3a6..6ead83919 100644 --- a/rtgui/dirbrowser.h +++ b/rtgui/dirbrowser.h @@ -23,10 +23,6 @@ #include "guiutils.h" -#ifdef WIN32 -#include "windows.h" -#endif - class DirBrowser : public Gtk::VBox { public: diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index 87f4a0b94..1b5ed3fa7 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -28,9 +28,12 @@ #include "soundman.h" #include "rtimage.h" #include "rtwindow.h" +#include "filepanel.h" #include "guiutils.h" #include "popupbutton.h" #include "options.h" +#include "navigator.h" +#include "previewwindow.h" #include "progressconnector.h" #include "procparamchangers.h" #include "placesbrowser.h" @@ -38,6 +41,10 @@ #include "thumbnail.h" #include "toolpanelcoord.h" +#ifdef WIN32 +#include "windows.h" +#endif + using namespace rtengine::procparams; namespace diff --git a/rtgui/editorpanel.h b/rtgui/editorpanel.h index e348222a5..8993fea07 100644 --- a/rtgui/editorpanel.h +++ b/rtgui/editorpanel.h @@ -21,11 +21,9 @@ #include -#include "filepanel.h" #include "histogrampanel.h" #include "history.h" #include "imageareapanel.h" -#include "navigator.h" #include "profilepanel.h" #include "progressconnector.h" #include "saveasdlg.h" @@ -38,6 +36,7 @@ class BatchQueueEntry; class EditorPanel; class FilePanel; class MyProgressBar; +class Navigator; class Thumbnail; class ToolPanelCoordinator; diff --git a/rtgui/editwidgets.h b/rtgui/editwidgets.h index c902f136a..55b4ca3cc 100644 --- a/rtgui/editwidgets.h +++ b/rtgui/editwidgets.h @@ -20,9 +20,9 @@ #ifdef GUIVERSION +#include #include -#include "editbuffer.h" #include "editcoordsys.h" #include "../rtengine/coord.h" diff --git a/rtgui/editwindow.cc b/rtgui/editwindow.cc index d4bbdb9ba..8841d3d42 100644 --- a/rtgui/editwindow.cc +++ b/rtgui/editwindow.cc @@ -16,8 +16,11 @@ */ #include "editwindow.h" +#include "editorpanel.h" +#include "filepanel.h" #include "../rtengine/procparams.h" #include "options.h" +#include "preferences.h" #include "cursormanager.h" #include "rtwindow.h" #include diff --git a/rtgui/editwindow.h b/rtgui/editwindow.h index 08e8c0199..f4ada571d 100644 --- a/rtgui/editwindow.h +++ b/rtgui/editwindow.h @@ -20,10 +20,11 @@ #include -#include "editorpanel.h" -#include "filepanel.h" #include "rtimage.h" +class EditorPanel; +class RTWindow; + class EditWindow : public Gtk::Window { diff --git a/rtgui/extprog.cc b/rtgui/extprog.cc index e7d0988fb..57d57ecd8 100644 --- a/rtgui/extprog.cc +++ b/rtgui/extprog.cc @@ -22,8 +22,8 @@ #include #ifdef WIN32 -#include #include +#include #endif #include @@ -261,7 +261,7 @@ bool ExtProgStore::openInGimp (const Glib::ustring& fileName) #endif #ifdef WIN32 - if ((uintptr_t)success > 32) { + if (reinterpret_cast(success) > 32) { return true; } #else @@ -278,7 +278,7 @@ bool ExtProgStore::openInGimp (const Glib::ustring& fileName) executable = Glib::build_filename (options.gimpDir, "bin", Glib::ustring::compose (Glib::ustring("gimp-2.%1.exe"), ver)); auto lsuccess = ShellExecute( NULL, "open", executable.c_str(), fileName.c_str(), NULL, SW_SHOWNORMAL ); - if ((uintptr_t)lsuccess > 32) { + if (reinterpret_cast(lsuccess) > 32) { return true; } } diff --git a/rtgui/filebrowser.h b/rtgui/filebrowser.h index fe4877a31..86ab59395 100644 --- a/rtgui/filebrowser.h +++ b/rtgui/filebrowser.h @@ -23,7 +23,6 @@ #include #include "browserfilter.h" -#include "exiffiltersettings.h" #include "exportpanel.h" #include "extprog.h" #include "filebrowserentry.h" diff --git a/rtgui/filecatalog.cc b/rtgui/filecatalog.cc index ce9883cdb..109a1bb57 100644 --- a/rtgui/filecatalog.cc +++ b/rtgui/filecatalog.cc @@ -32,6 +32,7 @@ #include "rtimage.h" #include "cachemanager.h" #include "multilangmgr.h" +#include "coarsepanel.h" #include "filepanel.h" #include "renamedlg.h" #include "thumbimageupdater.h" @@ -40,6 +41,7 @@ #include "placesbrowser.h" #include "pathutils.h" #include "thumbnail.h" +#include "toolbar.h" using namespace std; diff --git a/rtgui/filecatalog.h b/rtgui/filecatalog.h index c71658cca..8f7e5618f 100644 --- a/rtgui/filecatalog.h +++ b/rtgui/filecatalog.h @@ -22,21 +22,21 @@ #include -#include "coarsepanel.h" #include "exiffiltersettings.h" #include "exportpanel.h" #include "filebrowser.h" #include "fileselectionchangelistener.h" #include "fileselectionlistener.h" #include "filterpanel.h" -#include "multilangmgr.h" #include "previewloader.h" #include "threadutils.h" -#include "toolbar.h" #include "../rtengine/noncopyable.h" class FilePanel; +class CoarsePanel; +class ToolBar; + /* * Class: * - handling the list of file (add/remove them) diff --git a/rtgui/filepanel.cc b/rtgui/filepanel.cc index 8f45343de..1a66aed7c 100644 --- a/rtgui/filepanel.cc +++ b/rtgui/filepanel.cc @@ -18,6 +18,7 @@ */ #include "filepanel.h" +#include "dirbrowser.h" #include "batchtoolpanelcoord.h" #include "editorpanel.h" #include "rtwindow.h" @@ -25,6 +26,10 @@ #include "placesbrowser.h" #include "thumbnail.h" +#ifdef WIN32 +#include "windows.h" +#endif + FilePanel::FilePanel () : parent(nullptr), error(0) { diff --git a/rtgui/filepanel.h b/rtgui/filepanel.h index 9db9d99b7..cbfe8e53e 100644 --- a/rtgui/filepanel.h +++ b/rtgui/filepanel.h @@ -20,7 +20,6 @@ #include -#include "dirbrowser.h" #include "exportpanel.h" #include "filecatalog.h" #include "fileselectionlistener.h" @@ -35,6 +34,7 @@ class BatchToolPanelCoordinator; class RTWindow; +class DirBrowser; class FilePanel final : public Gtk::HPaned, diff --git a/rtgui/main.cc b/rtgui/main.cc index ae34fc8d0..f669bcf4a 100644 --- a/rtgui/main.cc +++ b/rtgui/main.cc @@ -53,6 +53,7 @@ #else #include #include "conio.h" +#include "windows.h" #endif // Set this to 1 to make RT work when started with Eclipse and arguments, at least on Windows platform diff --git a/rtgui/navigator.cc b/rtgui/navigator.cc index 6a8137737..619ea0cfd 100644 --- a/rtgui/navigator.cc +++ b/rtgui/navigator.cc @@ -18,6 +18,7 @@ */ #include #include "navigator.h" +#include "previewwindow.h" #include "toolpanel.h" #include "../rtengine/color.h" #include "../rtengine/rt_math.h" diff --git a/rtgui/navigator.h b/rtgui/navigator.h index 953a0a44b..c1c23c6dc 100644 --- a/rtgui/navigator.h +++ b/rtgui/navigator.h @@ -22,7 +22,8 @@ #include "options.h" #include "pointermotionlistener.h" -#include "previewwindow.h" + +class PreviewWindow; class Navigator : public Gtk::Frame, diff --git a/rtgui/placesbrowser.h b/rtgui/placesbrowser.h index 78c94969f..d4640fff4 100644 --- a/rtgui/placesbrowser.h +++ b/rtgui/placesbrowser.h @@ -22,8 +22,6 @@ #include -#include "multilangmgr.h" - class PlacesBrowser : public Gtk::VBox { diff --git a/rtgui/recentbrowser.h b/rtgui/recentbrowser.h index 68a7962f9..bc8374087 100644 --- a/rtgui/recentbrowser.h +++ b/rtgui/recentbrowser.h @@ -21,7 +21,6 @@ #include #include "guiutils.h" -#include "multilangmgr.h" class RecentBrowser : public Gtk::VBox diff --git a/rtgui/rtwindow.h b/rtgui/rtwindow.h index 39e1581e3..100ddf636 100644 --- a/rtgui/rtwindow.h +++ b/rtgui/rtwindow.h @@ -34,6 +34,7 @@ class BatchQueueEntry; class BatchQueuePanel; class EditorPanel; class FilePanel; +class PLDBridge; class RTWindow : public Gtk::Window, public rtengine::ProgressListener, diff --git a/rtgui/toolpanel.h b/rtgui/toolpanel.h index 0f002e048..aecf1f39f 100644 --- a/rtgui/toolpanel.h +++ b/rtgui/toolpanel.h @@ -22,7 +22,6 @@ #include -#include "editbuffer.h" #include "guiutils.h" #include "multilangmgr.h" #include "paramsedited.h" From 85abe54a1638409c563f6bde93cf66fe584049ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Thu, 28 Nov 2019 08:54:38 +0100 Subject: [PATCH 186/208] Replace defines --- rtengine/canon_cr3_decoder.cc | 117 ++++++++++++++-------------------- 1 file changed, 48 insertions(+), 69 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index f32258469..0d284f68b 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -53,6 +53,8 @@ #include #include +#include +#include #include #include "dcraw.h" @@ -624,26 +626,10 @@ fin: // ----------------------------------------------------------------------------- -#ifdef _abs -#undef _abs -#undef _min -#undef _constrain -#endif -#define _abs(x) ((x) < 0 ? -(x) : (x)) -#define _min(a, b) ((a) < (b) ? (a) : (b)) -#define _constrain(x, l, u) ((x) < (l) ? (l) : ((x) > (u) ? (u) : (x))) - -#if defined (__clang__) || defined (__GNUG__) -#define libraw_inline inline __attribute__((always_inline)) -#elif defined (_MSC_VER) && _MSC_VER > 1400 -#define libraw_inline __forceinline -#else -#define libraw_inline inline -#endif - namespace { -static unsigned int sgetn(int n, unsigned char* s) + +unsigned int sgetn(int n, unsigned char* s) { unsigned int result = 0; @@ -655,12 +641,11 @@ static unsigned int sgetn(int n, unsigned char* s) } // this should be divisible by 4 -#define CRX_BUF_SIZE 0x10000 +constexpr std::uint64_t CRX_BUF_SIZE = 0x10000; + #if !defined (_WIN32) || (defined (__GNUC__) && !defined (__INTRINSIC_SPECIAL__BitScanReverse)) /* __INTRINSIC_SPECIAL__BitScanReverse found in MinGW32-W64 v7.30 headers, may be there is a better solution? */ -using DWORD = std::uint32_t; -using byte = std::uint8_t; -libraw_inline void _BitScanReverse(DWORD* Index, unsigned long Mask) +inline void _BitScanReverse(std::uint32_t* Index, unsigned long Mask) { *Index = sizeof(unsigned long) * 8 - 1 - __builtin_clzl(Mask); } @@ -674,8 +659,6 @@ std::uint32_t _byteswap_ulong(std::uint32_t x) } #endif -#define LIBRAW_EXCEPTION_IO_EOF std::exception() - struct LibRaw_abstract_datastream { IMFILE* ifp; @@ -751,7 +734,7 @@ struct CrxSubband { }; struct CrxPlaneComp { - byte* compBuf; + std::uint8_t* compBuf; CrxSubband* subBands; CrxWaveletTransform* waveletTransform; std::int8_t compNumber; @@ -798,7 +781,7 @@ enum TileFlags { E_HAS_TILES_ON_THE_TOP = 8 }; -std::int32_t exCoefNumTbl[0x120] = { +const std::int32_t exCoefNumTbl[0x120] = { // level 1 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, @@ -818,18 +801,20 @@ std::int32_t exCoefNumTbl[0x120] = { 8, 8, 2, 1, 4, 3, 1, 1, 1, 1, 1, 1, 8, 7, 1, 1, 3, 3, 1, 1, 1, 1 }; -std::uint32_t JS[32] = {1, 1, 1, 1, 2, 2, 2, 2, - 4, 4, 4, 4, 8, 8, 8, 8, - 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, - 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000 - }; +const std::uint32_t JS[32] = { + 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0004, 0x0004, 0x0004, 0x0004, 0x0008, 0x0008, 0x0008, 0x0008, + 0x0010, 0x0010, 0x0020, 0x0020, 0x0040, 0x0040, 0x0080, 0x0080, + 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000 +}; -std::uint32_t J[32] = {0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, - 2, 3, 3, 3, 3, 4, 4, 5, 5, 6, 6, - 7, 7, 8, 9, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F - }; +const std::uint32_t J[32] = { + 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x2, 0x2, 0x2, + 0x2, 0x3, 0x3, 0x3, 0x3, 0x4, 0x4, 0x5, 0x5, 0x6, 0x6, + 0x7, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF +}; -static inline void crxFillBuffer(CrxBitstream* bitStrm) +inline void crxFillBuffer(CrxBitstream* bitStrm) { if (bitStrm->curPos >= bitStrm->curBufSize && bitStrm->mdatSize) { bitStrm->curPos = 0; @@ -842,14 +827,13 @@ static inline void crxFillBuffer(CrxBitstream* bitStrm) bitStrm->input->lock(); #endif bitStrm->input->seek(bitStrm->curBufOffset, SEEK_SET); - bitStrm->curBufSize = bitStrm->input->read( - bitStrm->mdatBuf, 1, _min(bitStrm->mdatSize, CRX_BUF_SIZE)); + bitStrm->curBufSize = bitStrm->input->read(bitStrm->mdatBuf, 1, std::min(bitStrm->mdatSize, CRX_BUF_SIZE)); #ifndef _OPENMP bitStrm->input->unlock(); #endif if (bitStrm->curBufSize < 1) { // nothing read - throw LIBRAW_EXCEPTION_IO_EOF; + throw std::exception(); } bitStrm->mdatSize -= bitStrm->curBufSize; @@ -857,7 +841,7 @@ static inline void crxFillBuffer(CrxBitstream* bitStrm) } } -libraw_inline int crxBitstreamGetZeros(CrxBitstream* bitStrm) +inline int crxBitstreamGetZeros(CrxBitstream* bitStrm) { // std::uint32_t bitData = bitStrm->bitData; std::uint32_t nonZeroBit = 0; @@ -865,7 +849,7 @@ libraw_inline int crxBitstreamGetZeros(CrxBitstream* bitStrm) std::int32_t result = 0; if (bitStrm->bitData) { - _BitScanReverse((DWORD*)&nonZeroBit, (DWORD)bitStrm->bitData); + _BitScanReverse((std::uint32_t*)&nonZeroBit, (std::uint32_t)bitStrm->bitData); result = 31 - nonZeroBit; bitStrm->bitData <<= 32 - nonZeroBit; bitStrm->bitsLeft -= 32 - nonZeroBit; @@ -880,7 +864,7 @@ libraw_inline int crxBitstreamGetZeros(CrxBitstream* bitStrm) crxFillBuffer(bitStrm); if (nextData) { - _BitScanReverse((DWORD*)&nonZeroBit, (DWORD)nextData); + _BitScanReverse((std::uint32_t*)&nonZeroBit, (std::uint32_t)nextData); result = bitsLeft + 31 - nonZeroBit; bitStrm->bitData = nextData << (32 - nonZeroBit); bitStrm->bitsLeft = nonZeroBit; @@ -904,7 +888,7 @@ libraw_inline int crxBitstreamGetZeros(CrxBitstream* bitStrm) bitsLeft += 8; } - _BitScanReverse((DWORD*)&nonZeroBit, (DWORD)nextData); + _BitScanReverse((std::uint32_t*)&nonZeroBit, (std::uint32_t)nextData); result = (std::uint32_t)(bitsLeft + 7 - nonZeroBit); bitStrm->bitData = nextData << (32 - nonZeroBit); bitStrm->bitsLeft = nonZeroBit; @@ -913,7 +897,7 @@ libraw_inline int crxBitstreamGetZeros(CrxBitstream* bitStrm) return result; } -libraw_inline std::uint32_t crxBitstreamGetBits(CrxBitstream* bitStrm, int bits) +inline std::uint32_t crxBitstreamGetBits(CrxBitstream* bitStrm, int bits) { int bitsLeft = bitStrm->bitsLeft; std::uint32_t bitData = bitStrm->bitData; @@ -953,7 +937,7 @@ libraw_inline std::uint32_t crxBitstreamGetBits(CrxBitstream* bitStrm, int bits) return result; } -libraw_inline int crxPredictKParameter(std::int32_t prevK, std::int32_t bitCode, +inline int crxPredictKParameter(std::int32_t prevK, std::int32_t bitCode, std::int32_t maxVal = 0) { std::int32_t newKParam = prevK - (bitCode < (1 << prevK >> 1)) + @@ -962,7 +946,7 @@ libraw_inline int crxPredictKParameter(std::int32_t prevK, std::int32_t bitCode, return !maxVal || newKParam < maxVal ? newKParam : maxVal; } -libraw_inline void crxDecodeSymbolL1(CrxBandParam* param, +inline void crxDecodeSymbolL1(CrxBandParam* param, std::int32_t doMedianPrediction, std::int32_t notEOL = 0) { @@ -997,7 +981,7 @@ libraw_inline void crxDecodeSymbolL1(CrxBandParam* param, // for not end of the line - use one symbol ahead to estimate next K if (notEOL) { std::int32_t nextDelta = (param->lineBuf0[2] - param->lineBuf0[1]) << 1; - bitCode = (bitCode + _abs(nextDelta)) >> 1; + bitCode = (bitCode + std::abs(nextDelta)) >> 1; ++param->lineBuf0; } @@ -1081,7 +1065,7 @@ int crxDecodeLine(CrxBandParam* param) return 0; } -libraw_inline void crxDecodeSymbolL1Rounded(CrxBandParam* param, +inline void crxDecodeSymbolL1Rounded(CrxBandParam* param, std::int32_t doSym = 1, std::int32_t doCode = 1) { @@ -1123,7 +1107,7 @@ libraw_inline void crxDecodeSymbolL1Rounded(CrxBandParam* param, } param->kParam = crxPredictKParameter(param->kParam, - (bitCode + 2 * _abs(code)) >> 1, 15); + (bitCode + 2 * std::abs(code)) >> 1, 15); } else { param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); } @@ -1140,11 +1124,11 @@ int crxDecodeLineRounded(CrxBandParam* param) std::int32_t length = param->subbandWidth; for (; length > 1; --length) { - if (_abs(param->lineBuf0[2] - param->lineBuf0[1]) > param->roundedBitsMask) { + if (std::abs(param->lineBuf0[2] - param->lineBuf0[1]) > param->roundedBitsMask) { crxDecodeSymbolL1Rounded(param); ++param->lineBuf0; valueReached = 1; - } else if (valueReached || _abs(param->lineBuf0[0] - param->lineBuf1[0]) > + } else if (valueReached || std::abs(param->lineBuf0[0] - param->lineBuf1[0]) > param->roundedBitsMask) { crxDecodeSymbolL1Rounded(param); ++param->lineBuf0; @@ -1201,7 +1185,7 @@ int crxDecodeLineRounded(CrxBandParam* param) if (length > 1) { crxDecodeSymbolL1Rounded(param, 0); ++param->lineBuf0; - valueReached = _abs(param->lineBuf0[1] - param->lineBuf0[0]) > + valueReached = std::abs(param->lineBuf0[1] - param->lineBuf0[0]) > param->roundedBitsMask; } else if (length == 1) { crxDecodeSymbolL1Rounded(param, 0, 0); @@ -1458,7 +1442,7 @@ int crxDecodeTopLineRounded(CrxBandParam* param) // read the line from bitstream for (; length > 1; --length) { - if (_abs(param->lineBuf1[0]) > param->roundedBitsMask) { + if (std::abs(param->lineBuf1[0]) > param->roundedBitsMask) { param->lineBuf1[1] = param->lineBuf1[0]; } else { int nSyms = 0; @@ -2363,7 +2347,7 @@ void crxConvertPlaneLine(CrxImage* img, int imageRow, int imageCol = 0, for (int i = 0; i < lineLength; i++) { img->outBufs[plane][rawOffset + 2 * i] = - _constrain(lineData[i], minVal, maxVal); + rtengine::LIM(lineData[i], minVal, maxVal); } } else if (img->encType == 3) { // copy to intermediate planeBuf @@ -2379,7 +2363,7 @@ void crxConvertPlaneLine(CrxImage* img, int imageRow, int imageCol = 0, for (int i = 0; i < lineLength; i++) { img->outBufs[plane][rawOffset + 2 * i] = - _constrain(median + lineData[i], 0, maxVal); + rtengine::LIM(median + lineData[i], 0, maxVal); } } else if (img->nPlanes == 1) { std::int32_t maxVal = (1 << img->nBits) - 1; @@ -2388,7 +2372,7 @@ void crxConvertPlaneLine(CrxImage* img, int imageRow, int imageCol = 0, for (int i = 0; i < lineLength; i++) { img->outBufs[0][rawOffset + i] = - _constrain(median + lineData[i], 0, maxVal); + rtengine::LIM(median + lineData[i], 0, maxVal); } } } else if (img->encType == 3 && img->planeBuf) { @@ -2409,23 +2393,23 @@ void crxConvertPlaneLine(CrxImage* img, int imageRow, int imageCol = 0, std::int32_t val = 0; if (gr < 0) { - gr = -(((_abs(gr) + 512) >> 9) & ~1); + gr = -(((std::abs(gr) + 512) >> 9) & ~1); } else { - gr = ((_abs(gr) + 512) >> 9) & ~1; + gr = ((std::abs(gr) + 512) >> 9) & ~1; } // Essentially R = round(median + P0 + 1.474*P3) val = (median + (plane0[i] << 10) + 1510 * plane3[i] + 512) >> 10; - img->outBufs[0][rawLineOffset + 2 * i] = _constrain(val, 0, maxVal); + img->outBufs[0][rawLineOffset + 2 * i] = rtengine::LIM(val, 0, maxVal); // Essentially G1 = round(median + P0 + P2 - 0.164*P1 - 0.571*P3) val = (plane2[i] + gr + 1) >> 1; - img->outBufs[1][rawLineOffset + 2 * i] = _constrain(val, 0, maxVal); + img->outBufs[1][rawLineOffset + 2 * i] = rtengine::LIM(val, 0, maxVal); // Essentially G1 = round(median + P0 - P2 - 0.164*P1 - 0.571*P3) val = (gr - plane2[i] + 1) >> 1; - img->outBufs[2][rawLineOffset + 2 * i] = _constrain(val, 0, maxVal); + img->outBufs[2][rawLineOffset + 2 * i] = rtengine::LIM(val, 0, maxVal); // Essentially B = round(median + P0 + 1.881*P1) val = (median + (plane0[i] << 10) + 1927 * plane1[i] + 512) >> 10; - img->outBufs[3][rawLineOffset + 2 * i] = _constrain(val, 0, maxVal); + img->outBufs[3][rawLineOffset + 2 * i] = rtengine::LIM(val, 0, maxVal); } } } @@ -2682,9 +2666,9 @@ int crxReadSubbandHeaders(CrxImage* img, CrxTile* tile, // Coefficient structure is a bit unclear and convoluted: // 3 levels max - 8 groups (for tile width rounded to 8 bytes) // of 3 band per level 4 sets of coefficients for each - std::int32_t* rowExCoef = + const std::int32_t* rowExCoef = exCoefNumTbl + 0x60 * (img->levels - 1) + 12 * (tile->width & 7); - std::int32_t* colExCoef = + const std::int32_t* colExCoef = exCoefNumTbl + 0x60 * (img->levels - 1) + 12 * (tile->height & 7); for (int level = 0; level < img->levels; ++level) { @@ -3268,8 +3252,3 @@ int DCraw::crxParseImageHeader(uchar* cmp1TagData, unsigned int nTrack) return 0; } - -#undef _abs -#undef _min -#undef _constrain -#undef libraw_inline From 4529999f493d41458889f083eaf0a3d3a3cd3e3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Thu, 28 Nov 2019 09:11:56 +0100 Subject: [PATCH 187/208] C++-style casts (clang-tidy) --- rtengine/canon_cr3_decoder.cc | 86 +++++++++++++++++------------------ 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index 0d284f68b..a64a83010 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -349,9 +349,9 @@ int DCraw::parseCR3( tL = 4; AtomType = 0; - for (unsigned int c = 0; c < sizeof(AtomNamesList) / sizeof(*AtomNamesList); ++c) { - if (!strcmp(nmAtom, AtomNamesList[c].AtomName)) { - AtomType = AtomNamesList[c].AtomType; + for (const auto& atom : AtomNamesList) { + if (!strcmp(nmAtom, atom.AtomName)) { + AtomType = atom.AtomType; break; } } @@ -849,7 +849,7 @@ inline int crxBitstreamGetZeros(CrxBitstream* bitStrm) std::int32_t result = 0; if (bitStrm->bitData) { - _BitScanReverse((std::uint32_t*)&nonZeroBit, (std::uint32_t)bitStrm->bitData); + _BitScanReverse(&nonZeroBit, bitStrm->bitData); result = 31 - nonZeroBit; bitStrm->bitData <<= 32 - nonZeroBit; bitStrm->bitsLeft -= 32 - nonZeroBit; @@ -859,12 +859,12 @@ inline int crxBitstreamGetZeros(CrxBitstream* bitStrm) while (true) { while (bitStrm->curPos + 4 <= bitStrm->curBufSize) { nextData = - _byteswap_ulong(*(std::uint32_t*)(bitStrm->mdatBuf + bitStrm->curPos)); + _byteswap_ulong(*reinterpret_cast(bitStrm->mdatBuf + bitStrm->curPos)); bitStrm->curPos += 4; crxFillBuffer(bitStrm); if (nextData) { - _BitScanReverse((std::uint32_t*)&nonZeroBit, (std::uint32_t)nextData); + _BitScanReverse(&nonZeroBit, static_cast(nextData)); result = bitsLeft + 31 - nonZeroBit; bitStrm->bitData = nextData << (32 - nonZeroBit); bitStrm->bitsLeft = nonZeroBit; @@ -888,8 +888,8 @@ inline int crxBitstreamGetZeros(CrxBitstream* bitStrm) bitsLeft += 8; } - _BitScanReverse((std::uint32_t*)&nonZeroBit, (std::uint32_t)nextData); - result = (std::uint32_t)(bitsLeft + 7 - nonZeroBit); + _BitScanReverse(&nonZeroBit, static_cast(nextData)); + result = static_cast(bitsLeft + 7 - nonZeroBit); bitStrm->bitData = nextData << (32 - nonZeroBit); bitStrm->bitsLeft = nonZeroBit; } @@ -909,7 +909,7 @@ inline std::uint32_t crxBitstreamGetBits(CrxBitstream* bitStrm, int bits) // get them from stream if (bitStrm->curPos + 4 <= bitStrm->curBufSize) { nextWord = - _byteswap_ulong(*(std::uint32_t*)(bitStrm->mdatBuf + bitStrm->curPos)); + _byteswap_ulong(*reinterpret_cast(bitStrm->mdatBuf + bitStrm->curPos)); bitStrm->curPos += 4; crxFillBuffer(bitStrm); bitStrm->bitsLeft = 32 - (bits - bitsLeft); @@ -1661,7 +1661,7 @@ int crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) if (param->supportsPartial) { if (param->roundedBitsMask <= 0) { - param->lineBuf0 = (std::int32_t*)param->paramData; + param->lineBuf0 = param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; std::int32_t* lineBuf = param->lineBuf1 + 1; @@ -1680,7 +1680,7 @@ int crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) } } - param->lineBuf0 = (std::int32_t*)param->paramData; + param->lineBuf0 = param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; std::int32_t* lineBuf = param->lineBuf1 + 1; @@ -1692,8 +1692,8 @@ int crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) ++param->curLine; } } else { - param->lineBuf2 = (std::int32_t*)param->nonProgrData; - param->lineBuf0 = (std::int32_t*)param->paramData; + param->lineBuf2 = param->nonProgrData; + param->lineBuf0 = param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; std::int32_t* lineBuf = param->lineBuf1 + 1; @@ -1706,13 +1706,13 @@ int crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) } } else if (!param->supportsPartial) { std::int32_t lineLength = param->subbandWidth + 2; - param->lineBuf2 = (std::int32_t*)param->nonProgrData; + param->lineBuf2 = param->nonProgrData; if (param->curLine & 1) { - param->lineBuf1 = (std::int32_t*)param->paramData; + param->lineBuf1 = param->paramData; param->lineBuf0 = param->lineBuf1 + lineLength; } else { - param->lineBuf0 = (std::int32_t*)param->paramData; + param->lineBuf0 = param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; } @@ -1728,10 +1728,10 @@ int crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) std::int32_t lineLength = param->subbandWidth + 2; if (param->curLine & 1) { - param->lineBuf1 = (std::int32_t*)param->paramData; + param->lineBuf1 = param->paramData; param->lineBuf0 = param->lineBuf1 + lineLength; } else { - param->lineBuf0 = (std::int32_t*)param->paramData; + param->lineBuf0 = param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; } @@ -1747,10 +1747,10 @@ int crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) std::int32_t lineLength = param->subbandWidth + 2; if (param->curLine & 1) { - param->lineBuf1 = (std::int32_t*)param->paramData; + param->lineBuf1 = param->paramData; param->lineBuf0 = param->lineBuf1 + lineLength; } else { - param->lineBuf0 = (std::int32_t*)param->paramData; + param->lineBuf0 = param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; } @@ -1805,7 +1805,7 @@ int crxDecodeLineWithIQuantization(CrxSubband* subband) } // update subband buffers - std::int32_t* bandBuf = (std::int32_t*)subband->bandBuf; + std::int32_t* bandBuf = reinterpret_cast(subband->bandBuf); std::int32_t qScale = q_step_tbl[subband->quantValue % 6] >> (6 - subband->quantValue / 6); @@ -2421,18 +2421,18 @@ int crxParamInit(CrxBandParam** param, std::uint64_t subbandMdatOffset, { std::int32_t progrDataSize = supportsPartial ? 0 : sizeof(std::int32_t) * subbandWidth; std::int32_t paramLength = 2 * subbandWidth + 4; - std::uint8_t* paramBuf = (std::uint8_t*)calloc( - 1, sizeof(CrxBandParam) + sizeof(std::int32_t) * paramLength + progrDataSize); + std::uint8_t* paramBuf = static_cast(calloc( + 1, sizeof(CrxBandParam) + sizeof(std::int32_t) * paramLength + progrDataSize)); if (!paramBuf) { return -1; } - *param = (CrxBandParam*)paramBuf; + *param = reinterpret_cast(paramBuf); paramBuf += sizeof(CrxBandParam); - (*param)->paramData = (std::int32_t*)paramBuf; + (*param)->paramData = reinterpret_cast(paramBuf); (*param)->nonProgrData = progrDataSize ? (*param)->paramData + paramLength : nullptr; (*param)->subbandWidth = subbandWidth; @@ -2491,7 +2491,7 @@ int crxSetupSubbandData(CrxImage* img, CrxPlaneComp* planeComp, } // buffer allocation - planeComp->compBuf = (std::uint8_t*)malloc(compDataSize); + planeComp->compBuf = static_cast(malloc(compDataSize)); if (!planeComp->compBuf) { return -1; @@ -2511,11 +2511,11 @@ int crxSetupSubbandData(CrxImage* img, CrxPlaneComp* planeComp, // wavelet data initialisation if (img->levels) { CrxWaveletTransform* waveletTransforms = - (CrxWaveletTransform*)(planeComp->compBuf + waveletDataOffset); - std::int32_t* paramData = (std::int32_t*)(planeComp->compBuf + compCoeffDataOffset); + reinterpret_cast(planeComp->compBuf + waveletDataOffset); + std::int32_t* paramData = reinterpret_cast(planeComp->compBuf + compCoeffDataOffset); planeComp->waveletTransform = waveletTransforms; - waveletTransforms[0].subband0Buf = (std::int32_t*)subbands->bandBuf; + waveletTransforms[0].subband0Buf = reinterpret_cast(subbands->bandBuf); for (int level = 0; level < img->levels; ++level) { std::int32_t band = 3 * level + 1; @@ -2547,11 +2547,11 @@ int crxSetupSubbandData(CrxImage* img, CrxPlaneComp* planeComp, waveletTransforms[level].curLine = 0; waveletTransforms[level].curH = 0; waveletTransforms[level].fltTapH = 0; - waveletTransforms[level].subband1Buf = (std::int32_t*)subbands[band].bandBuf; + waveletTransforms[level].subband1Buf = reinterpret_cast(subbands[band].bandBuf); waveletTransforms[level].subband2Buf = - (std::int32_t*)subbands[band + 1].bandBuf; + reinterpret_cast(subbands[band + 1].bandBuf); waveletTransforms[level].subband3Buf = - (std::int32_t*)subbands[band + 2].bandBuf; + reinterpret_cast(subbands[band + 2].bandBuf); paramData = waveletTransforms[level].lineBuf[7] + transformWidth; } @@ -2584,7 +2584,7 @@ int crxSetupSubbandData(CrxImage* img, CrxPlaneComp* planeComp, int DCraw::crxDecodePlane(void* p, std::uint32_t planeNumber) { - CrxImage* img = (CrxImage*)p; + CrxImage* img = static_cast(p); int imageRow = 0; for (int tRow = 0; tRow < img->tileRows; tRow++) { @@ -2630,7 +2630,7 @@ int DCraw::crxDecodePlane(void* p, std::uint32_t planeNumber) return -1; } - std::int32_t* lineData = (std::int32_t*)planeComp->subBands->bandBuf; + std::int32_t* lineData = reinterpret_cast(planeComp->subBands->bandBuf); crxConvertPlaneLine(img, imageRow + i, imageCol, planeNumber, lineData, tile->width); } @@ -2784,10 +2784,10 @@ int crxReadImageHeaders(crx_data_header_t* hdr, CrxImage* img, std::uint8_t* mda } if (!img->tiles) { - img->tiles = (CrxTile*)malloc( + img->tiles = static_cast(malloc( sizeof(CrxTile) * nTiles + sizeof(CrxPlaneComp) * nTiles * img->nPlanes + - sizeof(CrxSubband) * nTiles * img->nPlanes * img->subbandCount); + sizeof(CrxSubband) * nTiles * img->nPlanes * img->subbandCount)); if (!img->tiles) { return -1; @@ -2795,8 +2795,8 @@ int crxReadImageHeaders(crx_data_header_t* hdr, CrxImage* img, std::uint8_t* mda // memory areas in allocated chunk CrxTile* tile = img->tiles; - CrxPlaneComp* comps = (CrxPlaneComp*)(tile + nTiles); - CrxSubband* bands = (CrxSubband*)(comps + img->nPlanes * nTiles); + CrxPlaneComp* comps = reinterpret_cast(tile + nTiles); + CrxSubband* bands = reinterpret_cast(comps + img->nPlanes * nTiles); for (unsigned int curTile = 0; curTile < nTiles; curTile++, tile++) { tile->tileFlag = 0; // tile neighbouring flags @@ -2989,8 +2989,8 @@ int crxSetupImageData(crx_data_header_t* hdr, CrxImage* img, std::int16_t* outBu // left as is. if (img->encType == 3 && img->nPlanes == 4 && img->nBits > 8) { img->planeBuf = - (std::int16_t*)malloc(img->planeHeight * img->planeWidth * img->nPlanes * - ((img->samplePrecision + 7) >> 3)); + static_cast(malloc(img->planeHeight * img->planeWidth * img->nPlanes * + ((img->samplePrecision + 7) >> 3))); if (!img->planeBuf) { return -1; @@ -3105,7 +3105,7 @@ void DCraw::crxLoadDecodeLoop(void* img, int nPlanes) void DCraw::crxConvertPlaneLineDf(void* p, int imageRow) { - crxConvertPlaneLine((CrxImage*)p, imageRow); + crxConvertPlaneLine(static_cast(p), imageRow); } void DCraw::crxLoadFinalizeLoopE3(void* p, int planeHeight) @@ -3145,7 +3145,7 @@ void DCraw::crxLoadRaw() // /*imgdata.color.*/maximum = (1 << hdr.nBits) - 1; - std::uint8_t* hdrBuf = (std::uint8_t*)malloc(hdr.mdatHdrSize); + std::uint8_t* hdrBuf = static_cast(malloc(hdr.mdatHdrSize)); // read image header #ifdef _OPENMP @@ -3164,7 +3164,7 @@ void DCraw::crxLoadRaw() } // parse and setup the image data - if (crxSetupImageData(&hdr, &img, (std::int16_t*)raw_image, + if (crxSetupImageData(&hdr, &img, reinterpret_cast(raw_image), hdr.MediaOffset /*data_offset*/, hdr.MediaSize /*RT_canon_CR3_data.data_size*/, hdrBuf)) { derror(); From c5168038e8b4491fb5cb92cb05b4b9823c3b2898 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Thu, 28 Nov 2019 10:37:18 +0100 Subject: [PATCH 188/208] Add missing include --- rtengine/canon_cr3_decoder.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index a64a83010..8b39c3b02 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -59,6 +59,8 @@ #include "dcraw.h" +#include "rt_math.h" + void DCraw::parse_canon_cr3() { strncpy(make, "Canon", sizeof(make)); From 200d746465267433a781b363ce38b8186ffedbd7 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 28 Nov 2019 16:07:41 +0100 Subject: [PATCH 189/208] Capture sharpening: fix border issues --- rtengine/capturesharpening.cc | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index 55d2d3378..e8770f95a 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -533,8 +533,8 @@ BENCHFUN } constexpr int tileSize = 32; - constexpr int border = 5; - constexpr int fullTileSize = tileSize + 2 * border; + const int border = iterations <= 30 ? 5 : 7; + const int fullTileSize = tileSize + 2 * border; const float cornerRadius = std::min(1.15f, sigma + sigmaCornerOffset); const float cornerDistance = sqrt(rtengine::SQR(W * 0.5f) + rtengine::SQR(H * 0.5f)); const float distanceFactor = (cornerRadius - sigma) / cornerDistance; @@ -569,10 +569,10 @@ BENCHFUN } } } - for (int k = 0, ii = endOfCol ? H - fullTileSize : i; k < fullTileSize; ++k, ++ii) { - for (int l = 0, jj = endOfRow ? W - fullTileSize : j; l < fullTileSize; ++l, ++jj) { - tmpIThr[k][l] = oldLuminance[ii - border][jj - border]; - lumThr[k][l] = oldLuminance[ii - border][jj - border]; + for (int k = 0, ii = endOfCol ? H - fullTileSize : i - border; k < fullTileSize; ++k, ++ii) { + for (int l = 0, jj = endOfRow ? W - fullTileSize : j - border; l < fullTileSize; ++l, ++jj) { + tmpIThr[k][l] = oldLuminance[ii][jj]; + lumThr[k][l] = oldLuminance[ii][jj]; } } } else { @@ -651,8 +651,8 @@ BENCHFUN } if (endOfRow || endOfCol) { // special handling for small tiles at end of row or column - for (int k = border, ii = endOfCol ? H - fullTileSize - border : i - border; k < fullTileSize - border; ++k) { - for (int l = border, jj = endOfRow ? W - fullTileSize - border : j - border; l < fullTileSize - border; ++l) { + for (int k = border, ii = endOfCol ? H - fullTileSize : i - border; k < fullTileSize - border; ++k) { + for (int l = border, jj = endOfRow ? W - fullTileSize : j - border; l < fullTileSize - border; ++l) { luminance[ii + k][jj + l] = rtengine::intp(blend[ii + k][jj + l], std::max(tmpIThr[k][l], 0.0f), luminance[ii + k][jj + l]); } } From b8dcd93a6ad42540e530489bb02a905a346f5c5b Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Fri, 29 Nov 2019 13:09:37 +0100 Subject: [PATCH 190/208] Reduce searches for lensfun data if there is no entry for the combo of camera and lens --- rtengine/rtlensfun.cc | 11 ++++++++++- rtengine/rtlensfun.h | 1 + 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/rtengine/rtlensfun.cc b/rtengine/rtlensfun.cc index 665fbd199..6ad475beb 100644 --- a/rtengine/rtlensfun.cc +++ b/rtengine/rtlensfun.cc @@ -24,7 +24,6 @@ #include "procparams.h" #include "rtlensfun.h" #include "settings.h" - namespace rtengine { @@ -500,6 +499,7 @@ std::unique_ptr LFDatabase::getModifier(const LFCamera &camera, cons return ret; } +Glib::ustring LFDatabase::lastKey; std::unique_ptr LFDatabase::findModifier(const procparams::LensProfParams &lensProf, const FramesMetaData *idata, int width, int height, const procparams::CoarseTransformParams &coarse, int rawRotationDeg) { @@ -521,6 +521,11 @@ std::unique_ptr LFDatabase::findModifier(const procparams::LensProfP return nullptr; } + Glib::ustring temp = make + model + lens; + if (lastKey == temp) { + // This combination was not found in last search => do not search again + return nullptr; + } const LFDatabase *db = getInstance(); LFCamera c = db->findCamera(make, model); LFLens l = db->findLens(lensProf.lfAutoMatch() ? c : LFCamera(), lens); @@ -549,6 +554,10 @@ std::unique_ptr LFDatabase::findModifier(const procparams::LensProfP << (ret ? ret->getDisplayString() : "NONE") << std::endl; } + if (!ret) { + lastKey = temp; + } + return ret; } diff --git a/rtengine/rtlensfun.h b/rtengine/rtlensfun.h index 7dcd96007..302045695 100644 --- a/rtengine/rtlensfun.h +++ b/rtengine/rtlensfun.h @@ -135,6 +135,7 @@ private: mutable MyMutex lfDBMutex; static LFDatabase instance_; lfDatabase *data_; + static Glib::ustring lastKey; }; } // namespace rtengine From c4fe355fbb3802fa104c07a108a7ee83ee440ed4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Fri, 29 Nov 2019 14:57:14 +0100 Subject: [PATCH 191/208] Fix formatting and use `bool` (WIP) --- rtengine/canon_cr3_decoder.cc | 173 ++++++++++++++++------------------ 1 file changed, 83 insertions(+), 90 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index 8b39c3b02..6056f46bb 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -860,8 +860,7 @@ inline int crxBitstreamGetZeros(CrxBitstream* bitStrm) while (true) { while (bitStrm->curPos + 4 <= bitStrm->curBufSize) { - nextData = - _byteswap_ulong(*reinterpret_cast(bitStrm->mdatBuf + bitStrm->curPos)); + nextData = _byteswap_ulong(*reinterpret_cast(bitStrm->mdatBuf + bitStrm->curPos)); bitStrm->curPos += 4; crxFillBuffer(bitStrm); @@ -910,8 +909,7 @@ inline std::uint32_t crxBitstreamGetBits(CrxBitstream* bitStrm, int bits) if (bitsLeft < bits) { // get them from stream if (bitStrm->curPos + 4 <= bitStrm->curBufSize) { - nextWord = - _byteswap_ulong(*reinterpret_cast(bitStrm->mdatBuf + bitStrm->curPos)); + nextWord = _byteswap_ulong(*reinterpret_cast(bitStrm->mdatBuf + bitStrm->curPos)); bitStrm->curPos += 4; crxFillBuffer(bitStrm); bitStrm->bitsLeft = 32 - (bits - bitsLeft); @@ -939,30 +937,34 @@ inline std::uint32_t crxBitstreamGetBits(CrxBitstream* bitStrm, int bits) return result; } -inline int crxPredictKParameter(std::int32_t prevK, std::int32_t bitCode, - std::int32_t maxVal = 0) +inline std::int32_t crxPredictKParameter(std::int32_t prevK, std::int32_t bitCode, std::int32_t maxVal = 0) { - std::int32_t newKParam = prevK - (bitCode < (1 << prevK >> 1)) + - ((bitCode >> prevK) > 2) + ((bitCode >> prevK) > 5); + const std::int32_t newKParam = + prevK + - (bitCode < (1 << prevK >> 1)) + + ((bitCode >> prevK) > 2) + ((bitCode >> prevK) > 5); - return !maxVal || newKParam < maxVal ? newKParam : maxVal; + return + !maxVal || newKParam < maxVal + ? newKParam + : maxVal; } -inline void crxDecodeSymbolL1(CrxBandParam* param, - std::int32_t doMedianPrediction, - std::int32_t notEOL = 0) +inline void crxDecodeSymbolL1(CrxBandParam* param, std::int32_t doMedianPrediction, bool notEOL = false) { if (doMedianPrediction) { - std::int32_t symb[4]; + const std::int32_t delta = param->lineBuf0[1] - param->lineBuf0[0]; + const std::int32_t symb[4] = { + delta + param->lineBuf1[0], + delta + param->lineBuf1[0], + param->lineBuf1[0], + param->lineBuf0[1] + }; - std::int32_t delta = param->lineBuf0[1] - param->lineBuf0[0]; - symb[2] = param->lineBuf1[0]; - symb[0] = symb[1] = delta + symb[2]; - symb[3] = param->lineBuf0[1]; - - param->lineBuf1[1] = - symb[(((param->lineBuf0[0] < param->lineBuf1[0]) ^ (delta < 0)) << 1) + - ((param->lineBuf1[0] < param->lineBuf0[1]) ^ (delta < 0))]; + param->lineBuf1[1] = symb[ + (((param->lineBuf0[0] < param->lineBuf1[0]) ^ (delta < 0)) << 1) + + ((param->lineBuf1[0] < param->lineBuf0[1]) ^ (delta < 0)) + ]; } else { param->lineBuf1[1] = param->lineBuf0[1]; } @@ -973,8 +975,7 @@ inline void crxDecodeSymbolL1(CrxBandParam* param, if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); } else if (param->kParam) { - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); } // add converted (+/-) error code to predicted value @@ -982,7 +983,7 @@ inline void crxDecodeSymbolL1(CrxBandParam* param, // for not end of the line - use one symbol ahead to estimate next K if (notEOL) { - std::int32_t nextDelta = (param->lineBuf0[2] - param->lineBuf0[1]) << 1; + const std::int32_t nextDelta = (param->lineBuf0[2] - param->lineBuf0[1]) << 1; bitCode = (bitCode + std::abs(nextDelta)) >> 1; ++param->lineBuf0; } @@ -993,17 +994,16 @@ inline void crxDecodeSymbolL1(CrxBandParam* param, ++param->lineBuf1; } -int crxDecodeLine(CrxBandParam* param) +bool crxDecodeLine(CrxBandParam* param) { int length = param->subbandWidth; param->lineBuf1[0] = param->lineBuf0[1]; for (; length > 1; --length) { - if (param->lineBuf1[0] != param->lineBuf0[1] || - param->lineBuf1[0] != param->lineBuf0[2]) { - crxDecodeSymbolL1(param, 1, 1); - } else { + if (param->lineBuf1[0] != param->lineBuf0[1] || param->lineBuf1[0] != param->lineBuf0[2]) { + crxDecodeSymbolL1(param, 1, true); + } else { int nSyms = 0; if (crxBitstreamGetBits(¶m->bitStream, 1)) { @@ -1036,7 +1036,7 @@ int crxDecodeLine(CrxBandParam* param) } if (nSyms > length) { - return -1; + return false; } } @@ -1053,36 +1053,37 @@ int crxDecodeLine(CrxBandParam* param) } if (length > 0) { - crxDecodeSymbolL1(param, 0, (length > 1)); + crxDecodeSymbolL1(param, 0, length > 1); } } } if (length == 1) { - crxDecodeSymbolL1(param, 1, 0); + crxDecodeSymbolL1(param, 1, false); } param->lineBuf1[1] = param->lineBuf1[0] + 1; - return 0; + return true; } -inline void crxDecodeSymbolL1Rounded(CrxBandParam* param, - std::int32_t doSym = 1, - std::int32_t doCode = 1) +inline void crxDecodeSymbolL1Rounded(CrxBandParam* param, bool doSym = true, bool doCode = true) { std::int32_t sym = param->lineBuf0[1]; if (doSym) { // calculate the next symbol gradient - std::int32_t symb[4]; - std::int32_t deltaH = param->lineBuf0[1] - param->lineBuf0[0]; - symb[2] = param->lineBuf1[0]; - symb[0] = symb[1] = deltaH + symb[2]; - symb[3] = param->lineBuf0[1]; - sym = - symb[(((param->lineBuf0[0] < param->lineBuf1[0]) ^ (deltaH < 0)) << 1) + - ((param->lineBuf1[0] < param->lineBuf0[1]) ^ (deltaH < 0))]; + const std::int32_t deltaH = param->lineBuf0[1] - param->lineBuf0[0]; + const std::int32_t symb[4] = { + deltaH + param->lineBuf1[0], + deltaH + param->lineBuf1[0], + param->lineBuf1[0], + param->lineBuf0[1] + }; + sym = symb[ + (((param->lineBuf0[0] < param->lineBuf1[0]) ^ (deltaH < 0)) << 1) + + ((param->lineBuf1[0] < param->lineBuf0[1]) ^ (deltaH < 0)) + ]; } std::uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); @@ -1090,36 +1091,30 @@ inline void crxDecodeSymbolL1Rounded(CrxBandParam* param, if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); } else if (param->kParam) { - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); } std::int32_t code = -(bitCode & 1) ^ (bitCode >> 1); - param->lineBuf1[1] = param->roundedBitsMask * 2 * code + static_cast(code < 0) + sym; + param->lineBuf1[1] = param->roundedBitsMask * 2 * code + (code < 0) + sym; if (doCode) { if (param->lineBuf0[2] > param->lineBuf0[1]) { - code = (param->lineBuf0[2] - param->lineBuf0[1] + param->roundedBitsMask - - 1) >> - param->roundedBits; + code = (param->lineBuf0[2] - param->lineBuf0[1] + param->roundedBitsMask - 1) >> param->roundedBits; } else { - code = -( - (param->lineBuf0[1] - param->lineBuf0[2] + param->roundedBitsMask) >> - param->roundedBits); + code = -((param->lineBuf0[1] - param->lineBuf0[2] + param->roundedBitsMask) >> param->roundedBits); } - param->kParam = crxPredictKParameter(param->kParam, - (bitCode + 2 * std::abs(code)) >> 1, 15); - } else { + param->kParam = crxPredictKParameter(param->kParam, (bitCode + 2 * std::abs(code)) >> 1, 15); + } else { param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); } ++param->lineBuf1; } -int crxDecodeLineRounded(CrxBandParam* param) +bool crxDecodeLineRounded(CrxBandParam* param) { - std::int32_t valueReached = 0; + bool valueReached = false; param->lineBuf0[0] = param->lineBuf0[1]; param->lineBuf1[0] = param->lineBuf0[1]; @@ -1129,13 +1124,12 @@ int crxDecodeLineRounded(CrxBandParam* param) if (std::abs(param->lineBuf0[2] - param->lineBuf0[1]) > param->roundedBitsMask) { crxDecodeSymbolL1Rounded(param); ++param->lineBuf0; - valueReached = 1; - } else if (valueReached || std::abs(param->lineBuf0[0] - param->lineBuf1[0]) > - param->roundedBitsMask) { + valueReached = true; + } else if (valueReached || std::abs(param->lineBuf0[0] - param->lineBuf1[0]) > param->roundedBitsMask) { crxDecodeSymbolL1Rounded(param); ++param->lineBuf0; - valueReached = 0; - } else { + valueReached = false; + } else { int nSyms = 0; if (crxBitstreamGetBits(¶m->bitStream, 1)) { @@ -1169,7 +1163,7 @@ int crxDecodeLineRounded(CrxBandParam* param) } if (nSyms > length) { - return -1; + return false; } } @@ -1185,23 +1179,22 @@ int crxDecodeLineRounded(CrxBandParam* param) } if (length > 1) { - crxDecodeSymbolL1Rounded(param, 0); + crxDecodeSymbolL1Rounded(param, false); ++param->lineBuf0; - valueReached = std::abs(param->lineBuf0[1] - param->lineBuf0[0]) > - param->roundedBitsMask; + valueReached = std::abs(param->lineBuf0[1] - param->lineBuf0[0]) > param->roundedBitsMask; } else if (length == 1) { - crxDecodeSymbolL1Rounded(param, 0, 0); + crxDecodeSymbolL1Rounded(param, false, false); } } } if (length == 1) { - crxDecodeSymbolL1Rounded(param, 1, 0); + crxDecodeSymbolL1Rounded(param, true, false); } param->lineBuf1[1] = param->lineBuf1[0] + 1; - return 0; + return true; } int crxDecodeLineNoRefPrevLine(CrxBandParam* param) @@ -1535,7 +1528,7 @@ int crxDecodeTopLineRounded(CrxBandParam* param) return 0; } -int crxDecodeTopLineNoRefPrevLine(CrxBandParam* param) +bool crxDecodeTopLineNoRefPrevLine(CrxBandParam* param) { param->lineBuf0[0] = 0; param->lineBuf1[0] = 0; @@ -1587,7 +1580,7 @@ int crxDecodeTopLineNoRefPrevLine(CrxBandParam* param) } if (nSyms > length) { - return -1; + return false; } } } @@ -1642,21 +1635,21 @@ int crxDecodeTopLineNoRefPrevLine(CrxBandParam* param) param->lineBuf1[1] = 0; - return 0; + return true; } -int crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) +bool crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) { if (!param || !bandBuf) { - return -1; + return false; } if (param->curLine >= param->subbandHeight) { - return -1; + return false; } if (param->curLine == 0) { - std::int32_t lineLength = param->subbandWidth + 2; + const std::int32_t lineLength = param->subbandWidth + 2; param->sParam = 0; param->kParam = 0; @@ -1665,10 +1658,10 @@ int crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) if (param->roundedBitsMask <= 0) { param->lineBuf0 = param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; - std::int32_t* lineBuf = param->lineBuf1 + 1; + std::int32_t* const lineBuf = param->lineBuf1 + 1; if (crxDecodeTopLine(param)) { - return -1; + return false; } memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(std::int32_t)); @@ -1687,7 +1680,7 @@ int crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) std::int32_t* lineBuf = param->lineBuf1 + 1; if (crxDecodeTopLineRounded(param)) { - return -1; + return false; } memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(std::int32_t)); @@ -1699,8 +1692,8 @@ int crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) param->lineBuf1 = param->lineBuf0 + lineLength; std::int32_t* lineBuf = param->lineBuf1 + 1; - if (crxDecodeTopLineNoRefPrevLine(param)) { - return -1; + if (!crxDecodeTopLineNoRefPrevLine(param)) { + return false; } memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(std::int32_t)); @@ -1721,7 +1714,7 @@ int crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) std::int32_t* lineBuf = param->lineBuf1 + 1; if (crxDecodeLineNoRefPrevLine(param)) { - return -1; + return false; } memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(std::int32_t)); @@ -1739,8 +1732,8 @@ int crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) std::int32_t* lineBuf = param->lineBuf1 + 1; - if (crxDecodeLine(param)) { - return -1; + if (!crxDecodeLine(param)) { + return false; } memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(std::int32_t)); @@ -1758,15 +1751,15 @@ int crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) std::int32_t* lineBuf = param->lineBuf1 + 1; - if (crxDecodeLineRounded(param)) { - return -1; + if (!crxDecodeLineRounded(param)) { + return false; } memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(std::int32_t)); ++param->curLine; } - return 0; + return true; } int crxDecodeLineWithIQuantization(CrxSubband* subband) @@ -1798,7 +1791,7 @@ int crxDecodeLineWithIQuantization(CrxSubband* subband) } } - if (crxDecodeLine(subband->bandParam, subband->bandBuf)) { + if (!crxDecodeLine(subband->bandParam, subband->bandBuf)) { return -1; } @@ -2627,7 +2620,7 @@ int DCraw::crxDecodePlane(void* p, std::uint32_t planeNumber) } for (int i = 0; i < tile->height; ++i) { - if (crxDecodeLine(planeComp->subBands->bandParam, + if (!crxDecodeLine(planeComp->subBands->bandParam, planeComp->subBands->bandBuf)) { return -1; } From 92e6768bee473fcf0f22f3564cb1267d1ab151c4 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Fri, 29 Nov 2019 15:19:34 +0100 Subject: [PATCH 192/208] Improve caching of lensfun mismatches --- rtengine/rtlensfun.cc | 11 ++++++----- rtengine/rtlensfun.h | 3 ++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/rtengine/rtlensfun.cc b/rtengine/rtlensfun.cc index 6ad475beb..7b959ce8b 100644 --- a/rtengine/rtlensfun.cc +++ b/rtengine/rtlensfun.cc @@ -24,6 +24,7 @@ #include "procparams.h" #include "rtlensfun.h" #include "settings.h" + namespace rtengine { @@ -499,7 +500,7 @@ std::unique_ptr LFDatabase::getModifier(const LFCamera &camera, cons return ret; } -Glib::ustring LFDatabase::lastKey; +std::set LFDatabase::notFound; std::unique_ptr LFDatabase::findModifier(const procparams::LensProfParams &lensProf, const FramesMetaData *idata, int width, int height, const procparams::CoarseTransformParams &coarse, int rawRotationDeg) { @@ -521,9 +522,9 @@ std::unique_ptr LFDatabase::findModifier(const procparams::LensProfP return nullptr; } - Glib::ustring temp = make + model + lens; - if (lastKey == temp) { - // This combination was not found in last search => do not search again + const std::string key = (make + model + lens).collate_key(); + if (notFound.find(key) != notFound.end()) { + // This combination was not found => do not search again return nullptr; } const LFDatabase *db = getInstance(); @@ -555,7 +556,7 @@ std::unique_ptr LFDatabase::findModifier(const procparams::LensProfP } if (!ret) { - lastKey = temp; + notFound.emplace(key); } return ret; diff --git a/rtengine/rtlensfun.h b/rtengine/rtlensfun.h index 302045695..573b93fca 100644 --- a/rtengine/rtlensfun.h +++ b/rtengine/rtlensfun.h @@ -21,6 +21,7 @@ #pragma once #include +#include #include #include @@ -135,7 +136,7 @@ private: mutable MyMutex lfDBMutex; static LFDatabase instance_; lfDatabase *data_; - static Glib::ustring lastKey; + static std::set notFound; }; } // namespace rtengine From 3748133cd2b80fc0bd98ba7eecacfe631964cfb1 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sat, 30 Nov 2019 22:19:33 +0100 Subject: [PATCH 193/208] Fix some vavorite tab issues --- rtgui/toolpanelcoord.cc | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index a636994b2..57f61a09c 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -309,13 +309,17 @@ void ToolPanelCoordinator::imageTypeChanged (bool isRaw, bool isBayer, bool isXt { rawPanelSW->set_sensitive(true); sensorxtrans->FoldableToolPanel::hide(); + xtransprocess->FoldableToolPanel::hide(); + xtransrawexposure->FoldableToolPanel::hide(); sensorbayer->FoldableToolPanel::show(); + bayerprocess->FoldableToolPanel::show(); + bayerpreprocess->FoldableToolPanel::show(); + rawcacorrection->FoldableToolPanel::show(); preprocess->FoldableToolPanel::show(); flatfield->FoldableToolPanel::show(); filmNegative->FoldableToolPanel::show(); pdSharpening->FoldableToolPanel::show(); retinex->FoldableToolPanel::setGrayedOut(false); - return false; } ); @@ -326,13 +330,17 @@ void ToolPanelCoordinator::imageTypeChanged (bool isRaw, bool isBayer, bool isXt { rawPanelSW->set_sensitive(true); sensorxtrans->FoldableToolPanel::show(); + xtransprocess->FoldableToolPanel::show(); + xtransrawexposure->FoldableToolPanel::show(); sensorbayer->FoldableToolPanel::hide(); + bayerprocess->FoldableToolPanel::hide(); + bayerpreprocess->FoldableToolPanel::hide(); + rawcacorrection->FoldableToolPanel::hide(); preprocess->FoldableToolPanel::show(); flatfield->FoldableToolPanel::show(); filmNegative->FoldableToolPanel::show(); pdSharpening->FoldableToolPanel::show(); retinex->FoldableToolPanel::setGrayedOut(false); - return false; } ); @@ -343,13 +351,17 @@ void ToolPanelCoordinator::imageTypeChanged (bool isRaw, bool isBayer, bool isXt { rawPanelSW->set_sensitive(true); sensorbayer->FoldableToolPanel::hide(); + bayerprocess->FoldableToolPanel::hide(); + bayerpreprocess->FoldableToolPanel::hide(); + rawcacorrection->FoldableToolPanel::hide(); sensorxtrans->FoldableToolPanel::hide(); + xtransprocess->FoldableToolPanel::hide(); + xtransrawexposure->FoldableToolPanel::hide(); preprocess->FoldableToolPanel::hide(); flatfield->FoldableToolPanel::show(); filmNegative->FoldableToolPanel::hide(); pdSharpening->FoldableToolPanel::show(); retinex->FoldableToolPanel::setGrayedOut(false); - return false; } ); @@ -359,13 +371,17 @@ void ToolPanelCoordinator::imageTypeChanged (bool isRaw, bool isBayer, bool isXt { rawPanelSW->set_sensitive(true); sensorbayer->FoldableToolPanel::hide(); + bayerprocess->FoldableToolPanel::hide(); + bayerpreprocess->FoldableToolPanel::hide(); + rawcacorrection->FoldableToolPanel::hide(); sensorxtrans->FoldableToolPanel::hide(); + xtransprocess->FoldableToolPanel::hide(); + xtransrawexposure->FoldableToolPanel::hide(); preprocess->FoldableToolPanel::hide(); flatfield->FoldableToolPanel::hide(); filmNegative->FoldableToolPanel::hide(); pdSharpening->FoldableToolPanel::hide(); retinex->FoldableToolPanel::setGrayedOut(false); - return false; } ); @@ -375,10 +391,18 @@ void ToolPanelCoordinator::imageTypeChanged (bool isRaw, bool isBayer, bool isXt [this]() -> bool { rawPanelSW->set_sensitive(false); + sensorbayer->FoldableToolPanel::hide(); + bayerprocess->FoldableToolPanel::hide(); + bayerpreprocess->FoldableToolPanel::hide(); + rawcacorrection->FoldableToolPanel::hide(); + sensorxtrans->FoldableToolPanel::hide(); + xtransprocess->FoldableToolPanel::hide(); + xtransrawexposure->FoldableToolPanel::hide(); + preprocess->FoldableToolPanel::hide(); + flatfield->FoldableToolPanel::hide(); filmNegative->FoldableToolPanel::hide(); pdSharpening->FoldableToolPanel::hide(); retinex->FoldableToolPanel::setGrayedOut(true); - return false; } ); From 5852ee02b98d741e3d61c71484a53766bfa6cb39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Mon, 2 Dec 2019 08:20:25 +0100 Subject: [PATCH 194/208] Make `LFDatabase::findModifier()` non-static --- rtengine/iptransform.cc | 2 +- rtengine/rawimagesource.cc | 2 +- rtengine/rtlensfun.cc | 51 +++++++++++++++++++++++++------------- rtengine/rtlensfun.h | 10 ++++++-- rtgui/lensprofile.cc | 2 +- 5 files changed, 45 insertions(+), 22 deletions(-) diff --git a/rtengine/iptransform.cc b/rtengine/iptransform.cc index b1531cc9c..af513536e 100644 --- a/rtengine/iptransform.cc +++ b/rtengine/iptransform.cc @@ -415,7 +415,7 @@ void ImProcFunctions::transform (Imagefloat* original, Imagefloat* transformed, std::unique_ptr pLCPMap; if (needsLensfun()) { - pLCPMap = LFDatabase::findModifier(params->lensProf, metadata, oW, oH, params->coarse, rawRotationDeg); + pLCPMap = LFDatabase::getInstance()->findModifier(params->lensProf, metadata, oW, oH, params->coarse, rawRotationDeg); } else if (needsLCP()) { // don't check focal length to allow distortion correction for lenses without chip const std::shared_ptr pLCPProf = LCPStore::getInstance()->getProfile (params->lensProf.lcpFile); diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 4cfa84434..265c226b3 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -1385,7 +1385,7 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le if (!hasFlatField && lensProf.useVign && lensProf.lcMode != LensProfParams::LcMode::NONE) { std::unique_ptr pmap; if (lensProf.useLensfun()) { - pmap = LFDatabase::findModifier(lensProf, idata, W, H, coarse, -1); + pmap = LFDatabase::getInstance()->findModifier(lensProf, idata, W, H, coarse, -1); } else { const std::shared_ptr pLCPProf = LCPStore::getInstance()->getProfile(lensProf.lcpFile); diff --git a/rtengine/rtlensfun.cc b/rtengine/rtlensfun.cc index 7b959ce8b..51b98080a 100644 --- a/rtengine/rtlensfun.cc +++ b/rtengine/rtlensfun.cc @@ -500,14 +500,20 @@ std::unique_ptr LFDatabase::getModifier(const LFCamera &camera, cons return ret; } -std::set LFDatabase::notFound; - -std::unique_ptr LFDatabase::findModifier(const procparams::LensProfParams &lensProf, const FramesMetaData *idata, int width, int height, const procparams::CoarseTransformParams &coarse, int rawRotationDeg) +std::unique_ptr LFDatabase::findModifier( + const procparams::LensProfParams &lensProf, + const FramesMetaData *idata, + int width, + int height, + const procparams::CoarseTransformParams &coarse, + int rawRotationDeg +) const { + const float focallen = idata->getFocalLen(); + Glib::ustring make, model, lens; - float focallen = idata->getFocalLen(); if (lensProf.lfAutoMatch()) { - if (focallen <= 0) { + if (focallen <= 0.f) { return nullptr; } make = idata->getMake(); @@ -518,6 +524,7 @@ std::unique_ptr LFDatabase::findModifier(const procparams::LensProfP model = lensProf.lfCameraModel; lens = lensProf.lfLens; } + if (make.empty() || model.empty() || lens.empty()) { return nullptr; } @@ -527,15 +534,15 @@ std::unique_ptr LFDatabase::findModifier(const procparams::LensProfP // This combination was not found => do not search again return nullptr; } - const LFDatabase *db = getInstance(); - LFCamera c = db->findCamera(make, model); - LFLens l = db->findLens(lensProf.lfAutoMatch() ? c : LFCamera(), lens); - if (focallen <= 0 && l.data_ && l.data_->MinFocal == l.data_->MaxFocal) { - focallen = l.data_->MinFocal; - } - if (focallen <= 0) { - return nullptr; - } + + const LFCamera c = findCamera(make, model); + const LFLens l = findLens( + lensProf.lfAutoMatch() + ? c + : LFCamera(), + lens + ); + bool swap_xy = false; if (rawRotationDeg >= 0) { int rot = (coarse.rotate + rawRotationDeg) % 360; @@ -545,18 +552,28 @@ std::unique_ptr LFDatabase::findModifier(const procparams::LensProfP } } - std::unique_ptr ret = db->getModifier(c, l, idata->getFocalLen(), idata->getFNumber(), idata->getFocusDist(), width, height, swap_xy); + std::unique_ptr ret = getModifier( + c, + l, + idata->getFocalLen(), + idata->getFNumber(), + idata->getFocusDist(), + width, + height, + swap_xy + ); if (settings->verbose) { std::cout << "LENSFUN:\n" << " camera: " << c.getDisplayString() << "\n" << " lens: " << l.getDisplayString() << "\n" << " correction: " - << (ret ? ret->getDisplayString() : "NONE") << std::endl; + << (ret ? ret->getDisplayString() : "NONE") + << std::endl; } if (!ret) { - notFound.emplace(key); + notFound.insert(key); } return ret; diff --git a/rtengine/rtlensfun.h b/rtengine/rtlensfun.h index 573b93fca..06434c358 100644 --- a/rtengine/rtlensfun.h +++ b/rtengine/rtlensfun.h @@ -124,7 +124,13 @@ public: LFCamera findCamera(const Glib::ustring &make, const Glib::ustring &model) const; LFLens findLens(const LFCamera &camera, const Glib::ustring &name) const; - static std::unique_ptr findModifier(const procparams::LensProfParams &lensProf, const FramesMetaData *idata, int width, int height, const procparams::CoarseTransformParams &coarse, int rawRotationDeg); + std::unique_ptr findModifier( + const procparams::LensProfParams &lensProf, + const FramesMetaData *idata, + int width, int height, + const procparams::CoarseTransformParams &coarse, + int rawRotationDeg + ) const; private: std::unique_ptr getModifier(const LFCamera &camera, const LFLens &lens, @@ -136,7 +142,7 @@ private: mutable MyMutex lfDBMutex; static LFDatabase instance_; lfDatabase *data_; - static std::set notFound; + mutable std::set notFound; }; } // namespace rtengine diff --git a/rtgui/lensprofile.cc b/rtgui/lensprofile.cc index e2cdb5649..be21512d5 100644 --- a/rtgui/lensprofile.cc +++ b/rtgui/lensprofile.cc @@ -761,7 +761,7 @@ bool LensProfilePanel::checkLensfunCanCorrect(bool automatch) rtengine::procparams::ProcParams lpp; write(&lpp); - const std::unique_ptr mod(LFDatabase::findModifier(lpp.lensProf, metadata, 100, 100, lpp.coarse, -1)); + const std::unique_ptr mod(LFDatabase::getInstance()->findModifier(lpp.lensProf, metadata, 100, 100, lpp.coarse, -1)); return static_cast(mod); } From 98ac8d5f768ebd149f3b00f41ad3279059411f88 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Mon, 2 Dec 2019 11:24:15 +0100 Subject: [PATCH 195/208] generateTranslationDiffs --- rtdata/languages/Catala | 7 +++---- rtdata/languages/Chinese (Simplified) | 7 +++---- rtdata/languages/Czech | 5 ++--- rtdata/languages/Deutsch | 6 ++++++ rtdata/languages/English (UK) | 7 +++---- rtdata/languages/English (US) | 7 +++---- rtdata/languages/Espanol | 5 ++--- rtdata/languages/Francais | 5 ++--- rtdata/languages/Italiano | 7 +++---- rtdata/languages/Japanese | 5 ++--- rtdata/languages/Magyar | 7 +++---- rtdata/languages/Nederlands | 5 ++--- rtdata/languages/Polish | 5 ++--- rtdata/languages/Portugues | 5 ++--- rtdata/languages/Portugues (Brasil) | 5 ++--- rtdata/languages/Russian | 7 +++---- rtdata/languages/Serbian (Cyrilic Characters) | 7 +++---- rtdata/languages/Swedish | 7 +++---- 18 files changed, 49 insertions(+), 60 deletions(-) diff --git a/rtdata/languages/Catala b/rtdata/languages/Catala index a2d8012cd..36666a533 100644 --- a/rtdata/languages/Catala +++ b/rtdata/languages/Catala @@ -1334,8 +1334,8 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold !HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold !HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations !HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold -!HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma !HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations !HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius !HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost @@ -1349,7 +1349,6 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold -!HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma !HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength @@ -1876,7 +1875,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_FILMSIMULATION_STRENGTH;Strength !TP_FILMSIMULATION_ZEROCLUTSFOUND;Set HaldCLUT directory in Preferences !TP_FLATFIELD_CLIPCONTROL;Clip control -!TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, clip control can lead to color cast. +!TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, value 0 is used. !TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1. !TP_GRADIENT_CENTER;Center !TP_GRADIENT_CENTER_X;Center X @@ -2122,7 +2121,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_SAVEDIALOG_OK_TIP;Shortcut: Ctrl-Enter !TP_SHARPENING_BLUR;Blur radius !TP_SHARPENING_CONTRAST;Contrast threshold -!TP_SHARPENING_GAMMA;Gamma +!TP_SHARPENING_ITERCHECK;Auto limit iterations !TP_SHARPENING_RADIUS_BOOST;Corner radius boost !TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SOFTLIGHT_LABEL;Soft Light diff --git a/rtdata/languages/Chinese (Simplified) b/rtdata/languages/Chinese (Simplified) index 556f609ea..89a4dd9b4 100644 --- a/rtdata/languages/Chinese (Simplified) +++ b/rtdata/languages/Chinese (Simplified) @@ -1381,8 +1381,8 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold !HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold !HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations !HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold -!HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma !HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations !HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius !HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost @@ -1396,7 +1396,6 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold -!HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma !HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength @@ -1823,7 +1822,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_FILMSIMULATION_STRENGTH;Strength !TP_FILMSIMULATION_ZEROCLUTSFOUND;Set HaldCLUT directory in Preferences !TP_FLATFIELD_CLIPCONTROL;Clip control -!TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, clip control can lead to color cast. +!TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, value 0 is used. !TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1. !TP_GRADIENT_CENTER_X_TOOLTIP;Shift gradient to the left (negative values) or right (positive values). !TP_GRADIENT_CENTER_Y_TOOLTIP;Shift gradient up (negative values) or down (positive values). @@ -2090,7 +2089,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_RETINEX_VIEW_UNSHARP;Unsharp mask !TP_SHARPENING_BLUR;Blur radius !TP_SHARPENING_CONTRAST;Contrast threshold -!TP_SHARPENING_GAMMA;Gamma +!TP_SHARPENING_ITERCHECK;Auto limit iterations !TP_SHARPENING_RADIUS_BOOST;Corner radius boost !TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SHARPENMICRO_LABEL;Microcontrast diff --git a/rtdata/languages/Czech b/rtdata/languages/Czech index af9ae0c88..0ce34e3ee 100644 --- a/rtdata/languages/Czech +++ b/rtdata/languages/Czech @@ -2329,12 +2329,11 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values !HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold !HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations !HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold -!HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma !HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations !HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius !HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost -!HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma !PARTIALPASTE_FILMNEGATIVE;Film Negative !PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode !TP_DEHAZE_LUMINANCE;Luminance only @@ -2345,5 +2344,5 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !TP_FILMNEGATIVE_PICK;Pick neutral spots !TP_FILMNEGATIVE_RED;Red ratio !TP_PDSHARPENING_LABEL;Capture Sharpening -!TP_SHARPENING_GAMMA;Gamma +!TP_SHARPENING_ITERCHECK;Auto limit iterations !TP_SHARPENING_RADIUS_BOOST;Corner radius boost diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index 0ee886945..9122d5984 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -2386,3 +2386,9 @@ ZOOMPANEL_ZOOMFITSCREEN;An Bildschirm anpassen.\nTaste: Alt + f ZOOMPANEL_ZOOMIN;Hineinzoomen\nTaste: + ZOOMPANEL_ZOOMOUT;Herauszoomen\nTaste: - +!!!!!!!!!!!!!!!!!!!!!!!!! +! Untranslated keys follow; remove the ! prefix after an entry is translated. +!!!!!!!!!!!!!!!!!!!!!!!!! + +!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations +!TP_SHARPENING_ITERCHECK;Auto limit iterations diff --git a/rtdata/languages/English (UK) b/rtdata/languages/English (UK) index 6c1398a16..1fc07391e 100644 --- a/rtdata/languages/English (UK) +++ b/rtdata/languages/English (UK) @@ -89,7 +89,6 @@ TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colours of the skin, minimiz TP_DIRPYREQUALIZER_TOOLTIP;Attempts to reduce artifacts in the transitions between skin colours (hue, chroma, luma) and the rest of the image. TP_EXPOSURE_CLAMPOOG;Clip out-of-gamut colours TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no colour) in the original scene. The patches should differ in brightness. Set the white balance afterwards. -TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, clip control can lead to colour cast. TP_GRADIENT_CENTER;Centre TP_GRADIENT_CENTER_X;Centre X TP_GRADIENT_CENTER_Y;Centre Y @@ -859,8 +858,8 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold !HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold !HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations !HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold -!HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma !HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations !HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius !HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost @@ -873,7 +872,6 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold -!HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength !HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor @@ -1697,6 +1695,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_FLATFIELD_BT_VERTHORIZ;Vertical + Horizontal !TP_FLATFIELD_BT_VERTICAL;Vertical !TP_FLATFIELD_CLIPCONTROL;Clip control +!TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, value 0 is used. !TP_FLATFIELD_LABEL;Flat-Field !TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1. !TP_GRADIENT_CENTER_X_TOOLTIP;Shift gradient to the left (negative values) or right (positive values). @@ -2043,9 +2042,9 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_SHARPENING_CONTRAST;Contrast threshold !TP_SHARPENING_EDRADIUS;Radius !TP_SHARPENING_EDTOLERANCE;Edge tolerance -!TP_SHARPENING_GAMMA;Gamma !TP_SHARPENING_HALOCONTROL;Halo control !TP_SHARPENING_HCAMOUNT;Amount +!TP_SHARPENING_ITERCHECK;Auto limit iterations !TP_SHARPENING_LABEL;Sharpening !TP_SHARPENING_METHOD;Method !TP_SHARPENING_ONLYEDGES;Sharpen only edges diff --git a/rtdata/languages/English (US) b/rtdata/languages/English (US) index 6aeae1a45..63dff83da 100644 --- a/rtdata/languages/English (US) +++ b/rtdata/languages/English (US) @@ -768,8 +768,8 @@ !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold !HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold !HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations !HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold -!HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma !HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations !HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius !HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost @@ -783,7 +783,6 @@ !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold -!HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma !HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength @@ -1668,7 +1667,7 @@ !TP_FLATFIELD_BT_VERTHORIZ;Vertical + Horizontal !TP_FLATFIELD_BT_VERTICAL;Vertical !TP_FLATFIELD_CLIPCONTROL;Clip control -!TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, clip control can lead to color cast. +!TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, value 0 is used. !TP_FLATFIELD_LABEL;Flat-Field !TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1. !TP_GRADIENT_CENTER;Center @@ -2033,9 +2032,9 @@ !TP_SHARPENING_CONTRAST;Contrast threshold !TP_SHARPENING_EDRADIUS;Radius !TP_SHARPENING_EDTOLERANCE;Edge tolerance -!TP_SHARPENING_GAMMA;Gamma !TP_SHARPENING_HALOCONTROL;Halo control !TP_SHARPENING_HCAMOUNT;Amount +!TP_SHARPENING_ITERCHECK;Auto limit iterations !TP_SHARPENING_LABEL;Sharpening !TP_SHARPENING_METHOD;Method !TP_SHARPENING_ONLYEDGES;Sharpen only edges diff --git a/rtdata/languages/Espanol b/rtdata/languages/Espanol index 211f968e2..96bce0cdf 100644 --- a/rtdata/languages/Espanol +++ b/rtdata/languages/Espanol @@ -2327,13 +2327,12 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values !HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold !HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations !HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold -!HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma !HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations !HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius !HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost !HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius -!HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma !MAIN_FRAME_PLACES_DEL;Remove !MAIN_TAB_FAVORITES;Favorites !MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u @@ -2372,5 +2371,5 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !TP_RAW_XTRANS;X-Trans !TP_RAW_XTRANSFAST;Fast X-Trans !TP_SHARPENING_BLUR;Blur radius -!TP_SHARPENING_GAMMA;Gamma +!TP_SHARPENING_ITERCHECK;Auto limit iterations !TP_SHARPENING_RADIUS_BOOST;Corner radius boost diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index 82ef3fcd2..9d1c6a3f7 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -2272,12 +2272,11 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values !HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold !HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations !HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold -!HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma !HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations !HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius !HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost -!HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma !MAIN_FRAME_PLACES_DEL;Remove !PARTIALPASTE_FILMNEGATIVE;Film Negative !PROGRESSBAR_DECODING;Decoding... @@ -2303,5 +2302,5 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !TP_PDSHARPENING_LABEL;Capture Sharpening !TP_RAW_XTRANS;X-Trans !TP_RAW_XTRANSFAST;Fast X-Trans -!TP_SHARPENING_GAMMA;Gamma +!TP_SHARPENING_ITERCHECK;Auto limit iterations !TP_SHARPENING_RADIUS_BOOST;Corner radius boost diff --git a/rtdata/languages/Italiano b/rtdata/languages/Italiano index 4649aea62..db09b5d3a 100644 --- a/rtdata/languages/Italiano +++ b/rtdata/languages/Italiano @@ -1559,8 +1559,8 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold !HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold !HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations !HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold -!HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma !HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations !HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius !HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost @@ -1574,7 +1574,6 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold -!HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma !HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength @@ -1928,7 +1927,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_FILMSIMULATION_STRENGTH;Strength !TP_FILMSIMULATION_ZEROCLUTSFOUND;Set HaldCLUT directory in Preferences !TP_FLATFIELD_CLIPCONTROL;Clip control -!TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, clip control can lead to color cast. +!TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, value 0 is used. !TP_ICM_APPLYBASELINEEXPOSUREOFFSET;Baseline exposure !TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Employ the embedded DCP baseline exposure offset. The setting is only available if the selected DCP has one. !TP_ICM_APPLYHUESATMAP;Base table @@ -2131,7 +2130,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_RETINEX_VIEW_UNSHARP;Unsharp mask !TP_SHARPENING_BLUR;Blur radius !TP_SHARPENING_CONTRAST;Contrast threshold -!TP_SHARPENING_GAMMA;Gamma +!TP_SHARPENING_ITERCHECK;Auto limit iterations !TP_SHARPENING_RADIUS_BOOST;Corner radius boost !TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SOFTLIGHT_LABEL;Soft Light diff --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese index 511f6daf0..91ef2e931 100644 --- a/rtdata/languages/Japanese +++ b/rtdata/languages/Japanese @@ -2327,13 +2327,12 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: - !HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only !HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold !HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations !HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold -!HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma !HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations !HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius !HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost -!HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma !TP_DEHAZE_LUMINANCE;Luminance only !TP_PDSHARPENING_LABEL;Capture Sharpening -!TP_SHARPENING_GAMMA;Gamma +!TP_SHARPENING_ITERCHECK;Auto limit iterations !TP_SHARPENING_RADIUS_BOOST;Corner radius boost diff --git a/rtdata/languages/Magyar b/rtdata/languages/Magyar index 8ee6e66e4..43a4ae1e1 100644 --- a/rtdata/languages/Magyar +++ b/rtdata/languages/Magyar @@ -1268,8 +1268,8 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold !HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold !HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations !HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold -!HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma !HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations !HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius !HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost @@ -1283,7 +1283,6 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold -!HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma !HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength @@ -1841,7 +1840,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_FILMSIMULATION_STRENGTH;Strength !TP_FILMSIMULATION_ZEROCLUTSFOUND;Set HaldCLUT directory in Preferences !TP_FLATFIELD_CLIPCONTROL;Clip control -!TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, clip control can lead to color cast. +!TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, value 0 is used. !TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1. !TP_GRADIENT_CENTER;Center !TP_GRADIENT_CENTER_X;Center X @@ -2115,7 +2114,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_SAVEDIALOG_OK_TIP;Shortcut: Ctrl-Enter !TP_SHARPENING_BLUR;Blur radius !TP_SHARPENING_CONTRAST;Contrast threshold -!TP_SHARPENING_GAMMA;Gamma +!TP_SHARPENING_ITERCHECK;Auto limit iterations !TP_SHARPENING_RADIUS_BOOST;Corner radius boost !TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SOFTLIGHT_LABEL;Soft Light diff --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands index ebfdbed9d..07e40256f 100644 --- a/rtdata/languages/Nederlands +++ b/rtdata/languages/Nederlands @@ -2056,8 +2056,8 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold !HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold !HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations !HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold -!HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma !HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations !HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius !HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost @@ -2071,7 +2071,6 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold -!HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma !HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength @@ -2312,7 +2311,7 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !TP_RETINEX_MAP;Method !TP_SHARPENING_BLUR;Blur radius !TP_SHARPENING_CONTRAST;Contrast threshold -!TP_SHARPENING_GAMMA;Gamma +!TP_SHARPENING_ITERCHECK;Auto limit iterations !TP_SHARPENING_RADIUS_BOOST;Corner radius boost !TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SOFTLIGHT_LABEL;Soft Light diff --git a/rtdata/languages/Polish b/rtdata/languages/Polish index 86461bf6d..c923c3bad 100644 --- a/rtdata/languages/Polish +++ b/rtdata/languages/Polish @@ -1641,8 +1641,8 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold !HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold !HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations !HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold -!HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma !HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations !HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius !HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost @@ -1656,7 +1656,6 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold -!HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma !HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength @@ -2137,7 +2136,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_RETINEX_VIEW_UNSHARP;Unsharp mask !TP_SHARPENING_BLUR;Blur radius !TP_SHARPENING_CONTRAST;Contrast threshold -!TP_SHARPENING_GAMMA;Gamma +!TP_SHARPENING_ITERCHECK;Auto limit iterations !TP_SHARPENING_RADIUS_BOOST;Corner radius boost !TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SOFTLIGHT_LABEL;Soft Light diff --git a/rtdata/languages/Portugues b/rtdata/languages/Portugues index dea314f46..efe3214f8 100644 --- a/rtdata/languages/Portugues +++ b/rtdata/languages/Portugues @@ -2270,12 +2270,11 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values !HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold !HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations !HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold -!HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma !HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations !HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius !HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost -!HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma !MAIN_FRAME_PLACES_DEL;Remove !PARTIALPASTE_FILMNEGATIVE;Film Negative !PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode @@ -2302,5 +2301,5 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !TP_PDSHARPENING_LABEL;Capture Sharpening !TP_RAW_XTRANS;X-Trans !TP_RAW_XTRANSFAST;Fast X-Trans -!TP_SHARPENING_GAMMA;Gamma +!TP_SHARPENING_ITERCHECK;Auto limit iterations !TP_SHARPENING_RADIUS_BOOST;Corner radius boost diff --git a/rtdata/languages/Portugues (Brasil) b/rtdata/languages/Portugues (Brasil) index c6ff58310..e6adf3bc4 100644 --- a/rtdata/languages/Portugues (Brasil) +++ b/rtdata/languages/Portugues (Brasil) @@ -2277,12 +2277,11 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values !HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold !HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations !HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold -!HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma !HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations !HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius !HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost -!HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma !PARTIALPASTE_FILMNEGATIVE;Film Negative !PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PROGRESSBAR_DECODING;Decoding... @@ -2303,5 +2302,5 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !TP_RAW_XTRANS;X-Trans !TP_RAW_XTRANSFAST;Fast X-Trans !TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. -!TP_SHARPENING_GAMMA;Gamma +!TP_SHARPENING_ITERCHECK;Auto limit iterations !TP_SHARPENING_RADIUS_BOOST;Corner radius boost diff --git a/rtdata/languages/Russian b/rtdata/languages/Russian index 9f8f47da0..a4e501a77 100644 --- a/rtdata/languages/Russian +++ b/rtdata/languages/Russian @@ -1719,8 +1719,8 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold !HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold !HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations !HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold -!HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma !HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations !HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius !HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost @@ -1734,7 +1734,6 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold -!HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma !HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !ICCPROFCREATOR_COPYRIGHT;Copyright: !ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" @@ -1996,7 +1995,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !TP_FILMNEGATIVE_RED;Red ratio !TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now? !TP_FLATFIELD_CLIPCONTROL;Clip control -!TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, clip control can lead to color cast. +!TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, value 0 is used. !TP_ICM_APPLYBASELINEEXPOSUREOFFSET;Baseline exposure !TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Employ the embedded DCP baseline exposure offset. The setting is only available if the selected DCP has one. !TP_ICM_APPLYHUESATMAP;Base table @@ -2147,7 +2146,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !TP_RETINEX_VIEW_TRAN2;Transmission - Fixed !TP_RETINEX_VIEW_UNSHARP;Unsharp mask !TP_SHARPENING_BLUR;Blur radius -!TP_SHARPENING_GAMMA;Gamma +!TP_SHARPENING_ITERCHECK;Auto limit iterations !TP_SHARPENING_RADIUS_BOOST;Corner radius boost !TP_WAVELET_1;Level 1 !TP_WAVELET_2;Level 2 diff --git a/rtdata/languages/Serbian (Cyrilic Characters) b/rtdata/languages/Serbian (Cyrilic Characters) index 63b838201..9ec7c998b 100644 --- a/rtdata/languages/Serbian (Cyrilic Characters) +++ b/rtdata/languages/Serbian (Cyrilic Characters) @@ -1534,8 +1534,8 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold !HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold !HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations !HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold -!HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma !HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations !HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius !HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost @@ -1549,7 +1549,6 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold -!HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma !HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength @@ -1927,7 +1926,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_FILMSIMULATION_STRENGTH;Strength !TP_FILMSIMULATION_ZEROCLUTSFOUND;Set HaldCLUT directory in Preferences !TP_FLATFIELD_CLIPCONTROL;Clip control -!TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, clip control can lead to color cast. +!TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, value 0 is used. !TP_ICM_APPLYBASELINEEXPOSUREOFFSET;Baseline exposure !TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Employ the embedded DCP baseline exposure offset. The setting is only available if the selected DCP has one. !TP_ICM_APPLYHUESATMAP;Base table @@ -2131,7 +2130,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_RETINEX_VIEW_UNSHARP;Unsharp mask !TP_SHARPENING_BLUR;Blur radius !TP_SHARPENING_CONTRAST;Contrast threshold -!TP_SHARPENING_GAMMA;Gamma +!TP_SHARPENING_ITERCHECK;Auto limit iterations !TP_SHARPENING_RADIUS_BOOST;Corner radius boost !TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SOFTLIGHT_LABEL;Soft Light diff --git a/rtdata/languages/Swedish b/rtdata/languages/Swedish index b39d95e02..7861f2276 100644 --- a/rtdata/languages/Swedish +++ b/rtdata/languages/Swedish @@ -1883,8 +1883,8 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold !HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold !HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations !HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold -!HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gamma !HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations !HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius !HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost @@ -1898,7 +1898,6 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling !HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold -!HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma !HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength @@ -2138,7 +2137,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_FILMNEGATIVE_PICK;Pick neutral spots !TP_FILMNEGATIVE_RED;Red ratio !TP_FLATFIELD_CLIPCONTROL;Clip control -!TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, clip control can lead to color cast. +!TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, value 0 is used. !TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Employ the embedded DCP baseline exposure offset. The setting is only available if the selected DCP has one. !TP_ICM_APPLYHUESATMAP_TOOLTIP;Employ the embedded DCP base table (HueSatMap). The setting is only available if the selected DCP has one. !TP_ICM_APPLYLOOKTABLE;Look table @@ -2258,7 +2257,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_RETINEX_VIEW_METHOD_TOOLTIP;Standard - Normal display.\nMask - Displays the mask.\nUnsharp mask - Displays the image with a high radius unsharp mask.\nTransmission - Auto/Fixed - Displays the file transmission-map, before any action on contrast and brightness.\n\nAttention: the mask does not correspond to reality, but is amplified to make it more visible. !TP_SHARPENING_BLUR;Blur radius !TP_SHARPENING_CONTRAST;Contrast threshold -!TP_SHARPENING_GAMMA;Gamma +!TP_SHARPENING_ITERCHECK;Auto limit iterations !TP_SHARPENING_RADIUS_BOOST;Corner radius boost !TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SOFTLIGHT_LABEL;Soft Light From 164fab28e0bec6be6b11e05eb70aa22d0e08edf4 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Mon, 2 Dec 2019 11:25:57 +0100 Subject: [PATCH 196/208] Added Slovenian translation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Translation by Matjaž Jeran / matjazjeran Closes #5488 --- rtdata/languages/Slovenian | 2310 ++++++++++++++++++++++++++++++++++++ 1 file changed, 2310 insertions(+) create mode 100644 rtdata/languages/Slovenian diff --git a/rtdata/languages/Slovenian b/rtdata/languages/Slovenian new file mode 100644 index 000000000..b015cb6f1 --- /dev/null +++ b/rtdata/languages/Slovenian @@ -0,0 +1,2310 @@ +#01 2019-10-05 Matjaž Jeran + +ABOUT_TAB_BUILD;Verzija +ABOUT_TAB_CREDITS;Zasluge +ABOUT_TAB_LICENSE;Licenca +ABOUT_TAB_RELEASENOTES;Opombe ob izdaji +ABOUT_TAB_SPLASH;Uvodni zaslon +ADJUSTER_RESET_TO_DEFAULT;Klik - nastavi na privzeto vrednost.\nCtrl+klik - nastavi na začetno vrednost. +BATCH_PROCESSING;Paketna obdelava +CURVEEDITOR_AXIS_IN;I: +CURVEEDITOR_AXIS_LEFT_TAN;LT: +CURVEEDITOR_AXIS_OUT;O: +CURVEEDITOR_AXIS_RIGHT_TAN;RT: +CURVEEDITOR_CATMULLROM;Fleksibilno +CURVEEDITOR_CURVE;Krivulja +CURVEEDITOR_CURVES;Krivulje +CURVEEDITOR_CUSTOM;Standard +CURVEEDITOR_DARKS;Temine +CURVEEDITOR_EDITPOINT_HINT;Omogoči urejanje vhodno/izhodnih vrednosti v vozlišču.\n\nDesni klik v vozlišču za njgovo izbiro.\nDesni klik v prazno za izbris izbire vozlišča. +CURVEEDITOR_HIGHLIGHTS;Bleščave +CURVEEDITOR_LIGHTS;Osvetljenosti +CURVEEDITOR_LINEAR;Linearno +CURVEEDITOR_LOADDLGLABEL;naloži krivuljo ... +CURVEEDITOR_MINMAXCPOINTS;Ekvalizator +CURVEEDITOR_NURBS;Kontrolna kletka +CURVEEDITOR_PARAMETRIC;Parametrična +CURVEEDITOR_SAVEDLGLABEL;Shrani krivuljo... +CURVEEDITOR_SHADOWS;Sence +CURVEEDITOR_TOOLTIPCOPY;Kopiraj trenutno krivuljo na odložišče. +CURVEEDITOR_TOOLTIPLINEAR;Poravnaj krivuljo v daljico.. +CURVEEDITOR_TOOLTIPLOAD;Naloži krivuljo iz datoteke. +CURVEEDITOR_TOOLTIPPASTE;Prilepi krivuljo iz odlagališča. +CURVEEDITOR_TOOLTIPSAVE;Shrani tenutno krivuljo. +CURVEEDITOR_TYPE;Tip: +DIRBROWSER_FOLDERS;Mape +DONT_SHOW_AGAIN;Ne kaži več tega sporočila. +DYNPROFILEEDITOR_DELETE;Briši +DYNPROFILEEDITOR_EDIT;Uredi +DYNPROFILEEDITOR_EDIT_RULE;Uredi pravilo dinamičnega profila +DYNPROFILEEDITOR_ENTRY_TOOLTIP;Iskanje je neobčutljivo na velike/male črke.\nUporabite "re:" prefiks za\nregularni izraz. +DYNPROFILEEDITOR_IMGTYPE_ANY;Katerikoli +DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +DYNPROFILEEDITOR_IMGTYPE_PS;Pomik pikslov +DYNPROFILEEDITOR_IMGTYPE_STD;Standardni +DYNPROFILEEDITOR_MOVE_DOWN;Pomakni dol +DYNPROFILEEDITOR_MOVE_UP;Pomakni gor +DYNPROFILEEDITOR_NEW;Novo +DYNPROFILEEDITOR_NEW_RULE;Novo pravilo dinamičnega profila +DYNPROFILEEDITOR_PROFILE;Profilo obdelovanja +EDITWINDOW_TITLE;Uredi sliko +EDIT_OBJECT_TOOLTIP;Prikaže gradnik v predoglednem oknu in vam omogoča prilagoditev tega orodja. +EDIT_PIPETTE_TOOLTIP;Če želite krivulji dodati prilagoditveno točko, pridržite tipko Ctrl, medtem ko levo kliknete želeno mesto v predogledu slike.\nČe želite prilagoditi točko, pridržite tipko Ctrl, medtem ko levo kliknete ustrezno območje v predogledu, nato pa jo pustite Ctrl (razen če želite natančen nadzor) in medtem ko držite levi gumb miške, miško premikate navzgor ali navzdol, da to točko v krivulji premaknete navzgor ali navzdol. +EXIFFILTER_APERTURE;Zaslonka +EXIFFILTER_CAMERA;Fotoaparat +EXIFFILTER_EXPOSURECOMPENSATION;Prilagajanje osvetlitve (EV) +EXIFFILTER_FILETYPE;Tip datoteke +EXIFFILTER_FOCALLEN;Goriščna razdalja +EXIFFILTER_IMAGETYPE;Tip slike +EXIFFILTER_ISO;ISO +EXIFFILTER_LENS;Objektiv +EXIFFILTER_METADATAFILTER;Omogoči filtriranje metapodatkov +EXIFFILTER_SHUTTER;Čas +EXIFPANEL_ADDEDIT;Dodaj/Uredi +EXIFPANEL_ADDEDITHINT;Dodaj novo značko ali uredi značko. +EXIFPANEL_ADDTAGDLG_ENTERVALUE;Vnesi vrednost +EXIFPANEL_ADDTAGDLG_SELECTTAG;Izberi značko +EXIFPANEL_ADDTAGDLG_TITLE;Dodaj/Uredi značko +EXIFPANEL_KEEP;Ohrani +EXIFPANEL_KEEPHINT;Ohrani izbrane značke ob pisanju izhodne datoteke. +EXIFPANEL_REMOVE;Odstrani +EXIFPANEL_REMOVEHINT;Odstrani izbrane značke ob pisanju izhodne datoteke. +EXIFPANEL_RESET;Ponastavi +EXIFPANEL_RESETALL;Ponastavi vse +EXIFPANEL_RESETALLHINT;Ponastavi vse značke na njihove izvirne vrednosti. +EXIFPANEL_RESETHINT;Ponastavi izbrane značke na njihove izvirne vrednosti. +EXIFPANEL_SHOWALL;Prikaži vse +EXIFPANEL_SUBDIRECTORY;Podmapa +EXPORT_BYPASS;Koraki obdelave za obvoz +EXPORT_BYPASS_ALL;Izberi / Odizberi vse +EXPORT_BYPASS_DEFRINGE;Izpusti odstranjevanje napak robov +EXPORT_BYPASS_DIRPYRDENOISE;Izpusti zmanjšanje šuma +EXPORT_BYPASS_DIRPYREQUALIZER;xxIzpusti kontrast by Detail Levels +EXPORT_BYPASS_EQUALIZER;Izpusti Podrobnosti valovčkov +EXPORT_BYPASS_RAW_CA;Izpusti [surovo] Popravek kromatske aberacije +EXPORT_BYPASS_RAW_CCSTEPS;Izpusti [surovo] Zatiranje napačnih barv +EXPORT_BYPASS_RAW_DCB_ENHANCE;Izpusti [surovo] DCB koraki izboljšav +EXPORT_BYPASS_RAW_DCB_ITERATIONS;Izpusti [surovo] DCB iteracije +EXPORT_BYPASS_RAW_DF;Izpusti [surovo] Dark-frame +EXPORT_BYPASS_RAW_FF;Izpusti [surovo] Flat-field +EXPORT_BYPASS_RAW_GREENTHRESH;Izpusti [surovo] Uravnoteženje zelene +EXPORT_BYPASS_RAW_LINENOISE;Izpusti [surovo] Filtriranje šuma na liniji +EXPORT_BYPASS_RAW_LMMSE_ITERATIONS;Izpusti [surovo] LMMSE Korake izboljšav +EXPORT_BYPASS_SHARPENEDGE;Izpusti ostrenje robov +EXPORT_BYPASS_SHARPENING;Izpusti ostrenje +EXPORT_BYPASS_SHARPENMICRO;Izpusti mikrokontrast +EXPORT_FASTEXPORTOPTIONS;Nastavitve hitrega izvoza +EXPORT_INSTRUCTIONS;Nastavite hitrega izvoza nudijo možnost izogiba zahtevnih nastavitev gleda časa in virov za obdelavo slik namesto hitrih nastavitev v čakalnih vrstah za obdelavo. Ta način priporočam za hitro izdelavo slik manjše natančnosti kadar se mudi in je izhod zgolj drugačne velikosti od izvirnika brez siceršnjih sprememb vsebine. +EXPORT_MAXHEIGHT;Maksimalna višina: +EXPORT_MAXWIDTH;Maksimalna širina: +EXPORT_PIPELINE;Vrstni red obdelav +EXPORT_PUTTOQUEUEFAST; Vstavi v čakalno vrsto za hiter izvoz +EXPORT_RAW_DMETHOD;Demosaic method +EXPORT_USE_FAST_PIPELINE;Namenska (polna obdelava na sliki spremenjene velikosti) +EXPORT_USE_FAST_PIPELINE_TIP;Uporabite namenski tok obdelav za hitri izvoz za primer, kjer je hitrost pomembnejša od kakovosti. Sprememba velikosti slike se izvede čimprej namesto na koncu kot pri običajnem toku obdelav. Delovanje je bistveno hitrejše a bodite pripravljeni na pojav artefaktov in splošno znužanje kakovosti izdelanih slik. +EXPORT_USE_NORMAL_PIPELINE;Standardno (preskoči nekatere korake, spremeni velikost na koncu) +EXTPROGTARGET_1;surovo +EXTPROGTARGET_2;čakalna vrsta-obdelano +FILEBROWSER_APPLYPROFILE;Izvedi +FILEBROWSER_APPLYPROFILE_PARTIAL;Delno - izvedi +FILEBROWSER_AUTODARKFRAME;Avto dark-frame +FILEBROWSER_AUTOFLATFIELD;Avto flat-field +FILEBROWSER_BROWSEPATHBUTTONHINT;Klik, da odprem določeno pot, naložim mapo in uporabim ključne besede iskanja. +FILEBROWSER_BROWSEPATHHINT;Vnesite pot kamor nameravate.\n\nBližnjice:\nCtrl-o osredotočenje na polje iskanja.\nEnter / Ctrl-Enter da bi brskali tam\nEsc za brisanje sprememb.\nShift-Esc prekinitev osredotočenosti.\n\nBližnjice poti:\n~ - uporabnikova domača mapa.\n! - uporabnikova mapa s slikami +FILEBROWSER_CACHE;Predpomnilnik +FILEBROWSER_CACHECLEARFROMFULL;Počistite vse vključno s predpomnjenimi profili +FILEBROWSER_CACHECLEARFROMPARTIAL;Počistite vse razen predpomnjenih profilov +FILEBROWSER_CLEARPROFILE;Očisti +FILEBROWSER_COLORLABEL_TOOLTIP;Barvna oznaka.\n\nUporabi roletni menu ali funkcionalne tipke:\nShift-Ctrl-0 Brez barve\nShift-Ctrl-1 Rdeča\nShift-Ctrl-2 Rumena\nShift-Ctrl-3 Zelena\nShift-Ctrl-4 Modra\nShift-Ctrl-5 Škrlatna +FILEBROWSER_COPYPROFILE;Kopiraj +FILEBROWSER_CURRENT_NAME;Trenutno ime: +FILEBROWSER_DARKFRAME;Dark-frame +FILEBROWSER_DELETEDIALOG_ALL;Ali ste prepričani, da želite trajno izbrisati vse datoteke %1 v smetnjaku? +FILEBROWSER_DELETEDIALOG_HEADER;Potrditev izbrisa datoteke: +FILEBROWSER_DELETEDIALOG_SELECTED;Ali ste prepričani, da želite trajno izbrisati izbrane datoteke %1? +FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Ali ste prepričani, da želite trajno izbrisati izbrane datoteke %1, vključno z obdelano različico iz čakalne vrste? +FILEBROWSER_DELETEDLGLABEL;Potrditev brisanja datoteke +FILEBROWSER_DELETEDLGMSG;Ali ste prepričani, da želite brisati izbrane %1 datoteke? +FILEBROWSER_DELETEDLGMSGINCLPROC;Ali ste prepričani, da želite brisati izbrane %1 datoteke vključno z verzijo v čakalni vrsti za obdelavo? +FILEBROWSER_EMPTYTRASH;Izprazni smetnjak +FILEBROWSER_EMPTYTRASHHINT;Nepreklicno briši datoteke v smetnjaku. +FILEBROWSER_EXTPROGMENU;Odpri z +FILEBROWSER_FLATFIELD;Flat-field +FILEBROWSER_MOVETODARKFDIR;Prestavi v mapo za dark-frame +FILEBROWSER_MOVETOFLATFIELDDIR;Premakni se v mapo za flat-field +FILEBROWSER_NEW_NAME;Novo ime: +FILEBROWSER_OPENDEFAULTVIEWER;Privzeti pregledovalnik v oknu (obdeluje čakalne vrste) +FILEBROWSER_PARTIALPASTEPROFILE;Delno - prilepi +FILEBROWSER_PASTEPROFILE;Prilepi +FILEBROWSER_POPUPCANCELJOB;Prekliči ukaz +FILEBROWSER_POPUPCOLORLABEL;Barvna oznaka +FILEBROWSER_POPUPCOLORLABEL0;Label: Brez +FILEBROWSER_POPUPCOLORLABEL1;Label: Rdeča +FILEBROWSER_POPUPCOLORLABEL2;Label: Rumena +FILEBROWSER_POPUPCOLORLABEL3;Label: Zelena +FILEBROWSER_POPUPCOLORLABEL4;Label: Modra +FILEBROWSER_POPUPCOLORLABEL5;Label: Škrlatna +FILEBROWSER_POPUPCOPYTO;Kopiraj na... +FILEBROWSER_POPUPFILEOPERATIONS;Delo z datotekami +FILEBROWSER_POPUPMOVEEND;Prestavi na konec čakalne vrste +FILEBROWSER_POPUPMOVEHEAD;Prestavi na začetek čakalne vrste +FILEBROWSER_POPUPMOVETO;Prestavi na... +FILEBROWSER_POPUPOPEN;Odpri +FILEBROWSER_POPUPOPENINEDITOR;Odpri v urejevalniku +FILEBROWSER_POPUPPROCESS;Postavi v čakalno vrsto +FILEBROWSER_POPUPPROCESSFAST;Postavi v čakalno vrsto (Hiter izvoz) +FILEBROWSER_POPUPPROFILEOPERATIONS;Obdelujem profile +FILEBROWSER_POPUPRANK;Rangiraj +FILEBROWSER_POPUPRANK0;Unrank +FILEBROWSER_POPUPRANK1;Rang 1 * +FILEBROWSER_POPUPRANK2;Rang 2 ** +FILEBROWSER_POPUPRANK3;Rang 3 *** +FILEBROWSER_POPUPRANK4;Rang 4 **** +FILEBROWSER_POPUPRANK5;Rang 5 ***** +FILEBROWSER_POPUPREMOVE;Briši +FILEBROWSER_POPUPREMOVEINCLPROC;Briši vključno z izhodom iz čakalne vrste +FILEBROWSER_POPUPRENAME;Preimenuj +FILEBROWSER_POPUPSELECTALL;Izberi vse +FILEBROWSER_POPUPTRASH;Prestavi v smetnjak +FILEBROWSER_POPUPUNRANK;Odstrani rang +FILEBROWSER_POPUPUNTRASH;Odstrani iz smetnjaka +FILEBROWSER_QUERYBUTTONHINT;Očisti poizvedbo iskanja +FILEBROWSER_QUERYHINT;Vnesi imena iskanih datotek. Dovolj je že del imena. Loči iskalne termine z vejicami, npr.\n1001,1004,1199\n\nIzloči termine iskanje s predpono !=\nnpr.\n!=1001,1004,1199\n\nBližnjice:\nCtrl-f - fokusiraj rubriko iskanja,\nEnter - išči,\nEsc - očisti rubriko iskanja,\nShift-Esc - sprosti fokus na rubriki iskanja. +FILEBROWSER_QUERYLABEL; Išči: +FILEBROWSER_RANK1_TOOLTIP;Rank 1 *\nBližnjica: Shift-1 +FILEBROWSER_RANK2_TOOLTIP;Rank 2 *\nBližnjica: Shift-2 +FILEBROWSER_RANK3_TOOLTIP;Rank 3 *\nBližnjica: Shift-3 +FILEBROWSER_RANK4_TOOLTIP;Rank 4 *\nBližnjica: Shift-4 +FILEBROWSER_RANK5_TOOLTIP;Rank 5 *\nBližnjica: Shift-5 +FILEBROWSER_RENAMEDLGLABEL;Preimenuj datoteko +FILEBROWSER_RESETDEFAULTPROFILE;Nastavi na privzeto vrednost +FILEBROWSER_SELECTDARKFRAME;Izberi dark-frame... +FILEBROWSER_SELECTFLATFIELD;Izberite flat-field... +FILEBROWSER_SHOWCOLORLABEL1HINT;Prikaži slike označene z rdečo.\nBližnjica: Alt-1 +FILEBROWSER_SHOWCOLORLABEL2HINT;Prikaži slike označene z rumeno.\nBližnjica: Alt-2 +FILEBROWSER_SHOWCOLORLABEL3HINT;Prikaži slike označene z zeleno.\nBližnjica: Alt-3 +FILEBROWSER_SHOWCOLORLABEL4HINT;Prikaži slike označene z modro.\nBližnjica: Alt-4 +FILEBROWSER_SHOWCOLORLABEL5HINT;Prikaži slike označene s škrlatno.\nBližnjica: Alt-5 +FILEBROWSER_SHOWDIRHINT;Odstrani vse filtre.\nBližnjica: d +FILEBROWSER_SHOWEDITEDHINT;Prikaži spremenjene slike.\nBližnjica: 7 +FILEBROWSER_SHOWEDITEDNOTHINT;Prikaži nespremenjene slike.\nBližnjica: 6 +FILEBROWSER_SHOWEXIFINFO;Prikaži Exif informacije.\n\nBližnjice:\ni - Način zavihkov več urejevalnikov,\nAlt-i - Način enega zavihka urejevalnika. +FILEBROWSER_SHOWNOTTRASHHINT;Prikaži samo nezbrisane slike. +FILEBROWSER_SHOWORIGINALHINT;Prikaži samo izvirne slike.\n\nKadar obstaja več slik z enakim imenom a različnimi podaljški imena, smatram za izvirnik tisto, katere podaljšek je najvišje v seznamu podaljškov v nastavitvah > File Browser > Parsed Extensions. +FILEBROWSER_SHOWRANK1HINT;Prikaži slike označene z 1 zvezdico.\nBližnjica: 1 +FILEBROWSER_SHOWRANK2HINT;Prikaži slike označene z 2 zvezdicama.\nBližnjica: 2 +FILEBROWSER_SHOWRANK3HINT;Prikaži slike označene z 3 zvezdicami.\nBližnjica: 3 +FILEBROWSER_SHOWRANK4HINT;Prikaži slike označene z 4 zvezdicami.\nBližnjica: 4 +FILEBROWSER_SHOWRANK5HINT;Prikaži slike označene z 5 zvezdicami.\nBližnjica: 5 +FILEBROWSER_SHOWRECENTLYSAVEDHINT;Pokaži shranjene slike.\nBližnjica: Alt-7 +FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Pokaži neshranjene slike.\nBližnjica: Alt-6 +FILEBROWSER_SHOWTRASHHINT;Pokaži vsebino smetnjaka.\nBližnjica: Ctrl-t +FILEBROWSER_SHOWUNCOLORHINT;Pokaži slike brez barvne oznake.\nShortcut: Alt-0 +FILEBROWSER_SHOWUNRANKHINT;Prikaži nerangirane slike.\nShortcut: 0 +FILEBROWSER_THUMBSIZE;Velikost predogledne sličice +FILEBROWSER_UNRANK_TOOLTIP;Odstrani rang.\nShortcut: Shift-0 +FILEBROWSER_ZOOMINHINT;Povečaj velikost predogledne sličice.\n\nBližnjice:\n+ - Način z več zavihki urejevalnika,\nAlt-+ - Način z enim zavihkom in urejevalnikom. +FILEBROWSER_ZOOMOUTHINT;Pomanjšaj velikost predogledne sličice.\n\nBližnjice:\n- - Način z več zavihki urejevalnika,\nAlt-- - Način z enim zavihkom in urejevalnikom. +FILECHOOSER_FILTER_ANY;Vse datoteke +FILECHOOSER_FILTER_COLPROF;Barvni profili (*.icc) +FILECHOOSER_FILTER_CURVE;Profili krivulj +FILECHOOSER_FILTER_LCP;Profili popravkov lečij +FILECHOOSER_FILTER_PP;Profili obdelovanja +FILECHOOSER_FILTER_SAME;Enak format kot trenutna slika +FILECHOOSER_FILTER_TIFF;Datoteke TIFF +GENERAL_ABOUT;O programu +GENERAL_AFTER;Po +GENERAL_APPLY;Uveljavi +GENERAL_ASIMAGE;Kot slika +GENERAL_AUTO;Avtomatsko +GENERAL_BEFORE;Pred +GENERAL_CANCEL;Prekliči +GENERAL_CLOSE;Zapri +GENERAL_CURRENT;Trenutno +GENERAL_DISABLE;Onemogoči +GENERAL_DISABLED;Onemogočeno +GENERAL_ENABLE;Omogoči +GENERAL_ENABLED;Omogočeno +GENERAL_FILE;Datoteka +GENERAL_LANDSCAPE;Ležeči format +GENERAL_NA;n/a +GENERAL_NO;Ne +GENERAL_NONE;Nič +GENERAL_OK;OK +GENERAL_OPEN;Odpri +GENERAL_PORTRAIT;Pokončni format +GENERAL_RESET;Reset +GENERAL_SAVE;Shrani +GENERAL_SAVE_AS;Shrani kot... +GENERAL_SLIDER;Drsnik +GENERAL_UNCHANGED;(Nespremenjeno) +GENERAL_WARNING;Opozorilo +GIMP_PLUGIN_INFO;Dobrodošli v RawTherapee vtičniku za GIMP!\nKo boste končali z urejanjem enostavno zaprite glavno okno in slika se bo avtomatično uvozila v GIMP. +HISTOGRAM_TOOLTIP_B;Prikaži/Skrij histogram za modro. +HISTOGRAM_TOOLTIP_BAR;Prikaži/Skrij stolpce RGB indikatorjev. +HISTOGRAM_TOOLTIP_CHRO;Prikaži/Skrij histogram barvitosti. +HISTOGRAM_TOOLTIP_G;Prikaži/Skrij histogram za zeleno. +HISTOGRAM_TOOLTIP_L;Prikaži/Skrij histogram CIELab svetlosti. +HISTOGRAM_TOOLTIP_MODE;Preklopi med linearno, log-linearno in log-log merilom histograma. +HISTOGRAM_TOOLTIP_R;Prikaži/Skrij histogram za rdečo. +HISTOGRAM_TOOLTIP_RAW;Prikaži/Skrij surovi histogram. +HISTORY_CHANGED;Spremenjeno +HISTORY_CUSTOMCURVE;Prilagojena krivulja +HISTORY_FROMCLIPBOARD;Iz odložišča +HISTORY_LABEL;Zgodovina +HISTORY_MSG_1;Slika naložena +HISTORY_MSG_2;PP3 naložena +HISTORY_MSG_3;PP3 spremenjena +HISTORY_MSG_4;Brskanje po zgodovini +HISTORY_MSG_5;Ekspozicija - Osvetljenost +HISTORY_MSG_6;Ekspozicija - Kontrast +HISTORY_MSG_7;Ekspozicija - Črnina +HISTORY_MSG_8;Ekspozicija - Prilagoditev +HISTORY_MSG_9;Ekspozicija - Stiskanje bleščav +HISTORY_MSG_10;Ekspozicija - Stiskanje senc +HISTORY_MSG_11;Ekspozicija - Krivulja tonov 1 +HISTORY_MSG_12;Ekspozicija - Avtomatski nivoji +HISTORY_MSG_13;Ekspozicija - Klip +HISTORY_MSG_14;L*a*b* - Osvetljenost +HISTORY_MSG_15;L*a*b* - Kontrast +HISTORY_MSG_16;- +HISTORY_MSG_17;- +HISTORY_MSG_18;- +HISTORY_MSG_19;L*a*b* - krivulja L* +HISTORY_MSG_20;Ostrenje +HISTORY_MSG_21;USM - Radij +HISTORY_MSG_22;USM - Količina +HISTORY_MSG_23;USM - Prag +HISTORY_MSG_24;USM - Naostri samo robove +HISTORY_MSG_25;USM - Radij detekcije roba +HISTORY_MSG_26;USM - Toleranca roba +HISTORY_MSG_27;USM - Kontrola haloja +HISTORY_MSG_28;USM - Kontrolna velikost haloja +HISTORY_MSG_29;Methoda - ostrenja +HISTORY_MSG_30;RLD - Radiij +HISTORY_MSG_31;RLD - Količina +HISTORY_MSG_32;RLD - Blaženje +HISTORY_MSG_33;RLD - Iteracije +HISTORY_MSG_34;Popravki lečja - Popačenje +HISTORY_MSG_35;Popravki lečja - Vinjetiranje +HISTORY_MSG_36;Popravki lečja - - CA +HISTORY_MSG_37;Ekspozicija - Avtomatski nivoji +HISTORY_MSG_38;Ravnotežje beline - Metoda +HISTORY_MSG_39;WB - Temperatura +HISTORY_MSG_40;WB - Odtenek +HISTORY_MSG_41;Ekspozicija - način krivulje odtenkov 1 +HISTORY_MSG_42;Ekspozicija - krivulja odtenkov 2 +HISTORY_MSG_43;Ekspozicija - način krivulje odtenkov 2 +HISTORY_MSG_44;Lum. radij odstranjevanja šuma +HISTORY_MSG_45;Lum. toleranca roba odstranjevanja šuma +HISTORY_MSG_46;Odstranjevanje barvnega šuma +HISTORY_MSG_47;Zmešaj ICC bleščave z matriko +HISTORY_MSG_48;DCP - Krivulja tonov +HISTORY_MSG_49;DCP osvetljava +HISTORY_MSG_50;Sence/bleščave +HISTORY_MSG_51;S/H - Bleščave +HISTORY_MSG_52;S/H - Sence +HISTORY_MSG_53;S/H - Tonska širina bleščav +HISTORY_MSG_54;S/H - Tonska širina senc +HISTORY_MSG_55;S/H - Lokalni kontrast +HISTORY_MSG_56;S/H - Radij +HISTORY_MSG_57;Groba rotacija +HISTORY_MSG_58;Horizontalni preobrat +HISTORY_MSG_59;Vertikalni preobrat +HISTORY_MSG_60;Rotacija +HISTORY_MSG_61;Avtomatsko polnenje +HISTORY_MSG_62;Popravki popačenja +HISTORY_MSG_63;Izbran posnetek stanja +HISTORY_MSG_64;Izrez +HISTORY_MSG_65;CA popravki +HISTORY_MSG_66;Ekspozicija - Rekonstrukcija bleščav +HISTORY_MSG_67;Ekspozicija - HLR količina +HISTORY_MSG_68;Ekspozicija - HLR metoda +HISTORY_MSG_69;Delovni barvni prostor +HISTORY_MSG_70;Izhodni barvni prostor +HISTORY_MSG_71;Vhodni barvni prostor +HISTORY_MSG_72;VC - Količina +HISTORY_MSG_73;Mešalnik kanalov +HISTORY_MSG_74;Sprememba velikosti - Merilo +HISTORY_MSG_75;Spremeba velikosti - Metoda +HISTORY_MSG_76;Exif metapodatki +HISTORY_MSG_77;IPTC metapodatki +HISTORY_MSG_78;- +HISTORY_MSG_79;Sprememba velikosti - Širina +HISTORY_MSG_80;Sprememba velikosti - Višina +HISTORY_MSG_81;Spremeni velikost +HISTORY_MSG_82;Profil spremenjen +HISTORY_MSG_83;S/H - maska ostrenja +HISTORY_MSG_84;Popravek perspektive +HISTORY_MSG_85;Popravek objektiva - datoteka LCP +HISTORY_MSG_86;RGB krivulje - Način svetilnosti +HISTORY_MSG_87;Impulzno zmanjšanje šuma +HISTORY_MSG_88;Prag impulznega zmanjšanja šuma +HISTORY_MSG_89;Zmanjšanje šuma +HISTORY_MSG_90;Zmanjšanje šuma - Svetlost +HISTORY_MSG_91;Zmanjšanje šuma - glavna barvitost +HISTORY_MSG_92;Zmanjšanje šuma - Gama +HISTORY_MSG_93;CbDL - Vrednost +HISTORY_MSG_94;Kontrast po nivojih podrobnosti +HISTORY_MSG_95;L*a*b* - Barvitost +HISTORY_MSG_96;L*a*b* - a* krivulja +HISTORY_MSG_97;L*a*b* - b* krivulja +HISTORY_MSG_98;Metoda odstranjevanja mozaičnosti +HISTORY_MSG_99;Filtriranje vročih pikslov +HISTORY_MSG_100;Ekspozicija - Nasičenje +HISTORY_MSG_101;HSV - Odtenek +HISTORY_MSG_102;HSV - Nasičenost +HISTORY_MSG_103;HSV - Vrednost +HISTORY_MSG_104;HSV Ekvalizator +HISTORY_MSG_105;Odstranjevanje napak robov +HISTORY_MSG_106;Odstranjevanje napak robov - Radij +HISTORY_MSG_107;Odstranjevanje napak robov - Prag +HISTORY_MSG_108;Ekspozicija - prag HLC +HISTORY_MSG_109;Sprememba velikosti - Velikostni okvir +HISTORY_MSG_110;Sprememba velikosti - Uporabi na +HISTORY_MSG_111;L*a*b* - Izogibanje barvnega premika +HISTORY_MSG_112;--neuporabljeno-- +HISTORY_MSG_113;L*a*b* - Zaščita rdeče kože +HISTORY_MSG_114;DCB iteracije +HISTORY_MSG_115;Zatiranje napačne barve +HISTORY_MSG_116;DCB izboljšave +HISTORY_MSG_117;Surovi CA popravek - Rdeča +HISTORY_MSG_118;Surovi CA popravek - Modra +HISTORY_MSG_119;Filtriranje šuma na črti +HISTORY_MSG_120;Uravnoteženje zelene +HISTORY_MSG_121;Surovi CA popravek - Avtomatski +HISTORY_MSG_122;Dark-frame - Avtomatski izbor +HISTORY_MSG_123;Dark-frame - Datoteka +HISTORY_MSG_124;Popravek točke beline +HISTORY_MSG_126;Flat-field - Datoteka +HISTORY_MSG_127;Flat-field - Avto-selekcija +HISTORY_MSG_128;Flat-field - Radij zameglevanja +HISTORY_MSG_129;Flat-field - Tip zameglevanja +HISTORY_MSG_130;Avtomatski popravek popačenja +HISTORY_MSG_131;Zmanjšanje šuma - Luma +HISTORY_MSG_132;Zmanjšanje šuma - Barvitost +HISTORY_MSG_133;Gama izhoda +HISTORY_MSG_134;Svobodni gama +HISTORY_MSG_135;Svobodni gama +HISTORY_MSG_136;Strmina proste game +HISTORY_MSG_137;Nivo črnine - Zelena 1 +HISTORY_MSG_138;Nivo črnine - Rdeča +HISTORY_MSG_139;Nivo črnine - Modra +HISTORY_MSG_140;Nivo črnine - Zelena 2 +HISTORY_MSG_141;Nivo črnine - Poveži zelene +HISTORY_MSG_142;ES - Iteracije +HISTORY_MSG_143;ES - Količina +HISTORY_MSG_144;Mikrokontrast - Količina +HISTORY_MSG_145;Mikrokontrast - Enotnost +HISTORY_MSG_146;Ostrenje robov +HISTORY_MSG_147;ES - Samo svetlost +HISTORY_MSG_148;Mikrokontrast +HISTORY_MSG_149;Mikrokontrast - matrika 3×3 +HISTORY_MSG_150;Zmanjševanje šuma in artefaktov po odstr. mozaičnosti +HISTORY_MSG_151;Vibranca +HISTORY_MSG_152;Vib - Pastelni toni +HISTORY_MSG_153;Vib - Nasičeni toni +HISTORY_MSG_154;Vib - Zavaruj tone kože +HISTORY_MSG_155;Vib - Izogibaj se pomiku barv +HISTORY_MSG_156;Vib - Poveži pastelne/nasičene +HISTORY_MSG_157;Vib - Prag pastelnih/nasičenih +HISTORY_MSG_158;TM - Moč +HISTORY_MSG_159;TM - Zaustavljanje roba +HISTORY_MSG_160;TM - Merilo +HISTORY_MSG_161;TM - Ponovno uteževanje iteracij +HISTORY_MSG_162;Preslikava tonov +HISTORY_MSG_163;RGB Krivulje - Rdeča +HISTORY_MSG_164;RGB Krivulje - Zelena +HISTORY_MSG_165;RGB Krivulje - Modra +HISTORY_MSG_166;Ekspozicija - Ponastavitev +HISTORY_MSG_167;Metoda odstranjevanja mozaičnosti +HISTORY_MSG_168;L*a*b* - CC krivulja +HISTORY_MSG_169;L*a*b* - CH krivulja +HISTORY_MSG_170;Vibrance - HH krivulja +HISTORY_MSG_171;L*a*b* - LC krivulja +HISTORY_MSG_172;L*a*b* - Omeji LC +HISTORY_MSG_173;NR - Obnova podrobnosti +HISTORY_MSG_174;CIECAM02 +HISTORY_MSG_175;CAM02 - CAT02 adaptacija +HISTORY_MSG_176;CAM02 - Pogled okolice +HISTORY_MSG_177;CAM02 - Svetlost scene +HISTORY_MSG_178;CAM02 - Ogled svetlosti +HISTORY_MSG_179;CAM02 - Model bele točke +HISTORY_MSG_180;CAM02 - Lightness (J) +HISTORY_MSG_181;CAM02 - Barvitost (C) +HISTORY_MSG_182;CAM02 - Avtomatski CAT02 +HISTORY_MSG_183;CAM02 - Kontrast (J) +HISTORY_MSG_184;CAM02 - Obkroži sceno +HISTORY_MSG_185;CAM02 - Kontrola barvnega obsega +HISTORY_MSG_186;CAM02 - Algoritem +HISTORY_MSG_187;CAM02 - Zaščita rdeče/kožne +HISTORY_MSG_188;CAM02 - Svetlost (Q) +HISTORY_MSG_189;CAM02 - Kontrast (Q) +HISTORY_MSG_190;CAM02 - Nasičenost (S) +HISTORY_MSG_191;CAM02 - Polnost barv (M) +HISTORY_MSG_192;CAM02 - Odtenek (h) +HISTORY_MSG_193;CAM02 - Krivulja tona 1 +HISTORY_MSG_194;CAM02 - Krivulja tona 2 +HISTORY_MSG_195;CAM02 - Krivulja tona 1 +HISTORY_MSG_196;CAM02 - Krivulja tona 2 +HISTORY_MSG_197;CAM02 - Barvna krivulja +HISTORY_MSG_198;CAM02 - Barvna krivulja +HISTORY_MSG_199;CAM02 - Izhodni histogrami +HISTORY_MSG_200;CAM02 - Preslikava tonov +HISTORY_MSG_201;NR - Barvitost - R&G +HISTORY_MSG_202;NR - Barvitost - B&Y +HISTORY_MSG_203;NR - Barvni prostor +HISTORY_MSG_204;LMMSE koraki izboljšav +HISTORY_MSG_205;CAM02 - Filtriranje vročih/slabih pikslov +HISTORY_MSG_206;CAT02 - Avtomatska svetilnost scene +HISTORY_MSG_207;Odstranjevanje napak robov - Krivulja odtenkov +HISTORY_MSG_208;WB - B/R ekvalizator +HISTORY_MSG_210;GF - Kot +HISTORY_MSG_211;Postopno Filtriranje +HISTORY_MSG_212;VF - Moč +HISTORY_MSG_213;Filter vinjete +HISTORY_MSG_214;Črno-belo +HISTORY_MSG_215;B&W - CM - Rdeče +HISTORY_MSG_216;B&W - CM - Zeleno +HISTORY_MSG_217;B&W - CM - Modro +HISTORY_MSG_218;B&W - Gama - Rdeče +HISTORY_MSG_219;B&W - Gama - Zeleno +HISTORY_MSG_220;B&W - Gama - Modro +HISTORY_MSG_221;B&W - barvni filter +HISTORY_MSG_222;B&W - Prednastavitve +HISTORY_MSG_223;B&W - CM - Oranžno +HISTORY_MSG_224;B&W - CM - Rumeno +HISTORY_MSG_225;B&W - CM - Cian +HISTORY_MSG_226;B&W - CM - Magenta +HISTORY_MSG_227;B&W - CM - Vijolična +HISTORY_MSG_228;B&W - Ekvalizator svetlosti +HISTORY_MSG_229;B&W - Ekvalizator svetlosti +HISTORY_MSG_230;B&W - Način +HISTORY_MSG_231;B&W - Krivulja 'pred' +HISTORY_MSG_232;B&W - Tip krivulje 'pred' +HISTORY_MSG_233;B&W - Krivulja 'po' +HISTORY_MSG_234;B&W - Tip krivulje 'po' +HISTORY_MSG_235;B&W - CM - Avto +HISTORY_MSG_236;--neuporabljeno-- +HISTORY_MSG_237;B&W - CM +HISTORY_MSG_238;GF - Pero +HISTORY_MSG_239;GF - Moč +HISTORY_MSG_240;GF - Center +HISTORY_MSG_241;VF - Pero +HISTORY_MSG_242;VF - Okroglost +HISTORY_MSG_243;VC - Radij +HISTORY_MSG_244;VC - Moč +HISTORY_MSG_245;VC - Center +HISTORY_MSG_246;L*a*b* - CL krivulja +HISTORY_MSG_247;L*a*b* - LH krivulja +HISTORY_MSG_248;L*a*b* - HH krivulja +HISTORY_MSG_249;CbDL - Prag +HISTORY_MSG_250;NR - Izboljšano +HISTORY_MSG_251;B&W - Algoritem +HISTORY_MSG_252;CbDL - Skin tar/prot +HISTORY_MSG_253;CbDL - Reduciraj artefakte +HISTORY_MSG_254;CbDL - Odtenek kože +HISTORY_MSG_255;NR - Filter mediane +HISTORY_MSG_256;NR - Mediana - Tip +HISTORY_MSG_257;Toniranje barve +HISTORY_MSG_258;CT - Barvna krivulja +HISTORY_MSG_259;CT - Krivulja neprosojnosti +HISTORY_MSG_260;CT - a*[b*] neprosojnost +HISTORY_MSG_261;CT - Metoda +HISTORY_MSG_262;CT - b* neprosojnost +HISTORY_MSG_263;CT - Sence - Rdeča +HISTORY_MSG_264;CT - Sence - Zelena +HISTORY_MSG_265;CT - Sence - Modra +HISTORY_MSG_266;CT - srednje - Rdeča +HISTORY_MSG_267;CT - Srednje - Zelena +HISTORY_MSG_268;CT - Srednje - Modra +HISTORY_MSG_269;CT - Svetle - Rdeča +HISTORY_MSG_270;CT - Svetle - Zelena +HISTORY_MSG_271;CT - Svetle - Modra +HISTORY_MSG_272;CT - Uravnoteži +HISTORY_MSG_273;CT - Uravnoteženost barv SMH +HISTORY_MSG_274;CT - Nasičenost senc +HISTORY_MSG_275;CT - Nasičenost svetlih delov +HISTORY_MSG_276;CT - Neprosojnost +HISTORY_MSG_277;--neuporabljeno-- +HISTORY_MSG_278;CT - Ohrani svetlost +HISTORY_MSG_279;CT - Sence +HISTORY_MSG_280;CT - Bleščave +HISTORY_MSG_281;CT - Moč nasičenosti +HISTORY_MSG_282;CT - Prag nasičenosti +HISTORY_MSG_283;CT - Moč +HISTORY_MSG_284;CT - Avtomatsko varovanje nasičenosti +HISTORY_MSG_285;NR - Mediana - Metoda +HISTORY_MSG_286;NR - Mediana - Tip +HISTORY_MSG_287;NR - Mediana - Iteracije +HISTORY_MSG_288;Flat-Field - Kontrola obrezave +HISTORY_MSG_289;Flat-Field - Kontrola obrezave - Avto +HISTORY_MSG_290;Nivo črnine - Rdeča +HISTORY_MSG_291;Nivo črnine - Zelena +HISTORY_MSG_292;Nivo črnine - Modra +HISTORY_MSG_293;Simulacija filma +HISTORY_MSG_294;Simulacija filma - Moč +HISTORY_MSG_295;Simulacija filma - Film +HISTORY_MSG_296;NR - Krivulja svetlosti +HISTORY_MSG_297;NR - Način +HISTORY_MSG_298;Filter mrtvih pikslov +HISTORY_MSG_299;NR - Krivulja svetlosti +HISTORY_MSG_300;- +HISTORY_MSG_301;NR - Kontrola lume +HISTORY_MSG_302;NR - Metoda barvitosti +HISTORY_MSG_303;NR - Metoda barvitosti +HISTORY_MSG_304;W - Nivoji kontrastov +HISTORY_MSG_305;Nivoji valovčkov +HISTORY_MSG_306;W - Obdelava +HISTORY_MSG_307;W - Obdelava +HISTORY_MSG_308;W - Smer obdelave +HISTORY_MSG_309;W - ES - Podrobnost +HISTORY_MSG_310;W - Residual - Nebo tar/prot +HISTORY_MSG_311;W - Nivoji valovčkov +HISTORY_MSG_312;W - Residual - Prag senc +HISTORY_MSG_313;W - Barvitost - Sat/past +HISTORY_MSG_314;W - Barvni obseg - Reduciraj artefakte +HISTORY_MSG_315;W - Residual - Kontrast +HISTORY_MSG_316;W - Barvni obseg - Koža tar/prot +HISTORY_MSG_317;W - Barvni obseg - Koža hue +HISTORY_MSG_318;W - Kontrast - Nivoji bleščav +HISTORY_MSG_319;W - Kontrast - Obseg bleščav +HISTORY_MSG_320;W - Kontrast - Obseg senc +HISTORY_MSG_321;W - Kontrast - Nivoji senc +HISTORY_MSG_322;W - Barvni obseg - Izogibanje barvnega pomika +HISTORY_MSG_323;W - ES - Lokalni kontrast +HISTORY_MSG_324;W - Barvitost - Pastel +HISTORY_MSG_325;W - Barvitost - Nasičenje +HISTORY_MSG_326;W - Barvitost - Metoda +HISTORY_MSG_327;W - Kontrast - Uporabi za +HISTORY_MSG_328;W - Barvitost - Moč povezave +HISTORY_MSG_329;W - Toniranje - Neprosojnost RG +HISTORY_MSG_330;W - Toniranje - Neprosojnost BY +HISTORY_MSG_331;W - Nivoji kontrastov - Ekstra +HISTORY_MSG_332;W - Metoda prekrivanja +HISTORY_MSG_333;W - Residual - Sence +HISTORY_MSG_334;W - Residual - Barvitost +HISTORY_MSG_335;W - Residual - Bleščave +HISTORY_MSG_336;W - Residual - Prag bleščav +HISTORY_MSG_337;W - Residual - Odtenek neba +HISTORY_MSG_338;W - ES - Radij +HISTORY_MSG_339;W - ES - Moč +HISTORY_MSG_340;W - Moč +HISTORY_MSG_341;W - Izvedba robov +HISTORY_MSG_342;W - ES - Prvi nivo +HISTORY_MSG_343;W - Nivoji barvitosti +HISTORY_MSG_344;W - Metoda barvitost sl/cur +HISTORY_MSG_345;W - ES - Lokalni kontrast +HISTORY_MSG_346;W - ES - Metoda lokalnega kontrasta +HISTORY_MSG_347;W - Odstranjevanje šuma - Nivo 1 +HISTORY_MSG_348;W - Odstranjevanje šuma - Nivo 2 +HISTORY_MSG_349;W - Odstranjevanje šuma - Nivo 3 +HISTORY_MSG_350;W - ES - Detekcija roba +HISTORY_MSG_351;W - Residual - HH krivulja +HISTORY_MSG_352;W - Ozadje +HISTORY_MSG_353;W - ES - Občutljivost gradienta +HISTORY_MSG_354;W - ES - Izboljšan +HISTORY_MSG_355;W - ES - Nizki prag +HISTORY_MSG_356;W - ES - Visoki prag +HISTORY_MSG_357;W - Odstrani šum - Povezava z ES +HISTORY_MSG_358;W - Barvni obseg - CH +HISTORY_MSG_359;Vroč/Mrtev - Prag +HISTORY_MSG_360;TM - Gama +HISTORY_MSG_361;W - Končno - uravnoteženje barvitosti +HISTORY_MSG_362;W - Residual - Metoda stiskanja +HISTORY_MSG_363;W - Residual - Moč stiskanja +HISTORY_MSG_364;W - Končno - Uravnoteženost kontrasta +HISTORY_MSG_365;W - Končno - Delta uravnoteženje +HISTORY_MSG_366;W - Residual - Stiskanje game +HISTORY_MSG_367;W - Končno - Krivulja kontrastov 'Po' +HISTORY_MSG_368;W - Končno - Uravnoteženje kontrastov +HISTORY_MSG_369;W - Končno - Metoda uravnoteženja +HISTORY_MSG_370;W - Končno - Krivulja lokalnega kontrasta +HISTORY_MSG_371;Post-Resize Ostrenje +HISTORY_MSG_372;PRS USM - Radij +HISTORY_MSG_373;PRS USM - Količina +HISTORY_MSG_374;PRS USM - Prag +HISTORY_MSG_375;PRS USM - Naostri samo robove +HISTORY_MSG_376;PRS USM - Radij detekcije roba +HISTORY_MSG_377;PRS USM - Toleranca roba +HISTORY_MSG_378;PRS USM - Kontrola haloja +HISTORY_MSG_379;PRS USM - Količina kontrole haloja +HISTORY_MSG_380;PRS - Metoda +HISTORY_MSG_381;PRS RLD - Radij +HISTORY_MSG_382;PRS RLD - Količina +HISTORY_MSG_383;PRS RLD - Dušenje +HISTORY_MSG_384;PRS RLD - Iteracij +HISTORY_MSG_385;W - Residual - Uravnoteženost barv +HISTORY_MSG_386;W - Residual - CB močne zelene +HISTORY_MSG_387;W - Residual - CB močne modre +HISTORY_MSG_388;W - Residual - CB srednje zelene +HISTORY_MSG_389;W - Residual - CB srednje modre +HISTORY_MSG_390;W - Residual - CB šibke zelene +HISTORY_MSG_391;W - Residual - CB šibke modre +HISTORY_MSG_392;W - Residual - Uravnoteženost barv +HISTORY_MSG_393;DCP - Iskalna tabela +HISTORY_MSG_394;DCP - Osnovna ekspozicija +HISTORY_MSG_395;DCP - Osnovna tabela +HISTORY_MSG_396;W - pod-orodje kontrasta +HISTORY_MSG_397;W - Pod-orodje barvitosti +HISTORY_MSG_398;W - ES sub-tool +HISTORY_MSG_399;W - Residual sub-tool +HISTORY_MSG_400;W - Končno sub-tool +HISTORY_MSG_401;W - Pod-orodje toniranja +HISTORY_MSG_402;W - Pod-orodje odstranjevanja šuma +HISTORY_MSG_403;W - ES - Občutljivost na robove +HISTORY_MSG_404;W - ES - Ojačevanje osnove +HISTORY_MSG_405;W - Odstranjevanje šuma - Nivo 4 +HISTORY_MSG_406;W - ES - Sosednji piksli +HISTORY_MSG_407;Retinex - Metoda +HISTORY_MSG_408;Retinex - Radij +HISTORY_MSG_409;Retinex - Kontrast +HISTORY_MSG_410;Retinex - Odmik +HISTORY_MSG_411;Retinex - Moč +HISTORY_MSG_412;Retinex - Gaussov gradient +HISTORY_MSG_413;Retinex - Kontrast +HISTORY_MSG_414;Retinex - Histogram - Lab +HISTORY_MSG_415;Retinex - Prenos +HISTORY_MSG_416;Retinex +HISTORY_MSG_417;Retinex - Mediana prenosa +HISTORY_MSG_418;Retinex - Prag +HISTORY_MSG_419;Retinex - Barvni prostor +HISTORY_MSG_420;Retinex - Histogram - HSL +HISTORY_MSG_421;Retinex - Gama +HISTORY_MSG_422;Retinex - Gama +HISTORY_MSG_423;Retinex - Gama strmina +HISTORY_MSG_424;Retinex - HL prag +HISTORY_MSG_425;Retinex - Log base +HISTORY_MSG_426;Retinex - Ekvalizator odtenkov +HISTORY_MSG_427;Namen izrisovanja izhoda +HISTORY_MSG_428;Namen izrisovanja zaslona +HISTORY_MSG_429;Retinex - Iteracij +HISTORY_MSG_430;Retinex - Gradient prenosa +HISTORY_MSG_431;Retinex - Moč gradienta +HISTORY_MSG_432;Retinex - M - Bleščave +HISTORY_MSG_433;Retinex - M - Bleščave TW +HISTORY_MSG_434;Retinex - M - Sence +HISTORY_MSG_435;Retinex - M - Sence TW +HISTORY_MSG_436;Retinex - M - Radij +HISTORY_MSG_437;Retinex - M - Metoda +HISTORY_MSG_438;Retinex - M - Ekvalizator +HISTORY_MSG_439;Retinex - Obdelava +HISTORY_MSG_440;CbDL - Metoda +HISTORY_MSG_441;Retinex - Prenos povečanja +HISTORY_MSG_442;Retinex - Merilo +HISTORY_MSG_443;Prilagoditev črne točke izhoda +HISTORY_MSG_444;WB - Začasna pristranost +HISTORY_MSG_445;Raw sub-image +HISTORY_MSG_449;PS - prilagoditev ISO +HISTORY_MSG_452;PS - Prikaži gibanje +HISTORY_MSG_453;PS - Prikaži samo masko +HISTORY_MSG_457;PS - Preveri redečo/modro +HISTORY_MSG_462;PS - Preveri zeleno +HISTORY_MSG_464;PS - Zamegli masko gibanja +HISTORY_MSG_465;PS - Zamegli radij +HISTORY_MSG_468;PS - Zapolni luknje +HISTORY_MSG_469;PS - Mediana +HISTORY_MSG_471;PS - Popravek gibanja +HISTORY_MSG_472;PS - Gladki prehodi +HISTORY_MSG_473;PS - Uporabi LMMSE +HISTORY_MSG_474;PS - Izenači +HISTORY_MSG_475;PS - Izenači kanal +HISTORY_MSG_476;CAM02 - Začasno ven +HISTORY_MSG_477;CAM02 - Zeleno ven +HISTORY_MSG_478;CAM02 - Yb ven +HISTORY_MSG_479;CAM02 - CAT02 prilagoditev ven +HISTORY_MSG_480;CAM02 - Avtomatska CAT02 ven +HISTORY_MSG_481;CAM02 - Začasna scena +HISTORY_MSG_482;CAM02 - Zelena scena +HISTORY_MSG_483;CAM02 - Yb scena +HISTORY_MSG_484;CAM02 - Avto Yb scena +HISTORY_MSG_485;Popravek objektiva +HISTORY_MSG_486;Popravek objektiva - Fotoaparat +HISTORY_MSG_487;Popravek objektiva - Objektiv +HISTORY_MSG_488;Zmanjšanje dinamičnega obsega +HISTORY_MSG_489;DRC - Podrobnost +HISTORY_MSG_490;DRC - Količina +HISTORY_MSG_491;Ravnotežje beline +HISTORY_MSG_492;RGB krivulje +HISTORY_MSG_493;L*a*b* prilagoditve +HISTORY_MSG_494;Ujemite ostrenje +HISTORY_MSG_CLAMPOOG;Izrežite barve izven obsega +HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Popravek barv +HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Popravek barv +HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Kanal +HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - maska regije C +HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H maska +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Svetlost +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L maska +HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - Seznam +HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - zamegljevanje regijske maske +HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - odmik regije +HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - moč regije +HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Nasičenost +HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - prikaz maske regije +HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - strmina regije +HISTORY_MSG_DEHAZE_DEPTH;Odstranjevanje zamegljenosti - Globina +HISTORY_MSG_DEHAZE_ENABLED;Odstranjevanje zamegljenosti +HISTORY_MSG_DEHAZE_LUMINANCE;Odstranjevanje zamegljenosti - samo svetlost +HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Odstranjevanje zamegljenosti - Prikaži globino mape +HISTORY_MSG_DEHAZE_STRENGTH;Odstranjevanje zamegljenosti - Moč +HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dualno odstranjevanje mozaičnosti - Avtomatski prag +HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dualno odstranjevanje mozaičnosti - Prag kontrasta +HISTORY_MSG_FILMNEGATIVE_ENABLED;Filmski negativ +HISTORY_MSG_FILMNEGATIVE_VALUES;Film negativne vrednosti +HISTORY_MSG_HISTMATCHING;Avto-usklajena krivulja tonov +HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries +HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 osvetljevalnik D +HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Tip +HISTORY_MSG_ICM_WORKING_GAMMA;Delovanje - Gama +HISTORY_MSG_ICM_WORKING_SLOPE;Delovanje - Strmina +HISTORY_MSG_ICM_WORKING_TRC_METHOD;Delovanje - Metoda TRC +HISTORY_MSG_LOCALCONTRAST_AMOUNT;Lokalni kontrast - Količina +HISTORY_MSG_LOCALCONTRAST_DARKNESS;Lokalni kontrast - Temina +HISTORY_MSG_LOCALCONTRAST_ENABLED;Lokalni kontrast +HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Lokalni kontrast - Svetlost +HISTORY_MSG_LOCALCONTRAST_RADIUS;Lokalni kontrast - Radij +HISTORY_MSG_METADATA_MODE;Način kopiranja metapodatkov +HISTORY_MSG_MICROCONTRAST_CONTRAST;Mikrokontrast - Prag kontrasta +HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Avtomatski prag +HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Avtomatski radij +HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Prag kontrasta +HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gama +HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iteracije +HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radij +HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Povečanje polmera vogala +HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - metoda odstranjevanje mozaičnosti za gibanje +HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Smer linijskega filtra šuma +HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF linijski filter +HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Prag kontrasta +HISTORY_MSG_RAWCACORR_AUTOIT;Surovi CA popravek - Iteracije +HISTORY_MSG_RAWCACORR_COLORSHIFT;Surovi CA popravek - Izogibanje pomika barv +HISTORY_MSG_RAW_BORDER;Surova meja +HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Dovoli povečevanje +HISTORY_MSG_SHARPENING_BLUR;Ostrenje - Zamegli radij +HISTORY_MSG_SHARPENING_CONTRAST;Ostrenje - Prag kontrasta +HISTORY_MSG_SHARPENING_GAMMA;Ostrenje - Gama +HISTORY_MSG_SH_COLORSPACE;S/H - Barvni prostor +HISTORY_MSG_SOFTLIGHT_ENABLED;Mehka svetloba +HISTORY_MSG_SOFTLIGHT_STRENGTH;Mehka svetloba - Moč +HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Sidro +HISTORY_NEWSNAPSHOT;Dodaj +HISTORY_NEWSNAPSHOT_TOOLTIP;Bližnjica: Alt-s +HISTORY_SNAPSHOT;Posnetek +HISTORY_SNAPSHOTS;Posnetek +ICCPROFCREATOR_COPYRIGHT;Copyright: +ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Ponastavi na privzeti copyright, dodeljen "RawTherapee, CC0" +ICCPROFCREATOR_CUSTOM;Po meri +ICCPROFCREATOR_DESCRIPTION;Opis: +ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Dodaj vrednosti game and strmine k opisu +ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Pusti prazno in nastavi privzeti opis. +ICCPROFCREATOR_GAMMA;Gama +ICCPROFCREATOR_ICCVERSION;ICC verzija: +ICCPROFCREATOR_ILL;Illuminant: +ICCPROFCREATOR_ILL_41;D41 +ICCPROFCREATOR_ILL_50;D50 +ICCPROFCREATOR_ILL_55;D55 +ICCPROFCREATOR_ILL_60;D60 +ICCPROFCREATOR_ILL_65;D65 +ICCPROFCREATOR_ILL_80;D80 +ICCPROFCREATOR_ILL_DEF;Privzeto +ICCPROFCREATOR_ILL_INC;StdA 2856K +ICCPROFCREATOR_ILL_TOOLTIP;Nastaviš lahko samo svetlobe iz profilov ICC v4. +ICCPROFCREATOR_PRIMARIES;Primaries: +ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 +ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 +ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998) +ICCPROFCREATOR_PRIM_BEST;BestRGB +ICCPROFCREATOR_PRIM_BETA;BetaRGB +ICCPROFCREATOR_PRIM_BLUX;Blue X +ICCPROFCREATOR_PRIM_BLUY;Blue Y +ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +ICCPROFCREATOR_PRIM_GREX;Green X +ICCPROFCREATOR_PRIM_GREY;Green Y +ICCPROFCREATOR_PRIM_PROPH;Prophoto +ICCPROFCREATOR_PRIM_REC2020;Rec2020 +ICCPROFCREATOR_PRIM_REDX;Red X +ICCPROFCREATOR_PRIM_REDY;Red Y +ICCPROFCREATOR_PRIM_SRGB;sRGB +ICCPROFCREATOR_PRIM_TOOLTIP;Primarne prilagojene vrednosti lahko nastavite samo za profile ICC v4. +ICCPROFCREATOR_PRIM_WIDEG;Široki barvni prostor +ICCPROFCREATOR_PROF_V2;ICC v2 +ICCPROFCREATOR_PROF_V4;ICC v4 +ICCPROFCREATOR_SAVEDIALOG_TITLE;Shrani ICC profil kot... +ICCPROFCREATOR_SLOPE;Strmina +ICCPROFCREATOR_TRC_PRESET;Krivulja odzivnosti tonov: +IPTCPANEL_CATEGORY;Kategorija +IPTCPANEL_CATEGORYHINT;Določa temo slike po mnenju punudnika. +IPTCPANEL_CITY;Mesto +IPTCPANEL_CITYHINT;Vnesi ime mesta na tej sliki. +IPTCPANEL_COPYHINT;Kopiraj nastavitve IPTC na odložišče. +IPTCPANEL_COPYRIGHT;Obvestilo copyrighta +IPTCPANEL_COPYRIGHTHINT;Vnesi določilo trenutnega nosilca Copyrighta te slike kot npr. ©2019 Janez Novak. +IPTCPANEL_COUNTRY;Država +IPTCPANEL_COUNTRYHINT;Vnesi ime države na tej sliki. +IPTCPANEL_CREATOR;Avtor +IPTCPANEL_CREATORHINT;Vnesi ime avtorja te slike. +IPTCPANEL_CREATORJOBTITLE;Uradni naziv avtorja +IPTCPANEL_CREATORJOBTITLEHINT;Vnesi službeni naziv avtorja te slike, ki je zabeležen v polju avtorja. +IPTCPANEL_CREDIT;Zasluge +IPTCPANEL_CREDITHINT;Vnesi osebo zaslužno za objavo te slike. +IPTCPANEL_DATECREATED;Datum nastanka +IPTCPANEL_DATECREATEDHINT;Vnesi datum, ko je bila slika posneta. +IPTCPANEL_DESCRIPTION;Opis +IPTCPANEL_DESCRIPTIONHINT;Vnesi naslov, ki opisuje kdo, kaj in zakaj to dogaja na tej sliki, kar vključuje imena oseb in njihove vloge pri tem, kar se dogaja na sliki. +IPTCPANEL_DESCRIPTIONWRITER;Zapisnikar opisa +IPTCPANEL_DESCRIPTIONWRITERHINT;Vnesi ime osebe, ki je napisala, uredila ali popravila opis slike. +IPTCPANEL_EMBEDDED;Vdelano +IPTCPANEL_EMBEDDEDHINT;Nastavi nazaj na podatke IPTC, ki so vdelani v datoteki slike. +IPTCPANEL_HEADLINE;Naslov +IPTCPANEL_HEADLINEHINT;Vnesi kratek objavljiv opis vsebine te slike. +IPTCPANEL_INSTRUCTIONS;Navodila +IPTCPANEL_INSTRUCTIONSHINT;Vnesi informacije o morebitnem embargu ali drugih omejitvah, ki niso omenjene v polju Copyright. +IPTCPANEL_KEYWORDS;Ključne besede +IPTCPANEL_KEYWORDSHINT;Vstavi poljubno število terminov ali fraz, ki opisujejo vsebino slike. +IPTCPANEL_PASTEHINT;Prilepi nastavitve IPTC iz odložišča. +IPTCPANEL_PROVINCE;Provinca ali država +IPTCPANEL_PROVINCEHINT;Vnesi ime province ali države v povezavi s to sliko. +IPTCPANEL_RESET;Ponastavi +IPTCPANEL_RESETHINT;Ponastavi na privzeti profil +IPTCPANEL_SOURCE;Vir +IPTCPANEL_SOURCEHINT;Vnesi ali uredi ime osebe ali skupine, ki je imela vlogo pri dobavi slike kot npr. oseba od katere si dobil sliko. +IPTCPANEL_SUPPCATEGORIES;Dodatki kategorije +IPTCPANEL_SUPPCATEGORIESHINT;Podrobneje določa vsebino slike. +IPTCPANEL_TITLE;Naslov +IPTCPANEL_TITLEHINT;Vnesi kratko človeku prijazno ime slike, lahko je tudi ime datoteke. +IPTCPANEL_TRANSREFERENCE;ID delovnega mesta +IPTCPANEL_TRANSREFERENCEHINT;Vnesite številko ali identifikator za delovnega toka ali omogočanje sledenja. +MAIN_BUTTON_FULLSCREEN;Celotni zaslon +MAIN_BUTTON_ICCPROFCREATOR;Ustvarjalec ICC profila +MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigacija do naslednje slike odprte v urejevalniku.\nBližnjica: Shift-F4\n\nNavigacija do naslednje slike glede na trenutno izbrano predogledno sličico v brskalniku datotek:\nBližnjica: F4 +MAIN_BUTTON_NAVPREV_TOOLTIP;Navigacija do prejšnje slike odprte v urejevalniku.\nBližnjica: Shift-F3\n\nNavigacija do prejšnje slike glede na trenutno izbrano predogledno sličico v brskalniku datotek:\nBližnjica: F3 +MAIN_BUTTON_NAVSYNC_TOOLTIP;Sinhroniziraj pregledovalnik datotek z urejevalnikom, tako da se vidi predogledna sličica trenutno odprte slike in deaktivira aktivne filtre.\nBližnjica: x\n\nKot zgoraj, a brez deaktivranja filtrov:\nBližnjica: y\n(Zavedajte se predogledna sličica odprte slike ne bo pokazana, če je sfiltrirana). +MAIN_BUTTON_PREFERENCES;Preference +MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Postavi trenutno sliko v čakalno vrsto za obdelavo.\nBližnjica: Ctrl+b +MAIN_BUTTON_SAVE_TOOLTIP;Shrani trenutno sliko.\nBližnjica: Ctrl+s\nShrani trenutni profil (.pp3).\nBližnjica: Ctrl+Shift+s +MAIN_BUTTON_SENDTOEDITOR;Uredi sliko v zunanjem urejevalniku +MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Uredi sliko v zunanjem urejevalniku.\nBližnjica: Ctrl+e +MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Prikaži/skrij stranske panele.\nBližnjica: m +MAIN_BUTTON_UNFULLSCREEN;Izhod iz celotnega zaslona +MAIN_FRAME_EDITOR;Urejevalnik +MAIN_FRAME_EDITOR_TOOLTIP;Urejevalnik.\nBližnjica: Ctrl-F4 +MAIN_FRAME_FILEBROWSER;Prikazovalnik datotek +MAIN_FRAME_FILEBROWSER_TOOLTIP;Prikazovalnik datotek.\nBližnjica: Ctrl-F2 +MAIN_FRAME_PLACES;Lokacije slik +MAIN_FRAME_PLACES_ADD;Dodaj +MAIN_FRAME_PLACES_DEL;Odstrani +MAIN_FRAME_QUEUE;Čakalna vrsta +MAIN_FRAME_QUEUE_TOOLTIP;Čakalna vrsta obdelav.\nBližnjica: Ctrl-F3 +MAIN_FRAME_RECENT;Zadnje uporabljene mape +MAIN_MSG_ALREADYEXISTS;Datoteka že obstaja. +MAIN_MSG_CANNOTLOAD;Ne morem naložiti slike +MAIN_MSG_CANNOTSAVE;Napaka pri shranjevanju datoteke +MAIN_MSG_CANNOTSTARTEDITOR;Ne morem zagnati urejevalnika. +MAIN_MSG_CANNOTSTARTEDITOR_SECONDARY;Prosim nastavi ustrezno pot v preferencah. +MAIN_MSG_EMPTYFILENAME;Datoteka ni določena! +MAIN_MSG_IMAGEUNPROCESSED;Ta ukaz zahteva, da so vse slike najprej obdelane v čakalni vrsti. +MAIN_MSG_NAVIGATOR;Navigator +MAIN_MSG_OPERATIONCANCELLED;Operacija preklicana +MAIN_MSG_PATHDOESNTEXIST;Pot\n\n%1\n\nne obstaja. Prosim postavi pravilno pot v preferencah. +MAIN_MSG_QOVERWRITE;Ali jo želiš prepisati? +MAIN_MSG_SETPATHFIRST;Najprej moraš nastaviti pot v preferencah za uporabo te funkcije! +MAIN_MSG_TOOMANYOPENEDITORS;Preveč odprtih urejevalnikov.\nZa nadaljevanje dela prosim zapri urejevalnik. +MAIN_MSG_WRITEFAILED;Izpad pri pisanju\n"%1"\n\nPreveri, da mapa obstaja in da imaš pravico pisanja v njej. +MAIN_TAB_ADVANCED;Napredno +MAIN_TAB_ADVANCED_TOOLTIP;Bližnjica: Alt-w +MAIN_TAB_COLOR;Barva +MAIN_TAB_COLOR_TOOLTIP;Bližnjica: Alt-c +MAIN_TAB_DETAIL;Podrobnost +MAIN_TAB_DETAIL_TOOLTIP;Bližnjica: Alt-d +MAIN_TAB_DEVELOP; Paketno urejanje +MAIN_TAB_EXIF;Exif +MAIN_TAB_EXPORT; Hitri izvoz +MAIN_TAB_EXPOSURE;Ekspozicija +MAIN_TAB_EXPOSURE_TOOLTIP;Bližnjica: Alt-e +MAIN_TAB_FAVORITES;Priljubljene +MAIN_TAB_FAVORITES_TOOLTIP;Bližnjica: Alt-u +MAIN_TAB_FILTER; Filter +MAIN_TAB_INSPECT; Pregled +MAIN_TAB_IPTC;IPTC +MAIN_TAB_METADATA;Metapodatki +MAIN_TAB_METADATA_TOOLTIP;Bližnjica: Alt-m +MAIN_TAB_RAW;Surove +MAIN_TAB_RAW_TOOLTIP;Bližnjica: Alt-r +MAIN_TAB_TRANSFORM;Transformiraj +MAIN_TAB_TRANSFORM_TOOLTIP;Bližnjica: Alt-t +MAIN_TOOLTIP_BACKCOLOR0;Barva ozadja predpregleda: theme-based\nBližnjica: 9 +MAIN_TOOLTIP_BACKCOLOR1;Barva ozadja predpregleda: črna\nBližnjica: 9 +MAIN_TOOLTIP_BACKCOLOR2;Barva ozadja predpregleda: bela\nBližnjica: 9 +MAIN_TOOLTIP_BACKCOLOR3;Barva ozadja predpregleda: srednje siva\nBližnjica: 9 +MAIN_TOOLTIP_BEFOREAFTERLOCK;Zakleni / Odkleni the Pred pogled\n\nZakleni: ohranjaj pogled Pred nespremenjen.\nUporabno za oceno skupnega učinka več orodij.\nPoleg tega je mogoče opraviti primerjave s katerim koli stanjem v zgodovini.\n\nOdkleni: Pred prikaz bo sledil pogledu Po z enim korakom zamude, prikazuje sliko pred učinkom zadnje uporabljenega orodja. +MAIN_TOOLTIP_HIDEHP;Prikaži/skrij levo ploščo (vključno z zgodovino).\nBližnjica: l +MAIN_TOOLTIP_INDCLIPPEDH;Obrezana oznaka osvetlitve.\nBližnjica: < +MAIN_TOOLTIP_INDCLIPPEDS;Obrezana oznaka senc.\nBližnjica: > +MAIN_TOOLTIP_PREVIEWB;Predogled modrega kanala.\nBližnjica: b +MAIN_TOOLTIP_PREVIEWFOCUSMASK;Predogled maske ostrenja.\nBližnjica: Shift-f \n\nBolj natančne pri slikah z majhno globinsko ostrino, nizkim šumom in višjo stopnjo povečave.\nZa povečavo 10-30% za izboljšanje natančnosti odkrivanja šumnih slik. +MAIN_TOOLTIP_PREVIEWG;Predogled zelenega kanala.\nBližnjica: g +MAIN_TOOLTIP_PREVIEWL;Predogled osvetljenosti.\nBližnjica: v\n\n0.299*R + 0.587*G + 0.114*B +MAIN_TOOLTIP_PREVIEWR;Predogled rdečega kanala.\nBližnjica: r +MAIN_TOOLTIP_PREVIEWSHARPMASK;Predogled maske ostrinskega kontrasta.\nBližnjica: p\n\nDeluje samo, kadar je omogočeno ostrenje in zoom >= 100%. +MAIN_TOOLTIP_QINFO;Hitre informacije o sliki.\nBližnjica: i +MAIN_TOOLTIP_SHOWHIDELP1;Prikaži/skrij levi panel.\nBližnjica: l +MAIN_TOOLTIP_SHOWHIDERP1;Prikaži/skrij desni panel.\nBližnjica: Alt-l +MAIN_TOOLTIP_SHOWHIDETP1;Prikaži/skrij vrhnji panel.\nBližnjica: Shift-l +MAIN_TOOLTIP_THRESHOLD;Prag +MAIN_TOOLTIP_TOGGLE;Preklopi pogled Pred/Po.\nBližnjica: Shift-b +MONITOR_PROFILE_SYSTEM;Sistemska privzeta vrednost +NAVIGATOR_B;B: +NAVIGATOR_G;G: +NAVIGATOR_H;H: +NAVIGATOR_LAB_A;a*: +NAVIGATOR_LAB_B;b*: +NAVIGATOR_LAB_L;L*: +NAVIGATOR_NA; -- +NAVIGATOR_R;R: +NAVIGATOR_S;S: +NAVIGATOR_V;V: +NAVIGATOR_XY_FULL;Širina: %1, Višina: %2 +NAVIGATOR_XY_NA;x: --, y: -- +OPTIONS_BUNDLED_MISSING;Že pripravljenih profilov "%1" ne morem najti!\n\nVaša namestitev je morda poškodovana.\n\nUporabljene bodo privzete programske vrednosti. +OPTIONS_DEFIMG_MISSING;Privzetega profila za ne-surove fotografije ne morem najti ali ni nastavljen.\n\nProsim preverite vašo mapo profilov, morda manjka ali je poškodovan.\n\n"%1" bo uporabljena kot nadomestek. +OPTIONS_DEFRAW_MISSING;Privzetega profila za surove fotografije ne morem najti ali ni nastavljen.\n\nProsim preverite vašo mapo profilov, morda manjka ali je poškodovan.\n\n"%1" bo uporabljena kot nadomestek. +PARTIALPASTE_ADVANCEDGROUP;Napredne nastavitve +PARTIALPASTE_BASICGROUP;Osnovne nastavitve +PARTIALPASTE_CACORRECTION;Popravek barvne aberacije +PARTIALPASTE_CHANNELMIXER;Mešalnik kanalov +PARTIALPASTE_CHANNELMIXERBW;Črno-belo +PARTIALPASTE_COARSETRANS;Groba rotacija/preklop +PARTIALPASTE_COLORAPP;CIECAM02 +PARTIALPASTE_COLORGROUP;Nastavitev barv +PARTIALPASTE_COLORTONING;Toniranje barv +PARTIALPASTE_COMMONTRANSFORMPARAMS;Avto-polnjenje +PARTIALPASTE_COMPOSITIONGROUP;Nastavitev kompozicije +PARTIALPASTE_CROP;Obreži +PARTIALPASTE_DARKFRAMEAUTOSELECT;Avtomatska izbira dark-frame +PARTIALPASTE_DARKFRAMEFILE;Datoteke dark-frame +PARTIALPASTE_DEFRINGE;Odstranjevanje barvnih napak robov +PARTIALPASTE_DEHAZE;Odstranjevanje motnosti +PARTIALPASTE_DETAILGROUP;Nastavitve podrobnosti +PARTIALPASTE_DIALOGLABEL;Profil obdelovanja delnega lepljenja +PARTIALPASTE_DIRPYRDENOISE;Zmanjšanje šumov +PARTIALPASTE_DIRPYREQUALIZER;Kontrast po nivojih podrobnosti +PARTIALPASTE_DISTORTION;Popravljanje popačenosti +PARTIALPASTE_EPD;Preslikava odtenkov +PARTIALPASTE_EQUALIZER;Nivoji valovčkov +PARTIALPASTE_EVERYTHING;Vse +PARTIALPASTE_EXIFCHANGES;Exif +PARTIALPASTE_EXPOSURE;Ekspozicija +PARTIALPASTE_FILMNEGATIVE;Filmski negativ +PARTIALPASTE_FILMSIMULATION;Simulacija filma +PARTIALPASTE_FLATFIELDAUTOSELECT;Flat-field avtomatski izbor +PARTIALPASTE_FLATFIELDBLURRADIUS;Flat-field radij zamegljenosti +PARTIALPASTE_FLATFIELDBLURTYPE;Flat-field vrsta zameglitve +PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field nadzor obrezave +PARTIALPASTE_FLATFIELDFILE;Datoteka flat-field +PARTIALPASTE_GRADIENT;Postopni filter +PARTIALPASTE_HSVEQUALIZER;HSV ekvalizator +PARTIALPASTE_ICMSETTINGS;Nastavitve upravljanja barv +PARTIALPASTE_IMPULSEDENOISE;Impuzno zmanjšanje šuma +PARTIALPASTE_IPTCINFO;IPTC +PARTIALPASTE_LABCURVE;L*a*b* prilagoditve +PARTIALPASTE_LENSGROUP;Nastavitve objektiva +PARTIALPASTE_LENSPROFILE;Popravki objektiva iz njegovega profila +PARTIALPASTE_LOCALCONTRAST;Lokalni kontrast +PARTIALPASTE_METADATA;Način metapodatkov +PARTIALPASTE_METAGROUP;Nastavitve metapodatkov +PARTIALPASTE_PCVIGNETTE;Filter vinjetiranja +PARTIALPASTE_PERSPECTIVE;Perspektiva +PARTIALPASTE_PREPROCESS_DEADPIXFILT;Filter mrtvih pikslov +PARTIALPASTE_PREPROCESS_GREENEQUIL;Uravnoteženje zelene +PARTIALPASTE_PREPROCESS_HOTPIXFILT;Filter vročih pikslov +PARTIALPASTE_PREPROCESS_LINEDENOISE;Filter šuma na črti +PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;Filter linij PDAF +PARTIALPASTE_PRSHARPENING;Ostrenje po spremembi velikosti +PARTIALPASTE_RAWCACORR_AUTO;CA avtomatski popravek +PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA izogibaj se pomiku barve +PARTIALPASTE_RAWCACORR_CAREDBLUE;CA rdeča & modra +PARTIALPASTE_RAWEXPOS_BLACK;Nivoji črne +PARTIALPASTE_RAWEXPOS_LINEAR;Popravek bele točke +PARTIALPASTE_RAWGROUP;Nastavitve za surove +PARTIALPASTE_RAW_BORDER;Surova meja +PARTIALPASTE_RAW_DCBENHANCE;DCB izboljšava +PARTIALPASTE_RAW_DCBITERATIONS;DCB iteracije +PARTIALPASTE_RAW_DMETHOD;Metoda odstranjevanja mozaičnosti +PARTIALPASTE_RAW_FALSECOLOR;Zatiranje napačne barve +PARTIALPASTE_RAW_IMAGENUM;Sub-image +PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE koraki izboljšave +PARTIALPASTE_RAW_PIXELSHIFT;Pomik pikslov +PARTIALPASTE_RESIZE;Sprememba velikosti +PARTIALPASTE_RETINEX;Retinex +PARTIALPASTE_RGBCURVES;Krivulje RGB +PARTIALPASTE_ROTATION;Rotacija +PARTIALPASTE_SHADOWSHIGHLIGHTS;Sence/bleščave +PARTIALPASTE_SHARPENEDGE;Robovi +PARTIALPASTE_SHARPENING;Ostrenje (USM/RL) +PARTIALPASTE_SHARPENMICRO;Mikrokontrast +PARTIALPASTE_SOFTLIGHT;Mehka svetloba +PARTIALPASTE_TM_FATTAL;Stiskanje dinamičnega obsega +PARTIALPASTE_VIBRANCE;Vibrance +PARTIALPASTE_VIGNETTING;Popravi vinjetiranja +PARTIALPASTE_WHITEBALANCE;Uravnoteženje beline +PREFERENCES_ADD;Dodaj +PREFERENCES_APPEARANCE;Izgled +PREFERENCES_APPEARANCE_COLORPICKERFONT;Pisava izbire barv +PREFERENCES_APPEARANCE_CROPMASKCOLOR;Barve maske obrezovanja +PREFERENCES_APPEARANCE_MAINFONT;Glavna pisava +PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Glavna barva navigacije +PREFERENCES_APPEARANCE_PSEUDOHIDPI;Psevdo način HiDPI +PREFERENCES_APPEARANCE_THEME;Tema +PREFERENCES_APPLNEXTSTARTUP;potreben ponovni zagon +PREFERENCES_AUTOMONPROFILE;Uporabi profil glavnega monitorja iz operacijskega sistema +PREFERENCES_AUTOSAVE_TP_OPEN;Ob ihodu shrani orodje zloženo/razširjeno +PREFERENCES_BATCH_PROCESSING;Paketna obdelava +PREFERENCES_BEHADDALL;Vse na 'Dodaj' +PREFERENCES_BEHADDALLHINT;Nastavi vse pramaetre na način dodajanja.\nPrilagoditve prametrov v kontrolni plošči paketa bodo spremembe glede na shranjene vrednosti. +PREFERENCES_BEHAVIOR;Obnašanje +PREFERENCES_BEHSETALL;Vse na 'Nastavi' +PREFERENCES_BEHSETALLHINT;Postavi vse parametre v način Nastavi.\nPrilagoditve parametrov v kontrolni plošči paketnega orodja bo absolutno, prikazane bodo dejanske vrednosti. +PREFERENCES_CACHECLEAR;Počisti +PREFERENCES_CACHECLEAR_ALL;Počisti vse datoteke v vmesnem pomnilniku: +PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Očisti vse datoteke iz vmesnega pomnilnika razen profilov obdelav: +PREFERENCES_CACHECLEAR_ONLYPROFILES;Očisti datoteke profilov obdelav iz vmesnega ponilnika: +PREFERENCES_CACHECLEAR_SAFETY;Očiščene samo datoteke v vmesnem pomnilniku. Profili obdelav, ki sodijo k slikam, so nedotaknjeni. +PREFERENCES_CACHEMAXENTRIES;Največje število datotek v vmesnem pomnilniku +PREFERENCES_CACHEOPTS;Nastavitve predpomnilnika +PREFERENCES_CACHETHUMBHEIGHT;Največja višina predogledne slikice +PREFERENCES_CHUNKSIZES;Ploskev na nit +PREFERENCES_CHUNKSIZE_RAW_AMAZE;AMaZE odstranjevanje mozaičnosti +PREFERENCES_CHUNKSIZE_RAW_CA;Surovi CA popravki +PREFERENCES_CHUNKSIZE_RAW_RCD;RCD odstranjevanje mozaičnosti +PREFERENCES_CHUNKSIZE_RAW_XT;Xtrans odstranjevanje mozaičnosti +PREFERENCES_CHUNKSIZE_RGB;RGB obdelava +PREFERENCES_CLIPPINGIND;Indikator obrezave +PREFERENCES_CLUTSCACHE;HaldCLUT predpomnilnik +PREFERENCES_CLUTSCACHE_LABEL;Maksimalno število predpomnjenih CLUTsev +PREFERENCES_CLUTSDIR;HaldCLUT mapa +PREFERENCES_CMMBPC;Prilagoditev črne točke +PREFERENCES_CROP;Obrezovanje +PREFERENCES_CROP_AUTO_FIT;Avtomatically prilagodi obrezavi +PREFERENCES_CROP_GUIDES;Prikaz vodil, kadar ne urejamo obrezave +PREFERENCES_CROP_GUIDES_FRAME;Okvir +PREFERENCES_CROP_GUIDES_FULL;Izvirnik +PREFERENCES_CROP_GUIDES_NONE;Noben +PREFERENCES_CURVEBBOXPOS;Pozicija gumbov za kopiranje in lepljenje krivulj +PREFERENCES_CURVEBBOXPOS_ABOVE;Nad +PREFERENCES_CURVEBBOXPOS_BELOW;Pod +PREFERENCES_CURVEBBOXPOS_LEFT;Levo +PREFERENCES_CURVEBBOXPOS_RIGHT;Desno +PREFERENCES_CUSTPROFBUILD;Orodje za izdelavo profila obdelav po meri +PREFERENCES_CUSTPROFBUILDHINT;Datoteka s programom (ali skriptom), ki se izvede kadar je treba idelati profil obdelave za sliko.\n\nPot za komunikacijsko datoteko (*.ini imenovana kudi "ključna datoteka") je dodana kot parameter ob klicu te datoteke. Vsebuje različne parametre za skripte in dele slik Exif, tako da omogoča generiranje profila obdelave glede na pravila.\n\nWARNING: Če pot vsebuje presledke, je vaša naloga, da jo omejite z dvojnimi apostrofi. +PREFERENCES_CUSTPROFBUILDKEYFORMAT;Format ključnih besed +PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Ime +PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;ID značke +PREFERENCES_CUSTPROFBUILDPATH;Pot izvajanja +PREFERENCES_DARKFRAMEFOUND;Najdeno +PREFERENCES_DARKFRAMESHOTS;posnetkov +PREFERENCES_DARKFRAMETEMPLATES;Šablone +PREFERENCES_DATEFORMAT;Format datuma +PREFERENCES_DATEFORMATHINT;Možna je raba naslednjih formatnih določil:\n%y - leto\n%m - mesec\n%d - dan\n\nNa primer standard ISO 8601 določa datum takole:\n%y-%m-%d +PREFERENCES_DIRDARKFRAMES;Mapa dark-frame +PREFERENCES_DIRECTORIES;Mape +PREFERENCES_DIRHOME;Domača mapa +PREFERENCES_DIRLAST;Zadnje obiskana mapa +PREFERENCES_DIROTHER;Ostalo +PREFERENCES_DIRSELECTDLG;Ob začetki izberi mapo slik... +PREFERENCES_DIRSOFTWARE;Mapa namestitve +PREFERENCES_EDITORCMDLINE;Ukazna vrstica po meri +PREFERENCES_EDITORLAYOUT;Oblika urejevalnika +PREFERENCES_EXTERNALEDITOR;Zunanji urejevalnik +PREFERENCES_FBROWSEROPTS;Pregledovalnik datotek/ Nastavitve predoglednih sličic +PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Kompaktne orodne vrstice v pregledovalniku datotek +PREFERENCES_FLATFIELDFOUND;Najdeno +PREFERENCES_FLATFIELDSDIR;Flat-field mapa +PREFERENCES_FLATFIELDSHOTS;posnetki +PREFERENCES_FLATFIELDTEMPLATES;šablone +PREFERENCES_FORIMAGE;Za nesurove slike +PREFERENCES_FORRAW;Za surove slike +PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Enaka višina predogledne sličice za pregled filmov in pregledovalnik datotek +PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Različni višini zahtevata več časa za obdelavo ob preklopu iz urejevalnika slike v pregledovalnik datotek. +PREFERENCES_GIMPPATH;mapa, kje je nameščen GIMP +PREFERENCES_HISTOGRAMPOSITIONLEFT;Histogram v levem panoju +PREFERENCES_HISTOGRAM_TOOLTIP;Če je omogočen, za izdelavo histograma slike v navigacijskem panoju uporabim delovni profil, sicer pa popravljen profil game. +PREFERENCES_HLTHRESHOLD;Prag za prilepljene bleščave +PREFERENCES_ICCDIR;Mapa, kjer so barvni profili +PREFERENCES_IMPROCPARAMS;Privzeti profil obdelave +PREFERENCES_INSPECT_LABEL;Preglej +PREFERENCES_INSPECT_MAXBUFFERS_LABEL;Največje število shranjenih slik v vmesnem pomnilniku +PREFERENCES_INSPECT_MAXBUFFERS_TOOLTIP;Nastavi največje število slik v vmesnem pomnilniku v pregledovalniku datotek; sistemi z malo RAMa (2GB) naj imajo to postavljeno na 1 ali 2. +PREFERENCES_INTENT_ABSOLUTE;Absolutno kolorimetrično +PREFERENCES_INTENT_PERCEPTUAL;Perceptual +PREFERENCES_INTENT_RELATIVE;Relativno kolorimetrično +PREFERENCES_INTENT_SATURATION;Nasičenje +PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Prikaži predogledno sličico JPEG, če je surova slika še neobdelana +PREFERENCES_LANG;Jezik +PREFERENCES_LANGAUTODETECT;Uporabi jezik sistema +PREFERENCES_MAXRECENTFOLDERS;Največje število zadnje obiskanih map +PREFERENCES_MENUGROUPEXTPROGS;Skupinski "Odpri z" +PREFERENCES_MENUGROUPFILEOPERATIONS;Skupinske "Operacija z datotekami" +PREFERENCES_MENUGROUPLABEL;Skupinska "Oznaka barve" +PREFERENCES_MENUGROUPPROFILEOPERATIONS;Skupinske "Operacije profilov obdelav" +PREFERENCES_MENUGROUPRANK;Skupinsko "Rangiranje" +PREFERENCES_MENUOPTIONS;Kontekstne nastavitve menuja +PREFERENCES_MONINTENT;Privzeta namera upodabljanja +PREFERENCES_MONITOR;Monitor +PREFERENCES_MONPROFILE;Privzeti barvni profil +PREFERENCES_MONPROFILE_WARNOSX;Podprt je samo sRGB zaradi omejitev MacOS. +PREFERENCES_MULTITAB;Način večih zavihkov urejevalnika +PREFERENCES_MULTITABDUALMON;Več zavihkov urejevalnika v svojem oknu +PREFERENCES_NAVIGATIONFRAME;Navigacija +PREFERENCES_OVERLAY_FILENAMES;Ime datotek čez predogledne sličice v pregledovalniku datotek +PREFERENCES_OVERLAY_FILENAMES_FILMSTRIP;Ime datotek čez predogledne sličice v urejevalniku slik +PREFERENCES_OVERWRITEOUTPUTFILE;Prepiši obstoječe izhodne datoteke +PREFERENCES_PANFACTORLABEL;Povečanje hitrosti zamikanja +PREFERENCES_PARSEDEXT;Razpoznani podaljški datotek +PREFERENCES_PARSEDEXTADD;Dodaj podaljšek +PREFERENCES_PARSEDEXTADDHINT;Dodaj vnesen podaljšek v seznam. +PREFERENCES_PARSEDEXTDELHINT;Odstrani vnesen podaljšek s seznama. +PREFERENCES_PARSEDEXTDOWNHINT;Premakni vnesen podaljšek po seznamu navzdol. +PREFERENCES_PARSEDEXTUPHINT;Premakni vnesen podaljšek po seznamu navzgor. +PREFERENCES_PERFORMANCE_MEASURE;Mere +PREFERENCES_PERFORMANCE_MEASURE_HINT;Beleži obdelovalne čase na konzoli +PREFERENCES_PERFORMANCE_THREADS;Niti +PREFERENCES_PERFORMANCE_THREADS_LABEL;Največje število niti za odstranjevanje šuma in nivoje valovčkov (0 = Avtomatika) +PREFERENCES_PREVDEMO;Predlogled metode odstranjevamja mozaičnosti +PREFERENCES_PREVDEMO_FAST;Hitro +PREFERENCES_PREVDEMO_LABEL;Metoda odstranjevanja mozaičnosti za predogled <100% zoom: +PREFERENCES_PREVDEMO_SIDECAR;Kot v PP3 +PREFERENCES_PRINTER;Tiskalnik (Poskusni odtis) +PREFERENCES_PROFILEHANDLING;Obdelava profila +PREFERENCES_PROFILELOADPR;Prednost nalaganja profila v obdelavi +PREFERENCES_PROFILEPRCACHE;Profil v predpomnilniku +PREFERENCES_PROFILEPRFILE;Profil poleg vhodne datoteke +PREFERENCES_PROFILESAVEBOTH;Shrani profil obdelave dvojno tako v vmesnem pomnilniku kot zraven vhodne datoteke +PREFERENCES_PROFILESAVECACHE;Shrani profil obdelave v vmesnem pomnilniku +PREFERENCES_PROFILESAVEINPUT;Shrani profil obdelave zraven vhodne datoteke +PREFERENCES_PROFILESAVELOCATION;Lokacija shranjevanja profila obdelave +PREFERENCES_PROFILE_NONE;Noben +PREFERENCES_PROPERTY;Lastnost +PREFERENCES_PRTINTENT;Namera upodabljanja +PREFERENCES_PRTPROFILE;Barvni profil +PREFERENCES_PSPATH;Mapa nameščenega programa Adobe Photoshop +PREFERENCES_REMEMBERZOOMPAN;Zapomni si zoom % in odmik od roba +PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Zapomni si zoom % in odmik od trenutne slike ob odpiranju nove slike.\n\nTa nastavitev deluje samo v posamičnem urejevalniku in kadar je metoda odstranjevanja mozaičnosti <100% zoom" in nastavitev "Kot v PP3". +PREFERENCES_SAVE_TP_OPEN_NOW;Shrani stanje orodja v skrčenem ali razširjenem stanju zdaj +PREFERENCES_SELECTLANG;Izbira jezika +PREFERENCES_SERIALIZE_TIFF_READ;Nastavitve branja TIFF +PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Sekvenčno branje datotek TIFF +PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Omogočanje te opcije kadar delamo z mapami, ki vsebujejo nestisnjene datoteke TIFF, lahko izboljšajo generiranje predoglednih sličic. +PREFERENCES_SET;Nastavi +PREFERENCES_SHOWBASICEXIF;Prikaži osnovne Exif informacije +PREFERENCES_SHOWDATETIME;Prikaži datum in čas +PREFERENCES_SHOWEXPOSURECOMPENSATION;Dodaj prilagoditev ekspozicije +PREFERENCES_SHOWFILMSTRIPTOOLBAR;Prikaži orodno vrstico filmskega izseka +PREFERENCES_SHTHRESHOLD;Prag za obrezane sence +PREFERENCES_SINGLETAB;Način enega zavihka urejevalnika +PREFERENCES_SINGLETABVERTAB;Način enega zavihka urejevalnika, Navpični zavihki +PREFERENCES_SND_HELP;Vnesi polno pot za nastavitev zvoka ali pusti prazno za brez zvoka.\nZa sistemske zvoke na sistemu Windows uporabi "SystemDefault", "SystemAsterisk" itd. na Linuxu pa "complete", "window-attention" itd. +PREFERENCES_SND_LNGEDITPROCDONE;Obdelava urejevalnika končana +PREFERENCES_SND_QUEUEDONE;Obdelava v čakalni vrsti končana +PREFERENCES_SND_THRESHOLDSECS;Po sekundah +PREFERENCES_STARTUPIMDIR;Mapa s slikami ob začetku +PREFERENCES_TAB_BROWSER;Brskalnik datotek +PREFERENCES_TAB_COLORMGR;Upravljanje z barvami +PREFERENCES_TAB_DYNAMICPROFILE;Pravila dinamičnih profilov +PREFERENCES_TAB_GENERAL;Splošno +PREFERENCES_TAB_IMPROC;Obdelava slik +PREFERENCES_TAB_PERFORMANCE;Performanse +PREFERENCES_TAB_SOUND;Zvoki +PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Predoglev vdelane JPEG +PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Slika za prikaz +PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Nevtralno surovo upodabljanje +PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Vgrajen JPEG, če je polne velikosti, sicer nevtralno surovo +PREFERENCES_TP_LABEL;Pano z orodji: +PREFERENCES_TP_VSCROLLBAR;Skrij navpični drsnik +PREFERENCES_USEBUNDLEDPROFILES;Uporabi skupne profile +PREFERENCES_WORKFLOW;Razporeditev +PROFILEPANEL_COPYPPASTE;Parametri za kopiranje +PROFILEPANEL_GLOBALPROFILES;Skupni profili +PROFILEPANEL_LABEL;Profili za obdelovanje +PROFILEPANEL_LOADDLGLABEL;Naloži parametre obdelovanja... +PROFILEPANEL_LOADPPASTE;Parametri za nalaganje +PROFILEPANEL_MODE_TIP;Vnosni način profila za obdelovanje.\n\nPritisnjen gumb: delni profili bodo spremenjeni v polne profile; manjkajoče vrednosti bodo zamenjale fiksne privzete vrednosti.\n\nSproščen gumb: profili bodo uporabljeni kakršni so, zamenjajo se samo vnesene vrednosti. +PROFILEPANEL_MYPROFILES;Moji profili +PROFILEPANEL_PASTEPPASTE;Parameteri za lepljenje +PROFILEPANEL_PCUSTOM;Po meri +PROFILEPANEL_PDYNAMIC;Dinamični +PROFILEPANEL_PFILE;Iz datoteke +PROFILEPANEL_PINTERNAL;Nevtralno +PROFILEPANEL_PLASTSAVED;Zadnje shranjene +PROFILEPANEL_SAVEDLGLABEL;Shrani parametre obdelave... +PROFILEPANEL_SAVEPPASTE;Parametri za shranjevanje +PROFILEPANEL_TOOLTIPCOPY;Kopiraj trenutni profil obdelave na odložišče.\nCtrl-klik za izbiro parametrov za kopiranje. +PROFILEPANEL_TOOLTIPLOAD;Naloži profil iz datoteke.\nCtrl-klik za izbiro parametrov za nalaganje. +PROFILEPANEL_TOOLTIPPASTE;Prilepi profil iz odložišča.\nCtrl-klik za izbiro parametrov za leplenje. +PROFILEPANEL_TOOLTIPSAVE;Shrani trenutni profil.\nCtrl-klik za izbiro parametrov za shranjevanje. +PROGRESSBAR_DECODING;Dekodiram... +PROGRESSBAR_GREENEQUIL;Uravnoteženje zelene... +PROGRESSBAR_HLREC;Rekonstrukcija bleščav... +PROGRESSBAR_HOTDEADPIXELFILTER;Filter vročih/mrtvih pikslov... +PROGRESSBAR_LINEDENOISE;Filter linijskega šuma... +PROGRESSBAR_LOADING;Nalagam sliko... +PROGRESSBAR_LOADINGTHUMBS;Nalagam predogledne sličice... +PROGRESSBAR_LOADJPEG;Nalagam datoteko JPEG... +PROGRESSBAR_LOADPNG;Nalagam datoteko PNG... +PROGRESSBAR_LOADTIFF;Nalagam datoteko TIFF... +PROGRESSBAR_NOIMAGES;Ne najdem nobene slike +PROGRESSBAR_PROCESSING;Obdelujem sliko... +PROGRESSBAR_PROCESSING_PROFILESAVED;Profil obdelave shranjen +PROGRESSBAR_RAWCACORR;Popravek surove CA... +PROGRESSBAR_READY;Pripravljen +PROGRESSBAR_SAVEJPEG;Shranjujem datoteko JPEG... +PROGRESSBAR_SAVEPNG;Shranjujem datoteko PNG... +PROGRESSBAR_SAVETIFF;Shranjujem datoteko TIFF... +PROGRESSBAR_SNAPSHOT_ADDED;Posnetek dodan +PROGRESSDLG_PROFILECHANGEDINBROWSER;Profil obdelave je shranjen v pregledovalniku +QINFO_FRAMECOUNT;%2 okvirov +QINFO_HDR;HDR / %2 okvirov +QINFO_ISO;ISO +QINFO_NOEXIF;Podatki Exif niso na voljo. +QINFO_PIXELSHIFT;Pomik pikslov / %2 okvirjev +QUEUE_AUTOSTART;Avto-start +QUEUE_AUTOSTART_TOOLTIP;Avtomatično začni obdelavo, ko pride nov posel. +QUEUE_DESTFILENAME;Pot in ime datoteke +QUEUE_FORMAT_TITLE;Format datoteke +QUEUE_LOCATION_FOLDER;Shrani v mapo +QUEUE_LOCATION_TEMPLATE;Uporabi šablono +QUEUE_LOCATION_TEMPLATE_TOOLTIP;Določite izhodno lokacijo glede na lokacijo izvirne fotografije, rang, status smeti ali položaj v čakalni vrsti.\n\nZa primer poti uporabite naslednje:\n/home/tom/photos/2010-10-31/photo1.raw\npomen nizov sledi: :\n%d4 = home\n%d3 = tom\n%d2 = photos\n%d1 = 2010-10-31\n%f = photo1\n%p1 = /home/tom/photos/2010-10-31/\n%p2 = /home/tom/photos/\n%p3 = /home/tom/\n%p4 = /home/\n\n%r bo zamenjana z oceno fotografije. Če slika ni ocenjena, se uporabi '0'. Če je slika v smeteh uporabimo 'x'.\n\n%s1, ..., %s9 bo zamenjano za začetni položaj slike v čakalni vrsti, ko se ta začne. Število opisuje polnilo, npr. %s3 se spremeni v '001'.\n\nČe želite izhodno sliko shraniti poleg izvirne slike, napišite::\n%p1/%f\n\nČe želite izhodno sliko shraniti v mapo z imenom 'converted' ki se nahaja v mapi izvorne fotografije, napišite:\n%p1/converted/%f\n\nČe želite izhodno sliko shraniti v\n'/home/tom/photos/converted/2010-10-31', napišite:\n%p2/converted/%d1/%f +QUEUE_LOCATION_TITLE;Lokacija izhoda +QUEUE_STARTSTOP_TOOLTIP;Začni ali končaj obdelavo slik v čakalni vrsti.\n\nBližnjica: Ctrl+s +SAMPLEFORMAT_0;Neznan format podatkov +SAMPLEFORMAT_1;8-bit brez predznaka +SAMPLEFORMAT_2;16-bit brez predznaka +SAMPLEFORMAT_4;24-bit LogLuv +SAMPLEFORMAT_8;32-bit LogLuv +SAMPLEFORMAT_16;16-bit plavajoča vejica +SAMPLEFORMAT_32;24-bit plavajoča vejica +SAMPLEFORMAT_64;32-bit plavajoča vejica +SAVEDLG_AUTOSUFFIX;Avtomatično dodaj tip, če datoteka že obstaja +SAVEDLG_FILEFORMAT;Format datoteke +SAVEDLG_FILEFORMAT_FLOAT; plavajoča vejica +SAVEDLG_FORCEFORMATOPTS;Zahtevaj opcije shranjevanja +SAVEDLG_JPEGQUAL;JPEG kakovost +SAVEDLG_PUTTOQUEUE;Postavi v čakalno vrsto za obdelavo +SAVEDLG_PUTTOQUEUEHEAD;Postavi na začetek čakalne vrste za obdelavo +SAVEDLG_PUTTOQUEUETAIL;Postavi na konec čakalne vrste za obdelavo +SAVEDLG_SAVEIMMEDIATELY;Takoj shrani +SAVEDLG_SAVESPP;Shrani parametre obdelave skupaj s sliko +SAVEDLG_SUBSAMP;Podvzorčenje +SAVEDLG_SUBSAMP_1;Najboljše stiskanje +SAVEDLG_SUBSAMP_2;Uravnoteženo +SAVEDLG_SUBSAMP_3;Najboljša kakovost +SAVEDLG_SUBSAMP_TOOLTIP;Najbolj stisnjeno:\nJ:a:b 4:2:0\nh/v 2/2\nBarvitost razpolovljena vodoravno in navpično.\n\nUravnoteženo:\nJ:a:b 4:2:2\nh/v 2/1\nBarvitost razpolovljena vodoravno.\n\nNajbolj kakovostno:\nJ:a:b 4:4:4\nh/v 1/1\nBrez podvzorčenja barvitosti. +SAVEDLG_TIFFUNCOMPRESSED;Nestisnjen TIFF +SAVEDLG_WARNFILENAME;Datoteka bo poimenovana +SHCSELECTOR_TOOLTIP;Desni klik za ponastavitev pozicije 3 drsnikov. +SOFTPROOF_GAMUTCHECK_TOOLTIP;Osvetli piksle z barvo izven barvnega prostora glede na:\n- profil tiskalnika, če je nastavljen in je omogočen poskusni odtis,\n- izhodni profil, če tiskalnikov profil ni določen in je poskusni odtis omogočen,\n- profil zaslona, če je poskusni odtis onemogočen. +SOFTPROOF_TOOLTIP;Poskusni odtis simulira izgled slike:\n- ko je natisnjen, če je nastavljen profil tiskalnika v Preference > Upravljanje z barvami,\n- kadar ogledujemo sliko na zaslonu, ki uporablja trenutni profil zaslona, če profil tiskalnika ni določen. +THRESHOLDSELECTOR_B;Spodaj +THRESHOLDSELECTOR_BL;Spodaj-levo +THRESHOLDSELECTOR_BR;Spodaj-desno +THRESHOLDSELECTOR_HINT;Držite tipko Shift za premik posameznih kontrolnih točk. +THRESHOLDSELECTOR_T;Zgoraj +THRESHOLDSELECTOR_TL;Zgoraj-levo +THRESHOLDSELECTOR_TR;Zgoraj-desno +TOOLBAR_TOOLTIP_COLORPICKER;Izbirnik barv, ki ga je moč zakleniti\n\nKadar je orodje aktivno:\n- Dodajte izbiro: levi-klik.\n- Povlecite izbiro: levi-klik in poteg.\n- Briši izbiro: desni-klik.\n- Briši vse izbire: Ctrl+Shift+desni-klik.\n- Povratek na ročno orodje: desni-klik zunaj kateregakoli izbirnika. +TOOLBAR_TOOLTIP_CROP;Crop izbira.\nBližnjica: c\nPremakni obrezavo s Shift+potegom miške. +TOOLBAR_TOOLTIP_HAND;Ročno orodje.\nBližnjica: h +TOOLBAR_TOOLTIP_STRAIGHTEN;Ravnanje / fino vrtenje.\nBližnjica: s\n\nOznačite navpičnico ali vodoravnico z risanjem vodilne črte čez predogled slike. Kot vodilne črte bo prikazan zraven vodilne črte. Središče vrtenja je geometrijsko središče slike. +TOOLBAR_TOOLTIP_WB;Uravnotežena belina točke.\nBližnjica: w +TP_BWMIX_ALGO;Algoritem OYCPM +TP_BWMIX_ALGO_LI;Linearno +TP_BWMIX_ALGO_SP;Posebni učinki +TP_BWMIX_ALGO_TOOLTIP;Linearno: bo povzročil normalni linearni odziv.\nPosebni učinki: bodo povzročili posebne učinke z mešanjem kanalov na ne-linearen način. +TP_BWMIX_AUTOCH;Avto +TP_BWMIX_CC_ENABLED;Prilagodi komplementarno barvo +TP_BWMIX_CC_TOOLTIP;Dovoli avtomatično prilagajanje komplementarnih barv v načinu ROYGCBPM. +TP_BWMIX_CHANNEL;Ekvalizator svetlosti +TP_BWMIX_CURVEEDITOR1;Krivulja 'pred' +TP_BWMIX_CURVEEDITOR2;Krivulja 'po' +TP_BWMIX_CURVEEDITOR_AFTER_TOOLTIP;Krivulja tonov po predelavi v črno-belo ob koncu postopka. +TP_BWMIX_CURVEEDITOR_BEFORE_TOOLTIP;Krivulja tonov tik prek predelavo v črno-belo.\nLahko je odvisna od barvnih komponent. +TP_BWMIX_CURVEEDITOR_LH_TOOLTIP;Svetlost odvisna od odtenka L=f(H).\nPazite na skrajne vrednosti, ker lahko generirajo artefakte. +TP_BWMIX_FILTER;Barvni Filter +TP_BWMIX_FILTER_BLUE;Modra +TP_BWMIX_FILTER_BLUEGREEN;Modro-Zelena +TP_BWMIX_FILTER_GREEN;Zelena +TP_BWMIX_FILTER_GREENYELLOW;Zeleno-Rumena +TP_BWMIX_FILTER_NONE;Nobena +TP_BWMIX_FILTER_PURPLE;Vijolična +TP_BWMIX_FILTER_RED;Rdeča +TP_BWMIX_FILTER_REDYELLOW;Rdeče-Rumena +TP_BWMIX_FILTER_TOOLTIP;Barvni filter simulira slike posnete z barvnim filtrom pred objektivom. Barvni filtri zmanjšajo prenos določenega dela barv in zato vplivajo na svetlost. Npr. rdeči filtri zatemnijo modro nebo. +TP_BWMIX_FILTER_YELLOW;Rumena +TP_BWMIX_GAMMA;Popravek game +TP_BWMIX_GAM_TOOLTIP;Popravi gamo za vsak RGB kanal. +TP_BWMIX_LABEL;Črno-belo +TP_BWMIX_MET;Metoda +TP_BWMIX_MET_CHANMIX;Mešalnik kanalov +TP_BWMIX_MET_DESAT;Zmanjšanje nasičenosti +TP_BWMIX_MET_LUMEQUAL;Ekvalizator svetlosti +TP_BWMIX_MIXC;Mešalnik kanalov +TP_BWMIX_NEUTRAL;Ponastavi +TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Total: %4%% +TP_BWMIX_RGBLABEL_HINT;Končni faktorji RGB, ki skrbijo za vse možnosti mešalnika.\n"Skupaj" prikaže vsoto RGB vrednosti:\n- vedno 100% v relativnem načinu\n- višje (svetlejše) ali nižje (temnejše) od 100% v absolutnem načinu. +TP_BWMIX_RGB_TOOLTIP;Zmešajte RGB kanale. Uporabite prednastavitve za vodenje.\nBodite pozorni na negativne vrednosti, ki lahko povzročijo artefakte ali napačno delovanje. +TP_BWMIX_SETTING;Prednastavitve +TP_BWMIX_SETTING_TOOLTIP;Različne prednastvitve (film, pokrajina, itd.) ali ročne nastavitve mešalnika kanalov. +TP_BWMIX_SET_HIGHCONTAST;Visok kontrast +TP_BWMIX_SET_HIGHSENSIT;Visoka občutljivost +TP_BWMIX_SET_HYPERPANCHRO;Hiper pankromatsko +TP_BWMIX_SET_INFRARED;Infrardeče +TP_BWMIX_SET_LANDSCAPE;Pokrajina +TP_BWMIX_SET_LOWSENSIT;Nizka občutljivost +TP_BWMIX_SET_LUMINANCE;Svetlost +TP_BWMIX_SET_NORMCONTAST;Normalen kontrast +TP_BWMIX_SET_ORTHOCHRO;Ortokromatsko +TP_BWMIX_SET_PANCHRO;Pankromatsko +TP_BWMIX_SET_PORTRAIT;Portret +TP_BWMIX_SET_RGBABS;Absolutno RGB +TP_BWMIX_SET_RGBREL;Relativno RGB +TP_BWMIX_SET_ROYGCBPMABS;Absolutno ROYGCBPM +TP_BWMIX_SET_ROYGCBPMREL;Relativno ROYGCBPM +TP_BWMIX_TCMODE_FILMLIKE;Kot čno-beli film +TP_BWMIX_TCMODE_SATANDVALBLENDING;Črno-belo nasičenje in mešanje vrednosti +TP_BWMIX_TCMODE_STANDARD;Standardno črno-belo +TP_BWMIX_TCMODE_WEIGHTEDSTD;Uteženo standardno črno-belo +TP_BWMIX_VAL;L +TP_CACORRECTION_BLUE;Modro +TP_CACORRECTION_LABEL;Popravek kromatske aberacije +TP_CACORRECTION_RED;Rdeče +TP_CBDL_AFT;Črno-belo 'po' +TP_CBDL_BEF;Črno-belo 'pred' +TP_CBDL_METHOD;Lokacija obdelave +TP_CBDL_METHOD_TOOLTIP;Izberi ali naj bo orodje nivojev kontrasta po transformaciji v črno-belo, ki deluje v prostorum L*a*b* , ali pred transformacijo, ki deluje v prostoru RGB. +TP_CHMIXER_BLUE;Modri kanali +TP_CHMIXER_GREEN;Zeleni kanal +TP_CHMIXER_LABEL;Mešalnik kanalov +TP_CHMIXER_RED;Rdeči kanal +TP_COARSETRAF_TOOLTIP_HFLIP;Vodoravno preobrni. +TP_COARSETRAF_TOOLTIP_ROTLEFT;Zavrti levo.\n\nBližnjica:\n[ - Način večih zavihkov,\nAlt-[ - Način enega zavihka. +TP_COARSETRAF_TOOLTIP_ROTRIGHT;Zavrti desno.\n\nBližnjica:\n] - Način večih zavihkov,\nAlt-] - Način enega zavihka. +TP_COARSETRAF_TOOLTIP_VFLIP;Preobrni navpično. +TP_COLORAPP_ABSOLUTELUMINANCE;Absolutna svetlost +TP_COLORAPP_ALGO;Algoritem +TP_COLORAPP_ALGO_ALL;Vse +TP_COLORAPP_ALGO_JC;Svetlost + Barvitost (JC) +TP_COLORAPP_ALGO_JS;Svetlost + Nasičenost (JS) +TP_COLORAPP_ALGO_QM;Bleščina + Polnost barv (QM) +TP_COLORAPP_ALGO_TOOLTIP;Dovoljuje izbiro podmnožice parametrov ali vseh. +TP_COLORAPP_BADPIXSL;Filter vročih/mrtvih pikslov +TP_COLORAPP_BADPIXSL_TOOLTIP;Zatiranje vročih/slabih (živobarvno prikazanih) pikslov.\n0 = Brez učinka\n1 = Mediana\n2 = po Gaussu.\nSicer prilagodi sliko tako da se izogiba zelo temnih senc.\n\nTi artefakti so zaradi omejitev CIECAM02. +TP_COLORAPP_BRIGHT;Svetlost (Q) +TP_COLORAPP_BRIGHT_TOOLTIP;Svetlost v CIECAM02 upošteva tudi belino in se razlikuje od svetlosti v L*a*b* . +TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;Kadar jo nastavite ročno, priporočam vrednosti nad 65. +TP_COLORAPP_CHROMA;Barvitost (C) +TP_COLORAPP_CHROMA_M;Polnost barv (M) +TP_COLORAPP_CHROMA_M_TOOLTIP;Polnost barv v CIECAM02 se razlikuje od polnosti v L*a*b* in RGB. +TP_COLORAPP_CHROMA_S;Nasičenost (S) +TP_COLORAPP_CHROMA_S_TOOLTIP;Nasičenost v CIECAM02 se razlikuje od nasičenosti v L*a*b* in RGB. +TP_COLORAPP_CHROMA_TOOLTIP;Barvitost v CIECAM02 se razlikuje od barvitosti v L*a*b* in RGB. +TP_COLORAPP_CIECAT_DEGREE;CAT02 prilagoditev +TP_COLORAPP_CONTRAST;Kontrast (J) +TP_COLORAPP_CONTRAST_Q;Kontrast (Q) +TP_COLORAPP_CONTRAST_Q_TOOLTIP;Razlikujte med L*a*b* in RGB kontrastom. +TP_COLORAPP_CONTRAST_TOOLTIP;Razlikujte med L*a*b* in RGB kontrastom. +TP_COLORAPP_CURVEEDITOR1;Krivulja tonov 1 +TP_COLORAPP_CURVEEDITOR1_TOOLTIP;Prkaže histogram L* (L*a*b*) pred CIECAM02.\nČe je aktivno "Prikaži CIECAM02 izhodne histograme v krivuljah", prikaže histograme J ali Q po CIECAM02.\n\nJ in Q nista prikazana v glavnem panoju histogramov.\n\nKončni izhod se nanaša na glavni pano histogramov. +TP_COLORAPP_CURVEEDITOR2;Krivulja tonov 2 +TP_COLORAPP_CURVEEDITOR2_TOOLTIP;Enaka uporaba kot pri krivulji tonov druge ekspozicije. +TP_COLORAPP_CURVEEDITOR3;Krivulja barv +TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Prilagodi barvitost, nasičenje ali polnost barv.\n\nPrikaže histogram barvitosti (L*a*b*) pred CIECAM02.\nČe je aktivirano "Prikaži CIECAM02 izhodne histograme v krivuljah", prikaže histograme C, s ali M po CIECAM02.\n\nC, s in M niso prikazani v glavnem panoju histogramov.\nKončni izhod se nanaša na glavni pano histogramov. +TP_COLORAPP_DATACIE;CIECAM02 izhodni histogrami v krivuljah +TP_COLORAPP_DATACIE_TOOLTIP;Kadar je aktivirano so histogrami, CIECAM02 krivulje prikazujejo približne vrednosti oz. intervale z J ali Q, in C, s ali M po prilagoditvah CIECAM02.\nTa izbira ne vpliva na glavni pano histogramov.\n\nKadar je deaktiviran, histogrami v CIECAM02 krivuljah kažejo vrednosti L*a*b* pred prilagoditvami CIECAM02. +TP_COLORAPP_FREE;Prosta temp+zelena + CAT02 + [output] +TP_COLORAPP_GAMUT;Lontrola barvega obsega (L*a*b*) +TP_COLORAPP_GAMUT_TOOLTIP;Dovoli kontrolo barvnega obsega v L*a*b* načinu. +TP_COLORAPP_HUE;Odtenek (h) +TP_COLORAPP_HUE_TOOLTIP;Odtenek (h) - kot med 0° in 360°. +TP_COLORAPP_LABEL;CIE Prikaz barv Model 2002 +TP_COLORAPP_LABEL_CAM02;Prilagoditve slike +TP_COLORAPP_LABEL_SCENE;Scenski pogoji +TP_COLORAPP_LABEL_VIEWING;Pogoji gledanja +TP_COLORAPP_LIGHT;Svetlost (J) +TP_COLORAPP_LIGHT_TOOLTIP;Svetlost v CIECAM02 se razlikuje od svetlosti v L*a*b* in RGB. +TP_COLORAPP_MEANLUMINANCE;Povprečna svetlost (Yb%) +TP_COLORAPP_MODEL;WP Model +TP_COLORAPP_MODEL_TOOLTIP;Model bele točke.\n\nWB [RT] + [output]: za sceno se uporabi RT-jevo ravnotežje beline, CIECAM02 je nastavljen na D50, nastavitev beline izhodne naprave je nastavljena v Pogojih gledanja.\n\nWB [RT+CAT02] + [output]: RT-jevo ravnotežje beline uporablja CAT02, ravnotežje beline izhodne naprave pa je nastavljeno v Pogojih gledanja.\n\nProsta temp+zelena + CAT02 + [output]: temp in zeleno določi uporabnik, ravnotežje beline izhodne naprave pa je nastavljeno v Pogojih gledanja. +TP_COLORAPP_NEUTRAL;Ponastavi +TP_COLORAPP_NEUTRAL_TIP;Ponastavi vse potrditvena polja in krivulje na njihove privzete vrednosti +TP_COLORAPP_RSTPRO;Varovanje rdečih in kožnih tonov +TP_COLORAPP_RSTPRO_TOOLTIP;Varovanje rdečih in kožnih tonov ima vpliv tako na drsnike kot na krivulje. +TP_COLORAPP_SURROUND;Obkroži +TP_COLORAPP_SURROUND_AVER;Povprečno +TP_COLORAPP_SURROUND_DARK;Temno +TP_COLORAPP_SURROUND_DIM;Zatemnjeno +TP_COLORAPP_SURROUND_EXDARK;Izjemno črno (Cutsheet) +TP_COLORAPP_SURROUND_TOOLTIP;Spremembe tonov in barv so odvisne od pogojev gledanja na izhodno enoto.\n\nPovprečje: Povprečno svetlobno okolje (standard). Slika se ne bo spremenila.\n\nZatemnjeno: Zatemnjeno okolje (TV). Slika bo postala malo temnejša.\n\nTemno: temno okolje (projektor). Slika bo postala bolj temna.\n\nIzredno temno: Izredno temno okolje (Cutsheet). Slika bo postala zelo temna. +TP_COLORAPP_TCMODE_BRIGHTNESS;Brightness +TP_COLORAPP_TCMODE_CHROMA;Barvitost +TP_COLORAPP_TCMODE_COLORF;Polnost barv +TP_COLORAPP_TCMODE_LABEL1;Krivulja način 1 +TP_COLORAPP_TCMODE_LABEL2;Krivulja način 2 +TP_COLORAPP_TCMODE_LABEL3;Krivulja barvitosti +TP_COLORAPP_TCMODE_LIGHTNESS;Svetlost +TP_COLORAPP_TCMODE_SATUR;Nasičenost +TP_COLORAPP_TEMP_TOOLTIP;Za izbrano svetilo vedno postavi Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +TP_COLORAPP_TONECIE;Preslikava barvnih tonov s CIECAM02 +TP_COLORAPP_TONECIE_TOOLTIP;Če je ta opcija neaktivna, je preslikava barvnih tonov v prostoru L*a*b* .\nČe je aktivirana, je prenos barvnih tonov z uporabo CIECAM02.\nOrodje za prenos barvnih tonov mora biti aktivno, da ima učinek. +TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Absolutna svetlost okolice gledanja\n(običajno 16 cd/m²). +TP_COLORAPP_WBCAM;WB [RT+CAT02] + [output] +TP_COLORAPP_WBRT;WB [RT] + [output] +TP_COLORTONING_AB;o C/L +TP_COLORTONING_AUTOSAT;Avtomatično +TP_COLORTONING_BALANCE;Uravnoteženo +TP_COLORTONING_BY;o C/L +TP_COLORTONING_CHROMAC;Neprosojnost +TP_COLORTONING_COLOR;Barva +TP_COLORTONING_CURVEEDITOR_CL_TOOLTIP;Neprosojnost barvitosti kot funkcija svetlosti oC=f(L) +TP_COLORTONING_HIGHLIGHT;Bleščave +TP_COLORTONING_HUE;Odtenki +TP_COLORTONING_LAB;L*a*b* mešanje +TP_COLORTONING_LABEL;Toniranje barv +TP_COLORTONING_LABGRID;L*a*b* mreža popravkov barv +TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +TP_COLORTONING_LABREGIONS;Regije popravkov barv +TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +TP_COLORTONING_LABREGION_CHANNEL;Kanal +TP_COLORTONING_LABREGION_CHANNEL_ALL;Vse +TP_COLORTONING_LABREGION_CHANNEL_B;Modra +TP_COLORTONING_LABREGION_CHANNEL_G;Zelena +TP_COLORTONING_LABREGION_CHANNEL_R;Rdeča +TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +TP_COLORTONING_LABREGION_HUEMASK;H +TP_COLORTONING_LABREGION_LIGHTNESS;Svetlost +TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +TP_COLORTONING_LABREGION_LIST_TITLE;Popravek +TP_COLORTONING_LABREGION_MASK;Maska +TP_COLORTONING_LABREGION_MASKBLUR;Maska zamegljenosti +TP_COLORTONING_LABREGION_OFFSET;Odmik +TP_COLORTONING_LABREGION_POWER;Moč +TP_COLORTONING_LABREGION_SATURATION;Nasičenje +TP_COLORTONING_LABREGION_SHOWMASK;Prikaži masko +TP_COLORTONING_LABREGION_SLOPE;Strmina +TP_COLORTONING_LUMA;Svetlost +TP_COLORTONING_LUMAMODE;Ohrani svetlost +TP_COLORTONING_LUMAMODE_TOOLTIP;Če je aktivno, se ob spremembi barve (rdeča, zelena, cian, modra, itd.) ohrani tudi svetlost vsakega piksla. +TP_COLORTONING_METHOD;Metoda +TP_COLORTONING_METHOD_TOOLTIP;"L*a*b* mešanje", "RGB drsniki" in "RGB krivulje" uporabljajo interpolirno mešanje barv.\n"Uravnoteženje barv (Sence/Srednji toni/Bleščave)" and "Nasičenje 2 barv" uporabljajo neposredne barve.\n\nČrno-belo orodje lahko uporabimo pri katerikoli metodi barvega toniranja. +TP_COLORTONING_MIDTONES;Srednji toni +TP_COLORTONING_NEUTRAL;Ponastavi drsnike +TP_COLORTONING_NEUTRAL_TIP;Ponastavi vse vrednosti (Sence, Srednji toni, Bleščave) na prizeto vrednost. +TP_COLORTONING_OPACITY;Neprosojnost +TP_COLORTONING_RGBCURVES;RGB - Krivulje +TP_COLORTONING_RGBSLIDERS;RGB - Drsniki +TP_COLORTONING_SA;Zavarovanje nasičenosti +TP_COLORTONING_SATURATEDOPACITY;Moč +TP_COLORTONING_SATURATIONTHRESHOLD;Prag +TP_COLORTONING_SHADOWS;Sence +TP_COLORTONING_SPLITCO;Sence/Srednje vrednosti/Bleščave +TP_COLORTONING_SPLITCOCO;Uravnoteženje barv Sence/Srednje vrednosti/Bleščave +TP_COLORTONING_SPLITLR;Nasičenje 2 barv +TP_COLORTONING_STR;Moč +TP_COLORTONING_STRENGTH;Moč +TP_COLORTONING_TWO2;Posebna barvitost '2 colors' +TP_COLORTONING_TWOALL;Posebna barvitost +TP_COLORTONING_TWOBY;Posebna a* in b* +TP_COLORTONING_TWOCOLOR_TOOLTIP;Standardna barvitost:\nLinearni odziv, a* = b*.\n\nPosebna barvitost:\nLinearni odziv, a* = b*, toda neomejen - poskusi pod diagonalo.\n\nPosebna a* in b*:\nLinearni neomejeni odziv s posebnima krivuljama za a* in b*. Namenjeno posebnim učinkom.\n\nPosebna barvitost 2 barv:\nBolj predvidljivo. +TP_COLORTONING_TWOSTD;Standardna barvitost +TP_CROP_FIXRATIO;Zakleni razmerje +TP_CROP_GTDIAGONALS;Pravilo diagonal +TP_CROP_GTEPASSPORT;Biometrični potni list +TP_CROP_GTFRAME;Okvir +TP_CROP_GTGRID;Mreža +TP_CROP_GTHARMMEANS;Harmonična povprečja +TP_CROP_GTNONE;Noben +TP_CROP_GTRULETHIRDS;Pravilo tretjin +TP_CROP_GTTRIANGLE1;Zlati trikotniki 1 +TP_CROP_GTTRIANGLE2;Zlati trikotniki 2 +TP_CROP_GUIDETYPE;Vodilo tipa: +TP_CROP_H;Višina +TP_CROP_LABEL;Obreži +TP_CROP_PPI;PPI +TP_CROP_RESETCROP;Ponastavi +TP_CROP_SELECTCROP;Izberi +TP_CROP_W;Širina +TP_CROP_X;Levo +TP_CROP_Y;Vrh +TP_DARKFRAME_AUTOSELECT;Avtomatičen izbor +TP_DARKFRAME_LABEL;Dark-frame +TP_DEFRINGE_LABEL;Odstrani artefakte +TP_DEFRINGE_RADIUS;Radij +TP_DEFRINGE_THRESHOLD;Prag +TP_DEHAZE_DEPTH;Globina +TP_DEHAZE_LABEL;Odstranjevanje zamegljenosti +TP_DEHAZE_LUMINANCE;Samo svetlost +TP_DEHAZE_SHOW_DEPTH_MAP;Prikaži karto globin +TP_DEHAZE_STRENGTH;Moč +TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Avto multi-cone +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Avtomatično globalno +TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Krominanca - modro-rumeno +TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Krivulja krominance +TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Povečaj (pomnoži) vrednosti vseh krominanc drsnikov.\nTa krivulja omogoča prilagajanje moči zmanjševanje barvnega šuma kot funkcijo kromatičnosti, na primer za povečanje aktivnosti v področjih z nizko nasičenostjo in zmanjšanje na področjih visoke nasičenosti. +TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Krominanca +TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Ročno +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Krominanca - Matična +TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Metoda +TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Ročno\nDeluje na vsej sliki.\nNastavitve odstranjevanja šuma upravljate ročno.\n\nAvtomatično globalno\nDeluje na vsej sliki.\nUporabljeno je 9 con za izračun parametrov globalnega zmanjšanja barvnega šuma.\n\nPreogled\nDeluje na celotni sliki.\nDel slike, ki je viden v predlogledu je uporabljen za izračun parametrov za odstranjevanje šuma. +TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nDeluje na vsej sliki.\nastavitve odstranjevanja šuma upravljate ročno.\n\nAvtomatično globalno\nDeluje na vsej sliki.\nUporabljeno je 9 con za izračun parametrov globalnega zmanjšanja barvnega šuma.\n\nAvtomatično več-consko\nNi predogleda - deluje samo ob shranjevanju, toda z uporabo "Predogledne" metode tako, da je center slike center predogleda, velikost slike pa velikost predogleda tako, da dobite vtis o predvidenih učinkih.\nSlika je razdeljena na krpe (od 10 do 70 odvisno od velikosti slike) in vsaka krpa ima svoje nastavitve odpravljanja barvnega šuma.\n\nPredogled\nDeluje na celotni sliki.\nDel slike, ki je viden v predlogledu je uporabljen za izračun parametrov za odstranjevanje šuma. +TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Multi-cone predogleda +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Predogled +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Prikaže preostale nivoje šuma na delu slike v predogledu po valovčku.\n\n>300 Z veliko šuma\n100-300 Šum\n50-100 Malo šuma\n<50 Zelo malo šuma\n\nVedite, da se vrednosti razlikujejo med RGB in L*a*b* . Vrednosti v RGB so manj natančne, ker RGB način v celoti ne loči svetlosti in barvitosti. +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Velikost predogleda=%1, Center: Px=%2 Py=%3 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Šum predogleda: Povprečje=%1 Visoko=%2 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Šum predogleda: Povprečje= - Visoko= - +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Velikost krpe=%1, Center: Tx=%2 Ty=%3 +TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Krominanca - Rdeča-Zelena +TP_DIRPYRDENOISE_LABEL;Odpravljanje šuma +TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Upravljanje svetlosti +TP_DIRPYRDENOISE_LUMINANCE_CURVE;Krivulja svetlosti +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Podrobnost obnove +TP_DIRPYRDENOISE_LUMINANCE_FRAME;Svetlost +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Svetlost +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Barvni prostor +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;Za surove slike je moč uporabiti ali RGB ali L*a*b* .\n\nZa ne-surove slike bo ne glede na izbiro uporabljena metoda L*a*b* . +TP_DIRPYRDENOISE_MAIN_GAMMA;Gama +TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gama ima vpliv na moč zmanjšanja šuma glede nabora tonov. Manjše vrednosti ciljajo na sence, večje vrednosti pa bodo raztegnile vpliv na svetlejše tone. +TP_DIRPYRDENOISE_MAIN_MODE;Način +TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Agresivno +TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Konservativno +TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Konservativno" ohranja nizke frekvence vzorcev barvitosti, medtem ko jih "agresivne" izbrišejo. +TP_DIRPYRDENOISE_MEDIAN_METHOD;Metode mediane +TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Samo barvitost +TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Filter mediane +TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Samo svetlost +TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;Pri uporabi "Samo svetlost" in metodi "L*a*b*", se bo filtriranje po mediani izvedlo čisto po koraku valovčkov v zaporedju zmanjšanja šuma.\nOb uporabi načina "RGB" se bo izvedlo na samem koncu zaporedja postopkov za zmanjšanje šuma. +TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (malo) + a*b* (normalno) +TP_DIRPYRDENOISE_MEDIAN_PASSES;Iteracij mediane +TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Uporaba trikratnega filtra mediane v oknu 3×3 pogosto naredi boljši rezultat od ene iteracije filtra mediane na oknu velikosti 7×7. +TP_DIRPYRDENOISE_MEDIAN_TYPE;Tip mediane +TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Uporabi filter mediane na željeni velikosti okna. Večje okno zahteva več časa obdelave.\n\n3×3 mehko: obdela 5 pikslov v oknu 3×3.\n3×3: obdela 9 pikslov v oknu 3×3.\n5×5 mehko: obdela 13 pikslov v oknu 5×5.\n5×5: obdela 25 pikslov v oknu 5×5.\n7×7: obdela 49 pikslov v oknu 7×7.\n9×9: obdela 81 pikslov v oknu 9×9.\n\nVčasih je moč dobiti boljšo kakovost z uporabo večkratnih filtrov na manjšem oknu kot enkratnemu filtru na večjem oknu. +TP_DIRPYRDENOISE_TYPE_3X3;3×3 +TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 mehko +TP_DIRPYRDENOISE_TYPE_5X5;5×5 +TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 mehko +TP_DIRPYRDENOISE_TYPE_7X7;7×7 +TP_DIRPYRDENOISE_TYPE_9X9;9×9 +TP_DIRPYREQUALIZER_ALGO;Barvni Obseg Kože +TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fino: bližje barvi kože, minimiziranje učinka na drugih barvah\nVeliko: izogibanje artefaktom. +TP_DIRPYREQUALIZER_ARTIF;Zmanjšanje artefaktov +TP_DIRPYREQUALIZER_HUESKIN;Odtenek kože +TP_DIRPYREQUALIZER_HUESKIN_TOOLTIP;Ta piramida je za gornji del, kjer algoritem deluje maksimalno učinkovito.\nNa spodnjem delu so cone pretvorbe.\nČe želite premakniti področje bistveno na levo ali na desno oz. če se pojavljajo arifakti: je ravnotežje beline napačno. Lahko rahlo zmanjšate cono, da preprečite vplive na ostali del slike. +TP_DIRPYREQUALIZER_LABEL;Kontrast glede nivojev podrobnosti +TP_DIRPYREQUALIZER_LUMACOARSEST;Najbolj grobo +TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Kontrast - +TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Kontrast + +TP_DIRPYREQUALIZER_LUMAFINEST;Najbolj fino +TP_DIRPYREQUALIZER_LUMANEUTRAL;Nevtralno +TP_DIRPYREQUALIZER_SKIN;Ciljna zaščita kože +TP_DIRPYREQUALIZER_SKIN_TOOLTIP;Pri -100 so ciljani toni kože.\nPri 0 so vsi toni obravnavani enako.\nPri +100 so zaščiteni toni kože, vsi ostali pa so spremenjeni. +TP_DIRPYREQUALIZER_THRESHOLD;Prag +TP_DIRPYREQUALIZER_TOOLTIP;Poskusi zmanjšati artefakte pri spremembi barve kože (odtenek, barvitost, luma) in preostankom slike. +TP_DISTORTION_AMOUNT;Količina +TP_DISTORTION_AUTO_TIP;Avtomatsko popravi popačitve objektiva pri surovih slikah s primerjavo z vgrajeno sliko JPEG, če obstaja in so popravki objektiva izvedeni v fotoaparatu. +TP_DISTORTION_LABEL;Popravek popačenja +TP_EPD_EDGESTOPPING;Zaustavljanje roba +TP_EPD_GAMMA;Gama +TP_EPD_LABEL;Preslikava tonov +TP_EPD_REWEIGHTINGITERATES;Ponovno tehtanje ponovitev +TP_EPD_SCALE;Merilo +TP_EPD_STRENGTH;Moč +TP_EXPOSURE_AUTOLEVELS;Avto nivoji +TP_EXPOSURE_AUTOLEVELS_TIP;Preklaplja izvajanje avto nivojev z vrednostmi izračunani iz analize slike.\nOmogoča rekonstrukcijo bleščav, če je potrebna. +TP_EXPOSURE_BLACKLEVEL;Črna +TP_EXPOSURE_BRIGHTNESS;Svetlost +TP_EXPOSURE_CLAMPOOG;Posnetek barv izven obsega +TP_EXPOSURE_CLIP;Posnetek % +TP_EXPOSURE_CLIP_TIP;Delež pikslov, ki naj bodo posneti v operaciji avto nivoji. +TP_EXPOSURE_COMPRHIGHLIGHTS;Stiskanje bleščav +TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Prag stiskanja bleščav +TP_EXPOSURE_COMPRSHADOWS;Stiskanje senc +TP_EXPOSURE_CONTRAST;Kontrast +TP_EXPOSURE_CURVEEDITOR1;Krivulja tonov 1 +TP_EXPOSURE_CURVEEDITOR2;Krivulja tonov 2 +TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Prosim preberite članek v Rawpediji "Exposure > Tone Curves" kako dosežete najboljše rezultate z uporabo krivulj dveh tonov. +TP_EXPOSURE_EXPCOMP;Prilagoditev ekspozicije +TP_EXPOSURE_HISTMATCHING;Avtomatsko pridobljena krivulja tonov +TP_EXPOSURE_HISTMATCHING_TOOLTIP;Avtomatsko prilagodi drsnike in krivulje (razen prilagoditve ekspozicije) da ustreza videzu vgrajene slike JPEG. +TP_EXPOSURE_LABEL;Ekspozicija +TP_EXPOSURE_SATURATION;Nasičenje +TP_EXPOSURE_TCMODE_FILMLIKE;Kot na filmu +TP_EXPOSURE_TCMODE_LABEL1;Krivulja način 1 +TP_EXPOSURE_TCMODE_LABEL2;Krivulja način 2 +TP_EXPOSURE_TCMODE_LUMINANCE;Svetlost +TP_EXPOSURE_TCMODE_PERCEPTUAL;Glede na zaznavo +TP_EXPOSURE_TCMODE_SATANDVALBLENDING;Nasičenje im mešanje vrednosti +TP_EXPOSURE_TCMODE_STANDARD;Standardno +TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Uteženo standardno +TP_EXPOS_BLACKPOINT_LABEL;Surove črne točke +TP_EXPOS_WHITEPOINT_LABEL;Surove bele točke +TP_FILMNEGATIVE_BLUE;Kvocient modre +TP_FILMNEGATIVE_GREEN;Referenčni eksponent (kontrast) +TP_FILMNEGATIVE_GUESS_TOOLTIP;Izračunajte eksponente tako, da na sliki izberete dve nevtralni referenčni točki; ena bela (svetlo siva) in ena črna (temno siva). Vrstni red ni pomemben. Eksponenti bodo izračunani takoj po izbiri drugega mesta. +TP_FILMNEGATIVE_LABEL;Filmski negativ +TP_FILMNEGATIVE_PICK;Poberite črne in bele točke +TP_FILMNEGATIVE_RED;Kvocient rdeče +TP_FILMSIMULATION_LABEL;Simulacija filma +TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee je nastavljen, da išče slike Hald CLUT, ki so uporabljene za orodje simulacije filma, v mapi, kje potrebujejo preveč časa za nalaganje.\nPojdite v Preference > Obdelava slik > Simulacija filma\n da si ogledate katera mapa je v uporabi. Nastaviti morate RawTherapee tako, da bodisi kaže v mapo, ki vsebuje samo slike Hald CLUT in nič drugega, ali v prazno mapo, če ne želite uporabiti orodja za simulacijo filma.\n\nZa več informacij preberite članek Film Simulation v Rawpediji.\n\nAli želite prekiniti skeniranje? +TP_FILMSIMULATION_STRENGTH;Moč +TP_FILMSIMULATION_ZEROCLUTSFOUND;Nastavi mapo za HaldCLUT v preferencah +TP_FLATFIELD_AUTOSELECT;Avtomatska selekcija +TP_FLATFIELD_BLURRADIUS;Radij zameglevanja +TP_FLATFIELD_BLURTYPE;Tip zameglevanja +TP_FLATFIELD_BT_AREA;Površina +TP_FLATFIELD_BT_HORIZONTAL;Vodoravno +TP_FLATFIELD_BT_VERTHORIZ;Navpično + Vodoravno +TP_FLATFIELD_BT_VERTICAL;Navpično +TP_FLATFIELD_CLIPCONTROL;Kontrola posnetka +TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Kontrola posnetka se izogiba bleščav z uporabo poravnilnika. Če obstaja že nekaj posnetih poravnanih bleščav, lahko ta kontrola vodi k barvemu pridihu. +TP_FLATFIELD_LABEL;Flat-field +TP_GENERAL_11SCALE_TOOLTIP;Učinki tega so vidni in natančno prikazani samo v predogledu merila 1:1. +TP_GRADIENT_CENTER;Center +TP_GRADIENT_CENTER_X;Center X +TP_GRADIENT_CENTER_X_TOOLTIP;Pomakni gradient na levo (negativne vrednosti) ali desno (pozitivne vrednosti). +TP_GRADIENT_CENTER_Y;Center Y +TP_GRADIENT_CENTER_Y_TOOLTIP;Pomakni gradient navzgor (negativne vrednosti) ali dol (pozitivne vrednosti). +TP_GRADIENT_DEGREE;Kot +TP_GRADIENT_DEGREE_TOOLTIP;Kot vrtenja v stopinjah. +TP_GRADIENT_FEATHER;Pero +TP_GRADIENT_FEATHER_TOOLTIP;Širina gradienta v odstotkih diagonale slike. +TP_GRADIENT_LABEL;Postopni filter +TP_GRADIENT_STRENGTH;Moč +TP_GRADIENT_STRENGTH_TOOLTIP;Moč filtra v stopnjah. +TP_HLREC_BLEND;Zmešaj +TP_HLREC_CIELAB;Mešaj v CIELab +TP_HLREC_COLOR;Razmnoževanje barve +TP_HLREC_ENA_TOOLTIP;Je lahko aktivirano z avto nivoji. +TP_HLREC_LABEL;Restavriranje bleščav +TP_HLREC_LUMINANCE;Restavriranje svetlosti +TP_HLREC_METHOD;Metoda: +TP_HSVEQUALIZER_CHANNEL;Kanal +TP_HSVEQUALIZER_HUE;H +TP_HSVEQUALIZER_LABEL;Ekvalizator HSV +TP_HSVEQUALIZER_SAT;S +TP_HSVEQUALIZER_VAL;V +TP_ICM_APPLYBASELINEEXPOSUREOFFSET;Osnovna ekspozicija +TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Uporabi vgrajeno osnovno tabelo odmikov DCP. Nastavitev je na voljo samo, če obstaja DCP. +TP_ICM_APPLYHUESATMAP;Osnovna tabela +TP_ICM_APPLYHUESATMAP_TOOLTIP;Uporabi vgrajeno osnovno tabelo DCP (HueSatMap). Nastavitev je na voljo samo če obstaja DCP. +TP_ICM_APPLYLOOKTABLE;Look table +TP_ICM_APPLYLOOKTABLE_TOOLTIP;Uporabi vgrajeno osnovno tabelo vpogledov DCP. Nastavitev je na voljo samo če obstaja DCP. +TP_ICM_BPC;Prilagoditev črne točke +TP_ICM_DCPILLUMINANT;Osvetljevalnik +TP_ICM_DCPILLUMINANT_INTERPOLATED;Interpolirano +TP_ICM_DCPILLUMINANT_TOOLTIP;Izberi katero vgrajeno DCP svetilo uporabiti. Privzeto je "interpolirano", ki je mešanica dveh glede na belino. Nastavitev je na voljo, samo če izbran dvojno osvetlitveni CDP s podporo za interpolacijo. +TP_ICM_INPUTCAMERA;Standardni fotoaparat +TP_ICM_INPUTCAMERAICC;Avtomatično usklajen profil s fotoaparatom +TP_ICM_INPUTCAMERAICC_TOOLTIP;Uporabi RawTherapee-jev specifičen DCP za ta fotoaparat ali vhodni ICC profil. Ti profili so bolj natančni kot enostavni matrični profili, a niso na voljo za vse fotoaparate. Ti profili so shranjeni v mapah /iccprofiles/input in /dcpprofiles in jih razpoznamo iz natančnega imena modela fotoaparata. +TP_ICM_INPUTCAMERA_TOOLTIP;Uporabi enostavno matriko iz dcraw, izboljšano verzijo RawTherapee (katerikoli je na voljo za ta model fotoaparata) ali profil vgrajen v DNG. +TP_ICM_INPUTCUSTOM;Po meri +TP_ICM_INPUTCUSTOM_TOOLTIP;Izberi vaš lastni barvni profil DCP/ICC za fotoaparat. +TP_ICM_INPUTDLGLABEL;Izberi vhodni DCP/ICC Profil... +TP_ICM_INPUTEMBEDDED;Uporabi vgrajenega, če je možno +TP_ICM_INPUTEMBEDDED_TOOLTIP;Uporabi profil vgrajen v ne-surove slike. +TP_ICM_INPUTNONE;Ni profila +TP_ICM_INPUTNONE_TOOLTIP;Ne uporabi nobenega profila.\nUporabi samo v posebnih primerih. +TP_ICM_INPUTPROFILE;Vhodni profil +TP_ICM_LABEL;Upravljanje barv +TP_ICM_NOICM;No ICM: sRGB output +TP_ICM_OUTPUTPROFILE;Izhodni profil +TP_ICM_PROFILEINTENT;Namera upodabljanja +TP_ICM_SAVEREFERENCE;Shrani referenčno sliko +TP_ICM_SAVEREFERENCE_APPLYWB;Uporabi uravnoteženje beline +TP_ICM_SAVEREFERENCE_APPLYWB_TOOLTIP;Na splošno uporabi uravnoteženje beline kadar shranjujete slike za tvorbo ICC profilov, ne porabljajte pa uravnoteženje beline za tvorbo DCP profilov. +TP_ICM_SAVEREFERENCE_TOOLTIP;Shrani linearno sliko TIFF pred uporabo vhodnega profila. Rezultat lahko uporabiš za kalibracijo in tvorbo profila fotoaparata. +TP_ICM_TONECURVE;Krivulja tonov +TP_ICM_TONECURVE_TOOLTIP;Uporabi vgrajeno krivuljo tonov DCP. Nastavitev je na voljo samo, če ima izbran DCP tudi krivuljo tonov. +TP_ICM_WORKINGPROFILE;Delovni profil +TP_ICM_WORKING_TRC;Krivulja tonskih odzivov: +TP_ICM_WORKING_TRC_CUSTOM;Po meri +TP_ICM_WORKING_TRC_GAMMA;Gama +TP_ICM_WORKING_TRC_NONE;Nič +TP_ICM_WORKING_TRC_SLOPE;Strmina +TP_ICM_WORKING_TRC_TOOLTIP;Samo za vgrajene profile. +TP_IMPULSEDENOISE_LABEL;Impulzno zmanjšanje šuma +TP_IMPULSEDENOISE_THRESH;Prag +TP_LABCURVE_AVOIDCOLORSHIFT;Izogibaj se barvnega pomika +TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Prilagodi barve barvnemu prostoru delovnega barvnega prostora in uporabi Munsellov popravek. +TP_LABCURVE_BRIGHTNESS;Svetlost +TP_LABCURVE_CHROMATICITY;Kromatičnost +TP_LABCURVE_CHROMA_TOOLTIP;Za uporabo črno-belega toniranja nastavi kromatičnost na -100. +TP_LABCURVE_CONTRAST;Kontrast +TP_LABCURVE_CURVEEDITOR;Krivulja osvetljenosti +TP_LABCURVE_CURVEEDITOR_A_RANGE1;Nasičena zelena +TP_LABCURVE_CURVEEDITOR_A_RANGE2;Pastelno zelena +TP_LABCURVE_CURVEEDITOR_A_RANGE3;Pastelno rdeča +TP_LABCURVE_CURVEEDITOR_A_RANGE4;Nasičeno rdeča +TP_LABCURVE_CURVEEDITOR_B_RANGE1;Nasičeno modra +TP_LABCURVE_CURVEEDITOR_B_RANGE2;Pastelno modra +TP_LABCURVE_CURVEEDITOR_B_RANGE3;Pastelno rumena +TP_LABCURVE_CURVEEDITOR_B_RANGE4;Nasičeno rumena +TP_LABCURVE_CURVEEDITOR_CC;CC +TP_LABCURVE_CURVEEDITOR_CC_RANGE1;Nevtralna +TP_LABCURVE_CURVEEDITOR_CC_RANGE2;Dolgočasna +TP_LABCURVE_CURVEEDITOR_CC_RANGE3;Pastelna +TP_LABCURVE_CURVEEDITOR_CC_RANGE4;Nasičena +TP_LABCURVE_CURVEEDITOR_CC_TOOLTIP;Kromatičnost glede na kromatičnost C=f(C) +TP_LABCURVE_CURVEEDITOR_CH;CH +TP_LABCURVE_CURVEEDITOR_CH_TOOLTIP;Kromatičnost glede na odtenek C=f(H) +TP_LABCURVE_CURVEEDITOR_CL;CL +TP_LABCURVE_CURVEEDITOR_CL_TOOLTIP;Kromatičnost glede na svetlost C=f(L) +TP_LABCURVE_CURVEEDITOR_HH;HH +TP_LABCURVE_CURVEEDITOR_HH_TOOLTIP;Odtenek glede na odtenek H=f(H) +TP_LABCURVE_CURVEEDITOR_LC;LC +TP_LABCURVE_CURVEEDITOR_LC_TOOLTIP;Svetlost glede na kromatičnost L=f(C) +TP_LABCURVE_CURVEEDITOR_LH;LH +TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;Svetlost glede na odtenek L=f(H) +TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Svetlost glede na svetlost L=f(L) +TP_LABCURVE_LABEL;Prilagoditve L*a*b* +TP_LABCURVE_LCREDSK;Omeji LC na rdečo in kožne barve +TP_LABCURVE_LCREDSK_TIP;Če je aktivna, krivulja LC vpliva samo na rdečo in kožne barve.\nČe je onemogočen, se nanaša na vse tone. +TP_LABCURVE_RSTPROTECTION;Zaščita rdeče in kožnih barv +TP_LABCURVE_RSTPRO_TOOLTIP;Deluje na drsniku kromatičnost in krivulji CC. +TP_LENSGEOM_AUTOCROP;Avtomatska obrezava +TP_LENSGEOM_FILL;Avtomatsko popolnitev +TP_LENSGEOM_LABEL;Objektiv / geometrija +TP_LENSPROFILE_CORRECTION_AUTOMATCH;Avtomatično izbrano +TP_LENSPROFILE_CORRECTION_LCPFILE;datoteka LCP +TP_LENSPROFILE_CORRECTION_MANUAL;Ročno izbrano +TP_LENSPROFILE_LABEL;Popravek objektiva s profilom +TP_LENSPROFILE_LENS_WARNING;Opozorilo: faktor obrezave za objektiv je večje od faktorja obrezave za fotoaparat, rezultat utegne biti napačen. +TP_LENSPROFILE_MODE_HEADER;Profil objektiva +TP_LENSPROFILE_USE_CA;Kromatska aberacija +TP_LENSPROFILE_USE_GEOMETRIC;Geometrično popačenje +TP_LENSPROFILE_USE_HEADER;Popravi +TP_LENSPROFILE_USE_VIGNETTING;Vinjetiranje +TP_LOCALCONTRAST_AMOUNT;Količina +TP_LOCALCONTRAST_DARKNESS;Nivo temine +TP_LOCALCONTRAST_LABEL;Lokalni kontrast +TP_LOCALCONTRAST_LIGHTNESS;Nivo svetlosti +TP_LOCALCONTRAST_RADIUS;Radij +TP_METADATA_EDIT;Izvedi spremembe +TP_METADATA_MODE;Način kopiranja metapodatkov +TP_METADATA_STRIP;Odstrani vse metapodatke +TP_METADATA_TUNNEL;Kopiraj nespremenjeno +TP_NEUTRAL;Ponastavi +TP_NEUTRAL_TIP;Ponastavi drsnike ekspozicije v nevtralno stanje.\nUporablja enake parametre kot pri Avtomatskih nivojih, ne glede na to ali so uporabljeni ali ne.. +TP_PCVIGNETTE_FEATHER;Pero +TP_PCVIGNETTE_FEATHER_TOOLTIP;Perje:\n0 = samo vogali,\n50 = na polovici do centra,\n100 = v centru. +TP_PCVIGNETTE_LABEL;Filter vinjetiranja +TP_PCVIGNETTE_ROUNDNESS;Okroglina +TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Okroglina:\n0 = pravokotnik,\n50 = včrtana elipsa,\n100 = krog. +TP_PCVIGNETTE_STRENGTH;Moč +TP_PCVIGNETTE_STRENGTH_TOOLTIP;Moč filtra v stopnjah (uporabljeno v vogalih). +TP_PDSHARPENING_LABEL;Ujemite ostrenje +TP_PERSPECTIVE_HORIZONTAL;Vodoravno +TP_PERSPECTIVE_LABEL;Perspektiva +TP_PERSPECTIVE_VERTICAL;Navpično +TP_PFCURVE_CURVEEDITOR_CH;Ostanek +TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Kontrolira moč ostranjevanja artefaktov.\nVisoko = več,\nNizko = manj. +TP_PREPROCESS_DEADPIXFILT;Filter mrtvih pikslov +TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Poskuša odstraniti mrtve piksle. +TP_PREPROCESS_GREENEQUIL;Uravnoteženje zelene +TP_PREPROCESS_HOTPIXFILT;Filter vročih pikslov +TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Poskuša odstraniti vroče piksle. +TP_PREPROCESS_LABEL;Predobdelava +TP_PREPROCESS_LINEDENOISE;Filter linijskega šuma +TP_PREPROCESS_LINEDENOISE_DIRECTION;Smer +TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Obe +TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Vodoravno +TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Voporavno samo na vrsticah PDAF +TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Navpično +TP_PREPROCESS_NO_FOUND;Noben ni najden +TP_PREPROCESS_PDAFLINESFILTER;Linijski filter PDAF +TP_PRSHARPENING_LABEL;Ostrenje po spremembi velikosti +TP_PRSHARPENING_TOOLTIP;Naostri sliko po spremembi velikosti. Deluje samo z metodo "Lanczos". Nemogoče je izvesti predogled tega postopka. Glej Rawpedijo za navodila za uporabo. +TP_RAWCACORR_AUTO;Avtomatski popravki +TP_RAWCACORR_AUTOIT;Iteracije +TP_RAWCACORR_AUTOIT_TOOLTIP;Ta nastavitev je na voljo, če je omogočen "Avto-popravek"\nAvto-popravek je konzervativen, kar pomeni, da pogosto ne popravi vse kromatske aberacije.\nZa popravek preostale kromatske aberacije lahko uporabiš do pet iteracij avtomatske kromatske aberacije.\nVsaka iteracija bo zmanjšala preostalo kromatsko aberacijo glede na prejšnjo na račun dodatnega časa za obdelavo. +TP_RAWCACORR_AVOIDCOLORSHIFT;Izogibaj se pomiku barve +TP_RAWCACORR_CABLUE;Modra +TP_RAWCACORR_CARED;Rdeča +TP_RAWCACORR_LABEL;Popravek kromatske aberacije +TP_RAWEXPOS_BLACK_0;Zelena 1 (vodilna) +TP_RAWEXPOS_BLACK_1;Rdeča +TP_RAWEXPOS_BLACK_2;Modra +TP_RAWEXPOS_BLACK_3;Zelena 2 +TP_RAWEXPOS_BLACK_BLUE;Modra +TP_RAWEXPOS_BLACK_GREEN;Zelena +TP_RAWEXPOS_BLACK_RED;Rdeča +TP_RAWEXPOS_LINEAR;Popravek bele točke +TP_RAWEXPOS_RGB;Rdeča, Zelena, Modra +TP_RAWEXPOS_TWOGREEN;Poveži zelene +TP_RAW_1PASSMEDIUM;1-pass (Markesteijn) +TP_RAW_2PASS;1-pass+fast +TP_RAW_3PASSBEST;3-pass (Markesteijn) +TP_RAW_4PASS;3-prehodi+hitri +TP_RAW_AHD;AHD +TP_RAW_AMAZE;AMaZE +TP_RAW_AMAZEVNG4;AMaZE+VNG4 +TP_RAW_BORDER;Meja +TP_RAW_DCB;DCB +TP_RAW_DCBENHANCE;DCB izboljšava +TP_RAW_DCBITERATIONS;Število iteracij DCB +TP_RAW_DCBVNG4;DCB+VNG4 +TP_RAW_DMETHOD;Metoda +TP_RAW_DMETHOD_PROGRESSBAR;%1 odstranjevanje mozaičnosti... +TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Izboljšava odstranejvanja mozaičnosti... +TP_RAW_DMETHOD_TOOLTIP;Opomba: IGV in LMMSE sta namenjeni slikam z visokim ISO za pomoč pri odstranjevanju šuma ne da bi povzročali vzorce v obliki labirintov posterizacije ali izpranega videza.\nPomik pikslov je samo za datoteke Pentax/Sony Pixel Shift. Pri drugih datotekah je namesto tega uporabljen AMaZE. +TP_RAW_DUALDEMOSAICAUTOCONTRAST;Avtomatični prag +TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;Če je ta opcija vključena (priporočljivo), RawTherapee izračuna optimalno vrednost glede na gladke dele slike.\nČe ni gladkega dela slike ali pa če je slika preveč šumna, bo vrednost postavljena na 0.\nČe želiš postaviti vrednost ročno, najprej izključi opcijo (primerna vrednost je odvisna od slike). +TP_RAW_DUALDEMOSAICCONTRAST;Prag kontrasta +TP_RAW_EAHD;EAHD +TP_RAW_FALSECOLOR;Število korakov zatiranja napačnih barv +TP_RAW_FAST;Hitro +TP_RAW_HD;Prag +TP_RAW_HD_TOOLTIP;Nizke vrednosti bodo bolj agresivno določale vroče/mrtve piksle in lažne točke bodo pridelale artefakte. Če opazite pojav artefaktov, ko ste omogočili filter vročih/mrtvih pikslov, postopno povečajte vrednost praga, dokler artefakti ne izginejo. +TP_RAW_HPHD;HPHD +TP_RAW_IGV;IGV +TP_RAW_IMAGENUM;Po-slika +TP_RAW_IMAGENUM_SN;SN način +TP_RAW_IMAGENUM_TOOLTIP;Nekatere surove slike vsebujejo več podslik (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\n\nKadar uporabljate katerokoli metodo razen pomika pikslov, to določa katera podslika bo uporabljena.\n\nKadar uporabiš pomik pikslov na surovi sliki, so uporabljene vse podslike in to določa, katera podslika naj bo uporabljena za gibajoče dele. +TP_RAW_LABEL;Odstranjevanje mozaičnosti +TP_RAW_LMMSE;LMMSE +TP_RAW_LMMSEITERATIONS;LMMSE koraki izboljševanja +TP_RAW_LMMSE_TOOLTIP;Dodaj gamo (korak 1), mediano (koraki 2-4) in izboljševanje (koraka 5-6) za zmanjševanje artefaktov in izboljšanje razmerja signal šum. +TP_RAW_MONO;Mono +TP_RAW_NONE;None (Prikaži vzorec senzorja) +TP_RAW_PIXELSHIFT;Pomik pikslov +TP_RAW_PIXELSHIFTBLUR;Zamegli maska gibanja +TP_RAW_PIXELSHIFTDMETHOD;Metoda Odstranjevanja mozaičnosti +TP_RAW_PIXELSHIFTEPERISO;Občutljivost +TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;Privzeta vrednost 0 bi morala delovati za osnovni ISO.\nVišje vrednosti povečajo občutljivost za detekcijo gibanja.\nSpreminjajte počasi in opazujte masko gibanja.\nPovečajte občutljivost za podosvetljene slike ali slike z visokim ISO. +TP_RAW_PIXELSHIFTEQUALBRIGHT;Izenači svetlost okvirjev +TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL;Izenači po kanalih +TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL_TOOLTIP;Omogočeno: Izenači kanale RGB neodvisno.\nOnemogočeno: Uporabi enak faktor izenačevanja za vse kanale. +TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Izenači svetlost okvirjev svetlosti izbranega okvirja.\nČe obstajajo preosvetljeni deli okvirjev, izberite najsvetlejšega, da se izognete barvnemu tonu magente pri preosvetljenih delih ali da omogočite popravke gibanja. +TP_RAW_PIXELSHIFTGREEN;Preveri zeleni kanal za gibanje +TP_RAW_PIXELSHIFTHOLEFILL;Zapolni luknje v maski gibanja +TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Zapolni luknje v maski gibanja +TP_RAW_PIXELSHIFTMEDIAN;Uporabi mediano za gibajoče se dele +TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Uporabi mediano za vse okvirje namesto izbranega okvirja za dele z gibanjem.\nDaje efekt gibanja na počasi gibajočin (prekrivajočih se) predmetih. +TP_RAW_PIXELSHIFTMM_AUTO;Avtomatično +TP_RAW_PIXELSHIFTMM_CUSTOM;Po meri +TP_RAW_PIXELSHIFTMM_OFF;Izklopljeno +TP_RAW_PIXELSHIFTMOTIONMETHOD;Popravek gibanja +TP_RAW_PIXELSHIFTNONGREENCROSS;Preveri rdeč/moder kanal za gibanje +TP_RAW_PIXELSHIFTSHOWMOTION;Prikaži masko gibanja +TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Prikaži samo masko gibanja +TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Prikaže masko gibanja brez slike. +TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Prekrij sliko z zeleno masko, ki prikazuje področja z gibanjem. +TP_RAW_PIXELSHIFTSIGMA;Radij zameglevanja +TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;Privzet radij 1.0 običajno ustreza osnovnem ISO.\nVrednost povečajte za visok ISO, 5.0 je dobra začetna vrednost.\nOpazujte masko gibanja, ko spreminjate vrednost. +TP_RAW_PIXELSHIFTSMOOTH;Gladki prehodi +TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Gladki prehodi med področji z gibanjem in področji brez.\nPostavite na 1, da dobite rezultat AMaZE/LMMSE za izbran okvir (odvisno ali je izbran "Uporabi LMMSE") ali mediana za vse štiri okvire, če je izbran "Uporabi mediano". +TP_RAW_RCD;RCD +TP_RAW_RCDVNG4;RCD+VNG4 +TP_RAW_SENSOR_BAYER_LABEL;Senzor z matriko Bayer +TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-prehodi daje boljše rezultate (priporočljivo za nizek ISO).\n1-prehod je komaj različen od 3-prehodov za visoke ISO slike in je hitrejši.\n+fast daje manj artefaktov v gladkih predelih +TP_RAW_SENSOR_XTRANS_LABEL;Senzor z matriko X-Trans +TP_RAW_VNG4;VNG4 +TP_RAW_XTRANS;X-Trans +TP_RAW_XTRANSFAST;Fast X-Trans +TP_RESIZE_ALLOW_UPSCALING;Dovoli povečavo +TP_RESIZE_APPLIESTO;Se nanaša na: +TP_RESIZE_CROPPEDAREA;Izrezano področje +TP_RESIZE_FITBOX;Bounding Box +TP_RESIZE_FULLIMAGE;Celotna slika +TP_RESIZE_H;Višina: +TP_RESIZE_HEIGHT;Višina +TP_RESIZE_LABEL;Spremeni velikost +TP_RESIZE_LANCZOS;Lanczos +TP_RESIZE_METHOD;Metoda: +TP_RESIZE_NEAREST;Najbližji +TP_RESIZE_SCALE;Merilo +TP_RESIZE_SPECIFY;Opiši: +TP_RESIZE_W;Širina: +TP_RESIZE_WIDTH;Širina +TP_RETINEX_CONTEDIT_HSL;HSL histogram +TP_RETINEX_CONTEDIT_LAB;L*a*b* histogram +TP_RETINEX_CONTEDIT_LH;Odtenek +TP_RETINEX_CONTEDIT_MAP;Izenačevalnik +TP_RETINEX_CURVEEDITOR_CD;L=f(L) +TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Svetlost glede na svetlost L=f(L)\nPopravi surove podatke, da zmanjšaš odboje in artefakte. +TP_RETINEX_CURVEEDITOR_LH;Moč=f(H) +TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Moč glede na odtenek Moč=f(H)\nTa krivulja deluje tudi na barvitosti kadar uporabljamo metodo Retinex na bleščavah. +TP_RETINEX_CURVEEDITOR_MAP;L=f(L) +TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;To krivuljo lahko uporabimo samo ali pa z Gaussovo masko ali masko valovčkov.\nPazite na artefakte! +TP_RETINEX_EQUAL;Izenačevalnik +TP_RETINEX_FREEGAMMA;Prosta gama +TP_RETINEX_GAIN;Ojačenje +TP_RETINEX_GAINOFFS;Ojačenje in odmik (svetlost) +TP_RETINEX_GAINTRANSMISSION;Prenos ojačenja +TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Ojačaj ali oslabi prenosno funkcijo da dosežete željeno svetlost.\nOs x je prenos.\nOs y je ojačenje. +TP_RETINEX_GAMMA;Gama +TP_RETINEX_GAMMA_FREE;Prost +TP_RETINEX_GAMMA_HIGH;Visok +TP_RETINEX_GAMMA_LOW;Nizek +TP_RETINEX_GAMMA_MID;Srednji +TP_RETINEX_GAMMA_NONE;Nič +TP_RETINEX_GAMMA_TOOLTIP;Obnovi tone z uporabo game pred ali po Retinexu. Krivulje so drugačne od Retinexovih ali drugih (Lab, Ekspozicija, itd.). +TP_RETINEX_GRAD;Gradient prenosa +TP_RETINEX_GRADS;Moč gradienta +TP_RETINEX_GRADS_TOOLTIP;Če je drsnik na 0, so vse iteracije identične.\nČe je > 0 moč pojema pri vsaki iteraciji in obratno. +TP_RETINEX_GRAD_TOOLTIP;Če je drsnik na 0, so vse iteracije identične.\nČe je > 0 Varianca in Prag pojemata pri vsaki iteraciji in obratno. +TP_RETINEX_HIGH;Visoko +TP_RETINEX_HIGHLIG;Bleščava +TP_RETINEX_HIGHLIGHT;Prag bleščave +TP_RETINEX_HIGHLIGHT_TOOLTIP;Poveča aktivnosti visokega algoritma.\nMorda bo zahtevala prilagoditev "Sosednjih pikslov" in povečanje "Popravka bele točke" v orodju v zavihku Surove -> Orodju Surova Bela Točka. +TP_RETINEX_HSLSPACE_LIN;HSL-Linearno +TP_RETINEX_HSLSPACE_LOG;HSL-Logaritmično +TP_RETINEX_ITER;Iteracije (Preslikava tonov) +TP_RETINEX_ITERF;Preslikava tonov +TP_RETINEX_ITER_TOOLTIP;Simuliraj operacijo preslikave tonov.\nVisoke vrednosti povečujejo čas obdelave. +TP_RETINEX_LABEL;Retinex +TP_RETINEX_LABEL_MASK;Maska +TP_RETINEX_LABSPACE;L*a*b* +TP_RETINEX_LOW;Nizko +TP_RETINEX_MAP;Metoda +TP_RETINEX_MAP_GAUS;Gaussova maska +TP_RETINEX_MAP_MAPP;Maska ostrenja (delni valovčki) +TP_RETINEX_MAP_MAPT;Maska ostrenja (popolni valovčki) +TP_RETINEX_MAP_METHOD_TOOLTIP;Uporabi masko, ki ga je generirala gornja Gaussova funkcija (Radin, Metoda) za zmanjševanja odbojev in artefaktov.\n\nSamo krivulja: uporabi diagonalni kontrast na maski.\nPazite na artefakte!\n\nGaussova maska: tvori in uporabi Gaussovo zameglitev izvorne maske.\nHitro.\n\nMaska ostrenja: tvori in uporabi valovčke na izvorni maski.\nPočasno. +TP_RETINEX_MAP_NONE;Nič +TP_RETINEX_MEDIAN;Fiter mediane prenosa +TP_RETINEX_METHOD;Metoda +TP_RETINEX_METHOD_TOOLTIP;Low = Ojačaj šibko svetlobo.\nEnakomerno = Izenači.\nVisoko = Ojačaj močno svetlobo.\nBleščave = Odstrani magento iz bleščav. +TP_RETINEX_MLABEL;Obnovi brez meglic Min=%1 Max=%2 +TP_RETINEX_MLABEL_TOOLTIP;Mora biti blizu min=0 max=32768\nObnovljena slika brez mešanja. +TP_RETINEX_NEIGHBOR;Radij +TP_RETINEX_NEUTRAL;Ponastavi +TP_RETINEX_NEUTRAL_TIP;Ponastavi vse drsnike in klrivulje na njihove privzete vrednosti. +TP_RETINEX_OFFSET;Odmik (svetlost) +TP_RETINEX_SCALES;Gaussov gradient +TP_RETINEX_SCALES_TOOLTIP;Če je drsnik na 0, so vse iteracije identične.\nČe je > 0 merilo in radij pojemata pri vsaki iteraciji in obratno. +TP_RETINEX_SETTINGS;Nastavitve +TP_RETINEX_SKAL;Merilo +TP_RETINEX_SLOPE;Prosta strmina game +TP_RETINEX_STRENGTH;Moč +TP_RETINEX_THRESHOLD;Prag +TP_RETINEX_THRESHOLD_TOOLTIP;Omejuje vhod/izhod.\nVhod = izvorna slika,\nIzhod = slika po Gaussu. +TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Povprečje=%3 Sigma=%4 +TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 +TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma.\nTm=Min TM=Max of transmission map. +TP_RETINEX_TRANF;Prenos +TP_RETINEX_TRANSMISSION;Prenosna funkcija +TP_RETINEX_TRANSMISSION_TOOLTIP;Prenos glede na prenos.\nAbscisa: prenos negativnih vrednosti (min), povprečja, in pozitivnih vrednosti (max).\nOrdinata: ojačenje ali slabljenje. +TP_RETINEX_UNIFORM;Enakomerno +TP_RETINEX_VARIANCE;Kontrast +TP_RETINEX_VARIANCE_TOOLTIP;Nizka varianca povečuje lokalni kontrast in nasičenje, toda lahko tvori artefakte. +TP_RETINEX_VIEW;Obdelava +TP_RETINEX_VIEW_MASK;Maska +TP_RETINEX_VIEW_METHOD_TOOLTIP;Standardno - Normalen prikaz.\nMaska - Prikazuje masko.\nNeostra maska - Prikaže sliko z neostro masko z velikim radijem.\nPrenos - Avto/Fiksno - Prikaže prenosno funkcijo pred kakršnimkoli posegom na kontrastu ali svetlosti.\n\nPozor: maska ni realistična, ampak je ojačana, da se bolje vidi. +TP_RETINEX_VIEW_NONE;Standardno +TP_RETINEX_VIEW_TRAN;Prenos - Avto +TP_RETINEX_VIEW_TRAN2;Prenos - Fiksno +TP_RETINEX_VIEW_UNSHARP;Neostra maska +TP_RGBCURVES_BLUE;B +TP_RGBCURVES_CHANNEL;Kanal +TP_RGBCURVES_GREEN;G +TP_RGBCURVES_LABEL;RGB krivulje +TP_RGBCURVES_LUMAMODE;Način svetilnosti +TP_RGBCURVES_LUMAMODE_TOOLTIP;Način svetilnosti dovoljuje spreminjanje prispevka kanalov R, G in B na svetlost slike, ne da bi spreminjali barve slike. +TP_RGBCURVES_RED;R +TP_ROTATE_DEGREE;Stopnja +TP_ROTATE_LABEL;Zavrti +TP_ROTATE_SELECTLINE;Izberi ravno črto +TP_SAVEDIALOG_OK_TIP;Bližnjica: Ctrl-Enter +TP_SHADOWSHLIGHTS_HIGHLIGHTS;Bleščave +TP_SHADOWSHLIGHTS_HLTONALW;Tonska širina bleščav +TP_SHADOWSHLIGHTS_LABEL;Sence/bleščave +TP_SHADOWSHLIGHTS_RADIUS;Radij +TP_SHADOWSHLIGHTS_SHADOWS;Sence +TP_SHADOWSHLIGHTS_SHTONALW;Tonska širina senc +TP_SHARPENEDGE_AMOUNT;Količina +TP_SHARPENEDGE_LABEL;Robovi +TP_SHARPENEDGE_PASSES;Iteracij +TP_SHARPENEDGE_THREE;Samo svetlost +TP_SHARPENING_AMOUNT;Količina +TP_SHARPENING_BLUR;Radij zamegljevanja +TP_SHARPENING_CONTRAST;Prag kontrasta +TP_SHARPENING_EDRADIUS;Radij +TP_SHARPENING_EDTOLERANCE;Toleranca robov +TP_SHARPENING_GAMMA;Gama +TP_SHARPENING_HALOCONTROL;Kontrola odbojev +TP_SHARPENING_HCAMOUNT;Količina +TP_SHARPENING_LABEL;Ostrenje +TP_SHARPENING_METHOD;Metoda +TP_SHARPENING_ONLYEDGES;Naostri samo robove +TP_SHARPENING_RADIUS;Radij +TP_SHARPENING_RADIUS_BOOST;Povečanje polmera vogala +TP_SHARPENING_RLD;RL Dekonvolucija +TP_SHARPENING_RLD_AMOUNT;Količina +TP_SHARPENING_RLD_DAMPING;Blaženje +TP_SHARPENING_RLD_ITERATIONS;Iteracij +TP_SHARPENING_THRESHOLD;Prag +TP_SHARPENING_USM;Neostra maska +TP_SHARPENMICRO_AMOUNT;Količina +TP_SHARPENMICRO_CONTRAST;Prag kontrasta +TP_SHARPENMICRO_LABEL;Mikrokontrast +TP_SHARPENMICRO_MATRIX;3×3 matrika namesto 5×5 +TP_SHARPENMICRO_UNIFORMITY;Enakomernost +TP_SOFTLIGHT_LABEL;Mehka svetloba +TP_SOFTLIGHT_STRENGTH;Moč +TP_TM_FATTAL_AMOUNT;Količina +TP_TM_FATTAL_ANCHOR;Sidro +TP_TM_FATTAL_LABEL;Kompresija dinamičnega obsega +TP_TM_FATTAL_THRESHOLD;Podrobnost +TP_VIBRANCE_AVOIDCOLORSHIFT;Izogibaj se pomiku barve +TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH +TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Kožni toni +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE1;rdeča/rožnata +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE2;rdeča +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE3;rdeča/rumena +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE4;rumena +TP_VIBRANCE_CURVEEDITOR_SKINTONES_TOOLTIP;Odtenek glede na odtenek H=f(H) +TP_VIBRANCE_LABEL;Živost +TP_VIBRANCE_PASTELS;Pastelni toni +TP_VIBRANCE_PASTSATTOG;Poveži pastelne in nasičene tone +TP_VIBRANCE_PROTECTSKINS;Zaščiti kožne tone +TP_VIBRANCE_PSTHRESHOLD;Prag pastelnih/nasičenih tonov +TP_VIBRANCE_PSTHRESHOLD_SATTHRESH;Prag nasičenja +TP_VIBRANCE_PSTHRESHOLD_TOOLTIP;Navpična os predstavlja pestelne tone spodaj in nasičene tone na vrhu.\nVodoravna os predstavlja obseg nasičenja. +TP_VIBRANCE_PSTHRESHOLD_WEIGTHING;Utež prenosa pastelno/nasičeno +TP_VIBRANCE_SATURATED;Nasičeni toni +TP_VIGNETTING_AMOUNT;Količina +TP_VIGNETTING_CENTER;Center +TP_VIGNETTING_CENTER_X;Center X +TP_VIGNETTING_CENTER_Y;Center Y +TP_VIGNETTING_LABEL;Popravek vinjetiranja +TP_VIGNETTING_RADIUS;Radij +TP_VIGNETTING_STRENGTH;Moč +TP_WAVELET_1;Nivo 1 +TP_WAVELET_2;Nivo 2 +TP_WAVELET_3;Nivo 3 +TP_WAVELET_4;Nivo 4 +TP_WAVELET_5;Nivo 5 +TP_WAVELET_6;Nivo 6 +TP_WAVELET_7;Nivo 7 +TP_WAVELET_8;Nivo 8 +TP_WAVELET_9;Nivo 9 +TP_WAVELET_APPLYTO;Uporabi na +TP_WAVELET_AVOID;Izogibaj se pomiku barv +TP_WAVELET_B0;Črna +TP_WAVELET_B1;Siva +TP_WAVELET_B2;Preostanek +TP_WAVELET_BACKGROUND;Ozadje +TP_WAVELET_BACUR;Krivulja +TP_WAVELET_BALANCE;Ravnotežje kontrasta d/v-h +TP_WAVELET_BALANCE_TOOLTIP;Spremeni ravnotežje med smermi valovčkov: navpično-vodoravno in diagonalno.\nČe so omogočeni kontrast, barvitost ali preostali prenos tonov, je učinek ojačan. +TP_WAVELET_BALCHRO;Ravnotežje barvitosti +TP_WAVELET_BALCHRO_TOOLTIP;Če je omogočen potem krivulja ravnotežja kontrasta ali drsnik tudi spreminja ravnotežje barvitosti. +TP_WAVELET_BANONE;Nič +TP_WAVELET_BASLI;Drsnik +TP_WAVELET_BATYPE;Metoda ravnotežja kontrasta +TP_WAVELET_CBENAB;Ravnotežje tonov in barve +TP_WAVELET_CB_TOOLTIP;Za močne vrednosti barvno toniranje izdelka, če ga kombinirate ali ne s stopnjami razkroja 'toniranje'\nZa nizke vrednosti lahko spremenite ravnovesje beline v ozadju (nebo, ...), ne da bi spremenili stanje sprednje ravnine, na splošno bolj kontrastno +TP_WAVELET_CCURVE;Lokalni kontrast +TP_WAVELET_CH1;Obseg vse barvitosti +TP_WAVELET_CH2;Nasičena/pastelna +TP_WAVELET_CH3;Nivoji povezav kontrastov +TP_WAVELET_CHCU;Krivulja +TP_WAVELET_CHR;Moč povezave barvitosti in kontrasta +TP_WAVELET_CHRO;Prag nasičenja/pastelnosti +TP_WAVELET_CHRO_TOOLTIP;Nastavi nivo valovčkov, ki določa prag med nasičenimi in pastelnimi barvami.\n1-x: nasičene\nx-9: pastelne\n\nČe vrednost presega štvilo nivojev valovčkov, ki jih uporabljate, vrednost zanemarimo. +TP_WAVELET_CHR_TOOLTIP;Prilagodi barvitost kot funkcijo "nivojev kontrasta" in "moč povezave barvitost-kontrast" +TP_WAVELET_CHSL;Drsniki +TP_WAVELET_CHTYPE;Metoda krominance +TP_WAVELET_COLORT;Neprosojnost rdeče-zelene +TP_WAVELET_COMPCONT;Kontrast +TP_WAVELET_COMPGAMMA;Stiskanje game +TP_WAVELET_COMPGAMMA_TOOLTIP;Prilagoditev game preostanka slike dovoljuje uravnoteženje podatkov in histograma. +TP_WAVELET_COMPTM;Prenosna funkcija tonov +TP_WAVELET_CONTEDIT;Krivulja kontrasta "Po" +TP_WAVELET_CONTR;Barvni obseg +TP_WAVELET_CONTRA;Kontrast +TP_WAVELET_CONTRAST_MINUS;Kontrast - +TP_WAVELET_CONTRAST_PLUS;Kontrast + +TP_WAVELET_CONTRA_TOOLTIP;Spremeni kontrast preostanka slike. +TP_WAVELET_CTYPE;Kontrola krominance +TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Spremeni lokalni kontrast kot funkcijo izvirnega lokalnega kontrasta (abscisa).\nSpodnje vrednosti na abscisi predstavljajo majhne izvirne lokalne kontraste (vrednosti med 100 in 300).\n66% na abscisi predstavlja standardno deviacijo lokalnih kontrastov (vrednosti med 300 in 800)\n100% na abscisi pa predstavlja maksimalne lokalne kontraste (vrednosti med 3000 in 8000). +TP_WAVELET_CURVEEDITOR_CH;Kontrast nivoji=f(Odtenek) +TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Spremeni kontrast vsake stopnje kot funkcijo odtenka.\nPazite, da ne boste prepisali sprememb, izvedenih s krmilnimi odtenki podorodja Gamut.\nKrivulja bo imela učinek le, če so drsniki na ravni valovnih kontrastov brez ničle. +TP_WAVELET_CURVEEDITOR_CL;L +TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Uporabi končno krivuljo svetilnosti kontrasta na koncu obdelave z valovčki. +TP_WAVELET_CURVEEDITOR_HH;HH +TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Spremeni odtenek preostale slike kot funkcijo odtenka. +TP_WAVELET_DALL;Vse smeri +TP_WAVELET_DAUB;Performance robov +TP_WAVELET_DAUB2;D2 - nizko +TP_WAVELET_DAUB4;D4 - standard +TP_WAVELET_DAUB6;D6 - standard plus +TP_WAVELET_DAUB10;D10 - srednje +TP_WAVELET_DAUB14;D14 - visoko +TP_WAVELET_DAUB_TOOLTIP;Spremeni Daubechiesove koeficiente:\nD4 = Standardno,\nD14 = Pogosto najboljše, 10% bolj časovno zahetvno.\n\nVpliva na razpoznavanje robov kot tudi splošno kakovost prvih nivojev. Kljub temu splošna kakovost ni strogo odvisna od tega koeficienta in se lahko spremeni v odvisnosti od slik in uporabe. +TP_WAVELET_DONE;Navpično +TP_WAVELET_DTHR;Diagonalno +TP_WAVELET_DTWO;Vodoravno +TP_WAVELET_EDCU;Krivulja +TP_WAVELET_EDGCONT;Lokalni kontrast +TP_WAVELET_EDGCONT_TOOLTIP;Prilagoditev točk na levi zmanjšuje kontrast in na desni ga povečuje.\nSpodaj-levo, zgoraj-levo, zgoraj-desno in spodaj-desno predstavljajo lokalni kontrast za nizke vrednosti, povprečje, povprečje+stdev in maximum. +TP_WAVELET_EDGE;Ostrina roba +TP_WAVELET_EDGEAMPLI;Osnovno ojačenje +TP_WAVELET_EDGEDETECT;Gradient občutljivosti +TP_WAVELET_EDGEDETECTTHR;Spodnji prag (šum) +TP_WAVELET_EDGEDETECTTHR2;Zgornji prag (občutljivost) +TP_WAVELET_EDGEDETECTTHR_TOOLTIP;Ta prilagojevalnik omogoča ciljno detekcijo robov za izogibanje ostrine robov na finih podrobnostih kot npr. šum na nebu. +TP_WAVELET_EDGEDETECT_TOOLTIP;Pomik drsnika na desno poveča občutljivost za robove. To vpliva na lokalni kontrast, nastavitve robov in šum. +TP_WAVELET_EDGESENSI;Rob občutljivosti +TP_WAVELET_EDGREINF_TOOLTIP;Ojači ali zmanjšaj vpliv prvega nivoja, nasprotni vpliv drugega nivoja, preostalo pusti nespremenjeno. +TP_WAVELET_EDGTHRESH;Podrobnost +TP_WAVELET_EDGTHRESH_TOOLTIP;Spremeni ponovne delitve med prvim nivojem in ostalimi. Višji kot je prag, več aktivnosti je osredotočeno na prve nivoje.Bodite previdni z negativnimi vrednostmi, ki povečaujejo aktivnosti visokih nivojev in lahko povzročajo artefakte. +TP_WAVELET_EDRAD;Radij +TP_WAVELET_EDRAD_TOOLTIP;Ta prilagoditev radija je bistveno drugačna kot pri drugih orodij ostrenja. Vrednost radija se primerja prek kompleksne funkcije z drugimi nivoji. Tako ima tudi vrednost 0 vpliv. +TP_WAVELET_EDSL;Prag drsnikov +TP_WAVELET_EDTYPE;Metoda Lokalnega kontrasta +TP_WAVELET_EDVAL;Moč +TP_WAVELET_FINAL;Končni poseg +TP_WAVELET_FINEST;Najbolj fino +TP_WAVELET_HIGHLIGHT;Obseg svetlosti bleščav +TP_WAVELET_HS1;Celotni obseg svetlosti +TP_WAVELET_HS2;Sence/bleščave +TP_WAVELET_HUESKIN;Kožni odtenek +TP_WAVELET_HUESKIN_TOOLTIP;Spodnje točke določajo začetek cone sprememb, zgornje točke pa konec, kjer so spremembe najmočnejše.\n\nČe morate področje bistveno premakniti ali pa se pojavljajo artefakti, potem je ravnotežje beline napačno. +TP_WAVELET_HUESKY;Odtenek neba +TP_WAVELET_HUESKY_TOOLTIP;Spodnje točke določajo začetek cone sprememb, zgornje točke pa konec, kjer so spremembe najmočnejše.\n\nČe morate področje bistveno premakniti ali pa se pojavljajo artefakti, potem je ravnotežje beline napačno. +TP_WAVELET_ITER;Nivoji ravnotežja Delta +TP_WAVELET_ITER_TOOLTIP;Levo: povečajne spodnje nivoje in zmanjšajte visoke nivoje,\nDesno: zmanjšajte nizke nivoje in povečajte visoke nivoje. +TP_WAVELET_LABEL;Nivoji valovčkov +TP_WAVELET_LARGEST;Najbolj grobo +TP_WAVELET_LEVCH;Barvitost +TP_WAVELET_LEVDIR_ALL;Vsi nivoji v vseh smereh +TP_WAVELET_LEVDIR_INF;Pod ali enako nivoju +TP_WAVELET_LEVDIR_ONE;En nivo +TP_WAVELET_LEVDIR_SUP;Nad nivojem +TP_WAVELET_LEVELS;Nivoji valovčkov +TP_WAVELET_LEVELS_TOOLTIP;Izberi število nivojev podrobnosti slike, ki naj se razdeli. Več nivojev zahteva več RAMa in več časa obdelovanja. +TP_WAVELET_LEVF;Kontrast +TP_WAVELET_LEVLABEL;Predogled največ možnih nivojev = %1 +TP_WAVELET_LEVONE;Nivo 2 +TP_WAVELET_LEVTHRE;Nivo 4 +TP_WAVELET_LEVTWO;Nivo 3 +TP_WAVELET_LEVZERO;Nivo 1 +TP_WAVELET_LINKEDG;Povežo z močjo ostrine robov +TP_WAVELET_LIPST;Izboljšan algoritem +TP_WAVELET_LOWLIGHT;Obseg svetlosti senc +TP_WAVELET_MEDGREINF;Prvi nivo +TP_WAVELET_MEDI;Odstrani artefakte na modrem nebu +TP_WAVELET_MEDILEV;Detekcija roba +TP_WAVELET_MEDILEV_TOOLTIP;Kadar omogočite detekcijo robov, priporočamo:\n- onemogočanje nizkih nivojev kontrasta za izogibanje artefaktom,\n- uporabo visokih vrednosti gradienta občutljivosti.\n\nMoč lahko nastavljate z izboljšavo od 'Odstranjevanja šuma' do 'Olepševanja'. +TP_WAVELET_NEUTRAL;Nevtralno +TP_WAVELET_NOIS;Odstrani šum +TP_WAVELET_NOISE;Odstrani šum in izpopolni +TP_WAVELET_NPHIGH;Visoko +TP_WAVELET_NPLOW;Nizko +TP_WAVELET_NPNONE;Nič +TP_WAVELET_NPTYPE;Sosednji piksli +TP_WAVELET_NPTYPE_TOOLTIP;Ta algoritem uporablja bližino piksla in osem njegovih sosedov. Če je majhna razlika, so robovi ojačeni. +TP_WAVELET_OPACITY;Neprosojnost modra-rumena +TP_WAVELET_OPACITYW;Krivulja ravnotežja kontrasta d/v-h +TP_WAVELET_OPACITYWL;Končni lokalni kontrast +TP_WAVELET_OPACITYWL_TOOLTIP;Spremeni končni lokalni kontrast ob koncu obdelave z valovčki\n\nLeva stran predstavlja najmanjši lokalni kontrast, ki se povečuje in doseže največji kontrast na desni strani. +TP_WAVELET_PASTEL;Pastelna barvitost +TP_WAVELET_PROC;Obdelaj +TP_WAVELET_RE1;Ojačeno +TP_WAVELET_RE2;Nespremenjeno +TP_WAVELET_RE3;Oslabljeno +TP_WAVELET_RESCHRO;Barvitost +TP_WAVELET_RESCON;Sence +TP_WAVELET_RESCONH;Bleščave +TP_WAVELET_RESID;Preostanek slike +TP_WAVELET_SAT;Nasičena barvitost +TP_WAVELET_SETTINGS;Nastavitev valovčkov +TP_WAVELET_SKIN;Ciljna zaščita kože +TP_WAVELET_SKIN_TOOLTIP;Pri -100 so odtenki kože ciljani.\nPri 0 so vsi toni obravnavani enako.\nPri +100 so kožni toni zaščiteni, vsi ostali pa spremenjeni. +TP_WAVELET_SKY;Ciljna zaščita neba +TP_WAVELET_SKY_TOOLTIP;Pri -100 so odtenki neba ciljani.\nPri 0 so vsi toni obravnavani enako.\nPri +100 so toni neba zaščiteni, vsi ostali pa spremenjeni. +TP_WAVELET_STREN;Moč +TP_WAVELET_STRENGTH;Moč +TP_WAVELET_SUPE;Ekstra +TP_WAVELET_THR;Prag senc +TP_WAVELET_THRESHOLD;Nivoji bleščav +TP_WAVELET_THRESHOLD2;Nivoji bleščav +TP_WAVELET_THRESHOLD2_TOOLTIP;Sprememba svetlosti v sencah bo samo na nivojih od 9 do 9 minus vrednost. Ostali nivoji bodo obdelani. Najvišji možni nivo je omejen z nivojem bleščav (9 minus nivo bleščav). +TP_WAVELET_THRESHOLD_TOOLTIP;Vpliv obsega lumninance bo samo na nivojih nad izbrano vrednostjo. Vsi ostali nivoji bodo obdelani. Izbrana vrednost omejuje najvišji možni nivo v sencah. +TP_WAVELET_THRH;Prag bleščav +TP_WAVELET_TILESBIG;Velike krpe +TP_WAVELET_TILESFULL;Celotna slika +TP_WAVELET_TILESIZE;Metoda pokrivanja +TP_WAVELET_TILESLIT;Majhne krpe +TP_WAVELET_TILES_TOOLTIP;Obdelava celotne slike zagotavlja boljšo kakovost in jo priporočamo, medtem ko je uporaba krp rezervna možnost za uporabnike z malo RAMa. Poglejte v RawPedio za potrebe po pomnilniku. +TP_WAVELET_TMSTRENGTH;Compression strength +TP_WAVELET_TMSTRENGTH_TOOLTIP;Upravlja z močjo tonske preslikave ali stiskanja kontrasta preostanka slike. Kadar je vrednost različna od 0, potem sta drsnika za moč in gamo posivela in onemogočena. +TP_WAVELET_TMTYPE;Metode stiskanja +TP_WAVELET_TON;Toniranje +TP_WBALANCE_AUTO;Avto +TP_WBALANCE_CAMERA;Camera +TP_WBALANCE_CLOUDY;Oblačno +TP_WBALANCE_CUSTOM;Po meri +TP_WBALANCE_DAYLIGHT;Dnevna svetloba (sončno) +TP_WBALANCE_EQBLUERED;Izenačevalnik modro/rdeče +TP_WBALANCE_EQBLUERED_TOOLTIP;Dovoljuje drugačno obnašanje od običajnega "uravnoteževanja beline" z urejanjem ravnotežja med rdečo in modro.\nTo je uporabno, kadar so pogoji snemanja:\na) daleč od običajnih pogojev osvetlitve (npr. pod vodo)\nb) so daleč od pogojev, kjer so bile izvedene nastavitve,\nc) ali, kjer so matrike ali ICC profili neprimerni. +TP_WBALANCE_FLASH55;Leica +TP_WBALANCE_FLASH60;Standard, Canon, Pentax, Olympus +TP_WBALANCE_FLASH65;Nikon, Panasonic, Sony, Minolta +TP_WBALANCE_FLASH_HEADER;Bliskavica +TP_WBALANCE_FLUO1;F1 - Dnevna svetloba +TP_WBALANCE_FLUO2;F2 - Hladna bela +TP_WBALANCE_FLUO3;F3 - Bela +TP_WBALANCE_FLUO4;F4 - Topla bela +TP_WBALANCE_FLUO5;F5 - Dnevna svetloba +TP_WBALANCE_FLUO6;F6 - Svetla bela +TP_WBALANCE_FLUO7;F7 - D65 Simulator dnevne svetlobe +TP_WBALANCE_FLUO8;F8 - D50 / Sylvania F40 Design +TP_WBALANCE_FLUO9;F9 - De luxe hladna bela +TP_WBALANCE_FLUO10;F10 - Philips TL85 +TP_WBALANCE_FLUO11;F11 - Philips TL84 +TP_WBALANCE_FLUO12;F12 - Philips TL83 +TP_WBALANCE_FLUO_HEADER;Fluorescent +TP_WBALANCE_GREEN;Odtenek +TP_WBALANCE_GTI;GTI +TP_WBALANCE_HMI;HMI +TP_WBALANCE_JUDGEIII;JudgeIII +TP_WBALANCE_LABEL;Uravnoteženje beline +TP_WBALANCE_LAMP_HEADER;Žarnica +TP_WBALANCE_LED_CRS;CRS SP12 WWMR16 +TP_WBALANCE_LED_HEADER;LED +TP_WBALANCE_LED_LSI;LSI Lumelex 2040 +TP_WBALANCE_METHOD;Metoda +TP_WBALANCE_PICKER;Poberi +TP_WBALANCE_SHADE;Senca +TP_WBALANCE_SIZE;Velikost: +TP_WBALANCE_SOLUX35;Solux 3500K +TP_WBALANCE_SOLUX41;Solux 4100K +TP_WBALANCE_SOLUX47;Solux 4700K (vendor) +TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery) +TP_WBALANCE_SPOTWB;Uporabi pipeto za pridobivanje ravnotežne beline iz nevtralnega dela slike v predogledu. +TP_WBALANCE_TEMPBIAS;AWB pristranost temperature +TP_WBALANCE_TEMPBIAS_TOOLTIP;Dovoljuje spremenjen izračun "avtomatičnega ravnotežja beline"\nz spremembo proti toplejšemu ali hladnejšemu spektru. \nPristranost je izražena z odstotkom od izračunane temperature\ntako da je rezultat izražen z "izračunanaTemp + izračunanaTemp * pristranost". +TP_WBALANCE_TEMPERATURE;Temperatura +TP_WBALANCE_TUNGSTEN;Tungsten +TP_WBALANCE_WATER1;Podvodna 1 +TP_WBALANCE_WATER2;Podvodna 2 +TP_WBALANCE_WATER_HEADER;Pod vodo +ZOOMPANEL_100;(100%) +ZOOMPANEL_NEWCROPWINDOW;Odpri (novo) okno s podrobnostmi +ZOOMPANEL_ZOOM100;Zoom do 100%\nBližnjica: z +ZOOMPANEL_ZOOMFITCROPSCREEN;Prilagodi izrez zaslonu\nBližnjica: f +ZOOMPANEL_ZOOMFITSCREEN;Prilagodi celotno sliko zaslonu\nBližnjica: Alt-f +ZOOMPANEL_ZOOMIN;Zoom In\nBližnjica: + +ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - + +!!!!!!!!!!!!!!!!!!!!!!!!! +! Untranslated keys follow; remove the ! prefix after an entry is translated. +!!!!!!!!!!!!!!!!!!!!!!!!! + +!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations +!TP_SHARPENING_ITERCHECK;Auto limit iterations From f95acfe74ec940482d02011a970eb0cb61630d5d Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 2 Dec 2019 17:32:13 +0100 Subject: [PATCH 197/208] Multithread lensfun vignetting correction --- rtengine/lcp.cc | 22 +++++++++++++++++ rtengine/lcp.h | 11 +++++---- rtengine/rawimagesource.cc | 25 +++----------------- rtengine/rtlensfun.cc | 48 ++++++++++++++++++++++---------------- rtengine/rtlensfun.h | 5 ++-- 5 files changed, 62 insertions(+), 49 deletions(-) diff --git a/rtengine/lcp.cc b/rtengine/lcp.cc index 7fec79717..c80a126f5 100644 --- a/rtengine/lcp.cc +++ b/rtengine/lcp.cc @@ -1135,6 +1135,17 @@ void rtengine::LCPMapper::correctCA(double& x, double& y, int cx, int cy, int ch y -= cy; } +void rtengine::LCPMapper::processVignette(int width, int height, float** rawData) const +{ +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + + for (int y = 0; y < height; ++y) { + processVignetteLine(width, y, rawData[y]); + } +} + void rtengine::LCPMapper::processVignetteLine(int width, int y, float* line) const { // No need for swapXY, since vignette is in RAW and always before rotation @@ -1173,6 +1184,17 @@ void rtengine::LCPMapper::processVignetteLine(int width, int y, float* line) con } } +void rtengine::LCPMapper::processVignette3Channels(int width, int height, float** rawData) const +{ +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + + for (int y = 0; y < height; ++y) { + processVignetteLine3Channels(width, y, rawData[y]); + } +} + void rtengine::LCPMapper::processVignetteLine3Channels(int width, int y, float* line) const { // No need for swapXY, since vignette is in RAW and always before rotation diff --git a/rtengine/lcp.h b/rtengine/lcp.h index 69fd43932..a54d25148 100644 --- a/rtengine/lcp.h +++ b/rtengine/lcp.h @@ -172,8 +172,8 @@ public: virtual void correctDistortion(double &x, double &y, int cx, int cy, double scale) const = 0; virtual bool isCACorrectionAvailable() const = 0; virtual void correctCA(double &x, double &y, int cx, int cy, int channel) const = 0; - virtual void processVignetteLine(int width, int y, float *line) const = 0; - virtual void processVignetteLine3Channels(int width, int y, float *line) const = 0; + virtual void processVignette(int width, int height, float** rawData) const = 0; + virtual void processVignette3Channels(int width, int height, float** rawData) const = 0; }; @@ -200,8 +200,8 @@ public: void correctDistortion(double &x, double &y, int cx, int cy, double scale) const override; // MUST be the first stage bool isCACorrectionAvailable() const override; void correctCA(double& x, double& y, int cx, int cy, int channel) const override; - void processVignetteLine(int width, int y, float* line) const override; - void processVignetteLine3Channels(int width, int y, float* line) const override; + void processVignette(int width, int height, float** rawData) const override; + void processVignette3Channels(int width, int height, float** rawData) const override; private: bool enableCA; // is the mapper capable if CA correction? @@ -210,6 +210,9 @@ private: LCPModelCommon mc; LCPModelCommon chrom[3]; // in order RedGreen/Green/BlueGreen bool isFisheye; + + void processVignetteLine(int width, int y, float* line) const; + void processVignetteLine3Channels(int width, int y, float* line) const; }; } diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 265c226b3..ea3152918 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -1399,32 +1399,13 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le if (ri->getSensorType() == ST_BAYER || ri->getSensorType() == ST_FUJI_XTRANS || ri->get_colors() == 1) { if(numFrames == 4) { for(int i = 0; i < 4; ++i) { -#ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) -#endif - - for (int y = 0; y < H; y++) { - map.processVignetteLine(W, y, (*rawDataFrames[i])[y]); - } + map.processVignette(W, H, *rawDataFrames[i]); } } else { - -#ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) -#endif - - for (int y = 0; y < H; y++) { - map.processVignetteLine(W, y, rawData[y]); - } + map.processVignette(W, H, rawData); } } else if(ri->get_colors() == 3) { -#ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) -#endif - - for (int y = 0; y < H; y++) { - map.processVignetteLine3Channels(W, y, rawData[y]); - } + map.processVignette3Channels(W, H, rawData); } } } diff --git a/rtengine/rtlensfun.cc b/rtengine/rtlensfun.cc index 51b98080a..1596616dd 100644 --- a/rtengine/rtlensfun.cc +++ b/rtengine/rtlensfun.cc @@ -35,7 +35,6 @@ namespace rtengine LFModifier::~LFModifier() { if (data_) { - MyMutex::MyLock lock(lfModifierMutex); data_->Destroy(); } } @@ -78,11 +77,6 @@ bool LFModifier::isCACorrectionAvailable() const return (flags_ & LF_MODIFY_TCA); } -#ifdef __GNUC__ // silence warning, can be removed when function is implemented -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-parameter" -#endif - void LFModifier::correctCA(double &x, double &y, int cx, int cy, int channel) const { assert(channel >= 0 && channel <= 2); @@ -108,25 +102,39 @@ void LFModifier::correctCA(double &x, double &y, int cx, int cy, int channel) co y -= cy; } -#ifdef __GNUC__ -#pragma GCC diagnostic pop +#ifdef _OPENMP +void LFModifier::processVignette(int width, int height, float** rawData) const +{ + #pragma omp parallel for schedule(dynamic,16) + + for (int y = 0; y < height; ++y) { + data_->ApplyColorModification(rawData[y], 0, y, width, 1, LF_CR_1(INTENSITY), 0); + } +} +#else +void LFModifier::processVignette(int width, int height, float** rawData) const +{ + data_->ApplyColorModification(rawData[0], 0, 0, width, height, LF_CR_1(INTENSITY), width * sizeof(float)); +} + #endif - -void LFModifier::processVignetteLine(int width, int y, float *line) const +#ifdef _OPENMP +void LFModifier::processVignette3Channels(int width, int height, float** rawData) const { - MyMutex::MyLock lock(lfModifierMutex); - data_->ApplyColorModification(line, 0, y, width, 1, LF_CR_1(INTENSITY), 0); + #pragma omp parallel for schedule(dynamic,16) + + for (int y = 0; y < height; ++y) { + data_->ApplyColorModification(rawData[y], 0, y, width, 1, LF_CR_3(RED, GREEN, BLUE), 0); + } +} +#else +void LFModifier::processVignette3Channels(int width, int height, float** rawData) const +{ + data_->ApplyColorModification(rawData[y], 0, 0, width, height, LF_CR_3(RED, GREEN, BLUE), width * 3 * sizeof(float)); } - -void LFModifier::processVignetteLine3Channels(int width, int y, float *line) const -{ - MyMutex::MyLock lock(lfModifierMutex); - data_->ApplyColorModification(line, 0, y, width, 1, LF_CR_3(RED, GREEN, BLUE), 0); -} - - +#endif Glib::ustring LFModifier::getDisplayString() const { if (!data_) { diff --git a/rtengine/rtlensfun.h b/rtengine/rtlensfun.h index 06434c358..2f3e4677d 100644 --- a/rtengine/rtlensfun.h +++ b/rtengine/rtlensfun.h @@ -56,8 +56,8 @@ public: void correctDistortion(double &x, double &y, int cx, int cy, double scale) const override; bool isCACorrectionAvailable() const override; void correctCA(double &x, double &y, int cx, int cy, int channel) const override; - void processVignetteLine(int width, int y, float *line) const override; - void processVignetteLine3Channels(int width, int y, float *line) const override; + void processVignette(int width, int height, float** rawData) const override; + void processVignette3Channels(int width, int height, float** rawData) const override; Glib::ustring getDisplayString() const; @@ -68,7 +68,6 @@ private: lfModifier *data_; bool swap_xy_; int flags_; - mutable MyMutex lfModifierMutex; }; class LFCamera final From a2b0167339448af2697808941bb2f4b51a34c5f9 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 2 Dec 2019 19:46:00 +0100 Subject: [PATCH 198/208] Fix broken non OMP build --- rtengine/lcp.h | 1 - rtengine/rtlensfun.cc | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/rtengine/lcp.h b/rtengine/lcp.h index a54d25148..2e36fe113 100644 --- a/rtengine/lcp.h +++ b/rtengine/lcp.h @@ -20,7 +20,6 @@ #pragma once #include -#include #include #include #include diff --git a/rtengine/rtlensfun.cc b/rtengine/rtlensfun.cc index 1596616dd..7ffb9ad33 100644 --- a/rtengine/rtlensfun.cc +++ b/rtengine/rtlensfun.cc @@ -131,7 +131,7 @@ void LFModifier::processVignette3Channels(int width, int height, float** rawData #else void LFModifier::processVignette3Channels(int width, int height, float** rawData) const { - data_->ApplyColorModification(rawData[y], 0, 0, width, height, LF_CR_3(RED, GREEN, BLUE), width * 3 * sizeof(float)); + data_->ApplyColorModification(rawData[0], 0, 0, width, height, LF_CR_3(RED, GREEN, BLUE), width * 3 * sizeof(float)); } #endif From 49f5833002fbce0457fd0a13a85b20c9678187cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Wed, 4 Dec 2019 10:23:25 +0100 Subject: [PATCH 199/208] More `bool` and `const` (WIP) --- rtengine/canon_cr3_decoder.cc | 456 ++++++++++++++++------------------ 1 file changed, 215 insertions(+), 241 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index 6056f46bb..f436c759e 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -158,7 +158,7 @@ void DCraw::selectCRXTrack(unsigned short maxTrack) int tiff_idx = -1; std::int64_t tpixels = 0; - for (unsigned int i = 0; i < tiff_nifds; i++) { + for (unsigned int i = 0; i < tiff_nifds; ++i) { if (std::int64_t(tiff_ifd[i].height) * std::int64_t(tiff_ifd[i].height) > tpixels) { tpixels = std::int64_t(tiff_ifd[i].height) * std::int64_t(tiff_ifd[i].height); tiff_idx = i; @@ -381,7 +381,7 @@ int DCraw::parseCR3( szAtom = (static_cast(get4()) << 32) | get4(); oAtomContent = oAtom + 16; szAtomContent = szAtom - 16; - } else { + } else { oAtomContent = oAtom + 8; szAtomContent = szAtom - 8; } @@ -401,7 +401,7 @@ int DCraw::parseCR3( if (!strncmp(UIID, UIID_Canon, lHdr)) { AtomType = 1; - } else { + } else { fseek(ifp, -lHdr, SEEK_CUR); } } else if (!strcmp(AtomNameStack, "moovuuidCCTP")) { @@ -470,7 +470,7 @@ int DCraw::parseCR3( if (szAtomContent >= 16) { fseek(ifp, 12L, SEEK_CUR); lHdr = 8; - } else { + } else { err = -7; goto fin; } @@ -486,7 +486,7 @@ int DCraw::parseCR3( err = -8; goto fin; } - } else { + } else { AtomType = 2; // only continue for CRAW lHdr = 0; } @@ -855,7 +855,7 @@ inline int crxBitstreamGetZeros(CrxBitstream* bitStrm) result = 31 - nonZeroBit; bitStrm->bitData <<= 32 - nonZeroBit; bitStrm->bitsLeft -= 32 - nonZeroBit; - } else { + } else { std::uint32_t bitsLeft = bitStrm->bitsLeft; while (true) { @@ -950,7 +950,7 @@ inline std::int32_t crxPredictKParameter(std::int32_t prevK, std::int32_t bitCod : maxVal; } -inline void crxDecodeSymbolL1(CrxBandParam* param, std::int32_t doMedianPrediction, bool notEOL = false) +inline void crxDecodeSymbolL1(CrxBandParam* param, bool doMedianPrediction, bool notEOL = false) { if (doMedianPrediction) { const std::int32_t delta = param->lineBuf0[1] - param->lineBuf0[0]; @@ -965,7 +965,7 @@ inline void crxDecodeSymbolL1(CrxBandParam* param, std::int32_t doMedianPredicti (((param->lineBuf0[0] < param->lineBuf1[0]) ^ (delta < 0)) << 1) + ((param->lineBuf1[0] < param->lineBuf0[1]) ^ (delta < 0)) ]; - } else { + } else { param->lineBuf1[1] = param->lineBuf0[1]; } @@ -1002,7 +1002,7 @@ bool crxDecodeLine(CrxBandParam* param) for (; length > 1; --length) { if (param->lineBuf1[0] != param->lineBuf0[1] || param->lineBuf1[0] != param->lineBuf0[2]) { - crxDecodeSymbolL1(param, 1, true); + crxDecodeSymbolL1(param, true, true); } else { int nSyms = 0; @@ -1053,13 +1053,13 @@ bool crxDecodeLine(CrxBandParam* param) } if (length > 0) { - crxDecodeSymbolL1(param, 0, length > 1); + crxDecodeSymbolL1(param, false, length > 1); } } } if (length == 1) { - crxDecodeSymbolL1(param, 1, false); + crxDecodeSymbolL1(param, true, false); } param->lineBuf1[1] = param->lineBuf1[0] + 1; @@ -1197,19 +1197,18 @@ bool crxDecodeLineRounded(CrxBandParam* param) return true; } -int crxDecodeLineNoRefPrevLine(CrxBandParam* param) +bool crxDecodeLineNoRefPrevLine(CrxBandParam* param) { std::int32_t i = 0; - for (; i < param->subbandWidth - 1; i++) { - if (param->lineBuf0[i + 2] | param->lineBuf0[i + 1] | param->lineBuf1[i]) { + for (; i < param->subbandWidth - 1; ++i) { + if (param->lineBuf0[i + 2] || param->lineBuf0[i + 1] || param->lineBuf1[i]) { std::uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); } else if (param->kParam) { - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); } param->lineBuf1[i + 1] = -(bitCode & 1) ^ (bitCode >> 1); @@ -1219,10 +1218,10 @@ int crxDecodeLineNoRefPrevLine(CrxBandParam* param) if (param->kParam >= 15) { param->kParam = 15; } - } else { + } else { ++param->kParam; } - } else { + } else { int nSyms = 0; if (crxBitstreamGetBits(¶m->bitStream, 1)) { @@ -1257,11 +1256,11 @@ int crxDecodeLineNoRefPrevLine(CrxBandParam* param) } if (i + nSyms > param->subbandWidth) { - return -1; + return false; } } } else if (i > param->subbandWidth) { - return -1; + return false; } if (nSyms > 0) { @@ -1277,8 +1276,7 @@ int crxDecodeLineNoRefPrevLine(CrxBandParam* param) if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); } else if (param->kParam) { - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); } param->lineBuf1[i + 1] = -((bitCode + 1) & 1) ^ ((bitCode + 1) >> 1); @@ -1287,14 +1285,13 @@ int crxDecodeLineNoRefPrevLine(CrxBandParam* param) } continue; - } else { + } else { std::uint32_t bitCode = crxBitstreamGetZeros(¶m->bitStream); if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); } else if (param->kParam) { - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); } param->lineBuf1[i + 1] = -((bitCode + 1) & 1) ^ ((bitCode + 1) >> 1); @@ -1304,7 +1301,7 @@ int crxDecodeLineNoRefPrevLine(CrxBandParam* param) if (param->kParam >= 15) { param->kParam = 15; } - } else { + } else { ++param->kParam; } } @@ -1319,8 +1316,7 @@ int crxDecodeLineNoRefPrevLine(CrxBandParam* param) if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); } else if (param->kParam) { - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); } param->lineBuf1[i + 1] = -(bitCode & 1) ^ (bitCode >> 1); @@ -1328,10 +1324,10 @@ int crxDecodeLineNoRefPrevLine(CrxBandParam* param) param->lineBuf2[i] = param->kParam; } - return 0; + return true; } -int crxDecodeTopLine(CrxBandParam* param) +bool crxDecodeTopLine(CrxBandParam* param) { param->lineBuf1[0] = 0; @@ -1374,7 +1370,7 @@ int crxDecodeTopLine(CrxBandParam* param) } if (nSyms > length) { - return -1; + return false; } } @@ -1399,8 +1395,7 @@ int crxDecodeTopLine(CrxBandParam* param) if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); } else if (param->kParam) { - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); } param->lineBuf1[1] += -(bitCode & 1) ^ (bitCode >> 1); @@ -1415,8 +1410,7 @@ int crxDecodeTopLine(CrxBandParam* param) if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); } else if (param->kParam) { - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); } param->lineBuf1[1] += -(bitCode & 1) ^ (bitCode >> 1); @@ -1426,10 +1420,10 @@ int crxDecodeTopLine(CrxBandParam* param) param->lineBuf1[1] = param->lineBuf1[0] + 1; - return 0; + return true; } -int crxDecodeTopLineRounded(CrxBandParam* param) +bool crxDecodeTopLineRounded(CrxBandParam* param) { param->lineBuf1[0] = 0; @@ -1472,7 +1466,7 @@ int crxDecodeTopLineRounded(CrxBandParam* param) } if (nSyms > length) { - return -1; + return false; } } } @@ -1497,11 +1491,10 @@ int crxDecodeTopLineRounded(CrxBandParam* param) if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); } else if (param->kParam) { - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); } - std::int32_t sVal = -(bitCode & 1) ^ (bitCode >> 1); + const std::int32_t sVal = -(bitCode & 1) ^ (bitCode >> 1); param->lineBuf1[1] += param->roundedBitsMask * 2 * sVal + (sVal >> 31); param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); ++param->lineBuf1; @@ -1513,11 +1506,10 @@ int crxDecodeTopLineRounded(CrxBandParam* param) if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); } else if (param->kParam) { - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); } - std::int32_t sVal = -(bitCode & 1) ^ (bitCode >> 1); + const std::int32_t sVal = -(bitCode & 1) ^ (bitCode >> 1); param->lineBuf1[1] += param->roundedBitsMask * 2 * sVal + (sVal >> 31); param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); ++param->lineBuf1; @@ -1525,7 +1517,7 @@ int crxDecodeTopLineRounded(CrxBandParam* param) param->lineBuf1[1] = param->lineBuf1[0] + 1; - return 0; + return true; } bool crxDecodeTopLineNoRefPrevLine(CrxBandParam* param) @@ -1541,13 +1533,12 @@ bool crxDecodeTopLineNoRefPrevLine(CrxBandParam* param) if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); } else if (param->kParam) { - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); } param->lineBuf1[1] = -(bitCode & 1) ^ (bitCode >> 1); param->kParam = crxPredictKParameter(param->kParam, bitCode, 15); - } else { + } else { int nSyms = 0; if (crxBitstreamGetBits(¶m->bitStream, 1)) { @@ -1604,8 +1595,7 @@ bool crxDecodeTopLineNoRefPrevLine(CrxBandParam* param) if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); } else if (param->kParam) { - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); } param->lineBuf1[1] = -((bitCode + 1) & 1) ^ ((bitCode + 1) >> 1); @@ -1623,8 +1613,7 @@ bool crxDecodeTopLineNoRefPrevLine(CrxBandParam* param) if (bitCode >= 41) { bitCode = crxBitstreamGetBits(¶m->bitStream, 21); } else if (param->kParam) { - bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | - (bitCode << param->kParam); + bitCode = crxBitstreamGetBits(¶m->bitStream, param->kParam) | (bitCode << param->kParam); } param->lineBuf1[1] = -(bitCode & 1) ^ (bitCode >> 1); @@ -1658,15 +1647,15 @@ bool crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) if (param->roundedBitsMask <= 0) { param->lineBuf0 = param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; - std::int32_t* const lineBuf = param->lineBuf1 + 1; + const std::int32_t* const lineBuf = param->lineBuf1 + 1; - if (crxDecodeTopLine(param)) { + if (!crxDecodeTopLine(param)) { return false; } memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(std::int32_t)); ++param->curLine; - } else { + } else { param->roundedBits = 1; if (param->roundedBitsMask & ~1) { @@ -1677,20 +1666,20 @@ bool crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) param->lineBuf0 = param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; - std::int32_t* lineBuf = param->lineBuf1 + 1; + const std::int32_t* const lineBuf = param->lineBuf1 + 1; - if (crxDecodeTopLineRounded(param)) { + if (!crxDecodeTopLineRounded(param)) { return false; } memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(std::int32_t)); ++param->curLine; } - } else { + } else { param->lineBuf2 = param->nonProgrData; param->lineBuf0 = param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; - std::int32_t* lineBuf = param->lineBuf1 + 1; + const std::int32_t* const lineBuf = param->lineBuf1 + 1; if (!crxDecodeTopLineNoRefPrevLine(param)) { return false; @@ -1700,37 +1689,37 @@ bool crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) ++param->curLine; } } else if (!param->supportsPartial) { - std::int32_t lineLength = param->subbandWidth + 2; + const std::int32_t lineLength = param->subbandWidth + 2; param->lineBuf2 = param->nonProgrData; if (param->curLine & 1) { param->lineBuf1 = param->paramData; param->lineBuf0 = param->lineBuf1 + lineLength; - } else { + } else { param->lineBuf0 = param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; } - std::int32_t* lineBuf = param->lineBuf1 + 1; + const std::int32_t* const lineBuf = param->lineBuf1 + 1; - if (crxDecodeLineNoRefPrevLine(param)) { + if (!crxDecodeLineNoRefPrevLine(param)) { return false; } memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(std::int32_t)); ++param->curLine; } else if (param->roundedBitsMask <= 0) { - std::int32_t lineLength = param->subbandWidth + 2; + const std::int32_t lineLength = param->subbandWidth + 2; if (param->curLine & 1) { param->lineBuf1 = param->paramData; param->lineBuf0 = param->lineBuf1 + lineLength; - } else { + } else { param->lineBuf0 = param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; } - std::int32_t* lineBuf = param->lineBuf1 + 1; + const std::int32_t* const lineBuf = param->lineBuf1 + 1; if (!crxDecodeLine(param)) { return false; @@ -1738,18 +1727,18 @@ bool crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(std::int32_t)); ++param->curLine; - } else { - std::int32_t lineLength = param->subbandWidth + 2; + } else { + const std::int32_t lineLength = param->subbandWidth + 2; if (param->curLine & 1) { param->lineBuf1 = param->paramData; param->lineBuf0 = param->lineBuf1 + lineLength; - } else { + } else { param->lineBuf0 = param->paramData; param->lineBuf1 = param->lineBuf0 + lineLength; } - std::int32_t* lineBuf = param->lineBuf1 + 1; + const std::int32_t* const lineBuf = param->lineBuf1 + 1; if (!crxDecodeLineRounded(param)) { return false; @@ -1762,13 +1751,13 @@ bool crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) return true; } -int crxDecodeLineWithIQuantization(CrxSubband* subband) +bool crxDecodeLineWithIQuantization(CrxSubband* subband) { - std::int32_t q_step_tbl[6] = {0x28, 0x2D, 0x33, 0x39, 0x40, 0x48}; + constexpr std::int32_t q_step_tbl[6] = {0x28, 0x2D, 0x33, 0x39, 0x40, 0x48}; if (!subband->dataSize) { memset(subband->bandBuf, 0, subband->bandSize); - return 0; + return true; } if (subband->supportsPartial) { @@ -1777,49 +1766,48 @@ int crxDecodeLineWithIQuantization(CrxSubband* subband) if (bitCode >= 23) { bitCode = crxBitstreamGetBits(&subband->bandParam->bitStream, 8); } else if (subband->paramK) { - bitCode = - crxBitstreamGetBits(&subband->bandParam->bitStream, subband->paramK) | - (bitCode << subband->paramK); + bitCode = crxBitstreamGetBits(&subband->bandParam->bitStream, subband->paramK) | (bitCode << subband->paramK); } - subband->quantValue += - -(bitCode & 1) ^ (bitCode >> 1);// converting encoded to signed integer + subband->quantValue += -(bitCode & 1) ^ (bitCode >> 1);// converting encoded to signed integer subband->paramK = crxPredictKParameter(subband->paramK, bitCode); if (subband->paramK > 7) { - return -1; + return false; } } if (!crxDecodeLine(subband->bandParam, subband->bandBuf)) { - return -1; + return false; } if (subband->width <= 0) { - return 0LL; + return true; } // update subband buffers - std::int32_t* bandBuf = reinterpret_cast(subband->bandBuf); - std::int32_t qScale = - q_step_tbl[subband->quantValue % 6] >> (6 - subband->quantValue / 6); + std::int32_t* const bandBuf = reinterpret_cast(subband->bandBuf); + std::int32_t qScale = q_step_tbl[subband->quantValue % 6] >> (6 - subband->quantValue / 6); if (subband->quantValue / 6 >= 6) { - qScale = q_step_tbl[subband->quantValue % 6] * - (1 << (subband->quantValue / 6 + 26)); + qScale = q_step_tbl[subband->quantValue % 6] * (1 << (subband->quantValue / 6 + 26)); } if (qScale != 1) { - for (std::int32_t i = 0; i < subband->width; i++) { + for (std::int32_t i = 0; i < subband->width; ++i) { bandBuf[i] *= qScale; } } - return 0; + return true; } -void crxHorizontal53(std::int32_t* lineBufLA, std::int32_t* lineBufLB, - CrxWaveletTransform* wavelet, std::uint32_t tileFlag) +void crxHorizontal53( + std::int32_t* lineBufLA, + std::int32_t* lineBufLB, + CrxWaveletTransform* wavelet, + std::uint32_t tileFlag +) { std::int32_t* band0Buf = wavelet->subband0Buf; std::int32_t* band1Buf = wavelet->subband1Buf; @@ -1829,13 +1817,13 @@ void crxHorizontal53(std::int32_t* lineBufLA, std::int32_t* lineBufLB, if (wavelet->width <= 1) { lineBufLA[0] = band0Buf[0]; lineBufLB[0] = band2Buf[0]; - } else { + } else { if (tileFlag & E_HAS_TILES_ON_THE_LEFT) { lineBufLA[0] = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); lineBufLB[0] = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); ++band1Buf; ++band3Buf; - } else { + } else { lineBufLA[0] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); lineBufLB[0] = band2Buf[0] - ((band3Buf[0] + 1) >> 1); } @@ -1861,10 +1849,10 @@ void crxHorizontal53(std::int32_t* lineBufLA, std::int32_t* lineBufLB, } if (tileFlag & E_HAS_TILES_ON_THE_RIGHT) { - std::int32_t deltaA = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + const std::int32_t deltaA = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); lineBufLA[1] = band1Buf[0] + ((deltaA + lineBufLA[0]) >> 1); - std::int32_t deltaB = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + const std::int32_t deltaB = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); lineBufLB[1] = band3Buf[0] + ((deltaB + lineBufLB[0]) >> 1); if (wavelet->width & 1) { @@ -1872,16 +1860,12 @@ void crxHorizontal53(std::int32_t* lineBufLA, std::int32_t* lineBufLB, lineBufLB[2] = deltaB; } } else if (wavelet->width & 1) { - lineBufLA[1] = - band1Buf[0] + - ((lineBufLA[0] + band0Buf[0] - ((band1Buf[0] + 1) >> 1)) >> 1); + lineBufLA[1] = band1Buf[0] + ((lineBufLA[0] + band0Buf[0] - ((band1Buf[0] + 1) >> 1)) >> 1); lineBufLA[2] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); - lineBufLB[1] = - band3Buf[0] + - ((lineBufLB[0] + band2Buf[0] - ((band3Buf[0] + 1) >> 1)) >> 1); + lineBufLB[1] = band3Buf[0] + ((lineBufLB[0] + band2Buf[0] - ((band3Buf[0] + 1) >> 1)) >> 1); lineBufLB[2] = band2Buf[0] - ((band3Buf[0] + 1) >> 1); - } else { + } else { lineBufLA[1] = lineBufLA[0] + band1Buf[0]; lineBufLB[1] = lineBufLB[0] + band3Buf[0]; } @@ -1890,64 +1874,62 @@ void crxHorizontal53(std::int32_t* lineBufLA, std::int32_t* lineBufLB, std::int32_t* crxIdwt53FilterGetLine(CrxPlaneComp* comp, std::int32_t level) { - std::int32_t* result = comp->waveletTransform[level] - .lineBuf[(comp->waveletTransform[level].fltTapH - - comp->waveletTransform[level].curH + 5) % - 5 + - 3]; - comp->waveletTransform[level].curH--; + std::int32_t* const result = comp->waveletTransform[level].lineBuf[ + (comp->waveletTransform[level].fltTapH - comp->waveletTransform[level].curH + 5) % 5 + 3 + ]; + --comp->waveletTransform[level].curH; return result; } -int crxIdwt53FilterDecode(CrxPlaneComp* comp, std::int32_t level) +bool crxIdwt53FilterDecode(CrxPlaneComp* comp, std::int32_t level) { if (comp->waveletTransform[level].curH) { - return 0; + return true; } - CrxSubband* sband = comp->subBands + 3 * level; + CrxSubband* const sband = comp->subBands + 3 * level; - if (comp->waveletTransform[level].height - 3 <= - comp->waveletTransform[level].curLine && - !(comp->tileFlag & E_HAS_TILES_ON_THE_BOTTOM)) { + if (comp->waveletTransform[level].height - 3 <= comp->waveletTransform[level].curLine && !(comp->tileFlag & E_HAS_TILES_ON_THE_BOTTOM)) { if (comp->waveletTransform[level].height & 1) { if (level) { - if (crxIdwt53FilterDecode(comp, level - 1)) { - return -1; + if (!crxIdwt53FilterDecode(comp, level - 1)) { + return false; } - } else if (crxDecodeLineWithIQuantization(sband)) { - return -1; + } else if (!crxDecodeLineWithIQuantization(sband)) { + return false; } - if (crxDecodeLineWithIQuantization(sband + 1)) { - return -1; + if (!crxDecodeLineWithIQuantization(sband + 1)) { + return false; } } - } else { + } else { if (level) { - if (crxIdwt53FilterDecode(comp, level - 1)) { - return -1; + if (!crxIdwt53FilterDecode(comp, level - 1)) { + return false; } - } else if (crxDecodeLineWithIQuantization(sband)) {// LL band - return -1; + } else if (!crxDecodeLineWithIQuantization(sband)) { // LL band + return false; } - if (crxDecodeLineWithIQuantization(sband + 1) ||// HL band - crxDecodeLineWithIQuantization(sband + 2) ||// LH band - crxDecodeLineWithIQuantization(sband + 3)) {// HH band - return -1; + if ( + !crxDecodeLineWithIQuantization(sband + 1) // HL band + || !crxDecodeLineWithIQuantization(sband + 2) // LH band + || !crxDecodeLineWithIQuantization(sband + 3) // HH band + ) { + return false; } } - return 0; + return true; } -int crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) +bool crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) { - CrxWaveletTransform* wavelet = comp->waveletTransform + level; + CrxWaveletTransform* const wavelet = comp->waveletTransform + level; if (wavelet->curH) { - return 0; + return true; } if (wavelet->curLine >= wavelet->height - 3) { @@ -1955,19 +1937,19 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) if (wavelet->height & 1) { if (level) { if (!wavelet[-1].curH) { - if (crxIdwt53FilterTransform(comp, level - 1)) { - return -1; + if (!crxIdwt53FilterTransform(comp, level - 1)) { + return false; } } wavelet->subband0Buf = crxIdwt53FilterGetLine(comp, level - 1); } - std::int32_t* band0Buf = wavelet->subband0Buf; - std::int32_t* band1Buf = wavelet->subband1Buf; - std::int32_t* lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; - std::int32_t* lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; - std::int32_t* lineBufH2 = wavelet->lineBuf[(wavelet->fltTapH + 2) % 5 + 3]; + const std::int32_t* band0Buf = wavelet->subband0Buf; + const std::int32_t* band1Buf = wavelet->subband1Buf; + const std::int32_t* const lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; + std::int32_t* const lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; + std::int32_t* const lineBufH2 = wavelet->lineBuf[(wavelet->fltTapH + 2) % 5 + 3]; std::int32_t* lineBufL0 = wavelet->lineBuf[0]; std::int32_t* lineBufL1 = wavelet->lineBuf[1]; @@ -1977,19 +1959,18 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) // process L bands if (wavelet->width <= 1) { lineBufL0[0] = band0Buf[0]; - } else { + } else { if (comp->tileFlag & E_HAS_TILES_ON_THE_LEFT) { lineBufL0[0] = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); ++band1Buf; - } else { + } else { lineBufL0[0] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); } ++band0Buf; for (int i = 0; i < wavelet->width - 3; i += 2) { - std::int32_t delta = - band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + const std::int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); lineBufL0[1] = band1Buf[0] + ((lineBufL0[0] + delta) >> 1); lineBufL0[2] = delta; ++band0Buf; @@ -1998,18 +1979,17 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) } if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) { - std::int32_t delta = - band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + const std::int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); lineBufL0[1] = band1Buf[0] + ((lineBufL0[0] + delta) >> 1); if (wavelet->width & 1) { lineBufL0[2] = delta; } } else if (wavelet->width & 1) { - std::int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + const std::int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); lineBufL0[1] = band1Buf[0] + ((lineBufL0[0] + delta) >> 1); lineBufL0[2] = delta; - } else { + } else { lineBufL0[1] = band1Buf[0] + lineBufL0[0]; } } @@ -2018,8 +1998,8 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) lineBufL0 = wavelet->lineBuf[0]; lineBufL1 = wavelet->lineBuf[1]; - for (std::int32_t i = 0; i < wavelet->width; i++) { - std::int32_t delta = lineBufL0[i] - ((lineBufL1[i] + 1) >> 1); + for (std::int32_t i = 0; i < wavelet->width; ++i) { + const std::int32_t delta = lineBufL0[i] - ((lineBufL1[i] + 1) >> 1); lineBufH1[i] = lineBufL1[i] + ((delta + lineBufH0[i]) >> 1); lineBufH2[i] = delta; } @@ -2027,14 +2007,14 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) wavelet->curH += 3; wavelet->curLine += 3; wavelet->fltTapH = (wavelet->fltTapH + 3) % 5; - } else { - std::int32_t* lineBufL2 = wavelet->lineBuf[2]; - std::int32_t* lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; - std::int32_t* lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; + } else { + std::int32_t* const lineBufL2 = wavelet->lineBuf[2]; + const std::int32_t* const lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; + std::int32_t* const lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; wavelet->lineBuf[1] = lineBufL2; wavelet->lineBuf[2] = wavelet->lineBuf[1]; - for (std::int32_t i = 0; i < wavelet->width; i++) { + for (std::int32_t i = 0; i < wavelet->width; ++i) { lineBufH1[i] = lineBufH0[i] + lineBufL2[i]; } @@ -2043,26 +2023,26 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) wavelet->fltTapH = (wavelet->fltTapH + 2) % 5; } } - } else { + } else { if (level) { - if (!wavelet[-1].curH && crxIdwt53FilterTransform(comp, level - 1)) { - return -1; + if (!wavelet[-1].curH && !crxIdwt53FilterTransform(comp, level - 1)) { + return false; } wavelet->subband0Buf = crxIdwt53FilterGetLine(comp, level - 1); } - std::int32_t* band0Buf = wavelet->subband0Buf; - std::int32_t* band1Buf = wavelet->subband1Buf; - std::int32_t* band2Buf = wavelet->subband2Buf; - std::int32_t* band3Buf = wavelet->subband3Buf; + const std::int32_t* band0Buf = wavelet->subband0Buf; + const std::int32_t* band1Buf = wavelet->subband1Buf; + const std::int32_t* band2Buf = wavelet->subband2Buf; + const std::int32_t* band3Buf = wavelet->subband3Buf; std::int32_t* lineBufL0 = wavelet->lineBuf[0]; std::int32_t* lineBufL1 = wavelet->lineBuf[1]; - std::int32_t* lineBufL2 = wavelet->lineBuf[2]; - std::int32_t* lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; - std::int32_t* lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; - std::int32_t* lineBufH2 = wavelet->lineBuf[(wavelet->fltTapH + 2) % 5 + 3]; + const std::int32_t* lineBufL2 = wavelet->lineBuf[2]; + const std::int32_t* const lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; + std::int32_t* const lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; + std::int32_t* const lineBufH2 = wavelet->lineBuf[(wavelet->fltTapH + 2) % 5 + 3]; wavelet->lineBuf[1] = wavelet->lineBuf[2]; wavelet->lineBuf[2] = lineBufL1; @@ -2071,13 +2051,13 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) if (wavelet->width <= 1) { lineBufL0[0] = band0Buf[0]; lineBufL1[0] = band2Buf[0]; - } else { + } else { if (comp->tileFlag & E_HAS_TILES_ON_THE_LEFT) { lineBufL0[0] = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); lineBufL1[0] = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); ++band1Buf; ++band3Buf; - } else { + } else { lineBufL0[0] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); lineBufL1[0] = band2Buf[0] - ((band3Buf[0] + 1) >> 1); } @@ -2103,10 +2083,10 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) } if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) { - std::int32_t deltaA = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + const std::int32_t deltaA = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); lineBufL0[1] = band1Buf[0] + ((deltaA + lineBufL0[0]) >> 1); - std::int32_t deltaB = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + const std::int32_t deltaB = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); lineBufL1[1] = band3Buf[0] + ((deltaB + lineBufL1[0]) >> 1); if (wavelet->width & 1) { @@ -2121,7 +2101,7 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) delta = band2Buf[0] - ((band3Buf[0] + 1) >> 1); lineBufL1[1] = band3Buf[0] + ((delta + lineBufL1[0]) >> 1); lineBufL1[2] = delta; - } else { + } else { lineBufL0[1] = lineBufL0[0] + band1Buf[0]; lineBufL1[1] = lineBufL1[0] + band3Buf[0]; } @@ -2132,8 +2112,8 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) lineBufL1 = wavelet->lineBuf[1]; lineBufL2 = wavelet->lineBuf[2]; - for (std::int32_t i = 0; i < wavelet->width; i++) { - std::int32_t delta = lineBufL0[i] - ((lineBufL2[i] + lineBufL1[i] + 2) >> 2); + for (std::int32_t i = 0; i < wavelet->width; ++i) { + const std::int32_t delta = lineBufL0[i] - ((lineBufL2[i] + lineBufL1[i] + 2) >> 2); lineBufH1[i] = lineBufL1[i] + ((delta + lineBufH0[i]) >> 1); lineBufH2[i] = delta; } @@ -2142,56 +2122,55 @@ int crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) wavelet->curH += 3; wavelet->curLine += 3; wavelet->fltTapH = (wavelet->fltTapH + 3) % 5; - } else { + } else { wavelet->curH += 2; wavelet->curLine += 2; wavelet->fltTapH = (wavelet->fltTapH + 2) % 5; } } - return 0; + return true; } -int crxIdwt53FilterInitialize(CrxPlaneComp* comp, std::int32_t prevLevel) +bool crxIdwt53FilterInitialize(CrxPlaneComp* comp, std::int32_t prevLevel) { if (prevLevel < 0) { - return 0; + return true; } - for (int curLevel = 0, curBand = 0; curLevel < prevLevel + 1; - curLevel++, curBand += 3) { - CrxWaveletTransform* wavelet = comp->waveletTransform + curLevel; + for (int curLevel = 0, curBand = 0; curLevel < prevLevel + 1; ++curLevel, curBand += 3) { + CrxWaveletTransform* const wavelet = comp->waveletTransform + curLevel; if (curLevel) { wavelet[0].subband0Buf = crxIdwt53FilterGetLine(comp, curLevel - 1); - } else if (crxDecodeLineWithIQuantization(comp->subBands + curBand)) { - return -1; + } else if (!crxDecodeLineWithIQuantization(comp->subBands + curBand)) { + return false; } std::int32_t* lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; if (wavelet->height > 1) { - if (crxDecodeLineWithIQuantization(comp->subBands + curBand + 1) || - crxDecodeLineWithIQuantization(comp->subBands + curBand + 2) || - crxDecodeLineWithIQuantization(comp->subBands + curBand + 3)) { - return -1; + if ( + !crxDecodeLineWithIQuantization(comp->subBands + curBand + 1) + || !crxDecodeLineWithIQuantization(comp->subBands + curBand + 2) + || !crxDecodeLineWithIQuantization(comp->subBands + curBand + 3) + ) { + return false; } - std::int32_t* lineBufL0 = wavelet->lineBuf[0]; - std::int32_t* lineBufL1 = wavelet->lineBuf[1]; + std::int32_t* const lineBufL0 = wavelet->lineBuf[0]; + const std::int32_t* const lineBufL1 = wavelet->lineBuf[1]; std::int32_t* lineBufL2 = wavelet->lineBuf[2]; if (comp->tileFlag & E_HAS_TILES_ON_THE_TOP) { - crxHorizontal53(lineBufL0, wavelet->lineBuf[1], wavelet, - comp->tileFlag); + crxHorizontal53(lineBufL0, wavelet->lineBuf[1], wavelet, comp->tileFlag); - if (crxDecodeLineWithIQuantization(comp->subBands + curBand + 3) || - crxDecodeLineWithIQuantization(comp->subBands + curBand + 2)) { - return -1; + if (!crxDecodeLineWithIQuantization(comp->subBands + curBand + 3)|| !crxDecodeLineWithIQuantization(comp->subBands + curBand + 2)) { + return false; } - std::int32_t* band2Buf = wavelet->subband2Buf; - std::int32_t* band3Buf = wavelet->subband3Buf; + const std::int32_t* band2Buf = wavelet->subband2Buf; + const std::int32_t* band3Buf = wavelet->subband3Buf; // process L band if (wavelet->width <= 1) { @@ -2200,15 +2179,14 @@ int crxIdwt53FilterInitialize(CrxPlaneComp* comp, std::int32_t prevLevel) if (comp->tileFlag & E_HAS_TILES_ON_THE_LEFT) { lineBufL2[0] = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); ++band3Buf; - } else { + } else { lineBufL2[0] = band2Buf[0] - ((band3Buf[0] + 1) >> 1); } ++band2Buf; for (int i = 0; i < wavelet->width - 3; i += 2) { - std::int32_t delta = - band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + const std::int32_t delta = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); lineBufL2[1] = band3Buf[0] + ((lineBufL2[0] + delta) >> 1); lineBufL2[2] = delta; @@ -2218,48 +2196,44 @@ int crxIdwt53FilterInitialize(CrxPlaneComp* comp, std::int32_t prevLevel) } if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) { - std::int32_t delta = - band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); + const std::int32_t delta = band2Buf[0] - ((band3Buf[0] + band3Buf[1] + 2) >> 2); lineBufL2[1] = band3Buf[0] + ((lineBufL2[0] + delta) >> 1); if (wavelet->width & 1) { lineBufL2[2] = delta; } } else if (wavelet->width & 1) { - std::int32_t delta = band2Buf[0] - ((band3Buf[0] + 1) >> 1); + const std::int32_t delta = band2Buf[0] - ((band3Buf[0] + 1) >> 1); lineBufL2[1] = band3Buf[0] + ((lineBufL2[0] + delta) >> 1); lineBufL2[2] = delta; - } else { + } else { lineBufL2[1] = band3Buf[0] + lineBufL2[0]; } } // process H band - for (std::int32_t i = 0; i < wavelet->width; i++) { - lineBufH0[i] = - lineBufL0[i] - ((lineBufL1[i] + lineBufL2[i] + 2) >> 2); + for (std::int32_t i = 0; i < wavelet->width; ++i) { + lineBufH0[i] = lineBufL0[i] - ((lineBufL1[i] + lineBufL2[i] + 2) >> 2); } - } else { - crxHorizontal53(lineBufL0, wavelet->lineBuf[2], wavelet, - comp->tileFlag); + } else { + crxHorizontal53(lineBufL0, wavelet->lineBuf[2], wavelet, comp->tileFlag); - for (int i = 0; i < wavelet->width; i++) { + for (int i = 0; i < wavelet->width; ++i) { lineBufH0[i] = lineBufL0[i] - ((lineBufL2[i] + 1) >> 1); } } - if (crxIdwt53FilterDecode(comp, curLevel) || - crxIdwt53FilterTransform(comp, curLevel)) { - return -1; + if (!crxIdwt53FilterDecode(comp, curLevel) || !crxIdwt53FilterTransform(comp, curLevel)) { + return false; } - } else { - if (crxDecodeLineWithIQuantization(comp->subBands + curBand + 1)) { - return -1; + } else { + if (!crxDecodeLineWithIQuantization(comp->subBands + curBand + 1)) { + return false; } - std::int32_t* band0Buf = wavelet->subband0Buf; - std::int32_t* band1Buf = wavelet->subband1Buf; + const std::int32_t* band0Buf = wavelet->subband0Buf; + const std::int32_t* band1Buf = wavelet->subband1Buf; // process H band if (wavelet->width <= 1) { @@ -2268,7 +2242,7 @@ int crxIdwt53FilterInitialize(CrxPlaneComp* comp, std::int32_t prevLevel) if (comp->tileFlag & E_HAS_TILES_ON_THE_LEFT) { lineBufH0[0] = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); ++band1Buf; - } else { + } else { lineBufH0[0] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); } @@ -2285,14 +2259,14 @@ int crxIdwt53FilterInitialize(CrxPlaneComp* comp, std::int32_t prevLevel) } if (comp->tileFlag & E_HAS_TILES_ON_THE_RIGHT) { - std::int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); + const std::int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); lineBufH0[1] = band1Buf[0] + ((lineBufH0[0] + delta) >> 1); lineBufH0[2] = delta; } else if (wavelet->width & 1) { - std::int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); + const std::int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); lineBufH0[1] = band1Buf[0] + ((lineBufH0[0] + delta) >> 1); lineBufH0[2] = delta; - } else { + } else { lineBufH0[1] = band1Buf[0] + lineBufH0[0]; } } @@ -2303,7 +2277,7 @@ int crxIdwt53FilterInitialize(CrxPlaneComp* comp, std::int32_t prevLevel) } } - return 0; + return true; } void crxFreeSubbandData(CrxImage* image, CrxPlaneComp* comp) @@ -2317,7 +2291,7 @@ void crxFreeSubbandData(CrxImage* image, CrxPlaneComp* comp) return; } - for (std::int32_t i = 0; i < image->subbandCount; i++) { + for (std::int32_t i = 0; i < image->subbandCount; ++i) { if (comp->subBands[i].bandParam) { free(comp->subBands[i].bandParam); comp->subBands[i].bandParam = nullptr; @@ -2340,7 +2314,7 @@ void crxConvertPlaneLine(CrxImage* img, int imageRow, int imageCol = 0, std::int32_t minVal = -maxVal; --maxVal; - for (int i = 0; i < lineLength; i++) { + for (int i = 0; i < lineLength; ++i) { img->outBufs[plane][rawOffset + 2 * i] = rtengine::LIM(lineData[i], minVal, maxVal); } @@ -2349,14 +2323,14 @@ void crxConvertPlaneLine(CrxImage* img, int imageRow, int imageCol = 0, rawOffset = plane * img->planeWidth * img->planeHeight + img->planeWidth * imageRow + imageCol; - for (int i = 0; i < lineLength; i++) { + for (int i = 0; i < lineLength; ++i) { img->planeBuf[rawOffset + i] = lineData[i]; } } else if (img->nPlanes == 4) { std::int32_t median = 1 << (img->nBits - 1); std::int32_t maxVal = (1 << img->nBits) - 1; - for (int i = 0; i < lineLength; i++) { + for (int i = 0; i < lineLength; ++i) { img->outBufs[plane][rawOffset + 2 * i] = rtengine::LIM(median + lineData[i], 0, maxVal); } @@ -2365,7 +2339,7 @@ void crxConvertPlaneLine(CrxImage* img, int imageRow, int imageCol = 0, std::int32_t median = 1 << (img->nBits - 1); rawOffset = img->planeWidth * imageRow + imageCol; - for (int i = 0; i < lineLength; i++) { + for (int i = 0; i < lineLength; ++i) { img->outBufs[0][rawOffset + i] = rtengine::LIM(median + lineData[i], 0, maxVal); } @@ -2382,7 +2356,7 @@ void crxConvertPlaneLine(CrxImage* img, int imageRow, int imageCol = 0, std::uint32_t rawLineOffset = 4 * img->planeWidth * imageRow; // for this stage - all except imageRow is ignored - for (int i = 0; i < img->planeWidth; i++) { + for (int i = 0; i < img->planeWidth; ++i) { std::int32_t gr = median + (plane0[i] << 10) - 168 * plane1[i] - 585 * plane3[i]; std::int32_t val = 0; @@ -2461,7 +2435,7 @@ int crxSetupSubbandData(CrxImage* img, CrxPlaneComp* planeComp, CrxSubband* subbands = planeComp->subBands; // calculate sizes - for (std::int32_t subbandNum = 0; subbandNum < toSubbands; subbandNum++) { + for (std::int32_t subbandNum = 0; subbandNum < toSubbands; ++subbandNum) { subbands[subbandNum].bandSize = subbands[subbandNum].width * sizeof(std::int32_t); // 4bytes compDataSize += subbands[subbandNum].bandSize; @@ -2496,7 +2470,7 @@ int crxSetupSubbandData(CrxImage* img, CrxPlaneComp* planeComp, std::uint64_t subbandMdatOffset = img->mdatOffset + mdatOffset; std::uint8_t* subbandBuf = planeComp->compBuf; - for (std::int32_t subbandNum = 0; subbandNum < toSubbands; subbandNum++) { + for (std::int32_t subbandNum = 0; subbandNum < toSubbands; ++subbandNum) { subbands[subbandNum].bandBuf = subbandBuf; subbandBuf += subbands[subbandNum].bandSize; subbands[subbandNum].mdatOffset = @@ -2518,7 +2492,7 @@ int crxSetupSubbandData(CrxImage* img, CrxPlaneComp* planeComp, if (level >= img->levels - 1) { waveletTransforms[level].height = tile->height; transformWidth = tile->width; - } else { + } else { waveletTransforms[level].height = subbands[band + 3].height; transformWidth = subbands[band + 4].width; } @@ -2553,7 +2527,7 @@ int crxSetupSubbandData(CrxImage* img, CrxPlaneComp* planeComp, } // decoding params and bitstream initialisation - for (std::int32_t subbandNum = 0; subbandNum < toSubbands; subbandNum++) { + for (std::int32_t subbandNum = 0; subbandNum < toSubbands; ++subbandNum) { if (subbands[subbandNum].dataSize) { std::int32_t supportsPartial = 0; std::uint32_t roundedBitsMask = 0; @@ -2582,10 +2556,10 @@ int DCraw::crxDecodePlane(void* p, std::uint32_t planeNumber) CrxImage* img = static_cast(p); int imageRow = 0; - for (int tRow = 0; tRow < img->tileRows; tRow++) { + for (int tRow = 0; tRow < img->tileRows; ++tRow) { int imageCol = 0; - for (int tCol = 0; tCol < img->tileCols; tCol++) { + for (int tCol = 0; tCol < img->tileCols; ++tCol) { CrxTile* tile = img->tiles + tRow * img->tileRows + tCol; CrxPlaneComp* planeComp = tile->comps + planeNumber; std::uint64_t tileMdatOffset = tile->dataOffset + planeComp->dataOffset; @@ -2596,13 +2570,13 @@ int DCraw::crxDecodePlane(void* p, std::uint32_t planeNumber) } if (img->levels) { - if (crxIdwt53FilterInitialize(planeComp, img->levels - 1)) { + if (!crxIdwt53FilterInitialize(planeComp, img->levels - 1)) { return -1; } for (int i = 0; i < tile->height; ++i) { - if (crxIdwt53FilterDecode(planeComp, img->levels - 1) || - crxIdwt53FilterTransform(planeComp, img->levels - 1)) { + if (!crxIdwt53FilterDecode(planeComp, img->levels - 1) || + !crxIdwt53FilterTransform(planeComp, img->levels - 1)) { return -1; } @@ -2611,7 +2585,7 @@ int DCraw::crxDecodePlane(void* p, std::uint32_t planeNumber) crxConvertPlaneLine(img, imageRow + i, imageCol, planeNumber, lineData, tile->width); } - } else { + } else { // we have the only subband in this case if (!planeComp->subBands->dataSize) { memset(planeComp->subBands->bandBuf, 0, @@ -2811,7 +2785,7 @@ int crxReadImageHeaders(crx_data_header_t* hdr, CrxImage* img, std::uint8_t* mda tile->tileFlag |= E_HAS_TILES_ON_THE_LEFT; } } - } else { + } else { // last tile in a tile row tile->width = img->planeWidth - hdr->tileWidth * (img->tileCols - 1); @@ -2831,7 +2805,7 @@ int crxReadImageHeaders(crx_data_header_t* hdr, CrxImage* img, std::uint8_t* mda tile->tileFlag |= E_HAS_TILES_ON_THE_TOP; } } - } else { + } else { // non first tile row tile->height = img->planeHeight - hdr->tileHeight * (img->tileRows - 1); @@ -3052,7 +3026,7 @@ int crxFreeImageData(CrxImage* img) if (img->tiles) { for (std::int32_t curTile = 0; curTile < nTiles; curTile++, tile++) { if (tile[curTile].comps) { - for (std::int32_t curPlane = 0; curPlane < img->nPlanes; curPlane++) { + for (std::int32_t curPlane = 0; curPlane < img->nPlanes; ++curPlane) { crxFreeSubbandData(img, tile[curTile].comps + curPlane); } } @@ -3212,7 +3186,7 @@ int DCraw::crxParseImageHeader(uchar* cmp1TagData, unsigned int nTrack) if (hdr->nBits > 15) { return -1; } - } else { + } else { if (hdr->encType && hdr->encType != 3) { return -1; } From 2ceda119128d2557289c699b1249a04b1723926b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Thu, 5 Dec 2019 09:54:16 +0100 Subject: [PATCH 200/208] Fix Apple build (fixes #5553) --- rtengine/improcfun.cc | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 40c2de0bd..cb0834570 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -17,34 +17,37 @@ * along with RawTherapee. If not, see . */ #include + #include #include + #ifdef _OPENMP #include #endif #include "alignedbuffer.h" +#include "calc_distort.h" +#include "ciecam02.h" #include "cieimage.h" -#include "labimage.h" -#include "rtengine.h" -#include "improcfun.h" +#include "clutstore.h" +#include "color.h" #include "curves.h" #include "dcp.h" +#include "EdgePreservingDecomposition.h" +#include "iccmatrices.h" #include "iccstore.h" #include "imagesource.h" -#include "rtthumbnail.h" -#include "utils.h" -#include "iccmatrices.h" -#include "color.h" -#include "calc_distort.h" -#include "rt_math.h" -#include "EdgePreservingDecomposition.h" #include "improccoordinator.h" -#include "clutstore.h" -#include "ciecam02.h" +#include "improcfun.h" +#include "labimage.h" +#include "procparams.h" +#include "rt_math.h" +#include "rtengine.h" +#include "rtthumbnail.h" #include "satandvalueblendingcurve.h" #include "StopWatch.h" -#include "procparams.h" +#include "utils.h" + #include "../rtgui/editcallbacks.h" #ifdef _DEBUG @@ -299,7 +302,7 @@ void ImProcFunctions::updateColorProfiles (const Glib::ustring& monitorProfile, #if !defined(__APPLE__) // No support for monitor profiles on OS X, all data is sRGB monitor = ICCStore::getInstance()->getProfile (monitorProfile); #else - monitor = ICCStore::getInstance()->getProfile (options.rtSettings.srgb); + monitor = ICCStore::getInstance()->getProfile (settings->srgb); #endif } From 7fd54cb56f45466b8269bbd838e7bbe303a04595 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 5 Dec 2019 16:40:44 +0100 Subject: [PATCH 201/208] white level for Fujifilm X10 --- rtengine/camconst.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index c0d833db7..90e7141fa 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -1288,6 +1288,11 @@ Camera constants: "ranges": { "white": 16100 } }, + { // Quality C + "make_model": "Fujifilm X10", + "ranges": { "white": 3788 } + }, + { // Quality B "make_model": "FUJIFILM X70", "dcraw_matrix": [ 10450,-4329,-878,-3217,11105,2421,-752,1758,6519 ], // DNG_v9.4 D65 From 170a3a18c5ffea3da0cf463d62086084e1658774 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 5 Dec 2019 17:15:06 +0100 Subject: [PATCH 202/208] white level for Fujifilm HS30EXR --- rtengine/camconst.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index 90e7141fa..8639ea2e1 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -1293,6 +1293,11 @@ Camera constants: "ranges": { "white": 3788 } }, + { // Quality C + "make_model": "Fujifilm HS30EXR", + "ranges": { "white": 3765 } + }, + { // Quality B "make_model": "FUJIFILM X70", "dcraw_matrix": [ 10450,-4329,-878,-3217,11105,2421,-752,1758,6519 ], // DNG_v9.4 D65 From 10b085b01e06b3094f298563085009d73501810c Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 5 Dec 2019 21:40:32 +0100 Subject: [PATCH 203/208] lmmse demosaic: own compilation unit and some cleanups --- rtengine/CMakeLists.txt | 1 + rtengine/demosaic_algos.cc | 985 ------------------------------------- rtengine/lmmse_demosaic.cc | 824 +++++++++++++++++++++++++++++++ rtengine/rawimagesource.h | 3 +- 4 files changed, 826 insertions(+), 987 deletions(-) create mode 100644 rtengine/lmmse_demosaic.cc diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt index f58afde5e..6bce68d1a 100644 --- a/rtengine/CMakeLists.txt +++ b/rtengine/CMakeLists.txt @@ -103,6 +103,7 @@ set(RTENGINESOURCEFILES labimage.cc lcp.cc lj92.c + lmmse_demosaic.cc loadinitial.cc myfile.cc panasonic_decoders.cc diff --git a/rtengine/demosaic_algos.cc b/rtengine/demosaic_algos.cc index d547d3431..c48a002fb 100644 --- a/rtengine/demosaic_algos.cc +++ b/rtengine/demosaic_algos.cc @@ -21,11 +21,9 @@ #include "rawimagesource.h" #include "rawimage.h" -#include "mytime.h" #include "rt_math.h" #include "color.h" #include "../rtgui/multilangmgr.h" -#include "sleef.h" #include "opthelper.h" #include "median.h" //#define BENCHMARK @@ -39,16 +37,6 @@ using namespace std; namespace rtengine { -#undef ABS - -#define ABS(a) ((a)<0?-(a):(a)) -#define CLIREF(x) LIM(x,-200000.0f,200000.0f) // avoid overflow : do not act directly on image[] or pix[] -#define x1125(a) (a + xdivf(a, 3)) -#define x0875(a) (a - xdivf(a, 3)) -#define x0250(a) xdivf(a, 2) -#define x00625(a) xdivf(a, 4) -#define x0125(a) xdivf(a, 3) - #undef fc #define fc(row,col) \ (ri->get_filters() >> ((((row) << 1 & 14) + ((col) & 1)) << 1) & 3) @@ -210,628 +198,6 @@ void RawImageSource::border_interpolate( int winw, int winh, int lborders, const } -// LSMME demosaicing algorithm -// L. Zhang and X. Wu, -// Color demozaicing via directional Linear Minimum Mean Square-error Estimation, -// IEEE Trans. on Image Processing, vol. 14, pp. 2167-2178, -// Dec. 2005. -// Adapted to RawTherapee by Jacques Desmis 3/2013 -// Improved speed and reduced memory consumption by Ingo Weyrich 2/2015 -//TODO Tiles to reduce memory consumption -void RawImageSource::lmmse_interpolate_omp(int winw, int winh, array2D &rawData, array2D &red, array2D &green, array2D &blue, int iterations) -{ - const int width = winw, height = winh; - const int ba = 10; - const int rr1 = height + 2 * ba; - const int cc1 = width + 2 * ba; - const int w1 = cc1; - const int w2 = 2 * w1; - const int w3 = 3 * w1; - const int w4 = 4 * w1; - float h0, h1, h2, h3, h4, hs; - h0 = 1.0f; - h1 = exp( -1.0f / 8.0f); - h2 = exp( -4.0f / 8.0f); - h3 = exp( -9.0f / 8.0f); - h4 = exp(-16.0f / 8.0f); - hs = h0 + 2.0f * (h1 + h2 + h3 + h4); - h0 /= hs; - h1 /= hs; - h2 /= hs; - h3 /= hs; - h4 /= hs; - int passref = 0; - int iter = 0; - - if(iterations <= 4) { - iter = iterations - 1; - passref = 0; - } else if (iterations <= 6) { - iter = 3; - passref = iterations - 4; - } else if (iterations <= 8) { - iter = 3; - passref = iterations - 6; - } - - bool applyGamma = true; - - if(iterations == 0) { - applyGamma = false; - iter = 0; - } else { - applyGamma = true; - } - - float *rix[5]; - float *qix[5]; - float *buffer = (float *)calloc(static_cast(rr1) * cc1 * 5 * sizeof(float), 1); - - if(buffer == nullptr) { // allocation of big block of memory failed, try to get 5 smaller ones - printf("lmmse_interpolate_omp: allocation of big memory block failed, try to get 5 smaller ones now...\n"); - bool allocationFailed = false; - - for(int i = 0; i < 5; i++) { - qix[i] = (float *)calloc(static_cast(rr1) * cc1 * sizeof(float), 1); - - if(!qix[i]) { // allocation of at least one small block failed - allocationFailed = true; - } - } - - if(allocationFailed) { // fall back to igv_interpolate - printf("lmmse_interpolate_omp: allocation of 5 small memory blocks failed, falling back to igv_interpolate...\n"); - - for(int i = 0; i < 5; i++) { // free the already allocated buffers - if(qix[i]) { - free(qix[i]); - } - } - - igv_interpolate(winw, winh); - return; - } - } else { - qix[0] = buffer; - - for(int i = 1; i < 5; i++) { - qix[i] = qix[i - 1] + rr1 * cc1; - } - } - - if (plistener) { - plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), M("TP_RAW_LMMSE"))); - plistener->setProgress (0.0); - } - - - LUTf *gamtab; - - if(applyGamma) { - gamtab = &(Color::gammatab_24_17a); - } else { - gamtab = new LUTf(65536, LUT_CLIP_ABOVE | LUT_CLIP_BELOW); - gamtab->makeIdentity(65535.f); - } - - -#ifdef _OPENMP - #pragma omp parallel private(rix) -#endif - { -#ifdef _OPENMP - #pragma omp for -#endif - - for (int rrr = ba; rrr < rr1 - ba; rrr++) { - for (int ccc = ba, row = rrr - ba; ccc < cc1 - ba; ccc++) { - int col = ccc - ba; - float *rix = qix[4] + rrr * cc1 + ccc; - rix[0] = (*gamtab)[rawData[row][col]]; - } - } - -#ifdef _OPENMP - #pragma omp single -#endif - { - if (plistener) { - plistener->setProgress (0.1); - } - } - - // G-R(B) -#ifdef _OPENMP - #pragma omp for schedule(dynamic,16) -#endif - - for (int rr = 2; rr < rr1 - 2; rr++) { - // G-R(B) at R(B) location - for (int cc = 2 + (FC(rr, 2) & 1); cc < cc1 - 2; cc += 2) { - rix[4] = qix[4] + rr * cc1 + cc; - float v0 = x00625(rix[4][-w1 - 1] + rix[4][-w1 + 1] + rix[4][w1 - 1] + rix[4][w1 + 1]) + x0250(rix[4][0]); - // horizontal - rix[0] = qix[0] + rr * cc1 + cc; - rix[0][0] = - x0250(rix[4][ -2] + rix[4][ 2]) + xdiv2f(rix[4][ -1] + rix[4][0] + rix[4][ 1]); - float Y = v0 + xdiv2f(rix[0][0]); - - if (rix[4][0] > 1.75f * Y) { - rix[0][0] = median(rix[0][0], rix[4][ -1], rix[4][ 1]); - } else { - rix[0][0] = LIM(rix[0][0], 0.0f, 1.0f); - } - - rix[0][0] -= rix[4][0]; - // vertical - rix[1] = qix[1] + rr * cc1 + cc; - rix[1][0] = -x0250(rix[4][-w2] + rix[4][w2]) + xdiv2f(rix[4][-w1] + rix[4][0] + rix[4][w1]); - Y = v0 + xdiv2f(rix[1][0]); - - if (rix[4][0] > 1.75f * Y) { - rix[1][0] = median(rix[1][0], rix[4][-w1], rix[4][w1]); - } else { - rix[1][0] = LIM(rix[1][0], 0.0f, 1.0f); - } - - rix[1][0] -= rix[4][0]; - } - - // G-R(B) at G location - for (int ccc = 2 + (FC(rr, 3) & 1); ccc < cc1 - 2; ccc += 2) { - rix[0] = qix[0] + rr * cc1 + ccc; - rix[1] = qix[1] + rr * cc1 + ccc; - rix[4] = qix[4] + rr * cc1 + ccc; - rix[0][0] = x0250(rix[4][ -2] + rix[4][ 2]) - xdiv2f(rix[4][ -1] + rix[4][0] + rix[4][ 1]); - rix[1][0] = x0250(rix[4][-w2] + rix[4][w2]) - xdiv2f(rix[4][-w1] + rix[4][0] + rix[4][w1]); - rix[0][0] = LIM(rix[0][0], -1.0f, 0.0f) + rix[4][0]; - rix[1][0] = LIM(rix[1][0], -1.0f, 0.0f) + rix[4][0]; - } - } - -#ifdef _OPENMP - #pragma omp single -#endif - { - if (plistener) { - plistener->setProgress (0.2); - } - } - - - // apply low pass filter on differential colors -#ifdef _OPENMP - #pragma omp for -#endif - - for (int rr = 4; rr < rr1 - 4; rr++) - for (int cc = 4; cc < cc1 - 4; cc++) { - rix[0] = qix[0] + rr * cc1 + cc; - rix[2] = qix[2] + rr * cc1 + cc; - rix[2][0] = h0 * rix[0][0] + h1 * (rix[0][ -1] + rix[0][ 1]) + h2 * (rix[0][ -2] + rix[0][ 2]) + h3 * (rix[0][ -3] + rix[0][ 3]) + h4 * (rix[0][ -4] + rix[0][ 4]); - rix[1] = qix[1] + rr * cc1 + cc; - rix[3] = qix[3] + rr * cc1 + cc; - rix[3][0] = h0 * rix[1][0] + h1 * (rix[1][-w1] + rix[1][w1]) + h2 * (rix[1][-w2] + rix[1][w2]) + h3 * (rix[1][-w3] + rix[1][w3]) + h4 * (rix[1][-w4] + rix[1][w4]); - } - -#ifdef _OPENMP - #pragma omp single -#endif - { - if (plistener) { - plistener->setProgress (0.3); - } - } - - // interpolate G-R(B) at R(B) -#ifdef _OPENMP - #pragma omp for -#endif - - for (int rr = 4; rr < rr1 - 4; rr++) { - int cc = 4 + (FC(rr, 4) & 1); -#ifdef __SSE2__ - __m128 p1v, p2v, p3v, p4v, p5v, p6v, p7v, p8v, p9v, muv, vxv, vnv, xhv, vhv, xvv, vvv; - __m128 epsv = _mm_set1_ps(1e-7); - __m128 ninev = _mm_set1_ps(9.f); - - for (; cc < cc1 - 10; cc += 8) { - rix[0] = qix[0] + rr * cc1 + cc; - rix[1] = qix[1] + rr * cc1 + cc; - rix[2] = qix[2] + rr * cc1 + cc; - rix[3] = qix[3] + rr * cc1 + cc; - rix[4] = qix[4] + rr * cc1 + cc; - // horizontal - p1v = LC2VFU(rix[2][-4]); - p2v = LC2VFU(rix[2][-3]); - p3v = LC2VFU(rix[2][-2]); - p4v = LC2VFU(rix[2][-1]); - p5v = LC2VFU(rix[2][ 0]); - p6v = LC2VFU(rix[2][ 1]); - p7v = LC2VFU(rix[2][ 2]); - p8v = LC2VFU(rix[2][ 3]); - p9v = LC2VFU(rix[2][ 4]); - muv = (p1v + p2v + p3v + p4v + p5v + p6v + p7v + p8v + p9v) / ninev; - vxv = epsv + SQRV(p1v - muv) + SQRV(p2v - muv) + SQRV(p3v - muv) + SQRV(p4v - muv) + SQRV(p5v - muv) + SQRV(p6v - muv) + SQRV(p7v - muv) + SQRV(p8v - muv) + SQRV(p9v - muv); - p1v -= LC2VFU(rix[0][-4]); - p2v -= LC2VFU(rix[0][-3]); - p3v -= LC2VFU(rix[0][-2]); - p4v -= LC2VFU(rix[0][-1]); - p5v -= LC2VFU(rix[0][ 0]); - p6v -= LC2VFU(rix[0][ 1]); - p7v -= LC2VFU(rix[0][ 2]); - p8v -= LC2VFU(rix[0][ 3]); - p9v -= LC2VFU(rix[0][ 4]); - vnv = epsv + SQRV(p1v) + SQRV(p2v) + SQRV(p3v) + SQRV(p4v) + SQRV(p5v) + SQRV(p6v) + SQRV(p7v) + SQRV(p8v) + SQRV(p9v); - xhv = (LC2VFU(rix[0][0]) * vxv + LC2VFU(rix[2][0]) * vnv) / (vxv + vnv); - vhv = vxv * vnv / (vxv + vnv); - - // vertical - p1v = LC2VFU(rix[3][-w4]); - p2v = LC2VFU(rix[3][-w3]); - p3v = LC2VFU(rix[3][-w2]); - p4v = LC2VFU(rix[3][-w1]); - p5v = LC2VFU(rix[3][ 0]); - p6v = LC2VFU(rix[3][ w1]); - p7v = LC2VFU(rix[3][ w2]); - p8v = LC2VFU(rix[3][ w3]); - p9v = LC2VFU(rix[3][ w4]); - muv = (p1v + p2v + p3v + p4v + p5v + p6v + p7v + p8v + p9v) / ninev; - vxv = epsv + SQRV(p1v - muv) + SQRV(p2v - muv) + SQRV(p3v - muv) + SQRV(p4v - muv) + SQRV(p5v - muv) + SQRV(p6v - muv) + SQRV(p7v - muv) + SQRV(p8v - muv) + SQRV(p9v - muv); - p1v -= LC2VFU(rix[1][-w4]); - p2v -= LC2VFU(rix[1][-w3]); - p3v -= LC2VFU(rix[1][-w2]); - p4v -= LC2VFU(rix[1][-w1]); - p5v -= LC2VFU(rix[1][ 0]); - p6v -= LC2VFU(rix[1][ w1]); - p7v -= LC2VFU(rix[1][ w2]); - p8v -= LC2VFU(rix[1][ w3]); - p9v -= LC2VFU(rix[1][ w4]); - vnv = epsv + SQRV(p1v) + SQRV(p2v) + SQRV(p3v) + SQRV(p4v) + SQRV(p5v) + SQRV(p6v) + SQRV(p7v) + SQRV(p8v) + SQRV(p9v); - xvv = (LC2VFU(rix[1][0]) * vxv + LC2VFU(rix[3][0]) * vnv) / (vxv + vnv); - vvv = vxv * vnv / (vxv + vnv); - // interpolated G-R(B) - muv = (xhv * vvv + xvv * vhv) / (vhv + vvv); - STC2VFU(rix[4][0], muv); - } - -#endif - - for (; cc < cc1 - 4; cc += 2) { - rix[0] = qix[0] + rr * cc1 + cc; - rix[1] = qix[1] + rr * cc1 + cc; - rix[2] = qix[2] + rr * cc1 + cc; - rix[3] = qix[3] + rr * cc1 + cc; - rix[4] = qix[4] + rr * cc1 + cc; - // horizontal - float p1 = rix[2][-4]; - float p2 = rix[2][-3]; - float p3 = rix[2][-2]; - float p4 = rix[2][-1]; - float p5 = rix[2][ 0]; - float p6 = rix[2][ 1]; - float p7 = rix[2][ 2]; - float p8 = rix[2][ 3]; - float p9 = rix[2][ 4]; - float mu = (p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9) / 9.f; - float vx = 1e-7 + SQR(p1 - mu) + SQR(p2 - mu) + SQR(p3 - mu) + SQR(p4 - mu) + SQR(p5 - mu) + SQR(p6 - mu) + SQR(p7 - mu) + SQR(p8 - mu) + SQR(p9 - mu); - p1 -= rix[0][-4]; - p2 -= rix[0][-3]; - p3 -= rix[0][-2]; - p4 -= rix[0][-1]; - p5 -= rix[0][ 0]; - p6 -= rix[0][ 1]; - p7 -= rix[0][ 2]; - p8 -= rix[0][ 3]; - p9 -= rix[0][ 4]; - float vn = 1e-7 + SQR(p1) + SQR(p2) + SQR(p3) + SQR(p4) + SQR(p5) + SQR(p6) + SQR(p7) + SQR(p8) + SQR(p9); - float xh = (rix[0][0] * vx + rix[2][0] * vn) / (vx + vn); - float vh = vx * vn / (vx + vn); - - // vertical - p1 = rix[3][-w4]; - p2 = rix[3][-w3]; - p3 = rix[3][-w2]; - p4 = rix[3][-w1]; - p5 = rix[3][ 0]; - p6 = rix[3][ w1]; - p7 = rix[3][ w2]; - p8 = rix[3][ w3]; - p9 = rix[3][ w4]; - mu = (p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9) / 9.f; - vx = 1e-7 + SQR(p1 - mu) + SQR(p2 - mu) + SQR(p3 - mu) + SQR(p4 - mu) + SQR(p5 - mu) + SQR(p6 - mu) + SQR(p7 - mu) + SQR(p8 - mu) + SQR(p9 - mu); - p1 -= rix[1][-w4]; - p2 -= rix[1][-w3]; - p3 -= rix[1][-w2]; - p4 -= rix[1][-w1]; - p5 -= rix[1][ 0]; - p6 -= rix[1][ w1]; - p7 -= rix[1][ w2]; - p8 -= rix[1][ w3]; - p9 -= rix[1][ w4]; - vn = 1e-7 + SQR(p1) + SQR(p2) + SQR(p3) + SQR(p4) + SQR(p5) + SQR(p6) + SQR(p7) + SQR(p8) + SQR(p9); - float xv = (rix[1][0] * vx + rix[3][0] * vn) / (vx + vn); - float vv = vx * vn / (vx + vn); - // interpolated G-R(B) - rix[4][0] = (xh * vv + xv * vh) / (vh + vv); - } - } - -#ifdef _OPENMP - #pragma omp single -#endif - { - if (plistener) { - plistener->setProgress (0.4); - } - } - - // copy CFA values -#ifdef _OPENMP - #pragma omp for -#endif - - for (int rr = 0; rr < rr1; rr++) - for (int cc = 0, row = rr - ba; cc < cc1; cc++) { - int col = cc - ba; - int c = FC(rr, cc); - rix[c] = qix[c] + rr * cc1 + cc; - - if ((row >= 0) & (row < height) & (col >= 0) & (col < width)) { - rix[c][0] = (*gamtab)[rawData[row][col]]; - } else { - rix[c][0] = 0.f; - } - - if (c != 1) { - rix[1] = qix[1] + rr * cc1 + cc; - rix[4] = qix[4] + rr * cc1 + cc; - rix[1][0] = rix[c][0] + rix[4][0]; - } - } - -#ifdef _OPENMP - #pragma omp single -#endif - { - if (plistener) { - plistener->setProgress (0.5); - } - } - - // bilinear interpolation for R/B - // interpolate R/B at G location -#ifdef _OPENMP - #pragma omp for -#endif - - for (int rr = 1; rr < rr1 - 1; rr++) - for (int cc = 1 + (FC(rr, 2) & 1), c = FC(rr, cc + 1); cc < cc1 - 1; cc += 2) { - rix[c] = qix[c] + rr * cc1 + cc; - rix[1] = qix[1] + rr * cc1 + cc; - rix[c][0] = rix[1][0] + xdiv2f(rix[c][ -1] - rix[1][ -1] + rix[c][ 1] - rix[1][ 1]); - c = 2 - c; - rix[c] = qix[c] + rr * cc1 + cc; - rix[c][0] = rix[1][0] + xdiv2f(rix[c][-w1] - rix[1][-w1] + rix[c][w1] - rix[1][w1]); - c = 2 - c; - } - -#ifdef _OPENMP - #pragma omp single -#endif - { - if (plistener) { - plistener->setProgress (0.6); - } - } - - // interpolate R/B at B/R location -#ifdef _OPENMP - #pragma omp for -#endif - - for (int rr = 1; rr < rr1 - 1; rr++) - for (int cc = 1 + (FC(rr, 1) & 1), c = 2 - FC(rr, cc); cc < cc1 - 1; cc += 2) { - rix[c] = qix[c] + rr * cc1 + cc; - rix[1] = qix[1] + rr * cc1 + cc; - rix[c][0] = rix[1][0] + x0250(rix[c][-w1] - rix[1][-w1] + rix[c][ -1] - rix[1][ -1] + rix[c][ 1] - rix[1][ 1] + rix[c][ w1] - rix[1][ w1]); - } - -#ifdef _OPENMP - #pragma omp single -#endif - { - if (plistener) { - plistener->setProgress (0.7); - } - } - - }// End of parallelization 1 - - // median filter/ - for (int pass = 0; pass < iter; pass++) { - // Apply 3x3 median filter - // Compute median(R-G) and median(B-G) - -#ifdef _OPENMP - #pragma omp parallel for private(rix) -#endif - - for (int rr = 1; rr < rr1 - 1; rr++) { - for (int c = 0; c < 3; c += 2) { - int d = c + 3 - (c == 0 ? 0 : 1); - int cc = 1; -#ifdef __SSE2__ - - for (; cc < cc1 - 4; cc += 4) { - rix[d] = qix[d] + rr * cc1 + cc; - rix[c] = qix[c] + rr * cc1 + cc; - rix[1] = qix[1] + rr * cc1 + cc; - // Assign 3x3 differential color values - const std::array p = { - LVFU(rix[c][-w1 - 1]) - LVFU(rix[1][-w1 - 1]), - LVFU(rix[c][-w1]) - LVFU(rix[1][-w1]), - LVFU(rix[c][-w1 + 1]) - LVFU(rix[1][-w1 + 1]), - LVFU(rix[c][ -1]) - LVFU(rix[1][ -1]), - LVFU(rix[c][ 0]) - LVFU(rix[1][ 0]), - LVFU(rix[c][ 1]) - LVFU(rix[1][ 1]), - LVFU(rix[c][ w1 - 1]) - LVFU(rix[1][ w1 - 1]), - LVFU(rix[c][ w1]) - LVFU(rix[1][ w1]), - LVFU(rix[c][ w1 + 1]) - LVFU(rix[1][ w1 + 1]) - }; - _mm_storeu_ps(&rix[d][0], median(p)); - } - -#endif - - for (; cc < cc1 - 1; cc++) { - rix[d] = qix[d] + rr * cc1 + cc; - rix[c] = qix[c] + rr * cc1 + cc; - rix[1] = qix[1] + rr * cc1 + cc; - // Assign 3x3 differential color values - const std::array p = { - rix[c][-w1 - 1] - rix[1][-w1 - 1], - rix[c][-w1] - rix[1][-w1], - rix[c][-w1 + 1] - rix[1][-w1 + 1], - rix[c][ -1] - rix[1][ -1], - rix[c][ 0] - rix[1][ 0], - rix[c][ 1] - rix[1][ 1], - rix[c][ w1 - 1] - rix[1][ w1 - 1], - rix[c][ w1] - rix[1][ w1], - rix[c][ w1 + 1] - rix[1][ w1 + 1] - }; - rix[d][0] = median(p); - } - } - } - - // red/blue at GREEN pixel locations & red/blue and green at BLUE/RED pixel locations -#ifdef _OPENMP - #pragma omp parallel for private (rix) -#endif - - for (int rr = 0; rr < rr1; rr++) { - rix[0] = qix[0] + rr * cc1; - rix[1] = qix[1] + rr * cc1; - rix[2] = qix[2] + rr * cc1; - rix[3] = qix[3] + rr * cc1; - rix[4] = qix[4] + rr * cc1; - int c0 = FC(rr, 0); - int c1 = FC(rr, 1); - - if(c0 == 1) { - c1 = 2 - c1; - int d = c1 + 3 - (c1 == 0 ? 0 : 1); - int cc; - - for (cc = 0; cc < cc1 - 1; cc += 2) { - rix[0][0] = rix[1][0] + rix[3][0]; - rix[2][0] = rix[1][0] + rix[4][0]; - rix[0]++; - rix[1]++; - rix[2]++; - rix[3]++; - rix[4]++; - rix[c1][0] = rix[1][0] + rix[d][0]; - rix[1][0] = 0.5f * (rix[0][0] - rix[3][0] + rix[2][0] - rix[4][0]); - rix[0]++; - rix[1]++; - rix[2]++; - rix[3]++; - rix[4]++; - } - - if(cc < cc1) { // remaining pixel, only if width is odd - rix[0][0] = rix[1][0] + rix[3][0]; - rix[2][0] = rix[1][0] + rix[4][0]; - } - } else { - c0 = 2 - c0; - int d = c0 + 3 - (c0 == 0 ? 0 : 1); - int cc; - - for (cc = 0; cc < cc1 - 1; cc += 2) { - rix[c0][0] = rix[1][0] + rix[d][0]; - rix[1][0] = 0.5f * (rix[0][0] - rix[3][0] + rix[2][0] - rix[4][0]); - rix[0]++; - rix[1]++; - rix[2]++; - rix[3]++; - rix[4]++; - rix[0][0] = rix[1][0] + rix[3][0]; - rix[2][0] = rix[1][0] + rix[4][0]; - rix[0]++; - rix[1]++; - rix[2]++; - rix[3]++; - rix[4]++; - } - - if(cc < cc1) { // remaining pixel, only if width is odd - rix[c0][0] = rix[1][0] + rix[d][0]; - rix[1][0] = 0.5f * (rix[0][0] - rix[3][0] + rix[2][0] - rix[4][0]); - } - } - } - } - - if (plistener) { - plistener->setProgress (0.8); - } - - if(applyGamma) { - gamtab = &(Color::igammatab_24_17); - } else { - gamtab->makeIdentity(); - } - - array2D* rgb[3]; - rgb[0] = &red; - rgb[1] = &green; - rgb[2] = &blue; - - // copy result back to image matrix -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int row = 0; row < height; row++) { - for (int col = 0, rr = row + ba; col < width; col++) { - int cc = col + ba; - int c = FC(row, col); - - for (int ii = 0; ii < 3; ii++) - if (ii != c) { - float *rix = qix[ii] + rr * cc1 + cc; - (*(rgb[ii]))[row][col] = (*gamtab)[65535.f * rix[0]]; - } else { - (*(rgb[ii]))[row][col] = CLIP(rawData[row][col]); - } - } - } - - if (plistener) { - plistener->setProgress (1.0); - } - - if(buffer) { - free(buffer); - } else - for(int i = 0; i < 5; i++) { - free(qix[i]); - } - - if(!applyGamma) { - delete gamtab; - } - - if(iterations > 4 && iterations <= 6) { - refinement(passref); - } else if(iterations > 6) { - refinement_lassus(passref); - } - -} - /*** * * Bayer CFA Demosaicing using Integrated Gaussian Vector on Color Differences @@ -1553,357 +919,6 @@ void RawImageSource::nodemosaic(bool bw) } } -/* - Refinement based on EECI demosaicing algorithm by L. Chang and Y.P. Tan - Paul Lee - Adapted for RawTherapee - Jacques Desmis 04/2013 -*/ - -#ifdef __SSE2__ -#define CLIPV(a) vclampf(a,ZEROV,c65535v) -#endif -void RawImageSource::refinement(int PassCount) -{ - MyTime t1e, t2e; - t1e.set(); - - int width = W; - int height = H; - int w1 = width; - int w2 = 2 * w1; - - if (plistener) { - plistener->setProgressStr (M("TP_RAW_DMETHOD_PROGRESSBAR_REFINE")); - } - - array2D *rgb[3]; - rgb[0] = &red; - rgb[1] = &green; - rgb[2] = &blue; - - for (int b = 0; b < PassCount; b++) { - if (plistener) { - plistener->setProgress ((float)b / PassCount); - } - - -#ifdef _OPENMP - #pragma omp parallel -#endif - { - float *pix[3]; - - /* Reinforce interpolated green pixels on RED/BLUE pixel locations */ -#ifdef _OPENMP - #pragma omp for -#endif - - for (int row = 2; row < height - 2; row++) { - int col = 2 + (FC(row, 2) & 1); - int c = FC(row, col); -#ifdef __SSE2__ - __m128 dLv, dRv, dUv, dDv, v0v; - __m128 onev = _mm_set1_ps(1.f); - __m128 zd5v = _mm_set1_ps(0.5f); - __m128 c65535v = _mm_set1_ps(65535.f); - - for (; col < width - 8; col += 8) { - int indx = row * width + col; - pix[c] = (float*)(*rgb[c]) + indx; - pix[1] = (float*)(*rgb[1]) + indx; - dLv = onev / (onev + vabsf(LC2VFU(pix[c][ -2]) - LC2VFU(pix[c][0])) + vabsf(LC2VFU(pix[1][ 1]) - LC2VFU(pix[1][ -1]))); - dRv = onev / (onev + vabsf(LC2VFU(pix[c][ 2]) - LC2VFU(pix[c][0])) + vabsf(LC2VFU(pix[1][ 1]) - LC2VFU(pix[1][ -1]))); - dUv = onev / (onev + vabsf(LC2VFU(pix[c][-w2]) - LC2VFU(pix[c][0])) + vabsf(LC2VFU(pix[1][w1]) - LC2VFU(pix[1][-w1]))); - dDv = onev / (onev + vabsf(LC2VFU(pix[c][ w2]) - LC2VFU(pix[c][0])) + vabsf(LC2VFU(pix[1][w1]) - LC2VFU(pix[1][-w1]))); - v0v = CLIPV(LC2VFU(pix[c][0]) + zd5v + ((LC2VFU(pix[1][-1]) - LC2VFU(pix[c][-1])) * dLv + (LC2VFU(pix[1][1]) - LC2VFU(pix[c][1])) * dRv + (LC2VFU(pix[1][-w1]) - LC2VFU(pix[c][-w1])) * dUv + (LC2VFU(pix[1][w1]) - LC2VFU(pix[c][w1])) * dDv ) / (dLv + dRv + dUv + dDv)); - STC2VFU(pix[1][0], v0v); - } - -#endif - - for (; col < width - 2; col += 2) { - int indx = row * width + col; - pix[c] = (float*)(*rgb[c]) + indx; - pix[1] = (float*)(*rgb[1]) + indx; - float dL = 1.f / (1.f + fabsf(pix[c][ -2] - pix[c][0]) + fabsf(pix[1][ 1] - pix[1][ -1])); - float dR = 1.f / (1.f + fabsf(pix[c][ 2] - pix[c][0]) + fabsf(pix[1][ 1] - pix[1][ -1])); - float dU = 1.f / (1.f + fabsf(pix[c][-w2] - pix[c][0]) + fabsf(pix[1][w1] - pix[1][-w1])); - float dD = 1.f / (1.f + fabsf(pix[c][ w2] - pix[c][0]) + fabsf(pix[1][w1] - pix[1][-w1])); - float v0 = (pix[c][0] + 0.5f + ((pix[1][ -1] - pix[c][ -1]) * dL + (pix[1][ 1] - pix[c][ 1]) * dR + (pix[1][-w1] - pix[c][-w1]) * dU + (pix[1][ w1] - pix[c][ w1]) * dD ) / (dL + dR + dU + dD)); - pix[1][0] = CLIP(v0); - } - } - - /* Reinforce interpolated red/blue pixels on GREEN pixel locations */ -#ifdef _OPENMP - #pragma omp for -#endif - - for (int row = 2; row < height - 2; row++) { - int col = 2 + (FC(row, 3) & 1); - int c = FC(row, col + 1); -#ifdef __SSE2__ - __m128 dLv, dRv, dUv, dDv, v0v; - __m128 onev = _mm_set1_ps(1.f); - __m128 zd5v = _mm_set1_ps(0.5f); - __m128 c65535v = _mm_set1_ps(65535.f); - - for (; col < width - 8; col += 8) { - int indx = row * width + col; - pix[1] = (float*)(*rgb[1]) + indx; - - for (int i = 0; i < 2; c = 2 - c, i++) { - pix[c] = (float*)(*rgb[c]) + indx; - dLv = onev / (onev + vabsf(LC2VFU(pix[1][ -2]) - LC2VFU(pix[1][0])) + vabsf(LC2VFU(pix[c][ 1]) - LC2VFU(pix[c][ -1]))); - dRv = onev / (onev + vabsf(LC2VFU(pix[1][ 2]) - LC2VFU(pix[1][0])) + vabsf(LC2VFU(pix[c][ 1]) - LC2VFU(pix[c][ -1]))); - dUv = onev / (onev + vabsf(LC2VFU(pix[1][-w2]) - LC2VFU(pix[1][0])) + vabsf(LC2VFU(pix[c][w1]) - LC2VFU(pix[c][-w1]))); - dDv = onev / (onev + vabsf(LC2VFU(pix[1][ w2]) - LC2VFU(pix[1][0])) + vabsf(LC2VFU(pix[c][w1]) - LC2VFU(pix[c][-w1]))); - v0v = CLIPV(LC2VFU(pix[1][0]) + zd5v - ((LC2VFU(pix[1][-1]) - LC2VFU(pix[c][-1])) * dLv + (LC2VFU(pix[1][1]) - LC2VFU(pix[c][1])) * dRv + (LC2VFU(pix[1][-w1]) - LC2VFU(pix[c][-w1])) * dUv + (LC2VFU(pix[1][w1]) - LC2VFU(pix[c][w1])) * dDv ) / (dLv + dRv + dUv + dDv)); - STC2VFU(pix[c][0], v0v); - } - } - -#endif - - for (; col < width - 2; col += 2) { - int indx = row * width + col; - pix[1] = (float*)(*rgb[1]) + indx; - - for (int i = 0; i < 2; c = 2 - c, i++) { - pix[c] = (float*)(*rgb[c]) + indx; - float dL = 1.f / (1.f + fabsf(pix[1][ -2] - pix[1][0]) + fabsf(pix[c][ 1] - pix[c][ -1])); - float dR = 1.f / (1.f + fabsf(pix[1][ 2] - pix[1][0]) + fabsf(pix[c][ 1] - pix[c][ -1])); - float dU = 1.f / (1.f + fabsf(pix[1][-w2] - pix[1][0]) + fabsf(pix[c][w1] - pix[c][-w1])); - float dD = 1.f / (1.f + fabsf(pix[1][ w2] - pix[1][0]) + fabsf(pix[c][w1] - pix[c][-w1])); - float v0 = (pix[1][0] + 0.5f - ((pix[1][ -1] - pix[c][ -1]) * dL + (pix[1][ 1] - pix[c][ 1]) * dR + (pix[1][-w1] - pix[c][-w1]) * dU + (pix[1][ w1] - pix[c][ w1]) * dD ) / (dL + dR + dU + dD)); - pix[c][0] = CLIP(v0); - } - } - } - - /* Reinforce integrated red/blue pixels on BLUE/RED pixel locations */ -#ifdef _OPENMP - #pragma omp for -#endif - - for (int row = 2; row < height - 2; row++) { - int col = 2 + (FC(row, 2) & 1); - int c = 2 - FC(row, col); -#ifdef __SSE2__ - __m128 dLv, dRv, dUv, dDv, v0v; - __m128 onev = _mm_set1_ps(1.f); - __m128 zd5v = _mm_set1_ps(0.5f); - __m128 c65535v = _mm_set1_ps(65535.f); - - for (; col < width - 8; col += 8) { - int indx = row * width + col; - pix[0] = (float*)(*rgb[0]) + indx; - pix[1] = (float*)(*rgb[1]) + indx; - pix[2] = (float*)(*rgb[2]) + indx; - int d = 2 - c; - dLv = onev / (onev + vabsf(LC2VFU(pix[d][ -2]) - LC2VFU(pix[d][0])) + vabsf(LC2VFU(pix[1][ 1]) - LC2VFU(pix[1][ -1]))); - dRv = onev / (onev + vabsf(LC2VFU(pix[d][ 2]) - LC2VFU(pix[d][0])) + vabsf(LC2VFU(pix[1][ 1]) - LC2VFU(pix[1][ -1]))); - dUv = onev / (onev + vabsf(LC2VFU(pix[d][-w2]) - LC2VFU(pix[d][0])) + vabsf(LC2VFU(pix[1][w1]) - LC2VFU(pix[1][-w1]))); - dDv = onev / (onev + vabsf(LC2VFU(pix[d][ w2]) - LC2VFU(pix[d][0])) + vabsf(LC2VFU(pix[1][w1]) - LC2VFU(pix[1][-w1]))); - v0v = CLIPV(LC2VFU(pix[1][0]) + zd5v - ((LC2VFU(pix[1][-1]) - LC2VFU(pix[c][-1])) * dLv + (LC2VFU(pix[1][1]) - LC2VFU(pix[c][1])) * dRv + (LC2VFU(pix[1][-w1]) - LC2VFU(pix[c][-w1])) * dUv + (LC2VFU(pix[1][w1]) - LC2VFU(pix[c][w1])) * dDv ) / (dLv + dRv + dUv + dDv)); - STC2VFU(pix[c][0], v0v); - } - -#endif - - for (; col < width - 2; col += 2) { - int indx = row * width + col; - pix[0] = (float*)(*rgb[0]) + indx; - pix[1] = (float*)(*rgb[1]) + indx; - pix[2] = (float*)(*rgb[2]) + indx; - int d = 2 - c; - float dL = 1.f / (1.f + fabsf(pix[d][ -2] - pix[d][0]) + fabsf(pix[1][ 1] - pix[1][ -1])); - float dR = 1.f / (1.f + fabsf(pix[d][ 2] - pix[d][0]) + fabsf(pix[1][ 1] - pix[1][ -1])); - float dU = 1.f / (1.f + fabsf(pix[d][-w2] - pix[d][0]) + fabsf(pix[1][w1] - pix[1][-w1])); - float dD = 1.f / (1.f + fabsf(pix[d][ w2] - pix[d][0]) + fabsf(pix[1][w1] - pix[1][-w1])); - float v0 = (pix[1][0] + 0.5f - ((pix[1][ -1] - pix[c][ -1]) * dL + (pix[1][ 1] - pix[c][ 1]) * dR + (pix[1][-w1] - pix[c][-w1]) * dU + (pix[1][ w1] - pix[c][ w1]) * dD ) / (dL + dR + dU + dD)); - pix[c][0] = CLIP(v0); - } - } - } // end parallel - } - - t2e.set(); - - if (settings->verbose) { - printf("Refinement Lee %d usec\n", t2e.etime(t1e)); - } -} -#ifdef __SSE2__ -#undef CLIPV -#endif - - -// Refinement based on EECI demozaicing algorithm by L. Chang and Y.P. Tan -// from "Lassus" : Luis Sanz Rodriguez, adapted by Jacques Desmis - JDC - and Oliver Duis for RawTherapee -// increases the signal to noise ratio (PSNR) # +1 to +2 dB : tested with Dcraw : -// eg: Lighthouse + AMaZE : without refinement:39.96 dB, with refinement:41.86 dB -// reduce color artifacts, improves the interpolation -// but it's relatively slow -// -// Should be DISABLED if it decreases image quality by increases some image noise and generates blocky edges -void RawImageSource::refinement_lassus(int PassCount) -{ - // const int PassCount=1; - - // if (settings->verbose) printf("Refinement\n"); - - MyTime t1e, t2e; - t1e.set(); - int u = W, v = 2 * u, w = 3 * u, x = 4 * u, y = 5 * u; - float (*image)[3]; - image = (float(*)[3]) calloc(static_cast(W) * H, sizeof * image); -#ifdef _OPENMP - #pragma omp parallel shared(image) -#endif - { - // convert red, blue, green to image -#ifdef _OPENMP - #pragma omp for -#endif - - for (int i = 0; i < H; i++) { - for (int j = 0; j < W; j++) { - image[i * W + j][0] = red [i][j]; - image[i * W + j][1] = green[i][j]; - image[i * W + j][2] = blue [i][j]; - } - } - - for (int b = 0; b < PassCount; b++) { - if (plistener) { - plistener->setProgressStr (M("TP_RAW_DMETHOD_PROGRESSBAR_REFINE")); - plistener->setProgress ((float)b / PassCount); - } - - // Reinforce interpolated green pixels on RED/BLUE pixel locations -#ifdef _OPENMP - #pragma omp for -#endif - - for (int row = 6; row < H - 6; row++) { - for (int col = 6 + (FC(row, 2) & 1), c = FC(row, col); col < W - 6; col += 2) { - float (*pix)[3] = image + row * W + col; - - // Cubic Spline Interpolation by Li and Randhawa, modified by Luis Sanz Rodriguez - - float f[4]; - f[0] = 1.0f / (1.0f + xmul2f(fabs(x1125(pix[-v][c]) - x0875(pix[0][c]) - x0250(pix[-x][c]))) + fabs(x0875(pix[u][1]) - x1125(pix[-u][1]) + x0250(pix[-w][1])) + fabs(x0875(pix[-w][1]) - x1125(pix[-u][1]) + x0250(pix[-y][1]))); - f[1] = 1.0f / (1.0f + xmul2f(fabs(x1125(pix[+2][c]) - x0875(pix[0][c]) - x0250(pix[+4][c]))) + fabs(x0875(pix[1][1]) - x1125(pix[-1][1]) + x0250(pix[+3][1])) + fabs(x0875(pix[+3][1]) - x1125(pix[+1][1]) + x0250(pix[+5][1]))); - f[2] = 1.0f / (1.0f + xmul2f(fabs(x1125(pix[-2][c]) - x0875(pix[0][c]) - x0250(pix[-4][c]))) + fabs(x0875(pix[1][1]) - x1125(pix[-1][1]) + x0250(pix[-3][1])) + fabs(x0875(pix[-3][1]) - x1125(pix[-1][1]) + x0250(pix[-5][1]))); - f[3] = 1.0f / (1.0f + xmul2f(fabs(x1125(pix[+v][c]) - x0875(pix[0][c]) - x0250(pix[+x][c]))) + fabs(x0875(pix[u][1]) - x1125(pix[-u][1]) + x0250(pix[+w][1])) + fabs(x0875(pix[+w][1]) - x1125(pix[+u][1]) + x0250(pix[+y][1]))); - - float g[4];//CLIREF avoid overflow - g[0] = pix[0][c] + (x0875(CLIREF(pix[-u][1] - pix[-u][c])) + x0125(CLIREF(pix[+u][1] - pix[+u][c]))); - g[1] = pix[0][c] + (x0875(CLIREF(pix[+1][1] - pix[+1][c])) + x0125(CLIREF(pix[-1][1] - pix[-1][c]))); - g[2] = pix[0][c] + (x0875(CLIREF(pix[-1][1] - pix[-1][c])) + x0125(CLIREF(pix[+1][1] - pix[+1][c]))); - g[3] = pix[0][c] + (x0875(CLIREF(pix[+u][1] - pix[+u][c])) + x0125(CLIREF(pix[-u][1] - pix[-u][c]))); - - pix[0][1] = (f[0] * g[0] + f[1] * g[1] + f[2] * g[2] + f[3] * g[3]) / (f[0] + f[1] + f[2] + f[3]); - - } - } - - // Reinforce interpolated red/blue pixels on GREEN pixel locations -#ifdef _OPENMP - #pragma omp for -#endif - - for (int row = 6; row < H - 6; row++) { - for (int col = 6 + (FC(row, 3) & 1), c = FC(row, col + 1); col < W - 6; col += 2) { - float (*pix)[3] = image + row * W + col; - - for (int i = 0; i < 2; c = 2 - c, i++) { - float f[4]; - f[0] = 1.0f / (1.0f + xmul2f(fabs(x0875(pix[-v][1]) - x1125(pix[0][1]) + x0250(pix[-x][1]))) + fabs(pix[u] [c] - pix[-u][c]) + fabs(pix[-w][c] - pix[-u][c])); - f[1] = 1.0f / (1.0f + xmul2f(fabs(x0875(pix[+2][1]) - x1125(pix[0][1]) + x0250(pix[+4][1]))) + fabs(pix[+1][c] - pix[-1][c]) + fabs(pix[+3][c] - pix[+1][c])); - f[2] = 1.0f / (1.0f + xmul2f(fabs(x0875(pix[-2][1]) - x1125(pix[0][1]) + x0250(pix[-4][1]))) + fabs(pix[+1][c] - pix[-1][c]) + fabs(pix[-3][c] - pix[-1][c])); - f[3] = 1.0f / (1.0f + xmul2f(fabs(x0875(pix[+v][1]) - x1125(pix[0][1]) + x0250(pix[+x][1]))) + fabs(pix[u] [c] - pix[-u][c]) + fabs(pix[+w][c] - pix[+u][c])); - - float g[5];//CLIREF avoid overflow - g[0] = CLIREF(pix[-u][1] - pix[-u][c]); - g[1] = CLIREF(pix[+1][1] - pix[+1][c]); - g[2] = CLIREF(pix[-1][1] - pix[-1][c]); - g[3] = CLIREF(pix[+u][1] - pix[+u][c]); - g[4] = ((f[0] * g[0] + f[1] * g[1] + f[2] * g[2] + f[3] * g[3]) / (f[0] + f[1] + f[2] + f[3])); - pix[0][c] = pix[0][1] - (0.65f * g[4] + 0.35f * CLIREF(pix[0][1] - pix[0][c])); - } - } - } - - // Reinforce integrated red/blue pixels on BLUE/RED pixel locations -#ifdef _OPENMP - #pragma omp for -#endif - - for (int row = 6; row < H - 6; row++) { - for (int col = 6 + (FC(row, 2) & 1), c = 2 - FC(row, col), d = 2 - c; col < W - 6; col += 2) { - float (*pix)[3] = image + row * W + col; - - float f[4]; - f[0] = 1.0f / (1.0f + xmul2f(fabs(x1125(pix[-v][d]) - x0875(pix[0][d]) - x0250(pix[-x][d]))) + fabs(x0875(pix[u][1]) - x1125(pix[-u][1]) + x0250(pix[-w][1])) + fabs(x0875(pix[-w][1]) - x1125(pix[-u][1]) + x0250(pix[-y][1]))); - f[1] = 1.0f / (1.0f + xmul2f(fabs(x1125(pix[+2][d]) - x0875(pix[0][d]) - x0250(pix[+4][d]))) + fabs(x0875(pix[1][1]) - x1125(pix[-1][1]) + x0250(pix[+3][1])) + fabs(x0875(pix[+3][1]) - x1125(pix[+1][1]) + x0250(pix[+5][1]))); - f[2] = 1.0f / (1.0f + xmul2f(fabs(x1125(pix[-2][d]) - x0875(pix[0][d]) - x0250(pix[-4][d]))) + fabs(x0875(pix[1][1]) - x1125(pix[-1][1]) + x0250(pix[-3][1])) + fabs(x0875(pix[-3][1]) - x1125(pix[-1][1]) + x0250(pix[-5][1]))); - f[3] = 1.0f / (1.0f + xmul2f(fabs(x1125(pix[+v][d]) - x0875(pix[0][d]) - x0250(pix[+x][d]))) + fabs(x0875(pix[u][1]) - x1125(pix[-u][1]) + x0250(pix[+w][1])) + fabs(x0875(pix[+w][1]) - x1125(pix[+u][1]) + x0250(pix[+y][1]))); - - float g[5]; - g[0] = (x0875((pix[-u][1] - pix[-u][c])) + x0125((pix[-v][1] - pix[-v][c]))); - g[1] = (x0875((pix[+1][1] - pix[+1][c])) + x0125((pix[+2][1] - pix[+2][c]))); - g[2] = (x0875((pix[-1][1] - pix[-1][c])) + x0125((pix[-2][1] - pix[-2][c]))); - g[3] = (x0875((pix[+u][1] - pix[+u][c])) + x0125((pix[+v][1] - pix[+v][c]))); - - g[4] = (f[0] * g[0] + f[1] * g[1] + f[2] * g[2] + f[3] * g[3]) / (f[0] + f[1] + f[2] + f[3]); - - const std::array p = { - pix[-u - 1][1] - pix[-u - 1][c], - pix[-u + 0][1] - pix[-u + 0][c], - pix[-u + 1][1] - pix[-u + 1][c], - pix[+0 - 1][1] - pix[+0 - 1][c], - pix[+0 + 0][1] - pix[+0 + 0][c], - pix[+0 + 1][1] - pix[+0 + 1][c], - pix[+u - 1][1] - pix[+u - 1][c], - pix[+u + 0][1] - pix[+u + 0][c], - pix[+u + 1][1] - pix[+u + 1][c] - }; - - const float med = median(p); - - pix[0][c] = LIM(pix[0][1] - (1.30f * g[4] - 0.30f * (pix[0][1] - pix[0][c])), 0.99f * (pix[0][1] - med), 1.01f * (pix[0][1] - med)); - - } - } - - } - - // put modified values to red, green, blue -#ifdef _OPENMP - #pragma omp for -#endif - - for (int i = 0; i < H; i++) { - for (int j = 0; j < W; j++) { - red [i][j] = image[i * W + j][0]; - green[i][j] = image[i * W + j][1]; - blue [i][j] = image[i * W + j][2]; - } - } - } - - free(image); - - t2e.set(); - - if (settings->verbose) { - printf("Refinement Lassus %d usec\n", t2e.etime(t1e)); - } -} - - /* * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/rtengine/lmmse_demosaic.cc b/rtengine/lmmse_demosaic.cc new file mode 100644 index 000000000..6191ca36c --- /dev/null +++ b/rtengine/lmmse_demosaic.cc @@ -0,0 +1,824 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2004-2019 Gabor Horvath + * + * RawTherapee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RawTherapee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RawTherapee. If not, see . + */ +#include + +#include "rawimagesource.h" +#include "rt_math.h" +#include "color.h" +#include "../rtgui/multilangmgr.h" +#include "sleef.h" +#include "opthelper.h" +#include "median.h" + +using namespace std; + +namespace rtengine +{ + +// LSMME demosaicing algorithm +// L. Zhang and X. Wu, +// Color demozaicing via directional Linear Minimum Mean Square-error Estimation, +// IEEE Trans. on Image Processing, vol. 14, pp. 2167-2178, +// Dec. 2005. +// Adapted to RawTherapee by Jacques Desmis 3/2013 +// Improved speed and reduced memory consumption by Ingo Weyrich 2/2015 +// TODO Tiles to reduce memory consumption +void RawImageSource::lmmse_interpolate_omp(int winw, int winh, const array2D &rawData, array2D &red, array2D &green, array2D &blue, int iterations) +{ + const int width = winw, height = winh; + const int ba = 10; + const int rr1 = height + 2 * ba; + const int cc1 = width + 2 * ba; + const int w1 = cc1; + const int w2 = 2 * w1; + const int w3 = 3 * w1; + const int w4 = 4 * w1; + float h0, h1, h2, h3, h4, hs; + h0 = 1.0f; + h1 = exp( -1.0f / 8.0f); + h2 = exp( -4.0f / 8.0f); + h3 = exp( -9.0f / 8.0f); + h4 = exp(-16.0f / 8.0f); + hs = h0 + 2.0f * (h1 + h2 + h3 + h4); + h0 /= hs; + h1 /= hs; + h2 /= hs; + h3 /= hs; + h4 /= hs; + int passref = 0; + int iter = 0; + + if (iterations <= 4) { + iter = iterations - 1; + passref = 0; + } else if (iterations <= 6) { + iter = 3; + passref = iterations - 4; + } else if (iterations <= 8) { + iter = 3; + passref = iterations - 6; + } + + bool applyGamma = true; + + if (iterations == 0) { + applyGamma = false; + iter = 0; + } else { + applyGamma = true; + } + + float *rix[5]; + float *qix[5]; + float *buffer = (float *)calloc(static_cast(rr1) * cc1 * 5 * sizeof(float), 1); + + if (buffer == nullptr) { // allocation of big block of memory failed, try to get 5 smaller ones + printf("lmmse_interpolate_omp: allocation of big memory block failed, try to get 5 smaller ones now...\n"); + bool allocationFailed = false; + + for (int i = 0; i < 5; i++) { + qix[i] = (float *)calloc(static_cast(rr1) * cc1 * sizeof(float), 1); + + if (!qix[i]) { // allocation of at least one small block failed + allocationFailed = true; + } + } + + if (allocationFailed) { // fall back to igv_interpolate + printf("lmmse_interpolate_omp: allocation of 5 small memory blocks failed, falling back to igv_interpolate...\n"); + + for (int i = 0; i < 5; i++) { // free the already allocated buffers + if (qix[i]) { + free(qix[i]); + } + } + + igv_interpolate(winw, winh); + return; + } + } else { + qix[0] = buffer; + + for (int i = 1; i < 5; i++) { + qix[i] = qix[i - 1] + rr1 * cc1; + } + } + + if (plistener) { + plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), M("TP_RAW_LMMSE"))); + plistener->setProgress (0.0); + } + + + LUTf *gamtab; + + if (applyGamma) { + gamtab = &(Color::gammatab_24_17a); + } else { + gamtab = new LUTf(65536, LUT_CLIP_ABOVE | LUT_CLIP_BELOW); + gamtab->makeIdentity(65535.f); + } + + +#ifdef _OPENMP + #pragma omp parallel private(rix) +#endif + { +#ifdef _OPENMP + #pragma omp for +#endif + + for (int rrr = ba; rrr < rr1 - ba; rrr++) { + for (int ccc = ba, row = rrr - ba; ccc < cc1 - ba; ccc++) { + int col = ccc - ba; + float *rix = qix[4] + rrr * cc1 + ccc; + rix[0] = (*gamtab)[rawData[row][col]]; + } + } + +#ifdef _OPENMP + #pragma omp single +#endif + { + if (plistener) { + plistener->setProgress (0.1); + } + } + + // G-R(B) +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) +#endif + + for (int rr = 2; rr < rr1 - 2; rr++) { + // G-R(B) at R(B) location + for (int cc = 2 + (FC(rr, 2) & 1); cc < cc1 - 2; cc += 2) { + rix[4] = qix[4] + rr * cc1 + cc; + float v0 = 0.0625f * (rix[4][-w1 - 1] + rix[4][-w1 + 1] + rix[4][w1 - 1] + rix[4][w1 + 1]) + 0.25f * (rix[4][0]); + // horizontal + rix[0] = qix[0] + rr * cc1 + cc; + rix[0][0] = -0.25f * (rix[4][ -2] + rix[4][ 2]) + xdiv2f(rix[4][ -1] + rix[4][0] + rix[4][ 1]); + float Y = v0 + xdiv2f(rix[0][0]); + + if (rix[4][0] > 1.75f * Y) { + rix[0][0] = median(rix[0][0], rix[4][ -1], rix[4][ 1]); + } else { + rix[0][0] = LIM(rix[0][0], 0.0f, 1.0f); + } + + rix[0][0] -= rix[4][0]; + // vertical + rix[1] = qix[1] + rr * cc1 + cc; + rix[1][0] = -0.25f * (rix[4][-w2] + rix[4][w2]) + xdiv2f(rix[4][-w1] + rix[4][0] + rix[4][w1]); + Y = v0 + xdiv2f(rix[1][0]); + + if (rix[4][0] > 1.75f * Y) { + rix[1][0] = median(rix[1][0], rix[4][-w1], rix[4][w1]); + } else { + rix[1][0] = LIM(rix[1][0], 0.0f, 1.0f); + } + + rix[1][0] -= rix[4][0]; + } + + // G-R(B) at G location + for (int ccc = 2 + (FC(rr, 3) & 1); ccc < cc1 - 2; ccc += 2) { + rix[0] = qix[0] + rr * cc1 + ccc; + rix[1] = qix[1] + rr * cc1 + ccc; + rix[4] = qix[4] + rr * cc1 + ccc; + rix[0][0] = 0.25f * (rix[4][ -2] + rix[4][ 2]) - xdiv2f(rix[4][ -1] + rix[4][0] + rix[4][ 1]); + rix[1][0] = 0.25f * (rix[4][-w2] + rix[4][w2]) - xdiv2f(rix[4][-w1] + rix[4][0] + rix[4][w1]); + rix[0][0] = LIM(rix[0][0], -1.0f, 0.0f) + rix[4][0]; + rix[1][0] = LIM(rix[1][0], -1.0f, 0.0f) + rix[4][0]; + } + } + +#ifdef _OPENMP + #pragma omp single +#endif + { + if (plistener) { + plistener->setProgress (0.2); + } + } + + + // apply low pass filter on differential colors +#ifdef _OPENMP + #pragma omp for +#endif + + for (int rr = 4; rr < rr1 - 4; rr++) + for (int cc = 4; cc < cc1 - 4; cc++) { + rix[0] = qix[0] + rr * cc1 + cc; + rix[2] = qix[2] + rr * cc1 + cc; + rix[2][0] = h0 * rix[0][0] + h1 * (rix[0][ -1] + rix[0][ 1]) + h2 * (rix[0][ -2] + rix[0][ 2]) + h3 * (rix[0][ -3] + rix[0][ 3]) + h4 * (rix[0][ -4] + rix[0][ 4]); + rix[1] = qix[1] + rr * cc1 + cc; + rix[3] = qix[3] + rr * cc1 + cc; + rix[3][0] = h0 * rix[1][0] + h1 * (rix[1][-w1] + rix[1][w1]) + h2 * (rix[1][-w2] + rix[1][w2]) + h3 * (rix[1][-w3] + rix[1][w3]) + h4 * (rix[1][-w4] + rix[1][w4]); + } + +#ifdef _OPENMP + #pragma omp single +#endif + { + if (plistener) { + plistener->setProgress (0.3); + } + } + + // interpolate G-R(B) at R(B) +#ifdef _OPENMP + #pragma omp for +#endif + + for (int rr = 4; rr < rr1 - 4; rr++) { + int cc = 4 + (FC(rr, 4) & 1); +#ifdef __SSE2__ + vfloat p1v, p2v, p3v, p4v, p5v, p6v, p7v, p8v, p9v, muv, vxv, vnv, xhv, vhv, xvv, vvv; + vfloat epsv = F2V(1e-7); + vfloat ninev = F2V(9.f); + + for (; cc < cc1 - 10; cc += 8) { + rix[0] = qix[0] + rr * cc1 + cc; + rix[1] = qix[1] + rr * cc1 + cc; + rix[2] = qix[2] + rr * cc1 + cc; + rix[3] = qix[3] + rr * cc1 + cc; + rix[4] = qix[4] + rr * cc1 + cc; + // horizontal + p1v = LC2VFU(rix[2][-4]); + p2v = LC2VFU(rix[2][-3]); + p3v = LC2VFU(rix[2][-2]); + p4v = LC2VFU(rix[2][-1]); + p5v = LC2VFU(rix[2][ 0]); + p6v = LC2VFU(rix[2][ 1]); + p7v = LC2VFU(rix[2][ 2]); + p8v = LC2VFU(rix[2][ 3]); + p9v = LC2VFU(rix[2][ 4]); + muv = (p1v + p2v + p3v + p4v + p5v + p6v + p7v + p8v + p9v) / ninev; + vxv = epsv + SQRV(p1v - muv) + SQRV(p2v - muv) + SQRV(p3v - muv) + SQRV(p4v - muv) + SQRV(p5v - muv) + SQRV(p6v - muv) + SQRV(p7v - muv) + SQRV(p8v - muv) + SQRV(p9v - muv); + p1v -= LC2VFU(rix[0][-4]); + p2v -= LC2VFU(rix[0][-3]); + p3v -= LC2VFU(rix[0][-2]); + p4v -= LC2VFU(rix[0][-1]); + p5v -= LC2VFU(rix[0][ 0]); + p6v -= LC2VFU(rix[0][ 1]); + p7v -= LC2VFU(rix[0][ 2]); + p8v -= LC2VFU(rix[0][ 3]); + p9v -= LC2VFU(rix[0][ 4]); + vnv = epsv + SQRV(p1v) + SQRV(p2v) + SQRV(p3v) + SQRV(p4v) + SQRV(p5v) + SQRV(p6v) + SQRV(p7v) + SQRV(p8v) + SQRV(p9v); + xhv = (LC2VFU(rix[0][0]) * vxv + LC2VFU(rix[2][0]) * vnv) / (vxv + vnv); + vhv = vxv * vnv / (vxv + vnv); + + // vertical + p1v = LC2VFU(rix[3][-w4]); + p2v = LC2VFU(rix[3][-w3]); + p3v = LC2VFU(rix[3][-w2]); + p4v = LC2VFU(rix[3][-w1]); + p5v = LC2VFU(rix[3][ 0]); + p6v = LC2VFU(rix[3][ w1]); + p7v = LC2VFU(rix[3][ w2]); + p8v = LC2VFU(rix[3][ w3]); + p9v = LC2VFU(rix[3][ w4]); + muv = (p1v + p2v + p3v + p4v + p5v + p6v + p7v + p8v + p9v) / ninev; + vxv = epsv + SQRV(p1v - muv) + SQRV(p2v - muv) + SQRV(p3v - muv) + SQRV(p4v - muv) + SQRV(p5v - muv) + SQRV(p6v - muv) + SQRV(p7v - muv) + SQRV(p8v - muv) + SQRV(p9v - muv); + p1v -= LC2VFU(rix[1][-w4]); + p2v -= LC2VFU(rix[1][-w3]); + p3v -= LC2VFU(rix[1][-w2]); + p4v -= LC2VFU(rix[1][-w1]); + p5v -= LC2VFU(rix[1][ 0]); + p6v -= LC2VFU(rix[1][ w1]); + p7v -= LC2VFU(rix[1][ w2]); + p8v -= LC2VFU(rix[1][ w3]); + p9v -= LC2VFU(rix[1][ w4]); + vnv = epsv + SQRV(p1v) + SQRV(p2v) + SQRV(p3v) + SQRV(p4v) + SQRV(p5v) + SQRV(p6v) + SQRV(p7v) + SQRV(p8v) + SQRV(p9v); + xvv = (LC2VFU(rix[1][0]) * vxv + LC2VFU(rix[3][0]) * vnv) / (vxv + vnv); + vvv = vxv * vnv / (vxv + vnv); + // interpolated G-R(B) + muv = (xhv * vvv + xvv * vhv) / (vhv + vvv); + STC2VFU(rix[4][0], muv); + } + +#endif + + for (; cc < cc1 - 4; cc += 2) { + rix[0] = qix[0] + rr * cc1 + cc; + rix[1] = qix[1] + rr * cc1 + cc; + rix[2] = qix[2] + rr * cc1 + cc; + rix[3] = qix[3] + rr * cc1 + cc; + rix[4] = qix[4] + rr * cc1 + cc; + // horizontal + float p1 = rix[2][-4]; + float p2 = rix[2][-3]; + float p3 = rix[2][-2]; + float p4 = rix[2][-1]; + float p5 = rix[2][ 0]; + float p6 = rix[2][ 1]; + float p7 = rix[2][ 2]; + float p8 = rix[2][ 3]; + float p9 = rix[2][ 4]; + float mu = (p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9) / 9.f; + float vx = 1e-7 + SQR(p1 - mu) + SQR(p2 - mu) + SQR(p3 - mu) + SQR(p4 - mu) + SQR(p5 - mu) + SQR(p6 - mu) + SQR(p7 - mu) + SQR(p8 - mu) + SQR(p9 - mu); + p1 -= rix[0][-4]; + p2 -= rix[0][-3]; + p3 -= rix[0][-2]; + p4 -= rix[0][-1]; + p5 -= rix[0][ 0]; + p6 -= rix[0][ 1]; + p7 -= rix[0][ 2]; + p8 -= rix[0][ 3]; + p9 -= rix[0][ 4]; + float vn = 1e-7 + SQR(p1) + SQR(p2) + SQR(p3) + SQR(p4) + SQR(p5) + SQR(p6) + SQR(p7) + SQR(p8) + SQR(p9); + float xh = (rix[0][0] * vx + rix[2][0] * vn) / (vx + vn); + float vh = vx * vn / (vx + vn); + + // vertical + p1 = rix[3][-w4]; + p2 = rix[3][-w3]; + p3 = rix[3][-w2]; + p4 = rix[3][-w1]; + p5 = rix[3][ 0]; + p6 = rix[3][ w1]; + p7 = rix[3][ w2]; + p8 = rix[3][ w3]; + p9 = rix[3][ w4]; + mu = (p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9) / 9.f; + vx = 1e-7 + SQR(p1 - mu) + SQR(p2 - mu) + SQR(p3 - mu) + SQR(p4 - mu) + SQR(p5 - mu) + SQR(p6 - mu) + SQR(p7 - mu) + SQR(p8 - mu) + SQR(p9 - mu); + p1 -= rix[1][-w4]; + p2 -= rix[1][-w3]; + p3 -= rix[1][-w2]; + p4 -= rix[1][-w1]; + p5 -= rix[1][ 0]; + p6 -= rix[1][ w1]; + p7 -= rix[1][ w2]; + p8 -= rix[1][ w3]; + p9 -= rix[1][ w4]; + vn = 1e-7 + SQR(p1) + SQR(p2) + SQR(p3) + SQR(p4) + SQR(p5) + SQR(p6) + SQR(p7) + SQR(p8) + SQR(p9); + float xv = (rix[1][0] * vx + rix[3][0] * vn) / (vx + vn); + float vv = vx * vn / (vx + vn); + // interpolated G-R(B) + rix[4][0] = (xh * vv + xv * vh) / (vh + vv); + } + } + +#ifdef _OPENMP + #pragma omp single +#endif + { + if (plistener) { + plistener->setProgress (0.4); + } + } + + // copy CFA values +#ifdef _OPENMP + #pragma omp for +#endif + + for (int rr = 0; rr < rr1; rr++) + for (int cc = 0, row = rr - ba; cc < cc1; cc++) { + int col = cc - ba; + int c = FC(rr, cc); + rix[c] = qix[c] + rr * cc1 + cc; + + if ((row >= 0) & (row < height) & (col >= 0) & (col < width)) { + rix[c][0] = (*gamtab)[rawData[row][col]]; + } else { + rix[c][0] = 0.f; + } + + if (c != 1) { + rix[1] = qix[1] + rr * cc1 + cc; + rix[4] = qix[4] + rr * cc1 + cc; + rix[1][0] = rix[c][0] + rix[4][0]; + } + } + +#ifdef _OPENMP + #pragma omp single +#endif + { + if (plistener) { + plistener->setProgress (0.5); + } + } + + // bilinear interpolation for R/B + // interpolate R/B at G location +#ifdef _OPENMP + #pragma omp for +#endif + + for (int rr = 1; rr < rr1 - 1; rr++) + for (int cc = 1 + (FC(rr, 2) & 1), c = FC(rr, cc + 1); cc < cc1 - 1; cc += 2) { + rix[c] = qix[c] + rr * cc1 + cc; + rix[1] = qix[1] + rr * cc1 + cc; + rix[c][0] = rix[1][0] + xdiv2f(rix[c][ -1] - rix[1][ -1] + rix[c][ 1] - rix[1][ 1]); + c = 2 - c; + rix[c] = qix[c] + rr * cc1 + cc; + rix[c][0] = rix[1][0] + xdiv2f(rix[c][-w1] - rix[1][-w1] + rix[c][w1] - rix[1][w1]); + c = 2 - c; + } + +#ifdef _OPENMP + #pragma omp single +#endif + { + if (plistener) { + plistener->setProgress (0.6); + } + } + + // interpolate R/B at B/R location +#ifdef _OPENMP + #pragma omp for +#endif + + for (int rr = 1; rr < rr1 - 1; rr++) + for (int cc = 1 + (FC(rr, 1) & 1), c = 2 - FC(rr, cc); cc < cc1 - 1; cc += 2) { + rix[c] = qix[c] + rr * cc1 + cc; + rix[1] = qix[1] + rr * cc1 + cc; + rix[c][0] = rix[1][0] + 0.25f * (rix[c][-w1] - rix[1][-w1] + rix[c][ -1] - rix[1][ -1] + rix[c][ 1] - rix[1][ 1] + rix[c][ w1] - rix[1][ w1]); + } + +#ifdef _OPENMP + #pragma omp single +#endif + { + if (plistener) { + plistener->setProgress (0.7); + } + } + + }// End of parallelization 1 + + // median filter/ + for (int pass = 0; pass < iter; pass++) { + // Apply 3x3 median filter + // Compute median(R-G) and median(B-G) + +#ifdef _OPENMP + #pragma omp parallel for private(rix) +#endif + + for (int rr = 1; rr < rr1 - 1; rr++) { + for (int c = 0; c < 3; c += 2) { + int d = c + 3 - (c == 0 ? 0 : 1); + int cc = 1; +#ifdef __SSE2__ + + for (; cc < cc1 - 4; cc += 4) { + rix[d] = qix[d] + rr * cc1 + cc; + rix[c] = qix[c] + rr * cc1 + cc; + rix[1] = qix[1] + rr * cc1 + cc; + // Assign 3x3 differential color values + const std::array p = { + LVFU(rix[c][-w1 - 1]) - LVFU(rix[1][-w1 - 1]), + LVFU(rix[c][-w1]) - LVFU(rix[1][-w1]), + LVFU(rix[c][-w1 + 1]) - LVFU(rix[1][-w1 + 1]), + LVFU(rix[c][ -1]) - LVFU(rix[1][ -1]), + LVFU(rix[c][ 0]) - LVFU(rix[1][ 0]), + LVFU(rix[c][ 1]) - LVFU(rix[1][ 1]), + LVFU(rix[c][ w1 - 1]) - LVFU(rix[1][ w1 - 1]), + LVFU(rix[c][ w1]) - LVFU(rix[1][ w1]), + LVFU(rix[c][ w1 + 1]) - LVFU(rix[1][ w1 + 1]) + }; + _mm_storeu_ps(&rix[d][0], median(p)); + } + +#endif + + for (; cc < cc1 - 1; cc++) { + rix[d] = qix[d] + rr * cc1 + cc; + rix[c] = qix[c] + rr * cc1 + cc; + rix[1] = qix[1] + rr * cc1 + cc; + // Assign 3x3 differential color values + const std::array p = { + rix[c][-w1 - 1] - rix[1][-w1 - 1], + rix[c][-w1] - rix[1][-w1], + rix[c][-w1 + 1] - rix[1][-w1 + 1], + rix[c][ -1] - rix[1][ -1], + rix[c][ 0] - rix[1][ 0], + rix[c][ 1] - rix[1][ 1], + rix[c][ w1 - 1] - rix[1][ w1 - 1], + rix[c][ w1] - rix[1][ w1], + rix[c][ w1 + 1] - rix[1][ w1 + 1] + }; + rix[d][0] = median(p); + } + } + } + + // red/blue at GREEN pixel locations & red/blue and green at BLUE/RED pixel locations +#ifdef _OPENMP + #pragma omp parallel for private (rix) +#endif + + for (int rr = 0; rr < rr1; rr++) { + rix[0] = qix[0] + rr * cc1; + rix[1] = qix[1] + rr * cc1; + rix[2] = qix[2] + rr * cc1; + rix[3] = qix[3] + rr * cc1; + rix[4] = qix[4] + rr * cc1; + int c0 = FC(rr, 0); + int c1 = FC(rr, 1); + + if (c0 == 1) { + c1 = 2 - c1; + int d = c1 + 3 - (c1 == 0 ? 0 : 1); + int cc; + + for (cc = 0; cc < cc1 - 1; cc += 2) { + rix[0][0] = rix[1][0] + rix[3][0]; + rix[2][0] = rix[1][0] + rix[4][0]; + rix[0]++; + rix[1]++; + rix[2]++; + rix[3]++; + rix[4]++; + rix[c1][0] = rix[1][0] + rix[d][0]; + rix[1][0] = 0.5f * (rix[0][0] - rix[3][0] + rix[2][0] - rix[4][0]); + rix[0]++; + rix[1]++; + rix[2]++; + rix[3]++; + rix[4]++; + } + + if (cc < cc1) { // remaining pixel, only if width is odd + rix[0][0] = rix[1][0] + rix[3][0]; + rix[2][0] = rix[1][0] + rix[4][0]; + } + } else { + c0 = 2 - c0; + int d = c0 + 3 - (c0 == 0 ? 0 : 1); + int cc; + + for (cc = 0; cc < cc1 - 1; cc += 2) { + rix[c0][0] = rix[1][0] + rix[d][0]; + rix[1][0] = 0.5f * (rix[0][0] - rix[3][0] + rix[2][0] - rix[4][0]); + rix[0]++; + rix[1]++; + rix[2]++; + rix[3]++; + rix[4]++; + rix[0][0] = rix[1][0] + rix[3][0]; + rix[2][0] = rix[1][0] + rix[4][0]; + rix[0]++; + rix[1]++; + rix[2]++; + rix[3]++; + rix[4]++; + } + + if (cc < cc1) { // remaining pixel, only if width is odd + rix[c0][0] = rix[1][0] + rix[d][0]; + rix[1][0] = 0.5f * (rix[0][0] - rix[3][0] + rix[2][0] - rix[4][0]); + } + } + } + } + + if (plistener) { + plistener->setProgress (0.8); + } + + if (applyGamma) { + gamtab = &(Color::igammatab_24_17); + } else { + gamtab->makeIdentity(); + } + + array2D* rgb[3]; + rgb[0] = &red; + rgb[1] = &green; + rgb[2] = &blue; + + // copy result back to image matrix +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int row = 0; row < height; row++) { + for (int col = 0, rr = row + ba; col < width; col++) { + int cc = col + ba; + int c = FC(row, col); + + for (int ii = 0; ii < 3; ii++) + if (ii != c) { + float *rix = qix[ii] + rr * cc1 + cc; + (*(rgb[ii]))[row][col] = (*gamtab)[65535.f * rix[0]]; + } else { + (*(rgb[ii]))[row][col] = CLIP(rawData[row][col]); + } + } + } + + if (plistener) { + plistener->setProgress (1.0); + } + + if (buffer) { + free(buffer); + } else + for (int i = 0; i < 5; i++) { + free(qix[i]); + } + + if (!applyGamma) { + delete gamtab; + } + + if (iterations > 4) { + refinement(passref); + } + +} + +#ifdef __SSE2__ +#define CLIPV(a) vclampf(a,ZEROV,c65535v) +#endif +void RawImageSource::refinement(int PassCount) +{ + int width = W; + int height = H; + int w1 = width; + int w2 = 2 * w1; + + if (plistener) { + plistener->setProgressStr(M("TP_RAW_DMETHOD_PROGRESSBAR_REFINE")); + } + + array2D *rgb[3]; + rgb[0] = &red; + rgb[1] = &green; + rgb[2] = &blue; + + for (int b = 0; b < PassCount; b++) { + if (plistener) { + plistener->setProgress((float)b / PassCount); + } + + +#ifdef _OPENMP + #pragma omp parallel +#endif + { + float *pix[3]; + + /* Reinforce interpolated green pixels on RED/BLUE pixel locations */ +#ifdef _OPENMP + #pragma omp for +#endif + + for (int row = 2; row < height - 2; row++) { + int col = 2 + (FC(row, 2) & 1); + int c = FC(row, col); +#ifdef __SSE2__ + vfloat dLv, dRv, dUv, dDv, v0v; + vfloat onev = F2V(1.f); + vfloat zd5v = F2V(0.5f); + vfloat c65535v = F2V(65535.f); + + for (; col < width - 8; col += 8) { + int indx = row * width + col; + pix[c] = (float*)(*rgb[c]) + indx; + pix[1] = (float*)(*rgb[1]) + indx; + dLv = onev / (onev + vabsf(LC2VFU(pix[c][ -2]) - LC2VFU(pix[c][0])) + vabsf(LC2VFU(pix[1][ 1]) - LC2VFU(pix[1][ -1]))); + dRv = onev / (onev + vabsf(LC2VFU(pix[c][ 2]) - LC2VFU(pix[c][0])) + vabsf(LC2VFU(pix[1][ 1]) - LC2VFU(pix[1][ -1]))); + dUv = onev / (onev + vabsf(LC2VFU(pix[c][-w2]) - LC2VFU(pix[c][0])) + vabsf(LC2VFU(pix[1][w1]) - LC2VFU(pix[1][-w1]))); + dDv = onev / (onev + vabsf(LC2VFU(pix[c][ w2]) - LC2VFU(pix[c][0])) + vabsf(LC2VFU(pix[1][w1]) - LC2VFU(pix[1][-w1]))); + v0v = CLIPV(LC2VFU(pix[c][0]) + zd5v + ((LC2VFU(pix[1][-1]) - LC2VFU(pix[c][-1])) * dLv + (LC2VFU(pix[1][1]) - LC2VFU(pix[c][1])) * dRv + (LC2VFU(pix[1][-w1]) - LC2VFU(pix[c][-w1])) * dUv + (LC2VFU(pix[1][w1]) - LC2VFU(pix[c][w1])) * dDv ) / (dLv + dRv + dUv + dDv)); + STC2VFU(pix[1][0], v0v); + } + +#endif + + for (; col < width - 2; col += 2) { + int indx = row * width + col; + pix[c] = (float*)(*rgb[c]) + indx; + pix[1] = (float*)(*rgb[1]) + indx; + float dL = 1.f / (1.f + fabsf(pix[c][ -2] - pix[c][0]) + fabsf(pix[1][ 1] - pix[1][ -1])); + float dR = 1.f / (1.f + fabsf(pix[c][ 2] - pix[c][0]) + fabsf(pix[1][ 1] - pix[1][ -1])); + float dU = 1.f / (1.f + fabsf(pix[c][-w2] - pix[c][0]) + fabsf(pix[1][w1] - pix[1][-w1])); + float dD = 1.f / (1.f + fabsf(pix[c][ w2] - pix[c][0]) + fabsf(pix[1][w1] - pix[1][-w1])); + float v0 = (pix[c][0] + 0.5f + ((pix[1][ -1] - pix[c][ -1]) * dL + (pix[1][ 1] - pix[c][ 1]) * dR + (pix[1][-w1] - pix[c][-w1]) * dU + (pix[1][ w1] - pix[c][ w1]) * dD ) / (dL + dR + dU + dD)); + pix[1][0] = CLIP(v0); + } + } + + /* Reinforce interpolated red/blue pixels on GREEN pixel locations */ +#ifdef _OPENMP + #pragma omp for +#endif + + for (int row = 2; row < height - 2; row++) { + int col = 2 + (FC(row, 3) & 1); + int c = FC(row, col + 1); +#ifdef __SSE2__ + vfloat dLv, dRv, dUv, dDv, v0v; + vfloat onev = F2V(1.f); + vfloat zd5v = F2V(0.5f); + vfloat c65535v = F2V(65535.f); + + for (; col < width - 8; col += 8) { + int indx = row * width + col; + pix[1] = (float*)(*rgb[1]) + indx; + + for (int i = 0; i < 2; c = 2 - c, i++) { + pix[c] = (float*)(*rgb[c]) + indx; + dLv = onev / (onev + vabsf(LC2VFU(pix[1][ -2]) - LC2VFU(pix[1][0])) + vabsf(LC2VFU(pix[c][ 1]) - LC2VFU(pix[c][ -1]))); + dRv = onev / (onev + vabsf(LC2VFU(pix[1][ 2]) - LC2VFU(pix[1][0])) + vabsf(LC2VFU(pix[c][ 1]) - LC2VFU(pix[c][ -1]))); + dUv = onev / (onev + vabsf(LC2VFU(pix[1][-w2]) - LC2VFU(pix[1][0])) + vabsf(LC2VFU(pix[c][w1]) - LC2VFU(pix[c][-w1]))); + dDv = onev / (onev + vabsf(LC2VFU(pix[1][ w2]) - LC2VFU(pix[1][0])) + vabsf(LC2VFU(pix[c][w1]) - LC2VFU(pix[c][-w1]))); + v0v = CLIPV(LC2VFU(pix[1][0]) + zd5v - ((LC2VFU(pix[1][-1]) - LC2VFU(pix[c][-1])) * dLv + (LC2VFU(pix[1][1]) - LC2VFU(pix[c][1])) * dRv + (LC2VFU(pix[1][-w1]) - LC2VFU(pix[c][-w1])) * dUv + (LC2VFU(pix[1][w1]) - LC2VFU(pix[c][w1])) * dDv ) / (dLv + dRv + dUv + dDv)); + STC2VFU(pix[c][0], v0v); + } + } + +#endif + + for (; col < width - 2; col += 2) { + int indx = row * width + col; + pix[1] = (float*)(*rgb[1]) + indx; + + for (int i = 0; i < 2; c = 2 - c, i++) { + pix[c] = (float*)(*rgb[c]) + indx; + float dL = 1.f / (1.f + fabsf(pix[1][ -2] - pix[1][0]) + fabsf(pix[c][ 1] - pix[c][ -1])); + float dR = 1.f / (1.f + fabsf(pix[1][ 2] - pix[1][0]) + fabsf(pix[c][ 1] - pix[c][ -1])); + float dU = 1.f / (1.f + fabsf(pix[1][-w2] - pix[1][0]) + fabsf(pix[c][w1] - pix[c][-w1])); + float dD = 1.f / (1.f + fabsf(pix[1][ w2] - pix[1][0]) + fabsf(pix[c][w1] - pix[c][-w1])); + float v0 = (pix[1][0] + 0.5f - ((pix[1][ -1] - pix[c][ -1]) * dL + (pix[1][ 1] - pix[c][ 1]) * dR + (pix[1][-w1] - pix[c][-w1]) * dU + (pix[1][ w1] - pix[c][ w1]) * dD ) / (dL + dR + dU + dD)); + pix[c][0] = CLIP(v0); + } + } + } + + /* Reinforce integrated red/blue pixels on BLUE/RED pixel locations */ +#ifdef _OPENMP + #pragma omp for +#endif + + for (int row = 2; row < height - 2; row++) { + int col = 2 + (FC(row, 2) & 1); + int c = 2 - FC(row, col); +#ifdef __SSE2__ + vfloat dLv, dRv, dUv, dDv, v0v; + vfloat onev = F2V(1.f); + vfloat zd5v = F2V(0.5f); + vfloat c65535v = F2V(65535.f); + + for (; col < width - 8; col += 8) { + int indx = row * width + col; + pix[0] = (float*)(*rgb[0]) + indx; + pix[1] = (float*)(*rgb[1]) + indx; + pix[2] = (float*)(*rgb[2]) + indx; + int d = 2 - c; + dLv = onev / (onev + vabsf(LC2VFU(pix[d][ -2]) - LC2VFU(pix[d][0])) + vabsf(LC2VFU(pix[1][ 1]) - LC2VFU(pix[1][ -1]))); + dRv = onev / (onev + vabsf(LC2VFU(pix[d][ 2]) - LC2VFU(pix[d][0])) + vabsf(LC2VFU(pix[1][ 1]) - LC2VFU(pix[1][ -1]))); + dUv = onev / (onev + vabsf(LC2VFU(pix[d][-w2]) - LC2VFU(pix[d][0])) + vabsf(LC2VFU(pix[1][w1]) - LC2VFU(pix[1][-w1]))); + dDv = onev / (onev + vabsf(LC2VFU(pix[d][ w2]) - LC2VFU(pix[d][0])) + vabsf(LC2VFU(pix[1][w1]) - LC2VFU(pix[1][-w1]))); + v0v = CLIPV(LC2VFU(pix[1][0]) + zd5v - ((LC2VFU(pix[1][-1]) - LC2VFU(pix[c][-1])) * dLv + (LC2VFU(pix[1][1]) - LC2VFU(pix[c][1])) * dRv + (LC2VFU(pix[1][-w1]) - LC2VFU(pix[c][-w1])) * dUv + (LC2VFU(pix[1][w1]) - LC2VFU(pix[c][w1])) * dDv ) / (dLv + dRv + dUv + dDv)); + STC2VFU(pix[c][0], v0v); + } + +#endif + + for (; col < width - 2; col += 2) { + int indx = row * width + col; + pix[0] = (float*)(*rgb[0]) + indx; + pix[1] = (float*)(*rgb[1]) + indx; + pix[2] = (float*)(*rgb[2]) + indx; + int d = 2 - c; + float dL = 1.f / (1.f + fabsf(pix[d][ -2] - pix[d][0]) + fabsf(pix[1][ 1] - pix[1][ -1])); + float dR = 1.f / (1.f + fabsf(pix[d][ 2] - pix[d][0]) + fabsf(pix[1][ 1] - pix[1][ -1])); + float dU = 1.f / (1.f + fabsf(pix[d][-w2] - pix[d][0]) + fabsf(pix[1][w1] - pix[1][-w1])); + float dD = 1.f / (1.f + fabsf(pix[d][ w2] - pix[d][0]) + fabsf(pix[1][w1] - pix[1][-w1])); + float v0 = (pix[1][0] + 0.5f - ((pix[1][ -1] - pix[c][ -1]) * dL + (pix[1][ 1] - pix[c][ 1]) * dR + (pix[1][-w1] - pix[c][-w1]) * dU + (pix[1][ w1] - pix[c][ w1]) * dD ) / (dL + dR + dU + dD)); + pix[c][0] = CLIP(v0); + } + } + } // end parallel + } +} +#ifdef __SSE2__ +#undef CLIPV +#endif + +} /* namespace */ diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index f7d905357..28cf30010 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -129,7 +129,6 @@ public: void flushRawData () override; void flushRGB () override; void HLRecovery_Global (const procparams::ToneCurveParams &hrp) override; - void refinement_lassus (int PassCount); void refinement(int PassCount); void setBorder(unsigned int rawBorder) override {border = rawBorder;} bool isRGBSourceModified() const override @@ -267,7 +266,7 @@ protected: void hphd_demosaic(); void vng4_demosaic(const array2D &rawData, array2D &red, array2D &green, array2D &blue); void igv_interpolate(int winw, int winh); - void lmmse_interpolate_omp(int winw, int winh, array2D &rawData, array2D &red, array2D &green, array2D &blue, int iterations); + void lmmse_interpolate_omp(int winw, int winh, const array2D &rawData, array2D &red, array2D &green, array2D &blue, int iterations); void amaze_demosaic_RT(int winx, int winy, int winw, int winh, const array2D &rawData, array2D &red, array2D &green, array2D &blue, size_t chunkSize = 1, bool measure = false);//Emil's code for AMaZE void dual_demosaic_RT(bool isBayer, const procparams::RAWParams &raw, int winw, int winh, const array2D &rawData, array2D &red, array2D &green, array2D &blue, double &contrast, bool autoContrast = false); void fast_demosaic();//Emil's code for fast demosaicing From 8f82a8362afe90151b2d3d95339fdd13e2e2b122 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Fri, 6 Dec 2019 08:18:17 +0100 Subject: [PATCH 204/208] Finalize `const`/`bool` cleanup --- rtengine/canon_cr3_decoder.cc | 445 ++++++++++++++++++---------------- rtengine/dcraw.h | 4 +- 2 files changed, 236 insertions(+), 213 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index f436c759e..3912af6b4 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -503,7 +503,7 @@ int DCraw::parseCR3( goto fin; } - if (!crxParseImageHeader(CMP1, nTrack)) { + if (crxParseImageHeader(CMP1, nTrack)) { RT_canon_CR3_data.crx_header[nTrack].MediaType = 1; } } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAWJPEG")) { @@ -2302,64 +2302,63 @@ void crxFreeSubbandData(CrxImage* image, CrxPlaneComp* comp) } } -void crxConvertPlaneLine(CrxImage* img, int imageRow, int imageCol = 0, - int plane = 0, const std::int32_t* lineData = nullptr, - int lineLength = 0) +void crxConvertPlaneLine( + CrxImage* img, + int imageRow, + int imageCol = 0, + int plane = 0, + const std::int32_t* lineData = nullptr, + int lineLength = 0 +) { if (lineData) { std::uint64_t rawOffset = 4 * img->planeWidth * imageRow + 2 * imageCol; if (img->encType == 1) { - std::int32_t maxVal = 1 << (img->nBits - 1); - std::int32_t minVal = -maxVal; - --maxVal; + const std::int32_t maxVal = 1 << (img->nBits - 1); + const std::int32_t minVal = -maxVal; for (int i = 0; i < lineLength; ++i) { - img->outBufs[plane][rawOffset + 2 * i] = - rtengine::LIM(lineData[i], minVal, maxVal); + img->outBufs[plane][rawOffset + 2 * i] = rtengine::LIM(lineData[i], minVal, maxVal - 1); } } else if (img->encType == 3) { // copy to intermediate planeBuf - rawOffset = plane * img->planeWidth * img->planeHeight + - img->planeWidth * imageRow + imageCol; + rawOffset = plane * img->planeWidth * img->planeHeight + img->planeWidth * imageRow + imageCol; for (int i = 0; i < lineLength; ++i) { img->planeBuf[rawOffset + i] = lineData[i]; } } else if (img->nPlanes == 4) { - std::int32_t median = 1 << (img->nBits - 1); - std::int32_t maxVal = (1 << img->nBits) - 1; + const std::int32_t median = 1 << (img->nBits - 1); + const std::int32_t maxVal = (1 << img->nBits) - 1; for (int i = 0; i < lineLength; ++i) { - img->outBufs[plane][rawOffset + 2 * i] = - rtengine::LIM(median + lineData[i], 0, maxVal); + img->outBufs[plane][rawOffset + 2 * i] = rtengine::LIM(median + lineData[i], 0, maxVal); } } else if (img->nPlanes == 1) { - std::int32_t maxVal = (1 << img->nBits) - 1; - std::int32_t median = 1 << (img->nBits - 1); + const std::int32_t maxVal = (1 << img->nBits) - 1; + const std::int32_t median = 1 << (img->nBits - 1); + rawOffset = img->planeWidth * imageRow + imageCol; for (int i = 0; i < lineLength; ++i) { - img->outBufs[0][rawOffset + i] = - rtengine::LIM(median + lineData[i], 0, maxVal); + img->outBufs[0][rawOffset + i] = rtengine::LIM(median + lineData[i], 0, maxVal); } } } else if (img->encType == 3 && img->planeBuf) { - std::int32_t planeSize = img->planeWidth * img->planeHeight; - std::int16_t* plane0 = img->planeBuf + imageRow * img->planeWidth; - std::int16_t* plane1 = plane0 + planeSize; - std::int16_t* plane2 = plane1 + planeSize; - std::int16_t* plane3 = plane2 + planeSize; + const std::int32_t planeSize = img->planeWidth * img->planeHeight; + const std::int16_t* const plane0 = img->planeBuf + imageRow * img->planeWidth; + const std::int16_t* const plane1 = plane0 + planeSize; + const std::int16_t* const plane2 = plane1 + planeSize; + const std::int16_t* const plane3 = plane2 + planeSize; - std::int32_t median = 1 << (img->nBits - 1) << 10; - std::int32_t maxVal = (1 << img->nBits) - 1; - std::uint32_t rawLineOffset = 4 * img->planeWidth * imageRow; + const std::int32_t median = 1 << (img->nBits - 1) << 10; + const std::int32_t maxVal = (1 << img->nBits) - 1; + const std::uint32_t rawLineOffset = 4 * img->planeWidth * imageRow; // for this stage - all except imageRow is ignored for (int i = 0; i < img->planeWidth; ++i) { - std::int32_t gr = - median + (plane0[i] << 10) - 168 * plane1[i] - 585 * plane3[i]; - std::int32_t val = 0; + std::int32_t gr = median + (plane0[i] << 10) - 168 * plane1[i] - 585 * plane3[i]; if (gr < 0) { gr = -(((std::abs(gr) + 512) >> 9) & ~1); @@ -2368,7 +2367,7 @@ void crxConvertPlaneLine(CrxImage* img, int imageRow, int imageCol = 0, } // Essentially R = round(median + P0 + 1.474*P3) - val = (median + (plane0[i] << 10) + 1510 * plane3[i] + 512) >> 10; + std::int32_t val = (median + (plane0[i] << 10) + 1510 * plane3[i] + 512) >> 10; img->outBufs[0][rawLineOffset + 2 * i] = rtengine::LIM(val, 0, maxVal); // Essentially G1 = round(median + P0 + P2 - 0.164*P1 - 0.571*P3) val = (plane2[i] + gr + 1) >> 1; @@ -2383,18 +2382,27 @@ void crxConvertPlaneLine(CrxImage* img, int imageRow, int imageCol = 0, } } -int crxParamInit(CrxBandParam** param, std::uint64_t subbandMdatOffset, - std::uint64_t subbandDataSize, std::uint32_t subbandWidth, - std::uint32_t subbandHeight, std::int32_t supportsPartial, - std::uint32_t roundedBitsMask, LibRaw_abstract_datastream* input) +bool crxParamInit( + CrxBandParam** param, + std::uint64_t subbandMdatOffset, + std::uint64_t subbandDataSize, + std::uint32_t subbandWidth, + std::uint32_t subbandHeight, + std::int32_t supportsPartial, + std::uint32_t roundedBitsMask, + LibRaw_abstract_datastream* input +) { - std::int32_t progrDataSize = supportsPartial ? 0 : sizeof(std::int32_t) * subbandWidth; - std::int32_t paramLength = 2 * subbandWidth + 4; - std::uint8_t* paramBuf = static_cast(calloc( - 1, sizeof(CrxBandParam) + sizeof(std::int32_t) * paramLength + progrDataSize)); + const std::int32_t progrDataSize = + supportsPartial + ? 0 + : sizeof(std::int32_t) * subbandWidth; + const std::int32_t paramLength = 2 * subbandWidth + 4; + + std::uint8_t* paramBuf = static_cast(calloc(1, sizeof(CrxBandParam) + sizeof(std::int32_t) * paramLength + progrDataSize)); if (!paramBuf) { - return -1; + return false; } *param = reinterpret_cast(paramBuf); @@ -2403,7 +2411,9 @@ int crxParamInit(CrxBandParam** param, std::uint64_t subbandMdatOffset, (*param)->paramData = reinterpret_cast(paramBuf); (*param)->nonProgrData = - progrDataSize ? (*param)->paramData + paramLength : nullptr; + progrDataSize + ? (*param)->paramData + paramLength + : nullptr; (*param)->subbandWidth = subbandWidth; (*param)->subbandHeight = subbandHeight; (*param)->roundedBits = 0; @@ -2420,39 +2430,42 @@ int crxParamInit(CrxBandParam** param, std::uint64_t subbandMdatOffset, crxFillBuffer(&(*param)->bitStream); - return 0; + return true; } -int crxSetupSubbandData(CrxImage* img, CrxPlaneComp* planeComp, - const CrxTile* tile, std::uint32_t mdatOffset) +bool crxSetupSubbandData( + CrxImage* img, + CrxPlaneComp* planeComp, + const CrxTile* tile, + std::uint32_t mdatOffset +) { long compDataSize = 0; long waveletDataOffset = 0; long compCoeffDataOffset = 0; - std::int32_t toSubbands = 3 * img->levels + 1; - std::int32_t transformWidth = 0; + const std::int32_t toSubbands = 3 * img->levels + 1; - CrxSubband* subbands = planeComp->subBands; + CrxSubband* const subbands = planeComp->subBands; // calculate sizes for (std::int32_t subbandNum = 0; subbandNum < toSubbands; ++subbandNum) { - subbands[subbandNum].bandSize = - subbands[subbandNum].width * sizeof(std::int32_t); // 4bytes + subbands[subbandNum].bandSize = subbands[subbandNum].width * sizeof(std::int32_t); // 4 bytes compDataSize += subbands[subbandNum].bandSize; } if (img->levels) { - std::int32_t encLevels = img->levels ? img->levels : 1; + const std::int32_t encLevels = + img->levels + ? img->levels + : 1; waveletDataOffset = (compDataSize + 7) & ~7; - compDataSize = - (sizeof(CrxWaveletTransform) * encLevels + waveletDataOffset + 7) & ~7; + compDataSize = (sizeof(CrxWaveletTransform) * encLevels + waveletDataOffset + 7) & ~7; compCoeffDataOffset = compDataSize; // calc wavelet line buffer sizes (always at one level up from current) for (int level = 0; level < img->levels; ++level) { if (level < img->levels - 1) { - compDataSize += 8 * sizeof(std::int32_t) * - planeComp->subBands[3 * (level + 1) + 2].width; + compDataSize += 8 * sizeof(std::int32_t) * planeComp->subBands[3 * (level + 1) + 2].width; } else { compDataSize += 8 * sizeof(std::int32_t) * tile->width; } @@ -2463,31 +2476,31 @@ int crxSetupSubbandData(CrxImage* img, CrxPlaneComp* planeComp, planeComp->compBuf = static_cast(malloc(compDataSize)); if (!planeComp->compBuf) { - return -1; + return false; } // subbands buffer and sizes initialisation - std::uint64_t subbandMdatOffset = img->mdatOffset + mdatOffset; + const std::uint64_t subbandMdatOffset = img->mdatOffset + mdatOffset; std::uint8_t* subbandBuf = planeComp->compBuf; for (std::int32_t subbandNum = 0; subbandNum < toSubbands; ++subbandNum) { subbands[subbandNum].bandBuf = subbandBuf; subbandBuf += subbands[subbandNum].bandSize; - subbands[subbandNum].mdatOffset = - subbandMdatOffset + subbands[subbandNum].dataOffset; + subbands[subbandNum].mdatOffset = subbandMdatOffset + subbands[subbandNum].dataOffset; } // wavelet data initialisation if (img->levels) { - CrxWaveletTransform* waveletTransforms = - reinterpret_cast(planeComp->compBuf + waveletDataOffset); + CrxWaveletTransform* const waveletTransforms = reinterpret_cast(planeComp->compBuf + waveletDataOffset); std::int32_t* paramData = reinterpret_cast(planeComp->compBuf + compCoeffDataOffset); planeComp->waveletTransform = waveletTransforms; waveletTransforms[0].subband0Buf = reinterpret_cast(subbands->bandBuf); for (int level = 0; level < img->levels; ++level) { - std::int32_t band = 3 * level + 1; + const std::int32_t band = 3 * level + 1; + + std::int32_t transformWidth = 0; if (level >= img->levels - 1) { waveletTransforms[level].height = tile->height; @@ -2499,28 +2512,19 @@ int crxSetupSubbandData(CrxImage* img, CrxPlaneComp* planeComp, waveletTransforms[level].width = transformWidth; waveletTransforms[level].lineBuf[0] = paramData; - waveletTransforms[level].lineBuf[1] = - waveletTransforms[level].lineBuf[0] + transformWidth; - waveletTransforms[level].lineBuf[2] = - waveletTransforms[level].lineBuf[1] + transformWidth; - waveletTransforms[level].lineBuf[3] = - waveletTransforms[level].lineBuf[2] + transformWidth; - waveletTransforms[level].lineBuf[4] = - waveletTransforms[level].lineBuf[3] + transformWidth; - waveletTransforms[level].lineBuf[5] = - waveletTransforms[level].lineBuf[4] + transformWidth; - waveletTransforms[level].lineBuf[6] = - waveletTransforms[level].lineBuf[5] + transformWidth; - waveletTransforms[level].lineBuf[7] = - waveletTransforms[level].lineBuf[6] + transformWidth; + waveletTransforms[level].lineBuf[1] = waveletTransforms[level].lineBuf[0] + transformWidth; + waveletTransforms[level].lineBuf[2] = waveletTransforms[level].lineBuf[1] + transformWidth; + waveletTransforms[level].lineBuf[3] = waveletTransforms[level].lineBuf[2] + transformWidth; + waveletTransforms[level].lineBuf[4] = waveletTransforms[level].lineBuf[3] + transformWidth; + waveletTransforms[level].lineBuf[5] = waveletTransforms[level].lineBuf[4] + transformWidth; + waveletTransforms[level].lineBuf[6] = waveletTransforms[level].lineBuf[5] + transformWidth; + waveletTransforms[level].lineBuf[7] = waveletTransforms[level].lineBuf[6] + transformWidth; waveletTransforms[level].curLine = 0; waveletTransforms[level].curH = 0; waveletTransforms[level].fltTapH = 0; waveletTransforms[level].subband1Buf = reinterpret_cast(subbands[band].bandBuf); - waveletTransforms[level].subband2Buf = - reinterpret_cast(subbands[band + 1].bandBuf); - waveletTransforms[level].subband3Buf = - reinterpret_cast(subbands[band + 2].bandBuf); + waveletTransforms[level].subband2Buf = reinterpret_cast(subbands[band + 1].bandBuf); + waveletTransforms[level].subband3Buf = reinterpret_cast(subbands[band + 2].bandBuf); paramData = waveletTransforms[level].lineBuf[7] + transformWidth; } @@ -2537,71 +2541,73 @@ int crxSetupSubbandData(CrxImage* img, CrxPlaneComp* planeComp, supportsPartial = 1; } - if (crxParamInit(&subbands[subbandNum].bandParam, - subbands[subbandNum].mdatOffset, - subbands[subbandNum].dataSize, - subbands[subbandNum].width, subbands[subbandNum].height, - supportsPartial, roundedBitsMask, img->input)) { - return -1; + if ( + !crxParamInit( + &subbands[subbandNum].bandParam, + subbands[subbandNum].mdatOffset, + subbands[subbandNum].dataSize, + subbands[subbandNum].width, + subbands[subbandNum].height, + supportsPartial, + roundedBitsMask, + img->input + ) + ) { + return false; } } } - return 0; + return true; } -} // namespace -int DCraw::crxDecodePlane(void* p, std::uint32_t planeNumber) +} // namespace + +bool DCraw::crxDecodePlane(void* p, std::uint32_t planeNumber) { - CrxImage* img = static_cast(p); + CrxImage* const img = static_cast(p); int imageRow = 0; for (int tRow = 0; tRow < img->tileRows; ++tRow) { int imageCol = 0; for (int tCol = 0; tCol < img->tileCols; ++tCol) { - CrxTile* tile = img->tiles + tRow * img->tileRows + tCol; - CrxPlaneComp* planeComp = tile->comps + planeNumber; - std::uint64_t tileMdatOffset = tile->dataOffset + planeComp->dataOffset; + const CrxTile* const tile = img->tiles + tRow * img->tileRows + tCol; + CrxPlaneComp* const planeComp = tile->comps + planeNumber; + const std::uint64_t tileMdatOffset = tile->dataOffset + planeComp->dataOffset; // decode single tile - if (crxSetupSubbandData(img, planeComp, tile, tileMdatOffset)) { - return -1; + if (!crxSetupSubbandData(img, planeComp, tile, tileMdatOffset)) { + return false; } if (img->levels) { if (!crxIdwt53FilterInitialize(planeComp, img->levels - 1)) { - return -1; + return false; } for (int i = 0; i < tile->height; ++i) { - if (!crxIdwt53FilterDecode(planeComp, img->levels - 1) || - !crxIdwt53FilterTransform(planeComp, img->levels - 1)) { - return -1; + if (!crxIdwt53FilterDecode(planeComp, img->levels - 1) || !crxIdwt53FilterTransform(planeComp, img->levels - 1)) { + return false; } - std::int32_t* lineData = - crxIdwt53FilterGetLine(planeComp, img->levels - 1); - crxConvertPlaneLine(img, imageRow + i, imageCol, planeNumber, - lineData, tile->width); + const std::int32_t* const lineData = crxIdwt53FilterGetLine(planeComp, img->levels - 1); + crxConvertPlaneLine(img, imageRow + i, imageCol, planeNumber, lineData, tile->width); } } else { // we have the only subband in this case if (!planeComp->subBands->dataSize) { - memset(planeComp->subBands->bandBuf, 0, - planeComp->subBands->bandSize); - return 0; + memset(planeComp->subBands->bandBuf, 0, planeComp->subBands->bandSize); + return true; } for (int i = 0; i < tile->height; ++i) { - if (!crxDecodeLine(planeComp->subBands->bandParam, - planeComp->subBands->bandBuf)) { - return -1; + if (!crxDecodeLine(planeComp->subBands->bandParam, planeComp->subBands->bandBuf)) { + return false; } - std::int32_t* lineData = reinterpret_cast(planeComp->subBands->bandBuf); - crxConvertPlaneLine(img, imageRow + i, imageCol, planeNumber, - lineData, tile->width); + const std::int32_t* const lineData = reinterpret_cast(planeComp->subBands->bandBuf); + crxConvertPlaneLine(img, imageRow + i, imageCol, planeNumber, lineData, tile->width); } } @@ -2611,7 +2617,7 @@ int DCraw::crxDecodePlane(void* p, std::uint32_t planeNumber) imageRow += img->tiles[tRow * img->tileRows].height; } - return 0; + return true; } namespace @@ -2619,9 +2625,13 @@ namespace using crx_data_header_t = DCraw::CanonCR3Data::crx_data_header_t; -int crxReadSubbandHeaders(CrxImage* img, CrxTile* tile, - CrxPlaneComp* comp, std::uint8_t** subbandMdatPtr, - std::uint32_t* mdatSize) +bool crxReadSubbandHeaders( + CrxImage* img, + CrxTile* tile, + CrxPlaneComp* comp, + std::uint8_t** subbandMdatPtr, + std::uint32_t* mdatSize +) { CrxSubband* band = comp->subBands + img->subbandCount - 1; // set to last band std::uint32_t bandHeight = tile->height; @@ -2635,14 +2645,12 @@ int crxReadSubbandHeaders(CrxImage* img, CrxTile* tile, // Coefficient structure is a bit unclear and convoluted: // 3 levels max - 8 groups (for tile width rounded to 8 bytes) // of 3 band per level 4 sets of coefficients for each - const std::int32_t* rowExCoef = - exCoefNumTbl + 0x60 * (img->levels - 1) + 12 * (tile->width & 7); - const std::int32_t* colExCoef = - exCoefNumTbl + 0x60 * (img->levels - 1) + 12 * (tile->height & 7); + const std::int32_t* rowExCoef = exCoefNumTbl + 0x60 * (img->levels - 1) + 12 * (tile->width & 7); + const std::int32_t* colExCoef = exCoefNumTbl + 0x60 * (img->levels - 1) + 12 * (tile->height & 7); for (int level = 0; level < img->levels; ++level) { - std::int32_t widthOddPixel = bandWidth & 1; - std::int32_t heightOddPixel = bandHeight & 1; + const std::int32_t widthOddPixel = bandWidth & 1; + const std::int32_t heightOddPixel = bandHeight & 1; bandWidth = (widthOddPixel + bandWidth) >> 1; bandHeight = (heightOddPixel + bandHeight) >> 1; @@ -2683,18 +2691,15 @@ int crxReadSubbandHeaders(CrxImage* img, CrxTile* tile, band -= 3; } - bandWidthExCoef = bandHeightExCoef = 0; + bandWidthExCoef = 0; + bandHeightExCoef = 0; if (tile->tileFlag & E_HAS_TILES_ON_THE_RIGHT) { - bandWidthExCoef = - exCoefNumTbl[0x60 * (img->levels - 1) + 12 * (tile->width & 7) + - 4 * (img->levels - 1) + 1]; + bandWidthExCoef = exCoefNumTbl[0x60 * (img->levels - 1) + 12 * (tile->width & 7) + 4 * (img->levels - 1) + 1]; } if (tile->tileFlag & E_HAS_TILES_ON_THE_BOTTOM) { - bandHeightExCoef = - exCoefNumTbl[0x60 * (img->levels - 1) + 12 * (tile->height & 7) + - 4 * (img->levels - 1) + 1]; + bandHeightExCoef = exCoefNumTbl[0x60 * (img->levels - 1) + 12 * (tile->height & 7) + 4 * (img->levels - 1) + 1]; } } @@ -2702,7 +2707,7 @@ int crxReadSubbandHeaders(CrxImage* img, CrxTile* tile, band->height = bandHeightExCoef + bandHeight; if (!img->subbandCount) { - return 0; + return true; } std::int32_t subbandOffset = 0; @@ -2710,19 +2715,19 @@ int crxReadSubbandHeaders(CrxImage* img, CrxTile* tile, for (unsigned int curSubband = 0; curSubband < img->subbandCount; curSubband++, band++) { if (*mdatSize < 0xC) { - return -1; + return false; } if (sgetn(2, *subbandMdatPtr) != 0xFF03) { - return -1; + return false; } - std::uint32_t bitData = sgetn(4, *subbandMdatPtr + 8); - std::uint32_t subbandSize = sgetn(4, *subbandMdatPtr + 4); + const std::uint32_t bitData = sgetn(4, *subbandMdatPtr + 8); + const std::uint32_t subbandSize = sgetn(4, *subbandMdatPtr + 4); if (curSubband != bitData >> 28) { band->dataSize = subbandSize; - return -1; + return false; } band->dataSize = subbandSize - (bitData & 0x7FF); @@ -2740,32 +2745,39 @@ int crxReadSubbandHeaders(CrxImage* img, CrxTile* tile, *mdatSize -= 0xC; } - return 0; + return true; } -int crxReadImageHeaders(crx_data_header_t* hdr, CrxImage* img, std::uint8_t* mdatPtr, - std::uint32_t mdatSize) +bool crxReadImageHeaders( + crx_data_header_t* hdr, + CrxImage* img, + std::uint8_t* mdatPtr, + std::uint32_t mdatSize +) { - unsigned int nTiles = img->tileRows * img->tileCols; + const unsigned int nTiles = img->tileRows * img->tileCols; if (!nTiles) { - return -1; + return false; } if (!img->tiles) { - img->tiles = static_cast(malloc( - sizeof(CrxTile) * nTiles + - sizeof(CrxPlaneComp) * nTiles * img->nPlanes + - sizeof(CrxSubband) * nTiles * img->nPlanes * img->subbandCount)); + img->tiles = static_cast( + malloc( + sizeof(CrxTile) * nTiles + + sizeof(CrxPlaneComp) * nTiles * img->nPlanes + + sizeof(CrxSubband) * nTiles * img->nPlanes * img->subbandCount + ) + ); if (!img->tiles) { - return -1; + return false; } // memory areas in allocated chunk CrxTile* tile = img->tiles; - CrxPlaneComp* comps = reinterpret_cast(tile + nTiles); - CrxSubband* bands = reinterpret_cast(comps + img->nPlanes * nTiles); + CrxPlaneComp* const comps = reinterpret_cast(tile + nTiles); + CrxSubband* const bands = reinterpret_cast(comps + img->nPlanes * nTiles); for (unsigned int curTile = 0; curTile < nTiles; curTile++, tile++) { tile->tileFlag = 0; // tile neighbouring flags @@ -2827,8 +2839,7 @@ int crxReadImageHeaders(crx_data_header_t* hdr, CrxImage* img, std::uint8_t* mda comp->waveletTransform = nullptr; if (img->subbandCount) { - for (int curBand = 0; curBand < img->subbandCount; - curBand++, band++) { + for (int curBand = 0; curBand < img->subbandCount; curBand++, band++) { band->supportsPartial = 0; band->quantValue = 4; band->bandParam = nullptr; @@ -2847,15 +2858,15 @@ int crxReadImageHeaders(crx_data_header_t* hdr, CrxImage* img, std::uint8_t* mda for (unsigned int curTile = 0; curTile < nTiles; curTile++, tile++) { if (dataSize < 0xC) { - return -1; + return false; } if (sgetn(2, dataPtr) != 0xFF01) { - return -1; + return false; } if (sgetn(2, dataPtr + 8) != curTile) { - return -1; + return false; } dataSize -= 0xC; @@ -2863,7 +2874,7 @@ int crxReadImageHeaders(crx_data_header_t* hdr, CrxImage* img, std::uint8_t* mda tile->tileSize = sgetn(4, dataPtr + 4); tile->dataOffset = tileOffset; - std::int32_t hdrExtraBytes = sgetn(2, dataPtr + 2) - 8; + const std::int32_t hdrExtraBytes = sgetn(2, dataPtr + 2) - 8; tileOffset += tile->tileSize; dataPtr += hdrExtraBytes + 0xC; dataSize -= hdrExtraBytes; @@ -2873,15 +2884,15 @@ int crxReadImageHeaders(crx_data_header_t* hdr, CrxImage* img, std::uint8_t* mda for (int compNum = 0; compNum < img->nPlanes; compNum++, comp++) { if (dataSize < 0xC) { - return -1; + return false; } if (sgetn(2, dataPtr) != 0xFF02) { - return -1; + return false; } if (compNum != dataPtr[8] >> 4) { - return -1; + return false; } comp->compSize = sgetn(4, dataPtr + 4); @@ -2900,42 +2911,52 @@ int crxReadImageHeaders(crx_data_header_t* hdr, CrxImage* img, std::uint8_t* mda if (compHdrRoundedBits) { if (img->levels || !comp->supportsPartial) { - return -1; + return false; } comp->roundedBitsMask = 1 << (compHdrRoundedBits - 1); } - if (crxReadSubbandHeaders(img, tile, comp, &dataPtr, &dataSize)) { - return -1; + if (!crxReadSubbandHeaders(img, tile, comp, &dataPtr, &dataSize)) { + return false; } } } - return 0; + return true; } -int crxSetupImageData(crx_data_header_t* hdr, CrxImage* img, std::int16_t* outBuf, - std::uint64_t mdatOffset, std::uint32_t mdatSize, - std::uint8_t* mdatHdrPtr) +bool crxSetupImageData( + crx_data_header_t* hdr, + CrxImage* img, + std::int16_t* outBuf, + std::uint64_t mdatOffset, + std::uint32_t mdatSize, + std::uint8_t* mdatHdrPtr +) { - int IncrBitTable[32] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, - 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0 - }; + constexpr bool IncrBitTable[32] = { + false, false, false, false, false, false, false, false, false, true, true, false, false, false, true, false, + false, false, true, false, false, true, true, true, false, true, true, true, false, false, false, false + }; img->planeWidth = hdr->f_width; img->planeHeight = hdr->f_height; - if (hdr->tileWidth < 0x16 || hdr->tileHeight < 0x16 || - img->planeWidth > 0x7FFF || img->planeHeight > 0x7FFF) { - return -1; + if ( + hdr->tileWidth < 0x16 + || hdr->tileHeight < 0x16 + || img->planeWidth > 0x7FFF + || img->planeHeight > 0x7FFF + ) { + return false; } img->tileCols = (img->planeWidth + hdr->tileWidth - 1) / hdr->tileWidth; img->tileRows = (img->planeHeight + hdr->tileHeight - 1) / hdr->tileHeight; if (img->planeWidth - hdr->tileWidth * (img->tileCols - 1) < 0x16 || img->planeHeight - hdr->tileHeight * (img->tileRows - 1) < 0x16) { - return -1; + return false; } img->tiles = nullptr; @@ -2957,16 +2978,16 @@ int crxSetupImageData(crx_data_header_t* hdr, CrxImage* img, std::int16_t* outBu // intermediate plane buffer. At the moment though it's too many changes so // left as is. if (img->encType == 3 && img->nPlanes == 4 && img->nBits > 8) { - img->planeBuf = - static_cast(malloc(img->planeHeight * img->planeWidth * img->nPlanes * - ((img->samplePrecision + 7) >> 3))); + img->planeBuf = static_cast( + malloc(img->planeHeight * img->planeWidth * img->nPlanes * ((img->samplePrecision + 7) >> 3)) + ); if (!img->planeBuf) { - return -1; + return false; } } - std::int32_t rowSize = 2 * img->planeWidth; + const std::int32_t rowSize = 2 * img->planeWidth; if (img->nPlanes == 1) { img->outBufs[0] = outBuf; @@ -3018,10 +3039,10 @@ int crxSetupImageData(crx_data_header_t* hdr, CrxImage* img, std::int16_t* outBu return crxReadImageHeaders(hdr, img, mdatHdrPtr, mdatSize); } -int crxFreeImageData(CrxImage* img) +void crxFreeImageData(CrxImage* img) { CrxTile* tile = img->tiles; - int nTiles = img->tileRows * img->tileCols; + const int nTiles = img->tileRows * img->tileCols; if (img->tiles) { for (std::int32_t curTile = 0; curTile < nTiles; curTile++, tile++) { @@ -3040,15 +3061,14 @@ int crxFreeImageData(CrxImage* img) free(img->planeBuf); img->planeBuf = nullptr; } - - return 0; } + } // namespace void DCraw::crxLoadDecodeLoop(void* img, int nPlanes) { #ifdef _OPENMP - int results[4]; // nPlanes is always <= 4 + bool results[4]; // nPlanes is always <= 4 #pragma omp parallel for for (std::int32_t plane = 0; plane < nPlanes; ++plane) { @@ -3056,7 +3076,7 @@ void DCraw::crxLoadDecodeLoop(void* img, int nPlanes) } for (std::int32_t plane = 0; plane < nPlanes; ++plane) { - if (results[plane]) { + if (!results[plane]) { derror(); } } @@ -3064,7 +3084,7 @@ void DCraw::crxLoadDecodeLoop(void* img, int nPlanes) #else for (std::int32_t plane = 0; plane < nPlanes; ++plane) { - if (crxDecodePlane(img, plane)) { + if (!crxDecodePlane(img, plane)) { derror(); } } @@ -3092,14 +3112,11 @@ void DCraw::crxLoadRaw() { CrxImage img; - if (RT_canon_CR3_data.crx_track_selected >= - RT_canon_CR3_data.CRXTRACKS_MAXCOUNT) { + if (RT_canon_CR3_data.crx_track_selected >= RT_canon_CR3_data.CRXTRACKS_MAXCOUNT) { derror(); } - crx_data_header_t hdr = - RT_canon_CR3_data - .crx_header[RT_canon_CR3_data.crx_track_selected]; + crx_data_header_t hdr = RT_canon_CR3_data.crx_header[RT_canon_CR3_data.crx_track_selected]; LibRaw_abstract_datastream input = {ifp}; img.input = &input; // libraw_internal_data.internal_data.input; @@ -3114,7 +3131,7 @@ void DCraw::crxLoadRaw() // /*imgdata.color.*/maximum = (1 << hdr.nBits) - 1; - std::uint8_t* hdrBuf = static_cast(malloc(hdr.mdatHdrSize)); + std::uint8_t* const hdrBuf = static_cast(malloc(hdr.mdatHdrSize)); // read image header #ifdef _OPENMP @@ -3124,8 +3141,7 @@ void DCraw::crxLoadRaw() #ifndef _OPENMP /*libraw_internal_data.internal_data.input->*/ input.lock(); #endif - /*libraw_internal_data.internal_data.input->*/ input.seek( - data_offset, SEEK_SET); + /*libraw_internal_data.internal_data.input->*/ input.seek(data_offset, SEEK_SET); /*libraw_internal_data.internal_data.input->*/ input.read(hdrBuf, 1, hdr.mdatHdrSize); #ifndef _OPENMP /*libraw_internal_data.internal_data.input->*/ input.unlock(); @@ -3133,9 +3149,7 @@ void DCraw::crxLoadRaw() } // parse and setup the image data - if (crxSetupImageData(&hdr, &img, reinterpret_cast(raw_image), - hdr.MediaOffset /*data_offset*/, - hdr.MediaSize /*RT_canon_CR3_data.data_size*/, hdrBuf)) { + if (!crxSetupImageData(&hdr, &img, reinterpret_cast(raw_image), hdr.MediaOffset /*data_offset*/, hdr.MediaSize /*RT_canon_CR3_data.data_size*/, hdrBuf)) { derror(); } @@ -3150,18 +3164,17 @@ void DCraw::crxLoadRaw() crxFreeImageData(&img); } -int DCraw::crxParseImageHeader(uchar* cmp1TagData, unsigned int nTrack) +bool DCraw::crxParseImageHeader(uchar* cmp1TagData, unsigned int nTrack) { if (nTrack >= RT_canon_CR3_data.CRXTRACKS_MAXCOUNT) { - return -1; + return false; } if (!cmp1TagData) { - return -1; + return false; } - crx_data_header_t* hdr = - &RT_canon_CR3_data.crx_header[nTrack]; + crx_data_header_t* const hdr = &RT_canon_CR3_data.crx_header[nTrack]; hdr->version = sgetn(2, cmp1TagData + 4); hdr->f_width = sgetn(4, cmp1TagData + 8); @@ -3179,45 +3192,55 @@ int DCraw::crxParseImageHeader(uchar* cmp1TagData, unsigned int nTrack) // validation if (hdr->version != 0x100 || !hdr->mdatHdrSize) { - return -1; + return false; } if (hdr->encType == 1) { if (hdr->nBits > 15) { - return -1; + return false; } } else { if (hdr->encType && hdr->encType != 3) { - return -1; + return false; } if (hdr->nBits > 14) { - return -1; + return false; } } if (hdr->nPlanes == 1) { if (hdr->cfaLayout || hdr->encType) { - return -1; + return false; } if (hdr->nBits != 8) { - return -1; + return false; } - } else if (hdr->nPlanes != 4 || (hdr->f_width & 1) || (hdr->f_height & 1) || - (hdr->tileWidth & 1) || (hdr->tileHeight & 1) || hdr->cfaLayout > 3 || - (hdr->encType && hdr->encType != 1 && hdr->encType != 3) || - hdr->nBits == 8) { - return -1; + } else if ( + hdr->nPlanes != 4 + || (hdr->f_width & 1) + || (hdr->f_height & 1) + || (hdr->tileWidth & 1) + || (hdr->tileHeight & 1) + || hdr->cfaLayout > 3 + || ( + hdr->encType + && hdr->encType != 1 + && hdr->encType != 3 + ) + || hdr->nBits == 8 + ) { + return false; } if (hdr->tileWidth > hdr->f_width || hdr->tileHeight > hdr->f_height) { - return -1; + return false; } if (hdr->imageLevels > 3 || hdr->hasTileCols > 1 || hdr->hasTileRows > 1) { - return -1; + return false; } - return 0; + return true; } diff --git a/rtengine/dcraw.h b/rtengine/dcraw.h index c18e6c2ff..a47d1c88a 100644 --- a/rtengine/dcraw.h +++ b/rtengine/dcraw.h @@ -567,12 +567,12 @@ void selectCRXTrack(unsigned short maxTrack); int parseCR3(unsigned long long oAtomList, unsigned long long szAtomList, short &nesting, char *AtomNameStack, unsigned short &nTrack, short &TrackType); -int crxDecodePlane(void *p, uint32_t planeNumber); +bool crxDecodePlane(void *p, uint32_t planeNumber); void crxLoadDecodeLoop(void *img, int nPlanes); void crxConvertPlaneLineDf(void *p, int imageRow); void crxLoadFinalizeLoopE3(void *p, int planeHeight); void crxLoadRaw(); -int crxParseImageHeader(uchar *cmp1TagData, unsigned int nTrack); +bool crxParseImageHeader(uchar *cmp1TagData, unsigned int nTrack); //----------------------------------------------------------------------------- }; From 03c094a42bcf9d6d7a0198eadc758b9fc32e38fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Fri, 6 Dec 2019 09:18:16 +0100 Subject: [PATCH 205/208] Fix `fseek()`/`ftell()` issue --- rtengine/canon_cr3_decoder.cc | 8 ++++---- rtengine/dcraw.h | 2 +- rtengine/myfile.h | 10 ++++------ 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index 3912af6b4..14a7f0e14 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -449,9 +449,9 @@ int DCraw::parseCR3( goto fin; } - const std::int64_t off = ftell(ifp); // FIXME: ftell() returns int + const long off = ftell(ifp); parse_gps(oAtomContent); - fseek(ifp, off, SEEK_SET); // FIXME: fseek() takes int offset + fseek(ifp, off, SEEK_SET); // parse_gps_libraw(oAtomContent); order = q_order; } else if (!strcmp(AtomNameStack, "moovtrakmdiahdlr")) { @@ -468,7 +468,7 @@ int DCraw::parseCR3( } } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsd")) { if (szAtomContent >= 16) { - fseek(ifp, 12L, SEEK_CUR); + fseek(ifp, 12, SEEK_CUR); lHdr = 8; } else { err = -7; @@ -670,7 +670,7 @@ struct LibRaw_abstract_datastream { void unlock() { } - void seek(int p, int how) + void seek(long p, int how) { fseek(ifp, p, how); } diff --git a/rtengine/dcraw.h b/rtengine/dcraw.h index a47d1c88a..89c1fcaff 100644 --- a/rtengine/dcraw.h +++ b/rtengine/dcraw.h @@ -184,7 +184,7 @@ public: int32_t mdatHdrSize; // Not from header, but from datastream uint32_t MediaSize; - INT64 MediaOffset; + int64_t MediaOffset; uint32_t MediaType; /* 1 -> /C/RAW, 2-> JPEG */ }; static constexpr size_t CRXTRACKS_MAXCOUNT = 16; diff --git a/rtengine/myfile.h b/rtengine/myfile.h index 7c498e556..423edea9a 100644 --- a/rtengine/myfile.h +++ b/rtengine/myfile.h @@ -56,28 +56,26 @@ IMFILE* fopen (const char* fname); IMFILE* gfopen (const char* fname); IMFILE* fopen (unsigned* buf, int size); void fclose (IMFILE* f); -inline int ftell (IMFILE* f) +inline long ftell (IMFILE* f) { - return f->pos; } inline int feof (IMFILE* f) { - return f->eof; } -inline void fseek (IMFILE* f, int p, int how) +inline void fseek (IMFILE* f, long p, int how) { - int fpos = f->pos; + ssize_t fpos = f->pos; if (how == SEEK_SET) { f->pos = p; } else if (how == SEEK_CUR) { f->pos += p; } else if (how == SEEK_END) { - if(p <= 0 && -p <= f->size) { + if (p <= 0 && -p <= f->size) { f->pos = f->size + p; } return; From b0e52b32023524e2be22ebb03fd465af0f9e05d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Fri, 6 Dec 2019 09:28:34 +0100 Subject: [PATCH 206/208] Whitespace corrections --- rtengine/canon_cr3_decoder.cc | 68 +++++++++++++++++------------------ 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index 14a7f0e14..ba92bf04a 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -87,13 +87,13 @@ void DCraw::selectCRXTrack(unsigned short maxTrack) for (unsigned int i = 0; i <= maxTrack && i < RT_canon_CR3_data.CRXTRACKS_MAXCOUNT; ++i) { CanonCR3Data::crx_data_header_t* const d = &RT_canon_CR3_data.crx_header[i]; - if (d->MediaType == 1) {// RAW + if (d->MediaType == 1) { // RAW bitcounts[i] = std::int64_t(d->nBits) * std::int64_t(d->f_width) * std::int64_t(d->f_height); if (bitcounts[i] > maxbitcount) { maxbitcount = bitcounts[i]; } - } else if (d->MediaType == 2) {// JPEG + } else if (d->MediaType == 2) { // JPEG if (d->MediaSize > maxjpegbytes) { maxjpegbytes = d->MediaSize; thumb_offset = d->MediaOffset; @@ -371,7 +371,7 @@ int DCraw::parseCR3( szAtom = szAtomList - oAtom; oAtomContent = oAtom + 8; szAtomContent = szAtom - 8; - } else if (szAtom == 1) { + } else if (szAtom == 1) { if ((oAtom + 16) > (oAtomList + szAtomList)) { err = -3; goto fin; @@ -404,9 +404,9 @@ int DCraw::parseCR3( } else { fseek(ifp, -lHdr, SEEK_CUR); } - } else if (!strcmp(AtomNameStack, "moovuuidCCTP")) { + } else if (!strcmp(AtomNameStack, "moovuuidCCTP")) { lHdr = 12; - } else if (!strcmp(AtomNameStack, "moovuuidCMT1")) { + } else if (!strcmp(AtomNameStack, "moovuuidCMT1")) { const short q_order = order; order = get2(); @@ -417,7 +417,7 @@ int DCraw::parseCR3( parse_tiff_ifd(oAtomContent); order = q_order; - } else if (!strcmp(AtomNameStack, "moovuuidCMT2")) { + } else if (!strcmp(AtomNameStack, "moovuuidCMT2")) { const short q_order = order; order = get2(); @@ -428,7 +428,7 @@ int DCraw::parseCR3( parse_exif(oAtomContent); order = q_order; - } else if (!strcmp(AtomNameStack, "moovuuidCMT3")) { + } else if (!strcmp(AtomNameStack, "moovuuidCMT3")) { const short q_order = order; order = get2(); @@ -440,7 +440,7 @@ int DCraw::parseCR3( fseek(ifp, -12L, SEEK_CUR); parse_makernote(oAtomContent, 0); order = q_order; - } else if (!strcmp(AtomNameStack, "moovuuidCMT4")) { + } else if (!strcmp(AtomNameStack, "moovuuidCMT4")) { const short q_order = order; order = get2(); @@ -454,7 +454,7 @@ int DCraw::parseCR3( fseek(ifp, off, SEEK_SET); // parse_gps_libraw(oAtomContent); order = q_order; - } else if (!strcmp(AtomNameStack, "moovtrakmdiahdlr")) { + } else if (!strcmp(AtomNameStack, "moovtrakmdiahdlr")) { fseek(ifp, 8, SEEK_CUR); for (unsigned int c = 0; c < 4; ++c) { HandlerType[c] = fgetc(ifp); @@ -466,7 +466,7 @@ int DCraw::parseCR3( break; } } - } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsd")) { + } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsd")) { if (szAtomContent >= 16) { fseek(ifp, 12, SEEK_CUR); lHdr = 8; @@ -493,9 +493,9 @@ int DCraw::parseCR3( /*ImageWidth = */ get2(); /*ImageHeight = */ get2(); - } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAW")) { + } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAW")) { lHdr = 82; - } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAWCMP1")) { + } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAWCMP1")) { if (szAtomContent >= 40) { fread(CMP1, 1, 36, ifp); } else { @@ -506,9 +506,9 @@ int DCraw::parseCR3( if (crxParseImageHeader(CMP1, nTrack)) { RT_canon_CR3_data.crx_header[nTrack].MediaType = 1; } - } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAWJPEG")) { + } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAWJPEG")) { RT_canon_CR3_data.crx_header[nTrack].MediaType = 2; - } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsz")) { + } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsz")) { if (szAtomContent == 12) { fseek(ifp, 4, SEEK_CUR); } else if (szAtomContent == 16) { @@ -519,7 +519,7 @@ int DCraw::parseCR3( } RT_canon_CR3_data.crx_header[nTrack].MediaSize = get4(); - } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblco64")) { + } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblco64")) { if (szAtomContent == 16) { fseek(ifp, 8, SEEK_CUR); } else { @@ -771,7 +771,7 @@ struct CrxImage { CrxTile* tiles; std::uint64_t mdatOffset; std::uint64_t mdatSize; - std::int16_t* outBufs[4];// one per plane + std::int16_t* outBufs[4]; // one per plane std::int16_t* planeBuf; LibRaw_abstract_datastream* input; }; @@ -931,7 +931,7 @@ inline std::uint32_t crxBitstreamGetBits(CrxBitstream* bitStrm, int bits) } while (bitsLeft < bits); } - result = bitData >> (32 - bits);// 32-bits + result = bitData >> (32 - bits); // 32-bits bitStrm->bitData = bitData << bits; bitStrm->bitsLeft = bitsLeft - bits; return result; @@ -1182,7 +1182,7 @@ bool crxDecodeLineRounded(CrxBandParam* param) crxDecodeSymbolL1Rounded(param, false); ++param->lineBuf0; valueReached = std::abs(param->lineBuf0[1] - param->lineBuf0[0]) > param->roundedBitsMask; - } else if (length == 1) { + } else if (length == 1) { crxDecodeSymbolL1Rounded(param, false, false); } } @@ -1259,7 +1259,7 @@ bool crxDecodeLineNoRefPrevLine(CrxBandParam* param) return false; } } - } else if (i > param->subbandWidth) { + } else if (i > param->subbandWidth) { return false; } @@ -1688,7 +1688,7 @@ bool crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(std::int32_t)); ++param->curLine; } - } else if (!param->supportsPartial) { + } else if (!param->supportsPartial) { const std::int32_t lineLength = param->subbandWidth + 2; param->lineBuf2 = param->nonProgrData; @@ -1708,7 +1708,7 @@ bool crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) memcpy(bandBuf, lineBuf, param->subbandWidth * sizeof(std::int32_t)); ++param->curLine; - } else if (param->roundedBitsMask <= 0) { + } else if (param->roundedBitsMask <= 0) { const std::int32_t lineLength = param->subbandWidth + 2; if (param->curLine & 1) { @@ -1769,7 +1769,7 @@ bool crxDecodeLineWithIQuantization(CrxSubband* subband) bitCode = crxBitstreamGetBits(&subband->bandParam->bitStream, subband->paramK) | (bitCode << subband->paramK); } - subband->quantValue += -(bitCode & 1) ^ (bitCode >> 1);// converting encoded to signed integer + subband->quantValue += -(bitCode & 1) ^ (bitCode >> 1); // converting encoded to signed integer subband->paramK = crxPredictKParameter(subband->paramK, bitCode); if (subband->paramK > 7) { @@ -1859,7 +1859,7 @@ void crxHorizontal53( lineBufLA[2] = deltaA; lineBufLB[2] = deltaB; } - } else if (wavelet->width & 1) { + } else if (wavelet->width & 1) { lineBufLA[1] = band1Buf[0] + ((lineBufLA[0] + band0Buf[0] - ((band1Buf[0] + 1) >> 1)) >> 1); lineBufLA[2] = band0Buf[0] - ((band1Buf[0] + 1) >> 1); @@ -1895,7 +1895,7 @@ bool crxIdwt53FilterDecode(CrxPlaneComp* comp, std::int32_t level) if (!crxIdwt53FilterDecode(comp, level - 1)) { return false; } - } else if (!crxDecodeLineWithIQuantization(sband)) { + } else if (!crxDecodeLineWithIQuantization(sband)) { return false; } @@ -1908,7 +1908,7 @@ bool crxIdwt53FilterDecode(CrxPlaneComp* comp, std::int32_t level) if (!crxIdwt53FilterDecode(comp, level - 1)) { return false; } - } else if (!crxDecodeLineWithIQuantization(sband)) { // LL band + } else if (!crxDecodeLineWithIQuantization(sband)) { // LL band return false; } @@ -1985,7 +1985,7 @@ bool crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) if (wavelet->width & 1) { lineBufL0[2] = delta; } - } else if (wavelet->width & 1) { + } else if (wavelet->width & 1) { const std::int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); lineBufL0[1] = band1Buf[0] + ((lineBufL0[0] + delta) >> 1); lineBufL0[2] = delta; @@ -2093,7 +2093,7 @@ bool crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) lineBufL0[2] = deltaA; lineBufL1[2] = deltaB; } - } else if (wavelet->width & 1) { + } else if (wavelet->width & 1) { std::int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); lineBufL0[1] = band1Buf[0] + ((delta + lineBufL0[0]) >> 1); lineBufL0[2] = delta; @@ -2202,7 +2202,7 @@ bool crxIdwt53FilterInitialize(CrxPlaneComp* comp, std::int32_t prevLevel) if (wavelet->width & 1) { lineBufL2[2] = delta; } - } else if (wavelet->width & 1) { + } else if (wavelet->width & 1) { const std::int32_t delta = band2Buf[0] - ((band3Buf[0] + 1) >> 1); lineBufL2[1] = band3Buf[0] + ((lineBufL2[0] + delta) >> 1); @@ -2262,7 +2262,7 @@ bool crxIdwt53FilterInitialize(CrxPlaneComp* comp, std::int32_t prevLevel) const std::int32_t delta = band0Buf[0] - ((band1Buf[0] + band1Buf[1] + 2) >> 2); lineBufH0[1] = band1Buf[0] + ((lineBufH0[0] + delta) >> 1); lineBufH0[2] = delta; - } else if (wavelet->width & 1) { + } else if (wavelet->width & 1) { const std::int32_t delta = band0Buf[0] - ((band1Buf[0] + 1) >> 1); lineBufH0[1] = band1Buf[0] + ((lineBufH0[0] + delta) >> 1); lineBufH0[2] = delta; @@ -2321,21 +2321,21 @@ void crxConvertPlaneLine( for (int i = 0; i < lineLength; ++i) { img->outBufs[plane][rawOffset + 2 * i] = rtengine::LIM(lineData[i], minVal, maxVal - 1); } - } else if (img->encType == 3) { + } else if (img->encType == 3) { // copy to intermediate planeBuf rawOffset = plane * img->planeWidth * img->planeHeight + img->planeWidth * imageRow + imageCol; for (int i = 0; i < lineLength; ++i) { img->planeBuf[rawOffset + i] = lineData[i]; } - } else if (img->nPlanes == 4) { + } else if (img->nPlanes == 4) { const std::int32_t median = 1 << (img->nBits - 1); const std::int32_t maxVal = (1 << img->nBits) - 1; for (int i = 0; i < lineLength; ++i) { img->outBufs[plane][rawOffset + 2 * i] = rtengine::LIM(median + lineData[i], 0, maxVal); } - } else if (img->nPlanes == 1) { + } else if (img->nPlanes == 1) { const std::int32_t maxVal = (1 << img->nBits) - 1; const std::int32_t median = 1 << (img->nBits - 1); @@ -2345,7 +2345,7 @@ void crxConvertPlaneLine( img->outBufs[0][rawOffset + i] = rtengine::LIM(median + lineData[i], 0, maxVal); } } - } else if (img->encType == 3 && img->planeBuf) { + } else if (img->encType == 3 && img->planeBuf) { const std::int32_t planeSize = img->planeWidth * img->planeHeight; const std::int16_t* const plane0 = img->planeBuf + imageRow * img->planeWidth; const std::int16_t* const plane1 = plane0 + planeSize; @@ -2961,7 +2961,7 @@ bool crxSetupImageData( img->tiles = nullptr; img->levels = hdr->imageLevels; - img->subbandCount = 3 * img->levels + 1;// 3 bands per level + one last LL + img->subbandCount = 3 * img->levels + 1; // 3 bands per level + one last LL img->nPlanes = hdr->nPlanes; img->nBits = hdr->nBits; img->encType = hdr->encType; From 743827c7c86f8de14b50ca76b05530e3ea30259f Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Fri, 6 Dec 2019 12:21:19 +0100 Subject: [PATCH 207/208] Fix cppcheck warnings --- rtengine/canon_cr3_decoder.cc | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index ba92bf04a..9e3b3ef4b 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -1004,10 +1004,8 @@ bool crxDecodeLine(CrxBandParam* param) if (param->lineBuf1[0] != param->lineBuf0[1] || param->lineBuf1[0] != param->lineBuf0[2]) { crxDecodeSymbolL1(param, true, true); } else { - int nSyms = 0; - if (crxBitstreamGetBits(¶m->bitStream, 1)) { - nSyms = 1; + int nSyms = 1; while (crxBitstreamGetBits(¶m->bitStream, 1)) { nSyms += JS[param->sParam]; @@ -1338,10 +1336,8 @@ bool crxDecodeTopLine(CrxBandParam* param) if (param->lineBuf1[0]) { param->lineBuf1[1] = param->lineBuf1[0]; } else { - int nSyms = 0; - if (crxBitstreamGetBits(¶m->bitStream, 1)) { - nSyms = 1; + int nSyms = 1; while (crxBitstreamGetBits(¶m->bitStream, 1)) { nSyms += JS[param->sParam]; @@ -1781,7 +1777,7 @@ bool crxDecodeLineWithIQuantization(CrxSubband* subband) return false; } - if (subband->width <= 0) { + if (subband->width == 0) { return true; } @@ -2039,7 +2035,6 @@ bool crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) std::int32_t* lineBufL0 = wavelet->lineBuf[0]; std::int32_t* lineBufL1 = wavelet->lineBuf[1]; - const std::int32_t* lineBufL2 = wavelet->lineBuf[2]; const std::int32_t* const lineBufH0 = wavelet->lineBuf[wavelet->fltTapH + 3]; std::int32_t* const lineBufH1 = wavelet->lineBuf[(wavelet->fltTapH + 1) % 5 + 3]; std::int32_t* const lineBufH2 = wavelet->lineBuf[(wavelet->fltTapH + 2) % 5 + 3]; @@ -2110,7 +2105,7 @@ bool crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) // process H bands lineBufL0 = wavelet->lineBuf[0]; lineBufL1 = wavelet->lineBuf[1]; - lineBufL2 = wavelet->lineBuf[2]; + const std::int32_t* lineBufL2 = wavelet->lineBuf[2]; for (std::int32_t i = 0; i < wavelet->width; ++i) { const std::int32_t delta = lineBufL0[i] - ((lineBufL2[i] + lineBufL1[i] + 2) >> 2); @@ -2731,7 +2726,7 @@ bool crxReadSubbandHeaders( } band->dataSize = subbandSize - (bitData & 0x7FF); - band->supportsPartial = bitData & 0x8000 ? 1 : 0; + band->supportsPartial = (bitData & 0x8000) ? 1 : 0; band->dataOffset = subbandOffset; band->quantValue = (bitData >> 19) & 0xFF; band->paramK = 0; From b1bce98c069959564382a9882c89d32176ccfdd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Sat, 7 Dec 2019 09:38:18 +0100 Subject: [PATCH 208/208] `supportsPartial` is `bool` --- rtengine/canon_cr3_decoder.cc | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index 9e3b3ef4b..6274154cb 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -705,7 +705,7 @@ struct CrxBandParam { std::int32_t kParam; std::int32_t* paramData; std::int32_t* nonProgrData; - std::int8_t supportsPartial; + bool supportsPartial; }; struct CrxWaveletTransform { @@ -727,7 +727,7 @@ struct CrxSubband { std::uint8_t* bandBuf; std::int32_t bandSize; std::uint64_t dataSize; - std::int8_t supportsPartial; + bool supportsPartial; std::int32_t quantValue; std::uint16_t width; std::uint16_t height; @@ -742,7 +742,7 @@ struct CrxPlaneComp { std::int8_t compNumber; std::int64_t dataOffset; std::int32_t compSize; - std::int8_t supportsPartial; + bool supportsPartial; std::int32_t roundedBitsMask; std::int8_t tileFlag; }; @@ -2383,7 +2383,7 @@ bool crxParamInit( std::uint64_t subbandDataSize, std::uint32_t subbandWidth, std::uint32_t subbandHeight, - std::int32_t supportsPartial, + bool supportsPartial, std::uint32_t roundedBitsMask, LibRaw_abstract_datastream* input ) @@ -2528,12 +2528,12 @@ bool crxSetupSubbandData( // decoding params and bitstream initialisation for (std::int32_t subbandNum = 0; subbandNum < toSubbands; ++subbandNum) { if (subbands[subbandNum].dataSize) { - std::int32_t supportsPartial = 0; + bool supportsPartial = false; std::uint32_t roundedBitsMask = 0; if (planeComp->supportsPartial && subbandNum == 0) { roundedBitsMask = planeComp->roundedBitsMask; - supportsPartial = 1; + supportsPartial = true; } if ( @@ -2726,7 +2726,7 @@ bool crxReadSubbandHeaders( } band->dataSize = subbandSize - (bitData & 0x7FF); - band->supportsPartial = (bitData & 0x8000) ? 1 : 0; + band->supportsPartial = bitData & 0x8000; band->dataOffset = subbandOffset; band->quantValue = (bitData >> 19) & 0xFF; band->paramK = 0; @@ -2827,7 +2827,7 @@ bool crxReadImageHeaders( for (int curComp = 0; curComp < img->nPlanes; curComp++, comp++) { comp->compNumber = curComp; - comp->supportsPartial = 1; + comp->supportsPartial = true; comp->tileFlag = tile->tileFlag; comp->subBands = band; comp->compBuf = nullptr; @@ -2835,7 +2835,7 @@ bool crxReadImageHeaders( if (img->subbandCount) { for (int curBand = 0; curBand < img->subbandCount; curBand++, band++) { - band->supportsPartial = 0; + band->supportsPartial = false; band->quantValue = 4; band->bandParam = nullptr; band->dataSize = 0;

      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

    BYR;6FVmLA>c*ow!XLdv}{;boen&w0`A_$WzI% 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