mirror of https://github.com/mgba-emu/mgba.git
Qt: Fix crash in sprite view for partially out-of-bounds sprites (fixes #2165)
This commit is contained in:
parent
cce8ab2cd1
commit
d990f9bdb7
1
CHANGES
1
CHANGES
|
@ -14,6 +14,7 @@ Other fixes:
|
||||||
- GBA: Fix out of bounds ROM accesses on patched ROMs smaller than 32 MiB
|
- GBA: Fix out of bounds ROM accesses on patched ROMs smaller than 32 MiB
|
||||||
- Qt: Fix infrequent deadlock when using sync to video
|
- Qt: Fix infrequent deadlock when using sync to video
|
||||||
- Qt: Fix applying savetype-only overrides
|
- Qt: Fix applying savetype-only overrides
|
||||||
|
- Qt: Fix crash in sprite view for partially out-of-bounds sprites (fixes mgba.io/i/2165)
|
||||||
- Util: Fix loading UPS patches that affect the last byte of the file
|
- Util: Fix loading UPS patches that affect the last byte of the file
|
||||||
Misc:
|
Misc:
|
||||||
- Core: Suspend runloop when a core crashes
|
- Core: Suspend runloop when a core crashes
|
||||||
|
|
|
@ -131,15 +131,19 @@ void ObjView::updateTilesGBA(bool force) {
|
||||||
m_objInfo = newInfo;
|
m_objInfo = newInfo;
|
||||||
m_tileOffset = newInfo.tile;
|
m_tileOffset = newInfo.tile;
|
||||||
mTileCache* tileCache = mTileCacheSetGetPointer(&m_cacheSet->tiles, newInfo.paletteSet);
|
mTileCache* tileCache = mTileCacheSetGetPointer(&m_cacheSet->tiles, newInfo.paletteSet);
|
||||||
|
unsigned maxTiles = mTileCacheSystemInfoGetMaxTiles(tileCache->sysConfig);
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (unsigned y = 0; y < newInfo.height; ++y) {
|
for (unsigned y = 0; y < newInfo.height; ++y) {
|
||||||
for (unsigned x = 0; x < newInfo.width; ++x, ++i, ++tile, ++tileBase) {
|
for (unsigned x = 0; x < newInfo.width; ++x, ++i, ++tile, ++tileBase) {
|
||||||
const color_t* data = mTileCacheGetTileIfDirty(tileCache, &m_tileStatus[16 * tileBase], tile, newInfo.paletteId);
|
if (tile < maxTiles) {
|
||||||
if (data) {
|
const color_t* data = mTileCacheGetTileIfDirty(tileCache, &m_tileStatus[16 * tileBase], tile, newInfo.paletteId);
|
||||||
m_ui.tiles->setTile(i, data);
|
if (data) {
|
||||||
} else if (force) {
|
m_ui.tiles->setTile(i, data);
|
||||||
m_ui.tiles->setTile(i, mTileCacheGetTile(tileCache, tile, newInfo.paletteId));
|
} else if (force) {
|
||||||
|
m_ui.tiles->setTile(i, mTileCacheGetTile(tileCache, tile, newInfo.paletteId));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
m_ui.tiles->clearTile(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tile += newInfo.stride - newInfo.width;
|
tile += newInfo.stride - newInfo.width;
|
||||||
|
|
|
@ -44,6 +44,16 @@ void TilePainter::mousePressEvent(QMouseEvent* event) {
|
||||||
emit indexPressed(y * (width() / m_size) + x);
|
emit indexPressed(y * (width() / m_size) + x);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TilePainter::clearTile(int index) {
|
||||||
|
QPainter painter(&m_backing);
|
||||||
|
int w = width() / m_size;
|
||||||
|
int x = index % w;
|
||||||
|
int y = index / w;
|
||||||
|
QRect r(x * m_size, y * m_size, m_size, m_size);
|
||||||
|
painter.eraseRect(r);
|
||||||
|
update(r);
|
||||||
|
}
|
||||||
|
|
||||||
void TilePainter::setTile(int index, const color_t* data) {
|
void TilePainter::setTile(int index, const color_t* data) {
|
||||||
QPainter painter(&m_backing);
|
QPainter painter(&m_backing);
|
||||||
int w = width() / m_size;
|
int w = width() / m_size;
|
||||||
|
|
|
@ -22,6 +22,7 @@ public:
|
||||||
QPixmap backing() const { return m_backing; }
|
QPixmap backing() const { return m_backing; }
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
void clearTile(int index);
|
||||||
void setTile(int index, const color_t*);
|
void setTile(int index, const color_t*);
|
||||||
void setTileCount(int tiles);
|
void setTileCount(int tiles);
|
||||||
void setTileMagnification(int mag);
|
void setTileMagnification(int mag);
|
||||||
|
|
Loading…
Reference in New Issue