| halcanary@google.com | ad04eb4 | 2013-11-21 15:32:08 +0000 | [diff] [blame^] | 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 "SkPixelRef.h" | 
|  | 12 | #include "SkImageGenerator.h" | 
|  | 13 | #include "SkImageInfo.h" | 
|  | 14 |  | 
|  | 15 | class SkDiscardableMemory; | 
|  | 16 |  | 
|  | 17 | /** | 
|  | 18 | * An interface that allows a purgable PixelRef to re-decode an image. | 
|  | 19 | */ | 
|  | 20 |  | 
|  | 21 | class SkDiscardablePixelRef : public SkPixelRef { | 
|  | 22 | public: | 
|  | 23 | /** | 
|  | 24 | *  Takes ownership of SkImageGenerator.  If this method fails for | 
|  | 25 | *  whatever reason, it will return false and immediatetely delete | 
|  | 26 | *  the generator.  If it succeeds, it will modify destination | 
|  | 27 | *  bitmap. | 
|  | 28 | * | 
|  | 29 | *  If Install fails or when the SkDiscardablePixelRef that is | 
|  | 30 | *  installed into destination is destroyed, it will call | 
|  | 31 | *  SkDELETE() on the generator.  Therefore, generator should be | 
|  | 32 | *  allocated with SkNEW() or SkNEW_ARGS(). | 
|  | 33 | */ | 
|  | 34 | static bool Install(SkImageGenerator* generator, SkBitmap* destination); | 
|  | 35 |  | 
|  | 36 | SK_DECLARE_UNFLATTENABLE_OBJECT() | 
|  | 37 |  | 
|  | 38 | protected: | 
|  | 39 | ~SkDiscardablePixelRef(); | 
|  | 40 | virtual void* onLockPixels(SkColorTable**) SK_OVERRIDE; | 
|  | 41 | virtual void onUnlockPixels() SK_OVERRIDE; | 
|  | 42 | virtual bool onLockPixelsAreWritable() const SK_OVERRIDE { return false; } | 
|  | 43 |  | 
|  | 44 | virtual SkData* onRefEncodedData() SK_OVERRIDE { | 
|  | 45 | return fGenerator->refEncodedData(); | 
|  | 46 | } | 
|  | 47 |  | 
|  | 48 | private: | 
|  | 49 | SkImageGenerator* const fGenerator; | 
|  | 50 | const SkImageInfo fInfo; | 
|  | 51 | const size_t fSize;  // size of memory to be allocated | 
|  | 52 | const size_t fRowBytes; | 
|  | 53 | // These const members should not change over the life of the | 
|  | 54 | // PixelRef, since the SkBitmap doesn't expect them to change. | 
|  | 55 |  | 
|  | 56 | SkDiscardableMemory* fDiscardableMemory; | 
|  | 57 |  | 
|  | 58 | /* Takes ownership of SkImageGenerator. */ | 
|  | 59 | SkDiscardablePixelRef(SkImageGenerator* generator, | 
|  | 60 | const SkImageInfo& info, | 
|  | 61 | size_t size, | 
|  | 62 | size_t rowBytes); | 
|  | 63 | }; | 
|  | 64 | #endif  // SkDiscardablePixelRef_DEFINED |