1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2019 Google LLC. 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 SkXform_DEFINED 9cb93a386Sopenharmony_ci#define SkXform_DEFINED 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ci#include "include/core/SkClipOp.h" 12cb93a386Sopenharmony_ci#include "include/core/SkMatrix.h" 13cb93a386Sopenharmony_ci#include "include/core/SkPath.h" 14cb93a386Sopenharmony_ci#include "include/core/SkRRect.h" 15cb93a386Sopenharmony_ci#include "include/core/SkRect.h" 16cb93a386Sopenharmony_ci#include "include/core/SkRefCnt.h" 17cb93a386Sopenharmony_ci 18cb93a386Sopenharmony_ci#include "include/private/SkTDArray.h" 19cb93a386Sopenharmony_ci 20cb93a386Sopenharmony_ciclass XformResolver { 21cb93a386Sopenharmony_cipublic: 22cb93a386Sopenharmony_ci virtual ~XformResolver() {} 23cb93a386Sopenharmony_ci 24cb93a386Sopenharmony_ci virtual void concat(const SkMatrix&) = 0; 25cb93a386Sopenharmony_ci virtual void clipRect(const SkRect&, SkClipOp) = 0; 26cb93a386Sopenharmony_ci virtual void clipRRect(const SkRRect&, SkClipOp) = 0; 27cb93a386Sopenharmony_ci virtual void clipPath(const SkPath&, SkClipOp) = 0; 28cb93a386Sopenharmony_ci}; 29cb93a386Sopenharmony_ci 30cb93a386Sopenharmony_ciclass ClipCache : public SkRefCnt { 31cb93a386Sopenharmony_cipublic: 32cb93a386Sopenharmony_ci ClipCache() {} 33cb93a386Sopenharmony_ci}; 34cb93a386Sopenharmony_ci 35cb93a386Sopenharmony_ciclass Xform : public SkRefCnt { 36cb93a386Sopenharmony_cipublic: 37cb93a386Sopenharmony_ci typedef uint32_t GenID; 38cb93a386Sopenharmony_ci 39cb93a386Sopenharmony_ci Xform* parent() const { return fParent.get(); } 40cb93a386Sopenharmony_ci void setParent(sk_sp<Xform> p); 41cb93a386Sopenharmony_ci 42cb93a386Sopenharmony_ci void visit(XformResolver* resolver); 43cb93a386Sopenharmony_ci 44cb93a386Sopenharmony_ci GenID genID() const { return fGenID; } 45cb93a386Sopenharmony_ci 46cb93a386Sopenharmony_ci bool isCached() const { return !!fClip; } 47cb93a386Sopenharmony_ci void invalidateCaches(); 48cb93a386Sopenharmony_ci 49cb93a386Sopenharmony_ci const SkMatrix& ctm() const { return fCTM; } 50cb93a386Sopenharmony_ci ClipCache* clip() const { return fClip.get(); } 51cb93a386Sopenharmony_ci 52cb93a386Sopenharmony_ci void setCache(const SkMatrix&, sk_sp<ClipCache>); 53cb93a386Sopenharmony_ci 54cb93a386Sopenharmony_ciprotected: 55cb93a386Sopenharmony_ci Xform(sk_sp<Xform> parent = nullptr) { 56cb93a386Sopenharmony_ci if (parent) { 57cb93a386Sopenharmony_ci this->setParent(std::move(parent)); 58cb93a386Sopenharmony_ci } 59cb93a386Sopenharmony_ci } 60cb93a386Sopenharmony_ci 61cb93a386Sopenharmony_ci virtual void onVisit(XformResolver*) {} 62cb93a386Sopenharmony_ci 63cb93a386Sopenharmony_ciprivate: 64cb93a386Sopenharmony_ci sk_sp<Xform> fParent; 65cb93a386Sopenharmony_ci 66cb93a386Sopenharmony_ci // unowned bare pointers 67cb93a386Sopenharmony_ci SkTDArray<Xform*> fChildren; 68cb93a386Sopenharmony_ci 69cb93a386Sopenharmony_ci // cache 70cb93a386Sopenharmony_ci SkMatrix fCTM; 71cb93a386Sopenharmony_ci sk_sp<ClipCache> fClip; 72cb93a386Sopenharmony_ci 73cb93a386Sopenharmony_ci uint32_t fGenID = 0; 74cb93a386Sopenharmony_ci 75cb93a386Sopenharmony_ci static GenID NextGenID(); 76cb93a386Sopenharmony_ci 77cb93a386Sopenharmony_ci void internalInvalidateCaches() { fClip = nullptr; } 78cb93a386Sopenharmony_ci void internalAddChild(Xform*); 79cb93a386Sopenharmony_ci void internalRemoveChild(Xform*); 80cb93a386Sopenharmony_ci 81cb93a386Sopenharmony_ci#ifdef SK_DEBUG 82cb93a386Sopenharmony_ci void debugValidate() const; 83cb93a386Sopenharmony_ci#else 84cb93a386Sopenharmony_ci void debugValidate() const {} 85cb93a386Sopenharmony_ci#endif 86cb93a386Sopenharmony_ci}; 87cb93a386Sopenharmony_ci 88cb93a386Sopenharmony_ci/////////////////////////////////////////////////////////////////////////////////////////////// 89cb93a386Sopenharmony_ci 90cb93a386Sopenharmony_ciclass MatrixXF : public Xform { 91cb93a386Sopenharmony_cipublic: 92cb93a386Sopenharmony_ci static sk_sp<MatrixXF> Make(sk_sp<Xform> parent = nullptr) { 93cb93a386Sopenharmony_ci return sk_sp<MatrixXF>(new MatrixXF(std::move(parent))); 94cb93a386Sopenharmony_ci } 95cb93a386Sopenharmony_ci 96cb93a386Sopenharmony_ci MatrixXF(sk_sp<Xform> parent) : Xform(std::move(parent)) { 97cb93a386Sopenharmony_ci fLocalMatrix.reset(); 98cb93a386Sopenharmony_ci } 99cb93a386Sopenharmony_ci 100cb93a386Sopenharmony_ci void setLocalMatrix(const SkMatrix& m) { 101cb93a386Sopenharmony_ci fLocalMatrix = m; 102cb93a386Sopenharmony_ci } 103cb93a386Sopenharmony_ci void setTranslate(SkScalar sx, SkScalar sy) { 104cb93a386Sopenharmony_ci fLocalMatrix.setTranslate(sx, sy); 105cb93a386Sopenharmony_ci } 106cb93a386Sopenharmony_ci void setScale(SkScalar sx, SkScalar sy) { 107cb93a386Sopenharmony_ci fLocalMatrix.setScale(sx, sy); 108cb93a386Sopenharmony_ci } 109cb93a386Sopenharmony_ci void setRotate(SkScalar degrees) { 110cb93a386Sopenharmony_ci fLocalMatrix.setRotate(degrees); 111cb93a386Sopenharmony_ci } 112cb93a386Sopenharmony_ci 113cb93a386Sopenharmony_ciprotected: 114cb93a386Sopenharmony_ci void onVisit(XformResolver* resolver) override; 115cb93a386Sopenharmony_ci 116cb93a386Sopenharmony_ciprivate: 117cb93a386Sopenharmony_ci SkMatrix fLocalMatrix; 118cb93a386Sopenharmony_ci}; 119cb93a386Sopenharmony_ci 120cb93a386Sopenharmony_ciclass ClipXF : public Xform { 121cb93a386Sopenharmony_cipublic: 122cb93a386Sopenharmony_ci ClipXF(sk_sp<Xform> parent = nullptr) : Xform(std::move(parent)) {} 123cb93a386Sopenharmony_ci ClipXF(sk_sp<Xform> parent, const SkRect& r, SkClipOp op = SkClipOp::kIntersect) 124cb93a386Sopenharmony_ci : Xform(std::move(parent)) 125cb93a386Sopenharmony_ci , fRect(r) 126cb93a386Sopenharmony_ci , fOp(op) 127cb93a386Sopenharmony_ci {} 128cb93a386Sopenharmony_ci 129cb93a386Sopenharmony_ci void setRect(const SkRect& r, SkClipOp op = SkClipOp::kIntersect) { 130cb93a386Sopenharmony_ci fRect = r; 131cb93a386Sopenharmony_ci fOp = op; 132cb93a386Sopenharmony_ci } 133cb93a386Sopenharmony_ci 134cb93a386Sopenharmony_ciprotected: 135cb93a386Sopenharmony_ci void onVisit(XformResolver* resolver) override; 136cb93a386Sopenharmony_ci 137cb93a386Sopenharmony_ciprivate: 138cb93a386Sopenharmony_ci SkRect fRect; 139cb93a386Sopenharmony_ci SkClipOp fOp; 140cb93a386Sopenharmony_ci}; 141cb93a386Sopenharmony_ci 142cb93a386Sopenharmony_ci#endif 143