Cache the icon texture/picture in EffectFrame and use texture from pixmap to load the data in OpenGL mode. Yeah for less pixmap to image to gltexture conversations.
Some effects (boxswitch and flipswitch) still need to be changed to not set the icon in each frame. svn path=/trunk/KDE/kdebase/workspace/; revision=1152367
This commit is contained in:
parent
73d8041d5a
commit
fa832b7aa7
6 changed files with 39 additions and 8 deletions
|
@ -1745,6 +1745,7 @@ void EffectFrameImpl::setIcon( const QPixmap& icon )
|
|||
{
|
||||
setIconSize( m_icon.size() );
|
||||
}
|
||||
m_sceneFrame->freeIconFrame();
|
||||
}
|
||||
|
||||
const QSize& EffectFrameImpl::iconSize() const
|
||||
|
@ -1760,6 +1761,7 @@ void EffectFrameImpl::setIconSize( const QSize& size )
|
|||
}
|
||||
m_iconSize = size;
|
||||
autoResize();
|
||||
m_sceneFrame->freeIconFrame();
|
||||
}
|
||||
|
||||
void EffectFrameImpl::plasmaThemeChanged()
|
||||
|
|
1
scene.h
1
scene.h
|
@ -221,6 +221,7 @@ class Scene::EffectFrame
|
|||
virtual ~EffectFrame();
|
||||
virtual void render( QRegion region, double opacity, double frameOpacity ) = 0;
|
||||
virtual void free() = 0;
|
||||
virtual void freeIconFrame() = 0;
|
||||
virtual void freeTextFrame() = 0;
|
||||
|
||||
protected:
|
||||
|
|
|
@ -1920,6 +1920,7 @@ SceneOpenGL::EffectFrame::EffectFrame( EffectFrameImpl* frame )
|
|||
: Scene::EffectFrame( frame )
|
||||
, m_texture( NULL )
|
||||
, m_textTexture( NULL )
|
||||
, m_iconTexture( NULL )
|
||||
{
|
||||
if( m_effectFrame->style() == Unstyled && !m_unstyledTexture )
|
||||
{
|
||||
|
@ -1931,6 +1932,7 @@ SceneOpenGL::EffectFrame::~EffectFrame()
|
|||
{
|
||||
delete m_texture;
|
||||
delete m_textTexture;
|
||||
delete m_iconTexture;
|
||||
}
|
||||
|
||||
void SceneOpenGL::EffectFrame::free()
|
||||
|
@ -1939,6 +1941,14 @@ void SceneOpenGL::EffectFrame::free()
|
|||
m_texture = NULL;
|
||||
delete m_textTexture;
|
||||
m_textTexture = NULL;
|
||||
delete m_iconTexture;
|
||||
m_iconTexture = NULL;
|
||||
}
|
||||
|
||||
void SceneOpenGL::EffectFrame::freeIconFrame()
|
||||
{
|
||||
delete m_iconTexture;
|
||||
m_iconTexture = NULL;
|
||||
}
|
||||
|
||||
void SceneOpenGL::EffectFrame::freeTextFrame()
|
||||
|
@ -2039,11 +2049,15 @@ void SceneOpenGL::EffectFrame::render( QRegion region, double opacity, double fr
|
|||
QPoint topLeft( m_effectFrame->geometry().x(),
|
||||
m_effectFrame->geometry().center().y() - m_effectFrame->iconSize().height() / 2 );
|
||||
|
||||
GLTexture* icon = new GLTexture( m_effectFrame->icon() ); // TODO: Cache
|
||||
icon->bind();
|
||||
icon->render( region, QRect( topLeft, m_effectFrame->iconSize() ));
|
||||
icon->unbind();
|
||||
delete icon;
|
||||
if( !m_iconTexture ) // lazy creation
|
||||
{
|
||||
m_iconTexture = new Texture( m_effectFrame->icon().handle(),
|
||||
m_effectFrame->icon().size(),
|
||||
m_effectFrame->icon().depth() );
|
||||
}
|
||||
m_iconTexture->bind();
|
||||
m_iconTexture->render( region, QRect( topLeft, m_effectFrame->iconSize() ));
|
||||
m_iconTexture->unbind();
|
||||
}
|
||||
|
||||
// Render text
|
||||
|
|
|
@ -174,6 +174,7 @@ class SceneOpenGL::EffectFrame
|
|||
virtual ~EffectFrame();
|
||||
|
||||
virtual void free();
|
||||
virtual void freeIconFrame();
|
||||
virtual void freeTextFrame();
|
||||
|
||||
virtual void render(QRegion region, double opacity, double frameOpacity);
|
||||
|
@ -186,6 +187,7 @@ class SceneOpenGL::EffectFrame
|
|||
|
||||
GLTexture* m_texture;
|
||||
GLTexture* m_textTexture;
|
||||
GLTexture* m_iconTexture;
|
||||
|
||||
static GLTexture* m_unstyledTexture;
|
||||
static void updateUnstyledTexture(); // Update OpenGL unstyled frame texture
|
||||
|
|
|
@ -854,12 +854,14 @@ SceneXrender::EffectFrame::EffectFrame( EffectFrameImpl* frame )
|
|||
{
|
||||
m_picture = NULL;
|
||||
m_textPicture = NULL;
|
||||
m_iconPicture = NULL;
|
||||
}
|
||||
|
||||
SceneXrender::EffectFrame::~EffectFrame()
|
||||
{
|
||||
delete m_picture;
|
||||
delete m_textPicture;
|
||||
delete m_iconPicture;
|
||||
}
|
||||
|
||||
void SceneXrender::EffectFrame::free()
|
||||
|
@ -868,6 +870,14 @@ void SceneXrender::EffectFrame::free()
|
|||
m_picture = NULL;
|
||||
delete m_textPicture;
|
||||
m_textPicture = NULL;
|
||||
delete m_iconPicture;
|
||||
m_iconPicture = NULL;
|
||||
}
|
||||
|
||||
void SceneXrender::EffectFrame::freeIconFrame()
|
||||
{
|
||||
delete m_iconPicture;
|
||||
m_iconPicture = NULL;
|
||||
}
|
||||
|
||||
void SceneXrender::EffectFrame::freeTextFrame()
|
||||
|
@ -907,11 +917,11 @@ void SceneXrender::EffectFrame::render( QRegion region, double opacity, double f
|
|||
{
|
||||
QPoint topLeft( m_effectFrame->geometry().x(), m_effectFrame->geometry().center().y() - m_effectFrame->iconSize().height() / 2 );
|
||||
|
||||
XRenderPicture* icon = new XRenderPicture( m_effectFrame->icon() ); // TODO: Cache
|
||||
if( !m_iconPicture ) // lazy creation
|
||||
m_iconPicture = new XRenderPicture( m_effectFrame->icon() );
|
||||
QRect geom = QRect( topLeft, m_effectFrame->iconSize() );
|
||||
XRenderComposite( display(), PictOpOver, *icon, fill, effects->xrenderBufferPicture(),
|
||||
XRenderComposite( display(), PictOpOver, *m_iconPicture, fill, effects->xrenderBufferPicture(),
|
||||
0, 0, 0, 0, geom.x(), geom.y(), geom.width(), geom.height() );
|
||||
delete icon;
|
||||
}
|
||||
|
||||
// Render text
|
||||
|
|
|
@ -101,6 +101,7 @@ class SceneXrender::EffectFrame
|
|||
virtual ~EffectFrame();
|
||||
|
||||
virtual void free();
|
||||
virtual void freeIconFrame();
|
||||
virtual void freeTextFrame();
|
||||
virtual void render( QRegion region, double opacity, double frameOpacity );
|
||||
|
||||
|
@ -110,6 +111,7 @@ class SceneXrender::EffectFrame
|
|||
|
||||
XRenderPicture* m_picture;
|
||||
XRenderPicture* m_textPicture;
|
||||
XRenderPicture* m_iconPicture;
|
||||
};
|
||||
|
||||
inline
|
||||
|
|
Loading…
Reference in a new issue