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[] = {
|
static unsigned char question_bits[] = {
|
||||||
0x3c, 0x66, 0x60, 0x30, 0x18, 0x00, 0x18, 0x18};
|
0x3c, 0x66, 0x60, 0x30, 0x18, 0x00, 0x18, 0x18};
|
||||||
|
|
||||||
static QPixmap *titlePix=0;
|
|
||||||
static KPixmap *aUpperGradient=0;
|
static KPixmap *aUpperGradient=0;
|
||||||
static KPixmap *iUpperGradient=0;
|
static KPixmap *iUpperGradient=0;
|
||||||
static bool pixmaps_created = false;
|
static bool pixmaps_created = false;
|
||||||
|
@ -54,29 +53,7 @@ static void create_pixmaps()
|
||||||
return;
|
return;
|
||||||
pixmaps_created = true;
|
pixmaps_created = true;
|
||||||
|
|
||||||
// titlebar
|
|
||||||
QPainter p;
|
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 &&
|
if(QPixmap::defaultDepth() > 8 &&
|
||||||
kapp->palette().normal().brush(QColorGroup::Background).pixmap()==NULL){
|
kapp->palette().normal().brush(QColorGroup::Background).pixmap()==NULL){
|
||||||
aUpperGradient = new KPixmap;
|
aUpperGradient = new KPixmap;
|
||||||
|
@ -92,6 +69,7 @@ static void create_pixmaps()
|
||||||
options->color(Options::Frame, false).light(130),
|
options->color(Options::Frame, false).light(130),
|
||||||
bgColor,
|
bgColor,
|
||||||
KPixmapEffect::VerticalGradient);
|
KPixmapEffect::VerticalGradient);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -180,13 +158,14 @@ void SystemButton::drawButton(QPainter *p)
|
||||||
|
|
||||||
void SystemClient::slotReset()
|
void SystemClient::slotReset()
|
||||||
{
|
{
|
||||||
delete titlePix;
|
|
||||||
if(aUpperGradient){
|
if(aUpperGradient){
|
||||||
delete aUpperGradient;
|
delete aUpperGradient;
|
||||||
delete iUpperGradient;
|
delete iUpperGradient;
|
||||||
}
|
}
|
||||||
pixmaps_created = false;
|
pixmaps_created = false;
|
||||||
create_pixmaps();
|
create_pixmaps();
|
||||||
|
titleBuffer.resize(0, 0);
|
||||||
|
recalcTitleBuffer();
|
||||||
button[0]->reset();
|
button[0]->reset();
|
||||||
button[1]->reset();
|
button[1]->reset();
|
||||||
button[2]->reset();
|
button[2]->reset();
|
||||||
|
@ -253,13 +232,17 @@ SystemClient::SystemClient( Workspace *ws, WId w, QWidget *parent,
|
||||||
hb->addWidget( button[3]);
|
hb->addWidget( button[3]);
|
||||||
hb->addSpacing(3);
|
hb->addSpacing(3);
|
||||||
|
|
||||||
|
setBackgroundMode(NoBackground);
|
||||||
|
recalcTitleBuffer();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SystemClient::resizeEvent( QResizeEvent* e)
|
void SystemClient::resizeEvent( QResizeEvent* )
|
||||||
{
|
{
|
||||||
Client::resizeEvent( e );
|
//Client::resizeEvent( e );
|
||||||
|
recalcTitleBuffer();
|
||||||
doShape();
|
doShape();
|
||||||
|
/*
|
||||||
if ( isVisibleToTLW() && !testWFlags( WNorthWestGravity )) {
|
if ( isVisibleToTLW() && !testWFlags( WNorthWestGravity )) {
|
||||||
QPainter p( this );
|
QPainter p( this );
|
||||||
QRect t = titlebar->geometry();
|
QRect t = titlebar->geometry();
|
||||||
|
@ -268,11 +251,54 @@ void SystemClient::resizeEvent( QResizeEvent* e)
|
||||||
r = r.subtract( t );
|
r = r.subtract( t );
|
||||||
p.setClipRegion( r );
|
p.setClipRegion( r );
|
||||||
p.eraseRect( rect() );
|
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 );
|
repaint( titlebar->geometry(), false );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -287,50 +313,33 @@ void SystemClient::paintEvent( QPaintEvent* )
|
||||||
{
|
{
|
||||||
QPainter p( this );
|
QPainter p( this );
|
||||||
QRect t = titlebar->geometry();
|
QRect t = titlebar->geometry();
|
||||||
t.setTop( 1 );
|
|
||||||
|
|
||||||
QBrush fillBrush(colorGroup().brush(QColorGroup::Background).pixmap() ?
|
QBrush fillBrush(colorGroup().brush(QColorGroup::Background).pixmap() ?
|
||||||
colorGroup().brush(QColorGroup::Background) :
|
colorGroup().brush(QColorGroup::Background) :
|
||||||
options->colorGroup(Options::Frame, isActive()).
|
options->colorGroup(Options::Frame, isActive()).
|
||||||
brush(QColorGroup::Button));
|
brush(QColorGroup::Button));
|
||||||
|
|
||||||
p.fillRect(rect(), fillBrush);
|
p.fillRect(1, 18, width()-2, height()-19, 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 );
|
|
||||||
|
|
||||||
t.setTop( 2 );
|
t.setTop( 2 );
|
||||||
t.setLeft( t.left() + 4 );
|
t.setLeft( t.left() + 4 );
|
||||||
t.setRight( t.right() - 2 );
|
t.setRight( t.right() - 2 );
|
||||||
|
|
||||||
p.setPen(options->color(Options::GrooveText, isActive()));
|
if(isActive())
|
||||||
p.setFont(options->font(isActive()));
|
p.drawPixmap(0, 0, titleBuffer);
|
||||||
if(isActive()){
|
else{
|
||||||
QFontMetrics fm(options->font(true));
|
if(iUpperGradient)
|
||||||
if(aUpperGradient)
|
p.drawTiledPixmap(0, 0, width(), 18, *iUpperGradient);
|
||||||
p.drawTiledPixmap(t.x()+((t.width()-fm.width(caption()))/2)-4,
|
|
||||||
0, fm.width(caption())+8, 18,
|
|
||||||
isActive() ? *aUpperGradient :
|
|
||||||
*iUpperGradient);
|
|
||||||
else
|
else
|
||||||
p.fillRect(t.x()+((t.width()-fm.width(caption()))/2)-4, t.y(),
|
p.fillRect(0, 0, width(), 18,
|
||||||
fm.width(caption())+8, t.height(), fillBrush);
|
options->colorGroup(Options::Frame, false).
|
||||||
|
brush(QColorGroup::Button));
|
||||||
|
p.setPen(options->color(Options::GrooveText, isActive()));
|
||||||
|
p.setFont(options->font(isActive()));
|
||||||
|
p.drawText(t, AlignCenter, caption() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
p.drawText( t, AlignCenter, caption() );
|
|
||||||
|
|
||||||
p.setPen(options->colorGroup(Options::Frame, isActive()).light());
|
p.setPen(options->colorGroup(Options::Frame, isActive()).light());
|
||||||
p.drawLine(width()-20, height()-7, width()-10, height()-7);
|
p.drawLine(width()-20, height()-7, width()-10, height()-7);
|
||||||
|
@ -351,21 +360,6 @@ void SystemClient::doShape()
|
||||||
|
|
||||||
QRegion mask;
|
QRegion mask;
|
||||||
kRoundMaskRegion(mask, 0, 0, width(), height());
|
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);
|
setMask(mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -43,12 +43,16 @@ protected:
|
||||||
void stickyChange(bool on);
|
void stickyChange(bool on);
|
||||||
void maximizeChange(bool m);
|
void maximizeChange(bool m);
|
||||||
void doShape();
|
void doShape();
|
||||||
|
void recalcTitleBuffer();
|
||||||
protected slots:
|
protected slots:
|
||||||
void slotReset();
|
void slotReset();
|
||||||
private:
|
private:
|
||||||
SystemButton* button[5];
|
SystemButton* button[5];
|
||||||
QSpacerItem* titlebar;
|
QSpacerItem* titlebar;
|
||||||
};
|
QPixmap titleBuffer;
|
||||||
|
QString oldTitle;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue