diff --git a/src/nostalgia/modules/gfx/src/studio/subcommands/export-tilesheet/export-tilesheet.cpp b/src/nostalgia/modules/gfx/src/studio/subcommands/export-tilesheet/export-tilesheet.cpp index 4eff3854..03f510ba 100644 --- a/src/nostalgia/modules/gfx/src/studio/subcommands/export-tilesheet/export-tilesheet.cpp +++ b/src/nostalgia/modules/gfx/src/studio/subcommands/export-tilesheet/export-tilesheet.cpp @@ -14,6 +14,7 @@ #include "export-tilesheet.hpp" +#include "nostalgia/gfx/tilesheet.hpp" #include "studio/context.hpp" @@ -71,6 +72,32 @@ static ox::Error toPngFile( 8))); } +ox::Error exportSubsheetToPng( + TileSheet::SubSheet const &s, + Palette const &pal, + size_t const palPage, + ox::CStringViewCR dstPath, + int const scale) noexcept { + // subsheet to png + auto const width = s.columns * TileWidth; + auto const height = s.rows * TileHeight; + auto const err = toPngFile( + dstPath, + normalizePixelArrangement( + normalizePixelSizes(s.pixels), + s.columns, + scale), + pal, + palPage, + static_cast(width * scale), + static_cast(height * scale)); + if (err) { + oxErrorf("TileSheet export failed: {}", toStr(err)); + return ox::Error{7, "TileSheet export failed"}; + } + return {}; +} + ox::Error exportSubsheetToPng( TileSheet const &src, Palette const &pal, @@ -84,23 +111,12 @@ ox::Error exportSubsheetToPng( if (ssErr) { return ox::Error{6, "failed to find SubSheet"}; } - auto const width = s->columns * TileWidth; - auto const height = s->rows * TileHeight; - auto const err = toPngFile( - dstPath, - normalizePixelArrangement( - normalizePixelSizes(s->pixels), - s->columns, - scale), - pal, - palPage, - static_cast(width * scale), - static_cast(height * scale)); - if (err) { - oxErrorf("TileSheet export failed: {}", toStr(err)); - return ox::Error{7, "TileSheet export failed"}; - } - return {}; + return exportSubsheetToPng( + *s, + pal, + palPage, + dstPath, + scale); } ox::Error cmdExportTilesheet(studio::Project &project, ox::SpanView const args) noexcept { @@ -120,7 +136,7 @@ ox::Error cmdExportTilesheet(studio::Project &project, ox::SpanView OX_REQUIRE(srcPath, clargs.getString("src-path").transformError(1, "no src path specified")); OX_REQUIRE(dstPath, clargs.getString("dst-path").transformError(2, "no dst path specified")); auto const palPath = clargs.getString("pal-path", ""); - auto const subsheetPath = clargs.getString("subsheet-path").or_value({}); + auto const subsheetPath = clargs.getString("subsheet-path").or_value(ox::String{"Root"}); auto const palPage = static_cast(clargs.getInt("pal-page", 0)); auto const scale = clargs.getInt("scale", 1); showUsage = false; diff --git a/src/nostalgia/modules/gfx/src/studio/subcommands/export-tilesheet/export-tilesheet.hpp b/src/nostalgia/modules/gfx/src/studio/subcommands/export-tilesheet/export-tilesheet.hpp index 0224619f..ee0faf2d 100644 --- a/src/nostalgia/modules/gfx/src/studio/subcommands/export-tilesheet/export-tilesheet.hpp +++ b/src/nostalgia/modules/gfx/src/studio/subcommands/export-tilesheet/export-tilesheet.hpp @@ -8,6 +8,13 @@ namespace nostalgia::gfx { +ox::Error exportSubsheetToPng( + TileSheet::SubSheet const &s, + Palette const &pal, + size_t palPage, + ox::CStringViewCR dstPath, + int scale) noexcept; + ox::Error exportSubsheetToPng( TileSheet const &src, Palette const &pal, diff --git a/src/nostalgia/modules/gfx/src/studio/tilesheeteditor/tilesheeteditor-imgui.cpp b/src/nostalgia/modules/gfx/src/studio/tilesheeteditor/tilesheeteditor-imgui.cpp index 6640c1eb..b894d984 100644 --- a/src/nostalgia/modules/gfx/src/studio/tilesheeteditor/tilesheeteditor-imgui.cpp +++ b/src/nostalgia/modules/gfx/src/studio/tilesheeteditor/tilesheeteditor-imgui.cpp @@ -11,6 +11,7 @@ #include +#include "../subcommands/export-tilesheet/export-tilesheet.hpp" #include "tilesheeteditor-imgui.hpp" namespace nostalgia::gfx { @@ -37,58 +38,6 @@ OX_MODEL_BEGIN(TileSheetEditorConfig) OX_MODEL_FIELD_RENAME(activeSubsheet, active_subsheet) OX_MODEL_END() -static ox::Vector normalizePixelSizes( - ox::Vector const &inPixels) noexcept { - ox::Vector outPixels; - outPixels.reserve(inPixels.size()); - outPixels.resize(inPixels.size()); - for (std::size_t i = 0; i < inPixels.size(); ++i) { - outPixels[i] = inPixels[i]; - } - return outPixels; -} - -static ox::Vector normalizePixelArrangement( - ox::Vector const &inPixels, - int const cols, - int const scale) { - auto const scalePt = ox::Point{scale, scale}; - auto const width = cols * TileWidth; - auto const height = static_cast(inPixels.size()) / width; - auto const dstWidth = width * scale; - ox::Vector outPixels(static_cast((width * scale) * (height * scale))); - for (std::size_t dstIdx = 0; dstIdx < outPixels.size(); ++dstIdx) { - auto const dstPt = ox::Point{ - static_cast(dstIdx) % dstWidth, - static_cast(dstIdx) / dstWidth}; - auto const srcPt = dstPt / scalePt; - auto const srcIdx = ptToIdx(srcPt, cols); - outPixels[dstIdx] = inPixels[srcIdx]; - } - return outPixels; -} - -static ox::Error toPngFile( - ox::CStringViewCR path, - ox::Vector &&pixels, - Palette const &pal, - size_t const page, - unsigned const width, - unsigned const height) noexcept { - for (auto &c : pixels) { - c = color32(color(pal, page, c)) | static_cast(0XFF << 24); - } - constexpr auto fmt = LCT_RGBA; - return ox::Error(static_cast( - lodepng_encode_file( - path.c_str(), - reinterpret_cast(pixels.data()), - width, - height, - fmt, - 8))); -} - TileSheetEditorImGui::TileSheetEditorImGui(studio::Context &sctx, ox::StringParam path): Editor{sctx, std::move(path)}, m_sctx{sctx}, @@ -421,21 +370,7 @@ ox::Error TileSheetEditorImGui::exportSubsheetToPng(int const scale) const noexc // subsheet to png auto const &s = m_model.activeSubSheet(); auto const &pal = m_model.pal(); - auto const width = s.columns * TileWidth; - auto const height = s.rows * TileHeight; - auto pixels = normalizePixelSizes(s.pixels); - pixels = normalizePixelArrangement(pixels, s.columns, scale); - auto const err = toPngFile( - path, - std::move(pixels), - pal, - m_model.palettePage(), - static_cast(width * scale), - static_cast(height * scale)); - if (err) { - oxErrorf("TileSheet export failed: {}", toStr(err)); - } - return err; + return gfx::exportSubsheetToPng(s, pal, m_model.palettePage(), path, scale); } void TileSheetEditorImGui::drawTileSheet(ox::Vec2 const &fbSize) noexcept {