display hue chroma lumaref on mask curves - dispaly 1:1 in some expanders - thanks to Pandagrapher

This commit is contained in:
Desmis 2019-03-04 10:20:08 +01:00
parent 65a418ae27
commit 5156edeb8a
11 changed files with 175 additions and 79 deletions

View File

@ -835,12 +835,12 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange)
CurveFactory::complexCurvelocal(ecomp, black / 65535., hlcompr, hlcomprthresh, shcompr, br, cont, lumar,
hltonecurveloc, shtonecurveloc, tonecurveloc, lightCurveloc, avg,
sca);
if (locallListener) {
locallListener->refChanged(huer, lumar, chromar);
if (sp == params.locallab.selspot) {
if (locallListener) {
locallListener->refChanged(huer, lumar, chromar);
}
}
// Locallab tools computation
/* Notes:
* - shbuffer is used as nullptr

View File

@ -247,6 +247,7 @@ CurveEditor::CurveEditor (Glib::ustring text, CurveEditorGroup* ceGroup, CurveEd
{
bgHistValid = false;
locallabRef = 0.0;
remoteDrag = false;
selected = DCT_Linear;
bottomBarCP = nullptr;
@ -321,6 +322,19 @@ void CurveEditor::updateBackgroundHistogram(const LUTu& hist)
subGroup->updateBackgroundHistogram(this);
}
/*
* Update Locallab reference value displayed in the background
*/
void CurveEditor::updateLocallabBackground(double ref)
{
// Copy Locallab reference value in the curve editor cache
locallabRef = ref;
// Then call the curve editor group to eventually update the histogram
subGroup->updateLocallabBackground(this);
}
// Open up the curve if it has modifications and it's not already opened
// Returns: true if curve was non linear and opened
bool CurveEditor::openIfNonlinear()

View File

@ -58,7 +58,7 @@ protected:
PopUpToggleButton* curveType;
LUTu histogram; // histogram values
bool bgHistValid;
double locallabRef; // Locallab reference value
bool remoteDrag;
int selected;
@ -94,7 +94,7 @@ public:
bool isUnChanged ();
void setUnChanged (bool uc);
void updateBackgroundHistogram(const LUTu& hist);
void updateLocallabBackground(double ref);
void setLeftBarColorProvider(ColorProvider* cp, int callerId);
void setBottomBarColorProvider(ColorProvider* cp, int callerId);
void setCurveColorProvider(ColorProvider* cp, int callerId);

View File

@ -269,6 +269,7 @@ void CurveEditorGroup::curveTypeToggled(CurveEditor* ce)
if (ct < ce->subGroup->valUnchanged) {
ce->subGroup->restoreDisplayedHistogram();
ce->subGroup->restoreLocallabBackground();
}
} else {
// The button is now released, so we have to hide this CurveEditor

View File

@ -136,6 +136,7 @@ public:
}
void updateEditButton(CurveEditor* curve, Gtk::ToggleButton *button, sigc::connection &connection);
virtual void updateBackgroundHistogram (CurveEditor* ce) {}
virtual void updateLocallabBackground(CurveEditor* ce) {};
virtual void switchGUI() = 0;
virtual void refresh(CurveEditor *curveToRefresh) = 0;
virtual void editModeSwitchedOff() = 0;
@ -165,6 +166,7 @@ protected:
virtual void storeCurveValues (CurveEditor* ce, const std::vector<double>& p) = 0;
virtual void storeDisplayedCurve () = 0;
virtual void restoreDisplayedHistogram() {};
virtual void restoreLocallabBackground() {};
virtual void removeEditor () = 0;
virtual const std::vector<double> getCurveFromGUI (int type) = 0;

View File

@ -554,6 +554,13 @@ void FlatCurveEditorSubGroup::restoreDisplayedHistogram()
}
void FlatCurveEditorSubGroup::restoreLocallabBackground()
{
if (parent->displayedCurve) {
CPointsCurve->updateLocallabBackground(parent->displayedCurve->locallabRef);
}
}
void FlatCurveEditorSubGroup::storeCurveValues (CurveEditor* ce, const std::vector<double>& p)
{
if (!p.empty()) {
@ -627,6 +634,13 @@ bool FlatCurveEditorSubGroup::curveReset(CurveEditor *ce)
return true;
}
void FlatCurveEditorSubGroup::updateLocallabBackground(CurveEditor* ce)
{
if (ce == parent->displayedCurve) {
CPointsCurve->updateLocallabBackground(ce->locallabRef);
}
}
/*void FlatCurveEditorSubGroup::updateBackgroundHistogram (CurveEditor* ce) {
CurveEditor* fce = (CurveEditor*)ce;
if (fce==displayedCurve) {

View File

@ -50,6 +50,7 @@ public:
FlatCurveEditor* addCurve(Glib::ustring curveLabel = "", bool periodic = true);
//virtual void updateBackgroundHistogram (CurveEditor* ce);
void updateLocallabBackground(CurveEditor* ce) override;
void switchGUI() override;
void refresh(CurveEditor *curveToRefresh) override;
void editModeSwitchedOff() override;
@ -66,6 +67,7 @@ protected:
void storeCurveValues (CurveEditor* ce, const std::vector<double>& p) override;
void storeDisplayedCurve () override;
void restoreDisplayedHistogram () override;
void restoreLocallabBackground() override;
void savePressed ();
void loadPressed ();
void copyPressed ();

View File

@ -53,11 +53,11 @@ Locallab::Locallab():
expsoft(new MyExpander(true, M("TP_LOCALLAB_SOFT"))),
expblur(new MyExpander(true, M("TP_LOCALLAB_BLUFR"))),
exptonemap(new MyExpander(true, M("TP_LOCALLAB_TM"))),
expreti(new MyExpander(true, M("TP_LOCALLAB_RETI"))),
expsharp(new MyExpander(true, M("TP_LOCALLAB_SHARP"))),
expreti(new MyExpander(true, new Gtk::HBox())),
expsharp(new MyExpander(true, new Gtk::HBox())),
expcontrast(new MyExpander(true, M("TP_LOCALLAB_LOC_CONTRAST"))),
expcbdl(new MyExpander(true, M("TP_LOCALLAB_CBDL"))),
expdenoi(new MyExpander(true, M("TP_LOCALLAB_DENOIS"))),
expcbdl(new MyExpander(true, new Gtk::HBox())),
expdenoi(new MyExpander(true, new Gtk::HBox())),
// CurveEditorGroup widgets
@ -201,8 +201,6 @@ Locallab::Locallab():
lumacontrastMinusButton(Gtk::manage(new Gtk::Button(M("TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS")))),
lumaneutralButton(Gtk::manage(new Gtk::Button(M("TP_DIRPYREQUALIZER_LUMANEUTRAL")))),
lumacontrastPlusButton(Gtk::manage(new Gtk::Button(M("TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS")))),
transLabels(Gtk::manage(new Gtk::Label("---"))),
transLabels2(Gtk::manage(new Gtk::Label("---"))),
maskcolFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_SHOW")))),
maskexpFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_SHOW")))),
gridFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LABGRID")))),
@ -210,10 +208,7 @@ Locallab::Locallab():
// Others
defparams(nullptr),
defpedited(nullptr),
pe(nullptr),
nexthuer(0.),
nextlumar(0.),
nextchromar(0.)
pe(nullptr)
{
ToolVBox* const panel = Gtk::manage(new ToolVBox());
@ -389,8 +384,9 @@ Locallab::Locallab():
colorBox->pack_start(*invers);
maskcolFrame->set_label_align(0.025, 0.5);
ToolParamBlock* const maskcolBox = Gtk::manage(new ToolParamBlock());
maskcolBox->pack_start(*transLabels, Gtk::PACK_SHRINK, 4);
maskcolBox->pack_start(*showmaskcolMethod, Gtk::PACK_SHRINK, 0);
// maskcolBox->pack_start(*transLabels, Gtk::PACK_SHRINK, 4);
// maskcolBox->pack_start(*showmaskcolMethod, Gtk::PACK_SHRINK, 0);
maskcolBox->pack_start(*showmaskcolMethod, Gtk::PACK_SHRINK, 4);
maskcolBox->pack_start(*enaColorMask, Gtk::PACK_SHRINK, 0);
maskcolBox->pack_start(*maskCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor
maskcolBox->pack_start(*blendmaskcol, Gtk::PACK_SHRINK, 0);
@ -495,8 +491,9 @@ Locallab::Locallab():
exposeBox->pack_start(*inversex);
maskexpFrame->set_label_align(0.025, 0.5);
ToolParamBlock* const maskexpBox = Gtk::manage(new ToolParamBlock());
maskexpBox->pack_start(*transLabels2, Gtk::PACK_SHRINK, 4);
maskexpBox->pack_start(*showmaskexpMethod, Gtk::PACK_SHRINK, 0);
maskexpBox->pack_start(*showmaskexpMethod, Gtk::PACK_SHRINK, 4);
// maskexpBox->pack_start(*transLabels2, Gtk::PACK_SHRINK, 4);
// maskexpBox->pack_start(*showmaskexpMethod, Gtk::PACK_SHRINK, 0);
maskexpBox->pack_start(*enaExpMask, Gtk::PACK_SHRINK, 0);
maskexpBox->pack_start(*maskexpCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor
maskexpBox->pack_start(*blendmaskexp, Gtk::PACK_SHRINK, 0);
@ -663,9 +660,18 @@ Locallab::Locallab():
exptonemap->add(*tmBox);
exptonemap->setLevel(2);
// panel->pack_start(*exptonemap, false, false);
// panel->pack_start(*exptonemap, false, false);
// Retinex
Gtk::HBox* const retiTitleHBox = Gtk::manage(new Gtk::HBox());
Gtk::Label* const retiLabel = Gtk::manage(new Gtk::Label());
retiLabel->set_markup(Glib::ustring("<b>") + escapeHtmlChars(M("TP_LOCALLAB_RETI")) + Glib::ustring("</b>"));
retiLabel->set_alignment(Gtk::ALIGN_START, Gtk::ALIGN_CENTER);
retiTitleHBox->pack_start(*retiLabel, Gtk::PACK_EXPAND_WIDGET, 0);
RTImage *retiImage = Gtk::manage (new RTImage("one-to-one-small.png"));
retiImage->set_tooltip_text(M("TP_GENERAL_11SCALE_TOOLTIP"));
retiTitleHBox->pack_end(*retiImage, Gtk::PACK_SHRINK, 0);
expreti->setLabel(retiTitleHBox);
expreti->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Locallab::foldAllButMe), expreti));
enableretiConn = expreti->signal_enabled_toggled().connect(sigc::bind(sigc::mem_fun(this, &Locallab::enableToggled), expreti));
@ -716,6 +722,16 @@ Locallab::Locallab():
panel->pack_start(*expreti, false, false);
// Sharpening
Gtk::HBox* const sharpTitleHBox = Gtk::manage(new Gtk::HBox());
Gtk::Label* const sharpLabel = Gtk::manage(new Gtk::Label());
sharpLabel->set_markup(Glib::ustring("<b>") + escapeHtmlChars(M("TP_LOCALLAB_SHARP")) + Glib::ustring("</b>"));
sharpLabel->set_alignment(Gtk::ALIGN_START, Gtk::ALIGN_CENTER);
sharpTitleHBox->pack_start(*sharpLabel, Gtk::PACK_EXPAND_WIDGET, 0);
RTImage *sharpImage = Gtk::manage (new RTImage("one-to-one-small.png"));
sharpImage->set_tooltip_text(M("TP_GENERAL_11SCALE_TOOLTIP"));
sharpTitleHBox->pack_end(*sharpImage, Gtk::PACK_SHRINK, 0);
expsharp->setLabel(sharpTitleHBox);
expsharp->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Locallab::foldAllButMe), expsharp));
enablesharpConn = expsharp->signal_enabled_toggled().connect(sigc::bind(sigc::mem_fun(this, &Locallab::enableToggled), expsharp));
@ -776,6 +792,15 @@ Locallab::Locallab():
panel->pack_start(*expcontrast, false, false);
// Contrast by detail levels
Gtk::HBox* const cbdlTitleHBox = Gtk::manage(new Gtk::HBox());
Gtk::Label* const cbdlLabel = Gtk::manage(new Gtk::Label());
cbdlLabel->set_markup(Glib::ustring("<b>") + escapeHtmlChars(M("TP_LOCALLAB_CBDL")) + Glib::ustring("</b>"));
cbdlLabel->set_alignment(Gtk::ALIGN_START, Gtk::ALIGN_CENTER);
cbdlTitleHBox->pack_start(*cbdlLabel, Gtk::PACK_EXPAND_WIDGET, 0);
RTImage *cbdlImage = Gtk::manage (new RTImage("one-to-one-small.png"));
cbdlImage->set_tooltip_text(M("TP_GENERAL_11SCALE_TOOLTIP"));
cbdlTitleHBox->pack_end(*cbdlImage, Gtk::PACK_SHRINK, 0);
expcbdl->setLabel(cbdlTitleHBox);
expcbdl->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Locallab::foldAllButMe), expcbdl));
enablecbdlConn = expcbdl->signal_enabled_toggled().connect(sigc::bind(sigc::mem_fun(this, &Locallab::enableToggled), expcbdl));
expcbdl->set_tooltip_text(M("TP_LOCALLAB_EXPCBDL_TOOLTIP"));
@ -827,6 +852,15 @@ Locallab::Locallab():
panel->pack_start(*expcbdl, false, false);
// Denoise
Gtk::HBox* const denoiTitleHBox = Gtk::manage(new Gtk::HBox());
Gtk::Label* const denoiLabel = Gtk::manage(new Gtk::Label());
denoiLabel->set_markup(Glib::ustring("<b>") + escapeHtmlChars(M("TP_LOCALLAB_DENOIS")) + Glib::ustring("</b>"));
denoiLabel->set_alignment(Gtk::ALIGN_START, Gtk::ALIGN_CENTER);
denoiTitleHBox->pack_start(*denoiLabel, Gtk::PACK_EXPAND_WIDGET, 0);
RTImage *denoiImage = Gtk::manage (new RTImage("one-to-one-small.png"));
denoiImage->set_tooltip_text(M("TP_GENERAL_11SCALE_TOOLTIP"));
denoiTitleHBox->pack_end(*denoiImage, Gtk::PACK_SHRINK, 0);
expdenoi->setLabel(denoiTitleHBox);
expdenoi->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Locallab::foldAllButMe), expdenoi));
enabledenoiConn = expdenoi->signal_enabled_toggled().connect(sigc::bind(sigc::mem_fun(this, &Locallab::enableToggled), expdenoi));
@ -998,59 +1032,44 @@ void Locallab::writeOptions(std::vector<int> &tpOpen)
}
void Locallab::refChanged(double huer, double lumar, double chromar)
{
nexthuer = huer;
nextlumar = lumar / 100.f;
nextchromar = chromar / 137.4f;
float h = Color::huelab_to_huehsv2(nexthuer);
h += 1.f / 6.f;
if (h > 1.f) {
h -= 1.f;
}
nexthuer = h;
//printf("nh=%f nl=%f nc=%f\n", nexthuer, nextlumar, nextchromar);
idle_register.add(
[this]() -> bool {
GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected
// FIXME: The above can't be true?!
disableListener();
enableListener();
updateLabel();
return false;
}
);
}
void Locallab::updateLabel()
void Locallab::refChanged (double huer, double lumar, double chromar)
{
if (!batchMode) {
float nX, nY, nZ;
nY = nextlumar;
nX = nextchromar;
nZ = nexthuer;
{
transLabels->set_text(
Glib::ustring::compose(M("TP_LOCALLAB_REFLABEL"),
Glib::ustring::format(std::fixed, std::setprecision(3), nX),
Glib::ustring::format(std::fixed, std::setprecision(3), nY),
Glib::ustring::format(std::fixed, std::setprecision(3), nZ))
);
transLabels2->set_text(
Glib::ustring::compose(M("TP_LOCALLAB_REFLABEL"),
Glib::ustring::format(std::fixed, std::setprecision(3), nX),
Glib::ustring::format(std::fixed, std::setprecision(3), nY),
Glib::ustring::format(std::fixed, std::setprecision(3), nZ))
);
// Hue reference normalization (between 0 and 1)
double normHuer = huer;
float h = Color::huelab_to_huehsv2(normHuer);
h += 1.f/6.f;
if (h > 1.f) {
h -= 1.f;
}
normHuer = h;
// Luma reference normalization (between 0 and 1)
double normLumar = lumar / 100.f;
// Chroma reference normalization (between 0 and 1)
double normChromar = chromar / 137.4f;
// printf("nh=%f nl=%f nc=%f\n", normHuer, normLumar, normChromar);
idle_register.add(
[this, normHuer, normLumar, normChromar]() -> bool
{
GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected
// Update Color & Light mask background
CCmaskshape->updateLocallabBackground(normChromar);
LLmaskshape->updateLocallabBackground(normLumar);
HHmaskshape->updateLocallabBackground(normHuer);
// Update Exposure mask background
CCmaskexpshape->updateLocallabBackground(normChromar);
LLmaskexpshape->updateLocallabBackground(normLumar);
HHmaskexpshape->updateLocallabBackground(normHuer);
return false;
}
);
}
}
@ -1091,7 +1110,7 @@ void Locallab::lumacontrastPlusPressed()
for (int i = 0; i < 5; i++) {
float inc = (5 - i);
multiplier[i]->setValue(multiplier[i]->getValue() + 0.01f * inc );
multiplier[i]->setValue(multiplier[i]->getValue() + 0.01f * inc);
}
// Raise event (only for first multiplier because associated event concerns all multipliers)
@ -3198,6 +3217,7 @@ void Locallab::adjusterChanged(Adjuster * a, double newval)
}
}
// Vibrance
if (a == pastels && pastSatTog->get_active() && !(multiImage && pastSatTog->get_inconsistent())) {
saturated->setValue(newval);

View File

@ -232,8 +232,8 @@ private:
Gtk::Button* const lumaneutralButton;
Gtk::Button* const lumacontrastPlusButton;
sigc::connection lumacontrastMinusPressedConn, lumaneutralPressedConn, lumacontrastPlusPressedConn;
Gtk::Label* transLabels;
Gtk::Label* transLabels2;
// Gtk::Label* transLabels;
// Gtk::Label* transLabels2;
Gtk::Frame* maskcolFrame;
Gtk::Frame* maskexpFrame;
Gtk::Frame* gridFrame;
@ -301,9 +301,6 @@ private:
void updateLocallabGUI(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited, int index);
void updateSpecificGUIState();
void setParamEditable(bool cond);
double nexthuer;
double nextlumar;
double nextchromar;
public:
@ -323,7 +320,6 @@ public:
void writeOptions(std::vector<int> &tpOpen);
void updateToolState(std::vector<int> &tpOpen);
void refChanged(double huer, double lumar, double chromar);
void updateLabel();
// Mask visibility management functions
struct llMaskVisibility {

View File

@ -39,7 +39,8 @@ MyFlatCurve::MyFlatCurve () :
deletedPointX(0.0),
leftTanHandle({0.0, 0.0}),
rightTanHandle({0.0, 0.0}),
draggingElement(false)
draggingElement(false),
locallabRef(0.0)
{
graphW = get_allocation().get_width() - RADIUS * 2;
@ -164,6 +165,19 @@ void MyFlatCurve::draw ()
Gdk::RGBA c;
// Draw Locallab reference value in the background
if (locallabRef > 0.0) {
cr->set_line_width(1.0);
cr->move_to(double(graphX + 1), double(graphY - 1));
c = style->get_color(state);
cr->set_source_rgba(c.get_red(), c.get_green(), c.get_blue(), 0.2);
cr->line_to(double(graphX + 1), double(graphY - 1) - double(graphH - 2));
cr->line_to(double(graphX) + 1.5 + locallabRef*double(graphW -2), double(graphY - 1) - double(graphH - 2));
cr->line_to(double(graphX) + 1.5 + locallabRef*double(graphW -2), double(graphY - 1));
cr->close_path();
cr->fill();
cr->stroke();
}
cr->set_line_width (1.0);
// draw f(x)=0.5 line
@ -1872,6 +1886,35 @@ void MyFlatCurve::stopNumericalAdjustment()
}
}
void MyFlatCurve::updateLocallabBackground(double ref)
{
locallabRef = ref;
mcih->pending++;
idle_register.add(
[this]() -> bool
{
if (mcih->destroyed) {
if (mcih->pending == 1) {
delete mcih;
} else {
--mcih->pending;
}
return false;
}
mcih->clearPixmap();
mcih->myCurve->queue_draw();
--mcih->pending;
return false;
}
);
}
void MyFlatCurve::setType (FlatCurveType t)
{

View File

@ -76,6 +76,8 @@ public:
class MyFlatCurve : public MyCurve
{
private:
IdleRegister idle_register;
protected:
FlatCurveDescr curve;
@ -103,6 +105,7 @@ protected:
enum EditedHandle editedHandle;
bool draggingElement;
enum MouseOverAreas area;
double locallabRef; // Locallab reference value to display in the background
void draw ();
void movePoint(bool moveX, bool moveY, bool pipetteDrag = false);
@ -137,6 +140,7 @@ public:
void setPos(double pos, int chanIdx) override;
void stopNumericalAdjustment() override;
void updateLocallabBackground(double ref);
};
#endif