summaryrefslogtreecommitdiff
path: root/src/font.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-01-31 19:31:10 -0500
committerJonathan Bradley <jcb@pikum.xyz>2025-01-31 19:31:10 -0500
commit47d3d48ad76d6a4e40da1d945cbc8940ae2922c7 (patch)
tree233963233206323b11e440394d61d97ee68b34f3 /src/font.cpp
parent61cb835291af07cfc59c123241c3641a2fba185f (diff)
pke: first-pass font serialization
Diffstat (limited to 'src/font.cpp')
-rw-r--r--src/font.cpp71
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);
+ }
}