Merge pull request #34865 from volzhs/oversampling-emoji
Update size and position for colored font with oversampling
This commit is contained in:
commit
24281cd9c9
2 changed files with 19 additions and 5 deletions
|
@ -195,13 +195,13 @@ Error DynamicFontAtSize::_load() {
|
|||
if (FT_HAS_COLOR(face) && face->num_fixed_sizes > 0) {
|
||||
int best_match = 0;
|
||||
int diff = ABS(id.size - ((int64_t)face->available_sizes[0].width));
|
||||
scale_color_font = float(id.size) / face->available_sizes[0].width;
|
||||
scale_color_font = float(id.size * oversampling) / face->available_sizes[0].width;
|
||||
for (int i = 1; i < face->num_fixed_sizes; i++) {
|
||||
int ndiff = ABS(id.size - ((int64_t)face->available_sizes[i].width));
|
||||
if (ndiff < diff) {
|
||||
best_match = i;
|
||||
diff = ndiff;
|
||||
scale_color_font = float(id.size) / face->available_sizes[i].width;
|
||||
scale_color_font = float(id.size * oversampling) / face->available_sizes[i].width;
|
||||
}
|
||||
}
|
||||
FT_Select_Size(face, best_match);
|
||||
|
@ -299,7 +299,7 @@ void DynamicFontAtSize::set_texture_flags(uint32_t p_flags) {
|
|||
}
|
||||
}
|
||||
|
||||
float DynamicFontAtSize::draw_char(RID p_canvas_item, const Point2 &p_pos, CharType p_char, CharType p_next, const Color &p_modulate, const Vector<Ref<DynamicFontAtSize> > &p_fallbacks, bool p_advance_only) const {
|
||||
float DynamicFontAtSize::draw_char(RID p_canvas_item, const Point2 &p_pos, CharType p_char, CharType p_next, const Color &p_modulate, const Vector<Ref<DynamicFontAtSize> > &p_fallbacks, bool p_advance_only, bool p_outline) const {
|
||||
|
||||
if (!valid)
|
||||
return 0;
|
||||
|
@ -314,6 +314,20 @@ float DynamicFontAtSize::draw_char(RID p_canvas_item, const Point2 &p_pos, CharT
|
|||
|
||||
float advance = 0.0;
|
||||
|
||||
// use normal character size if there's no outline charater
|
||||
if (p_outline && !ch->found) {
|
||||
FT_GlyphSlot slot = face->glyph;
|
||||
int error = FT_Load_Char(face, p_char, FT_HAS_COLOR(face) ? FT_LOAD_COLOR : FT_LOAD_DEFAULT);
|
||||
if (!error) {
|
||||
error = FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL);
|
||||
if (!error) {
|
||||
Character character = Character::not_found();
|
||||
character = const_cast<DynamicFontAtSize *>(this)->_bitmap_to_character(slot->bitmap, slot->bitmap_top, slot->bitmap_left, slot->advance.x / 64.0);
|
||||
advance = character.advance;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ch->found) {
|
||||
ERR_FAIL_COND_V(ch->texture_idx < -1 || ch->texture_idx >= font->textures.size(), 0);
|
||||
|
||||
|
@ -875,7 +889,7 @@ float DynamicFont::draw_char(RID p_canvas_item, const Point2 &p_pos, CharType p_
|
|||
|
||||
// If requested outline draw, but no outline is present, simply return advance without drawing anything
|
||||
bool advance_only = p_outline && outline_cache_id.outline_size == 0;
|
||||
return font_at_size->draw_char(p_canvas_item, p_pos, p_char, p_next, color, fallbacks, advance_only) + spacing_char;
|
||||
return font_at_size->draw_char(p_canvas_item, p_pos, p_char, p_next, color, fallbacks, advance_only, p_outline) + spacing_char;
|
||||
}
|
||||
|
||||
void DynamicFont::set_fallback(int p_idx, const Ref<DynamicFontData> &p_data) {
|
||||
|
|
|
@ -192,7 +192,7 @@ public:
|
|||
|
||||
Size2 get_char_size(CharType p_char, CharType p_next, const Vector<Ref<DynamicFontAtSize> > &p_fallbacks) const;
|
||||
|
||||
float draw_char(RID p_canvas_item, const Point2 &p_pos, CharType p_char, CharType p_next, const Color &p_modulate, const Vector<Ref<DynamicFontAtSize> > &p_fallbacks, bool p_advance_only = false) const;
|
||||
float draw_char(RID p_canvas_item, const Point2 &p_pos, CharType p_char, CharType p_next, const Color &p_modulate, const Vector<Ref<DynamicFontAtSize> > &p_fallbacks, bool p_advance_only = false, bool p_outline = false) const;
|
||||
|
||||
void set_texture_flags(uint32_t p_flags);
|
||||
void update_oversampling();
|
||||
|
|
Loading…
Reference in a new issue