@@ -198,6 +198,38 @@ GDExtensionInterfaceClassdbUnregisterExtensionClass gdextension_interface_classd
198198GDExtensionInterfaceGetLibraryPath gdextension_interface_get_library_path = nullptr ;
199199GDExtensionInterfaceEditorAddPlugin gdextension_interface_editor_add_plugin = nullptr ;
200200GDExtensionInterfaceEditorRemovePlugin gdextension_interface_editor_remove_plugin = nullptr ;
201+ GDExtensionsInterfaceEditorHelpLoadXmlFromUtf8Chars gdextension_interface_editor_help_load_xml_from_utf8_chars = nullptr ;
202+ GDExtensionsInterfaceEditorHelpLoadXmlFromUtf8CharsAndLen gdextension_interface_editor_help_load_xml_from_utf8_chars_and_len = nullptr ;
203+
204+ struct DocData {
205+ const char *hash = nullptr ;
206+ int uncompressed_size = 0 ;
207+ int compressed_size = 0 ;
208+ const unsigned char *data = nullptr ;
209+
210+ inline bool is_valid () const {
211+ return hash != nullptr && uncompressed_size > 0 && compressed_size > 0 && data != nullptr ;
212+ }
213+
214+ void load_data () const ;
215+ };
216+
217+ static DocData &get_doc_data () {
218+ static DocData doc_data;
219+ return doc_data;
220+ }
221+
222+ DocDataRegistration::DocDataRegistration (const char *p_hash, int p_uncompressed_size, int p_compressed_size, const unsigned char *p_data) {
223+ DocData &doc_data = get_doc_data ();
224+ if (doc_data.is_valid ()) {
225+ printf (" ERROR: Attempting to register documentation data when we already have some - discarding.\n " );
226+ return ;
227+ }
228+ doc_data.hash = p_hash;
229+ doc_data.uncompressed_size = p_uncompressed_size;
230+ doc_data.compressed_size = p_compressed_size;
231+ doc_data.data = p_data;
232+ }
201233
202234} // namespace internal
203235
@@ -440,6 +472,8 @@ GDExtensionBool GDExtensionBinding::init(GDExtensionInterfaceGetProcAddress p_ge
440472 LOAD_PROC_ADDRESS (get_library_path, GDExtensionInterfaceGetLibraryPath);
441473 LOAD_PROC_ADDRESS (editor_add_plugin, GDExtensionInterfaceEditorAddPlugin);
442474 LOAD_PROC_ADDRESS (editor_remove_plugin, GDExtensionInterfaceEditorRemovePlugin);
475+ LOAD_PROC_ADDRESS (editor_help_load_xml_from_utf8_chars, GDExtensionsInterfaceEditorHelpLoadXmlFromUtf8Chars);
476+ LOAD_PROC_ADDRESS (editor_help_load_xml_from_utf8_chars_and_len, GDExtensionsInterfaceEditorHelpLoadXmlFromUtf8CharsAndLen);
443477
444478 r_initialization->initialize = initialize_level;
445479 r_initialization->deinitialize = deinitialize_level;
@@ -469,6 +503,13 @@ void GDExtensionBinding::initialize_level(void *p_userdata, GDExtensionInitializ
469503 ClassDB::initialize (p_level);
470504 }
471505 level_initialized[p_level]++;
506+
507+ if ((ModuleInitializationLevel)p_level == MODULE_INITIALIZATION_LEVEL_EDITOR) {
508+ const internal::DocData &doc_data = internal::get_doc_data ();
509+ if (doc_data.is_valid ()) {
510+ doc_data.load_data ();
511+ }
512+ }
472513}
473514
474515void GDExtensionBinding::deinitialize_level (void *p_userdata, GDExtensionInitializationLevel p_level) {
@@ -535,4 +576,15 @@ GDExtensionBool GDExtensionBinding::InitObject::init() const {
535576 return GDExtensionBinding::init (get_proc_address, library, init_data, initialization);
536577}
537578
579+ void internal::DocData::load_data () const {
580+ PackedByteArray compressed;
581+ compressed.resize (compressed_size);
582+ memcpy (compressed.ptrw (), data, compressed_size);
583+
584+ // FileAccess::COMPRESSION_DEFLATE = 1
585+ PackedByteArray decompressed = compressed.decompress (uncompressed_size, 1 );
586+
587+ internal::gdextension_interface_editor_help_load_xml_from_utf8_chars_and_len (reinterpret_cast <const char *>(decompressed.ptr ()), uncompressed_size);
588+ }
589+
538590} // namespace godot
0 commit comments