| OLD | NEW |
| (Empty) |
| 1 /* libs/graphics/animator/SkMemberInfo.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 "SkMemberInfo.h" | |
| 19 #include "SkAnimateMaker.h" | |
| 20 #include "SkAnimatorScript.h" | |
| 21 #include "SkBase64.h" | |
| 22 #include "SkCamera.h" | |
| 23 #include "SkDisplayable.h" | |
| 24 #include "SkDisplayTypes.h" | |
| 25 #include "SkDraw3D.h" | |
| 26 #include "SkDrawColor.h" | |
| 27 #include "SkParse.h" | |
| 28 #include "SkScript.h" | |
| 29 #include "SkTSearch.h" | |
| 30 #include "SkTypedArray.h" | |
| 31 | |
| 32 size_t SkMemberInfo::GetSize(SkDisplayTypes type) { // size of simple types only | |
| 33 size_t byteSize; | |
| 34 switch (type) { | |
| 35 case SkType_ARGB: | |
| 36 byteSize = sizeof(SkColor); | |
| 37 break; | |
| 38 case SkType_AddMode: | |
| 39 case SkType_Align: | |
| 40 case SkType_ApplyMode: | |
| 41 case SkType_ApplyTransition: | |
| 42 case SkType_BitmapEncoding: | |
| 43 case SkType_Boolean: | |
| 44 case SkType_Cap: | |
| 45 case SkType_EventCode: | |
| 46 case SkType_EventKind: | |
| 47 case SkType_EventMode: | |
| 48 case SkType_FilterType: | |
| 49 case SkType_FontStyle: | |
| 50 case SkType_FromPathMode: | |
| 51 case SkType_Join: | |
| 52 case SkType_MaskFilterBlurStyle: | |
| 53 case SkType_PathDirection: | |
| 54 case SkType_Style: | |
| 55 case SkType_TileMode: | |
| 56 case SkType_Xfermode: | |
| 57 byteSize = sizeof(int); | |
| 58 break; | |
| 59 case SkType_Base64: // assume base64 data is always const, copied by ref | |
| 60 case SkType_Displayable: | |
| 61 case SkType_Drawable: | |
| 62 case SkType_Matrix: | |
| 63 byteSize = sizeof(void*); | |
| 64 break; | |
| 65 case SkType_MSec: | |
| 66 byteSize = sizeof(SkMSec); | |
| 67 break; | |
| 68 case SkType_Point: | |
| 69 byteSize = sizeof(SkPoint); | |
| 70 break; | |
| 71 case SkType_3D_Point: | |
| 72 byteSize = sizeof(Sk3D_Point); | |
| 73 break; | |
| 74 case SkType_Int: | |
| 75 byteSize = sizeof(int32_t); | |
| 76 break; | |
| 77 case SkType_Float: | |
| 78 byteSize = sizeof(SkScalar); | |
| 79 break; | |
| 80 case SkType_DynamicString: | |
| 81 case SkType_String: | |
| 82 byteSize = sizeof(SkString); // assume we'll copy by reference, n
ot value | |
| 83 break; | |
| 84 default: | |
| 85 // SkASSERT(0); | |
| 86 byteSize = 0; | |
| 87 } | |
| 88 return byteSize; | |
| 89 } | |
| 90 | |
| 91 bool SkMemberInfo::getArrayValue(const SkDisplayable* displayable, int index, Sk
Operand* value) const { | |
| 92 SkASSERT(fType != SkType_String && fType != SkType_MemberProperty); | |
| 93 char* valuePtr = (char*) *(SkOperand**) memberData(displayable); | |
| 94 SkDisplayTypes type = (SkDisplayTypes) 0; | |
| 95 if (displayable->getType() == SkType_Array) { | |
| 96 SkDisplayArray* dispArray = (SkDisplayArray*) displayable; | |
| 97 if (dispArray->values.count() <= index) | |
| 98 return false; | |
| 99 type = dispArray->values.getType(); | |
| 100 } else | |
| 101 SkASSERT(0); // incomplete | |
| 102 size_t byteSize = GetSize(type); | |
| 103 memcpy(value, valuePtr + index * byteSize, byteSize); | |
| 104 return true; | |
| 105 } | |
| 106 | |
| 107 size_t SkMemberInfo::getSize(const SkDisplayable* displayable) const { | |
| 108 size_t byteSize; | |
| 109 switch (fType) { | |
| 110 case SkType_MemberProperty: | |
| 111 byteSize = GetSize(propertyType()); | |
| 112 break; | |
| 113 case SkType_Array: { | |
| 114 SkDisplayTypes type; | |
| 115 if (displayable == NULL) | |
| 116 return sizeof(int); | |
| 117 if (displayable->getType() == SkType_Array) { | |
| 118 SkDisplayArray* dispArray = (SkDisplayArray*) displayable; | |
| 119 type = dispArray->values.getType(); | |
| 120 } else | |
| 121 type = propertyType(); | |
| 122 SkTDOperandArray* array = (SkTDOperandArray*) memberData(displayable
); | |
| 123 byteSize = GetSize(type) * array->count(); | |
| 124 } break; | |
| 125 default: | |
| 126 byteSize = GetSize((SkDisplayTypes) fType); | |
| 127 } | |
| 128 return byteSize; | |
| 129 } | |
| 130 | |
| 131 void SkMemberInfo::getString(const SkDisplayable* displayable, SkString** string
) const { | |
| 132 if (fType == SkType_MemberProperty) { | |
| 133 SkScriptValue value; | |
| 134 displayable->getProperty(propertyIndex(), &value); | |
| 135 SkASSERT(value.fType == SkType_String); | |
| 136 *string = value.fOperand.fString; | |
| 137 return; | |
| 138 } | |
| 139 SkASSERT(fCount == sizeof(SkString) / sizeof(SkScalar)); | |
| 140 SkASSERT(fType == SkType_String || fType == SkType_DynamicString); | |
| 141 void* valuePtr = memberData(displayable); | |
| 142 *string = (SkString*) valuePtr; | |
| 143 } | |
| 144 | |
| 145 void SkMemberInfo::getValue(const SkDisplayable* displayable, SkOperand value[],
int count) const { | |
| 146 SkASSERT(fType != SkType_String && fType != SkType_MemberProperty); | |
| 147 SkASSERT(count == fCount); | |
| 148 void* valuePtr = memberData(displayable); | |
| 149 size_t byteSize = getSize(displayable); | |
| 150 SkASSERT(sizeof(value[0].fScalar) == sizeof(value[0])); // no support for 64
bit pointers, yet | |
| 151 memcpy(value, valuePtr, byteSize); | |
| 152 } | |
| 153 | |
| 154 void SkMemberInfo::setString(SkDisplayable* displayable, SkString* value) const
{ | |
| 155 SkString* string = (SkString*) memberData(displayable); | |
| 156 string->set(*value); | |
| 157 displayable->dirty(); | |
| 158 } | |
| 159 | |
| 160 void SkMemberInfo::setValue(SkDisplayable* displayable, const SkOperand values[]
, | |
| 161 int count) const { | |
| 162 SkASSERT(sizeof(values[0].fScalar) == sizeof(values[0])); // no support fo
r 64 bit pointers, yet | |
| 163 char* dst = (char*) memberData(displayable); | |
| 164 if (fType == SkType_Array) { | |
| 165 SkTDScalarArray* array = (SkTDScalarArray* ) dst; | |
| 166 array->setCount(count); | |
| 167 dst = (char*) array->begin(); | |
| 168 } | |
| 169 memcpy(dst, values, count * sizeof(SkOperand)); | |
| 170 displayable->dirty(); | |
| 171 } | |
| 172 | |
| 173 | |
| 174 static inline bool is_between(int c, int min, int max) | |
| 175 { | |
| 176 return (unsigned)(c - min) <= (unsigned)(max - min); | |
| 177 } | |
| 178 | |
| 179 static inline bool is_hex(int c) | |
| 180 { | |
| 181 if (is_between(c, '0', '9')) | |
| 182 return true; | |
| 183 c |= 0x20; // make us lower-case | |
| 184 if (is_between(c, 'a', 'f')) | |
| 185 return true; | |
| 186 return false; | |
| 187 } | |
| 188 | |
| 189 | |
| 190 bool SkMemberInfo::setValue(SkAnimateMaker& maker, SkTDOperandArray* arrayStorag
e, | |
| 191 int storageOffset, int maxStorage, SkDisplayable* displayable, SkDisplayType
s outType, | |
| 192 const char rawValue[], size_t rawValueLen) const | |
| 193 { | |
| 194 SkString valueStr(rawValue, rawValueLen); | |
| 195 SkScriptValue scriptValue; | |
| 196 scriptValue.fType = SkType_Unknown; | |
| 197 scriptValue.fOperand.fS32 = 0; | |
| 198 SkDisplayTypes type = getType(); | |
| 199 SkAnimatorScript engine(maker, displayable, type); | |
| 200 if (arrayStorage) | |
| 201 displayable = NULL; | |
| 202 bool success = true; | |
| 203 void* untypedStorage = NULL; | |
| 204 if (displayable && fType != SkType_MemberProperty && fType != SkType_MemberF
unction) | |
| 205 untypedStorage = (SkTDOperandArray*) memberData(displayable); | |
| 206 | |
| 207 if (type == SkType_ARGB) { | |
| 208 // for both SpiderMonkey and SkiaScript, substitute any #xyz or #xxyyzz
first | |
| 209 // it's enough to expand the colors into 0xFFxxyyzz | |
| 210 const char* poundPos; | |
| 211 while ((poundPos = strchr(valueStr.c_str(), '#')) != NULL) { | |
| 212 size_t offset = poundPos - valueStr.c_str(); | |
| 213 if (valueStr.size() - offset < 4) | |
| 214 break; | |
| 215 char r = poundPos[1]; | |
| 216 char g = poundPos[2]; | |
| 217 char b = poundPos[3]; | |
| 218 if (is_hex(r) == false || is_hex(g) == false || is_hex(b) == false) | |
| 219 break; | |
| 220 char hex = poundPos[4]; | |
| 221 if (is_hex(hex) == false) { | |
| 222 valueStr.insertUnichar(offset + 1, r); | |
| 223 valueStr.insertUnichar(offset + 3, g); | |
| 224 valueStr.insertUnichar(offset + 5, b); | |
| 225 } | |
| 226 *(char*) poundPos = '0'; // overwrite '#' | |
| 227 valueStr.insert(offset + 1, "xFF"); | |
| 228 } | |
| 229 } | |
| 230 if (SkDisplayType::IsDisplayable(&maker, type) || SkDisplayType::IsEnum(&mak
er, type) || type == SkType_ARGB) | |
| 231 goto scriptCommon; | |
| 232 switch (type) { | |
| 233 case SkType_String: | |
| 234 #if 0 | |
| 235 if (displayable && displayable->isAnimate()) { | |
| 236 | |
| 237 goto noScriptString; | |
| 238 } | |
| 239 if (strncmp(rawValue, "#string:", sizeof("#string:") - 1) == 0) { | |
| 240 SkASSERT(sizeof("string") == sizeof("script")); | |
| 241 char* stringHeader = valueStr.writable_str(); | |
| 242 memcpy(&stringHeader[1], "script", sizeof("script") - 1); | |
| 243 rawValue = valueStr.c_str(); | |
| 244 goto noScriptString; | |
| 245 } else | |
| 246 #endif | |
| 247 if (strncmp(rawValue, "#script:", sizeof("#script:") - 1) != 0) | |
| 248 goto noScriptString; | |
| 249 valueStr.remove(0, 8); | |
| 250 case SkType_Unknown: | |
| 251 case SkType_Int: | |
| 252 case SkType_MSec: // for the purposes of script, MSec is treated as a S
calar | |
| 253 case SkType_Point: | |
| 254 case SkType_3D_Point: | |
| 255 case SkType_Float: | |
| 256 case SkType_Array: | |
| 257 scriptCommon: { | |
| 258 const char* script = valueStr.c_str(); | |
| 259 success = engine.evaluateScript(&script, &scriptValue); | |
| 260 if (success == false) { | |
| 261 maker.setScriptError(engine); | |
| 262 return false; | |
| 263 } | |
| 264 } | |
| 265 SkASSERT(success); | |
| 266 if (scriptValue.fType == SkType_Displayable) { | |
| 267 if (type == SkType_String) { | |
| 268 const char* charPtr; | |
| 269 maker.findKey(scriptValue.fOperand.fDisplayable, &charPtr); | |
| 270 scriptValue.fOperand.fString = new SkString(charPtr); | |
| 271 scriptValue.fType = SkType_String; | |
| 272 engine.SkScriptEngine::track(scriptValue.fOperand.fString); | |
| 273 break; | |
| 274 } | |
| 275 SkASSERT(SkDisplayType::IsDisplayable(&maker, type)); | |
| 276 if (displayable) | |
| 277 displayable->setReference(this, scriptValue.fOperand.fDispla
yable); | |
| 278 else | |
| 279 arrayStorage->begin()[0].fDisplayable = scriptValue.fOperand
.fDisplayable; | |
| 280 return true; | |
| 281 } | |
| 282 if (type != scriptValue.fType) { | |
| 283 if (scriptValue.fType == SkType_Array) { | |
| 284 engine.forget(scriptValue.getArray()); | |
| 285 goto writeStruct; // real structs have already been written
by script | |
| 286 } | |
| 287 switch (type) { | |
| 288 case SkType_String: | |
| 289 success = engine.convertTo(SkType_String, &scriptValue); | |
| 290 break; | |
| 291 case SkType_MSec: | |
| 292 case SkType_Float: | |
| 293 success = engine.convertTo(SkType_Float, &scriptValue); | |
| 294 break; | |
| 295 case SkType_Int: | |
| 296 success = engine.convertTo(SkType_Int, &scriptValue); | |
| 297 break; | |
| 298 case SkType_Array: | |
| 299 success = engine.convertTo(arrayType(), &scriptValue); | |
| 300 // !!! incomplete; create array of appropriate type and
add scriptValue to it | |
| 301 SkASSERT(0); | |
| 302 break; | |
| 303 case SkType_Displayable: | |
| 304 case SkType_Drawable: | |
| 305 return false; // no way to convert other types to this | |
| 306 default: // to avoid warnings | |
| 307 break; | |
| 308 } | |
| 309 if (success == false) | |
| 310 return false; | |
| 311 } | |
| 312 if (type == SkType_MSec) | |
| 313 scriptValue.fOperand.fMSec = SkScalarMulRound(scriptValue.fOpera
nd.fScalar, 1000); | |
| 314 scriptValue.fType = type; | |
| 315 break; | |
| 316 noScriptString: | |
| 317 case SkType_DynamicString: | |
| 318 if (fType == SkType_MemberProperty && displayable) { | |
| 319 SkString string(rawValue, rawValueLen); | |
| 320 SkScriptValue scriptValue; | |
| 321 scriptValue.fOperand.fString = &string; | |
| 322 scriptValue.fType = SkType_String; | |
| 323 displayable->setProperty(propertyIndex(), scriptValue); | |
| 324 } else if (displayable) { | |
| 325 SkString* string = (SkString*) memberData(displayable); | |
| 326 string->set(rawValue, rawValueLen); | |
| 327 } else { | |
| 328 SkASSERT(arrayStorage->count() == 1); | |
| 329 arrayStorage->begin()->fString->set(rawValue, rawValueLen); | |
| 330 } | |
| 331 goto dirty; | |
| 332 case SkType_Base64: { | |
| 333 SkBase64 base64; | |
| 334 base64.decode(rawValue, rawValueLen); | |
| 335 *(SkBase64* ) untypedStorage = base64; | |
| 336 } goto dirty; | |
| 337 default: | |
| 338 SkASSERT(0); | |
| 339 break; | |
| 340 } | |
| 341 // if (SkDisplayType::IsStruct(type) == false) | |
| 342 { | |
| 343 writeStruct: | |
| 344 if (writeValue(displayable, arrayStorage, storageOffset, maxStorage, | |
| 345 untypedStorage, outType, scriptValue)) { | |
| 346 maker.setErrorCode(SkDisplayXMLParserError::kUnexpectedType)
; | |
| 347 return false; | |
| 348 } | |
| 349 } | |
| 350 dirty: | |
| 351 if (displayable) | |
| 352 displayable->dirty(); | |
| 353 return true; | |
| 354 } | |
| 355 | |
| 356 bool SkMemberInfo::setValue(SkAnimateMaker& maker, SkTDOperandArray* arrayStorag
e, | |
| 357 int storageOffset, int maxStorage, SkDisplayable* displayable, SkDisplay
Types outType, | |
| 358 SkString& raw) const { | |
| 359 return setValue(maker, arrayStorage, storageOffset, maxStorage, displayable,
outType, raw.c_str(), | |
| 360 raw.size()); | |
| 361 } | |
| 362 | |
| 363 bool SkMemberInfo::writeValue(SkDisplayable* displayable, SkTDOperandArray* arra
yStorage, | |
| 364 int storageOffset, int maxStorage, void* untypedStorage, SkDisplayTypes outT
ype, | |
| 365 SkScriptValue& scriptValue) const | |
| 366 { | |
| 367 SkOperand* storage = untypedStorage ? (SkOperand*) untypedStorage : arraySto
rage ? | |
| 368 arrayStorage->begin() : NULL; | |
| 369 if (storage) | |
| 370 storage += storageOffset; | |
| 371 SkDisplayTypes type = getType(); | |
| 372 if (fType == SkType_MemberProperty) { | |
| 373 if(displayable) | |
| 374 displayable->setProperty(propertyIndex(), scriptValue); | |
| 375 else { | |
| 376 SkASSERT(storageOffset < arrayStorage->count()); | |
| 377 switch (scriptValue.fType) { | |
| 378 case SkType_Boolean: | |
| 379 case SkType_Float: | |
| 380 case SkType_Int: | |
| 381 memcpy(&storage->fScalar, &scriptValue.fOperand.fScalar, siz
eof(SkScalar)); | |
| 382 break; | |
| 383 case SkType_Array: | |
| 384 memcpy(&storage->fScalar, scriptValue.fOperand.fArray->begin
(), scriptValue.fOperand.fArray->count() * sizeof(SkScalar)); | |
| 385 break; | |
| 386 case SkType_String: | |
| 387 storage->fString->set(*scriptValue.fOperand.fString); | |
| 388 break; | |
| 389 default: | |
| 390 SkASSERT(0); // type isn't handled yet | |
| 391 } | |
| 392 } | |
| 393 } else if (fType == SkType_MemberFunction) { | |
| 394 SkASSERT(scriptValue.fType == SkType_Array); | |
| 395 if (displayable) | |
| 396 displayable->executeFunction(displayable, this, scriptValue.fOperand
.fArray, NULL); | |
| 397 else { | |
| 398 int count = scriptValue.fOperand.fArray->count(); | |
| 399 // SkASSERT(maxStorage == 0 || count == maxStorage); | |
| 400 if (arrayStorage->count() == 2) | |
| 401 arrayStorage->setCount(2 * count); | |
| 402 else { | |
| 403 storageOffset *= count; | |
| 404 SkASSERT(count + storageOffset <= arrayStorage->count()); | |
| 405 } | |
| 406 memcpy(&(*arrayStorage)[storageOffset], scriptValue.fOperand.fArray-
>begin(), count * sizeof(SkOperand)); | |
| 407 } | |
| 408 | |
| 409 } else if (fType == SkType_Array) { | |
| 410 SkTypedArray* destArray = (SkTypedArray*) (untypedStorage ? untypedStora
ge : arrayStorage); | |
| 411 SkASSERT(destArray); | |
| 412 // destArray->setCount(0); | |
| 413 if (scriptValue.fType != SkType_Array) { | |
| 414 SkASSERT(type == scriptValue.fType); | |
| 415 // SkASSERT(storageOffset + 1 <= maxStorage); | |
| 416 destArray->setCount(storageOffset + 1); | |
| 417 (*destArray)[storageOffset] = scriptValue.fOperand; | |
| 418 } else { | |
| 419 if (type == SkType_Unknown) { | |
| 420 type = scriptValue.fOperand.fArray->getType(); | |
| 421 destArray->setType(type); | |
| 422 } | |
| 423 SkASSERT(type == scriptValue.fOperand.fArray->getType()); | |
| 424 int count = scriptValue.fOperand.fArray->count(); | |
| 425 // SkASSERT(storageOffset + count <= maxStorage); | |
| 426 destArray->setCount(storageOffset + count); | |
| 427 memcpy(destArray->begin() + storageOffset, scriptValue.fOperand.fArr
ay->begin(), sizeof(SkOperand) * count); | |
| 428 } | |
| 429 } else if (type == SkType_String) { | |
| 430 SkString* string = untypedStorage ? (SkString*) untypedStorage : (*array
Storage)[storageOffset].fString; | |
| 431 string->set(*scriptValue.fOperand.fString); | |
| 432 } else if (type == SkType_ARGB && outType == SkType_Float) { | |
| 433 SkTypedArray* array = scriptValue.fOperand.fArray; | |
| 434 SkASSERT(scriptValue.fType == SkType_Int || scriptValue.fType == SkType_
ARGB || | |
| 435 scriptValue.fType == SkType_Array); | |
| 436 SkASSERT(scriptValue.fType != SkType_Array || (array != NULL && | |
| 437 array->getType() == SkType_Int)); | |
| 438 int numberOfColors = scriptValue.fType == SkType_Array ? array->count()
: 1; | |
| 439 int numberOfComponents = numberOfColors * 4; | |
| 440 // SkASSERT(maxStorage == 0 || maxStorage == numberOfComponents); | |
| 441 if (maxStorage == 0) | |
| 442 arrayStorage->setCount(numberOfComponents); | |
| 443 for (int index = 0; index < numberOfColors; index++) { | |
| 444 SkColor color = scriptValue.fType == SkType_Array ? | |
| 445 (SkColor) array->begin()[index].fS32 : (SkColor) scriptValue.fOp
erand.fS32; | |
| 446 storage[0].fScalar = SkIntToScalar(SkColorGetA(color)); | |
| 447 storage[1].fScalar = SkIntToScalar(SkColorGetR(color)); | |
| 448 storage[2].fScalar = SkIntToScalar(SkColorGetG(color)); | |
| 449 storage[3].fScalar = SkIntToScalar(SkColorGetB(color)); | |
| 450 storage += 4; | |
| 451 } | |
| 452 } else if (SkDisplayType::IsStruct(NULL /* !!! maker*/, type)) { | |
| 453 if (scriptValue.fType != SkType_Array) | |
| 454 return true; // error | |
| 455 SkASSERT(sizeof(SkScalar) == sizeof(SkOperand)); // !!! no 64 bit pointe
r support yet | |
| 456 int count = scriptValue.fOperand.fArray->count(); | |
| 457 if (count > 0) { | |
| 458 SkASSERT(fCount == count); | |
| 459 memcpy(storage, scriptValue.fOperand.fArray->begin(), count * sizeof
(SkOperand)); | |
| 460 } | |
| 461 } else if (scriptValue.fType == SkType_Array) { | |
| 462 SkASSERT(scriptValue.fOperand.fArray->getType() == type); | |
| 463 SkASSERT(scriptValue.fOperand.fArray->count() == getCount()); | |
| 464 memcpy(storage, scriptValue.fOperand.fArray->begin(), getCount() * sizeo
f(SkOperand)); | |
| 465 } else { | |
| 466 memcpy(storage, &scriptValue.fOperand, sizeof(SkOperand)); | |
| 467 } | |
| 468 return false; | |
| 469 } | |
| 470 | |
| 471 | |
| 472 //void SkMemberInfo::setValue(SkDisplayable* displayable, const char value[], co
nst char name[]) const { | |
| 473 // void* valuePtr = (void*) ((char*) displayable + fOffset); | |
| 474 // switch (fType) { | |
| 475 // case SkType_Point3D: { | |
| 476 // static const char xyz[] = "x|y|z"; | |
| 477 // int index = find_one(xyz, name); | |
| 478 // SkASSERT(index >= 0); | |
| 479 // valuePtr = (void*) ((char*) valuePtr + index * sizeof(SkScalar)); | |
| 480 // } break; | |
| 481 // default: | |
| 482 // SkASSERT(0); | |
| 483 // } | |
| 484 // SkParse::FindScalar(value, (SkScalar*) valuePtr); | |
| 485 // displayable->dirty(); | |
| 486 //} | |
| 487 | |
| 488 #if SK_USE_CONDENSED_INFO == 0 | |
| 489 | |
| 490 // Find Nth memberInfo | |
| 491 const SkMemberInfo* SkMemberInfo::Find(const SkMemberInfo info[], int count, int
* index) { | |
| 492 SkASSERT(*index >= 0); | |
| 493 if (info->fType == SkType_BaseClassInfo) { | |
| 494 const SkMemberInfo* inherited = (SkMemberInfo*) info->fName; | |
| 495 const SkMemberInfo* result = SkMemberInfo::Find(inherited, info->fCount,
index); | |
| 496 if (result != NULL) | |
| 497 return result; | |
| 498 if (--count == 0) | |
| 499 return NULL; | |
| 500 info++; | |
| 501 } | |
| 502 SkASSERT(info->fName); | |
| 503 SkASSERT(info->fType != SkType_BaseClassInfo); | |
| 504 if (*index >= count) { | |
| 505 *index -= count; | |
| 506 return NULL; | |
| 507 } | |
| 508 return &info[*index]; | |
| 509 } | |
| 510 | |
| 511 // Find named memberinfo | |
| 512 const SkMemberInfo* SkMemberInfo::Find(const SkMemberInfo info[], int count, con
st char** matchPtr) { | |
| 513 const char* match = *matchPtr; | |
| 514 if (info->fType == SkType_BaseClassInfo) { | |
| 515 const SkMemberInfo* inherited = (SkMemberInfo*) info->fName; | |
| 516 const SkMemberInfo* result = SkMemberInfo::Find(inherited, info->fCount,
matchPtr); | |
| 517 if (result != NULL) | |
| 518 return result; | |
| 519 if (--count == 0) | |
| 520 return NULL; | |
| 521 info++; | |
| 522 } | |
| 523 SkASSERT(info->fName); | |
| 524 SkASSERT(info->fType != SkType_BaseClassInfo); | |
| 525 int index = SkStrSearch(&info->fName, count, match, sizeof(*info)); | |
| 526 if (index < 0 || index >= count) | |
| 527 return NULL; | |
| 528 return &info[index]; | |
| 529 } | |
| 530 | |
| 531 const SkMemberInfo* SkMemberInfo::getInherited() const { | |
| 532 return (SkMemberInfo*) fName; | |
| 533 } | |
| 534 | |
| 535 #endif // SK_USE_CONDENSED_INFO == 0 | |
| 536 | |
| 537 #if 0 | |
| 538 bool SkMemberInfo::SetValue(void* valuePtr, const char value[], SkDisplayTypes t
ype, | |
| 539 int count) { | |
| 540 switch (type) { | |
| 541 case SkType_Animate: | |
| 542 case SkType_BaseBitmap: | |
| 543 case SkType_Bitmap: | |
| 544 case SkType_Dash: | |
| 545 case SkType_Displayable: | |
| 546 case SkType_Drawable: | |
| 547 case SkType_Matrix: | |
| 548 case SkType_Path: | |
| 549 case SkType_Text: | |
| 550 case SkType_3D_Patch: | |
| 551 return false; // ref to object; caller must resolve | |
| 552 case SkType_MSec: { | |
| 553 SkParse::FindMSec(value, (SkMSec*) valuePtr); | |
| 554 } break; | |
| 555 case SkType_3D_Point: | |
| 556 case SkType_Point: | |
| 557 // case SkType_PointArray: | |
| 558 case SkType_ScalarArray: | |
| 559 SkParse::FindScalars(value, (SkScalar*) valuePtr, count); | |
| 560 break; | |
| 561 default: | |
| 562 SkASSERT(0); | |
| 563 } | |
| 564 return true; | |
| 565 } | |
| 566 #endif | |
| 567 | |
| 568 | |
| OLD | NEW |