1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/skia/trunk/src/core/SkMetaData.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,336 @@ 1.4 + 1.5 +/* 1.6 + * Copyright 2006 The Android Open Source Project 1.7 + * 1.8 + * Use of this source code is governed by a BSD-style license that can be 1.9 + * found in the LICENSE file. 1.10 + */ 1.11 + 1.12 + 1.13 +#include "SkMetaData.h" 1.14 +#include "SkRefCnt.h" 1.15 + 1.16 +struct PtrPair { 1.17 + void* fPtr; 1.18 + SkMetaData::PtrProc fProc; 1.19 +}; 1.20 + 1.21 +void* SkMetaData::RefCntProc(void* ptr, bool doRef) { 1.22 + SkASSERT(ptr); 1.23 + SkRefCnt* refcnt = reinterpret_cast<SkRefCnt*>(ptr); 1.24 + 1.25 + if (doRef) { 1.26 + refcnt->ref(); 1.27 + } else { 1.28 + refcnt->unref(); 1.29 + } 1.30 + return ptr; 1.31 +} 1.32 + 1.33 +SkMetaData::SkMetaData() : fRec(NULL) 1.34 +{ 1.35 +} 1.36 + 1.37 +SkMetaData::SkMetaData(const SkMetaData& src) : fRec(NULL) 1.38 +{ 1.39 + *this = src; 1.40 +} 1.41 + 1.42 +SkMetaData::~SkMetaData() 1.43 +{ 1.44 + this->reset(); 1.45 +} 1.46 + 1.47 +void SkMetaData::reset() 1.48 +{ 1.49 + Rec* rec = fRec; 1.50 + while (rec) { 1.51 + if (kPtr_Type == rec->fType) { 1.52 + PtrPair* pair = (PtrPair*)rec->data(); 1.53 + if (pair->fProc && pair->fPtr) { 1.54 + pair->fPtr = pair->fProc(pair->fPtr, false); 1.55 + } 1.56 + } 1.57 + Rec* next = rec->fNext; 1.58 + Rec::Free(rec); 1.59 + rec = next; 1.60 + } 1.61 + fRec = NULL; 1.62 +} 1.63 + 1.64 +SkMetaData& SkMetaData::operator=(const SkMetaData& src) 1.65 +{ 1.66 + this->reset(); 1.67 + 1.68 + const Rec* rec = src.fRec; 1.69 + while (rec) 1.70 + { 1.71 + this->set(rec->name(), rec->data(), rec->fDataLen, (Type)rec->fType, rec->fDataCount); 1.72 + rec = rec->fNext; 1.73 + } 1.74 + return *this; 1.75 +} 1.76 + 1.77 +void SkMetaData::setS32(const char name[], int32_t value) 1.78 +{ 1.79 + (void)this->set(name, &value, sizeof(int32_t), kS32_Type, 1); 1.80 +} 1.81 + 1.82 +void SkMetaData::setScalar(const char name[], SkScalar value) 1.83 +{ 1.84 + (void)this->set(name, &value, sizeof(SkScalar), kScalar_Type, 1); 1.85 +} 1.86 + 1.87 +SkScalar* SkMetaData::setScalars(const char name[], int count, const SkScalar values[]) 1.88 +{ 1.89 + SkASSERT(count > 0); 1.90 + if (count > 0) 1.91 + return (SkScalar*)this->set(name, values, sizeof(SkScalar), kScalar_Type, count); 1.92 + return NULL; 1.93 +} 1.94 + 1.95 +void SkMetaData::setString(const char name[], const char value[]) 1.96 +{ 1.97 + (void)this->set(name, value, sizeof(char), kString_Type, SkToInt(strlen(value) + 1)); 1.98 +} 1.99 + 1.100 +void SkMetaData::setPtr(const char name[], void* ptr, PtrProc proc) { 1.101 + PtrPair pair = { ptr, proc }; 1.102 + (void)this->set(name, &pair, sizeof(PtrPair), kPtr_Type, 1); 1.103 +} 1.104 + 1.105 +void SkMetaData::setBool(const char name[], bool value) 1.106 +{ 1.107 + (void)this->set(name, &value, sizeof(bool), kBool_Type, 1); 1.108 +} 1.109 + 1.110 +void SkMetaData::setData(const char name[], const void* data, size_t byteCount) { 1.111 + (void)this->set(name, data, sizeof(char), kData_Type, SkToInt(byteCount)); 1.112 +} 1.113 + 1.114 +void* SkMetaData::set(const char name[], const void* data, size_t dataSize, Type type, int count) 1.115 +{ 1.116 + SkASSERT(name); 1.117 + SkASSERT(dataSize); 1.118 + SkASSERT(count > 0); 1.119 + 1.120 + (void)this->remove(name, type); 1.121 + 1.122 + size_t len = strlen(name); 1.123 + Rec* rec = Rec::Alloc(sizeof(Rec) + dataSize * count + len + 1); 1.124 + 1.125 +#ifndef SK_DEBUG 1.126 + rec->fType = SkToU8(type); 1.127 +#else 1.128 + rec->fType = type; 1.129 +#endif 1.130 + rec->fDataLen = SkToU8(dataSize); 1.131 + rec->fDataCount = SkToU16(count); 1.132 + if (data) 1.133 + memcpy(rec->data(), data, dataSize * count); 1.134 + memcpy(rec->name(), name, len + 1); 1.135 + 1.136 + if (kPtr_Type == type) { 1.137 + PtrPair* pair = (PtrPair*)rec->data(); 1.138 + if (pair->fProc && pair->fPtr) { 1.139 + pair->fPtr = pair->fProc(pair->fPtr, true); 1.140 + } 1.141 + } 1.142 + 1.143 + rec->fNext = fRec; 1.144 + fRec = rec; 1.145 + return rec->data(); 1.146 +} 1.147 + 1.148 +bool SkMetaData::findS32(const char name[], int32_t* value) const 1.149 +{ 1.150 + const Rec* rec = this->find(name, kS32_Type); 1.151 + if (rec) 1.152 + { 1.153 + SkASSERT(rec->fDataCount == 1); 1.154 + if (value) 1.155 + *value = *(const int32_t*)rec->data(); 1.156 + return true; 1.157 + } 1.158 + return false; 1.159 +} 1.160 + 1.161 +bool SkMetaData::findScalar(const char name[], SkScalar* value) const 1.162 +{ 1.163 + const Rec* rec = this->find(name, kScalar_Type); 1.164 + if (rec) 1.165 + { 1.166 + SkASSERT(rec->fDataCount == 1); 1.167 + if (value) 1.168 + *value = *(const SkScalar*)rec->data(); 1.169 + return true; 1.170 + } 1.171 + return false; 1.172 +} 1.173 + 1.174 +const SkScalar* SkMetaData::findScalars(const char name[], int* count, SkScalar values[]) const 1.175 +{ 1.176 + const Rec* rec = this->find(name, kScalar_Type); 1.177 + if (rec) 1.178 + { 1.179 + if (count) 1.180 + *count = rec->fDataCount; 1.181 + if (values) 1.182 + memcpy(values, rec->data(), rec->fDataCount * rec->fDataLen); 1.183 + return (const SkScalar*)rec->data(); 1.184 + } 1.185 + return NULL; 1.186 +} 1.187 + 1.188 +bool SkMetaData::findPtr(const char name[], void** ptr, PtrProc* proc) const { 1.189 + const Rec* rec = this->find(name, kPtr_Type); 1.190 + if (rec) { 1.191 + SkASSERT(rec->fDataCount == 1); 1.192 + const PtrPair* pair = (const PtrPair*)rec->data(); 1.193 + if (ptr) { 1.194 + *ptr = pair->fPtr; 1.195 + } 1.196 + if (proc) { 1.197 + *proc = pair->fProc; 1.198 + } 1.199 + return true; 1.200 + } 1.201 + return false; 1.202 +} 1.203 + 1.204 +const char* SkMetaData::findString(const char name[]) const 1.205 +{ 1.206 + const Rec* rec = this->find(name, kString_Type); 1.207 + SkASSERT(rec == NULL || rec->fDataLen == sizeof(char)); 1.208 + return rec ? (const char*)rec->data() : NULL; 1.209 +} 1.210 + 1.211 +bool SkMetaData::findBool(const char name[], bool* value) const 1.212 +{ 1.213 + const Rec* rec = this->find(name, kBool_Type); 1.214 + if (rec) 1.215 + { 1.216 + SkASSERT(rec->fDataCount == 1); 1.217 + if (value) 1.218 + *value = *(const bool*)rec->data(); 1.219 + return true; 1.220 + } 1.221 + return false; 1.222 +} 1.223 + 1.224 +const void* SkMetaData::findData(const char name[], size_t* length) const { 1.225 + const Rec* rec = this->find(name, kData_Type); 1.226 + if (rec) { 1.227 + SkASSERT(rec->fDataLen == sizeof(char)); 1.228 + if (length) { 1.229 + *length = rec->fDataCount; 1.230 + } 1.231 + return rec->data(); 1.232 + } 1.233 + return NULL; 1.234 +} 1.235 + 1.236 +const SkMetaData::Rec* SkMetaData::find(const char name[], Type type) const 1.237 +{ 1.238 + const Rec* rec = fRec; 1.239 + while (rec) 1.240 + { 1.241 + if (rec->fType == type && !strcmp(rec->name(), name)) 1.242 + return rec; 1.243 + rec = rec->fNext; 1.244 + } 1.245 + return NULL; 1.246 +} 1.247 + 1.248 +bool SkMetaData::remove(const char name[], Type type) { 1.249 + Rec* rec = fRec; 1.250 + Rec* prev = NULL; 1.251 + while (rec) { 1.252 + Rec* next = rec->fNext; 1.253 + if (rec->fType == type && !strcmp(rec->name(), name)) { 1.254 + if (prev) { 1.255 + prev->fNext = next; 1.256 + } else { 1.257 + fRec = next; 1.258 + } 1.259 + 1.260 + if (kPtr_Type == type) { 1.261 + PtrPair* pair = (PtrPair*)rec->data(); 1.262 + if (pair->fProc && pair->fPtr) { 1.263 + (void)pair->fProc(pair->fPtr, false); 1.264 + } 1.265 + } 1.266 + Rec::Free(rec); 1.267 + return true; 1.268 + } 1.269 + prev = rec; 1.270 + rec = next; 1.271 + } 1.272 + return false; 1.273 +} 1.274 + 1.275 +bool SkMetaData::removeS32(const char name[]) 1.276 +{ 1.277 + return this->remove(name, kS32_Type); 1.278 +} 1.279 + 1.280 +bool SkMetaData::removeScalar(const char name[]) 1.281 +{ 1.282 + return this->remove(name, kScalar_Type); 1.283 +} 1.284 + 1.285 +bool SkMetaData::removeString(const char name[]) 1.286 +{ 1.287 + return this->remove(name, kString_Type); 1.288 +} 1.289 + 1.290 +bool SkMetaData::removePtr(const char name[]) 1.291 +{ 1.292 + return this->remove(name, kPtr_Type); 1.293 +} 1.294 + 1.295 +bool SkMetaData::removeBool(const char name[]) 1.296 +{ 1.297 + return this->remove(name, kBool_Type); 1.298 +} 1.299 + 1.300 +bool SkMetaData::removeData(const char name[]) { 1.301 + return this->remove(name, kData_Type); 1.302 +} 1.303 + 1.304 +/////////////////////////////////////////////////////////////////////////////// 1.305 + 1.306 +SkMetaData::Iter::Iter(const SkMetaData& metadata) { 1.307 + fRec = metadata.fRec; 1.308 +} 1.309 + 1.310 +void SkMetaData::Iter::reset(const SkMetaData& metadata) { 1.311 + fRec = metadata.fRec; 1.312 +} 1.313 + 1.314 +const char* SkMetaData::Iter::next(SkMetaData::Type* t, int* count) { 1.315 + const char* name = NULL; 1.316 + 1.317 + if (fRec) { 1.318 + if (t) { 1.319 + *t = (SkMetaData::Type)fRec->fType; 1.320 + } 1.321 + if (count) { 1.322 + *count = fRec->fDataCount; 1.323 + } 1.324 + name = fRec->name(); 1.325 + 1.326 + fRec = fRec->fNext; 1.327 + } 1.328 + return name; 1.329 +} 1.330 + 1.331 +/////////////////////////////////////////////////////////////////////////////// 1.332 + 1.333 +SkMetaData::Rec* SkMetaData::Rec::Alloc(size_t size) { 1.334 + return (Rec*)sk_malloc_throw(size); 1.335 +} 1.336 + 1.337 +void SkMetaData::Rec::Free(Rec* rec) { 1.338 + sk_free(rec); 1.339 +}