diff options
Diffstat (limited to 'skia/animator/SkMemberInfo.h')
-rw-r--r-- | skia/animator/SkMemberInfo.h | 283 |
1 files changed, 283 insertions, 0 deletions
diff --git a/skia/animator/SkMemberInfo.h b/skia/animator/SkMemberInfo.h new file mode 100644 index 0000000..00dd7b6 --- /dev/null +++ b/skia/animator/SkMemberInfo.h @@ -0,0 +1,283 @@ +/* libs/graphics/animator/SkMemberInfo.h +** +** Copyright 2006, Google Inc. +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + +#ifndef SkMemberInfo_DEFINED +#define SkMemberInfo_DEFINED + +#if defined SK_BUILD_CONDENSED + #define SK_USE_CONDENSED_INFO 0 +#elif defined SK_BUILD_FOR_BREW + #define SK_USE_CONDENSED_INFO 1 /* required by BREW to handle its lack of writable globals */ +#else + #define SK_USE_CONDENSED_INFO 0 /* optional, but usually 1 unless Cary is testing something */ +#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 + |