|
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 "SkMemberInfo.h" |
|
11 |
|
12 #if SK_USE_CONDENSED_INFO == 1 |
|
13 |
|
14 // SkCondensed.cpp is auto-generated |
|
15 // To generate it, execute SkDisplayType::BuildCondensedInfo() |
|
16 #ifdef SK_DEBUG |
|
17 #include "SkCondensedDebug.cpp" |
|
18 #else |
|
19 #include "SkCondensedRelease.cpp" |
|
20 #endif |
|
21 |
|
22 static int _searchByName(const unsigned char* lengths, int count, const char* strings, const char target[]) { |
|
23 int lo = 0; |
|
24 int hi = count - 1; |
|
25 while (lo < hi) { |
|
26 int mid = (hi + lo) >> 1; |
|
27 if (strcmp(&strings[lengths[mid << 2]], target) < 0) |
|
28 lo = mid + 1; |
|
29 else |
|
30 hi = mid; |
|
31 } |
|
32 if (strcmp(&strings[lengths[hi << 2]], target) != 0) |
|
33 return -1; |
|
34 return hi; |
|
35 } |
|
36 |
|
37 static int _searchByType(SkDisplayTypes type) { |
|
38 unsigned char match = (unsigned char) type; |
|
39 int lo = 0; |
|
40 int hi = kTypeIDs - 1; |
|
41 while (lo < hi) { |
|
42 int mid = (hi + lo) >> 1; |
|
43 if (gTypeIDs[mid] < match) |
|
44 lo = mid + 1; |
|
45 else |
|
46 hi = mid; |
|
47 } |
|
48 if (gTypeIDs[hi] != type) |
|
49 return -1; |
|
50 return hi; |
|
51 } |
|
52 |
|
53 const SkMemberInfo* SkDisplayType::GetMembers(SkAnimateMaker* , SkDisplayTypes type, int* infoCountPtr) { |
|
54 int lookup = _searchByType(type); |
|
55 if (lookup < 0) |
|
56 return NULL; |
|
57 if (infoCountPtr) |
|
58 *infoCountPtr = gInfoCounts[lookup]; |
|
59 return gInfoTables[lookup]; |
|
60 } |
|
61 |
|
62 // !!! replace with inline |
|
63 const SkMemberInfo* SkDisplayType::GetMember(SkAnimateMaker* , SkDisplayTypes type, const char** matchPtr ) { |
|
64 const SkMemberInfo* info = SkMemberInfo::Find(type, matchPtr); |
|
65 SkASSERT(info); |
|
66 return info; |
|
67 } |
|
68 |
|
69 static const SkMemberInfo* _lookup(int lookup, const char** matchPtr) { |
|
70 int count = gInfoCounts[lookup]; |
|
71 const SkMemberInfo* info = gInfoTables[lookup]; |
|
72 if (info->fType == SkType_BaseClassInfo) { |
|
73 int baseTypeLookup = info->fOffset; |
|
74 const SkMemberInfo* result = _lookup(baseTypeLookup, matchPtr); |
|
75 if (result != NULL) |
|
76 return result; |
|
77 if (--count == 0) |
|
78 return NULL; |
|
79 info++; |
|
80 } |
|
81 SkASSERT(info->fType != SkType_BaseClassInfo); |
|
82 const char* match = *matchPtr; |
|
83 const char* strings = gInfoNames[lookup]; |
|
84 int index = _searchByName(&info->fName, count, strings, match); |
|
85 if (index < 0) |
|
86 return NULL; |
|
87 return &info[index]; |
|
88 } |
|
89 |
|
90 const SkMemberInfo* SkMemberInfo::Find(SkDisplayTypes type, int* index) { |
|
91 int count = gInfoCounts[lookup]; |
|
92 const SkMemberInfo* info = gInfoTables[lookup]; |
|
93 if (info->fType == SkType_BaseClassInfo) { |
|
94 int baseTypeLookup = info->fOffset; |
|
95 const SkMemberInfo* result = Find(baseTypeLookup, index); |
|
96 if (result != NULL) |
|
97 return result; |
|
98 if (--count == 0) |
|
99 return NULL; |
|
100 info++; |
|
101 } |
|
102 SkASSERT(info->fType != SkType_BaseClassInfo); |
|
103 if (*index >= count) { |
|
104 *index -= count; |
|
105 return NULL; |
|
106 } |
|
107 return &info[index]; |
|
108 } |
|
109 |
|
110 const SkMemberInfo* SkMemberInfo::Find(SkDisplayTypes type, const char** matchPtr) { |
|
111 int lookup = _searchByType(type); |
|
112 SkASSERT(lookup >= 0); |
|
113 return _lookup(lookup, matchPtr); |
|
114 } |
|
115 |
|
116 const SkMemberInfo* SkMemberInfo::getInherited() const { |
|
117 int baseTypeLookup = fOffset; |
|
118 return gInfoTables[baseTypeLookup]; |
|
119 } |
|
120 |
|
121 #endif |