mirror of
https://github.com/huderlem/porymap.git
synced 2026-09-10 09:55:41 -05:00
use single image per layer for overlay renders
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user