Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(485)

Unified Diff: src/lazy/SkImageCache.cpp

Issue 84783002: SkDiscardableMemory::Factory class (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/lazy/SkImageCache.cpp
diff --git a/src/lazy/SkImageCache.cpp b/src/lazy/SkImageCache.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..94035f59d67120985857d2b364c1c4ac44d2c6eb
--- /dev/null
+++ b/src/lazy/SkImageCache.cpp
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2013 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "SkImageCache.h"
+
+namespace {
+class ImageCacheBackedDM : public SkDiscardableMemory {
+public:
+ static SkDiscardableMemory * create(SkImageCache* cache, size_t size);
scroggo 2013/12/02 19:00:09 SkDiscardableMemory* create
+ virtual ~ImageCacheBackedDM();
+ virtual bool lock() SK_OVERRIDE;
+ virtual void* data() SK_OVERRIDE;
+ virtual void unlock() SK_OVERRIDE;
+private:
+ ImageCacheBackedDM(SkImageCache* cache, SkImageCache::ID id, void* ptr);
+ SkImageCache* fCache;
+ SkImageCache::ID fId;
+ void* fPtr;
+};
+
+SkDiscardableMemory * ImageCacheBackedDM::create(SkImageCache* cache,
scroggo 2013/12/02 19:00:09 SkDiscardableMemory* ImageCacheBackedDM...
+ size_t bytes) {
+ SkASSERT(cache);
+ SkImageCache::ID id(SkImageCache::UNINITIALIZED_ID);
+ void* ptr = cache->allocAndPinCache(bytes, &id);
+ SkASSERT((NULL == ptr) == (SkImageCache::UNINITIALIZED_ID == id));
+ if (ptr == NULL) {
+ return NULL;
+ }
+ return SkNEW_ARGS(ImageCacheBackedDM, (cache, id, ptr));
+}
+
+ImageCacheBackedDM::ImageCacheBackedDM(SkImageCache* cache,
+ SkImageCache::ID id, void* ptr)
+ : fCache(cache), fId(id), fPtr(ptr) {
scroggo 2013/12/02 19:00:09 These should be on their own line: : fCache(cache
+ fCache->ref();
+}
+
+ImageCacheBackedDM::~ImageCacheBackedDM() {
+ if (fId != SkImageCache::UNINITIALIZED_ID) {
+ fCache->throwAwayCache(fId);
+ }
+ fCache->unref();
+}
+
+bool ImageCacheBackedDM::lock() {
+ SkImageCache::DataStatus status;
+ SkASSERT(NULL == fPtr);
+ fPtr = fCache->pinCache(fId, &status);
+ if (NULL == fPtr) {
+ fId = SkImageCache::UNINITIALIZED_ID;
+ return false;
+ }
+ if (SkImageCache::kRetained_DataStatus == status) {
+ return true;
+ }
+ // not retained, fail.
+ fCache->releaseCache(fId);
+ fCache->throwAwayCache(fId);
+ fId = SkImageCache::UNINITIALIZED_ID;
+ fPtr = NULL;
+ return false;
+}
+
+void* ImageCacheBackedDM::data() {
+ return fPtr;
+}
+
+void ImageCacheBackedDM::unlock() {
+ if (fId != SkImageCache::UNINITIALIZED_ID) {
+ fCache->releaseCache(fId);
+ }
+ fPtr = NULL;
+}
+} // namespace
+
+SkDiscardableMemory* SkImageCache::create(size_t bytes) {
+ return ImageCacheBackedDM::create(this, bytes);
+}

Powered by Google App Engine
This is Rietveld 408576698