[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: branches/KDE/4.4/kdegraphics/ksnapshot
From: Fredrik Höglund <fredrik () kde ! org>
Date: 2010-01-12 0:04:23
Message-ID: 1263254663.694487.17058.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 1073323 by fredrik:
Backport r1073321:
Work around a performance problem with QPainter::drawRect() and alpha pens
by setting the clip region to the shape of the stroked rect and using
QPainter::fillRect().
M +40 -13 regiongrabber.cpp
M +4 -1 regiongrabber.h
--- branches/KDE/4.4/kdegraphics/ksnapshot/regiongrabber.cpp #1073322:1073323
@@ -59,6 +59,24 @@
grabKeyboard();
}
+static void drawRect( QPainter *painter, const QRect &r, const QColor &outline, \
const QColor &fill = QColor() ) +{
+ QRegion clip( r );
+ clip = clip.subtracted( r.adjusted( 1, 1, -1, -1 ) );
+
+ painter->save();
+ painter->setClipRegion( clip );
+ painter->setPen( Qt::NoPen );
+ painter->setBrush( outline );
+ painter->drawRect( r );
+ if ( fill.isValid() ) {
+ painter->setClipping( false );
+ painter->setBrush( fill );
+ painter->drawRect( r.adjusted( 1, 1, -1, -1 ) );
+ }
+ painter->restore();
+}
+
void RegionGrabber::paintEvent( QPaintEvent* e )
{
Q_UNUSED( e );
@@ -83,13 +101,12 @@
{
QRegion grey( rect() );
grey = grey.subtracted( r );
- painter.setPen( handleColor );
+ painter.setClipRegion( grey );
+ painter.setPen( Qt::NoPen );
painter.setBrush( overlayColor );
- painter.setClipRegion( grey );
- painter.drawRect( -1, -1, rect().width() + 1, rect().height() + 1 );
+ painter.drawRect( rect() );
painter.setClipRect( rect() );
- painter.setBrush( Qt::NoBrush );
- painter.drawRect( r );
+ drawRect( &painter, r, handleColor );
}
if ( showHelp )
@@ -99,7 +116,7 @@
QString helpText = i18n( "Select a region using the mouse. To take the \
snapshot, press the Enter key. Press Esc to quit." );
helpTextRect = painter.boundingRect( rect().adjusted( 2, 2, -2, -2 ), \
Qt::TextWordWrap, helpText ); helpTextRect.adjust( -2, -2, 4, 2 );
- painter.drawRect( helpTextRect );
+ drawRect( &painter, helpTextRect, textColor, textBackgroundColor );
painter.drawText( helpTextRect.adjusted( 3, 3, -3, -3 ), helpText );
}
@@ -146,19 +163,22 @@
textRect.moveBottomLeft( QPoint( r.right() + 5, r.bottom() ) );
}
// if the above didn't catch it, you are running on a very tiny screen...
- painter.setPen( textColor );
- painter.setBrush( textBackgroundColor );
- painter.drawRect( boundingRect );
+ drawRect( &painter, boundingRect, textColor, textBackgroundColor );
+
painter.drawText( textRect, txt );
if ( ( r.height() > handleSize*2 && r.width() > handleSize*2 )
|| !mouseDown )
{
updateHandles();
- painter.setPen( handleColor );
+ painter.setPen( Qt::NoPen );
+ painter.setBrush( handleColor );
+ painter.setClipRegion( handleMask( StrokeMask ) );
+ painter.drawRect( rect() );
handleColor.setAlpha( 60 );
painter.setBrush( handleColor );
- painter.drawRects( handleMask().rects() );
+ painter.setClipRegion( handleMask( FillMask ) );
+ painter.drawRect( rect() );
}
}
@@ -353,11 +373,18 @@
BHandle.moveBottomLeft( QPoint( r.x() + r.width() / 2 - s2, r.bottom() ) );
}
-QRegion RegionGrabber::handleMask() const
+QRegion RegionGrabber::handleMask( MaskType type ) const
{
// note: not normalized QRects are bad here, since they will not be drawn
QRegion mask;
- foreach( QRect* rect, handles ) mask += QRegion( *rect );
+ foreach( QRect* rect, handles ) {
+ if ( type == StrokeMask ) {
+ QRegion r( *rect );
+ mask += r.subtracted( rect->adjusted( 1, 1, -1, -1 ) );
+ } else {
+ mask += QRegion( rect->adjusted( 1, 1, -1, -1 ) );
+ }
+ }
return mask;
}
--- branches/KDE/4.4/kdegraphics/ksnapshot/regiongrabber.h #1073322:1073323
@@ -33,6 +33,9 @@
class RegionGrabber : public QWidget
{
Q_OBJECT
+
+ enum MaskType { StrokeMask, FillMask };
+
public:
RegionGrabber();
~RegionGrabber();
@@ -52,7 +55,7 @@
void mouseDoubleClickEvent( QMouseEvent* );
void keyPressEvent( QKeyEvent* e );
void updateHandles();
- QRegion handleMask() const;
+ QRegion handleMask( MaskType type ) const;
QPoint limitPointToRect( const QPoint &p, const QRect &r ) const;
void grabRect();
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic