diff --git a/rtdata/images/svg/histogram-type-parade-off-small.svg b/rtdata/images/svg/histogram-type-parade-off-small.svg new file mode 100644 index 000000000..015960fcc --- /dev/null +++ b/rtdata/images/svg/histogram-type-parade-off-small.svg @@ -0,0 +1,132 @@ + + + + + + + + + + image/svg+xml + + + + + Lawrence Lee + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/histogram-type-parade-small.svg b/rtdata/images/svg/histogram-type-parade-small.svg new file mode 100644 index 000000000..f299f8ab2 --- /dev/null +++ b/rtdata/images/svg/histogram-type-parade-small.svg @@ -0,0 +1,132 @@ + + + + + + + + + + image/svg+xml + + + + + Lawrence Lee + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/languages/default b/rtdata/languages/default index 0ec86d367..fbfab9b86 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -252,6 +252,7 @@ HISTOGRAM_TOOLTIP_RAW;Show/Hide raw histogram. HISTOGRAM_TOOLTIP_TYPE;Toggle visibility of the scope selection buttons. HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM;Histogram HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM_RAW;Raw Histogram +HISTOGRAM_TOOLTIP_TYPE_PARADE;RGB Parade HISTOGRAM_TOOLTIP_TYPE_WAVEFORM;Waveform HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HC;Hue-Chroma Vectorscope HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HS;Hue-Saturation Vectorscope diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index ab7aa873d..34d677206 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -2301,6 +2301,7 @@ bool EditorPanel::updateVectorscopeHS(void) const bool EditorPanel::updateWaveform(void) const { return histogram_scope_type == ScopeType::WAVEFORM + || histogram_scope_type == ScopeType::PARADE || histogram_scope_type == ScopeType::NONE; } @@ -2327,6 +2328,7 @@ void EditorPanel::scopeTypeChanged(ScopeType new_type) case ScopeType::VECTORSCOPE_HS: histogram_observable->requestUpdateVectorscopeHS(); break; + case ScopeType::PARADE: case ScopeType::WAVEFORM: histogram_observable->requestUpdateWaveform(); break; diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index b79262426..68f0d91b6 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -86,6 +86,7 @@ HistogramPanel::HistogramPanel () : case ScopeType::VECTORSCOPE_HS: histogramRGBArea = nullptr; break; + case ScopeType::PARADE: case ScopeType::WAVEFORM: histogramRGBArea = histogramRGBAreaVert.get(); break; @@ -129,17 +130,20 @@ HistogramPanel::HistogramPanel () : histImage.reset(new RTImage("histogram-type-histogram-small.png")); histRawImage.reset(new RTImage("histogram-bayer-on-small.png")); + paradeImage.reset(new RTImage("histogram-type-parade-small.png")); waveImage.reset(new RTImage("histogram-type-waveform-small.png")); vectHcImage.reset(new RTImage("histogram-type-vectorscope-hc-small.png")); vectHsImage.reset(new RTImage("histogram-type-vectorscope-hs-small.png")); histImageOn.reset(new RTImage("histogram-type-histogram-small.png")); histRawImageOn.reset(new RTImage("histogram-bayer-on-small.png")); + paradeImageOn.reset(new RTImage("histogram-type-parade-small.png")); waveImageOn.reset(new RTImage("histogram-type-waveform-small.png")); vectHcImageOn.reset(new RTImage("histogram-type-vectorscope-hc-small.png")); vectHsImageOn.reset(new RTImage("histogram-type-vectorscope-hs-small.png")); histImageOff.reset(new RTImage("histogram-type-histogram-off-small.png")); histRawImageOff.reset(new RTImage("histogram-bayer-off-small.png")); + paradeImageOff.reset(new RTImage("histogram-type-parade-off-small.png")); waveImageOff.reset(new RTImage("histogram-type-waveform-off-small.png")); vectHcImageOff.reset(new RTImage("histogram-type-vectorscope-hc-off-small.png")); vectHsImageOff.reset(new RTImage("histogram-type-vectorscope-hs-off-small.png")); @@ -156,11 +160,13 @@ HistogramPanel::HistogramPanel () : Gtk::RadioButtonGroup scopeTypeGroup; scopeHistBtn = Gtk::manage(new Gtk::RadioButton(scopeTypeGroup)); scopeHistRawBtn = Gtk::manage(new Gtk::RadioButton(scopeTypeGroup)); + scopeParadeBtn = Gtk::manage(new Gtk::RadioButton(scopeTypeGroup)); scopeWaveBtn = Gtk::manage(new Gtk::RadioButton(scopeTypeGroup)); scopeVectHcBtn = Gtk::manage(new Gtk::RadioButton(scopeTypeGroup)); scopeVectHsBtn = Gtk::manage(new Gtk::RadioButton(scopeTypeGroup)); scopeHistBtn->set_mode(false); scopeHistRawBtn->set_mode(false); + scopeParadeBtn->set_mode(false); scopeWaveBtn->set_mode(false); scopeVectHcBtn->set_mode(false); scopeVectHsBtn->set_mode(false); @@ -185,6 +191,8 @@ HistogramPanel::HistogramPanel () : scopeHistBtn->set_can_focus(false); scopeHistRawBtn->set_name("histButton"); scopeHistRawBtn->set_can_focus(false); + scopeParadeBtn->set_name("histButton"); + scopeParadeBtn->set_can_focus(false); scopeWaveBtn->set_name("histButton"); scopeWaveBtn->set_can_focus(false); scopeVectHcBtn->set_name("histButton"); @@ -202,6 +210,7 @@ HistogramPanel::HistogramPanel () : showBAR->set_relief (Gtk::RELIEF_NONE); scopeHistBtn->set_relief (Gtk::RELIEF_NONE); scopeHistRawBtn->set_relief (Gtk::RELIEF_NONE); + scopeParadeBtn->set_relief (Gtk::RELIEF_NONE); scopeWaveBtn->set_relief (Gtk::RELIEF_NONE); scopeVectHcBtn->set_relief (Gtk::RELIEF_NONE); scopeVectHsBtn->set_relief (Gtk::RELIEF_NONE); @@ -216,6 +225,7 @@ HistogramPanel::HistogramPanel () : showBAR->set_tooltip_text (M("HISTOGRAM_TOOLTIP_BAR")); scopeHistBtn->set_tooltip_text(M("HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM")); scopeHistRawBtn->set_tooltip_text(M("HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM_RAW")); + scopeParadeBtn->set_tooltip_text(M("HISTOGRAM_TOOLTIP_TYPE_PARADE")); scopeWaveBtn->set_tooltip_text(M("HISTOGRAM_TOOLTIP_TYPE_WAVEFORM")); scopeVectHcBtn->set_tooltip_text(M("HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HC")); scopeVectHsBtn->set_tooltip_text(M("HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HS")); @@ -249,6 +259,7 @@ HistogramPanel::HistogramPanel () : showMode->set_image(*mode2Image); scopeHistBtn->set_image(*histImageOff); scopeHistRawBtn->set_image(*histRawImageOff); + scopeParadeBtn->set_image(*paradeImageOff); scopeWaveBtn->set_image(*waveImageOff); scopeVectHcBtn->set_image(*vectHcImageOff); scopeVectHsBtn->set_image(*vectHsImageOff); @@ -261,6 +272,10 @@ HistogramPanel::HistogramPanel () : scopeHistRawBtn->set_active(); scopeHistRawBtn->set_image(*histRawImageOn); break; + case ScopeType::PARADE: + scopeParadeBtn->set_active(); + scopeParadeBtn->set_image(*paradeImageOn); + break; case ScopeType::WAVEFORM: scopeWaveBtn->set_active(); scopeWaveBtn->set_image(*waveImageOn); @@ -279,6 +294,8 @@ HistogramPanel::HistogramPanel () : showBAR->set_image (showBAR->get_active() ? *barImage : *barImage_g); type_changed(); + updateHistAreaOptions(); + updateHistRGBAreaOptions(); setExpandAlignProperties(showRed , false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); setExpandAlignProperties(showGreen, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); @@ -299,6 +316,7 @@ HistogramPanel::HistogramPanel () : showBAR->signal_toggled().connect( sigc::mem_fun(*this, &HistogramPanel::bar_toggled), showBAR ); scopeHistBtn->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &HistogramPanel::type_selected), scopeHistBtn)); scopeHistRawBtn->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &HistogramPanel::type_selected), scopeHistRawBtn)); + scopeParadeBtn->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &HistogramPanel::type_selected), scopeParadeBtn)); scopeWaveBtn->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &HistogramPanel::type_selected), scopeWaveBtn)); scopeVectHcBtn->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &HistogramPanel::type_selected), scopeVectHcBtn)); scopeVectHsBtn->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &HistogramPanel::type_selected), scopeVectHsBtn)); @@ -314,6 +332,7 @@ HistogramPanel::HistogramPanel () : scopeButtons->add(*scopeHistBtn); scopeButtons->add(*scopeHistRawBtn); + scopeButtons->add(*scopeParadeBtn); scopeButtons->add(*scopeWaveBtn); scopeButtons->add(*scopeVectHsBtn); scopeButtons->add(*scopeVectHcBtn); @@ -462,6 +481,8 @@ void HistogramPanel::type_selected(Gtk::RadioButton* button) new_type = ScopeType::HISTOGRAM; } else if (button == scopeHistRawBtn) { new_type = ScopeType::HISTOGRAM_RAW; + } else if (button == scopeParadeBtn) { + new_type = ScopeType::PARADE; } else if (button == scopeWaveBtn) { new_type = ScopeType::WAVEFORM; } else if (button == scopeVectHcBtn) { @@ -481,6 +502,9 @@ void HistogramPanel::type_selected(Gtk::RadioButton* button) case ScopeType::HISTOGRAM_RAW: scopeHistRawBtn->set_image(*histRawImageOff); break; + case ScopeType::PARADE: + scopeParadeBtn->set_image(*paradeImageOff); + break; case ScopeType::WAVEFORM: scopeWaveBtn->set_image(*waveImageOff); break; @@ -501,6 +525,9 @@ void HistogramPanel::type_selected(Gtk::RadioButton* button) case ScopeType::HISTOGRAM_RAW: scopeHistRawBtn->set_image(*histRawImageOn); break; + case ScopeType::PARADE: + scopeParadeBtn->set_image(*paradeImageOn); + break; case ScopeType::WAVEFORM: scopeWaveBtn->set_image(*waveImageOn); break; @@ -551,6 +578,7 @@ void HistogramPanel::type_changed() scopeType->set_image(*histRawImage); histogramRGBArea = nullptr; break; + case ScopeType::PARADE: case ScopeType::WAVEFORM: showRed->set_sensitive(); showGreen->set_sensitive(); @@ -558,7 +586,11 @@ void HistogramPanel::type_changed() showValue->set_sensitive(); showChro->set_sensitive(false); showMode->set_sensitive(false); - scopeType->set_image(*waveImage); + if (options.histogramScopeType == ScopeType::PARADE) { + scopeType->set_image(*paradeImage); + } else { + scopeType->set_image(*waveImage); + } histogramRGBArea = histogramRGBAreaVert.get(); break; case ScopeType::VECTORSCOPE_HC: @@ -803,7 +835,11 @@ 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 || !(options.histogramScopeType == ScopeType::HISTOGRAM || options.histogramScopeType == ScopeType::WAVEFORM)) { + if (!get_realized () || !showMode || !( + options.histogramScopeType == ScopeType::HISTOGRAM + || options.histogramScopeType == ScopeType::PARADE + || options.histogramScopeType == ScopeType::WAVEFORM + )) { return; } @@ -852,6 +888,7 @@ void HistogramRGBArea::updateBackBuffer (int r, int g, int b, const Glib::ustrin if( (needLuma || needChroma) && (options.histogramScopeType == ScopeType::HISTOGRAM + || options.histogramScopeType == ScopeType::PARADE || options.histogramScopeType == ScopeType::WAVEFORM) ) { float Lab_L, Lab_a, Lab_b; @@ -1009,7 +1046,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 == ScopeType::WAVEFORM) { + if (options.histogramDrawMode < 2 || options.histogramScopeType == ScopeType::PARADE || 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; @@ -1054,7 +1091,7 @@ HistogramArea::HistogramArea (DrawModeListener *fml) : vect_hc_buffer_dirty(true), vect_hs_buffer_dirty(true), waveform_scale(0), rwave(0, 0), gwave(0, 0),bwave(0, 0), lwave(0, 0), - wave_buffer_dirty(true), + parade_buffer_dirty(true), wave_buffer_dirty(true), valid(false), drawMode(options.histogramDrawMode), myDrawModeListener(fml), scopeType(options.histogramScopeType), oldwidth(-1), oldheight(-1), @@ -1178,13 +1215,14 @@ void HistogramArea::update( ghistRaw = histGreenRaw; bhistRaw = histBlueRaw; break; + case ScopeType::PARADE: case ScopeType::WAVEFORM: waveform_scale = waveformScale; rwave = waveformRed; gwave = waveformGreen; bwave = waveformBlue; lwave = waveformLuma; - wave_buffer_dirty = true; + parade_buffer_dirty = wave_buffer_dirty = true; break; case ScopeType::VECTORSCOPE_HS: vectorscope_scale = vectorscopeScale; @@ -1285,7 +1323,7 @@ void HistogramArea::updateBackBuffer () } // draw horizontal gridlines - if (options.histogramScopeType == ScopeType::WAVEFORM) { + if (options.histogramScopeType == ScopeType::PARADE || 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); @@ -1419,6 +1457,8 @@ void HistogramArea::updateBackBuffer () drawMarks(cr, bhchanged, realhistheight, w, ui, oi); } + } else if (scopeType == ScopeType::PARADE && rwave.getWidth() > 0) { + drawParade(cr, w, h); } else if (scopeType == ScopeType::WAVEFORM && rwave.getWidth() > 0) { drawWaveform(cr, w, h); } else if (scopeType == ScopeType::VECTORSCOPE_HC || scopeType == ScopeType::VECTORSCOPE_HS) { @@ -1505,6 +1545,101 @@ void HistogramArea::drawMarks(Cairo::RefPtr &cr, cr->fill(); } +void HistogramArea::drawParade(Cairo::RefPtr &cr, int w, int h) +{ + // Arbitrary scale factor divided by current scale. + const float scale = trace_brightness * 32.f * 255.f / waveform_scale; + const int wave_width = rwave.getWidth(); + const int wave_height = rwave.getHeight(); + + // See Cairo documentation on stride. + const int cairo_stride = Cairo::ImageSurface::format_stride_for_width(Cairo::FORMAT_ARGB32, rwave.getWidth()); + + if (parade_buffer_dirty) { + const auto buffer_size = static_cast::size_type>(wave_height) * cairo_stride; + parade_buffer_r.assign(buffer_size, 0); + parade_buffer_g.assign(buffer_size, 0); + parade_buffer_b.assign(buffer_size, 0); + wave_buffer_luma.assign(buffer_size, 0); + + assert(parade_buffer_r.size() % 4 == 0); + assert(parade_buffer_g.size() % 4 == 0); + assert(parade_buffer_b.size() % 4 == 0); + assert(wave_buffer_luma.size() % 4 == 0); + + for (int val = 0; val < wave_height; val++) { + const int* const r_row = rwave[val]; + const int* const g_row = gwave[val]; + const int* const b_row = bwave[val]; + std::uint32_t* const buffer_r_row = reinterpret_cast(parade_buffer_r.data() + (255 - val) * cairo_stride); + std::uint32_t* const buffer_g_row = reinterpret_cast(parade_buffer_g.data() + (255 - val) * cairo_stride); + std::uint32_t* const buffer_b_row = reinterpret_cast(parade_buffer_b.data() + (255 - val) * cairo_stride); + for (int col = 0; col < wave_width; col++) { + const unsigned char r = std::min(scale * r_row[col], 0xff); + const unsigned char g = std::min(scale * g_row[col], 0xff); + const unsigned char b = std::min(scale * b_row[col], 0xff); + if (r == 0) { + buffer_r_row[col] = 0; + } else { + buffer_r_row[col] = (r << 16) | (r << 24); + } + if (g == 0) { + buffer_g_row[col] = 0; + } else { + buffer_g_row[col] = (g << 8) | (g << 24); + } + if (b == 0) { + buffer_b_row[col] = 0; + } else { + const unsigned char green = b / 2; // Make blue easier to see. + buffer_b_row[col] = b | (green << 8) | (b << 24); + } + } + } + + for (int val = 0; val < wave_height; val++) { + const int* const l_row = lwave[val]; + std::uint32_t* const buffer_row = + reinterpret_cast(wave_buffer_luma.data() + (255 - val) * cairo_stride); + for (int col = 0; col < wave_width; col++) { + const unsigned char l = std::min(scale * l_row[col], 0xff); + buffer_row[col] = l | (l << 8) | (l << 16) | (l << 24); + } + } + + parade_buffer_dirty = false; + } + + std::vector buffers; + if (needLuma) { + buffers.push_back(wave_buffer_luma.data()); + } + if (needRed) { + buffers.push_back(parade_buffer_r.data()); + } + if (needGreen) { + buffers.push_back(parade_buffer_g.data()); + } + if (needBlue) { + buffers.push_back(parade_buffer_b.data()); + } + + auto orig_matrix = cr->get_matrix(); + const double display_wave_width = static_cast(w) / buffers.size(); + for (int i = 0; i < buffers.size(); i++) { + Cairo::RefPtr surface; + cr->translate(i * display_wave_width, padding); + cr->scale(display_wave_width / wave_width, (h - 2 * padding) / wave_height); + surface = Cairo::ImageSurface::create( + buffers[i], Cairo::FORMAT_ARGB32, wave_width, wave_height, cairo_stride); + cr->set_source(surface, 0, 0); + cr->set_operator(Cairo::OPERATOR_OVER); + cr->paint(); + surface->finish(); + cr->set_matrix(orig_matrix); + } +} + void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, int h) { if (scopeType != ScopeType::VECTORSCOPE_HC && scopeType != ScopeType::VECTORSCOPE_HS) { @@ -1726,15 +1861,13 @@ void HistogramArea::drawWaveform(Cairo::RefPtr &cr, int w, int h } } - if (needLuma) { - for (int val = 0; val < wave_height; val++) { - const int* const l_row = lwave[val]; - std::uint32_t* const buffer_row = - reinterpret_cast(wave_buffer_luma.data() + (255 - val) * cairo_stride); - for (int col = 0; col < wave_width; col++) { - const unsigned char l = std::min(scale * l_row[col], 0xff); - buffer_row[col] = l | (l << 8) | (l << 16) | (l << 24); - } + for (int val = 0; val < wave_height; val++) { + const int* const l_row = lwave[val]; + std::uint32_t* const buffer_row = + reinterpret_cast(wave_buffer_luma.data() + (255 - val) * cairo_stride); + for (int col = 0; col < wave_width; col++) { + const unsigned char l = std::min(scale * l_row[col], 0xff); + buffer_row[col] = l | (l << 8) | (l << 16) | (l << 24); } } @@ -1834,7 +1967,8 @@ bool HistogramArea::on_motion_notify_event (GdkEventMotion* event) setDirty(true); queue_draw (); } else if ( - scopeType == ScopeType::WAVEFORM + scopeType == ScopeType::PARADE + || scopeType == ScopeType::WAVEFORM || scopeType == ScopeType::VECTORSCOPE_HC || scopeType == ScopeType::VECTORSCOPE_HS ) { // Adjust brightness. @@ -1844,7 +1978,7 @@ bool HistogramArea::on_motion_notify_event (GdkEventMotion* event) double dx = (event->x - movingPosition) / get_width(); float new_brightness = LIM(trace_brightness * pow(RANGE, dx), MIN_BRIGHT, MAX_BRIGHT); if (new_brightness != trace_brightness) { - wave_buffer_dirty = vect_hc_buffer_dirty = vect_hs_buffer_dirty = true; + parade_buffer_dirty = wave_buffer_dirty = vect_hc_buffer_dirty = vect_hs_buffer_dirty = true; trace_brightness = new_brightness; setDirty(true); queue_draw(); diff --git a/rtgui/histogrampanel.h b/rtgui/histogrampanel.h index 4417e2373..cca27a0d9 100644 --- a/rtgui/histogrampanel.h +++ b/rtgui/histogrampanel.h @@ -166,6 +166,10 @@ protected: bool vect_hc_buffer_dirty, vect_hs_buffer_dirty; int waveform_scale; array2D rwave, gwave, bwave, lwave; + std::vector parade_buffer_r; + std::vector parade_buffer_g; + std::vector parade_buffer_b; + bool parade_buffer_dirty; std::vector wave_buffer; std::vector wave_buffer_luma; bool wave_buffer_dirty; @@ -227,6 +231,7 @@ public: private: void drawCurve(Cairo::RefPtr &cr, const LUTu & data, double scale, int hsize, int vsize); void drawMarks(Cairo::RefPtr &cr, const LUTu & data, double scale, int hsize, int & ui, int & oi); + void drawParade(Cairo::RefPtr &cr, int hsize, int vsize); void drawVectorscope(Cairo::RefPtr &cr, int hsize, int vsize); void drawWaveform(Cairo::RefPtr &cr, int hsize, int vsize); Gtk::SizeRequestMode get_request_mode_vfunc () const override; @@ -268,6 +273,7 @@ protected: Gtk::RadioButton* scopeHistBtn; Gtk::RadioButton* scopeHistRawBtn; + Gtk::RadioButton* scopeParadeBtn; Gtk::RadioButton* scopeWaveBtn; Gtk::RadioButton* scopeVectHcBtn; Gtk::RadioButton* scopeVectHsBtn; @@ -288,17 +294,20 @@ protected: std::unique_ptr histImage; std::unique_ptr histRawImage; + std::unique_ptr paradeImage; std::unique_ptr waveImage; std::unique_ptr vectHcImage; std::unique_ptr vectHsImage; std::unique_ptr histImageOn; std::unique_ptr histRawImageOn; + std::unique_ptr paradeImageOn; std::unique_ptr waveImageOn; std::unique_ptr vectHcImageOn; std::unique_ptr vectHsImageOn; std::unique_ptr histImageOff; std::unique_ptr histRawImageOff; + std::unique_ptr paradeImageOff; std::unique_ptr waveImageOff; std::unique_ptr vectHcImageOff; std::unique_ptr vectHsImageOff; diff --git a/rtgui/options.h b/rtgui/options.h index e64c31ad1..aa5cff373 100644 --- a/rtgui/options.h +++ b/rtgui/options.h @@ -179,6 +179,7 @@ public: NONE = -1, HISTOGRAM, HISTOGRAM_RAW, + PARADE, VECTORSCOPE_HC, VECTORSCOPE_HS, WAVEFORM