blob: c10bdfd778f9943415f8d6cf85142d3cb13e7af9 [file] [log] [blame]
reed@android.comda6fb322010-02-19 21:41:30 +00001#include "SampleCode.h"
2#include "SkCanvas.h"
3#include "SkPaint.h"
4#include "SkView.h"
5#include "SkLayer.h"
6
reed@android.comc8c49c52010-02-24 15:36:57 +00007#include "SkMatrix44.h"
8static void test_inv(const char label[], const SkMatrix44& mat) {
9 SkDebugf("%s\n", label);
10 mat.dump();
11
12 SkMatrix44 inv;
13 if (mat.invert(&inv)) {
14 inv.dump();
15 } else {
16 SkDebugf("--- invert failed\n");
17 }
18
19 SkMatrix44 a, b;
20 a.setConcat(mat, inv);
21 b.setConcat(inv, mat);
22 SkDebugf("concat mat with inverse pre=%d post=%d\n", a.isIdentity(), b.isIdentity());
23 if (!a.isIdentity()) {
24 a.dump();
25 }
26 if (!b.isIdentity()) {
27 b.dump();
28 }
29 SkDebugf("\n");
30}
31
32static void test44() {
33 SkMatrix44 m0, m1, m2;
34
35 test_inv("identity", m0);
36 m0.setTranslate(2,3,4);
37 test_inv("translate", m0);
38 m0.setScale(2,3,4);
39 test_inv("scale", m0);
40 m0.postTranslate(5, 6, 7);
41 test_inv("postTranslate", m0);
42 m0.setScale(2,3,4);
43 m1.setTranslate(5, 6, 7);
44 m0.setConcat(m0, m1);
45 test_inv("postTranslate2", m0);
46 m0.setScale(2,3,4);
47 m0.preTranslate(5, 6, 7);
48 test_inv("preTranslate", m0);
49
50 m0.setScale(2, 4, 6);
51 m0.postScale(SkDoubleToMScalar(0.5));
52 test_inv("scale/postscale to 1,2,3", m0);
53}
54
reed@android.comda6fb322010-02-19 21:41:30 +000055///////////////////////////////////////////////////////////////////////////////
56
reed@android.com745bfbd2010-02-24 17:16:35 +000057static void dump_layers(const SkLayer* layer, int tab = 0) {
58 SkMatrix matrix;
59 SkString matrixStr;
60
61 layer->getLocalTransform(&matrix);
62 matrix.toDumpString(&matrixStr);
63
64 for (int j = 0; j < tab; j++) {
65 SkDebugf(" ");
66 }
67 SkDebugf("layer=%p parent=%p size=[%g %g] transform=%s\n",
68 layer, layer->getParent(), layer->getWidth(), layer->getHeight(),
69 matrixStr.c_str());
70 for (int i = 0; i < layer->countChildren(); i++) {
71 dump_layers(layer->getChild(i), tab + 4);
72 }
73}
74
reed@android.comda6fb322010-02-19 21:41:30 +000075class TestLayer : public SkLayer {
76public:
77 TestLayer(SkColor c) : fColor(c) {}
78
79protected:
80 virtual void onDraw(SkCanvas* canvas, SkScalar opacity) {
81 SkRect r;
82 r.set(0, 0, this->getWidth(), this->getHeight());
83
84 SkPaint paint;
85 paint.setColor(fColor);
86 paint.setAlpha(SkScalarRound(opacity * 255));
87
88 canvas->drawRect(r, paint);
89 }
90
91private:
92 SkColor fColor;
93};
94
95class SkLayerView : public SkView {
96private:
97 SkLayer* fRootLayer;
reed@android.com745bfbd2010-02-24 17:16:35 +000098 SkLayer* fLastChild;
reed@android.comda6fb322010-02-19 21:41:30 +000099public:
100 SkLayerView() {
reed@android.comc8c49c52010-02-24 15:36:57 +0000101 test44();
reed@android.com2bd703b2010-02-24 02:01:23 +0000102 static const int W = 600;
103 static const int H = 440;
reed@android.comda6fb322010-02-19 21:41:30 +0000104 static const struct {
105 int fWidth;
106 int fHeight;
107 SkColor fColor;
108 int fPosX;
109 int fPosY;
110 } gData[] = {
111 { 120, 80, SK_ColorRED, 0, 0 },
112 { 120, 80, SK_ColorGREEN, W - 120, 0 },
113 { 120, 80, SK_ColorBLUE, 0, H - 80 },
114 { 120, 80, SK_ColorMAGENTA, W - 120, H - 80 },
115 };
116
reed@android.com2bd703b2010-02-24 02:01:23 +0000117 fRootLayer = new TestLayer(0xFFDDDDDD);
reed@android.comda6fb322010-02-19 21:41:30 +0000118 fRootLayer->setSize(W, H);
119 for (size_t i = 0; i < SK_ARRAY_COUNT(gData); i++) {
120 SkLayer* child = new TestLayer(gData[i].fColor);
121 child->setSize(gData[i].fWidth, gData[i].fHeight);
122 child->setPosition(gData[i].fPosX, gData[i].fPosY);
123 fRootLayer->addChild(child)->unref();
124 }
reed@android.com2bd703b2010-02-24 02:01:23 +0000125
126 SkLayer* child = new TestLayer(0xFFDD8844);
127 child->setSize(120, 80);
128 child->setPosition(fRootLayer->getWidth()/2 - child->getWidth()/2,
129 fRootLayer->getHeight()/2 - child->getHeight()/2);
130 child->setAnchorPoint(SK_ScalarHalf, SK_ScalarHalf);
131 {
132 SkMatrix m;
133 m.setRotate(SkIntToScalar(30));
134 child->setMatrix(m);
135 }
reed@android.com745bfbd2010-02-24 17:16:35 +0000136 fLastChild = child;
reed@android.com2bd703b2010-02-24 02:01:23 +0000137 fRootLayer->addChild(child)->unref();
reed@android.com745bfbd2010-02-24 17:16:35 +0000138
139 if (false) {
140 SkMatrix matrix;
141 matrix.setScale(0.5, 0.5);
142 fRootLayer->setMatrix(matrix);
143 }
144
145 dump_layers(fRootLayer);
reed@android.comda6fb322010-02-19 21:41:30 +0000146 }
147
148 virtual ~SkLayerView() {
149 SkSafeUnref(fRootLayer);
150 }
151
152protected:
153 // overrides from SkEventSink
154 virtual bool onQuery(SkEvent* evt) {
155 if (SampleCode::TitleQ(*evt)) {
156 SampleCode::TitleR(evt, "SkLayer");
157 return true;
158 }
159 return this->INHERITED::onQuery(evt);
160 }
161
reed@android.com745bfbd2010-02-24 17:16:35 +0000162 virtual void onDraw(SkCanvas* canvas) {
reed@android.com2bd703b2010-02-24 02:01:23 +0000163 canvas->drawColor(SK_ColorWHITE);
reed@android.com745bfbd2010-02-24 17:16:35 +0000164
reed@android.com2bd703b2010-02-24 02:01:23 +0000165 canvas->translate(20, 20);
reed@android.comda6fb322010-02-19 21:41:30 +0000166 fRootLayer->draw(canvas);
reed@android.com745bfbd2010-02-24 17:16:35 +0000167
168 // visual test of getLocalTransform
169 if (true) {
170 SkMatrix matrix;
171 fLastChild->localToGlobal(&matrix);
172 SkPaint paint;
173 paint.setStyle(SkPaint::kStroke_Style);
174 paint.setStrokeWidth(5);
175 paint.setColor(0x88FF0000);
176 canvas->concat(matrix);
177 canvas->drawRect(SkRect::MakeSize(fLastChild->getSize()), paint);
178 }
reed@android.comda6fb322010-02-19 21:41:30 +0000179 }
180
reed@android.comda6fb322010-02-19 21:41:30 +0000181private:
182 typedef SkView INHERITED;
183};
184
185///////////////////////////////////////////////////////////////////////////////
186
187static SkView* MyFactory() { return new SkLayerView; }
188static SkViewRegister reg(MyFactory);
189