1 /* 2 * Copyright 2006 The Android Open Source Project 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 #ifndef SkMetaData_DEFINED 8 #define SkMetaData_DEFINED 9 10 #include "include/core/SkScalar.h" 11 12 /** A map from c-string keys to arrays of POD (int32_t, kScalar, void*, or bool) 13 values. 14 */ 15 class SkMetaData { 16 public: SkMetaData()17 SkMetaData() {} ~SkMetaData()18 ~SkMetaData() { if (fRec) { this->reset(); } } 19 void reset(); 20 21 bool findS32(const char name[], int32_t* value = nullptr) const; 22 bool findScalar(const char name[], SkScalar* value = nullptr) const; 23 const SkScalar* findScalars(const char name[], int* count, 24 SkScalar values[] = nullptr) const; 25 bool findPtr(const char name[], void** value = nullptr) const; 26 bool findBool(const char name[], bool* value = nullptr) const; 27 hasS32(const char name[],int32_t value)28 bool hasS32(const char name[], int32_t value) const { 29 int32_t v; 30 return this->findS32(name, &v) && v == value; 31 } hasScalar(const char name[],SkScalar value)32 bool hasScalar(const char name[], SkScalar value) const { 33 SkScalar v; 34 return this->findScalar(name, &v) && v == value; 35 } hasPtr(const char name[],void * value)36 bool hasPtr(const char name[], void* value) const { 37 void* v; 38 return this->findPtr(name, &v) && v == value; 39 } hasBool(const char name[],bool value)40 bool hasBool(const char name[], bool value) const { 41 bool v; 42 return this->findBool(name, &v) && v == value; 43 } 44 45 void setS32(const char name[], int32_t value); 46 void setScalar(const char name[], SkScalar value); 47 SkScalar* setScalars(const char name[], int count, const SkScalar values[] = nullptr); 48 void setPtr(const char name[], void* value); 49 void setBool(const char name[], bool value); 50 51 bool removeS32(const char name[]); 52 bool removeScalar(const char name[]); 53 bool removePtr(const char name[]); 54 bool removeBool(const char name[]); 55 56 enum Type { 57 kS32_Type, 58 kScalar_Type, 59 kPtr_Type, 60 kBool_Type, 61 62 kTypeCount 63 }; 64 65 struct Rec; 66 class Iter; 67 friend class Iter; 68 69 class Iter { 70 public: Iter()71 Iter() : fRec(nullptr) {} 72 Iter(const SkMetaData&); 73 74 /** Reset the iterator, so that calling next() will return the first 75 data element. This is done implicitly in the constructor. 76 */ 77 void reset(const SkMetaData&); 78 79 /** Each time next is called, it returns the name of the next data element, 80 or null when there are no more elements. If non-null is returned, then the 81 element's type is returned (if not null), and the number of data values 82 is returned in count (if not null). 83 */ 84 const char* next(Type*, int* count); 85 86 private: 87 Rec* fRec; 88 }; 89 90 public: 91 struct Rec { 92 Rec* fNext; 93 uint16_t fDataCount; // number of elements 94 uint8_t fDataLen; // sizeof a single element 95 uint8_t fType; 96 dataRec97 const void* data() const { return (this + 1); } dataRec98 void* data() { return (this + 1); } nameRec99 const char* name() const { return (const char*)this->data() + fDataLen * fDataCount; } nameRec100 char* name() { return (char*)this->data() + fDataLen * fDataCount; } 101 102 static Rec* Alloc(size_t); 103 static void Free(Rec*); 104 }; 105 Rec* fRec = nullptr; 106 107 const Rec* find(const char name[], Type) const; 108 void* set(const char name[], const void* data, size_t len, Type, int count); 109 bool remove(const char name[], Type); 110 111 SkMetaData(const SkMetaData&) = delete; 112 SkMetaData& operator=(const SkMetaData&) = delete; 113 114 private: 115 struct FindResult { 116 SkMetaData::Rec* rec; 117 SkMetaData::Rec* prev; 118 }; 119 FindResult findWithPrev(const char name[], Type type) const; 120 void remove(FindResult); 121 }; 122 123 #endif 124