blob: b4e487a73c4c36275f073f6c443c4d6a613c6cca [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"
reed@android.com0bb6d062010-05-17 14:50:04 +00007#include "SkDOM.h"
reed@android.com2ee7c642009-10-28 14:25:34 +00008
9///////////////////////////////////////////////////////////////////////////////
10
reed@android.com0f0cfae2009-10-13 13:33:16 +000011class SkAnimatorView : public SkView {
12public:
13 SkAnimatorView();
14 virtual ~SkAnimatorView();
15
16 void setURIBase(const char dir[]);
17
18 SkAnimator* getAnimator() const { return fAnimator; }
19
20 bool decodeFile(const char path[]);
21 bool decodeMemory(const void* buffer, size_t size);
22 bool decodeStream(SkStream* stream);
23
24protected:
25 // overrides
26 virtual void onDraw(SkCanvas*);
tomhudson@google.comd6caf2e2011-07-08 14:41:12 +000027 virtual bool onQuery(SkEvent* evt);
reed@android.com0f0cfae2009-10-13 13:33:16 +000028
29private:
30 SkString fBaseURI;
31 SkAnimator* fAnimator;
32
33 typedef SkView INHERITED;
34};
35
reed@android.com0bb6d062010-05-17 14:50:04 +000036SkAnimatorView::SkAnimatorView() : fAnimator(NULL) {}
reed@android.com0f0cfae2009-10-13 13:33:16 +000037
38SkAnimatorView::~SkAnimatorView() {
39 delete fAnimator;
40}
41
42void SkAnimatorView::setURIBase(const char dir[]) {
43 fBaseURI.set(dir);
44}
45
46bool SkAnimatorView::decodeFile(const char path[]) {
47 SkFILEStream* is = new SkFILEStream(path);
48 SkAutoUnref aur(is);
49 return is->isValid() && this->decodeStream(is);
50}
51
52bool SkAnimatorView::decodeMemory(const void* buffer, size_t size) {
53 SkMemoryStream* is = new SkMemoryStream(buffer, size);
54 SkAutoUnref aur(is);
55 return this->decodeStream(is);
56}
57
reed@android.com0bb6d062010-05-17 14:50:04 +000058static const SkDOMNode* find_nodeID(const SkDOM& dom,
59 const SkDOMNode* node, const char name[]) {
60 if (NULL == node) {
61 node = dom.getRootNode();
62 }
63 do {
64 const char* idval = dom.findAttr(node, "id");
65 if (idval && !strcmp(idval, name)) {
66 return node;
67 }
68 const SkDOMNode* child = dom.getFirstChild(node);
69 if (child) {
70 const SkDOMNode* found = find_nodeID(dom, child, name);
71 if (found) {
72 return found;
73 }
74 }
75 } while ((node = dom.getNextSibling(node)) != NULL);
76 return NULL;
77}
78
reed@android.com0f0cfae2009-10-13 13:33:16 +000079bool SkAnimatorView::decodeStream(SkStream* stream) {
80 delete fAnimator;
81 fAnimator = new SkAnimator;
82 fAnimator->setURIBase(fBaseURI.c_str());
reed@android.com0bb6d062010-05-17 14:50:04 +000083#if 0
reed@android.com0f0cfae2009-10-13 13:33:16 +000084 if (!fAnimator->decodeStream(stream)) {
85 delete fAnimator;
86 fAnimator = NULL;
87 return false;
88 }
reed@android.com0bb6d062010-05-17 14:50:04 +000089#else
90 size_t len = stream->getLength();
91 char* text = (char*)sk_malloc_throw(len);
92 stream->read(text, len);
93 SkDOM dom;
94 const SkDOM::Node* root = dom.build(text, len);
95 if (NULL == root) {
96 return false;
97 }
98 if (!fAnimator->decodeDOM(dom, root)) {
99 delete fAnimator;
100 fAnimator = NULL;
101 return false;
102 }
103 for (int i = 0; i <= 10; i++) {
104 SkString name("glyph");
105 name.appendS32(i);
106 const SkDOM::Node* node = find_nodeID(dom, NULL, name.c_str());
107 SkASSERT(node);
108 SkRect r;
109 dom.findScalar(node, "left", &r.fLeft);
110 dom.findScalar(node, "top", &r.fTop);
111 dom.findScalar(node, "width", &r.fRight); r.fRight += r.fLeft;
112 dom.findScalar(node, "height", &r.fBottom); r.fBottom += r.fTop;
113 SkDebugf("--- %s [%g %g %g %g]\n", name.c_str(),
114 r.fLeft, r.fTop, r.fRight, r.fBottom);
115 }
116#endif
reed@android.com0f0cfae2009-10-13 13:33:16 +0000117 return true;
118}
119
120#include "SkTime.h"
121
122void SkAnimatorView::onDraw(SkCanvas* canvas) {
123 if (fAnimator) {
124 canvas->drawColor(SK_ColorWHITE);
reed@android.com80b4ebe2009-10-21 19:41:10 +0000125 fAnimator->draw(canvas, 0);
reed@android.com0bb6d062010-05-17 14:50:04 +0000126#if 0
reed@android.com80b4ebe2009-10-21 19:41:10 +0000127 canvas->save();
128 canvas->translate(120, 30);
129 canvas->scale(0.5, 0.5);
130 fAnimator->draw(canvas, 0);
131 canvas->restore();
132
133 canvas->save();
134 canvas->translate(190, 40);
135 canvas->scale(0.25, 0.25);
136 fAnimator->draw(canvas, 0);
137 canvas->restore();
138
reed@android.com0f0cfae2009-10-13 13:33:16 +0000139 this->inval(NULL);
reed@android.com0bb6d062010-05-17 14:50:04 +0000140#endif
reed@android.com0f0cfae2009-10-13 13:33:16 +0000141 }
142}
143
tomhudson@google.comd6caf2e2011-07-08 14:41:12 +0000144bool SkAnimatorView::onQuery(SkEvent* evt) {
145 if (SampleCode::TitleQ(*evt)) {
146 SampleCode::TitleR(evt, "Animator");
147 return true;
148 }
149 return this->INHERITED::onQuery(evt);
150}
151
reed@android.com0f0cfae2009-10-13 13:33:16 +0000152//////////////////////////////////////////////////////////////////////////////
153
154static SkView* MyFactory() {
155 SkAnimatorView* av = new SkAnimatorView;
156// av->decodeFile("/skimages/test.xml");
reed@android.com0bb6d062010-05-17 14:50:04 +0000157#if 0
reed@android.com0f0cfae2009-10-13 13:33:16 +0000158 av->setURIBase("/skia/trunk/animations/");
reed@android.com80b4ebe2009-10-21 19:41:10 +0000159 av->decodeFile("/skia/trunk/animations/checkbox.xml");
reed@android.com0bb6d062010-05-17 14:50:04 +0000160#else
161 av->setURIBase("/");
162 av->decodeFile("/testanim.txt");
163#endif
reed@android.com0f0cfae2009-10-13 13:33:16 +0000164 return av;
165}
166
167static SkViewRegister reg(MyFactory);
168