diff options
author | Rémi Verschelde <rverschelde@gmail.com> | 2024-08-27 15:54:05 +0200 |
---|---|---|
committer | Rémi Verschelde <rverschelde@gmail.com> | 2024-09-17 08:57:46 +0200 |
commit | 4abc358952a69427617b0683fd76427a14d6faa8 (patch) | |
tree | cc603b1a5e1481e1f1cf0711ea9c68d027bdd904 /thirdparty/thorvg/src/renderer/tvgRender.h | |
parent | f7ad4dca8c9590e34ea3135f0ca84edecc09088b (diff) | |
download | redot-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.h | 95 |
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: |