You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
2.4 KiB
105 lines
2.4 KiB
/*
|
|
* Copyright 2019 Google LLC.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
|
|
#ifndef SkShape_DEFINED
|
|
#define SkShape_DEFINED
|
|
|
|
#include "experimental/xform/SkXform.h"
|
|
#include "include/core/SkPaint.h"
|
|
|
|
class SkCanvas;
|
|
|
|
class XContext {
|
|
public:
|
|
virtual ~XContext() {}
|
|
|
|
void push(Xform* parentXform) { this->onPush(parentXform); }
|
|
void pop() { this->onPop(); }
|
|
|
|
void drawRect(const SkRect&, const SkPaint&, Xform* localXform);
|
|
|
|
static std::unique_ptr<XContext> Make(SkCanvas*);
|
|
|
|
protected:
|
|
virtual void onPush(Xform*) = 0;
|
|
virtual void onPop() = 0;
|
|
|
|
virtual void onDrawRect(const SkRect&, const SkPaint&, Xform*) = 0;
|
|
};
|
|
|
|
class Shape : public SkRefCnt {
|
|
sk_sp<Xform> fXform;
|
|
|
|
public:
|
|
Shape(sk_sp<Xform> x = nullptr) : fXform(std::move(x)) {}
|
|
|
|
Xform* xform() const { return fXform.get(); }
|
|
void setXform(sk_sp<Xform> x) {
|
|
fXform = std::move(x);
|
|
}
|
|
|
|
virtual void draw(XContext*) {}
|
|
};
|
|
|
|
class GeoShape : public Shape {
|
|
SkRect fRect;
|
|
SkPaint fPaint;
|
|
|
|
GeoShape(sk_sp<Xform> x, const SkRect& r, SkColor c) : Shape(std::move(x)), fRect(r) {
|
|
fPaint.setColor(c);
|
|
}
|
|
|
|
public:
|
|
static sk_sp<Shape> Make(sk_sp<Xform> x, const SkRect& r, SkColor c) {
|
|
return sk_sp<Shape>(new GeoShape(std::move(x), r, c));
|
|
}
|
|
|
|
void draw(XContext*) override;
|
|
};
|
|
|
|
class GroupShape : public Shape {
|
|
SkTDArray<Shape*> fArray;
|
|
|
|
GroupShape(sk_sp<Xform> x) : Shape(std::move(x)) {}
|
|
|
|
public:
|
|
static sk_sp<GroupShape> Make(sk_sp<Xform> x = nullptr) {
|
|
return sk_sp<GroupShape>(new GroupShape(std::move(x)));
|
|
}
|
|
|
|
static sk_sp<GroupShape> Make(sk_sp<Xform> x, sk_sp<Shape> s) {
|
|
auto g = sk_sp<GroupShape>(new GroupShape(std::move(x)));
|
|
g->append(std::move(s));
|
|
return g;
|
|
}
|
|
|
|
~GroupShape() override {
|
|
fArray.unrefAll();
|
|
}
|
|
|
|
int count() const { return fArray.count(); }
|
|
Shape* get(int index) const { return fArray[index]; }
|
|
void set(int index, sk_sp<Shape> s) {
|
|
fArray[index] = s.release();
|
|
}
|
|
|
|
void append(sk_sp<Shape> s) {
|
|
*fArray.append() = s.release();
|
|
}
|
|
void insert(int index, sk_sp<Shape> s) {
|
|
*fArray.insert(index) = s.release();
|
|
}
|
|
void remove(int index) {
|
|
SkSafeUnref(fArray[index]);
|
|
fArray.remove(index);
|
|
}
|
|
|
|
void draw(XContext*) override ;
|
|
};
|
|
|
|
#endif
|