blob: 02fc0d5dea0be19e8730241cd95540916dd12bed [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
senorblanco@chromium.orgef5dbe12013-01-28 16:42:38 +000036 GrSurfaceOrigin origin() const {
senorblanco@chromium.org3cb406b2013-02-05 19:50:46 +000037 GrAssert(kTopLeft_GrSurfaceOrigin == fDesc.fOrigin || kBottomLeft_GrSurfaceOrigin == fDesc.fOrigin);
38 return fDesc.fOrigin;
bsalomon@google.com2d0bade2012-10-26 19:01:17 +000039 }
40
41 /**
robertphillips@google.com7d501ab2012-06-21 21:09:06 +000042 * Retrieves the pixel config specified when the surface was created.
43 * For render targets this can be kUnknown_GrPixelConfig
44 * if client asked us to render to a target that has a pixel
45 * config that isn't equivalent with one of our configs.
46 */
47 GrPixelConfig config() const { return fDesc.fConfig; }
48
49 /**
50 * Return the descriptor describing the surface
51 */
52 const GrTextureDesc& desc() const { return fDesc; }
53
54 /**
55 * @return the texture associated with the surface, may be NULL.
56 */
57 virtual GrTexture* asTexture() = 0;
58 virtual const GrTexture* asTexture() const = 0;
59
60 /**
61 * @return the render target underlying this surface, may be NULL.
62 */
63 virtual GrRenderTarget* asRenderTarget() = 0;
64 virtual const GrRenderTarget* asRenderTarget() const = 0;
65
66 /**
67 * Reads a rectangle of pixels from the surface.
68 * @param left left edge of the rectangle to read (inclusive)
69 * @param top top edge of the rectangle to read (inclusive)
70 * @param width width of rectangle to read in pixels.
71 * @param height height of rectangle to read in pixels.
72 * @param config the pixel config of the destination buffer
73 * @param buffer memory to read the rectangle into.
bsalomon@google.com2d0bade2012-10-26 19:01:17 +000074 * @param rowBytes number of bytes between consecutive rows. Zero means rows are tightly
bsalomon@google.com0342a852012-08-20 19:22:38 +000075 * packed.
76 * @param pixelOpsFlags See the GrContext::PixelOpsFlags enum.
robertphillips@google.com7d501ab2012-06-21 21:09:06 +000077 *
bsalomon@google.com0342a852012-08-20 19:22:38 +000078 * @return true if the read succeeded, false if not. The read can fail because of an unsupported
79 * pixel config.
robertphillips@google.com7d501ab2012-06-21 21:09:06 +000080 */
81 virtual bool readPixels(int left, int top, int width, int height,
bsalomon@google.com0342a852012-08-20 19:22:38 +000082 GrPixelConfig config,
83 void* buffer,
84 size_t rowBytes = 0,
85 uint32_t pixelOpsFlags = 0) = 0;
robertphillips@google.com7d501ab2012-06-21 21:09:06 +000086
87 /**
bsalomon@google.com0342a852012-08-20 19:22:38 +000088 * Copy the src pixels [buffer, rowbytes, pixelconfig] into the surface at the specified
89 * rectangle.
robertphillips@google.com7d501ab2012-06-21 21:09:06 +000090 * @param left left edge of the rectangle to write (inclusive)
91 * @param top top edge of the rectangle to write (inclusive)
92 * @param width width of rectangle to write in pixels.
93 * @param height height of rectangle to write in pixels.
94 * @param config the pixel config of the source buffer
95 * @param buffer memory to read the rectangle from.
bsalomon@google.com2d0bade2012-10-26 19:01:17 +000096 * @param rowBytes number of bytes between consecutive rows. Zero means rows are tightly
bsalomon@google.com0342a852012-08-20 19:22:38 +000097 * packed.
98 * @param pixelOpsFlags See the GrContext::PixelOpsFlags enum.
robertphillips@google.com7d501ab2012-06-21 21:09:06 +000099 */
100 virtual void writePixels(int left, int top, int width, int height,
bsalomon@google.com0342a852012-08-20 19:22:38 +0000101 GrPixelConfig config,
102 const void* buffer,
103 size_t rowBytes = 0,
104 uint32_t pixelOpsFlags = 0) = 0;
robertphillips@google.com7d501ab2012-06-21 21:09:06 +0000105
106protected:
senorblanco@chromium.org3cb406b2013-02-05 19:50:46 +0000107 GrSurface(GrGpu* gpu, bool isWrapped, const GrTextureDesc& desc)
bsalomon@google.com72830222013-01-23 20:25:22 +0000108 : INHERITED(gpu, isWrapped)
senorblanco@chromium.org3cb406b2013-02-05 19:50:46 +0000109 , fDesc(desc) {
robertphillips@google.com7d501ab2012-06-21 21:09:06 +0000110 }
111
bsalomon@google.com2d0bade2012-10-26 19:01:17 +0000112 GrTextureDesc fDesc;
113
robertphillips@google.com7d501ab2012-06-21 21:09:06 +0000114private:
robertphillips@google.com7d501ab2012-06-21 21:09:06 +0000115 typedef GrResource INHERITED;
116};
117
118#endif // GrSurface_DEFINED