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

Unified Diff: src/core/SkBitmapCache.cpp

Issue 1340223003: create SkBitmapProvider to abstract images and bitmaps (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: remove obsolete comments Created 5 years, 3 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/SkBitmapCache.h ('k') | src/core/SkBitmapController.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/core/SkBitmapCache.cpp
diff --git a/src/core/SkBitmapCache.cpp b/src/core/SkBitmapCache.cpp
index dfa387bb3992e351dd5eba4aa1495c075a98ca3d..83eec1b666b7e2b56a2cd233f87ff470274e3add 100644
--- a/src/core/SkBitmapCache.cpp
+++ b/src/core/SkBitmapCache.cpp
@@ -6,6 +6,7 @@
*/
#include "SkBitmapCache.h"
+#include "SkImage.h"
#include "SkResourceCache.h"
#include "SkMipMap.h"
#include "SkPixelRef.h"
@@ -43,6 +44,41 @@ static SkIRect get_bounds_from_bitmap(const SkBitmap& bm) {
return SkIRect::MakeXYWH(origin.fX, origin.fY, bm.width(), bm.height());
}
+/**
+ * This function finds the bounds of the image. Today this is just the entire bounds,
+ * but in the future we may support subsets within an image, in which case this should
+ * return that subset (see get_bounds_from_bitmap).
+ */
+static SkIRect get_bounds_from_image(const SkImage* image) {
+ return SkIRect::MakeWH(image->width(), image->height());
+}
+
+SkBitmapCacheDesc SkBitmapCacheDesc::Make(const SkBitmap& bm, int width, int height) {
+ SkBitmapCacheDesc desc;
+ desc.fImageID = bm.getGenerationID();
+ desc.fWidth = width;
+ desc.fHeight = height;
+ desc.fBounds = get_bounds_from_bitmap(bm);
+ return desc;
+}
+
+SkBitmapCacheDesc SkBitmapCacheDesc::Make(const SkBitmap& bm) {
+ return Make(bm, bm.width(), bm.height());
+}
+
+SkBitmapCacheDesc SkBitmapCacheDesc::Make(const SkImage* image, int width, int height) {
+ SkBitmapCacheDesc desc;
+ desc.fImageID = image->uniqueID();
+ desc.fWidth = width;
+ desc.fHeight = height;
+ desc.fBounds = get_bounds_from_image(image);
+ return desc;
+}
+
+SkBitmapCacheDesc SkBitmapCacheDesc::Make(const SkImage* image) {
+ return Make(image, image->width(), image->height());
+}
+
namespace {
static unsigned gBitmapKeyNamespaceLabel;
@@ -54,7 +90,17 @@ public:
, fHeight(height)
, fBounds(bounds)
{
- this->init(&gBitmapKeyNamespaceLabel, SkMakeResourceCacheSharedIDForBitmap(genID),
+ this->init(&gBitmapKeyNamespaceLabel, SkMakeResourceCacheSharedIDForBitmap(fGenID),
+ sizeof(fGenID) + sizeof(fWidth) + sizeof(fHeight) + sizeof(fBounds));
+ }
+
+ BitmapKey(const SkBitmapCacheDesc& desc)
+ : fGenID(desc.fImageID)
+ , fWidth(desc.fWidth)
+ , fHeight(desc.fHeight)
+ , fBounds(desc.fBounds)
+ {
+ this->init(&gBitmapKeyNamespaceLabel, SkMakeResourceCacheSharedIDForBitmap(fGenID),
sizeof(fGenID) + sizeof(fWidth) + sizeof(fHeight) + sizeof(fBounds));
}
@@ -80,6 +126,15 @@ struct BitmapRec : public SkResourceCache::Rec {
#endif
}
+ BitmapRec(const SkBitmapCacheDesc& desc, const SkBitmap& result)
+ : fKey(desc)
+ , fBitmap(result)
+ {
+#ifdef TRACE_NEW_BITMAP_CACHE_RECS
+ fKey.dump();
+#endif
+ }
+
const Key& getKey() const override { return fKey; }
size_t bytesUsed() const override { return sizeof(fKey) + fBitmap.getSize(); }
@@ -106,28 +161,25 @@ private:
#define CHECK_LOCAL(localCache, localName, globalName, ...) \
((localCache) ? localCache->localName(__VA_ARGS__) : SkResourceCache::globalName(__VA_ARGS__))
-bool SkBitmapCache::FindWH(const SkBitmap& src, int width, int height, SkBitmap* result,
+bool SkBitmapCache::FindWH(const SkBitmapCacheDesc& desc, SkBitmap* result,
SkResourceCache* localCache) {
- if (0 == width || 0 == height) {
- // degenerate, and the key we use for mipmaps
+ if (0 == desc.fWidth || 0 == desc.fHeight) {
+ // degenerate
return false;
}
- BitmapKey key(src.getGenerationID(), width, height, get_bounds_from_bitmap(src));
-
- return CHECK_LOCAL(localCache, find, Find, key, BitmapRec::Finder, result);
+ return CHECK_LOCAL(localCache, find, Find, BitmapKey(desc), BitmapRec::Finder, result);
}
-void SkBitmapCache::AddWH(const SkBitmap& src, int width, int height,
- const SkBitmap& result, SkResourceCache* localCache) {
- if (0 == width || 0 == height) {
+bool SkBitmapCache::AddWH(const SkBitmapCacheDesc& desc, const SkBitmap& result,
+ SkResourceCache* localCache) {
+ if (0 == desc.fWidth || 0 == desc.fHeight) {
// degenerate, and the key we use for mipmaps
- return;
+ return false;
}
SkASSERT(result.isImmutable());
- BitmapRec* rec = new BitmapRec(src.getGenerationID(), width, height,
- get_bounds_from_bitmap(src), result);
+ BitmapRec* rec = new BitmapRec(desc, result);
CHECK_LOCAL(localCache, add, Add, rec);
- src.pixelRef()->notifyAddedToCache();
+ return true;
}
bool SkBitmapCache::Find(uint32_t genID, const SkIRect& subset, SkBitmap* result,
@@ -226,8 +278,10 @@ private:
};
}
-const SkMipMap* SkMipMapCache::FindAndRef(const SkBitmap& src, SkResourceCache* localCache) {
- MipMapKey key(src.getGenerationID(), get_bounds_from_bitmap(src));
+const SkMipMap* SkMipMapCache::FindAndRef(const SkBitmapCacheDesc& desc,
+ SkResourceCache* localCache) {
+ // Note: we ignore width/height from desc, just need id and bounds
+ MipMapKey key(desc.fImageID, desc.fBounds);
const SkMipMap* result;
if (!CHECK_LOCAL(localCache, find, Find, key, MipMapRec::Finder, &result)) {
« no previous file with comments | « src/core/SkBitmapCache.h ('k') | src/core/SkBitmapController.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698