Home | History | Annotate | Download | only in animator
      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 
     22 static 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 
     37 static 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 
     53 const SkMemberInfo* SkDisplayType::GetMembers(SkAnimateMaker* , SkDisplayTypes type, int* infoCountPtr) {
     54     int lookup = _searchByType(type);
     55     if (lookup < 0)
     56         return nullptr;
     57     if (infoCountPtr)
     58         *infoCountPtr = gInfoCounts[lookup];
     59     return gInfoTables[lookup];
     60 }
     61 
     62 // !!! replace with inline
     63 const 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 
     69 static 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 != nullptr)
     76             return result;
     77         if (--count == 0)
     78             return nullptr;
     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 nullptr;
     87     return &info[index];
     88 }
     89 
     90 const 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 != nullptr)
     97             return result;
     98         if (--count == 0)
     99             return nullptr;
    100         info++;
    101     }
    102     SkASSERT(info->fType != SkType_BaseClassInfo);
    103     if (*index >= count) {
    104         *index -= count;
    105         return nullptr;
    106     }
    107     return &info[index];
    108 }
    109 
    110 const SkMemberInfo* SkMemberInfo::Find(SkDisplayTypes type, const char** matchPtr) {
    111     int lookup = _searchByType(type);
    112     SkASSERT(lookup >= 0);
    113     return _lookup(lookup, matchPtr);
    114 }
    115 
    116 const SkMemberInfo* SkMemberInfo::getInherited() const {
    117     int baseTypeLookup = fOffset;
    118     return gInfoTables[baseTypeLookup];
    119 }
    120 
    121 #endif
    122