1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 8ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkMemberInfo.h" 118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if SK_USE_CONDENSED_INFO == 1 138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// SkCondensed.cpp is auto-generated 158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// To generate it, execute SkDisplayType::BuildCondensedInfo() 168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG 178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkCondensedDebug.cpp" 188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#else 198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkCondensedRelease.cpp" 208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic int _searchByName(const unsigned char* lengths, int count, const char* strings, const char target[]) { 238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int lo = 0; 248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int hi = count - 1; 258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com while (lo < hi) { 268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int mid = (hi + lo) >> 1; 278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (strcmp(&strings[lengths[mid << 2]], target) < 0) 288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com lo = mid + 1; 29d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com else 308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com hi = mid; 318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (strcmp(&strings[lengths[hi << 2]], target) != 0) 338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return -1; 348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return hi; 358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic int _searchByType(SkDisplayTypes type) { 388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com unsigned char match = (unsigned char) type; 398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int lo = 0; 408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int hi = kTypeIDs - 1; 418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com while (lo < hi) { 428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int mid = (hi + lo) >> 1; 438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (gTypeIDs[mid] < match) 448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com lo = mid + 1; 458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com else 468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com hi = mid; 478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (gTypeIDs[hi] != type) 498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return -1; 508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return hi; 518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst SkMemberInfo* SkDisplayType::GetMembers(SkAnimateMaker* , SkDisplayTypes type, int* infoCountPtr) { 548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int lookup = _searchByType(type); 558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (lookup < 0) 568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return NULL; 578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (infoCountPtr) 588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *infoCountPtr = gInfoCounts[lookup]; 598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return gInfoTables[lookup]; 608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// !!! replace with inline 638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst SkMemberInfo* SkDisplayType::GetMember(SkAnimateMaker* , SkDisplayTypes type, const char** matchPtr ) { 648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const SkMemberInfo* info = SkMemberInfo::Find(type, matchPtr); 658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(info); 668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return info; 678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic const SkMemberInfo* _lookup(int lookup, const char** matchPtr) { 708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int count = gInfoCounts[lookup]; 718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const SkMemberInfo* info = gInfoTables[lookup]; 728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (info->fType == SkType_BaseClassInfo) { 738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int baseTypeLookup = info->fOffset; 748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const SkMemberInfo* result = _lookup(baseTypeLookup, matchPtr); 758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (result != NULL) 768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return result; 778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (--count == 0) 788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return NULL; 798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com info++; 808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(info->fType != SkType_BaseClassInfo); 828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const char* match = *matchPtr; 838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const char* strings = gInfoNames[lookup]; 848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int index = _searchByName(&info->fName, count, strings, match); 858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (index < 0) 868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return NULL; 878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return &info[index]; 888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst SkMemberInfo* SkMemberInfo::Find(SkDisplayTypes type, int* index) { 918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int count = gInfoCounts[lookup]; 928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const SkMemberInfo* info = gInfoTables[lookup]; 938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (info->fType == SkType_BaseClassInfo) { 948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int baseTypeLookup = info->fOffset; 958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const SkMemberInfo* result = Find(baseTypeLookup, index); 968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (result != NULL) 978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return result; 988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (--count == 0) 998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return NULL; 1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com info++; 1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(info->fType != SkType_BaseClassInfo); 1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (*index >= count) { 1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *index -= count; 1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return NULL; 1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return &info[index]; 1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst SkMemberInfo* SkMemberInfo::Find(SkDisplayTypes type, const char** matchPtr) { 1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int lookup = _searchByType(type); 1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(lookup >= 0); 1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return _lookup(lookup, matchPtr); 1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst SkMemberInfo* SkMemberInfo::getInherited() const { 1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int baseTypeLookup = fOffset; 1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return gInfoTables[baseTypeLookup]; 1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 122