/* * 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