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 /** 29 * Takes ownership of SkImageGenerator. If this method fails for 30 * whatever reason, it will return false and immediatetely delete 31 * the generator. If it succeeds, it will modify destination 32 * bitmap. 33 * 34 * If Install fails or when the SkCachingPixelRef that is 35 * installed into destination is destroyed, it will call 36 * SkDELETE() on the generator. Therefore, generator should be 37 * allocated with SkNEW() or SkNEW_ARGS(). 38 */ 39 static bool Install(SkImageGenerator* gen, SkBitmap* dst); 40 41 protected: 42 virtual ~SkCachingPixelRef(); 43 virtual void* onLockPixels(SkColorTable** colorTable) SK_OVERRIDE; 44 virtual void onUnlockPixels() SK_OVERRIDE; 45 virtual bool onLockPixelsAreWritable() const SK_OVERRIDE { return false; } 46 47 virtual SkData* onRefEncodedData() SK_OVERRIDE { 48 return fImageGenerator->refEncodedData(); 49 } 50 // No need to flatten this object. When flattening an SkBitmap, 51 // SkOrderedWriteBuffer will check the encoded data and write that 52 // instead. 53 // Future implementations of SkFlattenableWriteBuffer will need to 54 // special case for onRefEncodedData as well. 55 SK_DECLARE_UNFLATTENABLE_OBJECT() 56 57 private: 58 SkImageGenerator* const fImageGenerator; 59 bool fErrorInDecoding; 60 void* fScaledCacheId; 61 const size_t fRowBytes; 62 63 SkCachingPixelRef(const SkImageInfo&, SkImageGenerator*, size_t rowBytes); 64 65 typedef SkPixelRef INHERITED; 66 }; 67 68 #endif // SkCachingPixelRef_DEFINED 69