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 @@
+
+
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 @@
+
+
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