/* * Copyright 2013 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkDiscardablePixelRef_DEFINED #define SkDiscardablePixelRef_DEFINED #include "SkDiscardableMemory.h" #include "SkPixelRef.h" #include "SkImageGenerator.h" #include "SkImageInfo.h" /** * An interface that allows a purgable PixelRef to re-decode an image. */ typedef SkDiscardableMemory* (*SkDiscardableMemoryFactory)(size_t bytes); class SkDiscardablePixelRef : public SkPixelRef { public: /** * Takes ownership of SkImageGenerator. If this method fails for * whatever reason, it will return false and immediatetely delete * the generator. If it succeeds, it will modify destination * bitmap. * * If Install fails or when the SkDiscardablePixelRef that is * installed into destination is destroyed, it will call * SkDELETE() on the generator. Therefore, generator should be * allocated with SkNEW() or SkNEW_ARGS(). * * @param destination Upon success, this bitmap will be * configured and have a pixelref installed. * * @param factory If not NULL, this object will be used as a * source of discardable memory when decoding. If NULL, then * SkDiscardableMemory::Create() will be called. * * @return true iff successful. */ static bool Install(SkImageGenerator* generator, SkBitmap* destination, SkDiscardableMemory::Factory* factory = NULL); SK_DECLARE_UNFLATTENABLE_OBJECT() protected: ~SkDiscardablePixelRef(); virtual void* onLockPixels(SkColorTable**) SK_OVERRIDE; virtual void onUnlockPixels() SK_OVERRIDE; virtual bool onLockPixelsAreWritable() const SK_OVERRIDE { return false; } virtual SkData* onRefEncodedData() SK_OVERRIDE { return fGenerator->refEncodedData(); } private: SkImageGenerator* const fGenerator; SkDiscardableMemory::Factory* const fDMFactory; const SkImageInfo fInfo; const size_t fSize; // size of memory to be allocated const size_t fRowBytes; // These const members should not change over the life of the // PixelRef, since the SkBitmap doesn't expect them to change. SkDiscardableMemory* fDiscardableMemory; /* Takes ownership of SkImageGenerator. */ SkDiscardablePixelRef(SkImageGenerator* generator, const SkImageInfo& info, size_t size, size_t rowBytes, SkDiscardableMemory::Factory* factory); }; #endif // SkDiscardablePixelRef_DEFINED