mirror of
https://github.com/ElvishArtisan/rivendell.git
synced 2025-10-18 00:21:21 +02:00
2021-02-25 Fred Gleason <fredg@paravelsystems.com>
* Fixed regressions in metering code that caused visual artifacts. Signed-off-by: Fred Gleason <fredg@paravelsystems.com>
This commit is contained in:
@@ -17,6 +17,18 @@
|
||||
// License along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
//
|
||||
//
|
||||
|
||||
#include <QString>
|
||||
#include <QColor>
|
||||
#include <QPainter>
|
||||
#include <QPushButton>
|
||||
#include <QPixmap>
|
||||
#include <QPaintEvent>
|
||||
#include <stdio.h>
|
||||
#include <QSlider>
|
||||
#include <QSizePolicy>
|
||||
#include <QMessageBox>
|
||||
|
||||
#include "rdsegmeter.h"
|
||||
|
||||
@@ -24,9 +36,6 @@ RDSegMeter::RDSegMeter(RDSegMeter::Orientation o,QWidget *parent)
|
||||
: QWidget(parent)
|
||||
{
|
||||
orient=o;
|
||||
QPalette pal=palette();
|
||||
pal.setColor(QPalette::Background,Qt::black);
|
||||
setPalette(pal);
|
||||
dark_low_color=QColor(DEFAULT_DARK_LOW_COLOR);
|
||||
dark_high_color=QColor(DEFAULT_DARK_HIGH_COLOR);
|
||||
dark_clip_color=QColor(DEFAULT_DARK_CLIP_COLOR);
|
||||
@@ -64,7 +73,7 @@ void RDSegMeter::setRange(int min,int max)
|
||||
{
|
||||
range_min=min;
|
||||
range_max=max;
|
||||
repaint();
|
||||
update();
|
||||
}
|
||||
|
||||
|
||||
@@ -72,7 +81,7 @@ void RDSegMeter::setDarkLowColor(QColor color)
|
||||
{
|
||||
if(dark_low_color!=color) {
|
||||
dark_low_color=color;
|
||||
repaint();
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,7 +90,7 @@ void RDSegMeter::setDarkHighColor(QColor color)
|
||||
{
|
||||
if(dark_high_color!=color) {
|
||||
dark_high_color=color;
|
||||
repaint();
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -90,7 +99,7 @@ void RDSegMeter::setDarkClipColor(QColor color)
|
||||
{
|
||||
if(dark_clip_color!=color) {
|
||||
dark_clip_color=color;
|
||||
repaint();
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -99,7 +108,7 @@ void RDSegMeter::setLowColor(QColor color)
|
||||
{
|
||||
if(low_color!=color) {
|
||||
low_color=color;
|
||||
repaint();
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -108,7 +117,7 @@ void RDSegMeter::setHighColor(QColor color)
|
||||
{
|
||||
if(high_color!=color) {
|
||||
high_color=color;
|
||||
repaint();
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -117,7 +126,7 @@ void RDSegMeter::setClipColor(QColor color)
|
||||
{
|
||||
if(clip_color!=color) {
|
||||
clip_color=color;
|
||||
repaint();
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -126,7 +135,7 @@ void RDSegMeter::setHighThreshold(int level)
|
||||
{
|
||||
if(high_threshold!=level) {
|
||||
high_threshold=level;
|
||||
repaint();
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -135,7 +144,7 @@ void RDSegMeter::setClipThreshold(int level)
|
||||
{
|
||||
if(clip_threshold!=level) {
|
||||
clip_threshold=level;
|
||||
repaint();
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -150,16 +159,16 @@ void RDSegMeter::setMode(RDSegMeter::Mode mode)
|
||||
{
|
||||
seg_mode=mode;
|
||||
switch(seg_mode) {
|
||||
case RDSegMeter::Independent:
|
||||
if(peak_timer->isActive()) {
|
||||
peak_timer->stop();
|
||||
}
|
||||
break;
|
||||
case RDSegMeter::Peak:
|
||||
if(!peak_timer->isActive()) {
|
||||
peak_timer->start(PEAK_HOLD_TIME);
|
||||
}
|
||||
break;
|
||||
case RDSegMeter::Independent:
|
||||
if(peak_timer->isActive()) {
|
||||
peak_timer->stop();
|
||||
}
|
||||
break;
|
||||
case RDSegMeter::Peak:
|
||||
if(!peak_timer->isActive()) {
|
||||
peak_timer->start(PEAK_HOLD_TIME);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -168,7 +177,7 @@ void RDSegMeter::setSolidBar(int level)
|
||||
{
|
||||
if((seg_mode==RDSegMeter::Independent)&&(solid_bar!=level)) {
|
||||
solid_bar=level;
|
||||
repaint();
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -177,7 +186,7 @@ void RDSegMeter::setFloatingBar(int level)
|
||||
{
|
||||
if((seg_mode==RDSegMeter::Independent)&&(solid_bar!=level)) {
|
||||
floating_bar=level;
|
||||
repaint();
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -193,7 +202,7 @@ void RDSegMeter::setPeakBar(int level)
|
||||
if(solid_bar<range_min) {
|
||||
floating_bar=solid_bar;
|
||||
}
|
||||
repaint();
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -202,7 +211,7 @@ void RDSegMeter::setSegmentSize(int size)
|
||||
{
|
||||
if(seg_size!=size) {
|
||||
seg_size=size;
|
||||
repaint();
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -211,7 +220,6 @@ void RDSegMeter::setSegmentGap(int gap)
|
||||
{
|
||||
if(seg_gap!=gap) {
|
||||
seg_gap=gap;
|
||||
repaint();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -229,10 +237,10 @@ void RDSegMeter::paintEvent(QPaintEvent *paintEvent)
|
||||
// Setup
|
||||
//
|
||||
QPixmap pix(this->size());
|
||||
pix.fill(this,0,0);
|
||||
|
||||
int seg_total=seg_size+seg_gap;
|
||||
QPainter *p=new QPainter(&pix);
|
||||
p->fillRect(0,0,width(),height(),Qt::black);
|
||||
|
||||
low_region=0;
|
||||
high_region=0;
|
||||
clip_region=0;
|
||||
@@ -243,14 +251,14 @@ void RDSegMeter::paintEvent(QPaintEvent *paintEvent)
|
||||
// Set Orientation
|
||||
//
|
||||
switch(orient) {
|
||||
case RDSegMeter::Left:
|
||||
case RDSegMeter::Up:
|
||||
p->translate(width(),height());
|
||||
p->rotate(180);
|
||||
break;
|
||||
case RDSegMeter::Left:
|
||||
case RDSegMeter::Up:
|
||||
p->translate(width(),height());
|
||||
p->rotate(180);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
@@ -263,26 +271,27 @@ void RDSegMeter::paintEvent(QPaintEvent *paintEvent)
|
||||
op_pt=solid_bar;
|
||||
}
|
||||
switch(orient) {
|
||||
case RDSegMeter::Left:
|
||||
case RDSegMeter::Right:
|
||||
low_region=(int)((double)(op_pt-range_min)/
|
||||
(double)(range_max-range_min)*width()/seg_total);
|
||||
if(op_pt>range_min) {
|
||||
for(int i=0;i<low_region;i++) {
|
||||
p->fillRect(i*seg_total,0,seg_size,height(),low_color);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case RDSegMeter::Down:
|
||||
case RDSegMeter::Up:
|
||||
low_region=(int)((double)(op_pt-range_min)/
|
||||
(double)(range_max-range_min)*height()/seg_total);
|
||||
if(op_pt>range_min) {
|
||||
for(int i=0;i<low_region;i++) {
|
||||
p->fillRect(0,i*seg_total,width(),seg_size,low_color);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case RDSegMeter::Left:
|
||||
case RDSegMeter::Right:
|
||||
low_region=(int)((double)(op_pt-range_min)/
|
||||
(double)(range_max-range_min)*width()/seg_total);
|
||||
if(op_pt>range_min) {
|
||||
for(int i=0;i<low_region;i++) {
|
||||
p->fillRect(i*seg_total,0,seg_size,height(),low_color);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case RDSegMeter::Down:
|
||||
case RDSegMeter::Up:
|
||||
low_region=(int)((double)(op_pt-range_min)/
|
||||
(double)(range_max-range_min)*height()/seg_total);
|
||||
if(op_pt>range_min) {
|
||||
for(int i=0;i<low_region;i++) {
|
||||
p->fillRect(0,i*seg_total,width(),seg_size,low_color);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
@@ -295,26 +304,27 @@ void RDSegMeter::paintEvent(QPaintEvent *paintEvent)
|
||||
op_pt=solid_bar;
|
||||
}
|
||||
switch(orient) {
|
||||
case RDSegMeter::Left:
|
||||
case RDSegMeter::Right:
|
||||
high_region=(int)((double)(op_pt-high_threshold)/
|
||||
(double)(range_max-range_min)*width()/seg_total);
|
||||
if(op_pt>high_threshold) {
|
||||
for(int i=low_region;i<low_region+high_region;i++) {
|
||||
p->fillRect(i*seg_total,0,seg_size,height(),high_color);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case RDSegMeter::Down:
|
||||
case RDSegMeter::Up:
|
||||
high_region=(int)((double)(op_pt-high_threshold)/
|
||||
(double)(range_max-range_min)*height()/seg_total);
|
||||
if(op_pt>high_threshold) {
|
||||
for(int i=low_region;i<low_region+high_region;i++) {
|
||||
p->fillRect(0,i*seg_total,width(),seg_size,high_color);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case RDSegMeter::Left:
|
||||
case RDSegMeter::Right:
|
||||
high_region=(int)((double)(op_pt-high_threshold)/
|
||||
(double)(range_max-range_min)*width()/seg_total);
|
||||
if(op_pt>high_threshold) {
|
||||
for(int i=low_region;i<low_region+high_region;i++) {
|
||||
p->fillRect(i*seg_total,0,seg_size,height(),high_color);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case RDSegMeter::Down:
|
||||
case RDSegMeter::Up:
|
||||
high_region=(int)((double)(op_pt-high_threshold)/
|
||||
(double)(range_max-range_min)*height()/seg_total);
|
||||
if(op_pt>high_threshold) {
|
||||
for(int i=low_region;i<low_region+high_region;i++) {
|
||||
p->fillRect(0,i*seg_total,width(),seg_size,high_color);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
@@ -327,54 +337,56 @@ void RDSegMeter::paintEvent(QPaintEvent *paintEvent)
|
||||
op_pt=solid_bar;
|
||||
}
|
||||
switch(orient) {
|
||||
case RDSegMeter::Left:
|
||||
case RDSegMeter::Right:
|
||||
clip_region=(int)((double)(op_pt-clip_threshold)/
|
||||
(double)(range_max-range_min)*width()/seg_total);
|
||||
if(op_pt>clip_threshold) {
|
||||
for(int i=low_region+high_region;
|
||||
i<low_region+high_region+clip_region;i++) {
|
||||
p->fillRect(i*seg_total,0,seg_size,height(),clip_color);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case RDSegMeter::Down:
|
||||
case RDSegMeter::Up:
|
||||
clip_region=(int)((double)(op_pt-range_min)/
|
||||
(double)(range_max-range_min)*height()/seg_total);
|
||||
if(op_pt>clip_threshold) {
|
||||
for(int i=low_region+high_region;
|
||||
i<low_region+high_region+clip_region;i++) {
|
||||
p->fillRect(0,i*seg_total,width(),seg_size,clip_color);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case RDSegMeter::Left:
|
||||
case RDSegMeter::Right:
|
||||
clip_region=(int)((double)(op_pt-clip_threshold)/
|
||||
(double)(range_max-range_min)*width()/seg_total);
|
||||
if(op_pt>clip_threshold) {
|
||||
for(int i=low_region+high_region;
|
||||
i<low_region+high_region+clip_region;i++) {
|
||||
p->fillRect(i*seg_total,0,seg_size,height(),clip_color);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case RDSegMeter::Down:
|
||||
case RDSegMeter::Up:
|
||||
clip_region=(int)((double)(op_pt-range_min)/
|
||||
(double)(range_max-range_min)*height()/seg_total);
|
||||
if(op_pt>clip_threshold) {
|
||||
for(int i=low_region+high_region;
|
||||
i<low_region+high_region+clip_region;i++) {
|
||||
p->fillRect(0,i*seg_total,width(),seg_size,clip_color);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
// The dark low range
|
||||
//
|
||||
switch(orient) {
|
||||
case RDSegMeter::Left:
|
||||
case RDSegMeter::Right:
|
||||
dark_low_region=(int)((double)(high_threshold-range_min)/
|
||||
(double)(range_max-range_min)*width()/seg_total);
|
||||
if(op_pt<high_threshold) {
|
||||
for(int i=low_region;i<dark_low_region;i++) {
|
||||
p->fillRect(i*seg_total,0,seg_size,height(),dark_low_color);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case RDSegMeter::Down:
|
||||
case RDSegMeter::Up:
|
||||
dark_low_region=(int)((double)(high_threshold-range_min)/
|
||||
(double)(range_max-range_min)*height()/seg_total);
|
||||
if(op_pt<high_threshold) {
|
||||
for(int i=low_region;i<dark_low_region;i++) {
|
||||
p->fillRect(0,i*seg_total,width(),seg_size,dark_low_color);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case RDSegMeter::Left:
|
||||
case RDSegMeter::Right:
|
||||
dark_low_region=(int)((double)(high_threshold-range_min)/
|
||||
(double)(range_max-range_min)*width()/seg_total);
|
||||
if(op_pt<high_threshold) {
|
||||
for(int i=low_region;i<dark_low_region;i++) {
|
||||
p->fillRect(i*seg_total,0,seg_size,height(),dark_low_color);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case RDSegMeter::Down:
|
||||
case RDSegMeter::Up:
|
||||
dark_low_region=(int)((double)(high_threshold-range_min)/
|
||||
(double)(range_max-range_min)*height()/seg_total);
|
||||
if(op_pt<high_threshold) {
|
||||
for(int i=low_region;i<dark_low_region;i++) {
|
||||
p->fillRect(0,i*seg_total,width(),seg_size,dark_low_color);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
@@ -387,27 +399,28 @@ void RDSegMeter::paintEvent(QPaintEvent *paintEvent)
|
||||
op_pt=dark_low_region;
|
||||
}
|
||||
switch(orient) {
|
||||
case RDSegMeter::Left:
|
||||
case RDSegMeter::Right:
|
||||
dark_high_region=(int)((double)(clip_threshold-range_min)/
|
||||
(double)(range_max-range_min)*width()/seg_total);
|
||||
if(solid_bar<clip_threshold) {
|
||||
for(int i=op_pt;
|
||||
i<dark_high_region;i++) {
|
||||
p->fillRect(i*seg_total,0,seg_size,height(),dark_high_color);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case RDSegMeter::Down:
|
||||
case RDSegMeter::Up:
|
||||
dark_high_region=(int)((double)(clip_threshold-range_min)/
|
||||
(double)(range_max-range_min)*height()/seg_total);
|
||||
if(solid_bar<clip_threshold) {
|
||||
for(int i=op_pt;i<dark_high_region;i++) {
|
||||
p->fillRect(0,i*seg_total,width(),seg_size,dark_high_color);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case RDSegMeter::Left:
|
||||
case RDSegMeter::Right:
|
||||
dark_high_region=(int)((double)(clip_threshold-range_min)/
|
||||
(double)(range_max-range_min)*width()/seg_total);
|
||||
if(solid_bar<clip_threshold) {
|
||||
for(int i=op_pt;
|
||||
i<dark_high_region;i++) {
|
||||
p->fillRect(i*seg_total,0,seg_size,height(),dark_high_color);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case RDSegMeter::Down:
|
||||
case RDSegMeter::Up:
|
||||
dark_high_region=(int)((double)(clip_threshold-range_min)/
|
||||
(double)(range_max-range_min)*height()/seg_total);
|
||||
if(solid_bar<clip_threshold) {
|
||||
for(int i=op_pt;i<dark_high_region;i++) {
|
||||
p->fillRect(0,i*seg_total,width(),seg_size,dark_high_color);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
@@ -420,27 +433,28 @@ void RDSegMeter::paintEvent(QPaintEvent *paintEvent)
|
||||
op_pt=dark_high_region;
|
||||
}
|
||||
switch(orient) {
|
||||
case RDSegMeter::Left:
|
||||
case RDSegMeter::Right:
|
||||
dark_clip_region=(int)((double)(range_max-range_min)/
|
||||
(double)(range_max-range_min)*width()/seg_total);
|
||||
if(solid_bar<range_max) {
|
||||
for(int i=op_pt;i<dark_clip_region;i++) {
|
||||
p->fillRect(i*seg_total,0,seg_size,height(),dark_clip_color);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case RDSegMeter::Down:
|
||||
case RDSegMeter::Up:
|
||||
dark_clip_region=(int)((double)(range_max-range_min)/
|
||||
(double)(range_max-range_min)*height()/seg_total);
|
||||
if(solid_bar<range_max) {
|
||||
for(int i=op_pt;
|
||||
i<dark_clip_region;i++) {
|
||||
p->fillRect(0,i*seg_total,width(),seg_size,dark_clip_color);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case RDSegMeter::Left:
|
||||
case RDSegMeter::Right:
|
||||
dark_clip_region=(int)((double)(range_max-range_min)/
|
||||
(double)(range_max-range_min)*width()/seg_total);
|
||||
if(solid_bar<range_max) {
|
||||
for(int i=op_pt;i<dark_clip_region;i++) {
|
||||
p->fillRect(i*seg_total,0,seg_size,height(),dark_clip_color);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case RDSegMeter::Down:
|
||||
case RDSegMeter::Up:
|
||||
dark_clip_region=(int)((double)(range_max-range_min)/
|
||||
(double)(range_max-range_min)*height()/seg_total);
|
||||
if(solid_bar<range_max) {
|
||||
for(int i=op_pt;
|
||||
i<dark_clip_region;i++) {
|
||||
p->fillRect(0,i*seg_total,width(),seg_size,dark_clip_color);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
@@ -457,21 +471,21 @@ void RDSegMeter::paintEvent(QPaintEvent *paintEvent)
|
||||
float_color=clip_color;
|
||||
}
|
||||
switch(orient) {
|
||||
case RDSegMeter::Left:
|
||||
case RDSegMeter::Right:
|
||||
float_region=(int)((double)(floating_bar-range_min)/
|
||||
(double)(range_max-range_min)*width());
|
||||
float_region=seg_total*(float_region/seg_total);
|
||||
p->fillRect(float_region,0,seg_size,height(),float_color);
|
||||
break;
|
||||
case RDSegMeter::Left:
|
||||
case RDSegMeter::Right:
|
||||
float_region=(int)((double)(floating_bar-range_min)/
|
||||
(double)(range_max-range_min)*width());
|
||||
float_region=seg_total*(float_region/seg_total);
|
||||
p->fillRect(float_region,0,seg_size,height(),float_color);
|
||||
break;
|
||||
|
||||
case RDSegMeter::Down:
|
||||
case RDSegMeter::Up:
|
||||
float_region=(int)((double)(floating_bar-range_min)/
|
||||
(double)(range_max-range_min)*height());
|
||||
float_region=seg_total*(float_region/seg_total);
|
||||
p->fillRect(0,float_region,width(),seg_size,float_color);
|
||||
break;
|
||||
case RDSegMeter::Down:
|
||||
case RDSegMeter::Up:
|
||||
float_region=(int)((double)(floating_bar-range_min)/
|
||||
(double)(range_max-range_min)*height());
|
||||
float_region=seg_total*(float_region/seg_total);
|
||||
p->fillRect(0,float_region,width(),seg_size,float_color);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -486,8 +500,5 @@ void RDSegMeter::paintEvent(QPaintEvent *paintEvent)
|
||||
void RDSegMeter::peakData()
|
||||
{
|
||||
floating_bar=solid_bar;
|
||||
repaint();
|
||||
update();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user