[sksg] Trim down sksg::Matrix size
Matrix nodes are most often not composed outside of the DAG. Split into a basic Matrix class and a (private) ComposedMatrix subclass. TBR= Bug: skia:8340 Change-Id: I3c182e10ae5fa20d0639c1031523dba3956b75bb Reviewed-on: https://skia-review.googlesource.com/153883 Reviewed-by: Florin Malita <fmalita@chromium.org> Commit-Queue: Florin Malita <fmalita@chromium.org>
This commit is contained in:
parent
558fabb31c
commit
16322637c4
@ -21,25 +21,19 @@ namespace sksg {
|
||||
*/
|
||||
class Matrix : public Node {
|
||||
public:
|
||||
static sk_sp<Matrix> Make(const SkMatrix& m, sk_sp<Matrix> parent = nullptr) {
|
||||
return sk_sp<Matrix>(new Matrix(m, std::move(parent)));
|
||||
}
|
||||
static sk_sp<Matrix> Make(const SkMatrix& m, sk_sp<Matrix> parent = nullptr);
|
||||
|
||||
~Matrix() override;
|
||||
SG_ATTRIBUTE(Matrix, SkMatrix, fMatrix)
|
||||
|
||||
SG_ATTRIBUTE(Matrix, SkMatrix, fLocalMatrix)
|
||||
|
||||
const SkMatrix& getTotalMatrix() const { return fTotalMatrix; }
|
||||
virtual const SkMatrix& getTotalMatrix() const;
|
||||
|
||||
protected:
|
||||
Matrix(const SkMatrix&, sk_sp<Matrix>);
|
||||
explicit Matrix(const SkMatrix&);
|
||||
|
||||
SkRect onRevalidate(InvalidationController*, const SkMatrix&) override;
|
||||
|
||||
private:
|
||||
sk_sp<Matrix> fParent;
|
||||
SkMatrix fLocalMatrix,
|
||||
fTotalMatrix; // cached during revalidation
|
||||
SkMatrix fMatrix;
|
||||
|
||||
typedef Node INHERITED;
|
||||
};
|
||||
|
@ -10,30 +10,57 @@
|
||||
#include "SkCanvas.h"
|
||||
|
||||
namespace sksg {
|
||||
// Matrix nodes don't generate damage on their own, but via aggregation ancestor Transform nodes.
|
||||
Matrix::Matrix(const SkMatrix& m, sk_sp<Matrix> parent)
|
||||
: INHERITED(kBubbleDamage_Trait)
|
||||
, fParent(std::move(parent))
|
||||
, fLocalMatrix(m) {
|
||||
if (fParent) {
|
||||
namespace {
|
||||
|
||||
class ComposedMatrix final : public Matrix {
|
||||
public:
|
||||
ComposedMatrix(const SkMatrix& m, sk_sp<Matrix> parent)
|
||||
: INHERITED(m)
|
||||
, fParent(std::move(parent)) {
|
||||
SkASSERT(fParent);
|
||||
this->observeInval(fParent);
|
||||
}
|
||||
}
|
||||
|
||||
Matrix::~Matrix() {
|
||||
if (fParent) {
|
||||
~ComposedMatrix() override {
|
||||
this->unobserveInval(fParent);
|
||||
}
|
||||
}
|
||||
|
||||
SkRect Matrix::onRevalidate(InvalidationController* ic, const SkMatrix& ctm) {
|
||||
fTotalMatrix = fLocalMatrix;
|
||||
|
||||
if (fParent) {
|
||||
fParent->revalidate(ic, ctm);
|
||||
fTotalMatrix.postConcat(fParent->getTotalMatrix());
|
||||
const SkMatrix& getTotalMatrix() const override {
|
||||
SkASSERT(!this->hasInval());
|
||||
return fTotalMatrix;
|
||||
}
|
||||
|
||||
protected:
|
||||
SkRect onRevalidate(InvalidationController* ic, const SkMatrix& ctm) override {
|
||||
fParent->revalidate(ic, ctm);
|
||||
fTotalMatrix = SkMatrix::Concat(fParent->getTotalMatrix(), this->getMatrix());
|
||||
return SkRect::MakeEmpty();
|
||||
}
|
||||
|
||||
private:
|
||||
const sk_sp<Matrix> fParent;
|
||||
SkMatrix fTotalMatrix; // cached during revalidation.
|
||||
|
||||
using INHERITED = Matrix;
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
sk_sp<Matrix> Matrix::Make(const SkMatrix& m, sk_sp<Matrix> parent) {
|
||||
return sk_sp<Matrix>(parent ? new ComposedMatrix(m, std::move(parent))
|
||||
: new Matrix(m));
|
||||
}
|
||||
|
||||
// Matrix nodes don't generate damage on their own, but via aggregation ancestor Transform nodes.
|
||||
Matrix::Matrix(const SkMatrix& m)
|
||||
: INHERITED(kBubbleDamage_Trait)
|
||||
, fMatrix(m) {}
|
||||
|
||||
const SkMatrix& Matrix::getTotalMatrix() const {
|
||||
return fMatrix;
|
||||
}
|
||||
|
||||
SkRect Matrix::onRevalidate(InvalidationController*, const SkMatrix&) {
|
||||
return SkRect::MakeEmpty();
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user