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 16class 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 */ 27class SkCachingPixelRef : public SkPixelRef { 28public: 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 43protected: 44 virtual ~SkCachingPixelRef(); 45 virtual bool onNewLockPixels(LockRec*) SK_OVERRIDE; 46 virtual void onUnlockPixels() SK_OVERRIDE; 47 virtual bool onLockPixelsAreWritable() const SK_OVERRIDE { return false; } 48 49 virtual SkData* onRefEncodedData() SK_OVERRIDE { 50 return fImageGenerator->refEncodedData(); 51 } 52 53private: 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