diff --git a/include/ui/overlay.h b/include/ui/overlay.h index 9be73ec8..fd8cf564 100644 --- a/include/ui/overlay.h +++ b/include/ui/overlay.h @@ -70,7 +70,7 @@ private: class Overlay { public: - Overlay() { + Overlay(QRect fromRect) : image(fromRect.size(), QImage::Format_ARGB32) { this->x = 0; this->y = 0; this->angle = 0; @@ -79,10 +79,14 @@ public: this->hidden = false; this->opacity = 1.0; this->clippingRect = nullptr; + this->image.setOffset(fromRect.topLeft()); + this->image.fill(QColor(0, 0, 0, 0)); + this->valid = false; } ~Overlay() { this->clearItems(); } + void invalidate() { this->valid = false; } bool getHidden(); void setHidden(bool hidden); int getOpacity(); @@ -123,6 +127,8 @@ private: bool hidden; qreal opacity; QRectF *clippingRect; + QImage image; + bool valid; }; #else diff --git a/src/ui/graphicsview.cpp b/src/ui/graphicsview.cpp index 667e0aab..8c0adf24 100644 --- a/src/ui/graphicsview.cpp +++ b/src/ui/graphicsview.cpp @@ -59,7 +59,7 @@ void MapView::clearOverlayMap() { Overlay * MapView::getOverlay(int layer) { Overlay * overlay = this->overlayMap.value(layer, nullptr); if (!overlay) { - overlay = new Overlay(); + overlay = new Overlay(this->sceneRect().toRect()); this->overlayMap.insert(layer, overlay); } return overlay; diff --git a/src/ui/overlay.cpp b/src/ui/overlay.cpp index 4fccb530..86809534 100644 --- a/src/ui/overlay.cpp +++ b/src/ui/overlay.cpp @@ -26,6 +26,18 @@ void Overlay::renderItems(QPainter *painter) { painter->save(); + // don't waste time if there are no updated to be made + if (!valid) { + QPainter overlayPainter(&this->image); + overlayPainter.setClipping(false); + QTransform t = overlayPainter.transform(); + t.translate(-this->image.offset().x(), -this->image.offset().y()); + overlayPainter.setTransform(t); + for (auto item : this->items) { + item->render(&overlayPainter); + } + } + if (this->clippingRect) { painter->setClipping(true); painter->setClipRect(*this->clippingRect); @@ -38,10 +50,11 @@ void Overlay::renderItems(QPainter *painter) { painter->setTransform(transform); painter->setOpacity(this->opacity); - for (auto item : this->items) - item->render(painter); + painter->drawImage(this->image.offset(), this->image); painter->restore(); + + valid = true; } void Overlay::clearItems() { @@ -49,6 +62,7 @@ void Overlay::clearItems() { delete item; } this->items.clear(); + this->image.fill(QColor(0, 0, 0, 0)); } QList Overlay::getItems() {