m_recMonitor = new RecMonitor("record", this);
m_recMonitorDock->setWidget(m_recMonitor);
addDockWidget(Qt::TopDockWidgetArea, m_recMonitorDock);
-
connect(m_recMonitor, SIGNAL(addProjectClip(KUrl)), this, SLOT(slotAddProjectClip(KUrl)));
connect(m_recMonitor, SIGNAL(showConfigDialog(int, int)), this, SLOT(slotPreferences(int, int)));
#endif
m_effectListDock->setWidget(m_effectList);
addDockWidget(Qt::TopDockWidgetArea, m_effectListDock);
- m_vectorscope = new Vectorscope(m_projectMonitor->render, this);
+ m_vectorscope = new Vectorscope(m_projectMonitor->render, m_clipMonitor->render, this);
m_vectorscopeDock = new QDockWidget(i18n("Vectorscope"), this);
m_vectorscopeDock->setObjectName("vectorscope");
m_vectorscopeDock->setWidget(m_vectorscope);
connect(m_clipMonitorDock, SIGNAL(visibilityChanged(bool)), m_clipMonitor, SLOT(refreshMonitor(bool)));
//connect(m_monitorManager, SIGNAL(connectMonitors()), this, SLOT(slotConnectMonitors()));
connect(m_monitorManager, SIGNAL(raiseClipMonitor(bool)), this, SLOT(slotRaiseMonitor(bool)));
+ connect(m_monitorManager, SIGNAL(raiseClipMonitor(bool)), m_vectorscope, SLOT(slotActiveMonitorChanged(bool)));
connect(m_effectList, SIGNAL(addEffect(const QDomElement)), this, SLOT(slotAddEffect(const QDomElement)));
connect(m_effectList, SIGNAL(reloadEffects()), this, SLOT(slotReloadEffects()));
*/
#include <QColor>
+#include <QMouseEvent>
#include <QPainter>
#include <QDebug>
const QPointF YUV_Mg(.289, .515);
const QPointF YUV_Yl(-.437, .100);
+const QPen penThick(QBrush(QColor(250,250,250)), 2, Qt::SolidLine);
+const QPen penThin(QBrush(QColor(250,250,250)), 1, Qt::SolidLine);
+const QPen penLight(QBrush(QColor(144,255,100,50)), 1, Qt::SolidLine);
-Vectorscope::Vectorscope(Render *render, QWidget *parent) :
+Vectorscope::Vectorscope(Render *projRender, Render *clipRender, QWidget *parent) :
QWidget(parent),
- m_render(render),
+ m_projRender(projRender),
+ m_clipRender(clipRender),
+ m_activeRender(clipRender),
iPaintMode(GREEN),
- scaling(1)
+ scaling(1),
+ circleOnly(false)
{
setupUi(this);
+
paintMode->insertItem(GREEN, i18n("Green"));
paintMode->insertItem(CHROMA, i18n("Chroma"));
paintMode->insertItem(ORIG, i18n("Original Color"));
+ cbAutoRefresh->setEnabled(false);
+
connect(paintMode, SIGNAL(currentIndexChanged(int)), this, SLOT(slotPaintModeChanged(int)));
connect(cbMagnify, SIGNAL(stateChanged(int)), this, SLOT(slotMagnifyChanged()));
-}
-Vectorscope::~Vectorscope()
-{
+ this->setMouseTracking(true);
}
-void Vectorscope::mousePressEvent(QMouseEvent *)
+Vectorscope::~Vectorscope()
{
- this->update();
}
/**
// Draw the vectorscope circle
QPainter davinci(this);
QPoint vinciPoint;
+ QPoint centerPoint = mapToCanvas(scopeRect, QPointF(0,0));
davinci.setRenderHint(QPainter::Antialiasing, true);
davinci.fillRect(0, 0, ww, wh, QColor(25,25,23));
- davinci.setPen(QPen(QBrush(QColor(250,250,250)), 2, Qt::SolidLine));
+ davinci.setPen(penThick);
davinci.drawEllipse(scopeRect);
// Draw RGB/CMY points with 100% chroma
davinci.drawText(vinciPoint-QPoint(25, 0), "Yl");
// Draw RGB/CMY points with 75% chroma (for NTSC)
- davinci.setPen(QPen(QBrush(QColor(250,250,250)), 1, Qt::SolidLine));
- davinci.drawEllipse(mapToCanvas(scopeRect, QPointF(0,0)), 4,4);
+ davinci.setPen(penThin);
+ davinci.drawEllipse(centerPoint, 4,4);
davinci.drawEllipse(mapToCanvas(scopeRect, P75*SCALING*YUV_R), 3,3);
davinci.drawEllipse(mapToCanvas(scopeRect, P75*SCALING*YUV_G), 3,3);
davinci.drawEllipse(mapToCanvas(scopeRect, P75*SCALING*YUV_B), 3,3);
// If no renderer available, there is nothing more to paint now.
- if (m_render == 0) return;
+ if (m_activeRender == 0) return;
// Prepare the vectorscope data
QImage scope(cw, cw, QImage::Format_ARGB32);
scope.fill(qRgba(0,0,0,0));
- QImage img(m_render->extractFrame(m_render->seekFramePosition()));
+ QImage img(m_activeRender->extractFrame(m_activeRender->seekFramePosition()));
uchar *bits = img.bits();
- davinci.setCompositionMode(QPainter::CompositionMode_Plus);
- davinci.setPen(QColor(144,255,100,50));
+ //davinci.setCompositionMode(QPainter::CompositionMode_Plus);
+ davinci.setPen(penLight);
- int r,g,b;
- double dy, dr, dg, db, dmax;
- double y,u,v;
- QPoint pt;
- QRgb px;
+ if (!circleOnly) {
+ int r,g,b;
+ double dy, dr, dg, db, dmax;
+ double y,u,v;
+ QPoint pt;
+ QRgb px;
+
+ for (int i = 0; i < img.byteCount(); i+= 4) {
+ QRgb *col = (QRgb *) bits;
+
+ r = qRed(*col);
+ g = qGreen(*col);
+ b = qBlue(*col);
+
+ y = (double) 0.001173 * r + 0.002302 * g + 0.0004471 * b;
+ u = (double) -0.0005781*r -0.001135*g +0.001713*b;
+ v = (double) 0.002411*r -0.002019*g -0.0003921*b;
+
+ pt = mapToCanvas(QRect(QPoint(0,0), scope.size()), QPointF(SCALING*scaling*u, SCALING*scaling*v));
+
+ if (!(pt.x() <= scopeRect.width() && pt.x() >= 0
+ && pt.y() <= scopeRect.height() && pt.y() >= 0)) {
+ // Point lies outside (because of scaling), don't plot it
+ continue;
+ }
+
+ // Draw the pixel using the chosen draw mode
+ switch (iPaintMode) {
+ case CHROMA:
+ dy = 200;
+ dr = dy + 290.8*v;
+ dg = dy - 100.6*u - 148*v;
+ db = dy + 517.2*u;
+
+ dmax = dr;
+ if (dg > dmax) dmax = dg;
+ if (db > dmax) dmax = db;
+ dmax = 255/dmax;
+
+ dr *= dmax;
+ dg *= dmax;
+ db *= dmax;
+
+ scope.setPixel(pt, qRgba(dr, dg, db, 255));
+ break;
+ case ORIG:
+ scope.setPixel(pt, *col);
+ break;
+ case GREEN:
+ px = scope.pixel(pt);
+ scope.setPixel(pt, qRgba(qRed(px)+(255-qRed(px))/40, 255, qBlue(px)+(255-qBlue(px))/40, qAlpha(px)+(255-qAlpha(px))/20));
+ break;
+ }
+
+ bits += 4;
+ }
- for (int i = 0; i < img.byteCount(); i+= 4) {
- QRgb *col = (QRgb *) bits;
+ davinci.drawImage(scopeRect.topLeft(), scope);
+ m_scope = scope;
+ } else {
+ // Mouse moved: Draw a circle over the (already calculated) scope
+ davinci.drawImage(scopeRect.topLeft(), m_scope);
- r = qRed(*col);
- g = qGreen(*col);
- b = qBlue(*col);
+ int dx = centerPoint.x()-mousePos.x();
+ int dy = centerPoint.y()-mousePos.y();
- y = (double) 0.001173 * r + 0.002302 * g + 0.0004471 * b;
- u = (double) -0.0005781*r -0.001135*g +0.001713*b;
- v = (double) 0.002411*r -0.002019*g -0.0003921*b;
+ QPoint reference = mapToCanvas(scopeRect, QPointF(1,0));
- pt = mapToCanvas(QRect(QPoint(0,0), scope.size()), QPointF(SCALING*scaling*u, SCALING*scaling*v));
+ int r = sqrt(dx*dx + dy*dy);
+ float percent = (float) 100*r/SCALING/(reference.x() - centerPoint.x());
- if (!(pt.x() <= scopeRect.width() && pt.x() >= 0
- && pt.y() <= scopeRect.height() && pt.y() >= 0)) {
- // Point lies outside (because of scaling), don't plot it
- continue;
- }
+ qDebug() << "dx: " << dx << " dy: " << dy << " r: " << r;
+ davinci.drawEllipse(centerPoint, r,r);
+ davinci.setPen(penThin);
+ davinci.drawText(scopeRect.bottomRight()-QPoint(40,0), QVariant((int)percent).toString().append(" %"));
- // Draw the pixel using the chosen draw mode
- switch (iPaintMode) {
- case CHROMA:
- dy = 200;
- dr = dy + 290.8*v;
- dg = dy - 100.6*u - 148*v;
- db = dy + 517.2*u;
-
- dmax = dr;
- if (dg > dmax) dmax = dg;
- if (db > dmax) dmax = db;
- dmax = 255/dmax;
-
- dr *= dmax;
- dg *= dmax;
- db *= dmax;
-
- scope.setPixel(pt, qRgba(dr, dg, db, 255));
- break;
- case ORIG:
- scope.setPixel(pt, *col);
- break;
- case GREEN:
- px = scope.pixel(pt);
- scope.setPixel(pt, qRgba(qRed(px)+(255-qRed(px))/40, 255, qBlue(px)+(255-qBlue(px))/40, qAlpha(px)+(255-qAlpha(px))/20));
- break;
- }
-
- bits += 4;
+ circleOnly = false;
}
- davinci.drawImage(scopeRect.topLeft(), scope);
-
}
void Vectorscope::slotPaintModeChanged(int index)
}
this->update();
}
+
+void Vectorscope::slotActiveMonitorChanged(bool isClipMonitor)
+{
+ qDebug() << "Active monitor changed. Is clip? " << isClipMonitor;
+ if (isClipMonitor) {
+ m_activeRender = m_clipRender;
+ } else {
+ m_activeRender = m_projRender;
+ }
+}
+
+void Vectorscope::mousePressEvent(QMouseEvent *)
+{
+ // Update the scope on mouse press
+ this->update();
+}
+
+void Vectorscope::mouseMoveEvent(QMouseEvent *event)
+{
+ // Draw a circle around the center,
+ // showing percentage number of the radius length
+
+ circleOnly = true;
+ mousePos = event->pos();
+ qDebug() << "event: " << mousePos.x() << "/" << mousePos.y();
+ this->update();
+}