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 
19 class GrContext;
20 class SkBitmap;
21 class SkCanvas;
22 class 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  */
32 class SkSpecialSurface : public SkRefCnt {
33 public:
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 
84 protected:
85     SkSpecialSurface(const SkIRect& subset, const SkSurfaceProps*);
86 
87     // For testing only
88     friend class TestingSpecialSurfaceAccess;
89     const SkIRect& subset() const { return fSubset; }
90 
91 private:
92     const SkSurfaceProps fProps;
93     const SkIRect        fSubset;
94 
95     typedef SkRefCnt INHERITED;
96 };
97 
98 #endif
99