diff options
author | Martin Jones <martin.jones@nokia.com> | 2010-03-03 22:54:40 (GMT) |
---|---|---|
committer | Martin Jones <martin.jones@nokia.com> | 2010-03-03 22:54:40 (GMT) |
commit | 24c1173aac92e9a4e14da072b5aa62c8289d810d (patch) | |
tree | a2c1c3fa02838f86ee2b403d381ee93380f7f4df /src/declarative/graphicsitems | |
parent | 1340e99a83d64bda2c8d37b67ef2f60be7a706c4 (diff) | |
download | Qt-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.cpp | 25 |
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 { |