| 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 |