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 "SkDisplayType.h" | 10 #include "SkDisplayType.h" |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 #include "SkTSearch.h" | 55 #include "SkTSearch.h" |
56 | 56 |
57 #define CASE_NEW(_class) \ | 57 #define CASE_NEW(_class) \ |
58 case SkType_##_class: result = new Sk##_class(); break | 58 case SkType_##_class: result = new Sk##_class(); break |
59 #define CASE_DRAW_NEW(_class) \ | 59 #define CASE_DRAW_NEW(_class) \ |
60 case SkType_##_class: result = new SkDraw##_class(); break | 60 case SkType_##_class: result = new SkDraw##_class(); break |
61 #define CASE_DISPLAY_NEW(_class) \ | 61 #define CASE_DISPLAY_NEW(_class) \ |
62 case SkType_##_class: result = new SkDisplay##_class(); break | 62 case SkType_##_class: result = new SkDisplay##_class(); break |
63 #ifdef SK_DEBUG | 63 #ifdef SK_DEBUG |
64 #define CASE_DEBUG_RETURN_NIL(_class) \ | 64 #define CASE_DEBUG_RETURN_NIL(_class) \ |
65 case SkType_##_class: return NULL | 65 case SkType_##_class: return nullptr |
66 #else | 66 #else |
67 #define CASE_DEBUG_RETURN_NIL(_class) | 67 #define CASE_DEBUG_RETURN_NIL(_class) |
68 #endif | 68 #endif |
69 | 69 |
70 | 70 |
71 SkDisplayTypes SkDisplayType::gNewTypes = kNumberOfTypes; | 71 SkDisplayTypes SkDisplayType::gNewTypes = kNumberOfTypes; |
72 | 72 |
73 SkDisplayable* SkDisplayType::CreateInstance(SkAnimateMaker* maker, SkDisplayTyp
es type) { | 73 SkDisplayable* SkDisplayType::CreateInstance(SkAnimateMaker* maker, SkDisplayTyp
es type) { |
74 SkDisplayable* result = NULL; | 74 SkDisplayable* result = nullptr; |
75 switch (type) { | 75 switch (type) { |
76 // unknown | 76 // unknown |
77 CASE_DISPLAY_NEW(Math); | 77 CASE_DISPLAY_NEW(Math); |
78 CASE_DISPLAY_NEW(Number); | 78 CASE_DISPLAY_NEW(Number); |
79 CASE_NEW(Add); | 79 CASE_NEW(Add); |
80 CASE_NEW(AddCircle); | 80 CASE_NEW(AddCircle); |
81 // addgeom | 81 // addgeom |
82 CASE_DEBUG_RETURN_NIL(AddMode); | 82 CASE_DEBUG_RETURN_NIL(AddMode); |
83 CASE_NEW(AddOval); | 83 CASE_NEW(AddOval); |
84 CASE_NEW(AddPath); | 84 CASE_NEW(AddPath); |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
193 // textboxmode | 193 // textboxmode |
194 CASE_NEW(TextOnPath); | 194 CASE_NEW(TextOnPath); |
195 CASE_NEW(TextToPath); | 195 CASE_NEW(TextToPath); |
196 CASE_DEBUG_RETURN_NIL(TileMode); | 196 CASE_DEBUG_RETURN_NIL(TileMode); |
197 CASE_NEW(Translate); | 197 CASE_NEW(Translate); |
198 CASE_DRAW_NEW(Typeface); | 198 CASE_DRAW_NEW(Typeface); |
199 CASE_DEBUG_RETURN_NIL(Xfermode); | 199 CASE_DEBUG_RETURN_NIL(Xfermode); |
200 default: | 200 default: |
201 SkExtras** end = maker->fExtras.end(); | 201 SkExtras** end = maker->fExtras.end(); |
202 for (SkExtras** extraPtr = maker->fExtras.begin(); extraPtr < end; e
xtraPtr++) { | 202 for (SkExtras** extraPtr = maker->fExtras.begin(); extraPtr < end; e
xtraPtr++) { |
203 if ((result = (*extraPtr)->createInstance(type)) != NULL) | 203 if ((result = (*extraPtr)->createInstance(type)) != nullptr) |
204 return result; | 204 return result; |
205 } | 205 } |
206 SkASSERT(0); | 206 SkASSERT(0); |
207 } | 207 } |
208 return result; | 208 return result; |
209 } | 209 } |
210 | 210 |
211 #undef CASE_NEW | 211 #undef CASE_NEW |
212 #undef CASE_DRAW_NEW | 212 #undef CASE_DRAW_NEW |
213 #undef CASE_DISPLAY_NEW | 213 #undef CASE_DISPLAY_NEW |
214 | 214 |
215 #if SK_USE_CONDENSED_INFO == 0 | 215 #if SK_USE_CONDENSED_INFO == 0 |
216 | 216 |
217 #define CASE_GET_INFO(_class) case SkType_##_class: \ | 217 #define CASE_GET_INFO(_class) case SkType_##_class: \ |
218 info = Sk##_class::fInfo; infoCount = Sk##_class::fInfoCount; break | 218 info = Sk##_class::fInfo; infoCount = Sk##_class::fInfoCount; break |
219 #define CASE_GET_DRAW_INFO(_class) case SkType_##_class: \ | 219 #define CASE_GET_DRAW_INFO(_class) case SkType_##_class: \ |
220 info = SkDraw##_class::fInfo; infoCount = SkDraw##_class::fInfoCount; break | 220 info = SkDraw##_class::fInfo; infoCount = SkDraw##_class::fInfoCount; break |
221 #define CASE_GET_DISPLAY_INFO(_class) case SkType_##_class: \ | 221 #define CASE_GET_DISPLAY_INFO(_class) case SkType_##_class: \ |
222 info = SkDisplay##_class::fInfo; infoCount = SkDisplay##_class::fInfoCount;
\ | 222 info = SkDisplay##_class::fInfo; infoCount = SkDisplay##_class::fInfoCount;
\ |
223 break | 223 break |
224 | 224 |
225 const SkMemberInfo* SkDisplayType::GetMembers(SkAnimateMaker* maker, | 225 const SkMemberInfo* SkDisplayType::GetMembers(SkAnimateMaker* maker, |
226 SkDisplayTypes type, int* infoCountPtr) { | 226 SkDisplayTypes type, int* infoCountPtr) { |
227 const SkMemberInfo* info = NULL; | 227 const SkMemberInfo* info = nullptr; |
228 int infoCount = 0; | 228 int infoCount = 0; |
229 switch (type) { | 229 switch (type) { |
230 // unknown | 230 // unknown |
231 CASE_GET_DISPLAY_INFO(Math); | 231 CASE_GET_DISPLAY_INFO(Math); |
232 CASE_GET_DISPLAY_INFO(Number); | 232 CASE_GET_DISPLAY_INFO(Number); |
233 CASE_GET_INFO(Add); | 233 CASE_GET_INFO(Add); |
234 CASE_GET_INFO(AddCircle); | 234 CASE_GET_INFO(AddCircle); |
235 CASE_GET_INFO(AddGeom); | 235 CASE_GET_INFO(AddGeom); |
236 // addmode | 236 // addmode |
237 CASE_GET_INFO(AddOval); | 237 CASE_GET_INFO(AddOval); |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
349 CASE_GET_INFO(TextToPath); | 349 CASE_GET_INFO(TextToPath); |
350 // tilemode | 350 // tilemode |
351 CASE_GET_INFO(Translate); | 351 CASE_GET_INFO(Translate); |
352 CASE_GET_DRAW_INFO(Typeface); | 352 CASE_GET_DRAW_INFO(Typeface); |
353 // xfermode | 353 // xfermode |
354 // knumberoftypes | 354 // knumberoftypes |
355 default: | 355 default: |
356 if (maker) { | 356 if (maker) { |
357 SkExtras** end = maker->fExtras.end(); | 357 SkExtras** end = maker->fExtras.end(); |
358 for (SkExtras** extraPtr = maker->fExtras.begin(); extraPtr < en
d; extraPtr++) { | 358 for (SkExtras** extraPtr = maker->fExtras.begin(); extraPtr < en
d; extraPtr++) { |
359 if ((info = (*extraPtr)->getMembers(type, infoCountPtr)) !=
NULL) | 359 if ((info = (*extraPtr)->getMembers(type, infoCountPtr)) !=
nullptr) |
360 return info; | 360 return info; |
361 } | 361 } |
362 } | 362 } |
363 return NULL; | 363 return nullptr; |
364 } | 364 } |
365 if (infoCountPtr) | 365 if (infoCountPtr) |
366 *infoCountPtr = infoCount; | 366 *infoCountPtr = infoCount; |
367 return info; | 367 return info; |
368 } | 368 } |
369 | 369 |
370 const SkMemberInfo* SkDisplayType::GetMember(SkAnimateMaker* maker, | 370 const SkMemberInfo* SkDisplayType::GetMember(SkAnimateMaker* maker, |
371 SkDisplayTypes type, const char** matchPtr ) { | 371 SkDisplayTypes type, const char** matchPtr ) { |
372 int infoCount = 0; // Initialize to remove a warning. | 372 int infoCount = 0; // Initialize to remove a warning. |
373 const SkMemberInfo* info = GetMembers(maker, type, &infoCount); | 373 const SkMemberInfo* info = GetMembers(maker, type, &infoCount); |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
518 { "typeface", SkType_Typeface INIT_BOOL_FIELDS } | 518 { "typeface", SkType_Typeface INIT_BOOL_FIELDS } |
519 // xfermode | 519 // xfermode |
520 // knumberoftypes | 520 // knumberoftypes |
521 }; | 521 }; |
522 | 522 |
523 const int kTypeNamesSize = SK_ARRAY_COUNT(gTypeNames); | 523 const int kTypeNamesSize = SK_ARRAY_COUNT(gTypeNames); |
524 | 524 |
525 SkDisplayTypes SkDisplayType::Find(SkAnimateMaker* maker, const SkMemberInfo* ma
tch) { | 525 SkDisplayTypes SkDisplayType::Find(SkAnimateMaker* maker, const SkMemberInfo* ma
tch) { |
526 for (int index = 0; index < kTypeNamesSize; index++) { | 526 for (int index = 0; index < kTypeNamesSize; index++) { |
527 SkDisplayTypes type = gTypeNames[index].fType; | 527 SkDisplayTypes type = gTypeNames[index].fType; |
528 const SkMemberInfo* info = SkDisplayType::GetMembers(maker, type, NULL); | 528 const SkMemberInfo* info = SkDisplayType::GetMembers(maker, type, nullpt
r); |
529 if (info == match) | 529 if (info == match) |
530 return type; | 530 return type; |
531 } | 531 } |
532 return (SkDisplayTypes) -1; | 532 return (SkDisplayTypes) -1; |
533 } | 533 } |
534 | 534 |
535 // !!! optimize this by replacing function with a byte-sized lookup table | 535 // !!! optimize this by replacing function with a byte-sized lookup table |
536 SkDisplayTypes SkDisplayType::GetParent(SkAnimateMaker* maker, SkDisplayTypes ba
se) { | 536 SkDisplayTypes SkDisplayType::GetParent(SkAnimateMaker* maker, SkDisplayTypes ba
se) { |
537 if (base == SkType_Group || base == SkType_Save || base == SkType_SaveLayer)
//!!! cheat a little until we have a lookup table | 537 if (base == SkType_Group || base == SkType_Save || base == SkType_SaveLayer)
//!!! cheat a little until we have a lookup table |
538 return SkType_Displayable; | 538 return SkType_Displayable; |
539 if (base == SkType_Set) | 539 if (base == SkType_Set) |
540 return SkType_Animate; // another cheat until we have a lookup table | 540 return SkType_Animate; // another cheat until we have a lookup table |
541 const SkMemberInfo* info = GetMembers(maker, base, NULL); // get info for th
is type | 541 const SkMemberInfo* info = GetMembers(maker, base, nullptr); // get info for
this type |
542 SkASSERT(info); | 542 SkASSERT(info); |
543 if (info->fType != SkType_BaseClassInfo) | 543 if (info->fType != SkType_BaseClassInfo) |
544 return SkType_Unknown; // if no base, done | 544 return SkType_Unknown; // if no base, done |
545 // !!! could change SK_MEMBER_INHERITED macro to take type, stuff in offset,
so that | 545 // !!! could change SK_MEMBER_INHERITED macro to take type, stuff in offset,
so that |
546 // this (and table builder) could know type without the following steps: | 546 // this (and table builder) could know type without the following steps: |
547 const SkMemberInfo* inherited = info->getInherited(); | 547 const SkMemberInfo* inherited = info->getInherited(); |
548 SkDisplayTypes result = (SkDisplayTypes) (SkType_Unknown + 1); | 548 SkDisplayTypes result = (SkDisplayTypes) (SkType_Unknown + 1); |
549 for (; result <= SkType_Xfermode; result = (SkDisplayTypes) (result + 1)) { | 549 for (; result <= SkType_Xfermode; result = (SkDisplayTypes) (result + 1)) { |
550 const SkMemberInfo* match = GetMembers(maker, result, NULL); | 550 const SkMemberInfo* match = GetMembers(maker, result, nullptr); |
551 if (match == inherited) | 551 if (match == inherited) |
552 break; | 552 break; |
553 } | 553 } |
554 SkASSERT(result <= SkType_Xfermode); | 554 SkASSERT(result <= SkType_Xfermode); |
555 return result; | 555 return result; |
556 } | 556 } |
557 | 557 |
558 SkDisplayTypes SkDisplayType::GetType(SkAnimateMaker* maker, const char match[],
size_t len ) { | 558 SkDisplayTypes SkDisplayType::GetType(SkAnimateMaker* maker, const char match[],
size_t len ) { |
559 int index = SkStrSearch(&gTypeNames[0].fName, kTypeNamesSize, match, | 559 int index = SkStrSearch(&gTypeNames[0].fName, kTypeNamesSize, match, |
560 len, sizeof(gTypeNames[0])); | 560 len, sizeof(gTypeNames[0])); |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
703 | 703 |
704 #ifdef SK_DEBUG | 704 #ifdef SK_DEBUG |
705 const char* SkDisplayType::GetName(SkAnimateMaker* maker, SkDisplayTypes type) { | 705 const char* SkDisplayType::GetName(SkAnimateMaker* maker, SkDisplayTypes type) { |
706 for (int index = 0; index < kTypeNamesSize - 1; index++) { | 706 for (int index = 0; index < kTypeNamesSize - 1; index++) { |
707 if (gTypeNames[index].fType == type) | 707 if (gTypeNames[index].fType == type) |
708 return gTypeNames[index].fName; | 708 return gTypeNames[index].fName; |
709 } | 709 } |
710 SkExtras** end = maker->fExtras.end(); | 710 SkExtras** end = maker->fExtras.end(); |
711 for (SkExtras** extraPtr = maker->fExtras.begin(); extraPtr < end; extraPtr+
+) { | 711 for (SkExtras** extraPtr = maker->fExtras.begin(); extraPtr < end; extraPtr+
+) { |
712 const char* result = (*extraPtr)->getName(type); | 712 const char* result = (*extraPtr)->getName(type); |
713 if (result != NULL) | 713 if (result != nullptr) |
714 return result; | 714 return result; |
715 } | 715 } |
716 return NULL; | 716 return nullptr; |
717 } | 717 } |
718 #endif | 718 #endif |
719 | 719 |
720 #ifdef SK_SUPPORT_UNITTEST | 720 #ifdef SK_SUPPORT_UNITTEST |
721 void SkDisplayType::UnitTest() { | 721 void SkDisplayType::UnitTest() { |
722 SkAnimator animator; | 722 SkAnimator animator; |
723 SkAnimateMaker* maker = animator.fMaker; | 723 SkAnimateMaker* maker = animator.fMaker; |
724 int index; | 724 int index; |
725 for (index = 0; index < kTypeNamesSize - 1; index++) { | 725 for (index = 0; index < kTypeNamesSize - 1; index++) { |
726 SkASSERT(strcmp(gTypeNames[index].fName, gTypeNames[index + 1].fName) <
0); | 726 SkASSERT(strcmp(gTypeNames[index].fName, gTypeNames[index + 1].fName) <
0); |
727 SkASSERT(gTypeNames[index].fType < gTypeNames[index + 1].fType); | 727 SkASSERT(gTypeNames[index].fType < gTypeNames[index + 1].fType); |
728 } | 728 } |
729 for (index = 0; index < kTypeNamesSize; index++) { | 729 for (index = 0; index < kTypeNamesSize; index++) { |
730 SkDisplayable* test = CreateInstance(maker, gTypeNames[index].fType); | 730 SkDisplayable* test = CreateInstance(maker, gTypeNames[index].fType); |
731 if (test == NULL) | 731 if (test == nullptr) |
732 continue; | 732 continue; |
733 #if defined _WIN32 && _MSC_VER >= 1300 && defined _INC_CRTDBG // only on window
s, only if using "crtdbg.h" | 733 #if defined _WIN32 && _MSC_VER >= 1300 && defined _INC_CRTDBG // only on window
s, only if using "crtdbg.h" |
734 // we know that crtdbg puts 0xfdfdfdfd at the end of the block | 734 // we know that crtdbg puts 0xfdfdfdfd at the end of the block |
735 // look for unitialized memory, signature 0xcdcdcdcd prior to that | 735 // look for unitialized memory, signature 0xcdcdcdcd prior to that |
736 int* start = (int*) test; | 736 int* start = (int*) test; |
737 while (*start != 0xfdfdfdfd) { | 737 while (*start != 0xfdfdfdfd) { |
738 SkASSERT(*start != 0xcdcdcdcd); | 738 SkASSERT(*start != 0xcdcdcdcd); |
739 start++; | 739 start++; |
740 } | 740 } |
741 #endif | 741 #endif |
742 delete test; | 742 delete test; |
743 } | 743 } |
744 for (index = 0; index < kTypeNamesSize; index++) { | 744 for (index = 0; index < kTypeNamesSize; index++) { |
745 int infoCount; | 745 int infoCount; |
746 const SkMemberInfo* info = GetMembers(maker, gTypeNames[index].fType, &i
nfoCount); | 746 const SkMemberInfo* info = GetMembers(maker, gTypeNames[index].fType, &i
nfoCount); |
747 if (info == NULL) | 747 if (info == nullptr) |
748 continue; | 748 continue; |
749 #if SK_USE_CONDENSED_INFO == 0 | 749 #if SK_USE_CONDENSED_INFO == 0 |
750 for (int inner = 0; inner < infoCount - 1; inner++) { | 750 for (int inner = 0; inner < infoCount - 1; inner++) { |
751 if (info[inner].fType == SkType_BaseClassInfo) | 751 if (info[inner].fType == SkType_BaseClassInfo) |
752 continue; | 752 continue; |
753 SkASSERT(strcmp(info[inner].fName, info[inner + 1].fName) < 0); | 753 SkASSERT(strcmp(info[inner].fName, info[inner + 1].fName) < 0); |
754 } | 754 } |
755 #endif | 755 #endif |
756 } | 756 } |
757 #if defined SK_DEBUG || defined SK_BUILD_CONDENSED | 757 #if defined SK_DEBUG || defined SK_BUILD_CONDENSED |
758 BuildCondensedInfo(maker); | 758 BuildCondensedInfo(maker); |
759 #endif | 759 #endif |
760 } | 760 } |
761 #endif | 761 #endif |
OLD | NEW |