summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-10-30 14:20:49 -0400
committerJonathan Bradley <jcb@pikum.xyz>2025-10-30 14:20:49 -0400
commitf99d6fd7226233c1f2e47c0f5f38737a72861fc9 (patch)
tree0333c07aca0319504f29c79e2608124304d193d7
parent9260a41bc6e0a430d1ab0bba004f86d1d5afd506 (diff)
pke: add flags to FontRenderSettings
-rw-r--r--src/font.cpp12
-rw-r--r--src/font.hpp5
-rw-r--r--src/serialization-font.cpp18
-rw-r--r--src/serialization-static-ui.cpp8
-rw-r--r--src/serialization.hpp1
-rw-r--r--src/static-ui.cpp10
-rw-r--r--tests/pke-test-serialization.cpp8
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);