1 /* 2 * Copyright 2013 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef SkCachingPixelRef_DEFINED 9 #define SkCachingPixelRef_DEFINED 10 11 #include "SkImageInfo.h" 12 #include "SkImageGenerator.h" 13 #include "SkPixelRef.h" 14 15 class SkColorTable; 16 17 /** 18 * PixelRef which defers decoding until SkBitmap::lockPixels() is 19 * called. Caches the decoded images in the global 20 * SkScaledImageCache. When the pixels are unlocked, this cache may 21 * or be destroyed before the next lock. If so, onLockPixels will 22 * attempt to re-decode. 23 * 24 * Decoding is handled by the SkImageGenerator 25 */ 26 class SkCachingPixelRef : public SkPixelRef { 27 public: 28 SK_DECLARE_INST_COUNT(SkCachingPixelRef) 29 /** 30 * Takes ownership of SkImageGenerator. If this method fails for 31 * whatever reason, it will return false and immediatetely delete 32 * the generator. If it succeeds, it will modify destination 33 * bitmap. 34 * 35 * If Install fails or when the SkCachingPixelRef that is 36 * installed into destination is destroyed, it will call 37 * SkDELETE() on the generator. Therefore, generator should be 38 * allocated with SkNEW() or SkNEW_ARGS(). 39 */ 40 static bool Install(SkImageGenerator* gen, SkBitmap* dst); 41 42 protected: 43 virtual ~SkCachingPixelRef(); 44 virtual bool onNewLockPixels(LockRec*) SK_OVERRIDE; 45 virtual void onUnlockPixels() SK_OVERRIDE; onLockPixelsAreWritable()46 virtual bool onLockPixelsAreWritable() const SK_OVERRIDE { return false; } 47 onRefEncodedData()48 virtual SkData* onRefEncodedData() SK_OVERRIDE { 49 return fImageGenerator->refEncodedData(); 50 } 51 // No need to flatten this object. When flattening an SkBitmap, 52 // SkWriteBuffer will check the encoded data and write that 53 // instead. 54 // Future implementations of SkWriteBuffer will need to 55 // special case for onRefEncodedData as well. 56 SK_DECLARE_UNFLATTENABLE_OBJECT() 57 58 private: 59 SkImageGenerator* const fImageGenerator; 60 bool fErrorInDecoding; 61 void* fScaledCacheId; 62 const size_t fRowBytes; 63 64 SkCachingPixelRef(const SkImageInfo&, SkImageGenerator*, size_t rowBytes); 65 66 typedef SkPixelRef INHERITED; 67 }; 68 69 #endif // SkCachingPixelRef_DEFINED 70