1 /* libs/graphics/animator/SkAnimateSet.cpp 2 ** 3 ** Copyright 2006, The Android Open Source Project 4 ** 5 ** Licensed under the Apache License, Version 2.0 (the "License"); 6 ** you may not use this file except in compliance with the License. 7 ** You may obtain a copy of the License at 8 ** 9 ** http://www.apache.org/licenses/LICENSE-2.0 10 ** 11 ** Unless required by applicable law or agreed to in writing, software 12 ** distributed under the License is distributed on an "AS IS" BASIS, 13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 ** See the License for the specific language governing permissions and 15 ** limitations under the License. 16 */ 17 18 #include "SkAnimateSet.h" 19 #include "SkAnimateMaker.h" 20 #include "SkAnimateProperties.h" 21 #include "SkParse.h" 22 23 #if SK_USE_CONDENSED_INFO == 0 24 25 const SkMemberInfo SkSet::fInfo[] = { 26 SK_MEMBER(begin, MSec), 27 SK_MEMBER(dur, MSec), 28 SK_MEMBER_PROPERTY(dynamic, Boolean), 29 SK_MEMBER(field, String), 30 // SK_MEMBER(formula, DynamicString), 31 SK_MEMBER(lval, DynamicString), 32 // SK_MEMBER_PROPERTY(reset, Boolean), 33 SK_MEMBER_PROPERTY(step, Int), 34 SK_MEMBER(target, DynamicString), 35 SK_MEMBER(to, DynamicString) 36 }; 37 38 #endif 39 40 DEFINE_GET_MEMBER(SkSet); 41 42 SkSet::SkSet() { 43 dur = 1; 44 } 45 46 #ifdef SK_DUMP_ENABLED 47 void SkSet::dump(SkAnimateMaker* maker) { 48 INHERITED::dump(maker); 49 if (dur != 1) { 50 #ifdef SK_CAN_USE_FLOAT 51 SkDebugf("dur=\"%g\" ", SkScalarToFloat(SkScalarDiv(dur,1000))); 52 #else 53 SkDebugf("dur=\"%x\" ", SkScalarDiv(dur,1000)); 54 #endif 55 } 56 //don't want double />\n's 57 SkDebugf("/>\n"); 58 59 } 60 #endif 61 62 void SkSet::refresh(SkAnimateMaker& maker) { 63 fFieldInfo->setValue(maker, &fValues, 0, fFieldInfo->fCount, NULL, 64 fFieldInfo->getType(), to); 65 } 66 67 void SkSet::onEndElement(SkAnimateMaker& maker) { 68 if (resolveCommon(maker) == false) 69 return; 70 if (fFieldInfo == NULL) { 71 maker.setErrorCode(SkDisplayXMLParserError::kFieldNotInTarget); 72 return; 73 } 74 fReset = dur != 1; 75 SkDisplayTypes outType = fFieldInfo->getType(); 76 int comps = outType == SkType_String || outType == SkType_DynamicString ? 1 : 77 fFieldInfo->getSize((const SkDisplayable*) fTarget) / sizeof(int); 78 if (fValues.getType() == SkType_Unknown) { 79 fValues.setType(outType); 80 fValues.setCount(comps); 81 if (outType == SkType_String || outType == SkType_DynamicString) 82 fValues[0].fString = SkNEW(SkString); 83 else 84 memset(fValues.begin(), 0, fValues.count() * sizeof(fValues.begin()[0])); 85 } else { 86 SkASSERT(fValues.getType() == outType); 87 if (fFieldInfo->fType == SkType_Array) 88 comps = fValues.count(); 89 else 90 SkASSERT(fValues.count() == comps); 91 } 92 if (formula.size() > 0) { 93 comps = 1; 94 outType = SkType_MSec; 95 } 96 fFieldInfo->setValue(maker, &fValues, fFieldOffset, comps, this, outType, formula.size() > 0 ? formula : to); 97 fComponents = fValues.count(); 98 } 99