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