#include "serialization-font.hpp" #include "compile-time-assert.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; int len; 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); compt_a<160==sizeof(FontRender)>(); { kve.key = SRLZTN_UI_FONT_RENDER_UUID; s = pk_new_arr(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_TITLE; FontType *ft = FontType_Get(fr->font_type_handle); len = snprintf(nullptr, 0, "%s", ft->title.val); s = pk_new_arr(len+1, h->bkt); sprintf(s, "%s", ft->title.val); 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_arr(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_max; pk_cstr str; FontType *font_type_ent = nullptr; FontTypeRender ftr; FontRenderSettings frs{}; srlztn_ecs_mapping mapping; FontRender *fr; pke_deserialize_font_render_settings(h, kvec->children[0], &frs); uint32_t i; char *s; compt_a<160==sizeof(FontRender)>(); 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_TITLE) == 0) { pk_cstr font_type_title; font_type_title.length = strlen(kve->val) + 1; font_type_title.reserved = font_type_title.length + 1; s = pk_new_arr(font_type_title.reserved, h->bkt); sprintf(s, "%s", kve->val); font_type_title.val = s; font_type_ent = FontType_GetByTitle(font_type_title); 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_arr(str.reserved, NULL); sprintf(s, "%s", kve->val); str.val = s; continue; } } // parent is set later - up to the parent to take ownership assert(font_type_ent != nullptr); ftr = FontType_AddStringRender(font_type_ent->font_type_handle, std::move(str), &frs, nullptr, uuid); assert(ftr.font_type_handle != FontTypeRender_MAX.font_type_handle); assert(ftr.font_render_handle != FontTypeRender_MAX.font_render_handle); fr = &font_type_ent->renders[ftr.font_render_handle]; mapping.serialized_uuid = fr->uuid; mapping.created_entity = fr; mapping.created_instance = nullptr; pk_arr_append_t(&h->mapping, mapping); } 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++; compt_a<64==sizeof(FontRenderSettings)>(); { kve.key = SRLZTN_UI_FONT_RENDER_SETTINGS_CHAR_SCALE; len = snprintf(NULL, 0, "%f", frs->char_scale); s = pk_new_arr(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_arr(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_arr(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_arr(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_arr(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_arr(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); } { kve.key = SRLZTN_UI_FONT_RENDER_SETTINGS_FLAGS; s = pk_new_arr(5, h->bkt); sprintf(s, "0x%.2X", FONT_RENDER_FLAG_T(frs->flags)); kve.val = s; kve.end = SRLZTN_KVE_END; pk_arr_append_t(&kvec.arr, kve); } { kve.key = SRLZTN_UI_FONT_RENDER_SETTINGS_COLOR_FOREGROUND; len = snprintf(NULL, 0, "%f%s%f%s%f%s%f", frs->color_foreground[0], SRLZTN_NUM_SEPARATOR, frs->color_foreground[1], SRLZTN_NUM_SEPARATOR, frs->color_foreground[2], SRLZTN_NUM_SEPARATOR, frs->color_foreground[3]); s = pk_new_arr(len+1, h->bkt); sprintf(s, "%f%s%f%s%f%s%f", frs->color_foreground[0], SRLZTN_NUM_SEPARATOR, frs->color_foreground[1], SRLZTN_NUM_SEPARATOR, frs->color_foreground[2], SRLZTN_NUM_SEPARATOR, frs->color_foreground[3]); kve.val = s; kve.end = SRLZTN_KVE_END; pk_arr_append_t(&kvec.arr, kve); } { kve.key = SRLZTN_UI_FONT_RENDER_SETTINGS_COLOR_BACKGROUND; len = snprintf(NULL, 0, "%f%s%f%s%f%s%f", frs->color_background[0], SRLZTN_NUM_SEPARATOR, frs->color_background[1], SRLZTN_NUM_SEPARATOR, frs->color_background[2], SRLZTN_NUM_SEPARATOR, frs->color_background[3]); s = pk_new_arr(len+1, h->bkt); sprintf(s, "%f%s%f%s%f%s%f", frs->color_background[0], SRLZTN_NUM_SEPARATOR, frs->color_background[1], SRLZTN_NUM_SEPARATOR, frs->color_background[2], SRLZTN_NUM_SEPARATOR, frs->color_background[3]); 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; compt_a<64==sizeof(FontRenderSettings)>(); 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; } if (strncmp(kvec->arr[i].key, SRLZTN_UI_FONT_RENDER_SETTINGS_FLAGS, strlen(SRLZTN_UI_FONT_RENDER_SETTINGS_FLAGS)) == 0) { FONT_RENDER_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_FLAGS, kvec->arr[i].val); continue; } frs->flags = FONT_RENDER_FLAG(flags); continue; } if (strstr(SRLZTN_UI_FONT_RENDER_SETTINGS_COLOR_FOREGROUND, kvec->arr[i].key)) { starting_char = kvec->arr[i].val; index = 0; do { assert(index < 4); stn_res = pk_stn(&frs->color_foreground[index], starting_char, &str_end); if (stn_res != PK_STN_RES_SUCCESS) break; starting_char = str_end + 1; ++index; } while (*str_end != '\0'); if (stn_res != PK_STN_RES_SUCCESS) { fprintf(stderr, "[pke_deserialize_ui_box] Failed to parse value for: '%s', err: %i\n", SRLZTN_UI_FONT_RENDER_SETTINGS_COLOR_FOREGROUND, stn_res); } continue; } if (strstr(SRLZTN_UI_FONT_RENDER_SETTINGS_COLOR_BACKGROUND, kvec->arr[i].key)) { starting_char = kvec->arr[i].val; index = 0; do { assert(index < 4); stn_res = pk_stn(&frs->color_background[index], starting_char, &str_end); if (stn_res != PK_STN_RES_SUCCESS) break; starting_char = str_end + 1; ++index; } while (*str_end != '\0'); if (stn_res != PK_STN_RES_SUCCESS) { fprintf(stderr, "[pke_deserialize_ui_box] Failed to parse value for: '%s', err: %i\n", SRLZTN_UI_FONT_RENDER_SETTINGS_COLOR_BACKGROUND, stn_res); } continue; } } }