blob: 99173fc8abc76f3f224055980e335c978c2e7a28 [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*);
27
28private:
29 SkString fBaseURI;
30 SkAnimator* fAnimator;
31
32 typedef SkView INHERITED;
33};
34
reed@android.com0bb6d062010-05-17 14:50:04 +000035SkAnimatorView::SkAnimatorView() : fAnimator(NULL) {}
reed@android.com0f0cfae2009-10-13 13:33:16 +000036
37SkAnimatorView::~SkAnimatorView() {
38 delete fAnimator;
39}
40
41void SkAnimatorView::setURIBase(const char dir[]) {
42 fBaseURI.set(dir);
43}
44
45bool SkAnimatorView::decodeFile(const char path[]) {
46 SkFILEStream* is = new SkFILEStream(path);
47 SkAutoUnref aur(is);
48 return is->isValid() && this->decodeStream(is);
49}
50
51bool SkAnimatorView::decodeMemory(const void* buffer, size_t size) {
52 SkMemoryStream* is = new SkMemoryStream(buffer, size);
53 SkAutoUnref aur(is);
54 return this->decodeStream(is);
55}
56
reed@android.com0bb6d062010-05-17 14:50:04 +000057static const SkDOMNode* find_nodeID(const SkDOM& dom,
58 const SkDOMNode* node, const char name[]) {
59 if (NULL == node) {
60 node = dom.getRootNode();
61 }
62 do {
63 const char* idval = dom.findAttr(node, "id");
64 if (idval && !strcmp(idval, name)) {
65 return node;
66 }
67 const SkDOMNode* child = dom.getFirstChild(node);
68 if (child) {
69 const SkDOMNode* found = find_nodeID(dom, child, name);
70 if (found) {
71 return found;
72 }
73 }
74 } while ((node = dom.getNextSibling(node)) != NULL);
75 return NULL;
76}
77
reed@android.com0f0cfae2009-10-13 13:33:16 +000078bool SkAnimatorView::decodeStream(SkStream* stream) {
79 delete fAnimator;
80 fAnimator = new SkAnimator;
81 fAnimator->setURIBase(fBaseURI.c_str());
reed@android.com0bb6d062010-05-17 14:50:04 +000082#if 0
reed@android.com0f0cfae2009-10-13 13:33:16 +000083 if (!fAnimator->decodeStream(stream)) {
84 delete fAnimator;
85 fAnimator = NULL;
86 return false;
87 }
reed@android.com0bb6d062010-05-17 14:50:04 +000088#else
89 size_t len = stream->getLength();
90 char* text = (char*)sk_malloc_throw(len);
91 stream->read(text, len);
92 SkDOM dom;
93 const SkDOM::Node* root = dom.build(text, len);
94 if (NULL == root) {
95 return false;
96 }
97 if (!fAnimator->decodeDOM(dom, root)) {
98 delete fAnimator;
99 fAnimator = NULL;
100 return false;
101 }
102 for (int i = 0; i <= 10; i++) {
103 SkString name("glyph");
104 name.appendS32(i);
105 const SkDOM::Node* node = find_nodeID(dom, NULL, name.c_str());
106 SkASSERT(node);
107 SkRect r;
108 dom.findScalar(node, "left", &r.fLeft);
109 dom.findScalar(node, "top", &r.fTop);
110 dom.findScalar(node, "width", &r.fRight); r.fRight += r.fLeft;
111 dom.findScalar(node, "height", &r.fBottom); r.fBottom += r.fTop;
112 SkDebugf("--- %s [%g %g %g %g]\n", name.c_str(),
113 r.fLeft, r.fTop, r.fRight, r.fBottom);
114 }
115#endif
reed@android.com0f0cfae2009-10-13 13:33:16 +0000116 return true;
117}
118
119#include "SkTime.h"
120
121void SkAnimatorView::onDraw(SkCanvas* canvas) {
122 if (fAnimator) {
123 canvas->drawColor(SK_ColorWHITE);
reed@android.com80b4ebe2009-10-21 19:41:10 +0000124 fAnimator->draw(canvas, 0);
reed@android.com0bb6d062010-05-17 14:50:04 +0000125#if 0
reed@android.com80b4ebe2009-10-21 19:41:10 +0000126 canvas->save();
127 canvas->translate(120, 30);
128 canvas->scale(0.5, 0.5);
129 fAnimator->draw(canvas, 0);
130 canvas->restore();
131
132 canvas->save();
133 canvas->translate(190, 40);
134 canvas->scale(0.25, 0.25);
135 fAnimator->draw(canvas, 0);
136 canvas->restore();
137
reed@android.com0f0cfae2009-10-13 13:33:16 +0000138 this->inval(NULL);
reed@android.com0bb6d062010-05-17 14:50:04 +0000139#endif
reed@android.com0f0cfae2009-10-13 13:33:16 +0000140 }
141}
142
143//////////////////////////////////////////////////////////////////////////////
144
145static SkView* MyFactory() {
146 SkAnimatorView* av = new SkAnimatorView;
147// av->decodeFile("/skimages/test.xml");
reed@android.com0bb6d062010-05-17 14:50:04 +0000148#if 0
reed@android.com0f0cfae2009-10-13 13:33:16 +0000149 av->setURIBase("/skia/trunk/animations/");
reed@android.com80b4ebe2009-10-21 19:41:10 +0000150 av->decodeFile("/skia/trunk/animations/checkbox.xml");
reed@android.com0bb6d062010-05-17 14:50:04 +0000151#else
152 av->setURIBase("/");
153 av->decodeFile("/testanim.txt");
154#endif
reed@android.com0f0cfae2009-10-13 13:33:16 +0000155 return av;
156}
157
158static SkViewRegister reg(MyFactory);
159