[TextServer] Adds support for TrueType / OpenType collection files (*.TTC, *.OTC).

This commit is contained in:
bruvzg 2022-06-07 11:35:59 +03:00
parent 54d43efbd8
commit 6e4cdad3ac
No known key found for this signature in database
GPG key ID: 7960FCF39844EC38
15 changed files with 311 additions and 5 deletions

View file

@ -3,7 +3,7 @@
<brief_description> <brief_description>
Font source data and prerendered glyph cache, imported from dynamic or bitmap font. Font source data and prerendered glyph cache, imported from dynamic or bitmap font.
Supported font formats: Supported font formats:
- Dynamic font importer: TrueType (.ttf), OpenType (.otf), WOFF (.woff), WOFF2 (.woff2), Type 1 (.pfb, .pfm). - Dynamic font importer: TrueType (.ttf), TrueType collection (.ttc), OpenType (.otf), OpenType collection (.otc), WOFF (.woff), WOFF2 (.woff2), Type 1 (.pfb, .pfm).
- Bitmap font importer: AngelCode BMFont (.fnt, .font), text and binary (version 3) format variants. - Bitmap font importer: AngelCode BMFont (.fnt, .font), text and binary (version 3) format variants.
- Monospace image font importer: All supported image formats. - Monospace image font importer: All supported image formats.
</brief_description> </brief_description>
@ -87,6 +87,12 @@
Returns font descent (number of pixels below the baseline). Returns font descent (number of pixels below the baseline).
</description> </description>
</method> </method>
<method name="get_face_count" qualifiers="const">
<return type="int" />
<description>
Returns number of faces in the TrueType / OpenType collection.
</description>
</method>
<method name="get_glyph_advance" qualifiers="const"> <method name="get_glyph_advance" qualifiers="const">
<return type="Vector2" /> <return type="Vector2" />
<argument index="0" name="cache_index" type="int" /> <argument index="0" name="cache_index" type="int" />
@ -318,7 +324,8 @@
<return type="int" enum="Error" /> <return type="int" enum="Error" />
<argument index="0" name="path" type="String" /> <argument index="0" name="path" type="String" />
<description> <description>
Loads a TrueType (.ttf), OpenType (.otf), WOFF (.woff), WOFF2 (.woff2) or Type 1 (.pfb, .pfm) dynamic font from file [code]path[/code]. Loads a TrueType (.ttf), TrueType collection (.ttc), OpenType (.otf), OpenType collection (.otc), WOFF (.woff), WOFF2 (.woff2) or Type 1 (.pfb, .pfm) dynamic font from file [code]path[/code].
[b]Note:[/b] Use [member face_index] to select specific face from the collection file.
[b]Warning:[/b] This method should only be used in the editor or in cases when you need to load external fonts at run-time, such as fonts located at the [code]user://[/code] directory. [b]Warning:[/b] This method should only be used in the editor or in cases when you need to load external fonts at run-time, such as fonts located at the [code]user://[/code] directory.
</description> </description>
</method> </method>
@ -570,6 +577,9 @@
<member name="embolden" type="float" setter="set_embolden" getter="get_embolden" default="0.0"> <member name="embolden" type="float" setter="set_embolden" getter="get_embolden" default="0.0">
If is not equal to zero, emboldens the font outlines. Negative values reduce the outline thickness. If is not equal to zero, emboldens the font outlines. Negative values reduce the outline thickness.
</member> </member>
<member name="face_index" type="int" setter="set_face_index" getter="get_face_index" default="0">
Active face index in the TrueType / OpenType collection file.
</member>
<member name="fixed_size" type="int" setter="set_fixed_size" getter="get_fixed_size" default="0"> <member name="fixed_size" type="int" setter="set_fixed_size" getter="get_fixed_size" default="0">
Font size, used only for the bitmap fonts. Font size, used only for the bitmap fonts.
</member> </member>

View file

@ -121,6 +121,20 @@
Returns font embolden strength. Returns font embolden strength.
</description> </description>
</method> </method>
<method name="font_get_face_count" qualifiers="const">
<return type="int" />
<argument index="0" name="font_rid" type="RID" />
<description>
Returns number of faces in the TrueType / OpenType collection.
</description>
</method>
<method name="font_get_face_index" qualifiers="const">
<return type="int" />
<argument index="0" name="font_rid" type="RID" />
<description>
Recturns an active face index in the TrueType / OpenType collection.
</description>
</method>
<method name="font_get_fixed_size" qualifiers="const"> <method name="font_get_fixed_size" qualifiers="const">
<return type="int" /> <return type="int" />
<argument index="0" name="font_rid" type="RID" /> <argument index="0" name="font_rid" type="RID" />
@ -593,6 +607,14 @@
Sets font embolden strength. If [code]strength[/code] is not equal to zero, emboldens the font outlines. Negative values reduce the outline thickness. Sets font embolden strength. If [code]strength[/code] is not equal to zero, emboldens the font outlines. Negative values reduce the outline thickness.
</description> </description>
</method> </method>
<method name="font_set_face_index">
<return type="void" />
<argument index="0" name="font_rid" type="RID" />
<argument index="1" name="face_index" type="int" />
<description>
Sets an active face index in the TrueType / OpenType collection.
</description>
</method>
<method name="font_set_fixed_size"> <method name="font_set_fixed_size">
<return type="void" /> <return type="void" />
<argument index="0" name="font_rid" type="RID" /> <argument index="0" name="font_rid" type="RID" />

View file

@ -114,6 +114,20 @@
Returns font embolden strength. Returns font embolden strength.
</description> </description>
</method> </method>
<method name="font_get_face_count" qualifiers="virtual const">
<return type="int" />
<argument index="0" name="font_rid" type="RID" />
<description>
Returns number of faces in the TrueType / OpenType collection.
</description>
</method>
<method name="font_get_face_index" qualifiers="virtual const">
<return type="int" />
<argument index="0" name="font_rid" type="RID" />
<description>
Returns an active face index in the TrueType / OpenType collection.
</description>
</method>
<method name="font_get_fixed_size" qualifiers="virtual const"> <method name="font_get_fixed_size" qualifiers="virtual const">
<return type="int" /> <return type="int" />
<argument index="0" name="font_rid" type="RID" /> <argument index="0" name="font_rid" type="RID" />
@ -590,6 +604,14 @@
Sets font embolden strength. If [code]strength[/code] is not equal to zero, emboldens the font outlines. Negative values reduce the outline thickness. Sets font embolden strength. If [code]strength[/code] is not equal to zero, emboldens the font outlines. Negative values reduce the outline thickness.
</description> </description>
</method> </method>
<method name="font_set_face_index" qualifiers="virtual">
<return type="void" />
<argument index="0" name="font_rid" type="RID" />
<argument index="1" name="face_index" type="int" />
<description>
Sets an active face index in the TrueType / OpenType collection.
</description>
</method>
<method name="font_set_fixed_size" qualifiers="virtual"> <method name="font_set_fixed_size" qualifiers="virtual">
<return type="void" /> <return type="void" />
<argument index="0" name="font_rid" type="RID" /> <argument index="0" name="font_rid" type="RID" />

View file

@ -454,7 +454,11 @@ void DynamicFontImportSettings::_add_glyph_range_item(int32_t p_start, int32_t p
void DynamicFontImportSettings::_main_prop_changed(const String &p_edited_property) { void DynamicFontImportSettings::_main_prop_changed(const String &p_edited_property) {
// Update font preview. // Update font preview.
if (p_edited_property == "antialiased") { if (p_edited_property == "face_index") {
if (font_preview->get_data_count() > 0) {
font_preview->get_data(0)->set_face_index(import_settings_data->get("face_index"));
}
} else if (p_edited_property == "antialiased") {
if (font_preview->get_data_count() > 0) { if (font_preview->get_data_count() > 0) {
font_preview->get_data(0)->set_antialiased(import_settings_data->get("antialiased")); font_preview->get_data(0)->set_antialiased(import_settings_data->get("antialiased"));
} }
@ -945,6 +949,7 @@ void DynamicFontImportSettings::_notification(int p_what) {
void DynamicFontImportSettings::_re_import() { void DynamicFontImportSettings::_re_import() {
HashMap<StringName, Variant> main_settings; HashMap<StringName, Variant> main_settings;
main_settings["face_index"] = import_settings_data->get("face_index");
main_settings["antialiased"] = import_settings_data->get("antialiased"); main_settings["antialiased"] = import_settings_data->get("antialiased");
main_settings["generate_mipmaps"] = import_settings_data->get("generate_mipmaps"); main_settings["generate_mipmaps"] = import_settings_data->get("generate_mipmaps");
main_settings["multichannel_signed_distance_field"] = import_settings_data->get("multichannel_signed_distance_field"); main_settings["multichannel_signed_distance_field"] = import_settings_data->get("multichannel_signed_distance_field");
@ -1299,6 +1304,7 @@ void DynamicFontImportSettings::open_settings(const String &p_path) {
import_settings_data->notify_property_list_changed(); import_settings_data->notify_property_list_changed();
if (font_preview->get_data_count() > 0) { if (font_preview->get_data_count() > 0) {
font_preview->get_data(0)->set_face_index(import_settings_data->get("face_index"));
font_preview->get_data(0)->set_antialiased(import_settings_data->get("antialiased")); font_preview->get_data(0)->set_antialiased(import_settings_data->get("antialiased"));
font_preview->get_data(0)->set_multichannel_signed_distance_field(import_settings_data->get("multichannel_signed_distance_field")); font_preview->get_data(0)->set_multichannel_signed_distance_field(import_settings_data->get("multichannel_signed_distance_field"));
font_preview->get_data(0)->set_msdf_pixel_range(import_settings_data->get("msdf_pixel_range")); font_preview->get_data(0)->set_msdf_pixel_range(import_settings_data->get("msdf_pixel_range"));
@ -1360,6 +1366,7 @@ DynamicFontImportSettings *DynamicFontImportSettings::get_singleton() {
DynamicFontImportSettings::DynamicFontImportSettings() { DynamicFontImportSettings::DynamicFontImportSettings() {
singleton = this; singleton = this;
options_general.push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::INT, "face_index"), 0));
options_general.push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::BOOL, "antialiased"), true)); options_general.push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::BOOL, "antialiased"), true));
options_general.push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::BOOL, "generate_mipmaps"), false)); options_general.push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::BOOL, "generate_mipmaps"), false));
options_general.push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::BOOL, "multichannel_signed_distance_field", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), true)); options_general.push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::BOOL, "multichannel_signed_distance_field", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), true));

View file

@ -50,7 +50,9 @@ void ResourceImporterDynamicFont::get_recognized_extensions(List<String> *p_exte
if (p_extensions) { if (p_extensions) {
#ifdef MODULE_FREETYPE_ENABLED #ifdef MODULE_FREETYPE_ENABLED
p_extensions->push_back("ttf"); p_extensions->push_back("ttf");
p_extensions->push_back("ttc");
p_extensions->push_back("otf"); p_extensions->push_back("otf");
p_extensions->push_back("otc");
p_extensions->push_back("woff"); p_extensions->push_back("woff");
p_extensions->push_back("woff2"); p_extensions->push_back("woff2");
p_extensions->push_back("pfb"); p_extensions->push_back("pfb");
@ -101,6 +103,8 @@ String ResourceImporterDynamicFont::get_preset_name(int p_idx) const {
void ResourceImporterDynamicFont::get_import_options(const String &p_path, List<ImportOption> *r_options, int p_preset) const { void ResourceImporterDynamicFont::get_import_options(const String &p_path, List<ImportOption> *r_options, int p_preset) const {
bool msdf = p_preset == PRESET_MSDF; bool msdf = p_preset == PRESET_MSDF;
r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "face_index"), 0));
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "antialiased"), true)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "antialiased"), true));
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "generate_mipmaps"), false)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "generate_mipmaps"), false));
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "multichannel_signed_distance_field", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), (msdf) ? true : false)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "multichannel_signed_distance_field", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), (msdf) ? true : false));
@ -179,6 +183,8 @@ void ResourceImporterDynamicFont::show_advanced_options(const String &p_path) {
Error ResourceImporterDynamicFont::import(const String &p_source_file, const String &p_save_path, const HashMap<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata) { Error ResourceImporterDynamicFont::import(const String &p_source_file, const String &p_save_path, const HashMap<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata) {
print_verbose("Importing dynamic font from: " + p_source_file); print_verbose("Importing dynamic font from: " + p_source_file);
int face_index = p_options["face_index"];
bool antialiased = p_options["antialiased"]; bool antialiased = p_options["antialiased"];
bool generate_mipmaps = p_options["generate_mipmaps"]; bool generate_mipmaps = p_options["generate_mipmaps"];
bool msdf = p_options["multichannel_signed_distance_field"]; bool msdf = p_options["multichannel_signed_distance_field"];
@ -200,6 +206,7 @@ Error ResourceImporterDynamicFont::import(const String &p_source_file, const Str
Ref<FontData> font; Ref<FontData> font;
font.instantiate(); font.instantiate();
font->set_data(data); font->set_data(data);
font->set_face_index(face_index);
font->set_antialiased(antialiased); font->set_antialiased(antialiased);
font->set_generate_mipmaps(generate_mipmaps); font->set_generate_mipmaps(generate_mipmaps);
font->set_multichannel_signed_distance_field(msdf); font->set_multichannel_signed_distance_field(msdf);

View file

@ -1288,7 +1288,16 @@ _FORCE_INLINE_ bool TextServerAdvanced::_ensure_cache_for_size(FontDataAdvanced
fargs.memory_size = p_font_data->data_size; fargs.memory_size = p_font_data->data_size;
fargs.flags = FT_OPEN_MEMORY; fargs.flags = FT_OPEN_MEMORY;
fargs.stream = &fd->stream; fargs.stream = &fd->stream;
error = FT_Open_Face(ft_library, &fargs, 0, &fd->face);
int max_index = 0;
FT_Face tmp_face;
error = FT_Open_Face(ft_library, &fargs, -1, &tmp_face);
if (error == 0) {
max_index = tmp_face->num_faces - 1;
}
FT_Done_Face(tmp_face);
error = FT_Open_Face(ft_library, &fargs, CLAMP(p_font_data->face_index, 0, max_index), &fd->face);
if (error) { if (error) {
FT_Done_Face(fd->face); FT_Done_Face(fd->face);
fd->face = nullptr; fd->face = nullptr;
@ -1720,6 +1729,69 @@ void TextServerAdvanced::font_set_data_ptr(const RID &p_font_rid, const uint8_t
fd->data_size = p_data_size; fd->data_size = p_data_size;
} }
void TextServerAdvanced::font_set_face_index(const RID &p_font_rid, int64_t p_face_index) {
ERR_FAIL_COND(p_face_index < 0);
ERR_FAIL_COND(p_face_index >= 0x7FFF);
FontDataAdvanced *fd = font_owner.get_or_null(p_font_rid);
ERR_FAIL_COND(!fd);
MutexLock lock(fd->mutex);
if (fd->face_index != p_face_index) {
fd->face_index = p_face_index;
_font_clear_cache(fd);
}
}
int64_t TextServerAdvanced::font_get_face_index(const RID &p_font_rid) const {
FontDataAdvanced *fd = font_owner.get_or_null(p_font_rid);
ERR_FAIL_COND_V(!fd, 0);
MutexLock lock(fd->mutex);
return fd->face_index;
}
int64_t TextServerAdvanced::font_get_face_count(const RID &p_font_rid) const {
FontDataAdvanced *fd = font_owner.get_or_null(p_font_rid);
ERR_FAIL_COND_V(!fd, 0);
MutexLock lock(fd->mutex);
int face_count = 0;
if (fd->data_ptr && (fd->data_size > 0)) {
// Init dynamic font.
#ifdef MODULE_FREETYPE_ENABLED
int error = 0;
if (!ft_library) {
error = FT_Init_FreeType(&ft_library);
ERR_FAIL_COND_V_MSG(error != 0, false, "FreeType: Error initializing library: '" + String(FT_Error_String(error)) + "'.");
}
FT_StreamRec stream;
memset(&stream, 0, sizeof(FT_StreamRec));
stream.base = (unsigned char *)fd->data_ptr;
stream.size = fd->data_size;
stream.pos = 0;
FT_Open_Args fargs;
memset(&fargs, 0, sizeof(FT_Open_Args));
fargs.memory_base = (unsigned char *)fd->data_ptr;
fargs.memory_size = fd->data_size;
fargs.flags = FT_OPEN_MEMORY;
fargs.stream = &stream;
FT_Face tmp_face;
error = FT_Open_Face(ft_library, &fargs, -1, &tmp_face);
if (error == 0) {
face_count = tmp_face->num_faces;
}
FT_Done_Face(tmp_face);
#endif
}
return face_count;
}
void TextServerAdvanced::font_set_style(const RID &p_font_rid, int64_t /*FontStyle*/ p_style) { void TextServerAdvanced::font_set_style(const RID &p_font_rid, int64_t /*FontStyle*/ p_style) {
FontDataAdvanced *fd = font_owner.get_or_null(p_font_rid); FontDataAdvanced *fd = font_owner.get_or_null(p_font_rid);
ERR_FAIL_COND(!fd); ERR_FAIL_COND(!fd);

View file

@ -247,6 +247,7 @@ class TextServerAdvanced : public TextServerExtension {
PackedByteArray data; PackedByteArray data;
const uint8_t *data_ptr; const uint8_t *data_ptr;
size_t data_size; size_t data_size;
int face_index = 0;
mutable ThreadWorkPool work_pool; mutable ThreadWorkPool work_pool;
~FontDataAdvanced() { ~FontDataAdvanced() {
@ -473,6 +474,11 @@ public:
virtual void font_set_data(const RID &p_font_rid, const PackedByteArray &p_data) override; virtual void font_set_data(const RID &p_font_rid, const PackedByteArray &p_data) override;
virtual void font_set_data_ptr(const RID &p_font_rid, const uint8_t *p_data_ptr, int64_t p_data_size) override; virtual void font_set_data_ptr(const RID &p_font_rid, const uint8_t *p_data_ptr, int64_t p_data_size) override;
virtual void font_set_face_index(const RID &p_font_rid, int64_t p_index) override;
virtual int64_t font_get_face_index(const RID &p_font_rid) const override;
virtual int64_t font_get_face_count(const RID &p_font_rid) const override;
virtual void font_set_style(const RID &p_font_rid, int64_t /*FontStyle*/ p_style) override; virtual void font_set_style(const RID &p_font_rid, int64_t /*FontStyle*/ p_style) override;
virtual int64_t /*FontStyle*/ font_get_style(const RID &p_font_rid) const override; virtual int64_t /*FontStyle*/ font_get_style(const RID &p_font_rid) const override;

View file

@ -733,7 +733,16 @@ _FORCE_INLINE_ bool TextServerFallback::_ensure_cache_for_size(FontDataFallback
fargs.memory_size = p_font_data->data_size; fargs.memory_size = p_font_data->data_size;
fargs.flags = FT_OPEN_MEMORY; fargs.flags = FT_OPEN_MEMORY;
fargs.stream = &fd->stream; fargs.stream = &fd->stream;
error = FT_Open_Face(ft_library, &fargs, 0, &fd->face);
int max_index = 0;
FT_Face tmp_face;
error = FT_Open_Face(ft_library, &fargs, -1, &tmp_face);
if (error == 0) {
max_index = tmp_face->num_faces - 1;
}
FT_Done_Face(tmp_face);
error = FT_Open_Face(ft_library, &fargs, CLAMP(p_font_data->face_index, 0, max_index), &fd->face);
if (error) { if (error) {
FT_Done_Face(fd->face); FT_Done_Face(fd->face);
fd->face = nullptr; fd->face = nullptr;
@ -892,6 +901,69 @@ void TextServerFallback::font_set_style(const RID &p_font_rid, int64_t /*FontSty
fd->style_flags = p_style; fd->style_flags = p_style;
} }
void TextServerFallback::font_set_face_index(const RID &p_font_rid, int64_t p_face_index) {
ERR_FAIL_COND(p_face_index < 0);
ERR_FAIL_COND(p_face_index >= 0x7FFF);
FontDataFallback *fd = font_owner.get_or_null(p_font_rid);
ERR_FAIL_COND(!fd);
MutexLock lock(fd->mutex);
if (fd->face_index != p_face_index) {
fd->face_index = p_face_index;
_font_clear_cache(fd);
}
}
int64_t TextServerFallback::font_get_face_index(const RID &p_font_rid) const {
FontDataFallback *fd = font_owner.get_or_null(p_font_rid);
ERR_FAIL_COND_V(!fd, 0);
MutexLock lock(fd->mutex);
return fd->face_index;
}
int64_t TextServerFallback::font_get_face_count(const RID &p_font_rid) const {
FontDataFallback *fd = font_owner.get_or_null(p_font_rid);
ERR_FAIL_COND_V(!fd, 0);
MutexLock lock(fd->mutex);
int face_count = 0;
if (fd->data_ptr && (fd->data_size > 0)) {
// Init dynamic font.
#ifdef MODULE_FREETYPE_ENABLED
int error = 0;
if (!ft_library) {
error = FT_Init_FreeType(&ft_library);
ERR_FAIL_COND_V_MSG(error != 0, false, "FreeType: Error initializing library: '" + String(FT_Error_String(error)) + "'.");
}
FT_StreamRec stream;
memset(&stream, 0, sizeof(FT_StreamRec));
stream.base = (unsigned char *)fd->data_ptr;
stream.size = fd->data_size;
stream.pos = 0;
FT_Open_Args fargs;
memset(&fargs, 0, sizeof(FT_Open_Args));
fargs.memory_base = (unsigned char *)fd->data_ptr;
fargs.memory_size = fd->data_size;
fargs.flags = FT_OPEN_MEMORY;
fargs.stream = &stream;
FT_Face tmp_face;
error = FT_Open_Face(ft_library, &fargs, -1, &tmp_face);
if (error == 0) {
face_count = tmp_face->num_faces;
}
FT_Done_Face(tmp_face);
#endif
}
return face_count;
}
int64_t /*FontStyle*/ TextServerFallback::font_get_style(const RID &p_font_rid) const { int64_t /*FontStyle*/ TextServerFallback::font_get_style(const RID &p_font_rid) const {
FontDataFallback *fd = font_owner.get_or_null(p_font_rid); FontDataFallback *fd = font_owner.get_or_null(p_font_rid);
ERR_FAIL_COND_V(!fd, 0); ERR_FAIL_COND_V(!fd, 0);

View file

@ -209,6 +209,7 @@ class TextServerFallback : public TextServerExtension {
PackedByteArray data; PackedByteArray data;
const uint8_t *data_ptr; const uint8_t *data_ptr;
size_t data_size; size_t data_size;
int face_index = 0;
mutable ThreadWorkPool work_pool; mutable ThreadWorkPool work_pool;
@ -364,6 +365,11 @@ public:
virtual void font_set_data(const RID &p_font_rid, const PackedByteArray &p_data) override; virtual void font_set_data(const RID &p_font_rid, const PackedByteArray &p_data) override;
virtual void font_set_data_ptr(const RID &p_font_rid, const uint8_t *p_data_ptr, int64_t p_data_size) override; virtual void font_set_data_ptr(const RID &p_font_rid, const uint8_t *p_data_ptr, int64_t p_data_size) override;
virtual void font_set_face_index(const RID &p_font_rid, int64_t p_index) override;
virtual int64_t font_get_face_index(const RID &p_font_rid) const override;
virtual int64_t font_get_face_count(const RID &p_font_rid) const override;
virtual void font_set_style(const RID &p_font_rid, int64_t /*FontStyle*/ p_style) override; virtual void font_set_style(const RID &p_font_rid, int64_t /*FontStyle*/ p_style) override;
virtual int64_t /*FontStyle*/ font_get_style(const RID &p_font_rid) const override; virtual int64_t /*FontStyle*/ font_get_style(const RID &p_font_rid) const override;

View file

@ -54,6 +54,7 @@ _FORCE_INLINE_ void FontData::_ensure_rid(int p_cache_index) const {
if (unlikely(!cache[p_cache_index].is_valid())) { if (unlikely(!cache[p_cache_index].is_valid())) {
cache.write[p_cache_index] = TS->create_font(); cache.write[p_cache_index] = TS->create_font();
TS->font_set_data_ptr(cache[p_cache_index], data_ptr, data_size); TS->font_set_data_ptr(cache[p_cache_index], data_ptr, data_size);
TS->font_set_face_index(cache[p_cache_index], face_index);
TS->font_set_antialiased(cache[p_cache_index], antialiased); TS->font_set_antialiased(cache[p_cache_index], antialiased);
TS->font_set_generate_mipmaps(cache[p_cache_index], mipmaps); TS->font_set_generate_mipmaps(cache[p_cache_index], mipmaps);
TS->font_set_multichannel_signed_distance_field(cache[p_cache_index], msdf); TS->font_set_multichannel_signed_distance_field(cache[p_cache_index], msdf);
@ -76,6 +77,11 @@ void FontData::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_data", "data"), &FontData::set_data); ClassDB::bind_method(D_METHOD("set_data", "data"), &FontData::set_data);
ClassDB::bind_method(D_METHOD("get_data"), &FontData::get_data); ClassDB::bind_method(D_METHOD("get_data"), &FontData::get_data);
ClassDB::bind_method(D_METHOD("set_face_index", "face_index"), &FontData::set_face_index);
ClassDB::bind_method(D_METHOD("get_face_index"), &FontData::get_face_index);
ClassDB::bind_method(D_METHOD("get_face_count"), &FontData::get_face_count);
ClassDB::bind_method(D_METHOD("set_antialiased", "antialiased"), &FontData::set_antialiased); ClassDB::bind_method(D_METHOD("set_antialiased", "antialiased"), &FontData::set_antialiased);
ClassDB::bind_method(D_METHOD("is_antialiased"), &FontData::is_antialiased); ClassDB::bind_method(D_METHOD("is_antialiased"), &FontData::is_antialiased);
@ -217,6 +223,7 @@ void FontData::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_supported_variation_list"), &FontData::get_supported_variation_list); ClassDB::bind_method(D_METHOD("get_supported_variation_list"), &FontData::get_supported_variation_list);
ADD_PROPERTY(PropertyInfo(Variant::PACKED_BYTE_ARRAY, "data", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE), "set_data", "get_data"); ADD_PROPERTY(PropertyInfo(Variant::PACKED_BYTE_ARRAY, "data", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE), "set_data", "get_data");
ADD_PROPERTY(PropertyInfo(Variant::INT, "face_index", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE), "set_face_index", "get_face_index");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "generate_mipmaps", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE), "set_generate_mipmaps", "get_generate_mipmaps"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "generate_mipmaps", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE), "set_generate_mipmaps", "get_generate_mipmaps");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "antialiased", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE), "set_antialiased", "is_antialiased"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "antialiased", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE), "set_antialiased", "is_antialiased");
ADD_PROPERTY(PropertyInfo(Variant::STRING, "font_name", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE), "set_font_name", "get_font_name"); ADD_PROPERTY(PropertyInfo(Variant::STRING, "font_name", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE), "set_font_name", "get_font_name");
@ -445,6 +452,7 @@ void FontData::reset_state() {
data.clear(); data.clear();
data_ptr = nullptr; data_ptr = nullptr;
data_size = 0; data_size = 0;
face_index = 0;
cache.clear(); cache.clear();
antialiased = true; antialiased = true;
@ -1244,6 +1252,31 @@ void FontData::set_data(const PackedByteArray &p_data) {
} }
} }
void FontData::set_face_index(int64_t p_index) {
ERR_FAIL_COND(p_index < 0);
ERR_FAIL_COND(p_index >= 0x7FFF);
if (face_index != p_index) {
face_index = p_index;
if (data_ptr != nullptr) {
for (int i = 0; i < cache.size(); i++) {
if (cache[i].is_valid()) {
TS->font_set_face_index(cache[i], face_index);
}
}
}
}
}
int64_t FontData::get_face_index() const {
return face_index;
}
int64_t FontData::get_face_count() const {
_ensure_rid(0);
return TS->font_get_face_count(cache[0]);
}
PackedByteArray FontData::get_data() const { PackedByteArray FontData::get_data() const {
if (unlikely((size_t)data.size() != data_size)) { if (unlikely((size_t)data.size() != data_size)) {
PackedByteArray *data_w = const_cast<PackedByteArray *>(&data); PackedByteArray *data_w = const_cast<PackedByteArray *>(&data);

View file

@ -46,6 +46,7 @@ class FontData : public Resource {
// Font source data. // Font source data.
const uint8_t *data_ptr = nullptr; const uint8_t *data_ptr = nullptr;
size_t data_size = 0; size_t data_size = 0;
int face_index = 0;
PackedByteArray data; PackedByteArray data;
bool antialiased = true; bool antialiased = true;
@ -91,6 +92,11 @@ public:
virtual void set_data(const PackedByteArray &p_data); virtual void set_data(const PackedByteArray &p_data);
virtual PackedByteArray get_data() const; virtual PackedByteArray get_data() const;
virtual void set_face_index(int64_t p_index);
virtual int64_t get_face_index() const;
virtual int64_t get_face_count() const;
// Common properties. // Common properties.
virtual void set_font_name(const String &p_name); virtual void set_font_name(const String &p_name);
virtual String get_font_name() const; virtual String get_font_name() const;

View file

@ -55,6 +55,11 @@ void TextServerExtension::_bind_methods() {
GDVIRTUAL_BIND(font_set_data, "font_rid", "data"); GDVIRTUAL_BIND(font_set_data, "font_rid", "data");
GDVIRTUAL_BIND(font_set_data_ptr, "font_rid", "data_ptr", "data_size"); GDVIRTUAL_BIND(font_set_data_ptr, "font_rid", "data_ptr", "data_size");
GDVIRTUAL_BIND(font_set_face_index, "font_rid", "face_index");
GDVIRTUAL_BIND(font_get_face_index, "font_rid");
GDVIRTUAL_BIND(font_get_face_count, "font_rid");
GDVIRTUAL_BIND(font_set_style, "font_rid", "style"); GDVIRTUAL_BIND(font_set_style, "font_rid", "style");
GDVIRTUAL_BIND(font_get_style, "font_rid"); GDVIRTUAL_BIND(font_get_style, "font_rid");
@ -413,6 +418,26 @@ void TextServerExtension::font_set_data_ptr(const RID &p_font_rid, const uint8_t
GDVIRTUAL_CALL(font_set_data_ptr, p_font_rid, p_data_ptr, p_data_size); GDVIRTUAL_CALL(font_set_data_ptr, p_font_rid, p_data_ptr, p_data_size);
} }
void TextServerExtension::font_set_face_index(const RID &p_font_rid, int64_t p_index) {
GDVIRTUAL_CALL(font_set_face_index, p_font_rid, p_index);
}
int64_t TextServerExtension::font_get_face_index(const RID &p_font_rid) const {
int64_t ret;
if (GDVIRTUAL_CALL(font_get_face_index, p_font_rid, ret)) {
return ret;
}
return 0;
}
int64_t TextServerExtension::font_get_face_count(const RID &p_font_rid) const {
int64_t ret;
if (GDVIRTUAL_CALL(font_get_face_count, p_font_rid, ret)) {
return ret;
}
return 0;
}
void TextServerExtension::font_set_style(const RID &p_font_rid, int64_t /*FontStyle*/ p_style) { void TextServerExtension::font_set_style(const RID &p_font_rid, int64_t /*FontStyle*/ p_style) {
GDVIRTUAL_CALL(font_set_style, p_font_rid, p_style); GDVIRTUAL_CALL(font_set_style, p_font_rid, p_style);
} }

View file

@ -84,6 +84,14 @@ public:
GDVIRTUAL2(font_set_data, RID, const PackedByteArray &); GDVIRTUAL2(font_set_data, RID, const PackedByteArray &);
GDVIRTUAL3(font_set_data_ptr, RID, GDNativeConstPtr<const uint8_t>, int64_t); GDVIRTUAL3(font_set_data_ptr, RID, GDNativeConstPtr<const uint8_t>, int64_t);
virtual void font_set_face_index(const RID &p_font_rid, int64_t p_index) override;
virtual int64_t font_get_face_index(const RID &p_font_rid) const override;
GDVIRTUAL2(font_set_face_index, RID, int64_t);
GDVIRTUAL1RC(int64_t, font_get_face_index, RID);
virtual int64_t font_get_face_count(const RID &p_font_rid) const override;
GDVIRTUAL1RC(int64_t, font_get_face_count, RID);
virtual void font_set_style(const RID &p_font_rid, int64_t /*FontStyle*/ p_style) override; virtual void font_set_style(const RID &p_font_rid, int64_t /*FontStyle*/ p_style) override;
virtual int64_t /*FontStyle*/ font_get_style(const RID &p_font_rid) const override; virtual int64_t /*FontStyle*/ font_get_style(const RID &p_font_rid) const override;
GDVIRTUAL2(font_set_style, RID, int64_t); GDVIRTUAL2(font_set_style, RID, int64_t);

View file

@ -208,6 +208,11 @@ void TextServer::_bind_methods() {
ClassDB::bind_method(D_METHOD("font_set_data", "font_rid", "data"), &TextServer::font_set_data); ClassDB::bind_method(D_METHOD("font_set_data", "font_rid", "data"), &TextServer::font_set_data);
ClassDB::bind_method(D_METHOD("font_set_face_index", "font_rid", "face_index"), &TextServer::font_set_face_index);
ClassDB::bind_method(D_METHOD("font_get_face_index", "font_rid"), &TextServer::font_get_face_index);
ClassDB::bind_method(D_METHOD("font_get_face_count", "font_rid"), &TextServer::font_get_face_count);
ClassDB::bind_method(D_METHOD("font_set_style", "font_rid", "style"), &TextServer::font_set_style); ClassDB::bind_method(D_METHOD("font_set_style", "font_rid", "style"), &TextServer::font_set_style);
ClassDB::bind_method(D_METHOD("font_get_style", "font_rid"), &TextServer::font_get_style); ClassDB::bind_method(D_METHOD("font_get_style", "font_rid"), &TextServer::font_get_style);

View file

@ -189,6 +189,11 @@ public:
virtual void font_set_data(const RID &p_font_rid, const PackedByteArray &p_data) = 0; virtual void font_set_data(const RID &p_font_rid, const PackedByteArray &p_data) = 0;
virtual void font_set_data_ptr(const RID &p_font_rid, const uint8_t *p_data_ptr, int64_t p_data_size) = 0; virtual void font_set_data_ptr(const RID &p_font_rid, const uint8_t *p_data_ptr, int64_t p_data_size) = 0;
virtual void font_set_face_index(const RID &p_font_rid, int64_t p_index) = 0;
virtual int64_t font_get_face_index(const RID &p_font_rid) const = 0;
virtual int64_t font_get_face_count(const RID &p_font_rid) const = 0;
virtual void font_set_style(const RID &p_font_rid, int64_t /*FontStyle*/ p_style) = 0; virtual void font_set_style(const RID &p_font_rid, int64_t /*FontStyle*/ p_style) = 0;
virtual int64_t /*FontStyle*/ font_get_style(const RID &p_font_rid) const = 0; virtual int64_t /*FontStyle*/ font_get_style(const RID &p_font_rid) const = 0;