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