summaryrefslogtreecommitdiffstats
path: root/src/declarative/graphicsitems
diff options
context:
space:
mode:
authorMartin Jones <martin.jones@nokia.com>2010-03-03 22:54:40 (GMT)
committerMartin Jones <martin.jones@nokia.com>2010-03-03 22:54:40 (GMT)
commit24c1173aac92e9a4e14da072b5aa62c8289d810d (patch)
treea2c1c3fa02838f86ee2b403d381ee93380f7f4df /src/declarative/graphicsitems
parent1340e99a83d64bda2c8d37b67ef2f60be7a706c4 (diff)
downloadQt-24c1173aac92e9a4e14da072b5aa62c8289d810d.zip
Qt-24c1173aac92e9a4e14da072b5aa62c8289d810d.tar.gz
Qt-24c1173aac92e9a4e14da072b5aa62c8289d810d.tar.bz2
Fix painting Rectangle with radius < side/2.
Falls back to using standard QPainter. Also avoid painting odd width borders between pixels, i.e. pixel align painting. Task-number: QTBUG-6675, QTBUG-8317, QTBUG-6786
Diffstat (limited to 'src/declarative/graphicsitems')
-rw-r--r--src/declarative/graphicsitems/qdeclarativerectangle.cpp25
1 files changed, 19 insertions, 6 deletions
diff --git a/src/declarative/graphicsitems/qdeclarativerectangle.cpp b/src/declarative/graphicsitems/qdeclarativerectangle.cpp
index d534f21..05fe0f7 100644
--- a/src/declarative/graphicsitems/qdeclarativerectangle.cpp
+++ b/src/declarative/graphicsitems/qdeclarativerectangle.cpp
@@ -393,9 +393,10 @@ void QDeclarativeRectangle::paint(QPainter *p, const QStyleOptionGraphicsItem *,
void QDeclarativeRectangle::drawRect(QPainter &p)
{
Q_D(QDeclarativeRectangle);
- if (d->gradient && d->gradient->gradient()) {
+ if ((d->gradient && d->gradient->gradient())
+ || d->radius > width()/2 || d->radius > height()/2) {
// XXX This path is still slower than the image path
- // Image path won't work for gradients though
+ // Image path won't work for gradients or invalid radius though
bool oldAA = p.testRenderHint(QPainter::Antialiasing);
if (d->smooth)
p.setRenderHint(QPainter::Antialiasing);
@@ -405,11 +406,23 @@ void QDeclarativeRectangle::drawRect(QPainter &p)
} else {
p.setPen(Qt::NoPen);
}
- p.setBrush(*d->gradient->gradient());
- if (d->radius > 0.)
- p.drawRoundedRect(0, 0, width(), height(), d->radius, d->radius);
+ if (d->gradient && d->gradient->gradient())
+ p.setBrush(*d->gradient->gradient());
else
- p.drawRect(0, 0, width(), height());
+ p.setBrush(d->color);
+ const int pw = d->pen && d->pen->isValid() ? d->pen->width() : 0;
+ QRectF rect;
+ if (pw%2)
+ rect = QRectF(0.5, 0.5, width()-1, height()-1);
+ else
+ rect = QRectF(0, 0, width(), height());
+ qreal radius = d->radius;
+ if (radius > width()/2 || radius > height()/2)
+ radius = qMin(width()/2, height()/2);
+ if (radius > 0.)
+ p.drawRoundedRect(rect, radius, radius);
+ else
+ p.drawRect(rect);
if (d->smooth)
p.setRenderHint(QPainter::Antialiasing, oldAA);
} else {