Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(253)

Side by Side Diff: samplecode/SampleAnimator.cpp

Issue 23137018: Minimal changes to make SampleAnimator do something useful. Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « resources/news.xml ('k') | src/animator/SkDisplayXMLParser.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2011 Google Inc. 3 * Copyright 2011 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 #include "SampleCode.h" 8 #include "SampleCode.h"
9 #include "SkView.h" 9 #include "SkView.h"
10 #include "SkCanvas.h" 10 #include "SkCanvas.h"
11 11
12 #include "SkAnimator.h" 12 #include "SkAnimator.h"
13 #include "SkStream.h" 13 #include "SkStream.h"
14 #include "SkDOM.h" 14 #include "SkDOM.h"
15 #include "SkXMLParser.h"
16
17 #include "gm.h"
15 18
16 /////////////////////////////////////////////////////////////////////////////// 19 ///////////////////////////////////////////////////////////////////////////////
17 20
18 class SkAnimatorView : public SkView { 21 class SkAnimatorView : public SkView {
19 public: 22 public:
20 SkAnimatorView(); 23 SkAnimatorView();
21 virtual ~SkAnimatorView(); 24 virtual ~SkAnimatorView();
22 25
23 void setURIBase(const char dir[]); 26 void setURIBase(const char dir[]);
24 27
25 SkAnimator* getAnimator() const { return fAnimator; } 28 SkAnimator* getAnimator() const { return fAnimator; }
26 29
27 bool decodeFile(const char path[]); 30 bool decodeFile(const char path[]);
28 bool decodeMemory(const void* buffer, size_t size); 31 bool decodeMemory(const void* buffer, size_t size);
29 bool decodeStream(SkStream* stream); 32 bool decodeStream(SkStream* stream);
30 33
31 protected: 34 protected:
32 // overrides 35 virtual bool onEvent(const SkEvent&) SK_OVERRIDE;
33 virtual void onDraw(SkCanvas*); 36 virtual void onDraw(SkCanvas*) SK_OVERRIDE;
34 virtual bool onQuery(SkEvent* evt); 37 virtual bool onQuery(SkEvent* evt) SK_OVERRIDE;
38
39 virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) SK_OVERRID E;
40 virtual bool onClick(Click* click) SK_OVERRIDE;
35 41
36 private: 42 private:
37 SkString fBaseURI; 43 SkString fBaseURI;
38 SkAnimator* fAnimator; 44 SkAnimator* fAnimator;
39
40 typedef SkView INHERITED; 45 typedef SkView INHERITED;
41 }; 46 };
42 47
43 SkAnimatorView::SkAnimatorView() : fAnimator(NULL) {} 48 SkAnimatorView::SkAnimatorView() : fAnimator(NULL) {}
44 49
45 SkAnimatorView::~SkAnimatorView() { 50 SkAnimatorView::~SkAnimatorView() {
46 delete fAnimator; 51 delete fAnimator;
47 } 52 }
48 53
49 void SkAnimatorView::setURIBase(const char dir[]) { 54 void SkAnimatorView::setURIBase(const char dir[]) {
50 fBaseURI.set(dir); 55 fBaseURI.set(dir);
51 } 56 }
52 57
53 bool SkAnimatorView::decodeFile(const char path[]) { 58 bool SkAnimatorView::decodeFile(const char path[]) {
54 SkFILEStream* is = new SkFILEStream(path); 59 SkFILEStream* is = new SkFILEStream(path);
55 SkAutoUnref aur(is); 60 SkAutoUnref aur(is);
56 return is->isValid() && this->decodeStream(is); 61 return is->isValid() && this->decodeStream(is);
57 } 62 }
58 63
59 bool SkAnimatorView::decodeMemory(const void* buffer, size_t size) { 64 bool SkAnimatorView::decodeMemory(const void* buffer, size_t size) {
60 SkMemoryStream* is = new SkMemoryStream(buffer, size); 65 SkMemoryStream* is = new SkMemoryStream(buffer, size);
61 SkAutoUnref aur(is); 66 SkAutoUnref aur(is);
62 return this->decodeStream(is); 67 return this->decodeStream(is);
63 } 68 }
64 69
65 static const SkDOMNode* find_nodeID(const SkDOM& dom,
66 const SkDOMNode* node, const char name[]) {
67 if (NULL == node) {
68 node = dom.getRootNode();
69 }
70 do {
71 const char* idval = dom.findAttr(node, "id");
72 if (idval && !strcmp(idval, name)) {
73 return node;
74 }
75 const SkDOMNode* child = dom.getFirstChild(node);
76 if (child) {
77 const SkDOMNode* found = find_nodeID(dom, child, name);
78 if (found) {
79 return found;
80 }
81 }
82 } while ((node = dom.getNextSibling(node)) != NULL);
83 return NULL;
84 }
85
86 bool SkAnimatorView::decodeStream(SkStream* stream) { 70 bool SkAnimatorView::decodeStream(SkStream* stream) {
87 delete fAnimator; 71 delete fAnimator;
88 fAnimator = new SkAnimator; 72 fAnimator = new SkAnimator;
89 fAnimator->setURIBase(fBaseURI.c_str()); 73 fAnimator->setURIBase(fBaseURI.c_str());
90 #if 0 74 #if 1
91 if (!fAnimator->decodeStream(stream)) { 75 if (!fAnimator->decodeStream(stream)) {
76 if (fAnimator->getParserError()->hasError()) {
77 SkDebugf("%s\n", fAnimator->getParserErrorString());
78 }
92 delete fAnimator; 79 delete fAnimator;
93 fAnimator = NULL; 80 fAnimator = NULL;
94 return false; 81 return false;
95 } 82 }
96 #else 83 #else
97 size_t len = stream->getLength(); 84 size_t len = stream->getLength();
98 char* text = (char*)sk_malloc_throw(len); 85 char* text = (char*)sk_malloc_throw(len);
99 stream->read(text, len); 86 stream->read(text, len);
100 SkDOM dom; 87 SkDOM dom;
101 const SkDOM::Node* root = dom.build(text, len); 88 const SkDOM::Node* root = dom.build(text, len);
102 if (NULL == root) { 89 if (NULL == root) {
103 return false; 90 return false;
104 } 91 }
105 if (!fAnimator->decodeDOM(dom, root)) { 92 if (!fAnimator->decodeDOM(dom, root)) {
93 if (fAnimator->getParserError()->hasError()) {
94 SkDebugf("%s\n", fAnimator->getParserErrorString());
95 }
106 delete fAnimator; 96 delete fAnimator;
107 fAnimator = NULL; 97 fAnimator = NULL;
108 return false; 98 return false;
109 } 99 }
110 for (int i = 0; i <= 10; i++) {
111 SkString name("glyph");
112 name.appendS32(i);
113 const SkDOM::Node* node = find_nodeID(dom, NULL, name.c_str());
114 SkASSERT(node);
115 SkRect r;
116 dom.findScalar(node, "left", &r.fLeft);
117 dom.findScalar(node, "top", &r.fTop);
118 dom.findScalar(node, "width", &r.fRight); r.fRight += r.fLeft;
119 dom.findScalar(node, "height", &r.fBottom); r.fBottom += r.fTop;
120 SkDebugf("--- %s [%g %g %g %g]\n", name.c_str(),
121 r.fLeft, r.fTop, r.fRight, r.fBottom);
122 }
123 #endif 100 #endif
124 return true; 101 return true;
125 } 102 }
126 103
127 #include "SkTime.h" 104 #include "SkTime.h"
128 105
106 bool SkAnimatorView::onEvent(const SkEvent& event) {
107 if (fAnimator) {
108 if (fAnimator->doEvent(event)) {
109 return true;
110 }
111 }
112 return this->INHERITED::onEvent(event);
113 }
114
129 void SkAnimatorView::onDraw(SkCanvas* canvas) { 115 void SkAnimatorView::onDraw(SkCanvas* canvas) {
130 canvas->drawColor(SK_ColorWHITE); 116 canvas->drawColor(SK_ColorWHITE);
131 if (fAnimator) { 117 if (fAnimator) {
132 fAnimator->draw(canvas, 0); 118 fAnimator->draw(canvas, SkTime::GetMSecs());
133 #if 0
134 canvas->save();
135 canvas->translate(120, 30);
136 canvas->scale(0.5, 0.5);
137 fAnimator->draw(canvas, 0);
138 canvas->restore();
139
140 canvas->save();
141 canvas->translate(190, 40);
142 canvas->scale(0.25, 0.25);
143 fAnimator->draw(canvas, 0);
144 canvas->restore();
145
146 this->inval(NULL); 119 this->inval(NULL);
147 #endif
148 } 120 }
149 } 121 }
150 122
151 bool SkAnimatorView::onQuery(SkEvent* evt) { 123 bool SkAnimatorView::onQuery(SkEvent* event) {
152 if (SampleCode::TitleQ(*evt)) { 124 if (SampleCode::TitleQ(*event)) {
153 SampleCode::TitleR(evt, "Animator"); 125 SampleCode::TitleR(event, "Animator");
154 return true; 126 return true;
155 } 127 }
156 return this->INHERITED::onQuery(evt); 128
129 if (fAnimator) {
130 SkUnichar uni;
131 if (SampleCode::CharQ(*event, &uni)) {
132 if (fAnimator->doCharEvent(uni)) {
133 return true;
134 }
135 }
136
137 SkKey key;
138 if (SampleCode::KeyQ(*event, &key)) {
139 if (fAnimator->doKeyEvent(key)) {
140 return true;
141 }
142 }
143 }
144 return this->INHERITED::onQuery(event);
145 }
146
147 SkView::Click* SkAnimatorView::onFindClickHandler(SkScalar x, SkScalar y) {
148 return new Click(this);
149 }
150
151 bool SkAnimatorView::onClick(Click* click) {
152 return fAnimator->doClickEvent(click->fState, click->fCurr.fX, click->fCurr. fY);
157 } 153 }
158 154
159 ////////////////////////////////////////////////////////////////////////////// 155 //////////////////////////////////////////////////////////////////////////////
160 156
161 static SkView* MyFactory() { 157 static SkView* MyFactory() {
162 SkAnimatorView* av = new SkAnimatorView; 158 SkAnimatorView* av = new SkAnimatorView;
163 // av->decodeFile("/skimages/test.xml");
164 #if 0
165 av->setURIBase("/skia/trunk/animations/");
166 av->decodeFile("/skia/trunk/animations/checkbox.xml");
167 #else
168 av->setURIBase("/"); 159 av->setURIBase("/");
169 av->decodeFile("/testanim.txt"); 160 SkString animation = skiagm::GM::GetResourcePath();
170 #endif 161 animation.append("/news.xml");
162 if (!av->decodeFile(animation.c_str())) {
163 SkDebugf("Could not load: %s", animation.c_str());
164 }
171 return av; 165 return av;
172 } 166 }
173 167
174 static SkViewRegister reg(MyFactory); 168 static SkViewRegister reg(MyFactory);
OLDNEW
« no previous file with comments | « resources/news.xml ('k') | src/animator/SkDisplayXMLParser.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698