#include "serialization-font.hpp" #include "pk.h" 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 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) { kve.key = SRLZTN_UI_BOX_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); } if (fr->text.val != nullptr) { kve.key = SRLZTN_UI_FONT_RENDER_TEXT_BEGIN; s = pk_new(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); } void pke_deserialize_font_render(srlztn_deserialize_helper *h, pke_kve_container *kvec, FontRender *fr) { assert(h != nullptr); assert(fr != nullptr); 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(fr->text.reserved, NULL); fr->text.val = s; continue; } } } 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) { 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); } 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(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) { 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); } 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); s = pk_new(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)) { 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(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) { 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); 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; 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) { 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; } 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; } 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; } } }