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 SkShape_DEFINED 9cb93a386Sopenharmony_ci#define SkShape_DEFINED 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ci#include "experimental/xform/SkXform.h" 12cb93a386Sopenharmony_ci#include "include/core/SkPaint.h" 13cb93a386Sopenharmony_ci 14cb93a386Sopenharmony_ciclass SkCanvas; 15cb93a386Sopenharmony_ci 16cb93a386Sopenharmony_ciclass XContext { 17cb93a386Sopenharmony_cipublic: 18cb93a386Sopenharmony_ci virtual ~XContext() {} 19cb93a386Sopenharmony_ci 20cb93a386Sopenharmony_ci void push(Xform* parentXform) { this->onPush(parentXform); } 21cb93a386Sopenharmony_ci void pop() { this->onPop(); } 22cb93a386Sopenharmony_ci 23cb93a386Sopenharmony_ci void drawRect(const SkRect&, const SkPaint&, Xform* localXform); 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_ci static std::unique_ptr<XContext> Make(SkCanvas*); 26cb93a386Sopenharmony_ci 27cb93a386Sopenharmony_ciprotected: 28cb93a386Sopenharmony_ci virtual void onPush(Xform*) = 0; 29cb93a386Sopenharmony_ci virtual void onPop() = 0; 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_ci virtual void onDrawRect(const SkRect&, const SkPaint&, Xform*) = 0; 32cb93a386Sopenharmony_ci}; 33cb93a386Sopenharmony_ci 34cb93a386Sopenharmony_ciclass Shape : public SkRefCnt { 35cb93a386Sopenharmony_ci sk_sp<Xform> fXform; 36cb93a386Sopenharmony_ci 37cb93a386Sopenharmony_cipublic: 38cb93a386Sopenharmony_ci Shape(sk_sp<Xform> x = nullptr) : fXform(std::move(x)) {} 39cb93a386Sopenharmony_ci 40cb93a386Sopenharmony_ci Xform* xform() const { return fXform.get(); } 41cb93a386Sopenharmony_ci void setXform(sk_sp<Xform> x) { 42cb93a386Sopenharmony_ci fXform = std::move(x); 43cb93a386Sopenharmony_ci } 44cb93a386Sopenharmony_ci 45cb93a386Sopenharmony_ci virtual void draw(XContext*) {} 46cb93a386Sopenharmony_ci}; 47cb93a386Sopenharmony_ci 48cb93a386Sopenharmony_ciclass GeoShape : public Shape { 49cb93a386Sopenharmony_ci SkRect fRect; 50cb93a386Sopenharmony_ci SkPaint fPaint; 51cb93a386Sopenharmony_ci 52cb93a386Sopenharmony_ci GeoShape(sk_sp<Xform> x, const SkRect& r, SkColor c) : Shape(std::move(x)), fRect(r) { 53cb93a386Sopenharmony_ci fPaint.setColor(c); 54cb93a386Sopenharmony_ci } 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_cipublic: 57cb93a386Sopenharmony_ci static sk_sp<Shape> Make(sk_sp<Xform> x, const SkRect& r, SkColor c) { 58cb93a386Sopenharmony_ci return sk_sp<Shape>(new GeoShape(std::move(x), r, c)); 59cb93a386Sopenharmony_ci } 60cb93a386Sopenharmony_ci 61cb93a386Sopenharmony_ci void draw(XContext*) override; 62cb93a386Sopenharmony_ci}; 63cb93a386Sopenharmony_ci 64cb93a386Sopenharmony_ciclass GroupShape : public Shape { 65cb93a386Sopenharmony_ci SkTDArray<Shape*> fArray; 66cb93a386Sopenharmony_ci 67cb93a386Sopenharmony_ci GroupShape(sk_sp<Xform> x) : Shape(std::move(x)) {} 68cb93a386Sopenharmony_ci 69cb93a386Sopenharmony_cipublic: 70cb93a386Sopenharmony_ci static sk_sp<GroupShape> Make(sk_sp<Xform> x = nullptr) { 71cb93a386Sopenharmony_ci return sk_sp<GroupShape>(new GroupShape(std::move(x))); 72cb93a386Sopenharmony_ci } 73cb93a386Sopenharmony_ci 74cb93a386Sopenharmony_ci static sk_sp<GroupShape> Make(sk_sp<Xform> x, sk_sp<Shape> s) { 75cb93a386Sopenharmony_ci auto g = sk_sp<GroupShape>(new GroupShape(std::move(x))); 76cb93a386Sopenharmony_ci g->append(std::move(s)); 77cb93a386Sopenharmony_ci return g; 78cb93a386Sopenharmony_ci } 79cb93a386Sopenharmony_ci 80cb93a386Sopenharmony_ci ~GroupShape() override { 81cb93a386Sopenharmony_ci fArray.unrefAll(); 82cb93a386Sopenharmony_ci } 83cb93a386Sopenharmony_ci 84cb93a386Sopenharmony_ci int count() const { return fArray.count(); } 85cb93a386Sopenharmony_ci Shape* get(int index) const { return fArray[index]; } 86cb93a386Sopenharmony_ci void set(int index, sk_sp<Shape> s) { 87cb93a386Sopenharmony_ci fArray[index] = s.release(); 88cb93a386Sopenharmony_ci } 89cb93a386Sopenharmony_ci 90cb93a386Sopenharmony_ci void append(sk_sp<Shape> s) { 91cb93a386Sopenharmony_ci *fArray.append() = s.release(); 92cb93a386Sopenharmony_ci } 93cb93a386Sopenharmony_ci void insert(int index, sk_sp<Shape> s) { 94cb93a386Sopenharmony_ci *fArray.insert(index) = s.release(); 95cb93a386Sopenharmony_ci } 96cb93a386Sopenharmony_ci void remove(int index) { 97cb93a386Sopenharmony_ci SkSafeUnref(fArray[index]); 98cb93a386Sopenharmony_ci fArray.remove(index); 99cb93a386Sopenharmony_ci } 100cb93a386Sopenharmony_ci 101cb93a386Sopenharmony_ci void draw(XContext*) override ; 102cb93a386Sopenharmony_ci}; 103cb93a386Sopenharmony_ci 104cb93a386Sopenharmony_ci#endif 105