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