diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index 17d47b225..637b5f286 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -68,9 +68,12 @@ class ImageSource : public InitialImage { virtual ~ImageSource () {} virtual int load (Glib::ustring fname, bool batch = false) =0; - virtual void preprocess (const RAWParams &raw, HRecParams hrp){}; - virtual void demosaic (const RAWParams &raw, HRecParams hrp){}; - virtual void HLRecovery_inpaint (float** red, float** green, float** blue){}; + virtual void preprocess (const RAWParams &raw){}; + virtual void demosaic (const RAWParams &raw){}; + virtual void HLRecovery_Global (HRecParams hrp){}; + virtual void HLRecovery_inpaint (float** red, float** green, float** blue){}; + + virtual bool IsrgbSourceModified() =0; // tracks whether cached rgb output of demosaic has been modified virtual void getImage (ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp, HRecParams hlp, ColorManagementParams cmp, RAWParams raw) {} virtual ColorTemp getWB () =0; diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 8472d9e80..164033c17 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -117,14 +117,28 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) { progress ("Applying white balance, color correction & sRBG conversion...",100*readyphase/numofphases); if ( todo & M_PREPROC) { - imgsrc->preprocess( rp, params.hlrecovery ); + imgsrc->preprocess( rp ); imgsrc->getRAWHistogram( histRedRaw, histGreenRaw, histBlueRaw ); } + /* + Demosaic is kicked off only when + Detail considerations: + accurate detail is not displayed yet needed based on preview specifics (driven via highDetailNeeded flag) + OR + HLR considerations: + Color HLR alters rgb output of demosaic, so re-demosaic is needed when Color HLR is being turned off; + if HLR is enabled and changing method *from* Color to any other method + OR HLR gets disabled when Color method was selected + */ // If high detail (=100%) is newly selected, do a demosaic update, since the last was just with FAST - if ((todo & M_RAW) || (!lastHighDetail && highDetailNeeded)) { - if (settings->verbose) printf("Demosaic %s\n",rp.dmethod.c_str()); - imgsrc->demosaic( rp, params.hlrecovery ); + if ((todo & M_RAW) + || (!lastHighDetail && highDetailNeeded) + || (params.hlrecovery.enabled && params.hlrecovery.method!="Color" && imgsrc->IsrgbSourceModified()) + || (!params.hlrecovery.enabled && params.hlrecovery.method=="Color" && imgsrc->IsrgbSourceModified())){ + + if (settings->verbose) printf("Demosaic %s\n",rp.dmethod.c_str()); + imgsrc->demosaic( rp ); } lastHighDetail=highDetailNeeded; @@ -132,6 +146,8 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) { if (todo & M_INIT) { Glib::Mutex::Lock lock(minit); // Also used in crop window + imgsrc->HLRecovery_Global( params.hlrecovery ); // this handles Color HLRecovery + if (settings->verbose) printf ("Applying white balance, color correction & sRBG conversion...\n"); currWB = ColorTemp (params.wb.temperature, params.wb.green); if (params.wb.method=="Camera") @@ -531,8 +547,8 @@ void ImProcCoordinator::saveInputICCReference (const Glib::ustring& fname) { ppar.icm.input = "(none)"; Imagefloat* im = new Imagefloat (fW, fH); Image16* im16 = new Image16 (fW, fH); - imgsrc->preprocess( ppar.raw, ppar.hlrecovery ); - imgsrc->demosaic(ppar.raw, ppar.hlrecovery ); + imgsrc->preprocess( ppar.raw ); + imgsrc->demosaic(ppar.raw ); //imgsrc->getImage (imgsrc->getWB(), 0, im, pp, ppar.hlrecovery, ppar.icm, ppar.raw); ColorTemp currWB = ColorTemp (params.wb.temperature, params.wb.green); if (params.wb.method=="Camera") diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index f3fd80b2b..d1aee83d2 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -86,6 +86,7 @@ RawImageSource::RawImageSource () //hpmap = NULL; camProfile = NULL; embProfile = NULL; + rgbSourceModified = false; } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -951,7 +952,7 @@ int RawImageSource::load (Glib::ustring fname, bool batch) { //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -void RawImageSource::preprocess (const RAWParams &raw, HRecParams hrp) +void RawImageSource::preprocess (const RAWParams &raw) { MyTime t1,t2; t1.set(); @@ -1098,7 +1099,7 @@ void RawImageSource::preprocess (const RAWParams &raw, HRecParams hrp) //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -void RawImageSource::demosaic(const RAWParams &raw, HRecParams hrp ) +void RawImageSource::demosaic(const RAWParams &raw) { if (ri->isBayer()) { MyTime t1,t2; @@ -1125,14 +1126,25 @@ void RawImageSource::demosaic(const RAWParams &raw, HRecParams hrp ) printf("Demosaicing: %s - %d usec\n",raw.dmethod.c_str(), t2.etime(t1)); if (raw.all_enhance) refinement_lassus(); + + rgbSourceModified = false; } - - //color propagation highlight recovery - if (hrp.enabled && hrp.method=="Color") - HLRecovery_inpaint (red,green,blue); - } - + +void RawImageSource::HLRecovery_Global(HRecParams hrp ) +{ + //color propagation highlight recovery + if (hrp.enabled && hrp.method=="Color"){ + if (settings->verbose) printf ("Applying Highlight Recovery: Color propagation...\n"); + HLRecovery_inpaint (red,green,blue); + rgbSourceModified = true; + } + else{ + rgbSourceModified = false; + } +} + + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /* Copy original pixel data and diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index 855b963ff..48e0e3a4d 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -93,6 +93,7 @@ class RawImageSource : public ImageSource { bool full; cmsHPROFILE camProfile; cmsHPROFILE embProfile; + bool rgbSourceModified; RawImage* ri; // Copy of raw pixels, NOT corrected for initial gain, blackpoint etc. @@ -131,10 +132,13 @@ class RawImageSource : public ImageSource { ~RawImageSource (); int load (Glib::ustring fname, bool batch = false); - void preprocess (const RAWParams &raw, HRecParams hrp); - void demosaic (const RAWParams &raw, HRecParams hrp); + void preprocess (const RAWParams &raw); + void demosaic (const RAWParams &raw); + void HLRecovery_Global (HRecParams hrp); void refinement_lassus (); + bool IsrgbSourceModified() {return rgbSourceModified;} // tracks whether cached rgb output of demosaic has been modified + void copyOriginalPixels(const RAWParams &raw, RawImage *ri, RawImage *riDark, RawImage *riFlatFile ); void cfaboxblur (RawImage *riFlatFile, float* cfablur, int boxH, int boxW ); void scaleColors (int winx,int winy,int winw,int winh, const RAWParams &raw);// raw for cblack diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 3b5a91c1a..75ef900bc 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -85,9 +85,9 @@ TRANSFORM, // EvDISTAmount, ALL, // EvBookmarkSelected, CROP, // EvCrop, TRANSFORM, // EvCACorr, -ALL, // EvHREnabled, -ALL, // EvHRAmount, -ALL, // EvHRMethod, +ALLNORAW, // EvHREnabled, +ALLNORAW, // EvHRAmount, +ALLNORAW, // EvHRMethod, ALL, // EvWProfile, ALL, // EvOProfile, ALL, // EvIProfile, diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 93ca62102..e14bf6513 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -98,10 +98,12 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p currWB = imgsrc->getAutoWB (); PreviewProps pp (0, 0, fw, fh, 1); - imgsrc->preprocess( params.raw, params.hlrecovery ); + imgsrc->preprocess( params.raw); if (pl) pl->setProgress (0.20); - imgsrc->demosaic( params.raw, params.hlrecovery ); - if (pl) pl->setProgress (0.40); + imgsrc->demosaic( params.raw); + if (pl) pl->setProgress (0.30); + imgsrc->HLRecovery_Global( params.hlrecovery ); + if (pl) pl->setProgress (0.40); Imagefloat* baseImg = new Imagefloat (fw, fh); imgsrc->getImage (currWB, tr, baseImg, pp, params.hlrecovery, params.icm, params.raw); if (pl) pl->setProgress (0.45); diff --git a/rtengine/stdimagesource.h b/rtengine/stdimagesource.h index 045d9f87b..8751cb5c2 100644 --- a/rtengine/stdimagesource.h +++ b/rtengine/stdimagesource.h @@ -36,7 +36,7 @@ class StdImageSource : public ImageSource { void transform (PreviewProps pp, int tran, int &sx1, int &sy1, int &sx2, int &sy2); void transformPixel (int x, int y, int tran, int& tx, int& ty); - + bool rgbSourceModified; public: StdImageSource (); ~StdImageSource (); @@ -62,7 +62,7 @@ class StdImageSource : public ImageSource { static inline double intpow (double a, int b) { double r = 1.0; for (int i=0; i