/* * 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 "SkImageGenerator.h" #include "SkImageInfo.h" #include "SkPixelRef.h" /** * A PixelRef backed by SkDiscardableMemory, with the ability to * re-generate the pixels (via a SkImageGenerator) if the DM is * purged. * * Since SkColorTable is reference-counted, we do not support indexed * color with this class; there would be no way for the discardable * memory system to unref the color table. */ class SkDiscardablePixelRef : public SkPixelRef { public: SK_DECLARE_INST_COUNT(SkDiscardablePixelRef) SK_DECLARE_UNFLATTENABLE_OBJECT() protected: ~SkDiscardablePixelRef(); virtual bool onNewLockPixels(LockRec*) 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 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(const SkImageInfo&, SkImageGenerator*, size_t rowBytes, SkDiscardableMemory::Factory* factory); friend bool SkInstallDiscardablePixelRef(SkImageGenerator*, SkBitmap*, SkDiscardableMemory::Factory*); typedef SkPixelRef INHERITED; }; #endif // SkDiscardablePixelRef_DEFINED