Fix crash if layout blockdata size mismatches layout dimensions

This commit is contained in:
Diegoisawesome 2019-01-07 12:06:25 -06:00 committed by huderlem
parent fd58eb9dab
commit aa0709243d
5 changed files with 14 additions and 4 deletions

View file

@ -5,6 +5,7 @@
#include <QObject> #include <QObject>
#include <QByteArray> #include <QByteArray>
#include <QVector>
class Blockdata : public QObject class Blockdata : public QObject
{ {
@ -16,7 +17,7 @@ public:
} }
public: public:
QList<Block> *blocks = nullptr; QVector<Block> *blocks = nullptr;
void addBlock(uint16_t); void addBlock(uint16_t);
void addBlock(Block); void addBlock(Block);
QByteArray serialize(); QByteArray serialize();

View file

@ -1,6 +1,6 @@
#include "block.h" #include "block.h"
Block::Block() { Block::Block() : tile(0), collision(0), elevation(0) {
} }
Block::Block(uint16_t word) Block::Block(uint16_t word)

View file

@ -2,7 +2,7 @@
Blockdata::Blockdata(QObject *parent) : QObject(parent) Blockdata::Blockdata(QObject *parent) : QObject(parent)
{ {
blocks = new QList<Block>; blocks = new QVector<Block>;
} }
void Blockdata::addBlock(uint16_t word) { void Blockdata::addBlock(uint16_t word) {

View file

@ -775,6 +775,15 @@ void Project::loadBlockdata(Map* map) {
QString path = QString("%1/%2").arg(root).arg(map->layout->blockdata_path); QString path = QString("%1/%2").arg(root).arg(map->layout->blockdata_path);
map->layout->blockdata = readBlockdata(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) { void Project::setNewMapBlockdata(Map* map) {

View file

@ -24,7 +24,7 @@ void BorderMetatilesPixmapItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
void BorderMetatilesPixmapItem::draw() { void BorderMetatilesPixmapItem::draw() {
QImage image(32, 32, QImage::Format_RGBA8888); QImage image(32, 32, QImage::Format_RGBA8888);
QPainter painter(&image); QPainter painter(&image);
QList<Block> *blocks = map->layout->border->blocks; QVector<Block> *blocks = map->layout->border->blocks;
for (int i = 0; i < 2; i++) { for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) { for (int j = 0; j < 2; j++) {