00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef SkMetaData_DEFINED
00018 #define SkMetaData_DEFINED
00019
00020 #include "SkScalar.h"
00021
00022 class SkMetaData {
00023 public:
00024 SkMetaData();
00025 SkMetaData(const SkMetaData& src);
00026 ~SkMetaData();
00027
00028 SkMetaData& operator=(const SkMetaData& src);
00029
00030 void reset();
00031
00032 bool findS32(const char name[], int32_t* value = NULL) const;
00033 bool findScalar(const char name[], SkScalar* value = NULL) const;
00034 const SkScalar* findScalars(const char name[], int* count, SkScalar values[] = NULL) const;
00035 const char* findString(const char name[]) const;
00036 bool findPtr(const char name[], void** value = NULL) const;
00037 bool findBool(const char name[], bool* value = NULL) const;
00038
00039 bool hasS32(const char name[], int32_t value) const
00040 {
00041 int32_t v;
00042 return this->findS32(name, &v) && v == value;
00043 }
00044 bool hasScalar(const char name[], SkScalar value) const
00045 {
00046 SkScalar v;
00047 return this->findScalar(name, &v) && v == value;
00048 }
00049 bool hasString(const char name[], const char value[]) const
00050 {
00051 const char* v = this->findString(name);
00052 return v == NULL && value == NULL ||
00053 v != NULL && value != NULL && !strcmp(v, value);
00054 }
00055 bool hasPtr(const char name[], void* value) const
00056 {
00057 void* v;
00058 return this->findPtr(name, &v) && v == value;
00059 }
00060 bool hasBool(const char name[], bool value) const
00061 {
00062 bool v;
00063 return this->findBool(name, &v) && v == value;
00064 }
00065
00066 void setS32(const char name[], int32_t value);
00067 void setScalar(const char name[], SkScalar value);
00068 SkScalar* setScalars(const char name[], int count, const SkScalar values[] = NULL);
00069 void setString(const char name[], const char value[]);
00070 void setPtr(const char name[], void* value);
00071 void setBool(const char name[], bool value);
00072
00073 bool removeS32(const char name[]);
00074 bool removeScalar(const char name[]);
00075 bool removeString(const char name[]);
00076 bool removePtr(const char name[]);
00077 bool removeBool(const char name[]);
00078
00079 SkDEBUGCODE(static void UnitTest();)
00080
00081 enum Type {
00082 kS32_Type,
00083 kScalar_Type,
00084 kString_Type,
00085 kPtr_Type,
00086 kBool_Type,
00087
00088 kTypeCount
00089 };
00090
00091 struct Rec;
00092 class Iter;
00093 friend class Iter;
00094
00095 class Iter {
00096 public:
00097 Iter() : fRec(NULL) {}
00098 Iter(const SkMetaData&);
00099
00103 void reset(const SkMetaData&);
00104
00110 const char* next(Type*, int* count);
00111
00112 private:
00113 Rec* fRec;
00114 };
00115
00116 public:
00117 struct Rec {
00118 Rec* fNext;
00119 uint16_t fDataCount;
00120 uint8_t fDataLen;
00121 #ifdef SK_DEBUG
00122 Type fType;
00123 #else
00124 uint8_t fType;
00125 #endif
00126
00127 #ifdef SK_DEBUG
00128 const char* fName;
00129 union {
00130 int32_t fS32;
00131 SkScalar fScalar;
00132 const char* fString;
00133 void* fPtr;
00134 bool fBool;
00135 } fData;
00136 #endif
00137
00138 const void* data() const { return (this + 1); }
00139 void* data() { return (this + 1); }
00140 const char* name() const { return (const char*)this->data() + fDataLen * fDataCount; }
00141 char* name() { return (char*)this->data() + fDataLen * fDataCount; }
00142
00143 static Rec* Alloc(size_t);
00144 static void Free(Rec*);
00145 };
00146 Rec* fRec;
00147
00148 const Rec* find(const char name[], Type) const;
00149 void* set(const char name[], const void* data, size_t len, Type, int count);
00150 bool remove(const char name[], Type);
00151 };
00152
00153 #endif
00154