From 66fa77666711c657c1f0ab93e2970e421413cc27 Mon Sep 17 00:00:00 2001 From: HolonProduction Date: Mon, 19 Dec 2022 21:42:43 +0100 Subject: Add support for svg images in the asset lib. Pixel based image formats are identified by magic numbers. This is not possible with svg therefore svg parsing is tried and if it succeeded the result is used. WebP and bmp support is added as well. But I could not test it as I am not able to run a local instance of the asset lib and there is no asset using those formats. --- modules/svg/image_loader_svg.cpp | 23 ++++++++++++++--------- modules/svg/image_loader_svg.h | 1 + 2 files changed, 15 insertions(+), 9 deletions(-) (limited to 'modules') diff --git a/modules/svg/image_loader_svg.cpp b/modules/svg/image_loader_svg.cpp index 2dba4916a0..b194e7cb3f 100644 --- a/modules/svg/image_loader_svg.cpp +++ b/modules/svg/image_loader_svg.cpp @@ -67,19 +67,12 @@ void ImageLoaderSVG::_replace_color_property(const HashMap &p_colo } } -Error ImageLoaderSVG::create_image_from_string(Ref p_image, String p_string, float p_scale, bool p_upsample, const HashMap &p_color_map) { +Error ImageLoaderSVG::create_image_from_utf8_buffer(Ref 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 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 p_image, String p_stri return OK; } +Error ImageLoaderSVG::create_image_from_string(Ref p_image, String p_string, float p_scale, bool p_upsample, const HashMap &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 *p_extensions) const { p_extensions->push_back("svg"); } diff --git a/modules/svg/image_loader_svg.h b/modules/svg/image_loader_svg.h index 84511f1708..d955a04f1e 100644 --- a/modules/svg/image_loader_svg.h +++ b/modules/svg/image_loader_svg.h @@ -41,6 +41,7 @@ class ImageLoaderSVG : public ImageFormatLoader { public: static void set_forced_color_map(const HashMap &p_color_map); + Error create_image_from_utf8_buffer(Ref p_image, const PackedByteArray &p_buffer, float p_scale, bool p_upsample); Error create_image_from_string(Ref p_image, String p_string, float p_scale, bool p_upsample, const HashMap &p_color_map); virtual Error load_image(Ref p_image, Ref p_fileaccess, BitField p_flags, float p_scale) override; -- cgit v1.2.3