| |
| /* |
| * 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 "GrSurface.h" |
| |
| class GrRenderTarget; |
| class GrResourceKey; |
| class GrTextureParams; |
| |
| class GrTexture : public GrSurface { |
| |
| public: |
| SK_DECLARE_INST_COUNT(GrTexture) |
| // from GrResource |
| /** |
| * Informational texture flags |
| */ |
| enum FlagBits { |
| kFirstBit = (kLastPublic_GrTextureFlagBit << 1), |
| |
| /** |
| * This texture should be returned to the texture cache when |
| * it is no longer reffed |
| */ |
| kReturnToCache_FlagBit = kFirstBit, |
| }; |
| |
| void setFlag(GrTextureFlags flags) { |
| fDesc.fFlags = fDesc.fFlags | flags; |
| } |
| void resetFlag(GrTextureFlags flags) { |
| fDesc.fFlags = fDesc.fFlags & ~flags; |
| } |
| bool isSetFlag(GrTextureFlags flags) const { |
| return 0 != (fDesc.fFlags & flags); |
| } |
| |
| /** |
| * Approximate number of bytes used by the texture |
| */ |
| virtual size_t sizeInBytes() const SK_OVERRIDE { |
| return (size_t) fDesc.fWidth * |
| fDesc.fHeight * |
| GrBytesPerPixel(fDesc.fConfig); |
| } |
| |
| // GrSurface overrides |
| virtual bool readPixels(int left, int top, int width, int height, |
| GrPixelConfig config, |
| void* buffer, |
| size_t rowBytes = 0, |
| uint32_t pixelOpsFlags = 0) SK_OVERRIDE; |
| |
| virtual void writePixels(int left, int top, int width, int height, |
| GrPixelConfig config, |
| const void* buffer, |
| size_t rowBytes = 0, |
| uint32_t pixelOpsFlags = 0) SK_OVERRIDE; |
| |
| /** |
| * @return this texture |
| */ |
| virtual GrTexture* asTexture() SK_OVERRIDE { return this; } |
| virtual const GrTexture* asTexture() const SK_OVERRIDE { return this; } |
| |
| /** |
| * 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 |
| */ |
| virtual GrRenderTarget* asRenderTarget() SK_OVERRIDE { |
| return fRenderTarget; |
| } |
| virtual const GrRenderTarget* asRenderTarget() const SK_OVERRIDE { |
| return fRenderTarget; |
| } |
| |
| // GrTexture |
| /** |
| * Convert from texels to normalized texture coords for POT textures |
| * only. |
| */ |
| GrFixed normalizeFixedX(GrFixed x) const { |
| GrAssert(GrIsPow2(fDesc.fWidth)); |
| return x >> fShiftFixedX; |
| } |
| GrFixed normalizeFixedY(GrFixed y) const { |
| GrAssert(GrIsPow2(fDesc.fHeight)); |
| return y >> fShiftFixedY; |
| } |
| |
| /** |
| * 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 GrBackendObject getTextureHandle() const = 0; |
| |
| /** |
| * Call this when the state of the native API texture object is |
| * altered directly, without being tracked by skia. |
| */ |
| virtual void invalidateCachedState() = 0; |
| |
| #if GR_DEBUG |
| void validate() const { |
| this->INHERITED::validate(); |
| |
| this->validateDesc(); |
| } |
| #else |
| void validate() const {} |
| #endif |
| static GrResourceKey ComputeKey(const GrGpu* gpu, |
| const GrTextureParams* params, |
| const GrTextureDesc& desc, |
| const GrCacheID& cacheID); |
| static GrResourceKey ComputeScratchKey(const GrTextureDesc& desc); |
| static bool NeedsResizing(const GrResourceKey& key); |
| static bool NeedsFiltering(const GrResourceKey& key); |
| |
| protected: |
| GrRenderTarget* fRenderTarget; // texture refs its rt representation |
| // base class cons sets to NULL |
| // subclass cons can create and set |
| |
| GrTexture(GrGpu* gpu, bool isWrapped, const GrTextureDesc& desc, GrSurfaceOrigin origin) |
| : INHERITED(gpu, isWrapped, desc, origin) |
| , fRenderTarget(NULL) { |
| |
| // only make sense if alloc size is pow2 |
| fShiftFixedX = 31 - SkCLZ(fDesc.fWidth); |
| fShiftFixedY = 31 - SkCLZ(fDesc.fHeight); |
| } |
| |
| // GrResource overrides |
| virtual void onRelease() SK_OVERRIDE; |
| virtual void onAbandon() SK_OVERRIDE; |
| |
| void validateDesc() const; |
| |
| private: |
| // 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; |
| |
| virtual void internal_dispose() const SK_OVERRIDE; |
| |
| typedef GrSurface INHERITED; |
| }; |
| |
| #endif |