gfx/skia/trunk/src/animator/SkDisplayMovie.cpp

changeset 0
6474c204b198
     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 +}

mercurial