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 "SkBitmapCache.h" 12 #include "SkImageInfo.h" 13 #include "SkImageGenerator.h" 14 #include "SkPixelRef.h" 15 16 class SkColorTable; 17 18 /** 19 * PixelRef which defers decoding until SkBitmap::lockPixels() is 20 * called. Caches the decoded images in the global 21 * SkScaledImageCache. When the pixels are unlocked, this cache may 22 * or be destroyed before the next lock. If so, onLockPixels will 23 * attempt to re-decode. 24 * 25 * Decoding is handled by the SkImageGenerator 26 */ 27 class SkCachingPixelRef : public SkPixelRef { 28 public: 29 SK_DECLARE_INST_COUNT(SkCachingPixelRef) 30 /** 31 * Takes ownership of SkImageGenerator. If this method fails for 32 * whatever reason, it will return false and immediatetely delete 33 * the generator. If it succeeds, it will modify destination 34 * bitmap. 35 * 36 * If Install fails or when the SkCachingPixelRef that is 37 * installed into destination is destroyed, it will call 38 * SkDELETE() on the generator. Therefore, generator should be 39 * allocated with SkNEW() or SkNEW_ARGS(). 40 */ 41 static bool Install(SkImageGenerator* gen, SkBitmap* dst); 42 43 protected: 44 virtual ~SkCachingPixelRef(); 45 bool onNewLockPixels(LockRec*) override; 46 void onUnlockPixels() override; onLockPixelsAreWritable()47 bool onLockPixelsAreWritable() const override { return false; } 48 onRefEncodedData()49 SkData* onRefEncodedData() override { 50 return fImageGenerator->refEncodedData(); 51 } 52 53 private: 54 SkImageGenerator* const fImageGenerator; 55 bool fErrorInDecoding; 56 const size_t fRowBytes; 57 58 SkBitmap fLockedBitmap; 59 60 SkCachingPixelRef(const SkImageInfo&, SkImageGenerator*, size_t rowBytes); 61 62 typedef SkPixelRef INHERITED; 63 }; 64 65 #endif // SkCachingPixelRef_DEFINED 66