blob: 945e35706c456862a9a817b05037b6c69b05af0a [file] [log] [blame]
Keith Whitwell23caf202000-11-16 21:05:34 +00001/* $Id: m_translate.c,v 1.1 2000/11/16 21:05:41 keithw Exp $ */
2
3/*
4 * Mesa 3-D graphics library
5 * Version: 3.3
6 *
7 * Copyright (C) 1999 Brian Paul All Rights Reserved.
8 *
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:
15 *
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
18 *
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.
25 */
26
27/*
28 * New (3.1) transformation code written by Keith Whitwell.
29 */
30
31
32#include "glheader.h"
33#include "colormac.h"
34#include "mem.h"
35#include "mmath.h"
36
37#include "m_translate.h"
38
39/* This macro is used on other systems, so undefine it for this module */
40
41#undef CHECK
42
43trans_1f_func gl_trans_1f_tab[MAX_TYPES];
44trans_1ui_func gl_trans_1ui_tab[MAX_TYPES];
45trans_1ub_func gl_trans_1ub_tab[MAX_TYPES];
46trans_3f_func gl_trans_3f_tab[MAX_TYPES];
47trans_4ub_func gl_trans_4ub_tab[5][MAX_TYPES];
48trans_4f_func gl_trans_4f_tab[5][MAX_TYPES];
49
50
51#define PTR_ELT(ptr, elt) (((SRC *)ptr)[elt])
52
53
54#define TAB(x) gl_trans##x##_tab
55#define ARGS GLuint start, GLuint n
56#define SRC_START start
57#define DST_START 0
58#define STRIDE stride
59#define NEXT_F f += stride
60#define NEXT_F2
61#define CHECK
62
63
64
65
66/* GL_BYTE
67 */
68#define SRC GLbyte
69#define SRC_IDX TYPE_IDX(GL_BYTE)
70#define TRX_3F(f,n) BYTE_TO_FLOAT( PTR_ELT(f,n) )
71#define TRX_4F(f,n) (GLfloat)( PTR_ELT(f,n) )
72#define TRX_UB(ub, f,n) ub = BYTE_TO_UBYTE( PTR_ELT(f,n) )
73#define TRX_UI(f,n) (PTR_ELT(f,n) < 0 ? 0 : (GLuint) PTR_ELT(f,n))
74
75
76#define SZ 4
77#define INIT init_trans_4_GLbyte_raw
78#define DEST_4F trans_4_GLbyte_4f_raw
79#define DEST_4UB trans_4_GLbyte_4ub_raw
80#include "m_trans_tmp.h"
81
82#define SZ 3
83#define INIT init_trans_3_GLbyte_raw
84#define DEST_4F trans_3_GLbyte_4f_raw
85#define DEST_4UB trans_3_GLbyte_4ub_raw
86#define DEST_3F trans_3_GLbyte_3f_raw
87#include "m_trans_tmp.h"
88
89#define SZ 2
90#define INIT init_trans_2_GLbyte_raw
91#define DEST_4F trans_2_GLbyte_4f_raw
92#include "m_trans_tmp.h"
93
94#define SZ 1
95#define INIT init_trans_1_GLbyte_raw
96#define DEST_4F trans_1_GLbyte_4f_raw
97#define DEST_1UB trans_1_GLbyte_1ub_raw
98#define DEST_1UI trans_1_GLbyte_1ui_raw
99#include "m_trans_tmp.h"
100
101#undef SRC
102#undef TRX_3F
103#undef TRX_4F
104#undef TRX_UB
105#undef TRX_UI
106#undef SRC_IDX
107
108/* GL_UNSIGNED_BYTE
109 */
110#define SRC GLubyte
111#define SRC_IDX TYPE_IDX(GL_UNSIGNED_BYTE)
112#define TRX_3F(f,n) /* unused */
113#define TRX_4F(f,n) /* unused */
114#define TRX_UB(ub, f,n) ub = PTR_ELT(f,n)
115#define TRX_UI(f,n) (GLuint)PTR_ELT(f,n)
116
117/* 4ub->4ub handled in special case below.
118 */
119
120#define SZ 3
121#define INIT init_trans_3_GLubyte_raw
122#define DEST_4UB trans_3_GLubyte_4ub_raw
123#include "m_trans_tmp.h"
124
125
126#define SZ 1
127#define INIT init_trans_1_GLubyte_raw
128#define DEST_1UI trans_1_GLubyte_1ui_raw
129#define DEST_1UB trans_1_GLubyte_1ub_raw
130#include "m_trans_tmp.h"
131
132#undef SRC
133#undef SRC_IDX
134#undef TRX_3F
135#undef TRX_4F
136#undef TRX_UB
137#undef TRX_UI
138
139
140/* GL_SHORT
141 */
142#define SRC GLshort
143#define SRC_IDX TYPE_IDX(GL_SHORT)
144#define TRX_3F(f,n) SHORT_TO_FLOAT( PTR_ELT(f,n) )
145#define TRX_4F(f,n) (GLfloat)( PTR_ELT(f,n) )
146#define TRX_UB(ub, f,n) ub = SHORT_TO_UBYTE(PTR_ELT(f,n))
147#define TRX_UI(f,n) (PTR_ELT(f,n) < 0 ? 0 : (GLuint) PTR_ELT(f,n))
148
149
150#define SZ 4
151#define INIT init_trans_4_GLshort_raw
152#define DEST_4F trans_4_GLshort_4f_raw
153#define DEST_4UB trans_4_GLshort_4ub_raw
154#include "m_trans_tmp.h"
155
156#define SZ 3
157#define INIT init_trans_3_GLshort_raw
158#define DEST_4F trans_3_GLshort_4f_raw
159#define DEST_4UB trans_3_GLshort_4ub_raw
160#define DEST_3F trans_3_GLshort_3f_raw
161#include "m_trans_tmp.h"
162
163#define SZ 2
164#define INIT init_trans_2_GLshort_raw
165#define DEST_4F trans_2_GLshort_4f_raw
166#include "m_trans_tmp.h"
167
168#define SZ 1
169#define INIT init_trans_1_GLshort_raw
170#define DEST_4F trans_1_GLshort_4f_raw
171#define DEST_1UB trans_1_GLshort_1ub_raw
172#define DEST_1UI trans_1_GLshort_1ui_raw
173#include "m_trans_tmp.h"
174
175
176#undef SRC
177#undef SRC_IDX
178#undef TRX_3F
179#undef TRX_4F
180#undef TRX_UB
181#undef TRX_UI
182
183
184/* GL_UNSIGNED_SHORT
185 */
186#define SRC GLushort
187#define SRC_IDX TYPE_IDX(GL_UNSIGNED_SHORT)
188#define TRX_3F(f,n) USHORT_TO_FLOAT( PTR_ELT(f,n) )
189#define TRX_4F(f,n) (GLfloat)( PTR_ELT(f,n) )
190#define TRX_UB(ub,f,n) ub = (GLubyte) (PTR_ELT(f,n) >> 8)
191#define TRX_UI(f,n) (GLuint) PTR_ELT(f,n)
192
193
194#define SZ 4
195#define INIT init_trans_4_GLushort_raw
196#define DEST_4F trans_4_GLushort_4f_raw
197#define DEST_4UB trans_4_GLushort_4ub_raw
198#include "m_trans_tmp.h"
199
200#define SZ 3
201#define INIT init_trans_3_GLushort_raw
202#define DEST_4F trans_3_GLushort_4f_raw
203#define DEST_4UB trans_3_GLushort_4ub_raw
204#define DEST_3F trans_3_GLushort_3f_raw
205#include "m_trans_tmp.h"
206
207#define SZ 2
208#define INIT init_trans_2_GLushort_raw
209#define DEST_4F trans_2_GLushort_4f_raw
210#include "m_trans_tmp.h"
211
212#define SZ 1
213#define INIT init_trans_1_GLushort_raw
214#define DEST_4F trans_1_GLushort_4f_raw
215#define DEST_1UB trans_1_GLushort_1ub_raw
216#define DEST_1UI trans_1_GLushort_1ui_raw
217#include "m_trans_tmp.h"
218
219#undef SRC
220#undef SRC_IDX
221#undef TRX_3F
222#undef TRX_4F
223#undef TRX_UB
224#undef TRX_UI
225
226
227/* GL_INT
228 */
229#define SRC GLint
230#define SRC_IDX TYPE_IDX(GL_INT)
231#define TRX_3F(f,n) INT_TO_FLOAT( PTR_ELT(f,n) )
232#define TRX_4F(f,n) (GLfloat)( PTR_ELT(f,n) )
233#define TRX_UB(ub, f,n) ub = INT_TO_UBYTE(PTR_ELT(f,n))
234#define TRX_UI(f,n) (PTR_ELT(f,n) < 0 ? 0 : (GLuint) PTR_ELT(f,n))
235
236
237#define SZ 4
238#define INIT init_trans_4_GLint_raw
239#define DEST_4F trans_4_GLint_4f_raw
240#define DEST_4UB trans_4_GLint_4ub_raw
241#include "m_trans_tmp.h"
242
243#define SZ 3
244#define INIT init_trans_3_GLint_raw
245#define DEST_4F trans_3_GLint_4f_raw
246#define DEST_4UB trans_3_GLint_4ub_raw
247#define DEST_3F trans_3_GLint_3f_raw
248#include "m_trans_tmp.h"
249
250#define SZ 2
251#define INIT init_trans_2_GLint_raw
252#define DEST_4F trans_2_GLint_4f_raw
253#include "m_trans_tmp.h"
254
255#define SZ 1
256#define INIT init_trans_1_GLint_raw
257#define DEST_4F trans_1_GLint_4f_raw
258#define DEST_1UB trans_1_GLint_1ub_raw
259#define DEST_1UI trans_1_GLint_1ui_raw
260#include "m_trans_tmp.h"
261
262
263#undef SRC
264#undef SRC_IDX
265#undef TRX_3F
266#undef TRX_4F
267#undef TRX_UB
268#undef TRX_UI
269
270
271/* GL_UNSIGNED_INT
272 */
273#define SRC GLuint
274#define SRC_IDX TYPE_IDX(GL_UNSIGNED_INT)
275#define TRX_3F(f,n) INT_TO_FLOAT( PTR_ELT(f,n) )
276#define TRX_4F(f,n) (GLfloat)( PTR_ELT(f,n) )
277#define TRX_UB(ub, f,n) ub = (GLubyte) (PTR_ELT(f,n) >> 24)
278#define TRX_UI(f,n) PTR_ELT(f,n)
279
280
281#define SZ 4
282#define INIT init_trans_4_GLuint_raw
283#define DEST_4F trans_4_GLuint_4f_raw
284#define DEST_4UB trans_4_GLuint_4ub_raw
285#include "m_trans_tmp.h"
286
287#define SZ 3
288#define INIT init_trans_3_GLuint_raw
289#define DEST_4F trans_3_GLuint_4f_raw
290#define DEST_4UB trans_3_GLuint_4ub_raw
291#define DEST_3F trans_3_GLuint_3f_raw
292#include "m_trans_tmp.h"
293
294#define SZ 2
295#define INIT init_trans_2_GLuint_raw
296#define DEST_4F trans_2_GLuint_4f_raw
297#include "m_trans_tmp.h"
298
299#define SZ 1
300#define INIT init_trans_1_GLuint_raw
301#define DEST_4F trans_1_GLuint_4f_raw
302#define DEST_1UB trans_1_GLuint_1ub_raw
303#define DEST_1UI trans_1_GLuint_1ui_raw
304#include "m_trans_tmp.h"
305
306#undef SRC
307#undef SRC_IDX
308#undef TRX_3F
309#undef TRX_4F
310#undef TRX_UB
311#undef TRX_UI
312
313
314/* GL_DOUBLE
315 */
316#define SRC GLdouble
317#define SRC_IDX TYPE_IDX(GL_DOUBLE)
318#define TRX_3F(f,n) PTR_ELT(f,n)
319#define TRX_4F(f,n) PTR_ELT(f,n)
320#define TRX_UB(ub,f,n) FLOAT_COLOR_TO_CHAN(ub, PTR_ELT(f,n))
321#define TRX_UI(f,n) (GLuint) (GLint) PTR_ELT(f,n)
322#define TRX_1F(f,n) PTR_ELT(f,n)
323
324
325#define SZ 4
326#define INIT init_trans_4_GLdouble_raw
327#define DEST_4F trans_4_GLdouble_4f_raw
328#define DEST_4UB trans_4_GLdouble_4ub_raw
329#include "m_trans_tmp.h"
330
331#define SZ 3
332#define INIT init_trans_3_GLdouble_raw
333#define DEST_4F trans_3_GLdouble_4f_raw
334#define DEST_4UB trans_3_GLdouble_4ub_raw
335#define DEST_3F trans_3_GLdouble_3f_raw
336#include "m_trans_tmp.h"
337
338#define SZ 2
339#define INIT init_trans_2_GLdouble_raw
340#define DEST_4F trans_2_GLdouble_4f_raw
341#include "m_trans_tmp.h"
342
343#define SZ 1
344#define INIT init_trans_1_GLdouble_raw
345#define DEST_4F trans_1_GLdouble_4f_raw
346#define DEST_1UB trans_1_GLdouble_1ub_raw
347#define DEST_1UI trans_1_GLdouble_1ui_raw
348#define DEST_1F trans_1_GLdouble_1f_raw
349#include "m_trans_tmp.h"
350
351#undef SRC
352#undef SRC_IDX
353
354/* GL_FLOAT
355 */
356#define SRC GLfloat
357#define SRC_IDX TYPE_IDX(GL_FLOAT)
358#define SZ 4
359#define INIT init_trans_4_GLfloat_raw
360#define DEST_4UB trans_4_GLfloat_4ub_raw
361#define DEST_4F trans_4_GLfloat_4f_raw
362#include "m_trans_tmp.h"
363
364#define SZ 3
365#define INIT init_trans_3_GLfloat_raw
366#define DEST_4F trans_3_GLfloat_4f_raw
367#define DEST_4UB trans_3_GLfloat_4ub_raw
368#define DEST_3F trans_3_GLfloat_3f_raw
369#include "m_trans_tmp.h"
370
371#define SZ 2
372#define INIT init_trans_2_GLfloat_raw
373#define DEST_4F trans_2_GLfloat_4f_raw
374#include "m_trans_tmp.h"
375
376#define SZ 1
377#define INIT init_trans_1_GLfloat_raw
378#define DEST_4F trans_1_GLfloat_4f_raw
379#define DEST_1UB trans_1_GLfloat_1ub_raw
380#define DEST_1UI trans_1_GLfloat_1ui_raw
381#define DEST_1F trans_1_GLfloat_1f_raw
382
383#include "m_trans_tmp.h"
384
385#undef SRC
386#undef SRC_IDX
387#undef TRX_3F
388#undef TRX_4F
389#undef TRX_UB
390#undef TRX_UI
391
392
393static void trans_4_GLubyte_4ub_raw (GLubyte (*t)[4],
394 CONST void *Ptr,
395 GLuint stride,
396 ARGS )
397{
398 const GLubyte *f = (GLubyte *) Ptr + SRC_START * stride;
399 GLuint i;
400
401 if (((((long) f | (long) stride)) & 3L) == 0L) {
402 /* Aligned.
403 */
404 for (i = DST_START ; i < n ; i++, f += stride) {
405 COPY_4UBV( t[i], f );
406 }
407 } else {
408 for (i = DST_START ; i < n ; i++, f += stride) {
409 t[i][0] = f[0];
410 t[i][1] = f[1];
411 t[i][2] = f[2];
412 t[i][3] = f[3];
413 }
414 }
415}
416
417
418static void init_translate_raw(void)
419{
420 MEMSET( TAB(_1ui), 0, sizeof(TAB(_1ui)) );
421 MEMSET( TAB(_1ub), 0, sizeof(TAB(_1ub)) );
422 MEMSET( TAB(_3f), 0, sizeof(TAB(_3f)) );
423 MEMSET( TAB(_4ub), 0, sizeof(TAB(_4ub)) );
424 MEMSET( TAB(_4f), 0, sizeof(TAB(_4f)) );
425
426 TAB(_4ub)[4][TYPE_IDX(GL_UNSIGNED_BYTE)] = trans_4_GLubyte_4ub_raw;
427
428 init_trans_4_GLbyte_raw();
429 init_trans_3_GLbyte_raw();
430 init_trans_2_GLbyte_raw();
431 init_trans_1_GLbyte_raw();
432 init_trans_1_GLubyte_raw();
433 init_trans_3_GLubyte_raw();
434 init_trans_4_GLshort_raw();
435 init_trans_3_GLshort_raw();
436 init_trans_2_GLshort_raw();
437 init_trans_1_GLshort_raw();
438 init_trans_4_GLushort_raw();
439 init_trans_3_GLushort_raw();
440 init_trans_2_GLushort_raw();
441 init_trans_1_GLushort_raw();
442 init_trans_4_GLint_raw();
443 init_trans_3_GLint_raw();
444 init_trans_2_GLint_raw();
445 init_trans_1_GLint_raw();
446 init_trans_4_GLuint_raw();
447 init_trans_3_GLuint_raw();
448 init_trans_2_GLuint_raw();
449 init_trans_1_GLuint_raw();
450 init_trans_4_GLdouble_raw();
451 init_trans_3_GLdouble_raw();
452 init_trans_2_GLdouble_raw();
453 init_trans_1_GLdouble_raw();
454 init_trans_4_GLfloat_raw();
455 init_trans_3_GLfloat_raw();
456 init_trans_2_GLfloat_raw();
457 init_trans_1_GLfloat_raw();
458}
459
460
461#undef TAB
462#undef CLASS
463#undef ARGS
464#undef CHECK
465#undef SRC_START
466#undef DST_START
467#undef NEXT_F
468#undef NEXT_F2
469
470
471
472
473
474void
475_math_init_translate( void )
476{
477 init_translate_raw();
478}