Add helper struct
This commit is contained in:
@@ -26,6 +26,16 @@ namespace OpenVulkano::Scene
|
|||||||
uint8_t version = 1;
|
uint8_t version = 1;
|
||||||
[[maybe_unused]] uint16_t reserved = 0;
|
[[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)
|
FontAtlas::FontAtlas(const std::filesystem::path& path)
|
||||||
@@ -97,21 +107,18 @@ namespace OpenVulkano::Scene
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void FontAtlas::Load(const std::span<char> data)
|
void FontAtlas::Load(const std::span<char> data)
|
||||||
{
|
{
|
||||||
if (data.size() < 28) { Logger::DATA->warn("Font atlas file is invalid!"); return; };
|
if (data.size() < sizeof(EndOfFileHeader) + sizeof(Metadata)) { Logger::DATA->warn("Font atlas file is invalid!"); return; };
|
||||||
FontAtlasFileFlags flags;
|
EndOfFileHeader eofHeader;
|
||||||
std::memcpy(&flags, data.data() + data.size() - sizeof(flags), sizeof(flags));
|
std::memcpy(&eofHeader, data.data() + data.size() - sizeof(EndOfFileHeader), sizeof(EndOfFileHeader));
|
||||||
size_t headerSize = sizeof(FontAtlasFileFlags) + sizeof(uint64_t);
|
|
||||||
uint64_t metadataSize = *reinterpret_cast<uint64_t*>(data.data() + data.size() - headerSize);
|
|
||||||
char* metadata = data.data() + data.size() - headerSize - metadataSize;
|
|
||||||
|
|
||||||
if (flags.packed == 0) throw std::runtime_error("No longer support loading of unpacked font atlas!");
|
if (eofHeader.flags.packed == 0) throw std::runtime_error("No longer support loading of unpacked font atlas!");
|
||||||
LoadImage({ data.data(), data.size() - headerSize - metadataSize });
|
LoadImage(data);
|
||||||
|
|
||||||
std::span metadataSpan(metadata, metadataSize);
|
char* metadata = data.data() + data.size() - sizeof(EndOfFileHeader) - eofHeader.metadataSize;
|
||||||
if (flags.version == 0) LoadLegacy(metadataSpan);
|
const std::span metadataSpan(metadata, eofHeader.metadataSize);
|
||||||
|
if (eofHeader.flags.version == 0) LoadLegacy(metadataSpan);
|
||||||
else LoadNew(metadataSpan);
|
else LoadNew(metadataSpan);
|
||||||
if (GetAtlasType() >= FontAtlasType::BITMAP) m_texture.m_samplerConfig = &SamplerConfig::NEAREST;
|
if (GetAtlasType() >= FontAtlasType::BITMAP) m_texture.m_samplerConfig = &SamplerConfig::NEAREST;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user