Path: blob/master/modules/text_server_fb/text_server_fb.h
10277 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.inc"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_MODULE_H104#include FT_CONFIG_OPTIONS_H105#if !defined(FT_CONFIG_OPTION_USE_BROTLI) && !defined(_MSC_VER)106#warning FreeType is configured without Brotli support, built-in fonts will not be available.107#endif108#endif109110/*************************************************************************/111112class TextServerFallback : public TextServerExtension {113GDCLASS(TextServerFallback, TextServerExtension);114_THREAD_SAFE_CLASS_115116HashMap<StringName, int32_t> feature_sets;117HashMap<int32_t, StringName> feature_sets_inv;118119SafeNumeric<TextServer::FontLCDSubpixelLayout> lcd_subpixel_layout{ TextServer::FontLCDSubpixelLayout::FONT_LCD_SUBPIXEL_LAYOUT_NONE };120void _update_settings();121122void _insert_feature_sets();123_FORCE_INLINE_ void _insert_feature(const StringName &p_name, int32_t p_tag);124125// Font cache data.126127#ifdef MODULE_FREETYPE_ENABLED128mutable FT_Library ft_library = nullptr;129#endif130131const int rect_range = 1;132133struct FontTexturePosition {134int32_t index = -1;135int32_t x = 0;136int32_t y = 0;137138FontTexturePosition() {}139FontTexturePosition(int32_t p_id, int32_t p_x, int32_t p_y) :140index(p_id), x(p_x), y(p_y) {}141};142143struct Shelf {144int32_t x = 0;145int32_t y = 0;146int32_t w = 0;147int32_t h = 0;148149FontTexturePosition alloc_shelf(int32_t p_id, int32_t p_w, int32_t p_h) {150if (p_w > w || p_h > h) {151return FontTexturePosition(-1, 0, 0);152}153int32_t xx = x;154x += p_w;155w -= p_w;156return FontTexturePosition(p_id, xx, y);157}158159Shelf() {}160Shelf(int32_t p_x, int32_t p_y, int32_t p_w, int32_t p_h) :161x(p_x), y(p_y), w(p_w), h(p_h) {}162};163164struct ShelfPackTexture {165int32_t texture_w = 1024;166int32_t texture_h = 1024;167168Ref<Image> image;169Ref<ImageTexture> texture;170bool dirty = true;171172List<Shelf> shelves;173174FontTexturePosition pack_rect(int32_t p_id, int32_t p_h, int32_t p_w) {175int32_t y = 0;176int32_t waste = 0;177Shelf *best_shelf = nullptr;178int32_t best_waste = std::numeric_limits<std::int32_t>::max();179180for (Shelf &E : shelves) {181y += E.h;182if (p_w > E.w) {183continue;184}185if (p_h == E.h) {186return E.alloc_shelf(p_id, p_w, p_h);187}188if (p_h > E.h) {189continue;190}191if (p_h < E.h) {192waste = (E.h - p_h) * p_w;193if (waste < best_waste) {194best_waste = waste;195best_shelf = &E;196}197}198}199if (best_shelf) {200return best_shelf->alloc_shelf(p_id, p_w, p_h);201}202if (p_h <= (texture_h - y) && p_w <= texture_w) {203List<Shelf>::Element *E = shelves.push_back(Shelf(0, y, texture_w, p_h));204return E->get().alloc_shelf(p_id, p_w, p_h);205}206return FontTexturePosition(-1, 0, 0);207}208209ShelfPackTexture() {}210ShelfPackTexture(int32_t p_w, int32_t p_h) :211texture_w(p_w), texture_h(p_h) {}212};213214struct FontGlyph {215bool found = false;216int texture_idx = -1;217Rect2 rect;218Rect2 uv_rect;219Vector2 advance;220bool from_svg = false;221};222223struct FontFallback;224struct FontForSizeFallback {225double ascent = 0.0;226double descent = 0.0;227double underline_position = 0.0;228double underline_thickness = 0.0;229double scale = 1.0;230231FontFallback *owner = nullptr;232uint32_t viewport_oversampling = 0;233234Vector2i size;235236Vector<ShelfPackTexture> textures;237HashMap<int32_t, FontGlyph> glyph_map;238HashMap<Vector2i, Vector2> kerning_map;239240#ifdef MODULE_FREETYPE_ENABLED241FT_Face face = nullptr;242FT_StreamRec stream;243#endif244245~FontForSizeFallback() {246#ifdef MODULE_FREETYPE_ENABLED247if (face != nullptr) {248FT_Done_Face(face);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;309size_t data_size;310int face_index = 0;311312~FontFallback() {313for (const KeyValue<Vector2i, FontForSizeFallback *> &E : cache) {314memdelete(E.value);315}316cache.clear();317}318};319320_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;321#ifdef MODULE_MSDFGEN_ENABLED322_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;323#endif324#ifdef MODULE_FREETYPE_ENABLED325_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;326#endif327bool _ensure_glyph(FontFallback *p_font_data, const Vector2i &p_size, int32_t p_glyph, FontGlyph &r_glyph, uint32_t p_oversampling = 0) const;328bool _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;329_FORCE_INLINE_ bool _font_validate(const RID &p_font_rid) const;330_FORCE_INLINE_ void _font_clear_cache(FontFallback *p_font_data);331static void _generateMTSDF_threaded(void *p_td, uint32_t p_y);332333_FORCE_INLINE_ Vector2i _get_size(const FontFallback *p_font_data, int p_size) const {334if (p_font_data->msdf) {335return Vector2i(p_font_data->msdf_source_size * 64, 0);336} else if (p_font_data->fixed_size > 0) {337return Vector2i(p_font_data->fixed_size * 64, 0);338} else {339return Vector2i(p_size * 64, 0);340}341}342343_FORCE_INLINE_ Vector2i _get_size_outline(const FontFallback *p_font_data, const Vector2i &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, MIN(p_size.y, 1));348} else {349return Vector2i(p_size.x * 64, p_size.y);350}351}352353_FORCE_INLINE_ int _font_get_weight_by_name(const String &p_sty_name) const {354String sty_name = p_sty_name.remove_chars(" -");355if (sty_name.contains("thin") || sty_name.contains("hairline")) {356return 100;357} else if (sty_name.contains("extralight") || sty_name.contains("ultralight")) {358return 200;359} else if (sty_name.contains("light")) {360return 300;361} else if (sty_name.contains("semilight")) {362return 350;363} else if (sty_name.contains("regular")) {364return 400;365} else if (sty_name.contains("medium")) {366return 500;367} else if (sty_name.contains("semibold") || sty_name.contains("demibold")) {368return 600;369} else if (sty_name.contains("bold")) {370return 700;371} else if (sty_name.contains("extrabold") || sty_name.contains("ultrabold")) {372return 800;373} else if (sty_name.contains("black") || sty_name.contains("heavy")) {374return 900;375} else if (sty_name.contains("extrablack") || sty_name.contains("ultrablack")) {376return 950;377}378return 400;379}380_FORCE_INLINE_ int _font_get_stretch_by_name(const String &p_sty_name) const {381String sty_name = p_sty_name.remove_chars(" -");382if (sty_name.contains("ultracondensed")) {383return 50;384} else if (sty_name.contains("extracondensed")) {385return 63;386} else if (sty_name.contains("condensed")) {387return 75;388} else if (sty_name.contains("semicondensed")) {389return 87;390} else if (sty_name.contains("semiexpanded")) {391return 113;392} else if (sty_name.contains("expanded")) {393return 125;394} else if (sty_name.contains("extraexpanded")) {395return 150;396} else if (sty_name.contains("ultraexpanded")) {397return 200;398}399return 100;400}401_FORCE_INLINE_ bool _is_ital_style(const String &p_sty_name) const {402return p_sty_name.contains("italic") || p_sty_name.contains("oblique");403}404405// Shaped text cache data.406struct TrimData {407int trim_pos = -1;408int ellipsis_pos = -1;409Vector<Glyph> ellipsis_glyph_buf;410};411412struct TextRun {413Vector2i range;414RID font_rid;415int font_size = 0;416int64_t span_index = -1;417};418419struct ShapedTextDataFallback {420Mutex mutex;421422/* Source data */423RID parent; // Substring parent ShapedTextData.424425int start = 0; // Substring start offset in the parent string.426int end = 0; // Substring end offset in the parent string.427428String text;429String custom_punct;430TextServer::Direction direction = DIRECTION_LTR; // Desired text direction.431TextServer::Orientation orientation = ORIENTATION_HORIZONTAL;432433struct Span {434int start = -1;435int end = -1;436437Array fonts;438int font_size = 0;439440Variant embedded_key;441442String language;443Dictionary features;444Variant meta;445};446Vector<Span> spans;447int first_span = 0; // First span in the parent ShapedTextData.448int last_span = 0;449450Vector<TextRun> runs;451bool runs_dirty = true;452453struct EmbeddedObject {454int start = -1;455int end = -1;456InlineAlignment inline_align = INLINE_ALIGNMENT_CENTER;457Rect2 rect;458double baseline = 0;459};460HashMap<Variant, EmbeddedObject, VariantHasher, VariantComparator> objects;461462/* Shaped data */463TextServer::Direction para_direction = DIRECTION_LTR; // Detected text direction.464SafeFlag valid{ false }; // String is shaped.465bool line_breaks_valid = false; // Line and word break flags are populated (and virtual zero width spaces inserted).466bool justification_ops_valid = false; // Virtual elongation glyphs are added to the string.467bool sort_valid = false;468bool text_trimmed = false;469470bool preserve_invalid = true; // Draw hex code box instead of missing characters.471bool preserve_control = false; // Draw control characters.472473double ascent = 0.0; // Ascent for horizontal layout, 1/2 of width for vertical.474double descent = 0.0; // Descent for horizontal layout, 1/2 of width for vertical.475double width = 0.0; // Width for horizontal layout, height for vertical.476double width_trimmed = 0.0;477int extra_spacing[4] = { 0, 0, 0, 0 };478479double upos = 0.0;480double uthk = 0.0;481482char32_t el_char = 0x2026;483TrimData overrun_trim_data;484bool fit_width_minimum_reached = false;485486Vector<Glyph> glyphs;487Vector<Glyph> glyphs_logical;488};489490// Common data.491492mutable RID_PtrOwner<FontFallbackLinkedVariation> font_var_owner;493mutable RID_PtrOwner<FontFallback> font_owner;494mutable RID_PtrOwner<ShapedTextDataFallback> shaped_owner;495496_FORCE_INLINE_ FontFallback *_get_font_data(const RID &p_font_rid) const {497RID rid = p_font_rid;498FontFallbackLinkedVariation *fdv = font_var_owner.get_or_null(rid);499if (unlikely(fdv)) {500rid = fdv->base_font;501}502return font_owner.get_or_null(rid);503}504505struct SystemFontKey {506String font_name;507TextServer::FontAntialiasing antialiasing = TextServer::FONT_ANTIALIASING_GRAY;508bool disable_embedded_bitmaps = true;509bool italic = false;510bool mipmaps = false;511bool msdf = false;512bool force_autohinter = false;513int weight = 400;514int stretch = 100;515int msdf_range = 14;516int msdf_source_size = 48;517int fixed_size = 0;518TextServer::Hinting hinting = TextServer::HINTING_LIGHT;519TextServer::SubpixelPositioning subpixel_positioning = TextServer::SUBPIXEL_POSITIONING_AUTO;520bool keep_rounding_remainders = true;521Dictionary variation_coordinates;522double embolden = 0.0;523Transform2D transform;524int extra_spacing[4] = { 0, 0, 0, 0 };525double baseline_offset = 0.0;526527bool operator==(const SystemFontKey &p_b) const {528return (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);529}530531SystemFontKey(const String &p_font_name, bool p_italic, int p_weight, int p_stretch, RID p_font, const TextServerFallback *p_fb) {532font_name = p_font_name;533italic = p_italic;534weight = p_weight;535stretch = p_stretch;536antialiasing = p_fb->_font_get_antialiasing(p_font);537disable_embedded_bitmaps = p_fb->_font_get_disable_embedded_bitmaps(p_font);538mipmaps = p_fb->_font_get_generate_mipmaps(p_font);539msdf = p_fb->_font_is_multichannel_signed_distance_field(p_font);540msdf_range = p_fb->_font_get_msdf_pixel_range(p_font);541msdf_source_size = p_fb->_font_get_msdf_size(p_font);542fixed_size = p_fb->_font_get_fixed_size(p_font);543force_autohinter = p_fb->_font_is_force_autohinter(p_font);544hinting = p_fb->_font_get_hinting(p_font);545subpixel_positioning = p_fb->_font_get_subpixel_positioning(p_font);546keep_rounding_remainders = p_fb->_font_get_keep_rounding_remainders(p_font);547variation_coordinates = p_fb->_font_get_variation_coordinates(p_font);548embolden = p_fb->_font_get_embolden(p_font);549transform = p_fb->_font_get_transform(p_font);550extra_spacing[SPACING_TOP] = p_fb->_font_get_spacing(p_font, SPACING_TOP);551extra_spacing[SPACING_BOTTOM] = p_fb->_font_get_spacing(p_font, SPACING_BOTTOM);552extra_spacing[SPACING_SPACE] = p_fb->_font_get_spacing(p_font, SPACING_SPACE);553extra_spacing[SPACING_GLYPH] = p_fb->_font_get_spacing(p_font, SPACING_GLYPH);554baseline_offset = p_fb->_font_get_baseline_offset(p_font);555}556};557558struct SystemFontCacheRec {559RID rid;560int index = 0;561};562563struct SystemFontCache {564Vector<SystemFontCacheRec> var;565int max_var = 0;566};567568struct SystemFontKeyHasher {569_FORCE_INLINE_ static uint32_t hash(const SystemFontKey &p_a) {570uint32_t hash = p_a.font_name.hash();571hash = hash_murmur3_one_32(p_a.variation_coordinates.hash(), hash);572hash = hash_murmur3_one_32(p_a.weight, hash);573hash = hash_murmur3_one_32(p_a.stretch, hash);574hash = hash_murmur3_one_32(p_a.msdf_range, hash);575hash = hash_murmur3_one_32(p_a.msdf_source_size, hash);576hash = hash_murmur3_one_32(p_a.fixed_size, hash);577hash = hash_murmur3_one_double(p_a.embolden, hash);578hash = hash_murmur3_one_real(p_a.transform[0].x, hash);579hash = hash_murmur3_one_real(p_a.transform[0].y, hash);580hash = hash_murmur3_one_real(p_a.transform[1].x, hash);581hash = hash_murmur3_one_real(p_a.transform[1].y, hash);582hash = hash_murmur3_one_32(p_a.extra_spacing[SPACING_TOP], hash);583hash = hash_murmur3_one_32(p_a.extra_spacing[SPACING_BOTTOM], hash);584hash = hash_murmur3_one_32(p_a.extra_spacing[SPACING_SPACE], hash);585hash = hash_murmur3_one_32(p_a.extra_spacing[SPACING_GLYPH], hash);586hash = hash_murmur3_one_double(p_a.baseline_offset, hash);587return 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));588}589};590mutable HashMap<SystemFontKey, SystemFontCache, SystemFontKeyHasher> system_fonts;591mutable HashMap<String, PackedByteArray> system_font_data;592593void _generate_runs(ShapedTextDataFallback *p_sd) const;594void _realign(ShapedTextDataFallback *p_sd) const;595_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);596597Mutex ft_mutex;598599protected:600static void _bind_methods() {}601602void full_copy(ShapedTextDataFallback *p_shaped);603void invalidate(ShapedTextDataFallback *p_shaped);604605public:606MODBIND1RC(bool, has_feature, Feature);607MODBIND0RC(String, get_name);608MODBIND0RC(int64_t, get_features);609610MODBIND1(free_rid, const RID &);611MODBIND1R(bool, has, const RID &);612MODBIND1R(bool, load_support_data, const String &);613614MODBIND0RC(String, get_support_data_filename);615MODBIND0RC(String, get_support_data_info);616MODBIND1RC(bool, save_support_data, const String &);617MODBIND0RC(PackedByteArray, get_support_data);618619MODBIND1RC(bool, is_locale_right_to_left, const String &);620621MODBIND1RC(int64_t, name_to_tag, const String &);622MODBIND1RC(String, tag_to_name, int64_t);623624/* Font interface */625626MODBIND0R(RID, create_font);627MODBIND1R(RID, create_font_linked_variation, const RID &);628629MODBIND2(font_set_data, const RID &, const PackedByteArray &);630MODBIND3(font_set_data_ptr, const RID &, const uint8_t *, int64_t);631632MODBIND2(font_set_face_index, const RID &, int64_t);633MODBIND1RC(int64_t, font_get_face_index, const RID &);634635MODBIND1RC(int64_t, font_get_face_count, const RID &);636637MODBIND2(font_set_style, const RID &, BitField<FontStyle>);638MODBIND1RC(BitField<FontStyle>, font_get_style, const RID &);639640MODBIND2(font_set_style_name, const RID &, const String &);641MODBIND1RC(String, font_get_style_name, const RID &);642643MODBIND2(font_set_weight, const RID &, int64_t);644MODBIND1RC(int64_t, font_get_weight, const RID &);645646MODBIND2(font_set_stretch, const RID &, int64_t);647MODBIND1RC(int64_t, font_get_stretch, const RID &);648649MODBIND2(font_set_name, const RID &, const String &);650MODBIND1RC(String, font_get_name, const RID &);651652MODBIND2(font_set_antialiasing, const RID &, TextServer::FontAntialiasing);653MODBIND1RC(TextServer::FontAntialiasing, font_get_antialiasing, const RID &);654655MODBIND2(font_set_disable_embedded_bitmaps, const RID &, bool);656MODBIND1RC(bool, font_get_disable_embedded_bitmaps, const RID &);657658MODBIND2(font_set_generate_mipmaps, const RID &, bool);659MODBIND1RC(bool, font_get_generate_mipmaps, const RID &);660661MODBIND2(font_set_multichannel_signed_distance_field, const RID &, bool);662MODBIND1RC(bool, font_is_multichannel_signed_distance_field, const RID &);663664MODBIND2(font_set_msdf_pixel_range, const RID &, int64_t);665MODBIND1RC(int64_t, font_get_msdf_pixel_range, const RID &);666667MODBIND2(font_set_msdf_size, const RID &, int64_t);668MODBIND1RC(int64_t, font_get_msdf_size, const RID &);669670MODBIND2(font_set_fixed_size, const RID &, int64_t);671MODBIND1RC(int64_t, font_get_fixed_size, const RID &);672673MODBIND2(font_set_fixed_size_scale_mode, const RID &, FixedSizeScaleMode);674MODBIND1RC(FixedSizeScaleMode, font_get_fixed_size_scale_mode, const RID &);675676MODBIND2(font_set_allow_system_fallback, const RID &, bool);677MODBIND1RC(bool, font_is_allow_system_fallback, const RID &);678MODBIND0(font_clear_system_fallback_cache);679680MODBIND2(font_set_force_autohinter, const RID &, bool);681MODBIND1RC(bool, font_is_force_autohinter, const RID &);682683MODBIND2(font_set_modulate_color_glyphs, const RID &, bool);684MODBIND1RC(bool, font_is_modulate_color_glyphs, const RID &);685686MODBIND2(font_set_subpixel_positioning, const RID &, SubpixelPositioning);687MODBIND1RC(SubpixelPositioning, font_get_subpixel_positioning, const RID &);688689MODBIND2(font_set_keep_rounding_remainders, const RID &, bool);690MODBIND1RC(bool, font_get_keep_rounding_remainders, const RID &);691692MODBIND2(font_set_embolden, const RID &, double);693MODBIND1RC(double, font_get_embolden, const RID &);694695MODBIND3(font_set_spacing, const RID &, SpacingType, int64_t);696MODBIND2RC(int64_t, font_get_spacing, const RID &, SpacingType);697698MODBIND2(font_set_baseline_offset, const RID &, double);699MODBIND1RC(double, font_get_baseline_offset, const RID &);700701MODBIND2(font_set_transform, const RID &, const Transform2D &);702MODBIND1RC(Transform2D, font_get_transform, const RID &);703704MODBIND2(font_set_variation_coordinates, const RID &, const Dictionary &);705MODBIND1RC(Dictionary, font_get_variation_coordinates, const RID &);706707MODBIND2(font_set_oversampling, const RID &, double);708MODBIND1RC(double, font_get_oversampling, const RID &);709710MODBIND2(font_set_hinting, const RID &, TextServer::Hinting);711MODBIND1RC(TextServer::Hinting, font_get_hinting, const RID &);712713MODBIND1RC(TypedArray<Vector2i>, font_get_size_cache_list, const RID &);714MODBIND1(font_clear_size_cache, const RID &);715MODBIND2(font_remove_size_cache, const RID &, const Vector2i &);716MODBIND1RC(TypedArray<Dictionary>, font_get_size_cache_info, const RID &);717718MODBIND3(font_set_ascent, const RID &, int64_t, double);719MODBIND2RC(double, font_get_ascent, const RID &, int64_t);720721MODBIND3(font_set_descent, const RID &, int64_t, double);722MODBIND2RC(double, font_get_descent, const RID &, int64_t);723724MODBIND3(font_set_underline_position, const RID &, int64_t, double);725MODBIND2RC(double, font_get_underline_position, const RID &, int64_t);726727MODBIND3(font_set_underline_thickness, const RID &, int64_t, double);728MODBIND2RC(double, font_get_underline_thickness, const RID &, int64_t);729730MODBIND3(font_set_scale, const RID &, int64_t, double);731MODBIND2RC(double, font_get_scale, const RID &, int64_t);732733MODBIND2RC(int64_t, font_get_texture_count, const RID &, const Vector2i &);734MODBIND2(font_clear_textures, const RID &, const Vector2i &);735MODBIND3(font_remove_texture, const RID &, const Vector2i &, int64_t);736737MODBIND4(font_set_texture_image, const RID &, const Vector2i &, int64_t, const Ref<Image> &);738MODBIND3RC(Ref<Image>, font_get_texture_image, const RID &, const Vector2i &, int64_t);739740MODBIND4(font_set_texture_offsets, const RID &, const Vector2i &, int64_t, const PackedInt32Array &);741MODBIND3RC(PackedInt32Array, font_get_texture_offsets, const RID &, const Vector2i &, int64_t);742743MODBIND2RC(PackedInt32Array, font_get_glyph_list, const RID &, const Vector2i &);744MODBIND2(font_clear_glyphs, const RID &, const Vector2i &);745MODBIND3(font_remove_glyph, const RID &, const Vector2i &, int64_t);746747MODBIND3RC(Vector2, font_get_glyph_advance, const RID &, int64_t, int64_t);748MODBIND4(font_set_glyph_advance, const RID &, int64_t, int64_t, const Vector2 &);749750MODBIND3RC(Vector2, font_get_glyph_offset, const RID &, const Vector2i &, int64_t);751MODBIND4(font_set_glyph_offset, const RID &, const Vector2i &, int64_t, const Vector2 &);752753MODBIND3RC(Vector2, font_get_glyph_size, const RID &, const Vector2i &, int64_t);754MODBIND4(font_set_glyph_size, const RID &, const Vector2i &, int64_t, const Vector2 &);755756MODBIND3RC(Rect2, font_get_glyph_uv_rect, const RID &, const Vector2i &, int64_t);757MODBIND4(font_set_glyph_uv_rect, const RID &, const Vector2i &, int64_t, const Rect2 &);758759MODBIND3RC(int64_t, font_get_glyph_texture_idx, const RID &, const Vector2i &, int64_t);760MODBIND4(font_set_glyph_texture_idx, const RID &, const Vector2i &, int64_t, int64_t);761762MODBIND3RC(RID, font_get_glyph_texture_rid, const RID &, const Vector2i &, int64_t);763MODBIND3RC(Size2, font_get_glyph_texture_size, const RID &, const Vector2i &, int64_t);764765MODBIND3RC(Dictionary, font_get_glyph_contours, const RID &, int64_t, int64_t);766767MODBIND2RC(TypedArray<Vector2i>, font_get_kerning_list, const RID &, int64_t);768MODBIND2(font_clear_kerning_map, const RID &, int64_t);769MODBIND3(font_remove_kerning, const RID &, int64_t, const Vector2i &);770771MODBIND4(font_set_kerning, const RID &, int64_t, const Vector2i &, const Vector2 &);772MODBIND3RC(Vector2, font_get_kerning, const RID &, int64_t, const Vector2i &);773774MODBIND4RC(int64_t, font_get_glyph_index, const RID &, int64_t, int64_t, int64_t);775MODBIND3RC(int64_t, font_get_char_from_glyph_index, const RID &, int64_t, int64_t);776777MODBIND2RC(bool, font_has_char, const RID &, int64_t);778MODBIND1RC(String, font_get_supported_chars, const RID &);779MODBIND1RC(PackedInt32Array, font_get_supported_glyphs, const RID &);780781MODBIND4(font_render_range, const RID &, const Vector2i &, int64_t, int64_t);782MODBIND3(font_render_glyph, const RID &, const Vector2i &, int64_t);783784MODBIND7C(font_draw_glyph, const RID &, const RID &, int64_t, const Vector2 &, int64_t, const Color &, float);785MODBIND8C(font_draw_glyph_outline, const RID &, const RID &, int64_t, int64_t, const Vector2 &, int64_t, const Color &, float);786787MODBIND2RC(bool, font_is_language_supported, const RID &, const String &);788MODBIND3(font_set_language_support_override, const RID &, const String &, bool);789MODBIND2R(bool, font_get_language_support_override, const RID &, const String &);790MODBIND2(font_remove_language_support_override, const RID &, const String &);791MODBIND1R(PackedStringArray, font_get_language_support_overrides, const RID &);792793MODBIND2RC(bool, font_is_script_supported, const RID &, const String &);794MODBIND3(font_set_script_support_override, const RID &, const String &, bool);795MODBIND2R(bool, font_get_script_support_override, const RID &, const String &);796MODBIND2(font_remove_script_support_override, const RID &, const String &);797MODBIND1R(PackedStringArray, font_get_script_support_overrides, const RID &);798799MODBIND2(font_set_opentype_feature_overrides, const RID &, const Dictionary &);800MODBIND1RC(Dictionary, font_get_opentype_feature_overrides, const RID &);801802MODBIND1RC(Dictionary, font_supported_feature_list, const RID &);803MODBIND1RC(Dictionary, font_supported_variation_list, const RID &);804805MODBIND1(reference_oversampling_level, double);806MODBIND1(unreference_oversampling_level, double);807808/* Shaped text buffer interface */809810MODBIND2R(RID, create_shaped_text, Direction, Orientation);811812MODBIND1(shaped_text_clear, const RID &);813814MODBIND2(shaped_text_set_direction, const RID &, Direction);815MODBIND1RC(Direction, shaped_text_get_direction, const RID &);816MODBIND1RC(Direction, shaped_text_get_inferred_direction, const RID &);817818MODBIND2(shaped_text_set_bidi_override, const RID &, const Array &);819820MODBIND2(shaped_text_set_custom_punctuation, const RID &, const String &);821MODBIND1RC(String, shaped_text_get_custom_punctuation, const RID &);822823MODBIND2(shaped_text_set_custom_ellipsis, const RID &, int64_t);824MODBIND1RC(int64_t, shaped_text_get_custom_ellipsis, const RID &);825826MODBIND2(shaped_text_set_orientation, const RID &, Orientation);827MODBIND1RC(Orientation, shaped_text_get_orientation, const RID &);828829MODBIND2(shaped_text_set_preserve_invalid, const RID &, bool);830MODBIND1RC(bool, shaped_text_get_preserve_invalid, const RID &);831832MODBIND2(shaped_text_set_preserve_control, const RID &, bool);833MODBIND1RC(bool, shaped_text_get_preserve_control, const RID &);834835MODBIND3(shaped_text_set_spacing, const RID &, SpacingType, int64_t);836MODBIND2RC(int64_t, shaped_text_get_spacing, const RID &, SpacingType);837838MODBIND7R(bool, shaped_text_add_string, const RID &, const String &, const TypedArray<RID> &, int64_t, const Dictionary &, const String &, const Variant &);839MODBIND6R(bool, shaped_text_add_object, const RID &, const Variant &, const Size2 &, InlineAlignment, int64_t, double);840MODBIND5R(bool, shaped_text_resize_object, const RID &, const Variant &, const Size2 &, InlineAlignment, double);841MODBIND1RC(String, shaped_get_text, const RID &);842843MODBIND1RC(int64_t, shaped_get_span_count, const RID &);844MODBIND2RC(Variant, shaped_get_span_meta, const RID &, int64_t);845MODBIND2RC(Variant, shaped_get_span_embedded_object, const RID &, int64_t);846MODBIND2RC(String, shaped_get_span_text, const RID &, int64_t);847MODBIND2RC(Variant, shaped_get_span_object, const RID &, int64_t);848MODBIND5(shaped_set_span_update_font, const RID &, int64_t, const TypedArray<RID> &, int64_t, const Dictionary &);849850MODBIND1RC(int64_t, shaped_get_run_count, const RID &);851MODBIND2RC(String, shaped_get_run_text, const RID &, int64_t);852MODBIND2RC(Vector2i, shaped_get_run_range, const RID &, int64_t);853MODBIND2RC(RID, shaped_get_run_font_rid, const RID &, int64_t);854MODBIND2RC(int, shaped_get_run_font_size, const RID &, int64_t);855MODBIND2RC(String, shaped_get_run_language, const RID &, int64_t);856MODBIND2RC(Direction, shaped_get_run_direction, const RID &, int64_t);857MODBIND2RC(Variant, shaped_get_run_object, const RID &, int64_t);858859MODBIND3RC(RID, shaped_text_substr, const RID &, int64_t, int64_t);860MODBIND1RC(RID, shaped_text_get_parent, const RID &);861862MODBIND3R(double, shaped_text_fit_to_width, const RID &, double, BitField<TextServer::JustificationFlag>);863MODBIND2R(double, shaped_text_tab_align, const RID &, const PackedFloat32Array &);864865MODBIND1R(bool, shaped_text_shape, const RID &);866MODBIND1R(bool, shaped_text_update_breaks, const RID &);867MODBIND1R(bool, shaped_text_update_justification_ops, const RID &);868869MODBIND1RC(int64_t, shaped_text_get_trim_pos, const RID &);870MODBIND1RC(int64_t, shaped_text_get_ellipsis_pos, const RID &);871MODBIND1RC(const Glyph *, shaped_text_get_ellipsis_glyphs, const RID &);872MODBIND1RC(int64_t, shaped_text_get_ellipsis_glyph_count, const RID &);873874MODBIND3(shaped_text_overrun_trim_to_width, const RID &, double, BitField<TextServer::TextOverrunFlag>);875876MODBIND1RC(bool, shaped_text_is_ready, const RID &);877878MODBIND1RC(const Glyph *, shaped_text_get_glyphs, const RID &);879MODBIND1R(const Glyph *, shaped_text_sort_logical, const RID &);880MODBIND1RC(int64_t, shaped_text_get_glyph_count, const RID &);881882MODBIND1RC(Vector2i, shaped_text_get_range, const RID &);883884MODBIND1RC(Array, shaped_text_get_objects, const RID &);885MODBIND2RC(Rect2, shaped_text_get_object_rect, const RID &, const Variant &);886MODBIND2RC(Vector2i, shaped_text_get_object_range, const RID &, const Variant &);887MODBIND2RC(int64_t, shaped_text_get_object_glyph, const RID &, const Variant &);888889MODBIND1RC(Size2, shaped_text_get_size, const RID &);890MODBIND1RC(double, shaped_text_get_ascent, const RID &);891MODBIND1RC(double, shaped_text_get_descent, const RID &);892MODBIND1RC(double, shaped_text_get_width, const RID &);893MODBIND1RC(double, shaped_text_get_underline_position, const RID &);894MODBIND1RC(double, shaped_text_get_underline_thickness, const RID &);895896MODBIND1RC(PackedInt32Array, shaped_text_get_character_breaks, const RID &);897898MODBIND3RC(PackedInt32Array, string_get_word_breaks, const String &, const String &, int64_t);899900MODBIND2RC(String, string_to_upper, const String &, const String &);901MODBIND2RC(String, string_to_lower, const String &, const String &);902MODBIND2RC(String, string_to_title, const String &, const String &);903904MODBIND0(cleanup);905906TextServerFallback();907~TextServerFallback();908};909910911