15bb6825f10d64834ad1d1d967f590aebae285360epoger@google.com 2bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.com/* 35bb6825f10d64834ad1d1d967f590aebae285360epoger@google.com * Copyright 2010 The Android Open Source Project 4bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.com * 55bb6825f10d64834ad1d1d967f590aebae285360epoger@google.com * Use of this source code is governed by a BSD-style license that can be 65bb6825f10d64834ad1d1d967f590aebae285360epoger@google.com * found in the LICENSE file. 7bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.com */ 8bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.com 95bb6825f10d64834ad1d1d967f590aebae285360epoger@google.com 10bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.com#ifndef SkLayer_DEFINED 11bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.com#define SkLayer_DEFINED 12bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.com 13bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.com#include "SkRefCnt.h" 14bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.com#include "SkTDArray.h" 15bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.com#include "SkColor.h" 1688bd7a77fc875868e2fc45e71dade0299ef4f5cbreed@android.com#include "SkMatrix.h" 17bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.com#include "SkPoint.h" 18bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.com#include "SkRect.h" 19bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.com#include "SkSize.h" 20bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.com 21bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.comclass SkCanvas; 22bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.com 23bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.comclass SkLayer : public SkRefCnt { 24bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.com 25bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.compublic: 268d100972ed5bc63cb48e4a0aa3a954a91601ff21robertphillips@google.com SK_DECLARE_INST_COUNT(SkLayer) 278d100972ed5bc63cb48e4a0aa3a954a91601ff21robertphillips@google.com 28bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.com SkLayer(); 29bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.com SkLayer(const SkLayer&); 30bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.com virtual ~SkLayer(); 31bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.com 32bd0e1bd6acb7c7510565b49ca5b9b918e29ee5c4reed@android.com bool isInheritFromRootTransform() const; 3388bd7a77fc875868e2fc45e71dade0299ef4f5cbreed@android.com SkScalar getOpacity() const { return m_opacity; } 34cc7f120e9e28059285825463ca8dfcc3ef8c0fdareed@android.com const SkSize& getSize() const { return m_size; } 3588bd7a77fc875868e2fc45e71dade0299ef4f5cbreed@android.com const SkPoint& getPosition() const { return m_position; } 3688bd7a77fc875868e2fc45e71dade0299ef4f5cbreed@android.com const SkPoint& getAnchorPoint() const { return m_anchorPoint; } 37cc7f120e9e28059285825463ca8dfcc3ef8c0fdareed@android.com const SkMatrix& getMatrix() const { return fMatrix; } 38cc7f120e9e28059285825463ca8dfcc3ef8c0fdareed@android.com const SkMatrix& getChildrenMatrix() const { return fChildrenMatrix; } 3988bd7a77fc875868e2fc45e71dade0299ef4f5cbreed@android.com 40cc7f120e9e28059285825463ca8dfcc3ef8c0fdareed@android.com SkScalar getWidth() const { return m_size.width(); } 41cc7f120e9e28059285825463ca8dfcc3ef8c0fdareed@android.com SkScalar getHeight() const { return m_size.height(); } 42bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.com 43bd0e1bd6acb7c7510565b49ca5b9b918e29ee5c4reed@android.com void setInheritFromRootTransform(bool); 44cc7f120e9e28059285825463ca8dfcc3ef8c0fdareed@android.com void setOpacity(SkScalar opacity) { m_opacity = opacity; } 45cc7f120e9e28059285825463ca8dfcc3ef8c0fdareed@android.com void setSize(SkScalar w, SkScalar h) { m_size.set(w, h); } 46cc7f120e9e28059285825463ca8dfcc3ef8c0fdareed@android.com void setPosition(SkScalar x, SkScalar y) { m_position.set(x, y); } 47cc7f120e9e28059285825463ca8dfcc3ef8c0fdareed@android.com void setAnchorPoint(SkScalar x, SkScalar y) { m_anchorPoint.set(x, y); } 4888bd7a77fc875868e2fc45e71dade0299ef4f5cbreed@android.com void setMatrix(const SkMatrix&); 4988bd7a77fc875868e2fc45e71dade0299ef4f5cbreed@android.com void setChildrenMatrix(const SkMatrix&); 50bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.com 51bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.com // children 52bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.com 5301a560fe6338fa0e91a97f77bf310758108e5806reed@android.com /** Return the number of layers in our child list. 5401a560fe6338fa0e91a97f77bf310758108e5806reed@android.com */ 55bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.com int countChildren() const; 5601a560fe6338fa0e91a97f77bf310758108e5806reed@android.com 5701a560fe6338fa0e91a97f77bf310758108e5806reed@android.com /** Return the child at the specified index (starting at 0). This does not 5801a560fe6338fa0e91a97f77bf310758108e5806reed@android.com affect the reference count of the child. 5901a560fe6338fa0e91a97f77bf310758108e5806reed@android.com */ 60bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.com SkLayer* getChild(int index) const; 6101a560fe6338fa0e91a97f77bf310758108e5806reed@android.com 6201a560fe6338fa0e91a97f77bf310758108e5806reed@android.com /** Add this layer to our child list at the end (top-most), and ref() it. 6301a560fe6338fa0e91a97f77bf310758108e5806reed@android.com If it was already in another hierarchy, remove it from that list. 6401a560fe6338fa0e91a97f77bf310758108e5806reed@android.com Return the new child. 6501a560fe6338fa0e91a97f77bf310758108e5806reed@android.com */ 66bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.com SkLayer* addChild(SkLayer* child); 6701a560fe6338fa0e91a97f77bf310758108e5806reed@android.com 68bd0e1bd6acb7c7510565b49ca5b9b918e29ee5c4reed@android.com /** Remove this layer from its parent's list (or do nothing if it has no 69bd0e1bd6acb7c7510565b49ca5b9b918e29ee5c4reed@android.com parent.) If it had a parent, then unref() is called. 7001a560fe6338fa0e91a97f77bf310758108e5806reed@android.com */ 71bd0e1bd6acb7c7510565b49ca5b9b918e29ee5c4reed@android.com void detachFromParent(); 7201a560fe6338fa0e91a97f77bf310758108e5806reed@android.com 7301a560fe6338fa0e91a97f77bf310758108e5806reed@android.com /** Remove, and unref(), all of the layers in our child list. 7401a560fe6338fa0e91a97f77bf310758108e5806reed@android.com */ 75bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.com void removeChildren(); 76bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.com 7701a560fe6338fa0e91a97f77bf310758108e5806reed@android.com /** Return our parent layer, or NULL if we have none. 7801a560fe6338fa0e91a97f77bf310758108e5806reed@android.com */ 7901a560fe6338fa0e91a97f77bf310758108e5806reed@android.com SkLayer* getParent() const { return fParent; } 8001a560fe6338fa0e91a97f77bf310758108e5806reed@android.com 8101a560fe6338fa0e91a97f77bf310758108e5806reed@android.com /** Return the root layer in this hiearchy. If this layer is the root 8201a560fe6338fa0e91a97f77bf310758108e5806reed@android.com (i.e. has no parent), then this returns itself. 8301a560fe6338fa0e91a97f77bf310758108e5806reed@android.com */ 8401a560fe6338fa0e91a97f77bf310758108e5806reed@android.com SkLayer* getRootLayer() const; 8501a560fe6338fa0e91a97f77bf310758108e5806reed@android.com 8601a560fe6338fa0e91a97f77bf310758108e5806reed@android.com // coordinate system transformations 8701a560fe6338fa0e91a97f77bf310758108e5806reed@android.com 8801a560fe6338fa0e91a97f77bf310758108e5806reed@android.com /** Return, in matrix, the matix transfomations that are applied locally 8901a560fe6338fa0e91a97f77bf310758108e5806reed@android.com when this layer draws (i.e. its position and matrix/anchorPoint). 9001a560fe6338fa0e91a97f77bf310758108e5806reed@android.com This does not include the childrenMatrix, since that is only applied 9101a560fe6338fa0e91a97f77bf310758108e5806reed@android.com after this layer draws (but before its children draw). 9201a560fe6338fa0e91a97f77bf310758108e5806reed@android.com */ 9301a560fe6338fa0e91a97f77bf310758108e5806reed@android.com void getLocalTransform(SkMatrix* matrix) const; 9401a560fe6338fa0e91a97f77bf310758108e5806reed@android.com 9501a560fe6338fa0e91a97f77bf310758108e5806reed@android.com /** Return, in matrix, the concatenation of transforms that are applied 9601a560fe6338fa0e91a97f77bf310758108e5806reed@android.com from this layer's root parent to the layer itself. 9701a560fe6338fa0e91a97f77bf310758108e5806reed@android.com This is the matrix that is applied to the layer during drawing. 9801a560fe6338fa0e91a97f77bf310758108e5806reed@android.com */ 9901a560fe6338fa0e91a97f77bf310758108e5806reed@android.com void localToGlobal(SkMatrix* matrix) const; 10001a560fe6338fa0e91a97f77bf310758108e5806reed@android.com 101bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.com // paint method 102bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.com 103cc7f120e9e28059285825463ca8dfcc3ef8c0fdareed@android.com void draw(SkCanvas*, SkScalar opacity); 104cc7f120e9e28059285825463ca8dfcc3ef8c0fdareed@android.com void draw(SkCanvas* canvas) { 105cc7f120e9e28059285825463ca8dfcc3ef8c0fdareed@android.com this->draw(canvas, SK_Scalar1); 106cc7f120e9e28059285825463ca8dfcc3ef8c0fdareed@android.com } 10788bd7a77fc875868e2fc45e71dade0299ef4f5cbreed@android.com 10888bd7a77fc875868e2fc45e71dade0299ef4f5cbreed@android.comprotected: 109cc7f120e9e28059285825463ca8dfcc3ef8c0fdareed@android.com virtual void onDraw(SkCanvas*, SkScalar opacity); 11088bd7a77fc875868e2fc45e71dade0299ef4f5cbreed@android.com 11188bd7a77fc875868e2fc45e71dade0299ef4f5cbreed@android.comprivate: 112bd0e1bd6acb7c7510565b49ca5b9b918e29ee5c4reed@android.com enum Flags { 113bd0e1bd6acb7c7510565b49ca5b9b918e29ee5c4reed@android.com kInheritFromRootTransform_Flag = 0x01 114bd0e1bd6acb7c7510565b49ca5b9b918e29ee5c4reed@android.com }; 115bd0e1bd6acb7c7510565b49ca5b9b918e29ee5c4reed@android.com 11601a560fe6338fa0e91a97f77bf310758108e5806reed@android.com SkLayer* fParent; 117cc7f120e9e28059285825463ca8dfcc3ef8c0fdareed@android.com SkScalar m_opacity; 118cc7f120e9e28059285825463ca8dfcc3ef8c0fdareed@android.com SkSize m_size; 119cc7f120e9e28059285825463ca8dfcc3ef8c0fdareed@android.com SkPoint m_position; 120cc7f120e9e28059285825463ca8dfcc3ef8c0fdareed@android.com SkPoint m_anchorPoint; 12188bd7a77fc875868e2fc45e71dade0299ef4f5cbreed@android.com SkMatrix fMatrix; 12288bd7a77fc875868e2fc45e71dade0299ef4f5cbreed@android.com SkMatrix fChildrenMatrix; 123bd0e1bd6acb7c7510565b49ca5b9b918e29ee5c4reed@android.com uint32_t fFlags; 124bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.com 125bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.com SkTDArray<SkLayer*> m_children; 1266947731ab4682e0397940116229d8b7c1cc0f5d4reed@google.com 1276947731ab4682e0397940116229d8b7c1cc0f5d4reed@google.com typedef SkRefCnt INHERITED; 128bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.com}; 129bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.com 130bee80b4d3ce0c1366e2513b9ea569b5e256615dareed@android.com#endif 131