Fix text_server_adv compiling as a GDExtension
This commit is contained in:
parent
d7af287ce3
commit
263c909349
|
@ -1,6 +1,7 @@
|
||||||
[configuration]
|
[configuration]
|
||||||
|
|
||||||
entry_symbol = "textserver_advanced_init"
|
entry_symbol = "textserver_advanced_init"
|
||||||
|
compatibility_minimum = 4.1
|
||||||
|
|
||||||
[libraries]
|
[libraries]
|
||||||
|
|
||||||
|
|
|
@ -62,8 +62,8 @@ using namespace godot;
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
||||||
GDExtensionBool GDE_EXPORT textserver_advanced_init(const GDExtensionInterface *p_interface, const GDExtensionClassLibraryPtr p_library, GDExtensionInitialization *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_interface, p_library, 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_initializer(&initialize_text_server_adv_module);
|
||||||
init_obj.register_terminator(&uninitialize_text_server_adv_module);
|
init_obj.register_terminator(&uninitialize_text_server_adv_module);
|
||||||
|
|
|
@ -2112,10 +2112,12 @@ Dictionary TextServerAdvanced::_font_get_ot_name_strings(const RID &p_font_rid)
|
||||||
name = vformat("unknown_%d", names[i].name_id);
|
name = vformat("unknown_%d", names[i].name_id);
|
||||||
} break;
|
} break;
|
||||||
}
|
}
|
||||||
String text;
|
|
||||||
unsigned int text_size = hb_ot_name_get_utf32(hb_face, names[i].name_id, names[i].language, nullptr, nullptr) + 1;
|
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);
|
// @todo After godot-cpp#1141 is fixed, use text.resize() and write directly to text.wptr() instead of using a temporary buffer.
|
||||||
hb_ot_name_get_utf32(hb_face, names[i].name_id, names[i].language, &text_size, (uint32_t *)text.ptrw());
|
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()) {
|
if (!text.is_empty()) {
|
||||||
Dictionary &id_string = names_for_lang[String(hb_language_to_string(names[i].language))];
|
Dictionary &id_string = names_for_lang[String(hb_language_to_string(names[i].language))];
|
||||||
id_string[name] = text;
|
id_string[name] = text;
|
||||||
|
|
|
@ -150,10 +150,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;
|
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();
|
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();
|
picture = tvg::Picture::gen();
|
||||||
|
#ifndef GDEXTENSION
|
||||||
result = picture->load(gl_state.xml_code.get_data(), gl_state.xml_code.length(), "svg+xml", false);
|
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) {
|
if (result != tvg::Result::Success) {
|
||||||
ERR_FAIL_V_MSG(FT_Err_Invalid_SVG_Document, "Failed to load SVG document (glyph metrics).");
|
ERR_FAIL_V_MSG(FT_Err_Invalid_SVG_Document, "Failed to load SVG document (glyph metrics).");
|
||||||
}
|
}
|
||||||
|
@ -241,7 +252,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.");
|
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();
|
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);
|
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) {
|
if (res != tvg::Result::Success) {
|
||||||
ERR_FAIL_V_MSG(FT_Err_Invalid_SVG_Document, "Failed to load SVG document (glyph rendering).");
|
ERR_FAIL_V_MSG(FT_Err_Invalid_SVG_Document, "Failed to load SVG document (glyph rendering).");
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,8 +66,22 @@ struct GL_State {
|
||||||
float y = 0;
|
float y = 0;
|
||||||
float w = 0;
|
float w = 0;
|
||||||
float h = 0;
|
float h = 0;
|
||||||
|
#ifndef GDEXTENSION
|
||||||
CharString xml_code;
|
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;
|
tvg::Matrix m;
|
||||||
|
|
||||||
|
#ifdef GDEXTENSION
|
||||||
|
~GL_State() {
|
||||||
|
if (xml_code) {
|
||||||
|
memdelete_arr(xml_code);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TVG_State {
|
struct TVG_State {
|
||||||
|
|
Loading…
Reference in New Issue