summaryrefslogtreecommitdiff
path: root/src/serialization-font.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-05-20 21:08:19 -0400
committerJonathan Bradley <jcb@pikum.xyz>2025-05-20 21:08:19 -0400
commit40d69e7e40a18865a31af2f55efcde369d36dbbb (patch)
tree95a2cbbe40192183d13f846f3444b32d7e12b0e8 /src/serialization-font.cpp
parentead9e484db969a880470d625b1884aced296e722 (diff)
pke: serialization overhaul + embedded assets
Diffstat (limited to 'src/serialization-font.cpp')
-rw-r--r--src/serialization-font.cpp140
1 files changed, 91 insertions, 49 deletions
diff --git a/src/serialization-font.cpp b/src/serialization-font.cpp
index 761643c..b57e6e7 100644
--- a/src/serialization-font.cpp
+++ b/src/serialization-font.cpp
@@ -1,13 +1,16 @@
#include "serialization-font.hpp"
+#include "ecs.hpp"
+#include "font.hpp"
#include "pk.h"
+#include "serialization.hpp"
pk_handle pke_serialize_font_render(srlztn_serialize_helper *h, FontRender *fr) {
assert(h != nullptr);
assert(fr != nullptr);
char *s;
- pk_handle inst_pos_handle;
+ pk_handle font_render_settings_handle;
pke_kve kve{};
pke_kve_container kvec{};
@@ -15,55 +18,88 @@ pk_handle pke_serialize_font_render(srlztn_serialize_helper *h, FontRender *fr)
return PK_HANDLE_MAX;
}
+ font_render_settings_handle = pke_serialize_font_render_settings(h, &fr->settings);
+
kvec.srlztn_handle = h->handle_head;
- kvec.type_code = cstring_to_pk_cstr(SRLZTN_OBJ_CAMERA);
+ kvec.type_code = cstring_to_pk_cstr(SRLZTN_OBJ_FONT_RENDER);
kvec.bkt = h->bkt;
kvec.arr.bkt = h->bkt;
kvec.children.bkt = h->bkt;
kvec.child_handles.bkt = h->bkt;
h->handle_head.itemIndex++;
- pk_arr_append_t(&kvec.child_handles, inst_pos_handle);
+ pk_arr_append_t(&kvec.child_handles, font_render_settings_handle);
- if (fr->uuid != pk_uuid_zed && fr->uuid != pk_uuid_max) {
- kve.key = SRLZTN_UI_BOX_UUID;
+ {
+ kve.key = SRLZTN_UI_FONT_RENDER_UUID;
s = pk_new<char>(37, h->bkt);
sprintf(s, pk_uuid_printf_format, pk_uuid_printf_var(fr->uuid));
kve.val = s;
kve.end = SRLZTN_KVE_END;
pk_arr_append_t(&kvec.arr, kve);
}
+ {
+ kve.key = SRLZTN_UI_FONT_RENDER_FONT_TYPE_UUID;
+ s = pk_new<char>(37, h->bkt);
+ FontType *ft = FontType_Get(fr->fr_handle.index_ft);
+ sprintf(s, pk_uuid_printf_format, pk_uuid_printf_var(ft->uuid));
+ kve.val = s;
+ kve.end = SRLZTN_KVE_END;
+ pk_arr_append_t(&kvec.arr, kve);
+ }
if (fr->text.val != nullptr) {
kve.key = SRLZTN_UI_FONT_RENDER_TEXT_BEGIN;
- s = pk_new<char>(fr->text.reserved, h->bkt);
- sprintf(s, "%s", fr->text.val);
+ s = pk_new<char>(strlen(fr->text.val) + 3, h->bkt);
+ sprintf(s, "\n%s\n", fr->text.val);
kve.val = s;
kve.end = SRLZTN_MULTILINE_END;
pk_arr_append_t(&kvec.arr, kve);
}
pk_arr_append_t(&h->kvp_containers, kvec);
- return pke_serialize_font_render_settings(h, &fr->settings);
+ kvec.arr.data = nullptr;
+ kvec.children.data = nullptr;
+ kvec.child_handles.data = nullptr;
+ return kvec.srlztn_handle;
}
-void pke_deserialize_font_render(srlztn_deserialize_helper *h, pke_kve_container *kvec, FontRender *fr) {
+void pke_deserialize_font_render(srlztn_deserialize_helper *h, pke_kve_container *kvec) {
assert(h != nullptr);
- assert(fr != nullptr);
+ assert(kvec != nullptr);
+ assert(kvec->children.next == 1);
+
+ pke_kve *kve = nullptr;
+ pk_uuid uuid;
+ pk_uuid font_type_uuid;
+ pk_cstr str;
+ FontRenderSettings frs{};
+ pke_deserialize_font_render_settings(h, kvec->children[0], &frs);
+
uint32_t i;
char *s;
for (i = 0; i < kvec->arr.next; ++i) {
- if (strncmp(kvec->arr[i].key, SRLZTN_UI_FONT_RENDER_UUID, strlen(SRLZTN_UI_FONT_RENDER_UUID)) == 0) {
- kvec->arr[i].val >> fr->uuid;
+ kve = &kvec->arr[i];
+ if (strcmp(kve->key, SRLZTN_UI_FONT_RENDER_UUID) == 0) {
+ kve->val >> uuid;
+ continue;
+ }
+ if (strcmp(kve->key, SRLZTN_UI_FONT_RENDER_FONT_TYPE_UUID) == 0) {
+ kve->val >> font_type_uuid;
continue;
}
- if (strncmp(kvec->arr[i].key, SRLZTN_UI_FONT_RENDER_TEXT_BEGIN, strlen(SRLZTN_UI_FONT_RENDER_TEXT_BEGIN)) == 0) {
- fr->text.length = strlen(kvec->arr[i].val) + 1;
- fr->text.reserved = fr->text.reserved + 1;
- // TODO specific bkt
- s = pk_new<char>(fr->text.reserved, NULL);
- fr->text.val = s;
+ if (strcmp(kve->key, SRLZTN_UI_FONT_RENDER_TEXT_BEGIN) == 0) {
+ str.length = strlen(kve->val) + 1;
+ str.reserved = str.length + 1;
+ // TODO specific bkt?
+ s = pk_new<char>(str.reserved, NULL);
+ sprintf(s, "%s", kve->val);
+ str.val = s;
continue;
}
}
+
+ FontType *font_type_ent = static_cast<FontType *>(ECS_GetEntityByUUID(font_type_uuid));
+ // parent is set later - up to the parent to take ownership
+ FontType_AddStringRender(font_type_ent->index_ft, std::move(str), &frs, nullptr, uuid);
}
pk_handle pke_serialize_font_render_settings(srlztn_serialize_helper *h, FontRenderSettings *frs) {
@@ -80,7 +116,7 @@ pk_handle pke_serialize_font_render_settings(srlztn_serialize_helper *h, FontRen
kvec.child_handles.bkt = h->bkt;
h->handle_head.itemIndex++;
- if (frs->char_scale != 0.0) {
+ {
kve.key = SRLZTN_UI_FONT_RENDER_SETTINGS_CHAR_SCALE;
len = snprintf(NULL, 0, "%f", frs->char_scale);
s = pk_new<char>(len+1, h->bkt);
@@ -89,7 +125,7 @@ pk_handle pke_serialize_font_render_settings(srlztn_serialize_helper *h, FontRen
kve.end = SRLZTN_KVE_END;
pk_arr_append_t(&kvec.arr, kve);
}
- if (frs->line_height_scale != 0.0) {
+ {
kve.key = SRLZTN_UI_FONT_RENDER_SETTINGS_LINE_HEIGHT_SCALE;
len = snprintf(NULL, 0, "%f", frs->line_height_scale);
s = pk_new<char>(len+1, h->bkt);
@@ -98,7 +134,7 @@ pk_handle pke_serialize_font_render_settings(srlztn_serialize_helper *h, FontRen
kve.end = SRLZTN_KVE_END;
pk_arr_append_t(&kvec.arr, kve);
}
- if (frs->char_spacing_scale != 0.0) {
+ {
kve.key = SRLZTN_UI_FONT_RENDER_SETTINGS_CHAR_SPACING_SCALE;
len = snprintf(NULL, 0, "%f", frs->char_spacing_scale);
s = pk_new<char>(len+1, h->bkt);
@@ -107,25 +143,25 @@ pk_handle pke_serialize_font_render_settings(srlztn_serialize_helper *h, FontRen
kve.end = SRLZTN_KVE_END;
pk_arr_append_t(&kvec.arr, kve);
}
- if (frs->surface_area_size != glm::ivec2(0)) {
+ {
kve.key = SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_SIZE;
- len = snprintf(NULL, 0, "%d, %d", frs->surface_area_size.x, frs->surface_area_size.y);
+ len = snprintf(NULL, 0, "%d%s%d", frs->surface_area_size.x, SRLZTN_NUM_SEPARATOR, frs->surface_area_size.y);
s = pk_new<char>(len+1, h->bkt);
- sprintf(s, "%d, %d", frs->surface_area_size.x, frs->surface_area_size.y);
+ sprintf(s, "%d%s%d", frs->surface_area_size.x, SRLZTN_NUM_SEPARATOR, frs->surface_area_size.y);
kve.val = s;
kve.end = SRLZTN_KVE_END;
pk_arr_append_t(&kvec.arr, kve);
}
- if (frs->surface_area_pos != glm::ivec2(0)) {
+ {
kve.key = SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_POS;
- len = snprintf(NULL, 0, "%d, %d", frs->surface_area_pos.x, frs->surface_area_pos.y);
+ len = snprintf(NULL, 0, "%d%s%d", frs->surface_area_pos.x, SRLZTN_NUM_SEPARATOR, frs->surface_area_pos.y);
s = pk_new<char>(len+1, h->bkt);
- sprintf(s, "%d, %d", frs->surface_area_pos.x, frs->surface_area_pos.y);
+ sprintf(s, "%d%s%d", frs->surface_area_pos.x, SRLZTN_NUM_SEPARATOR, frs->surface_area_pos.y);
kve.val = s;
kve.end = SRLZTN_KVE_END;
pk_arr_append_t(&kvec.arr, kve);
}
- if (frs->surface_area_type_flags != FONT_RENDER_SURFACE_AREA_TYPE_FLAGS_NONE) {
+ {
kve.key = SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_FLAGS;
s = pk_new<char>(5, h->bkt);
sprintf(s, "0x%.2X", FONT_RENDER_SURFACE_AREA_TYPE_FLAG_T(frs->surface_area_type_flags));
@@ -135,12 +171,16 @@ pk_handle pke_serialize_font_render_settings(srlztn_serialize_helper *h, FontRen
}
pk_arr_append_t(&h->kvp_containers, kvec);
+ kvec.arr.data = nullptr;
+ kvec.children.data = nullptr;
+ kvec.child_handles.data = nullptr;
return kvec.srlztn_handle;
}
void pke_deserialize_font_render_settings(srlztn_deserialize_helper *h, pke_kve_container *kvec, FontRenderSettings *frs) {
(void)h;
- uint32_t i;
+ uint32_t i, index;
+ const char *starting_char;
PK_STN_RES stn_res;
char *str_end;
for (i = 0; i < kvec->arr.next; ++i) {
@@ -166,29 +206,31 @@ void pke_deserialize_font_render_settings(srlztn_deserialize_helper *h, pke_kve_
continue;
}
if (strncmp(kvec->arr[i].key, SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_SIZE, strlen(SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_SIZE)) == 0) {
- stn_res = pk_stn(&frs->surface_area_size.x, kvec->arr[i].val, &str_end);
- if (stn_res != PK_STN_RES_SUCCESS) {
- fprintf(stderr, "[%s] Err '%u' parsing '%s' (x) primary from: '%s'\n", __FILE__, stn_res, SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_SIZE, kvec->arr[i].val);
- continue;
- }
- size_t prefix_len = strchr(kvec->arr[i].val, ',') - (kvec->arr[i].val);
- stn_res = pk_stn(&frs->surface_area_size.y, kvec->arr[i].val + prefix_len, &str_end);
- if (stn_res != PK_STN_RES_SUCCESS) {
- fprintf(stderr, "[%s] Err '%u' parsing '%s' (y) primary from: '%s'\n", __FILE__, stn_res, SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_SIZE, kvec->arr[i].val);
- }
+ starting_char = kvec->arr[i].val;
+ index = 0;
+ do {
+ assert(index < 2);
+ stn_res = pk_stn(&frs->surface_area_size[index], starting_char, &str_end);
+ if (stn_res != PK_STN_RES_SUCCESS) {
+ fprintf(stderr, "[%s] Err '%u' parsing '%s'[%i] from: '%s'\n", __FILE__, stn_res, SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_SIZE, index, kvec->arr[i].val);
+ }
+ starting_char = str_end + 1;
+ ++index;
+ } while (*str_end != '\0');
continue;
}
if (strncmp(kvec->arr[i].key, SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_POS, strlen(SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_POS)) == 0) {
- stn_res = pk_stn(&frs->surface_area_pos.x, kvec->arr[i].val, &str_end);
- if (stn_res != PK_STN_RES_SUCCESS) {
- fprintf(stderr, "[%s] Err '%u' parsing '%s' (x) primary from: '%s'\n", __FILE__, stn_res, SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_POS, kvec->arr[i].val);
- continue;
- }
- size_t prefix_len = strchr(kvec->arr[i].val, ',') - (kvec->arr[i].val);
- stn_res = pk_stn(&frs->surface_area_pos.y, kvec->arr[i].val + prefix_len, &str_end);
- if (stn_res != PK_STN_RES_SUCCESS) {
- fprintf(stderr, "[%s] Err '%u' parsing '%s' (y) primary from: '%s'\n", __FILE__, stn_res, SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_POS, kvec->arr[i].val);
- }
+ starting_char = kvec->arr[i].val;
+ index = 0;
+ do {
+ assert(index < 2);
+ stn_res = pk_stn(&frs->surface_area_pos[index], starting_char, &str_end);
+ if (stn_res != PK_STN_RES_SUCCESS) {
+ fprintf(stderr, "[%s] Err '%u' parsing '%s'[%i] from: '%s'\n", __FILE__, stn_res, SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_POS, index, kvec->arr[i].val);
+ }
+ starting_char = str_end + 1;
+ ++index;
+ } while (*str_end != '\0');
continue;
}
if (strncmp(kvec->arr[i].key, SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_FLAGS, strlen(SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_FLAGS)) == 0) {