Big ole speed improvement :)
First off, Rikkus was right about double buffering. I really didn't think this was needed and tried everything to get rid of the flicker but it didn't happen until I double buffered the title. I was able to optimize this quite a bit (only recalc on resize, only buffer the active title/color scheme, etc...). In the meantime, I got rid of a lot of non-optimal painting and now use NoBackground for the widget. The latter was a obvious move as it avoids a whole clearing of the widget :P This resulted in a big speed improvement, which helps offset the time taken in buffering ;-) svn path=/trunk/kdebase/kwin/; revision=45264
This commit is contained in:
parent
8e6fb39db3
commit
7ba2cf2d87
2 changed files with 74 additions and 76 deletions
|
@ -43,7 +43,6 @@ static unsigned char sticky_bits[] = {
|
|||
static unsigned char question_bits[] = {
|
||||
0x3c, 0x66, 0x60, 0x30, 0x18, 0x00, 0x18, 0x18};
|
||||
|
||||
static QPixmap *titlePix=0;
|
||||
static KPixmap *aUpperGradient=0;
|
||||
static KPixmap *iUpperGradient=0;
|
||||
static bool pixmaps_created = false;
|
||||
|
@ -54,29 +53,7 @@ static void create_pixmaps()
|
|||
return;
|
||||
pixmaps_created = true;
|
||||
|
||||
// titlebar
|
||||
QPainter p;
|
||||
QPainter maskPainter;
|
||||
int i, y;
|
||||
titlePix = new QPixmap(32, 14);
|
||||
QBitmap mask(32, 14);
|
||||
mask.fill(Qt::color0);
|
||||
|
||||
p.begin(titlePix);
|
||||
maskPainter.begin(&mask);
|
||||
maskPainter.setPen(Qt::color1);
|
||||
for(i=0, y=2; i < 4; ++i, y+=3){
|
||||
p.setPen(options->color(Options::Groove, true).light(150));
|
||||
p.drawLine(0, y, 31, y);
|
||||
maskPainter.drawLine(0, y, 31, y);
|
||||
p.setPen(options->color(Options::Groove, true).dark(120));
|
||||
p.drawLine(0, y+1, 31, y+1);
|
||||
maskPainter.drawLine(0, y+1, 31, y+1);
|
||||
}
|
||||
p.end();
|
||||
maskPainter.end();
|
||||
titlePix->setMask(mask);
|
||||
|
||||
if(QPixmap::defaultDepth() > 8 &&
|
||||
kapp->palette().normal().brush(QColorGroup::Background).pixmap()==NULL){
|
||||
aUpperGradient = new KPixmap;
|
||||
|
@ -92,6 +69,7 @@ static void create_pixmaps()
|
|||
options->color(Options::Frame, false).light(130),
|
||||
bgColor,
|
||||
KPixmapEffect::VerticalGradient);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -180,13 +158,14 @@ void SystemButton::drawButton(QPainter *p)
|
|||
|
||||
void SystemClient::slotReset()
|
||||
{
|
||||
delete titlePix;
|
||||
if(aUpperGradient){
|
||||
delete aUpperGradient;
|
||||
delete iUpperGradient;
|
||||
}
|
||||
pixmaps_created = false;
|
||||
create_pixmaps();
|
||||
titleBuffer.resize(0, 0);
|
||||
recalcTitleBuffer();
|
||||
button[0]->reset();
|
||||
button[1]->reset();
|
||||
button[2]->reset();
|
||||
|
@ -253,13 +232,17 @@ SystemClient::SystemClient( Workspace *ws, WId w, QWidget *parent,
|
|||
hb->addWidget( button[3]);
|
||||
hb->addSpacing(3);
|
||||
|
||||
setBackgroundMode(NoBackground);
|
||||
recalcTitleBuffer();
|
||||
|
||||
}
|
||||
|
||||
void SystemClient::resizeEvent( QResizeEvent* e)
|
||||
void SystemClient::resizeEvent( QResizeEvent* )
|
||||
{
|
||||
Client::resizeEvent( e );
|
||||
|
||||
//Client::resizeEvent( e );
|
||||
recalcTitleBuffer();
|
||||
doShape();
|
||||
/*
|
||||
if ( isVisibleToTLW() && !testWFlags( WNorthWestGravity )) {
|
||||
QPainter p( this );
|
||||
QRect t = titlebar->geometry();
|
||||
|
@ -268,11 +251,54 @@ void SystemClient::resizeEvent( QResizeEvent* e)
|
|||
r = r.subtract( t );
|
||||
p.setClipRegion( r );
|
||||
p.eraseRect( rect() );
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
void SystemClient::captionChange( const QString& )
|
||||
void SystemClient::recalcTitleBuffer()
|
||||
{
|
||||
if(oldTitle == caption() && width() == titleBuffer.width())
|
||||
return;
|
||||
QFontMetrics fm(options->font(true));
|
||||
titleBuffer.resize(width(), 18);
|
||||
QPainter p;
|
||||
p.begin(&titleBuffer);
|
||||
if(aUpperGradient)
|
||||
p.drawTiledPixmap(0, 0, width(), 18, *aUpperGradient);
|
||||
else
|
||||
p.fillRect(0, 0, width(), 18,
|
||||
options->colorGroup(Options::Frame, true).
|
||||
brush(QColorGroup::Button));
|
||||
|
||||
QRect t = titlebar->geometry();
|
||||
t.setTop( 2 );
|
||||
t.setLeft( t.left() + 4 );
|
||||
t.setRight( t.right() - 2 );
|
||||
|
||||
QRegion r(t.x(), 0, t.width(), 18);
|
||||
r -= QRect(t.x()+((t.width()-fm.width(caption()))/2)-4,
|
||||
0, fm.width(caption())+8, 18);
|
||||
p.setClipRegion(r);
|
||||
int i, ly;
|
||||
for(i=0, ly=4; i < 4; ++i, ly+=3){
|
||||
p.setPen(options->color(Options::Groove, true).light(150));
|
||||
p.drawLine(0, ly, width()-1, ly);
|
||||
p.setPen(options->color(Options::Groove, true).dark(120));
|
||||
p.drawLine(0, ly+1, width()-1, ly+1);
|
||||
}
|
||||
p.setClipRect(t);
|
||||
p.setPen(options->color(Options::GrooveText, true));
|
||||
p.setFont(options->font(true));
|
||||
|
||||
p.drawText(t.x()+((t.width()-fm.width(caption()))/2)-4,
|
||||
0, fm.width(caption())+8, 18, AlignCenter, caption());
|
||||
p.setClipping(false);
|
||||
p.end();
|
||||
oldTitle = caption();
|
||||
}
|
||||
|
||||
void SystemClient::captionChange( const QString &)
|
||||
{
|
||||
recalcTitleBuffer();
|
||||
repaint( titlebar->geometry(), false );
|
||||
}
|
||||
|
||||
|
@ -287,50 +313,33 @@ void SystemClient::paintEvent( QPaintEvent* )
|
|||
{
|
||||
QPainter p( this );
|
||||
QRect t = titlebar->geometry();
|
||||
t.setTop( 1 );
|
||||
|
||||
QBrush fillBrush(colorGroup().brush(QColorGroup::Background).pixmap() ?
|
||||
colorGroup().brush(QColorGroup::Background) :
|
||||
options->colorGroup(Options::Frame, isActive()).
|
||||
brush(QColorGroup::Button));
|
||||
|
||||
p.fillRect(rect(), fillBrush);
|
||||
if(aUpperGradient){
|
||||
if(isActive()){
|
||||
p.drawTiledPixmap(0, 0, width(), 18, *aUpperGradient);
|
||||
}
|
||||
else{
|
||||
p.drawTiledPixmap(0, 0, width(), 18, *iUpperGradient);
|
||||
}
|
||||
}
|
||||
t.setTop( 1 );
|
||||
if(isActive())
|
||||
p.drawTiledPixmap(t, *titlePix);
|
||||
|
||||
QRegion r = rect();
|
||||
r = r.subtract( t );
|
||||
p.setClipRegion( r );
|
||||
p.setClipping( FALSE );
|
||||
p.fillRect(1, 18, width()-2, height()-19, fillBrush);
|
||||
|
||||
t.setTop( 2 );
|
||||
t.setLeft( t.left() + 4 );
|
||||
t.setRight( t.right() - 2 );
|
||||
|
||||
if(isActive())
|
||||
p.drawPixmap(0, 0, titleBuffer);
|
||||
else{
|
||||
if(iUpperGradient)
|
||||
p.drawTiledPixmap(0, 0, width(), 18, *iUpperGradient);
|
||||
else
|
||||
p.fillRect(0, 0, width(), 18,
|
||||
options->colorGroup(Options::Frame, false).
|
||||
brush(QColorGroup::Button));
|
||||
p.setPen(options->color(Options::GrooveText, isActive()));
|
||||
p.setFont(options->font(isActive()));
|
||||
if(isActive()){
|
||||
QFontMetrics fm(options->font(true));
|
||||
if(aUpperGradient)
|
||||
p.drawTiledPixmap(t.x()+((t.width()-fm.width(caption()))/2)-4,
|
||||
0, fm.width(caption())+8, 18,
|
||||
isActive() ? *aUpperGradient :
|
||||
*iUpperGradient);
|
||||
else
|
||||
p.fillRect(t.x()+((t.width()-fm.width(caption()))/2)-4, t.y(),
|
||||
fm.width(caption())+8, t.height(), fillBrush);
|
||||
p.drawText(t, AlignCenter, caption() );
|
||||
}
|
||||
|
||||
p.drawText( t, AlignCenter, caption() );
|
||||
|
||||
|
||||
p.setPen(options->colorGroup(Options::Frame, isActive()).light());
|
||||
p.drawLine(width()-20, height()-7, width()-10, height()-7);
|
||||
|
@ -351,21 +360,6 @@ void SystemClient::doShape()
|
|||
|
||||
QRegion mask;
|
||||
kRoundMaskRegion(mask, 0, 0, width(), height());
|
||||
/*
|
||||
(QRect(6, 0, width()-12, height()));
|
||||
mask += QRegion(QRect(5, 1, 1, height()-2)); // left
|
||||
mask += QRegion(QRect(4, 1, 1, height()-2));
|
||||
mask += QRegion(QRect(3, 2, 1, height()-4));
|
||||
mask += QRegion(QRect(2, 3, 1, height()-6));
|
||||
mask += QRegion(QRect(1, 4, 1, height()-8));
|
||||
mask += QRegion(QRect(0, 6, 1, height()-12));
|
||||
int x2 = width()-1;
|
||||
mask += QRegion(QRect(x2-5, 1, 1, height()-2)); // right
|
||||
mask += QRegion(QRect(x2-4, 1, 1, height()-2));
|
||||
mask += QRegion(QRect(x2-3, 2, 1, height()-4));
|
||||
mask += QRegion(QRect(x2-2, 3, 1, height()-6));
|
||||
mask += QRegion(QRect(x2-1, 4, 1, height()-8));
|
||||
mask += QRegion(QRect(x2, 6, 1, height()-12)); */
|
||||
setMask(mask);
|
||||
}
|
||||
|
||||
|
|
|
@ -43,14 +43,18 @@ protected:
|
|||
void stickyChange(bool on);
|
||||
void maximizeChange(bool m);
|
||||
void doShape();
|
||||
void recalcTitleBuffer();
|
||||
protected slots:
|
||||
void slotReset();
|
||||
private:
|
||||
SystemButton* button[5];
|
||||
QSpacerItem* titlebar;
|
||||
QPixmap titleBuffer;
|
||||
QString oldTitle;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue