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 "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