1f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
2f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger/*
3f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Copyright 2006 The Android Open Source Project
4f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger *
5f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
6f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * found in the LICENSE file.
7f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */
8f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
9f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
10f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#ifndef SkMemberInfo_DEFINED
11f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define SkMemberInfo_DEFINED
12f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
13f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#if defined SK_BUILD_CONDENSED
14f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    #define SK_USE_CONDENSED_INFO 0
15f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif
16f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
17f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkDisplayType.h"
18f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkScript.h"
19f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkString.h"
20f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkIntArray.h"
21f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
22f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerclass SkAnimateMaker;
23f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerclass SkDisplayable;
24f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerclass SkScriptEngine;
25f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
26f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger// temporary hacks until name change is more complete
27f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define SkFloat SkScalar
28f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define SkInt SkS32
29f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
30f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerstruct SkMemberInfo {
31f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    //!!! alternative:
32f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    // if fCount == 0, record is member property
33f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    // then fType can be type, so caller doesn't have to check
34f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#if SK_USE_CONDENSED_INFO == 0
35f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    const char* fName;  // may be NULL for anonymous functions
36f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    size_t fOffset; // if negative, is index into member pointer table (for properties and functions)
37f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SkDisplayTypes fType;
38f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    int fCount;         // for properties, actual type (count is always assumed to be 1)
39f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#else
40f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    unsigned char fName;
41f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    signed char fOffset;
42f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    unsigned char fType;
43f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    signed char fCount;
44f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif
45f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SkDisplayTypes arrayType() const {
46f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        SkASSERT(fType == SkType_Array);
47f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        return (SkDisplayTypes) fCount;  // hack, but worth it?
48f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    }
49f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    int functionIndex() const {
50f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        SkASSERT(fType == SkType_MemberFunction);
51f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        return (signed) fOffset > 0 ? -1 + (int) fOffset : -1 - (int) fOffset;
52f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    }
53f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool getArrayValue(const SkDisplayable* displayable, int index, SkOperand* value) const;
54f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    int getCount() const {
55f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        return fType == SkType_MemberProperty || fType == SkType_Array ||
56f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger            fType == SkType_MemberFunction ? 1 : fCount;
57f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    }
58f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    const SkMemberInfo* getInherited() const;
59f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    size_t getSize(const SkDisplayable* ) const;
60f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    void getString(const SkDisplayable* , SkString** string) const;
61f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SkDisplayTypes getType() const {
62f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        return fType == SkType_MemberProperty || fType == SkType_Array ||
63f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger            fType == SkType_MemberFunction ? (SkDisplayTypes) fCount : (SkDisplayTypes) fType;
64f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    }
65f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    void getValue(const SkDisplayable* , SkOperand values[], int count) const;
66f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool isEnum() const;
67f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    const char* mapEnums(const char* match, int* value) const;
68f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    void* memberData(const SkDisplayable* displayable) const {
69f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        SkASSERT(fType != SkType_MemberProperty &&  fType != SkType_MemberFunction);
70f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        return (void*) ((const char*) displayable + fOffset);
71f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    }
72f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    int propertyIndex() const {
73f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        SkASSERT(fType == SkType_MemberProperty);
74f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        return (signed) fOffset > 0 ? -1 + (int) fOffset : -1 - (int) fOffset;
75f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    }
76f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SkDisplayTypes propertyType() const {
77f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        SkASSERT(fType == SkType_MemberProperty || fType == SkType_Array);
78f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        return (SkDisplayTypes) fCount;  // hack, but worth it?
79f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    }
80f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    void setMemberData(SkDisplayable* displayable, const void* child, size_t size) const {
81f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        SkASSERT(fType != SkType_MemberProperty &&  fType != SkType_MemberFunction);
82f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        memcpy((char*) displayable + fOffset, child, size);
83f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    }
84f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    void setString(SkDisplayable* , SkString* ) const;
85f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    void setValue(SkDisplayable* , const SkOperand values[], int count) const;
86f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool setValue(SkAnimateMaker& , SkTDOperandArray* storage,
87f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        int storageOffset, int maxStorage, SkDisplayable* ,
88f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        SkDisplayTypes outType, const char value[], size_t len) const;
89f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool setValue(SkAnimateMaker& , SkTDOperandArray* storage,
90f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        int storageOffset, int maxStorage, SkDisplayable* ,
91f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        SkDisplayTypes outType, SkString& str) const;
92f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger//  void setValue(SkDisplayable* , const char value[], const char name[]) const;
93f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool writeValue(SkDisplayable* displayable, SkTDOperandArray* arrayStorage,
94f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        int storageOffset, int maxStorage, void* untypedStorage, SkDisplayTypes outType,
95f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        SkScriptValue& scriptValue) const;
96f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#if SK_USE_CONDENSED_INFO == 0
97f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    static const SkMemberInfo* Find(const SkMemberInfo [], int count, int* index);
98f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    static const SkMemberInfo* Find(const SkMemberInfo [], int count, const char** name);
99f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#else
100f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    static const SkMemberInfo* Find(SkDisplayTypes type, int* index);
101f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    static const SkMemberInfo* Find(SkDisplayTypes type, const char** name);
102f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif
103f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    static size_t GetSize(SkDisplayTypes type); // size of simple types only
104f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger//  static bool SetValue(void* value, const char* name, SkDisplayTypes , int count);
105f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger};
106f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
107f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define SK_MEMBER(_member, _type) \
108f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    { #_member, SK_OFFSETOF(BASE_CLASS, _member), SkType_##_type, \
109f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    sizeof(((BASE_CLASS*) 1)->_member) / sizeof(SkScalar) }
110f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
111f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define SK_MEMBER_ALIAS(_member, _alias, _type) \
112f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    { #_member, SK_OFFSETOF(BASE_CLASS, _alias), SkType_##_type, \
113f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    sizeof(((BASE_CLASS*) 1)->_alias) / sizeof(SkScalar) }
114f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
115f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define SK_MEMBER_ARRAY(_member, _type) \
116f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    { #_member, SK_OFFSETOF(BASE_CLASS, _member), SkType_Array, \
117f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    (int) SkType_##_type }
118f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
119f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define SK_MEMBER_INHERITED \
120f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    { (const char*) INHERITED::fInfo, 0, SkType_BaseClassInfo, INHERITED::fInfoCount }
121f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
122f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger// #define SK_MEMBER_KEY_TYPE(_member, _type)
123f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger//  {#_member, (size_t) -1, SkType_##_type, 0}
124f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
125f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define SK_FUNCTION(_member) \
126f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    k_##_member##Function
127f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
128f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define SK_PROPERTY(_member) \
129f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    k_##_member##Property
130f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
131f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define SK_MEMBER_DYNAMIC_FUNCTION(_member, _type) \
132f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    {#_member, (size_t) (+1 + SK_FUNCTION(_member)), SkType_MemberFunction, \
133f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    (int) SkType_##_type }
134f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
135f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define SK_MEMBER_DYNAMIC_PROPERTY(_member, _type) \
136f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    {#_member, (size_t) (1 + SK_PROPERTY(_member)), SkType_MemberProperty, \
137f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    (int) SkType_##_type }
138f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
139f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define SK_MEMBER_FUNCTION(_member, _type) \
140f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    {#_member, (size_t) (-1 - SK_FUNCTION(_member)), SkType_MemberFunction, \
141f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    (int) SkType_##_type }
142f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
143f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define SK_MEMBER_PROPERTY(_member, _type) \
144f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    {#_member, (size_t) (-1 - SK_PROPERTY(_member)), SkType_MemberProperty, \
145f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    (int) SkType_##_type }
146f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
147f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#if SK_USE_CONDENSED_INFO == 0
148f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
149f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define DECLARE_PRIVATE_MEMBER_INFO(_type) \
150f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerpublic: \
151f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    static const SkMemberInfo fInfo[]; \
152f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    static const int fInfoCount; \
153f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    virtual const SkMemberInfo* getMember(int index); \
154f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    virtual const SkMemberInfo* getMember(const char name[]); \
155f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    typedef Sk##_type BASE_CLASS
156f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
157f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define DECLARE_MEMBER_INFO(_type) \
158f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerpublic: \
159f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    static const SkMemberInfo fInfo[]; \
160f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    static const int fInfoCount; \
161f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    virtual const SkMemberInfo* getMember(int index); \
162f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    virtual const SkMemberInfo* getMember(const char name[]); \
163f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    virtual SkDisplayTypes getType() const { return SkType_##_type; } \
164f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    typedef Sk##_type BASE_CLASS
165f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
166f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define DECLARE_DRAW_MEMBER_INFO(_type) \
167f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerpublic: \
168f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    static const SkMemberInfo fInfo[]; \
169f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    static const int fInfoCount; \
170f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    virtual const SkMemberInfo* getMember(int index); \
171f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    virtual const SkMemberInfo* getMember(const char name[]); \
172f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    virtual SkDisplayTypes getType() const { return SkType_##_type; } \
173f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    typedef SkDraw##_type BASE_CLASS
174f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
175f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define DECLARE_DISPLAY_MEMBER_INFO(_type) \
176f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerpublic: \
177f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    static const SkMemberInfo fInfo[]; \
178f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    static const int fInfoCount; \
179f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    virtual const SkMemberInfo* getMember(int index); \
180f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    virtual const SkMemberInfo* getMember(const char name[]); \
181f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    virtual SkDisplayTypes getType() const { return SkType_##_type; } \
182f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    typedef SkDisplay##_type BASE_CLASS
183f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
184f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define DECLARE_EMPTY_MEMBER_INFO(_type) \
185f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerpublic: \
186f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    virtual SkDisplayTypes getType() const { return SkType_##_type; }
187f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
188f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define DECLARE_EXTRAS_MEMBER_INFO(_type) \
189f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerpublic: \
190f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    static const SkMemberInfo fInfo[]; \
191f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    static const int fInfoCount; \
192f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    virtual const SkMemberInfo* getMember(int index); \
193f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    virtual const SkMemberInfo* getMember(const char name[]); \
194f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SkDisplayTypes fType; \
195f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    virtual SkDisplayTypes getType() const { return fType; } \
196f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    typedef _type BASE_CLASS
197f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
198f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define DECLARE_NO_VIRTUALS_MEMBER_INFO(_type) \
199f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerpublic: \
200f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    static const SkMemberInfo fInfo[]; \
201f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    static const int fInfoCount; \
202f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    typedef Sk##_type BASE_CLASS
203f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
204f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define DEFINE_GET_MEMBER(_class) \
205f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    const SkMemberInfo* _class::getMember(int index) { \
206f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        const SkMemberInfo* result = SkMemberInfo::Find(fInfo, SK_ARRAY_COUNT(fInfo), &index); \
207f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        return result; \
208f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    } \
209f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    const SkMemberInfo* _class::getMember(const char name[]) { \
210f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        const SkMemberInfo* result = SkMemberInfo::Find(fInfo, SK_ARRAY_COUNT(fInfo), &name); \
211f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        return result; \
212f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    } \
213f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    const int _class::fInfoCount = SK_ARRAY_COUNT(fInfo)
214f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
215f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define DEFINE_NO_VIRTUALS_GET_MEMBER(_class) \
216f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    const int _class::fInfoCount = SK_ARRAY_COUNT(fInfo)
217f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
218f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#else
219f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
220f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define DECLARE_PRIVATE_MEMBER_INFO(_type) \
221f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerpublic: \
222f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    typedef Sk##_type BASE_CLASS
223f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
224f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define DECLARE_MEMBER_INFO(_type) \
225f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerpublic: \
226f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    virtual const SkMemberInfo* getMember(int index) { \
227f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        return SkDisplayType::GetMember(NULL, SkType_##_type, &index); } \
228f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    virtual const SkMemberInfo* getMember(const char name[]) { \
229f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        return SkDisplayType::GetMember(NULL, SkType_##_type, &name); } \
230f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    virtual SkDisplayTypes getType() const { return SkType_##_type; } \
231f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    typedef Sk##_type BASE_CLASS
232f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
233f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define DECLARE_DRAW_MEMBER_INFO(_type) \
234f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerpublic: \
235f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    virtual const SkMemberInfo* getMember(int index) { \
236f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        return SkDisplayType::GetMember(NULL, SkType_##_type, &index); } \
237f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    virtual const SkMemberInfo* getMember(const char name[]) { \
238f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        return SkDisplayType::GetMember(NULL, SkType_##_type, &name); } \
239f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    virtual SkDisplayTypes getType() const { return SkType_##_type; } \
240f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    typedef SkDraw##_type BASE_CLASS
241f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
242f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define DECLARE_DISPLAY_MEMBER_INFO(_type) \
243f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerpublic: \
244f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    virtual const SkMemberInfo* getMember(int index) { \
245f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        return SkDisplayType::GetMember(NULL, SkType_##_type, &index); } \
246f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    virtual const SkMemberInfo* getMember(const char name[]) { \
247f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        return SkDisplayType::GetMember(NULL, SkType_##_type, &name); } \
248f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    virtual SkDisplayTypes getType() const { return SkType_##_type; } \
249f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    typedef SkDisplay##_type BASE_CLASS
250f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
251f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define DECLARE_EXTRAS_MEMBER_INFO(_type) \
252f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerpublic: \
253f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    virtual const SkMemberInfo* getMember(int index) { \
254f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        return SkDisplayType::GetMember(NULL, SkType_##_type, &index); } \
255f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    virtual const SkMemberInfo* getMember(const char name[]) { \
256f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        return SkDisplayType::GetMember(NULL, fType, &name); } \
257f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SkDisplayTypes fType; \
258f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    virtual SkDisplayTypes getType() const { return fType; } \
259f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    typedef _type BASE_CLASS
260f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
261f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define DECLARE_NO_VIRTUALS_MEMBER_INFO(_type) \
262f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerpublic: \
263f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    typedef Sk##_type BASE_CLASS
264f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
265f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define DEFINE_GET_MEMBER(_class)
266f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define DEFINE_NO_VIRTUALS_GET_MEMBER(_class)
267f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
268f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif
269f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
270f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif // SkMemberInfo_DEFINED
271f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
272