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

/*
* 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