1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
8ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkAnimateBase.h"
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkAnimateMaker.h"
128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkAnimateProperties.h"
138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkAnimatorScript.h"
148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDisplayApply.h"
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDrawable.h"
168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if SK_USE_CONDENSED_INFO == 0
188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst SkMemberInfo SkAnimateBase::fInfo[] = {
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER(begin, MSec),
218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER_ARRAY(blend, Float),
228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER(dur, MSec),
238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER_PROPERTY(dynamic, Boolean),
248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER(field, String),   // name of member info in target
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER(formula, DynamicString),
268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER(from, DynamicString),
278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER(lval, DynamicString),
288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER_PROPERTY(mirror, Boolean),
298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER(repeat, Float),
308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER_PROPERTY(reset, Boolean),
318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER_PROPERTY(step, Int),
328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER(target, DynamicString),
338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER(to, DynamicString),
348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER_PROPERTY(values, DynamicString)
358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comDEFINE_GET_MEMBER(SkAnimateBase);
408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkAnimateBase::SkAnimateBase() : begin(0), dur(1), repeat(SK_Scalar1),
42d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com        fApply(NULL), fFieldInfo(NULL), fFieldOffset(0), fStart((SkMSec) -1), fTarget(NULL),
43d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com        fChanged(0), fDelayed(0), fDynamic(0), fHasEndEvent(0), fHasValues(0),
448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fMirror(0), fReset(0), fResetPending(0), fTargetIsScope(0) {
458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    blend.setCount(1);
468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    blend[0] = SK_Scalar1;
478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkAnimateBase::~SkAnimateBase() {
508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDisplayTypes type = fValues.getType();
518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (type == SkType_String || type == SkType_DynamicString) {
528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkASSERT(fValues.count() == 1);
538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        delete fValues[0].fString;
548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
57d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comint SkAnimateBase::components() {
58d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    return 1;
598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkDisplayable* SkAnimateBase::deepCopy(SkAnimateMaker* maker) {
628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkAnimateBase* result = (SkAnimateBase*) INHERITED::deepCopy(maker);
638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    result->fApply = fApply;
648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    result->fFieldInfo =fFieldInfo;
658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    result->fHasValues = false;
668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return result;
678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkAnimateBase::dirty() {
708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fChanged = true;
718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DUMP_ENABLED
748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkAnimateBase::dump(SkAnimateMaker* maker) {
758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    dumpBase(maker);
768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (target.size() > 0)
778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDebugf("target=\"%s\" ", target.c_str());
788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    else if (fTarget && strcmp(fTarget->id, ""))
798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDebugf("target=\"%s\" ", fTarget->id);
808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (lval.size() > 0)
818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDebugf("lval=\"%s\" ", lval.c_str());
828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (field.size() > 0)
838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDebugf("field=\"%s\" ", field.c_str());
848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    else if (fFieldInfo)
858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDebugf("field=\"%s\" ", fFieldInfo->fName);
868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (formula.size() > 0)
878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDebugf("formula=\"%s\" ", formula.c_str());
888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    else {
898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (from.size() > 0)
908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkDebugf("from=\"%s\" ", from.c_str());
918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDebugf("to=\"%s\" ", to.c_str());
928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (begin != 0) {
948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDebugf("begin=\"%g\" ", SkScalarToFloat(SkScalarDiv(begin,1000)));
958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkDisplayable* SkAnimateBase::getParent() const {
1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return (SkDisplayable*) fApply;
1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkAnimateBase::getProperty(int index, SkScriptValue* value) const {
1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int boolResult;
1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    switch (index) {
1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case SK_PROPERTY(dynamic):
1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            boolResult = fDynamic;
1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            goto returnBool;
1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case SK_PROPERTY(mirror):
1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            boolResult = fMirror;
1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            goto returnBool;
1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case SK_PROPERTY(reset):
1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            boolResult = fReset;
1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comreturnBool:
1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            value->fOperand.fS32 = SkToBool(boolResult);
1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            value->fType = SkType_Boolean;
1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            break;
1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case SK_PROPERTY(step):
1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            if (fApply == NULL)
1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                return false;    // !!! notify there's an error?
1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            fApply->getStep(value);
1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            break;
1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case SK_PROPERTY(values):
1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            value->fOperand.fString = (SkString*) &to;
1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            value->fType = SkType_String;
1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            break;
1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        default:
1288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkASSERT(0);
1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return false;
1308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return true;
1328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
134d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.combool SkAnimateBase::hasExecute() const
1358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
136d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    return false;
1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkAnimateBase::onEndElement(SkAnimateMaker& maker) {
1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fChanged = false;
1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    setTarget(maker);
1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (field.size()) {
1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkASSERT(fTarget);
1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fFieldInfo = fTarget->getMember(field.c_str());
1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        field.reset();
1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (lval.size()) {
1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        // lval must be of the form x[y]
1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        const char* lvalStr = lval.c_str();
1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        const char* arrayEnd = strchr(lvalStr, '[');
1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (arrayEnd == NULL)
1528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return; //should this return an error?
1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        size_t arrayNameLen = arrayEnd - lvalStr;
1548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkString arrayStr(lvalStr, arrayNameLen);
1558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkASSERT(fTarget);  //this return an error?
1568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fFieldInfo = fTarget->getMember(arrayStr.c_str());
1578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkString scriptStr(arrayEnd + 1, lval.size() - arrayNameLen - 2);
1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkAnimatorScript::EvaluateInt(maker, this, scriptStr.c_str(), &fFieldOffset);
1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
162d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comvoid SkAnimateBase::packARGB(SkScalar array[], int count, SkTDOperandArray* converted)
163d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com{
1648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(count == 4);
1658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    converted->setCount(1);
166e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com    SkColor color = SkColorSetARGB(SkScalarRoundToInt(array[0]),
167e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com                                   SkScalarRoundToInt(array[1]),
168e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com                                   SkScalarRoundToInt(array[2]),
169e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com                                   SkScalarRoundToInt(array[3]));
1708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    (*converted)[0].fS32 = color;
1718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkAnimateBase::refresh(SkAnimateMaker& ) {
1768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkAnimateBase::setParent(SkDisplayable* apply) {
1798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(apply->isApply());
1808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fApply = (SkApply*) apply;
1818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return false;
1828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkAnimateBase::setProperty(int index, SkScriptValue& value) {
1858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bool boolValue = SkToBool(value.fOperand.fS32);
1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    switch (index) {
1878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case SK_PROPERTY(dynamic):
1888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            fDynamic = boolValue;
1898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            goto checkForBool;
1908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case SK_PROPERTY(values):
1918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            fHasValues = true;
1928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkASSERT(value.fType == SkType_String);
1938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            to = *value.fOperand.fString;
1948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            break;
1958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case SK_PROPERTY(mirror):
1968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            fMirror = boolValue;
1978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            goto checkForBool;
1988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case SK_PROPERTY(reset):
1998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            fReset = boolValue;
2008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comcheckForBool:
2018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkASSERT(value.fType == SkType_Boolean);
2028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            break;
2038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        default:
2048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return false;
2058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
2068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return true;
2078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkAnimateBase::setTarget(SkAnimateMaker& maker) {
2108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (target.size()) {
2118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkAnimatorScript engine(maker, this, SkType_Displayable);
2128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        const char* script = target.c_str();
2138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkScriptValue scriptValue;
2148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        bool success = engine.evaluateScript(&script, &scriptValue);
2158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (success && scriptValue.fType == SkType_Displayable)
2168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            fTarget = scriptValue.fOperand.fDrawable;
2178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        else if (maker.find(target.c_str(), (SkDisplayable**) &fTarget) == false) {
2188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            if (fApply->getMode() == SkApply::kMode_create)
2198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                return; // may not be an error
2208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            if (engine.getError() != SkScriptEngine::kNoError)
2218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                maker.setScriptError(engine);
2228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            else {
2238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                maker.setErrorNoun(target);
2248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                maker.setErrorCode(SkDisplayXMLParserError::kTargetIDNotFound);
2258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            }
2268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return;
2278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
2288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (fApply && fApply->getMode() != SkApply::kMode_create)
2298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            target.reset();
2308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
2318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
233d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.combool SkAnimateBase::targetNeedsInitialization() const {
234d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    return false;
2358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
236