Remove draw_glyph using in ui::edit, cache raw images instead
This commit is contained in:
parent
35eaf17a3b
commit
395464ebd5
2 changed files with 34 additions and 19 deletions
|
|
@ -104,8 +104,14 @@ namespace psemek::ui
|
||||||
|
|
||||||
struct cached_state
|
struct cached_state
|
||||||
{
|
{
|
||||||
struct font const * font = nullptr;
|
struct image
|
||||||
std::vector<glyph> glyphs;
|
{
|
||||||
|
geom::box<float, 2> texcoords;
|
||||||
|
geom::box<float, 2> position;
|
||||||
|
};
|
||||||
|
|
||||||
|
gfx::texture_2d const * texture = nullptr;
|
||||||
|
std::vector<image> images;
|
||||||
geom::vector<float, 2> size{0.f, 0.f};
|
geom::vector<float, 2> size{0.f, 0.f};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -146,11 +146,11 @@ namespace psemek::ui
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto it = std::lower_bound(cached_state_->glyphs.begin(), cached_state_->glyphs.end(), *mouse_x_, [&](glyph const & g, float x){
|
auto it = std::lower_bound(cached_state_->images.begin(), cached_state_->images.end(), *mouse_x_, [&](auto const & i, float x){
|
||||||
return g.position[0].center() + x_offset < x;
|
return i.position[0].center() + x_offset < x;
|
||||||
});
|
});
|
||||||
|
|
||||||
caret_ = it - cached_state_->glyphs.begin();
|
caret_ = it - cached_state_->images.begin();
|
||||||
caret_blink_timer_ = 0.f;
|
caret_blink_timer_ = 0.f;
|
||||||
caret_visible_ = true;
|
caret_visible_ = true;
|
||||||
}
|
}
|
||||||
|
|
@ -388,19 +388,28 @@ namespace psemek::ui
|
||||||
|
|
||||||
if (!cached_state_)
|
if (!cached_state_)
|
||||||
{
|
{
|
||||||
|
auto font = (font_ == font_type::bold) ? st->bold_font.get() : st->font.get();
|
||||||
|
|
||||||
cached_state state;
|
cached_state state;
|
||||||
state.font = (font_ == font_type::bold) ? st->bold_font.get() : st->font.get();
|
state.texture = &font->atlas();
|
||||||
|
|
||||||
shape_options options;
|
shape_options options;
|
||||||
options.scale = *st->text_scale;
|
options.scale = *st->text_scale;
|
||||||
state.glyphs = state.font->shape(text_, options);
|
auto glyphs = font->shape(text_, options);
|
||||||
|
|
||||||
geom::box<float, 2> bbox;
|
geom::box<float, 2> bbox;
|
||||||
for (auto const & g : state.glyphs)
|
for (auto const & g : glyphs)
|
||||||
bbox |= g.position;
|
bbox |= g.position;
|
||||||
|
|
||||||
state.size[0] = state.glyphs.empty() ? 0.f : bbox[0].length();
|
state.size[0] = glyphs.empty() ? 0.f : bbox[0].length();
|
||||||
state.size[1] = state.font->size()[1] * (*st->text_scale);
|
state.size[1] = font->size()[1] * (*st->text_scale);
|
||||||
|
|
||||||
|
for (auto const & g : glyphs)
|
||||||
|
{
|
||||||
|
auto tc = font->texcoords(g.character);
|
||||||
|
if (!tc) continue;
|
||||||
|
state.images.push_back({*tc, g.position});
|
||||||
|
}
|
||||||
|
|
||||||
cached_state_ = std::move(state);
|
cached_state_ = std::move(state);
|
||||||
}
|
}
|
||||||
|
|
@ -440,26 +449,26 @@ namespace psemek::ui
|
||||||
if (*st->text_shadow_offset != geom::vector{0, 0} && (*st->shadow_color)[3] != 0)
|
if (*st->text_shadow_offset != geom::vector{0, 0} && (*st->shadow_color)[3] != 0)
|
||||||
{
|
{
|
||||||
auto shoffset = offset + geom::cast<float>(*st->text_shadow_offset);
|
auto shoffset = offset + geom::cast<float>(*st->text_shadow_offset);
|
||||||
for (auto const & g : cached_state_->glyphs)
|
for (auto const & i : cached_state_->images)
|
||||||
p.draw_glyph(*cached_state_->font, g.character, g.position + shoffset, *st->shadow_color);
|
p.draw_image(i.position + shoffset, {cached_state_->texture, i.texcoords}, {*st->shadow_color});
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto const & g : cached_state_->glyphs)
|
for (auto const & i : cached_state_->images)
|
||||||
p.draw_glyph(*cached_state_->font, g.character, g.position + offset, *st->text_color);
|
p.draw_image(i.position + offset, {cached_state_->texture, i.texcoords}, {*st->text_color});
|
||||||
|
|
||||||
p.end_stencil();
|
p.end_stencil();
|
||||||
|
|
||||||
if (caret_visible_)
|
if (caret_visible_)
|
||||||
{
|
{
|
||||||
float x;
|
float x;
|
||||||
if (cached_state_->glyphs.empty())
|
if (cached_state_->images.empty())
|
||||||
x = 0.f;
|
x = 0.f;
|
||||||
else if (caret_ == 0)
|
else if (caret_ == 0)
|
||||||
x = cached_state_->glyphs.front().position[0].min;
|
x = cached_state_->images.front().position[0].min;
|
||||||
else if (caret_ >= cached_state_->glyphs.size())
|
else if (caret_ >= cached_state_->images.size())
|
||||||
x = cached_state_->glyphs.back().position[0].max;
|
x = cached_state_->images.back().position[0].max;
|
||||||
else
|
else
|
||||||
x = (cached_state_->glyphs[caret_ - 1].position[0].max + cached_state_->glyphs[caret_].position[0].min) / 2.f;
|
x = (cached_state_->images[caret_ - 1].position[0].max + cached_state_->images[caret_].position[0].min) / 2.f;
|
||||||
|
|
||||||
x += offset[0];
|
x += offset[0];
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue