SkCachingPixelRef.h revision 27f890219b09e4774da75e6a11ec82849eadae5a
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 15class 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 */ 26class SkCachingPixelRef : public SkPixelRef { 27public: 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 41protected: 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 57private: 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