diff options
| author | Tim E. Real <termtech@rogers.com> | 2011-09-21 06:31:12 +0000 | 
|---|---|---|
| committer | Tim E. Real <termtech@rogers.com> | 2011-09-21 06:31:12 +0000 | 
| commit | 6f6c78229e4e1dee80d36c89c27e2e58e23e0eb3 (patch) | |
| tree | 7909c92c92c910bb5a67400c5d363ff3dc896b57 /muse2/muse | |
| parent | 279cf178836509085b8cfb1f576f350e9fd28dca (diff) | |
Need to get it off the drive: Part canvas drawing speed boosts. Working on meter speed.
Diffstat (limited to 'muse2/muse')
| -rw-r--r-- | muse2/muse/arranger/pcanvas.cpp | 80 | ||||
| -rw-r--r-- | muse2/muse/arranger/pcanvas.h | 2 | ||||
| -rw-r--r-- | muse2/muse/song.cpp | 16 | ||||
| -rw-r--r-- | muse2/muse/widgets/meter.cpp | 324 | ||||
| -rw-r--r-- | muse2/muse/widgets/meter.h | 4 | 
5 files changed, 376 insertions, 50 deletions
| diff --git a/muse2/muse/arranger/pcanvas.cpp b/muse2/muse/arranger/pcanvas.cpp index d6ae1300..0de8d278 100644 --- a/muse2/muse/arranger/pcanvas.cpp +++ b/muse2/muse/arranger/pcanvas.cpp @@ -3,7 +3,7 @@  //  Linux Music Editor  //    $Id: pcanvas.cpp,v 1.48.2.26 2009/11/22 11:08:33 spamatica Exp $  //  (C) Copyright 1999 Werner Schweer (ws@seh.de) -//  Additions, modifications (C) Copyright 2011 Tim E. Real (terminator356 on users DOT sourceforge DOT net) +//  (C) Copyright 2011 Tim E. Real (terminator356 on users DOT sourceforge DOT net)  //  //  This program is free software; you can redistribute it and/or  //  modify it under the terms of the GNU General Public License @@ -1754,19 +1754,16 @@ void PartCanvas::drawItem(QPainter& p, const MusEWidget::CItem* item, const QRec        //QRect rr = p.transform().mapRect(r);    // Gives inconsistent positions. Source shows wrong operation for our needs.        QRect rr = map(r);                        // Use our own map instead.                                 +      QRect mr = map(rect); +              // Item bounding box x is in tick coordinates, same as rectangle. -      //if(item->bbox().intersect(rect).isNull()) -      //if((item->bbox() & rect).isNull()) -      if((rr & map(rect)).isNull()) +      if((rr & mr).isNull())        {          //printf("PartCanvas::drawItem rectangle is null\n");          return;        } -      //printf("PartCanvas::drawItem called map rx:%d rw:%d  rrx:%d rrw:%d\n", r.x(), r.width(), rr.x(), rr.width());   -      //printf("PartCanvas::drawItem called map rx:%d rw:%d\n", r.x(), r.width());   -       -      p.save(); +      //p.save();        p.setWorldMatrixEnabled(false);        // NOTE: Optimization: For each item, hasHiddenEvents() is called once in Canvas::draw(), and we use cachedHasHiddenEvents(). @@ -1815,6 +1812,15 @@ void PartCanvas::drawItem(QPainter& p, const MusEWidget::CItem* item, const QRec        if(ye_2 < ys_0)          ye_2 = ys_0; +      int mrxs_0 = mr.x(); +      int mrxe_0 = mrxs_0 + mr.width(); +      bool lbt = ((NPart*)item)->leftBorderTouches; +      bool rbt = ((NPart*)item)->rightBorderTouches; +      int lbx = lbt?xs_1:xs_0; +      int rbx = rbt?xe_1:xe_0; +      int lbx_c = lbx < mrxs_0 ? mrxs_0 : lbx; +      int rbx_c = rbx > mrxe_0 ? mrxe_0 : rbx; +              int cidx = part->colorIndex();        if (item->isMoving())         { @@ -1873,8 +1879,11 @@ void PartCanvas::drawItem(QPainter& p, const MusEWidget::CItem* item, const QRec        p.setBrush(brush);        p.setPen(Qt::NoPen); +              if(het)        { +        // TODO: Make this part respect the requested drawing rectangle (rr & mr), for speed ! +                  pts = 0;          if(het == (Part::LeftEventsHidden | Part::RightEventsHidden))          { @@ -1988,7 +1997,8 @@ void PartCanvas::drawItem(QPainter& p, const MusEWidget::CItem* item, const QRec        }          else        { -        p.fillRect(rr, brush); +        //p.fillRect(rr, brush); +        p.fillRect(rr & mr, brush);  // Respect the requested drawing rectangle. Gives speed boost!        }        // Draw a pattern brush on muted parts... @@ -1998,8 +2008,9 @@ void PartCanvas::drawItem(QPainter& p, const MusEWidget::CItem* item, const QRec          //brush.setStyle(Qt::DiagCrossPattern);          brush.setStyle(Qt::Dense7Pattern); -        p.fillRect(rr, brush);                                                         // FIXME: Some shifting going on +        //p.fillRect(rr, brush);                                                       // FIXME: Some shifting going on          //p.fillRect(QRect(rr.x(), rr.y(), rr.width() + 1, rr.height() + 1), brush);   // Same here +        p.fillRect(rr & mr, brush);   // Respect the requested drawing rectangle. Gives speed boost!                                                              }          p.setWorldMatrixEnabled(true); @@ -2035,7 +2046,10 @@ void PartCanvas::drawItem(QPainter& p, const MusEWidget::CItem* item, const QRec          p.setBrush(Qt::NoBrush);          p.drawRect(r); -  #else  +  //#else  +  #endif +   +  #if 1          //          // Now draw the borders, using custom segments...          // @@ -2089,18 +2103,20 @@ void PartCanvas::drawItem(QPainter& p, const MusEWidget::CItem* item, const QRec            penSelect2V.setDashOffset(1.0);              penNormal2V.setDashOffset(1.0);              //penHidden2.setDashPattern(customDashPattern);   +           +          // FIXME: Some shifting still going on. Values likely not quite right here.  +          int xdiff = mrxs_0 - lbx; +          if(xdiff > 0) +          { +            int doff = xdiff % 10; +            penSelect1H.setDashOffset(doff); +            penNormal1H.setDashOffset(doff); +            doff = xdiff % 5; +            penSelect2H.setDashOffset(doff); +            penNormal2H.setDashOffset(doff); +          }          }   -        bool lbt = ((NPart*)item)->leftBorderTouches; -        bool rbt = ((NPart*)item)->rightBorderTouches; -         -        QLine l1(lbt?xs_1:xs_0, ys_0,             rbt?xe_1:xe_0, ys_0);            // Top  -        //QLine l2(rbt?xe_1:xe_0, rbt?ys_1:ys_2,    rbt?xe_1:xe_0, rbt?ye_1:ye_2); // Right  -        QLine l2(rbt?xe_1:xe_0, ys_0,             rbt?xe_1:xe_0, ye_0);            // Right  -        QLine l3(lbt?xs_1:xs_0, ye_0,             rbt?xe_1:xe_0, ye_0);            // Bottom -        //QLine l4(xs_0,          lbt?ys_1:ys_2,    xs_0,          lbt?ye_1:ye_2); // Left -        QLine l4(xs_0,          ys_0,             xs_0,          ye_0);            // Left -                  //if(het & Part::RightEventsHidden)          //  p.setPen(((NPart*)item)->rightBorderTouches ? penHidden1 : penHidden2);           //else   @@ -2110,7 +2126,12 @@ void PartCanvas::drawItem(QPainter& p, const MusEWidget::CItem* item, const QRec            else                p.setPen(part->selected() ? penSelect2V : penNormal2V);           }   -        p.drawLine(l2);        // Right line +         +        if(rbx >= mrxs_0 && rbx <= mrxe_0)  // Respect the requested drawing rectangle. Gives speed boost! +        { +          QLine l2(rbx, ys_0, rbx, ye_0);            // Right  +          p.drawLine(l2);        // Right line +        }          /*          int xx = rbt?xe_1:xe_0;  @@ -2138,7 +2159,12 @@ void PartCanvas::drawItem(QPainter& p, const MusEWidget::CItem* item, const QRec            else                p.setPen(part->selected() ? penSelect2V : penNormal2V);           }   -        p.drawLine(l4);        //  Left line +         +        if(xs_0 >= mrxs_0 && xs_0 <= mrxe_0) +        { +          QLine l4(xs_0, ys_0, xs_0, ye_0);            // Left +          p.drawLine(l4);        //  Left line +        }          /*          xx = xs_0; @@ -2158,7 +2184,11 @@ void PartCanvas::drawItem(QPainter& p, const MusEWidget::CItem* item, const QRec          */          p.setPen(part->selected() ? penSelect2H : penNormal2H);  +         +        // Respect the requested drawing rectangle. Gives speed boost! +        QLine l1(lbx_c, ys_0, rbx_c, ys_0);            p.drawLine(l1);  // Top line +        QLine l3(lbx_c, ye_0, rbx_c, ye_0);            p.drawLine(l3);  // Bottom line    #endif @@ -2189,8 +2219,8 @@ void PartCanvas::drawItem(QPainter& p, const MusEWidget::CItem* item, const QRec              p.drawText(tr, Qt::AlignBottom|Qt::AlignLeft, part->name());              } -      p.restore(); -      //p.setWorldMatrixEnabled(true); +      //p.restore(); +      p.setWorldMatrixEnabled(true);        }  //--------------------------------------------------------- diff --git a/muse2/muse/arranger/pcanvas.h b/muse2/muse/arranger/pcanvas.h index 7eec87c6..3e320e56 100644 --- a/muse2/muse/arranger/pcanvas.h +++ b/muse2/muse/arranger/pcanvas.h @@ -3,7 +3,7 @@  //  Linux Music Editor  //    $Id: pcanvas.h,v 1.11.2.4 2009/05/24 21:43:44 terminator356 Exp $  //  (C) Copyright 1999 Werner Schweer (ws@seh.de) -//  Additions, modifications (C) Copyright 2011 Tim E. Real (terminator356 on users DOT sourceforge DOT net) +//  (C) Copyright 2011 Tim E. Real (terminator356 on users DOT sourceforge DOT net)  //  //  This program is free software; you can redistribute it and/or  //  modify it under the terms of the GNU General Public License diff --git a/muse2/muse/song.cpp b/muse2/muse/song.cpp index 29ed7023..6a43e457 100644 --- a/muse2/muse/song.cpp +++ b/muse2/muse/song.cpp @@ -61,6 +61,7 @@  #include "al/sig.h"  #include "keyevent.h"  #include <sys/wait.h> +//#include "utils.h"    extern void clearMidiTransforms();  extern void clearMidiInputTransforms(); @@ -1700,6 +1701,21 @@ void Song::setMType(MType t)  void Song::beat()        { +      #if 0 +      static double _heartbeatRateTimer = 0.0; +      double t = MusEUtil::curTime(); +      if(t - _heartbeatRateTimer > 0.0) +      { +        double rate = 1/ (t - _heartbeatRateTimer); +        printf("heartbeat rate:%f\n", rate); +        // Results: Song::beat() is not even called sometimes because apparently all the other +        //  stuff connected to the heartbeat is taking up all the time before the next timer event -  +        //  apparently Song::beat() is called last, or close to last - after the others. (Possible to choose order?) +        // With fancy strip meters active, Song::beat() was quiet for long periods of time! +      } +      _heartbeatRateTimer = t; +      #endif +              // Keep the sync detectors running...         for(int port = 0; port < MIDI_PORTS; ++port)        { diff --git a/muse2/muse/widgets/meter.cpp b/muse2/muse/widgets/meter.cpp index 239f7655..50d265b5 100644 --- a/muse2/muse/widgets/meter.cpp +++ b/muse2/muse/widgets/meter.cpp @@ -6,6 +6,7 @@  //  //  (C) Copyright 2000 Werner Schweer (ws@seh.de)  //  (C) Copyright 2011 Orcan Ogetbil (ogetbilo at sf.net) +//  (C) Copyright 2011 Tim E. Real (terminator356 on users DOT sourceforge DOT net)  //  //  This program is free software; you can redistribute it and/or  //  modify it under the terms of the GNU General Public License @@ -34,6 +35,9 @@  #include "gconfig.h"  #include "fastlog.h" +// Uncomment to use the new meters. Warning: They are currently very time-consuming and unoptimized. +#define _USE_NEW_METERS 1  +  namespace MusEWidget {  //--------------------------------------------------------- @@ -49,11 +53,15 @@ Meter::Meter(QWidget* parent, MeterType type)        // This is absolutely required for speed! Otherwise painfully slow because we get         //  full rect paint events even on small scrolls! See help on QPainter::scroll().        // Commented out for now. Orcan 20110911 -      //setAttribute(Qt::WA_OpaquePaintEvent); +      #ifndef _USE_NEW_METERS +      setAttribute(Qt::WA_OpaquePaintEvent);     +      #endif        //setFrameStyle(QFrame::Raised | QFrame::StyledPanel);        mtype = type;        overflow    = false; +      cur_yv      = -1;     // Flag as -1 to initialize in paint. +      last_yv     = 0;        val         = 0.0;        maxVal      = 0.0;        minScale    = mtype == DBMeter ? MusEConfig::config.minMeter : 0.0;      // min value in dB or int @@ -152,8 +160,39 @@ void Meter::setVal(double v, double max, bool ovl)          ud = true;        } -      if(ud) -        update(); +      if(ud)         +      { +        #ifdef _USE_NEW_METERS +        update();  +         +        #else +        double range = maxScale - minScale; +        int fw = frameWidth(); +        int w  = width() - 2*fw; +        int h  = height() - 2*fw; +         +        if(mtype == DBMeter) +          cur_yv = val == 0 ? h : int(((maxScale - (fast_log10(val) * 20.0)) * h)/range); +        else +          cur_yv = val == 0 ? h : int(((maxScale - val) * h)/range); +         +        if(cur_yv > h) cur_yv = h; +         +        int y1, y2; +        if(last_yv < cur_yv) +        { +          y1 = last_yv; +          y2 = cur_yv; +        } +        else +        { +          y1 = cur_yv; +          y2 = last_yv; +        } +        last_yv = cur_yv; +        update(fw, y1, w, y2);  +        #endif +      }      }  //---------------------------------------------------------  //   resetPeaks @@ -164,7 +203,7 @@ void Meter::resetPeaks()        {        maxVal   = val;        overflow = val > 0.0; -      update(); +      update();                       }  //--------------------------------------------------------- @@ -175,6 +214,7 @@ void Meter::setRange(double min, double max)        {        minScale = min;        maxScale = max; +      cur_yv = -1;  // Force re-initialization.        update();        } @@ -182,12 +222,14 @@ void Meter::setRange(double min, double max)  //   paintEvent  //--------------------------------------------------------- -void Meter::paintEvent(QPaintEvent* /*ev*/) +void Meter::paintEvent(QPaintEvent* ev)        {        // TODO: Could make better use of event rectangle, for speed.        QPainter p(this); -      p.setRenderHint(QPainter::Antialiasing); +      #ifdef _USE_NEW_METERS +      p.setRenderHint(QPainter::Antialiasing);   +      #endif        double range = maxScale - minScale; @@ -195,22 +237,25 @@ void Meter::paintEvent(QPaintEvent* /*ev*/)        int w  = width() - 2*fw;        int h  = height() - 2*fw; -      /* -      QRect rect = ev->rect(); -      int w = rect.width() - 2*fw; -      int h = rect.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); +      const QRect& rect = ev->rect(); +      //printf("Meter::paintEvent rx:%d ry:%d rw:%d rh:%d w:%d h:%d\n", rect.x(), rect.y(), rect.width(), rect.height(), w, h);  +      //p.setClipRect(rect); // Nope, didn't help (I think it's already clipped. So check why we bother to do it in View). -      if(yv > h) yv = h; +      // Initialize. Can't do in ctor, must be done after layouts have been done. Most reliable to do it here. +      #ifndef _USE_NEW_METERS +      if(cur_yv == -1)  +      #endif     +      { +        if(mtype == DBMeter) +          cur_yv = val == 0 ? h : int(((maxScale - (fast_log10(val) * 20.0)) * h)/range); +        else +          cur_yv = val == 0 ? h : int(((maxScale - val) * h)/range); +        if(cur_yv > h) cur_yv = h; +        //last_yv = cur_yv; +      }        // Draw the red, green, and yellow sections. -      drawVU(p, w, h, yv); +      drawVU(p, rect, cur_yv);        // Draw the peak white line.        int ymax; @@ -218,9 +263,13 @@ void Meter::paintEvent(QPaintEvent* /*ev*/)          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(peak_color); -      p.drawLine(0, ymax, w, ymax); +      if(ymax >= rect.y() && ymax < rect.height()) +      { +        p.setPen(peak_color); +        p.drawLine(0, ymax, w, ymax); +      } +      #ifdef _USE_NEW_METERS        // Draw the transparent layer on top of everything to give a 3d look        QPainterPath round_path = MusEUtil::roundedPath(0, 0, w, h,                                              xrad, yrad, @@ -228,6 +277,7 @@ void Meter::paintEvent(QPaintEvent* /*ev*/)        maskGrad.setStart(QPointF(0, 0));        maskGrad.setFinalStop(QPointF(w, 0));        p.fillPath(round_path, QBrush(maskGrad)); +      #endif        } @@ -236,8 +286,17 @@ void Meter::paintEvent(QPaintEvent* /*ev*/)  //   drawVU  //--------------------------------------------------------- -void Meter::drawVU(QPainter& p, int w, int h, int yv) +void Meter::drawVU(QPainter& p, const QRect& rect, int yv)  { +      int fw = frameWidth(); +      int w  = width() - 2*fw; +      int h  = height() - 2*fw; +       +      // Test OK. We are passed small rectangles on small value changes. +      //printf("Meter::drawVU rx:%d ry:%d rw:%d rh:%d w:%d h:%d\n", rect.x(), rect.y(), rect.width(), rect.height(), w, h);  + +  #ifdef _USE_NEW_METERS +              if(mtype == DBMeter)        {          double range = maxScale - minScale; @@ -373,15 +432,234 @@ void Meter::drawVU(QPainter& p, int w, int h, int yv)          }        } +       +      /*  WIP... +      // TODO: Instead of drawing the whole area, make this respect the requested drawing rectangle, for speed... +      //       Done. But not correct yet. And could possibly simplify the whole drawing some more... +      QRect pr(0, 0,  w, 0); +      QPainterPath rectp; +      rectp.addRect(rect.x(), rect.y(), rect.width(), rect.height()); +      if(mtype == DBMeter) +      { +        double range = maxScale - minScale; +        int y1 = int((maxScale - redScale) * h / range); +        int y2 = int((maxScale - yellowScale) * h / range); + +        darkGradGreen.setStart(QPointF(0, y2)); +        darkGradGreen.setFinalStop(QPointF(0, h)); +        darkGradYellow.setStart(QPointF(0, y1)); +        darkGradYellow.setFinalStop(QPointF(0, y2)); +        darkGradRed.setStart(QPointF(0, 0)); +        darkGradRed.setFinalStop(QPointF(0, y1)); + +        lightGradGreen.setStart(QPointF(0, y2)); +        lightGradGreen.setFinalStop(QPointF(0, h)); +        lightGradYellow.setStart(QPointF(0, y1)); +        lightGradYellow.setFinalStop(QPointF(0, y2)); +        lightGradRed.setStart(QPointF(0, 0)); +        lightGradRed.setFinalStop(QPointF(0, y1)); + +        QPainterPath p_top = MusEUtil::roundedPath(0, 0, w, y1, +                                         xrad, yrad, +                                         (MusEUtil::Corner) (MusEUtil::UpperLeft | MusEUtil::UpperRight ) ); + +        QPainterPath p_bottom = MusEUtil::roundedPath(0, y2, w, h-y2, +                                            xrad, yrad, +                                            (MusEUtil::Corner) (MusEUtil::LowerLeft | MusEUtil::LowerRight ) ); + +        if(yv < y1) +        { + +          QPainterPath p_dark_red = MusEUtil::roundedPath(0, 0, w, yv, +                                                xrad, yrad, +                                                (MusEUtil::Corner) (MusEUtil::UpperLeft | MusEUtil::UpperRight ) ); +          p_top = p_top.subtracted(p_dark_red); + +          // Red section: +          p.fillPath(p_dark_red & rectp,        QBrush(darkGradRed));       // dark red   +          p.fillPath(p_top & rectp,             QBrush(lightGradRed));      // light red + +          // Yellow section: +          pr.setTop(y1); pr.setHeight(y2-y1); +          p.fillRect(pr & rect, QBrush(lightGradYellow));   // light yellow + +          // Green section: +          p.fillPath(p_bottom & rectp, QBrush(lightGradGreen));    // light green +        } +        else +        if(yv < y2) +        { +          // Red section: +          p.fillPath(p_top & rectp, QBrush(darkGradRed));       // dark red   + +          // Yellow section: +          pr.setTop(y1); pr.setHeight(yv-y1); +          p.fillRect(pr & rect, QBrush(darkGradYellow));    // dark yellow +          pr.setTop(yv); pr.setHeight(y2-yv); +          p.fillRect(pr & rect, QBrush(lightGradYellow));   // light yellow + +          // Green section: +          p.fillPath(p_bottom & rectp, QBrush(lightGradGreen));    // light green +        } +        else +        //if(yv <= y3)    +        { +          QPainterPath p_light_green = MusEUtil::roundedPath(0, yv, w, h-yv, +                                                   xrad, yrad, +                                                   (MusEUtil::Corner) (MusEUtil::LowerLeft | MusEUtil::LowerRight ) ); +          p_bottom = p_bottom.subtracted(p_light_green); + +          // Red section: +          p.fillPath(p_top & rectp, QBrush(darkGradRed));      // dark red   + +          // Yellow section: +          pr.setTop(y1); pr.setHeight(y2-y1); +          p.fillRect(pr & rect, QBrush(darkGradYellow));   // dark yellow + +          // Green section: +          p.fillPath(p_bottom & rectp, QBrush(darkGradGreen));    // dark green +          p.fillPath(p_light_green & rectp, QBrush(lightGradGreen));   // light green +        } + +        pr.setTop(y1); pr.setHeight(1); +        p.fillRect(pr & rect, separator_color); +        pr.setTop(y2); //pr.setHeight(1); +        p.fillRect(pr & rect, separator_color); + +      }   +      else +      { +        darkGradGreen.setStart(QPointF(0, 0)); +        darkGradGreen.setFinalStop(QPointF(0, h)); + +        lightGradGreen.setStart(QPointF(0, 0)); +        lightGradGreen.setFinalStop(QPointF(0, h)); + +        // We need to draw the meter in two parts. The cutoff for upper rectangle can be +        // anywhere between yrad and h-yrad. Without loss of generality we pick the lower limit. +        int cut = yrad; + +        QPainterPath p_top = MusEUtil::roundedPath(0, 0, w, cut, +                                         xrad, yrad, +                                         (MusEUtil::Corner) (MusEUtil::UpperLeft | MusEUtil::UpperRight ) ); + +        QPainterPath p_bottom = MusEUtil::roundedPath(0, cut, w, h-cut, +                                            xrad, yrad, +                                            (MusEUtil::Corner) (MusEUtil::LowerLeft | MusEUtil::LowerRight ) ); + +        if(yv < cut) +        { + +          QPainterPath p_dark = MusEUtil::roundedPath(0, 0, w, yv, +                                            xrad, yrad, +                                            (MusEUtil::Corner) (MusEUtil::UpperLeft | MusEUtil::UpperRight ) ); + +          p_top = p_top.subtracted(p_dark); + +          // top section: +          p.fillPath(p_dark & rectp, QBrush(darkGradGreen));       // dark green +          p.fillPath(p_top & rectp, QBrush(lightGradGreen));      // light green + +          // bottom section: +          p.fillPath(p_bottom & rectp, QBrush(lightGradGreen));      // light green +        } +        else +        { +          QPainterPath p_light = MusEUtil::roundedPath(0, yv, w, h-yv, +                                                   xrad, yrad, +                                                   (MusEUtil::Corner) (MusEUtil::LowerLeft | MusEUtil::LowerRight ) ); +          p_bottom = p_bottom.subtracted(p_light); + +          // top section: +          p.fillPath(p_top & rectp, QBrush(darkGradGreen));       // dark green + +          // bottom section: +          p.fillPath(p_bottom & rectp, QBrush(darkGradGreen));       // dark green +          p.fillPath(p_light & rectp, QBrush(lightGradGreen));      // light green +        } + +      } +      */ +       +  #else +       +      QRect pr(0, 0,  w, 0); +      if(mtype == DBMeter) +      { +        double range = maxScale - minScale; +        int y1 = int((maxScale - redScale) * h / range); +        int y2 = int((maxScale - yellowScale) * h / range); +         +        if(yv < y1) +        { +          // Red section: +          pr.setTop(0); pr.setHeight(yv); +          p.fillRect(pr & rect, QBrush(0x8e0000));     // dark red   +          pr.setTop(yv); pr.setHeight(y1-yv); +          p.fillRect(pr & rect, QBrush(0xff0000));     // light red +           +          // Yellow section: +          pr.setTop(y1); pr.setHeight(y2-y1); +          p.fillRect(pr & rect, QBrush(0xffff00));     // light yellow +           +          // Green section: +          pr.setTop(y2); pr.setHeight(h-y2); +          p.fillRect(pr & rect, QBrush(0x00ff00));     // light green +        } +        else +        if(yv < y2) +        { +          // Red section: +          pr.setTop(0); pr.setHeight(y1); +          p.fillRect(pr & rect, QBrush(0x8e0000));     // dark red   +           +          // Yellow section: +          pr.setTop(y1); pr.setHeight(yv-y1); +          p.fillRect(pr & rect, QBrush(0x8e8e00));     // dark yellow +          pr.setTop(yv); pr.setHeight(y2-yv); +          p.fillRect(pr & rect, QBrush(0xffff00));     // light yellow +           +          // Green section: +          pr.setTop(y2); pr.setHeight(h-y2); +          p.fillRect(pr & rect, QBrush(0x00ff00));     // light green +        } +        else +        //if(yv <= y3)    +        { +          // Red section: +          pr.setTop(0); pr.setHeight(y1); +          p.fillRect(pr & rect, QBrush(0x8e0000));     // dark red   +           +          // Yellow section: +          pr.setTop(y1); pr.setHeight(y2-y1); +          p.fillRect(pr & rect, QBrush(0x8e8e00));     // dark yellow +           +          // Green section: +          pr.setTop(y2); pr.setHeight(yv-y2); +          p.fillRect(pr & rect, QBrush(0x007000));     // dark green +          pr.setTop(yv); pr.setHeight(h-yv); +          p.fillRect(pr & rect, QBrush(0x00ff00));     // light green +        } +      }   +      else +      { +        pr.setTop(0); pr.setHeight(yv); +        p.fillRect(pr & rect, QBrush(0x007000));   // dark green +        pr.setTop(yv); pr.setHeight(h-yv); +        p.fillRect(pr & rect, QBrush(0x00ff00));   // light green +      } +       +  #endif  }  //---------------------------------------------------------  //   resizeEvent  //--------------------------------------------------------- -  void Meter::resizeEvent(QResizeEvent* /*ev*/) +void Meter::resizeEvent(QResizeEvent* /*ev*/)      {   +      cur_yv = -1;  // Force re-initialization.      }  //--------------------------------------------------------- diff --git a/muse2/muse/widgets/meter.h b/muse2/muse/widgets/meter.h index 06f35ca2..ba816319 100644 --- a/muse2/muse/widgets/meter.h +++ b/muse2/muse/widgets/meter.h @@ -6,6 +6,7 @@  //  //  (C) Copyright 2000 Werner Schweer (ws@seh.de)  //  (C) Copyright 2011 Orcan Ogetbil (ogetbilo at sf.net) +//  (C) Copyright 2011 Tim E. Real (terminator356 on users DOT sourceforge DOT net)  //  //  This program is free software; you can redistribute it and/or  //  modify it under the terms of the GNU General Public License @@ -81,8 +82,9 @@ class Meter : public QFrame {        double maxVal;        double minScale, maxScale;        int yellowScale, redScale; +      int cur_yv, last_yv; -      void drawVU(QPainter& p, int, int, int); +      void drawVU(QPainter& p, const QRect&, int);        void paintEvent(QPaintEvent*);        void resizeEvent(QResizeEvent*); | 
