From aa0709243d720483cc00cd15c642955b901e406d Mon Sep 17 00:00:00 2001 From: Diegoisawesome Date: Mon, 7 Jan 2019 12:06:25 -0600 Subject: [PATCH] Fix crash if layout blockdata size mismatches layout dimensions --- include/core/blockdata.h | 3 ++- src/core/block.cpp | 2 +- src/core/blockdata.cpp | 2 +- src/project.cpp | 9 +++++++++ src/ui/bordermetatilespixmapitem.cpp | 2 +- 5 files changed, 14 insertions(+), 4 deletions(-) diff --git a/include/core/blockdata.h b/include/core/blockdata.h index 0bb6a7b6..35c071fb 100644 --- a/include/core/blockdata.h +++ b/include/core/blockdata.h @@ -5,6 +5,7 @@ #include #include +#include class Blockdata : public QObject { @@ -16,7 +17,7 @@ public: } public: - QList *blocks = nullptr; + QVector *blocks = nullptr; void addBlock(uint16_t); void addBlock(Block); QByteArray serialize(); diff --git a/src/core/block.cpp b/src/core/block.cpp index c064399a..bc65c923 100644 --- a/src/core/block.cpp +++ b/src/core/block.cpp @@ -1,6 +1,6 @@ #include "block.h" -Block::Block() { +Block::Block() : tile(0), collision(0), elevation(0) { } Block::Block(uint16_t word) diff --git a/src/core/blockdata.cpp b/src/core/blockdata.cpp index 34aff306..77239add 100644 --- a/src/core/blockdata.cpp +++ b/src/core/blockdata.cpp @@ -2,7 +2,7 @@ Blockdata::Blockdata(QObject *parent) : QObject(parent) { - blocks = new QList; + blocks = new QVector; } void Blockdata::addBlock(uint16_t word) { diff --git a/src/project.cpp b/src/project.cpp index 88c97c19..34be984e 100644 --- a/src/project.cpp +++ b/src/project.cpp @@ -775,6 +775,15 @@ void Project::loadBlockdata(Map* map) { QString path = QString("%1/%2").arg(root).arg(map->layout->blockdata_path); map->layout->blockdata = readBlockdata(path); + + if (map->layout->blockdata->blocks->count() != map->getWidth() * map->getHeight()) { + logWarn(QString("Layout blockdata length %1 does not match dimensions %2x%3 (should be %4). Resizing blockdata.") + .arg(map->layout->blockdata->blocks->count()) + .arg(map->getWidth()) + .arg(map->getHeight()) + .arg(map->getWidth() * map->getHeight())); + map->layout->blockdata->blocks->resize(map->getWidth() * map->getHeight()); + } } void Project::setNewMapBlockdata(Map* map) { diff --git a/src/ui/bordermetatilespixmapitem.cpp b/src/ui/bordermetatilespixmapitem.cpp index 4886e42e..2093eabe 100644 --- a/src/ui/bordermetatilespixmapitem.cpp +++ b/src/ui/bordermetatilespixmapitem.cpp @@ -24,7 +24,7 @@ void BorderMetatilesPixmapItem::mousePressEvent(QGraphicsSceneMouseEvent *event) void BorderMetatilesPixmapItem::draw() { QImage image(32, 32, QImage::Format_RGBA8888); QPainter painter(&image); - QList *blocks = map->layout->border->blocks; + QVector *blocks = map->layout->border->blocks; for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) {