Path: blob/master/modules/text_server_fb/text_server_fb.h
20888 views
/**************************************************************************/1/* text_server_fb.h */2/**************************************************************************/3/* This file is part of: */4/* GODOT ENGINE */5/* https://godotengine.org */6/**************************************************************************/7/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */8/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */9/* */10/* Permission is hereby granted, free of charge, to any person obtaining */11/* a copy of this software and associated documentation files (the */12/* "Software"), to deal in the Software without restriction, including */13/* without limitation the rights to use, copy, modify, merge, publish, */14/* distribute, sublicense, and/or sell copies of the Software, and to */15/* permit persons to whom the Software is furnished to do so, subject to */16/* the following conditions: */17/* */18/* The above copyright notice and this permission notice shall be */19/* included in all copies or substantial portions of the Software. */20/* */21/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */22/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */23/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */24/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */25/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */26/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */27/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */28/**************************************************************************/2930#pragma once3132/*************************************************************************/33/* Fallback Text Server provides simplified TS functionality, without */34/* BiDi, shaping and advanced font features support. */35/*************************************************************************/3637#ifdef GDEXTENSION38// Headers for building as GDExtension plug-in.3940#include <godot_cpp/godot.hpp>4142#include <godot_cpp/core/class_db.hpp>43#include <godot_cpp/core/ext_wrappers.gen.inc>44#include <godot_cpp/core/mutex_lock.hpp>4546#include <godot_cpp/variant/array.hpp>47#include <godot_cpp/variant/dictionary.hpp>48#include <godot_cpp/variant/packed_int32_array.hpp>49#include <godot_cpp/variant/packed_string_array.hpp>50#include <godot_cpp/variant/packed_vector2_array.hpp>51#include <godot_cpp/variant/rect2.hpp>52#include <godot_cpp/variant/rid.hpp>53#include <godot_cpp/variant/string.hpp>54#include <godot_cpp/variant/typed_array.hpp>55#include <godot_cpp/variant/vector2.hpp>56#include <godot_cpp/variant/vector2i.hpp>5758#include <godot_cpp/classes/text_server.hpp>59#include <godot_cpp/classes/text_server_extension.hpp>60#include <godot_cpp/classes/text_server_manager.hpp>6162#include <godot_cpp/classes/caret_info.hpp>63#include <godot_cpp/classes/global_constants_binds.hpp>64#include <godot_cpp/classes/glyph.hpp>65#include <godot_cpp/classes/image.hpp>66#include <godot_cpp/classes/image_texture.hpp>67#include <godot_cpp/classes/ref.hpp>68#include <godot_cpp/classes/worker_thread_pool.hpp>6970#include <godot_cpp/templates/hash_map.hpp>71#include <godot_cpp/templates/hash_set.hpp>72#include <godot_cpp/templates/rid_owner.hpp>73#include <godot_cpp/templates/safe_refcount.hpp>74#include <godot_cpp/templates/vector.hpp>7576using namespace godot;7778#elif defined(GODOT_MODULE)79// Headers for building as built-in module.8081#include "core/extension/ext_wrappers.gen.h"82#include "core/object/worker_thread_pool.h"83#include "core/templates/hash_map.h"84#include "core/templates/rid_owner.h"85#include "core/templates/safe_refcount.h"86#include "scene/resources/image_texture.h"87#include "servers/text/text_server_extension.h"8889#include "modules/modules_enabled.gen.h" // For freetype, msdfgen, svg.9091#endif9293// Thirdparty headers.9495#ifdef MODULE_FREETYPE_ENABLED96#include <ft2build.h>97#include FT_FREETYPE_H98#include FT_TRUETYPE_TABLES_H99#include FT_STROKER_H100#include FT_ADVANCES_H101#include FT_MULTIPLE_MASTERS_H102#include FT_BBOX_H103#include FT_SIZES_H104#include FT_MODULE_H105#include FT_CONFIG_OPTIONS_H106#if !defined(FT_CONFIG_OPTION_USE_BROTLI) && !defined(_MSC_VER)107#warning FreeType is configured without Brotli support, built-in fonts will not be available.108#endif109#endif110111/*************************************************************************/112113class TextServerFallback : public TextServerExtension {114GDCLASS(TextServerFallback, TextServerExtension);115_THREAD_SAFE_CLASS_116117HashMap<StringName, int32_t> feature_sets;118HashMap<int32_t, StringName> feature_sets_inv;119120SafeNumeric<TextServer::FontLCDSubpixelLayout> lcd_subpixel_layout{ TextServer::FontLCDSubpixelLayout::FONT_LCD_SUBPIXEL_LAYOUT_NONE };121void _update_settings();122123void _insert_feature_sets();124_FORCE_INLINE_ void _insert_feature(const StringName &p_name, int32_t p_tag);125126// Font cache data.127128#ifdef MODULE_FREETYPE_ENABLED129mutable FT_Library ft_library = nullptr;130#endif131132const int rect_range = 1;133134struct FontTexturePosition {135int32_t index = -1;136int32_t x = 0;137int32_t y = 0;138139FontTexturePosition() {}140FontTexturePosition(int32_t p_id, int32_t p_x, int32_t p_y) :141index(p_id), x(p_x), y(p_y) {}142};143144struct Shelf {145int32_t x = 0;146int32_t y = 0;147int32_t w = 0;148int32_t h = 0;149150FontTexturePosition alloc_shelf(int32_t p_id, int32_t p_w, int32_t p_h) {151if (p_w > w || p_h > h) {152return FontTexturePosition(-1, 0, 0);153}154int32_t xx = x;155x += p_w;156w -= p_w;157return FontTexturePosition(p_id, xx, y);158}159160Shelf() {}161Shelf(int32_t p_x, int32_t p_y, int32_t p_w, int32_t p_h) :162x(p_x), y(p_y), w(p_w), h(p_h) {}163};164165struct ShelfPackTexture {166int32_t texture_w = 1024;167int32_t texture_h = 1024;168169Ref<Image> image;170Ref<ImageTexture> texture;171bool dirty = true;172173List<Shelf> shelves;174175FontTexturePosition pack_rect(int32_t p_id, int32_t p_h, int32_t p_w) {176int32_t y = 0;177int32_t waste = 0;178Shelf *best_shelf = nullptr;179int32_t best_waste = std::numeric_limits<std::int32_t>::max();180181for (Shelf &E : shelves) {182y += E.h;183if (p_w > E.w) {184continue;185}186if (p_h == E.h) {187return E.alloc_shelf(p_id, p_w, p_h);188}189if (p_h > E.h) {190continue;191}192if (p_h < E.h) {193waste = (E.h - p_h) * p_w;194if (waste < best_waste) {195best_waste = waste;196best_shelf = &E;197}198}199}200if (best_shelf) {201return best_shelf->alloc_shelf(p_id, p_w, p_h);202}203if (p_h <= (texture_h - y) && p_w <= texture_w) {204List<Shelf>::Element *E = shelves.push_back(Shelf(0, y, texture_w, p_h));205return E->get().alloc_shelf(p_id, p_w, p_h);206}207return FontTexturePosition(-1, 0, 0);208}209210ShelfPackTexture() {}211ShelfPackTexture(int32_t p_w, int32_t p_h) :212texture_w(p_w), texture_h(p_h) {}213};214215struct FontGlyph {216bool found = false;217int texture_idx = -1;218Rect2 rect;219Rect2 uv_rect;220Vector2 advance;221bool from_svg = false;222};223224struct FontFallback;225struct FontForSizeFallback {226double ascent = 0.0;227double descent = 0.0;228double underline_position = 0.0;229double underline_thickness = 0.0;230double scale = 1.0;231232FontFallback *owner = nullptr;233uint32_t viewport_oversampling = 0;234235Vector2i size;236237Vector<ShelfPackTexture> textures;238HashMap<int32_t, FontGlyph> glyph_map;239HashMap<Vector2i, Vector2> kerning_map;240241#ifdef MODULE_FREETYPE_ENABLED242FT_Size fsize = nullptr;243#endif244245~FontForSizeFallback() {246#ifdef MODULE_FREETYPE_ENABLED247if (fsize != nullptr) {248FT_Done_Size(fsize);249}250#endif251}252};253254struct OversamplingLevel {255HashSet<FontForSizeFallback *> fonts;256int32_t refcount = 1;257};258259mutable HashMap<uint32_t, OversamplingLevel> oversampling_levels;260261struct FontFallbackLinkedVariation {262RID base_font;263int extra_spacing[4] = { 0, 0, 0, 0 };264double baseline_offset = 0.0;265};266267struct FontFallback {268Mutex mutex;269270TextServer::FontAntialiasing antialiasing = TextServer::FONT_ANTIALIASING_GRAY;271bool disable_embedded_bitmaps = true;272bool mipmaps = false;273bool msdf = false;274FixedSizeScaleMode fixed_size_scale_mode = FIXED_SIZE_SCALE_DISABLE;275int msdf_range = 14;276int msdf_source_size = 48;277int fixed_size = 0;278bool force_autohinter = false;279bool allow_system_fallback = true;280bool modulate_color_glyphs = false;281TextServer::Hinting hinting = TextServer::HINTING_LIGHT;282TextServer::SubpixelPositioning subpixel_positioning = TextServer::SUBPIXEL_POSITIONING_AUTO;283bool keep_rounding_remainders = true;284Dictionary variation_coordinates;285double oversampling_override = 0.0;286double embolden = 0.0;287Transform2D transform;288289BitField<TextServer::FontStyle> style_flags = 0;290String font_name;291String style_name;292int weight = 400;293int stretch = 100;294int extra_spacing[4] = { 0, 0, 0, 0 };295double baseline_offset = 0.0;296297HashMap<Vector2i, FontForSizeFallback *> cache;298299bool face_init = false;300Dictionary supported_varaitions;301Dictionary feature_overrides;302303// Language/script support override.304HashMap<String, bool> language_support_overrides;305HashMap<String, bool> script_support_overrides;306307PackedByteArray data;308const uint8_t *data_ptr = nullptr;309size_t data_size;310int face_index = 0;311312#ifdef MODULE_FREETYPE_ENABLED313FT_Face face = nullptr;314FT_StreamRec stream;315#endif316317~FontFallback() {318for (const KeyValue<Vector2i, FontForSizeFallback *> &E : cache) {319memdelete(E.value);320}321cache.clear();322#ifdef MODULE_FREETYPE_ENABLED323if (face != nullptr) {324FT_Done_Face(face);325}326#endif327}328};329330_FORCE_INLINE_ FontTexturePosition find_texture_pos_for_glyph(FontForSizeFallback *p_data, int p_color_size, Image::Format p_image_format, int p_width, int p_height, bool p_msdf) const;331#ifdef MODULE_MSDFGEN_ENABLED332_FORCE_INLINE_ FontGlyph rasterize_msdf(FontFallback *p_font_data, FontForSizeFallback *p_data, int p_pixel_range, int p_rect_margin, FT_Outline *p_outline, const Vector2 &p_advance) const;333#endif334#ifdef MODULE_FREETYPE_ENABLED335_FORCE_INLINE_ FontGlyph rasterize_bitmap(FontForSizeFallback *p_data, int p_rect_margin, FT_Bitmap p_bitmap, int p_yofs, int p_xofs, const Vector2 &p_advance, bool p_bgra) const;336#endif337bool _ensure_glyph(FontFallback *p_font_data, const Vector2i &p_size, int32_t p_glyph, FontGlyph &r_glyph, uint32_t p_oversampling = 0) const;338bool _ensure_cache_for_size(FontFallback *p_font_data, const Vector2i &p_size, FontForSizeFallback *&r_cache_for_size, bool p_silent = false, uint32_t p_oversampling = 0) const;339_FORCE_INLINE_ bool _font_validate(const RID &p_font_rid) const;340_FORCE_INLINE_ void _font_clear_cache(FontFallback *p_font_data);341static void _generateMTSDF_threaded(void *p_td, uint32_t p_y);342343_FORCE_INLINE_ Vector2i _get_size(const FontFallback *p_font_data, int p_size) const {344if (p_font_data->msdf) {345return Vector2i(p_font_data->msdf_source_size * 64, 0);346} else if (p_font_data->fixed_size > 0) {347return Vector2i(p_font_data->fixed_size * 64, 0);348} else {349return Vector2i(p_size * 64, 0);350}351}352353_FORCE_INLINE_ Vector2i _get_size_outline(const FontFallback *p_font_data, const Vector2i &p_size) const {354if (p_font_data->msdf) {355return Vector2i(p_font_data->msdf_source_size * 64, 0);356} else if (p_font_data->fixed_size > 0) {357return Vector2i(p_font_data->fixed_size * 64, MIN(p_size.y, 1));358} else {359return Vector2i(p_size.x * 64, p_size.y);360}361}362363_FORCE_INLINE_ int _font_get_weight_by_name(const String &p_sty_name) const {364String sty_name = p_sty_name.remove_chars(" -");365if (sty_name.contains("thin") || sty_name.contains("hairline")) {366return 100;367} else if (sty_name.contains("extralight") || sty_name.contains("ultralight")) {368return 200;369} else if (sty_name.contains("light")) {370return 300;371} else if (sty_name.contains("semilight")) {372return 350;373} else if (sty_name.contains("regular")) {374return 400;375} else if (sty_name.contains("medium")) {376return 500;377} else if (sty_name.contains("semibold") || sty_name.contains("demibold")) {378return 600;379} else if (sty_name.contains("bold")) {380return 700;381} else if (sty_name.contains("extrabold") || sty_name.contains("ultrabold")) {382return 800;383} else if (sty_name.contains("black") || sty_name.contains("heavy")) {384return 900;385} else if (sty_name.contains("extrablack") || sty_name.contains("ultrablack")) {386return 950;387}388return 400;389}390_FORCE_INLINE_ int _font_get_stretch_by_name(const String &p_sty_name) const {391String sty_name = p_sty_name.remove_chars(" -");392if (sty_name.contains("ultracondensed")) {393return 50;394} else if (sty_name.contains("extracondensed")) {395return 63;396} else if (sty_name.contains("condensed")) {397return 75;398} else if (sty_name.contains("semicondensed")) {399return 87;400} else if (sty_name.contains("semiexpanded")) {401return 113;402} else if (sty_name.contains("expanded")) {403return 125;404} else if (sty_name.contains("extraexpanded")) {405return 150;406} else if (sty_name.contains("ultraexpanded")) {407return 200;408}409return 100;410}411_FORCE_INLINE_ bool _is_ital_style(const String &p_sty_name) const {412return p_sty_name.contains("italic") || p_sty_name.contains("oblique");413}414415// Shaped text cache data.416struct TrimData {417int trim_pos = -1;418int ellipsis_pos = -1;419Vector<Glyph> ellipsis_glyph_buf;420};421422struct TextRun {423Vector2i range;424RID font_rid;425int font_size = 0;426int64_t span_index = -1;427};428429struct ShapedTextDataFallback {430Mutex mutex;431432/* Source data */433RID parent; // Substring parent ShapedTextData.434435int start = 0; // Substring start offset in the parent string.436int end = 0; // Substring end offset in the parent string.437438String text;439String custom_punct;440TextServer::Direction direction = DIRECTION_LTR; // Desired text direction.441TextServer::Orientation orientation = ORIENTATION_HORIZONTAL;442443struct Span {444int start = -1;445int end = -1;446447Array fonts;448int font_size = 0;449450Variant embedded_key;451452String language;453Dictionary features;454Variant meta;455};456Vector<Span> spans;457int first_span = 0; // First span in the parent ShapedTextData.458int last_span = 0;459460Vector<TextRun> runs;461bool runs_dirty = true;462463struct EmbeddedObject {464int start = -1;465int end = -1;466InlineAlignment inline_align = INLINE_ALIGNMENT_CENTER;467Rect2 rect;468double baseline = 0;469};470HashMap<Variant, EmbeddedObject> objects;471472/* Shaped data */473TextServer::Direction para_direction = DIRECTION_LTR; // Detected text direction.474SafeFlag valid{ false }; // String is shaped.475bool line_breaks_valid = false; // Line and word break flags are populated (and virtual zero width spaces inserted).476bool justification_ops_valid = false; // Virtual elongation glyphs are added to the string.477bool sort_valid = false;478bool text_trimmed = false;479480bool preserve_invalid = true; // Draw hex code box instead of missing characters.481bool preserve_control = false; // Draw control characters.482483double ascent = 0.0; // Ascent for horizontal layout, 1/2 of width for vertical.484double descent = 0.0; // Descent for horizontal layout, 1/2 of width for vertical.485double width = 0.0; // Width for horizontal layout, height for vertical.486double width_trimmed = 0.0;487int extra_spacing[4] = { 0, 0, 0, 0 };488489double upos = 0.0;490double uthk = 0.0;491492char32_t el_char = 0x2026;493TrimData overrun_trim_data;494bool fit_width_minimum_reached = false;495496Vector<Glyph> glyphs;497Vector<Glyph> glyphs_logical;498};499500// Common data.501502mutable RID_PtrOwner<FontFallbackLinkedVariation> font_var_owner;503mutable RID_PtrOwner<FontFallback> font_owner;504mutable RID_PtrOwner<ShapedTextDataFallback> shaped_owner;505506_FORCE_INLINE_ FontFallback *_get_font_data(const RID &p_font_rid) const {507RID rid = p_font_rid;508FontFallbackLinkedVariation *fdv = font_var_owner.get_or_null(rid);509if (unlikely(fdv)) {510rid = fdv->base_font;511}512return font_owner.get_or_null(rid);513}514515struct SystemFontKey {516String font_name;517TextServer::FontAntialiasing antialiasing = TextServer::FONT_ANTIALIASING_GRAY;518bool disable_embedded_bitmaps = true;519bool italic = false;520bool mipmaps = false;521bool msdf = false;522bool force_autohinter = false;523int weight = 400;524int stretch = 100;525int msdf_range = 14;526int msdf_source_size = 48;527int fixed_size = 0;528TextServer::Hinting hinting = TextServer::HINTING_LIGHT;529TextServer::SubpixelPositioning subpixel_positioning = TextServer::SUBPIXEL_POSITIONING_AUTO;530bool keep_rounding_remainders = true;531Dictionary variation_coordinates;532double embolden = 0.0;533Transform2D transform;534int extra_spacing[4] = { 0, 0, 0, 0 };535double baseline_offset = 0.0;536537bool operator==(const SystemFontKey &p_b) const {538return (font_name == p_b.font_name) && (antialiasing == p_b.antialiasing) && (italic == p_b.italic) && (disable_embedded_bitmaps == p_b.disable_embedded_bitmaps) && (mipmaps == p_b.mipmaps) && (msdf == p_b.msdf) && (force_autohinter == p_b.force_autohinter) && (weight == p_b.weight) && (stretch == p_b.stretch) && (msdf_range == p_b.msdf_range) && (msdf_source_size == p_b.msdf_source_size) && (fixed_size == p_b.fixed_size) && (hinting == p_b.hinting) && (subpixel_positioning == p_b.subpixel_positioning) && (keep_rounding_remainders == p_b.keep_rounding_remainders) && (variation_coordinates == p_b.variation_coordinates) && (embolden == p_b.embolden) && (transform == p_b.transform) && (extra_spacing[SPACING_TOP] == p_b.extra_spacing[SPACING_TOP]) && (extra_spacing[SPACING_BOTTOM] == p_b.extra_spacing[SPACING_BOTTOM]) && (extra_spacing[SPACING_SPACE] == p_b.extra_spacing[SPACING_SPACE]) && (extra_spacing[SPACING_GLYPH] == p_b.extra_spacing[SPACING_GLYPH]) && (baseline_offset == p_b.baseline_offset);539}540541SystemFontKey(const String &p_font_name, bool p_italic, int p_weight, int p_stretch, RID p_font, const TextServerFallback *p_fb) {542font_name = p_font_name;543italic = p_italic;544weight = p_weight;545stretch = p_stretch;546antialiasing = p_fb->_font_get_antialiasing(p_font);547disable_embedded_bitmaps = p_fb->_font_get_disable_embedded_bitmaps(p_font);548mipmaps = p_fb->_font_get_generate_mipmaps(p_font);549msdf = p_fb->_font_is_multichannel_signed_distance_field(p_font);550msdf_range = p_fb->_font_get_msdf_pixel_range(p_font);551msdf_source_size = p_fb->_font_get_msdf_size(p_font);552fixed_size = p_fb->_font_get_fixed_size(p_font);553force_autohinter = p_fb->_font_is_force_autohinter(p_font);554hinting = p_fb->_font_get_hinting(p_font);555subpixel_positioning = p_fb->_font_get_subpixel_positioning(p_font);556keep_rounding_remainders = p_fb->_font_get_keep_rounding_remainders(p_font);557variation_coordinates = p_fb->_font_get_variation_coordinates(p_font);558embolden = p_fb->_font_get_embolden(p_font);559transform = p_fb->_font_get_transform(p_font);560extra_spacing[SPACING_TOP] = p_fb->_font_get_spacing(p_font, SPACING_TOP);561extra_spacing[SPACING_BOTTOM] = p_fb->_font_get_spacing(p_font, SPACING_BOTTOM);562extra_spacing[SPACING_SPACE] = p_fb->_font_get_spacing(p_font, SPACING_SPACE);563extra_spacing[SPACING_GLYPH] = p_fb->_font_get_spacing(p_font, SPACING_GLYPH);564baseline_offset = p_fb->_font_get_baseline_offset(p_font);565}566};567568struct SystemFontCacheRec {569RID rid;570int index = 0;571};572573struct SystemFontCache {574Vector<SystemFontCacheRec> var;575int max_var = 0;576};577578struct SystemFontKeyHasher {579_FORCE_INLINE_ static uint32_t hash(const SystemFontKey &p_a) {580uint32_t hash = p_a.font_name.hash();581hash = hash_murmur3_one_32(p_a.variation_coordinates.hash(), hash);582hash = hash_murmur3_one_32(p_a.weight, hash);583hash = hash_murmur3_one_32(p_a.stretch, hash);584hash = hash_murmur3_one_32(p_a.msdf_range, hash);585hash = hash_murmur3_one_32(p_a.msdf_source_size, hash);586hash = hash_murmur3_one_32(p_a.fixed_size, hash);587hash = hash_murmur3_one_double(p_a.embolden, hash);588hash = hash_murmur3_one_real(p_a.transform[0].x, hash);589hash = hash_murmur3_one_real(p_a.transform[0].y, hash);590hash = hash_murmur3_one_real(p_a.transform[1].x, hash);591hash = hash_murmur3_one_real(p_a.transform[1].y, hash);592hash = hash_murmur3_one_32(p_a.extra_spacing[SPACING_TOP], hash);593hash = hash_murmur3_one_32(p_a.extra_spacing[SPACING_BOTTOM], hash);594hash = hash_murmur3_one_32(p_a.extra_spacing[SPACING_SPACE], hash);595hash = hash_murmur3_one_32(p_a.extra_spacing[SPACING_GLYPH], hash);596hash = hash_murmur3_one_double(p_a.baseline_offset, hash);597return hash_fmix32(hash_murmur3_one_32(((int)p_a.mipmaps) | ((int)p_a.msdf << 1) | ((int)p_a.italic << 2) | ((int)p_a.force_autohinter << 3) | ((int)p_a.hinting << 4) | ((int)p_a.subpixel_positioning << 8) | ((int)p_a.antialiasing << 12) | ((int)p_a.disable_embedded_bitmaps << 14) | ((int)p_a.keep_rounding_remainders << 15), hash));598}599};600mutable HashMap<SystemFontKey, SystemFontCache, SystemFontKeyHasher> system_fonts;601mutable HashMap<String, PackedByteArray> system_font_data;602603void _generate_runs(ShapedTextDataFallback *p_sd) const;604void _realign(ShapedTextDataFallback *p_sd) const;605_FORCE_INLINE_ RID _find_sys_font_for_text(const RID &p_fdef, const String &p_script_code, const String &p_language, const String &p_text);606607Mutex ft_mutex;608609protected:610static void _bind_methods() {}611612void full_copy(ShapedTextDataFallback *p_shaped);613void invalidate(ShapedTextDataFallback *p_shaped);614615public:616MODBIND1RC(bool, has_feature, Feature);617MODBIND0RC(String, get_name);618MODBIND0RC(int64_t, get_features);619620MODBIND1(free_rid, const RID &);621MODBIND1R(bool, has, const RID &);622MODBIND1R(bool, load_support_data, const String &);623624MODBIND0RC(String, get_support_data_filename);625MODBIND0RC(String, get_support_data_info);626MODBIND1RC(bool, save_support_data, const String &);627MODBIND0RC(PackedByteArray, get_support_data);628MODBIND1RC(bool, is_locale_using_support_data, const String &);629630MODBIND1RC(bool, is_locale_right_to_left, const String &);631632MODBIND1RC(int64_t, name_to_tag, const String &);633MODBIND1RC(String, tag_to_name, int64_t);634635/* Font interface */636637MODBIND0R(RID, create_font);638MODBIND1R(RID, create_font_linked_variation, const RID &);639640MODBIND2(font_set_data, const RID &, const PackedByteArray &);641MODBIND3(font_set_data_ptr, const RID &, const uint8_t *, int64_t);642643MODBIND2(font_set_face_index, const RID &, int64_t);644MODBIND1RC(int64_t, font_get_face_index, const RID &);645646MODBIND1RC(int64_t, font_get_face_count, const RID &);647648MODBIND2(font_set_style, const RID &, BitField<FontStyle>);649MODBIND1RC(BitField<FontStyle>, font_get_style, const RID &);650651MODBIND2(font_set_style_name, const RID &, const String &);652MODBIND1RC(String, font_get_style_name, const RID &);653654MODBIND2(font_set_weight, const RID &, int64_t);655MODBIND1RC(int64_t, font_get_weight, const RID &);656657MODBIND2(font_set_stretch, const RID &, int64_t);658MODBIND1RC(int64_t, font_get_stretch, const RID &);659660MODBIND2(font_set_name, const RID &, const String &);661MODBIND1RC(String, font_get_name, const RID &);662663MODBIND2(font_set_antialiasing, const RID &, TextServer::FontAntialiasing);664MODBIND1RC(TextServer::FontAntialiasing, font_get_antialiasing, const RID &);665666MODBIND2(font_set_disable_embedded_bitmaps, const RID &, bool);667MODBIND1RC(bool, font_get_disable_embedded_bitmaps, const RID &);668669MODBIND2(font_set_generate_mipmaps, const RID &, bool);670MODBIND1RC(bool, font_get_generate_mipmaps, const RID &);671672MODBIND2(font_set_multichannel_signed_distance_field, const RID &, bool);673MODBIND1RC(bool, font_is_multichannel_signed_distance_field, const RID &);674675MODBIND2(font_set_msdf_pixel_range, const RID &, int64_t);676MODBIND1RC(int64_t, font_get_msdf_pixel_range, const RID &);677678MODBIND2(font_set_msdf_size, const RID &, int64_t);679MODBIND1RC(int64_t, font_get_msdf_size, const RID &);680681MODBIND2(font_set_fixed_size, const RID &, int64_t);682MODBIND1RC(int64_t, font_get_fixed_size, const RID &);683684MODBIND2(font_set_fixed_size_scale_mode, const RID &, FixedSizeScaleMode);685MODBIND1RC(FixedSizeScaleMode, font_get_fixed_size_scale_mode, const RID &);686687MODBIND2(font_set_allow_system_fallback, const RID &, bool);688MODBIND1RC(bool, font_is_allow_system_fallback, const RID &);689MODBIND0(font_clear_system_fallback_cache);690691MODBIND2(font_set_force_autohinter, const RID &, bool);692MODBIND1RC(bool, font_is_force_autohinter, const RID &);693694MODBIND2(font_set_modulate_color_glyphs, const RID &, bool);695MODBIND1RC(bool, font_is_modulate_color_glyphs, const RID &);696697MODBIND2(font_set_subpixel_positioning, const RID &, SubpixelPositioning);698MODBIND1RC(SubpixelPositioning, font_get_subpixel_positioning, const RID &);699700MODBIND2(font_set_keep_rounding_remainders, const RID &, bool);701MODBIND1RC(bool, font_get_keep_rounding_remainders, const RID &);702703MODBIND2(font_set_embolden, const RID &, double);704MODBIND1RC(double, font_get_embolden, const RID &);705706MODBIND3(font_set_spacing, const RID &, SpacingType, int64_t);707MODBIND2RC(int64_t, font_get_spacing, const RID &, SpacingType);708709MODBIND2(font_set_baseline_offset, const RID &, double);710MODBIND1RC(double, font_get_baseline_offset, const RID &);711712MODBIND2(font_set_transform, const RID &, const Transform2D &);713MODBIND1RC(Transform2D, font_get_transform, const RID &);714715MODBIND2(font_set_variation_coordinates, const RID &, const Dictionary &);716MODBIND1RC(Dictionary, font_get_variation_coordinates, const RID &);717718MODBIND2(font_set_oversampling, const RID &, double);719MODBIND1RC(double, font_get_oversampling, const RID &);720721MODBIND2(font_set_hinting, const RID &, TextServer::Hinting);722MODBIND1RC(TextServer::Hinting, font_get_hinting, const RID &);723724MODBIND1RC(TypedArray<Vector2i>, font_get_size_cache_list, const RID &);725MODBIND1(font_clear_size_cache, const RID &);726MODBIND2(font_remove_size_cache, const RID &, const Vector2i &);727MODBIND1RC(TypedArray<Dictionary>, font_get_size_cache_info, const RID &);728729MODBIND3(font_set_ascent, const RID &, int64_t, double);730MODBIND2RC(double, font_get_ascent, const RID &, int64_t);731732MODBIND3(font_set_descent, const RID &, int64_t, double);733MODBIND2RC(double, font_get_descent, const RID &, int64_t);734735MODBIND3(font_set_underline_position, const RID &, int64_t, double);736MODBIND2RC(double, font_get_underline_position, const RID &, int64_t);737738MODBIND3(font_set_underline_thickness, const RID &, int64_t, double);739MODBIND2RC(double, font_get_underline_thickness, const RID &, int64_t);740741MODBIND3(font_set_scale, const RID &, int64_t, double);742MODBIND2RC(double, font_get_scale, const RID &, int64_t);743744MODBIND2RC(int64_t, font_get_texture_count, const RID &, const Vector2i &);745MODBIND2(font_clear_textures, const RID &, const Vector2i &);746MODBIND3(font_remove_texture, const RID &, const Vector2i &, int64_t);747748MODBIND4(font_set_texture_image, const RID &, const Vector2i &, int64_t, const Ref<Image> &);749MODBIND3RC(Ref<Image>, font_get_texture_image, const RID &, const Vector2i &, int64_t);750751MODBIND4(font_set_texture_offsets, const RID &, const Vector2i &, int64_t, const PackedInt32Array &);752MODBIND3RC(PackedInt32Array, font_get_texture_offsets, const RID &, const Vector2i &, int64_t);753754MODBIND2RC(PackedInt32Array, font_get_glyph_list, const RID &, const Vector2i &);755MODBIND2(font_clear_glyphs, const RID &, const Vector2i &);756MODBIND3(font_remove_glyph, const RID &, const Vector2i &, int64_t);757758MODBIND3RC(Vector2, font_get_glyph_advance, const RID &, int64_t, int64_t);759MODBIND4(font_set_glyph_advance, const RID &, int64_t, int64_t, const Vector2 &);760761MODBIND3RC(Vector2, font_get_glyph_offset, const RID &, const Vector2i &, int64_t);762MODBIND4(font_set_glyph_offset, const RID &, const Vector2i &, int64_t, const Vector2 &);763764MODBIND3RC(Vector2, font_get_glyph_size, const RID &, const Vector2i &, int64_t);765MODBIND4(font_set_glyph_size, const RID &, const Vector2i &, int64_t, const Vector2 &);766767MODBIND3RC(Rect2, font_get_glyph_uv_rect, const RID &, const Vector2i &, int64_t);768MODBIND4(font_set_glyph_uv_rect, const RID &, const Vector2i &, int64_t, const Rect2 &);769770MODBIND3RC(int64_t, font_get_glyph_texture_idx, const RID &, const Vector2i &, int64_t);771MODBIND4(font_set_glyph_texture_idx, const RID &, const Vector2i &, int64_t, int64_t);772773MODBIND3RC(RID, font_get_glyph_texture_rid, const RID &, const Vector2i &, int64_t);774MODBIND3RC(Size2, font_get_glyph_texture_size, const RID &, const Vector2i &, int64_t);775776MODBIND3RC(Dictionary, font_get_glyph_contours, const RID &, int64_t, int64_t);777778MODBIND2RC(TypedArray<Vector2i>, font_get_kerning_list, const RID &, int64_t);779MODBIND2(font_clear_kerning_map, const RID &, int64_t);780MODBIND3(font_remove_kerning, const RID &, int64_t, const Vector2i &);781782MODBIND4(font_set_kerning, const RID &, int64_t, const Vector2i &, const Vector2 &);783MODBIND3RC(Vector2, font_get_kerning, const RID &, int64_t, const Vector2i &);784785MODBIND4RC(int64_t, font_get_glyph_index, const RID &, int64_t, int64_t, int64_t);786MODBIND3RC(int64_t, font_get_char_from_glyph_index, const RID &, int64_t, int64_t);787788MODBIND2RC(bool, font_has_char, const RID &, int64_t);789MODBIND1RC(String, font_get_supported_chars, const RID &);790MODBIND1RC(PackedInt32Array, font_get_supported_glyphs, const RID &);791792MODBIND4(font_render_range, const RID &, const Vector2i &, int64_t, int64_t);793MODBIND3(font_render_glyph, const RID &, const Vector2i &, int64_t);794795MODBIND7C(font_draw_glyph, const RID &, const RID &, int64_t, const Vector2 &, int64_t, const Color &, float);796MODBIND8C(font_draw_glyph_outline, const RID &, const RID &, int64_t, int64_t, const Vector2 &, int64_t, const Color &, float);797798MODBIND2RC(bool, font_is_language_supported, const RID &, const String &);799MODBIND3(font_set_language_support_override, const RID &, const String &, bool);800MODBIND2R(bool, font_get_language_support_override, const RID &, const String &);801MODBIND2(font_remove_language_support_override, const RID &, const String &);802MODBIND1R(PackedStringArray, font_get_language_support_overrides, const RID &);803804MODBIND2RC(bool, font_is_script_supported, const RID &, const String &);805MODBIND3(font_set_script_support_override, const RID &, const String &, bool);806MODBIND2R(bool, font_get_script_support_override, const RID &, const String &);807MODBIND2(font_remove_script_support_override, const RID &, const String &);808MODBIND1R(PackedStringArray, font_get_script_support_overrides, const RID &);809810MODBIND2(font_set_opentype_feature_overrides, const RID &, const Dictionary &);811MODBIND1RC(Dictionary, font_get_opentype_feature_overrides, const RID &);812813MODBIND1RC(Dictionary, font_supported_feature_list, const RID &);814MODBIND1RC(Dictionary, font_supported_variation_list, const RID &);815816MODBIND1(reference_oversampling_level, double);817MODBIND1(unreference_oversampling_level, double);818819/* Shaped text buffer interface */820821MODBIND2R(RID, create_shaped_text, Direction, Orientation);822823MODBIND1(shaped_text_clear, const RID &);824MODBIND1R(RID, shaped_text_duplicate, const RID &);825826MODBIND2(shaped_text_set_direction, const RID &, Direction);827MODBIND1RC(Direction, shaped_text_get_direction, const RID &);828MODBIND1RC(Direction, shaped_text_get_inferred_direction, const RID &);829830MODBIND2(shaped_text_set_bidi_override, const RID &, const Array &);831832MODBIND2(shaped_text_set_custom_punctuation, const RID &, const String &);833MODBIND1RC(String, shaped_text_get_custom_punctuation, const RID &);834835MODBIND2(shaped_text_set_custom_ellipsis, const RID &, int64_t);836MODBIND1RC(int64_t, shaped_text_get_custom_ellipsis, const RID &);837838MODBIND2(shaped_text_set_orientation, const RID &, Orientation);839MODBIND1RC(Orientation, shaped_text_get_orientation, const RID &);840841MODBIND2(shaped_text_set_preserve_invalid, const RID &, bool);842MODBIND1RC(bool, shaped_text_get_preserve_invalid, const RID &);843844MODBIND2(shaped_text_set_preserve_control, const RID &, bool);845MODBIND1RC(bool, shaped_text_get_preserve_control, const RID &);846847MODBIND3(shaped_text_set_spacing, const RID &, SpacingType, int64_t);848MODBIND2RC(int64_t, shaped_text_get_spacing, const RID &, SpacingType);849850MODBIND7R(bool, shaped_text_add_string, const RID &, const String &, const TypedArray<RID> &, int64_t, const Dictionary &, const String &, const Variant &);851MODBIND6R(bool, shaped_text_add_object, const RID &, const Variant &, const Size2 &, InlineAlignment, int64_t, double);852MODBIND5R(bool, shaped_text_resize_object, const RID &, const Variant &, const Size2 &, InlineAlignment, double);853MODBIND2RC(bool, shaped_text_has_object, const RID &, const Variant &);854MODBIND1RC(String, shaped_get_text, const RID &);855856MODBIND1RC(int64_t, shaped_get_span_count, const RID &);857MODBIND2RC(Variant, shaped_get_span_meta, const RID &, int64_t);858MODBIND2RC(Variant, shaped_get_span_embedded_object, const RID &, int64_t);859MODBIND2RC(String, shaped_get_span_text, const RID &, int64_t);860MODBIND2RC(Variant, shaped_get_span_object, const RID &, int64_t);861MODBIND5(shaped_set_span_update_font, const RID &, int64_t, const TypedArray<RID> &, int64_t, const Dictionary &);862863MODBIND1RC(int64_t, shaped_get_run_count, const RID &);864MODBIND2RC(String, shaped_get_run_text, const RID &, int64_t);865MODBIND2RC(Vector2i, shaped_get_run_range, const RID &, int64_t);866MODBIND2RC(RID, shaped_get_run_font_rid, const RID &, int64_t);867MODBIND2RC(int, shaped_get_run_font_size, const RID &, int64_t);868MODBIND2RC(String, shaped_get_run_language, const RID &, int64_t);869MODBIND2RC(Direction, shaped_get_run_direction, const RID &, int64_t);870MODBIND2RC(Variant, shaped_get_run_object, const RID &, int64_t);871872MODBIND3RC(RID, shaped_text_substr, const RID &, int64_t, int64_t);873MODBIND1RC(RID, shaped_text_get_parent, const RID &);874875MODBIND3R(double, shaped_text_fit_to_width, const RID &, double, BitField<TextServer::JustificationFlag>);876MODBIND2R(double, shaped_text_tab_align, const RID &, const PackedFloat32Array &);877878MODBIND1R(bool, shaped_text_shape, const RID &);879MODBIND1R(bool, shaped_text_update_breaks, const RID &);880MODBIND1R(bool, shaped_text_update_justification_ops, const RID &);881882MODBIND1RC(int64_t, shaped_text_get_trim_pos, const RID &);883MODBIND1RC(int64_t, shaped_text_get_ellipsis_pos, const RID &);884MODBIND1RC(const Glyph *, shaped_text_get_ellipsis_glyphs, const RID &);885MODBIND1RC(int64_t, shaped_text_get_ellipsis_glyph_count, const RID &);886887MODBIND3(shaped_text_overrun_trim_to_width, const RID &, double, BitField<TextServer::TextOverrunFlag>);888889MODBIND1RC(bool, shaped_text_is_ready, const RID &);890891MODBIND1RC(const Glyph *, shaped_text_get_glyphs, const RID &);892MODBIND1R(const Glyph *, shaped_text_sort_logical, const RID &);893MODBIND1RC(int64_t, shaped_text_get_glyph_count, const RID &);894895MODBIND1RC(Vector2i, shaped_text_get_range, const RID &);896897MODBIND1RC(Array, shaped_text_get_objects, const RID &);898MODBIND2RC(Rect2, shaped_text_get_object_rect, const RID &, const Variant &);899MODBIND2RC(Vector2i, shaped_text_get_object_range, const RID &, const Variant &);900MODBIND2RC(int64_t, shaped_text_get_object_glyph, const RID &, const Variant &);901902MODBIND1RC(Size2, shaped_text_get_size, const RID &);903MODBIND1RC(double, shaped_text_get_ascent, const RID &);904MODBIND1RC(double, shaped_text_get_descent, const RID &);905MODBIND1RC(double, shaped_text_get_width, const RID &);906MODBIND1RC(double, shaped_text_get_underline_position, const RID &);907MODBIND1RC(double, shaped_text_get_underline_thickness, const RID &);908909MODBIND1RC(PackedInt32Array, shaped_text_get_character_breaks, const RID &);910911MODBIND3RC(PackedInt32Array, string_get_word_breaks, const String &, const String &, int64_t);912913MODBIND2RC(String, string_to_upper, const String &, const String &);914MODBIND2RC(String, string_to_lower, const String &, const String &);915MODBIND2RC(String, string_to_title, const String &, const String &);916917MODBIND0(cleanup);918919TextServerFallback();920~TextServerFallback();921};922923924