浏览代码

Merge pull request #70317 from HolonProduction/svg_assets

Add support for svg images in the asset lib.
Rémi Verschelde 2 年之前
父节点
当前提交
f04f53201d
共有 3 个文件被更改,包括 37 次插入9 次删除
  1. 22 0
      editor/plugins/asset_library_editor_plugin.cpp
  2. 14 9
      modules/svg/image_loader_svg.cpp
  3. 1 0
      modules/svg/image_loader_svg.h

+ 22 - 0
editor/plugins/asset_library_editor_plugin.cpp

@@ -43,6 +43,11 @@
 #include "editor/project_settings_editor.h"
 #include "scene/gui/menu_button.h"
 
+#include "modules/modules_enabled.gen.h" // For svg.
+#ifdef MODULE_SVG_ENABLED
+#include "modules/svg/image_loader_svg.h"
+#endif
+
 static inline void setup_http_request(HTTPRequest *request) {
 	request->set_use_threads(EDITOR_DEF("asset_library/use_threads", true));
 
@@ -751,13 +756,30 @@ void EditorAssetLibrary::_image_update(bool use_cache, bool final, const PackedB
 
 		uint8_t png_signature[8] = { 137, 80, 78, 71, 13, 10, 26, 10 };
 		uint8_t jpg_signature[3] = { 255, 216, 255 };
+		uint8_t webp_signature[4] = { 82, 73, 70, 70 };
+		uint8_t bmp_signature[2] = { 66, 77 };
 
 		if (r) {
 			if ((memcmp(&r[0], &png_signature[0], 8) == 0) && Image::_png_mem_loader_func) {
 				image->copy_internals_from(Image::_png_mem_loader_func(r, len));
 			} else if ((memcmp(&r[0], &jpg_signature[0], 3) == 0) && Image::_jpg_mem_loader_func) {
 				image->copy_internals_from(Image::_jpg_mem_loader_func(r, len));
+			} else if ((memcmp(&r[0], &webp_signature[0], 4) == 0) && Image::_webp_mem_loader_func) {
+				image->copy_internals_from(Image::_webp_mem_loader_func(r, len));
+			} else if ((memcmp(&r[0], &bmp_signature[0], 2) == 0) && Image::_bmp_mem_loader_func) {
+				image->copy_internals_from(Image::_bmp_mem_loader_func(r, len));
 			}
+#ifdef MODULE_SVG_ENABLED
+			else {
+				ImageLoaderSVG svg_loader;
+				Ref<Image> img = Ref<Image>(memnew(Image));
+				Error err = svg_loader.create_image_from_utf8_buffer(img, image_data, 1.0, false);
+
+				if (err == OK) {
+					image->copy_internals_from(img);
+				}
+			}
+#endif
 		}
 
 		if (!image->is_empty()) {

+ 14 - 9
modules/svg/image_loader_svg.cpp

@@ -67,19 +67,12 @@ void ImageLoaderSVG::_replace_color_property(const HashMap<Color, Color> &p_colo
 	}
 }
 
-Error ImageLoaderSVG::create_image_from_string(Ref<Image> p_image, String p_string, float p_scale, bool p_upsample, const HashMap<Color, Color> &p_color_map) {
+Error ImageLoaderSVG::create_image_from_utf8_buffer(Ref<Image> p_image, const PackedByteArray &p_buffer, float p_scale, bool p_upsample) {
 	ERR_FAIL_COND_V_MSG(Math::is_zero_approx(p_scale), ERR_INVALID_PARAMETER, "ImageLoaderSVG: Can't load SVG with a scale of 0.");
 
-	if (p_color_map.size()) {
-		_replace_color_property(p_color_map, "stop-color=\"", p_string);
-		_replace_color_property(p_color_map, "fill=\"", p_string);
-		_replace_color_property(p_color_map, "stroke=\"", p_string);
-	}
-
 	std::unique_ptr<tvg::Picture> picture = tvg::Picture::gen();
-	PackedByteArray bytes = p_string.to_utf8_buffer();
 
-	tvg::Result result = picture->load((const char *)bytes.ptr(), bytes.size(), "svg", true);
+	tvg::Result result = picture->load((const char *)p_buffer.ptr(), p_buffer.size(), "svg", true);
 	if (result != tvg::Result::Success) {
 		return ERR_INVALID_DATA;
 	}
@@ -149,6 +142,18 @@ Error ImageLoaderSVG::create_image_from_string(Ref<Image> p_image, String p_stri
 	return OK;
 }
 
+Error ImageLoaderSVG::create_image_from_string(Ref<Image> p_image, String p_string, float p_scale, bool p_upsample, const HashMap<Color, Color> &p_color_map) {
+	if (p_color_map.size()) {
+		_replace_color_property(p_color_map, "stop-color=\"", p_string);
+		_replace_color_property(p_color_map, "fill=\"", p_string);
+		_replace_color_property(p_color_map, "stroke=\"", p_string);
+	}
+
+	PackedByteArray bytes = p_string.to_utf8_buffer();
+
+	return create_image_from_utf8_buffer(p_image, bytes, p_scale, p_upsample);
+}
+
 void ImageLoaderSVG::get_recognized_extensions(List<String> *p_extensions) const {
 	p_extensions->push_back("svg");
 }

+ 1 - 0
modules/svg/image_loader_svg.h

@@ -41,6 +41,7 @@ class ImageLoaderSVG : public ImageFormatLoader {
 public:
 	static void set_forced_color_map(const HashMap<Color, Color> &p_color_map);
 
+	Error create_image_from_utf8_buffer(Ref<Image> p_image, const PackedByteArray &p_buffer, float p_scale, bool p_upsample);
 	Error create_image_from_string(Ref<Image> p_image, String p_string, float p_scale, bool p_upsample, const HashMap<Color, Color> &p_color_map);
 
 	virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> p_fileaccess, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale) override;