|  |  | 
|  | /* | 
|  | * Copyright 2006 The Android Open Source Project | 
|  | * | 
|  | * Use of this source code is governed by a BSD-style license that can be | 
|  | * found in the LICENSE file. | 
|  | */ | 
|  |  | 
|  |  | 
|  | #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 |