blob: fc1f5e5ccbc00a8665ed40a98de7474b035c15c2 [file] [log] [blame]
reed@android.com86d40082010-02-12 17:17:10 +00001#include "SkLayer.h"
reed@android.com81dc3312010-02-18 19:32:03 +00002#include "SkCanvas.h"
reed@android.com86d40082010-02-12 17:17:10 +00003
4SkLayer::SkLayer() {
5 m_doRotation = false;
6 m_isFixed = false;
7 m_backgroundColorSet = false;
8
9 m_angleTransform = 0;
10 m_opacity = 1;
11
12 m_size.set(0, 0);
13 m_position.set(0, 0);
14 m_translation.set(0, 0);
15 m_anchorPoint.set(0.5, 0.5);
16 m_scale.set(1, 1);
17
18 m_backgroundColor = 0;
reed@android.com81dc3312010-02-18 19:32:03 +000019
20 fMatrix.reset();
21 fChildrenMatrix.reset();
reed@android.com86d40082010-02-12 17:17:10 +000022}
23
24SkLayer::SkLayer(const SkLayer& src) {
25 m_doRotation = src.m_doRotation;
26 m_isFixed = src.m_isFixed;
27 m_backgroundColorSet = src.m_backgroundColorSet;
28
29 m_angleTransform = src.m_angleTransform;
30 m_opacity = src.m_opacity;
31 m_size = src.m_size;
32 m_position = src.m_position;
33 m_translation = src.m_translation;
34 m_anchorPoint = src.m_anchorPoint;
35 m_scale = src.m_scale;
36
37 m_fixedLeft = src.m_fixedLeft;
38 m_fixedTop = src.m_fixedTop;
39 m_fixedRight = src.m_fixedRight;
40 m_fixedBottom = src.m_fixedBottom;
41
42 m_backgroundColor = src.m_backgroundColor;
reed@android.com81dc3312010-02-18 19:32:03 +000043
44 fMatrix = src.fMatrix;
45 fChildrenMatrix = src.fChildrenMatrix;
reed@android.com86d40082010-02-12 17:17:10 +000046}
47
48SkLayer::~SkLayer() {
49 this->removeChildren();
50}
51
52int SkLayer::countChildren() const {
53 return m_children.count();
54}
55
56SkLayer* SkLayer::getChild(int index) const {
57 if ((unsigned)index < (unsigned)m_children.count()) {
58 return m_children[index];
59 }
60 return NULL;
61}
62
63SkLayer* SkLayer::addChild(SkLayer* child) {
64 child->ref();
65 *m_children.append() = child;
66 return child;
67}
68
69void SkLayer::removeChildren() {
70 m_children.unrefAll();
71 m_children.reset();
72}
73
reed@android.com81dc3312010-02-18 19:32:03 +000074///////////////////////////////////////////////////////////////////////////////
75
76void SkLayer::setMatrix(const SkMatrix& matrix) {
77 fMatrix = matrix;
78}
79
80void SkLayer::setChildrenMatrix(const SkMatrix& matrix) {
81 fChildrenMatrix = matrix;
82}
83
84///////////////////////////////////////////////////////////////////////////////
85
86void SkLayer::onSetupCanvas(SkCanvas* canvas, SkScalar, const SkRect*) {
87 SkScalar tx = m_position.fX;
88 SkScalar ty = m_position.fY;
89 canvas->translate(tx, ty);
90
91 // now apply our matrix about the anchorPoint
92 tx = SkScalarMul(m_anchorPoint.fX, m_size.width());
93 ty = SkScalarMul(m_anchorPoint.fY, m_size.height());
94 canvas->translate(tx, ty);
95 canvas->concat(this->getMatrix());
96 canvas->translate(-tx, -ty);
97}
98
99void SkLayer::onDraw(SkCanvas*, SkScalar opacity, const SkRect* viewport) {}
100
101void SkLayer::draw(SkCanvas* canvas, SkScalar opacity, const SkRect* viewport) {
102#if 0
103 SkDebugf("--- drawlayer %p anchor [%g %g] scale [%g %g]\n", this, m_anchorPoint.fX, m_anchorPoint.fY,
104 m_scale.fX, m_scale.fY);
105#endif
106
107 opacity = SkScalarMul(opacity, this->getOpacity());
108 if (opacity <= 0 || this->getSize().isEmpty()) {
109 return;
110 }
111
112 SkAutoCanvasRestore acr(canvas, false);
113 canvas->save(SkCanvas::kMatrix_SaveFlag);
114
115 this->onSetupCanvas(canvas, opacity, viewport);
116 this->onDraw(canvas, opacity, viewport);
117
118 int count = this->countChildren();
119 if (count > 0) {
120 canvas->concat(this->getChildrenMatrix());
121 for (int i = 0; i < count; i++) {
122 this->getChild(i)->draw(canvas, opacity, viewport);
123 }
124 }
125}
reed@android.com86d40082010-02-12 17:17:10 +0000126