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
16class 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 */
27class SkCachingPixelRef : public SkPixelRef {
28public:
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
43protected:
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
53private:
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