diff options
author | Mike Reed <reed@google.com> | 2010-03-23 14:53:19 -0400 |
---|---|---|
committer | Mike Reed <reed@google.com> | 2010-03-23 14:53:19 -0400 |
commit | 2be249260de3c70ec6780caf1a4f32be19319d46 (patch) | |
tree | f8fe6fc89cf6ab5661b069941c194dd22e93e96e | |
parent | caee1c3bee3145df77d201e43b0128860546b694 (diff) | |
download | skia-2be249260de3c70ec6780caf1a4f32be19319d46.tar.gz |
add inherit-from-root-transform flag
Change-Id: I9ffdb50bde0c53070611c7dc626c384eca0906ea
-rw-r--r-- | include/utils/SkLayer.h | 7 | ||||
-rw-r--r-- | src/utils/SkLayer.cpp | 33 |
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); |