OLD | NEW |
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); |
OLD | NEW |