1/*
2 * Mesa 3-D graphics library
3 * Version:  6.5.1
4 *
5 * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 */
24
25/**
26 * \brief  Translate vectors of numbers between various types.
27 * \author Keith Whitwell.
28 */
29
30
31#include "main/glheader.h"
32#include "main/macros.h"
33#include "main/mtypes.h"		/* GLchan hack */
34
35#include "m_translate.h"
36
37
38
39typedef void (*trans_1f_func)(GLfloat *to,
40			      CONST void *ptr,
41			      GLuint stride,
42			      GLuint start,
43			      GLuint n );
44
45typedef void (*trans_1ui_func)(GLuint *to,
46			       CONST void *ptr,
47			       GLuint stride,
48			       GLuint start,
49			       GLuint n );
50
51typedef void (*trans_1ub_func)(GLubyte *to,
52			       CONST void *ptr,
53			       GLuint stride,
54			       GLuint start,
55			       GLuint n );
56
57typedef void (*trans_4ub_func)(GLubyte (*to)[4],
58                               CONST void *ptr,
59                               GLuint stride,
60                               GLuint start,
61                               GLuint n );
62
63typedef void (*trans_4us_func)(GLushort (*to)[4],
64                               CONST void *ptr,
65                               GLuint stride,
66                               GLuint start,
67                               GLuint n );
68
69typedef void (*trans_4f_func)(GLfloat (*to)[4],
70			      CONST void *ptr,
71			      GLuint stride,
72			      GLuint start,
73			      GLuint n );
74
75typedef void (*trans_3fn_func)(GLfloat (*to)[3],
76			      CONST void *ptr,
77			      GLuint stride,
78			      GLuint start,
79			      GLuint n );
80
81
82
83
84#define TYPE_IDX(t) ((t) & 0xf)
85#define MAX_TYPES TYPE_IDX(GL_DOUBLE)+1      /* 0xa + 1 */
86
87
88/* This macro is used on other systems, so undefine it for this module */
89
90#undef	CHECK
91
92static trans_1f_func  _math_trans_1f_tab[MAX_TYPES];
93static trans_1ui_func _math_trans_1ui_tab[MAX_TYPES];
94static trans_1ub_func _math_trans_1ub_tab[MAX_TYPES];
95static trans_3fn_func  _math_trans_3fn_tab[MAX_TYPES];
96static trans_4ub_func _math_trans_4ub_tab[5][MAX_TYPES];
97static trans_4us_func _math_trans_4us_tab[5][MAX_TYPES];
98static trans_4f_func  _math_trans_4f_tab[5][MAX_TYPES];
99static trans_4f_func  _math_trans_4fn_tab[5][MAX_TYPES];
100
101
102#define PTR_ELT(ptr, elt) (((SRC *)ptr)[elt])
103
104
105#define TAB(x) _math_trans##x##_tab
106#define ARGS   GLuint start, GLuint n
107#define SRC_START  start
108#define DST_START  0
109#define STRIDE stride
110#define NEXT_F f += stride
111#define NEXT_F2
112#define CHECK
113
114
115
116
117/**
118 * Translate from GL_BYTE.
119 */
120#define SRC GLbyte
121#define SRC_IDX TYPE_IDX(GL_BYTE)
122#define TRX_3FN(f,n)   BYTE_TO_FLOAT( PTR_ELT(f,n) )
123#if 1
124#define TRX_4F(f,n)   BYTE_TO_FLOAT( PTR_ELT(f,n) )
125#else
126#define TRX_4F(f,n)   (GLfloat)( PTR_ELT(f,n) )
127#endif
128#define TRX_4FN(f,n)   BYTE_TO_FLOAT( PTR_ELT(f,n) )
129#define TRX_UB(ub, f,n)  ub = BYTE_TO_UBYTE( PTR_ELT(f,n) )
130#define TRX_US(ch, f,n)  ch = BYTE_TO_USHORT( PTR_ELT(f,n) )
131#define TRX_UI(f,n)  (PTR_ELT(f,n) < 0 ? 0 : (GLuint)  PTR_ELT(f,n))
132
133
134#define SZ 4
135#define INIT init_trans_4_GLbyte_raw
136#define DEST_4F trans_4_GLbyte_4f_raw
137#define DEST_4FN trans_4_GLbyte_4fn_raw
138#define DEST_4UB trans_4_GLbyte_4ub_raw
139#define DEST_4US trans_4_GLbyte_4us_raw
140#include "m_trans_tmp.h"
141
142#define SZ 3
143#define INIT init_trans_3_GLbyte_raw
144#define DEST_4F trans_3_GLbyte_4f_raw
145#define DEST_4FN trans_3_GLbyte_4fn_raw
146#define DEST_4UB trans_3_GLbyte_4ub_raw
147#define DEST_4US trans_3_GLbyte_4us_raw
148#define DEST_3FN trans_3_GLbyte_3fn_raw
149#include "m_trans_tmp.h"
150
151#define SZ 2
152#define INIT init_trans_2_GLbyte_raw
153#define DEST_4F trans_2_GLbyte_4f_raw
154#define DEST_4FN trans_2_GLbyte_4fn_raw
155#include "m_trans_tmp.h"
156
157#define SZ 1
158#define INIT init_trans_1_GLbyte_raw
159#define DEST_4F trans_1_GLbyte_4f_raw
160#define DEST_4FN trans_1_GLbyte_4fn_raw
161#define DEST_1UB trans_1_GLbyte_1ub_raw
162#define DEST_1UI trans_1_GLbyte_1ui_raw
163#include "m_trans_tmp.h"
164
165#undef SRC
166#undef TRX_3FN
167#undef TRX_4F
168#undef TRX_4FN
169#undef TRX_UB
170#undef TRX_US
171#undef TRX_UI
172#undef SRC_IDX
173
174
175/**
176 * Translate from GL_UNSIGNED_BYTE.
177 */
178#define SRC GLubyte
179#define SRC_IDX TYPE_IDX(GL_UNSIGNED_BYTE)
180#define TRX_3FN(f,n)	     UBYTE_TO_FLOAT(PTR_ELT(f,n))
181#define TRX_4F(f,n)	     (GLfloat)( PTR_ELT(f,n) )
182#define TRX_4FN(f,n)	     UBYTE_TO_FLOAT(PTR_ELT(f,n))
183#define TRX_UB(ub, f,n)	     ub = PTR_ELT(f,n)
184#define TRX_US(us, f,n)      us = UBYTE_TO_USHORT(PTR_ELT(f,n))
185#define TRX_UI(f,n)          (GLuint)PTR_ELT(f,n)
186
187/* 4ub->4ub handled in special case below.
188 */
189#define SZ 4
190#define INIT init_trans_4_GLubyte_raw
191#define DEST_4F trans_4_GLubyte_4f_raw
192#define DEST_4FN trans_4_GLubyte_4fn_raw
193#define DEST_4US trans_4_GLubyte_4us_raw
194#include "m_trans_tmp.h"
195
196
197#define SZ 3
198#define INIT init_trans_3_GLubyte_raw
199#define DEST_4UB trans_3_GLubyte_4ub_raw
200#define DEST_4US trans_3_GLubyte_4us_raw
201#define DEST_3FN trans_3_GLubyte_3fn_raw
202#define DEST_4F trans_3_GLubyte_4f_raw
203#define DEST_4FN trans_3_GLubyte_4fn_raw
204#include "m_trans_tmp.h"
205
206
207#define SZ 1
208#define INIT init_trans_1_GLubyte_raw
209#define DEST_1UI trans_1_GLubyte_1ui_raw
210#define DEST_1UB trans_1_GLubyte_1ub_raw
211#include "m_trans_tmp.h"
212
213#undef SRC
214#undef SRC_IDX
215#undef TRX_3FN
216#undef TRX_4F
217#undef TRX_4FN
218#undef TRX_UB
219#undef TRX_US
220#undef TRX_UI
221
222
223/* GL_SHORT
224 */
225#define SRC GLshort
226#define SRC_IDX TYPE_IDX(GL_SHORT)
227#define TRX_3FN(f,n)   SHORT_TO_FLOAT( PTR_ELT(f,n) )
228#define TRX_4F(f,n)   (GLfloat)( PTR_ELT(f,n) )
229#define TRX_4FN(f,n)  SHORT_TO_FLOAT( PTR_ELT(f,n) )
230#define TRX_UB(ub, f,n)  ub = SHORT_TO_UBYTE(PTR_ELT(f,n))
231#define TRX_US(us, f,n)  us = SHORT_TO_USHORT(PTR_ELT(f,n))
232#define TRX_UI(f,n)  (PTR_ELT(f,n) < 0 ? 0 : (GLuint)  PTR_ELT(f,n))
233
234
235#define SZ  4
236#define INIT init_trans_4_GLshort_raw
237#define DEST_4F trans_4_GLshort_4f_raw
238#define DEST_4FN trans_4_GLshort_4fn_raw
239#define DEST_4UB trans_4_GLshort_4ub_raw
240#define DEST_4US trans_4_GLshort_4us_raw
241#include "m_trans_tmp.h"
242
243#define SZ 3
244#define INIT init_trans_3_GLshort_raw
245#define DEST_4F trans_3_GLshort_4f_raw
246#define DEST_4FN trans_3_GLshort_4fn_raw
247#define DEST_4UB trans_3_GLshort_4ub_raw
248#define DEST_4US trans_3_GLshort_4us_raw
249#define DEST_3FN trans_3_GLshort_3fn_raw
250#include "m_trans_tmp.h"
251
252#define SZ 2
253#define INIT init_trans_2_GLshort_raw
254#define DEST_4F trans_2_GLshort_4f_raw
255#define DEST_4FN trans_2_GLshort_4fn_raw
256#include "m_trans_tmp.h"
257
258#define SZ 1
259#define INIT init_trans_1_GLshort_raw
260#define DEST_4F trans_1_GLshort_4f_raw
261#define DEST_4FN trans_1_GLshort_4fn_raw
262#define DEST_1UB trans_1_GLshort_1ub_raw
263#define DEST_1UI trans_1_GLshort_1ui_raw
264#include "m_trans_tmp.h"
265
266
267#undef SRC
268#undef SRC_IDX
269#undef TRX_3FN
270#undef TRX_4F
271#undef TRX_4FN
272#undef TRX_UB
273#undef TRX_US
274#undef TRX_UI
275
276
277/* GL_UNSIGNED_SHORT
278 */
279#define SRC GLushort
280#define SRC_IDX TYPE_IDX(GL_UNSIGNED_SHORT)
281#define TRX_3FN(f,n)   USHORT_TO_FLOAT( PTR_ELT(f,n) )
282#define TRX_4F(f,n)   (GLfloat)( PTR_ELT(f,n) )
283#define TRX_4FN(f,n)  USHORT_TO_FLOAT( PTR_ELT(f,n) )
284#define TRX_UB(ub,f,n)  ub = (GLubyte) (PTR_ELT(f,n) >> 8)
285#define TRX_US(us,f,n)  us = PTR_ELT(f,n)
286#define TRX_UI(f,n)  (GLuint)   PTR_ELT(f,n)
287
288
289#define SZ 4
290#define INIT init_trans_4_GLushort_raw
291#define DEST_4F trans_4_GLushort_4f_raw
292#define DEST_4FN trans_4_GLushort_4fn_raw
293#define DEST_4UB trans_4_GLushort_4ub_raw
294#define DEST_4US trans_4_GLushort_4us_raw
295#include "m_trans_tmp.h"
296
297#define SZ 3
298#define INIT init_trans_3_GLushort_raw
299#define DEST_4F trans_3_GLushort_4f_raw
300#define DEST_4FN trans_3_GLushort_4fn_raw
301#define DEST_4UB trans_3_GLushort_4ub_raw
302#define DEST_4US trans_3_GLushort_4us_raw
303#define DEST_3FN trans_3_GLushort_3fn_raw
304#include "m_trans_tmp.h"
305
306#define SZ 2
307#define INIT init_trans_2_GLushort_raw
308#define DEST_4F trans_2_GLushort_4f_raw
309#define DEST_4FN trans_2_GLushort_4fn_raw
310#include "m_trans_tmp.h"
311
312#define SZ 1
313#define INIT init_trans_1_GLushort_raw
314#define DEST_4F trans_1_GLushort_4f_raw
315#define DEST_4FN trans_1_GLushort_4fn_raw
316#define DEST_1UB trans_1_GLushort_1ub_raw
317#define DEST_1UI trans_1_GLushort_1ui_raw
318#include "m_trans_tmp.h"
319
320#undef SRC
321#undef SRC_IDX
322#undef TRX_3FN
323#undef TRX_4F
324#undef TRX_4FN
325#undef TRX_UB
326#undef TRX_US
327#undef TRX_UI
328
329
330/* GL_INT
331 */
332#define SRC GLint
333#define SRC_IDX TYPE_IDX(GL_INT)
334#define TRX_3FN(f,n)   INT_TO_FLOAT( PTR_ELT(f,n) )
335#define TRX_4F(f,n)   (GLfloat)( PTR_ELT(f,n) )
336#define TRX_4FN(f,n)  INT_TO_FLOAT( PTR_ELT(f,n) )
337#define TRX_UB(ub, f,n)  ub = INT_TO_UBYTE(PTR_ELT(f,n))
338#define TRX_US(us, f,n)  us = INT_TO_USHORT(PTR_ELT(f,n))
339#define TRX_UI(f,n)  (PTR_ELT(f,n) < 0 ? 0 : (GLuint)  PTR_ELT(f,n))
340
341
342#define SZ 4
343#define INIT init_trans_4_GLint_raw
344#define DEST_4F trans_4_GLint_4f_raw
345#define DEST_4FN trans_4_GLint_4fn_raw
346#define DEST_4UB trans_4_GLint_4ub_raw
347#define DEST_4US trans_4_GLint_4us_raw
348#include "m_trans_tmp.h"
349
350#define SZ 3
351#define INIT init_trans_3_GLint_raw
352#define DEST_4F trans_3_GLint_4f_raw
353#define DEST_4FN trans_3_GLint_4fn_raw
354#define DEST_4UB trans_3_GLint_4ub_raw
355#define DEST_4US trans_3_GLint_4us_raw
356#define DEST_3FN trans_3_GLint_3fn_raw
357#include "m_trans_tmp.h"
358
359#define SZ 2
360#define INIT init_trans_2_GLint_raw
361#define DEST_4F trans_2_GLint_4f_raw
362#define DEST_4FN trans_2_GLint_4fn_raw
363#include "m_trans_tmp.h"
364
365#define SZ 1
366#define INIT init_trans_1_GLint_raw
367#define DEST_4F trans_1_GLint_4f_raw
368#define DEST_4FN trans_1_GLint_4fn_raw
369#define DEST_1UB trans_1_GLint_1ub_raw
370#define DEST_1UI trans_1_GLint_1ui_raw
371#include "m_trans_tmp.h"
372
373
374#undef SRC
375#undef SRC_IDX
376#undef TRX_3FN
377#undef TRX_4F
378#undef TRX_4FN
379#undef TRX_UB
380#undef TRX_US
381#undef TRX_UI
382
383
384/* GL_UNSIGNED_INT
385 */
386#define SRC GLuint
387#define SRC_IDX TYPE_IDX(GL_UNSIGNED_INT)
388#define TRX_3FN(f,n)   INT_TO_FLOAT( PTR_ELT(f,n) )
389#define TRX_4F(f,n)   (GLfloat)( PTR_ELT(f,n) )
390#define TRX_4FN(f,n)  UINT_TO_FLOAT( PTR_ELT(f,n) )
391#define TRX_UB(ub, f,n)  ub = (GLubyte) (PTR_ELT(f,n) >> 24)
392#define TRX_US(us, f,n)  us = (GLshort) (PTR_ELT(f,n) >> 16)
393#define TRX_UI(f,n)		PTR_ELT(f,n)
394
395
396#define SZ 4
397#define INIT init_trans_4_GLuint_raw
398#define DEST_4F trans_4_GLuint_4f_raw
399#define DEST_4FN trans_4_GLuint_4fn_raw
400#define DEST_4UB trans_4_GLuint_4ub_raw
401#define DEST_4US trans_4_GLuint_4us_raw
402#include "m_trans_tmp.h"
403
404#define SZ 3
405#define INIT init_trans_3_GLuint_raw
406#define DEST_4F trans_3_GLuint_4f_raw
407#define DEST_4FN trans_3_GLuint_4fn_raw
408#define DEST_4UB trans_3_GLuint_4ub_raw
409#define DEST_4US trans_3_GLuint_4us_raw
410#define DEST_3FN trans_3_GLuint_3fn_raw
411#include "m_trans_tmp.h"
412
413#define SZ 2
414#define INIT init_trans_2_GLuint_raw
415#define DEST_4F trans_2_GLuint_4f_raw
416#define DEST_4FN trans_2_GLuint_4fn_raw
417#include "m_trans_tmp.h"
418
419#define SZ 1
420#define INIT init_trans_1_GLuint_raw
421#define DEST_4F trans_1_GLuint_4f_raw
422#define DEST_4FN trans_1_GLuint_4fn_raw
423#define DEST_1UB trans_1_GLuint_1ub_raw
424#define DEST_1UI trans_1_GLuint_1ui_raw
425#include "m_trans_tmp.h"
426
427#undef SRC
428#undef SRC_IDX
429#undef TRX_3FN
430#undef TRX_4F
431#undef TRX_4FN
432#undef TRX_UB
433#undef TRX_US
434#undef TRX_UI
435
436
437/* GL_DOUBLE
438 */
439#define SRC GLdouble
440#define SRC_IDX TYPE_IDX(GL_DOUBLE)
441#define TRX_3FN(f,n)   (GLfloat) PTR_ELT(f,n)
442#define TRX_4F(f,n)   (GLfloat) PTR_ELT(f,n)
443#define TRX_4FN(f,n)   (GLfloat) PTR_ELT(f,n)
444#define TRX_UB(ub,f,n) UNCLAMPED_FLOAT_TO_UBYTE(ub, PTR_ELT(f,n))
445#define TRX_US(us,f,n) UNCLAMPED_FLOAT_TO_USHORT(us, PTR_ELT(f,n))
446#define TRX_UI(f,n)  (GLuint) (GLint) PTR_ELT(f,n)
447#define TRX_1F(f,n)   (GLfloat) PTR_ELT(f,n)
448
449
450#define SZ 4
451#define INIT init_trans_4_GLdouble_raw
452#define DEST_4F trans_4_GLdouble_4f_raw
453#define DEST_4FN trans_4_GLdouble_4fn_raw
454#define DEST_4UB trans_4_GLdouble_4ub_raw
455#define DEST_4US trans_4_GLdouble_4us_raw
456#include "m_trans_tmp.h"
457
458#define SZ 3
459#define INIT init_trans_3_GLdouble_raw
460#define DEST_4F trans_3_GLdouble_4f_raw
461#define DEST_4FN trans_3_GLdouble_4fn_raw
462#define DEST_4UB trans_3_GLdouble_4ub_raw
463#define DEST_4US trans_3_GLdouble_4us_raw
464#define DEST_3FN trans_3_GLdouble_3fn_raw
465#include "m_trans_tmp.h"
466
467#define SZ 2
468#define INIT init_trans_2_GLdouble_raw
469#define DEST_4F trans_2_GLdouble_4f_raw
470#define DEST_4FN trans_2_GLdouble_4fn_raw
471#include "m_trans_tmp.h"
472
473#define SZ 1
474#define INIT init_trans_1_GLdouble_raw
475#define DEST_4F trans_1_GLdouble_4f_raw
476#define DEST_4FN trans_1_GLdouble_4fn_raw
477#define DEST_1UB trans_1_GLdouble_1ub_raw
478#define DEST_1UI trans_1_GLdouble_1ui_raw
479#define DEST_1F trans_1_GLdouble_1f_raw
480#include "m_trans_tmp.h"
481
482#undef SRC
483#undef SRC_IDX
484
485/* GL_FLOAT
486 */
487#define SRC GLfloat
488#define SRC_IDX TYPE_IDX(GL_FLOAT)
489#define SZ 4
490#define INIT init_trans_4_GLfloat_raw
491#define DEST_4UB trans_4_GLfloat_4ub_raw
492#define DEST_4US trans_4_GLfloat_4us_raw
493#define DEST_4F  trans_4_GLfloat_4f_raw
494#define DEST_4FN  trans_4_GLfloat_4fn_raw
495#include "m_trans_tmp.h"
496
497#define SZ 3
498#define INIT init_trans_3_GLfloat_raw
499#define DEST_4F  trans_3_GLfloat_4f_raw
500#define DEST_4FN  trans_3_GLfloat_4fn_raw
501#define DEST_4UB trans_3_GLfloat_4ub_raw
502#define DEST_4US trans_3_GLfloat_4us_raw
503#define DEST_3FN trans_3_GLfloat_3fn_raw
504#include "m_trans_tmp.h"
505
506#define SZ 2
507#define INIT init_trans_2_GLfloat_raw
508#define DEST_4F trans_2_GLfloat_4f_raw
509#define DEST_4FN trans_2_GLfloat_4fn_raw
510#include "m_trans_tmp.h"
511
512#define SZ 1
513#define INIT init_trans_1_GLfloat_raw
514#define DEST_4F  trans_1_GLfloat_4f_raw
515#define DEST_4FN  trans_1_GLfloat_4fn_raw
516#define DEST_1UB trans_1_GLfloat_1ub_raw
517#define DEST_1UI trans_1_GLfloat_1ui_raw
518#define DEST_1F trans_1_GLfloat_1f_raw
519
520#include "m_trans_tmp.h"
521
522#undef SRC
523#undef SRC_IDX
524#undef TRX_3FN
525#undef TRX_4F
526#undef TRX_4FN
527#undef TRX_UB
528#undef TRX_US
529#undef TRX_UI
530
531
532static void trans_4_GLubyte_4ub_raw(GLubyte (*t)[4],
533				    CONST void *Ptr,
534				    GLuint stride,
535				    ARGS )
536{
537   const GLubyte *f = (GLubyte *) Ptr + SRC_START * stride;
538   GLuint i;
539
540   if (((((uintptr_t) f | (uintptr_t) stride)) & 3L) == 0L) {
541      /* Aligned.
542       */
543      for (i = DST_START ; i < n ; i++, f += stride) {
544	 COPY_4UBV( t[i], f );
545      }
546   } else {
547      for (i = DST_START ; i < n ; i++, f += stride) {
548	 t[i][0] = f[0];
549	 t[i][1] = f[1];
550	 t[i][2] = f[2];
551	 t[i][3] = f[3];
552      }
553   }
554}
555
556
557static void init_translate_raw(void)
558{
559   memset( TAB(_1ui), 0, sizeof(TAB(_1ui)) );
560   memset( TAB(_1ub), 0, sizeof(TAB(_1ub)) );
561   memset( TAB(_3fn),  0, sizeof(TAB(_3fn)) );
562   memset( TAB(_4ub), 0, sizeof(TAB(_4ub)) );
563   memset( TAB(_4us), 0, sizeof(TAB(_4us)) );
564   memset( TAB(_4f),  0, sizeof(TAB(_4f)) );
565   memset( TAB(_4fn),  0, sizeof(TAB(_4fn)) );
566
567   init_trans_4_GLbyte_raw();
568   init_trans_3_GLbyte_raw();
569   init_trans_2_GLbyte_raw();
570   init_trans_1_GLbyte_raw();
571   init_trans_1_GLubyte_raw();
572   init_trans_3_GLubyte_raw();
573   init_trans_4_GLubyte_raw();
574   init_trans_4_GLshort_raw();
575   init_trans_3_GLshort_raw();
576   init_trans_2_GLshort_raw();
577   init_trans_1_GLshort_raw();
578   init_trans_4_GLushort_raw();
579   init_trans_3_GLushort_raw();
580   init_trans_2_GLushort_raw();
581   init_trans_1_GLushort_raw();
582   init_trans_4_GLint_raw();
583   init_trans_3_GLint_raw();
584   init_trans_2_GLint_raw();
585   init_trans_1_GLint_raw();
586   init_trans_4_GLuint_raw();
587   init_trans_3_GLuint_raw();
588   init_trans_2_GLuint_raw();
589   init_trans_1_GLuint_raw();
590   init_trans_4_GLdouble_raw();
591   init_trans_3_GLdouble_raw();
592   init_trans_2_GLdouble_raw();
593   init_trans_1_GLdouble_raw();
594   init_trans_4_GLfloat_raw();
595   init_trans_3_GLfloat_raw();
596   init_trans_2_GLfloat_raw();
597   init_trans_1_GLfloat_raw();
598
599   TAB(_4ub)[4][TYPE_IDX(GL_UNSIGNED_BYTE)] = trans_4_GLubyte_4ub_raw;
600}
601
602
603#undef TAB
604#ifdef CLASS
605#undef CLASS
606#endif
607#undef ARGS
608#undef CHECK
609#undef SRC_START
610#undef DST_START
611#undef NEXT_F
612#undef NEXT_F2
613
614
615
616
617
618void _math_init_translate( void )
619{
620   init_translate_raw();
621}
622
623
624/**
625 * Translate vector of values to GLfloat [1].
626 */
627void _math_trans_1f(GLfloat *to,
628		    CONST void *ptr,
629		    GLuint stride,
630		    GLenum type,
631		    GLuint start,
632		    GLuint n )
633{
634   _math_trans_1f_tab[TYPE_IDX(type)]( to, ptr, stride, start, n );
635}
636
637/**
638 * Translate vector of values to GLuint [1].
639 */
640void _math_trans_1ui(GLuint *to,
641		     CONST void *ptr,
642		     GLuint stride,
643		     GLenum type,
644		     GLuint start,
645		     GLuint n )
646{
647   _math_trans_1ui_tab[TYPE_IDX(type)]( to, ptr, stride, start, n );
648}
649
650/**
651 * Translate vector of values to GLubyte [1].
652 */
653void _math_trans_1ub(GLubyte *to,
654		     CONST void *ptr,
655		     GLuint stride,
656		     GLenum type,
657		     GLuint start,
658		     GLuint n )
659{
660   _math_trans_1ub_tab[TYPE_IDX(type)]( to, ptr, stride, start, n );
661}
662
663
664/**
665 * Translate vector of values to GLubyte [4].
666 */
667void _math_trans_4ub(GLubyte (*to)[4],
668		     CONST void *ptr,
669		     GLuint stride,
670		     GLenum type,
671		     GLuint size,
672		     GLuint start,
673		     GLuint n )
674{
675   _math_trans_4ub_tab[size][TYPE_IDX(type)]( to, ptr, stride, start, n );
676}
677
678/**
679 * Translate vector of values to GLchan [4].
680 */
681void _math_trans_4chan( GLchan (*to)[4],
682			CONST void *ptr,
683			GLuint stride,
684			GLenum type,
685			GLuint size,
686			GLuint start,
687			GLuint n )
688{
689#if CHAN_TYPE == GL_UNSIGNED_BYTE
690   _math_trans_4ub( to, ptr, stride, type, size, start, n );
691#elif CHAN_TYPE == GL_UNSIGNED_SHORT
692   _math_trans_4us( to, ptr, stride, type, size, start, n );
693#elif CHAN_TYPE == GL_FLOAT
694   _math_trans_4fn( to, ptr, stride, type, size, start, n );
695#endif
696}
697
698/**
699 * Translate vector of values to GLushort [4].
700 */
701void _math_trans_4us(GLushort (*to)[4],
702		     CONST void *ptr,
703		     GLuint stride,
704		     GLenum type,
705		     GLuint size,
706		     GLuint start,
707		     GLuint n )
708{
709   _math_trans_4us_tab[size][TYPE_IDX(type)]( to, ptr, stride, start, n );
710}
711
712/**
713 * Translate vector of values to GLfloat [4].
714 */
715void _math_trans_4f(GLfloat (*to)[4],
716		    CONST void *ptr,
717		    GLuint stride,
718		    GLenum type,
719		    GLuint size,
720		    GLuint start,
721		    GLuint n )
722{
723   _math_trans_4f_tab[size][TYPE_IDX(type)]( to, ptr, stride, start, n );
724}
725
726/**
727 * Translate vector of values to GLfloat[4], normalized to [-1, 1].
728 */
729void _math_trans_4fn(GLfloat (*to)[4],
730		    CONST void *ptr,
731		    GLuint stride,
732		    GLenum type,
733		    GLuint size,
734		    GLuint start,
735		    GLuint n )
736{
737   _math_trans_4fn_tab[size][TYPE_IDX(type)]( to, ptr, stride, start, n );
738}
739
740/**
741 * Translate vector of values to GLfloat[3], normalized to [-1, 1].
742 */
743void _math_trans_3fn(GLfloat (*to)[3],
744		    CONST void *ptr,
745		    GLuint stride,
746		    GLenum type,
747		    GLuint start,
748		    GLuint n )
749{
750   _math_trans_3fn_tab[TYPE_IDX(type)]( to, ptr, stride, start, n );
751}
752