/* * 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.inc is auto-generated // To generate it, execute SkDisplayType::BuildCondensedInfo() #ifdef SK_DEBUG #include "SkCondensedDebug.inc" #else #include "SkCondensedRelease.inc" #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 nullptr; 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 != nullptr) return result; if (--count == 0) return nullptr; 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 nullptr; 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 != nullptr) return result; if (--count == 0) return nullptr; info++; } SkASSERT(info->fType != SkType_BaseClassInfo); if (*index >= count) { *index -= count; return nullptr; } 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