1/* libs/graphics/animator/SkDisplayTypes.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 "SkDisplayTypes.h" 19#include "SkAnimateBase.h" 20 21bool SkDisplayDepend::canContainDependents() const { 22 return true; 23} 24 25void SkDisplayDepend::dirty() { 26 SkDisplayable** last = fDependents.end(); 27 for (SkDisplayable** depPtr = fDependents.begin(); depPtr < last; depPtr++) { 28 SkAnimateBase* animate = (SkAnimateBase* ) *depPtr; 29 animate->setChanged(true); 30 } 31} 32 33// Boolean 34#if SK_USE_CONDENSED_INFO == 0 35 36const SkMemberInfo SkDisplayBoolean::fInfo[] = { 37 SK_MEMBER(value, Boolean) 38}; 39 40#endif 41 42DEFINE_GET_MEMBER(SkDisplayBoolean); 43 44SkDisplayBoolean::SkDisplayBoolean() : value(false) { 45} 46 47#ifdef SK_DUMP_ENABLED 48void SkDisplayBoolean::dump(SkAnimateMaker* maker){ 49 dumpBase(maker); 50 SkDebugf("value=\"%s\" />\n", value ? "true" : "false"); 51} 52#endif 53 54// int32_t 55#if SK_USE_CONDENSED_INFO == 0 56 57const SkMemberInfo SkDisplayInt::fInfo[] = { 58 SK_MEMBER(value, Int) 59}; 60 61#endif 62 63DEFINE_GET_MEMBER(SkDisplayInt); 64 65SkDisplayInt::SkDisplayInt() : value(0) { 66} 67 68#ifdef SK_DUMP_ENABLED 69void SkDisplayInt::dump(SkAnimateMaker* maker){ 70 dumpBase(maker); 71 SkDebugf("value=\"%d\" />\n", value); 72} 73#endif 74 75// SkScalar 76#if SK_USE_CONDENSED_INFO == 0 77 78const SkMemberInfo SkDisplayFloat::fInfo[] = { 79 SK_MEMBER(value, Float) 80}; 81 82#endif 83 84DEFINE_GET_MEMBER(SkDisplayFloat); 85 86SkDisplayFloat::SkDisplayFloat() : value(0) { 87} 88 89#ifdef SK_DUMP_ENABLED 90void SkDisplayFloat::dump(SkAnimateMaker* maker) { 91 dumpBase(maker); 92#ifdef SK_CAN_USE_FLOAT 93 SkDebugf("value=\"%g\" />\n", SkScalarToFloat(value)); 94#else 95 SkDebugf("value=\"%x\" />\n", value); 96#endif 97} 98#endif 99 100// SkString 101enum SkDisplayString_Functions { 102 SK_FUNCTION(slice) 103}; 104 105enum SkDisplayString_Properties { 106 SK_PROPERTY(length) 107}; 108 109const SkFunctionParamType SkDisplayString::fFunctionParameters[] = { 110 (SkFunctionParamType) SkType_Int, // slice 111 (SkFunctionParamType) SkType_Int, 112 (SkFunctionParamType) 0 113}; 114 115#if SK_USE_CONDENSED_INFO == 0 116 117const SkMemberInfo SkDisplayString::fInfo[] = { 118 SK_MEMBER_PROPERTY(length, Int), 119 SK_MEMBER_FUNCTION(slice, String), 120 SK_MEMBER(value, String) 121}; 122 123#endif 124 125DEFINE_GET_MEMBER(SkDisplayString); 126 127SkDisplayString::SkDisplayString() { 128} 129 130SkDisplayString::SkDisplayString(SkString& copyFrom) : value(copyFrom) { 131} 132 133void SkDisplayString::executeFunction(SkDisplayable* target, int index, 134 SkTDArray<SkScriptValue>& parameters, SkDisplayTypes type, 135 SkScriptValue* scriptValue) { 136 if (scriptValue == NULL) 137 return; 138 SkASSERT(target == this); 139 switch (index) { 140 case SK_FUNCTION(slice): 141 scriptValue->fType = SkType_String; 142 SkASSERT(parameters[0].fType == SkType_Int); 143 int start = parameters[0].fOperand.fS32; 144 if (start < 0) 145 start = (int) (value.size() - start); 146 int end = (int) value.size(); 147 if (parameters.count() > 1) { 148 SkASSERT(parameters[1].fType == SkType_Int); 149 end = parameters[1].fOperand.fS32; 150 } 151 //if (end >= 0 && end < (int) value.size()) 152 if (end >= 0 && end <= (int) value.size()) 153 scriptValue->fOperand.fString = new SkString(&value.c_str()[start], end - start); 154 else 155 scriptValue->fOperand.fString = new SkString(value); 156 break; 157 } 158} 159 160const SkFunctionParamType* SkDisplayString::getFunctionsParameters() { 161 return fFunctionParameters; 162} 163 164bool SkDisplayString::getProperty(int index, SkScriptValue* scriptValue) const { 165 switch (index) { 166 case SK_PROPERTY(length): 167 scriptValue->fType = SkType_Int; 168 scriptValue->fOperand.fS32 = (int32_t) value.size(); 169 break; 170 default: 171 SkASSERT(0); 172 return false; 173 } 174 return true; 175} 176 177 178// SkArray 179#if 0 // !!! reason enough to qualify enum with class name or move typedArray into its own file 180enum SkDisplayArray_Properties { 181 SK_PROPERTY(length) 182}; 183#endif 184 185#if SK_USE_CONDENSED_INFO == 0 186 187const SkMemberInfo SkDisplayArray::fInfo[] = { 188 SK_MEMBER_PROPERTY(length, Int), 189 SK_MEMBER_ARRAY(values, Unknown) 190}; 191 192#endif 193 194DEFINE_GET_MEMBER(SkDisplayArray); 195 196SkDisplayArray::SkDisplayArray() { 197} 198 199SkDisplayArray::SkDisplayArray(SkTypedArray& copyFrom) : values(copyFrom) { 200 201} 202 203SkDisplayArray::~SkDisplayArray() { 204 if (values.getType() == SkType_String) { 205 for (int index = 0; index < values.count(); index++) 206 delete values[index].fString; 207 return; 208 } 209 if (values.getType() == SkType_Array) { 210 for (int index = 0; index < values.count(); index++) 211 delete values[index].fArray; 212 } 213} 214 215bool SkDisplayArray::getProperty(int index, SkScriptValue* value) const { 216 switch (index) { 217 case SK_PROPERTY(length): 218 value->fType = SkType_Int; 219 value->fOperand.fS32 = values.count(); 220 break; 221 default: 222 SkASSERT(0); 223 return false; 224 } 225 return true; 226} 227 228 229 230