Home | History | Annotate | Download | only in animator
      1 
      2 /*
      3  * Copyright 2006 The Android Open Source Project
      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 
      9 
     10 #include "SkDisplayMovie.h"
     11 #include "SkAnimateMaker.h"
     12 #include "SkCanvas.h"
     13 #include "SkPaint.h"
     14 
     15 #if SK_USE_CONDENSED_INFO == 0
     16 
     17 const SkMemberInfo SkDisplayMovie::fInfo[] = {
     18     SK_MEMBER(src, String)
     19 };
     20 
     21 #endif
     22 
     23 DEFINE_GET_MEMBER(SkDisplayMovie);
     24 
     25 SkDisplayMovie::SkDisplayMovie() : fDecodedSuccessfully(false), fLoaded(false), fMovieBuilt(false) {
     26     fMovie.fMaker->fInMovie = true;
     27 }
     28 
     29 SkDisplayMovie::~SkDisplayMovie() {
     30 }
     31 
     32 void SkDisplayMovie::buildMovie() {
     33     if (fMovieBuilt)
     34         return;
     35     SkAnimateMaker* movieMaker = fMovie.fMaker;
     36     SkAnimateMaker* parentMaker = movieMaker->fParentMaker;
     37     if (src.size() == 0 || parentMaker == NULL)
     38         return;
     39     movieMaker->fPrefix.set(parentMaker->fPrefix);
     40     fDecodedSuccessfully = fMovie.fMaker->decodeURI(src.c_str());
     41     if (fDecodedSuccessfully == false) {
     42 
     43         if (movieMaker->getErrorCode() != SkXMLParserError::kNoError || movieMaker->getNativeCode() != -1) {
     44             movieMaker->setInnerError(parentMaker, src);
     45             parentMaker->setErrorCode(SkDisplayXMLParserError::kInMovie);
     46         } else {
     47             parentMaker->setErrorNoun(src);
     48             parentMaker->setErrorCode(SkDisplayXMLParserError::kMovieNameUnknownOrMissing);
     49         }
     50     }
     51     fMovieBuilt = true;
     52 }
     53 
     54 SkDisplayable* SkDisplayMovie::deepCopy(SkAnimateMaker* maker) {
     55     SkDisplayMovie* copy = (SkDisplayMovie*) INHERITED::deepCopy(maker);
     56     copy->fMovie.fMaker->fParentMaker = fMovie.fMaker->fParentMaker;
     57     copy->fMovie.fMaker->fHostEventSinkID = fMovie.fMaker->fHostEventSinkID;
     58     copy->fMovieBuilt = false;
     59     *fMovie.fMaker->fParentMaker->fMovies.append() = copy;
     60     return copy;
     61 }
     62 
     63 void SkDisplayMovie::dirty() {
     64     buildMovie();
     65 }
     66 
     67 bool SkDisplayMovie::doEvent(SkDisplayEvent::Kind kind, SkEventState* state) {
     68     if (fLoaded == false)
     69         return false;
     70     fMovie.fMaker->fEnableTime = fMovie.fMaker->fParentMaker->fEnableTime;
     71     return fMovie.fMaker->fEvents.doEvent(*fMovie.fMaker, kind, state);
     72 }
     73 
     74 bool SkDisplayMovie::draw(SkAnimateMaker& maker) {
     75     if (fDecodedSuccessfully == false)
     76         return false;
     77     if (fLoaded == false)
     78         enable(maker);
     79     maker.fCanvas->save();
     80     SkPaint local = SkPaint(*maker.fPaint);
     81     bool result = fMovie.draw(maker.fCanvas, &local,
     82         maker.fDisplayList.getTime()) != SkAnimator::kNotDifferent;
     83     maker.fDisplayList.fInvalBounds.join(fMovie.fMaker->fDisplayList.fInvalBounds);
     84     maker.fCanvas->restore();
     85     return result;
     86 }
     87 
     88 #ifdef SK_DUMP_ENABLED
     89 void SkDisplayMovie::dump(SkAnimateMaker* maker) {
     90     dumpBase(maker);
     91     SkDebugf("src=\"%s\"/>\n",  src.c_str());
     92     SkAnimateMaker* movieMaker = fMovie.fMaker;
     93     SkDisplayList::fIndent += 4;
     94     movieMaker->fDisplayList.dumpInner(movieMaker);
     95     SkDisplayList::fIndent -= 4;
     96     dumpEnd(maker);
     97 }
     98 
     99 void SkDisplayMovie::dumpEvents() {
    100     fMovie.fMaker->fEvents.dump(*fMovie.fMaker);
    101 }
    102 #endif
    103 
    104 bool SkDisplayMovie::enable(SkAnimateMaker&) {
    105     if (fDecodedSuccessfully == false)
    106         return false;
    107     SkAnimateMaker* movieMaker = fMovie.fMaker;
    108     movieMaker->fEvents.doEvent(*movieMaker, SkDisplayEvent::kOnload, NULL);
    109     movieMaker->fEvents.removeEvent(SkDisplayEvent::kOnload, NULL);
    110     fLoaded = true;
    111     movieMaker->fLoaded = true;
    112     return false;
    113 }
    114 
    115 bool SkDisplayMovie::hasEnable() const {
    116     return true;
    117 }
    118 
    119 void SkDisplayMovie::onEndElement(SkAnimateMaker& maker) {
    120 #if defined SK_DEBUG && defined SK_DEBUG_ANIMATION_TIMING
    121     fMovie.fMaker->fDebugTimeBase = maker.fDebugTimeBase;
    122 #endif
    123     fMovie.fMaker->fPrefix.set(maker.fPrefix);
    124     fMovie.fMaker->fHostEventSinkID = maker.fHostEventSinkID;
    125     fMovie.fMaker->fParentMaker = &maker;
    126     buildMovie();
    127     *maker.fMovies.append() = this;
    128 }
    129