1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2017 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#ifndef SkSGTransform_DEFINED 9cb93a386Sopenharmony_ci#define SkSGTransform_DEFINED 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ci#include "modules/sksg/include/SkSGEffectNode.h" 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_ciclass SkM44; 14cb93a386Sopenharmony_ciclass SkMatrix; 15cb93a386Sopenharmony_ci 16cb93a386Sopenharmony_cinamespace sksg { 17cb93a386Sopenharmony_ci 18cb93a386Sopenharmony_ci/** 19cb93a386Sopenharmony_ci * Transformations base class. 20cb93a386Sopenharmony_ci */ 21cb93a386Sopenharmony_ciclass Transform : public Node { 22cb93a386Sopenharmony_cipublic: 23cb93a386Sopenharmony_ci // Compose T' = A x B 24cb93a386Sopenharmony_ci static sk_sp<Transform> MakeConcat(sk_sp<Transform> a, sk_sp<Transform> b); 25cb93a386Sopenharmony_ci 26cb93a386Sopenharmony_ci // T' = Inv(T) 27cb93a386Sopenharmony_ci static sk_sp<Transform> MakeInverse(sk_sp<Transform> t); 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_ciprotected: 30cb93a386Sopenharmony_ci Transform(); 31cb93a386Sopenharmony_ci 32cb93a386Sopenharmony_ci virtual bool is44() const = 0; 33cb93a386Sopenharmony_ci 34cb93a386Sopenharmony_ci virtual SkMatrix asMatrix() const = 0; 35cb93a386Sopenharmony_ci virtual SkM44 asM44 () const = 0; 36cb93a386Sopenharmony_ci 37cb93a386Sopenharmony_ciprivate: 38cb93a386Sopenharmony_ci friend class TransformPriv; 39cb93a386Sopenharmony_ci 40cb93a386Sopenharmony_ci using INHERITED = Node; 41cb93a386Sopenharmony_ci}; 42cb93a386Sopenharmony_ci 43cb93a386Sopenharmony_ci/** 44cb93a386Sopenharmony_ci * Concrete, matrix-backed Transform. 45cb93a386Sopenharmony_ci * 46cb93a386Sopenharmony_ci * Supported instantiations: SkMatrix, SkM44. 47cb93a386Sopenharmony_ci * 48cb93a386Sopenharmony_ci * Sample use: 49cb93a386Sopenharmony_ci * 50cb93a386Sopenharmony_ci * auto m33 = Matrix<SkMatrix>::Make(SkMatrix::I()); 51cb93a386Sopenharmony_ci * ... 52cb93a386Sopenharmony_ci * m33->setMatrix(SkMatrix::Translate(10, 10)); 53cb93a386Sopenharmony_ci * 54cb93a386Sopenharmony_ci */ 55cb93a386Sopenharmony_citemplate <typename T> 56cb93a386Sopenharmony_ciclass Matrix final : public Transform { 57cb93a386Sopenharmony_cipublic: 58cb93a386Sopenharmony_ci template <typename = std::enable_if<std::is_same<T, SkMatrix>::value || 59cb93a386Sopenharmony_ci std::is_same<T, SkM44 >::value>> 60cb93a386Sopenharmony_ci static sk_sp<Matrix> Make(const T& m) { return sk_sp<Matrix>(new Matrix(m)); } 61cb93a386Sopenharmony_ci 62cb93a386Sopenharmony_ci SG_ATTRIBUTE(Matrix, T, fMatrix) 63cb93a386Sopenharmony_ci 64cb93a386Sopenharmony_ciprotected: 65cb93a386Sopenharmony_ci explicit Matrix(const T& m) : fMatrix(m) {} 66cb93a386Sopenharmony_ci 67cb93a386Sopenharmony_ci SkRect onRevalidate(InvalidationController*, const SkMatrix&) override { 68cb93a386Sopenharmony_ci return SkRect::MakeEmpty(); 69cb93a386Sopenharmony_ci } 70cb93a386Sopenharmony_ci 71cb93a386Sopenharmony_ci bool is44() const override { return std::is_same<T, SkM44>::value; } 72cb93a386Sopenharmony_ci 73cb93a386Sopenharmony_ci SkMatrix asMatrix() const override; 74cb93a386Sopenharmony_ci SkM44 asM44 () const override; 75cb93a386Sopenharmony_ci 76cb93a386Sopenharmony_ciprivate: 77cb93a386Sopenharmony_ci T fMatrix; 78cb93a386Sopenharmony_ci 79cb93a386Sopenharmony_ci using INHERITED = Transform; 80cb93a386Sopenharmony_ci}; 81cb93a386Sopenharmony_ci 82cb93a386Sopenharmony_ci/** 83cb93a386Sopenharmony_ci * Concrete Effect node, binding a Transform to a RenderNode. 84cb93a386Sopenharmony_ci */ 85cb93a386Sopenharmony_ciclass TransformEffect final : public EffectNode { 86cb93a386Sopenharmony_cipublic: 87cb93a386Sopenharmony_ci static sk_sp<TransformEffect> Make(sk_sp<RenderNode> child, sk_sp<Transform> transform) { 88cb93a386Sopenharmony_ci return child && transform 89cb93a386Sopenharmony_ci ? sk_sp<TransformEffect>(new TransformEffect(std::move(child), std::move(transform))) 90cb93a386Sopenharmony_ci : nullptr; 91cb93a386Sopenharmony_ci } 92cb93a386Sopenharmony_ci 93cb93a386Sopenharmony_ci static sk_sp<TransformEffect> Make(sk_sp<RenderNode> child, const SkMatrix& m) { 94cb93a386Sopenharmony_ci return Make(std::move(child), Matrix<SkMatrix>::Make(m)); 95cb93a386Sopenharmony_ci } 96cb93a386Sopenharmony_ci 97cb93a386Sopenharmony_ci ~TransformEffect() override; 98cb93a386Sopenharmony_ci 99cb93a386Sopenharmony_ci const sk_sp<Transform>& getTransform() const { return fTransform; } 100cb93a386Sopenharmony_ci 101cb93a386Sopenharmony_ciprotected: 102cb93a386Sopenharmony_ci void onRender(SkCanvas*, const RenderContext*) const override; 103cb93a386Sopenharmony_ci const RenderNode* onNodeAt(const SkPoint&) const override; 104cb93a386Sopenharmony_ci 105cb93a386Sopenharmony_ci SkRect onRevalidate(InvalidationController*, const SkMatrix&) override; 106cb93a386Sopenharmony_ci 107cb93a386Sopenharmony_ciprivate: 108cb93a386Sopenharmony_ci TransformEffect(sk_sp<RenderNode>, sk_sp<Transform>); 109cb93a386Sopenharmony_ci 110cb93a386Sopenharmony_ci const sk_sp<Transform> fTransform; 111cb93a386Sopenharmony_ci 112cb93a386Sopenharmony_ci using INHERITED = EffectNode; 113cb93a386Sopenharmony_ci}; 114cb93a386Sopenharmony_ci 115cb93a386Sopenharmony_ci} // namespace sksg 116cb93a386Sopenharmony_ci 117cb93a386Sopenharmony_ci#endif // SkSGTransform_DEFINED 118