diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-05-06 13:12:24 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-05-06 13:12:24 -0400 |
| commit | 32968050f0b34fdabfcc2a4fb5601d4be361bbd2 (patch) | |
| tree | acef384a2156a16d4d506c37f13f79d454a4a6e9 /src/serialization-font.cpp | |
| parent | ef37d054dfe5812efa9eefb4b9b18621fdabac25 (diff) | |
pke: major serialization refactor, first-pass
Diffstat (limited to 'src/serialization-font.cpp')
| -rw-r--r-- | src/serialization-font.cpp | 258 |
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; } |
