blob: 2d39b5e10bd54ed2f5bb88d75e805d568feb3785 [file] [log] [blame]
robertphillips@google.com7d501ab2012-06-21 21:09:06 +00001/*
2 * Copyright 2012 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
9#ifndef GrSurface_DEFINED
10#define GrSurface_DEFINED
11
12#include "GrTypes.h"
13#include "GrResource.h"
14
15class GrTexture;
16class GrRenderTarget;
17
18class GrSurface : public GrResource {
19public:
20 SK_DECLARE_INST_COUNT(GrSurface);
21
22 /**
23 * Retrieves the width of the surface.
24 *
25 * @return the width in texels
26 */
27 int width() const { return fDesc.fWidth; }
28
29 /**
30 * Retrieves the height of the surface.
31 *
32 * @return the height in texels
33 */
34 int height() const { return fDesc.fHeight; }
35
36 /**
37 * Retrieves the pixel config specified when the surface was created.
38 * For render targets this can be kUnknown_GrPixelConfig
39 * if client asked us to render to a target that has a pixel
40 * config that isn't equivalent with one of our configs.
41 */
42 GrPixelConfig config() const { return fDesc.fConfig; }
43
44 /**
45 * Return the descriptor describing the surface
46 */
47 const GrTextureDesc& desc() const { return fDesc; }
48
49 /**
50 * @return the texture associated with the surface, may be NULL.
51 */
52 virtual GrTexture* asTexture() = 0;
53 virtual const GrTexture* asTexture() const = 0;
54
55 /**
56 * @return the render target underlying this surface, may be NULL.
57 */
58 virtual GrRenderTarget* asRenderTarget() = 0;
59 virtual const GrRenderTarget* asRenderTarget() const = 0;
60
61 /**
62 * Reads a rectangle of pixels from the surface.
63 * @param left left edge of the rectangle to read (inclusive)
64 * @param top top edge of the rectangle to read (inclusive)
65 * @param width width of rectangle to read in pixels.
66 * @param height height of rectangle to read in pixels.
67 * @param config the pixel config of the destination buffer
68 * @param buffer memory to read the rectangle into.
69 * @param rowBytes number of bytes bewtween consecutive rows. Zero
70 * means rows are tightly packed.
71 *
72 * @return true if the read succeeded, false if not. The read can fail
73 * because of an unsupported pixel config.
74 */
75 virtual bool readPixels(int left, int top, int width, int height,
76 GrPixelConfig config, void* buffer,
77 size_t rowBytes) = 0;
78
79 /**
80 * Copy the src pixels [buffer, rowbytes, pixelconfig] into the surface
81 * at the specified rectangle.
82 * @param left left edge of the rectangle to write (inclusive)
83 * @param top top edge of the rectangle to write (inclusive)
84 * @param width width of rectangle to write in pixels.
85 * @param height height of rectangle to write in pixels.
86 * @param config the pixel config of the source buffer
87 * @param buffer memory to read the rectangle from.
88 * @param rowBytes number of bytes bewtween consecutive rows. Zero
89 * means rows are tightly packed.
90 */
91 virtual void writePixels(int left, int top, int width, int height,
92 GrPixelConfig config, const void* buffer,
93 size_t rowBytes) = 0;
94
95protected:
96 GrTextureDesc fDesc;
97
98 GrSurface(GrGpu* gpu, const GrTextureDesc& desc)
99 : INHERITED(gpu)
100 , fDesc(desc) {
101 }
102
103private:
104 typedef GrResource INHERITED;
105};
106
107#endif // GrSurface_DEFINED