Home | History | Annotate | Download | only in samplecode
      1 
      2 /*
      3  * Copyright 2011 Google Inc.
      4  *
      5  * Use of this source code is governed by a BSD-style license that can be
      6  * found in the LICENSE file.
      7  */
      8 #include "SampleCode.h"
      9 #include "SkView.h"
     10 #include "SkCanvas.h"
     11 
     12 #include "SkAnimator.h"
     13 #include "SkStream.h"
     14 #include "SkDOM.h"
     15 
     16 ///////////////////////////////////////////////////////////////////////////////
     17 
     18 class SkAnimatorView : public SkView {
     19 public:
     20     SkAnimatorView();
     21     virtual ~SkAnimatorView();
     22 
     23     void setURIBase(const char dir[]);
     24 
     25     SkAnimator* getAnimator() const { return fAnimator; }
     26 
     27     bool    decodeFile(const char path[]);
     28     bool    decodeMemory(const void* buffer, size_t size);
     29     bool    decodeStream(SkStream* stream);
     30 
     31 protected:
     32     // overrides
     33     virtual void onDraw(SkCanvas*);
     34     virtual bool onQuery(SkEvent* evt);
     35 
     36 private:
     37     SkString fBaseURI;
     38     SkAnimator* fAnimator;
     39 
     40     typedef SkView INHERITED;
     41 };
     42 
     43 SkAnimatorView::SkAnimatorView() : fAnimator(NULL) {}
     44 
     45 SkAnimatorView::~SkAnimatorView() {
     46     delete fAnimator;
     47 }
     48 
     49 void SkAnimatorView::setURIBase(const char dir[]) {
     50     fBaseURI.set(dir);
     51 }
     52 
     53 bool SkAnimatorView::decodeFile(const char path[]) {
     54     SkFILEStream* is = new SkFILEStream(path);
     55     SkAutoUnref aur(is);
     56     return is->isValid() && this->decodeStream(is);
     57 }
     58 
     59 bool SkAnimatorView::decodeMemory(const void* buffer, size_t size) {
     60     SkMemoryStream* is = new SkMemoryStream(buffer, size);
     61     SkAutoUnref aur(is);
     62     return this->decodeStream(is);
     63 }
     64 
     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) {
     87     delete fAnimator;
     88     fAnimator = new SkAnimator;
     89     fAnimator->setURIBase(fBaseURI.c_str());
     90 #if 0
     91     if (!fAnimator->decodeStream(stream)) {
     92         delete fAnimator;
     93         fAnimator = NULL;
     94         return false;
     95     }
     96 #else
     97     size_t len = stream->getLength();
     98     char* text = (char*)sk_malloc_throw(len);
     99     stream->read(text, len);
    100     SkDOM dom;
    101     const SkDOM::Node* root = dom.build(text, len);
    102     if (NULL == root) {
    103         return false;
    104     }
    105     if (!fAnimator->decodeDOM(dom, root)) {
    106         delete fAnimator;
    107         fAnimator = NULL;
    108         return false;
    109     }
    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
    124     return true;
    125 }
    126 
    127 #include "SkTime.h"
    128 
    129 void SkAnimatorView::onDraw(SkCanvas* canvas) {
    130     canvas->drawColor(SK_ColorWHITE);
    131     if (fAnimator) {
    132         fAnimator->draw(canvas, 0);
    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);
    147 #endif
    148     }
    149 }
    150 
    151 bool SkAnimatorView::onQuery(SkEvent* evt) {
    152     if (SampleCode::TitleQ(*evt)) {
    153         SampleCode::TitleR(evt, "Animator");
    154         return true;
    155     }
    156     return this->INHERITED::onQuery(evt);
    157 }
    158 
    159 //////////////////////////////////////////////////////////////////////////////
    160 
    161 static SkView* MyFactory() {
    162     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("/");
    169     av->decodeFile("/testanim.txt");
    170 #endif
    171     return av;
    172 }
    173 
    174 static SkViewRegister reg(MyFactory);
    175