harden requirements on SkBitmapCache
authorreed <reed@google.com>
Fri, 29 Aug 2014 17:25:26 +0000 (10:25 -0700)
committerCommit bot <commit-bot@chromium.org>
Fri, 29 Aug 2014 17:25:26 +0000 (10:25 -0700)
BUG=skia:
R=humper@google.com

Author: reed@google.com

Review URL: https://codereview.chromium.org/521433002

src/core/SkBitmapCache.cpp
src/core/SkBitmapCache.h
src/core/SkBitmapProcState.cpp
src/lazy/SkCachingPixelRef.cpp

index 99e2f5c5035f2f73e391b93b8d8c64e772e54629..8de8ab79edac2d8b0224bb3a0e140b81551964cc 100644 (file)
 #include "SkMipMap.h"
 #include "SkRect.h"
 
+SkBitmap::Allocator* SkBitmapCache::GetAllocator() {
+    return SkResourceCache::GetAllocator();
+}
+
 /**
  This function finds the bounds of the bitmap *within its pixelRef*.
  If the bitmap lacks a pixelRef, it will return an empty rect, since
@@ -91,6 +95,7 @@ void SkBitmapCache::Add(const SkBitmap& src, SkScalar invScaleX, SkScalar invSca
         // degenerate, and the key we use for mipmaps
         return;
     }
+    SkASSERT(result.isImmutable());
     SkResourceCache::Add(SkNEW_ARGS(BitmapRec, (src.getGenerationID(), invScaleX, invScaleY,
                                                 get_bounds_from_bitmap(src), result)));
 }
@@ -101,6 +106,7 @@ bool SkBitmapCache::Find(uint32_t genID, int width, int height, SkBitmap* result
 }
 
 void SkBitmapCache::Add(uint32_t genID, int width, int height, const SkBitmap& result) {
+    SkASSERT(result.isImmutable());
     SkResourceCache::Add(SkNEW_ARGS(BitmapRec, (genID, SK_Scalar1, SK_Scalar1,
                                                 SkIRect::MakeWH(width, height), result)));
 }
index 2b2dfbbea44060d51791156f9819c330835a5645..74e854635313c6ccb2dce4cd36132b9459f7cb0c 100644 (file)
@@ -9,17 +9,26 @@
 #define SkBitmapCache_DEFINED
 
 #include "SkScalar.h"
+#include "SkBitmap.h"
 
-class SkBitmap;
 class SkMipMap;
 
 class SkBitmapCache {
 public:
+    /**
+     *  Use this allocator for bitmaps, so they can use ashmem when available.
+     */
+    static SkBitmap::Allocator* GetAllocator();
+
     /**
      *  Search based on the src bitmap and inverse scales in X and Y. If found, returns true and
      *  result will be set to the matching bitmap with its pixels already locked.
      */
     static bool Find(const SkBitmap& src, SkScalar invScaleX, SkScalar invScaleY, SkBitmap* result);
+    
+    /*
+     *  result must be marked isImmutable()
+     */
     static void Add(const SkBitmap& src, SkScalar invScaleX, SkScalar invScaleY,
                     const SkBitmap& result);
 
@@ -28,6 +37,10 @@ public:
      *  result will be set to the matching bitmap with its pixels already locked.
      */
     static bool Find(uint32_t genID, int width, int height, SkBitmap* result);
+
+    /*
+     *  result must be marked isImmutable()
+     */
     static void Add(uint32_t genID, int width, int height, const SkBitmap& result);
 };
 
index a269170422cf36e4936933215e71da85c5cd0da6..2fa02947503d51763aa4bdee53008fea94d0a182 100644 (file)
@@ -189,6 +189,7 @@ bool SkBitmapProcState::possiblyScaleImage() {
             }
 
             SkASSERT(NULL != fScaledBitmap.getPixels());
+            fScaledBitmap.setImmutable();
             SkBitmapCache::Add(fOrigBitmap, roundedDestWidth, roundedDestHeight, fScaledBitmap);
         }
 
index 6d97aaeee97e6ca1d2984ab5de0bcef04b7f7e5c..56431880c9f2dc2225f14176e035439d80e8f104 100644 (file)
@@ -54,6 +54,7 @@ bool SkCachingPixelRef::onNewLockPixels(LockRec* rec) {
             fErrorInDecoding = true;
             return false;
         }
+        fLockedBitmap.setImmutable();
         SkBitmapCache::Add(this->getGenerationID(), info.fWidth, info.fHeight, fLockedBitmap);
     }