diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-05-20 21:08:19 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-05-20 21:08:19 -0400 |
| commit | 40d69e7e40a18865a31af2f55efcde369d36dbbb (patch) | |
| tree | 95a2cbbe40192183d13f846f3444b32d7e12b0e8 /src/serialization-font.cpp | |
| parent | ead9e484db969a880470d625b1884aced296e722 (diff) | |
pke: serialization overhaul + embedded assets
Diffstat (limited to 'src/serialization-font.cpp')
| -rw-r--r-- | src/serialization-font.cpp | 140 |
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) { |
