1/*
2 * Copyright 2010 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 SkGrPixelRef_DEFINED
9#define SkGrPixelRef_DEFINED
10
11#include "SkBitmap.h"
12#include "SkPixelRef.h"
13#include "GrTexture.h"
14#include "GrRenderTarget.h"
15
16
17/**
18 *  Common baseclass that implements onLockPixels() by calling onReadPixels().
19 *  Since it has a copy, it always returns false for onLockPixelsAreWritable().
20 */
21class SK_API SkROLockPixelsPixelRef : public SkPixelRef {
22public:
23    SK_DECLARE_INST_COUNT(SkROLockPixelsPixelRef)
24    SkROLockPixelsPixelRef(const SkImageInfo&);
25    virtual ~SkROLockPixelsPixelRef();
26
27protected:
28    virtual bool onNewLockPixels(LockRec*) SK_OVERRIDE;
29    virtual void onUnlockPixels() SK_OVERRIDE;
30    virtual bool onLockPixelsAreWritable() const SK_OVERRIDE;   // return false;
31
32private:
33    SkBitmap    fBitmap;
34    typedef SkPixelRef INHERITED;
35};
36
37/**
38 *  PixelRef that wraps a GrSurface
39 */
40class SK_API SkGrPixelRef : public SkROLockPixelsPixelRef {
41public:
42    SK_DECLARE_INST_COUNT(SkGrPixelRef)
43    /**
44     * Constructs a pixel ref around a GrSurface. If the caller has locked the GrSurface in the
45     * cache and would like the pixel ref to unlock it in its destructor then transferCacheLock
46     * should be set to true.
47     */
48    SkGrPixelRef(const SkImageInfo&, GrSurface*, bool transferCacheLock = false);
49    virtual ~SkGrPixelRef();
50
51    // override from SkPixelRef
52    virtual GrTexture* getTexture() SK_OVERRIDE;
53
54    SK_DECLARE_UNFLATTENABLE_OBJECT()
55
56protected:
57    // overrides from SkPixelRef
58    virtual bool onReadPixels(SkBitmap* dst, const SkIRect* subset) SK_OVERRIDE;
59    virtual SkPixelRef* deepCopy(SkColorType, const SkIRect* subset) SK_OVERRIDE;
60
61private:
62    GrSurface*  fSurface;
63    bool        fUnlock;   // if true the pixel ref owns a texture cache lock on fSurface
64
65    typedef SkROLockPixelsPixelRef INHERITED;
66};
67
68#endif
69