aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Reed <reed@google.com>2010-03-23 14:53:19 -0400
committerMike Reed <reed@google.com>2010-03-23 14:53:19 -0400
commit2be249260de3c70ec6780caf1a4f32be19319d46 (patch)
treef8fe6fc89cf6ab5661b069941c194dd22e93e96e
parentcaee1c3bee3145df77d201e43b0128860546b694 (diff)
downloadskia-2be249260de3c70ec6780caf1a4f32be19319d46.tar.gz
add inherit-from-root-transform flag
Change-Id: I9ffdb50bde0c53070611c7dc626c384eca0906ea
-rw-r--r--include/utils/SkLayer.h7
-rw-r--r--src/utils/SkLayer.cpp33
2 files changed, 33 insertions, 7 deletions
diff --git a/include/utils/SkLayer.h b/include/utils/SkLayer.h
index c8dea484dd..d346c2f915 100644
--- a/include/utils/SkLayer.h
+++ b/include/utils/SkLayer.h
@@ -34,6 +34,7 @@ public:
SkLayer(const SkLayer&);
virtual ~SkLayer();
+ bool isInheritFromRootTransform() const;
SkScalar getOpacity() const { return m_opacity; }
const SkSize& getSize() const { return m_size; }
const SkPoint& getPosition() const { return m_position; }
@@ -44,6 +45,7 @@ public:
SkScalar getWidth() const { return m_size.width(); }
SkScalar getHeight() const { return m_size.height(); }
+ void setInheritFromRootTransform(bool);
void setOpacity(SkScalar opacity) { m_opacity = opacity; }
void setSize(SkScalar w, SkScalar h) { m_size.set(w, h); }
void setPosition(SkScalar x, SkScalar y) { m_position.set(x, y); }
@@ -112,6 +114,10 @@ protected:
virtual void onDraw(SkCanvas*, SkScalar opacity);
private:
+ enum Flags {
+ kInheritFromRootTransform_Flag = 0x01
+ };
+
SkLayer* fParent;
SkScalar m_opacity;
SkSize m_size;
@@ -119,6 +125,7 @@ private:
SkPoint m_anchorPoint;
SkMatrix fMatrix;
SkMatrix fChildrenMatrix;
+ uint32_t fFlags;
SkTDArray<SkLayer*> m_children;
};
diff --git a/src/utils/SkLayer.cpp b/src/utils/SkLayer.cpp
index 888afec99e..d1503de74d 100644
--- a/src/utils/SkLayer.cpp
+++ b/src/utils/SkLayer.cpp
@@ -19,6 +19,7 @@ SkLayer::SkLayer() {
fMatrix.reset();
fChildrenMatrix.reset();
+ fFlags = 0;
#ifdef DEBUG_TRACK_NEW_DELETE
gLayerAllocCount += 1;
@@ -35,6 +36,7 @@ SkLayer::SkLayer(const SkLayer& src) {
fMatrix = src.fMatrix;
fChildrenMatrix = src.fChildrenMatrix;
+ fFlags = src.fFlags;
#ifdef DEBUG_TRACK_NEW_DELETE
gLayerAllocCount += 1;
@@ -53,6 +55,18 @@ SkLayer::~SkLayer() {
///////////////////////////////////////////////////////////////////////////////
+bool SkLayer::isInheritFromRootTransform() const {
+ return (fFlags & kInheritFromRootTransform_Flag) != 0;
+}
+
+void SkLayer::setInheritFromRootTransform(bool doInherit) {
+ if (doInherit) {
+ fFlags |= kInheritFromRootTransform_Flag;
+ } else {
+ fFlags &= ~kInheritFromRootTransform_Flag;
+ }
+}
+
void SkLayer::setMatrix(const SkMatrix& matrix) {
fMatrix = matrix;
}
@@ -126,6 +140,11 @@ void SkLayer::getLocalTransform(SkMatrix* matrix) const {
void SkLayer::localToGlobal(SkMatrix* matrix) const {
this->getLocalTransform(matrix);
+ if (this->isInheritFromRootTransform()) {
+ matrix->postConcat(this->getRootLayer()->getMatrix());
+ return;
+ }
+
const SkLayer* layer = this;
while (layer->fParent != NULL) {
layer = layer->fParent;
@@ -165,13 +184,13 @@ void SkLayer::draw(SkCanvas* canvas, SkScalar opacity) {
// apply our local transform
{
- canvas->translate(m_position.fX, m_position.fY);
-
- SkScalar tx = SkScalarMul(m_anchorPoint.fX, m_size.width());
- SkScalar ty = SkScalarMul(m_anchorPoint.fY, m_size.height());
- canvas->translate(tx, ty);
- canvas->concat(this->getMatrix());
- canvas->translate(-tx, -ty);
+ SkMatrix tmp;
+ this->getLocalTransform(&tmp);
+ if (this->isInheritFromRootTransform()) {
+ // should we also apply the root's childrenMatrix?
+ canvas->setMatrix(getRootLayer()->getMatrix());
+ }
+ canvas->concat(tmp);
}
this->onDraw(canvas, opacity);