1 2 /* 3 * Copyright 2006 The Android Open Source Project 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 10 #include "SkAnimate.h" 11 #include "SkAnimateMaker.h" 12 #include "SkDrawable.h" 13 #include "SkParse.h" 14 15 #if SK_USE_CONDENSED_INFO == 0 16 17 const SkMemberInfo SkAnimate::fInfo[] = { 18 SK_MEMBER_INHERITED 19 }; 20 21 #endif 22 23 DEFINE_GET_MEMBER(SkAnimate); 24 25 SkAnimate::SkAnimate() : fComponents(0) { 26 } 27 28 SkAnimate::~SkAnimate() { 29 } 30 31 int SkAnimate::components() { 32 return fComponents; 33 } 34 35 #ifdef SK_DUMP_ENABLED 36 void SkAnimate::dump(SkAnimateMaker* maker) { 37 INHERITED::dump(maker); //from animateBase 38 //SkSet inherits from this class 39 if (getType() != SkType_Set) { 40 if (fMirror) 41 SkDebugf("mirror=\"true\" "); 42 if (fReset) 43 SkDebugf("reset=\"true\" "); 44 #ifdef SK_CAN_USE_FLOAT 45 SkDebugf("dur=\"%g\" ", SkScalarToFloat(SkScalarDiv(dur,1000))); 46 if (repeat != SK_Scalar1) 47 SkDebugf("repeat=\"%g\" ", SkScalarToFloat(repeat)); 48 #else 49 SkDebugf("dur=\"%x\" ", SkScalarDiv(dur,1000)); 50 if (repeat != SK_Scalar1) 51 SkDebugf("repeat=\"%x\" ", repeat); 52 #endif 53 //if (fHasValues) 54 // SkDebugf("values=\"%s\" ", values); 55 if (blend.count() != 1 || blend[0] != SK_Scalar1) { 56 SkDebugf("blend=\"["); 57 bool firstElem = true; 58 for (int i = 0; i < blend.count(); i++) { 59 if (!firstElem) 60 SkDebugf(","); 61 firstElem = false; 62 #ifdef SK_CAN_USE_FLOAT 63 SkDebugf("%g", SkScalarToFloat(blend[i])); 64 #else 65 SkDebugf("%x", blend[i]); 66 #endif 67 } 68 SkDebugf("]\" "); 69 } 70 SkDebugf("/>\n");//i assume that if it IS, we will do it separately 71 } 72 } 73 #endif 74 75 bool SkAnimate::resolveCommon(SkAnimateMaker& maker) { 76 if (fTarget == NULL) // if NULL, recall onEndElement after apply closes and sets target to scope 77 return false; 78 INHERITED::onEndElement(maker); 79 return maker.hasError() == false; 80 } 81 82 void SkAnimate::onEndElement(SkAnimateMaker& maker) { 83 bool resolved = resolveCommon(maker); 84 if (resolved && fFieldInfo == NULL) { 85 maker.setErrorNoun(field); 86 maker.setErrorCode(SkDisplayXMLParserError::kFieldNotInTarget); 87 } 88 if (resolved == false || fFieldInfo == NULL) 89 return; 90 SkDisplayTypes outType = fFieldInfo->getType(); 91 if (fHasValues) { 92 SkASSERT(to.size() > 0); 93 fFieldInfo->setValue(maker, &fValues, 0, 0, NULL, outType, to); 94 SkASSERT(0); 95 // !!! this needs to set fComponents 96 return; 97 } 98 fComponents = fFieldInfo->getCount(); 99 if (fFieldInfo->fType == SkType_Array) { 100 SkTypedArray* array = (SkTypedArray*) fFieldInfo->memberData(fTarget); 101 int count = array->count(); 102 if (count > 0) 103 fComponents = count; 104 } 105 if (outType == SkType_ARGB) { 106 fComponents <<= 2; // four color components 107 outType = SkType_Float; 108 } 109 fValues.setType(outType); 110 if (formula.size() > 0){ 111 fComponents = 1; 112 from.set("0"); 113 to.set("dur"); 114 outType = SkType_MSec; 115 } 116 int max = fComponents * 2; 117 fValues.setCount(max); 118 memset(fValues.begin(), 0, max * sizeof(fValues.begin()[0])); 119 fFieldInfo->setValue(maker, &fValues, fFieldOffset, max, this, outType, from); 120 fFieldInfo->setValue(maker, &fValues, fComponents + fFieldOffset, max, this, outType, to); 121 } 122 123