michael@0: michael@0: /* michael@0: * Copyright 2006 The Android Open Source Project michael@0: * michael@0: * Use of this source code is governed by a BSD-style license that can be michael@0: * found in the LICENSE file. michael@0: */ michael@0: michael@0: michael@0: #include "SkMemberInfo.h" michael@0: michael@0: #if SK_USE_CONDENSED_INFO == 1 michael@0: michael@0: // SkCondensed.cpp is auto-generated michael@0: // To generate it, execute SkDisplayType::BuildCondensedInfo() michael@0: #ifdef SK_DEBUG michael@0: #include "SkCondensedDebug.cpp" michael@0: #else michael@0: #include "SkCondensedRelease.cpp" michael@0: #endif michael@0: michael@0: static int _searchByName(const unsigned char* lengths, int count, const char* strings, const char target[]) { michael@0: int lo = 0; michael@0: int hi = count - 1; michael@0: while (lo < hi) { michael@0: int mid = (hi + lo) >> 1; michael@0: if (strcmp(&strings[lengths[mid << 2]], target) < 0) michael@0: lo = mid + 1; michael@0: else michael@0: hi = mid; michael@0: } michael@0: if (strcmp(&strings[lengths[hi << 2]], target) != 0) michael@0: return -1; michael@0: return hi; michael@0: } michael@0: michael@0: static int _searchByType(SkDisplayTypes type) { michael@0: unsigned char match = (unsigned char) type; michael@0: int lo = 0; michael@0: int hi = kTypeIDs - 1; michael@0: while (lo < hi) { michael@0: int mid = (hi + lo) >> 1; michael@0: if (gTypeIDs[mid] < match) michael@0: lo = mid + 1; michael@0: else michael@0: hi = mid; michael@0: } michael@0: if (gTypeIDs[hi] != type) michael@0: return -1; michael@0: return hi; michael@0: } michael@0: michael@0: const SkMemberInfo* SkDisplayType::GetMembers(SkAnimateMaker* , SkDisplayTypes type, int* infoCountPtr) { michael@0: int lookup = _searchByType(type); michael@0: if (lookup < 0) michael@0: return NULL; michael@0: if (infoCountPtr) michael@0: *infoCountPtr = gInfoCounts[lookup]; michael@0: return gInfoTables[lookup]; michael@0: } michael@0: michael@0: // !!! replace with inline michael@0: const SkMemberInfo* SkDisplayType::GetMember(SkAnimateMaker* , SkDisplayTypes type, const char** matchPtr ) { michael@0: const SkMemberInfo* info = SkMemberInfo::Find(type, matchPtr); michael@0: SkASSERT(info); michael@0: return info; michael@0: } michael@0: michael@0: static const SkMemberInfo* _lookup(int lookup, const char** matchPtr) { michael@0: int count = gInfoCounts[lookup]; michael@0: const SkMemberInfo* info = gInfoTables[lookup]; michael@0: if (info->fType == SkType_BaseClassInfo) { michael@0: int baseTypeLookup = info->fOffset; michael@0: const SkMemberInfo* result = _lookup(baseTypeLookup, matchPtr); michael@0: if (result != NULL) michael@0: return result; michael@0: if (--count == 0) michael@0: return NULL; michael@0: info++; michael@0: } michael@0: SkASSERT(info->fType != SkType_BaseClassInfo); michael@0: const char* match = *matchPtr; michael@0: const char* strings = gInfoNames[lookup]; michael@0: int index = _searchByName(&info->fName, count, strings, match); michael@0: if (index < 0) michael@0: return NULL; michael@0: return &info[index]; michael@0: } michael@0: michael@0: const SkMemberInfo* SkMemberInfo::Find(SkDisplayTypes type, int* index) { michael@0: int count = gInfoCounts[lookup]; michael@0: const SkMemberInfo* info = gInfoTables[lookup]; michael@0: if (info->fType == SkType_BaseClassInfo) { michael@0: int baseTypeLookup = info->fOffset; michael@0: const SkMemberInfo* result = Find(baseTypeLookup, index); michael@0: if (result != NULL) michael@0: return result; michael@0: if (--count == 0) michael@0: return NULL; michael@0: info++; michael@0: } michael@0: SkASSERT(info->fType != SkType_BaseClassInfo); michael@0: if (*index >= count) { michael@0: *index -= count; michael@0: return NULL; michael@0: } michael@0: return &info[index]; michael@0: } michael@0: michael@0: const SkMemberInfo* SkMemberInfo::Find(SkDisplayTypes type, const char** matchPtr) { michael@0: int lookup = _searchByType(type); michael@0: SkASSERT(lookup >= 0); michael@0: return _lookup(lookup, matchPtr); michael@0: } michael@0: michael@0: const SkMemberInfo* SkMemberInfo::getInherited() const { michael@0: int baseTypeLookup = fOffset; michael@0: return gInfoTables[baseTypeLookup]; michael@0: } michael@0: michael@0: #endif