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 */
21class SkDiscardablePixelRef : public SkPixelRef {
22public:
23    SK_DECLARE_INST_COUNT(SkDiscardablePixelRef)
24    SK_DECLARE_UNFLATTENABLE_OBJECT()
25
26protected:
27    ~SkDiscardablePixelRef();
28
29    virtual bool onNewLockPixels(LockRec*) SK_OVERRIDE;
30    virtual void onUnlockPixels() SK_OVERRIDE;
31    virtual bool onLockPixelsAreWritable() const SK_OVERRIDE { return false; }
32
33    virtual SkData* onRefEncodedData() SK_OVERRIDE {
34        return fGenerator->refEncodedData();
35    }
36
37private:
38    SkImageGenerator* const fGenerator;
39    SkDiscardableMemory::Factory* const fDMFactory;
40    const size_t fRowBytes;
41    // These const members should not change over the life of the
42    // PixelRef, since the SkBitmap doesn't expect them to change.
43
44    SkDiscardableMemory* fDiscardableMemory;
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    friend bool SkInstallDiscardablePixelRef(SkImageGenerator*, SkBitmap*,
53                                             SkDiscardableMemory::Factory*);
54
55    typedef SkPixelRef INHERITED;
56};
57
58#endif  // SkDiscardablePixelRef_DEFINED
59