1 2 /* 3 * Copyright 2011 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 10 11 #ifndef GrTexture_DEFINED 12 #define GrTexture_DEFINED 13 14 #include "GrResource.h" 15 16 class GrRenderTarget; 17 18 class GrTexture : public GrResource { 19 20 public: 21 /** 22 * Retrieves the width of the texture. 23 * 24 * @return the width in texels 25 */ width()26 int width() const { return fWidth; } 27 28 /** 29 * Retrieves the height of the texture. 30 * 31 * @return the height in texels 32 */ height()33 int height() const { return fHeight; } 34 35 /** 36 * Convert from texels to normalized texture coords for POT textures 37 * only. 38 */ normalizeFixedX(GrFixed x)39 GrFixed normalizeFixedX(GrFixed x) const { GrAssert(GrIsPow2(fWidth)); 40 return x >> fShiftFixedX; } normalizeFixedY(GrFixed y)41 GrFixed normalizeFixedY(GrFixed y) const { GrAssert(GrIsPow2(fHeight)); 42 return y >> fShiftFixedY; } 43 44 /** 45 * Retrieves the pixel config specified when the texture was created. 46 */ config()47 GrPixelConfig config() const { return fConfig; } 48 49 /** 50 * Approximate number of bytes used by the texture 51 */ sizeInBytes()52 virtual size_t sizeInBytes() const { 53 return (size_t) fWidth * fHeight * GrBytesPerPixel(fConfig); 54 } 55 56 /** 57 * Read a rectangle of pixels from the texture. 58 * @param left left edge of the rectangle to read (inclusive) 59 * @param top top edge of the rectangle to read (inclusive) 60 * @param width width of rectangle to read in pixels. 61 * @param height height of rectangle to read in pixels. 62 * @param config the pixel config of the destination buffer 63 * @param buffer memory to read the rectangle into. 64 * @param rowBytes number of bytes bewtween consecutive rows. Zero 65 * means rows are tightly packed. 66 * 67 * @return true if the read succeeded, false if not. The read can fail 68 * because of a unsupported pixel config. 69 */ 70 bool readPixels(int left, int top, int width, int height, 71 GrPixelConfig config, void* buffer, 72 size_t rowBytes); 73 74 /** 75 * Writes a rectangle of pixels to the texture. 76 * @param left left edge of the rectangle to write (inclusive) 77 * @param top top edge of the rectangle to write (inclusive) 78 * @param width width of rectangle to write in pixels. 79 * @param height height of rectangle to write in pixels. 80 * @param config the pixel config of the source buffer 81 * @param buffer memory to read pixels from 82 * @param rowBytes number of bytes bewtween consecutive rows. Zero 83 * means rows are tightly packed. 84 */ 85 void writePixels(int left, int top, int width, int height, 86 GrPixelConfig config, const void* buffer, 87 size_t rowBytes); 88 89 /** 90 * Retrieves the render target underlying this texture that can be passed to 91 * GrGpu::setRenderTarget(). 92 * 93 * @return handle to render target or NULL if the texture is not a 94 * render target 95 */ asRenderTarget()96 GrRenderTarget* asRenderTarget() { return fRenderTarget; } 97 98 /** 99 * Removes the reference on the associated GrRenderTarget held by this 100 * texture. Afterwards asRenderTarget() will return NULL. The 101 * GrRenderTarget survives the release if another ref is held on it. 102 */ 103 void releaseRenderTarget(); 104 105 /** 106 * Return the native ID or handle to the texture, depending on the 107 * platform. e.g. on opengl, return the texture ID. 108 */ 109 virtual intptr_t getTextureHandle() const = 0; 110 111 #if GR_DEBUG validate()112 void validate() const { 113 this->INHERITED::validate(); 114 } 115 #else validate()116 void validate() const {} 117 #endif 118 119 protected: 120 GrRenderTarget* fRenderTarget; // texture refs its rt representation 121 // base class cons sets to NULL 122 // subclass cons can create and set 123 GrTexture(GrGpu * gpu,int width,int height,GrPixelConfig config)124 GrTexture(GrGpu* gpu, 125 int width, 126 int height, 127 GrPixelConfig config) 128 : INHERITED(gpu) 129 , fRenderTarget(NULL) 130 , fWidth(width) 131 , fHeight(height) 132 , fConfig(config) { 133 // only make sense if alloc size is pow2 134 fShiftFixedX = 31 - Gr_clz(fWidth); 135 fShiftFixedY = 31 - Gr_clz(fHeight); 136 } 137 138 // GrResource overrides onRelease()139 virtual void onRelease() { 140 this->releaseRenderTarget(); 141 } 142 143 virtual void onAbandon(); 144 145 private: 146 int fWidth; 147 int fHeight; 148 149 // these two shift a fixed-point value into normalized coordinates 150 // for this texture if the texture is power of two sized. 151 int fShiftFixedX; 152 int fShiftFixedY; 153 154 GrPixelConfig fConfig; 155 156 typedef GrResource INHERITED; 157 }; 158 159 #endif 160 161