1 /*
2 * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
3 * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
4 *
5 * SPDX-License-Identifier: SGI-B-2.0
6 */
7
8 #include "packrender.h"
9
10 /*
11 ** Routines to pack evaluator maps into the transport buffer. Maps are
12 ** allowed to have extra arbitrary data, so these routines extract just
13 ** the information that the GL needs.
14 */
15
16 void
__glFillMap1f(GLint k,GLint order,GLint stride,const GLfloat * points,GLubyte * pc)17 __glFillMap1f(GLint k, GLint order, GLint stride,
18 const GLfloat * points, GLubyte * pc)
19 {
20 if (stride == k) {
21 /* Just copy the data */
22 __GLX_PUT_FLOAT_ARRAY(0, points, order * k);
23 }
24 else {
25 GLint i;
26
27 for (i = 0; i < order; i++) {
28 __GLX_PUT_FLOAT_ARRAY(0, points, k);
29 points += stride;
30 pc += k * __GLX_SIZE_FLOAT32;
31 }
32 }
33 }
34
35 void
__glFillMap1d(GLint k,GLint order,GLint stride,const GLdouble * points,GLubyte * pc)36 __glFillMap1d(GLint k, GLint order, GLint stride,
37 const GLdouble * points, GLubyte * pc)
38 {
39 if (stride == k) {
40 /* Just copy the data */
41 __GLX_PUT_DOUBLE_ARRAY(0, points, order * k);
42 }
43 else {
44 GLint i;
45 for (i = 0; i < order; i++) {
46 __GLX_PUT_DOUBLE_ARRAY(0, points, k);
47 points += stride;
48 pc += k * __GLX_SIZE_FLOAT64;
49 }
50 }
51 }
52
53 void
__glFillMap2f(GLint k,GLint majorOrder,GLint minorOrder,GLint majorStride,GLint minorStride,const GLfloat * points,GLfloat * data)54 __glFillMap2f(GLint k, GLint majorOrder, GLint minorOrder,
55 GLint majorStride, GLint minorStride,
56 const GLfloat * points, GLfloat * data)
57 {
58 GLint i, j, x;
59
60 if ((minorStride == k) && (majorStride == minorOrder * k)) {
61 /* Just copy the data */
62 __GLX_MEM_COPY(data, points, majorOrder * majorStride *
63 __GLX_SIZE_FLOAT32);
64 return;
65 }
66 for (i = 0; i < majorOrder; i++) {
67 for (j = 0; j < minorOrder; j++) {
68 for (x = 0; x < k; x++) {
69 data[x] = points[x];
70 }
71 points += minorStride;
72 data += k;
73 }
74 points += majorStride - minorStride * minorOrder;
75 }
76 }
77
78 void
__glFillMap2d(GLint k,GLint majorOrder,GLint minorOrder,GLint majorStride,GLint minorStride,const GLdouble * points,GLdouble * data)79 __glFillMap2d(GLint k, GLint majorOrder, GLint minorOrder,
80 GLint majorStride, GLint minorStride,
81 const GLdouble * points, GLdouble * data)
82 {
83 int i, j, x;
84
85 if ((minorStride == k) && (majorStride == minorOrder * k)) {
86 /* Just copy the data */
87 __GLX_MEM_COPY(data, points, majorOrder * majorStride *
88 __GLX_SIZE_FLOAT64);
89 return;
90 }
91
92 #ifdef __GLX_ALIGN64
93 x = k * __GLX_SIZE_FLOAT64;
94 #endif
95 for (i = 0; i < majorOrder; i++) {
96 for (j = 0; j < minorOrder; j++) {
97 #ifdef __GLX_ALIGN64
98 __GLX_MEM_COPY(data, points, x);
99 #else
100 for (x = 0; x < k; x++) {
101 data[x] = points[x];
102 }
103 #endif
104 points += minorStride;
105 data += k;
106 }
107 points += majorStride - minorStride * minorOrder;
108 }
109 }
110