diff --git a/src/tmxmap.cpp b/src/tmxmap.cpp index 6d4ba2b..f160839 100644 --- a/src/tmxmap.cpp +++ b/src/tmxmap.cpp @@ -75,9 +75,10 @@ template auto beg = std::find_if_not(base64.begin(), base64.end(), ::isspace); if (beg == std::end(base64)) { return std::nullopt; } auto end = std::find_if_not(base64.rbegin(), base64.rend(), ::isspace); - std::size_t begOff = std::distance(base64.begin(), beg); - std::size_t endOff = std::distance(end, base64.rend()) - begOff; - const auto trimmed = base64.substr(begOff, endOff); + auto begOff = std::distance(base64.begin(), beg); + auto endOff = std::distance(end, base64.rend()) - begOff; + using size_type = std::string::size_type; + const auto trimmed = base64.substr(static_cast(begOff), static_cast(endOff)); // Decode base64 string return base64_decode(trimmed); @@ -123,7 +124,6 @@ enum class Compression { NONE, GZIP, ZLIB, ZSTD, INVALID }; case Compression::ZLIB: { // Decompress gzip/zlib data with zlib/zlib data miniz - auto dstSize = static_cast(sizeof(uint32_t) * destination.size()); z_stream s = { .next_in = const_cast(source.data()), @@ -150,7 +150,11 @@ enum class Compression { NONE, GZIP, ZLIB, ZSTD, INVALID }; source.data(), source.size()); return !ZSTD_isError(res); } - default: return false; + // Define all labels to shut up linters + case Compression::NONE: + case Compression::INVALID: + //default: + return false; } } @@ -160,9 +164,11 @@ void TmxMap::ReadTileset(const pugi::xml_node& xNode) std::string_view source = xNode.attribute("source").value(); auto firstGid = UintFromStr(xNode.attribute("firstgid").value()).value_or(0); - auto lastGid = UintFromStr(xNode.attribute("lastgid").value()).value_or(0); + auto numTiles = UintFromStr(xNode.attribute("tilecount").value()).value_or(0); + if (numTiles == 0) + return; // FIXME: warn about empty tilesets or something - mTilesets.emplace_back(TmxTileset(name, source, firstGid, lastGid)); + mTilesets.emplace_back(TmxTileset(name, source, firstGid, numTiles)); } void TmxMap::ReadLayer(const pugi::xml_node& xNode) @@ -172,8 +178,8 @@ void TmxMap::ReadLayer(const pugi::xml_node& xNode) // Read layer size int width = IntFromStr(xNode.attribute("width").value()).value_or(0); int height = IntFromStr(xNode.attribute("height").value()).value_or(0); - if (width <= 0 || height <= 0) - return; + if (width <= 0 || height <= 0) { return; } + const auto numTiles = static_cast(width) * static_cast(height); auto xData = xNode.child("data"); if (xData.empty() || xData.first_child().empty()) @@ -192,7 +198,7 @@ void TmxMap::ReadLayer(const pugi::xml_node& xNode) auto compression = CompressionFromStr(xData.attribute("compression").value()); if (compression == Compression::GZIP || compression == Compression::ZLIB || compression == Compression::ZSTD) { - tileDat.resize(width * height); + tileDat.resize(numTiles); if (!Decompress(compression, tileDat, decoded.value())) return; } @@ -206,6 +212,12 @@ void TmxMap::ReadLayer(const pugi::xml_node& xNode) return; } } + else if (encoding == Encoding::XML) + { + tileDat.reserve(numTiles); + std::ranges::transform(xData.children("tile"), std::back_inserter(tileDat), [](auto it) + -> uint32_t { return UintFromStr(it.attribute("gid").value()).value_or(0); }); + } else { //TODO diff --git a/src/tmxreader.cpp b/src/tmxreader.cpp index 8814886..a223856 100644 --- a/src/tmxreader.cpp +++ b/src/tmxreader.cpp @@ -61,7 +61,7 @@ TmxReader::Error TmxReader::Open(const std::string& inPath, // Read graphics layer mGraphics.reserve(numTiles); for (auto tmxTile : layerGfx.value().get().Tiles()) - mGraphics.emplace_back(Tile{ tmxTile & ~FLIP_MASK, static_cast((tmxTile & FLIP_MASK) >> 28) }); + mGraphics.emplace_back(Tile{ tmxTile & ~TmxLayer::FLIP_MASK, static_cast((tmxTile & TmxLayer::FLIP_MASK) >> 28) }); // Read optional layers if (layerPal.has_value()) @@ -69,7 +69,7 @@ TmxReader::Error TmxReader::Open(const std::string& inPath, std::vector v; v.reserve(numTiles); for (auto tmxTile : layerPal.value().get().Tiles()) - v.emplace_back(tmxTile & ~FLIP_MASK); + v.emplace_back(tmxTile & ~TmxLayer::FLIP_MASK); mPalette.emplace(v); } if (layerCls.has_value()) @@ -77,15 +77,15 @@ TmxReader::Error TmxReader::Open(const std::string& inPath, std::vector v; v.reserve(numTiles); for (auto tmxTile : layerCls.value().get().Tiles()) - v.emplace_back(tmxTile & ~FLIP_MASK); + v.emplace_back(tmxTile & ~TmxLayer::FLIP_MASK); mCollision.emplace(v); } // Read tilesets const auto& tilesets = map.Tilesets(); mGidTable.reserve(tilesets.size()); - for (const auto& set : tilesets) - mGidTable.emplace_back(set.GidRange()); + std::ranges::transform(tilesets, std::back_inserter(mGidTable), + [](const auto& it) { return it.GidRange(); }); // Read objects /* diff --git a/src/tmxtileset.hpp b/src/tmxtileset.hpp index 37102c0..73466f9 100644 --- a/src/tmxtileset.hpp +++ b/src/tmxtileset.hpp @@ -10,15 +10,16 @@ class TmxTileset { std::string mName, mSource; - uint32_t mFirstGid = 0, mLastGid = 0; + uint32_t mFirstGid = 0, mTileCount = 0; public: - TmxTileset(const std::string_view name, const std::string_view source, uint32_t firstGid, uint32_t lastGid) - : mName(name), mSource(source), mFirstGid(firstGid), mLastGid(lastGid) {} + TmxTileset(const std::string_view name, const std::string_view source, uint32_t firstGid, uint32_t tileCount) + : mName(name), mSource(source), mFirstGid(firstGid), mTileCount(tileCount) {} [[nodiscard]] const std::string_view Name() const noexcept { return mName; } [[nodiscard]] const std::string_view Source() const noexcept { return mSource; } - [[nodiscard]] constexpr const std::pair GidRange() const noexcept { return { mFirstGid, mLastGid }; } + [[nodiscard]] constexpr const std::pair GidRange() const noexcept + { return { mFirstGid, mFirstGid + mTileCount - 1 }; } }; #endif//TMXTILESET_HPP