blob: 759f826d96e31c24a745ff2d761116c4a630c247 [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
reed@android.com2bd703b2010-02-24 02:01:23 +00004//#define DEBUG_LAYER_BOUNDS
5
reed@android.com86d40082010-02-12 17:17:10 +00006SkLayer::SkLayer() {
reed@android.com2bd703b2010-02-24 02:01:23 +00007 m_opacity = SK_Scalar1;
reed@android.com86d40082010-02-12 17:17:10 +00008 m_size.set(0, 0);
9 m_position.set(0, 0);
reed@android.com2bd703b2010-02-24 02:01:23 +000010 m_anchorPoint.set(SK_ScalarHalf, SK_ScalarHalf);
reed@android.com81dc3312010-02-18 19:32:03 +000011
12 fMatrix.reset();
13 fChildrenMatrix.reset();
reed@android.com86d40082010-02-12 17:17:10 +000014}
15
16SkLayer::SkLayer(const SkLayer& src) {
reed@android.com86d40082010-02-12 17:17:10 +000017 m_opacity = src.m_opacity;
18 m_size = src.m_size;
19 m_position = src.m_position;
reed@android.com86d40082010-02-12 17:17:10 +000020 m_anchorPoint = src.m_anchorPoint;
reed@android.com81dc3312010-02-18 19:32:03 +000021
22 fMatrix = src.fMatrix;
23 fChildrenMatrix = src.fChildrenMatrix;
reed@android.com86d40082010-02-12 17:17:10 +000024}
25
26SkLayer::~SkLayer() {
27 this->removeChildren();
28}
29
30int SkLayer::countChildren() const {
31 return m_children.count();
32}
33
34SkLayer* SkLayer::getChild(int index) const {
35 if ((unsigned)index < (unsigned)m_children.count()) {
36 return m_children[index];
37 }
38 return NULL;
39}
40
41SkLayer* SkLayer::addChild(SkLayer* child) {
42 child->ref();
43 *m_children.append() = child;
44 return child;
45}
46
47void SkLayer::removeChildren() {
48 m_children.unrefAll();
49 m_children.reset();
50}
51
reed@android.com81dc3312010-02-18 19:32:03 +000052///////////////////////////////////////////////////////////////////////////////
53
54void SkLayer::setMatrix(const SkMatrix& matrix) {
55 fMatrix = matrix;
56}
57
58void SkLayer::setChildrenMatrix(const SkMatrix& matrix) {
59 fChildrenMatrix = matrix;
60}
61
62///////////////////////////////////////////////////////////////////////////////
63
reed@android.comda6fb322010-02-19 21:41:30 +000064void SkLayer::onDraw(SkCanvas*, SkScalar opacity) {
65// SkDebugf("----- no onDraw for %p\n", this);
reed@android.com81dc3312010-02-18 19:32:03 +000066}
67
reed@android.comda6fb322010-02-19 21:41:30 +000068#include "SkString.h"
reed@android.com81dc3312010-02-18 19:32:03 +000069
reed@android.comda6fb322010-02-19 21:41:30 +000070void SkLayer::draw(SkCanvas* canvas, SkScalar opacity) {
reed@android.com81dc3312010-02-18 19:32:03 +000071#if 0
reed@android.comda6fb322010-02-19 21:41:30 +000072 SkString str1, str2;
73 // this->getMatrix().toDumpString(&str1);
74 // this->getChildrenMatrix().toDumpString(&str2);
75 SkDebugf("--- drawlayer %p opacity %g size [%g %g] pos [%g %g] matrix %s children %s\n",
76 this, opacity * this->getOpacity(), m_size.width(), m_size.height(),
77 m_position.fX, m_position.fY, str1.c_str(), str2.c_str());
reed@android.com81dc3312010-02-18 19:32:03 +000078#endif
79
80 opacity = SkScalarMul(opacity, this->getOpacity());
81 if (opacity <= 0 || this->getSize().isEmpty()) {
reed@android.comda6fb322010-02-19 21:41:30 +000082#if 0
83 SkDebugf("---- abort drawing %p opacity %g size [%g %g]\n",
84 this, opacity, m_size.width(), m_size.height());
85#endif
reed@android.com81dc3312010-02-18 19:32:03 +000086 return;
87 }
88
reed@android.comda6fb322010-02-19 21:41:30 +000089 SkAutoCanvasRestore acr(canvas, true);
reed@android.com81dc3312010-02-18 19:32:03 +000090
reed@android.comda6fb322010-02-19 21:41:30 +000091 // update the matrix
92 {
93 SkScalar tx = m_position.fX;
94 SkScalar ty = m_position.fY;
95 canvas->translate(tx, ty);
96
97 // now apply our matrix about the anchorPoint
98 tx = SkScalarMul(m_anchorPoint.fX, m_size.width());
99 ty = SkScalarMul(m_anchorPoint.fY, m_size.height());
100 canvas->translate(tx, ty);
101 canvas->concat(this->getMatrix());
102 canvas->translate(-tx, -ty);
103 }
104
105 this->onDraw(canvas, opacity);
reed@android.com81dc3312010-02-18 19:32:03 +0000106
reed@android.com2bd703b2010-02-24 02:01:23 +0000107#ifdef DEBUG_LAYER_BOUNDS
108 {
109 SkRect r = SkRect::MakeSize(this->getSize());
110 SkPaint p;
111 p.setAntiAlias(true);
112 p.setStyle(SkPaint::kStroke_Style);
113 p.setStrokeWidth(SkIntToScalar(2));
114 p.setColor(0xFFFF44DD);
115 canvas->drawRect(r, p);
116 canvas->drawLine(r.fLeft, r.fTop, r.fRight, r.fBottom, p);
117 canvas->drawLine(r.fLeft, r.fBottom, r.fRight, r.fTop, p);
118 }
119#endif
120
reed@android.com81dc3312010-02-18 19:32:03 +0000121 int count = this->countChildren();
122 if (count > 0) {
123 canvas->concat(this->getChildrenMatrix());
124 for (int i = 0; i < count; i++) {
reed@android.comda6fb322010-02-19 21:41:30 +0000125 this->getChild(i)->draw(canvas, opacity);
reed@android.com81dc3312010-02-18 19:32:03 +0000126 }
127 }
128}
reed@android.com86d40082010-02-12 17:17:10 +0000129