| // |
| // Copyright 2022 Rive |
| // |
| |
| #ifndef _RIVE_TESS_RENDERER_HPP_ |
| #define _RIVE_TESS_RENDERER_HPP_ |
| |
| #include "rive/renderer.hpp" |
| #include "rive/tess/sub_path.hpp" |
| #include "rive/math/mat2d.hpp" |
| #include "rive/math/mat4.hpp" |
| #include <vector> |
| #include <list> |
| |
| namespace rive { |
| |
| struct RenderState { |
| Mat2D transform; |
| std::vector<SubPath> clipPaths; |
| }; |
| |
| class TessRenderer : public Renderer { |
| protected: |
| Mat4 m_Projection; |
| std::list<RenderState> m_Stack; |
| bool m_IsClippingDirty = false; |
| std::vector<SubPath> m_ClipPaths; |
| |
| public: |
| TessRenderer(); |
| |
| void projection(const Mat4& value); |
| virtual void orthographicProjection( |
| float left, float right, float bottom, float top, float near, float far) = 0; |
| |
| /// |
| /// Checks if clipping is dirty and clears the clipping flag. Hard |
| /// expectation for whoever checks this to also apply it. That's why |
| /// it's not marked const. |
| /// |
| bool needsToApplyClipping(); |
| |
| void save() override; |
| void restore() override; |
| void transform(const Mat2D& transform) override; |
| const Mat2D& transform() { return m_Stack.back().transform; } |
| void clipPath(RenderPath* path) override; |
| void drawPath(RenderPath* path, RenderPaint* paint) override; |
| void drawImage(const RenderImage*, BlendMode, float opacity) override; |
| void drawImageMesh(const RenderImage*, |
| rcp<RenderBuffer> vertices_f32, |
| rcp<RenderBuffer> uvCoords_f32, |
| rcp<RenderBuffer> indices_u16, |
| BlendMode, |
| float opacity) override; |
| }; |
| } // namespace rive |
| #endif |