| /* libs/graphics/animator/SkGetCondensedInfo.cpp |
| ** |
| ** Copyright 2006, The Android Open Source Project |
| ** |
| ** Licensed under the Apache License, Version 2.0 (the "License"); |
| ** you may not use this file except in compliance with the License. |
| ** You may obtain a copy of the License at |
| ** |
| ** http://www.apache.org/licenses/LICENSE-2.0 |
| ** |
| ** Unless required by applicable law or agreed to in writing, software |
| ** distributed under the License is distributed on an "AS IS" BASIS, |
| ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| ** See the License for the specific language governing permissions and |
| ** limitations under the License. |
| */ |
| |
| #include "SkMemberInfo.h" |
| |
| #if SK_USE_CONDENSED_INFO == 1 |
| |
| // SkCondensed.cpp is auto-generated |
| // To generate it, execute SkDisplayType::BuildCondensedInfo() |
| #ifdef SK_DEBUG |
| #include "SkCondensedDebug.cpp" |
| #else |
| #include "SkCondensedRelease.cpp" |
| #endif |
| |
| static int _searchByName(const unsigned char* lengths, int count, const char* strings, const char target[]) { |
| int lo = 0; |
| int hi = count - 1; |
| while (lo < hi) { |
| int mid = (hi + lo) >> 1; |
| if (strcmp(&strings[lengths[mid << 2]], target) < 0) |
| lo = mid + 1; |
| else |
| hi = mid; |
| } |
| if (strcmp(&strings[lengths[hi << 2]], target) != 0) |
| return -1; |
| return hi; |
| } |
| |
| static int _searchByType(SkDisplayTypes type) { |
| unsigned char match = (unsigned char) type; |
| int lo = 0; |
| int hi = kTypeIDs - 1; |
| while (lo < hi) { |
| int mid = (hi + lo) >> 1; |
| if (gTypeIDs[mid] < match) |
| lo = mid + 1; |
| else |
| hi = mid; |
| } |
| if (gTypeIDs[hi] != type) |
| return -1; |
| return hi; |
| } |
| |
| const SkMemberInfo* SkDisplayType::GetMembers(SkAnimateMaker* , SkDisplayTypes type, int* infoCountPtr) { |
| int lookup = _searchByType(type); |
| if (lookup < 0) |
| return NULL; |
| if (infoCountPtr) |
| *infoCountPtr = gInfoCounts[lookup]; |
| return gInfoTables[lookup]; |
| } |
| |
| // !!! replace with inline |
| const SkMemberInfo* SkDisplayType::GetMember(SkAnimateMaker* , SkDisplayTypes type, const char** matchPtr ) { |
| const SkMemberInfo* info = SkMemberInfo::Find(type, matchPtr); |
| SkASSERT(info); |
| return info; |
| } |
| |
| static const SkMemberInfo* _lookup(int lookup, const char** matchPtr) { |
| int count = gInfoCounts[lookup]; |
| const SkMemberInfo* info = gInfoTables[lookup]; |
| if (info->fType == SkType_BaseClassInfo) { |
| int baseTypeLookup = info->fOffset; |
| const SkMemberInfo* result = _lookup(baseTypeLookup, matchPtr); |
| if (result != NULL) |
| return result; |
| if (--count == 0) |
| return NULL; |
| info++; |
| } |
| SkASSERT(info->fType != SkType_BaseClassInfo); |
| const char* match = *matchPtr; |
| const char* strings = gInfoNames[lookup]; |
| int index = _searchByName(&info->fName, count, strings, match); |
| if (index < 0) |
| return NULL; |
| return &info[index]; |
| } |
| |
| const SkMemberInfo* SkMemberInfo::Find(SkDisplayTypes type, int* index) { |
| int count = gInfoCounts[lookup]; |
| const SkMemberInfo* info = gInfoTables[lookup]; |
| if (info->fType == SkType_BaseClassInfo) { |
| int baseTypeLookup = info->fOffset; |
| const SkMemberInfo* result = Find(baseTypeLookup, index); |
| if (result != NULL) |
| return result; |
| if (--count == 0) |
| return NULL; |
| info++; |
| } |
| SkASSERT(info->fType != SkType_BaseClassInfo); |
| if (*index >= count) { |
| *index -= count; |
| return NULL; |
| } |
| return &info[index]; |
| } |
| |
| const SkMemberInfo* SkMemberInfo::Find(SkDisplayTypes type, const char** matchPtr) { |
| int lookup = _searchByType(type); |
| SkASSERT(lookup >= 0); |
| return _lookup(lookup, matchPtr); |
| } |
| |
| const SkMemberInfo* SkMemberInfo::getInherited() const { |
| int baseTypeLookup = fOffset; |
| return gInfoTables[baseTypeLookup]; |
| } |
| |
| #endif |
| |