blob: 4ba88729a88212bb2982f955afaefc7aebd68c84 [file] [log] [blame]
reed@android.com0f0cfae2009-10-13 13:33:16 +00001#include "SampleCode.h"
2#include "SkView.h"
3#include "SkCanvas.h"
4
5#include "SkAnimator.h"
6#include "SkStream.h"
7
reed@android.com2ee7c642009-10-28 14:25:34 +00008#include "SkColorPriv.h"
9static inline void Filter_32_opaque_portable(unsigned x, unsigned y,
10 SkPMColor a00, SkPMColor a01,
11 SkPMColor a10, SkPMColor a11,
12 SkPMColor* dstColor) {
13 SkASSERT((unsigned)x <= 0xF);
14 SkASSERT((unsigned)y <= 0xF);
15
16 int xy = x * y;
17 uint32_t mask = gMask_00FF00FF; //0xFF00FF;
18
19 int scale = 256 - 16*y - 16*x + xy;
20 uint32_t lo = (a00 & mask) * scale;
21 uint32_t hi = ((a00 >> 8) & mask) * scale;
22
23 scale = 16*x - xy;
24 lo += (a01 & mask) * scale;
25 hi += ((a01 >> 8) & mask) * scale;
26
27 scale = 16*y - xy;
28 lo += (a10 & mask) * scale;
29 hi += ((a10 >> 8) & mask) * scale;
30
31 lo += (a11 & mask) * xy;
32 hi += ((a11 >> 8) & mask) * xy;
33
34 *dstColor = ((lo >> 8) & mask) | (hi & ~mask);
35}
36
37static void test_filter() {
38 for (int r = 0; r <= 0xFF; r++) {
39 SkPMColor c = SkPackARGB32(0xFF, r, r, r);
40 for (int y = 0; y <= 0xF; y++) {
41 for (int x = 0; x <= 0xF; x++) {
42 SkPMColor dst;
43 Filter_32_opaque_portable(x, y, c, c, c, c, &dst);
44 SkASSERT(SkGetPackedA32(dst) == 255);
45 }
46 }
47 }
48}
49
50///////////////////////////////////////////////////////////////////////////////
51
reed@android.com0f0cfae2009-10-13 13:33:16 +000052class SkAnimatorView : public SkView {
53public:
54 SkAnimatorView();
55 virtual ~SkAnimatorView();
56
57 void setURIBase(const char dir[]);
58
59 SkAnimator* getAnimator() const { return fAnimator; }
60
61 bool decodeFile(const char path[]);
62 bool decodeMemory(const void* buffer, size_t size);
63 bool decodeStream(SkStream* stream);
64
65protected:
66 // overrides
67 virtual void onDraw(SkCanvas*);
68
69private:
70 SkString fBaseURI;
71 SkAnimator* fAnimator;
72
73 typedef SkView INHERITED;
74};
75
76SkAnimatorView::SkAnimatorView() : fAnimator(NULL) {
reed@android.com2ee7c642009-10-28 14:25:34 +000077 test_filter();
reed@android.com0f0cfae2009-10-13 13:33:16 +000078}
79
80SkAnimatorView::~SkAnimatorView() {
81 delete fAnimator;
82}
83
84void SkAnimatorView::setURIBase(const char dir[]) {
85 fBaseURI.set(dir);
86}
87
88bool SkAnimatorView::decodeFile(const char path[]) {
89 SkFILEStream* is = new SkFILEStream(path);
90 SkAutoUnref aur(is);
91 return is->isValid() && this->decodeStream(is);
92}
93
94bool SkAnimatorView::decodeMemory(const void* buffer, size_t size) {
95 SkMemoryStream* is = new SkMemoryStream(buffer, size);
96 SkAutoUnref aur(is);
97 return this->decodeStream(is);
98}
99
100bool SkAnimatorView::decodeStream(SkStream* stream) {
101 delete fAnimator;
102 fAnimator = new SkAnimator;
103 fAnimator->setURIBase(fBaseURI.c_str());
104 if (!fAnimator->decodeStream(stream)) {
105 delete fAnimator;
106 fAnimator = NULL;
107 return false;
108 }
109 return true;
110}
111
112#include "SkTime.h"
113
114void SkAnimatorView::onDraw(SkCanvas* canvas) {
115 if (fAnimator) {
116 canvas->drawColor(SK_ColorWHITE);
reed@android.com80b4ebe2009-10-21 19:41:10 +0000117 fAnimator->draw(canvas, 0);
118
119 canvas->save();
120 canvas->translate(120, 30);
121 canvas->scale(0.5, 0.5);
122 fAnimator->draw(canvas, 0);
123 canvas->restore();
124
125 canvas->save();
126 canvas->translate(190, 40);
127 canvas->scale(0.25, 0.25);
128 fAnimator->draw(canvas, 0);
129 canvas->restore();
130
reed@android.com0f0cfae2009-10-13 13:33:16 +0000131 this->inval(NULL);
132 }
133}
134
135//////////////////////////////////////////////////////////////////////////////
136
137static SkView* MyFactory() {
138 SkAnimatorView* av = new SkAnimatorView;
139// av->decodeFile("/skimages/test.xml");
140 av->setURIBase("/skia/trunk/animations/");
reed@android.com80b4ebe2009-10-21 19:41:10 +0000141 av->decodeFile("/skia/trunk/animations/checkbox.xml");
reed@android.com0f0cfae2009-10-13 13:33:16 +0000142 return av;
143}
144
145static SkViewRegister reg(MyFactory);
146