#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 font_render_settings_handle; pke_kve kve{}; pke_kve_container kvec{}; if (PK_HAS_FLAG(fr->entity_flags, ENTITY_FLAG_DO_NOT_SERIALIZE)) { 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_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, font_render_settings_handle); { kve.key = SRLZTN_UI_FONT_RENDER_UUID; s = pk_new(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(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(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); 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) { assert(h != 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) { 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 (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(str.reserved, NULL); sprintf(s, "%s", kve->val); str.val = s; continue; } } FontType *font_type_ent = static_cast(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) { 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++; { kve.key = SRLZTN_UI_FONT_RENDER_SETTINGS_CHAR_SCALE; len = snprintf(NULL, 0, "%f", frs->char_scale); s = pk_new(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); } { kve.key = SRLZTN_UI_FONT_RENDER_SETTINGS_LINE_HEIGHT_SCALE; len = snprintf(NULL, 0, "%f", frs->line_height_scale); s = pk_new(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); } { kve.key = SRLZTN_UI_FONT_RENDER_SETTINGS_CHAR_SPACING_SCALE; len = snprintf(NULL, 0, "%f", frs->char_spacing_scale); s = pk_new(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); } { kve.key = SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_SIZE; len = snprintf(NULL, 0, "%d%s%d", frs->surface_area_size.x, SRLZTN_NUM_SEPARATOR, frs->surface_area_size.y); s = pk_new(len+1, h->bkt); 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); } { kve.key = SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_POS; len = snprintf(NULL, 0, "%d%s%d", frs->surface_area_pos.x, SRLZTN_NUM_SEPARATOR, frs->surface_area_pos.y); s = pk_new(len+1, h->bkt); 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); } { kve.key = SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_FLAGS; s = pk_new(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); } 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, index; const char *starting_char; PK_STN_RES stn_res; char *str_end; 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; } 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; } 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; } if (strncmp(kvec->arr[i].key, SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_SIZE, strlen(SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_SIZE)) == 0) { 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) { 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) { 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; } } }