diff --git a/rtdata/themes/RawTherapee-GTK3-20_.css b/rtdata/themes/RawTherapee-GTK3-20_.css index a2fadeca3..f32455ca3 100644 --- a/rtdata/themes/RawTherapee-GTK3-20_.css +++ b/rtdata/themes/RawTherapee-GTK3-20_.css @@ -324,6 +324,15 @@ scale:disabled trough { padding: 4px; } +/* Better on/off state separation for text toggle buttons, e.g. auto-levels or histogram matching. */ +button.text-button { + background-image: linear-gradient(to bottom, rgba(100,100,100,.3), rgba(30,30,30,.3)); +} + +button.text-button:checked { + background-image: linear-gradient(to bottom, rgba(30,30,30,.3), rgba(0,0,0,.4)); +} + separator { color: #363636; margin: 5px; diff --git a/rtdata/themes/RawTherapee-GTK3-_19.css b/rtdata/themes/RawTherapee-GTK3-_19.css index 8443768c3..cfbec4355 100644 --- a/rtdata/themes/RawTherapee-GTK3-_19.css +++ b/rtdata/themes/RawTherapee-GTK3-_19.css @@ -506,3 +506,11 @@ GtkNotebook { padding-left: 3px; padding-right: 3px; } + +GtkButton.text-button { + background-image: linear-gradient(to bottom, rgba(100,100,100,.3), rgba(30,30,30,.3)); +} + +GtkButton.text-button:checked { + background-image: linear-gradient(to bottom, rgba(30,30,30,.3), rgba(0,0,0,.4)); +} diff --git a/rtengine/histmatching.cc b/rtengine/histmatching.cc index aaeada81a..6f1387416 100644 --- a/rtengine/histmatching.cc +++ b/rtengine/histmatching.cc @@ -180,9 +180,9 @@ void RawImageSource::getAutoMatchedToneCurve(std::vector &outCurve) if (!histMatchingCache.empty()) { if (settings->verbose) { std::cout << "tone curve found in cache" << std::endl; - outCurve = histMatchingCache; - return; } + outCurve = histMatchingCache; + return; } outCurve = { DCT_Linear }; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 89c3ab302..a753278ef 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1638,21 +1638,18 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.localContrast.enabled = mods.localContrast.enabled; } - if (localContrast.radius) { - toEdit.localContrast.radius = mods.localContrast.radius; - } +#define ADDSETVAL_(v, i) \ + do { \ + if ( v ) { \ + toEdit. v = dontforceSet && options.baBehav[ i ] ? toEdit. v + mods. v : mods. v ; \ + } \ + } while (false) - if (localContrast.amount) { - toEdit.localContrast.amount = mods.localContrast.amount; - } - - if (localContrast.darkness) { - toEdit.localContrast.darkness = mods.localContrast.darkness; - } - - if (localContrast.lightness) { - toEdit.localContrast.lightness = mods.localContrast.lightness; - } + ADDSETVAL_(localContrast.radius, ADDSET_LOCALCONTRAST_RADIUS); + ADDSETVAL_(localContrast.amount, ADDSET_LOCALCONTRAST_AMOUNT); + ADDSETVAL_(localContrast.darkness, ADDSET_LOCALCONTRAST_DARKNESS); + ADDSETVAL_(localContrast.lightness, ADDSET_LOCALCONTRAST_LIGHTNESS); +#undef ADDSETVAL_ if (rgbCurves.enabled) { toEdit.rgbCurves.enabled = mods.rgbCurves.enabled; diff --git a/rtgui/partialpastedlg.cc b/rtgui/partialpastedlg.cc index f11a94393..27a56e38e 100644 --- a/rtgui/partialpastedlg.cc +++ b/rtgui/partialpastedlg.cc @@ -49,7 +49,6 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren // Basic Settings: wb = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_WHITEBALANCE"))); exposure = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EXPOSURE"))); - localcontrast = Gtk::manage(new Gtk::CheckButton(M("PARTIALPASTE_LOCALCONTRAST"))); sh = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_SHADOWSHIGHLIGHTS"))); epd = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EPD"))); fattal = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_TM_FATTAL"))); @@ -59,6 +58,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren // Detail Settings: sharpen = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_SHARPENING"))); + localcontrast = Gtk::manage(new Gtk::CheckButton(M("PARTIALPASTE_LOCALCONTRAST"))); sharpenedge = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_SHARPENEDGE"))); sharpenmicro = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_SHARPENMICRO"))); impden = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_IMPULSEDENOISE"))); @@ -146,7 +146,6 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren vboxes[0]->pack_start (*hseps[0], Gtk::PACK_SHRINK, 2); vboxes[0]->pack_start (*wb, Gtk::PACK_SHRINK, 2); vboxes[0]->pack_start (*exposure, Gtk::PACK_SHRINK, 2); - vboxes[0]->pack_start (*localcontrast, Gtk::PACK_SHRINK, 2); vboxes[0]->pack_start (*sh, Gtk::PACK_SHRINK, 2); vboxes[0]->pack_start (*epd, Gtk::PACK_SHRINK, 2); vboxes[0]->pack_start (*fattal, Gtk::PACK_SHRINK, 2); @@ -158,6 +157,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren vboxes[1]->pack_start (*detail, Gtk::PACK_SHRINK, 2); vboxes[1]->pack_start (*hseps[1], Gtk::PACK_SHRINK, 2); vboxes[1]->pack_start (*sharpen, Gtk::PACK_SHRINK, 2); + vboxes[1]->pack_start (*localcontrast, Gtk::PACK_SHRINK, 2); vboxes[1]->pack_start (*sharpenedge, Gtk::PACK_SHRINK, 2); vboxes[1]->pack_start (*sharpenmicro, Gtk::PACK_SHRINK, 2); vboxes[1]->pack_start (*impden, Gtk::PACK_SHRINK, 2); @@ -303,7 +303,6 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren // Basic Settings wbConn = wb->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); exposureConn = exposure->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); - localcontrastConn = localcontrast->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); shConn = sh->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); epdConn = epd->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); fattalConn = fattal->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); @@ -313,6 +312,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren // Detail Settings: sharpenConn = sharpen->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true)); + localcontrastConn = localcontrast->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true)); gradsharpenConn = sharpenedge->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true)); microcontrastConn = sharpenmicro->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true)); impdenConn = impden->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true)); @@ -486,7 +486,6 @@ void PartialPasteDlg::basicToggled () ConnectionBlocker wbBlocker(wbConn); ConnectionBlocker exposureBlocker(exposureConn); - ConnectionBlocker localcontrastBlocker(localcontrastConn); ConnectionBlocker shBlocker(shConn); ConnectionBlocker epdBlocker(epdConn); ConnectionBlocker fattalBlocker(fattalConn); @@ -498,7 +497,6 @@ void PartialPasteDlg::basicToggled () wb->set_active (basic->get_active ()); exposure->set_active (basic->get_active ()); - localcontrast->set_active(basic->get_active()); sh->set_active (basic->get_active ()); epd->set_active (basic->get_active ()); fattal->set_active (basic->get_active ()); @@ -511,6 +509,7 @@ void PartialPasteDlg::detailToggled () { ConnectionBlocker sharpenBlocker(sharpenConn); + ConnectionBlocker localcontrastBlocker(localcontrastConn); ConnectionBlocker gradsharpenBlocker(gradsharpenConn); ConnectionBlocker microcontrastBlocker(microcontrastConn); ConnectionBlocker impdenBlocker(impdenConn); @@ -521,6 +520,7 @@ void PartialPasteDlg::detailToggled () detail->set_inconsistent (false); sharpen->set_active (detail->get_active ()); + localcontrast->set_active(detail->get_active()); sharpenedge->set_active (detail->get_active ()); sharpenmicro->set_active (detail->get_active ()); impden->set_active (detail->get_active ()); diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index dc057f63e..a6d1b952d 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -187,15 +187,7 @@ Gtk::Widget* Preferences::getBatchProcPanel() appendBehavList(mi, M("TP_EXPOSURE_CONTRAST"), ADDSET_TC_CONTRAST, false); appendBehavList(mi, M("TP_EXPOSURE_SATURATION"), ADDSET_TC_SATURATION, false); - mi = behModel->append(); - mi->set_value(behavColumns.label, M("TP_LOCALCONTRAST_LABEL")); - appendBehavList(mi, M("TP_LOCALCONTRAST_RADIUS"), ADDSET_LOCALCONTRAST_RADIUS, false); - appendBehavList(mi, M("TP_LOCALCONTRAST_AMOUNT"), ADDSET_LOCALCONTRAST_AMOUNT, false); - appendBehavList(mi, M("TP_LOCALCONTRAST_DARKNESS"), ADDSET_LOCALCONTRAST_DARKNESS, false); - appendBehavList(mi, M("TP_LOCALCONTRAST_LIGHTNESS"), ADDSET_LOCALCONTRAST_LIGHTNESS, false); - - - mi = behModel->append(); + mi = behModel->append (); mi->set_value(behavColumns.label, M("TP_EPD_LABEL")); appendBehavList(mi, M("TP_EPD_STRENGTH"), ADDSET_EPD_STRENGTH, false); appendBehavList(mi, M("TP_EPD_GAMMA"), ADDSET_EPD_GAMMA, false); @@ -240,6 +232,14 @@ Gtk::Widget* Preferences::getBatchProcPanel() appendBehavList(mi, M("TP_SHARPENING_EDTOLERANCE"), ADDSET_SHARP_EDGETOL, false); appendBehavList(mi, M("TP_SHARPENING_HALOCONTROL"), ADDSET_SHARP_HALOCTRL, false); + mi = behModel->append(); + mi->set_value(behavColumns.label, M("TP_LOCALCONTRAST_LABEL")); + appendBehavList(mi, M("TP_LOCALCONTRAST_RADIUS"), ADDSET_LOCALCONTRAST_RADIUS, false); + appendBehavList(mi, M("TP_LOCALCONTRAST_AMOUNT"), ADDSET_LOCALCONTRAST_AMOUNT, false); + appendBehavList(mi, M("TP_LOCALCONTRAST_DARKNESS"), ADDSET_LOCALCONTRAST_DARKNESS, false); + appendBehavList(mi, M("TP_LOCALCONTRAST_LIGHTNESS"), ADDSET_LOCALCONTRAST_LIGHTNESS, false); + + mi = behModel->append(); mi->set_value(behavColumns.label, M("TP_SHARPENEDGE_LABEL")); appendBehavList(mi, M("TP_SHARPENEDGE_PASSES"), ADDSET_SHARPENEDGE_PASS, false); diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index f747e320f..065cd9c77 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -42,12 +42,12 @@ ToolPanelCoordinator::ToolPanelCoordinator(bool batch) : ipc(nullptr), hasChange coarse = Gtk::manage(new CoarsePanel()); toneCurve = Gtk::manage(new ToneCurve()); shadowshighlights = Gtk::manage(new ShadowsHighlights()); - localContrast = Gtk::manage(new LocalContrast()); impulsedenoise = Gtk::manage(new ImpulseDenoise()); defringe = Gtk::manage(new Defringe()); dirpyrdenoise = Gtk::manage(new DirPyrDenoise()); epd = Gtk::manage(new EdgePreservingDecompositionUI()); sharpening = Gtk::manage(new Sharpening()); + localContrast = Gtk::manage(new LocalContrast()); sharpenEdge = Gtk::manage(new SharpenEdge()); sharpenMicro = Gtk::manage(new SharpenMicro()); lcurve = Gtk::manage(new LCurve()); @@ -105,9 +105,9 @@ ToolPanelCoordinator::ToolPanelCoordinator(bool batch) : ipc(nullptr), hasChange addPanel(colorPanel, vibrance); addPanel(colorPanel, chmixer); addPanel(colorPanel, blackwhite); - addPanel(exposurePanel, localContrast); addPanel(exposurePanel, shadowshighlights); addPanel(detailsPanel, sharpening); + addPanel (detailsPanel, localContrast); addPanel(detailsPanel, sharpenEdge); addPanel(detailsPanel, sharpenMicro); addPanel(colorPanel, hsvequalizer); diff --git a/tools/win/InnoSetup/WindowsInnoSetup.iss.in b/tools/win/InnoSetup/WindowsInnoSetup.iss.in index 55305d5f0..235d64968 100644 --- a/tools/win/InnoSetup/WindowsInnoSetup.iss.in +++ b/tools/win/InnoSetup/WindowsInnoSetup.iss.in @@ -89,6 +89,8 @@ Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{ ;Name: "desktopicon\common"; Description: "For all users"; GroupDescription: "Additional icons:"; Flags: exclusive ;Name: "desktopicon\user"; Description: "For the current user only"; GroupDescription: "Additional icons:"; Flags: exclusive unchecked Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 0,6.1 +Name: regBrowseFolder; Description: "Add ""Browse with RawTherapee"" option to context menu when right-clicking on a folder."; GroupDescription: File extensions: +Name: regOpenFile; Description: "Add ""Open with RawTherapee"" option to context menu when right-clicking on a file."; GroupDescription: File extensions: [Files] Source: "{#MyBuildBasePath}\rawtherapee*.exe"; DestDir: "{app}"; Flags: ignoreversion @@ -100,6 +102,7 @@ Source: "{#MyBuildBasePath}\images\*"; DestDir: "{app}\images\"; Flags: ignoreve Source: "{#MyBuildBasePath}\languages\*"; DestDir: "{app}\languages\"; Flags: ignoreversion recursesubdirs createallsubdirs Source: "{#MyBuildBasePath}\licenses\*"; DestDir: "{app}\licenses\"; Flags: ignoreversion recursesubdirs createallsubdirs Source: "{#MyBuildBasePath}\lib\*"; DestDir: "{app}\lib\"; Flags: ignoreversion recursesubdirs createallsubdirs +Source: "{#MyBuildBasePath}\share\*"; DestDir: "{app}\share\"; Flags: ignoreversion recursesubdirs createallsubdirs Source: "{#MyBuildBasePath}\profiles\*"; DestDir: "{app}\profiles\"; Flags: ignoreversion recursesubdirs createallsubdirs Source: "{#MyBuildBasePath}\sounds\*"; DestDir: "{app}\sounds\"; Flags: ignoreversion recursesubdirs createallsubdirs Source: "{#MyBuildBasePath}\themes\*"; DestDir: "{app}\themes\"; Flags: ignoreversion recursesubdirs createallsubdirs @@ -111,17 +114,22 @@ Source: "{#MyBuildBasePath}\options"; DestDir: "{app}"; Flags: ignoreversion Source: "{#MyBuildBasePath}\*.dll"; DestDir: "{app}"; Flags: ignoreversion Source: "{#MyBuildBasePath}\gspawn-win{#MyBitDepth}-helper.exe"; DestDir: "{app}"; Flags: ignoreversion Source: "{#MyBuildBasePath}\gspawn-win{#MyBitDepth}-helper-console.exe"; DestDir: "{app}"; Flags: ignoreversion -;Source: "{#MyBuildBasePath}\gdb.exe"; DestDir: "{app}"; Flags: ignoreversion +Source: "{#MyBuildBasePath}\gdb.exe"; DestDir: "{app}"; Flags: skipifsourcedoesntexist ignoreversion Source: "{#MyBuildBasePath}\fonts\DroidSansMonoSlashed.ttf"; DestDir: "{fonts}"; FontInstall: "Droid Sans Mono Slashed"; Flags: onlyifdoesntexist uninsneveruninstall ; NOTE: Don't use "Flags: ignoreversion" on any shared system files [Icons] Name: "{group}\{#MyAppName} {#MyAppVersion}"; Filename: "{app}\{#MyAppExeName}" Name: "{group}\{cm:ProgramOnTheWeb,{#MyAppName}}"; Filename: "{#MyAppURL}" -Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}" +Name: "{group}\{cm:UninstallProgram,{#MyAppName} {#MyAppVersion}}"; Filename: "{uninstallexe}" Name: "{commondesktop}\{#MyAppName} {#MyAppVersion}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName} {#MyAppVersion}"; Filename: "{app}\{#MyAppExeName}"; Tasks: quicklaunchicon [Run] Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent +[Registry] +Root: HKCU; Subkey: "SOFTWARE\Classes\Directory\shell\Browse with RawTherapee"; ValueType: string; ValueData: "Browse with RawTherapee"; Flags: uninsdeletekey; Tasks: regBrowseFolder +Root: HKCU; Subkey: "SOFTWARE\Classes\Directory\shell\Browse with RawTherapee\command"; ValueType: string; ValueData: "{app}\{#MyAppExeName} -w ""%1"""; Flags: uninsdeletekey; Tasks: regBrowseFolder +Root: HKCU; Subkey: "SOFTWARE\Classes\*\shell\Open with RawTherapee"; ValueType: string; ValueData: "Open with RawTherapee"; Flags: uninsdeletekey; Tasks: regOpenFile +Root: HKCU; Subkey: "SOFTWARE\Classes\*\shell\Open with RawTherapee\command"; ValueType: string; ValueData: "{app}\{#MyAppExeName} -R ""%1"""; Flags: uninsdeletekey; Tasks: regOpenFile