diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-01-31 19:31:10 -0500 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-01-31 19:31:10 -0500 |
| commit | 47d3d48ad76d6a4e40da1d945cbc8940ae2922c7 (patch) | |
| tree | 233963233206323b11e440394d61d97ee68b34f3 /src/font.cpp | |
| parent | 61cb835291af07cfc59c123241c3641a2fba185f (diff) | |
pke: first-pass font serialization
Diffstat (limited to 'src/font.cpp')
| -rw-r--r-- | src/font.cpp | 71 |
1 files changed, 64 insertions, 7 deletions
diff --git a/src/font.cpp b/src/font.cpp index 3162362..45569cb 100644 --- a/src/font.cpp +++ b/src/font.cpp @@ -1,14 +1,19 @@ #include "font.hpp" #include "asset-manager.hpp" +#include "helpers.hpp" #include "pk.h" #include "window.hpp" #include "static-plane.hpp" #include "vendor-stb-image-include.h" -// #include "bucketed-array.hpp" +#include "game-settings.hpp" // TODO threading +const char *PKE_PROJECT_FONT_TITLE = "Font::Title: "; +const char *PKE_PROJECT_FONT_TEXTURE_HANDLE = "Font::TextureHandle: "; +const char *PKE_PROJECT_FONT_GLYPH_DETAILS_HANDLE = "Font::GlyphDetailsHandle: "; + TypeSafeInt_B(FontTypeIndex); TypeSafeInt_B(FontRenderIndex); @@ -36,8 +41,57 @@ void FontType_Teardown() { pk_delete(ftd.arr_ft, (FontTypeIndex_T)ftd.n_ft); } -FontType* FontType_GetFonts(FontTypeIndex &count) -{ +void FontType_Serialize(std::ofstream &stream, FontType *ft) { + NULL_CHAR_ARR(handleStr, 23); + stream << PKE_PROJECT_FONT_TITLE << ft->title.val << std::endl; + snprintf(handleStr, 22, "0x%08X 0x%08X", ft->fontTextureAssetHandle.bucketIndex, ft->fontTextureAssetHandle.itemIndex); + stream << PKE_PROJECT_FONT_TEXTURE_HANDLE << handleStr << std::endl; + snprintf(handleStr, 22, "0x%08X 0x%08X", ft->fontTextureAssetHandle.bucketIndex, ft->glyphDetailsAssetHandle.itemIndex); + stream << PKE_PROJECT_FONT_GLYPH_DETAILS_HANDLE << handleStr << std::endl; +} + +void FontType_Deserialize(std::ifstream &stream) { + NULL_CHAR_ARR(readLine, 128); + pk_cstr title; + AssetHandle fontTextureHandle; + AssetHandle glyphDetailsHandle; + while (memset(readLine, 0, 128), stream.getline(readLine, 128)) { + if (strcmp("", readLine) == 0) { + FontType_RegisterFont(title, fontTextureHandle, glyphDetailsHandle); + return; + } + if (strstr(readLine, PKE_PROJECT_FONT_TITLE)) { + uint64_t prefixLen = strlen(PKE_PROJECT_FONT_TITLE); + title.length = strlen(readLine + prefixLen); + title.reserved = title.length + 1; + title.val = pk_new<char>(title.reserved, pkeSettings.mem.bkt); + strncpy(const_cast<char*>(title.val), readLine + prefixLen, title.reserved); + continue; + } + if (strstr(readLine, PKE_PROJECT_FONT_TEXTURE_HANDLE)) { + uint64_t prefixLen = strlen(PKE_PROJECT_FONT_TEXTURE_HANDLE); + // 0x00000000 0x00000000 + readLine[prefixLen + 10] = '\0'; + STR2NUM_ERROR result1 = str2num(fontTextureHandle.bucketIndex, readLine + prefixLen + 2, 16); + STR2NUM_ERROR result2 = str2num(fontTextureHandle.itemIndex, readLine + prefixLen + 11, 16); + assert(result1 == STR2NUM_ERROR::SUCCESS); + assert(result2 == STR2NUM_ERROR::SUCCESS); + continue; + } + if (strstr(readLine, PKE_PROJECT_FONT_GLYPH_DETAILS_HANDLE)) { + uint64_t prefixLen = strlen(PKE_PROJECT_FONT_GLYPH_DETAILS_HANDLE); + // 0x00000000 0x00000000 + readLine[prefixLen + 10] = '\0'; + STR2NUM_ERROR result1 = str2num(glyphDetailsHandle.bucketIndex, readLine + prefixLen + 2, 16); + STR2NUM_ERROR result2 = str2num(glyphDetailsHandle.itemIndex, readLine + prefixLen + 11, 16); + assert(result1 == STR2NUM_ERROR::SUCCESS); + assert(result2 == STR2NUM_ERROR::SUCCESS); + continue; + } + } +} + +FontType* FontType_GetFonts(FontTypeIndex &count) { count = ftd.h_ft; return ftd.arr_ft; } @@ -74,8 +128,8 @@ FontTypeIndex FontType_RegisterFont(pk_cstr title, AssetHandle fontTextureHandle FontTypeIndex_T idx_t = (FontTypeIndex_T)idx; FontType *ft = &ftd.arr_ft[idx_t]; ft->title = title; - ft->fontTextureAssetKey = fontTextureHandle; - ft->glyphDetailsAssetKey = glyphsHandle; + ft->fontTextureAssetHandle = fontTextureHandle; + ft->glyphDetailsAssetHandle = glyphsHandle; ft->renders = pk_new<FontRender>(startingGlyphCount); ft->n_render = FontRenderIndex{startingGlyphCount}; @@ -575,8 +629,7 @@ FontTypeIndex FontType_RegisterFont(pk_cstr title, AssetHandle fontTextureHandle return idx; } -void FontType_Unload(FontTypeIndex idx) -{ +void FontType_Unload(FontTypeIndex idx) { FontType *ft = &ftd.arr_ft[(FontTypeIndex_T)idx]; if (ft->vkDescriptorSets != VK_NULL_HANDLE && ft->vkDescriptorPool != VK_NULL_HANDLE) { @@ -640,4 +693,8 @@ void FontType_Unload(FontTypeIndex idx) if (ft->deviceMemoryTexture != VK_NULL_HANDLE) vkFreeMemory(vkDevice, ft->deviceMemoryTexture, vkAllocator); ft->deviceMemoryTexture = VK_NULL_HANDLE; + + if (ft->title.reserved != 0 && ft->title.val != nullptr) { + pk_delete<char>(ft->title.val, ft->title.reserved); + } } |
