/* * 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 "SkImageGeneratorPriv.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. */ class SkDiscardablePixelRef : public SkPixelRef { public: SkDiscardableMemory* diagnostic_only_getDiscardable() const override { return fDiscardableMemory; } protected: ~SkDiscardablePixelRef(); bool onNewLockPixels(LockRec*) override; void onUnlockPixels() override; bool onLockPixelsAreWritable() const override { return false; } SkData* onRefEncodedData() override { return fGenerator->refEncodedData(); } bool onIsLazyGenerated() const override { return true; } 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; bool fDiscardableMemoryIsLocked; SkAutoTUnref fCTable; /* Takes ownership of SkImageGenerator. */ SkDiscardablePixelRef(const SkImageInfo&, SkImageGenerator*, size_t rowBytes, SkDiscardableMemory::Factory* factory); bool onQueryYUV8(SkYUVSizeInfo* sizeInfo, SkYUVColorSpace* colorSpace) const override { // If the image was already decoded with lockPixels(), favor not // re-decoding to YUV8 planes. if (fDiscardableMemory) { return false; } return fGenerator->queryYUV8(sizeInfo, colorSpace); } bool onGetYUV8Planes(const SkYUVSizeInfo& sizeInfo, void* planes[3]) override { // If the image was already decoded with lockPixels(), favor not // re-decoding to YUV8 planes. if (fDiscardableMemory) { return false; } return fGenerator->getYUV8Planes(sizeInfo, planes); } friend bool SkDEPRECATED_InstallDiscardablePixelRef(SkImageGenerator*, const SkIRect*, SkBitmap*, SkDiscardableMemory::Factory*); typedef SkPixelRef INHERITED; }; #endif // SkDiscardablePixelRef_DEFINED