summaryrefslogtreecommitdiff
path: root/src/serialization-font.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-05-06 13:12:24 -0400
committerJonathan Bradley <jcb@pikum.xyz>2025-05-06 13:12:24 -0400
commit32968050f0b34fdabfcc2a4fb5601d4be361bbd2 (patch)
treeacef384a2156a16d4d506c37f13f79d454a4a6e9 /src/serialization-font.cpp
parentef37d054dfe5812efa9eefb4b9b18621fdabac25 (diff)
pke: major serialization refactor, first-pass
Diffstat (limited to 'src/serialization-font.cpp')
-rw-r--r--src/serialization-font.cpp258
1 files changed, 160 insertions, 98 deletions
diff --git a/src/serialization-font.cpp b/src/serialization-font.cpp
index 60ba61d..761643c 100644
--- a/src/serialization-font.cpp
+++ b/src/serialization-font.cpp
@@ -1,143 +1,205 @@
#include "serialization-font.hpp"
+
#include "pk.h"
-#include <sstream>
-bool pke_serialize_font_render(srlztn_serialize_helper *h, FontRender *fr) {
+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;
+ pke_kve kve{};
+ pke_kve_container kvec{};
+
if (PK_HAS_FLAG(fr->entity_flags, ENTITY_FLAG_DO_NOT_SERIALIZE)) {
- return false;
+ return PK_HANDLE_MAX;
}
+
+ kvec.srlztn_handle = h->handle_head;
+ kvec.type_code = cstring_to_pk_cstr(SRLZTN_OBJ_CAMERA);
+ 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);
+
if (fr->uuid != pk_uuid_zed && fr->uuid != pk_uuid_max) {
- h->o << SRLZTN_UI_FONT_RENDER_UUID << std::endl;
+ kve.key = SRLZTN_UI_BOX_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);
}
if (fr->text.val != nullptr) {
- h->o << SRLZTN_UI_FONT_RENDER_TEXT_BEGIN << std::endl;
- h->o << fr->text.val << std::endl;
- h->o << SRLZTN_UI_FONT_RENDER_TEXT_END << std::endl;
+ kve.key = SRLZTN_UI_FONT_RENDER_TEXT_BEGIN;
+ s = pk_new<char>(fr->text.reserved, h->bkt);
+ sprintf(s, "%s", 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);
}
-bool pke_deserialize_font_render(srlztn_deserialize_helper *h, FontRender *fr) {
+void pke_deserialize_font_render(srlztn_deserialize_helper *h, pke_kve_container *kvec, FontRender *fr) {
assert(h != nullptr);
assert(fr != nullptr);
- uint64_t prefix_len;
- if (strncmp(h->read_line, SRLZTN_UI_FONT_RENDER_UUID, strlen(SRLZTN_UI_FONT_RENDER_UUID)) == 0) {
- prefix_len = strlen(SRLZTN_UI_FONT_RENDER_UUID);
- (h->read_line + prefix_len) >> fr->uuid;
- return true;
- }
- if (strncmp(h->read_line, SRLZTN_UI_FONT_RENDER_TEXT_BEGIN, strlen(SRLZTN_UI_FONT_RENDER_TEXT_BEGIN)) == 0) {
- // TODO replace with something that doesn't give the code stds
- std::ostringstream ss{};
- bool first = true;
- while (h->i->getline(h->read_line, h->read_line_len)) {
- if (strncmp(h->read_line, SRLZTN_UI_FONT_RENDER_TEXT_END, strlen(SRLZTN_UI_FONT_RENDER_TEXT_END)) == 0) {
- std::string s = ss.str();
- fr->text = cstring_to_pk_cstr(s.c_str());
- break;
- }
- if (!first) {
- first = false;
- ss << std::endl;
- }
- ss << h->read_line;
+ 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;
+ 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;
+ continue;
}
- return true;
}
- return false;
}
-bool pke_serialize_font_render_settings(srlztn_serialize_helper *h, FontRenderSettings *frs) {
+pk_handle pke_serialize_font_render_settings(srlztn_serialize_helper *h, FontRenderSettings *frs) {
+ char *s;
+ pke_kve kve{};
+ pke_kve_container kvec{};
+ int len;
+
+ kvec.srlztn_handle = h->handle_head;
+ kvec.type_code = cstring_to_pk_cstr(SRLZTN_OBJ_FONT_RENDER_SETTINGS);
+ kvec.bkt = h->bkt;
+ kvec.arr.bkt = h->bkt;
+ kvec.children.bkt = h->bkt;
+ kvec.child_handles.bkt = h->bkt;
+ h->handle_head.itemIndex++;
+
if (frs->char_scale != 0.0) {
- h->o << SRLZTN_UI_FONT_RENDER_SETTINGS_CHAR_SCALE << frs->char_scale << std::endl;
+ 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);
+ sprintf(s, "%f", frs->char_scale);
+ kve.val = s;
+ kve.end = SRLZTN_KVE_END;
+ pk_arr_append_t(&kvec.arr, kve);
}
if (frs->line_height_scale != 0.0) {
- h->o << SRLZTN_UI_FONT_RENDER_SETTINGS_LINE_HEIGHT_SCALE << frs->line_height_scale << std::endl;
+ 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);
+ sprintf(s, "%f", frs->line_height_scale);
+ kve.val = s;
+ kve.end = SRLZTN_KVE_END;
+ pk_arr_append_t(&kvec.arr, kve);
}
if (frs->char_spacing_scale != 0.0) {
- h->o << SRLZTN_UI_FONT_RENDER_SETTINGS_CHAR_SPACING_SCALE << frs->char_spacing_scale << std::endl;
+ 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);
+ sprintf(s, "%f", frs->char_spacing_scale);
+ kve.val = s;
+ kve.end = SRLZTN_KVE_END;
+ pk_arr_append_t(&kvec.arr, kve);
}
if (frs->surface_area_size != glm::ivec2(0)) {
- h->o << SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_SIZE << frs->surface_area_size.x << SRLZTN_FILE_NUM_SEPARATOR << frs->surface_area_size.y << std::endl;
+ 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);
+ s = pk_new<char>(len+1, h->bkt);
+ sprintf(s, "%d, %d", frs->surface_area_size.x, 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)) {
- h->o << SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_POS << frs->surface_area_pos.x << SRLZTN_FILE_NUM_SEPARATOR << frs->surface_area_pos.y << std::endl;
+ 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);
+ s = pk_new<char>(len+1, h->bkt);
+ sprintf(s, "%d, %d", frs->surface_area_pos.x, 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) {
- h->o << SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_FLAGS << FONT_RENDER_SURFACE_AREA_TYPE_FLAG_T(frs->surface_area_type_flags) << std::endl;
+ 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));
+ kve.val = s;
+ kve.end = SRLZTN_KVE_END;
+ pk_arr_append_t(&kvec.arr, kve);
}
- return true;
+
+ pk_arr_append_t(&h->kvp_containers, kvec);
+ return kvec.srlztn_handle;
}
-bool pke_deserialize_font_render_settings(srlztn_deserialize_helper *h, FontRenderSettings *frs) {
- uint64_t prefix_len;
+void pke_deserialize_font_render_settings(srlztn_deserialize_helper *h, pke_kve_container *kvec, FontRenderSettings *frs) {
+ (void)h;
+ uint32_t i;
PK_STN_RES stn_res;
char *str_end;
- if (strncmp(h->read_line, SRLZTN_UI_FONT_RENDER_SETTINGS_CHAR_SCALE, strlen(SRLZTN_UI_FONT_RENDER_SETTINGS_CHAR_SCALE)) == 0) {
- prefix_len = strlen(SRLZTN_UI_FONT_RENDER_SETTINGS_CHAR_SCALE);
- stn_res = pk_stn(&frs->char_scale, h->read_line + prefix_len, &str_end);
- if (stn_res != PK_STN_RES_SUCCESS) {
- fprintf(stderr, "[%s] Err '%u' parsing '%s' primary from: '%s'\n", __FILE__, stn_res, SRLZTN_UI_FONT_RENDER_SETTINGS_CHAR_SCALE, h->read_line);
- }
- return true;
- }
- if (strncmp(h->read_line, SRLZTN_UI_FONT_RENDER_SETTINGS_LINE_HEIGHT_SCALE, strlen(SRLZTN_UI_FONT_RENDER_SETTINGS_LINE_HEIGHT_SCALE)) == 0) {
- prefix_len = strlen(SRLZTN_UI_FONT_RENDER_SETTINGS_LINE_HEIGHT_SCALE);
- stn_res = pk_stn(&frs->line_height_scale, h->read_line + prefix_len, &str_end);
- if (stn_res != PK_STN_RES_SUCCESS) {
- fprintf(stderr, "[%s] Err '%u' parsing '%s' primary from: '%s'\n", __FILE__, stn_res, SRLZTN_UI_FONT_RENDER_SETTINGS_LINE_HEIGHT_SCALE, h->read_line);
- }
- return true;
- }
- if (strncmp(h->read_line, SRLZTN_UI_FONT_RENDER_SETTINGS_CHAR_SPACING_SCALE, strlen(SRLZTN_UI_FONT_RENDER_SETTINGS_CHAR_SPACING_SCALE)) == 0) {
- prefix_len = strlen(SRLZTN_UI_FONT_RENDER_SETTINGS_CHAR_SPACING_SCALE);
- stn_res = pk_stn(&frs->char_spacing_scale, h->read_line + prefix_len, &str_end);
- if (stn_res != PK_STN_RES_SUCCESS) {
- fprintf(stderr, "[%s] Err '%u' parsing '%s' primary from: '%s'\n", __FILE__, stn_res, SRLZTN_UI_FONT_RENDER_SETTINGS_CHAR_SPACING_SCALE, h->read_line);
+ for (i = 0; i < kvec->arr.next; ++i) {
+ if (strncmp(kvec->arr[i].key, SRLZTN_UI_FONT_RENDER_SETTINGS_CHAR_SCALE, strlen(SRLZTN_UI_FONT_RENDER_SETTINGS_CHAR_SCALE)) == 0) {
+ stn_res = pk_stn(&frs->char_scale, kvec->arr[i].val, &str_end);
+ if (stn_res != PK_STN_RES_SUCCESS) {
+ fprintf(stderr, "[%s] Err '%u' parsing '%s' primary from: '%s'\n", __FILE__, stn_res, SRLZTN_UI_FONT_RENDER_SETTINGS_CHAR_SCALE, kvec->arr[i].val);
+ }
+ continue;
}
- return true;
- }
- if (strncmp(h->read_line, SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_SIZE, strlen(SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_SIZE)) == 0) {
- prefix_len = strlen(SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_SIZE);
- stn_res = pk_stn(&frs->surface_area_size.x, h->read_line + prefix_len, &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, h->read_line);
- return true;
+ if (strncmp(kvec->arr[i].key, SRLZTN_UI_FONT_RENDER_SETTINGS_LINE_HEIGHT_SCALE, strlen(SRLZTN_UI_FONT_RENDER_SETTINGS_LINE_HEIGHT_SCALE)) == 0) {
+ stn_res = pk_stn(&frs->line_height_scale, kvec->arr[i].val, &str_end);
+ if (stn_res != PK_STN_RES_SUCCESS) {
+ fprintf(stderr, "[%s] Err '%u' parsing '%s' primary from: '%s'\n", __FILE__, stn_res, SRLZTN_UI_FONT_RENDER_SETTINGS_LINE_HEIGHT_SCALE, kvec->arr[i].val);
+ }
+ continue;
}
- prefix_len += strchr(h->read_line + prefix_len, ',') - (h->read_line + prefix_len);
- stn_res = pk_stn(&frs->surface_area_size.y, h->read_line + 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, h->read_line);
+ if (strncmp(kvec->arr[i].key, SRLZTN_UI_FONT_RENDER_SETTINGS_CHAR_SPACING_SCALE, strlen(SRLZTN_UI_FONT_RENDER_SETTINGS_CHAR_SPACING_SCALE)) == 0) {
+ stn_res = pk_stn(&frs->char_spacing_scale, kvec->arr[i].val, &str_end);
+ if (stn_res != PK_STN_RES_SUCCESS) {
+ fprintf(stderr, "[%s] Err '%u' parsing '%s' primary from: '%s'\n", __FILE__, stn_res, SRLZTN_UI_FONT_RENDER_SETTINGS_CHAR_SPACING_SCALE, kvec->arr[i].val);
+ }
+ continue;
}
- return true;
- }
- if (strncmp(h->read_line, SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_POS, strlen(SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_POS)) == 0) {
- prefix_len = strlen(SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_POS);
- stn_res = pk_stn(&frs->surface_area_pos.x, h->read_line + prefix_len, &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, h->read_line);
- return true;
+ 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);
+ }
+ continue;
}
- prefix_len += strchr(h->read_line + prefix_len, ',') - (h->read_line + prefix_len);
- stn_res = pk_stn(&frs->surface_area_pos.y, h->read_line + 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, h->read_line);
+ 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);
+ }
+ continue;
}
- return true;
- }
- if (strncmp(h->read_line, SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_FLAGS, strlen(SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_FLAGS)) == 0) {
- prefix_len = strlen(SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_FLAGS);
- FONT_RENDER_SURFACE_AREA_TYPE_FLAG_T flags;
- stn_res = pk_stn(&flags, h->read_line + prefix_len, &str_end);
- if (stn_res != PK_STN_RES_SUCCESS) {
- fprintf(stderr, "[%s] Err '%u' parsing '%s' primary from: '%s'\n", __FILE__, stn_res, SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_FLAGS, h->read_line);
- return true;
+ if (strncmp(kvec->arr[i].key, SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_FLAGS, strlen(SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_FLAGS)) == 0) {
+ FONT_RENDER_SURFACE_AREA_TYPE_FLAG_T flags;
+ stn_res = pk_stn(&flags, kvec->arr[i].val, &str_end);
+ if (stn_res != PK_STN_RES_SUCCESS) {
+ fprintf(stderr, "[%s] Err '%u' parsing '%s' primary from: '%s'\n", __FILE__, stn_res, SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_FLAGS, kvec->arr[i].val);
+ continue;
+ }
+ frs->surface_area_type_flags = FONT_RENDER_SURFACE_AREA_TYPE_FLAG(flags);
+ continue;
}
- frs->surface_area_type_flags = FONT_RENDER_SURFACE_AREA_TYPE_FLAG(flags);
- return true;
}
- return false;
}