diff --git a/openVulkanoCpp/Scene/Text/FontAtlas.cpp b/openVulkanoCpp/Scene/Text/FontAtlas.cpp index 19ead41..0ec4eba 100644 --- a/openVulkanoCpp/Scene/Text/FontAtlas.cpp +++ b/openVulkanoCpp/Scene/Text/FontAtlas.cpp @@ -26,6 +26,16 @@ namespace OpenVulkano::Scene uint8_t version = 1; [[maybe_unused]] uint16_t reserved = 0; }; + + #pragma pack(push, 1) + struct EndOfFileHeader + { + uint64_t metadataSize; + FontAtlasFileFlags flags; + }; + #pragma pack(pop) + + static_assert(sizeof(EndOfFileHeader) == 12); } FontAtlas::FontAtlas(const std::filesystem::path& path) @@ -97,21 +107,18 @@ namespace OpenVulkano::Scene } } - void FontAtlas::Load(const std::span data) { - if (data.size() < 28) { Logger::DATA->warn("Font atlas file is invalid!"); return; }; - FontAtlasFileFlags flags; - std::memcpy(&flags, data.data() + data.size() - sizeof(flags), sizeof(flags)); - size_t headerSize = sizeof(FontAtlasFileFlags) + sizeof(uint64_t); - uint64_t metadataSize = *reinterpret_cast(data.data() + data.size() - headerSize); - char* metadata = data.data() + data.size() - headerSize - metadataSize; + if (data.size() < sizeof(EndOfFileHeader) + sizeof(Metadata)) { Logger::DATA->warn("Font atlas file is invalid!"); return; }; + EndOfFileHeader eofHeader; + std::memcpy(&eofHeader, data.data() + data.size() - sizeof(EndOfFileHeader), sizeof(EndOfFileHeader)); - if (flags.packed == 0) throw std::runtime_error("No longer support loading of unpacked font atlas!"); - LoadImage({ data.data(), data.size() - headerSize - metadataSize }); + if (eofHeader.flags.packed == 0) throw std::runtime_error("No longer support loading of unpacked font atlas!"); + LoadImage(data); - std::span metadataSpan(metadata, metadataSize); - if (flags.version == 0) LoadLegacy(metadataSpan); + char* metadata = data.data() + data.size() - sizeof(EndOfFileHeader) - eofHeader.metadataSize; + const std::span metadataSpan(metadata, eofHeader.metadataSize); + if (eofHeader.flags.version == 0) LoadLegacy(metadataSpan); else LoadNew(metadataSpan); if (GetAtlasType() >= FontAtlasType::BITMAP) m_texture.m_samplerConfig = &SamplerConfig::NEAREST; }