diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-02-21 15:55:35 -0500 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-02-22 00:47:50 -0500 |
| commit | e1133e93c75172e2815231e68bbc0830de1f7d79 (patch) | |
| tree | ab6b63ef5090b12320333fe0fbd982c7188a93ab /editor/editor.cpp | |
| parent | 76a38d7f972b17c33a6ffd6dc3772df721139e67 (diff) | |
pke: required chars unicode 9, 10, 13
Diffstat (limited to 'editor/editor.cpp')
| -rw-r--r-- | editor/editor.cpp | 56 |
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); |
