• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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 #include "SkRect.h"
15 
16 class GrTexture;
17 class GrRenderTarget;
18 struct SkImageInfo;
19 
20 class GrSurface : public GrResource {
21 public:
22     SK_DECLARE_INST_COUNT(GrSurface);
23 
24     /**
25      * Retrieves the width of the surface.
26      *
27      * @return the width in texels
28      */
width()29     int width() const { return fDesc.fWidth; }
30 
31     /**
32      * Retrieves the height of the surface.
33      *
34      * @return the height in texels
35      */
height()36     int height() const { return fDesc.fHeight; }
37 
38     /**
39      * Helper that gets the width and height of the surface as a bounding rectangle.
40      */
getBoundsRect(SkRect * rect)41     void getBoundsRect(SkRect* rect) const { rect->setWH(SkIntToScalar(this->width()),
42                                                          SkIntToScalar(this->height())); }
43 
origin()44     GrSurfaceOrigin origin() const {
45         SkASSERT(kTopLeft_GrSurfaceOrigin == fDesc.fOrigin || kBottomLeft_GrSurfaceOrigin == fDesc.fOrigin);
46         return fDesc.fOrigin;
47     }
48 
49     /**
50      * Retrieves the pixel config specified when the surface was created.
51      * For render targets this can be kUnknown_GrPixelConfig
52      * if client asked us to render to a target that has a pixel
53      * config that isn't equivalent with one of our configs.
54      */
config()55     GrPixelConfig config() const { return fDesc.fConfig; }
56 
57     /**
58      * Return the descriptor describing the surface
59      */
desc()60     const GrTextureDesc& desc() const { return fDesc; }
61 
62     void asImageInfo(SkImageInfo*) const;
63 
64     /**
65      * @return the texture associated with the surface, may be NULL.
66      */
67     virtual GrTexture* asTexture() = 0;
68     virtual const GrTexture* asTexture() const = 0;
69 
70     /**
71      * @return the render target underlying this surface, may be NULL.
72      */
73     virtual GrRenderTarget* asRenderTarget() = 0;
74     virtual const GrRenderTarget* asRenderTarget() const = 0;
75 
76     /**
77      * Checks whether this GrSurface refers to the same GPU object as other. This
78      * catches the case where a GrTexture and GrRenderTarget refer to the same
79      * GPU memory.
80      */
isSameAs(const GrSurface * other)81     bool isSameAs(const GrSurface* other) const {
82         const GrRenderTarget* thisRT = this->asRenderTarget();
83         if (NULL != thisRT) {
84             return thisRT == other->asRenderTarget();
85         } else {
86             const GrTexture* thisTex = this->asTexture();
87             SkASSERT(NULL != thisTex); // We must be one or the other
88             return thisTex == other->asTexture();
89         }
90     }
91 
92     /**
93      * Reads a rectangle of pixels from the surface.
94      * @param left          left edge of the rectangle to read (inclusive)
95      * @param top           top edge of the rectangle to read (inclusive)
96      * @param width         width of rectangle to read in pixels.
97      * @param height        height of rectangle to read in pixels.
98      * @param config        the pixel config of the destination buffer
99      * @param buffer        memory to read the rectangle into.
100      * @param rowBytes      number of bytes between consecutive rows. Zero means rows are tightly
101      *                      packed.
102      * @param pixelOpsFlags See the GrContext::PixelOpsFlags enum.
103      *
104      * @return true if the read succeeded, false if not. The read can fail because of an unsupported
105      *              pixel config.
106      */
107     virtual bool readPixels(int left, int top, int width, int height,
108                             GrPixelConfig config,
109                             void* buffer,
110                             size_t rowBytes = 0,
111                             uint32_t pixelOpsFlags = 0) = 0;
112 
113     /**
114      * Copy the src pixels [buffer, rowbytes, pixelconfig] into the surface at the specified
115      * rectangle.
116      * @param left          left edge of the rectangle to write (inclusive)
117      * @param top           top edge of the rectangle to write (inclusive)
118      * @param width         width of rectangle to write in pixels.
119      * @param height        height of rectangle to write in pixels.
120      * @param config        the pixel config of the source buffer
121      * @param buffer        memory to read the rectangle from.
122      * @param rowBytes      number of bytes between consecutive rows. Zero means rows are tightly
123      *                      packed.
124      * @param pixelOpsFlags See the GrContext::PixelOpsFlags enum.
125      */
126     virtual void writePixels(int left, int top, int width, int height,
127                              GrPixelConfig config,
128                              const void* buffer,
129                              size_t rowBytes = 0,
130                              uint32_t pixelOpsFlags = 0) = 0;
131 
132     /**
133      * Write the contents of the surface to a PNG. Returns true if successful.
134      * @param filename      Full path to desired file
135      */
136     bool savePixels(const char* filename);
137 
138 protected:
GrSurface(GrGpu * gpu,bool isWrapped,const GrTextureDesc & desc)139     GrSurface(GrGpu* gpu, bool isWrapped, const GrTextureDesc& desc)
140     : INHERITED(gpu, isWrapped)
141     , fDesc(desc) {
142     }
143 
144     GrTextureDesc fDesc;
145 
146 private:
147     typedef GrResource INHERITED;
148 };
149 
150 #endif // GrSurface_DEFINED
151