Home | History | Annotate | Download | only in lazy
      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 "SkImageGeneratorPriv.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 
     24     SkDiscardableMemory* diagnostic_only_getDiscardable() const override {
     25         return fDiscardableMemory;
     26     }
     27 
     28 protected:
     29     ~SkDiscardablePixelRef();
     30 
     31     bool onNewLockPixels(LockRec*) override;
     32     void onUnlockPixels() override;
     33     bool onLockPixelsAreWritable() const override { return false; }
     34 
     35     SkData* onRefEncodedData() override {
     36         return fGenerator->refEncodedData();
     37     }
     38 
     39     bool onIsLazyGenerated() const override { return true; }
     40 
     41 private:
     42     SkImageGenerator* const fGenerator;
     43     SkDiscardableMemory::Factory* const fDMFactory;
     44     const size_t fRowBytes;
     45     // These const members should not change over the life of the
     46     // PixelRef, since the SkBitmap doesn't expect them to change.
     47 
     48     SkDiscardableMemory* fDiscardableMemory;
     49     bool                 fDiscardableMemoryIsLocked;
     50     SkAutoTUnref<SkColorTable> fCTable;
     51 
     52     /* Takes ownership of SkImageGenerator. */
     53     SkDiscardablePixelRef(const SkImageInfo&, SkImageGenerator*,
     54                           size_t rowBytes,
     55                           SkDiscardableMemory::Factory* factory);
     56 
     57     bool onGetYUV8Planes(SkISize sizes[3],
     58                          void* planes[3],
     59                          size_t rowBytes[3],
     60                          SkYUVColorSpace* colorSpace) override {
     61         // If the image was already decoded with lockPixels(), favor not
     62         // re-decoding to YUV8 planes.
     63         if (fDiscardableMemory) {
     64             return false;
     65         }
     66         return fGenerator->getYUV8Planes(sizes, planes, rowBytes, colorSpace);
     67     }
     68 
     69     friend bool SkDEPRECATED_InstallDiscardablePixelRef(SkImageGenerator*, const SkIRect*, SkBitmap*,
     70                                              SkDiscardableMemory::Factory*);
     71 
     72     typedef SkPixelRef INHERITED;
     73 };
     74 
     75 #endif  // SkDiscardablePixelRef_DEFINED
     76