blob: 5a86b0881bab0a0df0af2d3eaf0d5a3a3be6dc2f [file] [log] [blame]
/*
* 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; }
/**
* Retrieves the allocated width. It may differ from width for
* NPOT or min-RT size reasons.
* @return allocated width in texels
*/
int allocatedWidth() const { return fAllocatedWidth; }
/**
* Retrieves the allocated height. It may differ from height for
* NPOT or min-RT size reasons.
* @return allocated height in texels
*/
int allocatedHeight() const { return fAllocatedHeight; }
/**
* 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) fAllocatedWidth *
fAllocatedHeight *
GrBytesPerPixel(fConfig);
}
/**
* Updates a subrectangle of texels in the texture.
*
* @param x left edge of rectangle to update
* @param y top edge of rectangle to update
* @param width width of rectangle to update
* @param height height of rectangle to update
* @param srcData width*height texels of data in same format that was
* used at texture creation.
* @param rowBytes number of bytes per row in srcData, 0 means rows are
* packed
*/
virtual void uploadTextureData(int x,
int y,
int width,
int height,
const void* srcData,
size_t rowBytes) = 0;
/**
* Reads 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.
*
* @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);
/**
* 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,
int allocatedWidth,
int allocatedHeight,
GrPixelConfig config)
: INHERITED(gpu)
, fRenderTarget(NULL)
, fWidth(width)
, fHeight(height)
, fAllocatedWidth(allocatedWidth)
, fAllocatedHeight(allocatedHeight)
, 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;
int fAllocatedWidth;
int fAllocatedHeight;
// 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