summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThaddeus Crews <repiteo@outlook.com>2024-10-24 13:22:44 -0500
committerThaddeus Crews <repiteo@outlook.com>2024-10-24 13:22:44 -0500
commit0953d488c760f1470eaccc31761f37ea237df61c (patch)
treee5c6d1467367f921497b12b655a0ac0e00cb10b7
parentff5e2d7db10112a5fb0b9eb31f0766b80354eea8 (diff)
parent4dad9c6c05921cf98c9ee59a5f28358496912433 (diff)
downloadredot-engine-0953d488c760f1470eaccc31761f37ea237df61c.tar.gz
Merge pull request #98329 from beru/opt_ImageLoaderSVG__create_image_from_utf8_buffer
Optimize ImageLoaderSVG::create_image_from_utf8_buffer
-rw-r--r--modules/svg/image_loader_svg.cpp26
1 files changed, 4 insertions, 22 deletions
diff --git a/modules/svg/image_loader_svg.cpp b/modules/svg/image_loader_svg.cpp
index d903137195..b9d493b844 100644
--- a/modules/svg/image_loader_svg.cpp
+++ b/modules/svg/image_loader_svg.cpp
@@ -104,51 +104,33 @@ Error ImageLoaderSVG::create_image_from_utf8_buffer(Ref<Image> p_image, const ui
picture->size(width, height);
std::unique_ptr<tvg::SwCanvas> sw_canvas = tvg::SwCanvas::gen();
- // Note: memalloc here, be sure to memfree before any return.
- uint32_t *buffer = (uint32_t *)memalloc(sizeof(uint32_t) * width * height);
+ Vector<uint8_t> buffer;
+ buffer.resize(sizeof(uint32_t) * width * height);
- tvg::Result res = sw_canvas->target(buffer, width, width, height, tvg::SwCanvas::ARGB8888S);
+ tvg::Result res = sw_canvas->target((uint32_t *)buffer.ptrw(), width, width, height, tvg::SwCanvas::ABGR8888S);
if (res != tvg::Result::Success) {
- memfree(buffer);
ERR_FAIL_V_MSG(FAILED, "ImageLoaderSVG: Couldn't set target on ThorVG canvas.");
}
res = sw_canvas->push(std::move(picture));
if (res != tvg::Result::Success) {
- memfree(buffer);
ERR_FAIL_V_MSG(FAILED, "ImageLoaderSVG: Couldn't insert ThorVG picture on canvas.");
}
res = sw_canvas->draw();
if (res != tvg::Result::Success) {
- memfree(buffer);
ERR_FAIL_V_MSG(FAILED, "ImageLoaderSVG: Couldn't draw ThorVG pictures on canvas.");
}
res = sw_canvas->sync();
if (res != tvg::Result::Success) {
- memfree(buffer);
ERR_FAIL_V_MSG(FAILED, "ImageLoaderSVG: Couldn't sync ThorVG canvas.");
}
- Vector<uint8_t> image;
- image.resize(width * height * sizeof(uint32_t));
-
- for (uint32_t y = 0; y < height; y++) {
- for (uint32_t x = 0; x < width; x++) {
- uint32_t n = buffer[y * width + x];
- const size_t offset = sizeof(uint32_t) * width * y + sizeof(uint32_t) * x;
- image.write[offset + 0] = (n >> 16) & 0xff;
- image.write[offset + 1] = (n >> 8) & 0xff;
- image.write[offset + 2] = n & 0xff;
- image.write[offset + 3] = (n >> 24) & 0xff;
- }
- }
+ p_image->set_data(width, height, false, Image::FORMAT_RGBA8, buffer);
res = sw_canvas->clear(true);
- memfree(buffer);
- p_image->set_data(width, height, false, Image::FORMAT_RGBA8, image);
return OK;
}