Home | History | Annotate | Download | only in images
      1 
      2 /*
      3  * Copyright 2011 Google Inc.
      4  *
      5  * Use of this source code is governed by a BSD-style license that can be
      6  * found in the LICENSE file.
      7  */
      8 #include "SkImageRef_GlobalPool.h"
      9 #include "SkImageRefPool.h"
     10 #include "SkThread.h"
     11 
     12 SK_DECLARE_STATIC_MUTEX(gGlobalPoolMutex);
     13 
     14 /*
     15  *  This returns the lazily-allocated global pool. It must be called
     16  *  from inside the guard mutex, so we safely only ever allocate 1.
     17  */
     18 static SkImageRefPool* GetGlobalPool() {
     19     static SkImageRefPool* gPool;
     20     if (NULL == gPool) {
     21         gPool = SkNEW(SkImageRefPool);
     22         // call sk_atexit(...) when we have that, to free the global pool
     23     }
     24     return gPool;
     25 }
     26 
     27 SkImageRef_GlobalPool::SkImageRef_GlobalPool(SkStream* stream,
     28                                              SkBitmap::Config config,
     29                                              int sampleSize)
     30         : SkImageRef(stream, config, sampleSize, &gGlobalPoolMutex) {
     31     SkASSERT(&gGlobalPoolMutex == this->mutex());
     32     SkAutoMutexAcquire ac(gGlobalPoolMutex);
     33     GetGlobalPool()->addToHead(this);
     34 }
     35 
     36 SkImageRef_GlobalPool::~SkImageRef_GlobalPool() {
     37     SkASSERT(&gGlobalPoolMutex == this->mutex());
     38     SkAutoMutexAcquire ac(gGlobalPoolMutex);
     39     GetGlobalPool()->detach(this);
     40 }
     41 
     42 /*  By design, onUnlockPixels() already is inside the mutex-lock,
     43  *  and it is the (indirect) caller of onDecode(), therefore we can assume
     44  *  that we also are already inside the mutex. Hence, we can reference
     45  *  the global-pool directly.
     46  */
     47 bool SkImageRef_GlobalPool::onDecode(SkImageDecoder* codec, SkStream* stream,
     48                                      SkBitmap* bitmap, SkBitmap::Config config,
     49                                      SkImageDecoder::Mode mode) {
     50     if (!this->INHERITED::onDecode(codec, stream, bitmap, config, mode)) {
     51         return false;
     52     }
     53     if (mode == SkImageDecoder::kDecodePixels_Mode) {
     54         // no need to grab the mutex here, it has already been acquired.
     55         GetGlobalPool()->justAddedPixels(this);
     56     }
     57     return true;
     58 }
     59 
     60 void SkImageRef_GlobalPool::onUnlockPixels() {
     61     this->INHERITED::onUnlockPixels();
     62 
     63     // by design, onUnlockPixels() already is inside the mutex-lock
     64     GetGlobalPool()->canLosePixels(this);
     65 }
     66 
     67 SkImageRef_GlobalPool::SkImageRef_GlobalPool(SkFlattenableReadBuffer& buffer)
     68         : INHERITED(buffer, &gGlobalPoolMutex) {
     69     SkASSERT(&gGlobalPoolMutex == this->mutex());
     70     SkAutoMutexAcquire ac(gGlobalPoolMutex);
     71     GetGlobalPool()->addToHead(this);
     72 }
     73 
     74 ///////////////////////////////////////////////////////////////////////////////
     75 // global imagerefpool wrappers
     76 
     77 size_t SkImageRef_GlobalPool::GetRAMBudget() {
     78     SkAutoMutexAcquire ac(gGlobalPoolMutex);
     79     return GetGlobalPool()->getRAMBudget();
     80 }
     81 
     82 void SkImageRef_GlobalPool::SetRAMBudget(size_t size) {
     83     SkAutoMutexAcquire ac(gGlobalPoolMutex);
     84     GetGlobalPool()->setRAMBudget(size);
     85 }
     86 
     87 size_t SkImageRef_GlobalPool::GetRAMUsed() {
     88     SkAutoMutexAcquire ac(gGlobalPoolMutex);
     89     return GetGlobalPool()->getRAMUsed();
     90 }
     91 
     92 void SkImageRef_GlobalPool::SetRAMUsed(size_t usage) {
     93     SkAutoMutexAcquire ac(gGlobalPoolMutex);
     94     GetGlobalPool()->setRAMUsed(usage);
     95 }
     96 
     97 void SkImageRef_GlobalPool::DumpPool() {
     98     SkAutoMutexAcquire ac(gGlobalPoolMutex);
     99     GetGlobalPool()->dump();
    100 }
    101