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 SkCachingPixelRef_DEFINED
      9 #define SkCachingPixelRef_DEFINED
     10 
     11 #include "SkBitmapCache.h"
     12 #include "SkImageInfo.h"
     13 #include "SkImageGenerator.h"
     14 #include "SkPixelRef.h"
     15 
     16 class SkColorTable;
     17 
     18 /**
     19  *  PixelRef which defers decoding until SkBitmap::lockPixels() is
     20  *  called.  Caches the decoded images in the global
     21  *  SkScaledImageCache.  When the pixels are unlocked, this cache may
     22  *  or be destroyed before the next lock.  If so, onLockPixels will
     23  *  attempt to re-decode.
     24  *
     25  *  Decoding is handled by the SkImageGenerator
     26  */
     27 class SkCachingPixelRef : public SkPixelRef {
     28 public:
     29     SK_DECLARE_INST_COUNT(SkCachingPixelRef)
     30     /**
     31      *  Takes ownership of SkImageGenerator.  If this method fails for
     32      *  whatever reason, it will return false and immediatetely delete
     33      *  the generator.  If it succeeds, it will modify destination
     34      *  bitmap.
     35      *
     36      *  If Install fails or when the SkCachingPixelRef that is
     37      *  installed into destination is destroyed, it will call
     38      *  SkDELETE() on the generator.  Therefore, generator should be
     39      *  allocated with SkNEW() or SkNEW_ARGS().
     40      */
     41     static bool Install(SkImageGenerator* gen, SkBitmap* dst);
     42 
     43 protected:
     44     virtual ~SkCachingPixelRef();
     45     virtual bool onNewLockPixels(LockRec*) SK_OVERRIDE;
     46     virtual void onUnlockPixels() SK_OVERRIDE;
     47     virtual bool onLockPixelsAreWritable() const SK_OVERRIDE { return false; }
     48 
     49     virtual SkData* onRefEncodedData() SK_OVERRIDE {
     50         return fImageGenerator->refEncodedData();
     51     }
     52 
     53 private:
     54     SkImageGenerator* const fImageGenerator;
     55     bool                    fErrorInDecoding;
     56     const size_t            fRowBytes;
     57 
     58     SkBitmap                fLockedBitmap;
     59 
     60     SkCachingPixelRef(const SkImageInfo&, SkImageGenerator*, size_t rowBytes);
     61 
     62     typedef SkPixelRef INHERITED;
     63 };
     64 
     65 #endif  // SkCachingPixelRef_DEFINED
     66