]> git.sesse.net Git - kdenlive/commitdiff
* Vectorscopes notified of active monitor
authorSimon A. Eugster <simon.eu@gmail.com>
Tue, 13 Jul 2010 15:35:10 +0000 (15:35 +0000)
committerSimon A. Eugster <simon.eu@gmail.com>
Tue, 13 Jul 2010 15:35:10 +0000 (15:35 +0000)
* Vectorscope draws circle around center on mouse over

svn path=/trunk/kdenlive/; revision=4575

src/mainwindow.cpp
src/vectorscope.cpp
src/vectorscope.h
src/widgets/vectorscope_ui.ui

index e6004ae82db805611779fc44072b5e7c10088a9e..1adac5b7c7e5b9dc6bea85cb6a4644cd25619c84 100644 (file)
@@ -203,7 +203,6 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent
     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
@@ -214,7 +213,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent
     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);
@@ -403,6 +402,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent
     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()));
 
index d3c9b3eac496dbfe05fc7bcc7308d7be467d3188..f873ac4a10173daddc5db4ed8f8d23cd7b730417 100644 (file)
@@ -34,6 +34,7 @@ mRgb2Yuv =                       r =
  */
 
 #include <QColor>
+#include <QMouseEvent>
 #include <QPainter>
 #include <QDebug>
 
@@ -48,29 +49,35 @@ const QPointF YUV_Cy(.147, -.615);
 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();
 }
 
 /**
@@ -125,10 +132,11 @@ void Vectorscope::paintEvent(QPaintEvent *)
     // 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
@@ -157,8 +165,8 @@ void Vectorscope::paintEvent(QPaintEvent *)
     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);
@@ -168,77 +176,98 @@ void Vectorscope::paintEvent(QPaintEvent *)
 
 
     // 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)
@@ -256,3 +285,30 @@ void Vectorscope::slotMagnifyChanged()
     }
     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();
+}
index 86ceadfba2c40999ea3830a32e3d61884e162b29..d9a2922d2abebdacd4d09e076d9f2568be0c25f1 100644 (file)
@@ -22,22 +22,30 @@ class Vectorscope : public QWidget, public Ui::Vectorscope_UI {
     Q_OBJECT
 
 public:
-    Vectorscope(Render *render, QWidget *parent = 0);
+    Vectorscope(Render *projRender, Render *clipRender, QWidget *parent = 0);
     ~Vectorscope();
 
 protected:
     void paintEvent(QPaintEvent *);
     void mousePressEvent(QMouseEvent *);
+    void mouseMoveEvent(QMouseEvent *event);
 
 private:
-    Render *m_render;
+    Render *m_projRender;
+    Render *m_clipRender;
+    Render *m_activeRender;
+    QImage m_scope;
     int iPaintMode;
     float scaling;
     QPoint mapToCanvas(QRect inside, QPointF point);
 
+    bool circleOnly;
+    QPoint mousePos;
+
 private slots:
     void slotPaintModeChanged(int index);
     void slotMagnifyChanged();
+    void slotActiveMonitorChanged(bool isClipMonitor);
 
 };
 
index 3d9e66fb342f6cb532abedbb3ba2bd533e4bb9ff..17070b6e86b07684fd8e922f73269a916c1a35c6 100644 (file)
      <x>0</x>
      <y>0</y>
      <width>401</width>
-     <height>301</height>
+     <height>68</height>
     </rect>
    </property>
    <layout class="QGridLayout" name="gridLayout">
        <widget class="QComboBox" name="paintMode"/>
       </item>
       <item>
-       <widget class="QCheckBox" name="cbMagnify">
-        <property name="text">
-         <string>Magnify</string>
-        </property>
-       </widget>
+       <layout class="QHBoxLayout" name="horizontalLayout">
+        <item>
+         <widget class="QCheckBox" name="cbMagnify">
+          <property name="text">
+           <string>Magnify</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QCheckBox" name="cbAutoRefresh">
+          <property name="text">
+           <string>Auto-Refresh</string>
+          </property>
+         </widget>
+        </item>
+       </layout>
       </item>
      </layout>
     </item>