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 */ 29 int width() const { return fDesc.fWidth; } 30 31 /** 32 * Retrieves the height of the surface. 33 * 34 * @return the height in texels 35 */ 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 */ 41 void getBoundsRect(SkRect* rect) const { rect->setWH(SkIntToScalar(this->width()), 42 SkIntToScalar(this->height())); } 43 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 */ 55 GrPixelConfig config() const { return fDesc.fConfig; } 56 57 /** 58 * Return the descriptor describing the surface 59 */ 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 */ 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: 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