/* Copyright (c) 2001, Stanford University * All rights reserved * * See the file LICENSE.txt for information on redistributing this software. */ #include "packer.h" #include "cr_opcodes.h" #include "cr_error.h" /* Note -- for these packets, the ustride and vstride are implicit, * and are computed into the packet instead of copied. */ static int __gl_Map2NumComponents(GLenum target) { switch(target) { case GL_MAP2_VERTEX_3: case GL_MAP2_NORMAL: case GL_MAP2_TEXTURE_COORD_3: return 3; case GL_MAP2_VERTEX_4: case GL_MAP2_COLOR_4: case GL_MAP2_TEXTURE_COORD_4: return 4; case GL_MAP2_INDEX: case GL_MAP2_TEXTURE_COORD_1: return 1; case GL_MAP2_TEXTURE_COORD_2: return 2; default: return -1; } } static int __gl_Map1NumComponents(GLenum target) { switch(target) { case GL_MAP1_VERTEX_3: case GL_MAP1_NORMAL: case GL_MAP1_TEXTURE_COORD_3: return 3; case GL_MAP1_VERTEX_4: case GL_MAP1_COLOR_4: case GL_MAP1_TEXTURE_COORD_4: return 4; case GL_MAP1_INDEX: case GL_MAP1_TEXTURE_COORD_1: return 1; case GL_MAP1_TEXTURE_COORD_2: return 2; default: return -1; } } void PACK_APIENTRY crPackMap2dSWAP(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points) { unsigned char *data_ptr; int u,v; int comp; GLdouble *dest_data, *src_data; int packet_length = sizeof(target) + sizeof(u1) + sizeof(u2) + sizeof(uorder) + sizeof(ustride) + sizeof(v1) + sizeof(v2) + sizeof(vorder) + sizeof(vstride); int num_components = __gl_Map2NumComponents(target); if (num_components < 0) { __PackError(__LINE__, __FILE__, GL_INVALID_ENUM, "crPackMap2d(bad target)"); return; } packet_length += num_components*uorder*vorder*sizeof(*points); data_ptr = (unsigned char *) crPackAlloc(packet_length); WRITE_DATA(0, GLenum, SWAP32(target)); WRITE_SWAPPED_DOUBLE(4, u1); WRITE_SWAPPED_DOUBLE(12, u2); WRITE_DATA(20, GLint, SWAP32(num_components)); WRITE_DATA(24, GLint, SWAP32(uorder)); WRITE_SWAPPED_DOUBLE(28, v1); WRITE_SWAPPED_DOUBLE(36, v2); WRITE_DATA(44, GLint, SWAP32(num_components*uorder)); WRITE_DATA(48, GLint, SWAP32(vorder)); dest_data = (GLdouble *) (data_ptr + 52); src_data = (GLdouble *) points; for (v = 0 ; v < vorder ; v++) { for (u = 0 ; u < uorder ; u++) { for (comp = 0 ; comp < num_components ; comp++) { WRITE_SWAPPED_DOUBLE(((unsigned char *) dest_data + comp*sizeof(*points)) - data_ptr, *(src_data + comp)); } dest_data += num_components; src_data += ustride; } src_data += vstride - ustride*uorder; } crHugePacket(CR_MAP2D_OPCODE, data_ptr); crPackFree(data_ptr); } void PACK_APIENTRY crPackMap2fSWAP(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points) { unsigned char *data_ptr; int u,v; int comp; GLfloat *dest_data, *src_data; int packet_length = sizeof(target) + sizeof(u1) + sizeof(u2) + sizeof(uorder) + sizeof(ustride) + sizeof(v1) + sizeof(v2) + sizeof(vorder) + sizeof(vstride); int num_components = __gl_Map2NumComponents(target); if (num_components < 0) { __PackError(__LINE__, __FILE__, GL_INVALID_ENUM, "crPackMap2f(bad target)"); return; } packet_length += num_components*uorder*vorder*sizeof(*points); data_ptr = (unsigned char *) crPackAlloc(packet_length); WRITE_DATA(0, GLenum, SWAP32(target)); WRITE_DATA(4, GLuint, SWAPFLOAT(u1)); WRITE_DATA(8, GLuint, SWAPFLOAT(u2)); WRITE_DATA(12, GLint, SWAP32(num_components)); WRITE_DATA(16, GLint, SWAP32(uorder)); WRITE_DATA(20, GLuint, SWAPFLOAT(v1)); WRITE_DATA(24, GLuint, SWAPFLOAT(v2)); WRITE_DATA(28, GLint, SWAP32(num_components*uorder)); WRITE_DATA(32, GLint, SWAP32(vorder)); dest_data = (GLfloat *) (data_ptr + 36); src_data = (GLfloat *) points; for (v = 0 ; v < vorder ; v++) { for (u = 0 ; u < uorder ; u++) { for (comp = 0 ; comp < num_components ; comp++) { WRITE_DATA((unsigned char *) dest_data + comp*sizeof(*points) - data_ptr, GLuint, SWAPFLOAT(*(src_data + comp))); } dest_data += num_components; src_data += ustride; } src_data += vstride - ustride*uorder; } crHugePacket(CR_MAP2F_OPCODE, data_ptr); crPackFree(data_ptr); } void PACK_APIENTRY crPackMap1dSWAP(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points) { unsigned char *data_ptr; int packet_length = sizeof(target) + sizeof(u1) + sizeof(u2) + sizeof(stride) + sizeof(order); int num_components = __gl_Map1NumComponents(target); GLdouble *src_data, *dest_data; int u; int comp; if (num_components < 0) { __PackError(__LINE__, __FILE__, GL_INVALID_ENUM, "crPackMap1d(bad target)"); return; } packet_length += num_components * order * sizeof(*points); data_ptr = (unsigned char *) crPackAlloc(packet_length); WRITE_DATA(0, GLenum, SWAP32(target)); WRITE_SWAPPED_DOUBLE(4, u1); WRITE_SWAPPED_DOUBLE(12, u2); WRITE_DATA(20, GLint, SWAP32(num_components)); WRITE_DATA(24, GLint, SWAP32(order)); dest_data = (GLdouble *) (data_ptr + 28); src_data = (GLdouble *) points; for (u = 0 ; u < order ; u++) { for (comp = 0 ; comp < num_components ; comp++) { WRITE_SWAPPED_DOUBLE((unsigned char *) dest_data + comp*sizeof(*points) - data_ptr, *(src_data + comp)); } dest_data += num_components; src_data += stride; } crHugePacket(CR_MAP1D_OPCODE, data_ptr); crPackFree(data_ptr); } void PACK_APIENTRY crPackMap1fSWAP(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points) { unsigned char *data_ptr; int packet_length = sizeof(target) + sizeof(u1) + sizeof(u2) + sizeof(stride) + sizeof(order); int num_components = __gl_Map1NumComponents(target); GLfloat *src_data, *dest_data; int u; int comp; if (num_components < 0) { __PackError(__LINE__, __FILE__, GL_INVALID_ENUM, "crPackMap1f(bad target)"); return; } packet_length += num_components * order * sizeof(*points); data_ptr = (unsigned char *) crPackAlloc(packet_length); WRITE_DATA(0, GLenum, SWAP32(target)); WRITE_DATA(4, GLuint, SWAPFLOAT(u1)); WRITE_DATA(8, GLuint, SWAPFLOAT(u2)); WRITE_DATA(12, GLint, SWAP32(num_components)); WRITE_DATA(16, GLint, SWAP32(order)); dest_data = (GLfloat *) (data_ptr + 20); src_data = (GLfloat *) points; for (u = 0 ; u < order ; u++) { for (comp = 0 ; comp < num_components ; comp++) { WRITE_DATA((unsigned char *) dest_data + comp*sizeof(*points) - data_ptr, GLuint, SWAPFLOAT(*(src_data + comp))); } dest_data += num_components; src_data += stride; } crHugePacket(CR_MAP1F_OPCODE, data_ptr); crPackFree(data_ptr); }