/* * 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" #include 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 nullptr 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); }; #ifndef SK_OFFSETOF // This is offsetof for types which are not standard layout. #define SK_OFFSETOF(type, field) (size_t)((char*)&(((type*)1024)->field) - (char*)1024) #endif #define SK_MEMBER(_member, _type) \ { #_member, SK_OFFSETOF(BASE_CLASS, _member), SkType_##_type, \ sizeof(std::declval()._member) / sizeof(SkScalar) } #define SK_MEMBER_ALIAS(_member, _alias, _type) \ { #_member, SK_OFFSETOF(BASE_CLASS, _alias), SkType_##_type, \ sizeof(std::declval()._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; \ const SkMemberInfo* getMember(int index) override; \ const SkMemberInfo* getMember(const char name[]) override; \ typedef Sk##_type BASE_CLASS #define DECLARE_MEMBER_INFO(_type) \ public: \ static const SkMemberInfo fInfo[]; \ static const int fInfoCount; \ const SkMemberInfo* getMember(int index) override; \ const SkMemberInfo* getMember(const char name[]) override; \ SkDisplayTypes getType() const override { return SkType_##_type; } \ typedef Sk##_type BASE_CLASS #define DECLARE_DRAW_MEMBER_INFO(_type) \ public: \ static const SkMemberInfo fInfo[]; \ static const int fInfoCount; \ const SkMemberInfo* getMember(int index) override; \ const SkMemberInfo* getMember(const char name[]) override; \ SkDisplayTypes getType() const override { return SkType_##_type; } \ typedef SkDraw##_type BASE_CLASS #define DECLARE_DISPLAY_MEMBER_INFO(_type) \ public: \ static const SkMemberInfo fInfo[]; \ static const int fInfoCount; \ const SkMemberInfo* getMember(int index) override; \ const SkMemberInfo* getMember(const char name[]) override; \ SkDisplayTypes getType() const override { return SkType_##_type; } \ typedef SkDisplay##_type BASE_CLASS #define DECLARE_EMPTY_MEMBER_INFO(_type) \ public: \ SkDisplayTypes getType() const override { return SkType_##_type; } #define DECLARE_EXTRAS_MEMBER_INFO(_type) \ public: \ static const SkMemberInfo fInfo[]; \ static const int fInfoCount; \ const SkMemberInfo* getMember(int index) override; \ const SkMemberInfo* getMember(const char name[]) override; \ SkDisplayTypes fType; \ SkDisplayTypes getType() const override { 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(nullptr, SkType_##_type, &index); } \ virtual const SkMemberInfo* getMember(const char name[]) { \ return SkDisplayType::GetMember(nullptr, 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(nullptr, SkType_##_type, &index); } \ virtual const SkMemberInfo* getMember(const char name[]) { \ return SkDisplayType::GetMember(nullptr, 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(nullptr, SkType_##_type, &index); } \ virtual const SkMemberInfo* getMember(const char name[]) { \ return SkDisplayType::GetMember(nullptr, 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(nullptr, SkType_##_type, &index); } \ virtual const SkMemberInfo* getMember(const char name[]) { \ return SkDisplayType::GetMember(nullptr, 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