SkDiscardablePixelRef.h revision f1ce05288a8fee6e691c3dff5db9dcd47818060f
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 *  Since SkColorTable is reference-counted, we do not support indexed
22 *  color with this class; there would be no way for the discardable
23 *  memory system to unref the color table.
24 */
25class SkDiscardablePixelRef : public SkPixelRef {
26public:
27    SK_DECLARE_UNFLATTENABLE_OBJECT()
28
29protected:
30    ~SkDiscardablePixelRef();
31
32    virtual bool onNewLockPixels(LockRec*) SK_OVERRIDE;
33    virtual void onUnlockPixels() SK_OVERRIDE;
34    virtual bool onLockPixelsAreWritable() const SK_OVERRIDE { return false; }
35
36    virtual SkData* onRefEncodedData() SK_OVERRIDE {
37        return fGenerator->refEncodedData();
38    }
39
40private:
41    SkImageGenerator* const fGenerator;
42    SkDiscardableMemory::Factory* const fDMFactory;
43    const size_t fRowBytes;
44    // These const members should not change over the life of the
45    // PixelRef, since the SkBitmap doesn't expect them to change.
46
47    SkDiscardableMemory* fDiscardableMemory;
48
49    /* Takes ownership of SkImageGenerator. */
50    SkDiscardablePixelRef(const SkImageInfo&, SkImageGenerator*,
51                          size_t rowBytes,
52                          SkDiscardableMemory::Factory* factory);
53
54    friend bool SkInstallDiscardablePixelRef(SkImageGenerator*,
55                                             SkBitmap*,
56                                             SkDiscardableMemory::Factory*);
57
58    typedef SkPixelRef INHERITED;
59};
60
61#endif  // SkDiscardablePixelRef_DEFINED
62