diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index a07133204..a9c8a95d6 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -79,15 +79,18 @@ HistogramPanel::HistogramPanel () : histogramRGBAreaVert->show(); switch (options.histogramScopeType) { - case 2: - case 3: + case ScopeType::NONE: + case ScopeType::VECTORSCOPE_HC: + case ScopeType::VECTORSCOPE_HS: histogramRGBArea = nullptr; break; - case 1: + case ScopeType::WAVEFORM: histogramRGBArea = histogramRGBAreaVert.get(); break; - default: + case ScopeType::HISTOGRAM: + case ScopeType::HISTOGRAM_RAW: histogramRGBArea = histogramRGBAreaHori.get(); + break; } // connecting the two childs @@ -202,14 +205,22 @@ HistogramPanel::HistogramPanel () : showMode->set_image(*mode1Image); else showMode->set_image(*mode2Image); - if (options.histogramScopeType == 0) { - scopeType->set_image(*histImage); - } else if (options.histogramScopeType == 1) { - scopeType->set_image(*waveImage); - } else if (options.histogramScopeType == 2) { - scopeType->set_image(*vectHsImage); - } else if (options.histogramScopeType == 3) { - scopeType->set_image(*vectHcImage); + switch(options.histogramScopeType) { + case ScopeType::HISTOGRAM: + scopeType->set_image(*histImage); + break; + case ScopeType::WAVEFORM: + scopeType->set_image(*waveImage); + break; + case ScopeType::VECTORSCOPE_HS: + scopeType->set_image(*vectHsImage); + break; + case ScopeType::VECTORSCOPE_HC: + scopeType->set_image(*vectHcImage); + break; + case ScopeType::HISTOGRAM_RAW: + case ScopeType::NONE: + break; } showBAR->set_image (showBAR->get_active() ? *barImage : *barImage_g); @@ -303,7 +314,10 @@ void HistogramPanel::showRGBBar() gfxGrid->attach_next_to(*histogramRGBArea, *histogramArea, pos); setHistRGBInvalid(); - histogramRGBArea->setShow(options.histogramScopeType < 2); + histogramRGBArea->setShow( + options.histogramScopeType == ScopeType::HISTOGRAM + || options.histogramScopeType == ScopeType::WAVEFORM + ); } void HistogramPanel::resized (Gtk::Allocation& req) @@ -363,8 +377,11 @@ void HistogramPanel::raw_toggled () showChro->set_sensitive(false); } else { showRAW->set_image(*rawImage_g); - showValue->set_sensitive(options.histogramScopeType != 1); - showChro->set_sensitive(options.histogramScopeType != 1); + showValue->set_sensitive( + options.histogramScopeType == ScopeType::HISTOGRAM + || options.histogramScopeType == ScopeType::WAVEFORM + ); + showChro->set_sensitive(options.histogramScopeType == ScopeType::HISTOGRAM); } rgbv_toggled(); @@ -384,17 +401,28 @@ void HistogramPanel::mode_released () void HistogramPanel::type_pressed() { - constexpr int TYPE_COUNT = 4; // Histogram, waveform, and 2 vectorscopes. - options.histogramScopeType = (options.histogramScopeType + 1) % TYPE_COUNT; - if (options.histogramScopeType == 0) { - scopeType->set_image(*histImage); - } else if (options.histogramScopeType == 1) { - scopeType->set_image(*waveImage); - } else if (options.histogramScopeType == 2) { - scopeType->set_image(*vectHsImage); - } else if (options.histogramScopeType == 3) { - scopeType->set_image(*vectHcImage); + // Switch to next type. + switch (options.histogramScopeType) { + case ScopeType::NONE: // Default to histogram. + case ScopeType::HISTOGRAM_RAW: // Not supported as a true scope type. + case ScopeType::VECTORSCOPE_HC: + options.histogramScopeType = ScopeType::HISTOGRAM; + scopeType->set_image(*histImage); + break; + case ScopeType::HISTOGRAM: + options.histogramScopeType = ScopeType::WAVEFORM; + scopeType->set_image(*waveImage); + break; + case ScopeType::WAVEFORM: + options.histogramScopeType = ScopeType::VECTORSCOPE_HS; + scopeType->set_image(*vectHsImage); + break; + case ScopeType::VECTORSCOPE_HS: + options.histogramScopeType = ScopeType::VECTORSCOPE_HC; + scopeType->set_image(*vectHcImage); + break; } + type_changed(); updateHistAreaOptions(); if (histogramRGBArea) { @@ -409,54 +437,46 @@ void HistogramPanel::type_changed() gfxGrid->remove(*histogramRGBArea); } - if (options.histogramScopeType == 0) { - showRed->set_sensitive(); - showGreen->set_sensitive(); - showBlue->set_sensitive(); - showValue->set_sensitive(!showRAW->get_active()); - showChro->set_sensitive(!showRAW->get_active()); - showRAW->set_sensitive(); - showMode->set_sensitive(); - histogramRGBArea = histogramRGBAreaHori.get(); - if (panel_listener) { - updateHistAreaOptions(); - panel_listener->scopeTypeChanged(ScopeType::HISTOGRAM); - } - } else if (options.histogramScopeType == 1) { - showRed->set_sensitive(); - showGreen->set_sensitive(); - showBlue->set_sensitive(); - showValue->set_sensitive(); - showChro->set_sensitive(false); - showRAW->set_sensitive(false); - showMode->set_sensitive(false); - histogramRGBArea = histogramRGBAreaVert.get(); - if (panel_listener) { - updateHistAreaOptions(); - panel_listener->scopeTypeChanged(ScopeType::WAVEFORM); - } - } else { - showRed->set_sensitive(false); - showGreen->set_sensitive(false); - showBlue->set_sensitive(false); - showValue->set_sensitive(false); - showChro->set_sensitive(false); - showRAW->set_sensitive(false); - showMode->set_sensitive(false); - histogramRGBArea = nullptr; - if (panel_listener) { - updateHistAreaOptions(); - ScopeType type = ScopeType::NONE; - switch (options.histogramScopeType) { - case 2: - type = ScopeType::VECTORSCOPE_HS; - break; - case 3: - type = ScopeType::VECTORSCOPE_HC; - break; - } - panel_listener->scopeTypeChanged(type); - } + switch (options.histogramScopeType) { + case ScopeType::HISTOGRAM: + case ScopeType::HISTOGRAM_RAW: + showRed->set_sensitive(); + showGreen->set_sensitive(); + showBlue->set_sensitive(); + showValue->set_sensitive(!showRAW->get_active()); + showChro->set_sensitive(!showRAW->get_active()); + showRAW->set_sensitive(); + showMode->set_sensitive(); + histogramRGBArea = histogramRGBAreaHori.get(); + break; + case ScopeType::WAVEFORM: + showRed->set_sensitive(); + showGreen->set_sensitive(); + showBlue->set_sensitive(); + showValue->set_sensitive(); + showChro->set_sensitive(false); + showRAW->set_sensitive(false); + showMode->set_sensitive(false); + histogramRGBArea = histogramRGBAreaVert.get(); + break; + case ScopeType::VECTORSCOPE_HC: + case ScopeType::VECTORSCOPE_HS: + showRed->set_sensitive(false); + showGreen->set_sensitive(false); + showBlue->set_sensitive(false); + showValue->set_sensitive(false); + showChro->set_sensitive(false); + showRAW->set_sensitive(false); + showMode->set_sensitive(false); + histogramRGBArea = nullptr; + break; + case ScopeType::NONE: + break; + } + + if (panel_listener) { + updateHistAreaOptions(); + panel_listener->scopeTypeChanged(options.histogramScopeType); } if (showBAR->get_active()) { @@ -537,19 +557,7 @@ void HistogramPanel::setPanelListener(HistogramPanelListener* listener) panel_listener = listener; if (listener) { - ScopeType type; - if (options.histogramScopeType == 0) { - type = ScopeType::HISTOGRAM; - } else if (options.histogramScopeType == 1) { - type = ScopeType::WAVEFORM; - } else if (options.histogramScopeType == 2) { - type = ScopeType::VECTORSCOPE_HS; - } else if (options.histogramScopeType == 3) { - type = ScopeType::VECTORSCOPE_HC; - } else { - type = ScopeType::NONE; - } - listener->scopeTypeChanged(type); + listener->scopeTypeChanged(options.histogramScopeType); } } @@ -577,7 +585,7 @@ void HistogramPanel::updateHistRGBAreaOptions() showValue->get_active(), showChro->get_active(), showRAW->get_active(), - showBAR->get_active() && options.histogramScopeType < 2 + showBAR->get_active() ); } @@ -671,7 +679,8 @@ void HistogramRGBArea::setShow(bool show) void HistogramRGBArea::updateBackBuffer (int r, int g, int b, const Glib::ustring &profile, const Glib::ustring &profileW) { - if (!get_realized () || !showMode || (rawMode && options.histogramScopeType != 1)) { + //if (!get_realized () || !showMode || (rawMode && options.histogramScopeType == ScopeType::HISTOGRAM) || options.histogramScopeType == ScopeType::HISTOGRAM_RAW) { + if (!get_realized () || !showMode || !((!rawMode && options.histogramScopeType == ScopeType::HISTOGRAM) || options.histogramScopeType == ScopeType::WAVEFORM)) { return; } @@ -717,7 +726,11 @@ void HistogramRGBArea::updateBackBuffer (int r, int g, int b, const Glib::ustrin drawBar(cc, b, 255.0, winw, winh, s); } - if((needLuma || needChroma) && options.histogramScopeType <= 1) { + if( + (needLuma || needChroma) + && (options.histogramScopeType == ScopeType::HISTOGRAM + || options.histogramScopeType == ScopeType::WAVEFORM) + ) { float Lab_L, Lab_a, Lab_b; rtengine::Color::rgb2lab01(profile, profileW, r / 255.f, g / 255.f, b / 255.f, Lab_L, Lab_a, Lab_b, options.rtSettings.HistogramWorking); @@ -727,7 +740,7 @@ void HistogramRGBArea::updateBackBuffer (int r, int g, int b, const Glib::ustrin drawBar(cc, Lab_L, 100.0, winw, winh, s); } - if (needChroma && options.histogramScopeType == 0) { + if (needChroma && options.histogramScopeType == ScopeType::HISTOGRAM) { // Chroma double chromaval = sqrt(Lab_a * Lab_a + Lab_b * Lab_b) / 1.8; cc->set_source_rgb(0.9, 0.9, 0.0); @@ -874,7 +887,7 @@ void HistogramRGBAreaHori::get_preferred_width_for_height_vfunc (int height, int void HistogramRGBAreaVert::drawBar(Cairo::RefPtr cc, double value, double max_value, int winw, int winh, double scale) { double pos; - if (options.histogramDrawMode < 2 || options.histogramScopeType == 1) { + if (options.histogramDrawMode < 2 || options.histogramScopeType == ScopeType::WAVEFORM) { pos = padding + value * (winh - padding * 2.0 - 1) / max_value + 0.5 * scale; } else { pos = padding + HistogramScaling::log (max_value, value) * (winh - padding * 2.0) / max_value + 0.5 * scale; @@ -988,7 +1001,7 @@ void HistogramArea::get_preferred_width_for_height_vfunc (int height, int &minim get_preferred_width_vfunc (minimum_width, natural_width); } -void HistogramArea::updateOptions (bool r, bool g, bool b, bool l, bool c, bool raw, int mode, int type, bool pointer) +void HistogramArea::updateOptions (bool r, bool g, bool b, bool l, bool c, bool raw, int mode, ScopeType type, bool pointer) { options.histogramRed = needRed = r; @@ -1029,30 +1042,38 @@ void HistogramArea::update( ) { if (histRed) { - if (scopeType == 0) { - rhist = histRed; - ghist = histGreen; - bhist = histBlue; - lhist = histLuma; - chist = histChroma; - rhistRaw = histRedRaw; - ghistRaw = histGreenRaw; - bhistRaw = histBlueRaw; - } else if (scopeType == 1) { - waveform_scale = waveformScale; - rwave = waveformRed; - gwave = waveformGreen; - bwave = waveformBlue; - lwave = waveformLuma; - wave_buffer_dirty = true; - } else if (scopeType == 2) { - vectorscope_scale = vectorscopeScale; - vect_hs = vectorscopeHS; - vect_hs_buffer_dirty = true; - } else if (scopeType == 3) { - vectorscope_scale = vectorscopeScale; - vect_hc = vectorscopeHC; - vect_hc_buffer_dirty = true; + switch (scopeType) { + case ScopeType::HISTOGRAM: + rhist = histRed; + ghist = histGreen; + bhist = histBlue; + lhist = histLuma; + chist = histChroma; + rhistRaw = histRedRaw; + ghistRaw = histGreenRaw; + bhistRaw = histBlueRaw; + break; + case ScopeType::WAVEFORM: + waveform_scale = waveformScale; + rwave = waveformRed; + gwave = waveformGreen; + bwave = waveformBlue; + lwave = waveformLuma; + wave_buffer_dirty = true; + break; + case ScopeType::VECTORSCOPE_HS: + vectorscope_scale = vectorscopeScale; + vect_hs = vectorscopeHS; + vect_hs_buffer_dirty = true; + break; + case ScopeType::VECTORSCOPE_HC: + vectorscope_scale = vectorscopeScale; + vect_hc = vectorscopeHC; + vect_hc_buffer_dirty = true; + break; + case ScopeType::HISTOGRAM_RAW: + case ScopeType::NONE: + break; } valid = true; } else { @@ -1125,7 +1146,7 @@ void HistogramArea::updateBackBuffer () int nrOfVGridPartitions = 8; // always show 8 stops (lines at 1,3,7,15,31,63,127) // draw vertical gridlines - if (options.histogramScopeType == 0) { + if (options.histogramScopeType == ScopeType::HISTOGRAM || options.histogramScopeType == ScopeType::HISTOGRAM_RAW) { for (int i = 0; i <= nrOfVGridPartitions; i++) { double xpos = padding + 0.5; if (options.histogramDrawMode < 2) { @@ -1140,14 +1161,14 @@ void HistogramArea::updateBackBuffer () } // draw horizontal gridlines - if (options.histogramScopeType == 1) { + if (options.histogramScopeType == ScopeType::WAVEFORM) { for (int i = 0; i <= nrOfVGridPartitions; i++) { const double ypos = h - padding - (pow(2.0,i) - 1) * (h - 2 * padding - 1) / 255.0; cr->move_to(0, ypos); cr->line_to(w, ypos); cr->stroke(); } - } else if (options.histogramScopeType >= 2) { + } else if (options.histogramScopeType == ScopeType::VECTORSCOPE_HC || options.histogramScopeType == ScopeType::VECTORSCOPE_HS) { // Vectorscope has no gridlines. } else if (options.histogramDrawMode == 0) { for (int i = 1; i < nrOfHGridPartitions; i++) { @@ -1165,7 +1186,7 @@ void HistogramArea::updateBackBuffer () cr->unset_dash(); - if (valid && scopeType == 0) { + if (valid && (scopeType == ScopeType::HISTOGRAM || scopeType == ScopeType::HISTOGRAM_RAW)) { // For RAW mode use the other hists LUTu& rh = rawMode ? rhistRaw : rhist; LUTu& gh = rawMode ? ghistRaw : ghist; @@ -1272,9 +1293,9 @@ void HistogramArea::updateBackBuffer () drawMarks(cr, bhchanged, realhistheight, w, ui, oi); } - } else if (scopeType == 1 && rwave.getWidth() > 0) { + } else if (scopeType == ScopeType::WAVEFORM && rwave.getWidth() > 0) { drawWaveform(cr, w, h); - } else if (scopeType >= 2) { + } else if (scopeType == ScopeType::VECTORSCOPE_HC || scopeType == ScopeType::VECTORSCOPE_HS) { drawVectorscope(cr, w, h); } @@ -1289,7 +1310,7 @@ void HistogramArea::updateBackBuffer () bool HistogramArea::updatePointer(int r, int g, int b, const Glib::ustring &profile, const Glib::ustring &profileW) { - if (!needPointer || scopeType < 2) { + if (!needPointer || !(scopeType == ScopeType::VECTORSCOPE_HC || scopeType == ScopeType::VECTORSCOPE_HS)) { return false; } if (pointer_red == r && pointer_green == g && pointer_blue == b) { @@ -1360,9 +1381,13 @@ void HistogramArea::drawMarks(Cairo::RefPtr &cr, void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, int h) { - const auto& vect = (scopeType == 3) ? vect_hc : vect_hs; - auto& vect_buffer = (scopeType == 3) ? vect_hc_buffer : vect_hs_buffer; - auto& vect_buffer_dirty = (scopeType == 3) ? vect_hc_buffer_dirty : vect_hs_buffer_dirty; + if (scopeType != ScopeType::VECTORSCOPE_HC && scopeType != ScopeType::VECTORSCOPE_HS) { + return; + } + + const auto& vect = (scopeType == ScopeType::VECTORSCOPE_HC) ? vect_hc : vect_hs; + auto& vect_buffer = (scopeType == ScopeType::VECTORSCOPE_HC) ? vect_hc_buffer : vect_hs_buffer; + auto& vect_buffer_dirty = (scopeType == ScopeType::VECTORSCOPE_HC) ? vect_hc_buffer_dirty : vect_hs_buffer_dirty; const int vect_width = vect.getWidth(); const int vect_height = vect.getHeight(); @@ -1413,7 +1438,7 @@ void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, in cr->set_antialias(Cairo::ANTIALIAS_SUBPIXEL); ch_ds[0] = 4; - if (scopeType == 2) { // Hue-Saturation. + if (scopeType == ScopeType::VECTORSCOPE_HS) { // Hue-Saturation. // RYGCBM lines. cr->set_line_width (2.0 * s); constexpr double color_labels[6][3] = { @@ -1452,7 +1477,7 @@ void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, in cr->line_to(line_spacing + line_length, 0); cr->stroke(); cr->unset_dash(); - } else if (scopeType == 3) { // Hue-Chroma. + } else if (scopeType == ScopeType::VECTORSCOPE_HC) { // Hue-Chroma. // a and b axes. Cairo::RefPtr gradient; cr->set_line_width (2.0 * s); @@ -1508,7 +1533,7 @@ void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, in if (needPointer && pointer_red >= 0 && pointer_green >= 0 && pointer_blue >= 0) { float cx, cy; - if (scopeType == 2) { + if (scopeType == ScopeType::VECTORSCOPE_HS) { float H, S, L; Color::rgb2hslfloat(pointer_red * 257.f, pointer_green * 257.f, pointer_blue * 257.f, H, S, L); cx = (w + scope_size * S * std::cos(H * 2 * RT_PI_F)) / 2; @@ -1630,7 +1655,10 @@ bool HistogramArea::on_button_press_event (GdkEventButton* event) isPressed = true; movingPosition = event->x; - if (event->type == GDK_2BUTTON_PRESS && event->button == 1 && scopeType == 0) { + if ( + event->type == GDK_2BUTTON_PRESS && event->button == 1 + && (scopeType == ScopeType::HISTOGRAM || scopeType == ScopeType::HISTOGRAM_RAW) + ) { drawMode = (drawMode + 1) % 3; options.histogramDrawMode = (options.histogramDrawMode + 1) % 3; @@ -1654,7 +1682,10 @@ bool HistogramArea::on_button_release_event (GdkEventButton* event) bool HistogramArea::on_motion_notify_event (GdkEventMotion* event) { - if (drawMode == 0 && scopeType == 0) { + if ( + drawMode == 0 + && (scopeType == ScopeType::HISTOGRAM || scopeType == ScopeType::HISTOGRAM_RAW) + ) { return false; } @@ -1662,7 +1693,7 @@ bool HistogramArea::on_motion_notify_event (GdkEventMotion* event) return true; } - if (scopeType == 0) { // Adjust log scale. + if (scopeType == ScopeType::HISTOGRAM || scopeType == ScopeType::HISTOGRAM_RAW) { // Adjust log scale. double mod = 1 + (event->x - movingPosition) / get_width(); factor /= mod; @@ -1675,7 +1706,11 @@ bool HistogramArea::on_motion_notify_event (GdkEventMotion* event) setDirty(true); queue_draw (); - } else if (scopeType >= 1 && scopeType <= 3) { // Adjust brightness. + } else if ( + scopeType == ScopeType::WAVEFORM + || scopeType == ScopeType::VECTORSCOPE_HC + || scopeType == ScopeType::VECTORSCOPE_HS + ) { // Adjust brightness. constexpr float MIN_BRIGHT = 0.1; constexpr float MAX_BRIGHT = 3; constexpr float RANGE = MAX_BRIGHT / MIN_BRIGHT; diff --git a/rtgui/histogrampanel.h b/rtgui/histogrampanel.h index 975a6d8ab..7167168ff 100644 --- a/rtgui/histogrampanel.h +++ b/rtgui/histogrampanel.h @@ -28,6 +28,7 @@ #include "delayed.h" #include "guiutils.h" +#include "options.h" #include "pointermotionlistener.h" #include "../rtengine/array2D.h" @@ -36,10 +37,7 @@ class HistogramArea; -enum ScopeType -{ - HISTOGRAM, HISTOGRAM_RAW, VECTORSCOPE_HC, VECTORSCOPE_HS, WAVEFORM, NONE -}; +using ScopeType = Options::ScopeType; struct HistogramAreaIdleHelper { HistogramArea* harea; @@ -178,7 +176,7 @@ protected: bool valid; int drawMode; DrawModeListener *myDrawModeListener; - int scopeType; + ScopeType scopeType; int oldwidth, oldheight; /// Intensity of waveform and vectorscope trace. float trace_brightness; @@ -221,7 +219,7 @@ public: const array2D& waveformBlue, const array2D& waveformLuma ); - void updateOptions (bool r, bool g, bool b, bool l, bool c, bool raw, int mode, int type, bool pointer); + void updateOptions (bool r, bool g, bool b, bool l, bool c, bool raw, int mode, ScopeType type, bool pointer); bool updatePending(); void on_realize() override; bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) override; diff --git a/rtgui/options.cc b/rtgui/options.cc index 5e1685b20..3e9c49e1e 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -450,7 +450,7 @@ void Options::setDefaults() histogramBar = true; histogramHeight = 200; histogramDrawMode = 0; - histogramScopeType = 0; + histogramScopeType = ScopeType::HISTOGRAM; curvebboxpos = 1; complexity = 2; prevdemo = PD_Sidecar; @@ -1434,7 +1434,7 @@ void Options::readFromFile(Glib::ustring fname) } if (keyFile.has_key("GUI", "HistogramScopeType")) { - histogramScopeType = keyFile.get_integer("GUI", "HistogramScopeType"); + histogramScopeType = static_cast(keyFile.get_integer("GUI", "HistogramScopeType")); } if (keyFile.has_key("GUI", "NavigatorRGBUnit")) { diff --git a/rtgui/options.h b/rtgui/options.h index 20678f2f9..19d394a05 100644 --- a/rtgui/options.h +++ b/rtgui/options.h @@ -306,13 +306,22 @@ public: double sndLngEditProcDoneSecs; // Minimum processing time seconds till the sound is played bool sndEnable; + enum ScopeType + { + HISTOGRAM = 0, + HISTOGRAM_RAW = 1, + VECTORSCOPE_HC = 2, + VECTORSCOPE_HS = 3, + WAVEFORM = 4, + NONE = -1 + }; int histogramPosition; // 0=disabled, 1=left pane, 2=right pane bool histogramRed, histogramGreen, histogramBlue; bool histogramLuma, histogramChroma, histogramRAW; bool histogramBar; int histogramHeight; int histogramDrawMode; - int histogramScopeType; + ScopeType histogramScopeType; bool FileBrowserToolbarSingleRow; bool hideTPVScrollbar; int whiteBalanceSpotSize;