OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 | 9 |
10 #include "SkMetaData.h" | 10 #include "SkMetaData.h" |
11 #include "SkRefCnt.h" | 11 #include "SkRefCnt.h" |
12 | 12 |
13 struct PtrPair { | 13 struct PtrPair { |
14 void* fPtr; | 14 void* fPtr; |
15 SkMetaData::PtrProc fProc; | 15 SkMetaData::PtrProc fProc; |
16 }; | 16 }; |
17 | 17 |
18 void* SkMetaData::RefCntProc(void* ptr, bool doRef) { | 18 void* SkMetaData::RefCntProc(void* ptr, bool doRef) { |
19 SkASSERT(ptr); | 19 SkASSERT(ptr); |
20 SkRefCnt* refcnt = reinterpret_cast<SkRefCnt*>(ptr); | 20 SkRefCnt* refcnt = reinterpret_cast<SkRefCnt*>(ptr); |
21 | 21 |
22 if (doRef) { | 22 if (doRef) { |
23 refcnt->ref(); | 23 refcnt->ref(); |
24 } else { | 24 } else { |
25 refcnt->unref(); | 25 refcnt->unref(); |
26 } | 26 } |
27 return ptr; | 27 return ptr; |
28 } | 28 } |
29 | 29 |
30 SkMetaData::SkMetaData() : fRec(NULL) | 30 SkMetaData::SkMetaData() : fRec(nullptr) |
31 { | 31 { |
32 } | 32 } |
33 | 33 |
34 SkMetaData::SkMetaData(const SkMetaData& src) : fRec(NULL) | 34 SkMetaData::SkMetaData(const SkMetaData& src) : fRec(nullptr) |
35 { | 35 { |
36 *this = src; | 36 *this = src; |
37 } | 37 } |
38 | 38 |
39 SkMetaData::~SkMetaData() | 39 SkMetaData::~SkMetaData() |
40 { | 40 { |
41 this->reset(); | 41 this->reset(); |
42 } | 42 } |
43 | 43 |
44 void SkMetaData::reset() | 44 void SkMetaData::reset() |
45 { | 45 { |
46 Rec* rec = fRec; | 46 Rec* rec = fRec; |
47 while (rec) { | 47 while (rec) { |
48 if (kPtr_Type == rec->fType) { | 48 if (kPtr_Type == rec->fType) { |
49 PtrPair* pair = (PtrPair*)rec->data(); | 49 PtrPair* pair = (PtrPair*)rec->data(); |
50 if (pair->fProc && pair->fPtr) { | 50 if (pair->fProc && pair->fPtr) { |
51 pair->fPtr = pair->fProc(pair->fPtr, false); | 51 pair->fPtr = pair->fProc(pair->fPtr, false); |
52 } | 52 } |
53 } | 53 } |
54 Rec* next = rec->fNext; | 54 Rec* next = rec->fNext; |
55 Rec::Free(rec); | 55 Rec::Free(rec); |
56 rec = next; | 56 rec = next; |
57 } | 57 } |
58 fRec = NULL; | 58 fRec = nullptr; |
59 } | 59 } |
60 | 60 |
61 SkMetaData& SkMetaData::operator=(const SkMetaData& src) | 61 SkMetaData& SkMetaData::operator=(const SkMetaData& src) |
62 { | 62 { |
63 this->reset(); | 63 this->reset(); |
64 | 64 |
65 const Rec* rec = src.fRec; | 65 const Rec* rec = src.fRec; |
66 while (rec) | 66 while (rec) |
67 { | 67 { |
68 this->set(rec->name(), rec->data(), rec->fDataLen, (Type)rec->fType, rec
->fDataCount); | 68 this->set(rec->name(), rec->data(), rec->fDataLen, (Type)rec->fType, rec
->fDataCount); |
(...skipping 10 matching lines...) Expand all Loading... |
79 void SkMetaData::setScalar(const char name[], SkScalar value) | 79 void SkMetaData::setScalar(const char name[], SkScalar value) |
80 { | 80 { |
81 (void)this->set(name, &value, sizeof(SkScalar), kScalar_Type, 1); | 81 (void)this->set(name, &value, sizeof(SkScalar), kScalar_Type, 1); |
82 } | 82 } |
83 | 83 |
84 SkScalar* SkMetaData::setScalars(const char name[], int count, const SkScalar va
lues[]) | 84 SkScalar* SkMetaData::setScalars(const char name[], int count, const SkScalar va
lues[]) |
85 { | 85 { |
86 SkASSERT(count > 0); | 86 SkASSERT(count > 0); |
87 if (count > 0) | 87 if (count > 0) |
88 return (SkScalar*)this->set(name, values, sizeof(SkScalar), kScalar_Type
, count); | 88 return (SkScalar*)this->set(name, values, sizeof(SkScalar), kScalar_Type
, count); |
89 return NULL; | 89 return nullptr; |
90 } | 90 } |
91 | 91 |
92 void SkMetaData::setString(const char name[], const char value[]) | 92 void SkMetaData::setString(const char name[], const char value[]) |
93 { | 93 { |
94 (void)this->set(name, value, sizeof(char), kString_Type, SkToInt(strlen(valu
e) + 1)); | 94 (void)this->set(name, value, sizeof(char), kString_Type, SkToInt(strlen(valu
e) + 1)); |
95 } | 95 } |
96 | 96 |
97 void SkMetaData::setPtr(const char name[], void* ptr, PtrProc proc) { | 97 void SkMetaData::setPtr(const char name[], void* ptr, PtrProc proc) { |
98 PtrPair pair = { ptr, proc }; | 98 PtrPair pair = { ptr, proc }; |
99 (void)this->set(name, &pair, sizeof(PtrPair), kPtr_Type, 1); | 99 (void)this->set(name, &pair, sizeof(PtrPair), kPtr_Type, 1); |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
172 { | 172 { |
173 const Rec* rec = this->find(name, kScalar_Type); | 173 const Rec* rec = this->find(name, kScalar_Type); |
174 if (rec) | 174 if (rec) |
175 { | 175 { |
176 if (count) | 176 if (count) |
177 *count = rec->fDataCount; | 177 *count = rec->fDataCount; |
178 if (values) | 178 if (values) |
179 memcpy(values, rec->data(), rec->fDataCount * rec->fDataLen); | 179 memcpy(values, rec->data(), rec->fDataCount * rec->fDataLen); |
180 return (const SkScalar*)rec->data(); | 180 return (const SkScalar*)rec->data(); |
181 } | 181 } |
182 return NULL; | 182 return nullptr; |
183 } | 183 } |
184 | 184 |
185 bool SkMetaData::findPtr(const char name[], void** ptr, PtrProc* proc) const { | 185 bool SkMetaData::findPtr(const char name[], void** ptr, PtrProc* proc) const { |
186 const Rec* rec = this->find(name, kPtr_Type); | 186 const Rec* rec = this->find(name, kPtr_Type); |
187 if (rec) { | 187 if (rec) { |
188 SkASSERT(rec->fDataCount == 1); | 188 SkASSERT(rec->fDataCount == 1); |
189 const PtrPair* pair = (const PtrPair*)rec->data(); | 189 const PtrPair* pair = (const PtrPair*)rec->data(); |
190 if (ptr) { | 190 if (ptr) { |
191 *ptr = pair->fPtr; | 191 *ptr = pair->fPtr; |
192 } | 192 } |
193 if (proc) { | 193 if (proc) { |
194 *proc = pair->fProc; | 194 *proc = pair->fProc; |
195 } | 195 } |
196 return true; | 196 return true; |
197 } | 197 } |
198 return false; | 198 return false; |
199 } | 199 } |
200 | 200 |
201 const char* SkMetaData::findString(const char name[]) const | 201 const char* SkMetaData::findString(const char name[]) const |
202 { | 202 { |
203 const Rec* rec = this->find(name, kString_Type); | 203 const Rec* rec = this->find(name, kString_Type); |
204 SkASSERT(rec == NULL || rec->fDataLen == sizeof(char)); | 204 SkASSERT(rec == nullptr || rec->fDataLen == sizeof(char)); |
205 return rec ? (const char*)rec->data() : NULL; | 205 return rec ? (const char*)rec->data() : nullptr; |
206 } | 206 } |
207 | 207 |
208 bool SkMetaData::findBool(const char name[], bool* value) const | 208 bool SkMetaData::findBool(const char name[], bool* value) const |
209 { | 209 { |
210 const Rec* rec = this->find(name, kBool_Type); | 210 const Rec* rec = this->find(name, kBool_Type); |
211 if (rec) | 211 if (rec) |
212 { | 212 { |
213 SkASSERT(rec->fDataCount == 1); | 213 SkASSERT(rec->fDataCount == 1); |
214 if (value) | 214 if (value) |
215 *value = *(const bool*)rec->data(); | 215 *value = *(const bool*)rec->data(); |
216 return true; | 216 return true; |
217 } | 217 } |
218 return false; | 218 return false; |
219 } | 219 } |
220 | 220 |
221 const void* SkMetaData::findData(const char name[], size_t* length) const { | 221 const void* SkMetaData::findData(const char name[], size_t* length) const { |
222 const Rec* rec = this->find(name, kData_Type); | 222 const Rec* rec = this->find(name, kData_Type); |
223 if (rec) { | 223 if (rec) { |
224 SkASSERT(rec->fDataLen == sizeof(char)); | 224 SkASSERT(rec->fDataLen == sizeof(char)); |
225 if (length) { | 225 if (length) { |
226 *length = rec->fDataCount; | 226 *length = rec->fDataCount; |
227 } | 227 } |
228 return rec->data(); | 228 return rec->data(); |
229 } | 229 } |
230 return NULL; | 230 return nullptr; |
231 } | 231 } |
232 | 232 |
233 const SkMetaData::Rec* SkMetaData::find(const char name[], Type type) const | 233 const SkMetaData::Rec* SkMetaData::find(const char name[], Type type) const |
234 { | 234 { |
235 const Rec* rec = fRec; | 235 const Rec* rec = fRec; |
236 while (rec) | 236 while (rec) |
237 { | 237 { |
238 if (rec->fType == type && !strcmp(rec->name(), name)) | 238 if (rec->fType == type && !strcmp(rec->name(), name)) |
239 return rec; | 239 return rec; |
240 rec = rec->fNext; | 240 rec = rec->fNext; |
241 } | 241 } |
242 return NULL; | 242 return nullptr; |
243 } | 243 } |
244 | 244 |
245 bool SkMetaData::remove(const char name[], Type type) { | 245 bool SkMetaData::remove(const char name[], Type type) { |
246 Rec* rec = fRec; | 246 Rec* rec = fRec; |
247 Rec* prev = NULL; | 247 Rec* prev = nullptr; |
248 while (rec) { | 248 while (rec) { |
249 Rec* next = rec->fNext; | 249 Rec* next = rec->fNext; |
250 if (rec->fType == type && !strcmp(rec->name(), name)) { | 250 if (rec->fType == type && !strcmp(rec->name(), name)) { |
251 if (prev) { | 251 if (prev) { |
252 prev->fNext = next; | 252 prev->fNext = next; |
253 } else { | 253 } else { |
254 fRec = next; | 254 fRec = next; |
255 } | 255 } |
256 | 256 |
257 if (kPtr_Type == type) { | 257 if (kPtr_Type == type) { |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
302 | 302 |
303 SkMetaData::Iter::Iter(const SkMetaData& metadata) { | 303 SkMetaData::Iter::Iter(const SkMetaData& metadata) { |
304 fRec = metadata.fRec; | 304 fRec = metadata.fRec; |
305 } | 305 } |
306 | 306 |
307 void SkMetaData::Iter::reset(const SkMetaData& metadata) { | 307 void SkMetaData::Iter::reset(const SkMetaData& metadata) { |
308 fRec = metadata.fRec; | 308 fRec = metadata.fRec; |
309 } | 309 } |
310 | 310 |
311 const char* SkMetaData::Iter::next(SkMetaData::Type* t, int* count) { | 311 const char* SkMetaData::Iter::next(SkMetaData::Type* t, int* count) { |
312 const char* name = NULL; | 312 const char* name = nullptr; |
313 | 313 |
314 if (fRec) { | 314 if (fRec) { |
315 if (t) { | 315 if (t) { |
316 *t = (SkMetaData::Type)fRec->fType; | 316 *t = (SkMetaData::Type)fRec->fType; |
317 } | 317 } |
318 if (count) { | 318 if (count) { |
319 *count = fRec->fDataCount; | 319 *count = fRec->fDataCount; |
320 } | 320 } |
321 name = fRec->name(); | 321 name = fRec->name(); |
322 | 322 |
323 fRec = fRec->fNext; | 323 fRec = fRec->fNext; |
324 } | 324 } |
325 return name; | 325 return name; |
326 } | 326 } |
327 | 327 |
328 /////////////////////////////////////////////////////////////////////////////// | 328 /////////////////////////////////////////////////////////////////////////////// |
329 | 329 |
330 SkMetaData::Rec* SkMetaData::Rec::Alloc(size_t size) { | 330 SkMetaData::Rec* SkMetaData::Rec::Alloc(size_t size) { |
331 return (Rec*)sk_malloc_throw(size); | 331 return (Rec*)sk_malloc_throw(size); |
332 } | 332 } |
333 | 333 |
334 void SkMetaData::Rec::Free(Rec* rec) { | 334 void SkMetaData::Rec::Free(Rec* rec) { |
335 sk_free(rec); | 335 sk_free(rec); |
336 } | 336 } |
OLD | NEW |