Fix crash if layout blockdata size mismatches layout dimensions
This commit is contained in:
parent
fd58eb9dab
commit
aa0709243d
5 changed files with 14 additions and 4 deletions
|
@ -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();
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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++) {
|
||||||
|
|
Loading…
Reference in a new issue