diff --git a/app/panel/scope/scope.cpp b/app/panel/scope/scope.cpp index ef6678311..a23898f36 100644 --- a/app/panel/scope/scope.cpp +++ b/app/panel/scope/scope.cpp @@ -94,6 +94,11 @@ void ScopePanel::SetBuffer(Frame *frame) histogram_->SetBuffer(frame); } +void ScopePanel::SetColorProcessor(ColorProcessorPtr processor) +{ + histogram_->SetColorProcessor(processor); +} + void ScopePanel::Retranslate() { SetTitle(tr("Scope")); diff --git a/app/panel/scope/scope.h b/app/panel/scope/scope.h index 48c63518c..c3aaab2e8 100644 --- a/app/panel/scope/scope.h +++ b/app/panel/scope/scope.h @@ -54,6 +54,8 @@ public slots: void SetBuffer(Frame* frame); + void SetColorProcessor(ColorProcessorPtr processor); + protected: virtual void Retranslate() override; diff --git a/app/panel/viewer/viewerbase.cpp b/app/panel/viewer/viewerbase.cpp index 937692788..40a96eea7 100644 --- a/app/panel/viewer/viewerbase.cpp +++ b/app/panel/viewer/viewerbase.cpp @@ -107,6 +107,7 @@ void ViewerPanelBase::CreateScopePanel(ScopePanel::Type type) // Connect viewer widget texture drawing to scope panel connect(vw, &ViewerWidget::DrewManagedTexture, p, &ScopePanel::DrewManagedTexture); connect(vw, &ViewerWidget::LoadedBuffer, p, &ScopePanel::SetBuffer); + connect(vw, &ViewerWidget::ColorProcessorChanged, p, &ScopePanel::SetColorProcessor); if (!scope_panel_count_) { vw->SetEmitDrewManagedTextureEnabled(true); diff --git a/app/render/colorprocessor.cpp b/app/render/colorprocessor.cpp index d0d1eb60a..47773bac5 100644 --- a/app/render/colorprocessor.cpp +++ b/app/render/colorprocessor.cpp @@ -66,7 +66,7 @@ ColorProcessor::ColorProcessor(ColorManager *config, processor_ = config->GetConfig()->getProcessor(transform, dir); } -void ColorProcessor::ConvertFrame(FramePtr f) +void ColorProcessor::ConvertFrame(Frame *f) { OCIO::PackedImageDesc img(reinterpret_cast(f->data()), f->width(), f->height(), PixelFormat::ChannelCount(f->format())); @@ -94,4 +94,9 @@ OCIO::ConstProcessorRcPtr ColorProcessor::GetProcessor() return processor_; } +void ColorProcessor::ConvertFrame(FramePtr f) +{ + ConvertFrame(f.get()); +} + OLIVE_NAMESPACE_EXIT diff --git a/app/render/colorprocessor.h b/app/render/colorprocessor.h index 1fe5ac02b..23f7adaf1 100644 --- a/app/render/colorprocessor.h +++ b/app/render/colorprocessor.h @@ -65,6 +65,7 @@ public: OCIO::ConstProcessorRcPtr GetProcessor(); void ConvertFrame(FramePtr f); + void ConvertFrame(Frame* f); Color ConvertColor(Color in); diff --git a/app/widget/scope/histogram/histogram.cpp b/app/widget/scope/histogram/histogram.cpp index a4c9097cd..af1d49718 100644 --- a/app/widget/scope/histogram/histogram.cpp +++ b/app/widget/scope/histogram/histogram.cpp @@ -30,7 +30,8 @@ OLIVE_NAMESPACE_ENTER HistogramScope::HistogramScope(QWidget* parent) : QOpenGLWidget(parent), - buffer_(nullptr) + buffer_(nullptr), + processor_(nullptr) { connect(&worker_, &HistogramScopeWorker::Finished, this, &HistogramScope::FinishedProcessing, Qt::QueuedConnection); worker_.start(QThread::IdlePriority); @@ -45,12 +46,18 @@ HistogramScope::~HistogramScope() void HistogramScope::SetBuffer(Frame* frame) { - // We'll be multithreading this, so we make a copy to prevent collisions buffer_ = frame; StartUpdate(); } +void HistogramScope::SetColorProcessor(ColorProcessorPtr processor) +{ + processor_ = processor; + + StartUpdate(); +} + void HistogramScope::FinishedProcessing(QVector red, QVector green, QVector blue) { red_val_ = red; @@ -89,14 +96,20 @@ void HistogramScope::resizeEvent(QResizeEvent *e) { QOpenGLWidget::resizeEvent(e); - if (buffer_){ - StartUpdate(); - } + StartUpdate(); } void HistogramScope::StartUpdate() { - worker_.QueueNext(*buffer_, width()); + if (buffer_) { + worker_.QueueNext(*buffer_, processor_, width()); + } else { + // Update with nothing + red_val_.clear(); + green_val_.clear(); + blue_val_.clear(); + update(); + } } HistogramScopeWorker::HistogramScopeWorker() : @@ -120,10 +133,13 @@ void HistogramScopeWorker::run() // Copy values Frame f = next_; int w = next_width_; + ColorProcessorPtr processor = next_processor_; next_.destroy(); next_lock_.unlock(); + // Color manage frame + QVector data(w * kRGBChannels, 0); int max_w = w-1; @@ -132,6 +148,10 @@ void HistogramScopeWorker::run() for (int y=0;yConvertColor(c); + } + data[qFloor(clamp(c.red(), 0.0f, 1.0f) * max_w)]++; data[qFloor(clamp(c.green(), 0.0f, 1.0f) * max_w) + w]++; data[qFloor(clamp(c.blue(), 0.0f, 1.0f) * max_w) + w * 2]++; @@ -165,12 +185,13 @@ void HistogramScopeWorker::run() } } -void HistogramScopeWorker::QueueNext(const Frame &f, int width) +void HistogramScopeWorker::QueueNext(const Frame &f, ColorProcessorPtr processor, int width) { next_lock_.lock(); next_ = f; next_width_ = width; + next_processor_ = processor; next_wait_.wakeOne(); diff --git a/app/widget/scope/histogram/histogram.h b/app/widget/scope/histogram/histogram.h index b4b94527e..2da63c8b8 100644 --- a/app/widget/scope/histogram/histogram.h +++ b/app/widget/scope/histogram/histogram.h @@ -27,6 +27,7 @@ #include #include "codec/frame.h" +#include "render/colorprocessor.h" OLIVE_NAMESPACE_ENTER @@ -36,13 +37,15 @@ class HistogramScopeWorker : public QThread public: HistogramScopeWorker(); - virtual void run() override; + // Thread-safe + void QueueNext(const Frame& f, ColorProcessorPtr processor, int width); // Thread-safe - void QueueNext(const Frame& f, int width); - void Cancel(); +protected: + virtual void run() override; + signals: void Finished(QVector red, QVector green, QVector blue); @@ -53,6 +56,7 @@ private: QWaitCondition next_wait_; Frame next_; int next_width_; + ColorProcessorPtr next_processor_; }; @@ -67,6 +71,8 @@ public: public slots: void SetBuffer(Frame* frame); + void SetColorProcessor(ColorProcessorPtr processor); + protected: // virtual void paintEvent(QPaintEvent* e) override; virtual void paintGL() override; @@ -78,6 +84,8 @@ private: Frame* buffer_; + ColorProcessorPtr processor_; + QVector red_val_; QVector green_val_; diff --git a/app/widget/viewer/viewer.cpp b/app/widget/viewer/viewer.cpp index 4b8bae2ee..3c90345c2 100644 --- a/app/widget/viewer/viewer.cpp +++ b/app/widget/viewer/viewer.cpp @@ -68,6 +68,7 @@ ViewerWidget::ViewerWidget(QWidget *parent) : connect(main_widget, &ViewerGLWidget::LoadedBuffer, this, &ViewerWidget::LoadedBuffer); connect(main_widget, &ViewerGLWidget::LoadedTexture, this, &ViewerWidget::LoadedTexture); connect(main_widget, &ViewerGLWidget::DrewManagedTexture, this, &ViewerWidget::DrewManagedTexture); + connect(main_widget, &ViewerGLWidget::ColorProcessorChanged, this, &ViewerWidget::ColorProcessorChanged); connect(sizer_, &ViewerSizer::RequestMatrix, main_widget, &ViewerGLWidget::SetMatrix); sizer_->SetWidget(main_widget); gl_widgets_.append(main_widget); diff --git a/app/widget/viewer/viewer.h b/app/widget/viewer/viewer.h index 4fdd590b8..1f790a90e 100644 --- a/app/widget/viewer/viewer.h +++ b/app/widget/viewer/viewer.h @@ -159,6 +159,11 @@ signals: */ void RequestScopePanel(ScopePanel::Type type); + /** + * @brief Wrapper for ViewerGLWidget::ColorProcessorChanged() + */ + void ColorProcessorChanged(ColorProcessorPtr processor); + protected: virtual void TimebaseChangedEvent(const rational &) override; virtual void TimeChangedEvent(const int64_t &) override; diff --git a/app/widget/viewer/viewerglwidget.cpp b/app/widget/viewer/viewerglwidget.cpp index 29f65f332..7a2daa238 100644 --- a/app/widget/viewer/viewerglwidget.cpp +++ b/app/widget/viewer/viewerglwidget.cpp @@ -489,6 +489,9 @@ void ViewerGLWidget::SetupColorProcessor() } else { color_service_ = nullptr; } + + qDebug() << "Emitting" << std::static_pointer_cast(color_service_).get(); + emit ColorProcessorChanged(std::static_pointer_cast(color_service_)); } void ViewerGLWidget::ContextCleanup() diff --git a/app/widget/viewer/viewerglwidget.h b/app/widget/viewer/viewerglwidget.h index 704145c69..03b756bfa 100644 --- a/app/widget/viewer/viewerglwidget.h +++ b/app/widget/viewer/viewerglwidget.h @@ -189,6 +189,11 @@ signals: */ void DrewManagedTexture(OpenGLTexture* texture); + /** + * @brief Emitted when the color processor changes + */ + void ColorProcessorChanged(ColorProcessorPtr processor); + protected: /** * @brief Override the mouse press event simply to emit the DragStarted() signal