diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-10-30 14:20:49 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-10-30 14:20:49 -0400 |
| commit | f99d6fd7226233c1f2e47c0f5f38737a72861fc9 (patch) | |
| tree | 0333c07aca0319504f29c79e2608124304d193d7 | |
| parent | 9260a41bc6e0a430d1ab0bba004f86d1d5afd506 (diff) | |
pke: add flags to FontRenderSettings
| -rw-r--r-- | src/font.cpp | 12 | ||||
| -rw-r--r-- | src/font.hpp | 5 | ||||
| -rw-r--r-- | src/serialization-font.cpp | 18 | ||||
| -rw-r--r-- | src/serialization-static-ui.cpp | 8 | ||||
| -rw-r--r-- | src/serialization.hpp | 1 | ||||
| -rw-r--r-- | src/static-ui.cpp | 10 | ||||
| -rw-r--r-- | tests/pke-test-serialization.cpp | 8 |
7 files changed, 53 insertions, 9 deletions
diff --git a/src/font.cpp b/src/font.cpp index 3204f58..9ca42c5 100644 --- a/src/font.cpp +++ b/src/font.cpp @@ -149,7 +149,7 @@ float FontType_Inner_LookAheadLineCount(const FontType *const ft, const FontRend return ret; } -void FontType_Inner_CalcTransforms(const FontType *ft, FontRender *fr, FontInstanceBufferItem *ptr_dst) { +bool FontType_Inner_CalcTransforms(const FontType *ft, FontRender *fr, FontInstanceBufferItem *ptr_dst) { assert(ft != nullptr); assert(fr != nullptr); assert(ptr_dst != nullptr); @@ -163,6 +163,10 @@ void FontType_Inner_CalcTransforms(const FontType *ft, FontRender *fr, FontInsta glm::vec3 translate; glm::vec3 scale; + if (PK_HAS_FLAG(FONT_RENDER_FLAG_T(fr->settings.flags), FONT_RENDER_FLAG_T(FONT_RENDER_FLAG_VISIBILITY_INVISIBLE))) { + return false; + } + // TODO 2025-04-10 - JCB PERF // consider adding early-out when we exceed the bounding-box limits. @@ -313,6 +317,7 @@ void FontType_Inner_CalcTransforms(const FontType *ft, FontRender *fr, FontInsta (fr->settings.char_scale / ft->msdf_settings.minimum_scale) * ft->msdf_settings.px_range; } + return true; } void FontType_Init() { @@ -415,8 +420,9 @@ void FontType_Tick(double delta) { for (FontRenderIndex_T k = 0; k < (FontRenderIndex_T)ft->n_render; ++k) { if ((ft->unused_frs & (1llu << k)) != 0) continue; fr = &ft->renders[k]; - FontType_Inner_CalcTransforms(ft, fr, &fibis[index]); - index += fr->n_glyphs; + if (FontType_Inner_CalcTransforms(ft, fr, &fibis[index])) { + index += fr->n_glyphs; + } } // check recreate buffer diff --git a/src/font.hpp b/src/font.hpp index fce99a0..dd1b682 100644 --- a/src/font.hpp +++ b/src/font.hpp @@ -14,6 +14,7 @@ TypeSafeInt_H(FontTypeIndex, uint16_t, 0xFFFF); TypeSafeInt_H(FontRenderIndex, uint16_t, 0xFFFF); TypeSafeInt_H(FONT_GLYPH_CHAR_FLAG, uint8_t, 0xFF); +TypeSafeInt_H(FONT_RENDER_FLAG, uint8_t, 0xFF); TypeSafeInt_H(FONT_RENDER_SURFACE_AREA_TYPE_FLAG, uint8_t, 0xFF); const FONT_GLYPH_CHAR_FLAG FONT_GLYPH_CHAR_FLAGS_NONE @@ -27,6 +28,9 @@ const FONT_GLYPH_CHAR_FLAG FONT_GLYPH_CHAR_FLAGS_ALIGN_ADVANCE const FONT_GLYPH_CHAR_FLAG FONT_GLYPH_CHAR_FLAGS_NEW_LINE = FONT_GLYPH_CHAR_FLAG((1u << 3)); +const FONT_RENDER_FLAG FONT_RENDER_FLAG_NONE = FONT_RENDER_FLAG(0u << 0); +const FONT_RENDER_FLAG FONT_RENDER_FLAG_VISIBILITY_INVISIBLE = FONT_RENDER_FLAG(1u << 0); + const FONT_RENDER_SURFACE_AREA_TYPE_FLAG FONT_RENDER_SURFACE_AREA_TYPE_FLAGS_NONE = FONT_RENDER_SURFACE_AREA_TYPE_FLAG(0u); const FONT_RENDER_SURFACE_AREA_TYPE_FLAG FONT_RENDER_SURFACE_AREA_TYPE_FLAGS_CENTER_VERTICAL @@ -62,6 +66,7 @@ struct FontRenderSettings { float char_spacing_scale = 1.f; glm::ivec2 surface_area_size; glm::ivec2 surface_area_pos; + FONT_RENDER_FLAG flags; FONT_RENDER_SURFACE_AREA_TYPE_FLAG surface_area_type_flags; }; struct FontRender : public Entity_Base { diff --git a/src/serialization-font.cpp b/src/serialization-font.cpp index 1ff0645..f2fb24b 100644 --- a/src/serialization-font.cpp +++ b/src/serialization-font.cpp @@ -181,6 +181,14 @@ pk_handle pke_serialize_font_render_settings(srlztn_serialize_helper *h, FontRen pk_arr_append_t(&kvec.arr, kve); } { + kve.key = SRLZTN_UI_FONT_RENDER_SETTINGS_FLAGS; + s = pk_new_arr<char>(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<char>(len+1, h->bkt); @@ -273,6 +281,16 @@ void pke_deserialize_font_render_settings(srlztn_deserialize_helper *h, pke_kve_ 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; diff --git a/src/serialization-static-ui.cpp b/src/serialization-static-ui.cpp index d7de645..8c21d7c 100644 --- a/src/serialization-static-ui.cpp +++ b/src/serialization-static-ui.cpp @@ -21,7 +21,7 @@ pk_handle pke_serialize_ui_box_internal(srlztn_serialize_helper *h, pke_ui_box_t kvec.child_handles.bkt = h->bkt; h->handle_head.itemIndex++; - compt_a<4==sizeof(pke_ui_box_type_data::pke_ui_box_type_data_text)>(); + compt_a<8==sizeof(pke_ui_box_type_data::pke_ui_box_type_data_text)>(); { kve.key = SRLZTN_UI_BOX_DATA_TEXT_FONT_RENDER_UUID; s = pk_new_arr<char>(37, h->bkt); @@ -54,7 +54,7 @@ pk_handle pke_serialize_ui_box_internal(srlztn_serialize_helper *h, pke_ui_box_t kvec.child_handles.bkt = h->bkt; h->handle_head.itemIndex++; - compt_a<16==sizeof(pke_ui_box_type_data::pke_ui_box_type_data_button_text)>(); + compt_a<24==sizeof(pke_ui_box_type_data::pke_ui_box_type_data_button_text)>(); { kve.key = SRLZTN_UI_BOX_DATA_BUTTON_TEXT_FONT_RENDER_UUID; s = pk_new_arr<char>(37, h->bkt); @@ -130,7 +130,7 @@ void pke_deserialize_ui_box_internal(srlztn_deserialize_helper *h, pke_kve_conta assert(kvec->arr.next == 1); pk_uuid font_render_uuid = pk_uuid_zed; - compt_a<4==sizeof(pke_ui_box_type_data::pke_ui_box_type_data_text)>(); + compt_a<8==sizeof(pke_ui_box_type_data::pke_ui_box_type_data_text)>(); if (strstr(SRLZTN_UI_BOX_DATA_TEXT_FONT_RENDER_UUID, kvec->arr[0].key)) { kvec->arr[0].val >> font_render_uuid; } @@ -154,7 +154,7 @@ void pke_deserialize_ui_box_internal(srlztn_deserialize_helper *h, pke_kve_conta data->pke_event_handle = PkeEventHandle_MAX; data->ev_id = pk_ev_id_T{0}; - compt_a<16==sizeof(pke_ui_box_type_data::pke_ui_box_type_data_button_text)>(); + compt_a<24==sizeof(pke_ui_box_type_data::pke_ui_box_type_data_button_text)>(); if (strstr(SRLZTN_UI_BOX_DATA_BUTTON_TEXT_FONT_RENDER_UUID, kvec->arr[0].key)) { kvec->arr[0].val >> font_render_uuid; } diff --git a/src/serialization.hpp b/src/serialization.hpp index 4aacf4e..a4ea7e4 100644 --- a/src/serialization.hpp +++ b/src/serialization.hpp @@ -76,6 +76,7 @@ iccsc SRLZTN_UI_FONT_RENDER_SETTINGS_LINE_HEIGHT_SCALE = "LineHeightScale:"; iccsc SRLZTN_UI_FONT_RENDER_SETTINGS_CHAR_SPACING_SCALE = "CharSpacingScale:"; iccsc SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_SIZE = "SurfaceAreaSize:"; iccsc SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_POS = "SurfaceAreaPos:"; +iccsc SRLZTN_UI_FONT_RENDER_SETTINGS_FLAGS = "Flags:"; iccsc SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_FLAGS = "SurfaceAreaFlags:"; iccsc SRLZTN_INPUT_ACTION_NAME = "Name:"; diff --git a/src/static-ui.cpp b/src/static-ui.cpp index 836966d..25c2514 100644 --- a/src/static-ui.cpp +++ b/src/static-ui.cpp @@ -385,12 +385,22 @@ bool pke_ui_calc_px(pk_arr_t<pke_ui_box_instance_buffer_item> &buffer, pk_arr_t< frs = FontType_GetFontRender(box->type_data->text.font_render_handle)->settings; frs.surface_area_pos = box->internal.px_corner; frs.surface_area_size = box->internal.px_size; + if (PK_HAS_FLAG(box->flags, PKE_UI_BOX_FLAG_VISIBILITY_INVISIBLE)) { + frs.flags = FONT_RENDER_FLAG(FONT_RENDER_FLAG_T(frs.flags) | FONT_RENDER_FLAG_T(FONT_RENDER_FLAG_VISIBILITY_INVISIBLE)); + } else { + frs.flags = FONT_RENDER_FLAG(FONT_RENDER_FLAG_T(frs.flags) & (~FONT_RENDER_FLAG_T(FONT_RENDER_FLAG_VISIBILITY_INVISIBLE))); + } FontType_UpdateStringRender(box->type_data->text.font_render_handle, &frs); break; case PKE_UI_BOX_TYPE_BUTTON_TEXT: frs = FontType_GetFontRender(box->type_data->button_text.font_render_handle)->settings; frs.surface_area_pos = box->internal.px_corner; frs.surface_area_size = box->internal.px_size; + if (PK_HAS_FLAG(box->flags, PKE_UI_BOX_FLAG_VISIBILITY_INVISIBLE)) { + frs.flags = FONT_RENDER_FLAG(FONT_RENDER_FLAG_T(frs.flags) | FONT_RENDER_FLAG_T(FONT_RENDER_FLAG_VISIBILITY_INVISIBLE)); + } else { + frs.flags = FONT_RENDER_FLAG(FONT_RENDER_FLAG_T(frs.flags) & (~FONT_RENDER_FLAG_T(FONT_RENDER_FLAG_VISIBILITY_INVISIBLE))); + } FontType_UpdateStringRender(box->type_data->button_text.font_render_handle, &frs); break; case PKE_UI_BOX_TYPE_BUTTON_IMAGE: diff --git a/tests/pke-test-serialization.cpp b/tests/pke-test-serialization.cpp index e1fda74..73d5a1b 100644 --- a/tests/pke-test-serialization.cpp +++ b/tests/pke-test-serialization.cpp @@ -398,6 +398,7 @@ CharSpacingScale:1.000000 SurfaceAreaSize:250;250 SurfaceAreaPos:0;0 SurfaceAreaFlags:0x03 +Flags:0x00 ColorForeground:0.400000;0.900000;0.500000;0.800000 ColorBackground:0.000000;0.000000;0.000000;0.000000 @@ -439,6 +440,7 @@ int pke_test_serialization_003() { frs.surface_area_size = glm::ivec2(250, 250); frs.surface_area_pos = glm::ivec2(0, 0); frs.surface_area_type_flags = FONT_RENDER_SURFACE_AREA_TYPE_FLAGS_CENTER_BOTH; + frs.flags = FONT_RENDER_FLAG_NONE; FontRenderHandle fr_handle = FontType_AddStringRender(FontType_GetFonts(idx_unused)[0].index_ft, std::move(cstring_to_pk_cstr("asdf")), &frs, nullptr, uuid_n[1]); pke_ui_box *ui_box = pke_ui_box_new_root(PKE_UI_BOX_TYPE_TEXT, uuid_n[2]); @@ -458,7 +460,7 @@ int pke_test_serialization_003() { PKE_TEST_ASSERT(h->kvp_containers.next == 4, err_index); // FontRenderSettings PKE_TEST_ASSERT(h->kvp_containers[0].child_handles.next == 0, err_index); - PKE_TEST_ASSERT(h->kvp_containers[0].arr.next == 8, err_index); + PKE_TEST_ASSERT(h->kvp_containers[0].arr.next == 9, err_index); // FontRender PKE_TEST_ASSERT(h->kvp_containers[1].child_handles.next == 1, err_index); PKE_TEST_ASSERT(h->kvp_containers[1].arr.next == 3, err_index); @@ -507,7 +509,7 @@ int pke_test_deserialization_103() { PKE_TEST_ASSERT(h->kvp_containers.next == 4, err_index); // FontRenderSettings PKE_TEST_ASSERT(h->kvp_containers[0].child_handles.next == 0, err_index); - PKE_TEST_ASSERT(h->kvp_containers[0].arr.next == 8, err_index); + PKE_TEST_ASSERT(h->kvp_containers[0].arr.next == 9, err_index); // FontRender PKE_TEST_ASSERT(h->kvp_containers[1].child_handles.next == 1, err_index); PKE_TEST_ASSERT(h->kvp_containers[1].arr.next == 3, err_index); @@ -751,6 +753,7 @@ CharSpacingScale:1.000000 SurfaceAreaSize:250;250 SurfaceAreaPos:0;0 SurfaceAreaFlags:0x03 +Flags:0x00 ColorForeground:0.400000;0.900000;0.500000;0.800000 ColorBackground:0.000000;0.000000;0.000000;0.000000 @@ -780,6 +783,7 @@ int pke_test_serialization_005() { frs.surface_area_size = glm::ivec2(250, 250); frs.surface_area_pos = glm::ivec2(0, 0); frs.surface_area_type_flags = FONT_RENDER_SURFACE_AREA_TYPE_FLAGS_CENTER_BOTH; + frs.flags = FONT_RENDER_FLAG_NONE; FontRenderHandle fr_handle = FontType_AddStringRender(FontType_GetFonts(idx_unused)[0].index_ft, cstring_to_pk_cstr(""), &frs, nullptr, uuid_n[1]); pke_serialize_scene(h); |
