OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 | 9 |
10 #include "SkMemberInfo.h" | 10 #include "SkMemberInfo.h" |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
98 } | 98 } |
99 | 99 |
100 size_t SkMemberInfo::getSize(const SkDisplayable* displayable) const { | 100 size_t SkMemberInfo::getSize(const SkDisplayable* displayable) const { |
101 size_t byteSize; | 101 size_t byteSize; |
102 switch (fType) { | 102 switch (fType) { |
103 case SkType_MemberProperty: | 103 case SkType_MemberProperty: |
104 byteSize = GetSize(propertyType()); | 104 byteSize = GetSize(propertyType()); |
105 break; | 105 break; |
106 case SkType_Array: { | 106 case SkType_Array: { |
107 SkDisplayTypes type; | 107 SkDisplayTypes type; |
108 if (displayable == NULL) | 108 if (displayable == nullptr) |
109 return sizeof(int); | 109 return sizeof(int); |
110 if (displayable->getType() == SkType_Array) { | 110 if (displayable->getType() == SkType_Array) { |
111 SkDisplayArray* dispArray = (SkDisplayArray*) displayable; | 111 SkDisplayArray* dispArray = (SkDisplayArray*) displayable; |
112 type = dispArray->values.getType(); | 112 type = dispArray->values.getType(); |
113 } else | 113 } else |
114 type = propertyType(); | 114 type = propertyType(); |
115 SkTDOperandArray* array = (SkTDOperandArray*) memberData(displayable
); | 115 SkTDOperandArray* array = (SkTDOperandArray*) memberData(displayable
); |
116 byteSize = GetSize(type) * array->count(); | 116 byteSize = GetSize(type) * array->count(); |
117 } break; | 117 } break; |
118 default: | 118 default: |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 int storageOffset, int maxStorage, SkDisplayable* displayable, SkDisplayType
s outType, | 184 int storageOffset, int maxStorage, SkDisplayable* displayable, SkDisplayType
s outType, |
185 const char rawValue[], size_t rawValueLen) const | 185 const char rawValue[], size_t rawValueLen) const |
186 { | 186 { |
187 SkString valueStr(rawValue, rawValueLen); | 187 SkString valueStr(rawValue, rawValueLen); |
188 SkScriptValue scriptValue; | 188 SkScriptValue scriptValue; |
189 scriptValue.fType = SkType_Unknown; | 189 scriptValue.fType = SkType_Unknown; |
190 scriptValue.fOperand.fS32 = 0; | 190 scriptValue.fOperand.fS32 = 0; |
191 SkDisplayTypes type = getType(); | 191 SkDisplayTypes type = getType(); |
192 SkAnimatorScript engine(maker, displayable, type); | 192 SkAnimatorScript engine(maker, displayable, type); |
193 if (arrayStorage) | 193 if (arrayStorage) |
194 displayable = NULL; | 194 displayable = nullptr; |
195 bool success = true; | 195 bool success = true; |
196 void* untypedStorage = NULL; | 196 void* untypedStorage = nullptr; |
197 if (displayable && fType != SkType_MemberProperty && fType != SkType_MemberF
unction) | 197 if (displayable && fType != SkType_MemberProperty && fType != SkType_MemberF
unction) |
198 untypedStorage = (SkTDOperandArray*) memberData(displayable); | 198 untypedStorage = (SkTDOperandArray*) memberData(displayable); |
199 | 199 |
200 if (type == SkType_ARGB) { | 200 if (type == SkType_ARGB) { |
201 // for both SpiderMonkey and SkiaScript, substitute any #xyz or #xxyyzz
first | 201 // for both SpiderMonkey and SkiaScript, substitute any #xyz or #xxyyzz
first |
202 // it's enough to expand the colors into 0xFFxxyyzz | 202 // it's enough to expand the colors into 0xFFxxyyzz |
203 const char* poundPos; | 203 const char* poundPos; |
204 while ((poundPos = strchr(valueStr.c_str(), '#')) != NULL) { | 204 while ((poundPos = strchr(valueStr.c_str(), '#')) != nullptr) { |
205 size_t offset = poundPos - valueStr.c_str(); | 205 size_t offset = poundPos - valueStr.c_str(); |
206 if (valueStr.size() - offset < 4) | 206 if (valueStr.size() - offset < 4) |
207 break; | 207 break; |
208 char r = poundPos[1]; | 208 char r = poundPos[1]; |
209 char g = poundPos[2]; | 209 char g = poundPos[2]; |
210 char b = poundPos[3]; | 210 char b = poundPos[3]; |
211 if (is_hex(r) == false || is_hex(g) == false || is_hex(b) == false) | 211 if (is_hex(r) == false || is_hex(g) == false || is_hex(b) == false) |
212 break; | 212 break; |
213 char hex = poundPos[4]; | 213 char hex = poundPos[4]; |
214 if (is_hex(hex) == false) { | 214 if (is_hex(hex) == false) { |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
251 const char* script = valueStr.c_str(); | 251 const char* script = valueStr.c_str(); |
252 success = engine.evaluateScript(&script, &scriptValue); | 252 success = engine.evaluateScript(&script, &scriptValue); |
253 if (success == false) { | 253 if (success == false) { |
254 maker.setScriptError(engine); | 254 maker.setScriptError(engine); |
255 return false; | 255 return false; |
256 } | 256 } |
257 } | 257 } |
258 SkASSERT(success); | 258 SkASSERT(success); |
259 if (scriptValue.fType == SkType_Displayable) { | 259 if (scriptValue.fType == SkType_Displayable) { |
260 if (type == SkType_String) { | 260 if (type == SkType_String) { |
261 const char* charPtr = NULL; | 261 const char* charPtr = nullptr; |
262 maker.findKey(scriptValue.fOperand.fDisplayable, &charPtr); | 262 maker.findKey(scriptValue.fOperand.fDisplayable, &charPtr); |
263 scriptValue.fOperand.fString = new SkString(charPtr); | 263 scriptValue.fOperand.fString = new SkString(charPtr); |
264 scriptValue.fType = SkType_String; | 264 scriptValue.fType = SkType_String; |
265 engine.SkScriptEngine::track(scriptValue.fOperand.fString); | 265 engine.SkScriptEngine::track(scriptValue.fOperand.fString); |
266 break; | 266 break; |
267 } | 267 } |
268 SkASSERT(SkDisplayType::IsDisplayable(&maker, type)); | 268 SkASSERT(SkDisplayType::IsDisplayable(&maker, type)); |
269 if (displayable) | 269 if (displayable) |
270 displayable->setReference(this, scriptValue.fOperand.fDispla
yable); | 270 displayable->setReference(this, scriptValue.fOperand.fDispla
yable); |
271 else | 271 else |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
351 SkString& raw) const { | 351 SkString& raw) const { |
352 return setValue(maker, arrayStorage, storageOffset, maxStorage, displayable,
outType, raw.c_str(), | 352 return setValue(maker, arrayStorage, storageOffset, maxStorage, displayable,
outType, raw.c_str(), |
353 raw.size()); | 353 raw.size()); |
354 } | 354 } |
355 | 355 |
356 bool SkMemberInfo::writeValue(SkDisplayable* displayable, SkTDOperandArray* arra
yStorage, | 356 bool SkMemberInfo::writeValue(SkDisplayable* displayable, SkTDOperandArray* arra
yStorage, |
357 int storageOffset, int maxStorage, void* untypedStorage, SkDisplayTypes outT
ype, | 357 int storageOffset, int maxStorage, void* untypedStorage, SkDisplayTypes outT
ype, |
358 SkScriptValue& scriptValue) const | 358 SkScriptValue& scriptValue) const |
359 { | 359 { |
360 SkOperand* storage = untypedStorage ? (SkOperand*) untypedStorage : arraySto
rage ? | 360 SkOperand* storage = untypedStorage ? (SkOperand*) untypedStorage : arraySto
rage ? |
361 arrayStorage->begin() : NULL; | 361 arrayStorage->begin() : nullptr; |
362 if (storage) | 362 if (storage) |
363 storage += storageOffset; | 363 storage += storageOffset; |
364 SkDisplayTypes type = getType(); | 364 SkDisplayTypes type = getType(); |
365 if (fType == SkType_MemberProperty) { | 365 if (fType == SkType_MemberProperty) { |
366 if(displayable) | 366 if(displayable) |
367 displayable->setProperty(propertyIndex(), scriptValue); | 367 displayable->setProperty(propertyIndex(), scriptValue); |
368 else { | 368 else { |
369 SkASSERT(storageOffset < arrayStorage->count()); | 369 SkASSERT(storageOffset < arrayStorage->count()); |
370 switch (scriptValue.fType) { | 370 switch (scriptValue.fType) { |
371 case SkType_Boolean: | 371 case SkType_Boolean: |
372 case SkType_Float: | 372 case SkType_Float: |
373 case SkType_Int: | 373 case SkType_Int: |
374 memcpy(&storage->fScalar, &scriptValue.fOperand.fScalar, siz
eof(SkScalar)); | 374 memcpy(&storage->fScalar, &scriptValue.fOperand.fScalar, siz
eof(SkScalar)); |
375 break; | 375 break; |
376 case SkType_Array: | 376 case SkType_Array: |
377 memcpy(&storage->fScalar, scriptValue.fOperand.fArray->begin
(), scriptValue.fOperand.fArray->count() * sizeof(SkScalar)); | 377 memcpy(&storage->fScalar, scriptValue.fOperand.fArray->begin
(), scriptValue.fOperand.fArray->count() * sizeof(SkScalar)); |
378 break; | 378 break; |
379 case SkType_String: | 379 case SkType_String: |
380 storage->fString->set(*scriptValue.fOperand.fString); | 380 storage->fString->set(*scriptValue.fOperand.fString); |
381 break; | 381 break; |
382 default: | 382 default: |
383 SkASSERT(0); // type isn't handled yet | 383 SkASSERT(0); // type isn't handled yet |
384 } | 384 } |
385 } | 385 } |
386 } else if (fType == SkType_MemberFunction) { | 386 } else if (fType == SkType_MemberFunction) { |
387 SkASSERT(scriptValue.fType == SkType_Array); | 387 SkASSERT(scriptValue.fType == SkType_Array); |
388 if (displayable) | 388 if (displayable) |
389 displayable->executeFunction(displayable, this, scriptValue.fOperand
.fArray, NULL); | 389 displayable->executeFunction(displayable, this, scriptValue.fOperand
.fArray, nullptr); |
390 else { | 390 else { |
391 int count = scriptValue.fOperand.fArray->count(); | 391 int count = scriptValue.fOperand.fArray->count(); |
392 // SkASSERT(maxStorage == 0 || count == maxStorage); | 392 // SkASSERT(maxStorage == 0 || count == maxStorage); |
393 if (arrayStorage->count() == 2) | 393 if (arrayStorage->count() == 2) |
394 arrayStorage->setCount(2 * count); | 394 arrayStorage->setCount(2 * count); |
395 else { | 395 else { |
396 storageOffset *= count; | 396 storageOffset *= count; |
397 SkASSERT(count + storageOffset <= arrayStorage->count()); | 397 SkASSERT(count + storageOffset <= arrayStorage->count()); |
398 } | 398 } |
399 memcpy(&(*arrayStorage)[storageOffset], scriptValue.fOperand.fArray-
>begin(), count * sizeof(SkOperand)); | 399 memcpy(&(*arrayStorage)[storageOffset], scriptValue.fOperand.fArray-
>begin(), count * sizeof(SkOperand)); |
(...skipping 19 matching lines...) Expand all Loading... |
419 destArray->setCount(storageOffset + count); | 419 destArray->setCount(storageOffset + count); |
420 memcpy(destArray->begin() + storageOffset, scriptValue.fOperand.fArr
ay->begin(), sizeof(SkOperand) * count); | 420 memcpy(destArray->begin() + storageOffset, scriptValue.fOperand.fArr
ay->begin(), sizeof(SkOperand) * count); |
421 } | 421 } |
422 } else if (type == SkType_String) { | 422 } else if (type == SkType_String) { |
423 SkString* string = untypedStorage ? (SkString*) untypedStorage : (*array
Storage)[storageOffset].fString; | 423 SkString* string = untypedStorage ? (SkString*) untypedStorage : (*array
Storage)[storageOffset].fString; |
424 string->set(*scriptValue.fOperand.fString); | 424 string->set(*scriptValue.fOperand.fString); |
425 } else if (type == SkType_ARGB && outType == SkType_Float) { | 425 } else if (type == SkType_ARGB && outType == SkType_Float) { |
426 SkTypedArray* array = scriptValue.fOperand.fArray; | 426 SkTypedArray* array = scriptValue.fOperand.fArray; |
427 SkASSERT(scriptValue.fType == SkType_Int || scriptValue.fType == SkType_
ARGB || | 427 SkASSERT(scriptValue.fType == SkType_Int || scriptValue.fType == SkType_
ARGB || |
428 scriptValue.fType == SkType_Array); | 428 scriptValue.fType == SkType_Array); |
429 SkASSERT(scriptValue.fType != SkType_Array || (array != NULL && | 429 SkASSERT(scriptValue.fType != SkType_Array || (array != nullptr && |
430 array->getType() == SkType_Int)); | 430 array->getType() == SkType_Int)); |
431 int numberOfColors = scriptValue.fType == SkType_Array ? array->count()
: 1; | 431 int numberOfColors = scriptValue.fType == SkType_Array ? array->count()
: 1; |
432 int numberOfComponents = numberOfColors * 4; | 432 int numberOfComponents = numberOfColors * 4; |
433 // SkASSERT(maxStorage == 0 || maxStorage == numberOfComponents); | 433 // SkASSERT(maxStorage == 0 || maxStorage == numberOfComponents); |
434 if (maxStorage == 0) | 434 if (maxStorage == 0) |
435 arrayStorage->setCount(numberOfComponents); | 435 arrayStorage->setCount(numberOfComponents); |
436 for (int index = 0; index < numberOfColors; index++) { | 436 for (int index = 0; index < numberOfColors; index++) { |
437 SkColor color = scriptValue.fType == SkType_Array ? | 437 SkColor color = scriptValue.fType == SkType_Array ? |
438 (SkColor) array->begin()[index].fS32 : (SkColor) scriptValue.fOp
erand.fS32; | 438 (SkColor) array->begin()[index].fS32 : (SkColor) scriptValue.fOp
erand.fS32; |
439 storage[0].fScalar = SkIntToScalar(SkColorGetA(color)); | 439 storage[0].fScalar = SkIntToScalar(SkColorGetA(color)); |
440 storage[1].fScalar = SkIntToScalar(SkColorGetR(color)); | 440 storage[1].fScalar = SkIntToScalar(SkColorGetR(color)); |
441 storage[2].fScalar = SkIntToScalar(SkColorGetG(color)); | 441 storage[2].fScalar = SkIntToScalar(SkColorGetG(color)); |
442 storage[3].fScalar = SkIntToScalar(SkColorGetB(color)); | 442 storage[3].fScalar = SkIntToScalar(SkColorGetB(color)); |
443 storage += 4; | 443 storage += 4; |
444 } | 444 } |
445 } else if (SkDisplayType::IsStruct(NULL /* !!! maker*/, type)) { | 445 } else if (SkDisplayType::IsStruct(nullptr /* !!! maker*/, type)) { |
446 if (scriptValue.fType != SkType_Array) | 446 if (scriptValue.fType != SkType_Array) |
447 return true; // error | 447 return true; // error |
448 SkASSERT(sizeof(SkScalar) == sizeof(SkOperand)); // !!! no 64 bit pointe
r support yet | 448 SkASSERT(sizeof(SkScalar) == sizeof(SkOperand)); // !!! no 64 bit pointe
r support yet |
449 int count = scriptValue.fOperand.fArray->count(); | 449 int count = scriptValue.fOperand.fArray->count(); |
450 if (count > 0) { | 450 if (count > 0) { |
451 SkASSERT(fCount == count); | 451 SkASSERT(fCount == count); |
452 memcpy(storage, scriptValue.fOperand.fArray->begin(), count * sizeof
(SkOperand)); | 452 memcpy(storage, scriptValue.fOperand.fArray->begin(), count * sizeof
(SkOperand)); |
453 } | 453 } |
454 } else if (scriptValue.fType == SkType_Array) { | 454 } else if (scriptValue.fType == SkType_Array) { |
455 SkASSERT(scriptValue.fOperand.fArray->getType() == type); | 455 SkASSERT(scriptValue.fOperand.fArray->getType() == type); |
(...skipping 23 matching lines...) Expand all Loading... |
479 //} | 479 //} |
480 | 480 |
481 #if SK_USE_CONDENSED_INFO == 0 | 481 #if SK_USE_CONDENSED_INFO == 0 |
482 | 482 |
483 // Find Nth memberInfo | 483 // Find Nth memberInfo |
484 const SkMemberInfo* SkMemberInfo::Find(const SkMemberInfo info[], int count, int
* index) { | 484 const SkMemberInfo* SkMemberInfo::Find(const SkMemberInfo info[], int count, int
* index) { |
485 SkASSERT(*index >= 0); | 485 SkASSERT(*index >= 0); |
486 if (info->fType == SkType_BaseClassInfo) { | 486 if (info->fType == SkType_BaseClassInfo) { |
487 const SkMemberInfo* inherited = (SkMemberInfo*) info->fName; | 487 const SkMemberInfo* inherited = (SkMemberInfo*) info->fName; |
488 const SkMemberInfo* result = SkMemberInfo::Find(inherited, info->fCount,
index); | 488 const SkMemberInfo* result = SkMemberInfo::Find(inherited, info->fCount,
index); |
489 if (result != NULL) | 489 if (result != nullptr) |
490 return result; | 490 return result; |
491 if (--count == 0) | 491 if (--count == 0) |
492 return NULL; | 492 return nullptr; |
493 info++; | 493 info++; |
494 } | 494 } |
495 SkASSERT(info->fName); | 495 SkASSERT(info->fName); |
496 SkASSERT(info->fType != SkType_BaseClassInfo); | 496 SkASSERT(info->fType != SkType_BaseClassInfo); |
497 if (*index >= count) { | 497 if (*index >= count) { |
498 *index -= count; | 498 *index -= count; |
499 return NULL; | 499 return nullptr; |
500 } | 500 } |
501 return &info[*index]; | 501 return &info[*index]; |
502 } | 502 } |
503 | 503 |
504 // Find named memberinfo | 504 // Find named memberinfo |
505 const SkMemberInfo* SkMemberInfo::Find(const SkMemberInfo info[], int count, con
st char** matchPtr) { | 505 const SkMemberInfo* SkMemberInfo::Find(const SkMemberInfo info[], int count, con
st char** matchPtr) { |
506 const char* match = *matchPtr; | 506 const char* match = *matchPtr; |
507 if (info->fType == SkType_BaseClassInfo) { | 507 if (info->fType == SkType_BaseClassInfo) { |
508 const SkMemberInfo* inherited = (SkMemberInfo*) info->fName; | 508 const SkMemberInfo* inherited = (SkMemberInfo*) info->fName; |
509 const SkMemberInfo* result = SkMemberInfo::Find(inherited, info->fCount,
matchPtr); | 509 const SkMemberInfo* result = SkMemberInfo::Find(inherited, info->fCount,
matchPtr); |
510 if (result != NULL) | 510 if (result != nullptr) |
511 return result; | 511 return result; |
512 if (--count == 0) | 512 if (--count == 0) |
513 return NULL; | 513 return nullptr; |
514 info++; | 514 info++; |
515 } | 515 } |
516 SkASSERT(info->fName); | 516 SkASSERT(info->fName); |
517 SkASSERT(info->fType != SkType_BaseClassInfo); | 517 SkASSERT(info->fType != SkType_BaseClassInfo); |
518 int index = SkStrSearch(&info->fName, count, match, sizeof(*info)); | 518 int index = SkStrSearch(&info->fName, count, match, sizeof(*info)); |
519 if (index < 0 || index >= count) | 519 if (index < 0 || index >= count) |
520 return NULL; | 520 return nullptr; |
521 return &info[index]; | 521 return &info[index]; |
522 } | 522 } |
523 | 523 |
524 const SkMemberInfo* SkMemberInfo::getInherited() const { | 524 const SkMemberInfo* SkMemberInfo::getInherited() const { |
525 return (SkMemberInfo*) fName; | 525 return (SkMemberInfo*) fName; |
526 } | 526 } |
527 | 527 |
528 #endif // SK_USE_CONDENSED_INFO == 0 | 528 #endif // SK_USE_CONDENSED_INFO == 0 |
529 | 529 |
530 #if 0 | 530 #if 0 |
(...skipping 19 matching lines...) Expand all Loading... |
550 // case SkType_PointArray: | 550 // case SkType_PointArray: |
551 case SkType_ScalarArray: | 551 case SkType_ScalarArray: |
552 SkParse::FindScalars(value, (SkScalar*) valuePtr, count); | 552 SkParse::FindScalars(value, (SkScalar*) valuePtr, count); |
553 break; | 553 break; |
554 default: | 554 default: |
555 SkASSERT(0); | 555 SkASSERT(0); |
556 } | 556 } |
557 return true; | 557 return true; |
558 } | 558 } |
559 #endif | 559 #endif |
OLD | NEW |