SkDiscardablePixelRef.h revision ba82bd11e2c055f885b2327aa230d2dac8b53f03
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    virtual void* onLockPixels(SkColorTable**) SK_OVERRIDE;
32    virtual void onUnlockPixels() SK_OVERRIDE;
33    virtual bool onLockPixelsAreWritable() const SK_OVERRIDE { return false; }
34
35    virtual SkData* onRefEncodedData() SK_OVERRIDE {
36        return fGenerator->refEncodedData();
37    }
38
39private:
40    SkImageGenerator* const fGenerator;
41    SkDiscardableMemory::Factory* const fDMFactory;
42    const size_t fRowBytes;
43    // These const members should not change over the life of the
44    // PixelRef, since the SkBitmap doesn't expect them to change.
45
46    SkDiscardableMemory* fDiscardableMemory;
47
48    /* Takes ownership of SkImageGenerator. */
49    SkDiscardablePixelRef(const SkImageInfo&, SkImageGenerator*,
50                          size_t rowBytes,
51                          SkDiscardableMemory::Factory* factory);
52    friend bool SkInstallDiscardablePixelRef(SkImageGenerator*,
53                                             SkBitmap*,
54                                             SkDiscardableMemory::Factory*);
55    typedef SkPixelRef INHERITED;
56};
57#endif  // SkDiscardablePixelRef_DEFINED
58