From d2fef6cb1a0293a000edbf87fd566574b6e8ae51 Mon Sep 17 00:00:00 2001
From: Mark Kretschmann <kretschmann@kde.org>
Date: Sat, 19 Oct 2013 16:48:12 +0200
Subject: [PATCH 071/448] Fix rendering glitch introduced with commit f4a3f4f.
CCBUG: 323635
BACKPORT
---
src/context/applets/analyzer/BlockAnalyzer.cpp | 47 ++++++++++++--------------
src/context/applets/analyzer/BlockAnalyzer.h | 31 ++++++++++++++---
2 files changed, 48 insertions(+), 30 deletions(-)
diff --git a/src/context/applets/analyzer/BlockAnalyzer.cpp b/src/context/applets/analyzer/BlockAnalyzer.cpp
index 03fefae..1cf85d1 100644
--- a/src/context/applets/analyzer/BlockAnalyzer.cpp
+++ b/src/context/applets/analyzer/BlockAnalyzer.cpp
@@ -35,12 +35,9 @@ BlockAnalyzer::BlockAnalyzer( QWidget *parent )
, m_columns( 0 ) //int
, m_rows( 0 ) //int
, m_y( 0 ) //uint
- , m_barTexture( 0 )
- , m_topBarTexture( 0 )
, m_fade_bars( FADE_SIZE ) //vector<QPixmap>
, m_fade_pos( MAX_COLUMNS, 50 ) //vector<uint>
, m_fade_intensity( MAX_COLUMNS, 32 ) //vector<uint>
- , m_background( 0 )
{
setObjectName( "Blocky" );
setMaximumWidth( MAX_COLUMNS * ( BLOCK_WIDTH + 1 ) - 1 );
@@ -49,11 +46,11 @@ BlockAnalyzer::BlockAnalyzer( QWidget *parent )
BlockAnalyzer::~BlockAnalyzer()
{
- deleteTexture( m_barTexture );
- deleteTexture( m_topBarTexture );
+ deleteTexture( m_barTexture.id );
+ deleteTexture( m_topBarTexture.id );
- foreach( GLuint id, m_fade_bars )
- deleteTexture( id );
+ foreach( Texture texture, m_fade_bars )
+ deleteTexture( texture.id );
}
void
@@ -158,7 +155,7 @@ BlockAnalyzer::paintGL()
glLoadIdentity();
// Paint the background
- drawTexture( m_background, 0, 0, 0, 0, width(), height() );
+ drawTexture( m_background, 0, 0, 0, 0 );
for( uint y, x = 0; x < (uint)m_scope.size(); ++x )
{
@@ -186,32 +183,32 @@ BlockAnalyzer::paintGL()
const uint offset = --m_fade_intensity[x];
const uint y = m_y + ( m_fade_pos[x] * ( BLOCK_HEIGHT + 1 ) );
if( y < (uint)height() )
- drawTexture( m_fade_bars[offset], x * ( BLOCK_WIDTH + 1 ), y, 0, 0, BLOCK_WIDTH, height() );
+ drawTexture( m_fade_bars[offset], x * ( BLOCK_WIDTH + 1 ), y, 0, 0 );
}
if( m_fade_intensity[x] == 0 )
m_fade_pos[x] = m_rows;
// REMEMBER: y is a number from 0 to m_rows, 0 means all blocks are glowing, m_rows means none are
- drawTexture( m_barTexture, x * ( BLOCK_WIDTH + 1 ), y * ( BLOCK_HEIGHT + 1 ) + m_y, 0, y * ( BLOCK_HEIGHT + 1 ), m_barPixmap.width(), m_barPixmap.height() );
+ drawTexture( m_barTexture, x * ( BLOCK_WIDTH + 1 ), y * ( BLOCK_HEIGHT + 1 ) + m_y, 0, y * ( BLOCK_HEIGHT + 1 ) );
// Draw top bar
- drawTexture( m_topBarTexture, x * ( BLOCK_WIDTH + 1 ), int( m_store[x] ) * ( BLOCK_HEIGHT + 1 ) + m_y, 0, 0, BLOCK_WIDTH, BLOCK_HEIGHT );
+ drawTexture( m_topBarTexture, x * ( BLOCK_WIDTH + 1 ), int( m_store[x] ) * ( BLOCK_HEIGHT + 1 ) + m_y, 0, 0 );
}
}
void
-BlockAnalyzer::drawTexture( GLuint textureId, int x, int y, int sx, int sy, int w, int h )
+BlockAnalyzer::drawTexture( Texture texture, int x, int y, int sx, int sy )
{
const GLfloat xf = x;
const GLfloat yf = y;
- const GLfloat sxf = (GLfloat)sx / m_barPixmap.width();
- const GLfloat syf = (GLfloat)sy / m_barPixmap.height();
- const GLfloat wf = w - sx;
- const GLfloat hf = h - sy;
+ const GLfloat wf = texture.size.width() - sx;
+ const GLfloat hf = texture.size.height() - sy;
+ const GLfloat sxf = (GLfloat)sx / texture.size.width();
+ const GLfloat syf = (GLfloat)sy / texture.size.height();
glEnable( GL_TEXTURE_2D );
- glBindTexture( GL_TEXTURE_2D, textureId );
+ glBindTexture( GL_TEXTURE_2D, texture.id );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
@@ -237,8 +234,8 @@ BlockAnalyzer::paletteChange( const QPalette& ) //virtual
QPixmap topBar( BLOCK_WIDTH, BLOCK_HEIGHT );
topBar.fill( fg );
- deleteTexture( m_topBarTexture );
- m_topBarTexture = bindTexture( topBar );
+ deleteTexture( m_topBarTexture.id );
+ m_topBarTexture = Texture( bindTexture( topBar ), topBar.size() );
const double dr = 15 * double( bg.red() - fg.red() ) / ( m_rows * 16 );
const double dg = 15 * double( bg.green() - fg.green() ) / ( m_rows * 16 );
@@ -275,14 +272,14 @@ BlockAnalyzer::paletteChange( const QPalette& ) //virtual
for( int z = 0; z < m_rows; ++z )
f.fillRect( 0, z * ( BLOCK_HEIGHT + 1 ), BLOCK_WIDTH, BLOCK_HEIGHT, QColor( r + int( dr * Y ), g + int( dg * Y ), b + int( db * Y ) ) );
- deleteTexture( m_fade_bars[y] );
- m_fade_bars[y] = bindTexture( fadeBar );
+ deleteTexture( m_fade_bars[y].id );
+ m_fade_bars[y] = Texture( bindTexture( fadeBar ), fadeBar.size() );
}
}
const QImage image = m_barPixmap.toImage();
- deleteTexture( m_barTexture );
- m_barTexture = bindTexture( image.mirrored() ); // Flip vertically because OpenGL has inverted y coordinates
+ deleteTexture( m_barTexture.id );
+ m_barTexture = Texture( bindTexture( image.mirrored() ), image.size() ); // Flip vertically because OpenGL has inverted y coordinates
drawBackground();
}
@@ -301,6 +298,6 @@ BlockAnalyzer::drawBackground()
for( int y = 0; y < m_rows; ++y )
p.fillRect( x * ( BLOCK_WIDTH + 1 ), y * ( BLOCK_HEIGHT + 1 ) + m_y, BLOCK_WIDTH, BLOCK_HEIGHT, bgdark );
- deleteTexture( m_background );
- m_background = bindTexture( background );
+ deleteTexture( m_background.id );
+ m_background = Texture( bindTexture( background ), background.size() );
}
diff --git a/src/context/applets/analyzer/BlockAnalyzer.h b/src/context/applets/analyzer/BlockAnalyzer.h
index 318289a..50097b7 100644
--- a/src/context/applets/analyzer/BlockAnalyzer.h
+++ b/src/context/applets/analyzer/BlockAnalyzer.h
@@ -20,6 +20,8 @@
#include "AnalyzerBase.h"
+#include <QSize>
+
class QMouseEvent;
class QPalette;
class QResizeEvent;
@@ -50,21 +52,40 @@ protected:
void determineStep();
private:
- void drawTexture( GLuint textureId, int x, int y, int sx, int sy, int w, int h );
+ struct Texture
+ {
+ Texture() :
+ id( 0 ),
+ size( QSize() )
+ {}
+ Texture( const GLuint id_, const QSize size_ ) :
+ id( id_ ),
+ size( size_ )
+ {}
+ Texture( const Texture& texture )
+ {
+ id = texture.id;
+ size = texture.size;
+ }
+ GLuint id;
+ QSize size;
+ };
+
+ void drawTexture( Texture texture, int x, int y, int sx, int sy );
int m_columns, m_rows; //number of rows and columns of blocks
uint m_y; //y-offset from top of widget
- GLuint m_barTexture;
- GLuint m_topBarTexture;
+ Texture m_barTexture;
+ Texture m_topBarTexture;
QPixmap m_barPixmap;
QVector<float> m_scope; //so we don't create a vector every frame
QVector<float> m_store; //current bar heights
QVector<float> m_yscale;
- QVector<GLuint> m_fade_bars;
+ QVector<Texture> m_fade_bars;
QVector<uint> m_fade_pos;
QVector<int> m_fade_intensity;
- GLuint m_background;
+ Texture m_background;
float m_step; //rows to fall per frame
};
--
1.9.3