@@ -196,6 +196,38 @@ GDExtensionInterfaceClassdbUnregisterExtensionClass gdextension_interface_classd
196
196
GDExtensionInterfaceGetLibraryPath gdextension_interface_get_library_path = nullptr ;
197
197
GDExtensionInterfaceEditorAddPlugin gdextension_interface_editor_add_plugin = nullptr ;
198
198
GDExtensionInterfaceEditorRemovePlugin gdextension_interface_editor_remove_plugin = nullptr ;
199
+ GDExtensionsInterfaceEditorHelpLoadXmlFromUtf8Chars gdextension_interface_editor_help_load_xml_from_utf8_chars = nullptr ;
200
+ GDExtensionsInterfaceEditorHelpLoadXmlFromUtf8CharsAndLen gdextension_interface_editor_help_load_xml_from_utf8_chars_and_len = nullptr ;
201
+
202
+ struct DocData {
203
+ const char *hash = nullptr ;
204
+ int uncompressed_size = 0 ;
205
+ int compressed_size = 0 ;
206
+ const unsigned char *data = nullptr ;
207
+
208
+ inline bool is_valid () const {
209
+ return hash != nullptr && uncompressed_size > 0 && compressed_size > 0 && data != nullptr ;
210
+ }
211
+
212
+ void load_data () const ;
213
+ };
214
+
215
+ static DocData &get_doc_data () {
216
+ static DocData doc_data;
217
+ return doc_data;
218
+ }
219
+
220
+ DocDataRegistration::DocDataRegistration (const char *p_hash, int p_uncompressed_size, int p_compressed_size, const unsigned char *p_data) {
221
+ DocData &doc_data = get_doc_data ();
222
+ if (doc_data.is_valid ()) {
223
+ printf (" ERROR: Attempting to register documentation data when we already have some - discarding.\n " );
224
+ return ;
225
+ }
226
+ doc_data.hash = p_hash;
227
+ doc_data.uncompressed_size = p_uncompressed_size;
228
+ doc_data.compressed_size = p_compressed_size;
229
+ doc_data.data = p_data;
230
+ }
199
231
200
232
} // namespace internal
201
233
@@ -436,6 +468,8 @@ GDExtensionBool GDExtensionBinding::init(GDExtensionInterfaceGetProcAddress p_ge
436
468
LOAD_PROC_ADDRESS (get_library_path, GDExtensionInterfaceGetLibraryPath);
437
469
LOAD_PROC_ADDRESS (editor_add_plugin, GDExtensionInterfaceEditorAddPlugin);
438
470
LOAD_PROC_ADDRESS (editor_remove_plugin, GDExtensionInterfaceEditorRemovePlugin);
471
+ LOAD_PROC_ADDRESS (editor_help_load_xml_from_utf8_chars, GDExtensionsInterfaceEditorHelpLoadXmlFromUtf8Chars);
472
+ LOAD_PROC_ADDRESS (editor_help_load_xml_from_utf8_chars_and_len, GDExtensionsInterfaceEditorHelpLoadXmlFromUtf8CharsAndLen);
439
473
440
474
r_initialization->initialize = initialize_level;
441
475
r_initialization->deinitialize = deinitialize_level;
@@ -465,6 +499,13 @@ void GDExtensionBinding::initialize_level(void *p_userdata, GDExtensionInitializ
465
499
ClassDB::initialize (p_level);
466
500
}
467
501
level_initialized[p_level]++;
502
+
503
+ if ((ModuleInitializationLevel)p_level == MODULE_INITIALIZATION_LEVEL_EDITOR) {
504
+ const internal::DocData &doc_data = internal::get_doc_data ();
505
+ if (doc_data.is_valid ()) {
506
+ doc_data.load_data ();
507
+ }
508
+ }
468
509
}
469
510
470
511
void GDExtensionBinding::deinitialize_level (void *p_userdata, GDExtensionInitializationLevel p_level) {
@@ -531,4 +572,15 @@ GDExtensionBool GDExtensionBinding::InitObject::init() const {
531
572
return GDExtensionBinding::init (get_proc_address, library, init_data, initialization);
532
573
}
533
574
575
+ void internal::DocData::load_data () const {
576
+ PackedByteArray compressed;
577
+ compressed.resize (compressed_size);
578
+ memcpy (compressed.ptrw (), data, compressed_size);
579
+
580
+ // FileAccess::COMPRESSION_DEFLATE = 1
581
+ PackedByteArray decompressed = compressed.decompress (uncompressed_size, 1 );
582
+
583
+ internal::gdextension_interface_editor_help_load_xml_from_utf8_chars_and_len (reinterpret_cast <const char *>(decompressed.ptr ()), uncompressed_size);
584
+ }
585
+
534
586
} // namespace godot
0 commit comments