diff options
author | aleksandar.stojiljkovic <aleksandar.stojiljkovic@intel.com> | 2015-11-10 04:55:15 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-11-10 04:55:15 -0800 |
commit | 07e2692da3971960f8ae8adcd78ccb4bae7ab446 (patch) | |
tree | 7f109e777adb635d8548e8f2e9a591049255a79e /src/core/SkResourceCache.cpp | |
parent | d9ffaed6d21f85c717117904da26a2bac2295607 (diff) |
SkResourceCache::GetAllocator() index8 and other color types handling
Unit tests added to check all color types in SkOneShotDiscardablePixelref
SkResourceCacheTest seems to have been allways using default Heap Allocator.
Fixed so that it uses private (not global that is) SkDiscardableMemory.
BUG=skia:4355
Review URL: https://codereview.chromium.org/1426753006
Diffstat (limited to 'src/core/SkResourceCache.cpp')
-rw-r--r-- | src/core/SkResourceCache.cpp | 33 |
1 files changed, 23 insertions, 10 deletions
diff --git a/src/core/SkResourceCache.cpp b/src/core/SkResourceCache.cpp index 240d1977e5..6d8e1662d9 100644 --- a/src/core/SkResourceCache.cpp +++ b/src/core/SkResourceCache.cpp @@ -79,7 +79,9 @@ class SkOneShotDiscardablePixelRef : public SkPixelRef { public: // Ownership of the discardablememory is transfered to the pixelref - SkOneShotDiscardablePixelRef(const SkImageInfo&, SkDiscardableMemory*, size_t rowBytes); + // The pixelref will ref() the colortable (if not NULL), and unref() in destructor + SkOneShotDiscardablePixelRef(const SkImageInfo&, SkDiscardableMemory*, size_t rowBytes, + SkColorTable*); ~SkOneShotDiscardablePixelRef(); protected: @@ -93,22 +95,29 @@ private: SkDiscardableMemory* fDM; size_t fRB; bool fFirstTime; + SkColorTable* fCTable; typedef SkPixelRef INHERITED; }; SkOneShotDiscardablePixelRef::SkOneShotDiscardablePixelRef(const SkImageInfo& info, SkDiscardableMemory* dm, - size_t rowBytes) + size_t rowBytes, + SkColorTable* ctable) : INHERITED(info) , fDM(dm) , fRB(rowBytes) + , fCTable(ctable) { SkASSERT(dm->data()); fFirstTime = true; + SkSafeRef(ctable); } -SkOneShotDiscardablePixelRef::~SkOneShotDiscardablePixelRef() { delete fDM; } +SkOneShotDiscardablePixelRef::~SkOneShotDiscardablePixelRef() { + delete fDM; + SkSafeUnref(fCTable); +} bool SkOneShotDiscardablePixelRef::onNewLockPixels(LockRec* rec) { if (fFirstTime) { @@ -132,7 +141,7 @@ bool SkOneShotDiscardablePixelRef::onNewLockPixels(LockRec* rec) { SUCCESS: rec->fPixels = fDM->data(); - rec->fColorTable = nullptr; + rec->fColorTable = fCTable; rec->fRowBytes = fRB; return true; } @@ -166,18 +175,22 @@ bool SkResourceCacheDiscardableAllocator::allocPixelRef(SkBitmap* bitmap, SkColo return false; } - SkDiscardableMemory* dm = fFactory(size); - if (nullptr == dm) { - return false; + if (kIndex_8_SkColorType == bitmap->colorType()) { + if (!ctable) { + return false; + } + } else { + ctable = nullptr; } - // can we relax this? - if (kN32_SkColorType != bitmap->colorType()) { + SkDiscardableMemory* dm = fFactory(size); + if (nullptr == dm) { return false; } SkImageInfo info = bitmap->info(); - bitmap->setPixelRef(new SkOneShotDiscardablePixelRef(info, dm, bitmap->rowBytes()))->unref(); + bitmap->setPixelRef(new SkOneShotDiscardablePixelRef(info, dm, bitmap->rowBytes(), + ctable))->unref(); bitmap->lockPixels(); return bitmap->readyToDraw(); } |