summaryrefslogtreecommitdiff
path: root/editor/editor.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-02-21 15:55:35 -0500
committerJonathan Bradley <jcb@pikum.xyz>2025-02-22 00:47:50 -0500
commite1133e93c75172e2815231e68bbc0830de1f7d79 (patch)
treeab6b63ef5090b12320333fe0fbd982c7188a93ab /editor/editor.cpp
parent76a38d7f972b17c33a6ffd6dc3772df721139e67 (diff)
pke: required chars unicode 9, 10, 13
Diffstat (limited to 'editor/editor.cpp')
-rw-r--r--editor/editor.cpp56
1 files changed, 42 insertions, 14 deletions
diff --git a/editor/editor.cpp b/editor/editor.cpp
index e3f6b7c..28798d5 100644
--- a/editor/editor.cpp
+++ b/editor/editor.cpp
@@ -715,12 +715,39 @@ int SortFontGlyphChar(const void *a, const void *b) {
}
void GenerateMTSDF(FontTypeMSDFSettings *msdf_settings, const Asset *a) {
- static const uint64_t REQUIRED_UNICODE_CHAR_LENGTH = 3;
- static uint32_t required_unicode_codes[REQUIRED_UNICODE_CHAR_LENGTH] = {
- 9, // horizontal tab
- 10, // line feed
- 13, // carriage return
- };
+ static pk_arr *required_font_glyph_chars_arr;
+ required_font_glyph_chars_arr = pk_new<pk_arr>(pkeSettings.mem.bkt);
+ required_font_glyph_chars_arr->next = 0;
+ required_font_glyph_chars_arr->reserved = 0;
+ required_font_glyph_chars_arr->stride = sizeof(FontGlyphChar);
+ required_font_glyph_chars_arr->alignment = alignof(FontGlyphChar);
+ required_font_glyph_chars_arr->bkt = pkeSettings.mem.bkt;
+ required_font_glyph_chars_arr->data = nullptr;
+ pk_arr_reserve(required_font_glyph_chars_arr, 3);
+
+ FontGlyphChar fgc{};
+ fgc.advance = 0;
+ fgc.sprite_region_min = glm::vec2(0);
+ fgc.sprite_region_max = glm::vec2(0);
+ fgc.plane_bounds = glm::vec4(0);
+ fgc.unicode = 0;
+ fgc.flags = FONT_GLYPH_CHAR_FLAGS_NONE;
+ // 9 horizontal tab
+ fgc.unicode = 9;
+ fgc.advance = 2;
+ fgc.flags = (FONT_GLYPH_CHAR_FLAGS)(FONT_GLYPH_CHAR_FLAGS_WHITESPACE | FONT_GLYPH_CHAR_FLAGS_ALIGN_ADVANCE);
+ pk_arr_append(required_font_glyph_chars_arr, &fgc);
+ // 10 line feed
+ fgc.unicode = 10;
+ fgc.advance = 0;
+ fgc.flags = FONT_GLYPH_CHAR_FLAGS_NEW_LINE;
+ pk_arr_append(required_font_glyph_chars_arr, &fgc);
+ // 13 carriage return
+ fgc.unicode = 13;
+ fgc.advance = 0;
+ fgc.flags = FONT_GLYPH_CHAR_FLAGS_NEW_LINE;
+ pk_arr_append(required_font_glyph_chars_arr, &fgc);
+
uint64_t found_unicode_map = 0;
assert(PK_HAS_FLAG(a->type, PKE_ASSET_TYPE_FONT));
FontTypeSpacing ft_spacing{};
@@ -800,13 +827,17 @@ void GenerateMTSDF(FontTypeMSDFSettings *msdf_settings, const Asset *a) {
arr_glyphs.stride = sizeof(FontGlyphChar);
pk_arr_resize(&arr_glyphs, glyphs.size());
FontGlyphChar *arr = reinterpret_cast<FontGlyphChar *>(arr_glyphs.data);
+ FontGlyphChar *req_arr = reinterpret_cast<FontGlyphChar *>(required_font_glyph_chars_arr->data);
for (uint64_t i = 0; i < glyphs.size(); ++i) {
arr[i].advance = glyphs[i].getAdvance();
arr[i].unicode = glyphs[i].getCodepoint();
- arr[i].is_whitespace = glyphs[i].isWhitespace();
+ arr[i].flags = FONT_GLYPH_CHAR_FLAGS_NONE;
+ if (glyphs[i].isWhitespace()) {
+ arr[i].flags = FONT_GLYPH_CHAR_FLAGS_WHITESPACE;
+ }
- for (uint64_t k = 0; k < REQUIRED_UNICODE_CHAR_LENGTH; ++k) {
- if (arr[i].unicode == required_unicode_codes[k]) {
+ for (uint32_t k = 0; k < required_font_glyph_chars_arr->next; ++k) {
+ if (arr[i].unicode == req_arr[k].unicode) {
found_unicode_map |= (1ull << k);
break;
}
@@ -821,14 +852,11 @@ void GenerateMTSDF(FontTypeMSDFSettings *msdf_settings, const Asset *a) {
arr[i].sprite_region_max = glm::vec2(dbounds.z, height - dbounds.y);
}
- for (uint64_t k = 0; k < REQUIRED_UNICODE_CHAR_LENGTH; ++k) {
+ for (uint32_t k = 0; k < required_font_glyph_chars_arr->next; ++k) {
if ((found_unicode_map & (1ull << k)) != 0) {
continue;
}
- FontGlyphChar fgc{};
- memset(&fgc, 0, sizeof(FontGlyphChar));
- fgc.unicode = required_unicode_codes[k];
- pk_arr_append(&arr_glyphs, &fgc);
+ pk_arr_append(&arr_glyphs, &req_arr[k]);
}
qsort(arr_glyphs.data, arr_glyphs.next, arr_glyphs.stride, SortFontGlyphChar);