SkDiscardablePixelRef.h revision 2ebc10dd12a6fe55fda37a9bd5b1e0c1c1e08232
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 SkDiscardablePixelRef_DEFINED 9#define SkDiscardablePixelRef_DEFINED 10 11#include "SkDiscardableMemory.h" 12#include "SkPixelRef.h" 13#include "SkImageGenerator.h" 14#include "SkImageInfo.h" 15 16/** 17 * An interface that allows a purgable PixelRef to re-decode an image. 18 */ 19 20typedef SkDiscardableMemory* (*SkDiscardableMemoryFactory)(size_t bytes); 21 22 23class SkDiscardablePixelRef : public SkPixelRef { 24public: 25 /** 26 * Takes ownership of SkImageGenerator. If this method fails for 27 * whatever reason, it will return false and immediatetely delete 28 * the generator. If it succeeds, it will modify destination 29 * bitmap. 30 * 31 * If Install fails or when the SkDiscardablePixelRef that is 32 * installed into destination is destroyed, it will call 33 * SkDELETE() on the generator. Therefore, generator should be 34 * allocated with SkNEW() or SkNEW_ARGS(). 35 * 36 * @param destination Upon success, this bitmap will be 37 * configured and have a pixelref installed. 38 * 39 * @param factory If not NULL, this object will be used as a 40 * source of discardable memory when decoding. If NULL, then 41 * SkDiscardableMemory::Create() will be called. 42 * 43 * @return true iff successful. 44 */ 45 static bool Install(SkImageGenerator* generator, 46 SkBitmap* destination, 47 SkDiscardableMemory::Factory* factory = NULL); 48 49 SK_DECLARE_UNFLATTENABLE_OBJECT() 50 51protected: 52 ~SkDiscardablePixelRef(); 53 virtual void* onLockPixels(SkColorTable**) SK_OVERRIDE; 54 virtual void onUnlockPixels() SK_OVERRIDE; 55 virtual bool onLockPixelsAreWritable() const SK_OVERRIDE { return false; } 56 57 virtual SkData* onRefEncodedData() SK_OVERRIDE { 58 return fGenerator->refEncodedData(); 59 } 60 61private: 62 SkImageGenerator* const fGenerator; 63 SkDiscardableMemory::Factory* const fDMFactory; 64 const SkImageInfo fInfo; 65 const size_t fSize; // size of memory to be allocated 66 const size_t fRowBytes; 67 // These const members should not change over the life of the 68 // PixelRef, since the SkBitmap doesn't expect them to change. 69 70 SkDiscardableMemory* fDiscardableMemory; 71 72 /* Takes ownership of SkImageGenerator. */ 73 SkDiscardablePixelRef(SkImageGenerator* generator, 74 const SkImageInfo& info, 75 size_t size, 76 size_t rowBytes, 77 SkDiscardableMemory::Factory* factory); 78}; 79#endif // SkDiscardablePixelRef_DEFINED 80