[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:
Florin Malita 2018-09-12 10:15:34 -04:00 committed by Skia Commit-Bot
parent 558fabb31c
commit 16322637c4
2 changed files with 48 additions and 27 deletions

View File

@ -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;
};

View File

@ -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();
}