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