1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/skia/trunk/src/animator/SkDisplayMovie.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,128 @@ 1.4 + 1.5 +/* 1.6 + * Copyright 2006 The Android Open Source Project 1.7 + * 1.8 + * Use of this source code is governed by a BSD-style license that can be 1.9 + * found in the LICENSE file. 1.10 + */ 1.11 + 1.12 + 1.13 +#include "SkDisplayMovie.h" 1.14 +#include "SkAnimateMaker.h" 1.15 +#include "SkCanvas.h" 1.16 +#include "SkPaint.h" 1.17 + 1.18 +#if SK_USE_CONDENSED_INFO == 0 1.19 + 1.20 +const SkMemberInfo SkDisplayMovie::fInfo[] = { 1.21 + SK_MEMBER(src, String) 1.22 +}; 1.23 + 1.24 +#endif 1.25 + 1.26 +DEFINE_GET_MEMBER(SkDisplayMovie); 1.27 + 1.28 +SkDisplayMovie::SkDisplayMovie() : fDecodedSuccessfully(false), fLoaded(false), fMovieBuilt(false) { 1.29 + fMovie.fMaker->fInMovie = true; 1.30 +} 1.31 + 1.32 +SkDisplayMovie::~SkDisplayMovie() { 1.33 +} 1.34 + 1.35 +void SkDisplayMovie::buildMovie() { 1.36 + if (fMovieBuilt) 1.37 + return; 1.38 + SkAnimateMaker* movieMaker = fMovie.fMaker; 1.39 + SkAnimateMaker* parentMaker = movieMaker->fParentMaker; 1.40 + if (src.size() == 0 || parentMaker == NULL) 1.41 + return; 1.42 + movieMaker->fPrefix.set(parentMaker->fPrefix); 1.43 + fDecodedSuccessfully = fMovie.fMaker->decodeURI(src.c_str()); 1.44 + if (fDecodedSuccessfully == false) { 1.45 + 1.46 + if (movieMaker->getErrorCode() != SkXMLParserError::kNoError || movieMaker->getNativeCode() != -1) { 1.47 + movieMaker->setInnerError(parentMaker, src); 1.48 + parentMaker->setErrorCode(SkDisplayXMLParserError::kInMovie); 1.49 + } else { 1.50 + parentMaker->setErrorNoun(src); 1.51 + parentMaker->setErrorCode(SkDisplayXMLParserError::kMovieNameUnknownOrMissing); 1.52 + } 1.53 + } 1.54 + fMovieBuilt = true; 1.55 +} 1.56 + 1.57 +SkDisplayable* SkDisplayMovie::deepCopy(SkAnimateMaker* maker) { 1.58 + SkDisplayMovie* copy = (SkDisplayMovie*) INHERITED::deepCopy(maker); 1.59 + copy->fMovie.fMaker->fParentMaker = fMovie.fMaker->fParentMaker; 1.60 + copy->fMovie.fMaker->fHostEventSinkID = fMovie.fMaker->fHostEventSinkID; 1.61 + copy->fMovieBuilt = false; 1.62 + *fMovie.fMaker->fParentMaker->fMovies.append() = copy; 1.63 + return copy; 1.64 +} 1.65 + 1.66 +void SkDisplayMovie::dirty() { 1.67 + buildMovie(); 1.68 +} 1.69 + 1.70 +bool SkDisplayMovie::doEvent(SkDisplayEvent::Kind kind, SkEventState* state) { 1.71 + if (fLoaded == false) 1.72 + return false; 1.73 + fMovie.fMaker->fEnableTime = fMovie.fMaker->fParentMaker->fEnableTime; 1.74 + return fMovie.fMaker->fEvents.doEvent(*fMovie.fMaker, kind, state); 1.75 +} 1.76 + 1.77 +bool SkDisplayMovie::draw(SkAnimateMaker& maker) { 1.78 + if (fDecodedSuccessfully == false) 1.79 + return false; 1.80 + if (fLoaded == false) 1.81 + enable(maker); 1.82 + maker.fCanvas->save(); 1.83 + SkPaint local = SkPaint(*maker.fPaint); 1.84 + bool result = fMovie.draw(maker.fCanvas, &local, 1.85 + maker.fDisplayList.getTime()) != SkAnimator::kNotDifferent; 1.86 + maker.fDisplayList.fInvalBounds.join(fMovie.fMaker->fDisplayList.fInvalBounds); 1.87 + maker.fCanvas->restore(); 1.88 + return result; 1.89 +} 1.90 + 1.91 +#ifdef SK_DUMP_ENABLED 1.92 +void SkDisplayMovie::dump(SkAnimateMaker* maker) { 1.93 + dumpBase(maker); 1.94 + SkDebugf("src=\"%s\"/>\n", src.c_str()); 1.95 + SkAnimateMaker* movieMaker = fMovie.fMaker; 1.96 + SkDisplayList::fIndent += 4; 1.97 + movieMaker->fDisplayList.dumpInner(movieMaker); 1.98 + SkDisplayList::fIndent -= 4; 1.99 + dumpEnd(maker); 1.100 +} 1.101 + 1.102 +void SkDisplayMovie::dumpEvents() { 1.103 + fMovie.fMaker->fEvents.dump(*fMovie.fMaker); 1.104 +} 1.105 +#endif 1.106 + 1.107 +bool SkDisplayMovie::enable(SkAnimateMaker&) { 1.108 + if (fDecodedSuccessfully == false) 1.109 + return false; 1.110 + SkAnimateMaker* movieMaker = fMovie.fMaker; 1.111 + movieMaker->fEvents.doEvent(*movieMaker, SkDisplayEvent::kOnload, NULL); 1.112 + movieMaker->fEvents.removeEvent(SkDisplayEvent::kOnload, NULL); 1.113 + fLoaded = true; 1.114 + movieMaker->fLoaded = true; 1.115 + return false; 1.116 +} 1.117 + 1.118 +bool SkDisplayMovie::hasEnable() const { 1.119 + return true; 1.120 +} 1.121 + 1.122 +void SkDisplayMovie::onEndElement(SkAnimateMaker& maker) { 1.123 +#if defined SK_DEBUG && defined SK_DEBUG_ANIMATION_TIMING 1.124 + fMovie.fMaker->fDebugTimeBase = maker.fDebugTimeBase; 1.125 +#endif 1.126 + fMovie.fMaker->fPrefix.set(maker.fPrefix); 1.127 + fMovie.fMaker->fHostEventSinkID = maker.fHostEventSinkID; 1.128 + fMovie.fMaker->fParentMaker = &maker; 1.129 + buildMovie(); 1.130 + *maker.fMovies.append() = this; 1.131 +}