4 #define CHAN_SRC( t, i, j, k, sz ) \
5 ((GLchan *)(t)->Data + (i) * (sz))
6 #define UBYTE_SRC( t, i, j, k, sz ) \
7 ((GLubyte *)(t)->Data + (i) * (sz))
8 #define USHORT_SRC( t, i, j, k ) \
9 ((GLushort *)(t)->Data + (i))
10 #define FLOAT_SRC( t, i, j, k ) \
11 ((GLfloat *)(t)->Data + (i))
13 #define FETCH(x) fetch_1d_texel_##x
17 #define CHAN_SRC( t, i, j, k, sz ) \
18 ((GLchan *)(t)->Data + ((t)->Width * (j) + (i)) * (sz))
19 #define UBYTE_SRC( t, i, j, k, sz ) \
20 ((GLubyte *)(t)->Data + ((t)->Width * (j) + (i)) * (sz))
21 #define USHORT_SRC( t, i, j, k ) \
22 ((GLushort *)(t)->Data + ((t)->Width * (j) + (i)))
23 #define FLOAT_SRC( t, i, j, k ) \
24 ((GLfloat *)(t)->Data + ((t)->Width * (j) + (i)))
26 #define FETCH(x) fetch_2d_texel_##x
30 #define CHAN_SRC( t, i, j, k, sz ) \
31 (GLchan *)(t)->Data + (((t)->Height * (k) + (j)) * \
32 (t)->Width + (i)) * (sz)
33 #define UBYTE_SRC( t, i, j, k, sz ) \
34 ((GLubyte *)(t)->Data + (((t)->Height * (k) + (j)) * \
35 (t)->Width + (i)) * (sz))
36 #define USHORT_SRC( t, i, j, k ) \
37 ((GLushort *)(t)->Data + (((t)->Height * (k) + (j)) * \
39 #define FLOAT_SRC( t, i, j, k ) \
40 ((GLfloat *)(t)->Data + (((t)->Height * (k) + (j)) * \
43 #define FETCH(x) fetch_3d_texel_##x
50 static void FETCH(rgba
)( const struct gl_texture_image
*texImage
,
51 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
53 const GLchan
*src
= CHAN_SRC( texImage
, i
, j
, k
, 4 );
54 GLchan
*rgba
= (GLchan
*) texel
;
55 COPY_CHAN4( rgba
, src
);
58 static void FETCH(rgb
)( const struct gl_texture_image
*texImage
,
59 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
61 const GLchan
*src
= CHAN_SRC( texImage
, i
, j
, k
, 3 );
62 GLchan
*rgba
= (GLchan
*) texel
;
66 rgba
[ACOMP
] = CHAN_MAX
;
69 static void FETCH(alpha
)( const struct gl_texture_image
*texImage
,
70 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
72 const GLchan
*src
= CHAN_SRC( texImage
, i
, j
, k
, 1 );
73 GLchan
*rgba
= (GLchan
*) texel
;
80 static void FETCH(luminance
)( const struct gl_texture_image
*texImage
,
81 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
83 const GLchan
*src
= CHAN_SRC( texImage
, i
, j
, k
, 1 );
84 GLchan
*rgba
= (GLchan
*) texel
;
88 rgba
[ACOMP
] = CHAN_MAX
;
91 static void FETCH(luminance_alpha
)( const struct gl_texture_image
*texImage
,
92 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
94 const GLchan
*src
= CHAN_SRC( texImage
, i
, j
, k
, 2 );
95 GLchan
*rgba
= (GLchan
*) texel
;
102 static void FETCH(intensity
)( const struct gl_texture_image
*texImage
,
103 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
105 const GLchan
*src
= CHAN_SRC( texImage
, i
, j
, k
, 1 );
106 GLchan
*rgba
= (GLchan
*) texel
;
107 rgba
[RCOMP
] = src
[0];
108 rgba
[GCOMP
] = src
[0];
109 rgba
[BCOMP
] = src
[0];
110 rgba
[ACOMP
] = src
[0];
113 static void FETCH(color_index
)( const struct gl_texture_image
*texImage
,
114 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
116 const GLchan
*src
= CHAN_SRC( texImage
, i
, j
, k
, 1 );
117 GLchan
*index
= (GLchan
*) texel
;
121 static void FETCH(depth_component
)( const struct gl_texture_image
*texImage
,
122 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
124 const GLfloat
*src
= FLOAT_SRC( texImage
, i
, j
, k
);
125 GLfloat
*depth
= (GLfloat
*) texel
;
129 static void FETCH(rgba8888
)( const struct gl_texture_image
*texImage
,
130 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
132 const GLubyte
*src
= UBYTE_SRC( texImage
, i
, j
, k
, 4 );
133 GLchan
*rgba
= (GLchan
*) texel
;
134 rgba
[RCOMP
] = UBYTE_TO_CHAN( src
[3] );
135 rgba
[GCOMP
] = UBYTE_TO_CHAN( src
[2] );
136 rgba
[BCOMP
] = UBYTE_TO_CHAN( src
[1] );
137 rgba
[ACOMP
] = UBYTE_TO_CHAN( src
[0] );
140 static void FETCH(argb8888
)( const struct gl_texture_image
*texImage
,
141 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
143 const GLubyte
*src
= UBYTE_SRC( texImage
, i
, j
, k
, 4 );
144 GLchan
*rgba
= (GLchan
*) texel
;
145 rgba
[RCOMP
] = UBYTE_TO_CHAN( src
[2] );
146 rgba
[GCOMP
] = UBYTE_TO_CHAN( src
[1] );
147 rgba
[BCOMP
] = UBYTE_TO_CHAN( src
[0] );
148 rgba
[ACOMP
] = UBYTE_TO_CHAN( src
[3] );
151 static void FETCH(rgb888
)( const struct gl_texture_image
*texImage
,
152 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
154 const GLubyte
*src
= UBYTE_SRC( texImage
, i
, j
, k
, 3 );
155 GLchan
*rgba
= (GLchan
*) texel
;
156 rgba
[RCOMP
] = UBYTE_TO_CHAN( src
[2] );
157 rgba
[GCOMP
] = UBYTE_TO_CHAN( src
[1] );
158 rgba
[BCOMP
] = UBYTE_TO_CHAN( src
[0] );
159 rgba
[ACOMP
] = CHAN_MAX
;
162 static void FETCH(rgb565
)( const struct gl_texture_image
*texImage
,
163 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
165 const GLushort
*src
= USHORT_SRC( texImage
, i
, j
, k
);
166 GLchan
*rgba
= (GLchan
*) texel
; GLushort s
= *src
;
167 rgba
[RCOMP
] = UBYTE_TO_CHAN( ((s
>> 8) & 0xf8) * 255 / 0xf8 );
168 rgba
[GCOMP
] = UBYTE_TO_CHAN( ((s
>> 3) & 0xfc) * 255 / 0xfc );
169 rgba
[BCOMP
] = UBYTE_TO_CHAN( ((s
<< 3) & 0xf8) * 255 / 0xf8 );
170 rgba
[ACOMP
] = CHAN_MAX
;
173 static void FETCH(argb4444
)( const struct gl_texture_image
*texImage
,
174 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
176 const GLushort
*src
= USHORT_SRC( texImage
, i
, j
, k
);
177 GLchan
*rgba
= (GLchan
*) texel
; GLushort s
= *src
;
178 rgba
[RCOMP
] = UBYTE_TO_CHAN( ((s
>> 8) & 0xf) * 255 / 0xf );
179 rgba
[GCOMP
] = UBYTE_TO_CHAN( ((s
>> 4) & 0xf) * 255 / 0xf );
180 rgba
[BCOMP
] = UBYTE_TO_CHAN( ((s
) & 0xf) * 255 / 0xf );
181 rgba
[ACOMP
] = UBYTE_TO_CHAN( ((s
>> 12) & 0xf) * 255 / 0xf );
184 static void FETCH(argb1555
)( const struct gl_texture_image
*texImage
,
185 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
187 const GLushort
*src
= USHORT_SRC( texImage
, i
, j
, k
);
188 GLchan
*rgba
= (GLchan
*) texel
; GLushort s
= *src
;
189 rgba
[RCOMP
] = UBYTE_TO_CHAN( ((s
>> 10) & 0xf8) * 255 / 0xf8 );
190 rgba
[GCOMP
] = UBYTE_TO_CHAN( ((s
>> 5) & 0xf8) * 255 / 0xf8 );
191 rgba
[BCOMP
] = UBYTE_TO_CHAN( ((s
) & 0xf8) * 255 / 0xf8 );
192 rgba
[ACOMP
] = UBYTE_TO_CHAN( ((s
>> 15) & 0x01) * 255 );
195 static void FETCH(al88
)( const struct gl_texture_image
*texImage
,
196 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
198 const GLubyte
*src
= UBYTE_SRC( texImage
, i
, j
, k
, 2 );
199 GLchan
*rgba
= (GLchan
*) texel
;
200 rgba
[RCOMP
] = UBYTE_TO_CHAN( src
[0] );
201 rgba
[GCOMP
] = UBYTE_TO_CHAN( src
[0] );
202 rgba
[BCOMP
] = UBYTE_TO_CHAN( src
[0] );
203 rgba
[ACOMP
] = UBYTE_TO_CHAN( src
[1] );
206 static void FETCH(rgb332
)( const struct gl_texture_image
*texImage
,
207 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
209 const GLubyte
*src
= UBYTE_SRC( texImage
, i
, j
, k
, 1 );
210 GLchan
*rgba
= (GLchan
*) texel
; GLubyte s
= *src
;
211 rgba
[RCOMP
] = UBYTE_TO_CHAN( ((s
) & 0xe0) * 255 / 0xe0 );
212 rgba
[GCOMP
] = UBYTE_TO_CHAN( ((s
<< 3) & 0xe0) * 255 / 0xe0 );
213 rgba
[BCOMP
] = UBYTE_TO_CHAN( ((s
<< 5) & 0xc0) * 255 / 0xc0 );
214 rgba
[ACOMP
] = CHAN_MAX
;
217 static void FETCH(a8
)( const struct gl_texture_image
*texImage
,
218 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
220 const GLubyte
*src
= UBYTE_SRC( texImage
, i
, j
, k
, 1 );
221 GLchan
*rgba
= (GLchan
*) texel
;
225 rgba
[ACOMP
] = UBYTE_TO_CHAN( src
[0] );
228 static void FETCH(l8
)( const struct gl_texture_image
*texImage
,
229 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
231 const GLubyte
*src
= UBYTE_SRC( texImage
, i
, j
, k
, 1 );
232 GLchan
*rgba
= (GLchan
*) texel
;
233 rgba
[RCOMP
] = UBYTE_TO_CHAN( src
[0] );
234 rgba
[GCOMP
] = UBYTE_TO_CHAN( src
[0] );
235 rgba
[BCOMP
] = UBYTE_TO_CHAN( src
[0] );
236 rgba
[ACOMP
] = CHAN_MAX
;
239 static void FETCH(i8
)( const struct gl_texture_image
*texImage
,
240 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
242 const GLubyte
*src
= UBYTE_SRC( texImage
, i
, j
, k
, 1 );
243 GLchan
*rgba
= (GLchan
*) texel
;
244 rgba
[RCOMP
] = UBYTE_TO_CHAN( src
[0] );
245 rgba
[GCOMP
] = UBYTE_TO_CHAN( src
[0] );
246 rgba
[BCOMP
] = UBYTE_TO_CHAN( src
[0] );
247 rgba
[ACOMP
] = UBYTE_TO_CHAN( src
[0] );
250 static void FETCH(ci8
)( const struct gl_texture_image
*texImage
,
251 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
253 const GLubyte
*src
= UBYTE_SRC( texImage
, i
, j
, k
, 1 );
254 GLchan
*index
= (GLchan
*) texel
;
255 *index
= UBYTE_TO_CHAN( *src
);