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

Unified Diff: src/core/SkScaledImageCache.h

Issue 20005003: add scaledimagecache (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years, 5 months 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
« no previous file with comments | « src/core/SkBitmapProcState.cpp ('k') | src/core/SkScaledImageCache.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/core/SkScaledImageCache.h
diff --git a/src/core/SkScaledImageCache.h b/src/core/SkScaledImageCache.h
new file mode 100644
index 0000000000000000000000000000000000000000..6802043150f684d4ea87f540ea2c30a0e57c702d
--- /dev/null
+++ b/src/core/SkScaledImageCache.h
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2013 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef SkScaledImageCache_DEFINED
+#define SkScaledImageCache_DEFINED
+
+#include "SkBitmap.h"
+
+/**
+ * Cache object for bitmaps (with possible scale in X Y as part of the key).
+ *
+ * Multiple caches can be instantiated, but each instance is not implicitly
+ * thread-safe, so if a given instance is to be shared across threads, the
+ * caller must manage the access itself (e.g. via a mutex).
+ *
+ * As a convenience, a global instance is also defined, which can be safely
+ * access across threads via the static methods (e.g. FindAndLock, etc.).
+ */
+class SkScaledImageCache {
+public:
+ struct ID;
+
+ /*
+ * The following static methods are thread-safe wrappers around a global
+ * instance of this cache.
+ */
+
+ static ID* FindAndLock(const SkBitmap& original, SkScalar scaleX,
+ SkScalar scaleY, SkBitmap* scaled);
+
+ static ID* AddAndLock(const SkBitmap& original, SkScalar scaleX,
+ SkScalar scaleY, const SkBitmap& scaled);
+
+ static void Unlock(ID*);
+
+ static size_t GetBytesUsed();
+ static size_t GetByteLimit();
+ static size_t SetByteLimit(size_t newLimit);
+
+ ///////////////////////////////////////////////////////////////////////////
+
+ SkScaledImageCache(size_t byteLimit);
+ ~SkScaledImageCache();
+
+ /**
+ * Search the cache for a scaled version of original. If found, return it
+ * in scaled, and return its ID pointer. Use the returned ptr to unlock
+ * the cache when you are done using scaled.
+ *
+ * If a match is not found, scaled will be unmodifed, and NULL will be
+ * returned.
+ */
+ ID* findAndLock(const SkBitmap& original, SkScalar scaleX,
+ SkScalar scaleY, SkBitmap* scaled);
+
+ /**
+ * To add a new (scaled) bitmap to the cache, call AddAndLock. Use the
+ * returned ptr to unlock the cache when you are done using scaled.
+ */
+ ID* addAndLock(const SkBitmap& original, SkScalar scaleX,
+ SkScalar scaleY, const SkBitmap& scaled);
+
+ /**
+ * Given a non-null ID ptr returned by either findAndLock or addAndLock,
+ * this releases the associated resources to be available to be purged
+ * if needed. After this, the cached bitmap should no longer be
+ * referenced by the caller.
+ */
+ void unlock(ID*);
+
+ size_t getBytesUsed() const { return fBytesUsed; }
+ size_t getByteLimit() const { return fByteLimit; }
+
+ /**
+ * Set the maximum number of bytes available to this cache. If the current
+ * cache exceeds this new value, it will be purged to try to fit within
+ * this new limit.
+ */
+ size_t setByteLimit(size_t newLimit);
+
+private:
+ struct Rec;
+ Rec* fHead;
+ Rec* fTail;
+
+ size_t fBytesUsed;
+ size_t fByteLimit;
+ int fCount;
+
+ void purgeAsNeeded();
+
+ // linklist management
+ void moveToHead(Rec*);
+ void addToHead(Rec*);
+ void detach(Rec*);
+#ifdef SK_DEBUG
+ void validate() const;
+#else
+ void validate() const {}
+#endif
+};
+
+#endif
« no previous file with comments | « src/core/SkBitmapProcState.cpp ('k') | src/core/SkScaledImageCache.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698