From 9ff614095f907d92ad8f11cb79653fc7c4399788 Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Thu, 8 May 2025 01:57:59 -0500 Subject: [PATCH] [nostalgia/gfx/studio/tilesheet] Fix Delete Tile functionality --- .../commands/deletetilescommand.cpp | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/nostalgia/modules/gfx/src/studio/tilesheeteditor/commands/deletetilescommand.cpp b/src/nostalgia/modules/gfx/src/studio/tilesheeteditor/commands/deletetilescommand.cpp index e7cf50ae..f985e156 100644 --- a/src/nostalgia/modules/gfx/src/studio/tilesheeteditor/commands/deletetilescommand.cpp +++ b/src/nostalgia/modules/gfx/src/studio/tilesheeteditor/commands/deletetilescommand.cpp @@ -8,14 +8,14 @@ namespace nostalgia::gfx { -gfx::DeleteTilesCommand::DeleteTilesCommand( +DeleteTilesCommand::DeleteTilesCommand( TileSheet &img, TileSheet::SubSheetIdx idx, - std::size_t tileIdx, - std::size_t tileCnt) noexcept: + std::size_t const tileIdx, + std::size_t const tileCnt) noexcept: m_img(img), m_idx(std::move(idx)) { - const unsigned bytesPerTile = m_img.bpp == 4 ? PixelsPerTile / 2 : PixelsPerTile; + constexpr unsigned bytesPerTile = PixelsPerTile; m_deletePos = tileIdx * bytesPerTile; m_deleteSz = tileCnt * bytesPerTile; m_deletedPixels.resize(m_deleteSz); @@ -31,13 +31,17 @@ gfx::DeleteTilesCommand::DeleteTilesCommand( ox::Error gfx::DeleteTilesCommand::redo() noexcept { auto &s = getSubSheet(m_img, m_idx); auto &p = s.pixels; - auto srcPos = m_deletePos + m_deleteSz; - auto const src = &p[srcPos]; + auto const srcPos = m_deletePos + m_deleteSz; auto const dst1 = &p[m_deletePos]; auto const dst2 = &p[(p.size() - m_deleteSz)]; OX_ALLOW_UNSAFE_BUFFERS_BEGIN - ox::memmove(dst1, src, p.size() - srcPos); - ox::memset(dst2, 0, m_deleteSz * sizeof(decltype(p[0]))); + if (srcPos < p.size()) { + auto const src = &p[srcPos]; + ox::memmove(dst1, src, p.size() - srcPos); + ox::memset(dst2, 0, m_deleteSz * sizeof(decltype(p[0]))); + } else { + ox::memset(dst1, 0, p.size() - m_deletePos); + } OX_ALLOW_UNSAFE_BUFFERS_END return {}; } @@ -46,11 +50,14 @@ ox::Error DeleteTilesCommand::undo() noexcept { auto &s = getSubSheet(m_img, m_idx); auto &p = s.pixels; auto const src = &p[m_deletePos]; - auto const dst1 = &p[m_deletePos + m_deleteSz]; - auto const dst2 = src; auto const sz = p.size() - m_deletePos - m_deleteSz; + auto const srcPos = m_deletePos + m_deleteSz; OX_ALLOW_UNSAFE_BUFFERS_BEGIN - ox::memmove(dst1, src, sz); + if (srcPos < p.size()) { + auto const dst1 = &p[m_deletePos + m_deleteSz]; + ox::memmove(dst1, src, sz); + } + auto const dst2 = src; ox::memcpy(dst2, m_deletedPixels.data(), m_deletedPixels.size()); OX_ALLOW_UNSAFE_BUFFERS_END return {};