summaryrefslogtreecommitdiffstats
path: root/thirdparty/thorvg/src/renderer/tvgRender.h
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2024-08-27 15:54:05 +0200
committerRémi Verschelde <rverschelde@gmail.com>2024-09-17 08:57:46 +0200
commit4abc358952a69427617b0683fd76427a14d6faa8 (patch)
treecc603b1a5e1481e1f1cf0711ea9c68d027bdd904 /thirdparty/thorvg/src/renderer/tvgRender.h
parentf7ad4dca8c9590e34ea3135f0ca84edecc09088b (diff)
downloadredot-engine-4abc358952a69427617b0683fd76427a14d6faa8.tar.gz
thorvg: Update to 0.14.7
Fixes #95861. (cherry picked from commit f16d4af3422ba167e211bcffa9186d6d88a4f228)
Diffstat (limited to 'thirdparty/thorvg/src/renderer/tvgRender.h')
-rw-r--r--thirdparty/thorvg/src/renderer/tvgRender.h95
1 files changed, 66 insertions, 29 deletions
diff --git a/thirdparty/thorvg/src/renderer/tvgRender.h b/thirdparty/thorvg/src/renderer/tvgRender.h
index ff55748033..b0ee42db8d 100644
--- a/thirdparty/thorvg/src/renderer/tvgRender.h
+++ b/thirdparty/thorvg/src/renderer/tvgRender.h
@@ -23,6 +23,7 @@
#ifndef _TVG_RENDER_H_
#define _TVG_RENDER_H_
+#include <math.h>
#include "tvgCommon.h"
#include "tvgArray.h"
#include "tvgLock.h"
@@ -85,15 +86,15 @@ struct Compositor
uint8_t opacity;
};
-struct RenderMesh
+struct Vertex
{
- Polygon* triangles = nullptr;
- uint32_t triangleCnt = 0;
+ Point pt;
+ Point uv;
+};
- ~RenderMesh()
- {
- free(triangles);
- }
+struct Polygon
+{
+ Vertex vertex[3];
};
struct RenderRegion
@@ -110,24 +111,6 @@ struct RenderRegion
}
};
-struct RenderTransform
-{
- Matrix m;
- float degree = 0.0f; //rotation degree
- float scale = 1.0f; //scale factor
- bool overriding = false; //user transform?
-
- void update();
- void override(const Matrix& m);
-
- RenderTransform()
- {
- m.e13 = m.e23 = 0.0f;
- }
-
- RenderTransform(const RenderTransform* lhs, const RenderTransform* rhs);
-};
-
struct RenderStroke
{
float width = 0.0f;
@@ -147,6 +130,57 @@ struct RenderStroke
bool simultaneous = true;
} trim;
+ void operator=(const RenderStroke& rhs)
+ {
+ width = rhs.width;
+
+ memcpy(color, rhs.color, sizeof(color));
+
+ delete(fill);
+ if (rhs.fill) fill = rhs.fill->duplicate();
+ else fill = nullptr;
+
+ free(dashPattern);
+ if (rhs.dashCnt > 0) {
+ dashPattern = static_cast<float*>(malloc(sizeof(float) * rhs.dashCnt));
+ memcpy(dashPattern, rhs.dashPattern, sizeof(float) * rhs.dashCnt);
+ } else {
+ dashPattern = nullptr;
+ }
+ dashCnt = rhs.dashCnt;
+ miterlimit = rhs.miterlimit;
+ cap = rhs.cap;
+ join = rhs.join;
+ strokeFirst = rhs.strokeFirst;
+ trim = rhs.trim;
+ }
+
+ bool strokeTrim(float& begin, float& end) const
+ {
+ begin = trim.begin;
+ end = trim.end;
+
+ if (fabsf(end - begin) >= 1.0f) {
+ begin = 0.0f;
+ end = 1.0f;
+ return false;
+ }
+
+ auto loop = true;
+
+ if (begin > 1.0f && end > 1.0f) loop = false;
+ if (begin < 0.0f && end < 0.0f) loop = false;
+ if (begin >= 0.0f && begin <= 1.0f && end >= 0.0f && end <= 1.0f) loop = false;
+
+ if (begin > 1.0f) begin -= 1.0f;
+ if (begin < 0.0f) begin += 1.0f;
+ if (end > 1.0f) end -= 1.0f;
+ if (end < 0.0f) end += 1.0f;
+
+ if ((loop && begin < end) || (!loop && begin > end)) std::swap(begin, end);
+ return true;
+ }
+
~RenderStroke()
{
free(dashPattern);
@@ -191,7 +225,7 @@ struct RenderShape
{
if (!stroke) return false;
if (stroke->trim.begin == 0.0f && stroke->trim.end == 1.0f) return false;
- if (stroke->trim.begin == 1.0f && stroke->trim.end == 0.0f) return false;
+ if (fabsf(stroke->trim.end - stroke->trim.begin) >= 1.0f) return false;
return true;
}
@@ -252,9 +286,8 @@ public:
uint32_t unref();
virtual ~RenderMethod() {}
- virtual RenderData prepare(const RenderShape& rshape, RenderData data, const RenderTransform* transform, Array<RenderData>& clips, uint8_t opacity, RenderUpdateFlag flags, bool clipper) = 0;
- virtual RenderData prepare(const Array<RenderData>& scene, RenderData data, const RenderTransform* transform, Array<RenderData>& clips, uint8_t opacity, RenderUpdateFlag flags) = 0;
- virtual RenderData prepare(Surface* surface, const RenderMesh* mesh, RenderData data, const RenderTransform* transform, Array<RenderData>& clips, uint8_t opacity, RenderUpdateFlag flags) = 0;
+ virtual RenderData prepare(const RenderShape& rshape, RenderData data, const Matrix& transform, Array<RenderData>& clips, uint8_t opacity, RenderUpdateFlag flags, bool clipper) = 0;
+ virtual RenderData prepare(Surface* surface, RenderData data, const Matrix& transform, Array<RenderData>& clips, uint8_t opacity, RenderUpdateFlag flags) = 0;
virtual bool preRender() = 0;
virtual bool renderShape(RenderData data) = 0;
virtual bool renderImage(RenderData data) = 0;
@@ -288,6 +321,8 @@ static inline bool MASK_REGION_MERGING(CompositeMethod method)
//these might expand the rendering region
case CompositeMethod::AddMask:
case CompositeMethod::DifferenceMask:
+ case CompositeMethod::LightenMask:
+ case CompositeMethod::DarkenMask:
return true;
default:
TVGERR("RENDERER", "Unsupported Composite Method! = %d", (int)method);
@@ -321,6 +356,8 @@ static inline ColorSpace COMPOSITE_TO_COLORSPACE(RenderMethod* renderer, Composi
case CompositeMethod::DifferenceMask:
case CompositeMethod::SubtractMask:
case CompositeMethod::IntersectMask:
+ case CompositeMethod::LightenMask:
+ case CompositeMethod::DarkenMask:
return ColorSpace::Grayscale8;
//TODO: Optimize Luma/InvLuma colorspace to Grayscale8
case CompositeMethod::LumaMask: