1 /* $Id: texformat_tmp.h,v 1.3 2001/03/18 13:37:18 gareth Exp $ */
4 * Mesa 3-D graphics library
7 * Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
9 * Permission is hereby granted, free of charge, to any person obtaining a
10 * copy of this software and associated documentation files (the "Software"),
11 * to deal in the Software without restriction, including without limitation
12 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13 * and/or sell copies of the Software, and to permit persons to whom the
14 * Software is furnished to do so, subject to the following conditions:
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 * Gareth Hughes <gareth@valinux.com>
32 #define CHAN_SRC( t, i, j, k, sz ) \
33 ((GLchan *)(t)->Data + (i) * (sz))
34 #define UBYTE_SRC( t, i, j, k, sz ) \
35 ((GLubyte *)(t)->Data + (i) * (sz))
36 #define USHORT_SRC( t, i, j, k ) \
37 ((GLushort *)(t)->Data + (i))
38 #define FLOAT_SRC( t, i, j, k ) \
39 ((GLfloat *)(t)->Data + (i))
41 #define FETCH(x) fetch_1d_texel_##x
45 #define CHAN_SRC( t, i, j, k, sz ) \
46 ((GLchan *)(t)->Data + ((t)->Width * (j) + (i)) * (sz))
47 #define UBYTE_SRC( t, i, j, k, sz ) \
48 ((GLubyte *)(t)->Data + ((t)->Width * (j) + (i)) * (sz))
49 #define USHORT_SRC( t, i, j, k ) \
50 ((GLushort *)(t)->Data + ((t)->Width * (j) + (i)))
51 #define FLOAT_SRC( t, i, j, k ) \
52 ((GLfloat *)(t)->Data + ((t)->Width * (j) + (i)))
54 #define FETCH(x) fetch_2d_texel_##x
58 #define CHAN_SRC( t, i, j, k, sz ) \
59 (GLchan *)(t)->Data + (((t)->Height * (k) + (j)) * \
60 (t)->Width + (i)) * (sz)
61 #define UBYTE_SRC( t, i, j, k, sz ) \
62 ((GLubyte *)(t)->Data + (((t)->Height * (k) + (j)) * \
63 (t)->Width + (i)) * (sz))
64 #define USHORT_SRC( t, i, j, k ) \
65 ((GLushort *)(t)->Data + (((t)->Height * (k) + (j)) * \
67 #define FLOAT_SRC( t, i, j, k ) \
68 ((GLfloat *)(t)->Data + (((t)->Height * (k) + (j)) * \
71 #define FETCH(x) fetch_3d_texel_##x
74 #error illegal number of texture dimensions
78 static void FETCH(rgba
)( const struct gl_texture_image
*texImage
,
79 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
81 const GLchan
*src
= CHAN_SRC( texImage
, i
, j
, k
, 4 );
82 GLchan
*rgba
= (GLchan
*) texel
;
83 COPY_CHAN4( rgba
, src
);
86 static void FETCH(rgb
)( const struct gl_texture_image
*texImage
,
87 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
89 const GLchan
*src
= CHAN_SRC( texImage
, i
, j
, k
, 3 );
90 GLchan
*rgba
= (GLchan
*) texel
;
94 rgba
[ACOMP
] = CHAN_MAX
;
97 static void FETCH(alpha
)( const struct gl_texture_image
*texImage
,
98 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
100 const GLchan
*src
= CHAN_SRC( texImage
, i
, j
, k
, 1 );
101 GLchan
*rgba
= (GLchan
*) texel
;
105 rgba
[ACOMP
] = src
[0];
108 static void FETCH(luminance
)( const struct gl_texture_image
*texImage
,
109 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
111 const GLchan
*src
= CHAN_SRC( texImage
, i
, j
, k
, 1 );
112 GLchan
*rgba
= (GLchan
*) texel
;
113 rgba
[RCOMP
] = src
[0];
114 rgba
[GCOMP
] = src
[0];
115 rgba
[BCOMP
] = src
[0];
116 rgba
[ACOMP
] = CHAN_MAX
;
119 static void FETCH(luminance_alpha
)( const struct gl_texture_image
*texImage
,
120 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
122 const GLchan
*src
= CHAN_SRC( texImage
, i
, j
, k
, 2 );
123 GLchan
*rgba
= (GLchan
*) texel
;
124 rgba
[RCOMP
] = src
[0];
125 rgba
[GCOMP
] = src
[0];
126 rgba
[BCOMP
] = src
[0];
127 rgba
[ACOMP
] = src
[1];
130 static void FETCH(intensity
)( const struct gl_texture_image
*texImage
,
131 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
133 const GLchan
*src
= CHAN_SRC( texImage
, i
, j
, k
, 1 );
134 GLchan
*rgba
= (GLchan
*) texel
;
135 rgba
[RCOMP
] = src
[0];
136 rgba
[GCOMP
] = src
[0];
137 rgba
[BCOMP
] = src
[0];
138 rgba
[ACOMP
] = src
[0];
141 static void FETCH(color_index
)( const struct gl_texture_image
*texImage
,
142 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
144 const GLchan
*src
= CHAN_SRC( texImage
, i
, j
, k
, 1 );
145 GLchan
*index
= (GLchan
*) texel
;
149 static void FETCH(depth_component
)( const struct gl_texture_image
*texImage
,
150 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
152 const GLfloat
*src
= FLOAT_SRC( texImage
, i
, j
, k
);
153 GLfloat
*depth
= (GLfloat
*) texel
;
157 static void FETCH(rgba8888
)( const struct gl_texture_image
*texImage
,
158 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
160 const GLubyte
*src
= UBYTE_SRC( texImage
, i
, j
, k
, 4 );
161 GLchan
*rgba
= (GLchan
*) texel
;
162 rgba
[RCOMP
] = UBYTE_TO_CHAN( src
[3] );
163 rgba
[GCOMP
] = UBYTE_TO_CHAN( src
[2] );
164 rgba
[BCOMP
] = UBYTE_TO_CHAN( src
[1] );
165 rgba
[ACOMP
] = UBYTE_TO_CHAN( src
[0] );
168 static void FETCH(argb8888
)( const struct gl_texture_image
*texImage
,
169 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
171 const GLubyte
*src
= UBYTE_SRC( texImage
, i
, j
, k
, 4 );
172 GLchan
*rgba
= (GLchan
*) texel
;
173 rgba
[RCOMP
] = UBYTE_TO_CHAN( src
[2] );
174 rgba
[GCOMP
] = UBYTE_TO_CHAN( src
[1] );
175 rgba
[BCOMP
] = UBYTE_TO_CHAN( src
[0] );
176 rgba
[ACOMP
] = UBYTE_TO_CHAN( src
[3] );
179 static void FETCH(rgb888
)( const struct gl_texture_image
*texImage
,
180 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
182 const GLubyte
*src
= UBYTE_SRC( texImage
, i
, j
, k
, 3 );
183 GLchan
*rgba
= (GLchan
*) texel
;
184 rgba
[RCOMP
] = UBYTE_TO_CHAN( src
[2] );
185 rgba
[GCOMP
] = UBYTE_TO_CHAN( src
[1] );
186 rgba
[BCOMP
] = UBYTE_TO_CHAN( src
[0] );
187 rgba
[ACOMP
] = CHAN_MAX
;
190 static void FETCH(rgb565
)( const struct gl_texture_image
*texImage
,
191 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
193 const GLushort
*src
= USHORT_SRC( texImage
, i
, j
, k
);
194 GLchan
*rgba
= (GLchan
*) texel
; GLushort s
= *src
;
195 rgba
[RCOMP
] = UBYTE_TO_CHAN( ((s
>> 8) & 0xf8) * 255 / 0xf8 );
196 rgba
[GCOMP
] = UBYTE_TO_CHAN( ((s
>> 3) & 0xfc) * 255 / 0xfc );
197 rgba
[BCOMP
] = UBYTE_TO_CHAN( ((s
<< 3) & 0xf8) * 255 / 0xf8 );
198 rgba
[ACOMP
] = CHAN_MAX
;
201 static void FETCH(argb4444
)( const struct gl_texture_image
*texImage
,
202 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
204 const GLushort
*src
= USHORT_SRC( texImage
, i
, j
, k
);
205 GLchan
*rgba
= (GLchan
*) texel
; GLushort s
= *src
;
206 rgba
[RCOMP
] = UBYTE_TO_CHAN( ((s
>> 8) & 0xf) * 255 / 0xf );
207 rgba
[GCOMP
] = UBYTE_TO_CHAN( ((s
>> 4) & 0xf) * 255 / 0xf );
208 rgba
[BCOMP
] = UBYTE_TO_CHAN( ((s
) & 0xf) * 255 / 0xf );
209 rgba
[ACOMP
] = UBYTE_TO_CHAN( ((s
>> 12) & 0xf) * 255 / 0xf );
212 static void FETCH(argb1555
)( const struct gl_texture_image
*texImage
,
213 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
215 const GLushort
*src
= USHORT_SRC( texImage
, i
, j
, k
);
216 GLchan
*rgba
= (GLchan
*) texel
; GLushort s
= *src
;
217 rgba
[RCOMP
] = UBYTE_TO_CHAN( ((s
>> 10) & 0xf8) * 255 / 0xf8 );
218 rgba
[GCOMP
] = UBYTE_TO_CHAN( ((s
>> 5) & 0xf8) * 255 / 0xf8 );
219 rgba
[BCOMP
] = UBYTE_TO_CHAN( ((s
) & 0xf8) * 255 / 0xf8 );
220 rgba
[ACOMP
] = UBYTE_TO_CHAN( ((s
>> 15) & 0x01) * 255 );
223 static void FETCH(al88
)( const struct gl_texture_image
*texImage
,
224 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
226 const GLubyte
*src
= UBYTE_SRC( texImage
, i
, j
, k
, 2 );
227 GLchan
*rgba
= (GLchan
*) texel
;
228 rgba
[RCOMP
] = UBYTE_TO_CHAN( src
[0] );
229 rgba
[GCOMP
] = UBYTE_TO_CHAN( src
[0] );
230 rgba
[BCOMP
] = UBYTE_TO_CHAN( src
[0] );
231 rgba
[ACOMP
] = UBYTE_TO_CHAN( src
[1] );
234 static void FETCH(rgb332
)( const struct gl_texture_image
*texImage
,
235 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
237 const GLubyte
*src
= UBYTE_SRC( texImage
, i
, j
, k
, 1 );
238 GLchan
*rgba
= (GLchan
*) texel
; GLubyte s
= *src
;
239 rgba
[RCOMP
] = UBYTE_TO_CHAN( ((s
) & 0xe0) * 255 / 0xe0 );
240 rgba
[GCOMP
] = UBYTE_TO_CHAN( ((s
<< 3) & 0xe0) * 255 / 0xe0 );
241 rgba
[BCOMP
] = UBYTE_TO_CHAN( ((s
<< 5) & 0xc0) * 255 / 0xc0 );
242 rgba
[ACOMP
] = CHAN_MAX
;
245 static void FETCH(a8
)( const struct gl_texture_image
*texImage
,
246 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
248 const GLubyte
*src
= UBYTE_SRC( texImage
, i
, j
, k
, 1 );
249 GLchan
*rgba
= (GLchan
*) texel
;
253 rgba
[ACOMP
] = UBYTE_TO_CHAN( src
[0] );
256 static void FETCH(l8
)( const struct gl_texture_image
*texImage
,
257 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
259 const GLubyte
*src
= UBYTE_SRC( texImage
, i
, j
, k
, 1 );
260 GLchan
*rgba
= (GLchan
*) texel
;
261 rgba
[RCOMP
] = UBYTE_TO_CHAN( src
[0] );
262 rgba
[GCOMP
] = UBYTE_TO_CHAN( src
[0] );
263 rgba
[BCOMP
] = UBYTE_TO_CHAN( src
[0] );
264 rgba
[ACOMP
] = CHAN_MAX
;
267 static void FETCH(i8
)( const struct gl_texture_image
*texImage
,
268 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
270 const GLubyte
*src
= UBYTE_SRC( texImage
, i
, j
, k
, 1 );
271 GLchan
*rgba
= (GLchan
*) texel
;
272 rgba
[RCOMP
] = UBYTE_TO_CHAN( src
[0] );
273 rgba
[GCOMP
] = UBYTE_TO_CHAN( src
[0] );
274 rgba
[BCOMP
] = UBYTE_TO_CHAN( src
[0] );
275 rgba
[ACOMP
] = UBYTE_TO_CHAN( src
[0] );
278 static void FETCH(ci8
)( const struct gl_texture_image
*texImage
,
279 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
281 const GLubyte
*src
= UBYTE_SRC( texImage
, i
, j
, k
, 1 );
282 GLchan
*index
= (GLchan
*) texel
;
283 *index
= UBYTE_TO_CHAN( *src
);