OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkScaledImageCache.h" | 8 #include "SkScaledImageCache.h" |
9 #include "SkMipMap.h" | 9 #include "SkMipMap.h" |
10 #include "SkOnce.h" | 10 #include "SkOnce.h" |
11 #include "SkPixelRef.h" | 11 #include "SkPixelRef.h" |
12 #include "SkRect.h" | 12 #include "SkRect.h" |
13 | 13 |
14 #ifndef SK_DEFAULT_IMAGE_CACHE_LIMIT | 14 #ifndef SK_DEFAULT_IMAGE_CACHE_LIMIT |
15 #define SK_DEFAULT_IMAGE_CACHE_LIMIT (2 * 1024 * 1024) | 15 #define SK_DEFAULT_IMAGE_CACHE_LIMIT (2 * 1024 * 1024) |
16 #endif | 16 #endif |
17 | 17 |
18 static inline SkScaledImageCache::ID* rec_to_id(SkScaledImageCache::Rec* rec) { | 18 static inline SkScaledImageCache::ID* rec_to_id(SkScaledImageCache::Rec* rec) { |
19 return reinterpret_cast<SkScaledImageCache::ID*>(rec); | 19 return reinterpret_cast<SkScaledImageCache::ID*>(rec); |
20 } | 20 } |
21 | 21 |
22 static inline SkScaledImageCache::Rec* id_to_rec(SkScaledImageCache::ID* id) { | 22 static inline SkScaledImageCache::Rec* id_to_rec(SkScaledImageCache::ID* id) { |
23 return reinterpret_cast<SkScaledImageCache::Rec*>(id); | 23 return reinterpret_cast<SkScaledImageCache::Rec*>(id); |
24 } | 24 } |
25 | 25 |
26 // Implemented from en.wikipedia.org/wiki/MurmurHash. | 26 // Implemented from en.wikipedia.org/wiki/MurmurHash. |
27 static uint32_t compute_hash(const uint32_t data[], int count) { | 27 static uint32_t compute_hash(const uint32_t data[], int count) { |
28 uint32_t hash = 0; | 28 uint32_t hash = 0; |
29 | 29 |
30 for (int i = 0; i < count; ++i) { | 30 for (int i = 0; i < count; ++i) { |
31 uint32_t k = data[i]; | 31 uint32_t k = data[i]; |
32 k *= 0xcc9e2d51; | 32 k *= 0xcc9e2d51; |
33 k = (k << 15) | (k >> 17); | 33 k = (k << 15) | (k >> 17); |
34 k *= 0x1b873593; | 34 k *= 0x1b873593; |
35 | 35 |
36 hash ^= k; | 36 hash ^= k; |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 | 121 |
122 int32_t fLockCount; | 122 int32_t fLockCount; |
123 | 123 |
124 // we use either fBitmap or fMip, but not both | 124 // we use either fBitmap or fMip, but not both |
125 SkBitmap fBitmap; | 125 SkBitmap fBitmap; |
126 const SkMipMap* fMip; | 126 const SkMipMap* fMip; |
127 }; | 127 }; |
128 | 128 |
129 #include "SkTDynamicHash.h" | 129 #include "SkTDynamicHash.h" |
130 | 130 |
131 namespace { // can't use static functions w/ template parameters | 131 namespace { // can't use static functions w/ template parameters |
132 const Key& key_from_rec(const SkScaledImageCache::Rec& rec) { | 132 const Key& key_from_rec(const SkScaledImageCache::Rec& rec) { |
133 return rec.fKey; | 133 return rec.fKey; |
134 } | 134 } |
135 | 135 |
136 uint32_t hash_from_key(const Key& key) { | 136 uint32_t hash_from_key(const Key& key) { |
137 return key.fHash; | 137 return key.fHash; |
138 } | 138 } |
139 | 139 |
140 bool eq_rec_key(const SkScaledImageCache::Rec& rec, const Key& key) { | 140 bool eq_rec_key(const SkScaledImageCache::Rec& rec, const Key& key) { |
141 return rec.fKey == key; | 141 return rec.fKey == key; |
142 } | 142 } |
143 } | 143 } // namespace |
144 | 144 |
145 class SkScaledImageCache::Hash : public SkTDynamicHash<SkScaledImageCache::Rec, | 145 class SkScaledImageCache::Hash : public SkTDynamicHash<SkScaledImageCache::Rec, |
146 Key, key_from_rec, hash_from_key, | 146 Key, key_from_rec, hash_from_key, |
147 eq_rec_key> {}; | 147 eq_rec_key> {}; |
148 | 148 |
149 /////////////////////////////////////////////////////////////////////////////// | 149 /////////////////////////////////////////////////////////////////////////////// |
150 | 150 |
151 // experimental hash to speed things up | 151 // experimental hash to speed things up |
152 #define USE_HASH | 152 #define USE_HASH |
153 | 153 |
154 #if !defined(USE_HASH) | 154 #if !defined(USE_HASH) |
155 static inline SkScaledImageCache::Rec* find_rec_in_list( | 155 static inline SkScaledImageCache::Rec* find_rec_in_list( |
156 SkScaledImageCache::Rec* head, const Key & key) { | 156 SkScaledImageCache::Rec* head, const Key & key) { |
157 SkScaledImageCache::Rec* rec = head; | 157 SkScaledImageCache::Rec* rec = head; |
158 while ((rec != NULL) && (rec->fKey != key)) { | 158 while ((rec != NULL) && (rec->fKey != key)) { |
159 rec = rec->fNext; | 159 rec = rec->fNext; |
160 } | 160 } |
161 return rec; | 161 return rec; |
162 } | 162 } |
163 #endif | 163 #endif |
164 | 164 |
165 SkScaledImageCache::SkScaledImageCache(size_t byteLimit) { | 165 SkScaledImageCache::SkScaledImageCache(size_t byteLimit, SkBaseMutex* mutex) |
| 166 : fMutex(mutex) { |
166 fHead = NULL; | 167 fHead = NULL; |
167 fTail = NULL; | 168 fTail = NULL; |
168 #ifdef USE_HASH | 169 #ifdef USE_HASH |
169 fHash = new Hash; | 170 fHash = new Hash; |
170 #else | 171 #else |
171 fHash = NULL; | 172 fHash = NULL; |
172 #endif | 173 #endif |
173 fBytesUsed = 0; | 174 fBytesUsed = 0; |
174 fByteLimit = byteLimit; | 175 fByteLimit = byteLimit; |
175 fCount = 0; | 176 fCount = 0; |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
223 SkTDivMod(bm.pixelRefOffset(), bm.rowBytes(), &y, &x); | 224 SkTDivMod(bm.pixelRefOffset(), bm.rowBytes(), &y, &x); |
224 x >>= bm.shiftPerPixel(); | 225 x >>= bm.shiftPerPixel(); |
225 return SkIRect::MakeXYWH(x, y, bm.width(), bm.height()); | 226 return SkIRect::MakeXYWH(x, y, bm.width(), bm.height()); |
226 } | 227 } |
227 | 228 |
228 | 229 |
229 SkScaledImageCache::ID* SkScaledImageCache::findAndLock(uint32_t genID, | 230 SkScaledImageCache::ID* SkScaledImageCache::findAndLock(uint32_t genID, |
230 int32_t width, | 231 int32_t width, |
231 int32_t height, | 232 int32_t height, |
232 SkBitmap* bitmap) { | 233 SkBitmap* bitmap) { |
| 234 SkAutoMutexAcquire am(fMutex); |
233 Rec* rec = this->findAndLock(genID, SK_Scalar1, SK_Scalar1, | 235 Rec* rec = this->findAndLock(genID, SK_Scalar1, SK_Scalar1, |
234 SkIRect::MakeWH(width, height)); | 236 SkIRect::MakeWH(width, height)); |
235 if (rec) { | 237 if (rec) { |
236 SkASSERT(NULL == rec->fMip); | 238 SkASSERT(NULL == rec->fMip); |
237 SkASSERT(rec->fBitmap.pixelRef()); | 239 SkASSERT(rec->fBitmap.pixelRef()); |
238 *bitmap = rec->fBitmap; | 240 *bitmap = rec->fBitmap; |
239 } | 241 } |
240 return rec_to_id(rec); | 242 return rec_to_id(rec); |
241 } | 243 } |
242 | 244 |
243 SkScaledImageCache::ID* SkScaledImageCache::findAndLock(const SkBitmap& orig, | 245 SkScaledImageCache::ID* SkScaledImageCache::findAndLock(const SkBitmap& orig, |
244 SkScalar scaleX, | 246 SkScalar scaleX, |
245 SkScalar scaleY, | 247 SkScalar scaleY, |
246 SkBitmap* scaled) { | 248 SkBitmap* scaled) { |
| 249 SkAutoMutexAcquire am(fMutex); |
247 if (0 == scaleX || 0 == scaleY) { | 250 if (0 == scaleX || 0 == scaleY) { |
248 // degenerate, and the key we use for mipmaps | 251 // degenerate, and the key we use for mipmaps |
249 return NULL; | 252 return NULL; |
250 } | 253 } |
251 Rec* rec = this->findAndLock(orig.getGenerationID(), scaleX, | 254 Rec* rec = this->findAndLock(orig.getGenerationID(), scaleX, |
252 scaleY, get_bounds_from_bitmap(orig)); | 255 scaleY, get_bounds_from_bitmap(orig)); |
253 if (rec) { | 256 if (rec) { |
254 SkASSERT(NULL == rec->fMip); | 257 SkASSERT(NULL == rec->fMip); |
255 SkASSERT(rec->fBitmap.pixelRef()); | 258 SkASSERT(rec->fBitmap.pixelRef()); |
256 *scaled = rec->fBitmap; | 259 *scaled = rec->fBitmap; |
257 } | 260 } |
258 return rec_to_id(rec); | 261 return rec_to_id(rec); |
259 } | 262 } |
260 | 263 |
261 SkScaledImageCache::ID* SkScaledImageCache::findAndLockMip(const SkBitmap& orig, | 264 SkScaledImageCache::ID* SkScaledImageCache::findAndLockMip(const SkBitmap& orig, |
262 SkMipMap const ** mip
) { | 265 SkMipMap const ** mip
) { |
| 266 SkAutoMutexAcquire am(fMutex); |
263 Rec* rec = this->findAndLock(orig.getGenerationID(), 0, 0, | 267 Rec* rec = this->findAndLock(orig.getGenerationID(), 0, 0, |
264 get_bounds_from_bitmap(orig)); | 268 get_bounds_from_bitmap(orig)); |
265 if (rec) { | 269 if (rec) { |
266 SkASSERT(rec->fMip); | 270 SkASSERT(rec->fMip); |
267 SkASSERT(NULL == rec->fBitmap.pixelRef()); | 271 SkASSERT(NULL == rec->fBitmap.pixelRef()); |
268 *mip = rec->fMip; | 272 *mip = rec->fMip; |
269 } | 273 } |
270 return rec_to_id(rec); | 274 return rec_to_id(rec); |
271 } | 275 } |
272 | 276 |
(...skipping 11 matching lines...) Expand all Loading... |
284 fHash->add(rec); | 288 fHash->add(rec); |
285 #endif | 289 #endif |
286 // We may (now) be overbudget, so see if we need to purge something. | 290 // We may (now) be overbudget, so see if we need to purge something. |
287 this->purgeAsNeeded(); | 291 this->purgeAsNeeded(); |
288 } | 292 } |
289 | 293 |
290 SkScaledImageCache::ID* SkScaledImageCache::addAndLock(uint32_t genID, | 294 SkScaledImageCache::ID* SkScaledImageCache::addAndLock(uint32_t genID, |
291 int32_t width, | 295 int32_t width, |
292 int32_t height, | 296 int32_t height, |
293 const SkBitmap& bitmap) { | 297 const SkBitmap& bitmap) { |
| 298 SkAutoMutexAcquire am(fMutex); |
294 Key key(genID, SK_Scalar1, SK_Scalar1, SkIRect::MakeWH(width, height)); | 299 Key key(genID, SK_Scalar1, SK_Scalar1, SkIRect::MakeWH(width, height)); |
295 Rec* rec = SkNEW_ARGS(Rec, (key, bitmap)); | 300 Rec* rec = SkNEW_ARGS(Rec, (key, bitmap)); |
296 this->addAndLock(rec); | 301 this->addAndLock(rec); |
297 return rec_to_id(rec); | 302 return rec_to_id(rec); |
298 } | 303 } |
299 | 304 |
300 SkScaledImageCache::ID* SkScaledImageCache::addAndLock(const SkBitmap& orig, | 305 SkScaledImageCache::ID* SkScaledImageCache::addAndLock(const SkBitmap& orig, |
301 SkScalar scaleX, | 306 SkScalar scaleX, |
302 SkScalar scaleY, | 307 SkScalar scaleY, |
303 const SkBitmap& scaled) { | 308 const SkBitmap& scaled) { |
| 309 SkAutoMutexAcquire am(fMutex); |
304 if (0 == scaleX || 0 == scaleY) { | 310 if (0 == scaleX || 0 == scaleY) { |
305 // degenerate, and the key we use for mipmaps | 311 // degenerate, and the key we use for mipmaps |
306 return NULL; | 312 return NULL; |
307 } | 313 } |
308 SkIRect bounds = get_bounds_from_bitmap(orig); | 314 SkIRect bounds = get_bounds_from_bitmap(orig); |
309 if (bounds.isEmpty()) { | 315 if (bounds.isEmpty()) { |
310 return NULL; | 316 return NULL; |
311 } | 317 } |
312 Key key(orig.getGenerationID(), scaleX, scaleY, bounds); | 318 Key key(orig.getGenerationID(), scaleX, scaleY, bounds); |
313 Rec* rec = SkNEW_ARGS(Rec, (key, scaled)); | 319 Rec* rec = SkNEW_ARGS(Rec, (key, scaled)); |
314 this->addAndLock(rec); | 320 this->addAndLock(rec); |
315 return rec_to_id(rec); | 321 return rec_to_id(rec); |
316 } | 322 } |
317 | 323 |
318 SkScaledImageCache::ID* SkScaledImageCache::addAndLockMip(const SkBitmap& orig, | 324 SkScaledImageCache::ID* SkScaledImageCache::addAndLockMip(const SkBitmap& orig, |
319 const SkMipMap* mip) { | 325 const SkMipMap* mip) { |
| 326 SkAutoMutexAcquire am(fMutex); |
320 SkIRect bounds = get_bounds_from_bitmap(orig); | 327 SkIRect bounds = get_bounds_from_bitmap(orig); |
321 if (bounds.isEmpty()) { | 328 if (bounds.isEmpty()) { |
322 return NULL; | 329 return NULL; |
323 } | 330 } |
324 Key key(orig.getGenerationID(), 0, 0, bounds); | 331 Key key(orig.getGenerationID(), 0, 0, bounds); |
325 Rec* rec = SkNEW_ARGS(Rec, (key, mip)); | 332 Rec* rec = SkNEW_ARGS(Rec, (key, mip)); |
326 this->addAndLock(rec); | 333 this->addAndLock(rec); |
327 return rec_to_id(rec); | 334 return rec_to_id(rec); |
328 } | 335 } |
329 | 336 |
330 void SkScaledImageCache::unlock(SkScaledImageCache::ID* id) { | 337 void SkScaledImageCache::unlock(SkScaledImageCache::ID* id) { |
| 338 SkAutoMutexAcquire am(fMutex); |
331 SkASSERT(id); | 339 SkASSERT(id); |
332 | 340 |
333 #ifdef SK_DEBUG | 341 #ifdef SK_DEBUG |
334 { | 342 { |
335 bool found = false; | 343 bool found = false; |
336 Rec* rec = fHead; | 344 Rec* rec = fHead; |
337 while (rec != NULL) { | 345 while (rec != NULL) { |
338 if (rec == id_to_rec(id)) { | 346 if (rec == id_to_rec(id)) { |
339 found = true; | 347 found = true; |
340 break; | 348 break; |
341 } | 349 } |
342 rec = rec->fNext; | 350 rec = rec->fNext; |
343 } | 351 } |
344 SkASSERT(found); | 352 SkASSERT(found); |
345 } | 353 } |
346 #endif | 354 #endif |
347 Rec* rec = id_to_rec(id); | 355 Rec* rec = id_to_rec(id); |
348 SkASSERT(rec->fLockCount > 0); | 356 SkASSERT(rec->fLockCount > 0); |
349 rec->fLockCount -= 1; | 357 rec->fLockCount -= 1; |
350 | 358 |
351 // we may have been over-budget, but now have released something, so check | 359 // we may have been over-budget, but now have released something, so check |
352 // if we should purge. | 360 // if we should purge. |
353 if (0 == rec->fLockCount) { | 361 if (0 == rec->fLockCount) { |
354 this->purgeAsNeeded(); | 362 this->purgeAsNeeded(); |
355 } | 363 } |
356 } | 364 } |
357 | 365 |
358 void SkScaledImageCache::purgeAsNeeded() { | 366 void SkScaledImageCache::purgeAsNeeded() { |
359 size_t byteLimit = fByteLimit; | 367 const size_t & byteLimit = fByteLimit; |
360 size_t bytesUsed = fBytesUsed; | 368 size_t bytesUsed = fBytesUsed; |
361 | 369 |
362 Rec* rec = fTail; | 370 Rec* rec = fTail; |
363 while (rec) { | 371 while (rec) { |
364 if (bytesUsed < byteLimit) { | 372 if (bytesUsed < byteLimit) { |
365 break; | 373 break; |
366 } | 374 } |
367 Rec* prev = rec->fPrev; | 375 Rec* prev = rec->fPrev; |
368 if (0 == rec->fLockCount) { | 376 if (0 == rec->fLockCount) { |
369 size_t used = rec->bytesUsed(); | 377 size_t used = rec->bytesUsed(); |
370 SkASSERT(used <= bytesUsed); | 378 SkASSERT(used <= bytesUsed); |
371 bytesUsed -= used; | 379 bytesUsed -= used; |
372 this->detach(rec); | 380 this->detach(rec); |
373 #ifdef USE_HASH | 381 #ifdef USE_HASH |
374 fHash->remove(rec->fKey); | 382 fHash->remove(rec->fKey); |
375 #endif | 383 #endif |
376 | 384 |
377 SkDELETE(rec); | 385 SkDELETE(rec); |
378 fCount -= 1; | 386 fCount -= 1; |
379 } | 387 } |
380 rec = prev; | 388 rec = prev; |
381 } | 389 } |
382 fBytesUsed = bytesUsed; | 390 fBytesUsed = bytesUsed; |
383 } | 391 } |
384 | 392 |
385 size_t SkScaledImageCache::setByteLimit(size_t newLimit) { | 393 size_t SkScaledImageCache::setByteLimit(size_t newLimit) { |
| 394 SkAutoMutexAcquire am(fMutex); |
386 size_t prevLimit = fByteLimit; | 395 size_t prevLimit = fByteLimit; |
387 fByteLimit = newLimit; | 396 fByteLimit = newLimit; |
388 if (newLimit < prevLimit) { | 397 if (newLimit < prevLimit) { |
389 this->purgeAsNeeded(); | 398 this->purgeAsNeeded(); |
390 } | 399 } |
391 return prevLimit; | 400 return prevLimit; |
392 } | 401 } |
393 | 402 |
| 403 size_t SkScaledImageCache::getBytesUsed() const { |
| 404 SkAutoMutexAcquire am(fMutex); |
| 405 return fBytesUsed; |
| 406 } |
| 407 |
| 408 size_t SkScaledImageCache::getByteLimit() const { |
| 409 SkAutoMutexAcquire am(fMutex); |
| 410 return fByteLimit; |
| 411 } |
| 412 |
394 /////////////////////////////////////////////////////////////////////////////// | 413 /////////////////////////////////////////////////////////////////////////////// |
395 | 414 |
396 void SkScaledImageCache::detach(Rec* rec) { | 415 void SkScaledImageCache::detach(Rec* rec) { |
397 Rec* prev = rec->fPrev; | 416 Rec* prev = rec->fPrev; |
398 Rec* next = rec->fNext; | 417 Rec* next = rec->fNext; |
399 | 418 |
400 if (!prev) { | 419 if (!prev) { |
401 SkASSERT(fHead == rec); | 420 SkASSERT(fHead == rec); |
402 fHead = next; | 421 fHead = next; |
403 } else { | 422 } else { |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
473 size_t used = 0; | 492 size_t used = 0; |
474 int count = 0; | 493 int count = 0; |
475 const Rec* rec = fHead; | 494 const Rec* rec = fHead; |
476 while (rec) { | 495 while (rec) { |
477 count += 1; | 496 count += 1; |
478 used += rec->bytesUsed(); | 497 used += rec->bytesUsed(); |
479 SkASSERT(used <= fBytesUsed); | 498 SkASSERT(used <= fBytesUsed); |
480 rec = rec->fNext; | 499 rec = rec->fNext; |
481 } | 500 } |
482 SkASSERT(fCount == count); | 501 SkASSERT(fCount == count); |
| 502 SkASSERT(fBytesUsed == used); |
483 | 503 |
484 rec = fTail; | 504 rec = fTail; |
485 while (rec) { | 505 while (rec) { |
486 SkASSERT(count > 0); | 506 SkASSERT(count > 0); |
487 count -= 1; | 507 count -= 1; |
488 SkASSERT(used >= rec->bytesUsed()); | 508 SkASSERT(used >= rec->bytesUsed()); |
489 used -= rec->bytesUsed(); | 509 used -= rec->bytesUsed(); |
490 rec = rec->fPrev; | 510 rec = rec->fPrev; |
491 } | 511 } |
492 | 512 |
493 SkASSERT(0 == count); | 513 SkASSERT(0 == count); |
494 SkASSERT(0 == used); | 514 SkASSERT(0 == used); |
495 } | 515 } |
496 #endif | 516 #endif |
497 | 517 |
498 /////////////////////////////////////////////////////////////////////////////// | 518 /////////////////////////////////////////////////////////////////////////////// |
499 | 519 |
500 #include "SkThread.h" | 520 #include "SkThread.h" |
501 | 521 |
502 SK_DECLARE_STATIC_MUTEX(gMutex); | |
503 | |
504 static void create_cache(SkScaledImageCache** cache) { | 522 static void create_cache(SkScaledImageCache** cache) { |
505 *cache = SkNEW_ARGS(SkScaledImageCache, (SK_DEFAULT_IMAGE_CACHE_LIMIT)); | 523 SK_DECLARE_STATIC_MUTEX(mutex); |
| 524 *cache = SkNEW_ARGS(SkScaledImageCache, |
| 525 (SK_DEFAULT_IMAGE_CACHE_LIMIT, &mutex)); |
506 } | 526 } |
507 | 527 |
508 static SkScaledImageCache* get_cache() { | 528 SkScaledImageCache* SkScaledImageCache::Instance() { |
509 static SkScaledImageCache* gCache(NULL); | 529 static SkScaledImageCache* gCache(NULL); |
510 SK_DECLARE_STATIC_ONCE(create_cache_once); | 530 SK_DECLARE_STATIC_ONCE(create_cache_once); |
511 SkOnce<SkScaledImageCache**>(&create_cache_once, create_cache, &gCache); | 531 SkOnce<SkScaledImageCache**>(&create_cache_once, create_cache, &gCache); |
512 SkASSERT(NULL != gCache); | 532 SkASSERT(NULL != gCache); |
513 return gCache; | 533 return gCache; |
514 } | 534 } |
515 | 535 |
516 | 536 |
517 SkScaledImageCache::ID* SkScaledImageCache::FindAndLock( | 537 SkScaledImageCache::ID* SkScaledImageCache::FindAndLock( |
518 uint32_t pixelGenerationID, | 538 uint32_t pixelGenerationID, |
519 int32_t width, | 539 int32_t width, |
520 int32_t height, | 540 int32_t height, |
521 SkBitmap* scaled) { | 541 SkBitmap* scaled) { |
522 SkAutoMutexAcquire am(gMutex); | 542 SkScaledImageCache* cache = SkScaledImageCache::Instance(); |
523 return get_cache()->findAndLock(pixelGenerationID, width, height, scaled); | 543 return cache->findAndLock(pixelGenerationID, width, height, scaled); |
524 } | 544 } |
525 | 545 |
526 SkScaledImageCache::ID* SkScaledImageCache::AddAndLock( | 546 SkScaledImageCache::ID* SkScaledImageCache::AddAndLock( |
527 uint32_t pixelGenerationID, | 547 uint32_t pixelGenerationID, |
528 int32_t width, | 548 int32_t width, |
529 int32_t height, | 549 int32_t height, |
530 const SkBitmap& scaled) { | 550 const SkBitmap& scaled) { |
531 SkAutoMutexAcquire am(gMutex); | 551 SkScaledImageCache* cache = SkScaledImageCache::Instance(); |
532 return get_cache()->addAndLock(pixelGenerationID, width, height, scaled); | 552 return cache->addAndLock(pixelGenerationID, width, height, scaled); |
533 } | 553 } |
534 | 554 |
535 | 555 |
536 SkScaledImageCache::ID* SkScaledImageCache::FindAndLock(const SkBitmap& orig, | 556 SkScaledImageCache::ID* SkScaledImageCache::FindAndLock(const SkBitmap& orig, |
537 SkScalar scaleX, | 557 SkScalar scaleX, |
538 SkScalar scaleY, | 558 SkScalar scaleY, |
539 SkBitmap* scaled) { | 559 SkBitmap* scaled) { |
540 SkAutoMutexAcquire am(gMutex); | 560 SkScaledImageCache* cache = SkScaledImageCache::Instance(); |
541 return get_cache()->findAndLock(orig, scaleX, scaleY, scaled); | 561 return cache->findAndLock(orig, scaleX, scaleY, scaled); |
542 } | 562 } |
543 | 563 |
544 SkScaledImageCache::ID* SkScaledImageCache::FindAndLockMip(const SkBitmap& orig, | 564 SkScaledImageCache::ID* SkScaledImageCache::FindAndLockMip(const SkBitmap& orig, |
545 SkMipMap const ** mip) { | 565 SkMipMap const ** mip) { |
546 SkAutoMutexAcquire am(gMutex); | 566 SkScaledImageCache* cache = SkScaledImageCache::Instance(); |
547 return get_cache()->findAndLockMip(orig, mip); | 567 return cache->findAndLockMip(orig, mip); |
548 } | 568 } |
549 | 569 |
550 SkScaledImageCache::ID* SkScaledImageCache::AddAndLock(const SkBitmap& orig, | 570 SkScaledImageCache::ID* SkScaledImageCache::AddAndLock(const SkBitmap& orig, |
551 SkScalar scaleX, | 571 SkScalar scaleX, |
552 SkScalar scaleY, | 572 SkScalar scaleY, |
553 const SkBitmap& scaled) { | 573 const SkBitmap& scaled) { |
554 SkAutoMutexAcquire am(gMutex); | 574 SkScaledImageCache* cache = SkScaledImageCache::Instance(); |
555 return get_cache()->addAndLock(orig, scaleX, scaleY, scaled); | 575 return cache->addAndLock(orig, scaleX, scaleY, scaled); |
556 } | 576 } |
557 | 577 |
558 SkScaledImageCache::ID* SkScaledImageCache::AddAndLockMip(const SkBitmap& orig, | 578 SkScaledImageCache::ID* SkScaledImageCache::AddAndLockMip(const SkBitmap& orig, |
559 const SkMipMap* mip) { | 579 const SkMipMap* mip) { |
560 SkAutoMutexAcquire am(gMutex); | 580 SkScaledImageCache* cache = SkScaledImageCache::Instance(); |
561 return get_cache()->addAndLockMip(orig, mip); | 581 return cache->addAndLockMip(orig, mip); |
562 } | 582 } |
563 | 583 |
564 void SkScaledImageCache::Unlock(SkScaledImageCache::ID* id) { | 584 void SkScaledImageCache::Unlock(SkScaledImageCache::ID* id) { |
565 SkAutoMutexAcquire am(gMutex); | 585 SkScaledImageCache* cache = SkScaledImageCache::Instance(); |
566 return get_cache()->unlock(id); | 586 return cache->unlock(id); |
567 } | 587 } |
568 | 588 |
569 size_t SkScaledImageCache::GetBytesUsed() { | 589 size_t SkScaledImageCache::GetBytesUsed() { |
570 SkAutoMutexAcquire am(gMutex); | 590 SkScaledImageCache* cache = SkScaledImageCache::Instance(); |
571 return get_cache()->getBytesUsed(); | 591 return cache->getBytesUsed(); |
572 } | 592 } |
573 | 593 |
574 size_t SkScaledImageCache::GetByteLimit() { | 594 size_t SkScaledImageCache::GetByteLimit() { |
575 SkAutoMutexAcquire am(gMutex); | 595 SkScaledImageCache* cache = SkScaledImageCache::Instance(); |
576 return get_cache()->getByteLimit(); | 596 return cache->getByteLimit(); |
577 } | 597 } |
578 | 598 |
579 size_t SkScaledImageCache::SetByteLimit(size_t newLimit) { | 599 size_t SkScaledImageCache::SetByteLimit(size_t newLimit) { |
580 SkAutoMutexAcquire am(gMutex); | 600 SkScaledImageCache* cache = SkScaledImageCache::Instance(); |
581 return get_cache()->setByteLimit(newLimit); | 601 return cache->setByteLimit(newLimit); |
582 } | 602 } |
583 | 603 |
584 /////////////////////////////////////////////////////////////////////////////// | 604 /////////////////////////////////////////////////////////////////////////////// |
585 | 605 |
586 #include "SkGraphics.h" | 606 #include "SkGraphics.h" |
587 | 607 |
588 size_t SkGraphics::GetImageCacheBytesUsed() { | 608 size_t SkGraphics::GetImageCacheBytesUsed() { |
589 return SkScaledImageCache::GetBytesUsed(); | 609 return SkScaledImageCache::GetBytesUsed(); |
590 } | 610 } |
591 | 611 |
592 size_t SkGraphics::GetImageCacheByteLimit() { | 612 size_t SkGraphics::GetImageCacheByteLimit() { |
593 return SkScaledImageCache::GetByteLimit(); | 613 return SkScaledImageCache::GetByteLimit(); |
594 } | 614 } |
595 | 615 |
596 size_t SkGraphics::SetImageCacheByteLimit(size_t newLimit) { | 616 size_t SkGraphics::SetImageCacheByteLimit(size_t newLimit) { |
597 return SkScaledImageCache::SetByteLimit(newLimit); | 617 return SkScaledImageCache::SetByteLimit(newLimit); |
598 } | 618 } |
OLD | NEW |