| |
| /* |
| * Copyright 2011 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| |
| |
| #ifndef GrTexture_DEFINED |
| #define GrTexture_DEFINED |
| |
| #include "GrResource.h" |
| |
| class GrRenderTarget; |
| |
| class GrTexture : public GrResource { |
| |
| public: |
| /** |
| * Retrieves the width of the texture. |
| * |
| * @return the width in texels |
| */ |
| int width() const { return fWidth; } |
| |
| /** |
| * Retrieves the height of the texture. |
| * |
| * @return the height in texels |
| */ |
| int height() const { return fHeight; } |
| |
| /** |
| * Convert from texels to normalized texture coords for POT textures |
| * only. |
| */ |
| GrFixed normalizeFixedX(GrFixed x) const { GrAssert(GrIsPow2(fWidth)); |
| return x >> fShiftFixedX; } |
| GrFixed normalizeFixedY(GrFixed y) const { GrAssert(GrIsPow2(fHeight)); |
| return y >> fShiftFixedY; } |
| |
| /** |
| * Retrieves the pixel config specified when the texture was created. |
| */ |
| GrPixelConfig config() const { return fConfig; } |
| |
| /** |
| * Approximate number of bytes used by the texture |
| */ |
| virtual size_t sizeInBytes() const { |
| return (size_t) fWidth * fHeight * GrBytesPerPixel(fConfig); |
| } |
| |
| /** |
| * Read a rectangle of pixels from the texture. |
| * @param left left edge of the rectangle to read (inclusive) |
| * @param top top edge of the rectangle to read (inclusive) |
| * @param width width of rectangle to read in pixels. |
| * @param height height of rectangle to read in pixels. |
| * @param config the pixel config of the destination buffer |
| * @param buffer memory to read the rectangle into. |
| * @param rowBytes number of bytes bewtween consecutive rows. Zero |
| * means rows are tightly packed. |
| * |
| * @return true if the read succeeded, false if not. The read can fail |
| * because of a unsupported pixel config. |
| */ |
| bool readPixels(int left, int top, int width, int height, |
| GrPixelConfig config, void* buffer, |
| size_t rowBytes); |
| |
| /** |
| * Writes a rectangle of pixels to the texture. |
| * @param left left edge of the rectangle to write (inclusive) |
| * @param top top edge of the rectangle to write (inclusive) |
| * @param width width of rectangle to write in pixels. |
| * @param height height of rectangle to write in pixels. |
| * @param config the pixel config of the source buffer |
| * @param buffer memory to read pixels from |
| * @param rowBytes number of bytes bewtween consecutive rows. Zero |
| * means rows are tightly packed. |
| */ |
| void writePixels(int left, int top, int width, int height, |
| GrPixelConfig config, const void* buffer, |
| size_t rowBytes); |
| |
| /** |
| * Retrieves the render target underlying this texture that can be passed to |
| * GrGpu::setRenderTarget(). |
| * |
| * @return handle to render target or NULL if the texture is not a |
| * render target |
| */ |
| GrRenderTarget* asRenderTarget() { return fRenderTarget; } |
| |
| /** |
| * Removes the reference on the associated GrRenderTarget held by this |
| * texture. Afterwards asRenderTarget() will return NULL. The |
| * GrRenderTarget survives the release if another ref is held on it. |
| */ |
| void releaseRenderTarget(); |
| |
| /** |
| * Return the native ID or handle to the texture, depending on the |
| * platform. e.g. on opengl, return the texture ID. |
| */ |
| virtual intptr_t getTextureHandle() const = 0; |
| |
| #if GR_DEBUG |
| void validate() const { |
| this->INHERITED::validate(); |
| } |
| #else |
| void validate() const {} |
| #endif |
| |
| protected: |
| GrRenderTarget* fRenderTarget; // texture refs its rt representation |
| // base class cons sets to NULL |
| // subclass cons can create and set |
| |
| GrTexture(GrGpu* gpu, |
| int width, |
| int height, |
| GrPixelConfig config) |
| : INHERITED(gpu) |
| , fRenderTarget(NULL) |
| , fWidth(width) |
| , fHeight(height) |
| , fConfig(config) { |
| // only make sense if alloc size is pow2 |
| fShiftFixedX = 31 - Gr_clz(fWidth); |
| fShiftFixedY = 31 - Gr_clz(fHeight); |
| } |
| |
| // GrResource overrides |
| virtual void onRelease() { |
| this->releaseRenderTarget(); |
| } |
| |
| virtual void onAbandon(); |
| |
| private: |
| int fWidth; |
| int fHeight; |
| |
| // these two shift a fixed-point value into normalized coordinates |
| // for this texture if the texture is power of two sized. |
| int fShiftFixedX; |
| int fShiftFixedY; |
| |
| GrPixelConfig fConfig; |
| |
| typedef GrResource INHERITED; |
| }; |
| |
| #endif |
| |