1
2/*
3 * Copyright 2006 The Android Open Source Project
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9
10#include "SkMemberInfo.h"
11
12#if SK_USE_CONDENSED_INFO == 1
13
14// SkCondensed.cpp is auto-generated
15// To generate it, execute SkDisplayType::BuildCondensedInfo()
16#ifdef SK_DEBUG
17#include "SkCondensedDebug.cpp"
18#else
19#include "SkCondensedRelease.cpp"
20#endif
21
22static int _searchByName(const unsigned char* lengths, int count, const char* strings, const char target[]) {
23    int lo = 0;
24    int hi = count - 1;
25    while (lo < hi) {
26        int mid = (hi + lo) >> 1;
27        if (strcmp(&strings[lengths[mid << 2]], target) < 0)
28            lo = mid + 1;
29        else
30            hi = mid;
31    }
32    if (strcmp(&strings[lengths[hi << 2]], target) != 0)
33        return -1;
34    return hi;
35}
36
37static int _searchByType(SkDisplayTypes type) {
38    unsigned char match = (unsigned char) type;
39    int lo = 0;
40    int hi = kTypeIDs - 1;
41    while (lo < hi) {
42        int mid = (hi + lo) >> 1;
43        if (gTypeIDs[mid] < match)
44            lo = mid + 1;
45        else
46            hi = mid;
47    }
48    if (gTypeIDs[hi] != type)
49        return -1;
50    return hi;
51}
52
53const SkMemberInfo* SkDisplayType::GetMembers(SkAnimateMaker* , SkDisplayTypes type, int* infoCountPtr) {
54    int lookup = _searchByType(type);
55    if (lookup < 0)
56        return NULL;
57    if (infoCountPtr)
58        *infoCountPtr = gInfoCounts[lookup];
59    return gInfoTables[lookup];
60}
61
62// !!! replace with inline
63const SkMemberInfo* SkDisplayType::GetMember(SkAnimateMaker* , SkDisplayTypes type, const char** matchPtr ) {
64    const SkMemberInfo* info = SkMemberInfo::Find(type, matchPtr);
65    SkASSERT(info);
66    return info;
67}
68
69static const SkMemberInfo* _lookup(int lookup, const char** matchPtr) {
70    int count = gInfoCounts[lookup];
71    const SkMemberInfo* info = gInfoTables[lookup];
72    if (info->fType == SkType_BaseClassInfo) {
73        int baseTypeLookup = info->fOffset;
74        const SkMemberInfo* result = _lookup(baseTypeLookup, matchPtr);
75        if (result != NULL)
76            return result;
77        if (--count == 0)
78            return NULL;
79        info++;
80    }
81    SkASSERT(info->fType != SkType_BaseClassInfo);
82    const char* match = *matchPtr;
83    const char* strings = gInfoNames[lookup];
84    int index = _searchByName(&info->fName, count, strings, match);
85    if (index < 0)
86        return NULL;
87    return &info[index];
88}
89
90const SkMemberInfo* SkMemberInfo::Find(SkDisplayTypes type, int* index) {
91    int count = gInfoCounts[lookup];
92    const SkMemberInfo* info = gInfoTables[lookup];
93    if (info->fType == SkType_BaseClassInfo) {
94        int baseTypeLookup = info->fOffset;
95        const SkMemberInfo* result = Find(baseTypeLookup, index);
96        if (result != NULL)
97            return result;
98        if (--count == 0)
99            return NULL;
100        info++;
101    }
102    SkASSERT(info->fType != SkType_BaseClassInfo);
103    if (*index >= count) {
104        *index -= count;
105        return NULL;
106    }
107    return &info[index];
108}
109
110const SkMemberInfo* SkMemberInfo::Find(SkDisplayTypes type, const char** matchPtr) {
111    int lookup = _searchByType(type);
112    SkASSERT(lookup >= 0);
113    return _lookup(lookup, matchPtr);
114}
115
116const SkMemberInfo* SkMemberInfo::getInherited() const {
117    int baseTypeLookup = fOffset;
118    return gInfoTables[baseTypeLookup];
119}
120
121#endif
122