Merge pull request #49377 from Calinou/readd-dynamicfont-kerning

Readd support for kerning in DynamicFont (3.x)
This commit is contained in:
Rémi Verschelde 2021-06-07 14:30:44 +02:00 committed by GitHub
commit 5d8fe70de5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 17 additions and 0 deletions

View file

@ -236,6 +236,18 @@ const Pair<const DynamicFontAtSize::Character *, DynamicFontAtSize *> DynamicFon
return Pair<const Character *, DynamicFontAtSize *>(chr, const_cast<DynamicFontAtSize *>(this)); return Pair<const Character *, DynamicFontAtSize *>(chr, const_cast<DynamicFontAtSize *>(this));
} }
float DynamicFontAtSize::_get_kerning_advance(const DynamicFontAtSize *font, CharType p_char, CharType p_next) const {
float advance = 0.0;
if (p_next) {
FT_Vector delta;
FT_Get_Kerning(font->face, FT_Get_Char_Index(font->face, p_char), FT_Get_Char_Index(font->face, p_next), FT_KERNING_DEFAULT, &delta);
advance = (delta.x / 64.0) / oversampling;
}
return advance;
}
Size2 DynamicFontAtSize::get_char_size(CharType p_char, CharType p_next, const Vector<Ref<DynamicFontAtSize>> &p_fallbacks) const { Size2 DynamicFontAtSize::get_char_size(CharType p_char, CharType p_next, const Vector<Ref<DynamicFontAtSize>> &p_fallbacks) const {
if (!valid) { if (!valid) {
return Size2(1, 1); return Size2(1, 1);
@ -244,6 +256,7 @@ Size2 DynamicFontAtSize::get_char_size(CharType p_char, CharType p_next, const V
Pair<const Character *, DynamicFontAtSize *> char_pair_with_font = _find_char_with_font(p_char, p_fallbacks); Pair<const Character *, DynamicFontAtSize *> char_pair_with_font = _find_char_with_font(p_char, p_fallbacks);
const Character *ch = char_pair_with_font.first; const Character *ch = char_pair_with_font.first;
DynamicFontAtSize *font = char_pair_with_font.second;
ERR_FAIL_COND_V(!ch, Size2()); ERR_FAIL_COND_V(!ch, Size2());
Size2 ret(0, get_height()); Size2 ret(0, get_height());
@ -251,6 +264,7 @@ Size2 DynamicFontAtSize::get_char_size(CharType p_char, CharType p_next, const V
if (ch->found) { if (ch->found) {
ret.x = ch->advance; ret.x = ch->advance;
} }
ret.x += _get_kerning_advance(font, p_char, p_next);
return ret; return ret;
} }
@ -332,6 +346,8 @@ float DynamicFontAtSize::draw_char(RID p_canvas_item, const Point2 &p_pos, CharT
advance = ch->advance; advance = ch->advance;
} }
advance += _get_kerning_advance(font, p_char, p_next);
return advance; return advance;
} }

View file

@ -162,6 +162,7 @@ class DynamicFontAtSize : public Reference {
const Pair<const Character *, DynamicFontAtSize *> _find_char_with_font(CharType p_char, const Vector<Ref<DynamicFontAtSize>> &p_fallbacks) const; const Pair<const Character *, DynamicFontAtSize *> _find_char_with_font(CharType p_char, const Vector<Ref<DynamicFontAtSize>> &p_fallbacks) const;
Character _make_outline_char(CharType p_char); Character _make_outline_char(CharType p_char);
float _get_kerning_advance(const DynamicFontAtSize *font, CharType p_char, CharType p_next) const;
TexturePosition _find_texture_pos_for_glyph(int p_color_size, Image::Format p_image_format, int p_width, int p_height); TexturePosition _find_texture_pos_for_glyph(int p_color_size, Image::Format p_image_format, int p_width, int p_height);
Character _bitmap_to_character(FT_Bitmap bitmap, int yofs, int xofs, float advance); Character _bitmap_to_character(FT_Bitmap bitmap, int yofs, int xofs, float advance);