avoid recreating effectframes/textures on setPosition; correct position after setAlignment
svn path=/trunk/KDE/kdebase/workspace/; revision=1203489
This commit is contained in:
parent
874d06980d
commit
48447a3d26
5 changed files with 45 additions and 31 deletions
46
effects.cpp
46
effects.cpp
|
@ -1837,20 +1837,38 @@ Qt::Alignment EffectFrameImpl::alignment() const
|
||||||
return m_alignment;
|
return m_alignment;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
EffectFrameImpl::align( QRect &geometry )
|
||||||
|
{
|
||||||
|
if( m_alignment & Qt::AlignLeft )
|
||||||
|
geometry.moveLeft( m_point.x() );
|
||||||
|
else if( m_alignment & Qt::AlignRight )
|
||||||
|
geometry.moveLeft( m_point.x() - geometry.width() );
|
||||||
|
else
|
||||||
|
geometry.moveLeft( m_point.x() - geometry.width() / 2 );
|
||||||
|
if( m_alignment & Qt::AlignTop )
|
||||||
|
geometry.moveTop( m_point.y() );
|
||||||
|
else if( m_alignment & Qt::AlignBottom )
|
||||||
|
geometry.moveTop( m_point.y() - geometry.height() );
|
||||||
|
else
|
||||||
|
geometry.moveTop( m_point.y() - geometry.height() / 2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void EffectFrameImpl::setAlignment( Qt::Alignment alignment )
|
void EffectFrameImpl::setAlignment( Qt::Alignment alignment )
|
||||||
{
|
{
|
||||||
m_alignment = alignment;
|
m_alignment = alignment;
|
||||||
|
align( m_geometry );
|
||||||
|
setGeometry( m_geometry );
|
||||||
}
|
}
|
||||||
|
|
||||||
void EffectFrameImpl::setPosition( const QPoint& point )
|
void EffectFrameImpl::setPosition( const QPoint& point )
|
||||||
{
|
{
|
||||||
if( m_point == point )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
m_point = point;
|
m_point = point;
|
||||||
autoResize();
|
QRect geometry = m_geometry; // this is important, setGeometry need call repaint for old & new geometry
|
||||||
free();
|
align( geometry );
|
||||||
|
setGeometry( geometry );
|
||||||
}
|
}
|
||||||
|
|
||||||
const QString& EffectFrameImpl::text() const
|
const QString& EffectFrameImpl::text() const
|
||||||
|
@ -1898,7 +1916,6 @@ void EffectFrameImpl::autoResize()
|
||||||
return; // Not automatically resizing
|
return; // Not automatically resizing
|
||||||
|
|
||||||
QRect geometry;
|
QRect geometry;
|
||||||
|
|
||||||
// Set size
|
// Set size
|
||||||
if( !m_text.isEmpty() )
|
if( !m_text.isEmpty() )
|
||||||
{
|
{
|
||||||
|
@ -1912,20 +1929,7 @@ void EffectFrameImpl::autoResize()
|
||||||
geometry.setHeight( m_iconSize.height() );
|
geometry.setHeight( m_iconSize.height() );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set position
|
align( geometry );
|
||||||
if( m_alignment & Qt::AlignLeft )
|
|
||||||
geometry.moveLeft( m_point.x() );
|
|
||||||
else if( m_alignment & Qt::AlignRight )
|
|
||||||
geometry.moveLeft( m_point.x() - geometry.width() );
|
|
||||||
else
|
|
||||||
geometry.moveLeft( m_point.x() - geometry.width() / 2 );
|
|
||||||
if( m_alignment & Qt::AlignTop )
|
|
||||||
geometry.moveTop( m_point.y() );
|
|
||||||
else if( m_alignment & Qt::AlignBottom )
|
|
||||||
geometry.moveTop( m_point.y() - geometry.height() );
|
|
||||||
else
|
|
||||||
geometry.moveTop( m_point.y() - geometry.height() / 2 );
|
|
||||||
|
|
||||||
setGeometry( geometry );
|
setGeometry( geometry );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -374,7 +374,7 @@ class EffectFrameImpl
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Q_DISABLE_COPY( EffectFrameImpl ) // As we need to use Qt slots we cannot copy this class
|
Q_DISABLE_COPY( EffectFrameImpl ) // As we need to use Qt slots we cannot copy this class
|
||||||
|
void align( QRect &geometry ); // positions geometry around m_point respecting m_alignment
|
||||||
void autoResize(); // Auto-resize if not a static size
|
void autoResize(); // Auto-resize if not a static size
|
||||||
|
|
||||||
EffectFrameStyle m_style;
|
EffectFrameStyle m_style;
|
||||||
|
|
|
@ -434,19 +434,21 @@ void GLTexture::unbind()
|
||||||
|
|
||||||
void GLTexture::render( QRegion region, const QRect& rect )
|
void GLTexture::render( QRegion region, const QRect& rect )
|
||||||
{
|
{
|
||||||
if( rect != m_cachedGeometry )
|
if( rect.size() != m_cachedSize )
|
||||||
{
|
{
|
||||||
m_cachedGeometry = rect;
|
m_cachedSize = rect.size();
|
||||||
|
QRect r(rect);
|
||||||
|
r.moveTo(0,0);
|
||||||
if( !m_vbo )
|
if( !m_vbo )
|
||||||
{
|
{
|
||||||
m_vbo = new GLVertexBuffer( KWin::GLVertexBuffer::Static );
|
m_vbo = new GLVertexBuffer( KWin::GLVertexBuffer::Static );
|
||||||
}
|
}
|
||||||
const float verts[ 4 * 2 ] =
|
const float verts[ 4 * 2 ] =
|
||||||
{
|
{ // NOTICE: r.x/y could be replaced by "0", but that would make it unreadable...
|
||||||
rect.x(), rect.y(),
|
r.x(), r.y(),
|
||||||
rect.x(), rect.y() + rect.height(),
|
r.x(), r.y() + rect.height(),
|
||||||
rect.x() + rect.width(), rect.y(),
|
r.x() + rect.width(), r.y(),
|
||||||
rect.x() + rect.width(), rect.y() + rect.height()
|
r.x() + rect.width(), r.y() + rect.height()
|
||||||
};
|
};
|
||||||
const float texcoords[ 4 * 2 ] =
|
const float texcoords[ 4 * 2 ] =
|
||||||
{
|
{
|
||||||
|
@ -457,7 +459,9 @@ void GLTexture::render( QRegion region, const QRect& rect )
|
||||||
};
|
};
|
||||||
m_vbo->setData( 4, 2, verts, texcoords );
|
m_vbo->setData( 4, 2, verts, texcoords );
|
||||||
}
|
}
|
||||||
|
glTranslatef( rect.x(), rect.y(), 0.0f );
|
||||||
m_vbo->render( region, GL_TRIANGLE_STRIP );
|
m_vbo->render( region, GL_TRIANGLE_STRIP );
|
||||||
|
glTranslatef( -rect.x(), -rect.y(), 0.0f );
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLTexture::enableUnnormalizedTexCoords()
|
void GLTexture::enableUnnormalizedTexCoords()
|
||||||
|
|
|
@ -198,7 +198,7 @@ class KWIN_EXPORT GLTexture
|
||||||
int mUnnormalizeActive; // 0 - no, otherwise refcount
|
int mUnnormalizeActive; // 0 - no, otherwise refcount
|
||||||
int mNormalizeActive; // 0 - no, otherwise refcount
|
int mNormalizeActive; // 0 - no, otherwise refcount
|
||||||
GLVertexBuffer* m_vbo;
|
GLVertexBuffer* m_vbo;
|
||||||
QRect m_cachedGeometry;
|
QSize m_cachedSize;
|
||||||
|
|
||||||
static bool mNPOTTextureSupported;
|
static bool mNPOTTextureSupported;
|
||||||
static bool mFramebufferObjectSupported;
|
static bool mFramebufferObjectSupported;
|
||||||
|
|
|
@ -2049,7 +2049,10 @@ void SceneOpenGL::EffectFrame::render( QRegion region, double opacity, double fr
|
||||||
if( !m_unstyledVBO )
|
if( !m_unstyledVBO )
|
||||||
{
|
{
|
||||||
m_unstyledVBO = new GLVertexBuffer( GLVertexBuffer::Static );
|
m_unstyledVBO = new GLVertexBuffer( GLVertexBuffer::Static );
|
||||||
const QRect& area = m_effectFrame->geometry().adjusted( -5, -5, 5, 5 );
|
QRect area = m_effectFrame->geometry();
|
||||||
|
area.moveTo(0,0);
|
||||||
|
area.adjust( -5, -5, 5, 5 );
|
||||||
|
|
||||||
const int roundness = 5;
|
const int roundness = 5;
|
||||||
QVector<float> verts, texCoords;
|
QVector<float> verts, texCoords;
|
||||||
verts.reserve( 84 );
|
verts.reserve( 84 );
|
||||||
|
@ -2156,7 +2159,10 @@ void SceneOpenGL::EffectFrame::render( QRegion region, double opacity, double fr
|
||||||
glColor4f( 0.0, 0.0, 0.0, opacity * frameOpacity );
|
glColor4f( 0.0, 0.0, 0.0, opacity * frameOpacity );
|
||||||
|
|
||||||
m_unstyledTexture->bind();
|
m_unstyledTexture->bind();
|
||||||
|
const QPoint pt = m_effectFrame->geometry().topLeft();
|
||||||
|
glTranslatef( pt.x(), pt.y(), 0.0f );
|
||||||
m_unstyledVBO->render( region, GL_TRIANGLES );
|
m_unstyledVBO->render( region, GL_TRIANGLES );
|
||||||
|
glTranslatef( -pt.x(), -pt.y(), 0.0f );
|
||||||
m_unstyledTexture->unbind();
|
m_unstyledTexture->unbind();
|
||||||
}
|
}
|
||||||
else if( m_effectFrame->style() == EffectFrameStyled )
|
else if( m_effectFrame->style() == EffectFrameStyled )
|
||||||
|
|
Loading…
Reference in a new issue