blob: 8b6897bf7c78222e7fb3259ea506d4cb7294a59c [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
57class TestLayer : public SkLayer {
58public:
59 TestLayer(SkColor c) : fColor(c) {}
60
61protected:
62 virtual void onDraw(SkCanvas* canvas, SkScalar opacity) {
63 SkRect r;
64 r.set(0, 0, this->getWidth(), this->getHeight());
65
66 SkPaint paint;
67 paint.setColor(fColor);
68 paint.setAlpha(SkScalarRound(opacity * 255));
69
70 canvas->drawRect(r, paint);
71 }
72
73private:
74 SkColor fColor;
75};
76
77class SkLayerView : public SkView {
78private:
79 SkLayer* fRootLayer;
80
81public:
82 SkLayerView() {
reed@android.comc8c49c52010-02-24 15:36:57 +000083 test44();
reed@android.com2bd703b2010-02-24 02:01:23 +000084 static const int W = 600;
85 static const int H = 440;
reed@android.comda6fb322010-02-19 21:41:30 +000086 static const struct {
87 int fWidth;
88 int fHeight;
89 SkColor fColor;
90 int fPosX;
91 int fPosY;
92 } gData[] = {
93 { 120, 80, SK_ColorRED, 0, 0 },
94 { 120, 80, SK_ColorGREEN, W - 120, 0 },
95 { 120, 80, SK_ColorBLUE, 0, H - 80 },
96 { 120, 80, SK_ColorMAGENTA, W - 120, H - 80 },
97 };
98
reed@android.com2bd703b2010-02-24 02:01:23 +000099 fRootLayer = new TestLayer(0xFFDDDDDD);
reed@android.comda6fb322010-02-19 21:41:30 +0000100 fRootLayer->setSize(W, H);
101 for (size_t i = 0; i < SK_ARRAY_COUNT(gData); i++) {
102 SkLayer* child = new TestLayer(gData[i].fColor);
103 child->setSize(gData[i].fWidth, gData[i].fHeight);
104 child->setPosition(gData[i].fPosX, gData[i].fPosY);
105 fRootLayer->addChild(child)->unref();
106 }
reed@android.com2bd703b2010-02-24 02:01:23 +0000107
108 SkLayer* child = new TestLayer(0xFFDD8844);
109 child->setSize(120, 80);
110 child->setPosition(fRootLayer->getWidth()/2 - child->getWidth()/2,
111 fRootLayer->getHeight()/2 - child->getHeight()/2);
112 child->setAnchorPoint(SK_ScalarHalf, SK_ScalarHalf);
113 {
114 SkMatrix m;
115 m.setRotate(SkIntToScalar(30));
116 child->setMatrix(m);
117 }
118 fRootLayer->addChild(child)->unref();
reed@android.comda6fb322010-02-19 21:41:30 +0000119 }
120
121 virtual ~SkLayerView() {
122 SkSafeUnref(fRootLayer);
123 }
124
125protected:
126 // overrides from SkEventSink
127 virtual bool onQuery(SkEvent* evt) {
128 if (SampleCode::TitleQ(*evt)) {
129 SampleCode::TitleR(evt, "SkLayer");
130 return true;
131 }
132 return this->INHERITED::onQuery(evt);
133 }
134
135 void drawBG(SkCanvas* canvas) {
reed@android.com2bd703b2010-02-24 02:01:23 +0000136 canvas->drawColor(SK_ColorWHITE);
reed@android.comda6fb322010-02-19 21:41:30 +0000137
reed@android.com2bd703b2010-02-24 02:01:23 +0000138 canvas->translate(20, 20);
reed@android.comda6fb322010-02-19 21:41:30 +0000139 fRootLayer->draw(canvas);
140 }
141
142 virtual void onDraw(SkCanvas* canvas) {
143 this->drawBG(canvas);
144}
145
146private:
147 typedef SkView INHERITED;
148};
149
150///////////////////////////////////////////////////////////////////////////////
151
152static SkView* MyFactory() { return new SkLayerView; }
153static SkViewRegister reg(MyFactory);
154