Home | History | Annotate | Download | only in math
      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 
     39 typedef void (*trans_1f_func)(GLfloat *to,
     40 			      CONST void *ptr,
     41 			      GLuint stride,
     42 			      GLuint start,
     43 			      GLuint n );
     44 
     45 typedef void (*trans_1ui_func)(GLuint *to,
     46 			       CONST void *ptr,
     47 			       GLuint stride,
     48 			       GLuint start,
     49 			       GLuint n );
     50 
     51 typedef void (*trans_1ub_func)(GLubyte *to,
     52 			       CONST void *ptr,
     53 			       GLuint stride,
     54 			       GLuint start,
     55 			       GLuint n );
     56 
     57 typedef void (*trans_4ub_func)(GLubyte (*to)[4],
     58                                CONST void *ptr,
     59                                GLuint stride,
     60                                GLuint start,
     61                                GLuint n );
     62 
     63 typedef void (*trans_4us_func)(GLushort (*to)[4],
     64                                CONST void *ptr,
     65                                GLuint stride,
     66                                GLuint start,
     67                                GLuint n );
     68 
     69 typedef void (*trans_4f_func)(GLfloat (*to)[4],
     70 			      CONST void *ptr,
     71 			      GLuint stride,
     72 			      GLuint start,
     73 			      GLuint n );
     74 
     75 typedef 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 
     92 static trans_1f_func  _math_trans_1f_tab[MAX_TYPES];
     93 static trans_1ui_func _math_trans_1ui_tab[MAX_TYPES];
     94 static trans_1ub_func _math_trans_1ub_tab[MAX_TYPES];
     95 static trans_3fn_func  _math_trans_3fn_tab[MAX_TYPES];
     96 static trans_4ub_func _math_trans_4ub_tab[5][MAX_TYPES];
     97 static trans_4us_func _math_trans_4us_tab[5][MAX_TYPES];
     98 static trans_4f_func  _math_trans_4f_tab[5][MAX_TYPES];
     99 static 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 
    532 static 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 
    557 static 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 
    618 void _math_init_translate( void )
    619 {
    620    init_translate_raw();
    621 }
    622 
    623 
    624 /**
    625  * Translate vector of values to GLfloat [1].
    626  */
    627 void _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  */
    640 void _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  */
    653 void _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  */
    667 void _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  */
    681 void _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  */
    701 void _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  */
    715 void _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  */
    729 void _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  */
    743 void _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