diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 41867d1c9..62f755aee 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -690,14 +690,46 @@ void Crop::update (int todo) // has to be called after setCropSizes! Tools prior to this point can't handle the Edit mechanism, but that shouldn't be a problem. createBuffer (cropw, croph); + std::unique_ptr fattalCrop; + bool need_cropping = false; + bool has_fattal = false; + + if ((todo & (M_TRANSFORM | M_RGBCURVE)) && params.fattal.enabled) { + has_fattal = true; + Imagefloat *f = baseCrop; + if (f == origCrop) { + fattalCrop.reset(baseCrop->copy()); + f = fattalCrop.get(); + } + parent->ipf.ToneMapFattal02(f); + need_cropping = (cropx || cropy || trafw != cropw || trafh != croph); + baseCrop = f; + } + // transform if (needstransform || ((todo & (M_TRANSFORM | M_RGBCURVE)) && params.dirpyrequalizer.cbdlMethod == "bef" && params.dirpyrequalizer.enabled && !params.colorappearance.enabled)) { + int tx = cropx; + int ty = cropy; + int tw = cropw; + int th = croph; + + if (has_fattal) { + tx = 0; + ty = 0; + tw = trafw; + th = trafh; + if (transCrop) { + delete transCrop; + transCrop = nullptr; + } + } + if (!transCrop) { - transCrop = new Imagefloat (cropw, croph); + transCrop = new Imagefloat (tw, th); } if (needstransform) - parent->ipf.transform (baseCrop, transCrop, cropx / skip, cropy / skip, trafx / skip, trafy / skip, skips (parent->fw, skip), skips (parent->fh, skip), parent->getFullWidth(), parent->getFullHeight(), + parent->ipf.transform (baseCrop, transCrop, tx / skip, ty / skip, trafx / skip, trafy / skip, skips (parent->fw, skip), skips (parent->fh, skip), parent->getFullWidth(), parent->getFullHeight(), parent->imgsrc->getMetaData(), parent->imgsrc->getRotateDegree(), false); else { @@ -715,17 +747,28 @@ void Crop::update (int todo) transCrop = nullptr; } - std::unique_ptr fattalCrop; - if ((todo & M_RGBCURVE) && params.fattal.enabled) { - Imagefloat *f = baseCrop; - if (f == origCrop) { - fattalCrop.reset(baseCrop->copy()); - f = fattalCrop.get(); + if (need_cropping) { + Imagefloat *c = new Imagefloat(cropw, croph); + + int oy = skips(cropy, skip); + int ox = skips(cropx, skip); +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int y = 0; y < croph; ++y) { + int cy = y + oy; + for (int x = 0; x < cropw; ++x) { + int cx = x + ox; + c->r(y, x) = baseCrop->r(cy, cx); + c->g(y, x) = baseCrop->g(cy, cx); + c->b(y, x) = baseCrop->b(cy, cx); + } } - parent->ipf.ToneMapFattal02(f); - baseCrop = f; + fattalCrop.reset(c); + baseCrop = c; } + if ((todo & (M_TRANSFORM | M_RGBCURVE)) && params.dirpyrequalizer.cbdlMethod == "bef" && params.dirpyrequalizer.enabled && !params.colorappearance.enabled) { const int W = baseCrop->getWidth(); @@ -1156,13 +1199,6 @@ bool Crop::setCropSizes (int rcx, int rcy, int rcw, int rch, int skip, bool inte orw = bw; orh = bh; - if (check_need_full_image(parent->params)) { - orx = bx1 = 0; - ory = by1 = 0; - orw = bw = parent->fullw; - orh = bh = parent->fullh; - } - ProcParams& params = parent->params; parent->ipf.transCoord (parent->fw, parent->fh, bx1, by1, bw, bh, orx, ory, orw, orh); @@ -1202,6 +1238,16 @@ bool Crop::setCropSizes (int rcx, int rcy, int rcw, int rch, int skip, bool inte orh = min (y2 - y1, parent->fh - ory); } + leftBorder = skips (rqx1 - bx1, skip); + upperBorder = skips (rqy1 - by1, skip); + + if (check_need_full_image(parent->params)) { + orx = 0; + ory = 0; + orw = parent->fullw; + orh = parent->fullh; + } + PreviewProps cp (orx, ory, orw, orh, skip); int orW, orH; parent->imgsrc->getSize (cp, orW, orH); @@ -1212,9 +1258,6 @@ bool Crop::setCropSizes (int rcx, int rcy, int rcw, int rch, int skip, bool inte int cw = skips (bw, skip); int ch = skips (bh, skip); - leftBorder = skips (rqx1 - bx1, skip); - upperBorder = skips (rqy1 - by1, skip); - if (settings->verbose) { printf ("setsizes starts (%d, %d, %d, %d, %d, %d)\n", orW, orH, trafw, trafh, cw, ch); } diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index dffd9572e..f456cc4c6 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -385,36 +385,33 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) readyphase++; - progress ("Rotate / Distortion...", 100 * readyphase / numofphases); - // Remove transformation if unneeded - bool needstransform = ipf.needsTransform(); - - if (!needstransform && ! ((todo & (M_TRANSFORM | M_RGBCURVE)) && params.dirpyrequalizer.cbdlMethod == "bef" && params.dirpyrequalizer.enabled && !params.colorappearance.enabled) && orig_prev != oprevi) { - delete oprevi; - oprevi = orig_prev; - } - - if ((needstransform || ((todo & (M_TRANSFORM | M_RGBCURVE)) && params.dirpyrequalizer.cbdlMethod == "bef" && params.dirpyrequalizer.enabled && !params.colorappearance.enabled)) ) { - if (!oprevi || oprevi == orig_prev) { - oprevi = new Imagefloat (pW, pH); - } - - if (needstransform) - ipf.transform (orig_prev, oprevi, 0, 0, 0, 0, pW, pH, fw, fh, - imgsrc->getMetaData(), imgsrc->getRotateDegree(), false); - else { - orig_prev->copyData (oprevi); - } - } - - if ((todo & M_RGBCURVE) && params.fattal.enabled) { - Imagefloat *fattalprev = oprevi->copy(); + if ((todo & (M_TRANSFORM | M_RGBCURVE)) && params.fattal.enabled) { + Imagefloat *fattalprev = orig_prev->copy(); ipf.ToneMapFattal02(fattalprev); if (oprevi != orig_prev) { delete oprevi; } oprevi = fattalprev; - } + } else { + oprevi = orig_prev; + } + + progress ("Rotate / Distortion...", 100 * readyphase / numofphases); + // Remove transformation if unneeded + bool needstransform = ipf.needsTransform(); + + if ((needstransform || ((todo & (M_TRANSFORM | M_RGBCURVE)) && params.dirpyrequalizer.cbdlMethod == "bef" && params.dirpyrequalizer.enabled && !params.colorappearance.enabled)) ) { + assert(oprevi); + Imagefloat *op = oprevi; + oprevi = new Imagefloat (pW, pH); + + if (needstransform) + ipf.transform (op, oprevi, 0, 0, 0, 0, pW, pH, fw, fh, + imgsrc->getMetaData(), imgsrc->getRotateDegree(), false); + else { + op->copyData (oprevi); + } + } if ((todo & (M_TRANSFORM | M_RGBCURVE)) && params.dirpyrequalizer.cbdlMethod == "bef" && params.dirpyrequalizer.enabled && !params.colorappearance.enabled) { const int W = oprevi->getWidth(); diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index efe5d7868..0d5fcf574 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -1090,6 +1090,10 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT ipf.firstAnalysis (baseImg, params, hist16); + if (params.fattal.enabled) { + ipf.ToneMapFattal02(baseImg); + } + // perform transform if (ipf.needsTransform()) { Imagefloat* trImg = new Imagefloat (fw, fh); @@ -1102,10 +1106,6 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT baseImg = trImg; } - if (params.fattal.enabled) { - ipf.ToneMapFattal02(baseImg); - } - // update blurmap SHMap* shmap = nullptr; diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index c8d45acf8..cb1ea9c45 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -810,6 +810,10 @@ private: ipf.firstAnalysis (baseImg, params, hist16); + if (params.fattal.enabled) { + ipf.ToneMapFattal02(baseImg); + } + // perform transform (excepted resizing) if (ipf.needsTransform()) { Imagefloat* trImg = nullptr; @@ -833,10 +837,6 @@ private: //ImProcFunctions ipf (¶ms, true); ImProcFunctions &ipf = * (ipf_p.get()); - if (params.fattal.enabled) { - ipf.ToneMapFattal02(baseImg); - } - if (params.dirpyrequalizer.cbdlMethod == "bef" && params.dirpyrequalizer.enabled && !params.colorappearance.enabled) { const int W = baseImg->getWidth(); const int H = baseImg->getHeight();