1685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com 2685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com/* 3685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * Copyright 2006 The Android Open Source Project 4685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * 5685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * found in the LICENSE file. 7685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com */ 8685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com 9bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 10bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkMetaData.h" 11895443dada55325555a701d61f150843a74101b8reed@google.com#include "SkRefCnt.h" 12895443dada55325555a701d61f150843a74101b8reed@google.com 13895443dada55325555a701d61f150843a74101b8reed@google.comstruct PtrPair { 14895443dada55325555a701d61f150843a74101b8reed@google.com void* fPtr; 15895443dada55325555a701d61f150843a74101b8reed@google.com SkMetaData::PtrProc fProc; 16895443dada55325555a701d61f150843a74101b8reed@google.com}; 17895443dada55325555a701d61f150843a74101b8reed@google.com 18895443dada55325555a701d61f150843a74101b8reed@google.comvoid* SkMetaData::RefCntProc(void* ptr, bool doRef) { 19895443dada55325555a701d61f150843a74101b8reed@google.com SkASSERT(ptr); 20895443dada55325555a701d61f150843a74101b8reed@google.com SkRefCnt* refcnt = reinterpret_cast<SkRefCnt*>(ptr); 21895443dada55325555a701d61f150843a74101b8reed@google.com 22895443dada55325555a701d61f150843a74101b8reed@google.com if (doRef) { 23895443dada55325555a701d61f150843a74101b8reed@google.com refcnt->ref(); 24895443dada55325555a701d61f150843a74101b8reed@google.com } else { 25895443dada55325555a701d61f150843a74101b8reed@google.com refcnt->unref(); 26895443dada55325555a701d61f150843a74101b8reed@google.com } 27895443dada55325555a701d61f150843a74101b8reed@google.com return ptr; 28895443dada55325555a701d61f150843a74101b8reed@google.com} 29bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 30bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comSkMetaData::SkMetaData() : fRec(NULL) 31bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{ 32bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 33bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 34bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comSkMetaData::SkMetaData(const SkMetaData& src) : fRec(NULL) 35bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{ 36bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com *this = src; 37bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 38bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 39bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comSkMetaData::~SkMetaData() 40bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{ 41bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com this->reset(); 42bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 43bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 44bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comvoid SkMetaData::reset() 45bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{ 46bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com Rec* rec = fRec; 47895443dada55325555a701d61f150843a74101b8reed@google.com while (rec) { 48895443dada55325555a701d61f150843a74101b8reed@google.com if (kPtr_Type == rec->fType) { 49895443dada55325555a701d61f150843a74101b8reed@google.com PtrPair* pair = (PtrPair*)rec->data(); 50895443dada55325555a701d61f150843a74101b8reed@google.com if (pair->fProc && pair->fPtr) { 51895443dada55325555a701d61f150843a74101b8reed@google.com pair->fPtr = pair->fProc(pair->fPtr, false); 52895443dada55325555a701d61f150843a74101b8reed@google.com } 53895443dada55325555a701d61f150843a74101b8reed@google.com } 54bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com Rec* next = rec->fNext; 55bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com Rec::Free(rec); 56bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com rec = next; 57bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com } 58bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com fRec = NULL; 59bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 60bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 61bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comSkMetaData& SkMetaData::operator=(const SkMetaData& src) 62bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{ 63bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com this->reset(); 64bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 65bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com const Rec* rec = src.fRec; 66bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com while (rec) 67bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com { 68bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com this->set(rec->name(), rec->data(), rec->fDataLen, (Type)rec->fType, rec->fDataCount); 69bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com rec = rec->fNext; 70bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com } 71bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return *this; 72bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 73bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 74bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comvoid SkMetaData::setS32(const char name[], int32_t value) 75bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{ 76bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com (void)this->set(name, &value, sizeof(int32_t), kS32_Type, 1); 77bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 78bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 79bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comvoid SkMetaData::setScalar(const char name[], SkScalar value) 80bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{ 81bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com (void)this->set(name, &value, sizeof(SkScalar), kScalar_Type, 1); 82bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 83bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 84bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comSkScalar* SkMetaData::setScalars(const char name[], int count, const SkScalar values[]) 85bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{ 86bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com SkASSERT(count > 0); 87bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com if (count > 0) 88bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return (SkScalar*)this->set(name, values, sizeof(SkScalar), kScalar_Type, count); 89bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return NULL; 90bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 91bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 92bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comvoid SkMetaData::setString(const char name[], const char value[]) 93bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{ 94bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com (void)this->set(name, value, sizeof(char), kString_Type, strlen(value) + 1); 95bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 96bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 97895443dada55325555a701d61f150843a74101b8reed@google.comvoid SkMetaData::setPtr(const char name[], void* ptr, PtrProc proc) { 98895443dada55325555a701d61f150843a74101b8reed@google.com PtrPair pair = { ptr, proc }; 99895443dada55325555a701d61f150843a74101b8reed@google.com (void)this->set(name, &pair, sizeof(PtrPair), kPtr_Type, 1); 100bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 101bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 102bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comvoid SkMetaData::setBool(const char name[], bool value) 103bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{ 104bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com (void)this->set(name, &value, sizeof(bool), kBool_Type, 1); 105bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 106bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 107e216b62841acd5db9d91b63960805568259a2e0ereed@android.comvoid SkMetaData::setData(const char name[], const void* data, size_t byteCount) { 108e216b62841acd5db9d91b63960805568259a2e0ereed@android.com (void)this->set(name, data, sizeof(char), kData_Type, byteCount); 109e216b62841acd5db9d91b63960805568259a2e0ereed@android.com} 110e216b62841acd5db9d91b63960805568259a2e0ereed@android.com 111bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comvoid* SkMetaData::set(const char name[], const void* data, size_t dataSize, Type type, int count) 112bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{ 113bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com SkASSERT(name); 114bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com SkASSERT(dataSize); 115bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com SkASSERT(count > 0); 116bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 117bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com (void)this->remove(name, type); 118bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 119bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com size_t len = strlen(name); 120bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com Rec* rec = Rec::Alloc(sizeof(Rec) + dataSize * count + len + 1); 121bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 122bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#ifndef SK_DEBUG 123bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com rec->fType = SkToU8(type); 124bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#else 125bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com rec->fType = type; 126bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#endif 127bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com rec->fDataLen = SkToU8(dataSize); 128bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com rec->fDataCount = SkToU16(count); 129bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com if (data) 130bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com memcpy(rec->data(), data, dataSize * count); 131bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com memcpy(rec->name(), name, len + 1); 132bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 133895443dada55325555a701d61f150843a74101b8reed@google.com if (kPtr_Type == type) { 134895443dada55325555a701d61f150843a74101b8reed@google.com PtrPair* pair = (PtrPair*)rec->data(); 135895443dada55325555a701d61f150843a74101b8reed@google.com if (pair->fProc && pair->fPtr) { 136895443dada55325555a701d61f150843a74101b8reed@google.com pair->fPtr = pair->fProc(pair->fPtr, true); 137895443dada55325555a701d61f150843a74101b8reed@google.com } 138bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com } 139bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 140bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com rec->fNext = fRec; 141bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com fRec = rec; 142bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return rec->data(); 143bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 144bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 145bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.combool SkMetaData::findS32(const char name[], int32_t* value) const 146bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{ 147bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com const Rec* rec = this->find(name, kS32_Type); 148bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com if (rec) 149bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com { 150bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com SkASSERT(rec->fDataCount == 1); 151bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com if (value) 152bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com *value = *(const int32_t*)rec->data(); 153bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return true; 154bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com } 155bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return false; 156bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 157bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 158bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.combool SkMetaData::findScalar(const char name[], SkScalar* value) const 159bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{ 160bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com const Rec* rec = this->find(name, kScalar_Type); 161bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com if (rec) 162bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com { 163bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com SkASSERT(rec->fDataCount == 1); 164bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com if (value) 165bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com *value = *(const SkScalar*)rec->data(); 166bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return true; 167bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com } 168bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return false; 169bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 170bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 171bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comconst SkScalar* SkMetaData::findScalars(const char name[], int* count, SkScalar values[]) const 172bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{ 173bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com const Rec* rec = this->find(name, kScalar_Type); 174bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com if (rec) 175bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com { 176bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com if (count) 177bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com *count = rec->fDataCount; 178bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com if (values) 179bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com memcpy(values, rec->data(), rec->fDataCount * rec->fDataLen); 180bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return (const SkScalar*)rec->data(); 181bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com } 182bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return NULL; 183bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 184bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 185895443dada55325555a701d61f150843a74101b8reed@google.combool SkMetaData::findPtr(const char name[], void** ptr, PtrProc* proc) const { 186bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com const Rec* rec = this->find(name, kPtr_Type); 187895443dada55325555a701d61f150843a74101b8reed@google.com if (rec) { 188bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com SkASSERT(rec->fDataCount == 1); 189895443dada55325555a701d61f150843a74101b8reed@google.com const PtrPair* pair = (const PtrPair*)rec->data(); 190895443dada55325555a701d61f150843a74101b8reed@google.com if (ptr) { 191895443dada55325555a701d61f150843a74101b8reed@google.com *ptr = pair->fPtr; 192895443dada55325555a701d61f150843a74101b8reed@google.com } 193895443dada55325555a701d61f150843a74101b8reed@google.com if (proc) { 194895443dada55325555a701d61f150843a74101b8reed@google.com *proc = pair->fProc; 195895443dada55325555a701d61f150843a74101b8reed@google.com } 196bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return true; 197bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com } 198bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return false; 199bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 200bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 201bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comconst char* SkMetaData::findString(const char name[]) const 202bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{ 203bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com const Rec* rec = this->find(name, kString_Type); 204bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com SkASSERT(rec == NULL || rec->fDataLen == sizeof(char)); 205bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return rec ? (const char*)rec->data() : NULL; 206bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 207bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 208bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.combool SkMetaData::findBool(const char name[], bool* value) const 209bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{ 210bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com const Rec* rec = this->find(name, kBool_Type); 211bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com if (rec) 212bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com { 213bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com SkASSERT(rec->fDataCount == 1); 214bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com if (value) 215bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com *value = *(const bool*)rec->data(); 216bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return true; 217bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com } 218bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return false; 219bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 220bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 221e216b62841acd5db9d91b63960805568259a2e0ereed@android.comconst void* SkMetaData::findData(const char name[], size_t* length) const { 222e216b62841acd5db9d91b63960805568259a2e0ereed@android.com const Rec* rec = this->find(name, kData_Type); 223e216b62841acd5db9d91b63960805568259a2e0ereed@android.com if (rec) { 224e216b62841acd5db9d91b63960805568259a2e0ereed@android.com SkASSERT(rec->fDataLen == sizeof(char)); 225e216b62841acd5db9d91b63960805568259a2e0ereed@android.com if (length) { 226e216b62841acd5db9d91b63960805568259a2e0ereed@android.com *length = rec->fDataCount; 227e216b62841acd5db9d91b63960805568259a2e0ereed@android.com } 228e216b62841acd5db9d91b63960805568259a2e0ereed@android.com return rec->data(); 229e216b62841acd5db9d91b63960805568259a2e0ereed@android.com } 230e216b62841acd5db9d91b63960805568259a2e0ereed@android.com return NULL; 231e216b62841acd5db9d91b63960805568259a2e0ereed@android.com} 232e216b62841acd5db9d91b63960805568259a2e0ereed@android.com 233bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comconst SkMetaData::Rec* SkMetaData::find(const char name[], Type type) const 234bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{ 235bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com const Rec* rec = fRec; 236bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com while (rec) 237bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com { 238bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com if (rec->fType == type && !strcmp(rec->name(), name)) 239bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return rec; 240bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com rec = rec->fNext; 241bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com } 242bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return NULL; 243bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 244bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 245895443dada55325555a701d61f150843a74101b8reed@google.combool SkMetaData::remove(const char name[], Type type) { 246bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com Rec* rec = fRec; 247bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com Rec* prev = NULL; 248895443dada55325555a701d61f150843a74101b8reed@google.com while (rec) { 249bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com Rec* next = rec->fNext; 250895443dada55325555a701d61f150843a74101b8reed@google.com if (rec->fType == type && !strcmp(rec->name(), name)) { 251895443dada55325555a701d61f150843a74101b8reed@google.com if (prev) { 252bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com prev->fNext = next; 253895443dada55325555a701d61f150843a74101b8reed@google.com } else { 254bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com fRec = next; 255895443dada55325555a701d61f150843a74101b8reed@google.com } 256895443dada55325555a701d61f150843a74101b8reed@google.com 257895443dada55325555a701d61f150843a74101b8reed@google.com if (kPtr_Type == type) { 258895443dada55325555a701d61f150843a74101b8reed@google.com PtrPair* pair = (PtrPair*)rec->data(); 259895443dada55325555a701d61f150843a74101b8reed@google.com if (pair->fProc && pair->fPtr) { 260895443dada55325555a701d61f150843a74101b8reed@google.com (void)pair->fProc(pair->fPtr, false); 261895443dada55325555a701d61f150843a74101b8reed@google.com } 262895443dada55325555a701d61f150843a74101b8reed@google.com } 263bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com Rec::Free(rec); 264bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return true; 265bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com } 266bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com prev = rec; 267bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com rec = next; 268bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com } 269bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return false; 270bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 271bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 272bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.combool SkMetaData::removeS32(const char name[]) 273bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{ 274bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return this->remove(name, kS32_Type); 275bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 276bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 277bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.combool SkMetaData::removeScalar(const char name[]) 278bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{ 279bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return this->remove(name, kScalar_Type); 280bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 281bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 282bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.combool SkMetaData::removeString(const char name[]) 283bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{ 284bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return this->remove(name, kString_Type); 285bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 286bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 287bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.combool SkMetaData::removePtr(const char name[]) 288bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{ 289bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return this->remove(name, kPtr_Type); 290bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 291bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 292bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.combool SkMetaData::removeBool(const char name[]) 293bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{ 294bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return this->remove(name, kBool_Type); 295bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 296bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 297e216b62841acd5db9d91b63960805568259a2e0ereed@android.combool SkMetaData::removeData(const char name[]) { 298e216b62841acd5db9d91b63960805568259a2e0ereed@android.com return this->remove(name, kData_Type); 299e216b62841acd5db9d91b63960805568259a2e0ereed@android.com} 300e216b62841acd5db9d91b63960805568259a2e0ereed@android.com 301895443dada55325555a701d61f150843a74101b8reed@google.com/////////////////////////////////////////////////////////////////////////////// 302bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 303895443dada55325555a701d61f150843a74101b8reed@google.comSkMetaData::Iter::Iter(const SkMetaData& metadata) { 304bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com fRec = metadata.fRec; 305bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 306bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 307895443dada55325555a701d61f150843a74101b8reed@google.comvoid SkMetaData::Iter::reset(const SkMetaData& metadata) { 308bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com fRec = metadata.fRec; 309bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 310bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 311895443dada55325555a701d61f150843a74101b8reed@google.comconst char* SkMetaData::Iter::next(SkMetaData::Type* t, int* count) { 312bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com const char* name = NULL; 313bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 314895443dada55325555a701d61f150843a74101b8reed@google.com if (fRec) { 315895443dada55325555a701d61f150843a74101b8reed@google.com if (t) { 316bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com *t = (SkMetaData::Type)fRec->fType; 317895443dada55325555a701d61f150843a74101b8reed@google.com } 318895443dada55325555a701d61f150843a74101b8reed@google.com if (count) { 319bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com *count = fRec->fDataCount; 320895443dada55325555a701d61f150843a74101b8reed@google.com } 321bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com name = fRec->name(); 322bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 323bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com fRec = fRec->fNext; 324bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com } 325bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return name; 326bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 327bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 328895443dada55325555a701d61f150843a74101b8reed@google.com/////////////////////////////////////////////////////////////////////////////// 329bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 330895443dada55325555a701d61f150843a74101b8reed@google.comSkMetaData::Rec* SkMetaData::Rec::Alloc(size_t size) { 331bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return (Rec*)sk_malloc_throw(size); 332bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 333bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 334895443dada55325555a701d61f150843a74101b8reed@google.comvoid SkMetaData::Rec::Free(Rec* rec) { 335bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com sk_free(rec); 336bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 337