summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2023-06-23 17:23:29 +0200
committerRémi Verschelde <rverschelde@gmail.com>2023-06-23 17:23:29 +0200
commit731df52084bc909cef9b4dcab6eaaf10c2282922 (patch)
tree01d1aea6c6856927c2e75912c512d85e98339deb
parent9ab388c146895cfacf87d09d28c148e186f348b6 (diff)
parent263c909349cb64d988bba26eb62c01a3a0b19791 (diff)
downloadredot-engine-731df52084bc909cef9b4dcab6eaaf10c2282922.tar.gz
Merge pull request #77532 from dsnopek/text_server_adv_gdextension
Fix text_server_adv compiling as a GDExtension
-rw-r--r--modules/text_server_adv/gdextension_build/text_server_adv.gdextension1
-rw-r--r--modules/text_server_adv/register_types.cpp4
-rw-r--r--modules/text_server_adv/text_server_adv.cpp8
-rw-r--r--modules/text_server_adv/thorvg_svg_in_ot.cpp15
-rw-r--r--modules/text_server_adv/thorvg_svg_in_ot.h14
5 files changed, 37 insertions, 5 deletions
diff --git a/modules/text_server_adv/gdextension_build/text_server_adv.gdextension b/modules/text_server_adv/gdextension_build/text_server_adv.gdextension
index c12fcfdfdf..bcf3661a8c 100644
--- a/modules/text_server_adv/gdextension_build/text_server_adv.gdextension
+++ b/modules/text_server_adv/gdextension_build/text_server_adv.gdextension
@@ -1,6 +1,7 @@
[configuration]
entry_symbol = "textserver_advanced_init"
+compatibility_minimum = 4.1
[libraries]
diff --git a/modules/text_server_adv/register_types.cpp b/modules/text_server_adv/register_types.cpp
index 51a4d8171e..ba67fef70f 100644
--- a/modules/text_server_adv/register_types.cpp
+++ b/modules/text_server_adv/register_types.cpp
@@ -62,8 +62,8 @@ using namespace godot;
extern "C" {
-GDExtensionBool GDE_EXPORT textserver_advanced_init(const GDExtensionInterface *p_interface, const GDExtensionClassLibraryPtr p_library, GDExtensionInitialization *r_initialization) {
- GDExtensionBinding::InitObject init_obj(p_interface, p_library, r_initialization);
+GDExtensionBool GDE_EXPORT textserver_advanced_init(GDExtensionInterfaceGetProcAddress p_get_proc_address, const GDExtensionClassLibraryPtr p_library, GDExtensionInitialization *r_initialization) {
+ GDExtensionBinding::InitObject init_obj(p_get_proc_address, p_library, r_initialization);
init_obj.register_initializer(&initialize_text_server_adv_module);
init_obj.register_terminator(&uninitialize_text_server_adv_module);
diff --git a/modules/text_server_adv/text_server_adv.cpp b/modules/text_server_adv/text_server_adv.cpp
index eb0cb54caf..b8010e6692 100644
--- a/modules/text_server_adv/text_server_adv.cpp
+++ b/modules/text_server_adv/text_server_adv.cpp
@@ -2112,10 +2112,12 @@ Dictionary TextServerAdvanced::_font_get_ot_name_strings(const RID &p_font_rid)
name = vformat("unknown_%d", names[i].name_id);
} break;
}
- String text;
unsigned int text_size = hb_ot_name_get_utf32(hb_face, names[i].name_id, names[i].language, nullptr, nullptr) + 1;
- text.resize(text_size);
- hb_ot_name_get_utf32(hb_face, names[i].name_id, names[i].language, &text_size, (uint32_t *)text.ptrw());
+ // @todo After godot-cpp#1141 is fixed, use text.resize() and write directly to text.wptr() instead of using a temporary buffer.
+ char32_t *buffer = memnew_arr(char32_t, text_size);
+ hb_ot_name_get_utf32(hb_face, names[i].name_id, names[i].language, &text_size, (uint32_t *)buffer);
+ String text(buffer);
+ memdelete_arr(buffer);
if (!text.is_empty()) {
Dictionary &id_string = names_for_lang[String(hb_language_to_string(names[i].language))];
id_string[name] = text;
diff --git a/modules/text_server_adv/thorvg_svg_in_ot.cpp b/modules/text_server_adv/thorvg_svg_in_ot.cpp
index 951ca15503..2f48f1564c 100644
--- a/modules/text_server_adv/thorvg_svg_in_ot.cpp
+++ b/modules/text_server_adv/thorvg_svg_in_ot.cpp
@@ -155,10 +155,21 @@ FT_Error tvg_svg_in_ot_preset_slot(FT_GlyphSlot p_slot, FT_Bool p_cache, FT_Poin
}
String xml_code_str = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"" + rtos(min_x) + " " + rtos(min_y) + " " + rtos(new_w) + " " + rtos(new_h) + "\">" + xml_body;
+#ifndef GDEXTENSION
gl_state.xml_code = xml_code_str.utf8();
+#else
+ CharString xml_code = xml_code_str.utf8();
+ gl_state.xml_code_length = xml_code.length();
+ gl_state.xml_code = memnew_arr(char, gl_state.xml_code_length);
+ memcpy(gl_state.xml_code, xml_code.get_data(), gl_state.xml_code_length);
+#endif
picture = tvg::Picture::gen();
+#ifndef GDEXTENSION
result = picture->load(gl_state.xml_code.get_data(), gl_state.xml_code.length(), "svg+xml", false);
+#else
+ result = picture->load(gl_state.xml_code, gl_state.xml_code_length, "svg+xml", false);
+#endif
if (result != tvg::Result::Success) {
ERR_FAIL_V_MSG(FT_Err_Invalid_SVG_Document, "Failed to load SVG document (glyph metrics).");
}
@@ -246,7 +257,11 @@ FT_Error tvg_svg_in_ot_render(FT_GlyphSlot p_slot, FT_Pointer *p_state) {
ERR_FAIL_COND_V_MSG(!gl_state.ready, FT_Err_Invalid_SVG_Document, "SVG glyph not ready.");
std::unique_ptr<tvg::Picture> picture = tvg::Picture::gen();
+#ifndef GDEXTENSION
tvg::Result res = picture->load(gl_state.xml_code.get_data(), gl_state.xml_code.length(), "svg+xml", false);
+#else
+ tvg::Result res = picture->load(gl_state.xml_code, gl_state.xml_code_length, "svg+xml", false);
+#endif
if (res != tvg::Result::Success) {
ERR_FAIL_V_MSG(FT_Err_Invalid_SVG_Document, "Failed to load SVG document (glyph rendering).");
}
diff --git a/modules/text_server_adv/thorvg_svg_in_ot.h b/modules/text_server_adv/thorvg_svg_in_ot.h
index 034fffb5e6..5e79c8e444 100644
--- a/modules/text_server_adv/thorvg_svg_in_ot.h
+++ b/modules/text_server_adv/thorvg_svg_in_ot.h
@@ -66,8 +66,22 @@ struct GL_State {
float y = 0;
float w = 0;
float h = 0;
+#ifndef GDEXTENSION
CharString xml_code;
+#else
+ // @todo After godot-cpp#1142 is fixed, use CharString just like when compiled as a Godot module.
+ char *xml_code = nullptr;
+ int xml_code_length = 0;
+#endif
tvg::Matrix m;
+
+#ifdef GDEXTENSION
+ ~GL_State() {
+ if (xml_code) {
+ memdelete_arr(xml_code);
+ }
+ }
+#endif
};
struct TVG_State {