pixelsampler: added pixel sampler panel

When visible, this panel will show the current reference and display transformed
color under the cursor of any viewer.
This commit is contained in:
itsmattkc
2020-04-01 16:57:10 +11:00
parent 76f260cb3a
commit 6ea6dd810e
25 changed files with 390 additions and 48 deletions
+2
View File
@@ -20,6 +20,8 @@ set(OLIVE_SOURCES
widget/viewer/audiowaveformview.cpp
widget/viewer/footageviewer.h
widget/viewer/footageviewer.cpp
widget/viewer/pixelsamplerwidget.h
widget/viewer/pixelsamplerwidget.cpp
widget/viewer/viewer.h
widget/viewer/viewer.cpp
widget/viewer/viewerglwidget.h
+55
View File
@@ -0,0 +1,55 @@
#include "pixelsamplerwidget.h"
#include <QVBoxLayout>
PixelSamplerWidget::PixelSamplerWidget(QWidget *parent) :
QGroupBox(parent)
{
QVBoxLayout* layout = new QVBoxLayout(this);
label_ = new QLabel();
layout->addWidget(label_);
setTitle(tr("Color"));
UpdateLabelInternal();
}
void PixelSamplerWidget::SetValues(const Color &color)
{
color_ = color;
UpdateLabelInternal();
}
void PixelSamplerWidget::UpdateLabelInternal()
{
label_->setText(tr("<html>"
"<font color='#FF8080'>R: %1</font><br>"
"<font color='#80FF80'>G: %2</font><br>"
"<font color='#8080FF'>B: %3</font><br>"
"A: %4"
"</html>").arg(QString::number(color_.red()),
QString::number(color_.green()),
QString::number(color_.blue()),
QString::number(color_.alpha())));
}
ManagedPixelSamplerWidget::ManagedPixelSamplerWidget(QWidget *parent) :
QWidget(parent)
{
QVBoxLayout* layout = new QVBoxLayout(this);
display_view_ = new PixelSamplerWidget();
display_view_->setTitle(tr("Display"));
layout->addWidget(display_view_);
reference_view_ = new PixelSamplerWidget();
reference_view_->setTitle(tr("Reference"));
layout->addWidget(reference_view_);
}
void ManagedPixelSamplerWidget::SetValues(const Color &reference, const Color &display)
{
reference_view_->SetValues(reference);
display_view_->SetValues(display);
}
+44
View File
@@ -0,0 +1,44 @@
#ifndef PIXELSAMPLERWIDGET_H
#define PIXELSAMPLERWIDGET_H
#include <QLabel>
#include <QGroupBox>
#include <QWidget>
#include "render/color.h"
class PixelSamplerWidget : public QGroupBox
{
Q_OBJECT
public:
PixelSamplerWidget(QWidget* parent = nullptr);
public slots:
void SetValues(const Color& color);
private:
void UpdateLabelInternal();
Color color_;
QLabel* label_;
};
class ManagedPixelSamplerWidget : public QWidget
{
Q_OBJECT
public:
ManagedPixelSamplerWidget(QWidget* parent = nullptr);
public slots:
void SetValues(const Color& reference, const Color& display);
private:
PixelSamplerWidget* reference_view_;
PixelSamplerWidget* display_view_;
};
#endif // PIXELSAMPLERWIDGET_H
+6
View File
@@ -57,6 +57,7 @@ ViewerWidget::ViewerWidget(QWidget *parent) :
gl_widget_ = new ViewerGLWidget();
connect(gl_widget_, &ViewerGLWidget::customContextMenuRequested, this, &ViewerWidget::ShowContextMenu);
connect(gl_widget_, &ViewerGLWidget::CursorColor, this, &ViewerWidget::CursorColor);
connect(sizer_, &ViewerSizer::RequestMatrix, gl_widget_, &ViewerGLWidget::SetMatrix);
sizer_->SetWidget(gl_widget_);
@@ -531,6 +532,11 @@ void ViewerWidget::SetOCIOLook(const QString &look)
gl_widget_->SetOCIOLook(look);
}
void ViewerWidget::SetSignalCursorColorEnabled(bool e)
{
gl_widget_->SetSignalCursorColorEnabled(e);
}
void ViewerWidget::TimebaseChangedEvent(const rational &timebase)
{
TimeBasedWidget::TimebaseChangedEvent(timebase);
+11
View File
@@ -106,6 +106,17 @@ public slots:
*/
void SetOCIOLook(const QString& look);
/**
* @brief Wrapper for ViewerGLWidget::SetSignalCursorColorEnabled()
*/
void SetSignalCursorColorEnabled(bool e);
signals:
/**
* @brief Wrapper for ViewerGLWidget::CursorColor()
*/
void CursorColor(const Color& reference, const Color& display);
protected:
virtual void TimebaseChangedEvent(const rational &) override;
virtual void TimeChangedEvent(const int64_t &) override;
+47 -1
View File
@@ -23,6 +23,7 @@
#include <OpenImageIO/imagebuf.h>
#include <QFileInfo>
#include <QMessageBox>
#include <QMouseEvent>
#include <QOpenGLContext>
#include <QOpenGLFunctions>
#include <QOpenGLTexture>
@@ -39,7 +40,8 @@ bool ViewerGLWidget::nouveau_check_done_ = false;
ViewerGLWidget::ViewerGLWidget(QWidget *parent) :
QOpenGLWidget(parent),
color_manager_(nullptr),
has_image_(false)
has_image_(false),
signal_cursor_color_(false)
{
setContextMenuPolicy(Qt::CustomContextMenu);
}
@@ -128,6 +130,25 @@ void ViewerGLWidget::SetImage(const QString &fn)
update();
}
void ViewerGLWidget::SetSignalCursorColorEnabled(bool e)
{
qDebug() << e;
signal_cursor_color_ = e;
setMouseTracking(e);
// Create frame buffer for reading from texture
if (e != frame_buffer_.IsCreated()) {
makeCurrent();
if (e) {
frame_buffer_.Create(context());
} else {
frame_buffer_.Destroy();
}
doneCurrent();
}
}
void ViewerGLWidget::SetOCIODisplay(const QString &display)
{
ocio_display_ = display;
@@ -184,6 +205,31 @@ void ViewerGLWidget::mousePressEvent(QMouseEvent *event)
emit DragStarted();
}
void ViewerGLWidget::mouseMoveEvent(QMouseEvent *event)
{
QOpenGLWidget::mouseMoveEvent(event);
if (signal_cursor_color_) {
Color reference, display;
if (has_image_) {
QVector3D pixel_pos(static_cast<float>(event->x()) / static_cast<float>(width()) * 2.0f - 1.0f,
static_cast<float>(event->y()) / static_cast<float>(height()) * 2.0f - 1.0f,
0);
pixel_pos = pixel_pos * matrix_.inverted();
int frame_x = qRound((pixel_pos.x() + 1.0f) * 0.5f * load_buffer_.width());
int frame_y = qRound((pixel_pos.y() + 1.0f) * 0.5f * load_buffer_.height());
reference = load_buffer_.get_pixel(frame_x, frame_y);
display = color_service_->ConvertColor(reference);
}
emit CursorColor(reference, display);
}
}
void ViewerGLWidget::SetOCIOParameters(const QString &display, const QString &view, const QString &look)
{
ocio_display_ = display;
+31
View File
@@ -24,8 +24,10 @@
#include <QOpenGLWidget>
#include "render/backend/opengl/openglcolorprocessor.h"
#include "render/backend/opengl/openglframebuffer.h"
#include "render/backend/opengl/openglshader.h"
#include "render/backend/opengl/opengltexture.h"
#include "render/color.h"
#include "render/colormanager.h"
/**
@@ -119,15 +121,37 @@ public slots:
*/
void SetMatrix(const QMatrix4x4& mat);
/**
* @brief Enables or disables whether this color at the cursor should be emitted
*
* Since tracking the mouse every movement, reading pixels, and doing color transforms are processor intensive, we
* have an option for it. Ideally, this should be connected to a PixelSamplerPanel::visibilityChanged signal so that
* it can automatically be enabled when the user is pixel sampling and disabled for optimization when they're not.
*/
void SetSignalCursorColorEnabled(bool e);
signals:
/**
* @brief Signal emitted when the user starts dragging from the viewer
*/
void DragStarted();
/**
* @brief Signal emitted when cursor color is enabled and the user's mouse position changes
*/
void CursorColor(const Color& reference, const Color& display);
protected:
/**
* @brief Override the mouse press event simply to emit the DragStarted() signal
*/
virtual void mousePressEvent(QMouseEvent* event) override;
/**
* @brief Override mouse move to provide functionality for
*/
virtual void mouseMoveEvent(QMouseEvent* event) override;
/**
* @brief Initialize function to set up the OpenGL context upon its construction
*
@@ -183,6 +207,11 @@ private:
*/
OpenGLColorProcessorPtr color_service_;
/**
* @brief Framebuffer used for reading reference space pixels from the texture
*/
OpenGLFramebuffer frame_buffer_;
/**
* @brief Drawing matrix (defaults to identity)
*/
@@ -199,6 +228,8 @@ private:
bool has_image_;
bool signal_cursor_color_;
private slots:
/**
* @brief Slot to connect just before the OpenGL context is destroyed to clean up resources