diff options
author | Rémi Verschelde <remi@verschelde.fr> | 2021-03-31 09:28:20 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-31 09:28:20 +0200 |
commit | 3096423ddc61c8422722d629da3671c628bf2864 (patch) | |
tree | 9b0ff0aed5f4dd7c07457c288007fede4fe982cb /modules/text_server_adv/dynamic_font_adv.cpp | |
parent | e49f88b3127b43b91515b2b09827b61bae9b5e93 (diff) | |
parent | 0d3fa2a12558d90e7b9cc05f38e8b5c866a2d794 (diff) |
Merge pull request #44289 from bruvzg/ctl_gl_contours
Expose dynamic font vector outlines to the GDScript.
Diffstat (limited to 'modules/text_server_adv/dynamic_font_adv.cpp')
-rw-r--r-- | modules/text_server_adv/dynamic_font_adv.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/modules/text_server_adv/dynamic_font_adv.cpp b/modules/text_server_adv/dynamic_font_adv.cpp index 2521e68dda..19d04bdb02 100644 --- a/modules/text_server_adv/dynamic_font_adv.cpp +++ b/modules/text_server_adv/dynamic_font_adv.cpp @@ -997,6 +997,29 @@ Vector2 DynamicFontDataAdvanced::draw_glyph_outline(RID p_canvas, int p_size, in return advance; } +bool DynamicFontDataAdvanced::get_glyph_contours(int p_size, uint32_t p_index, Vector<Vector3> &r_points, Vector<int32_t> &r_contours, bool &r_orientation) const { + _THREAD_SAFE_METHOD_ + DataAtSize *fds = const_cast<DynamicFontDataAdvanced *>(this)->get_data_for_size(p_size); + ERR_FAIL_COND_V(fds == nullptr, false); + + int error = FT_Load_Glyph(fds->face, p_index, FT_LOAD_NO_BITMAP | (force_autohinter ? FT_LOAD_FORCE_AUTOHINT : 0)); + ERR_FAIL_COND_V(error, false); + + r_points.clear(); + r_contours.clear(); + + float h = fds->ascent; + float scale = (1.0 / 64.0) / oversampling * fds->scale_color_font; + for (short i = 0; i < fds->face->glyph->outline.n_points; i++) { + r_points.push_back(Vector3(fds->face->glyph->outline.points[i].x * scale, h - fds->face->glyph->outline.points[i].y * scale, FT_CURVE_TAG(fds->face->glyph->outline.tags[i]))); + } + for (short i = 0; i < fds->face->glyph->outline.n_contours; i++) { + r_contours.push_back(fds->face->glyph->outline.contours[i]); + } + r_orientation = (FT_Outline_Get_Orientation(&fds->face->glyph->outline) == FT_ORIENTATION_FILL_RIGHT); + return true; +} + DynamicFontDataAdvanced::~DynamicFontDataAdvanced() { clear_cache(); if (library != nullptr) { |