diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index dfa2e7ff3..8011b9189 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -474,7 +474,7 @@ HISTORY_MSG_232;N&B - Type de courbe 'Avant' HISTORY_MSG_233;N&B - Courbe 'Après' HISTORY_MSG_234;N&B - Type de courbe 'Après' HISTORY_MSG_235;N&B - Mixeur de Canaux - Auto -HISTORY_MSG_236;Retrait de taches - Modif. de points +HISTORY_MSG_236;--inutilisé-- HISTORY_MSG_237;N&B - Mixeur de Canaux HISTORY_MSG_238;FD - Étendu HISTORY_MSG_239;FD - Force @@ -764,6 +764,8 @@ HISTORY_MSG_SHARPENING_CONTRAST;Netteté - Seuil de contraste HISTORY_MSG_SH_COLORSPACE;O/HL - Espace couleur HISTORY_MSG_SOFTLIGHT_ENABLED;Lumière douce HISTORY_MSG_SOFTLIGHT_STRENGTH;Lumière douce - Force +HISTORY_MSG_SPOT;Retrait de taches +HISTORY_MSG_SPOT_ENTRY;Retrait de taches - Modif. de points HISTORY_MSG_TM_FATTAL_ANCHOR;CPD - Ancre HISTORY_NEWSNAPSHOT;Ajouter HISTORY_NEWSNAPSHOT_TOOLTIP;Raccourci: Alt-s diff --git a/rtdata/languages/default b/rtdata/languages/default index e065abd7f..3296a4c84 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -75,6 +75,7 @@ EXIFPANEL_RESET;Reset EXIFPANEL_RESETALL;Reset All EXIFPANEL_RESETALLHINT;Reset all tags to their original values. EXIFPANEL_RESETHINT;Reset the selected tags to their original values. +EXIFPANEL_SHOWALL;Show all EXIFPANEL_SUBDIRECTORY;Subdirectory EXPORT_BYPASS;Processing steps to bypass EXPORT_BYPASS_ALL;Select / Unselect All @@ -283,9 +284,9 @@ HISTORY_MSG_30;RLD - Radius HISTORY_MSG_31;RLD - Amount HISTORY_MSG_32;RLD - Damping HISTORY_MSG_33;RLD - Iterations -HISTORY_MSG_34;LCP distortion correction -HISTORY_MSG_35;LCP vignetting correction -HISTORY_MSG_36;LCP CA correction +HISTORY_MSG_34;Lens Correction - Distortion +HISTORY_MSG_35;Lens Correction - Vignetting +HISTORY_MSG_36;Lens Correction - CA HISTORY_MSG_37;Exposure - Auto levels HISTORY_MSG_38;White Balance - Method HISTORY_MSG_39;WB - Temperature @@ -334,7 +335,7 @@ HISTORY_MSG_81;Resize HISTORY_MSG_82;Profile changed HISTORY_MSG_83;S/H - Sharp mask HISTORY_MSG_84;Perspective correction -HISTORY_MSG_85;LCP +HISTORY_MSG_85;Lens Correction - LCP file HISTORY_MSG_86;RGB Curves - Luminosity mode HISTORY_MSG_87;Impulse Noise Reduction HISTORY_MSG_88;Impulse NR threshold @@ -483,7 +484,7 @@ HISTORY_MSG_232;B&W - 'Before' curve type HISTORY_MSG_233;B&W - 'After' curve HISTORY_MSG_234;B&W - 'After' curve type HISTORY_MSG_235;B&W - CM - Auto -HISTORY_MSG_236;Spot removal - Point modif. +HISTORY_MSG_236;--unused-- HISTORY_MSG_237;B&W - CM HISTORY_MSG_238;GF - Feather HISTORY_MSG_239;GF - Strength @@ -672,7 +673,7 @@ HISTORY_MSG_421;Retinex - Gamma HISTORY_MSG_422;Retinex - Gamma HISTORY_MSG_423;Retinex - Gamma slope HISTORY_MSG_424;Retinex - HL threshold -HISTORY_MSG_425;Spot removal +HISTORY_MSG_425;Retinex - Log base HISTORY_MSG_426;Retinex - Hue equalizer HISTORY_MSG_427;Output rendering intent HISTORY_MSG_428;Monitor rendering intent @@ -775,6 +776,8 @@ HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength +HISTORY_MSG_SPOT;Spot removal +HISTORY_MSG_SPOT_ENTRY;Spot removal - Point modif. HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 7d4bad381..afd9e3774 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -618,6 +618,12 @@ void Crop::update(int todo) parent->imgsrc->getImage(parent->currWB, tr, origCrop, pp, params.toneCurve, params.raw); } + if ((todo & M_SPOT) && params.spot.enabled && !params.spot.entries.empty()) { + PreviewProps pp(trafx, trafy, trafw * skip, trafh * skip, skip); + //parent->imgsrc->getImage(parent->currWB, tr, origCrop, pp, params.toneCurve, params.raw); + parent->ipf.removeSpots(origCrop, params.spot.entries, pp); + } + DirPyrDenoiseParams denoiseParams = params.dirpyrDenoise; if (params.dirpyrDenoise.Lmethod == "CUR") { @@ -692,6 +698,33 @@ 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); + if ((todo & M_SPOT_ADJUST) && params.spot.enabled && !params.spot.entries.empty()) { + PreviewProps pp(trafx, trafy, trafw * skip, trafh * skip, skip); + parent->ipf.removeSpots(origCrop, params.spot.entries, pp); + } + + // Apply Spot removal + if (todo & (M_SPOT|M_SPOT_ADJUST)) { + if (params.spot.enabled && !params.spot.entries.empty()) { + if(!spotCrop) { + spotCrop = new Imagefloat (cropw, croph); + } + baseCrop->copyData (spotCrop); + PreviewProps pp (trafx, trafy, trafw * skip, trafh * skip, skip); + //parent->imgsrc->getImage(parent->currWB, tr, origCrop, pp, params.toneCurve, params.raw); + parent->ipf.removeSpots (spotCrop, params.spot.entries, pp); + } else { + if (spotCrop) { + delete spotCrop; + spotCrop = nullptr; + } + } + } + + if (spotCrop) { + baseCrop = spotCrop; + } + std::unique_ptr fattalCrop; if ((todo & M_HDR) && (params.fattal.enabled || params.dehaze.enabled)) { @@ -747,29 +780,6 @@ void Crop::update(int todo) parent->ipf.ToneMapFattal02(f); } - // Apply Spot removal - if (params.spot.enabled) { - if (todo & M_SPOT) { - if(!spotCrop) { - spotCrop = new Imagefloat (cropw, croph); - } - baseCrop->copyData (spotCrop); - - PreviewProps pp (cropx, cropy, cropw, croph, skip); - parent->ipf.removeSpots (spotCrop, params.spot.entries, pp); - } - } else { - if (spotCrop) { - delete spotCrop; - } - - spotCrop = NULL; - } - - if (spotCrop) { - baseCrop = spotCrop; - } - // crop back to the size expected by the rest of the pipeline if (need_cropping) { Imagefloat *c = origCrop; diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index f27fafad6..91ba5b60c 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -40,7 +40,7 @@ extern const Settings* settings; ImProcCoordinator::ImProcCoordinator() : orig_prev(nullptr), oprevi(nullptr), - spot_prev (nullptr), + spotprev(nullptr), oprevl(nullptr), nprevl(nullptr), fattal_11_dcrop_cache(nullptr), @@ -50,7 +50,6 @@ ImProcCoordinator::ImProcCoordinator() : imgsrc (nullptr), lastAwbEqual (0.), lastAwbTempBias (0.0), - previewProps(-1, -1, -1, -1, 1), monitorIntent (RI_RELATIVE), softProof(false), gamutCheck(false), @@ -217,7 +216,7 @@ DetailedCrop* ImProcCoordinator::createCrop(::EditDataProvider *editDataProvider void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) { - MyMutex::MyLock processingLock (mProcessing); + MyMutex::MyLock processingLock(mProcessing); constexpr int numofphases = 15; int readyphase = 0; @@ -234,6 +233,41 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } } + if (todo & M_SPOT_ADJUST) { + // TWEAKING THE PROCPARAMS FOR THE SPOT ADJUSTMENT MODE + + // -> using fast demozaicing method + highDetailNeeded = false; + //params->raw.bayersensor.method = RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::FAST); + //params->raw.xtranssensor.method = RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::FAST); + + // -> disabling all transform + //params->coarse = CoarseTransformParams(); + params->lensProf = LensProfParams(); + params->cacorrection = CACorrParams(); + params->distortion = DistortionParams(); + params->rotate = RotateParams(); + params->perspective = PerspectiveParams(); + params->vignetting = VignettingParams(); + + // -> disabling standard crop + params->crop.enabled = false; + + // -> disabling time consuming and unnecessary tool + params->sh.enabled = false; + params->blackwhite.enabled = false; + params->dehaze.enabled = false; + params->wavelet.enabled = false; + params->filmSimulation.enabled = false; + params->sharpenEdge.enabled = false; + params->sharpenMicro.enabled = false; + params->sharpening.enabled = false; + params->softlight.enabled = false; + params->gradient.enabled = false; + params->pcvignette.enabled = false; + params->colorappearance.enabled = false; + } + if (((todo & ALL) == ALL) || (todo & M_MONITOR) || panningRelatedChange || (highDetailNeeded && options.prevdemo != PD_Sidecar)) { bwAutoR = bwAutoG = bwAutoB = -9000.f; @@ -451,11 +485,11 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) // Will (re)allocate the preview's buffers setScale(scale); - previewProps.set(0, 0, fw, fh, scale); + PreviewProps pp(0, 0, fw, fh, scale); // Tells to the ImProcFunctions' tools what is the preview scale, which may lead to some simplifications ipf.setScale(scale); - imgsrc->getImage(currWB, tr, orig_prev, previewProps, params->toneCurve, params->raw); + imgsrc->getImage(currWB, tr, orig_prev, pp, params->toneCurve, params->raw); denoiseInfoStore.valid = false; //ColorTemp::CAT02 (orig_prev, ¶ms) ; // printf("orig_prevW=%d\n scale=%d",orig_prev->width, scale); @@ -507,47 +541,48 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) readyphase++; + oprevi = orig_prev; + + progress ("Spot Removal...", 100 * readyphase / numofphases); + + if (todo & (M_SPOT|M_SPOT_ADJUST)) { + if (params->spot.enabled && !params->spot.entries.empty()) { + allocCache(spotprev); + orig_prev->copyData (spotprev); + + PreviewProps pp(0, 0, fw, fh, scale); + ipf.removeSpots (spotprev, params->spot.entries, pp); + } else { + if (spotprev) { + delete spotprev; + spotprev = nullptr; + } + } + } + if (spotprev) { + if (oprevi == orig_prev) { + allocCache(oprevi); + } + spotprev->copyData(oprevi); + } + + readyphase++; + if ((todo & M_HDR) && (params->fattal.enabled || params->dehaze.enabled)) { if (fattal_11_dcrop_cache) { delete fattal_11_dcrop_cache; fattal_11_dcrop_cache = nullptr; } - ipf.dehaze(orig_prev); - ipf.ToneMapFattal02(orig_prev); - - if (oprevi != orig_prev) { - delete oprevi; + if (oprevi == orig_prev) { + oprevi = new Imagefloat (pW, pH); + orig_prev->copyData (oprevi); } + + ipf.dehaze(oprevi); + ipf.ToneMapFattal02(oprevi); } - oprevi = orig_prev; - - progress ("Spot Removal...", 100 * readyphase / numofphases); - - if (params->spot.enabled && !params->spot.entries.empty ()) { - if ((todo & M_SPOT)) { - // First update the image with spot healing - ipf.removeSpots (oprevi, params->spot.entries, previewProps); - - // Then fork the image to cache the data - if (spot_prev == nullptr) { - spot_prev = new Imagefloat (pW, pH); - } - oprevi->copyData (spot_prev); - } - if (spot_prev) { - oprevi = spot_prev; - } - } else { - if (spot_prev) { - delete spot_prev; - spot_prev = nullptr; - } - } - - readyphase++; - progress ("Rotate / Distortion...", 100 * readyphase / numofphases); // Remove transformation if unneeded bool needstransform = ipf.needsTransform(); @@ -1063,16 +1098,16 @@ void ImProcCoordinator::freeAll() { if (allocated) { - if (spot_prev && spot_prev != oprevi) { - delete spot_prev; + if (spotprev && spotprev != oprevi) { + delete spotprev; } - spot_prev = nullptr; + spotprev = nullptr; - if (oprevi && oprevi != orig_prev) { + if (orig_prev != oprevi) { delete oprevi; } + oprevi = nullptr; - delete orig_prev; orig_prev = nullptr; delete oprevl; @@ -1099,6 +1134,15 @@ void ImProcCoordinator::freeAll() allocated = false; } +void ImProcCoordinator::allocCache (Imagefloat* &imgfloat) +{ + if (imgfloat == nullptr) { + imgfloat = new Imagefloat(pW, pH); + } else { + imgfloat->allocate(pW, pH); + } +} + /** @brief Handles image buffer (re)allocation and trigger sizeChanged of SizeListener[s] * If the scale change, this method will free all buffers and reallocate ones of the new size. * It will then tell to the SizeListener that size has changed (sizeChanged) diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index a12f5e83e..dac034abf 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -57,7 +57,7 @@ class ImProcCoordinator : public StagedImageProcessor protected: Imagefloat *orig_prev; Imagefloat *oprevi; - Imagefloat *spot_prev; + Imagefloat *spotprev; LabImage *oprevl; LabImage *nprevl; Imagefloat *fattal_11_dcrop_cache; // global cache for ToneMapFattal02 used in 1:1 detail windows (except when denoise is active) @@ -73,8 +73,6 @@ protected: double lastAwbEqual; double lastAwbTempBias; - PreviewProps previewProps; - Glib::ustring monitorProfile; RenderingIntent monitorIntent; bool softProof; @@ -183,6 +181,7 @@ protected: void progress (Glib::ustring str, int pr); void reallocAll (); + void allocCache (Imagefloat* &imgfloat); void updateLRGBHistograms (); void setScale (int prevscale); void updatePreviewImage (int todo, bool panningRelatedChange); diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 1de9437d5..bb6a30038 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -262,7 +262,7 @@ enum ProcEventCode { EvBWAfterCurve = 232, EvBWAfterCurveMode = 233, EvAutoch = 234, - EvSpotEntry = 235, +// EvFixedch=235, -- can be reused -- EvNeutralBW = 236, EvGradientFeather = 237, EvGradientStrength = 238, @@ -451,7 +451,7 @@ enum ProcEventCode { EvLgam = 421, EvLslope = 422, EvLhighl = 423, - EvSpotEnabled = 424, +// EvLbaselog = 424, -- can be reused -- EvRetinexlhcurve = 425, EvOIntent = 426, EvMonitorTransform = 427, diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 22ebbcbb8..d741b1744 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -262,7 +262,7 @@ int refreshmap[rtengine::NUMOFEVENTS] = { RGBCURVE, // EvBWAfterCurve RGBCURVE, // EvBWAfterCurveMode RGBCURVE, // EvAutoch - SPOT, // EvSpotEntry + 0, // --unused-- RGBCURVE, // EvNeutralBW TRANSFORM, // EvGradientFeather TRANSFORM, // EvGradientStrength @@ -451,7 +451,7 @@ int refreshmap[rtengine::NUMOFEVENTS] = { DEMOSAIC, // EvLgam DEMOSAIC, // EvLslope RETINEX, // EvLhighl - SPOT, // EvSpotEnabled + 0, // --unused-- DEMOSAIC, // EvRetinexlhcurve OUTPUTPROFILE, // EvOIntent MONITORTRANSFORM, // EvMonitorTransform: no history message @@ -470,7 +470,7 @@ int refreshmap[rtengine::NUMOFEVENTS] = { RETINEX, // EvRetinexgaintransmission RETINEX, // EvLskal OUTPUTPROFILE, // EvOBPCompens - ALLNORAW, // EvWBtempBias + ALLNORAW, // EvWBtempBias DARKFRAME, // EvRawImageNum 0, // unused 0, // unused diff --git a/rtengine/refreshmap.h b/rtengine/refreshmap.h index 97945e6e1..114e07b2e 100644 --- a/rtengine/refreshmap.h +++ b/rtengine/refreshmap.h @@ -22,6 +22,9 @@ #include #include "procevents.h" +// Use M_SPOT_ADJUST to update the rendering for On Preview Adjustment of the Spot tool +#define M_SPOT_ADJUST (1<<19) + // Use M_VOID if you wish to update the proc params without updating the preview at all ! #define M_VOID (1<<18) // Use M_MINUPDATE if you wish to update the preview without modifying the image (think about it like a "refreshPreview") @@ -51,16 +54,16 @@ // Bitfield of functions to do to the preview image when an event occurs // Use those or create new ones for your new events -#define FIRST (M_PREPROC|M_RAW|M_INIT|M_LINDENOISE|M_HDR|M_SPOT|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR|M_MONITOR) // without HIGHQUAL -#define ALL (M_PREPROC|M_RAW|M_INIT|M_LINDENOISE|M_HDR|M_SPOT|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) // without HIGHQUAL -#define DARKFRAME (M_PREPROC|M_RAW|M_INIT|M_LINDENOISE|M_HDR|M_SPOT|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) -#define FLATFIELD (M_PREPROC|M_RAW|M_INIT|M_LINDENOISE|M_HDR|M_SPOT|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) -#define DEMOSAIC (M_RAW|M_INIT|M_LINDENOISE|M_HDR|M_SPOT|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) -#define ALLNORAW (M_INIT|M_LINDENOISE|M_HDR|M_SPOT|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) -#define HDR (M_LINDENOISE|M_HDR|M_SPOT|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) -#define SPOT (M_SPOT|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) +#define FIRST (M_PREPROC|M_RAW|M_INIT|M_SPOT|M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR|M_MONITOR) // without HIGHQUAL +#define ALL (M_PREPROC|M_RAW|M_INIT|M_SPOT|M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) // without HIGHQUAL +#define DARKFRAME (M_PREPROC|M_RAW|M_INIT|M_SPOT|M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) +#define FLATFIELD (M_PREPROC|M_RAW|M_INIT|M_SPOT|M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) +#define DEMOSAIC (M_RAW|M_INIT|M_SPOT|M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) +#define ALLNORAW (M_INIT|M_SPOT|M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) +#define HDR (M_SPOT|M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) +#define SPOTADJUST (M_SPOT_ADJUST|M_HDR|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) #define TRANSFORM (M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) -#define AUTOEXP (M_HDR|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) +#define AUTOEXP (M_SPOT|M_HDR|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) #define RGBCURVE (M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) #define LUMINANCECURVE (M_LUMACURVE|M_LUMINANCE|M_COLOR) #define SHARPENING (M_LUMINANCE|M_COLOR) diff --git a/rtgui/spot.cc b/rtgui/spot.cc index 3d59b9c41..80a21793c 100644 --- a/rtgui/spot.cc +++ b/rtgui/spot.cc @@ -7,6 +7,8 @@ #include #include "../rtengine/rt_math.h" #include "guiutils.h" +#include "eventmapper.h" +#include "../rtengine/refreshmap.h" using namespace rtengine; using namespace rtengine::procparams; @@ -64,6 +66,12 @@ Spot::Spot() : FoldableToolPanel (this, "spot", M ("TP_SPOT_LABEL"), true, true) link.datum = Geometry::IMAGE; link.setActive (false); + auto m = ProcEventMapper::getInstance(); + EvSpotEnabled = m->newEvent(ALLNORAW, "TP_SPOT_LABEL"); + EvSpotEnabledOPA = m->newEvent(SPOTADJUST, ""); + EvSpotEntry = m->newEvent(SPOTADJUST, "HISTORY_MSG_SPOT_ENTRY"); + EvSpotEntryOPA = m->newEvent(SPOTADJUST, "HISTORY_MSG_SPOT_ENTRY"); + show_all(); } @@ -135,7 +143,7 @@ void Spot::resetPressed() updateGeometry(); if (listener) { - listener->panelChanged (EvSpotEntry, Glib::ustring::compose (M ("TP_SPOT_COUNTLABEL"), 0)); + listener->panelChanged (edit->get_active() ? EvSpotEntryOPA : EvSpotEntry, Glib::ustring::compose (M ("TP_SPOT_COUNTLABEL"), 0)); } } } @@ -167,16 +175,15 @@ void Spot::editedToggled () } } - void Spot::enabledChanged () { if (listener) { if (get_inconsistent()) { - listener->panelChanged (EvSpotEnabled, M ("GENERAL_UNCHANGED")); + listener->panelChanged (edit->get_active() ? EvSpotEnabledOPA : EvSpotEnabled, M ("GENERAL_UNCHANGED")); } else if (getEnabled()) { - listener->panelChanged (EvSpotEnabled, M ("GENERAL_ENABLED")); + listener->panelChanged (edit->get_active() ? EvSpotEnabledOPA : EvSpotEnabled, M ("GENERAL_ENABLED")); } else { - listener->panelChanged (EvSpotEnabled, M ("GENERAL_DISABLED")); + listener->panelChanged (edit->get_active() ? EvSpotEnabledOPA : EvSpotEnabled, M ("GENERAL_DISABLED")); } } } @@ -188,10 +195,14 @@ void Spot::setEditProvider (EditDataProvider* provider) void Spot::editToggled () { - if (edit->get_active()) { - subscribe(); - } else { - unsubscribe(); + if (listener) { + if (edit->get_active()) { + listener->refreshPreview(EvSpotEnabledOPA); // reprocess the preview w/o creating History entry + subscribe(); + } else { + unsubscribe(); + listener->refreshPreview(EvSpotEnabled); // reprocess the preview w/o creating History entry + } } } @@ -372,7 +383,7 @@ void Spot::addNewEntry() // TODO: find a way to disable the active spot's Mouse Over geometry but still displaying its location... if (listener) { - listener->panelChanged (EvSpotEntry, M ("TP_SPOT_ENTRYCHANGED")); + listener->panelChanged (EvSpotEntryOPA, M ("TP_SPOT_ENTRYCHANGED")); } } @@ -690,5 +701,6 @@ void Spot::switchOffEditMode () } EditSubscriber::switchOffEditMode(); // disconnect + listener->refreshPreview(EvSpotEnabled); // reprocess the preview w/o creating History entry } diff --git a/rtgui/spot.h b/rtgui/spot.h index e719070a5..50c196051 100644 --- a/rtgui/spot.h +++ b/rtgui/spot.h @@ -98,6 +98,14 @@ public: bool pick2 (const bool picked); bool pick3 (const bool picked); void switchOffEditMode (); + + rtengine::ProcEvent EvSpotEnabled; + rtengine::ProcEvent EvSpotEnabledOPA; // used to toggle-on the Spot 'On Preview Adjustment' mode + rtengine::ProcEvent EvSpotEntry; + rtengine::ProcEvent EvSpotEntryOPA; + + rtengine::ProcEvent evt; + }; #endif diff --git a/rtgui/toolpanel.h b/rtgui/toolpanel.h index 8f6595c08..cbf9a4226 100644 --- a/rtgui/toolpanel.h +++ b/rtgui/toolpanel.h @@ -35,6 +35,10 @@ class ToolPanelListener { public: virtual ~ToolPanelListener() = default; + + /// @brief Ask to refresh the preview not triggered by a parameter change (e.g. 'On Preview' editing). + virtual void refreshPreview(const rtengine::ProcEvent& event) = 0; + /// @brief Used to notify all listeners that a parameters has been effectively changed virtual void panelChanged(const rtengine::ProcEvent& event, const Glib::ustring& descr) = 0; }; diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index 691cfbcc6..c1143b781 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -379,6 +379,19 @@ void ToolPanelCoordinator::imageTypeChanged (bool isRaw, bool isBayer, bool isXt } +void ToolPanelCoordinator::refreshPreview (const rtengine::ProcEvent& event) +{ + if (!ipc) { + return; + } + + ProcParams* params = ipc->beginUpdateParams (); + for (auto toolPanel : toolPanels) { + toolPanel->write (params); + } + + ipc->endUpdateParams (event); // starts the IPC processing +} void ToolPanelCoordinator::panelChanged(const rtengine::ProcEvent& event, const Glib::ustring& descr) { diff --git a/rtgui/toolpanelcoord.h b/rtgui/toolpanelcoord.h index c380e8475..2347a85ed 100644 --- a/rtgui/toolpanelcoord.h +++ b/rtgui/toolpanelcoord.h @@ -237,6 +237,7 @@ public: } // toolpanellistener interface + void refreshPreview(const rtengine::ProcEvent& event) override; void panelChanged(const rtengine::ProcEvent& event, const Glib::ustring& descr) override; void imageTypeChanged (bool isRaw, bool isBayer, bool isXtrans, bool isMono = false) override;