summaryrefslogtreecommitdiff
path: root/src/serialization-font.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-04-21 15:46:46 -0400
committerJonathan Bradley <jcb@pikum.xyz>2025-04-21 15:46:46 -0400
commitef37d054dfe5812efa9eefb4b9b18621fdabac25 (patch)
tree713042c875004da0058bf5813c4b2b736b6c4ed3 /src/serialization-font.cpp
parenta066448effaa9a56c049136067a73ba0156f65d3 (diff)
pke: first-pass serializing ui and font renders
Diffstat (limited to 'src/serialization-font.cpp')
-rw-r--r--src/serialization-font.cpp143
1 files changed, 143 insertions, 0 deletions
diff --git a/src/serialization-font.cpp b/src/serialization-font.cpp
new file mode 100644
index 0000000..60ba61d
--- /dev/null
+++ b/src/serialization-font.cpp
@@ -0,0 +1,143 @@
+
+#include "serialization-font.hpp"
+#include "pk.h"
+#include <sstream>
+
+bool pke_serialize_font_render(srlztn_serialize_helper *h, FontRender *fr) {
+ assert(h != nullptr);
+ assert(fr != nullptr);
+ if (PK_HAS_FLAG(fr->entity_flags, ENTITY_FLAG_DO_NOT_SERIALIZE)) {
+ return false;
+ }
+ if (fr->uuid != pk_uuid_zed && fr->uuid != pk_uuid_max) {
+ h->o << SRLZTN_UI_FONT_RENDER_UUID << std::endl;
+ }
+ if (fr->text.val != nullptr) {
+ h->o << SRLZTN_UI_FONT_RENDER_TEXT_BEGIN << std::endl;
+ h->o << fr->text.val << std::endl;
+ h->o << SRLZTN_UI_FONT_RENDER_TEXT_END << std::endl;
+ }
+ return pke_serialize_font_render_settings(h, &fr->settings);
+}
+
+bool pke_deserialize_font_render(srlztn_deserialize_helper *h, FontRender *fr) {
+ assert(h != nullptr);
+ assert(fr != nullptr);
+ uint64_t prefix_len;
+ if (strncmp(h->read_line, SRLZTN_UI_FONT_RENDER_UUID, strlen(SRLZTN_UI_FONT_RENDER_UUID)) == 0) {
+ prefix_len = strlen(SRLZTN_UI_FONT_RENDER_UUID);
+ (h->read_line + prefix_len) >> fr->uuid;
+ return true;
+ }
+ if (strncmp(h->read_line, SRLZTN_UI_FONT_RENDER_TEXT_BEGIN, strlen(SRLZTN_UI_FONT_RENDER_TEXT_BEGIN)) == 0) {
+ // TODO replace with something that doesn't give the code stds
+ std::ostringstream ss{};
+ bool first = true;
+ while (h->i->getline(h->read_line, h->read_line_len)) {
+ if (strncmp(h->read_line, SRLZTN_UI_FONT_RENDER_TEXT_END, strlen(SRLZTN_UI_FONT_RENDER_TEXT_END)) == 0) {
+ std::string s = ss.str();
+ fr->text = cstring_to_pk_cstr(s.c_str());
+ break;
+ }
+ if (!first) {
+ first = false;
+ ss << std::endl;
+ }
+ ss << h->read_line;
+ }
+ return true;
+ }
+ return false;
+}
+
+bool pke_serialize_font_render_settings(srlztn_serialize_helper *h, FontRenderSettings *frs) {
+ if (frs->char_scale != 0.0) {
+ h->o << SRLZTN_UI_FONT_RENDER_SETTINGS_CHAR_SCALE << frs->char_scale << std::endl;
+ }
+ if (frs->line_height_scale != 0.0) {
+ h->o << SRLZTN_UI_FONT_RENDER_SETTINGS_LINE_HEIGHT_SCALE << frs->line_height_scale << std::endl;
+ }
+ if (frs->char_spacing_scale != 0.0) {
+ h->o << SRLZTN_UI_FONT_RENDER_SETTINGS_CHAR_SPACING_SCALE << frs->char_spacing_scale << std::endl;
+ }
+ if (frs->surface_area_size != glm::ivec2(0)) {
+ h->o << SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_SIZE << frs->surface_area_size.x << SRLZTN_FILE_NUM_SEPARATOR << frs->surface_area_size.y << std::endl;
+ }
+ if (frs->surface_area_pos != glm::ivec2(0)) {
+ h->o << SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_POS << frs->surface_area_pos.x << SRLZTN_FILE_NUM_SEPARATOR << frs->surface_area_pos.y << std::endl;
+ }
+ if (frs->surface_area_type_flags != FONT_RENDER_SURFACE_AREA_TYPE_FLAGS_NONE) {
+ h->o << SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_FLAGS << FONT_RENDER_SURFACE_AREA_TYPE_FLAG_T(frs->surface_area_type_flags) << std::endl;
+ }
+ return true;
+}
+
+bool pke_deserialize_font_render_settings(srlztn_deserialize_helper *h, FontRenderSettings *frs) {
+ uint64_t prefix_len;
+ PK_STN_RES stn_res;
+ char *str_end;
+ if (strncmp(h->read_line, SRLZTN_UI_FONT_RENDER_SETTINGS_CHAR_SCALE, strlen(SRLZTN_UI_FONT_RENDER_SETTINGS_CHAR_SCALE)) == 0) {
+ prefix_len = strlen(SRLZTN_UI_FONT_RENDER_SETTINGS_CHAR_SCALE);
+ stn_res = pk_stn(&frs->char_scale, h->read_line + prefix_len, &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, h->read_line);
+ }
+ return true;
+ }
+ if (strncmp(h->read_line, SRLZTN_UI_FONT_RENDER_SETTINGS_LINE_HEIGHT_SCALE, strlen(SRLZTN_UI_FONT_RENDER_SETTINGS_LINE_HEIGHT_SCALE)) == 0) {
+ prefix_len = strlen(SRLZTN_UI_FONT_RENDER_SETTINGS_LINE_HEIGHT_SCALE);
+ stn_res = pk_stn(&frs->line_height_scale, h->read_line + prefix_len, &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, h->read_line);
+ }
+ return true;
+ }
+ if (strncmp(h->read_line, SRLZTN_UI_FONT_RENDER_SETTINGS_CHAR_SPACING_SCALE, strlen(SRLZTN_UI_FONT_RENDER_SETTINGS_CHAR_SPACING_SCALE)) == 0) {
+ prefix_len = strlen(SRLZTN_UI_FONT_RENDER_SETTINGS_CHAR_SPACING_SCALE);
+ stn_res = pk_stn(&frs->char_spacing_scale, h->read_line + prefix_len, &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, h->read_line);
+ }
+ return true;
+ }
+ if (strncmp(h->read_line, SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_SIZE, strlen(SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_SIZE)) == 0) {
+ prefix_len = strlen(SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_SIZE);
+ stn_res = pk_stn(&frs->surface_area_size.x, h->read_line + prefix_len, &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, h->read_line);
+ return true;
+ }
+ prefix_len += strchr(h->read_line + prefix_len, ',') - (h->read_line + prefix_len);
+ stn_res = pk_stn(&frs->surface_area_size.y, h->read_line + 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, h->read_line);
+ }
+ return true;
+ }
+ if (strncmp(h->read_line, SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_POS, strlen(SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_POS)) == 0) {
+ prefix_len = strlen(SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_POS);
+ stn_res = pk_stn(&frs->surface_area_pos.x, h->read_line + prefix_len, &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, h->read_line);
+ return true;
+ }
+ prefix_len += strchr(h->read_line + prefix_len, ',') - (h->read_line + prefix_len);
+ stn_res = pk_stn(&frs->surface_area_pos.y, h->read_line + 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, h->read_line);
+ }
+ return true;
+ }
+ if (strncmp(h->read_line, SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_FLAGS, strlen(SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_FLAGS)) == 0) {
+ prefix_len = strlen(SRLZTN_UI_FONT_RENDER_SETTINGS_SURFACE_AREA_FLAGS);
+ FONT_RENDER_SURFACE_AREA_TYPE_FLAG_T flags;
+ stn_res = pk_stn(&flags, h->read_line + prefix_len, &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, h->read_line);
+ return true;
+ }
+ frs->surface_area_type_flags = FONT_RENDER_SURFACE_AREA_TYPE_FLAG(flags);
+ return true;
+ }
+ return false;
+}