From 07ef9e3022565017709668d637ed13d0f26b7505 Mon Sep 17 00:00:00 2001 From: Warwick Allison Date: Mon, 31 Aug 2009 13:25:14 +1000 Subject: Optimize case of cache rects needing minor repaints. Especially obvious when WebView link hovered. --- src/declarative/fx/qfxpainteditem.cpp | 14 +++++++++++++- src/declarative/fx/qfxpainteditem_p.h | 1 + 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/declarative/fx/qfxpainteditem.cpp b/src/declarative/fx/qfxpainteditem.cpp index 8c04074..3d313c2 100644 --- a/src/declarative/fx/qfxpainteditem.cpp +++ b/src/declarative/fx/qfxpainteditem.cpp @@ -94,9 +94,12 @@ void QFxPaintedItem::dirtyCache(const QRect& rect) { Q_D(QFxPaintedItem); for (int i=0; i < d->imagecache.count(); ) { - if (d->imagecache[i]->area.intersects(rect)) { + QFxPaintedItemPrivate::ImageCacheItem *c = d->imagecache[i]; + QRect isect = (c->area & rect) | c->dirty; + if (isect == c->area) { d->imagecache.removeAt(i); } else { + c->dirty = isect; ++i; } } @@ -209,6 +212,15 @@ void QFxPaintedItem::paint(QPainter *p, const QStyleOptionGraphicsItem *, QWidge QRect area = d->imagecache[i]->area; if (topaint.contains(area)) { QRectF target(area.x(), area.y(), area.width(), area.height()); + if (!d->imagecache[i]->dirty.isNull() && topaint.contains(d->imagecache[i]->dirty)) { + QPainter qp(&d->imagecache[i]->image); + qp.translate(-area.x(), -area.y()); + if (d->fillColor.isValid()) + qp.fillRect(d->imagecache[i]->dirty,d->fillColor); + qp.setClipRect(d->imagecache[i]->dirty); + drawContents(&qp, d->imagecache[i]->dirty); + d->imagecache[i]->dirty = QRect(); + } p->drawPixmap(target.toRect(), d->imagecache[i]->image); topaint -= area; d->imagecache[i]->age=0; diff --git a/src/declarative/fx/qfxpainteditem_p.h b/src/declarative/fx/qfxpainteditem_p.h index f01936d..2718e57 100644 --- a/src/declarative/fx/qfxpainteditem_p.h +++ b/src/declarative/fx/qfxpainteditem_p.h @@ -72,6 +72,7 @@ public: ~ImageCacheItem() { } int age; QRect area; + QRect dirty; // one dirty area (allows optimization of common cases) QPixmap image; }; -- cgit v0.12