| 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 |