1/*
2 * Copyright 2016 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 SkSpecialSurface_DEFINED
9#define SkSpecialSurface_DEFINED
10
11#include "SkImageInfo.h"
12#include "SkRefCnt.h"
13#include "SkSurfaceProps.h"
14
15#if SK_SUPPORT_GPU
16#include "GrTypes.h"
17#endif
18
19class GrContext;
20class SkBitmap;
21class SkCanvas;
22class SkSpecialImage;
23
24/**
25 * SkSpecialSurface is a restricted form of SkSurface solely for internal use. It differs
26 * from SkSurface in that:
27 *     - it can be backed by GrTextures larger than [ fWidth, fHeight ]
28 *     - it can't be used for tiling
29 *     - it becomes inactive once a snapshot of it is taken (i.e., no copy-on-write)
30 *     - it has no generation ID
31 */
32class SkSpecialSurface : public SkRefCnt {
33public:
34    const SkSurfaceProps& props() const { return fProps; }
35
36    int width() const { return fSubset.width(); }
37    int height() const { return fSubset.height(); }
38
39    /**
40    *  Return a canvas that will draw into this surface. This will always
41    *  return the same canvas for a given surface, and is managed/owned by the
42    *  surface.
43    *
44    *  The canvas will be invalid after 'newImageSnapshot' is called.
45    */
46    SkCanvas* getCanvas();
47
48    /**
49    *  Returns an image of the current state of the surface pixels up to this
50    *  point. The canvas returned by 'getCanvas' becomes invalidated by this
51    *  call and no more drawing to this surface is allowed.
52    *
53    *  Note: the caller inherits a ref from this call that must be balanced
54    */
55    sk_sp<SkSpecialImage> makeImageSnapshot();
56
57#if SK_SUPPORT_GPU
58    /**
59     *  Allocate a new GPU-backed SkSpecialSurface. If the requested surface cannot
60     *  be created, nullptr will be returned.
61     */
62    static sk_sp<SkSpecialSurface> MakeRenderTarget(GrContext*,
63                                                    int width, int height,
64                                                    GrPixelConfig config,
65                                                    sk_sp<SkColorSpace> colorSpace);
66#endif
67
68    /**
69     * Use and existing SkBitmap as the backing store.
70     */
71    static sk_sp<SkSpecialSurface> MakeFromBitmap(const SkIRect& subset, SkBitmap& bm,
72                                                  const SkSurfaceProps* = nullptr);
73
74    /**
75     *  Return a new CPU-backed surface, with the memory for the pixels automatically
76     *  allocated.
77     *
78     *  If the requested surface cannot be created, or the request is not a
79     *  supported configuration, nullptr will be returned.
80     */
81    static sk_sp<SkSpecialSurface> MakeRaster(const SkImageInfo&,
82                                              const SkSurfaceProps* = nullptr);
83
84protected:
85    SkSpecialSurface(const SkIRect& subset, const SkSurfaceProps*);
86
87    // For testing only
88    friend class TestingSpecialSurfaceAccess;
89    const SkIRect& subset() const { return fSubset; }
90
91private:
92    const SkSurfaceProps fProps;
93    const SkIRect        fSubset;
94
95    typedef SkRefCnt INHERITED;
96};
97
98#endif
99