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