aboutsummaryrefslogtreecommitdiffhomepage
path: root/experimental/sksg/effects/SkSGTransform.h
diff options
context:
space:
mode:
Diffstat (limited to 'experimental/sksg/effects/SkSGTransform.h')
-rw-r--r--experimental/sksg/effects/SkSGTransform.h50
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;
};