2 * Mesa 3-D graphics library
4 * Copyright (C) 1999-2006 Brian Paul All Rights Reserved.
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22 * OTHER DEALINGS IN THE SOFTWARE.
26 * \brief Translate vectors of numbers between various types.
27 * \author Keith Whitwell.
31 #include "main/glheader.h"
32 #include "main/macros.h"
34 #include "m_translate.h"
38 typedef void (*trans_1f_func
)(GLfloat
*to
,
44 typedef void (*trans_1ui_func
)(GLuint
*to
,
50 typedef void (*trans_1ub_func
)(GLubyte
*to
,
56 typedef void (*trans_4ub_func
)(GLubyte (*to
)[4],
62 typedef void (*trans_4us_func
)(GLushort (*to
)[4],
68 typedef void (*trans_4f_func
)(GLfloat (*to
)[4],
74 typedef void (*trans_3fn_func
)(GLfloat (*to
)[3],
83 #define TYPE_IDX(t) ((t) & 0xf)
84 #define MAX_TYPES TYPE_IDX(GL_DOUBLE)+1 /* 0xa + 1 */
87 static trans_1f_func _math_trans_1f_tab
[MAX_TYPES
];
88 static trans_1ui_func _math_trans_1ui_tab
[MAX_TYPES
];
89 static trans_1ub_func _math_trans_1ub_tab
[MAX_TYPES
];
90 static trans_3fn_func _math_trans_3fn_tab
[MAX_TYPES
];
91 static trans_4ub_func _math_trans_4ub_tab
[5][MAX_TYPES
];
92 static trans_4us_func _math_trans_4us_tab
[5][MAX_TYPES
];
93 static trans_4f_func _math_trans_4f_tab
[5][MAX_TYPES
];
94 static trans_4f_func _math_trans_4fn_tab
[5][MAX_TYPES
];
97 #define PTR_ELT(ptr, elt) (((SRC *)ptr)[elt])
100 #define TAB(x) _math_trans##x##_tab
101 #define ARGS GLuint start, GLuint n
102 #define SRC_START start
104 #define STRIDE stride
105 #define NEXT_F f += stride
112 * Translate from GL_BYTE.
115 #define SRC_IDX TYPE_IDX(GL_BYTE)
116 #define TRX_3FN(f,n) BYTE_TO_FLOAT( PTR_ELT(f,n) )
118 #define TRX_4F(f,n) BYTE_TO_FLOAT( PTR_ELT(f,n) )
120 #define TRX_4F(f,n) (GLfloat)( PTR_ELT(f,n) )
122 #define TRX_4FN(f,n) BYTE_TO_FLOAT( PTR_ELT(f,n) )
123 #define TRX_UB(ub, f,n) ub = BYTE_TO_UBYTE( PTR_ELT(f,n) )
124 #define TRX_US(ch, f,n) ch = BYTE_TO_USHORT( PTR_ELT(f,n) )
125 #define TRX_UI(f,n) (PTR_ELT(f,n) < 0 ? 0 : (GLuint) PTR_ELT(f,n))
129 #define INIT init_trans_4_GLbyte_raw
130 #define DEST_4F trans_4_GLbyte_4f_raw
131 #define DEST_4FN trans_4_GLbyte_4fn_raw
132 #define DEST_4UB trans_4_GLbyte_4ub_raw
133 #define DEST_4US trans_4_GLbyte_4us_raw
134 #include "m_trans_tmp.h"
137 #define INIT init_trans_3_GLbyte_raw
138 #define DEST_4F trans_3_GLbyte_4f_raw
139 #define DEST_4FN trans_3_GLbyte_4fn_raw
140 #define DEST_4UB trans_3_GLbyte_4ub_raw
141 #define DEST_4US trans_3_GLbyte_4us_raw
142 #define DEST_3FN trans_3_GLbyte_3fn_raw
143 #include "m_trans_tmp.h"
146 #define INIT init_trans_2_GLbyte_raw
147 #define DEST_4F trans_2_GLbyte_4f_raw
148 #define DEST_4FN trans_2_GLbyte_4fn_raw
149 #include "m_trans_tmp.h"
152 #define INIT init_trans_1_GLbyte_raw
153 #define DEST_4F trans_1_GLbyte_4f_raw
154 #define DEST_4FN trans_1_GLbyte_4fn_raw
155 #define DEST_1UB trans_1_GLbyte_1ub_raw
156 #define DEST_1UI trans_1_GLbyte_1ui_raw
157 #include "m_trans_tmp.h"
170 * Translate from GL_UNSIGNED_BYTE.
173 #define SRC_IDX TYPE_IDX(GL_UNSIGNED_BYTE)
174 #define TRX_3FN(f,n) UBYTE_TO_FLOAT(PTR_ELT(f,n))
175 #define TRX_4F(f,n) (GLfloat)( PTR_ELT(f,n) )
176 #define TRX_4FN(f,n) UBYTE_TO_FLOAT(PTR_ELT(f,n))
177 #define TRX_UB(ub, f,n) ub = PTR_ELT(f,n)
178 #define TRX_US(us, f,n) us = UBYTE_TO_USHORT(PTR_ELT(f,n))
179 #define TRX_UI(f,n) (GLuint)PTR_ELT(f,n)
181 /* 4ub->4ub handled in special case below.
184 #define INIT init_trans_4_GLubyte_raw
185 #define DEST_4F trans_4_GLubyte_4f_raw
186 #define DEST_4FN trans_4_GLubyte_4fn_raw
187 #define DEST_4US trans_4_GLubyte_4us_raw
188 #include "m_trans_tmp.h"
192 #define INIT init_trans_3_GLubyte_raw
193 #define DEST_4UB trans_3_GLubyte_4ub_raw
194 #define DEST_4US trans_3_GLubyte_4us_raw
195 #define DEST_3FN trans_3_GLubyte_3fn_raw
196 #define DEST_4F trans_3_GLubyte_4f_raw
197 #define DEST_4FN trans_3_GLubyte_4fn_raw
198 #include "m_trans_tmp.h"
202 #define INIT init_trans_1_GLubyte_raw
203 #define DEST_1UI trans_1_GLubyte_1ui_raw
204 #define DEST_1UB trans_1_GLubyte_1ub_raw
205 #include "m_trans_tmp.h"
220 #define SRC_IDX TYPE_IDX(GL_SHORT)
221 #define TRX_3FN(f,n) SHORT_TO_FLOAT( PTR_ELT(f,n) )
222 #define TRX_4F(f,n) (GLfloat)( PTR_ELT(f,n) )
223 #define TRX_4FN(f,n) SHORT_TO_FLOAT( PTR_ELT(f,n) )
224 #define TRX_UB(ub, f,n) ub = SHORT_TO_UBYTE(PTR_ELT(f,n))
225 #define TRX_US(us, f,n) us = SHORT_TO_USHORT(PTR_ELT(f,n))
226 #define TRX_UI(f,n) (PTR_ELT(f,n) < 0 ? 0 : (GLuint) PTR_ELT(f,n))
230 #define INIT init_trans_4_GLshort_raw
231 #define DEST_4F trans_4_GLshort_4f_raw
232 #define DEST_4FN trans_4_GLshort_4fn_raw
233 #define DEST_4UB trans_4_GLshort_4ub_raw
234 #define DEST_4US trans_4_GLshort_4us_raw
235 #include "m_trans_tmp.h"
238 #define INIT init_trans_3_GLshort_raw
239 #define DEST_4F trans_3_GLshort_4f_raw
240 #define DEST_4FN trans_3_GLshort_4fn_raw
241 #define DEST_4UB trans_3_GLshort_4ub_raw
242 #define DEST_4US trans_3_GLshort_4us_raw
243 #define DEST_3FN trans_3_GLshort_3fn_raw
244 #include "m_trans_tmp.h"
247 #define INIT init_trans_2_GLshort_raw
248 #define DEST_4F trans_2_GLshort_4f_raw
249 #define DEST_4FN trans_2_GLshort_4fn_raw
250 #include "m_trans_tmp.h"
253 #define INIT init_trans_1_GLshort_raw
254 #define DEST_4F trans_1_GLshort_4f_raw
255 #define DEST_4FN trans_1_GLshort_4fn_raw
256 #define DEST_1UB trans_1_GLshort_1ub_raw
257 #define DEST_1UI trans_1_GLshort_1ui_raw
258 #include "m_trans_tmp.h"
274 #define SRC_IDX TYPE_IDX(GL_UNSIGNED_SHORT)
275 #define TRX_3FN(f,n) USHORT_TO_FLOAT( PTR_ELT(f,n) )
276 #define TRX_4F(f,n) (GLfloat)( PTR_ELT(f,n) )
277 #define TRX_4FN(f,n) USHORT_TO_FLOAT( PTR_ELT(f,n) )
278 #define TRX_UB(ub,f,n) ub = (GLubyte) (PTR_ELT(f,n) >> 8)
279 #define TRX_US(us,f,n) us = PTR_ELT(f,n)
280 #define TRX_UI(f,n) (GLuint) PTR_ELT(f,n)
284 #define INIT init_trans_4_GLushort_raw
285 #define DEST_4F trans_4_GLushort_4f_raw
286 #define DEST_4FN trans_4_GLushort_4fn_raw
287 #define DEST_4UB trans_4_GLushort_4ub_raw
288 #define DEST_4US trans_4_GLushort_4us_raw
289 #include "m_trans_tmp.h"
292 #define INIT init_trans_3_GLushort_raw
293 #define DEST_4F trans_3_GLushort_4f_raw
294 #define DEST_4FN trans_3_GLushort_4fn_raw
295 #define DEST_4UB trans_3_GLushort_4ub_raw
296 #define DEST_4US trans_3_GLushort_4us_raw
297 #define DEST_3FN trans_3_GLushort_3fn_raw
298 #include "m_trans_tmp.h"
301 #define INIT init_trans_2_GLushort_raw
302 #define DEST_4F trans_2_GLushort_4f_raw
303 #define DEST_4FN trans_2_GLushort_4fn_raw
304 #include "m_trans_tmp.h"
307 #define INIT init_trans_1_GLushort_raw
308 #define DEST_4F trans_1_GLushort_4f_raw
309 #define DEST_4FN trans_1_GLushort_4fn_raw
310 #define DEST_1UB trans_1_GLushort_1ub_raw
311 #define DEST_1UI trans_1_GLushort_1ui_raw
312 #include "m_trans_tmp.h"
327 #define SRC_IDX TYPE_IDX(GL_INT)
328 #define TRX_3FN(f,n) INT_TO_FLOAT( PTR_ELT(f,n) )
329 #define TRX_4F(f,n) (GLfloat)( PTR_ELT(f,n) )
330 #define TRX_4FN(f,n) INT_TO_FLOAT( PTR_ELT(f,n) )
331 #define TRX_UB(ub, f,n) ub = INT_TO_UBYTE(PTR_ELT(f,n))
332 #define TRX_US(us, f,n) us = INT_TO_USHORT(PTR_ELT(f,n))
333 #define TRX_UI(f,n) (PTR_ELT(f,n) < 0 ? 0 : (GLuint) PTR_ELT(f,n))
337 #define INIT init_trans_4_GLint_raw
338 #define DEST_4F trans_4_GLint_4f_raw
339 #define DEST_4FN trans_4_GLint_4fn_raw
340 #define DEST_4UB trans_4_GLint_4ub_raw
341 #define DEST_4US trans_4_GLint_4us_raw
342 #include "m_trans_tmp.h"
345 #define INIT init_trans_3_GLint_raw
346 #define DEST_4F trans_3_GLint_4f_raw
347 #define DEST_4FN trans_3_GLint_4fn_raw
348 #define DEST_4UB trans_3_GLint_4ub_raw
349 #define DEST_4US trans_3_GLint_4us_raw
350 #define DEST_3FN trans_3_GLint_3fn_raw
351 #include "m_trans_tmp.h"
354 #define INIT init_trans_2_GLint_raw
355 #define DEST_4F trans_2_GLint_4f_raw
356 #define DEST_4FN trans_2_GLint_4fn_raw
357 #include "m_trans_tmp.h"
360 #define INIT init_trans_1_GLint_raw
361 #define DEST_4F trans_1_GLint_4f_raw
362 #define DEST_4FN trans_1_GLint_4fn_raw
363 #define DEST_1UB trans_1_GLint_1ub_raw
364 #define DEST_1UI trans_1_GLint_1ui_raw
365 #include "m_trans_tmp.h"
381 #define SRC_IDX TYPE_IDX(GL_UNSIGNED_INT)
382 #define TRX_3FN(f,n) INT_TO_FLOAT( PTR_ELT(f,n) )
383 #define TRX_4F(f,n) (GLfloat)( PTR_ELT(f,n) )
384 #define TRX_4FN(f,n) UINT_TO_FLOAT( PTR_ELT(f,n) )
385 #define TRX_UB(ub, f,n) ub = (GLubyte) (PTR_ELT(f,n) >> 24)
386 #define TRX_US(us, f,n) us = (GLshort) (PTR_ELT(f,n) >> 16)
387 #define TRX_UI(f,n) PTR_ELT(f,n)
391 #define INIT init_trans_4_GLuint_raw
392 #define DEST_4F trans_4_GLuint_4f_raw
393 #define DEST_4FN trans_4_GLuint_4fn_raw
394 #define DEST_4UB trans_4_GLuint_4ub_raw
395 #define DEST_4US trans_4_GLuint_4us_raw
396 #include "m_trans_tmp.h"
399 #define INIT init_trans_3_GLuint_raw
400 #define DEST_4F trans_3_GLuint_4f_raw
401 #define DEST_4FN trans_3_GLuint_4fn_raw
402 #define DEST_4UB trans_3_GLuint_4ub_raw
403 #define DEST_4US trans_3_GLuint_4us_raw
404 #define DEST_3FN trans_3_GLuint_3fn_raw
405 #include "m_trans_tmp.h"
408 #define INIT init_trans_2_GLuint_raw
409 #define DEST_4F trans_2_GLuint_4f_raw
410 #define DEST_4FN trans_2_GLuint_4fn_raw
411 #include "m_trans_tmp.h"
414 #define INIT init_trans_1_GLuint_raw
415 #define DEST_4F trans_1_GLuint_4f_raw
416 #define DEST_4FN trans_1_GLuint_4fn_raw
417 #define DEST_1UB trans_1_GLuint_1ub_raw
418 #define DEST_1UI trans_1_GLuint_1ui_raw
419 #include "m_trans_tmp.h"
434 #define SRC_IDX TYPE_IDX(GL_DOUBLE)
435 #define TRX_3FN(f,n) (GLfloat) PTR_ELT(f,n)
436 #define TRX_4F(f,n) (GLfloat) PTR_ELT(f,n)
437 #define TRX_4FN(f,n) (GLfloat) PTR_ELT(f,n)
438 #define TRX_UB(ub,f,n) UNCLAMPED_FLOAT_TO_UBYTE(ub, PTR_ELT(f,n))
439 #define TRX_US(us,f,n) UNCLAMPED_FLOAT_TO_USHORT(us, PTR_ELT(f,n))
440 #define TRX_UI(f,n) (GLuint) (GLint) PTR_ELT(f,n)
441 #define TRX_1F(f,n) (GLfloat) PTR_ELT(f,n)
445 #define INIT init_trans_4_GLdouble_raw
446 #define DEST_4F trans_4_GLdouble_4f_raw
447 #define DEST_4FN trans_4_GLdouble_4fn_raw
448 #define DEST_4UB trans_4_GLdouble_4ub_raw
449 #define DEST_4US trans_4_GLdouble_4us_raw
450 #include "m_trans_tmp.h"
453 #define INIT init_trans_3_GLdouble_raw
454 #define DEST_4F trans_3_GLdouble_4f_raw
455 #define DEST_4FN trans_3_GLdouble_4fn_raw
456 #define DEST_4UB trans_3_GLdouble_4ub_raw
457 #define DEST_4US trans_3_GLdouble_4us_raw
458 #define DEST_3FN trans_3_GLdouble_3fn_raw
459 #include "m_trans_tmp.h"
462 #define INIT init_trans_2_GLdouble_raw
463 #define DEST_4F trans_2_GLdouble_4f_raw
464 #define DEST_4FN trans_2_GLdouble_4fn_raw
465 #include "m_trans_tmp.h"
468 #define INIT init_trans_1_GLdouble_raw
469 #define DEST_4F trans_1_GLdouble_4f_raw
470 #define DEST_4FN trans_1_GLdouble_4fn_raw
471 #define DEST_1UB trans_1_GLdouble_1ub_raw
472 #define DEST_1UI trans_1_GLdouble_1ui_raw
473 #define DEST_1F trans_1_GLdouble_1f_raw
474 #include "m_trans_tmp.h"
482 #define SRC_IDX TYPE_IDX(GL_FLOAT)
484 #define INIT init_trans_4_GLfloat_raw
485 #define DEST_4UB trans_4_GLfloat_4ub_raw
486 #define DEST_4US trans_4_GLfloat_4us_raw
487 #define DEST_4F trans_4_GLfloat_4f_raw
488 #define DEST_4FN trans_4_GLfloat_4fn_raw
489 #include "m_trans_tmp.h"
492 #define INIT init_trans_3_GLfloat_raw
493 #define DEST_4F trans_3_GLfloat_4f_raw
494 #define DEST_4FN trans_3_GLfloat_4fn_raw
495 #define DEST_4UB trans_3_GLfloat_4ub_raw
496 #define DEST_4US trans_3_GLfloat_4us_raw
497 #define DEST_3FN trans_3_GLfloat_3fn_raw
498 #include "m_trans_tmp.h"
501 #define INIT init_trans_2_GLfloat_raw
502 #define DEST_4F trans_2_GLfloat_4f_raw
503 #define DEST_4FN trans_2_GLfloat_4fn_raw
504 #include "m_trans_tmp.h"
507 #define INIT init_trans_1_GLfloat_raw
508 #define DEST_4F trans_1_GLfloat_4f_raw
509 #define DEST_4FN trans_1_GLfloat_4fn_raw
510 #define DEST_1UB trans_1_GLfloat_1ub_raw
511 #define DEST_1UI trans_1_GLfloat_1ui_raw
512 #define DEST_1F trans_1_GLfloat_1f_raw
514 #include "m_trans_tmp.h"
526 static void trans_4_GLubyte_4ub_raw(GLubyte (*t
)[4],
531 const GLubyte
*f
= (GLubyte
*) Ptr
+ SRC_START
* stride
;
534 if (((((uintptr_t) f
| (uintptr_t) stride
)) & 3L) == 0L) {
537 for (i
= DST_START
; i
< n
; i
++, f
+= stride
) {
538 COPY_4UBV( t
[i
], f
);
541 for (i
= DST_START
; i
< n
; i
++, f
+= stride
) {
551 static void init_translate_raw(void)
553 memset( TAB(_1ui
), 0, sizeof(TAB(_1ui
)) );
554 memset( TAB(_1ub
), 0, sizeof(TAB(_1ub
)) );
555 memset( TAB(_3fn
), 0, sizeof(TAB(_3fn
)) );
556 memset( TAB(_4ub
), 0, sizeof(TAB(_4ub
)) );
557 memset( TAB(_4us
), 0, sizeof(TAB(_4us
)) );
558 memset( TAB(_4f
), 0, sizeof(TAB(_4f
)) );
559 memset( TAB(_4fn
), 0, sizeof(TAB(_4fn
)) );
561 init_trans_4_GLbyte_raw();
562 init_trans_3_GLbyte_raw();
563 init_trans_2_GLbyte_raw();
564 init_trans_1_GLbyte_raw();
565 init_trans_1_GLubyte_raw();
566 init_trans_3_GLubyte_raw();
567 init_trans_4_GLubyte_raw();
568 init_trans_4_GLshort_raw();
569 init_trans_3_GLshort_raw();
570 init_trans_2_GLshort_raw();
571 init_trans_1_GLshort_raw();
572 init_trans_4_GLushort_raw();
573 init_trans_3_GLushort_raw();
574 init_trans_2_GLushort_raw();
575 init_trans_1_GLushort_raw();
576 init_trans_4_GLint_raw();
577 init_trans_3_GLint_raw();
578 init_trans_2_GLint_raw();
579 init_trans_1_GLint_raw();
580 init_trans_4_GLuint_raw();
581 init_trans_3_GLuint_raw();
582 init_trans_2_GLuint_raw();
583 init_trans_1_GLuint_raw();
584 init_trans_4_GLdouble_raw();
585 init_trans_3_GLdouble_raw();
586 init_trans_2_GLdouble_raw();
587 init_trans_1_GLdouble_raw();
588 init_trans_4_GLfloat_raw();
589 init_trans_3_GLfloat_raw();
590 init_trans_2_GLfloat_raw();
591 init_trans_1_GLfloat_raw();
593 TAB(_4ub
)[4][TYPE_IDX(GL_UNSIGNED_BYTE
)] = trans_4_GLubyte_4ub_raw
;
611 void _math_init_translate( void )
613 init_translate_raw();
618 * Translate vector of values to GLfloat [1].
620 void _math_trans_1f(GLfloat
*to
,
627 _math_trans_1f_tab
[TYPE_IDX(type
)]( to
, ptr
, stride
, start
, n
);
631 * Translate vector of values to GLuint [1].
633 void _math_trans_1ui(GLuint
*to
,
640 _math_trans_1ui_tab
[TYPE_IDX(type
)]( to
, ptr
, stride
, start
, n
);
644 * Translate vector of values to GLubyte [1].
646 void _math_trans_1ub(GLubyte
*to
,
653 _math_trans_1ub_tab
[TYPE_IDX(type
)]( to
, ptr
, stride
, start
, n
);
658 * Translate vector of values to GLubyte [4].
660 void _math_trans_4ub(GLubyte (*to
)[4],
668 _math_trans_4ub_tab
[size
][TYPE_IDX(type
)]( to
, ptr
, stride
, start
, n
);
672 * Translate vector of values to GLushort [4].
674 void _math_trans_4us(GLushort (*to
)[4],
682 _math_trans_4us_tab
[size
][TYPE_IDX(type
)]( to
, ptr
, stride
, start
, n
);
686 * Translate vector of values to GLfloat [4].
688 void _math_trans_4f(GLfloat (*to
)[4],
696 _math_trans_4f_tab
[size
][TYPE_IDX(type
)]( to
, ptr
, stride
, start
, n
);
700 * Translate vector of values to GLfloat[4], normalized to [-1, 1].
702 void _math_trans_4fn(GLfloat (*to
)[4],
710 _math_trans_4fn_tab
[size
][TYPE_IDX(type
)]( to
, ptr
, stride
, start
, n
);
714 * Translate vector of values to GLfloat[3], normalized to [-1, 1].
716 void _math_trans_3fn(GLfloat (*to
)[3],
723 _math_trans_3fn_tab
[TYPE_IDX(type
)]( to
, ptr
, stride
, start
, n
);