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 13bool SkDisplayDepend::canContainDependents() const { 14 return true; 15} 16 17void 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 28const SkMemberInfo SkDisplayBoolean::fInfo[] = { 29 SK_MEMBER(value, Boolean) 30}; 31 32#endif 33 34DEFINE_GET_MEMBER(SkDisplayBoolean); 35 36SkDisplayBoolean::SkDisplayBoolean() : value(false) { 37} 38 39#ifdef SK_DUMP_ENABLED 40void 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 49const SkMemberInfo SkDisplayInt::fInfo[] = { 50 SK_MEMBER(value, Int) 51}; 52 53#endif 54 55DEFINE_GET_MEMBER(SkDisplayInt); 56 57SkDisplayInt::SkDisplayInt() : value(0) { 58} 59 60#ifdef SK_DUMP_ENABLED 61void 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 70const SkMemberInfo SkDisplayFloat::fInfo[] = { 71 SK_MEMBER(value, Float) 72}; 73 74#endif 75 76DEFINE_GET_MEMBER(SkDisplayFloat); 77 78SkDisplayFloat::SkDisplayFloat() : value(0) { 79} 80 81#ifdef SK_DUMP_ENABLED 82void SkDisplayFloat::dump(SkAnimateMaker* maker) { 83 dumpBase(maker); 84 SkDebugf("value=\"%g\" />\n", SkScalarToFloat(value)); 85} 86#endif 87 88// SkString 89enum SkDisplayString_Functions { 90 SK_FUNCTION(slice) 91}; 92 93enum SkDisplayString_Properties { 94 SK_PROPERTY(length) 95}; 96 97const 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 105const 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 113DEFINE_GET_MEMBER(SkDisplayString); 114 115SkDisplayString::SkDisplayString() { 116} 117 118SkDisplayString::SkDisplayString(SkString& copyFrom) : value(copyFrom) { 119} 120 121void 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 148const SkFunctionParamType* SkDisplayString::getFunctionsParameters() { 149 return fFunctionParameters; 150} 151 152bool 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 168enum SkDisplayArray_Properties { 169 SK_PROPERTY(length) 170}; 171#endif 172 173#if SK_USE_CONDENSED_INFO == 0 174 175const SkMemberInfo SkDisplayArray::fInfo[] = { 176 SK_MEMBER_PROPERTY(length, Int), 177 SK_MEMBER_ARRAY(values, Unknown) 178}; 179 180#endif 181 182DEFINE_GET_MEMBER(SkDisplayArray); 183 184SkDisplayArray::SkDisplayArray() { 185} 186 187SkDisplayArray::SkDisplayArray(SkTypedArray& copyFrom) : values(copyFrom) { 188 189} 190 191SkDisplayArray::~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 203bool 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