| |
| /* |
| * 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. |
| */ |
| |
| |
| #ifndef SkMemberInfo_DEFINED |
| #define SkMemberInfo_DEFINED |
| |
| #if defined SK_BUILD_CONDENSED |
| #define SK_USE_CONDENSED_INFO 0 |
| #endif |
| |
| #include "SkDisplayType.h" |
| #include "SkScript.h" |
| #include "SkString.h" |
| #include "SkIntArray.h" |
| |
| class SkAnimateMaker; |
| class SkDisplayable; |
| class SkScriptEngine; |
| |
| // temporary hacks until name change is more complete |
| #define SkFloat SkScalar |
| #define SkInt SkS32 |
| |
| struct SkMemberInfo { |
| //!!! alternative: |
| // if fCount == 0, record is member property |
| // then fType can be type, so caller doesn't have to check |
| #if SK_USE_CONDENSED_INFO == 0 |
| const char* fName; // may be NULL for anonymous functions |
| size_t fOffset; // if negative, is index into member pointer table (for properties and functions) |
| SkDisplayTypes fType; |
| int fCount; // for properties, actual type (count is always assumed to be 1) |
| #else |
| unsigned char fName; |
| signed char fOffset; |
| unsigned char fType; |
| signed char fCount; |
| #endif |
| SkDisplayTypes arrayType() const { |
| SkASSERT(fType == SkType_Array); |
| return (SkDisplayTypes) fCount; // hack, but worth it? |
| } |
| int functionIndex() const { |
| SkASSERT(fType == SkType_MemberFunction); |
| return (signed) fOffset > 0 ? -1 + (int) fOffset : -1 - (int) fOffset; |
| } |
| bool getArrayValue(const SkDisplayable* displayable, int index, SkOperand* value) const; |
| int getCount() const { |
| return fType == SkType_MemberProperty || fType == SkType_Array || |
| fType == SkType_MemberFunction ? 1 : fCount; |
| } |
| const SkMemberInfo* getInherited() const; |
| size_t getSize(const SkDisplayable* ) const; |
| void getString(const SkDisplayable* , SkString** string) const; |
| SkDisplayTypes getType() const { |
| return fType == SkType_MemberProperty || fType == SkType_Array || |
| fType == SkType_MemberFunction ? (SkDisplayTypes) fCount : (SkDisplayTypes) fType; |
| } |
| void getValue(const SkDisplayable* , SkOperand values[], int count) const; |
| bool isEnum() const; |
| const char* mapEnums(const char* match, int* value) const; |
| void* memberData(const SkDisplayable* displayable) const { |
| SkASSERT(fType != SkType_MemberProperty && fType != SkType_MemberFunction); |
| return (void*) ((const char*) displayable + fOffset); |
| } |
| int propertyIndex() const { |
| SkASSERT(fType == SkType_MemberProperty); |
| return (signed) fOffset > 0 ? -1 + (int) fOffset : -1 - (int) fOffset; |
| } |
| SkDisplayTypes propertyType() const { |
| SkASSERT(fType == SkType_MemberProperty || fType == SkType_Array); |
| return (SkDisplayTypes) fCount; // hack, but worth it? |
| } |
| void setMemberData(SkDisplayable* displayable, const void* child, size_t size) const { |
| SkASSERT(fType != SkType_MemberProperty && fType != SkType_MemberFunction); |
| memcpy((char*) displayable + fOffset, child, size); |
| } |
| void setString(SkDisplayable* , SkString* ) const; |
| void setValue(SkDisplayable* , const SkOperand values[], int count) const; |
| bool setValue(SkAnimateMaker& , SkTDOperandArray* storage, |
| int storageOffset, int maxStorage, SkDisplayable* , |
| SkDisplayTypes outType, const char value[], size_t len) const; |
| bool setValue(SkAnimateMaker& , SkTDOperandArray* storage, |
| int storageOffset, int maxStorage, SkDisplayable* , |
| SkDisplayTypes outType, SkString& str) const; |
| // void setValue(SkDisplayable* , const char value[], const char name[]) const; |
| bool writeValue(SkDisplayable* displayable, SkTDOperandArray* arrayStorage, |
| int storageOffset, int maxStorage, void* untypedStorage, SkDisplayTypes outType, |
| SkScriptValue& scriptValue) const; |
| #if SK_USE_CONDENSED_INFO == 0 |
| static const SkMemberInfo* Find(const SkMemberInfo [], int count, int* index); |
| static const SkMemberInfo* Find(const SkMemberInfo [], int count, const char** name); |
| #else |
| static const SkMemberInfo* Find(SkDisplayTypes type, int* index); |
| static const SkMemberInfo* Find(SkDisplayTypes type, const char** name); |
| #endif |
| static size_t GetSize(SkDisplayTypes type); // size of simple types only |
| // static bool SetValue(void* value, const char* name, SkDisplayTypes , int count); |
| }; |
| |
| #define SK_MEMBER(_member, _type) \ |
| { #_member, SK_OFFSETOF(BASE_CLASS, _member), SkType_##_type, \ |
| sizeof(((BASE_CLASS*) 1)->_member) / sizeof(SkScalar) } |
| |
| #define SK_MEMBER_ALIAS(_member, _alias, _type) \ |
| { #_member, SK_OFFSETOF(BASE_CLASS, _alias), SkType_##_type, \ |
| sizeof(((BASE_CLASS*) 1)->_alias) / sizeof(SkScalar) } |
| |
| #define SK_MEMBER_ARRAY(_member, _type) \ |
| { #_member, SK_OFFSETOF(BASE_CLASS, _member), SkType_Array, \ |
| (int) SkType_##_type } |
| |
| #define SK_MEMBER_INHERITED \ |
| { (const char*) INHERITED::fInfo, 0, SkType_BaseClassInfo, INHERITED::fInfoCount } |
| |
| // #define SK_MEMBER_KEY_TYPE(_member, _type) |
| // {#_member, (size_t) -1, SkType_##_type, 0} |
| |
| #define SK_FUNCTION(_member) \ |
| k_##_member##Function |
| |
| #define SK_PROPERTY(_member) \ |
| k_##_member##Property |
| |
| #define SK_MEMBER_DYNAMIC_FUNCTION(_member, _type) \ |
| {#_member, (size_t) (+1 + SK_FUNCTION(_member)), SkType_MemberFunction, \ |
| (int) SkType_##_type } |
| |
| #define SK_MEMBER_DYNAMIC_PROPERTY(_member, _type) \ |
| {#_member, (size_t) (1 + SK_PROPERTY(_member)), SkType_MemberProperty, \ |
| (int) SkType_##_type } |
| |
| #define SK_MEMBER_FUNCTION(_member, _type) \ |
| {#_member, (size_t) (-1 - SK_FUNCTION(_member)), SkType_MemberFunction, \ |
| (int) SkType_##_type } |
| |
| #define SK_MEMBER_PROPERTY(_member, _type) \ |
| {#_member, (size_t) (-1 - SK_PROPERTY(_member)), SkType_MemberProperty, \ |
| (int) SkType_##_type } |
| |
| #if SK_USE_CONDENSED_INFO == 0 |
| |
| #define DECLARE_PRIVATE_MEMBER_INFO(_type) \ |
| public: \ |
| static const SkMemberInfo fInfo[]; \ |
| static const int fInfoCount; \ |
| virtual const SkMemberInfo* getMember(int index); \ |
| virtual const SkMemberInfo* getMember(const char name[]); \ |
| typedef Sk##_type BASE_CLASS |
| |
| #define DECLARE_MEMBER_INFO(_type) \ |
| public: \ |
| static const SkMemberInfo fInfo[]; \ |
| static const int fInfoCount; \ |
| virtual const SkMemberInfo* getMember(int index); \ |
| virtual const SkMemberInfo* getMember(const char name[]); \ |
| virtual SkDisplayTypes getType() const { return SkType_##_type; } \ |
| typedef Sk##_type BASE_CLASS |
| |
| #define DECLARE_DRAW_MEMBER_INFO(_type) \ |
| public: \ |
| static const SkMemberInfo fInfo[]; \ |
| static const int fInfoCount; \ |
| virtual const SkMemberInfo* getMember(int index); \ |
| virtual const SkMemberInfo* getMember(const char name[]); \ |
| virtual SkDisplayTypes getType() const { return SkType_##_type; } \ |
| typedef SkDraw##_type BASE_CLASS |
| |
| #define DECLARE_DISPLAY_MEMBER_INFO(_type) \ |
| public: \ |
| static const SkMemberInfo fInfo[]; \ |
| static const int fInfoCount; \ |
| virtual const SkMemberInfo* getMember(int index); \ |
| virtual const SkMemberInfo* getMember(const char name[]); \ |
| virtual SkDisplayTypes getType() const { return SkType_##_type; } \ |
| typedef SkDisplay##_type BASE_CLASS |
| |
| #define DECLARE_EMPTY_MEMBER_INFO(_type) \ |
| public: \ |
| virtual SkDisplayTypes getType() const { return SkType_##_type; } |
| |
| #define DECLARE_EXTRAS_MEMBER_INFO(_type) \ |
| public: \ |
| static const SkMemberInfo fInfo[]; \ |
| static const int fInfoCount; \ |
| virtual const SkMemberInfo* getMember(int index); \ |
| virtual const SkMemberInfo* getMember(const char name[]); \ |
| SkDisplayTypes fType; \ |
| virtual SkDisplayTypes getType() const { return fType; } \ |
| typedef _type BASE_CLASS |
| |
| #define DECLARE_NO_VIRTUALS_MEMBER_INFO(_type) \ |
| public: \ |
| static const SkMemberInfo fInfo[]; \ |
| static const int fInfoCount; \ |
| typedef Sk##_type BASE_CLASS |
| |
| #define DEFINE_GET_MEMBER(_class) \ |
| const SkMemberInfo* _class::getMember(int index) { \ |
| const SkMemberInfo* result = SkMemberInfo::Find(fInfo, SK_ARRAY_COUNT(fInfo), &index); \ |
| return result; \ |
| } \ |
| const SkMemberInfo* _class::getMember(const char name[]) { \ |
| const SkMemberInfo* result = SkMemberInfo::Find(fInfo, SK_ARRAY_COUNT(fInfo), &name); \ |
| return result; \ |
| } \ |
| const int _class::fInfoCount = SK_ARRAY_COUNT(fInfo) |
| |
| #define DEFINE_NO_VIRTUALS_GET_MEMBER(_class) \ |
| const int _class::fInfoCount = SK_ARRAY_COUNT(fInfo) |
| |
| #else |
| |
| #define DECLARE_PRIVATE_MEMBER_INFO(_type) \ |
| public: \ |
| typedef Sk##_type BASE_CLASS |
| |
| #define DECLARE_MEMBER_INFO(_type) \ |
| public: \ |
| virtual const SkMemberInfo* getMember(int index) { \ |
| return SkDisplayType::GetMember(NULL, SkType_##_type, &index); } \ |
| virtual const SkMemberInfo* getMember(const char name[]) { \ |
| return SkDisplayType::GetMember(NULL, SkType_##_type, &name); } \ |
| virtual SkDisplayTypes getType() const { return SkType_##_type; } \ |
| typedef Sk##_type BASE_CLASS |
| |
| #define DECLARE_DRAW_MEMBER_INFO(_type) \ |
| public: \ |
| virtual const SkMemberInfo* getMember(int index) { \ |
| return SkDisplayType::GetMember(NULL, SkType_##_type, &index); } \ |
| virtual const SkMemberInfo* getMember(const char name[]) { \ |
| return SkDisplayType::GetMember(NULL, SkType_##_type, &name); } \ |
| virtual SkDisplayTypes getType() const { return SkType_##_type; } \ |
| typedef SkDraw##_type BASE_CLASS |
| |
| #define DECLARE_DISPLAY_MEMBER_INFO(_type) \ |
| public: \ |
| virtual const SkMemberInfo* getMember(int index) { \ |
| return SkDisplayType::GetMember(NULL, SkType_##_type, &index); } \ |
| virtual const SkMemberInfo* getMember(const char name[]) { \ |
| return SkDisplayType::GetMember(NULL, SkType_##_type, &name); } \ |
| virtual SkDisplayTypes getType() const { return SkType_##_type; } \ |
| typedef SkDisplay##_type BASE_CLASS |
| |
| #define DECLARE_EXTRAS_MEMBER_INFO(_type) \ |
| public: \ |
| virtual const SkMemberInfo* getMember(int index) { \ |
| return SkDisplayType::GetMember(NULL, SkType_##_type, &index); } \ |
| virtual const SkMemberInfo* getMember(const char name[]) { \ |
| return SkDisplayType::GetMember(NULL, fType, &name); } \ |
| SkDisplayTypes fType; \ |
| virtual SkDisplayTypes getType() const { return fType; } \ |
| typedef _type BASE_CLASS |
| |
| #define DECLARE_NO_VIRTUALS_MEMBER_INFO(_type) \ |
| public: \ |
| typedef Sk##_type BASE_CLASS |
| |
| #define DEFINE_GET_MEMBER(_class) |
| #define DEFINE_NO_VIRTUALS_GET_MEMBER(_class) |
| |
| #endif |
| |
| #endif // SkMemberInfo_DEFINED |
| |