diff options
Diffstat (limited to 'experimental/sksg/effects/SkSGTransform.h')
-rw-r--r-- | experimental/sksg/effects/SkSGTransform.h | 50 |
1 files changed, 44 insertions, 6 deletions
diff --git a/experimental/sksg/effects/SkSGTransform.h b/experimental/sksg/effects/SkSGTransform.h index 8a97a679ed..0d11739f30 100644 --- a/experimental/sksg/effects/SkSGTransform.h +++ b/experimental/sksg/effects/SkSGTransform.h @@ -15,25 +15,63 @@ namespace sksg { /** - * Concrete Effect node, wrapping an SkMatrix. + * Concrete node, wrapping an SkMatrix, with an optional parent Matrix (to allow chaining): + * + * M' = parent x M + */ +class Matrix : public Node { +public: + static sk_sp<Matrix> Make(const SkMatrix& m, sk_sp<Matrix> parent = nullptr) { + return sk_sp<Matrix>(new Matrix(m, std::move(parent))); + } + + ~Matrix() override; + + SG_ATTRIBUTE(Matrix, SkMatrix, fLocalMatrix) + + const SkMatrix& getTotalMatrix() const { return fTotalMatrix; } + +protected: + explicit Matrix(const SkMatrix&, sk_sp<Matrix>); + + RevalidationResult onRevalidate(InvalidationController*, const SkMatrix&) override; + +private: + sk_sp<Matrix> fParent; + SkMatrix fLocalMatrix, + fTotalMatrix; // cached during revalidation + + typedef Node INHERITED; +}; + +/** + * Concrete Effect node, binding a Matrix to a RenderNode. */ class Transform : public EffectNode { public: - static sk_sp<Transform> Make(sk_sp<RenderNode> child, const SkMatrix& matrix) { - return sk_sp<Transform>(new Transform(std::move(child), matrix)); + static sk_sp<Transform> Make(sk_sp<RenderNode> child, sk_sp<Matrix> matrix) { + return child && matrix + ? sk_sp<Transform>(new Transform(std::move(child), std::move(matrix))) + : nullptr; } - SG_ATTRIBUTE(Matrix, SkMatrix, fMatrix) + static sk_sp<Transform> Make(sk_sp<RenderNode> child, const SkMatrix& m) { + return Make(std::move(child), Matrix::Make(m)); + } + + ~Transform() override; + + const sk_sp<Matrix>& getMatrix() const { return fMatrix; } protected: - Transform(sk_sp<RenderNode>, const SkMatrix&); + Transform(sk_sp<RenderNode>, sk_sp<Matrix>); void onRender(SkCanvas*) const override; RevalidationResult onRevalidate(InvalidationController*, const SkMatrix&) override; private: - SkMatrix fMatrix; + sk_sp<Matrix> fMatrix; typedef EffectNode INHERITED; }; |