aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkResourceCache.cpp
diff options
context:
space:
mode:
authorGravatar aleksandar.stojiljkovic <aleksandar.stojiljkovic@intel.com>2015-11-10 04:55:15 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2015-11-10 04:55:15 -0800
commit07e2692da3971960f8ae8adcd78ccb4bae7ab446 (patch)
tree7f109e777adb635d8548e8f2e9a591049255a79e /src/core/SkResourceCache.cpp
parentd9ffaed6d21f85c717117904da26a2bac2295607 (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.cpp33
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();
}