From 520b1003b0242ff6d18e7973d73023a622b1d34f Mon Sep 17 00:00:00 2001 From: garak Date: Sat, 8 Mar 2025 12:15:23 -0500 Subject: [PATCH] use single image per layer for overlay renders --- include/ui/overlay.h | 8 +++++++- src/ui/graphicsview.cpp | 2 +- src/ui/overlay.cpp | 18 ++++++++++++++++-- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/include/ui/overlay.h b/include/ui/overlay.h index 86fe09637..723da0e8b 100644 --- a/include/ui/overlay.h +++ b/include/ui/overlay.h @@ -68,7 +68,7 @@ class OverlayPixmap : public OverlayItem { class Overlay { public: - Overlay() { + Overlay(QRect fromRect) : image(fromRect.size(), QImage::Format_ARGB32) { this->x = 0; this->y = 0; this->angle = 0; @@ -77,10 +77,14 @@ class Overlay 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(); @@ -121,6 +125,8 @@ class Overlay bool hidden; qreal opacity; QRectF *clippingRect; + QImage image; + bool valid; }; #endif // OVERLAY_H diff --git a/src/ui/graphicsview.cpp b/src/ui/graphicsview.cpp index 68479e98b..a107e704e 100644 --- a/src/ui/graphicsview.cpp +++ b/src/ui/graphicsview.cpp @@ -74,7 +74,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 d1ba4ef89..fd4a55b06 100644 --- a/src/ui/overlay.cpp +++ b/src/ui/overlay.cpp @@ -25,6 +25,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); @@ -37,10 +49,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() { @@ -48,6 +61,7 @@ void Overlay::clearItems() { delete item; } this->items.clear(); + this->image.fill(QColor(0, 0, 0, 0)); } QList Overlay::getItems() {