1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2017 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkSGRect_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define SkSGRect_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPath.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPathTypes.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRRect.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTo.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "modules/sksg/include/SkSGGeometryNode.h" 19*c8dee2aaSAndroid Build Coastguard Worker #include "modules/sksg/include/SkSGNode.h" 20*c8dee2aaSAndroid Build Coastguard Worker 21*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 22*c8dee2aaSAndroid Build Coastguard Worker 23*c8dee2aaSAndroid Build Coastguard Worker class SkCanvas; 24*c8dee2aaSAndroid Build Coastguard Worker class SkMatrix; 25*c8dee2aaSAndroid Build Coastguard Worker class SkPaint; 26*c8dee2aaSAndroid Build Coastguard Worker struct SkPoint; 27*c8dee2aaSAndroid Build Coastguard Worker 28*c8dee2aaSAndroid Build Coastguard Worker namespace sksg { 29*c8dee2aaSAndroid Build Coastguard Worker class InvalidationController; 30*c8dee2aaSAndroid Build Coastguard Worker 31*c8dee2aaSAndroid Build Coastguard Worker /** 32*c8dee2aaSAndroid Build Coastguard Worker * Concrete Geometry node, wrapping an SkRect. 33*c8dee2aaSAndroid Build Coastguard Worker */ 34*c8dee2aaSAndroid Build Coastguard Worker class Rect final : public GeometryNode { 35*c8dee2aaSAndroid Build Coastguard Worker public: Make()36*c8dee2aaSAndroid Build Coastguard Worker static sk_sp<Rect> Make() { return sk_sp<Rect>(new Rect(SkRect::MakeEmpty())); } Make(const SkRect & r)37*c8dee2aaSAndroid Build Coastguard Worker static sk_sp<Rect> Make(const SkRect& r) { return sk_sp<Rect>(new Rect(r)); } 38*c8dee2aaSAndroid Build Coastguard Worker 39*c8dee2aaSAndroid Build Coastguard Worker SG_ATTRIBUTE(L, SkScalar, fRect.fLeft ) 40*c8dee2aaSAndroid Build Coastguard Worker SG_ATTRIBUTE(T, SkScalar, fRect.fTop ) 41*c8dee2aaSAndroid Build Coastguard Worker SG_ATTRIBUTE(R, SkScalar, fRect.fRight ) 42*c8dee2aaSAndroid Build Coastguard Worker SG_ATTRIBUTE(B, SkScalar, fRect.fBottom) 43*c8dee2aaSAndroid Build Coastguard Worker 44*c8dee2aaSAndroid Build Coastguard Worker SG_MAPPED_ATTRIBUTE(Direction , SkPathDirection, fAttrContaier) 45*c8dee2aaSAndroid Build Coastguard Worker SG_MAPPED_ATTRIBUTE(InitialPointIndex, uint8_t , fAttrContaier) 46*c8dee2aaSAndroid Build Coastguard Worker 47*c8dee2aaSAndroid Build Coastguard Worker protected: 48*c8dee2aaSAndroid Build Coastguard Worker void onClip(SkCanvas*, bool antiAlias) const override; 49*c8dee2aaSAndroid Build Coastguard Worker void onDraw(SkCanvas*, const SkPaint&) const override; 50*c8dee2aaSAndroid Build Coastguard Worker bool onContains(const SkPoint&) const override; 51*c8dee2aaSAndroid Build Coastguard Worker 52*c8dee2aaSAndroid Build Coastguard Worker SkRect onRevalidate(InvalidationController*, const SkMatrix&) override; 53*c8dee2aaSAndroid Build Coastguard Worker SkPath onAsPath() const override; 54*c8dee2aaSAndroid Build Coastguard Worker 55*c8dee2aaSAndroid Build Coastguard Worker private: 56*c8dee2aaSAndroid Build Coastguard Worker explicit Rect(const SkRect&); 57*c8dee2aaSAndroid Build Coastguard Worker 58*c8dee2aaSAndroid Build Coastguard Worker SkRect fRect; 59*c8dee2aaSAndroid Build Coastguard Worker 60*c8dee2aaSAndroid Build Coastguard Worker struct AttrContainer { 61*c8dee2aaSAndroid Build Coastguard Worker uint8_t fDirection : 1; 62*c8dee2aaSAndroid Build Coastguard Worker uint8_t fInitialPointIndex : 2; 63*c8dee2aaSAndroid Build Coastguard Worker getDirectionAttrContainer64*c8dee2aaSAndroid Build Coastguard Worker SkPathDirection getDirection() const { 65*c8dee2aaSAndroid Build Coastguard Worker return static_cast<SkPathDirection>(fDirection); 66*c8dee2aaSAndroid Build Coastguard Worker } setDirectionAttrContainer67*c8dee2aaSAndroid Build Coastguard Worker void setDirection(SkPathDirection dir) { fDirection = SkTo<uint8_t>(dir); } 68*c8dee2aaSAndroid Build Coastguard Worker getInitialPointIndexAttrContainer69*c8dee2aaSAndroid Build Coastguard Worker uint8_t getInitialPointIndex() const { return fInitialPointIndex; } setInitialPointIndexAttrContainer70*c8dee2aaSAndroid Build Coastguard Worker void setInitialPointIndex(uint8_t idx) { fInitialPointIndex = idx; } 71*c8dee2aaSAndroid Build Coastguard Worker }; 72*c8dee2aaSAndroid Build Coastguard Worker AttrContainer fAttrContaier = { (int)SkPathDirection::kCW, 0 }; 73*c8dee2aaSAndroid Build Coastguard Worker 74*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = GeometryNode; 75*c8dee2aaSAndroid Build Coastguard Worker }; 76*c8dee2aaSAndroid Build Coastguard Worker 77*c8dee2aaSAndroid Build Coastguard Worker /** 78*c8dee2aaSAndroid Build Coastguard Worker * Concrete Geometry node, wrapping an SkRRect. 79*c8dee2aaSAndroid Build Coastguard Worker */ 80*c8dee2aaSAndroid Build Coastguard Worker class RRect final : public GeometryNode { 81*c8dee2aaSAndroid Build Coastguard Worker public: Make()82*c8dee2aaSAndroid Build Coastguard Worker static sk_sp<RRect> Make() { return sk_sp<RRect>(new RRect(SkRRect())); } Make(const SkRRect & rr)83*c8dee2aaSAndroid Build Coastguard Worker static sk_sp<RRect> Make(const SkRRect& rr) { return sk_sp<RRect>(new RRect(rr)); } 84*c8dee2aaSAndroid Build Coastguard Worker 85*c8dee2aaSAndroid Build Coastguard Worker SG_ATTRIBUTE(RRect, SkRRect, fRRect) 86*c8dee2aaSAndroid Build Coastguard Worker 87*c8dee2aaSAndroid Build Coastguard Worker SG_MAPPED_ATTRIBUTE(Direction , SkPathDirection, fAttrContaier) 88*c8dee2aaSAndroid Build Coastguard Worker SG_MAPPED_ATTRIBUTE(InitialPointIndex, uint8_t , fAttrContaier) 89*c8dee2aaSAndroid Build Coastguard Worker 90*c8dee2aaSAndroid Build Coastguard Worker protected: 91*c8dee2aaSAndroid Build Coastguard Worker void onClip(SkCanvas*, bool antiAlias) const override; 92*c8dee2aaSAndroid Build Coastguard Worker void onDraw(SkCanvas*, const SkPaint&) const override; 93*c8dee2aaSAndroid Build Coastguard Worker bool onContains(const SkPoint&) const override; 94*c8dee2aaSAndroid Build Coastguard Worker 95*c8dee2aaSAndroid Build Coastguard Worker SkRect onRevalidate(InvalidationController*, const SkMatrix&) override; 96*c8dee2aaSAndroid Build Coastguard Worker SkPath onAsPath() const override; 97*c8dee2aaSAndroid Build Coastguard Worker 98*c8dee2aaSAndroid Build Coastguard Worker private: 99*c8dee2aaSAndroid Build Coastguard Worker explicit RRect(const SkRRect&); 100*c8dee2aaSAndroid Build Coastguard Worker 101*c8dee2aaSAndroid Build Coastguard Worker SkRRect fRRect; 102*c8dee2aaSAndroid Build Coastguard Worker 103*c8dee2aaSAndroid Build Coastguard Worker struct AttrContainer { 104*c8dee2aaSAndroid Build Coastguard Worker uint8_t fDirection : 1; 105*c8dee2aaSAndroid Build Coastguard Worker uint8_t fInitialPointIndex : 2; 106*c8dee2aaSAndroid Build Coastguard Worker getDirectionAttrContainer107*c8dee2aaSAndroid Build Coastguard Worker SkPathDirection getDirection() const { 108*c8dee2aaSAndroid Build Coastguard Worker return static_cast<SkPathDirection>(fDirection); 109*c8dee2aaSAndroid Build Coastguard Worker } setDirectionAttrContainer110*c8dee2aaSAndroid Build Coastguard Worker void setDirection(SkPathDirection dir) { fDirection = SkTo<uint8_t>(dir); } 111*c8dee2aaSAndroid Build Coastguard Worker getInitialPointIndexAttrContainer112*c8dee2aaSAndroid Build Coastguard Worker uint8_t getInitialPointIndex() const { return fInitialPointIndex; } setInitialPointIndexAttrContainer113*c8dee2aaSAndroid Build Coastguard Worker void setInitialPointIndex(uint8_t idx) { fInitialPointIndex = idx; } 114*c8dee2aaSAndroid Build Coastguard Worker }; 115*c8dee2aaSAndroid Build Coastguard Worker AttrContainer fAttrContaier = { (int)SkPathDirection::kCW, 0 }; 116*c8dee2aaSAndroid Build Coastguard Worker 117*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = GeometryNode; 118*c8dee2aaSAndroid Build Coastguard Worker }; 119*c8dee2aaSAndroid Build Coastguard Worker 120*c8dee2aaSAndroid Build Coastguard Worker } // namespace sksg 121*c8dee2aaSAndroid Build Coastguard Worker 122*c8dee2aaSAndroid Build Coastguard Worker #endif // SkSGRect_DEFINED 123