• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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