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 "SkImageGenerator.h" 13 #include "SkImageInfo.h" 14 #include "SkPixelRef.h" 15 16 /** 17 * A PixelRef backed by SkDiscardableMemory, with the ability to 18 * re-generate the pixels (via a SkImageGenerator) if the DM is 19 * purged. 20 */ 21 class SkDiscardablePixelRef : public SkPixelRef { 22 public: 23 SK_DECLARE_INST_COUNT(SkDiscardablePixelRef) 24 25 protected: 26 ~SkDiscardablePixelRef(); 27 28 bool onNewLockPixels(LockRec*) override; 29 void onUnlockPixels() override; 30 bool onLockPixelsAreWritable() const override { return false; } 31 32 SkData* onRefEncodedData() override { 33 return fGenerator->refEncodedData(); 34 } 35 36 private: 37 SkImageGenerator* const fGenerator; 38 SkDiscardableMemory::Factory* const fDMFactory; 39 const size_t fRowBytes; 40 // These const members should not change over the life of the 41 // PixelRef, since the SkBitmap doesn't expect them to change. 42 43 SkDiscardableMemory* fDiscardableMemory; 44 bool fDiscardableMemoryIsLocked; 45 SkAutoTUnref<SkColorTable> fCTable; 46 47 /* Takes ownership of SkImageGenerator. */ 48 SkDiscardablePixelRef(const SkImageInfo&, SkImageGenerator*, 49 size_t rowBytes, 50 SkDiscardableMemory::Factory* factory); 51 52 bool onGetYUV8Planes(SkISize sizes[3], 53 void* planes[3], 54 size_t rowBytes[3], 55 SkYUVColorSpace* colorSpace) override { 56 // If the image was already decoded with lockPixels(), favor not 57 // re-decoding to YUV8 planes. 58 if (fDiscardableMemory) { 59 return false; 60 } 61 return fGenerator->getYUV8Planes(sizes, planes, rowBytes, colorSpace); 62 } 63 64 friend bool SkInstallDiscardablePixelRef(SkImageGenerator*, SkBitmap*, 65 SkDiscardableMemory::Factory*); 66 67 typedef SkPixelRef INHERITED; 68 }; 69 70 #endif // SkDiscardablePixelRef_DEFINED 71