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