use single image per layer for overlay renders

This commit is contained in:
garak
2025-03-08 12:15:23 -05:00
parent 7efc3e3421
commit 520b1003b0
3 changed files with 24 additions and 4 deletions

View File

@@ -68,7 +68,7 @@ private:
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 @@ 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();
@@ -121,6 +125,8 @@ private:
bool hidden;
qreal opacity;
QRectF *clippingRect;
QImage image;
bool valid;
};
#endif // OVERLAY_H

View File

@@ -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;

View File

@@ -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<OverlayItem*> Overlay::getItems() {