image.c revision c5b995066020191982b2315fc45d05e068eee761
1c5b995066020191982b2315fc45d05e068eee761Brian Paul/* $Id: image.c,v 1.67 2002/09/21 16:51:25 brianp Exp $ */ 2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 3afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 4afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Mesa 3-D graphics library 5d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul * Version: 4.1 65e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 7d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. 85e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Permission is hereby granted, free of charge, to any person obtaining a 10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * copy of this software and associated documentation files (the "Software"), 11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * to deal in the Software without restriction, including without limitation 12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * the rights to use, copy, modify, merge, publish, distribute, sublicense, 13afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * and/or sell copies of the Software, and to permit persons to whom the 14afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Software is furnished to do so, subject to the following conditions: 155e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 16afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * The above copyright notice and this permission notice shall be included 17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * in all copies or substantial portions of the Software. 185e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 26afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 27afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 28afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#ifdef PC_HEADER 29afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "all.h" 30afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#else 31fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul#include "glheader.h" 32c893a015d8a50a38cd3f727d99835e7e7e2ccea9Brian Paul#include "colormac.h" 33afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "context.h" 34afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "image.h" 358a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul#include "histogram.h" 36afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "macros.h" 37fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul#include "mem.h" 38afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "mmath.h" 39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "pixel.h" 405e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "mtypes.h" 41afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#endif 42afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 43afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 44afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 45afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 46fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * These are the image packing parameters for Mesa's internal images. 47fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * That is, _mesa_unpack_image() returns image data in this format. 48fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * When we execute image commands (glDrawPixels, glTexImage, etc) 49fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * from within display lists we have to be sure to set the current 50fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * unpacking params to these values! 51fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */ 52279d9e3ea7551332d5639b514e004ee66c37d08bBrian Paulconst struct gl_pixelstore_attrib _mesa_native_packing = { 53fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 1, /* Alignment */ 54fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 0, /* RowLength */ 55fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 0, /* SkipPixels */ 56fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 0, /* SkipRows */ 57fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 0, /* ImageHeight */ 58fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 0, /* SkipImages */ 59fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GL_FALSE, /* SwapBytes */ 60c5b995066020191982b2315fc45d05e068eee761Brian Paul GL_FALSE, /* LsbFirst */ 61c5b995066020191982b2315fc45d05e068eee761Brian Paul GL_FALSE /* ClientStorage */ 62fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul}; 63fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 64fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 65fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 66fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul/* 67afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the 8 bits in each byte of the given array. 6864a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul * 6964a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul * XXX try this trick to flip bytes someday: 7064a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul * v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555); 7164a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul * v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333); 7264a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul * v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f); 73afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 74b7d076fc96ac27117421653a043d00a95f789d24Brian Paulstatic void 75b7d076fc96ac27117421653a043d00a95f789d24Brian Paulflip_bytes( GLubyte *p, GLuint n ) 76afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 77afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach register GLuint i, a, b; 78afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 79afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 8064a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul b = (GLuint) p[i]; /* words are often faster than bytes */ 81afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach a = ((b & 0x01) << 7) | 82afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x02) << 5) | 83afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x04) << 3) | 84afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x08) << 1) | 85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x10) >> 1) | 86afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x20) >> 3) | 87afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x40) >> 5) | 88afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x80) >> 7); 89afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach p[i] = (GLubyte) a; 90afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 91afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 92afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 93afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 94afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 95afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the order of the 2 bytes in each word in the given array. 96afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 97b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid 98b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_swap2( GLushort *p, GLuint n ) 99afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach register GLuint i; 101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach p[i] = (p[i] >> 8) | ((p[i] << 8) & 0xff00); 104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the order of the 4 bytes in each word in the given array. 111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 112b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid 113b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_swap4( GLuint *p, GLuint n ) 114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach register GLuint i, a, b; 116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach b = p[i]; 119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach a = (b >> 24) 120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | ((b >> 8) & 0xff00) 121afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | ((b << 8) & 0xff0000) 122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | ((b << 24) & 0xff000000); 123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach p[i] = a; 124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return the size, in bytes, of the given GL datatype. 132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return 0 if GL_BITMAP. 133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return -1 if invalid type enum. 134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 135b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_sizeof_type( GLenum type ) 136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BITMAP: 139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 0; 140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLbyte); 144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLushort); 146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLint); 152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLfloat); 154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 161b7d076fc96ac27117421653a043d00a95f789d24Brian Paul * Same as _mesa_sizeof_packed_type() but we also accept the 162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * packed pixel format datatypes. 163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 164b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_sizeof_packed_type( GLenum type ) 165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BITMAP: 168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 0; 169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLbyte); 173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLushort); 175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLint); 181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLfloat); 183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_3_3_2: 184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_2_3_3_REV: 186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5: 188c450d57991628318696ee7a2bd052f91f480cda3Brian Paul return sizeof(GLushort); 189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5_REV: 190c450d57991628318696ee7a2bd052f91f480cda3Brian Paul return sizeof(GLushort); 191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4: 192c450d57991628318696ee7a2bd052f91f480cda3Brian Paul return sizeof(GLushort); 193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4_REV: 194c450d57991628318696ee7a2bd052f91f480cda3Brian Paul return sizeof(GLushort); 195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_5_5_1: 196c450d57991628318696ee7a2bd052f91f480cda3Brian Paul return sizeof(GLushort); 197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_1_5_5_5_REV: 198c450d57991628318696ee7a2bd052f91f480cda3Brian Paul return sizeof(GLushort); 199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8: 200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8_REV: 202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_10_10_10_2: 204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_2_10_10_10_REV: 206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 207c5b995066020191982b2315fc45d05e068eee761Brian Paul case GL_UNSIGNED_SHORT_8_8_MESA: 208c5b995066020191982b2315fc45d05e068eee761Brian Paul case GL_UNSIGNED_SHORT_8_8_REV_MESA: 209c5b995066020191982b2315fc45d05e068eee761Brian Paul return sizeof(GLushort); 210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return the number of components in a GL enum pixel type. 219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return -1 if bad format. 220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 221b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_components_in_format( GLenum format ) 222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (format) { 224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX: 225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX1_EXT: 226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX2_EXT: 227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX4_EXT: 228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX8_EXT: 229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX12_EXT: 230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX16_EXT: 231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_STENCIL_INDEX: 232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_DEPTH_COMPONENT: 233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_GREEN: 235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BLUE: 236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ALPHA: 237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE: 238070b2644c6d3b0b4c6da64addd85245d730b6240Brian Paul case GL_INTENSITY: 239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 1; 240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE_ALPHA: 241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 2; 242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 3; 244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGBA: 245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 4; 246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGR: 247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 3; 248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGRA: 249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 4; 250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ABGR_EXT: 251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 4; 252c5b995066020191982b2315fc45d05e068eee761Brian Paul case GL_YCBCR_MESA: 253c5b995066020191982b2315fc45d05e068eee761Brian Paul return 2; 254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return bytes per pixel for given format and type 262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return -1 if bad format or type. 263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 264b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_bytes_per_pixel( GLenum format, GLenum type ) 265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 266b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GLint comps = _mesa_components_in_format( format ); 267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (comps < 0) 268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BITMAP: 272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 0; /* special case */ 273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return comps * sizeof(GLubyte); 276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return comps * sizeof(GLshort); 279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return comps * sizeof(GLint); 282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 283afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return comps * sizeof(GLfloat); 284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_3_3_2: 285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_2_3_3_REV: 286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB || format == GL_BGR) 287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else 289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; /* error */ 290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5: 291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5_REV: 292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB || format == GL_BGR) 293c450d57991628318696ee7a2bd052f91f480cda3Brian Paul return sizeof(GLushort); 294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else 295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; /* error */ 296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4: 297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4_REV: 298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_5_5_1: 299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_1_5_5_5_REV: 300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT) 301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLushort); 302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else 303afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8: 305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8_REV: 306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_10_10_10_2: 307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_2_10_10_10_REV: 308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT) 309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else 311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 312c5b995066020191982b2315fc45d05e068eee761Brian Paul case GL_UNSIGNED_SHORT_8_8_MESA: 313c5b995066020191982b2315fc45d05e068eee761Brian Paul case GL_UNSIGNED_SHORT_8_8_REV_MESA: 314c5b995066020191982b2315fc45d05e068eee761Brian Paul if (format == GL_YCBCR_MESA) 315c5b995066020191982b2315fc45d05e068eee761Brian Paul return sizeof(GLushort); 316c5b995066020191982b2315fc45d05e068eee761Brian Paul else 317c5b995066020191982b2315fc45d05e068eee761Brian Paul return -1; 318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 320afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Test if the given pixel format and type are legal. 326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return GL_TRUE for legal, GL_FALSE for illegal. 327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 328b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLboolean 329b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_is_legal_format_and_type( GLenum format, GLenum type ) 330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (format) { 332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX: 333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_STENCIL_INDEX: 334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BITMAP: 336afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_TRUE; 344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_GREEN: 349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BLUE: 350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ALPHA: 3512a1f50aee4f30dbd0c55d8f0b7185b690c841051Brian Paul case GL_INTENSITY: 352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE: 353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE_ALPHA: 354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_DEPTH_COMPONENT: 355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_TRUE; 364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 3683d960a0d84be0ffdd491dd37ff80bedf4a44fe92Brian Paul case GL_BGR: 369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_3_3_2: 378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_2_3_3_REV: 379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5: 380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5_REV: 381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_TRUE; 382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGBA: 386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGRA: 387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ABGR_EXT: 388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 394afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4: 397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4_REV: 398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_5_5_1: 399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_1_5_5_5_REV: 400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8: 401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8_REV: 402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_10_10_10_2: 403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_2_10_10_10_REV: 404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_TRUE; 405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 408c5b995066020191982b2315fc45d05e068eee761Brian Paul case GL_YCBCR_MESA: 409c5b995066020191982b2315fc45d05e068eee761Brian Paul if (type == GL_UNSIGNED_SHORT_8_8_MESA || 410c5b995066020191982b2315fc45d05e068eee761Brian Paul type == GL_UNSIGNED_SHORT_8_8_REV_MESA) 411c5b995066020191982b2315fc45d05e068eee761Brian Paul return GL_TRUE; 412c5b995066020191982b2315fc45d05e068eee761Brian Paul else 413c5b995066020191982b2315fc45d05e068eee761Brian Paul return GL_FALSE; 414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ; /* fall-through */ 416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return the address of a pixel in an image (actually a volume). 424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Pixel unpacking/packing parameters are observed according to 'packing'. 425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Input: image - start of image data 426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * width, height - size of image 427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * format - image format 428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * type - pixel component type 429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * packing - the pixelstore attributes 430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * img - which image in the volume (0 for 1D or 2D images) 431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * row, column - location of pixel in the image 432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return: address of pixel at (image,row,column) in image or NULL if error. 433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 434b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLvoid * 435b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_image_address( const struct gl_pixelstore_attrib *packing, 436b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const GLvoid *image, GLsizei width, 437b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GLsizei height, GLenum format, GLenum type, 438b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GLint img, GLint row, GLint column ) 439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint alignment; /* 1, 2 or 4 */ 441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint pixels_per_row; 442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint rows_per_image; 443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint skiprows; 444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint skippixels; 445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint skipimages; /* for 3-D volume images */ 446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte *pixel_addr; 447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach alignment = packing->Alignment; 449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->RowLength > 0) { 450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach pixels_per_row = packing->RowLength; 451afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach pixels_per_row = width; 454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 455afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->ImageHeight > 0) { 456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach rows_per_image = packing->ImageHeight; 457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach rows_per_image = height; 460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach skiprows = packing->SkipRows; 462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach skippixels = packing->SkipPixels; 463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach skipimages = packing->SkipImages; 464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (type==GL_BITMAP) { 466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* BITMAP data */ 467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint comp_per_pixel; /* components per pixel */ 468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint bytes_per_comp; /* bytes per component */ 469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint bytes_per_row; 470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint bytes_per_image; 471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* Compute bytes per component */ 473b7d076fc96ac27117421653a043d00a95f789d24Brian Paul bytes_per_comp = _mesa_sizeof_packed_type( type ); 474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (bytes_per_comp<0) { 475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return NULL; 476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* Compute number of components per pixel */ 479b7d076fc96ac27117421653a043d00a95f789d24Brian Paul comp_per_pixel = _mesa_components_in_format( format ); 480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (comp_per_pixel<0 && type != GL_BITMAP) { 481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return NULL; 482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_row = alignment 485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * CEILING( comp_per_pixel*pixels_per_row, 8*alignment ); 486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_image = bytes_per_row * rows_per_image; 488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach pixel_addr = (GLubyte *) image 490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skipimages + img) * bytes_per_image 491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skiprows + row) * bytes_per_row 492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skippixels + column) / 8; 493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* Non-BITMAP data */ 496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint bytes_per_pixel, bytes_per_row, remainder, bytes_per_image; 497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 498b7d076fc96ac27117421653a043d00a95f789d24Brian Paul bytes_per_pixel = _mesa_bytes_per_pixel( format, type ); 499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* The pixel type and format should have been error checked earlier */ 501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach assert(bytes_per_pixel > 0); 502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_row = pixels_per_row * bytes_per_pixel; 504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach remainder = bytes_per_row % alignment; 505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (remainder > 0) 506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_row += (alignment - remainder); 507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ASSERT(bytes_per_row % alignment == 0); 509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_image = bytes_per_row * rows_per_image; 511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* compute final pixel address */ 513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach pixel_addr = (GLubyte *) image 514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skipimages + img) * bytes_per_image 515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skiprows + row) * bytes_per_row 516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skippixels + column) * bytes_per_pixel; 517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 518afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 519afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return (GLvoid *) pixel_addr; 520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 522afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 525ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul * Compute the stride between image rows (in bytes) for the given 526ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul * pixel packing parameters and image width, format and type. 527ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul */ 528ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian PaulGLint 529ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul_mesa_image_row_stride( const struct gl_pixelstore_attrib *packing, 530ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul GLint width, GLenum format, GLenum type ) 531ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul{ 532ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul ASSERT(packing); 533ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul if (type == GL_BITMAP) { 534ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul /* BITMAP data */ 535ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul if (packing->RowLength == 0) { 536ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul GLint bytes = (width + 7) / 8; 537ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul return bytes; 538ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 539ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul else { 540ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul GLint bytes = (packing->RowLength + 7) / 8; 541ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul return bytes; 542ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 543ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 544ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul else { 545ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul /* Non-BITMAP data */ 546b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type); 547fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul GLint bytesPerRow, remainder; 548ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul if (bytesPerPixel <= 0) 549ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul return -1; /* error */ 550ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul if (packing->RowLength == 0) { 551fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul bytesPerRow = bytesPerPixel * width; 552ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 553ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul else { 554fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul bytesPerRow = bytesPerPixel * packing->RowLength; 555ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 556fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul remainder = bytesPerRow % packing->Alignment; 557fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul if (remainder > 0) 558fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul bytesPerRow += (packing->Alignment - remainder); 559fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul return bytesPerRow; 560ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 561ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul} 562ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul 563ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul 564ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul 565ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul/* 566d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul * Compute the stride between images in a 3D texture (in bytes) for the given 567d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul * pixel packing parameters and image width, format and type. 568d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul */ 569d488af5b34e390a9b81dac96053bd45f34ffffffBrian PaulGLint 570d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul_mesa_image_image_stride( const struct gl_pixelstore_attrib *packing, 571d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul GLint width, GLint height, 572d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul GLenum format, GLenum type ) 573d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul{ 574d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul ASSERT(packing); 575d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul ASSERT(type != GL_BITMAP); 576d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul 577d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul { 578d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type); 579d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul GLint bytesPerRow, bytesPerImage, remainder; 580d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul 581d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul if (bytesPerPixel <= 0) 582d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul return -1; /* error */ 583d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul if (packing->RowLength == 0) { 584d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul bytesPerRow = bytesPerPixel * width; 585d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul } 586d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul else { 587d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul bytesPerRow = bytesPerPixel * packing->RowLength; 588d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul } 589d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul remainder = bytesPerRow % packing->Alignment; 590d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul if (remainder > 0) 591d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul bytesPerRow += (packing->Alignment - remainder); 592d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul 593d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul if (packing->ImageHeight == 0) 594d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul bytesPerImage = bytesPerRow * height; 595d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul else 596d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul bytesPerImage = bytesPerRow * packing->ImageHeight; 597d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul 598d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul return bytesPerImage; 599d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul } 600d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul} 601d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul 602d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul 603d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul 604d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul 605d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul/* 606afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Unpack a 32x32 pixel polygon stipple from user memory using the 607afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * current pixel unpack settings. 608afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 6097c652d77220610ecc19aaefa20876216b035e961Brian Paulvoid 6107c652d77220610ecc19aaefa20876216b035e961Brian Paul_mesa_unpack_polygon_stipple( const GLubyte *pattern, GLuint dest[32], 6117c652d77220610ecc19aaefa20876216b035e961Brian Paul const struct gl_pixelstore_attrib *unpacking ) 612afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 613959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul GLubyte *ptrn = (GLubyte *) _mesa_unpack_bitmap( 32, 32, pattern, unpacking ); 6147c652d77220610ecc19aaefa20876216b035e961Brian Paul if (ptrn) { 6157c652d77220610ecc19aaefa20876216b035e961Brian Paul /* Convert pattern from GLubytes to GLuints and handle big/little 6167c652d77220610ecc19aaefa20876216b035e961Brian Paul * endian differences 6177c652d77220610ecc19aaefa20876216b035e961Brian Paul */ 6187c652d77220610ecc19aaefa20876216b035e961Brian Paul GLubyte *p = ptrn; 6197c652d77220610ecc19aaefa20876216b035e961Brian Paul GLint i; 6207c652d77220610ecc19aaefa20876216b035e961Brian Paul for (i = 0; i < 32; i++) { 6217c652d77220610ecc19aaefa20876216b035e961Brian Paul dest[i] = (p[0] << 24) 6227c652d77220610ecc19aaefa20876216b035e961Brian Paul | (p[1] << 16) 6237c652d77220610ecc19aaefa20876216b035e961Brian Paul | (p[2] << 8) 6247c652d77220610ecc19aaefa20876216b035e961Brian Paul | (p[3] ); 6257c652d77220610ecc19aaefa20876216b035e961Brian Paul p += 4; 6267c652d77220610ecc19aaefa20876216b035e961Brian Paul } 6277c652d77220610ecc19aaefa20876216b035e961Brian Paul FREE(ptrn); 628afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 629afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 630afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 631afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 632fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 633afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 634fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Pack polygon stipple into user memory given current pixel packing 635fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * settings. 636afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 6377c652d77220610ecc19aaefa20876216b035e961Brian Paulvoid 6387c652d77220610ecc19aaefa20876216b035e961Brian Paul_mesa_pack_polygon_stipple( const GLuint pattern[32], GLubyte *dest, 6397c652d77220610ecc19aaefa20876216b035e961Brian Paul const struct gl_pixelstore_attrib *packing ) 640afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 6417c652d77220610ecc19aaefa20876216b035e961Brian Paul /* Convert pattern from GLuints to GLubytes to handle big/little 6427c652d77220610ecc19aaefa20876216b035e961Brian Paul * endian differences. 6437c652d77220610ecc19aaefa20876216b035e961Brian Paul */ 6447c652d77220610ecc19aaefa20876216b035e961Brian Paul GLubyte ptrn[32*4]; 645fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint i; 646fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < 32; i++) { 6477c652d77220610ecc19aaefa20876216b035e961Brian Paul ptrn[i * 4 + 0] = (GLubyte) ((pattern[i] >> 24) & 0xff); 6487c652d77220610ecc19aaefa20876216b035e961Brian Paul ptrn[i * 4 + 1] = (GLubyte) ((pattern[i] >> 16) & 0xff); 6497c652d77220610ecc19aaefa20876216b035e961Brian Paul ptrn[i * 4 + 2] = (GLubyte) ((pattern[i] >> 8 ) & 0xff); 6507c652d77220610ecc19aaefa20876216b035e961Brian Paul ptrn[i * 4 + 3] = (GLubyte) ((pattern[i] ) & 0xff); 651afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 6527c652d77220610ecc19aaefa20876216b035e961Brian Paul 6537c652d77220610ecc19aaefa20876216b035e961Brian Paul _mesa_pack_bitmap(32, 32, ptrn, dest, packing); 654afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 655afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 656afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 657699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul/* 658699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Unpack bitmap data. Resulting data will be in most-significant-bit-first 659699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * order with row alignment = 1 byte. 660699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul */ 661699bc7b73d2fede77d3290f66c1ec355afd0373eBrian PaulGLvoid * 662699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul_mesa_unpack_bitmap( GLint width, GLint height, const GLubyte *pixels, 663699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul const struct gl_pixelstore_attrib *packing ) 664699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul{ 665699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLint bytes, row, width_in_bytes; 666699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte *buffer, *dst; 667699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 668699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (!pixels) 669699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul return NULL; 670699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 671699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* Alloc dest storage */ 672699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul bytes = ((width + 7) / 8 * height); 673699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul buffer = (GLubyte *) MALLOC( bytes ); 674699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (!buffer) 675699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul return NULL; 676699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 677699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 678699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul width_in_bytes = CEILING( width, 8 ); 679699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dst = buffer; 680699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul for (row = 0; row < height; row++) { 681b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul const GLubyte *src = (const GLubyte *) 682b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul _mesa_image_address(packing, pixels, width, height, 683b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul GL_COLOR_INDEX, GL_BITMAP, 0, row, 0); 684699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (!src) { 685699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul FREE(buffer); 686699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul return NULL; 687699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 688699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 689699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (packing->SkipPixels == 0) { 690699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul MEMCPY( dst, src, width_in_bytes ); 691699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (packing->LsbFirst) { 692699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul flip_bytes( dst, width_in_bytes ); 693699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 694699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 695699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 696699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* handling SkipPixels is a bit tricky (no pun intended!) */ 697699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLint i; 698699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (packing->LsbFirst) { 699699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte srcMask = 1 << (packing->SkipPixels & 0x7); 700699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte dstMask = 128; 701b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul const GLubyte *s = src; 702699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte *d = dst; 703699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d = 0; 704699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul for (i = 0; i < width; i++) { 705699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (*s & srcMask) { 706699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d |= dstMask; 707699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 708699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (srcMask == 128) { 709699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul srcMask = 1; 710699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul s++; 711699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 712699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 713699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul srcMask = srcMask << 1; 714699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 715699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (dstMask == 1) { 716699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstMask = 128; 717699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul d++; 718699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d = 0; 719699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 720699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 721699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstMask = dstMask >> 1; 722699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 723699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 724699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 725699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 726699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7); 727699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte dstMask = 128; 728b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul const GLubyte *s = src; 729699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte *d = dst; 730699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d = 0; 731699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul for (i = 0; i < width; i++) { 732699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (*s & srcMask) { 733699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d |= dstMask; 734699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 735699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (srcMask == 1) { 736699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul srcMask = 128; 737699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul s++; 738699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 739699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 740699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul srcMask = srcMask >> 1; 741699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 742699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (dstMask == 1) { 743699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstMask = 128; 744699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul d++; 745699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d = 0; 746699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 747699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 748699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstMask = dstMask >> 1; 749699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 750699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 751699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 752699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 753699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dst += width_in_bytes; 754699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 755699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 756699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul return buffer; 757699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul} 758699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 759afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 760afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 761699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Pack bitmap data. 762afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 763b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid 764699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul_mesa_pack_bitmap( GLint width, GLint height, const GLubyte *source, 765699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte *dest, const struct gl_pixelstore_attrib *packing ) 766afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 767699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLint row, width_in_bytes; 768699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul const GLubyte *src; 769fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 770699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (!source) 771699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul return; 772699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 773699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul width_in_bytes = CEILING( width, 8 ); 774699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul src = source; 775699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul for (row = 0; row < height; row++) { 776b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul GLubyte *dst = (GLubyte *) _mesa_image_address( packing, dest, 777b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul width, height, GL_COLOR_INDEX, GL_BITMAP, 0, row, 0 ); 778699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (!dst) 779699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul return; 780699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 781699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (packing->SkipPixels == 0) { 782699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul MEMCPY( dst, src, width_in_bytes ); 783699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (packing->LsbFirst) { 784699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul flip_bytes( dst, width_in_bytes ); 785699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 7863428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul } 787699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 788699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* handling SkipPixels is a bit tricky (no pun intended!) */ 789699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLint i; 790699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (packing->LsbFirst) { 791699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte srcMask = 1 << (packing->SkipPixels & 0x7); 792699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte dstMask = 128; 793699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul const GLubyte *s = src; 794699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte *d = dst; 795699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d = 0; 796699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul for (i = 0; i < width; i++) { 797699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (*s & srcMask) { 798699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d |= dstMask; 799699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 800699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (srcMask == 128) { 801699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul srcMask = 1; 802699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul s++; 803699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 804699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 805699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul srcMask = srcMask << 1; 806699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 807699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (dstMask == 1) { 808699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstMask = 128; 809699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul d++; 810699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d = 0; 811699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 812699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 813699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstMask = dstMask >> 1; 814699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 815699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 816699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 817699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 818699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7); 819699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte dstMask = 128; 820699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul const GLubyte *s = src; 821699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte *d = dst; 822699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d = 0; 823699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul for (i = 0; i < width; i++) { 824699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (*s & srcMask) { 825699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d |= dstMask; 826699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 827699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (srcMask == 1) { 828699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul srcMask = 128; 829699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul s++; 830699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 831699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 832699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul srcMask = srcMask >> 1; 833699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 834699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (dstMask == 1) { 835699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstMask = 128; 836699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul d++; 837699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d = 0; 838699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 839699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 840699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstMask = dstMask >> 1; 841699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 842699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 843699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 844afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 845699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul src += width_in_bytes; 846116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 847116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul} 848afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 849116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul 850699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 85196385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul/* 85296385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul * Used to pack an array [][4] of RGBA GLchan colors as specified 85396385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul * by the dstFormat, dstType and dstPacking. Used by glReadPixels, 85496385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul * glGetConvolutionFilter(), etc. 85596385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul */ 856116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paulvoid 857116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul_mesa_pack_float_rgba_span( GLcontext *ctx, 858116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul GLuint n, CONST GLfloat rgbaIn[][4], 859b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLenum dstFormat, GLenum dstType, 860b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLvoid *dstAddr, 861b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul const struct gl_pixelstore_attrib *dstPacking, 862116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul GLuint transferOps ) 863116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul{ 864b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul const GLint comps = _mesa_components_in_format(dstFormat); 865116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul GLfloat luminance[MAX_WIDTH]; 866116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul GLfloat (*rgba)[4]; 867116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul GLuint i; 868116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul 869116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul if (transferOps) { 870116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* make copy of incoming data */ 87147cf442c1164b6b406117fccfb8b564602741ee3Brian Paul DEFMARRAY(GLfloat, rgbaCopy, MAX_WIDTH, 4); /* mac 32k limitation */ 87247cf442c1164b6b406117fccfb8b564602741ee3Brian Paul CHECKARRAY(rgbaCopy, return); /* mac 32k limitation */ 87347cf442c1164b6b406117fccfb8b564602741ee3Brian Paul 874116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i = 0; i < n; i++) { 875116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul rgbaCopy[i][0] = rgbaIn[i][0]; 876116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul rgbaCopy[i][1] = rgbaIn[i][1]; 877116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul rgbaCopy[i][2] = rgbaIn[i][2]; 878116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul rgbaCopy[i][3] = rgbaIn[i][3]; 879afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 880afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 881116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul rgba = (GLfloat (*)[4]) rgbaCopy; 882ef9025a641624991113b7df2eecdf7c8e330a31cBrian Paul 883116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* scale & bias */ 884116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul if (transferOps & IMAGE_SCALE_BIAS_BIT) { 88545015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul _mesa_scale_and_bias_rgba(ctx, n, rgba, 88645015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.RedScale, ctx->Pixel.GreenScale, 88745015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.BlueScale, ctx->Pixel.AlphaScale, 88845015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.RedBias, ctx->Pixel.GreenBias, 88945015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.BlueBias, ctx->Pixel.AlphaBias); 890116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 891116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* color map lookup */ 892116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul if (transferOps & IMAGE_MAP_COLOR_BIT) { 893116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_map_rgba( ctx, n, rgba ); 894116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 895116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* GL_COLOR_TABLE lookup */ 896116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul if (transferOps & IMAGE_COLOR_TABLE_BIT) { 897116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_lookup_rgba(&ctx->ColorTable, n, rgba); 898116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 899116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* convolution */ 900116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul if (transferOps & IMAGE_CONVOLUTION_BIT) { 901116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* this has to be done in the calling code */ 902116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 90345015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */ 90445015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul if (transferOps & IMAGE_POST_CONVOLUTION_SCALE_BIAS) { 90545015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul _mesa_scale_and_bias_rgba(ctx, n, rgba, 90645015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionScale[RCOMP], 90745015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionScale[GCOMP], 90845015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionScale[BCOMP], 90945015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionScale[ACOMP], 91045015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionBias[RCOMP], 91145015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionBias[GCOMP], 91245015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionBias[BCOMP], 91345015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionBias[ACOMP]); 91445015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul } 915116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */ 916116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul if (transferOps & IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT) { 917116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_lookup_rgba(&ctx->PostConvolutionColorTable, n, rgba); 918116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 919116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* color matrix transform */ 920116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul if (transferOps & IMAGE_COLOR_MATRIX_BIT) { 921116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_transform_rgba(ctx, n, rgba); 922116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 923116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */ 924116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul if (transferOps & IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT) { 925116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_lookup_rgba(&ctx->PostColorMatrixColorTable, n, rgba); 926116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 927116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* update histogram count */ 928116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul if (transferOps & IMAGE_HISTOGRAM_BIT) { 929116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba); 930116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 931116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* min/max here */ 932116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul if (transferOps & IMAGE_MIN_MAX_BIT) { 933116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba); 93447cf442c1164b6b406117fccfb8b564602741ee3Brian Paul if (ctx->MinMax.Sink) { 93547cf442c1164b6b406117fccfb8b564602741ee3Brian Paul UNDEFARRAY(rgbaCopy); /* mac 32k limitation */ 936116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul return; 93747cf442c1164b6b406117fccfb8b564602741ee3Brian Paul } 938116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 93947cf442c1164b6b406117fccfb8b564602741ee3Brian Paul UNDEFARRAY(rgbaCopy); /* mac 32k limitation */ 940116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 941116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul else { 942116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* use incoming data, not a copy */ 943116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul rgba = (GLfloat (*)[4]) rgbaIn; 944116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 945ef9025a641624991113b7df2eecdf7c8e330a31cBrian Paul 946116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* XXX clamp rgba to [0,1]? */ 947116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul 948116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul 949b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_LUMINANCE || dstFormat == GL_LUMINANCE_ALPHA) { 950116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i = 0; i < n; i++) { 951116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul GLfloat sum = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP]; 95296385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul#if CHAN_TYPE == GL_FLOAT 95396385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul luminance[i] = sum; 95496385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul#else 955116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul luminance[i] = CLAMP(sum, 0.0F, 1.0F); 95696385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul#endif 957afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 958116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 959afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 960116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* 961116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul * Pack/store the pixels. Ugh! Lots of cases!!! 962116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul */ 963b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstType) { 964116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_BYTE: 965116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul { 966b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLubyte *dst = (GLubyte *) dstAddr; 967b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstFormat) { 968116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RED: 969116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 970116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 971116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 972116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_GREEN: 973116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 974116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 975116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 976116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BLUE: 977116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 978116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 979116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 980116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ALPHA: 981116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 982116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 983116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 984116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE: 985116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 986116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UBYTE(luminance[i]); 987116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 988116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE_ALPHA: 989116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 990116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+0] = FLOAT_TO_UBYTE(luminance[i]); 991116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 992116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 993116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 994116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGB: 995116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 996116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 997116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 998116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 999116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1000116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1001116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGBA: 1002116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1003116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1004116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1005116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 1006116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 1007116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1008116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1009116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGR: 1010116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1011116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 1012116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1013116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1014116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1015116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1016116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGRA: 1017116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1018116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 1019116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1020116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1021116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 1022116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1023116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1024116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ABGR_EXT: 1025116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1026116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 1027116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 1028116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1029116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1030116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1031116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1032116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 103308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1034116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1035116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1036116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1037116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BYTE: 1038116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul { 1039b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLbyte *dst = (GLbyte *) dstAddr; 1040b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstFormat) { 1041116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RED: 1042116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1043116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1044116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1045116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_GREEN: 1046116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1047116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1048116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1049116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BLUE: 1050116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1051116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1052116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1053116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ALPHA: 1054116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1055116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 1056116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1057116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE: 1058116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1059116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_BYTE(luminance[i]); 1060116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1061116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE_ALPHA: 1062116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1063116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+0] = FLOAT_TO_BYTE(luminance[i]); 1064116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 1065116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1066116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1067116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGB: 1068116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1069116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1070116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1071116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1072116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1073116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1074116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGBA: 1075116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1076116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1077116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1078116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1079116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 1080116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1081116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1082116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGR: 1083116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1084116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1085116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1086116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1087116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1088116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1089116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGRA: 1090116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1091116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1092116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1093116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1094116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 1095116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1096116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ABGR_EXT: 1097116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1098116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 1099116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1100116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1101116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1102116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1103116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1104116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 110508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1106116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1107116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1108116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1109116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_SHORT: 1110116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul { 1111b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLushort *dst = (GLushort *) dstAddr; 1112b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstFormat) { 1113116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RED: 1114116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1115116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 1116116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1117116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_GREEN: 1118116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1119116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1120116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1121116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BLUE: 1122116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1123116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 1124116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1125116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ALPHA: 1126116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1127116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_USHORT(rgba[i][ACOMP]); 1128116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1129116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE: 1130116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1131116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_USHORT(luminance[i]); 1132116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1133116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE_ALPHA: 1134116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1135116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+0] = FLOAT_TO_USHORT(luminance[i]); 1136116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+1] = FLOAT_TO_USHORT(rgba[i][ACOMP]); 1137116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1138116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1139116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGB: 1140116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1141116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 1142116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1143116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 1144116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1145116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1146116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGBA: 1147116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1148116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 1149116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1150116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 1151116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][ACOMP]); 1152116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1153116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1154116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGR: 1155116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1156116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 1157116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1158116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 1159116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1160116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1161116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGRA: 1162116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1163116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 1164116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1165116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 1166116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][ACOMP]); 1167116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1168116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1169116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ABGR_EXT: 1170116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1171116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][ACOMP]); 1172116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 1173116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1174116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 1175116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1176116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1177116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 117808836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1179116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1180b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstPacking->SwapBytes) { 1181116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_swap2( (GLushort *) dst, n * comps); 1182116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1183116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1184116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1185116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_SHORT: 1186116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul { 1187b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLshort *dst = (GLshort *) dstAddr; 1188b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstFormat) { 1189116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RED: 1190116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1191116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1192116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1193116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_GREEN: 1194116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1195116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1196116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1197116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BLUE: 1198116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1199116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1200116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1201116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ALPHA: 1202116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1203116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1204116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1205116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE: 1206116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1207116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_SHORT(luminance[i]); 1208116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1209116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE_ALPHA: 1210116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1211116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+0] = FLOAT_TO_SHORT(luminance[i]); 1212116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1213116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1214116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1215116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGB: 1216116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1217116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1218116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1219116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1220116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1221116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1222116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGBA: 1223116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1224116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1225116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1226116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1227116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1228116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1229116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1230116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGR: 1231116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1232116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1233116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1234116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1235116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1236116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1237116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGRA: 1238116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1239116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1240116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1241116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1242116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1243116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1244116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ABGR_EXT: 1245116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1246116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1247116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1248116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1249116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1250116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1251116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1252116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 125308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1255b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstPacking->SwapBytes) { 1256116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_swap2( (GLushort *) dst, n * comps ); 1257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1258116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1259116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1260116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_INT: 1261116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul { 1262b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1263b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstFormat) { 1264116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RED: 1265116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1266116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1267116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1268116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_GREEN: 1269116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1270116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1271116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1272116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BLUE: 1273116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1274116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1275116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1276116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ALPHA: 1277116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1278116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1279116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1280116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE: 1281116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1282116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UINT(luminance[i]); 1283116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1284116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE_ALPHA: 1285116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1286116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+0] = FLOAT_TO_UINT(luminance[i]); 1287116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+1] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1288116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1289116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1290116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGB: 1291116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1292116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1293116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1294116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1295116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1296116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1297116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGBA: 1298116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1299116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1300116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1301116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1302116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1303116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1304116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1305116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGR: 1306116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1307116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1308116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1309116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1310116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1311116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1312116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGRA: 1313116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1314116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1315116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1316116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1317116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1318116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1319116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1320116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ABGR_EXT: 1321116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1322116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1323116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1324116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1325116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1326116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1327116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1328116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 132908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1331b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstPacking->SwapBytes) { 1332116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_swap4( (GLuint *) dst, n * comps ); 1333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1334116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1335116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1336116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_INT: 1337116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul { 1338b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLint *dst = (GLint *) dstAddr; 1339b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstFormat) { 1340116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RED: 1341116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1342116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_INT(rgba[i][RCOMP]); 1343116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1344116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_GREEN: 1345116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1346116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_INT(rgba[i][GCOMP]); 1347116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1348116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BLUE: 1349116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1350116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_INT(rgba[i][BCOMP]); 1351116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1352116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ALPHA: 1353116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1354116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_INT(rgba[i][ACOMP]); 1355116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1356116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE: 1357116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1358116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_INT(luminance[i]); 1359116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1360116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE_ALPHA: 1361116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1362116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+0] = FLOAT_TO_INT(luminance[i]); 1363116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+1] = FLOAT_TO_INT(rgba[i][ACOMP]); 1364116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1365116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1366116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGB: 1367116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1368116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_INT(rgba[i][RCOMP]); 1369116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 1370116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_INT(rgba[i][BCOMP]); 1371116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1372116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1373116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGBA: 1374116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1375116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_INT(rgba[i][RCOMP]); 1376116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 1377116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_INT(rgba[i][BCOMP]); 1378116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]); 1379116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1380116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1381116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGR: 1382116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1383116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_INT(rgba[i][BCOMP]); 1384116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 1385116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_INT(rgba[i][RCOMP]); 1386116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1387116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1388116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGRA: 1389116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1390116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_INT(rgba[i][BCOMP]); 1391116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 1392116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_INT(rgba[i][RCOMP]); 1393116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]); 1394116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1395116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1396116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ABGR_EXT: 1397116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1398116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_INT(rgba[i][ACOMP]); 1399116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_INT(rgba[i][BCOMP]); 1400116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_INT(rgba[i][GCOMP]); 1401116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_INT(rgba[i][RCOMP]); 1402116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1403116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1404116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 140508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1407b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstPacking->SwapBytes) { 1408116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_swap4( (GLuint *) dst, n * comps ); 1409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1410116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1411116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1412116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_FLOAT: 1413116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul { 1414b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLfloat *dst = (GLfloat *) dstAddr; 1415b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstFormat) { 1416116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RED: 1417116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1418116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = rgba[i][RCOMP]; 1419116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1420116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_GREEN: 1421116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1422116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = rgba[i][GCOMP]; 1423116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1424116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BLUE: 1425116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1426116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = rgba[i][BCOMP]; 1427116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1428116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ALPHA: 1429116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1430116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = rgba[i][ACOMP]; 1431116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1432116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE: 1433116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1434116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = luminance[i]; 1435116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1436116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE_ALPHA: 1437116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1438116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+0] = luminance[i]; 1439116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+1] = rgba[i][ACOMP]; 1440116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1441116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1442116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGB: 1443116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1444116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = rgba[i][RCOMP]; 1445116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = rgba[i][GCOMP]; 1446116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = rgba[i][BCOMP]; 1447116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1448116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1449116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGBA: 1450116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1451116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = rgba[i][RCOMP]; 1452116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = rgba[i][GCOMP]; 1453116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = rgba[i][BCOMP]; 1454116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = rgba[i][ACOMP]; 1455116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1456116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1457116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGR: 1458116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1459116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = rgba[i][BCOMP]; 1460116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = rgba[i][GCOMP]; 1461116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = rgba[i][RCOMP]; 1462116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1463116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1464116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGRA: 1465116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1466116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = rgba[i][BCOMP]; 1467116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = rgba[i][GCOMP]; 1468116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = rgba[i][RCOMP]; 1469116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = rgba[i][ACOMP]; 1470116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1471116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1472116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ABGR_EXT: 1473116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1474116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = rgba[i][ACOMP]; 1475116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = rgba[i][BCOMP]; 1476116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = rgba[i][GCOMP]; 1477116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = rgba[i][RCOMP]; 1478116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1479116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1480116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 148108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1483b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstPacking->SwapBytes) { 1484116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_swap4( (GLuint *) dst, n * comps ); 1485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1486116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1487116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1488116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_BYTE_3_3_2: 1489b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGB) { 1490b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLubyte *dst = (GLubyte *) dstAddr; 1491116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1492116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 7.0F)) << 5) 1493116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 7.0F)) << 2) 1494116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 3.0F)) ); 1495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1496116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1497116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1498116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_BYTE_2_3_3_REV: 1499b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGB) { 1500b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLubyte *dst = (GLubyte *) dstAddr; 1501116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1502116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 7.0F)) ) 1503116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 7.0F)) << 3) 1504116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 3.0F)) << 5); 1505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1506116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1507116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1508116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_SHORT_5_6_5: 1509b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGB) { 1510b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLushort *dst = (GLushort *) dstAddr; 1511116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1512116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) << 11) 1513116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 63.0F)) << 5) 1514116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 31.0F)) ); 1515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1516116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1517116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1518116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_SHORT_5_6_5_REV: 1519b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGB) { 1520b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLushort *dst = (GLushort *) dstAddr; 1521116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1522116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) ) 1523116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 63.0F)) << 5) 1524116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 11); 1525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1526116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1527116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1528116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_SHORT_4_4_4_4: 1529881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul if (dstFormat == GL_RGBA) { 1530b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLushort *dst = (GLushort *) dstAddr; 1531116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1532116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 15.0F)) << 12) 1533116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 8) 1534116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 15.0F)) << 4) 1535116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][ACOMP] * 15.0F)) ); 1536afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1537116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1538881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_BGRA) { 1539881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1540881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1541881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][BCOMP] * 15.0F)) << 12) 1542881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 8) 1543881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 15.0F)) << 4) 1544881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][ACOMP] * 15.0F)) ); 1545881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1546881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1547881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1548881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1549881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1550881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][ACOMP] * 15.0F)) << 4) 1551881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][BCOMP] * 15.0F)) << 8) 1552881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 12) 1553881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 15.0F)) ); 1554881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1555881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1556116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1557116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_SHORT_4_4_4_4_REV: 1558881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul if (dstFormat == GL_RGBA) { 1559b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLushort *dst = (GLushort *) dstAddr; 1560116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1561116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 15.0F)) ) 1562116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 4) 1563116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 15.0F)) << 8) 1564116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][ACOMP] * 15.0F)) << 12); 1565afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1566116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1567881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_BGRA) { 1568881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1569881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1570881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][BCOMP] * 15.0F)) ) 1571881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 4) 1572881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 15.0F)) << 8) 1573881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][ACOMP] * 15.0F)) << 12); 1574881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1575881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1576881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1577881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1578881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1579881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][ACOMP] * 15.0F)) ) 1580881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][BCOMP] * 15.0F)) << 4) 1581881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 8) 1582881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 15.0F)) << 12); 1583881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1584881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1585116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1586116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_SHORT_5_5_5_1: 1587881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul if (dstFormat == GL_RGBA) { 1588b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLushort *dst = (GLushort *) dstAddr; 1589116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1590116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) << 11) 1591116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 6) 1592116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 1) 1593116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][ACOMP] * 1.0F)) ); 1594afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1595116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1596881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_BGRA) { 1597881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1598881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1599881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][BCOMP] * 31.0F)) << 11) 1600881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 6) 1601881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 31.0F)) << 1) 1602881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][ACOMP] * 1.0F)) ); 1603881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1604881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1605881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1606881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1607881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1608881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][ACOMP] * 31.0F)) << 11) 1609881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 6) 1610881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 1) 1611881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 1.0F)) ); 1612881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1613881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1614116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1615116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_SHORT_1_5_5_5_REV: 1616881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul if (dstFormat == GL_RGBA) { 1617b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLushort *dst = (GLushort *) dstAddr; 1618116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1619116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) ) 1620116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 5) 1621116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 10) 1622116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][ACOMP] * 1.0F)) << 15); 1623afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1624116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1625881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_BGRA) { 1626881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1627881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1628881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][BCOMP] * 31.0F)) ) 1629881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 5) 1630881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 31.0F)) << 10) 1631881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][ACOMP] * 1.0F)) << 15); 1632881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1633881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1634881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1635881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1636881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1637881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][ACOMP] * 31.0F)) ) 1638881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 5) 1639881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 10) 1640881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 1.0F)) << 15); 1641881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1642881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1643116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1644116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_INT_8_8_8_8: 1645b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGBA) { 1646b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1647116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1648116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 24) 1649116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16) 1650116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 8) 1651116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 255.0F)) ); 1652afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1653116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1654b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_BGRA) { 1655b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1656116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1657116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 24) 1658116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16) 1659116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 8) 1660116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 255.0F)) ); 1661afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1662116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1663b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1664b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1665116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1666116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24) 1667116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 16) 1668116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 8) 1669116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 255.0F)) ); 1670afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1671116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1672116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1673116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_INT_8_8_8_8_REV: 1674b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGBA) { 1675b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1676116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1677116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][RCOMP] * 255.0F)) ) 1678116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 8) 1679116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 16) 1680116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24); 1681afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1682116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1683b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_BGRA) { 1684b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1685116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1686116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][BCOMP] * 255.0F)) ) 1687116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 8) 1688116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 16) 1689116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24); 1690afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1691116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1692b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1693b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1694116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1695116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][ACOMP] * 255.0F)) ) 1696116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 8) 1697116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16) 1698116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 24); 1699afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1700116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1701116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1702116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_INT_10_10_10_2: 1703b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGBA) { 1704b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1705116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1706116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 22) 1707116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 12) 1708116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 2) 1709116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 3.0F)) ); 1710afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1711116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1712b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_BGRA) { 1713b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1714116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1715116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 22) 1716116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 12) 1717116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 2) 1718116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 3.0F)) ); 1719afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1720116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1721b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1722b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1723116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1724116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][ACOMP] * 1023.0F)) << 22) 1725116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 12) 1726116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 2) 1727116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 3.0F)) ); 1728116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1729116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1730116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1731116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_INT_2_10_10_10_REV: 1732b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGBA) { 1733b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1734116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1735116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][RCOMP] * 1023.0F)) ) 1736116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 10) 1737116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 20) 1738116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 3.0F)) << 30); 1739116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1740116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1741b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_BGRA) { 1742b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1743116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1744116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][BCOMP] * 1023.0F)) ) 1745116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 10) 1746116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 20) 1747116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 3.0F)) << 30); 1748116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1749116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1750b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1751b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1752116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1753116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][ACOMP] * 1023.0F)) ) 1754116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 10) 1755116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 20) 1756116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 3.0F)) << 30); 1757116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1758116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1759116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1760116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 176108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad type in _mesa_pack_float_rgba_span"); 1762afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1763afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 1764c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1765c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1766179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul 1767699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul/* 1768699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Pack the given RGBA span into client memory at 'dest' address 1769699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * in the given pixel format and type. 1770699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Optionally apply the enabled pixel transfer ops. 1771699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Pack into memory using the given packing params struct. 1772699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * This is used by glReadPixels and glGetTexImage?D() 1773699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Input: ctx - the context 1774699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * n - number of pixels in the span 1775699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * rgba - the pixels 1776699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * format - dest packing format 1777699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * type - dest packing datatype 1778699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * destination - destination packing address 1779699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * packing - pixel packing parameters 1780699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * transferOps - bitmask of IMAGE_*_BIT operations to apply 1781699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul */ 1782699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paulvoid 1783699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul_mesa_pack_rgba_span( GLcontext *ctx, 1784699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLuint n, CONST GLchan srcRgba[][4], 1785699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLenum dstFormat, GLenum dstType, 1786699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLvoid *dstAddr, 1787699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul const struct gl_pixelstore_attrib *dstPacking, 1788699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLuint transferOps) 1789699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul{ 1790cc22179cd855dad85a28c40416873a07e8b7cc0cBrian Paul ASSERT((ctx->NewState & _NEW_PIXEL) == 0 || transferOps == 0); 1791699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 1792699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* Test for optimized case first */ 1793699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (transferOps == 0 && dstFormat == GL_RGBA && dstType == CHAN_TYPE) { 1794699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* common simple case */ 1795699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul MEMCPY(dstAddr, srcRgba, n * 4 * sizeof(GLchan)); 1796699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 1797699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else if (transferOps == 0 && dstFormat == GL_RGB && dstType == CHAN_TYPE) { 1798699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* common simple case */ 1799b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul GLuint i; 1800699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dest = (GLchan *) dstAddr; 1801699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul for (i = 0; i < n; i++) { 1802699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dest[0] = srcRgba[i][RCOMP]; 1803699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dest[1] = srcRgba[i][GCOMP]; 1804699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dest[2] = srcRgba[i][BCOMP]; 1805699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dest += 3; 1806699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 1807699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 1808aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul else if (transferOps == 0 && dstFormat == GL_RGBA && dstType == GL_UNSIGNED_BYTE) { 1809aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul /* common simple case */ 1810aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLuint i; 1811aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLubyte *dest = (GLubyte *) dstAddr; 1812aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul for (i = 0; i < n; i++) { 1813aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dest[0] = CHAN_TO_UBYTE(srcRgba[i][RCOMP]); 1814aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dest[1] = CHAN_TO_UBYTE(srcRgba[i][GCOMP]); 1815aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dest[2] = CHAN_TO_UBYTE(srcRgba[i][BCOMP]); 1816aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dest[3] = CHAN_TO_UBYTE(srcRgba[i][ACOMP]); 1817aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dest += 4; 1818aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 1819aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 1820699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 1821699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* general solution */ 1822699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLuint i; 182347cf442c1164b6b406117fccfb8b564602741ee3Brian Paul DEFMARRAY(GLfloat, rgba, MAX_WIDTH, 4); /* mac 32k limitation */ 182447cf442c1164b6b406117fccfb8b564602741ee3Brian Paul CHECKARRAY(rgba, return); /* mac 32k limitation */ 182547cf442c1164b6b406117fccfb8b564602741ee3Brian Paul 1826699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul assert(n <= MAX_WIDTH); 1827699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* convert color components to floating point */ 1828699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul for (i=0;i<n;i++) { 1829699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul rgba[i][RCOMP] = CHAN_TO_FLOAT(srcRgba[i][RCOMP]); 1830699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul rgba[i][GCOMP] = CHAN_TO_FLOAT(srcRgba[i][GCOMP]); 1831699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul rgba[i][BCOMP] = CHAN_TO_FLOAT(srcRgba[i][BCOMP]); 1832699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul rgba[i][ACOMP] = CHAN_TO_FLOAT(srcRgba[i][ACOMP]); 1833699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 1834699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul _mesa_pack_float_rgba_span(ctx, n, (const GLfloat (*)[4]) rgba, 1835699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstFormat, dstType, dstAddr, 1836699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstPacking, transferOps); 183747cf442c1164b6b406117fccfb8b564602741ee3Brian Paul UNDEFARRAY(rgba); /* mac 32k limitation */ 1838699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 1839699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul} 1840699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 1841699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 1842c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define SWAP2BYTE(VALUE) \ 1843c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { \ 1844c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *bytes = (GLubyte *) &(VALUE); \ 1845c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte tmp = bytes[0]; \ 1846c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[0] = bytes[1]; \ 1847c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[1] = tmp; \ 1848c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1849c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1850c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define SWAP4BYTE(VALUE) \ 1851c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { \ 1852c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *bytes = (GLubyte *) &(VALUE); \ 1853c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte tmp = bytes[0]; \ 1854c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[0] = bytes[3]; \ 1855c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[3] = tmp; \ 1856c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul tmp = bytes[1]; \ 1857c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[1] = bytes[2]; \ 1858c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[2] = tmp; \ 1859c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1860c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1861c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1862c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic void 1863c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulextract_uint_indexes(GLuint n, GLuint indexes[], 1864c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum srcFormat, GLenum srcType, const GLvoid *src, 1865c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const struct gl_pixelstore_attrib *unpack ) 1866c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 1867c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(srcFormat == GL_COLOR_INDEX); 1868c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1869c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcType == GL_BITMAP || 1870c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_BYTE || 1871c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_BYTE || 1872c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT || 1873c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_SHORT || 1874c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT || 1875c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_INT || 1876c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_FLOAT); 1877c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1878c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul switch (srcType) { 1879c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BITMAP: 1880c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1881c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *ubsrc = (GLubyte *) src; 1882c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->LsbFirst) { 1883c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte mask = 1 << (unpack->SkipPixels & 0x7); 1884c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1885c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 1886c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = (*ubsrc & mask) ? 1 : 0; 1887c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (mask == 128) { 1888c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul mask = 1; 1889c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ubsrc++; 1890c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1891c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1892c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul mask = mask << 1; 1893c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1894c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1895c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1896c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1897c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte mask = 128 >> (unpack->SkipPixels & 0x7); 1898c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1899c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 1900c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = (*ubsrc & mask) ? 1 : 0; 1901c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (mask == 1) { 1902c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul mask = 128; 1903c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ubsrc++; 1904c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1905c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1906c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul mask = mask >> 1; 1907c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1908c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1909c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1910c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1911c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1912c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_BYTE: 1913c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1914c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1915c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLubyte *s = (const GLubyte *) src; 1916c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 1917c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 1918c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1919c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1920c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BYTE: 1921c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1922c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1923c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLbyte *s = (const GLbyte *) src; 1924c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 1925c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 1926c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1927c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1928c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT: 1929c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1930c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1931c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *s = (const GLushort *) src; 1932c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->SwapBytes) { 1933c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 1934c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort value = s[i]; 1935c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(value); 1936c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = value; 1937c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1938c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1939c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1940c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 1941c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 1942c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1943c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1944c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1945c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_SHORT: 1946c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1947c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1948c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLshort *s = (const GLshort *) src; 1949c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->SwapBytes) { 1950c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 1951c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLshort value = s[i]; 1952c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(value); 1953c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = value; 1954c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1955c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1956c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1957c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 1958c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 1959c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1960c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1961c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1962c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT: 1963c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1964c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1965c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *s = (const GLuint *) src; 1966c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->SwapBytes) { 1967c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 1968c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint value = s[i]; 1969c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(value); 1970c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = value; 1971c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1972c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1973c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1974c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 1975c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 1976c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1977c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1978c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1979c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_INT: 1980c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1981c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1982c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLint *s = (const GLint *) src; 1983c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->SwapBytes) { 1984c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 1985c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint value = s[i]; 1986c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(value); 1987c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = value; 1988c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1989c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1990c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1991c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 1992c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 1993c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1994c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1995c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1996c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_FLOAT: 1997c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1998c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1999c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLfloat *s = (const GLfloat *) src; 2000c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->SwapBytes) { 2001c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2002c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLfloat value = s[i]; 2003c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(value); 2004959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul indexes[i] = (GLuint) value; 2005c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2006c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2007c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2008c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 2009959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul indexes[i] = (GLuint) s[i]; 2010c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2011c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2012c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2013c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul default: 201408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(NULL, "bad srcType in extract_uint_indexes"); 2015c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 2016c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2017c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 2018c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2019c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2020c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2021c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/* 2022c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This function extracts floating point RGBA values from arbitrary 2023c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * image data. srcFormat and srcType are the format and type parameters 2024c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc. 2025c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * 2026c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function 2027c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * implements the "Conversion to floating point", "Conversion to RGB", 2028c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * and "Final Expansion to RGBA" operations. 2029c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * 2030c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Args: n - number of pixels 2031c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * rgba - output colors 2032c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * srcFormat - format of incoming data 2033c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * srcType - datatype of incoming data 2034c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * src - source data pointer 2035c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * swapBytes - perform byteswapping of incoming data? 2036c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 2037c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic void 2038c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulextract_float_rgba(GLuint n, GLfloat rgba[][4], 2039c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum srcFormat, GLenum srcType, const GLvoid *src, 2040c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLboolean swapBytes) 2041c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 2042c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint redIndex, greenIndex, blueIndex, alphaIndex; 2043c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint stride; 2044c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint rComp, bComp, gComp, aComp; 2045c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2046c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcFormat == GL_RED || 2047c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_GREEN || 2048c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BLUE || 2049c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_ALPHA || 2050c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_LUMINANCE || 2051c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_LUMINANCE_ALPHA || 2052c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_INTENSITY || 2053c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_RGB || 2054c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BGR || 2055c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_RGBA || 2056c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BGRA || 2057c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_ABGR_EXT); 2058c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2059c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcType == GL_UNSIGNED_BYTE || 2060c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_BYTE || 2061c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT || 2062c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_SHORT || 2063c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT || 2064c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_INT || 2065c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_FLOAT || 2066c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_BYTE_3_3_2 || 2067a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 2068a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_5_6_5 || 2069a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 2070c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 2071a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 2072c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 2073a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 2074c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT_8_8_8_8 || 2075a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 2076a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_10_10_10_2 || 2077a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_2_10_10_10_REV); 2078c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2079a0020435f58baef6a67d3c073b62ea6b1d143af1Brian Paul rComp = gComp = bComp = aComp = -1; 2080a0020435f58baef6a67d3c073b62ea6b1d143af1Brian Paul 2081c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul switch (srcFormat) { 2082c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_RED: 2083c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 0; 2084c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = blueIndex = alphaIndex = -1; 2085c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 2086c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2087c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_GREEN: 2088c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 0; 2089c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = blueIndex = alphaIndex = -1; 2090c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 2091c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2092c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BLUE: 2093c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 0; 2094c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = greenIndex = alphaIndex = -1; 2095c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 2096c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2097c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_ALPHA: 2098c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = greenIndex = blueIndex = -1; 2099c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = 0; 2100c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 2101c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 21025e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen case GL_LUMINANCE: 2103c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = greenIndex = blueIndex = 0; 2104c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = -1; 2105c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 2106c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2107c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_LUMINANCE_ALPHA: 2108c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = greenIndex = blueIndex = 0; 2109c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = 1; 2110c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 2; 2111c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2112c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_INTENSITY: 211301429fa46a05cba7d2d11825facd7d8e6117dacdBrian Paul redIndex = greenIndex = blueIndex = alphaIndex = 0; 2114c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 2115c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2116c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_RGB: 2117c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 0; 2118c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 1; 2119c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 2; 2120c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = -1; 2121c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 3; 2122c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2123c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BGR: 2124c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 2; 2125c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 1; 2126c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 0; 2127c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = -1; 2128c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 3; 2129c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2130c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_RGBA: 2131c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 0; 2132c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 1; 2133c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 2; 2134c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = 3; 2135c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rComp = 0; 2136c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gComp = 1; 2137c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bComp = 2; 2138c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul aComp = 3; 2139c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 4; 2140c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2141c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BGRA: 2142c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 2; 2143c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 1; 2144c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 0; 2145c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = 3; 2146c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rComp = 2; 2147c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gComp = 1; 2148c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bComp = 0; 2149c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul aComp = 3; 2150c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 4; 2151c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2152c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_ABGR_EXT: 2153c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 3; 2154c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 2; 2155c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 1; 2156c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = 0; 2157c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rComp = 3; 2158c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gComp = 2; 2159c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bComp = 1; 2160c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul aComp = 0; 2161c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 4; 2162c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2163c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul default: 216408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(NULL, "bad srcFormat in extract float data"); 2165c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 2166c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2167c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2168c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2169c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define PROCESS(INDEX, CHANNEL, DEFAULT, TYPE, CONVERSION) \ 2170c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if ((INDEX) < 0) { \ 2171c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; \ 2172c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { \ 2173c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][CHANNEL] = DEFAULT; \ 2174c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 2175c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 2176c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (swapBytes) { \ 2177c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const TYPE *s = (const TYPE *) src; \ 2178c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; \ 2179c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { \ 2180c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul TYPE value = s[INDEX]; \ 2181c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (sizeof(TYPE) == 2) { \ 2182c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(value); \ 2183c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 2184c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (sizeof(TYPE) == 4) { \ 2185c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(value); \ 2186c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 2187c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][CHANNEL] = (GLfloat) CONVERSION(value); \ 2188c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul s += stride; \ 2189c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 2190c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 2191c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { \ 2192c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const TYPE *s = (const TYPE *) src; \ 2193c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; \ 2194c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { \ 2195c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][CHANNEL] = (GLfloat) CONVERSION(s[INDEX]); \ 2196c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul s += stride; \ 2197c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 2198c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2199c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2200c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul switch (srcType) { 2201c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_BYTE: 2202c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT); 2203c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT); 2204c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT); 2205c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLubyte, UBYTE_TO_FLOAT); 2206c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2207c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BYTE: 2208c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT); 2209c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT); 2210c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT); 2211c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLbyte, BYTE_TO_FLOAT); 2212c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2213c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT: 2214c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLushort, USHORT_TO_FLOAT); 2215c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLushort, USHORT_TO_FLOAT); 2216c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLushort, USHORT_TO_FLOAT); 2217c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLushort, USHORT_TO_FLOAT); 2218c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2219c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_SHORT: 2220c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLshort, SHORT_TO_FLOAT); 2221c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLshort, SHORT_TO_FLOAT); 2222c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLshort, SHORT_TO_FLOAT); 2223c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLshort, SHORT_TO_FLOAT); 2224c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2225c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT: 2226c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLuint, UINT_TO_FLOAT); 2227c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLuint, UINT_TO_FLOAT); 2228c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLuint, UINT_TO_FLOAT); 2229c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLuint, UINT_TO_FLOAT); 2230c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2231c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_INT: 2232c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLint, INT_TO_FLOAT); 2233c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLint, INT_TO_FLOAT); 2234c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLint, INT_TO_FLOAT); 2235c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLint, INT_TO_FLOAT); 2236c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2237c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_FLOAT: 2238c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLfloat, (GLfloat)); 2239c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLfloat, (GLfloat)); 2240c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLfloat, (GLfloat)); 2241c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLfloat, (GLfloat)); 2242c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2243c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_BYTE_3_3_2: 2244c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2245c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLubyte *ubsrc = (const GLubyte *) src; 2246c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2247c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2248c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte p = ubsrc[i]; 2249c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p >> 5) ) * (1.0F / 7.0F); 2250c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 2) & 0x7) * (1.0F / 7.0F); 2251c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p ) & 0x3) * (1.0F / 3.0F); 2252c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 2253c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2254c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2255c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2256c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_BYTE_2_3_3_REV: 2257c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2258c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLubyte *ubsrc = (const GLubyte *) src; 2259c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2260c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2261c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte p = ubsrc[i]; 2262c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p ) & 0x7) * (1.0F / 7.0F); 2263c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 3) & 0x7) * (1.0F / 7.0F); 2264c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p >> 6) ) * (1.0F / 3.0F); 2265c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 2266c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2267c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2268c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2269c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_5_6_5: 2270c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2271c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2272c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2273c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2274c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2275c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 2276c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p >> 11) ) * (1.0F / 31.0F); 2277c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 5) & 0x3f) * (1.0F / 63.0F); 2278c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p ) & 0x1f) * (1.0F / 31.0F); 2279c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 2280c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2281c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2282c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2283c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2284c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2285c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2286c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2287c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p >> 11) ) * (1.0F / 31.0F); 2288c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 5) & 0x3f) * (1.0F / 63.0F); 2289c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p ) & 0x1f) * (1.0F / 31.0F); 2290c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 2291c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2292c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2293c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2294c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_5_6_5_REV: 2295c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2296c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2297c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2298c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2299c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2300c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 2301c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p ) & 0x1f) * (1.0F / 31.0F); 2302c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 5) & 0x3f) * (1.0F / 63.0F); 2303c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p >> 11) ) * (1.0F / 31.0F); 2304c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 2305c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2306c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2307c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2308c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2309c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2310c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2311c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2312c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p ) & 0x1f) * (1.0F / 31.0F); 2313c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 5) & 0x3f) * (1.0F / 63.0F); 2314c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p >> 11) ) * (1.0F / 31.0F); 2315c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 2316c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2317c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2318c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2319c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_4_4_4_4: 2320c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2321c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2322c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2323c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2324c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2325c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 2326c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p >> 12) ) * (1.0F / 15.0F); 2327c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F); 2328c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F); 2329c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p ) & 0xf) * (1.0F / 15.0F); 2330c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2331c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2332c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2333c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2334c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2335c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2336c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2337c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p >> 12) ) * (1.0F / 15.0F); 2338c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F); 2339c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F); 2340c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p ) & 0xf) * (1.0F / 15.0F); 2341c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2342c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2343c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2344c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_4_4_4_4_REV: 2345c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2346c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2347c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2348c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2349c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2350c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 2351c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0xf) * (1.0F / 15.0F); 2352c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F); 2353c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F); 2354c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 12) ) * (1.0F / 15.0F); 2355c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2356c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2357c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2358c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2359c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2360c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2361c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2362c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0xf) * (1.0F / 15.0F); 2363c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F); 2364c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F); 2365c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 12) ) * (1.0F / 15.0F); 2366c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2367c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2368c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2369c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_5_5_5_1: 2370c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2371c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2372c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2373c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2374c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2375c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 2376c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p >> 11) ) * (1.0F / 31.0F); 2377c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 6) & 0x1f) * (1.0F / 31.0F); 2378c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 1) & 0x1f) * (1.0F / 31.0F); 2379c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p ) & 0x1) * (1.0F / 1.0F); 2380c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2381c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2382c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2383c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2384c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2385c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2386c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2387c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p >> 11) ) * (1.0F / 31.0F); 2388c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 6) & 0x1f) * (1.0F / 31.0F); 2389c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 1) & 0x1f) * (1.0F / 31.0F); 2390c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p ) & 0x1) * (1.0F / 1.0F); 2391c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2392c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2393c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2394c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_1_5_5_5_REV: 2395c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2396c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2397c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2398c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2399c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2400c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 2401c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0x1f) * (1.0F / 31.0F); 2402c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 5) & 0x1f) * (1.0F / 31.0F); 2403c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F); 2404c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 15) ) * (1.0F / 1.0F); 2405c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2406c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2407c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2408c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2409c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2410c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2411c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2412c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0x1f) * (1.0F / 31.0F); 2413c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 5) & 0x1f) * (1.0F / 31.0F); 2414c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F); 2415c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 15) ) * (1.0F / 1.0F); 2416c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2417c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2418c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2419c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT_8_8_8_8: 2420c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2421c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2422c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2423c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2424c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 24253041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][rComp] = UBYTE_TO_FLOAT((p ) & 0xff); 24263041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 24273041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 24283041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][aComp] = UBYTE_TO_FLOAT((p >> 24) ); 2429c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2430c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2431c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2432c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2433c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2434c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2435c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 24363041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][rComp] = UBYTE_TO_FLOAT((p >> 24) ); 24373041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 24383041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 24393041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][aComp] = UBYTE_TO_FLOAT((p ) & 0xff); 2440c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2441c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2442c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2443c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT_8_8_8_8_REV: 2444c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2445c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2446c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2447c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2448c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 24493041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][rComp] = UBYTE_TO_FLOAT((p >> 24) ); 24503041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 24513041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 24523041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][aComp] = UBYTE_TO_FLOAT((p ) & 0xff); 2453c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2454c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2455c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2456c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2457c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2458c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2459c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 24603041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][rComp] = UBYTE_TO_FLOAT((p ) & 0xff); 24613041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 24623041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 24633041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][aComp] = UBYTE_TO_FLOAT((p >> 24) ); 2464c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2465c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2466c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2467c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT_10_10_10_2: 2468c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2469c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2470c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2471c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2472c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 2473c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(p); 2474a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][rComp] = ((p >> 22) ) * (1.0F / 1023.0F); 2475a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F); 2476a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][bComp] = ((p >> 2) & 0x3ff) * (1.0F / 1023.0F); 2477a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][aComp] = ((p ) & 0x3 ) * (1.0F / 3.0F); 2478c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2479c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2480c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2481c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2482c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2483c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2484c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 2485a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][rComp] = ((p >> 22) ) * (1.0F / 1023.0F); 2486a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F); 2487a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][bComp] = ((p >> 2) & 0x3ff) * (1.0F / 1023.0F); 2488a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][aComp] = ((p ) & 0x3 ) * (1.0F / 3.0F); 2489c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2490c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2491c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2492c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT_2_10_10_10_REV: 2493c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2494c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2495c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2496c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2497c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 2498c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(p); 2499c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0x3ff) * (1.0F / 1023.0F); 2500c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F); 2501c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F); 2502c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 30) ) * (1.0F / 3.0F); 2503c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2504c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2505c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2506c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2507c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2508c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2509c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 2510c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0x3ff) * (1.0F / 1023.0F); 2511c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F); 2512c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F); 2513c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 30) ) * (1.0F / 3.0F); 2514c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2515c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2516c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2517c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul default: 251808836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(NULL, "bad srcType in extract float data"); 2519c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2520c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2521c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 2522c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2523c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2524c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2525c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/* 2526c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack a row of color image data from a client buffer according to 2527fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * the pixel unpacking parameters. 2528c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Return GLubyte values in the specified dest image format. 2529c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This is (or will be) used by glDrawPixels and glTexImage?D(). 2530c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Input: ctx - the context 2531c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * n - number of pixels in the span 2532c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * dstFormat - format of destination color array 2533c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * dest - the destination color array 2534c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * srcFormat - source image format 2535c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * srcType - source image datatype 2536c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * source - source image pointer 2537b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul * srcPacking - pixel unpacking parameters 2538fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * transferOps - bitmask of IMAGE_*_BIT values of operations to apply 2539c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * 2540c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * XXX perhaps expand this to process whole images someday. 2541c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 2542c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid 2543699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul_mesa_unpack_chan_color_span( GLcontext *ctx, 2544699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLuint n, GLenum dstFormat, GLchan dest[], 2545699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLenum srcFormat, GLenum srcType, 2546699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul const GLvoid *source, 2547699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul const struct gl_pixelstore_attrib *srcPacking, 2548699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLuint transferOps ) 2549c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 2550c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(dstFormat == GL_ALPHA || 25515e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen dstFormat == GL_LUMINANCE || 2552c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_LUMINANCE_ALPHA || 2553c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_INTENSITY || 2554c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_RGB || 2555c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_RGBA || 2556c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_COLOR_INDEX); 2557c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2558c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcFormat == GL_RED || 2559c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_GREEN || 2560c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BLUE || 2561c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_ALPHA || 2562c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_LUMINANCE || 2563c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_LUMINANCE_ALPHA || 2564c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_INTENSITY || 2565c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_RGB || 2566c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BGR || 2567c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_RGBA || 2568c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BGRA || 2569c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_ABGR_EXT || 2570c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_COLOR_INDEX); 2571c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2572c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcType == GL_BITMAP || 2573c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_BYTE || 2574c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_BYTE || 2575c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT || 2576c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_SHORT || 2577c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT || 2578c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_INT || 2579c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_FLOAT || 2580c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_BYTE_3_3_2 || 2581a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 2582a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_5_6_5 || 2583a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 2584c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 2585a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 2586c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 2587a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 2588c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT_8_8_8_8 || 2589a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 2590a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_10_10_10_2 || 2591a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_2_10_10_10_REV); 2592c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2593c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Try simple cases first */ 2594aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul if (transferOps == 0 ){ 2595aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul if (srcType == CHAN_TYPE) { 2596aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul if (dstFormat == GL_RGBA) { 2597aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul if (srcFormat == GL_RGBA) { 2598aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul MEMCPY( dest, source, n * 4 * sizeof(GLchan) ); 2599aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul return; 2600aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2601aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul else if (srcFormat == GL_RGB) { 2602aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLuint i; 2603aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul const GLchan *src = (const GLchan *) source; 2604aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLchan *dst = dest; 2605aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul for (i = 0; i < n; i++) { 2606aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[0] = src[0]; 2607aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[1] = src[1]; 2608aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[2] = src[2]; 2609aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[3] = CHAN_MAX; 2610aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul src += 3; 2611aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst += 4; 2612aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2613aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul return; 2614aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2615c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2616aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul else if (dstFormat == GL_RGB) { 2617aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul if (srcFormat == GL_RGB) { 2618aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul MEMCPY( dest, source, n * 3 * sizeof(GLchan) ); 2619aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul return; 2620aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2621aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul else if (srcFormat == GL_RGBA) { 2622aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLuint i; 2623aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul const GLchan *src = (const GLchan *) source; 2624aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLchan *dst = dest; 2625aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul for (i = 0; i < n; i++) { 2626aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[0] = src[0]; 2627aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[1] = src[1]; 2628aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[2] = src[2]; 2629aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul src += 4; 2630aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst += 3; 2631aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2632aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul return; 2633c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2634aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2635aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul else if (dstFormat == srcFormat) { 2636aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLint comps = _mesa_components_in_format(srcFormat); 2637aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul assert(comps > 0); 2638aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul MEMCPY( dest, source, n * comps * sizeof(GLchan) ); 2639c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 2640c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2641c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2642aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul /* 2643aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul * Common situation, loading 8bit RGBA/RGB source images 2644aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul * into 16/32 bit destination. (OSMesa16/32) 2645aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul */ 2646aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul else if (srcType == GL_UNSIGNED_BYTE) { 2647aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul if (dstFormat == GL_RGBA) { 2648aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul if (srcFormat == GL_RGB) { 2649aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLuint i; 2650aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul const GLubyte *src = (const GLubyte *) source; 2651aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLchan *dst = dest; 2652aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul for (i = 0; i < n; i++) { 2653aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[0] = UBYTE_TO_CHAN(src[0]); 2654aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[1] = UBYTE_TO_CHAN(src[1]); 2655aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[2] = UBYTE_TO_CHAN(src[2]); 2656aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[3] = CHAN_MAX; 2657aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul src += 3; 2658aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst += 4; 2659aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2660aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul return; 2661aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2662aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul else if (srcFormat == GL_RGBA) { 2663aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLuint i; 2664aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul const GLubyte *src = (const GLubyte *) source; 2665aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLchan *dst = dest; 2666aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul for (i = 0; i < n; i++) { 2667aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[0] = UBYTE_TO_CHAN(src[0]); 2668aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[1] = UBYTE_TO_CHAN(src[1]); 2669aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[2] = UBYTE_TO_CHAN(src[2]); 2670aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[3] = UBYTE_TO_CHAN(src[3]); 2671aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul src += 4; 2672aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst += 4; 2673aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2674aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul return; 2675aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2676c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2677aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul else if (dstFormat == GL_RGB) { 2678aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul if (srcFormat == GL_RGB) { 2679aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLuint i; 2680aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul const GLubyte *src = (const GLubyte *) source; 2681aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLchan *dst = dest; 2682aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul for (i = 0; i < n; i++) { 2683aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[0] = UBYTE_TO_CHAN(src[0]); 2684aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[1] = UBYTE_TO_CHAN(src[1]); 2685aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[2] = UBYTE_TO_CHAN(src[2]); 2686aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul src += 3; 2687aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst += 3; 2688aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2689aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul return; 2690aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2691aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul else if (srcFormat == GL_RGBA) { 2692aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLuint i; 2693aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul const GLubyte *src = (const GLubyte *) source; 2694aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLchan *dst = dest; 2695aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul for (i = 0; i < n; i++) { 2696aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[0] = UBYTE_TO_CHAN(src[0]); 2697aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[1] = UBYTE_TO_CHAN(src[1]); 2698aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[2] = UBYTE_TO_CHAN(src[2]); 2699aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul src += 4; 2700aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst += 3; 2701aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2702aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul return; 2703c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2704c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2705c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2706c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2707c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2708c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2709179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul /* general solution begins here */ 2710c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2711c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint dstComponents; 2712c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint dstRedIndex, dstGreenIndex, dstBlueIndex, dstAlphaIndex; 2713c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint dstLuminanceIndex, dstIntensityIndex; 271447cf442c1164b6b406117fccfb8b564602741ee3Brian Paul DEFMARRAY(GLfloat, rgba, MAX_WIDTH, 4); /* mac 32k limitation */ 271547cf442c1164b6b406117fccfb8b564602741ee3Brian Paul CHECKARRAY(rgba, return); /* mac 32k limitation */ 2716c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2717b7d076fc96ac27117421653a043d00a95f789d24Brian Paul dstComponents = _mesa_components_in_format( dstFormat ); 2718c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* source & dest image formats should have been error checked by now */ 2719c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(dstComponents > 0); 2720c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2721c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* 2722c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Extract image data and convert to RGBA floats 2723c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 2724c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(n <= MAX_WIDTH); 2725c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (srcFormat == GL_COLOR_INDEX) { 2726c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint indexes[MAX_WIDTH]; 2727c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul extract_uint_indexes(n, indexes, srcFormat, srcType, source, 2728b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul srcPacking); 2729c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2730fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul if (dstFormat == GL_COLOR_INDEX 2731fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul && (transferOps & IMAGE_MAP_COLOR_BIT)) { 2732fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul _mesa_map_ci(ctx, n, indexes); 2733fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul } 2734fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 2735fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul _mesa_shift_and_offset_ci(ctx, n, indexes); 2736c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2737c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2738c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstFormat == GL_COLOR_INDEX) { 2739699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* convert to GLchan and return */ 2740c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 2741c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 2742699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dest[i] = (GLchan) (indexes[i] & 0xff); 2743c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 274447cf442c1164b6b406117fccfb8b564602741ee3Brian Paul UNDEFARRAY(rgba); /* mac 32k limitation */ 2745c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul return; 2746c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2747c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2748c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Convert indexes to RGBA */ 2749179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul _mesa_map_ci_to_rgba(ctx, n, indexes, rgba); 2750c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2751c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2752c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2753c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul extract_float_rgba(n, rgba, srcFormat, srcType, source, 2754b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul srcPacking->SwapBytes); 2755c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2756fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* scale and bias colors */ 2757fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_SCALE_BIAS_BIT) { 275845015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul _mesa_scale_and_bias_rgba(ctx, n, rgba, 275945015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.RedScale, ctx->Pixel.GreenScale, 276045015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.BlueScale, ctx->Pixel.AlphaScale, 276145015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.RedBias, ctx->Pixel.GreenBias, 276245015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.BlueBias, ctx->Pixel.AlphaBias); 2763fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul } 2764fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* color map lookup */ 2765fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_MAP_COLOR_BIT) { 2766fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul _mesa_map_rgba(ctx, n, rgba); 2767c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2768c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2769c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2770fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps) { 2771c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* GL_COLOR_TABLE lookup */ 2772fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_COLOR_TABLE_BIT) { 2773c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_lookup_rgba(&ctx->ColorTable, n, rgba); 2774c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2775fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* convolution */ 2776fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_CONVOLUTION_BIT) { 2777ef9025a641624991113b7df2eecdf7c8e330a31cBrian Paul /* this has to be done in the calling code */ 2778fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul } 277945015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */ 278045015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul if (transferOps & IMAGE_POST_CONVOLUTION_SCALE_BIAS) { 278145015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul _mesa_scale_and_bias_rgba(ctx, n, rgba, 278245015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionScale[RCOMP], 278345015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionScale[GCOMP], 278445015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionScale[BCOMP], 278545015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionScale[ACOMP], 278645015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionBias[RCOMP], 278745015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionBias[GCOMP], 278845015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionBias[BCOMP], 278945015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionBias[ACOMP]); 279045015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul } 2791c29714dccb664562958cf36cdedee9c4377585d2Brian Paul /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */ 2792fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT) { 2793c29714dccb664562958cf36cdedee9c4377585d2Brian Paul _mesa_lookup_rgba(&ctx->PostConvolutionColorTable, n, rgba); 2794c29714dccb664562958cf36cdedee9c4377585d2Brian Paul } 2795c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* color matrix transform */ 2796fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_COLOR_MATRIX_BIT) { 2797c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_transform_rgba(ctx, n, rgba); 2798c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2799c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */ 2800fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT) { 2801c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_lookup_rgba(&ctx->PostColorMatrixColorTable, n, rgba); 2802c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 28031a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul /* update histogram count */ 2804fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_HISTOGRAM_BIT) { 28051a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul _mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba); 28061a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul } 2807fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* min/max here */ 2808fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_MIN_MAX_BIT) { 28091a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul _mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba); 2810c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2811c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2812c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2813c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* clamp to [0,1] */ 281496385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul#if CHAN_TYPE != GL_FLOAT 2815c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2816c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2817c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2818c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F); 2819c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F); 2820c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F); 2821c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F); 2822c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2823c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 282496385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul#endif 2825c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2826c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Now determine which color channels we need to produce. 2827c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * And determine the dest index (offset) within each color tuple. 2828c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 2829c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul switch (dstFormat) { 2830c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_ALPHA: 2831c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstAlphaIndex = 0; 2832c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = -1; 2833c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstLuminanceIndex = dstIntensityIndex = -1; 2834c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 28355e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen case GL_LUMINANCE: 2836c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstLuminanceIndex = 0; 2837c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1; 2838c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstIntensityIndex = -1; 2839c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2840c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_LUMINANCE_ALPHA: 2841c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstLuminanceIndex = 0; 2842c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstAlphaIndex = 1; 2843c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = -1; 2844c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstIntensityIndex = -1; 2845c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2846c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_INTENSITY: 2847c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstIntensityIndex = 0; 2848c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1; 2849c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstLuminanceIndex = -1; 2850c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2851c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_RGB: 2852c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = 0; 2853c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstGreenIndex = 1; 2854c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstBlueIndex = 2; 2855c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1; 2856c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2857c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_RGBA: 2858c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = 0; 2859c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstGreenIndex = 1; 2860c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstBlueIndex = 2; 2861c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstAlphaIndex = 3; 2862c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstLuminanceIndex = dstIntensityIndex = -1; 2863c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2864c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul default: 286508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad dstFormat in _mesa_unpack_chan_span()"); 286647cf442c1164b6b406117fccfb8b564602741ee3Brian Paul UNDEFARRAY(rgba); /* mac 32k limitation */ 2867276988ec96a48d4ee5c28c0a2da3aa2b5ee0bbeaBrian Paul return; 2868c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2869c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2870c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2871699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* Now return the GLchan data in the requested dstFormat */ 2872fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2873c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstRedIndex >= 0) { 2874699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dst = dest; 2875c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2876c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 28776532db986883ea1a431c043126de4947465834a1Brian Paul CLAMPED_FLOAT_TO_CHAN(dst[dstRedIndex], rgba[i][RCOMP]); 2878c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += dstComponents; 2879c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2880c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2881c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2882c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstGreenIndex >= 0) { 2883699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dst = dest; 2884c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2885c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 28866532db986883ea1a431c043126de4947465834a1Brian Paul CLAMPED_FLOAT_TO_CHAN(dst[dstGreenIndex], rgba[i][GCOMP]); 2887c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += dstComponents; 2888c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2889c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2890c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2891c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstBlueIndex >= 0) { 2892699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dst = dest; 2893c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2894c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 28956532db986883ea1a431c043126de4947465834a1Brian Paul CLAMPED_FLOAT_TO_CHAN(dst[dstBlueIndex], rgba[i][BCOMP]); 2896c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += dstComponents; 2897c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2898c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2899c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2900c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstAlphaIndex >= 0) { 2901699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dst = dest; 2902c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2903c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 29046532db986883ea1a431c043126de4947465834a1Brian Paul CLAMPED_FLOAT_TO_CHAN(dst[dstAlphaIndex], rgba[i][ACOMP]); 2905c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += dstComponents; 2906c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2907c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2908c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2909c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstIntensityIndex >= 0) { 2910699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dst = dest; 2911c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2912c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(dstIntensityIndex == 0); 2913c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(dstComponents == 1); 2914c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2915c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Intensity comes from red channel */ 29166532db986883ea1a431c043126de4947465834a1Brian Paul CLAMPED_FLOAT_TO_CHAN(dst[i], rgba[i][RCOMP]); 2917c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2918c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2919c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2920c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstLuminanceIndex >= 0) { 2921699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dst = dest; 2922c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2923c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(dstLuminanceIndex == 0); 2924c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2925c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Luminance comes from red channel */ 29266532db986883ea1a431c043126de4947465834a1Brian Paul CLAMPED_FLOAT_TO_CHAN(dst[0], rgba[i][RCOMP]); 2927c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += dstComponents; 2928c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2929c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 293047cf442c1164b6b406117fccfb8b564602741ee3Brian Paul UNDEFARRAY(rgba); /* mac 32k limitation */ 2931c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2932c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 2933c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2934c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2935c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paulvoid 2936c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul_mesa_unpack_float_color_span( GLcontext *ctx, 2937c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint n, GLenum dstFormat, GLfloat dest[], 2938c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLenum srcFormat, GLenum srcType, 2939c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul const GLvoid *source, 2940b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul const struct gl_pixelstore_attrib *srcPacking, 2941fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul GLuint transferOps, GLboolean clamp ) 2942c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul{ 2943c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul ASSERT(dstFormat == GL_ALPHA || 29445e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen dstFormat == GL_LUMINANCE || 2945c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstFormat == GL_LUMINANCE_ALPHA || 2946c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstFormat == GL_INTENSITY || 2947c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstFormat == GL_RGB || 2948c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstFormat == GL_RGBA || 2949c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstFormat == GL_COLOR_INDEX); 2950c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2951c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul ASSERT(srcFormat == GL_RED || 2952c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_GREEN || 2953c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_BLUE || 2954c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_ALPHA || 2955c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_LUMINANCE || 2956c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_LUMINANCE_ALPHA || 2957c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_INTENSITY || 2958c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_RGB || 2959c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_BGR || 2960c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_RGBA || 2961c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_BGRA || 2962c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_ABGR_EXT || 2963c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_COLOR_INDEX); 2964c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2965c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul ASSERT(srcType == GL_BITMAP || 2966c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_BYTE || 2967c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_BYTE || 2968c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT || 2969c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_SHORT || 2970c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_INT || 2971c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_INT || 2972c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_FLOAT || 2973c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_BYTE_3_3_2 || 2974c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 2975c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT_5_6_5 || 2976c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 2977c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 2978c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 2979c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 2980c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 2981c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_INT_8_8_8_8 || 2982c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 2983c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_INT_10_10_10_2 || 2984c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_INT_2_10_10_10_REV); 2985c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2986c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* general solution, no special cases, yet */ 2987c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul { 2988c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLint dstComponents; 2989c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLint dstRedIndex, dstGreenIndex, dstBlueIndex, dstAlphaIndex; 2990c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLint dstLuminanceIndex, dstIntensityIndex; 299147cf442c1164b6b406117fccfb8b564602741ee3Brian Paul DEFMARRAY(GLfloat, rgba, MAX_WIDTH, 4); /* mac 32k limitation */ 299247cf442c1164b6b406117fccfb8b564602741ee3Brian Paul CHECKARRAY(rgba, return); /* mac 32k limitation */ 2993c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2994c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstComponents = _mesa_components_in_format( dstFormat ); 2995c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* source & dest image formats should have been error checked by now */ 2996c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul assert(dstComponents > 0); 2997c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2998c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* 2999c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul * Extract image data and convert to RGBA floats 3000c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul */ 3001c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul assert(n <= MAX_WIDTH); 3002c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (srcFormat == GL_COLOR_INDEX) { 3003c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint indexes[MAX_WIDTH]; 3004c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul extract_uint_indexes(n, indexes, srcFormat, srcType, source, 3005b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul srcPacking); 3006c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3007fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul if (dstFormat == GL_COLOR_INDEX 3008fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul && (transferOps & IMAGE_MAP_COLOR_BIT)) { 3009fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul _mesa_map_ci(ctx, n, indexes); 3010fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul } 3011fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 3012fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul _mesa_shift_and_offset_ci(ctx, n, indexes); 3013c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3014c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3015c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstFormat == GL_COLOR_INDEX) { 3016699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* convert to GLchan and return */ 3017c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 3018c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 3019699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dest[i] = (GLchan) (indexes[i] & 0xff); 3020c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 302147cf442c1164b6b406117fccfb8b564602741ee3Brian Paul UNDEFARRAY(rgba); /* mac 32k limitation */ 3022c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul return; 3023c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3024c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul else { 3025c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* Convert indexes to RGBA */ 3026c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_map_ci_to_rgba(ctx, n, indexes, rgba); 3027c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3028c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3029c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul else { 3030c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul extract_float_rgba(n, rgba, srcFormat, srcType, source, 3031b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul srcPacking->SwapBytes); 3032c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3033fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* scale and bias colors */ 3034fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_SCALE_BIAS_BIT) { 303545015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul _mesa_scale_and_bias_rgba(ctx, n, rgba, 303645015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.RedScale, ctx->Pixel.GreenScale, 303745015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.BlueScale, ctx->Pixel.AlphaScale, 303845015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.RedBias, ctx->Pixel.GreenBias, 303945015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.BlueBias, ctx->Pixel.AlphaBias); 3040fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul } 3041fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* color map lookup */ 3042fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_MAP_COLOR_BIT) { 3043fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul _mesa_map_rgba(ctx, n, rgba); 3044c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3045c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3046c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3047fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps) { 3048c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* GL_COLOR_TABLE lookup */ 3049fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_COLOR_TABLE_BIT) { 3050c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_lookup_rgba(&ctx->ColorTable, n, rgba); 3051c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3052fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* convolution */ 3053fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_CONVOLUTION_BIT) { 3054fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* XXX to do */ 3055fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul } 305645015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */ 305745015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul if (transferOps & IMAGE_POST_CONVOLUTION_SCALE_BIAS) { 305845015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul _mesa_scale_and_bias_rgba(ctx, n, rgba, 305945015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionScale[RCOMP], 306045015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionScale[GCOMP], 306145015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionScale[BCOMP], 306245015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionScale[ACOMP], 306345015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionBias[RCOMP], 306445015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionBias[GCOMP], 306545015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionBias[BCOMP], 306645015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionBias[ACOMP]); 306745015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul } 3068c29714dccb664562958cf36cdedee9c4377585d2Brian Paul /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */ 3069fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT) { 3070c29714dccb664562958cf36cdedee9c4377585d2Brian Paul _mesa_lookup_rgba(&ctx->PostConvolutionColorTable, n, rgba); 3071c29714dccb664562958cf36cdedee9c4377585d2Brian Paul } 3072c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* color matrix transform */ 3073fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_COLOR_MATRIX_BIT) { 3074c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_transform_rgba(ctx, n, rgba); 3075c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3076c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */ 3077fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT) { 3078c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_lookup_rgba(&ctx->PostColorMatrixColorTable, n, rgba); 3079c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 30801a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul /* update histogram count */ 3081fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_HISTOGRAM_BIT) { 30821a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul _mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba); 30831a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul } 3084fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* min/max here */ 3085fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_MIN_MAX_BIT) { 30861a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul _mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba); 3087c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3088c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3089c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3090c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* clamp to [0,1] */ 309196385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul#if CHAN_TYPE != GL_FLOAT 30927a39d2f833807f8defd2304b0ff180944c23ea0cBrian Paul if (clamp) { 3093c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 3094c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 3095c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F); 3096c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F); 3097c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F); 3098c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F); 3099c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3100c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 310196385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul#endif 3102c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3103c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* Now determine which color channels we need to produce. 3104c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul * And determine the dest index (offset) within each color tuple. 3105c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul */ 3106c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul switch (dstFormat) { 3107c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul case GL_ALPHA: 3108c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstAlphaIndex = 0; 3109c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = -1; 3110c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstLuminanceIndex = dstIntensityIndex = -1; 3111c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul break; 31125e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen case GL_LUMINANCE: 3113c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstLuminanceIndex = 0; 3114c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1; 3115c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstIntensityIndex = -1; 3116c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul break; 3117c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul case GL_LUMINANCE_ALPHA: 3118c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstLuminanceIndex = 0; 3119c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstAlphaIndex = 1; 3120c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = -1; 3121c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstIntensityIndex = -1; 3122c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul break; 3123c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul case GL_INTENSITY: 3124c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstIntensityIndex = 0; 3125c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1; 3126c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstLuminanceIndex = -1; 3127c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul break; 3128c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul case GL_RGB: 3129c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstRedIndex = 0; 3130c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstGreenIndex = 1; 3131c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstBlueIndex = 2; 3132c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1; 3133c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul break; 3134c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul case GL_RGBA: 3135c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstRedIndex = 0; 3136c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstGreenIndex = 1; 3137c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstBlueIndex = 2; 3138c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstAlphaIndex = 3; 3139c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstLuminanceIndex = dstIntensityIndex = -1; 3140c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul break; 3141c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul default: 314208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad dstFormat in _mesa_unpack_float_color_span()"); 314347cf442c1164b6b406117fccfb8b564602741ee3Brian Paul UNDEFARRAY(rgba); /* mac 32k limitation */ 3144c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul return; 3145c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3146c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3147fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* Now pack results in the requested dstFormat */ 3148c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstRedIndex >= 0) { 3149c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat *dst = dest; 3150c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 3151c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 3152c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst[dstRedIndex] = rgba[i][RCOMP]; 3153c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst += dstComponents; 3154c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3155c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3156c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3157c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstGreenIndex >= 0) { 3158c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat *dst = dest; 3159c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 3160c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 3161c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst[dstGreenIndex] = rgba[i][GCOMP]; 3162c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst += dstComponents; 3163c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3164c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3165c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3166c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstBlueIndex >= 0) { 3167c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat *dst = dest; 3168c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 3169c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 3170c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst[dstBlueIndex] = rgba[i][BCOMP]; 3171c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst += dstComponents; 3172c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3173c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3174c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3175c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstAlphaIndex >= 0) { 3176c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat *dst = dest; 3177c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 3178c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 3179c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst[dstAlphaIndex] = rgba[i][ACOMP]; 3180c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst += dstComponents; 3181c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3182c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3183c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3184c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstIntensityIndex >= 0) { 3185c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat *dst = dest; 3186c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 3187c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul assert(dstIntensityIndex == 0); 3188c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul assert(dstComponents == 1); 3189c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 3190c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* Intensity comes from red channel */ 3191c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst[i] = rgba[i][RCOMP]; 3192c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3193c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3194c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3195c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstLuminanceIndex >= 0) { 3196c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat *dst = dest; 3197c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 3198c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul assert(dstLuminanceIndex == 0); 3199c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 3200c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* Luminance comes from red channel */ 3201c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst[0] = rgba[i][RCOMP]; 3202c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst += dstComponents; 3203c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3204c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 320547cf442c1164b6b406117fccfb8b564602741ee3Brian Paul UNDEFARRAY(rgba); /* mac 32k limitation */ 3206c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3207c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul} 3208c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3209c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3210c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3211c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3212c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/* 3213c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack a row of color index data from a client buffer according to 3214fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * the pixel unpacking parameters. 3215c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc. 3216c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * 3217c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Args: ctx - the context 3218c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * n - number of pixels 3219c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * dstType - destination datatype 3220c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * dest - destination array 3221c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * srcType - source pixel type 3222c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * source - source data pointer 3223b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul * srcPacking - pixel unpacking parameters 3224fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * transferOps - the pixel transfer operations to apply 3225c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 3226c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid 3227c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul_mesa_unpack_index_span( const GLcontext *ctx, GLuint n, 3228c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum dstType, GLvoid *dest, 3229c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum srcType, const GLvoid *source, 3230b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul const struct gl_pixelstore_attrib *srcPacking, 3231fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul GLuint transferOps ) 3232c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 3233c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcType == GL_BITMAP || 3234c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_BYTE || 3235c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_BYTE || 3236c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT || 3237c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_SHORT || 3238c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT || 3239c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_INT || 3240c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_FLOAT); 3241c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3242c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(dstType == GL_UNSIGNED_BYTE || 3243c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstType == GL_UNSIGNED_SHORT || 3244c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstType == GL_UNSIGNED_INT); 3245c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3246fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul 3247fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT); 3248c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3249c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* 3250c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Try simple cases first 3251c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 3252fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps == 0 && srcType == GL_UNSIGNED_BYTE 3253c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul && dstType == GL_UNSIGNED_BYTE) { 3254c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul MEMCPY(dest, source, n * sizeof(GLubyte)); 3255c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3256fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul else if (transferOps == 0 && srcType == GL_UNSIGNED_INT 3257b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul && dstType == GL_UNSIGNED_INT && !srcPacking->SwapBytes) { 3258c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul MEMCPY(dest, source, n * sizeof(GLuint)); 3259c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3260c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 3261c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* 3262c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * general solution 3263c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 3264c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint indexes[MAX_WIDTH]; 3265c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(n <= MAX_WIDTH); 3266c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3267c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source, 3268b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul srcPacking); 3269c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3270fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 3271fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* shift and offset indexes */ 3272fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul _mesa_shift_and_offset_ci(ctx, n, indexes); 3273fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul } 3274fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_MAP_COLOR_BIT) { 3275fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* Apply lookup table */ 3276fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul _mesa_map_ci(ctx, n, indexes); 3277c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3278c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3279c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* convert to dest type */ 3280c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul switch (dstType) { 3281c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_BYTE: 3282c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 3283c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dst = (GLubyte *) dest; 3284c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 3285c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 3286c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[i] = (GLubyte) (indexes[i] & 0xff); 3287c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3288c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3289c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 3290c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT: 3291c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 3292c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint *dst = (GLuint *) dest; 3293c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 3294c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 3295c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[i] = (GLushort) (indexes[i] & 0xffff); 3296c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3297c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3298c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 3299c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT: 3300c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul MEMCPY(dest, indexes, n * sizeof(GLuint)); 3301c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 3302c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul default: 330308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad dstType in _mesa_unpack_index_span"); 3304c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3305c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3306c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 3307c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3308c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 330923e8d46e072669e0974d7b2c168d4770183106bdBrian Paulvoid 331023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul_mesa_pack_index_span( const GLcontext *ctx, GLuint n, 331123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLenum dstType, GLvoid *dest, const GLuint *source, 331223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul const struct gl_pixelstore_attrib *dstPacking, 331323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint transferOps ) 331423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul{ 331523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint indexes[MAX_WIDTH]; 331623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 331723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul ASSERT(n <= MAX_WIDTH); 331823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 331923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT); 332023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 332123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (transferOps & (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT)) { 332223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul /* make a copy of input */ 332323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul MEMCPY(indexes, source, n * sizeof(GLuint)); 332423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 332523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_shift_and_offset_ci( ctx, n, indexes); 332623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 332723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (transferOps & IMAGE_MAP_COLOR_BIT) { 332823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_map_ci(ctx, n, indexes); 332923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 333023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul source = indexes; 333123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 333223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 333323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul switch (dstType) { 333423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_UNSIGNED_BYTE: 333523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 333623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLubyte *dst = (GLubyte *) dest; 333723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 333823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 333923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul *dst++ = (GLubyte) source[i]; 334023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 334123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 334223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 334323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_BYTE: 334423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 334523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLbyte *dst = (GLbyte *) dest; 334623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 334723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 3348a51f07d5a148705c1c118dece1630972753ca349Brian Paul dst[i] = (GLbyte) source[i]; 334923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 335023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 335123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 335223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_UNSIGNED_SHORT: 335323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 335423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLushort *dst = (GLushort *) dest; 335523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 335623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 3357a51f07d5a148705c1c118dece1630972753ca349Brian Paul dst[i] = (GLushort) source[i]; 335823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 335923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 336023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap2( (GLushort *) dst, n ); 336123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 336223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 336323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 336423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_SHORT: 336523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 336623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLshort *dst = (GLshort *) dest; 336723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 336823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 3369a51f07d5a148705c1c118dece1630972753ca349Brian Paul dst[i] = (GLshort) source[i]; 337023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 337123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 337223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap2( (GLushort *) dst, n ); 337323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 337423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 337523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 337623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_UNSIGNED_INT: 337723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 337823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint *dst = (GLuint *) dest; 337923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 338023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 3381a51f07d5a148705c1c118dece1630972753ca349Brian Paul dst[i] = (GLuint) source[i]; 338223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 338323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 338423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap4( (GLuint *) dst, n ); 338523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 338623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 338723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 338823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_INT: 338923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 339023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLint *dst = (GLint *) dest; 339123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 339223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 3393a51f07d5a148705c1c118dece1630972753ca349Brian Paul dst[i] = (GLint) source[i]; 339423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 339523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 339623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap4( (GLuint *) dst, n ); 339723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 339823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 339923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 340023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_FLOAT: 340123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 340223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLfloat *dst = (GLfloat *) dest; 340323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 340423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 3405a51f07d5a148705c1c118dece1630972753ca349Brian Paul dst[i] = (GLfloat) source[i]; 340623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 340723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 340823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap4( (GLuint *) dst, n ); 340923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 341023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 341123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 341223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul default: 341308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad type in _mesa_pack_index_span"); 341423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 341523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul} 341623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 341723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 341823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 3419c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/* 3420fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Unpack a row of stencil data from a client buffer according to 3421fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * the pixel unpacking parameters. 3422fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * This is (or will be) used by glDrawPixels 3423fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * 3424fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Args: ctx - the context 3425fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * n - number of pixels 3426fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * dstType - destination datatype 3427fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * dest - destination array 3428fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * srcType - source pixel type 3429fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * source - source data pointer 3430b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul * srcPacking - pixel unpacking parameters 3431fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * transferOps - apply offset/bias/lookup ops? 3432fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */ 3433fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid 3434fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_unpack_stencil_span( const GLcontext *ctx, GLuint n, 3435fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLenum dstType, GLvoid *dest, 3436fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLenum srcType, const GLvoid *source, 3437b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul const struct gl_pixelstore_attrib *srcPacking, 3438fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul GLuint transferOps ) 3439fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{ 3440fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul ASSERT(srcType == GL_BITMAP || 3441fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_UNSIGNED_BYTE || 3442fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_BYTE || 3443fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_UNSIGNED_SHORT || 3444fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_SHORT || 3445fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_UNSIGNED_INT || 3446fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_INT || 3447fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_FLOAT); 3448fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3449fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul ASSERT(dstType == GL_UNSIGNED_BYTE || 3450fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dstType == GL_UNSIGNED_SHORT || 3451fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dstType == GL_UNSIGNED_INT); 3452fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3453fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* only shift and offset apply to stencil */ 3454fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul transferOps &= IMAGE_SHIFT_OFFSET_BIT; 3455fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3456fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* 3457fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Try simple cases first 3458fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */ 3459fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps == 0 && 3460fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul srcType == GL_UNSIGNED_BYTE && 3461fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul dstType == GL_UNSIGNED_BYTE) { 3462fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul MEMCPY(dest, source, n * sizeof(GLubyte)); 3463fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3464fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul else if (transferOps == 0 && 3465fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul srcType == GL_UNSIGNED_INT && 3466fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul dstType == GL_UNSIGNED_INT && 3467b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul !srcPacking->SwapBytes) { 3468fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul MEMCPY(dest, source, n * sizeof(GLuint)); 3469fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3470fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul else { 3471fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* 3472fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * general solution 3473fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */ 3474fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint indexes[MAX_WIDTH]; 3475fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul assert(n <= MAX_WIDTH); 3476fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3477fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source, 3478b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul srcPacking); 3479fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3480fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps) { 3481fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 3482fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* shift and offset indexes */ 3483179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul _mesa_shift_and_offset_ci(ctx, n, indexes); 3484fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3485fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3486fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (ctx->Pixel.MapStencilFlag) { 3487fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* Apply stencil lookup table */ 3488fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint mask = ctx->Pixel.MapStoSsize - 1; 3489fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3490fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i=0;i<n;i++) { 3491fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul indexes[i] = ctx->Pixel.MapStoS[ indexes[i] & mask ]; 3492fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3493fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3494fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3495fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3496fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* convert to dest type */ 3497fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul switch (dstType) { 3498fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_BYTE: 3499fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3500fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLubyte *dst = (GLubyte *) dest; 3501fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3502fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3503fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dst[i] = (GLubyte) (indexes[i] & 0xff); 3504fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3505fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3506fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3507fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_SHORT: 3508fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3509fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint *dst = (GLuint *) dest; 3510fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3511fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3512fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dst[i] = (GLushort) (indexes[i] & 0xffff); 3513fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3514fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3515fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3516fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_INT: 3517fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul MEMCPY(dest, indexes, n * sizeof(GLuint)); 3518fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3519fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul default: 352008836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad dstType in _mesa_unpack_stencil_span"); 3521fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3522fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3523fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 3524fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3525fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 352623e8d46e072669e0974d7b2c168d4770183106bdBrian Paulvoid 352723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul_mesa_pack_stencil_span( const GLcontext *ctx, GLuint n, 352823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLenum dstType, GLvoid *dest, const GLstencil *source, 352923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul const struct gl_pixelstore_attrib *dstPacking ) 353023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul{ 353123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLstencil stencil[MAX_WIDTH]; 353223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 353323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul ASSERT(n <= MAX_WIDTH); 353423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 353523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset || 353623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul ctx->Pixel.MapStencilFlag) { 353723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul /* make a copy of input */ 353823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul MEMCPY(stencil, source, n * sizeof(GLstencil)); 353923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset) { 354023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_shift_and_offset_stencil( ctx, n, stencil ); 354123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 354223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (ctx->Pixel.MapStencilFlag) { 354323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_map_stencil( ctx, n, stencil ); 354423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 354523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul source = stencil; 354623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 354723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 354823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul switch (dstType) { 354923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_UNSIGNED_BYTE: 355023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (sizeof(GLstencil) == 8) { 355123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul MEMCPY( dest, source, n ); 355223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 355323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul else { 355423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLubyte *dst = (GLubyte *) dest; 355523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 355623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i=0;i<n;i++) { 355723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = (GLubyte) source[i]; 355823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 355923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 356023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 356123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_BYTE: 356223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (sizeof(GLstencil) == 8) { 356323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul MEMCPY( dest, source, n ); 356423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 356523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul else { 356623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLbyte *dst = (GLbyte *) dest; 356723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 356823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i=0;i<n;i++) { 356923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = (GLbyte) source[i]; 357023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 357123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 357223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 357323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_UNSIGNED_SHORT: 357423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 357523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLushort *dst = (GLushort *) dest; 357623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 357723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i=0;i<n;i++) { 357823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = (GLushort) source[i]; 357923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 358023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 358123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap2( (GLushort *) dst, n ); 358223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 358323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 358423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 358523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_SHORT: 358623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 358723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLshort *dst = (GLshort *) dest; 358823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 358923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i=0;i<n;i++) { 359023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = (GLshort) source[i]; 359123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 359223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 359323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap2( (GLushort *) dst, n ); 359423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 359523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 359623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 359723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_UNSIGNED_INT: 359823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 359923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint *dst = (GLuint *) dest; 360023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 360123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i=0;i<n;i++) { 360223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = (GLuint) source[i]; 360323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 360423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 360523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap4( (GLuint *) dst, n ); 360623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 360723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 360823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 360923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_INT: 361023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 361123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLint *dst = (GLint *) dest; 361223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 361323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i=0;i<n;i++) { 361423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul *dst++ = (GLint) source[i]; 361523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 361623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 361723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap4( (GLuint *) dst, n ); 361823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 361923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 362023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 362123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_FLOAT: 362223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 362323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLfloat *dst = (GLfloat *) dest; 362423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 362523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i=0;i<n;i++) { 362623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = (GLfloat) source[i]; 362723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 362823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 362923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap4( (GLuint *) dst, n ); 363023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 363123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 363223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 363323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_BITMAP: 363423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->LsbFirst) { 363523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLubyte *dst = (GLubyte *) dest; 363623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLint shift = 0; 363723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 363823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 363923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (shift == 0) 364023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul *dst = 0; 364123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul *dst |= ((source[i] != 0) << shift); 364223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul shift++; 364323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (shift == 8) { 364423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul shift = 0; 364523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst++; 364623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 364723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 364823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 364923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul else { 365023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLubyte *dst = (GLubyte *) dest; 365123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLint shift = 7; 365223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 365323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 365423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (shift == 7) 365523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul *dst = 0; 365623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul *dst |= ((source[i] != 0) << shift); 365723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul shift--; 365823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (shift < 0) { 365923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul shift = 7; 366023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst++; 366123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 366223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 366323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 366423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 366523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul default: 366608836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad type in _mesa_pack_index_span"); 366723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 366823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul} 366923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 367023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 3671fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3672fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid 3673e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul_mesa_unpack_depth_span( const GLcontext *ctx, GLuint n, GLfloat *dest, 3674fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLenum srcType, const GLvoid *source, 3675e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul const struct gl_pixelstore_attrib *srcPacking ) 3676fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{ 3677fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul switch (srcType) { 3678fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_BYTE: 3679fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3680fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3681fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLubyte *src = (const GLubyte *) source; 3682fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3683e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul dest[i] = BYTE_TO_FLOAT(src[i]); 3684fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3685fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3686fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3687fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_BYTE: 3688fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3689fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3690fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLubyte *src = (const GLubyte *) source; 3691fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3692e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul dest[i] = UBYTE_TO_FLOAT(src[i]); 3693fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3694fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3695fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3696fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_SHORT: 3697fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3698fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3699fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLshort *src = (const GLshort *) source; 3700fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3701e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul dest[i] = SHORT_TO_FLOAT(src[i]); 3702fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3703fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3704fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3705fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_SHORT: 3706fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3707fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3708fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLushort *src = (const GLushort *) source; 3709fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3710e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul dest[i] = USHORT_TO_FLOAT(src[i]); 3711fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3712fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3713fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3714fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_INT: 3715fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3716fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3717fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLint *src = (const GLint *) source; 3718fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3719e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul dest[i] = INT_TO_FLOAT(src[i]); 3720fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3721fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3722fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3723fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_INT: 3724fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3725fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3726fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLuint *src = (const GLuint *) source; 3727fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3728e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul dest[i] = UINT_TO_FLOAT(src[i]); 3729fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3730fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3731fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3732fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_FLOAT: 3733e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul MEMCPY(dest, source, n * sizeof(GLfloat)); 3734fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3735fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul default: 373608836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(NULL, "bad type in _mesa_unpack_depth_span()"); 3737fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return; 3738fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3739fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3740fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3741e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul /* apply depth scale and bias and clamp to [0,1] */ 3742fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) { 3743fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3744fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3745e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul GLfloat d = dest[i] * ctx->Pixel.DepthScale + ctx->Pixel.DepthBias; 3746e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul dest[i] = CLAMP(d, 0.0F, 1.0F); 3747fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3748fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3749fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 3750fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3751fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3752fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3753fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul/* 375423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul * Pack an array of depth values. The values are floats in [0,1]. 375523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul */ 375623e8d46e072669e0974d7b2c168d4770183106bdBrian Paulvoid 3757b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul_mesa_pack_depth_span( const GLcontext *ctx, GLuint n, GLvoid *dest, 375823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLenum dstType, const GLfloat *depthSpan, 375923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul const struct gl_pixelstore_attrib *dstPacking ) 376023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul{ 376123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLfloat depthCopy[MAX_WIDTH]; 376223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul const GLboolean bias_or_scale = ctx->Pixel.DepthBias != 0.0 || 376323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul ctx->Pixel.DepthScale != 1.0; 376423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 376523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul ASSERT(n <= MAX_WIDTH); 376623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 376723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (bias_or_scale) { 376823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 376923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 377023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLfloat d; 377123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul d = depthSpan[i] * ctx->Pixel.DepthScale + ctx->Pixel.DepthBias; 377223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul depthCopy[i] = CLAMP(d, 0.0F, 1.0F); 377323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 377423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul depthSpan = depthCopy; 377523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 377623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 377723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul switch (dstType) { 377823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_UNSIGNED_BYTE: 377923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 378023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLubyte *dst = (GLubyte *) dest; 378123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 378223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 378323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = FLOAT_TO_UBYTE( depthSpan[i] ); 378423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 378523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 378623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 378723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_BYTE: 378823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 378923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLbyte *dst = (GLbyte *) dest; 379023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 379123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 379223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = FLOAT_TO_BYTE( depthSpan[i] ); 379323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 379423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 379523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 379623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_UNSIGNED_SHORT: 379723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 379823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLushort *dst = (GLushort *) dest; 379923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 380023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 380123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = FLOAT_TO_USHORT( depthSpan[i] ); 380223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 380323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 380423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap2( (GLushort *) dst, n ); 380523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 380623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 380723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 380823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_SHORT: 380923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 381023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLshort *dst = (GLshort *) dest; 381123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 381223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 381323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = FLOAT_TO_SHORT( depthSpan[i] ); 381423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 381523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 381623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap2( (GLushort *) dst, n ); 381723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 381823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 381923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 382023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_UNSIGNED_INT: 382123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 382223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint *dst = (GLuint *) dest; 382323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 382423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 382523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = FLOAT_TO_UINT( depthSpan[i] ); 382623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 382723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 382823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap4( (GLuint *) dst, n ); 382923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 383023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 383123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 383223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_INT: 383323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 383423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLint *dst = (GLint *) dest; 383523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 383623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 383723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = FLOAT_TO_INT( depthSpan[i] ); 383823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 383923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 384023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap4( (GLuint *) dst, n ); 384123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 384223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 384323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 384423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_FLOAT: 384523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 384623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLfloat *dst = (GLfloat *) dest; 384723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 384823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 384923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = depthSpan[i]; 385023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 385123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 385223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap4( (GLuint *) dst, n ); 385323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 385423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 385523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 385623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul default: 385708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad type in _mesa_pack_depth_span"); 385823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 385923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul} 386023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 386123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 386223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 386323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 386423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul/* 3865c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack image data. Apply byteswapping, byte flipping (bitmap). 3866c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Return all image data in a contiguous block. 3867c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 3868c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid * 3869c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul_mesa_unpack_image( GLsizei width, GLsizei height, GLsizei depth, 3870c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum format, GLenum type, const GLvoid *pixels, 3871c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const struct gl_pixelstore_attrib *unpack ) 3872c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 3873c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint bytesPerRow, compsPerRow; 3874c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLboolean flipBytes, swap2, swap4; 3875c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3876c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (!pixels) 3877c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return NULL; /* not necessarily an error */ 3878c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3879c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (width <= 0 || height <= 0 || depth <= 0) 3880c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return NULL; /* generate error later */ 3881c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3882c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (format == GL_BITMAP) { 3883c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytesPerRow = (width + 7) >> 3; 3884c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul flipBytes = !unpack->LsbFirst; 3885c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul swap2 = swap4 = GL_FALSE; 3886c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul compsPerRow = 0; 3887c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3888c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 3889b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type); 3890b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const GLint components = _mesa_components_in_format(format); 3891c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint bytesPerComp; 3892c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (bytesPerPixel <= 0 || components <= 0) 3893c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return NULL; /* bad format or type. generate error later */ 3894c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytesPerRow = bytesPerPixel * width; 3895c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytesPerComp = bytesPerPixel / components; 3896c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul flipBytes = GL_FALSE; 3897c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul swap2 = (bytesPerComp == 2) && unpack->SwapBytes; 3898c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul swap4 = (bytesPerComp == 4) && unpack->SwapBytes; 3899c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul compsPerRow = components * width; 3900c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(compsPerRow >= width); 3901c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3902c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3903c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 3904b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul GLubyte *destBuffer = (GLubyte *) MALLOC(bytesPerRow * height * depth); 3905c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dst; 3906c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint img, row; 3907c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (!destBuffer) 3908c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return NULL; /* generate GL_OUT_OF_MEMORY later */ 3909c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3910c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst = destBuffer; 3911c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (img = 0; img < depth; img++) { 3912c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (row = 0; row < height; row++) { 3913b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const GLvoid *src = _mesa_image_address(unpack, pixels, 3914c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul width, height, format, type, img, row, 0); 3915c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul MEMCPY(dst, src, bytesPerRow); 3916c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* byte flipping/swapping */ 3917c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (flipBytes) { 3918b7d076fc96ac27117421653a043d00a95f789d24Brian Paul flip_bytes((GLubyte *) dst, bytesPerRow); 3919c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3920c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (swap2) { 3921b7d076fc96ac27117421653a043d00a95f789d24Brian Paul _mesa_swap2((GLushort*) dst, compsPerRow); 3922c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3923c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (swap4) { 3924b7d076fc96ac27117421653a043d00a95f789d24Brian Paul _mesa_swap4((GLuint*) dst, compsPerRow); 3925c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3926c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += bytesPerRow; 3927c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3928c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3929c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return destBuffer; 3930c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3931c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 3932