diff --git a/src/font.cpp b/src/font.cpp index a1a41c1..0ed399a 100644 --- a/src/font.cpp +++ b/src/font.cpp @@ -102,8 +102,11 @@ std::vector TextMesh::tokenize(const std::string& s, const Font float y = 0; for (char c : p) { - stbtt_aligned_quad q; - stbtt_GetBakedQuad((stbtt_bakedchar*)f.chars.data(), f.w, f.h, c - f.start_char, &x, &y, &q, true); + if (c >= 32 && c < 127) // visible ascii character + { + stbtt_aligned_quad q; + stbtt_GetBakedQuad((stbtt_bakedchar*)f.chars.data(), f.w, f.h, c - f.start_char, &x, &y, &q, true); + } } ret.emplace_back(p, x * f.scale); } @@ -136,7 +139,7 @@ void TextMesh::update(kFont id, const std::string& text) auto& f = FontManager::get(id); float spacing = f.bounds.w - f.bounds.y; float avg_width = f.bounds.z - f.bounds.x; - cur_box = glm::vec4(0, 0, 5, spacing); + cur_box = glm::vec4(0, f.bounds.y, 5, avg_width); glm::vec2 bbmin(FLT_MAX); glm::vec2 bbmax(-FLT_MAX); @@ -157,12 +160,6 @@ void TextMesh::update(kFont id, const std::string& text) tokenize(text, f) : std::vector{ Token(text, 0.f) }; - if (parts.empty()) - { - bbmin = { 0, -spacing * 0.5f }; - bbmax = { 1, +spacing * 0.5f }; - } - for (auto p : parts) { if (max_width > 0 && (x + p.w) * f.scale > max_width) @@ -176,6 +173,7 @@ void TextMesh::update(kFont id, const std::string& text) { x = 0; y += spacing; + cur_box = glm::vec4(x, y + f.bounds.y, 5, avg_width); continue; } stbtt_aligned_quad q; @@ -196,13 +194,14 @@ void TextMesh::update(kFont id, const std::string& text) idx.push_back(n + 0); idx.push_back(n + 2); idx.push_back(n + 3); - bbmin = glm::min(bbmin, { q.x0 / f.scale, q.y0 / f.scale }); - bbmax = glm::max(bbmax, { q.x1 / f.scale, q.y1 / f.scale }); - cur_box = glm::vec4(x, y, 5, spacing); + bbmin = glm::min(bbmin, xy(f.bounds)); + bbmax = glm::max(bbmax, { q.x1 / f.scale, y + f.bounds.w }); + cur_box = glm::vec4(q.x1 / f.scale + 2, y + f.bounds.y, 5, avg_width); } } for (auto& vi : v) - vi -= glm::vec4(bbmin, 0, 0); + vi -= glm::vec4(xy(f.bounds), 0, 0); + cur_box -= glm::vec4(xy(f.bounds), 0, 0); bb = bbmax - bbmin; font_array_count = (int)idx.size(); App::I->render_task([&] diff --git a/src/node_text_input.cpp b/src/node_text_input.cpp index 97f14e7..fe3ccbc 100644 --- a/src/node_text_input.cpp +++ b/src/node_text_input.cpp @@ -110,7 +110,7 @@ kEventResult NodeTextInput::handle_event(Event* e) on_return(this); } } - else if (ke->m_char >= 32 && ke->m_char < (32 + 96)) + else if (ke->m_char >= 32 && ke->m_char < 127) // visible ascii character { m_text += (char)ke->m_char; set_text(m_text);