1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/skia/trunk/src/animator/SkAnimateBase.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,235 @@ 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 "SkAnimateBase.h" 1.14 +#include "SkAnimateMaker.h" 1.15 +#include "SkAnimateProperties.h" 1.16 +#include "SkAnimatorScript.h" 1.17 +#include "SkDisplayApply.h" 1.18 +#include "SkDrawable.h" 1.19 + 1.20 +#if SK_USE_CONDENSED_INFO == 0 1.21 + 1.22 +const SkMemberInfo SkAnimateBase::fInfo[] = { 1.23 + SK_MEMBER(begin, MSec), 1.24 + SK_MEMBER_ARRAY(blend, Float), 1.25 + SK_MEMBER(dur, MSec), 1.26 + SK_MEMBER_PROPERTY(dynamic, Boolean), 1.27 + SK_MEMBER(field, String), // name of member info in target 1.28 + SK_MEMBER(formula, DynamicString), 1.29 + SK_MEMBER(from, DynamicString), 1.30 + SK_MEMBER(lval, DynamicString), 1.31 + SK_MEMBER_PROPERTY(mirror, Boolean), 1.32 + SK_MEMBER(repeat, Float), 1.33 + SK_MEMBER_PROPERTY(reset, Boolean), 1.34 + SK_MEMBER_PROPERTY(step, Int), 1.35 + SK_MEMBER(target, DynamicString), 1.36 + SK_MEMBER(to, DynamicString), 1.37 + SK_MEMBER_PROPERTY(values, DynamicString) 1.38 +}; 1.39 + 1.40 +#endif 1.41 + 1.42 +DEFINE_GET_MEMBER(SkAnimateBase); 1.43 + 1.44 +SkAnimateBase::SkAnimateBase() : begin(0), dur(1), repeat(SK_Scalar1), 1.45 + fApply(NULL), fFieldInfo(NULL), fFieldOffset(0), fStart((SkMSec) -1), fTarget(NULL), 1.46 + fChanged(0), fDelayed(0), fDynamic(0), fHasEndEvent(0), fHasValues(0), 1.47 + fMirror(0), fReset(0), fResetPending(0), fTargetIsScope(0) { 1.48 + blend.setCount(1); 1.49 + blend[0] = SK_Scalar1; 1.50 +} 1.51 + 1.52 +SkAnimateBase::~SkAnimateBase() { 1.53 + SkDisplayTypes type = fValues.getType(); 1.54 + if (type == SkType_String || type == SkType_DynamicString) { 1.55 + SkASSERT(fValues.count() == 1); 1.56 + delete fValues[0].fString; 1.57 + } 1.58 +} 1.59 + 1.60 +int SkAnimateBase::components() { 1.61 + return 1; 1.62 +} 1.63 + 1.64 +SkDisplayable* SkAnimateBase::deepCopy(SkAnimateMaker* maker) { 1.65 + SkAnimateBase* result = (SkAnimateBase*) INHERITED::deepCopy(maker); 1.66 + result->fApply = fApply; 1.67 + result->fFieldInfo =fFieldInfo; 1.68 + result->fHasValues = false; 1.69 + return result; 1.70 +} 1.71 + 1.72 +void SkAnimateBase::dirty() { 1.73 + fChanged = true; 1.74 +} 1.75 + 1.76 +#ifdef SK_DUMP_ENABLED 1.77 +void SkAnimateBase::dump(SkAnimateMaker* maker) { 1.78 + dumpBase(maker); 1.79 + if (target.size() > 0) 1.80 + SkDebugf("target=\"%s\" ", target.c_str()); 1.81 + else if (fTarget && strcmp(fTarget->id, "")) 1.82 + SkDebugf("target=\"%s\" ", fTarget->id); 1.83 + if (lval.size() > 0) 1.84 + SkDebugf("lval=\"%s\" ", lval.c_str()); 1.85 + if (field.size() > 0) 1.86 + SkDebugf("field=\"%s\" ", field.c_str()); 1.87 + else if (fFieldInfo) 1.88 + SkDebugf("field=\"%s\" ", fFieldInfo->fName); 1.89 + if (formula.size() > 0) 1.90 + SkDebugf("formula=\"%s\" ", formula.c_str()); 1.91 + else { 1.92 + if (from.size() > 0) 1.93 + SkDebugf("from=\"%s\" ", from.c_str()); 1.94 + SkDebugf("to=\"%s\" ", to.c_str()); 1.95 + } 1.96 + if (begin != 0) { 1.97 + SkDebugf("begin=\"%g\" ", SkScalarToFloat(SkScalarDiv(begin,1000))); 1.98 + } 1.99 +} 1.100 +#endif 1.101 + 1.102 +SkDisplayable* SkAnimateBase::getParent() const { 1.103 + return (SkDisplayable*) fApply; 1.104 +} 1.105 + 1.106 +bool SkAnimateBase::getProperty(int index, SkScriptValue* value) const { 1.107 + int boolResult; 1.108 + switch (index) { 1.109 + case SK_PROPERTY(dynamic): 1.110 + boolResult = fDynamic; 1.111 + goto returnBool; 1.112 + case SK_PROPERTY(mirror): 1.113 + boolResult = fMirror; 1.114 + goto returnBool; 1.115 + case SK_PROPERTY(reset): 1.116 + boolResult = fReset; 1.117 +returnBool: 1.118 + value->fOperand.fS32 = SkToBool(boolResult); 1.119 + value->fType = SkType_Boolean; 1.120 + break; 1.121 + case SK_PROPERTY(step): 1.122 + if (fApply == NULL) 1.123 + return false; // !!! notify there's an error? 1.124 + fApply->getStep(value); 1.125 + break; 1.126 + case SK_PROPERTY(values): 1.127 + value->fOperand.fString = (SkString*) &to; 1.128 + value->fType = SkType_String; 1.129 + break; 1.130 + default: 1.131 + SkASSERT(0); 1.132 + return false; 1.133 + } 1.134 + return true; 1.135 +} 1.136 + 1.137 +bool SkAnimateBase::hasExecute() const 1.138 +{ 1.139 + return false; 1.140 +} 1.141 + 1.142 +void SkAnimateBase::onEndElement(SkAnimateMaker& maker) { 1.143 + fChanged = false; 1.144 + setTarget(maker); 1.145 + if (field.size()) { 1.146 + SkASSERT(fTarget); 1.147 + fFieldInfo = fTarget->getMember(field.c_str()); 1.148 + field.reset(); 1.149 + } 1.150 + if (lval.size()) { 1.151 + // lval must be of the form x[y] 1.152 + const char* lvalStr = lval.c_str(); 1.153 + const char* arrayEnd = strchr(lvalStr, '['); 1.154 + if (arrayEnd == NULL) 1.155 + return; //should this return an error? 1.156 + size_t arrayNameLen = arrayEnd - lvalStr; 1.157 + SkString arrayStr(lvalStr, arrayNameLen); 1.158 + SkASSERT(fTarget); //this return an error? 1.159 + fFieldInfo = fTarget->getMember(arrayStr.c_str()); 1.160 + SkString scriptStr(arrayEnd + 1, lval.size() - arrayNameLen - 2); 1.161 + SkAnimatorScript::EvaluateInt(maker, this, scriptStr.c_str(), &fFieldOffset); 1.162 + } 1.163 +} 1.164 + 1.165 +void SkAnimateBase::packARGB(SkScalar array[], int count, SkTDOperandArray* converted) 1.166 +{ 1.167 + SkASSERT(count == 4); 1.168 + converted->setCount(1); 1.169 + SkColor color = SkColorSetARGB(SkScalarRoundToInt(array[0]), 1.170 + SkScalarRoundToInt(array[1]), 1.171 + SkScalarRoundToInt(array[2]), 1.172 + SkScalarRoundToInt(array[3])); 1.173 + (*converted)[0].fS32 = color; 1.174 +} 1.175 + 1.176 + 1.177 + 1.178 +void SkAnimateBase::refresh(SkAnimateMaker& ) { 1.179 +} 1.180 + 1.181 +bool SkAnimateBase::setParent(SkDisplayable* apply) { 1.182 + SkASSERT(apply->isApply()); 1.183 + fApply = (SkApply*) apply; 1.184 + return false; 1.185 +} 1.186 + 1.187 +bool SkAnimateBase::setProperty(int index, SkScriptValue& value) { 1.188 + bool boolValue = SkToBool(value.fOperand.fS32); 1.189 + switch (index) { 1.190 + case SK_PROPERTY(dynamic): 1.191 + fDynamic = boolValue; 1.192 + goto checkForBool; 1.193 + case SK_PROPERTY(values): 1.194 + fHasValues = true; 1.195 + SkASSERT(value.fType == SkType_String); 1.196 + to = *value.fOperand.fString; 1.197 + break; 1.198 + case SK_PROPERTY(mirror): 1.199 + fMirror = boolValue; 1.200 + goto checkForBool; 1.201 + case SK_PROPERTY(reset): 1.202 + fReset = boolValue; 1.203 +checkForBool: 1.204 + SkASSERT(value.fType == SkType_Boolean); 1.205 + break; 1.206 + default: 1.207 + return false; 1.208 + } 1.209 + return true; 1.210 +} 1.211 + 1.212 +void SkAnimateBase::setTarget(SkAnimateMaker& maker) { 1.213 + if (target.size()) { 1.214 + SkAnimatorScript engine(maker, this, SkType_Displayable); 1.215 + const char* script = target.c_str(); 1.216 + SkScriptValue scriptValue; 1.217 + bool success = engine.evaluateScript(&script, &scriptValue); 1.218 + if (success && scriptValue.fType == SkType_Displayable) 1.219 + fTarget = scriptValue.fOperand.fDrawable; 1.220 + else if (maker.find(target.c_str(), (SkDisplayable**) &fTarget) == false) { 1.221 + if (fApply->getMode() == SkApply::kMode_create) 1.222 + return; // may not be an error 1.223 + if (engine.getError() != SkScriptEngine::kNoError) 1.224 + maker.setScriptError(engine); 1.225 + else { 1.226 + maker.setErrorNoun(target); 1.227 + maker.setErrorCode(SkDisplayXMLParserError::kTargetIDNotFound); 1.228 + } 1.229 + return; 1.230 + } 1.231 + if (fApply && fApply->getMode() != SkApply::kMode_create) 1.232 + target.reset(); 1.233 + } 1.234 +} 1.235 + 1.236 +bool SkAnimateBase::targetNeedsInitialization() const { 1.237 + return false; 1.238 +}