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