From 0dc794435d033af54362143cab7e1739b368f9dc Mon Sep 17 00:00:00 2001
From: "Tim E. Real" <termtech@rogers.com>
Date: Fri, 17 Dec 2010 00:22:09 +0000
Subject: Fixed meter drawing (speed) - removed double buffer pixmap.

---
 muse2/ChangeLog            |   1 +
 muse2/muse/mixer/meter.cpp | 114 ++++++++++++++++++++++++++-------------------
 muse2/muse/mixer/meter.h   |   7 +--
 3 files changed, 69 insertions(+), 53 deletions(-)

diff --git a/muse2/ChangeLog b/muse2/ChangeLog
index 04f78f8a..5ed9d7c4 100644
--- a/muse2/ChangeLog
+++ b/muse2/ChangeLog
@@ -1,5 +1,6 @@
 16.12.2010:
         - Fixed track list track moving/resizing - added ev->buttons() check to mouseMoveEvent(). (Tim)
+        - Fixed meter drawing (speed) - removed double buffer pixmap. Test OK. (Tim)
 15.12.2010:
         - Major cleanup in the #includes. Emptied all.ha nnd moved its contents to individual files.
           The build is roughly 20% faster now. (Orcan)
diff --git a/muse2/muse/mixer/meter.cpp b/muse2/muse/mixer/meter.cpp
index b9780f88..f50aa261 100644
--- a/muse2/muse/mixer/meter.cpp
+++ b/muse2/muse/mixer/meter.cpp
@@ -40,7 +40,6 @@ Meter::Meter(QWidget* parent, MeterType type)
 //   setVal
 //---------------------------------------------------------
 
-//void Meter::setVal(int v, int max, bool ovl)
 void Meter::setVal(double v, double max, bool ovl)
       {
       overflow = ovl;
@@ -93,7 +92,6 @@ void Meter::setRange(double min, double max)
       {
       minScale = min;
       maxScale = max;
-      drawVU(width(), height());
       update();
       }
 
@@ -101,84 +99,104 @@ void Meter::setRange(double min, double max)
 //   paintEvent
 //---------------------------------------------------------
 
-void Meter::paintEvent(QPaintEvent*)
+void Meter::paintEvent(QPaintEvent* /*ev*/)
       {
-      QPainter p;
-      p.begin(this);
+      // TODO: Could make better use of event rectangle, for speed.
+      
+      QPainter p(this);
+      
       double range = maxScale - minScale;
 
       int fw = frameWidth();
-      int h  = height() - 2* fw;
+      int w = width() - 2*fw;
+      int h  = height() - 2*fw;
       int yv;
+      
       if(mtype == DBMeter) 
         yv = val == 0 ? h : int(((maxScale - (fast_log10(val) * 20.0)) * h)/range);
       else
         yv = val == 0 ? h : int(((maxScale - val) * h)/range);
       
-      // Orcan - check
-      //void bitBlt ( QImage * dst, int dx, int dy, const QImage * src, int sx = 0, int sy = 0, int sw = -1, int sh = -1, Qt::ImageConversionFlags flags = Qt::AutoColor )
-
-      //bitBlt(this, fw, fw,    &bgPm, 0, 0,  -1, yv, true); //   CopyROP, true); ddskrjo
-      //bitBlt(this, fw, fw+yv, &fgPm, 0, yv, -1, h-yv, true); //CopyROP, true); ddskrjo
-
-      p.drawImage(fw, fw,    bgPm.toImage(), 0, 0,   -1, yv  );
-      p.drawImage(fw, fw+yv, fgPm.toImage(), 0, yv,  -1, h-yv);
-
+      if(yv > h) yv = h;
+      
+      // Draw the red, green, and yellow sections.
+      drawVU(p, w, h, yv);
+      
+      // Draw the peak white line.
       int ymax;
       if(mtype == DBMeter) 
         ymax = maxVal == 0 ? 0 : int(((maxScale - (fast_log10(maxVal) * 20.0)) * h)/range);
       else
         ymax = maxVal == 0 ? 0 : int(((maxScale - maxVal) * h)/range);
       p.setPen(Qt::white);
-      p.drawLine(0, ymax, width()-2*fw, ymax);
+      p.drawLine(0, ymax, w, ymax);
       }
 
 //---------------------------------------------------------
 //   drawVU
 //---------------------------------------------------------
 
-void Meter::drawVU(int w, int h)
-      {
-      double range = maxScale - minScale;
-      int fw = frameWidth();
-      w -= 2*fw;
-      h -= 2*fw;
-
-      bgPm = QPixmap(QSize(w, h));
-      fgPm = QPixmap(QSize(w, h));
-
-      QPainter p1(&fgPm);
-      QPainter p2(&bgPm);
-      
-      if(mtype == LinMeter)
+void Meter::drawVU(QPainter& p, int w, int h, int yv)
+{
+      if(mtype == DBMeter) 
       {
-        p1.fillRect(0, 0, w, h, QBrush(0x00ff00));  // green
-        p2.fillRect(0, 0, w, h, QBrush(0x007000));  // green
+        double range = maxScale - minScale;
+        int y1 = int((maxScale - redScale) * h / range);
+        int y2 = int((maxScale - yellowScale) * h / range);
+        
+        if(yv < y1)
+        {
+          // Red section:
+          p.fillRect(0, 0,  w, yv,        QBrush(0x8e0000));     // dark red  
+          p.fillRect(0, yv, w, y1-yv,     QBrush(0xff0000));     // light red
+          
+          // Yellow section:
+          p.fillRect(0, y1, w, y2-y1,     QBrush(0xffff00));     // light yellow
+          
+          // Green section:
+          p.fillRect(0, y2, w, h-y2,      QBrush(0x00ff00));     // light green
+        }
+        else
+        if(yv < y2)
+        {
+          // Red section:
+          p.fillRect(0, 0,  w, y1,        QBrush(0x8e0000));     // dark red  
+          
+          // Yellow section:
+          p.fillRect(0, y1, w, yv-y1,     QBrush(0x8e8e00));     // dark yellow
+          p.fillRect(0, yv, w, y2-yv,     QBrush(0xffff00));     // light yellow
+          
+          // Green section:
+          p.fillRect(0, y2, w, h-y2,      QBrush(0x00ff00));     // light green
+        }
+        else
+        //if(yv <= y3)   
+        {
+          // Red section:
+          p.fillRect(0, 0,  w, y1,        QBrush(0x8e0000));     // dark red  
+          
+          // Yellow section:
+          p.fillRect(0, y1, w, y2-y1,     QBrush(0x8e8e00));     // dark yellow
+          
+          // Green section:
+          p.fillRect(0, y2, w, yv-y2,     QBrush(0x007000));     // dark green
+          p.fillRect(0, yv, w, h-yv,      QBrush(0x00ff00));     // light green
+        }
       }  
       else
       {
-        int y1 = int((maxScale - redScale) * h / range);
-        int y2 = int((maxScale - yellowScale) * h / range);
-        int y3 = h;
-        p1.fillRect(0, 0,  w, y1,    QBrush(0xff0000));  // red
-        p1.fillRect(0, y1, w, y2-y1, QBrush(0xffff00));  // yellow
-        p1.fillRect(0, y2, w, y3-y2, QBrush(0x00ff00));  // green
-  
-        p2.fillRect(0, 0,  w, y1,    QBrush(0x8e0000));  // red
-        p2.fillRect(0, y1, w, y2-y1, QBrush(0x8e8e00));  // yellow
-        p2.fillRect(0, y2, w, y3-y2, QBrush(0x007000));  // green
+        p.fillRect(0, 0,  w, yv,   QBrush(0x007000));   // dark green
+        p.fillRect(0, yv, w, h-yv, QBrush(0x00ff00));   // light green
       }
-    }
+}
 
 //---------------------------------------------------------
 //   resizeEvent
 //---------------------------------------------------------
 
-void Meter::resizeEvent(QResizeEvent* ev)
-      {
-      int h  = ev->size().height();
-      int w  = ev->size().width();
-      drawVU(w, h);
+void Meter::resizeEvent(QResizeEvent* /*ev*/)
+    {
+    
     }
 
 //---------------------------------------------------------
diff --git a/muse2/muse/mixer/meter.h b/muse2/muse/mixer/meter.h
index 6c2dde34..30bdfea6 100644
--- a/muse2/muse/mixer/meter.h
+++ b/muse2/muse/mixer/meter.h
@@ -13,6 +13,7 @@
 
 class QResizeEvent;
 class QMouseEvent;
+class QPainter;
 
 class Meter : public QFrame {
    public:
@@ -25,10 +26,7 @@ class Meter : public QFrame {
       double minScale, maxScale;
       int yellowScale, redScale;
 
-      QPixmap bgPm;
-      QPixmap fgPm;  // for double buffering
-      
-      void drawVU(int w, int h);
+      void drawVU(QPainter& p, int, int, int);
 
       Q_OBJECT
       void paintEvent(QPaintEvent*);
@@ -37,7 +35,6 @@ class Meter : public QFrame {
 
    public slots:
       void resetPeaks();
-      //void setVal(int, int, bool);
       void setVal(double, double, bool);
 
    signals:
-- 
cgit v1.2.3