summaryrefslogtreecommitdiff
path: root/thirdparty/thorvg/src/loaders/tvg/tvgTvgBinInterpreter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/thorvg/src/loaders/tvg/tvgTvgBinInterpreter.cpp')
-rw-r--r--thirdparty/thorvg/src/loaders/tvg/tvgTvgBinInterpreter.cpp55
1 files changed, 37 insertions, 18 deletions
diff --git a/thirdparty/thorvg/src/loaders/tvg/tvgTvgBinInterpreter.cpp b/thirdparty/thorvg/src/loaders/tvg/tvgTvgBinInterpreter.cpp
index 01a39b6e17..2b89d6bb59 100644
--- a/thirdparty/thorvg/src/loaders/tvg/tvgTvgBinInterpreter.cpp
+++ b/thirdparty/thorvg/src/loaders/tvg/tvgTvgBinInterpreter.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2021 - 2022 Samsung Electronics Co., Ltd. All rights reserved.
+ * Copyright (c) 2021 - 2023 the ThorVG project. All rights reserved.
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -19,6 +19,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
+
#include <memory.h>
#ifdef _WIN32
@@ -357,27 +358,45 @@ static bool _parsePicture(TvgBinBlock block, Paint* paint)
{
auto picture = static_cast<Picture*>(paint);
- //Case1: Image Picture
- if (block.type == TVG_TAG_PICTURE_RAW_IMAGE) {
- if (block.length < 2 * SIZE(uint32_t)) return false;
+ switch (block.type) {
+ case TVG_TAG_PICTURE_RAW_IMAGE: {
+ if (block.length < 2 * SIZE(uint32_t)) return false;
- auto ptr = block.data;
- uint32_t w, h;
+ auto ptr = block.data;
+ uint32_t w, h;
- READ_UI32(&w, ptr);
- ptr += SIZE(uint32_t);
- READ_UI32(&h, ptr);
- ptr += SIZE(uint32_t);
+ READ_UI32(&w, ptr);
+ ptr += SIZE(uint32_t);
+ READ_UI32(&h, ptr);
+ ptr += SIZE(uint32_t);
- auto size = w * h * SIZE(uint32_t);
- if (block.length != 2 * SIZE(uint32_t) + size) return false;
+ auto size = w * h * SIZE(uint32_t);
+ if (block.length != 2 * SIZE(uint32_t) + size) return false;
- picture->load((uint32_t*) ptr, w, h, true);
- return true;
- }
+ picture->load((uint32_t*) ptr, w, h, true);
- //Case2: Base Paint Properties
- if (_parsePaintProperty(block, picture)) return true;
+ return true;
+ }
+ case TVG_TAG_PICTURE_MESH: {
+ if (block.length < 1 * SIZE(uint32_t)) return false;
+
+ auto ptr = block.data;
+ uint32_t meshCnt;
+ READ_UI32(&meshCnt, ptr);
+ ptr += SIZE(uint32_t);
+
+ auto size = meshCnt * SIZE(Polygon);
+ if (block.length != SIZE(uint32_t) + size) return false;
+
+ picture->mesh((Polygon*) ptr, meshCnt);
+
+ return true;
+ }
+ //Base Paint Properties
+ default: {
+ if (_parsePaintProperty(block, picture)) return true;
+ }
+ }
//Vector Picture won't be requested since Saver replaces it with the Scene
return false;
@@ -414,7 +433,7 @@ static Paint* _parsePaint(TvgBinBlock baseBlock)
auto ptr = baseBlock.data;
- //2. Read Subsquent properties of the current paint.
+ //2. Read Subsequent properties of the current paint.
while (ptr < baseBlock.end) {
auto block = _readBlock(ptr);
if (block.end > baseBlock.end) return paint;