1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 28a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project 48a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 78a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */ 88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 9ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SkMetaData_DEFINED 118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkMetaData_DEFINED 128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkScalar.h" 148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 15e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.comclass SkRefCnt; 16e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com 17f31663403b1b96c2a1c6717acab5093b0117f187reed@google.comclass SK_API SkMetaData { 188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic: 19e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com /** 20e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com * Used to manage the life-cycle of a ptr in the metadata. This is option 21e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com * in setPtr, and is only invoked when either copying one metadata to 22e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com * another, or when the metadata is destroyed. 23e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com * 24e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com * setPtr(name, ptr, proc) { 25e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com * fPtr = proc(ptr, true); 26e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com * } 27e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com * 28e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com * copy: A = B { 29e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com * A.fPtr = B.fProc(B.fPtr, true); 30e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com * } 31e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com * 32e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com * ~SkMetaData { 33e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com * fProc(fPtr, false); 34e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com * } 35e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com */ 36e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com typedef void* (*PtrProc)(void* ptr, bool doRef); 37e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com 38e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com /** 39e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com * Implements PtrProc for SkRefCnt pointers 40e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com */ 41e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com static void* RefCntProc(void* ptr, bool doRef); 42e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com 438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkMetaData(); 448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkMetaData(const SkMetaData& src); 458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com ~SkMetaData(); 468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkMetaData& operator=(const SkMetaData& src); 488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 49e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com void reset(); 508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 51e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com bool findS32(const char name[], int32_t* value = NULL) const; 52e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com bool findScalar(const char name[], SkScalar* value = NULL) const; 53e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com const SkScalar* findScalars(const char name[], int* count, 54e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com SkScalar values[] = NULL) const; 558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const char* findString(const char name[]) const; 56e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com bool findPtr(const char name[], void** value = NULL, PtrProc* = NULL) const; 57e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com bool findBool(const char name[], bool* value = NULL) const; 58f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com const void* findData(const char name[], size_t* byteCount = NULL) const; 598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 60e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com bool hasS32(const char name[], int32_t value) const { 618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int32_t v; 628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return this->findS32(name, &v) && v == value; 638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 64e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com bool hasScalar(const char name[], SkScalar value) const { 65e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com SkScalar v; 668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return this->findScalar(name, &v) && v == value; 678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 68e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com bool hasString(const char name[], const char value[]) const { 698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const char* v = this->findString(name); 70f1ec465f87ec991cf095da2d1c02b776183abbd0reed@google.com return (v == NULL && value == NULL) || 71f1ec465f87ec991cf095da2d1c02b776183abbd0reed@google.com (v != NULL && value != NULL && !strcmp(v, value)); 728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 73e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com bool hasPtr(const char name[], void* value) const { 74e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com void* v; 758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return this->findPtr(name, &v) && v == value; 768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 77e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com bool hasBool(const char name[], bool value) const { 788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com bool v; 798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return this->findBool(name, &v) && v == value; 808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 81f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com bool hasData(const char name[], const void* data, size_t byteCount) const { 82f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com size_t len; 83f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com const void* ptr = this->findData(name, &len); 8449f085dddff10473b6ebf832a974288300224e60bsalomon return ptr && len == byteCount && !memcmp(ptr, data, len); 85f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com } 868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 87e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com void setS32(const char name[], int32_t value); 88e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com void setScalar(const char name[], SkScalar value); 898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkScalar* setScalars(const char name[], int count, const SkScalar values[] = NULL); 90e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com void setString(const char name[], const char value[]); 91e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com void setPtr(const char name[], void* value, PtrProc proc = NULL); 92e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com void setBool(const char name[], bool value); 93f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com // the data is copied from the input pointer. 94e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com void setData(const char name[], const void* data, size_t byteCount); 95e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com 96e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com bool removeS32(const char name[]); 97e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com bool removeScalar(const char name[]); 98e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com bool removeString(const char name[]); 99e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com bool removePtr(const char name[]); 100e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com bool removeBool(const char name[]); 101e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com bool removeData(const char name[]); 102e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com 103e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com // helpers for SkRefCnt 104e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com bool findRefCnt(const char name[], SkRefCnt** ptr = NULL) { 105e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com return this->findPtr(name, reinterpret_cast<void**>(ptr)); 106e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com } 107e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com bool hasRefCnt(const char name[], SkRefCnt* ptr) { 108e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com return this->hasPtr(name, ptr); 109e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com } 110e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com void setRefCnt(const char name[], SkRefCnt* ptr) { 111e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com this->setPtr(name, ptr, RefCntProc); 112e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com } 113e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com bool removeRefCnt(const char name[]) { 114e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com return this->removePtr(name); 115e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com } 1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com enum Type { 1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com kS32_Type, 1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com kScalar_Type, 1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com kString_Type, 1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com kPtr_Type, 1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com kBool_Type, 123f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com kData_Type, 1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com kTypeCount 1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com }; 1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com struct Rec; 1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com class Iter; 1308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com friend class Iter; 1318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com class Iter { 1338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com public: 1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com Iter() : fRec(NULL) {} 1358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com Iter(const SkMetaData&); 1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com /** Reset the iterator, so that calling next() will return the first 1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com data element. This is done implicitly in the constructor. 1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */ 140e733071abeb9cce9f524f5a85851bc7fbb8d867breed@google.com void reset(const SkMetaData&); 1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com /** Each time next is called, it returns the name of the next data element, 1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com or null when there are no more elements. If non-null is returned, then the 1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com element's type is returned (if not null), and the number of data values 1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com is returned in count (if not null). 1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */ 1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const char* next(Type*, int* count); 1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com private: 1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com Rec* fRec; 1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com }; 1528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic: 1548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com struct Rec { 1558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com Rec* fNext; 1568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com uint16_t fDataCount; // number of elements 1578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com uint8_t fDataLen; // sizeof a single element 1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com uint8_t fType; 1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const void* data() const { return (this + 1); } 1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void* data() { return (this + 1); } 1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const char* name() const { return (const char*)this->data() + fDataLen * fDataCount; } 1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com char* name() { return (char*)this->data() + fDataLen * fDataCount; } 1648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com static Rec* Alloc(size_t); 1668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com static void Free(Rec*); 1678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com }; 1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com Rec* fRec; 1698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const Rec* find(const char name[], Type) const; 1718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void* set(const char name[], const void* data, size_t len, Type, int count); 1728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com bool remove(const char name[], Type); 1738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 1748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 176