image.c revision b51b0a847d7e7daaea69f77ab569086ef81c24a2
1b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul/* $Id: image.c,v 1.58 2001/03/07 05:06:11 brianp Exp $ */ 2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 3afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 4afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Mesa 3-D graphics library 5fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * Version: 3.5 65e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul * Copyright (C) 1999-2001 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 */ 60fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GL_FALSE /* LsbFirst */ 61fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul}; 62fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 63fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 64fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 65fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul/* 66afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the 8 bits in each byte of the given array. 6764a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul * 6864a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul * XXX try this trick to flip bytes someday: 6964a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul * v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555); 7064a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul * v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333); 7164a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul * v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f); 72afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 73b7d076fc96ac27117421653a043d00a95f789d24Brian Paulstatic void 74b7d076fc96ac27117421653a043d00a95f789d24Brian Paulflip_bytes( GLubyte *p, GLuint n ) 75afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 76afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach register GLuint i, a, b; 77afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 78afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 7964a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul b = (GLuint) p[i]; /* words are often faster than bytes */ 80afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach a = ((b & 0x01) << 7) | 81afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x02) << 5) | 82afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x04) << 3) | 83afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x08) << 1) | 84afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x10) >> 1) | 85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x20) >> 3) | 86afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x40) >> 5) | 87afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x80) >> 7); 88afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach p[i] = (GLubyte) a; 89afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 90afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 91afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 92afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 93afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 94afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the order of the 2 bytes in each word in the given array. 95afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 96b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid 97b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_swap2( GLushort *p, GLuint n ) 98afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 99afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach register GLuint i; 100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach p[i] = (p[i] >> 8) | ((p[i] << 8) & 0xff00); 103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the order of the 4 bytes in each word in the given array. 110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 111b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid 112b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_swap4( GLuint *p, GLuint n ) 113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach register GLuint i, a, b; 115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach b = p[i]; 118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach a = (b >> 24) 119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | ((b >> 8) & 0xff00) 120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | ((b << 8) & 0xff0000) 121afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | ((b << 24) & 0xff000000); 122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach p[i] = a; 123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return the size, in bytes, of the given GL datatype. 131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return 0 if GL_BITMAP. 132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return -1 if invalid type enum. 133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 134b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_sizeof_type( GLenum type ) 135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BITMAP: 138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 0; 139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLbyte); 143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLushort); 145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLint); 151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLfloat); 153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 160b7d076fc96ac27117421653a043d00a95f789d24Brian Paul * Same as _mesa_sizeof_packed_type() but we also accept the 161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * packed pixel format datatypes. 162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 163b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_sizeof_packed_type( GLenum type ) 164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BITMAP: 167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 0; 168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLbyte); 172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLushort); 174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLint); 180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLfloat); 182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_3_3_2: 183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_2_3_3_REV: 185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5: 187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5_REV: 189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4: 191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4_REV: 193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_5_5_1: 195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_1_5_5_5_REV: 197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8: 199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8_REV: 201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_10_10_10_2: 203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_2_10_10_10_REV: 205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return the number of components in a GL enum pixel type. 215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return -1 if bad format. 216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 217b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_components_in_format( GLenum format ) 218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (format) { 220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX: 221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX1_EXT: 222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX2_EXT: 223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX4_EXT: 224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX8_EXT: 225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX12_EXT: 226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX16_EXT: 227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_STENCIL_INDEX: 228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_DEPTH_COMPONENT: 229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_GREEN: 231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BLUE: 232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ALPHA: 233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE: 234070b2644c6d3b0b4c6da64addd85245d730b6240Brian Paul case GL_INTENSITY: 235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 1; 236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE_ALPHA: 237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 2; 238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 3; 240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGBA: 241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 4; 242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGR: 243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 3; 244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGRA: 245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 4; 246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ABGR_EXT: 247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 4; 248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return bytes per pixel for given format and type 256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return -1 if bad format or type. 257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 258b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_bytes_per_pixel( GLenum format, GLenum type ) 259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 260b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GLint comps = _mesa_components_in_format( format ); 261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (comps < 0) 262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BITMAP: 266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 0; /* special case */ 267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return comps * sizeof(GLubyte); 270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return comps * sizeof(GLshort); 273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return comps * sizeof(GLint); 276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return comps * sizeof(GLfloat); 278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_3_3_2: 279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_2_3_3_REV: 280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB || format == GL_BGR) 281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else 283afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; /* error */ 284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5: 285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5_REV: 286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB || format == GL_BGR) 287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else 289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; /* error */ 290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4: 291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4_REV: 292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_5_5_1: 293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_1_5_5_5_REV: 294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT) 295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLushort); 296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else 297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8: 299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8_REV: 300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_10_10_10_2: 301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_2_10_10_10_REV: 302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT) 303afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else 305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Test if the given pixel format and type are legal. 314afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return GL_TRUE for legal, GL_FALSE for illegal. 315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 316b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLboolean 317b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_is_legal_format_and_type( GLenum format, GLenum type ) 318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (format) { 320afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX: 321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_STENCIL_INDEX: 322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BITMAP: 324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_TRUE; 332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 336afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_GREEN: 337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BLUE: 338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ALPHA: 3392a1f50aee4f30dbd0c55d8f0b7185b690c841051Brian Paul case GL_INTENSITY: 340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE: 341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE_ALPHA: 342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_DEPTH_COMPONENT: 343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_TRUE; 352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 3563d960a0d84be0ffdd491dd37ff80bedf4a44fe92Brian Paul case GL_BGR: 357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_3_3_2: 366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_2_3_3_REV: 367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5: 368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5_REV: 369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_TRUE; 370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGBA: 374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGRA: 375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ABGR_EXT: 376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4: 385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4_REV: 386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_5_5_1: 387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_1_5_5_5_REV: 388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8: 389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8_REV: 390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_10_10_10_2: 391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_2_10_10_10_REV: 392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_TRUE; 393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 394afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ; /* fall-through */ 398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return the address of a pixel in an image (actually a volume). 406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Pixel unpacking/packing parameters are observed according to 'packing'. 407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Input: image - start of image data 408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * width, height - size of image 409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * format - image format 410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * type - pixel component type 411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * packing - the pixelstore attributes 412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * img - which image in the volume (0 for 1D or 2D images) 413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * row, column - location of pixel in the image 414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return: address of pixel at (image,row,column) in image or NULL if error. 415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 416b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLvoid * 417b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_image_address( const struct gl_pixelstore_attrib *packing, 418b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const GLvoid *image, GLsizei width, 419b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GLsizei height, GLenum format, GLenum type, 420b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GLint img, GLint row, GLint column ) 421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint alignment; /* 1, 2 or 4 */ 423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint pixels_per_row; 424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint rows_per_image; 425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint skiprows; 426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint skippixels; 427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint skipimages; /* for 3-D volume images */ 428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte *pixel_addr; 429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach alignment = packing->Alignment; 431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->RowLength > 0) { 432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach pixels_per_row = packing->RowLength; 433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach pixels_per_row = width; 436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->ImageHeight > 0) { 438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach rows_per_image = packing->ImageHeight; 439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach rows_per_image = height; 442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach skiprows = packing->SkipRows; 444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach skippixels = packing->SkipPixels; 445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach skipimages = packing->SkipImages; 446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (type==GL_BITMAP) { 448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* BITMAP data */ 449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint comp_per_pixel; /* components per pixel */ 450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint bytes_per_comp; /* bytes per component */ 451afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint bytes_per_row; 452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint bytes_per_image; 453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* Compute bytes per component */ 455b7d076fc96ac27117421653a043d00a95f789d24Brian Paul bytes_per_comp = _mesa_sizeof_packed_type( type ); 456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (bytes_per_comp<0) { 457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return NULL; 458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* Compute number of components per pixel */ 461b7d076fc96ac27117421653a043d00a95f789d24Brian Paul comp_per_pixel = _mesa_components_in_format( format ); 462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (comp_per_pixel<0 && type != GL_BITMAP) { 463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return NULL; 464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_row = alignment 467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * CEILING( comp_per_pixel*pixels_per_row, 8*alignment ); 468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_image = bytes_per_row * rows_per_image; 470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach pixel_addr = (GLubyte *) image 472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skipimages + img) * bytes_per_image 473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skiprows + row) * bytes_per_row 474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skippixels + column) / 8; 475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* Non-BITMAP data */ 478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint bytes_per_pixel, bytes_per_row, remainder, bytes_per_image; 479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 480b7d076fc96ac27117421653a043d00a95f789d24Brian Paul bytes_per_pixel = _mesa_bytes_per_pixel( format, type ); 481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* The pixel type and format should have been error checked earlier */ 483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach assert(bytes_per_pixel > 0); 484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_row = pixels_per_row * bytes_per_pixel; 486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach remainder = bytes_per_row % alignment; 487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (remainder > 0) 488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_row += (alignment - remainder); 489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ASSERT(bytes_per_row % alignment == 0); 491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_image = bytes_per_row * rows_per_image; 493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* compute final pixel address */ 495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach pixel_addr = (GLubyte *) image 496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skipimages + img) * bytes_per_image 497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skiprows + row) * bytes_per_row 498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skippixels + column) * bytes_per_pixel; 499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return (GLvoid *) pixel_addr; 502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 507ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul * Compute the stride between image rows (in bytes) for the given 508ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul * pixel packing parameters and image width, format and type. 509ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul */ 510ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian PaulGLint 511ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul_mesa_image_row_stride( const struct gl_pixelstore_attrib *packing, 512ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul GLint width, GLenum format, GLenum type ) 513ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul{ 514ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul ASSERT(packing); 515ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul if (type == GL_BITMAP) { 516ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul /* BITMAP data */ 517ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul if (packing->RowLength == 0) { 518ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul GLint bytes = (width + 7) / 8; 519ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul return bytes; 520ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 521ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul else { 522ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul GLint bytes = (packing->RowLength + 7) / 8; 523ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul return bytes; 524ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 525ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 526ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul else { 527ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul /* Non-BITMAP data */ 528b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type); 529fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul GLint bytesPerRow, remainder; 530ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul if (bytesPerPixel <= 0) 531ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul return -1; /* error */ 532ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul if (packing->RowLength == 0) { 533fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul bytesPerRow = bytesPerPixel * width; 534ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 535ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul else { 536fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul bytesPerRow = bytesPerPixel * packing->RowLength; 537ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 538fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul remainder = bytesPerRow % packing->Alignment; 539fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul if (remainder > 0) 540fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul bytesPerRow += (packing->Alignment - remainder); 541fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul return bytesPerRow; 542ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 543ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul} 544ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul 545ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul 546ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul 547ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul/* 548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Unpack a 32x32 pixel polygon stipple from user memory using the 549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * current pixel unpack settings. 550afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 5517c652d77220610ecc19aaefa20876216b035e961Brian Paulvoid 5527c652d77220610ecc19aaefa20876216b035e961Brian Paul_mesa_unpack_polygon_stipple( const GLubyte *pattern, GLuint dest[32], 5537c652d77220610ecc19aaefa20876216b035e961Brian Paul const struct gl_pixelstore_attrib *unpacking ) 554afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 555959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul GLubyte *ptrn = (GLubyte *) _mesa_unpack_bitmap( 32, 32, pattern, unpacking ); 5567c652d77220610ecc19aaefa20876216b035e961Brian Paul if (ptrn) { 5577c652d77220610ecc19aaefa20876216b035e961Brian Paul /* Convert pattern from GLubytes to GLuints and handle big/little 5587c652d77220610ecc19aaefa20876216b035e961Brian Paul * endian differences 5597c652d77220610ecc19aaefa20876216b035e961Brian Paul */ 5607c652d77220610ecc19aaefa20876216b035e961Brian Paul GLubyte *p = ptrn; 5617c652d77220610ecc19aaefa20876216b035e961Brian Paul GLint i; 5627c652d77220610ecc19aaefa20876216b035e961Brian Paul for (i = 0; i < 32; i++) { 5637c652d77220610ecc19aaefa20876216b035e961Brian Paul dest[i] = (p[0] << 24) 5647c652d77220610ecc19aaefa20876216b035e961Brian Paul | (p[1] << 16) 5657c652d77220610ecc19aaefa20876216b035e961Brian Paul | (p[2] << 8) 5667c652d77220610ecc19aaefa20876216b035e961Brian Paul | (p[3] ); 5677c652d77220610ecc19aaefa20876216b035e961Brian Paul p += 4; 5687c652d77220610ecc19aaefa20876216b035e961Brian Paul } 5697c652d77220610ecc19aaefa20876216b035e961Brian Paul FREE(ptrn); 570afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 571afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 572afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 573afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 574fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 575afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 576fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Pack polygon stipple into user memory given current pixel packing 577fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * settings. 578afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 5797c652d77220610ecc19aaefa20876216b035e961Brian Paulvoid 5807c652d77220610ecc19aaefa20876216b035e961Brian Paul_mesa_pack_polygon_stipple( const GLuint pattern[32], GLubyte *dest, 5817c652d77220610ecc19aaefa20876216b035e961Brian Paul const struct gl_pixelstore_attrib *packing ) 582afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 5837c652d77220610ecc19aaefa20876216b035e961Brian Paul /* Convert pattern from GLuints to GLubytes to handle big/little 5847c652d77220610ecc19aaefa20876216b035e961Brian Paul * endian differences. 5857c652d77220610ecc19aaefa20876216b035e961Brian Paul */ 5867c652d77220610ecc19aaefa20876216b035e961Brian Paul GLubyte ptrn[32*4]; 587fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint i; 588fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < 32; i++) { 5897c652d77220610ecc19aaefa20876216b035e961Brian Paul ptrn[i * 4 + 0] = (GLubyte) ((pattern[i] >> 24) & 0xff); 5907c652d77220610ecc19aaefa20876216b035e961Brian Paul ptrn[i * 4 + 1] = (GLubyte) ((pattern[i] >> 16) & 0xff); 5917c652d77220610ecc19aaefa20876216b035e961Brian Paul ptrn[i * 4 + 2] = (GLubyte) ((pattern[i] >> 8 ) & 0xff); 5927c652d77220610ecc19aaefa20876216b035e961Brian Paul ptrn[i * 4 + 3] = (GLubyte) ((pattern[i] ) & 0xff); 593afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 5947c652d77220610ecc19aaefa20876216b035e961Brian Paul 5957c652d77220610ecc19aaefa20876216b035e961Brian Paul _mesa_pack_bitmap(32, 32, ptrn, dest, packing); 596afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 597afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 598afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 599699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul/* 600699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Unpack bitmap data. Resulting data will be in most-significant-bit-first 601699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * order with row alignment = 1 byte. 602699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul */ 603699bc7b73d2fede77d3290f66c1ec355afd0373eBrian PaulGLvoid * 604699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul_mesa_unpack_bitmap( GLint width, GLint height, const GLubyte *pixels, 605699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul const struct gl_pixelstore_attrib *packing ) 606699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul{ 607699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLint bytes, row, width_in_bytes; 608699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte *buffer, *dst; 609699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 610699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (!pixels) 611699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul return NULL; 612699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 613699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* Alloc dest storage */ 614699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul bytes = ((width + 7) / 8 * height); 615699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul buffer = (GLubyte *) MALLOC( bytes ); 616699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (!buffer) 617699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul return NULL; 618699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 619699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 620699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul width_in_bytes = CEILING( width, 8 ); 621699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dst = buffer; 622699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul for (row = 0; row < height; row++) { 623b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul const GLubyte *src = (const GLubyte *) 624b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul _mesa_image_address(packing, pixels, width, height, 625b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul GL_COLOR_INDEX, GL_BITMAP, 0, row, 0); 626699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (!src) { 627699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul FREE(buffer); 628699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul return NULL; 629699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 630699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 631699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (packing->SkipPixels == 0) { 632699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul MEMCPY( dst, src, width_in_bytes ); 633699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (packing->LsbFirst) { 634699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul flip_bytes( dst, width_in_bytes ); 635699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 636699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 637699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 638699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* handling SkipPixels is a bit tricky (no pun intended!) */ 639699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLint i; 640699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (packing->LsbFirst) { 641699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte srcMask = 1 << (packing->SkipPixels & 0x7); 642699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte dstMask = 128; 643b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul const GLubyte *s = src; 644699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte *d = dst; 645699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d = 0; 646699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul for (i = 0; i < width; i++) { 647699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (*s & srcMask) { 648699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d |= dstMask; 649699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 650699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (srcMask == 128) { 651699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul srcMask = 1; 652699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul s++; 653699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 654699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 655699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul srcMask = srcMask << 1; 656699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 657699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (dstMask == 1) { 658699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstMask = 128; 659699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul d++; 660699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d = 0; 661699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 662699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 663699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstMask = dstMask >> 1; 664699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 665699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 666699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 667699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 668699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7); 669699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte dstMask = 128; 670b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul const GLubyte *s = src; 671699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte *d = dst; 672699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d = 0; 673699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul for (i = 0; i < width; i++) { 674699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (*s & srcMask) { 675699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d |= dstMask; 676699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 677699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (srcMask == 1) { 678699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul srcMask = 128; 679699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul s++; 680699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 681699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 682699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul srcMask = srcMask >> 1; 683699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 684699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (dstMask == 1) { 685699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstMask = 128; 686699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul d++; 687699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d = 0; 688699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 689699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 690699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstMask = dstMask >> 1; 691699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 692699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 693699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 694699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 695699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dst += width_in_bytes; 696699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 697699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 698699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul return buffer; 699699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul} 700699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 701afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 702afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 703699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Pack bitmap data. 704afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 705b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid 706699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul_mesa_pack_bitmap( GLint width, GLint height, const GLubyte *source, 707699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte *dest, const struct gl_pixelstore_attrib *packing ) 708afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 709699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLint row, width_in_bytes; 710699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul const GLubyte *src; 711fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 712699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (!source) 713699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul return; 714699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 715699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul width_in_bytes = CEILING( width, 8 ); 716699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul src = source; 717699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul for (row = 0; row < height; row++) { 718b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul GLubyte *dst = (GLubyte *) _mesa_image_address( packing, dest, 719b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul width, height, GL_COLOR_INDEX, GL_BITMAP, 0, row, 0 ); 720699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (!dst) 721699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul return; 722699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 723699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (packing->SkipPixels == 0) { 724699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul MEMCPY( dst, src, width_in_bytes ); 725699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (packing->LsbFirst) { 726699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul flip_bytes( dst, width_in_bytes ); 727699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 7283428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul } 729699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 730699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* handling SkipPixels is a bit tricky (no pun intended!) */ 731699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLint i; 732699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (packing->LsbFirst) { 733699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte srcMask = 1 << (packing->SkipPixels & 0x7); 734699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte dstMask = 128; 735699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul const GLubyte *s = src; 736699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte *d = dst; 737699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d = 0; 738699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul for (i = 0; i < width; i++) { 739699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (*s & srcMask) { 740699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d |= dstMask; 741699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 742699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (srcMask == 128) { 743699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul srcMask = 1; 744699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul s++; 745699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 746699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 747699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul srcMask = srcMask << 1; 748699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 749699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (dstMask == 1) { 750699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstMask = 128; 751699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul d++; 752699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d = 0; 753699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 754699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 755699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstMask = dstMask >> 1; 756699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 757699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 758699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 759699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 760699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7); 761699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte dstMask = 128; 762699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul const GLubyte *s = src; 763699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte *d = dst; 764699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d = 0; 765699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul for (i = 0; i < width; i++) { 766699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (*s & srcMask) { 767699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d |= dstMask; 768699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 769699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (srcMask == 1) { 770699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul srcMask = 128; 771699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul s++; 772699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 773699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 774699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul srcMask = srcMask >> 1; 775699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 776699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (dstMask == 1) { 777699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstMask = 128; 778699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul d++; 779699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d = 0; 780699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 781699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 782699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstMask = dstMask >> 1; 783699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 784699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 785699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 786afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 787699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul src += width_in_bytes; 788116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 789116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul} 790afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 791116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul 792699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 793116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paulvoid 794116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul_mesa_pack_float_rgba_span( GLcontext *ctx, 795116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul GLuint n, CONST GLfloat rgbaIn[][4], 796b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLenum dstFormat, GLenum dstType, 797b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLvoid *dstAddr, 798b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul const struct gl_pixelstore_attrib *dstPacking, 799116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul GLuint transferOps ) 800116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul{ 801b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul const GLint comps = _mesa_components_in_format(dstFormat); 802116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul GLfloat luminance[MAX_WIDTH]; 803116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul GLfloat (*rgba)[4]; 804116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul GLuint i; 805116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul 806116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul if (transferOps) { 807116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* make copy of incoming data */ 808116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul GLfloat rgbaCopy[MAX_WIDTH][4]; 809116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i = 0; i < n; i++) { 810116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul rgbaCopy[i][0] = rgbaIn[i][0]; 811116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul rgbaCopy[i][1] = rgbaIn[i][1]; 812116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul rgbaCopy[i][2] = rgbaIn[i][2]; 813116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul rgbaCopy[i][3] = rgbaIn[i][3]; 814afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 815afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 816116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul rgba = (GLfloat (*)[4]) rgbaCopy; 817ef9025a641624991113b7df2eecdf7c8e330a31cBrian Paul 818116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* scale & bias */ 819116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul if (transferOps & IMAGE_SCALE_BIAS_BIT) { 82045015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul _mesa_scale_and_bias_rgba(ctx, n, rgba, 82145015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.RedScale, ctx->Pixel.GreenScale, 82245015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.BlueScale, ctx->Pixel.AlphaScale, 82345015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.RedBias, ctx->Pixel.GreenBias, 82445015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.BlueBias, ctx->Pixel.AlphaBias); 825116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 826116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* color map lookup */ 827116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul if (transferOps & IMAGE_MAP_COLOR_BIT) { 828116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_map_rgba( ctx, n, rgba ); 829116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 830116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* GL_COLOR_TABLE lookup */ 831116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul if (transferOps & IMAGE_COLOR_TABLE_BIT) { 832116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_lookup_rgba(&ctx->ColorTable, n, rgba); 833116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 834116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* convolution */ 835116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul if (transferOps & IMAGE_CONVOLUTION_BIT) { 836116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* this has to be done in the calling code */ 837116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 83845015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */ 83945015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul if (transferOps & IMAGE_POST_CONVOLUTION_SCALE_BIAS) { 84045015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul _mesa_scale_and_bias_rgba(ctx, n, rgba, 84145015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionScale[RCOMP], 84245015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionScale[GCOMP], 84345015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionScale[BCOMP], 84445015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionScale[ACOMP], 84545015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionBias[RCOMP], 84645015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionBias[GCOMP], 84745015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionBias[BCOMP], 84845015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionBias[ACOMP]); 84945015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul } 850116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */ 851116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul if (transferOps & IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT) { 852116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_lookup_rgba(&ctx->PostConvolutionColorTable, n, rgba); 853116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 854116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* color matrix transform */ 855116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul if (transferOps & IMAGE_COLOR_MATRIX_BIT) { 856116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_transform_rgba(ctx, n, rgba); 857116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 858116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */ 859116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul if (transferOps & IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT) { 860116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_lookup_rgba(&ctx->PostColorMatrixColorTable, n, rgba); 861116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 862116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* update histogram count */ 863116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul if (transferOps & IMAGE_HISTOGRAM_BIT) { 864116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba); 865116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 866116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* min/max here */ 867116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul if (transferOps & IMAGE_MIN_MAX_BIT) { 868116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba); 869116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul if (ctx->MinMax.Sink) 870116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul return; 871116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 872116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 873116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul else { 874116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* use incoming data, not a copy */ 875116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul rgba = (GLfloat (*)[4]) rgbaIn; 876116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 877ef9025a641624991113b7df2eecdf7c8e330a31cBrian Paul 878116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* XXX clamp rgba to [0,1]? */ 879116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul 880116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul 881b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_LUMINANCE || dstFormat == GL_LUMINANCE_ALPHA) { 882116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i = 0; i < n; i++) { 883116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul GLfloat sum = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP]; 884116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul luminance[i] = CLAMP(sum, 0.0F, 1.0F); 885afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 886116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 887afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 888116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* 889116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul * Pack/store the pixels. Ugh! Lots of cases!!! 890116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul */ 891b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstType) { 892116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_BYTE: 893116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul { 894b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLubyte *dst = (GLubyte *) dstAddr; 895b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstFormat) { 896116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RED: 897116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 898116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 899116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 900116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_GREEN: 901116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 902116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 903116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 904116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BLUE: 905116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 906116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 907116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 908116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ALPHA: 909116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 910116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 911116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 912116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE: 913116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 914116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UBYTE(luminance[i]); 915116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 916116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE_ALPHA: 917116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 918116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+0] = FLOAT_TO_UBYTE(luminance[i]); 919116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 920116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 921116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 922116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGB: 923116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 924116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 925116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 926116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 927116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 928116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 929116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGBA: 930116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 931116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 932116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 933116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 934116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 935116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 936116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 937116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGR: 938116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 939116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 940116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 941116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 942116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 943116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 944116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGRA: 945116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 946116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 947116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 948116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 949116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 950116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 951116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 952116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ABGR_EXT: 953116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 954116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 955116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 956116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 957116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 958116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 959116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 960116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 96108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 962116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 963116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 964116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 965116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BYTE: 966116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul { 967b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLbyte *dst = (GLbyte *) dstAddr; 968b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstFormat) { 969116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RED: 970116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 971116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 972116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 973116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_GREEN: 974116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 975116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 976116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 977116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BLUE: 978116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 979116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 980116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 981116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ALPHA: 982116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 983116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 984116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 985116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE: 986116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 987116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_BYTE(luminance[i]); 988116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 989116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE_ALPHA: 990116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 991116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+0] = FLOAT_TO_BYTE(luminance[i]); 992116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 993116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 994116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 995116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGB: 996116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 997116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 998116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 999116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1000116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1001116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1002116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGBA: 1003116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1004116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1005116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1006116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1007116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 1008116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1009116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1010116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGR: 1011116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1012116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1013116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1014116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1015116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1016116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1017116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGRA: 1018116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1019116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1020116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1021116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1022116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 1023116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1024116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ABGR_EXT: 1025116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1026116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 1027116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1028116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1029116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_BYTE(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_UNSIGNED_SHORT: 1038116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul { 1039b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLushort *dst = (GLushort *) dstAddr; 1040b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstFormat) { 1041116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RED: 1042116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1043116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_USHORT(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_USHORT(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_USHORT(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_USHORT(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_USHORT(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_USHORT(luminance[i]); 1064116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+1] = FLOAT_TO_USHORT(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_USHORT(rgba[i][RCOMP]); 1070116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1071116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_USHORT(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_USHORT(rgba[i][RCOMP]); 1077116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1078116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 1079116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_USHORT(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_USHORT(rgba[i][BCOMP]); 1085116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1086116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_USHORT(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_USHORT(rgba[i][BCOMP]); 1092116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1093116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 1094116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][ACOMP]); 1095116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1096116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1097116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ABGR_EXT: 1098116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1099116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][ACOMP]); 1100116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 1101116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1102116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 1103116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1104116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1105116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 110608836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1107116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1108b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstPacking->SwapBytes) { 1109116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_swap2( (GLushort *) dst, n * comps); 1110116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1111116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1112116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1113116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_SHORT: 1114116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul { 1115b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLshort *dst = (GLshort *) dstAddr; 1116b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstFormat) { 1117116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RED: 1118116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1119116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1120116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1121116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_GREEN: 1122116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1123116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1124116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1125116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BLUE: 1126116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1127116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1128116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1129116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ALPHA: 1130116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1131116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1132116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1133116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE: 1134116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1135116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_SHORT(luminance[i]); 1136116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1137116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE_ALPHA: 1138116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1139116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+0] = FLOAT_TO_SHORT(luminance[i]); 1140116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1141116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1142116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1143116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGB: 1144116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1145116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1146116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1147116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1148116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1149116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1150116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGBA: 1151116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1152116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1153116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1154116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1155116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1156116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1157116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1158116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGR: 1159116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1160116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1161116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1162116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1163116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1164116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1165116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGRA: 1166116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1167116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1168116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1169116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1170116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1171116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1172116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ABGR_EXT: 1173116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1174116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1175116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1176116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1177116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1178116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1179116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1180116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 118108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1183b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstPacking->SwapBytes) { 1184116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_swap2( (GLushort *) dst, n * comps ); 1185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1186116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1187116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1188116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_INT: 1189116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul { 1190b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1191b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstFormat) { 1192116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RED: 1193116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1194116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1195116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1196116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_GREEN: 1197116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1198116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1199116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1200116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BLUE: 1201116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1202116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1203116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1204116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ALPHA: 1205116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1206116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1207116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1208116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE: 1209116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1210116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UINT(luminance[i]); 1211116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1212116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE_ALPHA: 1213116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1214116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+0] = FLOAT_TO_UINT(luminance[i]); 1215116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+1] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1216116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1217116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1218116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGB: 1219116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1220116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1221116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1222116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1223116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1224116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1225116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGBA: 1226116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1227116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1228116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1229116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1230116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1231116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1232116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1233116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGR: 1234116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1235116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1236116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1237116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1238116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1239116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1240116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGRA: 1241116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1242116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1243116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1244116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1245116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1246116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1247116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1248116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ABGR_EXT: 1249116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1250116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1251116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1252116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1253116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1254116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1255116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1256116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 125708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1259b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstPacking->SwapBytes) { 1260116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_swap4( (GLuint *) dst, n * comps ); 1261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1262116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1263116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1264116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_INT: 1265116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul { 1266b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLint *dst = (GLint *) dstAddr; 1267b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstFormat) { 1268116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RED: 1269116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1270116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_INT(rgba[i][RCOMP]); 1271116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1272116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_GREEN: 1273116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1274116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_INT(rgba[i][GCOMP]); 1275116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1276116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BLUE: 1277116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1278116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_INT(rgba[i][BCOMP]); 1279116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1280116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ALPHA: 1281116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1282116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_INT(rgba[i][ACOMP]); 1283116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1284116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE: 1285116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1286116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_INT(luminance[i]); 1287116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1288116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE_ALPHA: 1289116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1290116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+0] = FLOAT_TO_INT(luminance[i]); 1291116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+1] = FLOAT_TO_INT(rgba[i][ACOMP]); 1292116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1293116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1294116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGB: 1295116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1296116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_INT(rgba[i][RCOMP]); 1297116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 1298116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_INT(rgba[i][BCOMP]); 1299116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1300116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1301116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGBA: 1302116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1303116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_INT(rgba[i][RCOMP]); 1304116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 1305116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_INT(rgba[i][BCOMP]); 1306116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]); 1307116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1308116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1309116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGR: 1310116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1311116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_INT(rgba[i][BCOMP]); 1312116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 1313116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_INT(rgba[i][RCOMP]); 1314116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1315116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1316116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGRA: 1317116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1318116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_INT(rgba[i][BCOMP]); 1319116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 1320116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_INT(rgba[i][RCOMP]); 1321116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]); 1322116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1323116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1324116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ABGR_EXT: 1325116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1326116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_INT(rgba[i][ACOMP]); 1327116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_INT(rgba[i][BCOMP]); 1328116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_INT(rgba[i][GCOMP]); 1329116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_INT(rgba[i][RCOMP]); 1330116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1331116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1332116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 133308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1335b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstPacking->SwapBytes) { 1336116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_swap4( (GLuint *) dst, n * comps ); 1337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1338116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1339116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1340116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_FLOAT: 1341116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul { 1342b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLfloat *dst = (GLfloat *) dstAddr; 1343b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstFormat) { 1344116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RED: 1345116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1346116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = rgba[i][RCOMP]; 1347116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1348116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_GREEN: 1349116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1350116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = rgba[i][GCOMP]; 1351116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1352116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BLUE: 1353116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1354116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = rgba[i][BCOMP]; 1355116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1356116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ALPHA: 1357116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1358116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = rgba[i][ACOMP]; 1359116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1360116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE: 1361116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1362116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = luminance[i]; 1363116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1364116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE_ALPHA: 1365116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1366116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+0] = luminance[i]; 1367116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+1] = rgba[i][ACOMP]; 1368116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1369116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1370116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGB: 1371116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1372116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = rgba[i][RCOMP]; 1373116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = rgba[i][GCOMP]; 1374116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = rgba[i][BCOMP]; 1375116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1376116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1377116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGBA: 1378116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1379116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = rgba[i][RCOMP]; 1380116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = rgba[i][GCOMP]; 1381116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = rgba[i][BCOMP]; 1382116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = rgba[i][ACOMP]; 1383116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1384116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1385116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGR: 1386116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1387116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = rgba[i][BCOMP]; 1388116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = rgba[i][GCOMP]; 1389116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = rgba[i][RCOMP]; 1390116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1391116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1392116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGRA: 1393116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1394116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = rgba[i][BCOMP]; 1395116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = rgba[i][GCOMP]; 1396116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = rgba[i][RCOMP]; 1397116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = rgba[i][ACOMP]; 1398116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1399116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1400116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ABGR_EXT: 1401116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1402116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = rgba[i][ACOMP]; 1403116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = rgba[i][BCOMP]; 1404116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = rgba[i][GCOMP]; 1405116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = rgba[i][RCOMP]; 1406116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1407116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1408116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 140908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1411b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstPacking->SwapBytes) { 1412116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_swap4( (GLuint *) dst, n * comps ); 1413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1414116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1415116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1416116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_BYTE_3_3_2: 1417b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGB) { 1418b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLubyte *dst = (GLubyte *) dstAddr; 1419116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1420116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 7.0F)) << 5) 1421116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 7.0F)) << 2) 1422116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 3.0F)) ); 1423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1424116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1425116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1426116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_BYTE_2_3_3_REV: 1427b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGB) { 1428b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLubyte *dst = (GLubyte *) dstAddr; 1429116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1430116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 7.0F)) ) 1431116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 7.0F)) << 3) 1432116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 3.0F)) << 5); 1433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1434116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1435116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1436116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_SHORT_5_6_5: 1437b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGB) { 1438b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLushort *dst = (GLushort *) dstAddr; 1439116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1440116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) << 11) 1441116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 63.0F)) << 5) 1442116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 31.0F)) ); 1443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1444116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1445116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1446116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_SHORT_5_6_5_REV: 1447b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGB) { 1448b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLushort *dst = (GLushort *) dstAddr; 1449116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1450116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) ) 1451116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 63.0F)) << 5) 1452116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 11); 1453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1454116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1455116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1456116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_SHORT_4_4_4_4: 1457881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul if (dstFormat == GL_RGBA) { 1458b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLushort *dst = (GLushort *) dstAddr; 1459116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1460116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 15.0F)) << 12) 1461116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 8) 1462116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 15.0F)) << 4) 1463116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][ACOMP] * 15.0F)) ); 1464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1465116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1466881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_BGRA) { 1467881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1468881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1469881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][BCOMP] * 15.0F)) << 12) 1470881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 8) 1471881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 15.0F)) << 4) 1472881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][ACOMP] * 15.0F)) ); 1473881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1474881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1475881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1476881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1477881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1478881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][ACOMP] * 15.0F)) << 4) 1479881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][BCOMP] * 15.0F)) << 8) 1480881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 12) 1481881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 15.0F)) ); 1482881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1483881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1484116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1485116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_SHORT_4_4_4_4_REV: 1486881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul if (dstFormat == GL_RGBA) { 1487b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLushort *dst = (GLushort *) dstAddr; 1488116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1489116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 15.0F)) ) 1490116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 4) 1491116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 15.0F)) << 8) 1492116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][ACOMP] * 15.0F)) << 12); 1493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1494116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1495881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_BGRA) { 1496881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1497881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1498881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][BCOMP] * 15.0F)) ) 1499881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 4) 1500881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 15.0F)) << 8) 1501881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][ACOMP] * 15.0F)) << 12); 1502881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1503881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1504881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1505881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1506881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1507881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][ACOMP] * 15.0F)) ) 1508881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][BCOMP] * 15.0F)) << 4) 1509881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 8) 1510881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 15.0F)) << 12); 1511881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1512881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1513116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1514116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_SHORT_5_5_5_1: 1515881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul if (dstFormat == GL_RGBA) { 1516b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLushort *dst = (GLushort *) dstAddr; 1517116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1518116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) << 11) 1519116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 6) 1520116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 1) 1521116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][ACOMP] * 1.0F)) ); 1522afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1523116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1524881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_BGRA) { 1525881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1526881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1527881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][BCOMP] * 31.0F)) << 11) 1528881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 6) 1529881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 31.0F)) << 1) 1530881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][ACOMP] * 1.0F)) ); 1531881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1532881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1533881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1534881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1535881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1536881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][ACOMP] * 31.0F)) << 11) 1537881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 6) 1538881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 1) 1539881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 1.0F)) ); 1540881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1541881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1542116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1543116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_SHORT_1_5_5_5_REV: 1544881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul if (dstFormat == GL_RGBA) { 1545b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLushort *dst = (GLushort *) dstAddr; 1546116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1547116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) ) 1548116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 5) 1549116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 10) 1550116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][ACOMP] * 1.0F)) << 15); 1551afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1552116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1553881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_BGRA) { 1554881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1555881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1556881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][BCOMP] * 31.0F)) ) 1557881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 5) 1558881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 31.0F)) << 10) 1559881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][ACOMP] * 1.0F)) << 15); 1560881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1561881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1562881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1563881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1564881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1565881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][ACOMP] * 31.0F)) ) 1566881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 5) 1567881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 10) 1568881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 1.0F)) << 15); 1569881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1570881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1571116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1572116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_INT_8_8_8_8: 1573b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGBA) { 1574b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1575116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1576116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 24) 1577116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16) 1578116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 8) 1579116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 255.0F)) ); 1580afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1581116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1582b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_BGRA) { 1583b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1584116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1585116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 24) 1586116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16) 1587116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 8) 1588116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 255.0F)) ); 1589afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1590116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1591b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1592b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1593116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1594116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24) 1595116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 16) 1596116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 8) 1597116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 255.0F)) ); 1598afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1599116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1600116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1601116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_INT_8_8_8_8_REV: 1602b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGBA) { 1603b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1604116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1605116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][RCOMP] * 255.0F)) ) 1606116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 8) 1607116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 16) 1608116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24); 1609afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1610116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1611b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_BGRA) { 1612b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1613116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1614116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][BCOMP] * 255.0F)) ) 1615116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 8) 1616116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 16) 1617116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24); 1618afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1619116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1620b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1621b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1622116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1623116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][ACOMP] * 255.0F)) ) 1624116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 8) 1625116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16) 1626116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 24); 1627afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1628116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1629116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1630116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_INT_10_10_10_2: 1631b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGBA) { 1632b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1633116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1634116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 22) 1635116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 12) 1636116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 2) 1637116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 3.0F)) ); 1638afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1639116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1640b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_BGRA) { 1641b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1642116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1643116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 22) 1644116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 12) 1645116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 2) 1646116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 3.0F)) ); 1647afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1648116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1649b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1650b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1651116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1652116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][ACOMP] * 1023.0F)) << 22) 1653116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 12) 1654116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 2) 1655116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 3.0F)) ); 1656116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1657116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1658116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1659116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_INT_2_10_10_10_REV: 1660b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGBA) { 1661b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1662116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1663116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][RCOMP] * 1023.0F)) ) 1664116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 10) 1665116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 20) 1666116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 3.0F)) << 30); 1667116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1668116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1669b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_BGRA) { 1670b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1671116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1672116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][BCOMP] * 1023.0F)) ) 1673116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 10) 1674116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 20) 1675116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 3.0F)) << 30); 1676116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1677116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1678b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1679b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1680116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1681116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][ACOMP] * 1023.0F)) ) 1682116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 10) 1683116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 20) 1684116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 3.0F)) << 30); 1685116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1686116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1687116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1688116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 168908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad type in _mesa_pack_float_rgba_span"); 1690afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1691afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 1692c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1693c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1694179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul 1695699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul/* 1696699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Pack the given RGBA span into client memory at 'dest' address 1697699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * in the given pixel format and type. 1698699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Optionally apply the enabled pixel transfer ops. 1699699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Pack into memory using the given packing params struct. 1700699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * This is used by glReadPixels and glGetTexImage?D() 1701699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Input: ctx - the context 1702699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * n - number of pixels in the span 1703699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * rgba - the pixels 1704699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * format - dest packing format 1705699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * type - dest packing datatype 1706699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * destination - destination packing address 1707699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * packing - pixel packing parameters 1708699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * transferOps - bitmask of IMAGE_*_BIT operations to apply 1709699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul */ 1710699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paulvoid 1711699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul_mesa_pack_rgba_span( GLcontext *ctx, 1712699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLuint n, CONST GLchan srcRgba[][4], 1713699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLenum dstFormat, GLenum dstType, 1714699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLvoid *dstAddr, 1715699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul const struct gl_pixelstore_attrib *dstPacking, 1716699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLuint transferOps) 1717699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul{ 17189499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul ASSERT((ctx->NewState & _NEW_PIXEL) == 0); 1719699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 1720699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* Test for optimized case first */ 1721699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (transferOps == 0 && dstFormat == GL_RGBA && dstType == CHAN_TYPE) { 1722699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* common simple case */ 1723699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul MEMCPY(dstAddr, srcRgba, n * 4 * sizeof(GLchan)); 1724699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 1725699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else if (transferOps == 0 && dstFormat == GL_RGB && dstType == CHAN_TYPE) { 1726699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* common simple case */ 1727b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul GLuint i; 1728699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dest = (GLchan *) dstAddr; 1729699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul for (i = 0; i < n; i++) { 1730699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dest[0] = srcRgba[i][RCOMP]; 1731699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dest[1] = srcRgba[i][GCOMP]; 1732699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dest[2] = srcRgba[i][BCOMP]; 1733699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dest += 3; 1734699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 1735699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 1736699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 1737699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* general solution */ 1738699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLfloat rgba[MAX_WIDTH][4]; 1739699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLuint i; 1740699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul assert(n <= MAX_WIDTH); 1741699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* convert color components to floating point */ 1742699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul for (i=0;i<n;i++) { 1743699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul rgba[i][RCOMP] = CHAN_TO_FLOAT(srcRgba[i][RCOMP]); 1744699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul rgba[i][GCOMP] = CHAN_TO_FLOAT(srcRgba[i][GCOMP]); 1745699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul rgba[i][BCOMP] = CHAN_TO_FLOAT(srcRgba[i][BCOMP]); 1746699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul rgba[i][ACOMP] = CHAN_TO_FLOAT(srcRgba[i][ACOMP]); 1747699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 1748699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul _mesa_pack_float_rgba_span(ctx, n, (const GLfloat (*)[4]) rgba, 1749699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstFormat, dstType, dstAddr, 1750699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstPacking, transferOps); 1751699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 1752699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul} 1753699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 1754699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 1755c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define SWAP2BYTE(VALUE) \ 1756c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { \ 1757c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *bytes = (GLubyte *) &(VALUE); \ 1758c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte tmp = bytes[0]; \ 1759c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[0] = bytes[1]; \ 1760c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[1] = tmp; \ 1761c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1762c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1763c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define SWAP4BYTE(VALUE) \ 1764c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { \ 1765c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *bytes = (GLubyte *) &(VALUE); \ 1766c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte tmp = bytes[0]; \ 1767c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[0] = bytes[3]; \ 1768c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[3] = tmp; \ 1769c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul tmp = bytes[1]; \ 1770c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[1] = bytes[2]; \ 1771c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[2] = tmp; \ 1772c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1773c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1774c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1775c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic void 1776c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulextract_uint_indexes(GLuint n, GLuint indexes[], 1777c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum srcFormat, GLenum srcType, const GLvoid *src, 1778c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const struct gl_pixelstore_attrib *unpack ) 1779c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 1780c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(srcFormat == GL_COLOR_INDEX); 1781c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1782c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcType == GL_BITMAP || 1783c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_BYTE || 1784c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_BYTE || 1785c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT || 1786c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_SHORT || 1787c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT || 1788c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_INT || 1789c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_FLOAT); 1790c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1791c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul switch (srcType) { 1792c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BITMAP: 1793c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1794c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *ubsrc = (GLubyte *) src; 1795c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->LsbFirst) { 1796c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte mask = 1 << (unpack->SkipPixels & 0x7); 1797c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1798c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 1799c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = (*ubsrc & mask) ? 1 : 0; 1800c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (mask == 128) { 1801c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul mask = 1; 1802c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ubsrc++; 1803c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1804c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1805c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul mask = mask << 1; 1806c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1807c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1808c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1809c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1810c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte mask = 128 >> (unpack->SkipPixels & 0x7); 1811c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1812c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 1813c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = (*ubsrc & mask) ? 1 : 0; 1814c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (mask == 1) { 1815c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul mask = 128; 1816c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ubsrc++; 1817c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1818c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1819c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul mask = mask >> 1; 1820c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1821c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1822c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1823c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1824c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1825c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_BYTE: 1826c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1827c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1828c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLubyte *s = (const GLubyte *) src; 1829c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 1830c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 1831c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1832c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1833c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BYTE: 1834c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1835c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1836c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLbyte *s = (const GLbyte *) src; 1837c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 1838c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 1839c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1840c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1841c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT: 1842c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1843c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1844c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *s = (const GLushort *) src; 1845c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->SwapBytes) { 1846c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 1847c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort value = s[i]; 1848c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(value); 1849c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = value; 1850c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1851c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1852c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1853c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 1854c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 1855c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1856c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1857c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1858c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_SHORT: 1859c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1860c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1861c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLshort *s = (const GLshort *) src; 1862c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->SwapBytes) { 1863c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 1864c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLshort value = s[i]; 1865c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(value); 1866c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = value; 1867c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1868c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1869c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1870c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 1871c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 1872c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1873c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1874c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1875c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT: 1876c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1877c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1878c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *s = (const GLuint *) src; 1879c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->SwapBytes) { 1880c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 1881c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint value = s[i]; 1882c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(value); 1883c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = value; 1884c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1885c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1886c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1887c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 1888c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 1889c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1890c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1891c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1892c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_INT: 1893c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1894c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1895c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLint *s = (const GLint *) src; 1896c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->SwapBytes) { 1897c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 1898c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint value = s[i]; 1899c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(value); 1900c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = value; 1901c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1902c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1903c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1904c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 1905c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 1906c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1907c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1908c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1909c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_FLOAT: 1910c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1911c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1912c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLfloat *s = (const GLfloat *) src; 1913c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->SwapBytes) { 1914c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 1915c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLfloat value = s[i]; 1916c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(value); 1917959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul indexes[i] = (GLuint) value; 1918c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1919c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1920c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1921c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 1922959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul indexes[i] = (GLuint) s[i]; 1923c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1924c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1925c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1926c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul default: 192708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(NULL, "bad srcType in extract_uint_indexes"); 1928c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 1929c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1930c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 1931c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1932c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1933c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1934c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/* 1935c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This function extracts floating point RGBA values from arbitrary 1936c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * image data. srcFormat and srcType are the format and type parameters 1937c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc. 1938c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * 1939c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function 1940c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * implements the "Conversion to floating point", "Conversion to RGB", 1941c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * and "Final Expansion to RGBA" operations. 1942c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * 1943c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Args: n - number of pixels 1944c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * rgba - output colors 1945c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * srcFormat - format of incoming data 1946c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * srcType - datatype of incoming data 1947c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * src - source data pointer 1948c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * swapBytes - perform byteswapping of incoming data? 1949c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 1950c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic void 1951c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulextract_float_rgba(GLuint n, GLfloat rgba[][4], 1952c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum srcFormat, GLenum srcType, const GLvoid *src, 1953c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLboolean swapBytes) 1954c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 1955c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint redIndex, greenIndex, blueIndex, alphaIndex; 1956c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint stride; 1957c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint rComp, bComp, gComp, aComp; 1958c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1959c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcFormat == GL_RED || 1960c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_GREEN || 1961c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BLUE || 1962c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_ALPHA || 1963c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_LUMINANCE || 1964c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_LUMINANCE_ALPHA || 1965c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_INTENSITY || 1966c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_RGB || 1967c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BGR || 1968c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_RGBA || 1969c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BGRA || 1970c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_ABGR_EXT); 1971c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1972c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcType == GL_UNSIGNED_BYTE || 1973c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_BYTE || 1974c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT || 1975c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_SHORT || 1976c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT || 1977c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_INT || 1978c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_FLOAT || 1979c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_BYTE_3_3_2 || 1980a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 1981a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_5_6_5 || 1982a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 1983c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 1984a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 1985c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 1986a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 1987c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT_8_8_8_8 || 1988a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 1989a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_10_10_10_2 || 1990a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_2_10_10_10_REV); 1991c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1992a0020435f58baef6a67d3c073b62ea6b1d143af1Brian Paul rComp = gComp = bComp = aComp = -1; 1993a0020435f58baef6a67d3c073b62ea6b1d143af1Brian Paul 1994c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul switch (srcFormat) { 1995c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_RED: 1996c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 0; 1997c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = blueIndex = alphaIndex = -1; 1998c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 1999c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2000c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_GREEN: 2001c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 0; 2002c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = blueIndex = alphaIndex = -1; 2003c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 2004c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2005c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BLUE: 2006c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 0; 2007c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = greenIndex = alphaIndex = -1; 2008c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 2009c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2010c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_ALPHA: 2011c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = greenIndex = blueIndex = -1; 2012c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = 0; 2013c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 2014c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 20155e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen case GL_LUMINANCE: 2016c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = greenIndex = blueIndex = 0; 2017c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = -1; 2018c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 2019c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2020c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_LUMINANCE_ALPHA: 2021c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = greenIndex = blueIndex = 0; 2022c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = 1; 2023c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 2; 2024c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2025c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_INTENSITY: 2026c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 0; 2027c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = blueIndex = alphaIndex = -1; 2028c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 2029c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2030c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_RGB: 2031c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 0; 2032c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 1; 2033c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 2; 2034c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = -1; 2035c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 3; 2036c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2037c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BGR: 2038c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 2; 2039c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 1; 2040c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 0; 2041c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = -1; 2042c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 3; 2043c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2044c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_RGBA: 2045c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 0; 2046c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 1; 2047c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 2; 2048c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = 3; 2049c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rComp = 0; 2050c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gComp = 1; 2051c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bComp = 2; 2052c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul aComp = 3; 2053c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 4; 2054c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2055c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BGRA: 2056c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 2; 2057c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 1; 2058c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 0; 2059c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = 3; 2060c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rComp = 2; 2061c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gComp = 1; 2062c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bComp = 0; 2063c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul aComp = 3; 2064c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 4; 2065c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2066c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_ABGR_EXT: 2067c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 3; 2068c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 2; 2069c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 1; 2070c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = 0; 2071c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rComp = 3; 2072c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gComp = 2; 2073c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bComp = 1; 2074c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul aComp = 0; 2075c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 4; 2076c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2077c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul default: 207808836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(NULL, "bad srcFormat in extract float data"); 2079c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 2080c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2081c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2082c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2083c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define PROCESS(INDEX, CHANNEL, DEFAULT, TYPE, CONVERSION) \ 2084c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if ((INDEX) < 0) { \ 2085c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; \ 2086c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { \ 2087c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][CHANNEL] = DEFAULT; \ 2088c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 2089c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 2090c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (swapBytes) { \ 2091c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const TYPE *s = (const TYPE *) src; \ 2092c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; \ 2093c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { \ 2094c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul TYPE value = s[INDEX]; \ 2095c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (sizeof(TYPE) == 2) { \ 2096c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(value); \ 2097c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 2098c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (sizeof(TYPE) == 4) { \ 2099c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(value); \ 2100c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 2101c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][CHANNEL] = (GLfloat) CONVERSION(value); \ 2102c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul s += stride; \ 2103c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 2104c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 2105c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { \ 2106c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const TYPE *s = (const TYPE *) src; \ 2107c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; \ 2108c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { \ 2109c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][CHANNEL] = (GLfloat) CONVERSION(s[INDEX]); \ 2110c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul s += stride; \ 2111c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 2112c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2113c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2114c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul switch (srcType) { 2115c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_BYTE: 2116c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT); 2117c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT); 2118c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT); 2119c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLubyte, UBYTE_TO_FLOAT); 2120c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2121c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BYTE: 2122c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT); 2123c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT); 2124c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT); 2125c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLbyte, BYTE_TO_FLOAT); 2126c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2127c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT: 2128c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLushort, USHORT_TO_FLOAT); 2129c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLushort, USHORT_TO_FLOAT); 2130c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLushort, USHORT_TO_FLOAT); 2131c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLushort, USHORT_TO_FLOAT); 2132c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2133c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_SHORT: 2134c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLshort, SHORT_TO_FLOAT); 2135c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLshort, SHORT_TO_FLOAT); 2136c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLshort, SHORT_TO_FLOAT); 2137c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLshort, SHORT_TO_FLOAT); 2138c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2139c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT: 2140c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLuint, UINT_TO_FLOAT); 2141c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLuint, UINT_TO_FLOAT); 2142c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLuint, UINT_TO_FLOAT); 2143c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLuint, UINT_TO_FLOAT); 2144c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2145c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_INT: 2146c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLint, INT_TO_FLOAT); 2147c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLint, INT_TO_FLOAT); 2148c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLint, INT_TO_FLOAT); 2149c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLint, INT_TO_FLOAT); 2150c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2151c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_FLOAT: 2152c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLfloat, (GLfloat)); 2153c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLfloat, (GLfloat)); 2154c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLfloat, (GLfloat)); 2155c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLfloat, (GLfloat)); 2156c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2157c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_BYTE_3_3_2: 2158c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2159c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLubyte *ubsrc = (const GLubyte *) src; 2160c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2161c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2162c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte p = ubsrc[i]; 2163c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p >> 5) ) * (1.0F / 7.0F); 2164c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 2) & 0x7) * (1.0F / 7.0F); 2165c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p ) & 0x3) * (1.0F / 3.0F); 2166c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 2167c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2168c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2169c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2170c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_BYTE_2_3_3_REV: 2171c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2172c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLubyte *ubsrc = (const GLubyte *) src; 2173c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2174c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2175c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte p = ubsrc[i]; 2176c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p ) & 0x7) * (1.0F / 7.0F); 2177c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 3) & 0x7) * (1.0F / 7.0F); 2178c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p >> 6) ) * (1.0F / 3.0F); 2179c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 2180c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2181c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2182c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2183c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_5_6_5: 2184c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2185c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2186c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2187c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2188c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2189c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 2190c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p >> 11) ) * (1.0F / 31.0F); 2191c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 5) & 0x3f) * (1.0F / 63.0F); 2192c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p ) & 0x1f) * (1.0F / 31.0F); 2193c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 2194c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2195c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2196c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2197c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2198c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2199c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2200c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2201c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p >> 11) ) * (1.0F / 31.0F); 2202c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 5) & 0x3f) * (1.0F / 63.0F); 2203c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p ) & 0x1f) * (1.0F / 31.0F); 2204c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 2205c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2206c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2207c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2208c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_5_6_5_REV: 2209c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2210c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2211c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2212c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2213c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2214c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 2215c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p ) & 0x1f) * (1.0F / 31.0F); 2216c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 5) & 0x3f) * (1.0F / 63.0F); 2217c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p >> 11) ) * (1.0F / 31.0F); 2218c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 2219c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2220c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2221c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2222c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2223c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2224c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2225c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2226c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p ) & 0x1f) * (1.0F / 31.0F); 2227c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 5) & 0x3f) * (1.0F / 63.0F); 2228c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p >> 11) ) * (1.0F / 31.0F); 2229c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 2230c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2231c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2232c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2233c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_4_4_4_4: 2234c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2235c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2236c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2237c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2238c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2239c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 2240c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p >> 12) ) * (1.0F / 15.0F); 2241c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F); 2242c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F); 2243c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p ) & 0xf) * (1.0F / 15.0F); 2244c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2245c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2246c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2247c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2248c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2249c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2250c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2251c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p >> 12) ) * (1.0F / 15.0F); 2252c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F); 2253c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F); 2254c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p ) & 0xf) * (1.0F / 15.0F); 2255c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2256c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2257c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2258c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_4_4_4_4_REV: 2259c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2260c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2261c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2262c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2263c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2264c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 2265c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0xf) * (1.0F / 15.0F); 2266c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F); 2267c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F); 2268c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 12) ) * (1.0F / 15.0F); 2269c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2270c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2271c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2272c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2273c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2274c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2275c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2276c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0xf) * (1.0F / 15.0F); 2277c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F); 2278c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F); 2279c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 12) ) * (1.0F / 15.0F); 2280c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2281c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2282c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2283c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_5_5_5_1: 2284c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2285c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2286c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2287c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2288c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2289c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 2290c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p >> 11) ) * (1.0F / 31.0F); 2291c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 6) & 0x1f) * (1.0F / 31.0F); 2292c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 1) & 0x1f) * (1.0F / 31.0F); 2293c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p ) & 0x1) * (1.0F / 1.0F); 2294c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2295c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2296c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2297c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2298c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2299c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2300c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2301c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p >> 11) ) * (1.0F / 31.0F); 2302c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 6) & 0x1f) * (1.0F / 31.0F); 2303c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 1) & 0x1f) * (1.0F / 31.0F); 2304c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p ) & 0x1) * (1.0F / 1.0F); 2305c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2306c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2307c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2308c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_1_5_5_5_REV: 2309c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2310c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2311c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2312c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2313c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2314c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 2315c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0x1f) * (1.0F / 31.0F); 2316c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 5) & 0x1f) * (1.0F / 31.0F); 2317c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F); 2318c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 15) ) * (1.0F / 1.0F); 2319c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2320c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2321c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2322c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2323c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2324c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2325c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2326c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0x1f) * (1.0F / 31.0F); 2327c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 5) & 0x1f) * (1.0F / 31.0F); 2328c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F); 2329c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 15) ) * (1.0F / 1.0F); 2330c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2331c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2332c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2333c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT_8_8_8_8: 2334c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2335c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2336c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2337c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2338c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 23393041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][rComp] = UBYTE_TO_FLOAT((p ) & 0xff); 23403041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 23413041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 23423041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][aComp] = UBYTE_TO_FLOAT((p >> 24) ); 2343c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2344c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2345c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2346c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2347c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2348c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2349c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 23503041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][rComp] = UBYTE_TO_FLOAT((p >> 24) ); 23513041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 23523041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 23533041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][aComp] = UBYTE_TO_FLOAT((p ) & 0xff); 2354c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2355c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2356c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2357c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT_8_8_8_8_REV: 2358c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2359c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2360c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2361c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2362c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 23633041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][rComp] = UBYTE_TO_FLOAT((p >> 24) ); 23643041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 23653041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 23663041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][aComp] = UBYTE_TO_FLOAT((p ) & 0xff); 2367c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2368c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2369c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2370c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2371c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2372c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2373c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 23743041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][rComp] = UBYTE_TO_FLOAT((p ) & 0xff); 23753041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 23763041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 23773041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][aComp] = UBYTE_TO_FLOAT((p >> 24) ); 2378c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2379c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2380c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2381c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT_10_10_10_2: 2382c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2383c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2384c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2385c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2386c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 2387c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(p); 2388a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][rComp] = ((p >> 22) ) * (1.0F / 1023.0F); 2389a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F); 2390a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][bComp] = ((p >> 2) & 0x3ff) * (1.0F / 1023.0F); 2391a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][aComp] = ((p ) & 0x3 ) * (1.0F / 3.0F); 2392c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2393c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2394c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2395c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2396c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2397c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2398c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 2399a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][rComp] = ((p >> 22) ) * (1.0F / 1023.0F); 2400a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F); 2401a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][bComp] = ((p >> 2) & 0x3ff) * (1.0F / 1023.0F); 2402a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][aComp] = ((p ) & 0x3 ) * (1.0F / 3.0F); 2403c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2404c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2405c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2406c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT_2_10_10_10_REV: 2407c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2408c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2409c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2410c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2411c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 2412c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(p); 2413c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0x3ff) * (1.0F / 1023.0F); 2414c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F); 2415c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F); 2416c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 30) ) * (1.0F / 3.0F); 2417c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2418c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2419c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2420c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2421c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2422c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2423c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 2424c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0x3ff) * (1.0F / 1023.0F); 2425c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F); 2426c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F); 2427c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 30) ) * (1.0F / 3.0F); 2428c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2429c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2430c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2431c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul default: 243208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(NULL, "bad srcType in extract float data"); 2433c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2434c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2435c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 2436c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2437c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2438c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2439c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/* 2440c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack a row of color image data from a client buffer according to 2441fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * the pixel unpacking parameters. 2442c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Return GLubyte values in the specified dest image format. 2443c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This is (or will be) used by glDrawPixels and glTexImage?D(). 2444c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Input: ctx - the context 2445c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * n - number of pixels in the span 2446c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * dstFormat - format of destination color array 2447c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * dest - the destination color array 2448c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * srcFormat - source image format 2449c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * srcType - source image datatype 2450c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * source - source image pointer 2451b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul * srcPacking - pixel unpacking parameters 2452fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * transferOps - bitmask of IMAGE_*_BIT values of operations to apply 2453c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * 2454c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * XXX perhaps expand this to process whole images someday. 2455c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 2456c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid 2457699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul_mesa_unpack_chan_color_span( GLcontext *ctx, 2458699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLuint n, GLenum dstFormat, GLchan dest[], 2459699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLenum srcFormat, GLenum srcType, 2460699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul const GLvoid *source, 2461699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul const struct gl_pixelstore_attrib *srcPacking, 2462699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLuint transferOps ) 2463c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 2464c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(dstFormat == GL_ALPHA || 24655e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen dstFormat == GL_LUMINANCE || 2466c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_LUMINANCE_ALPHA || 2467c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_INTENSITY || 2468c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_RGB || 2469c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_RGBA || 2470c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_COLOR_INDEX); 2471c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2472c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcFormat == GL_RED || 2473c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_GREEN || 2474c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BLUE || 2475c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_ALPHA || 2476c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_LUMINANCE || 2477c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_LUMINANCE_ALPHA || 2478c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_INTENSITY || 2479c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_RGB || 2480c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BGR || 2481c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_RGBA || 2482c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BGRA || 2483c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_ABGR_EXT || 2484c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_COLOR_INDEX); 2485c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2486c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcType == GL_BITMAP || 2487c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_BYTE || 2488c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_BYTE || 2489c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT || 2490c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_SHORT || 2491c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT || 2492c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_INT || 2493c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_FLOAT || 2494c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_BYTE_3_3_2 || 2495a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 2496a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_5_6_5 || 2497a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 2498c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 2499a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 2500c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 2501a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 2502c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT_8_8_8_8 || 2503a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 2504a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_10_10_10_2 || 2505a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_2_10_10_10_REV); 2506c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2507c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Try simple cases first */ 2508699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (transferOps == 0 && srcType == CHAN_TYPE) { 2509c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstFormat == GL_RGBA) { 2510c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (srcFormat == GL_RGBA) { 2511699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul MEMCPY( dest, source, n * 4 * sizeof(GLchan) ); 2512c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 2513c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2514c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (srcFormat == GL_RGB) { 2515c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2516699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul const GLchan *src = (const GLchan *) source; 2517699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dst = dest; 2518c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2519c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[0] = src[0]; 2520c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[1] = src[1]; 2521c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[2] = src[2]; 2522699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dst[3] = CHAN_MAX; 2523c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul src += 3; 2524c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += 4; 2525c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2526c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 2527c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2528c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2529c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (dstFormat == GL_RGB) { 2530c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (srcFormat == GL_RGB) { 2531699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul MEMCPY( dest, source, n * 3 * sizeof(GLchan) ); 2532c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 2533c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2534c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (srcFormat == GL_RGBA) { 2535c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2536699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul const GLchan *src = (const GLchan *) source; 2537699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dst = dest; 2538c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2539c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[0] = src[0]; 2540c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[1] = src[1]; 2541c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[2] = src[2]; 2542c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul src += 4; 2543c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += 3; 2544c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2545c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 2546c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2547c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2548b09a4cd913e2de612fddf5411185a257da35647cBrian Paul else if (dstFormat == srcFormat) { 2549b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GLint comps = _mesa_components_in_format(srcFormat); 2550b09a4cd913e2de612fddf5411185a257da35647cBrian Paul assert(comps > 0); 2551699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul MEMCPY( dest, source, n * comps * sizeof(GLchan) ); 2552c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 2553c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2554c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2555c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2556c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2557179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul /* general solution begins here */ 2558c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2559c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLfloat rgba[MAX_WIDTH][4]; 2560c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint dstComponents; 2561c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint dstRedIndex, dstGreenIndex, dstBlueIndex, dstAlphaIndex; 2562c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint dstLuminanceIndex, dstIntensityIndex; 2563c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2564b7d076fc96ac27117421653a043d00a95f789d24Brian Paul dstComponents = _mesa_components_in_format( dstFormat ); 2565c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* source & dest image formats should have been error checked by now */ 2566c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(dstComponents > 0); 2567c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2568c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* 2569c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Extract image data and convert to RGBA floats 2570c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 2571c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(n <= MAX_WIDTH); 2572c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (srcFormat == GL_COLOR_INDEX) { 2573c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint indexes[MAX_WIDTH]; 2574c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul extract_uint_indexes(n, indexes, srcFormat, srcType, source, 2575b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul srcPacking); 2576c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2577fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul if (dstFormat == GL_COLOR_INDEX 2578fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul && (transferOps & IMAGE_MAP_COLOR_BIT)) { 2579fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul _mesa_map_ci(ctx, n, indexes); 2580fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul } 2581fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 2582fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul _mesa_shift_and_offset_ci(ctx, n, indexes); 2583c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2584c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2585c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstFormat == GL_COLOR_INDEX) { 2586699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* convert to GLchan and return */ 2587c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 2588c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 2589699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dest[i] = (GLchan) (indexes[i] & 0xff); 2590c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2591c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul return; 2592c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2593c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2594c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Convert indexes to RGBA */ 2595179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul _mesa_map_ci_to_rgba(ctx, n, indexes, rgba); 2596c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2597c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2598c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2599c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul extract_float_rgba(n, rgba, srcFormat, srcType, source, 2600b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul srcPacking->SwapBytes); 2601c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2602fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* scale and bias colors */ 2603fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_SCALE_BIAS_BIT) { 260445015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul _mesa_scale_and_bias_rgba(ctx, n, rgba, 260545015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.RedScale, ctx->Pixel.GreenScale, 260645015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.BlueScale, ctx->Pixel.AlphaScale, 260745015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.RedBias, ctx->Pixel.GreenBias, 260845015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.BlueBias, ctx->Pixel.AlphaBias); 2609fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul } 2610fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* color map lookup */ 2611fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_MAP_COLOR_BIT) { 2612fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul _mesa_map_rgba(ctx, n, rgba); 2613c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2614c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2615c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2616fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps) { 2617c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* GL_COLOR_TABLE lookup */ 2618fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_COLOR_TABLE_BIT) { 2619c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_lookup_rgba(&ctx->ColorTable, n, rgba); 2620c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2621fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* convolution */ 2622fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_CONVOLUTION_BIT) { 2623ef9025a641624991113b7df2eecdf7c8e330a31cBrian Paul /* this has to be done in the calling code */ 2624fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul } 262545015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */ 262645015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul if (transferOps & IMAGE_POST_CONVOLUTION_SCALE_BIAS) { 262745015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul _mesa_scale_and_bias_rgba(ctx, n, rgba, 262845015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionScale[RCOMP], 262945015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionScale[GCOMP], 263045015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionScale[BCOMP], 263145015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionScale[ACOMP], 263245015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionBias[RCOMP], 263345015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionBias[GCOMP], 263445015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionBias[BCOMP], 263545015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionBias[ACOMP]); 263645015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul } 2637c29714dccb664562958cf36cdedee9c4377585d2Brian Paul /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */ 2638fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT) { 2639c29714dccb664562958cf36cdedee9c4377585d2Brian Paul _mesa_lookup_rgba(&ctx->PostConvolutionColorTable, n, rgba); 2640c29714dccb664562958cf36cdedee9c4377585d2Brian Paul } 2641c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* color matrix transform */ 2642fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_COLOR_MATRIX_BIT) { 2643c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_transform_rgba(ctx, n, rgba); 2644c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2645c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */ 2646fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT) { 2647c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_lookup_rgba(&ctx->PostColorMatrixColorTable, n, rgba); 2648c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 26491a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul /* update histogram count */ 2650fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_HISTOGRAM_BIT) { 26511a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul _mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba); 26521a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul } 2653fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* min/max here */ 2654fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_MIN_MAX_BIT) { 26551a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul _mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba); 2656c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2657c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2658c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2659c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* clamp to [0,1] */ 2660c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2661c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2662c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2663c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F); 2664c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F); 2665c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F); 2666c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F); 2667c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2668c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2669c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2670c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Now determine which color channels we need to produce. 2671c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * And determine the dest index (offset) within each color tuple. 2672c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 2673c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul switch (dstFormat) { 2674c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_ALPHA: 2675c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstAlphaIndex = 0; 2676c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = -1; 2677c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstLuminanceIndex = dstIntensityIndex = -1; 2678c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 26795e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen case GL_LUMINANCE: 2680c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstLuminanceIndex = 0; 2681c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1; 2682c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstIntensityIndex = -1; 2683c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2684c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_LUMINANCE_ALPHA: 2685c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstLuminanceIndex = 0; 2686c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstAlphaIndex = 1; 2687c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = -1; 2688c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstIntensityIndex = -1; 2689c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2690c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_INTENSITY: 2691c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstIntensityIndex = 0; 2692c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1; 2693c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstLuminanceIndex = -1; 2694c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2695c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_RGB: 2696c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = 0; 2697c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstGreenIndex = 1; 2698c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstBlueIndex = 2; 2699c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1; 2700c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2701c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_RGBA: 2702c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = 0; 2703c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstGreenIndex = 1; 2704c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstBlueIndex = 2; 2705c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstAlphaIndex = 3; 2706c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstLuminanceIndex = dstIntensityIndex = -1; 2707c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2708c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul default: 270908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad dstFormat in _mesa_unpack_chan_span()"); 2710276988ec96a48d4ee5c28c0a2da3aa2b5ee0bbeaBrian Paul return; 2711c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2712c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2713c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2714699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* Now return the GLchan data in the requested dstFormat */ 2715fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2716c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstRedIndex >= 0) { 2717699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dst = dest; 2718c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2719c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 27206532db986883ea1a431c043126de4947465834a1Brian Paul CLAMPED_FLOAT_TO_CHAN(dst[dstRedIndex], rgba[i][RCOMP]); 2721c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += dstComponents; 2722c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2723c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2724c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2725c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstGreenIndex >= 0) { 2726699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dst = dest; 2727c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2728c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 27296532db986883ea1a431c043126de4947465834a1Brian Paul CLAMPED_FLOAT_TO_CHAN(dst[dstGreenIndex], rgba[i][GCOMP]); 2730c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += dstComponents; 2731c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2732c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2733c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2734c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstBlueIndex >= 0) { 2735699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dst = dest; 2736c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2737c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 27386532db986883ea1a431c043126de4947465834a1Brian Paul CLAMPED_FLOAT_TO_CHAN(dst[dstBlueIndex], rgba[i][BCOMP]); 2739c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += dstComponents; 2740c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2741c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2742c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2743c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstAlphaIndex >= 0) { 2744699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dst = dest; 2745c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2746c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 27476532db986883ea1a431c043126de4947465834a1Brian Paul CLAMPED_FLOAT_TO_CHAN(dst[dstAlphaIndex], rgba[i][ACOMP]); 2748c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += dstComponents; 2749c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2750c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2751c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2752c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstIntensityIndex >= 0) { 2753699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dst = dest; 2754c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2755c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(dstIntensityIndex == 0); 2756c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(dstComponents == 1); 2757c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2758c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Intensity comes from red channel */ 27596532db986883ea1a431c043126de4947465834a1Brian Paul CLAMPED_FLOAT_TO_CHAN(dst[i], rgba[i][RCOMP]); 2760c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2761c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2762c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2763c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstLuminanceIndex >= 0) { 2764699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dst = dest; 2765c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2766c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(dstLuminanceIndex == 0); 2767c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2768c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Luminance comes from red channel */ 27696532db986883ea1a431c043126de4947465834a1Brian Paul CLAMPED_FLOAT_TO_CHAN(dst[0], rgba[i][RCOMP]); 2770c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += dstComponents; 2771c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2772c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2773c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2774c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 2775c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2776c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2777c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paulvoid 2778c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul_mesa_unpack_float_color_span( GLcontext *ctx, 2779c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint n, GLenum dstFormat, GLfloat dest[], 2780c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLenum srcFormat, GLenum srcType, 2781c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul const GLvoid *source, 2782b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul const struct gl_pixelstore_attrib *srcPacking, 2783fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul GLuint transferOps, GLboolean clamp ) 2784c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul{ 2785c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul ASSERT(dstFormat == GL_ALPHA || 27865e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen dstFormat == GL_LUMINANCE || 2787c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstFormat == GL_LUMINANCE_ALPHA || 2788c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstFormat == GL_INTENSITY || 2789c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstFormat == GL_RGB || 2790c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstFormat == GL_RGBA || 2791c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstFormat == GL_COLOR_INDEX); 2792c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2793c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul ASSERT(srcFormat == GL_RED || 2794c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_GREEN || 2795c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_BLUE || 2796c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_ALPHA || 2797c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_LUMINANCE || 2798c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_LUMINANCE_ALPHA || 2799c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_INTENSITY || 2800c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_RGB || 2801c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_BGR || 2802c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_RGBA || 2803c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_BGRA || 2804c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_ABGR_EXT || 2805c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_COLOR_INDEX); 2806c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2807c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul ASSERT(srcType == GL_BITMAP || 2808c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_BYTE || 2809c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_BYTE || 2810c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT || 2811c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_SHORT || 2812c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_INT || 2813c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_INT || 2814c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_FLOAT || 2815c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_BYTE_3_3_2 || 2816c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 2817c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT_5_6_5 || 2818c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 2819c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 2820c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 2821c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 2822c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 2823c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_INT_8_8_8_8 || 2824c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 2825c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_INT_10_10_10_2 || 2826c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_INT_2_10_10_10_REV); 2827c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2828c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* general solution, no special cases, yet */ 2829c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul { 2830c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat rgba[MAX_WIDTH][4]; 2831c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLint dstComponents; 2832c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLint dstRedIndex, dstGreenIndex, dstBlueIndex, dstAlphaIndex; 2833c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLint dstLuminanceIndex, dstIntensityIndex; 2834c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2835c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstComponents = _mesa_components_in_format( dstFormat ); 2836c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* source & dest image formats should have been error checked by now */ 2837c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul assert(dstComponents > 0); 2838c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2839c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* 2840c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul * Extract image data and convert to RGBA floats 2841c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul */ 2842c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul assert(n <= MAX_WIDTH); 2843c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (srcFormat == GL_COLOR_INDEX) { 2844c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint indexes[MAX_WIDTH]; 2845c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul extract_uint_indexes(n, indexes, srcFormat, srcType, source, 2846b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul srcPacking); 2847c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2848fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul if (dstFormat == GL_COLOR_INDEX 2849fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul && (transferOps & IMAGE_MAP_COLOR_BIT)) { 2850fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul _mesa_map_ci(ctx, n, indexes); 2851fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul } 2852fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 2853fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul _mesa_shift_and_offset_ci(ctx, n, indexes); 2854c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2855c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2856c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstFormat == GL_COLOR_INDEX) { 2857699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* convert to GLchan and return */ 2858c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 2859c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 2860699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dest[i] = (GLchan) (indexes[i] & 0xff); 2861c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2862c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul return; 2863c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2864c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul else { 2865c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* Convert indexes to RGBA */ 2866c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_map_ci_to_rgba(ctx, n, indexes, rgba); 2867c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2868c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2869c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul else { 2870c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul extract_float_rgba(n, rgba, srcFormat, srcType, source, 2871b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul srcPacking->SwapBytes); 2872c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2873fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* scale and bias colors */ 2874fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_SCALE_BIAS_BIT) { 287545015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul _mesa_scale_and_bias_rgba(ctx, n, rgba, 287645015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.RedScale, ctx->Pixel.GreenScale, 287745015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.BlueScale, ctx->Pixel.AlphaScale, 287845015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.RedBias, ctx->Pixel.GreenBias, 287945015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.BlueBias, ctx->Pixel.AlphaBias); 2880fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul } 2881fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* color map lookup */ 2882fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_MAP_COLOR_BIT) { 2883fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul _mesa_map_rgba(ctx, n, rgba); 2884c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2885c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2886c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2887fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps) { 2888c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* GL_COLOR_TABLE lookup */ 2889fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_COLOR_TABLE_BIT) { 2890c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_lookup_rgba(&ctx->ColorTable, n, rgba); 2891c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2892fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* convolution */ 2893fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_CONVOLUTION_BIT) { 2894fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* XXX to do */ 2895fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul } 289645015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */ 289745015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul if (transferOps & IMAGE_POST_CONVOLUTION_SCALE_BIAS) { 289845015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul _mesa_scale_and_bias_rgba(ctx, n, rgba, 289945015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionScale[RCOMP], 290045015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionScale[GCOMP], 290145015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionScale[BCOMP], 290245015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionScale[ACOMP], 290345015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionBias[RCOMP], 290445015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionBias[GCOMP], 290545015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionBias[BCOMP], 290645015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionBias[ACOMP]); 290745015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul } 2908c29714dccb664562958cf36cdedee9c4377585d2Brian Paul /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */ 2909fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT) { 2910c29714dccb664562958cf36cdedee9c4377585d2Brian Paul _mesa_lookup_rgba(&ctx->PostConvolutionColorTable, n, rgba); 2911c29714dccb664562958cf36cdedee9c4377585d2Brian Paul } 2912c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* color matrix transform */ 2913fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_COLOR_MATRIX_BIT) { 2914c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_transform_rgba(ctx, n, rgba); 2915c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2916c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */ 2917fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT) { 2918c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_lookup_rgba(&ctx->PostColorMatrixColorTable, n, rgba); 2919c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 29201a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul /* update histogram count */ 2921fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_HISTOGRAM_BIT) { 29221a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul _mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba); 29231a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul } 2924fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* min/max here */ 2925fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_MIN_MAX_BIT) { 29261a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul _mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba); 2927c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2928c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2929c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2930c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* clamp to [0,1] */ 29317a39d2f833807f8defd2304b0ff180944c23ea0cBrian Paul if (clamp) { 2932c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 2933c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 2934c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F); 2935c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F); 2936c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F); 2937c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F); 2938c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2939c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2940c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2941c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* Now determine which color channels we need to produce. 2942c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul * And determine the dest index (offset) within each color tuple. 2943c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul */ 2944c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul switch (dstFormat) { 2945c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul case GL_ALPHA: 2946c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstAlphaIndex = 0; 2947c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = -1; 2948c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstLuminanceIndex = dstIntensityIndex = -1; 2949c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul break; 29505e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen case GL_LUMINANCE: 2951c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstLuminanceIndex = 0; 2952c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1; 2953c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstIntensityIndex = -1; 2954c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul break; 2955c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul case GL_LUMINANCE_ALPHA: 2956c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstLuminanceIndex = 0; 2957c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstAlphaIndex = 1; 2958c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = -1; 2959c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstIntensityIndex = -1; 2960c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul break; 2961c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul case GL_INTENSITY: 2962c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstIntensityIndex = 0; 2963c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1; 2964c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstLuminanceIndex = -1; 2965c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul break; 2966c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul case GL_RGB: 2967c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstRedIndex = 0; 2968c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstGreenIndex = 1; 2969c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstBlueIndex = 2; 2970c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1; 2971c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul break; 2972c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul case GL_RGBA: 2973c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstRedIndex = 0; 2974c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstGreenIndex = 1; 2975c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstBlueIndex = 2; 2976c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstAlphaIndex = 3; 2977c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstLuminanceIndex = dstIntensityIndex = -1; 2978c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul break; 2979c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul default: 298008836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad dstFormat in _mesa_unpack_float_color_span()"); 2981c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul return; 2982c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2983c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2984fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* Now pack results in the requested dstFormat */ 2985c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstRedIndex >= 0) { 2986c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat *dst = dest; 2987c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 2988c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 2989c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst[dstRedIndex] = rgba[i][RCOMP]; 2990c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst += dstComponents; 2991c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2992c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2993c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2994c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstGreenIndex >= 0) { 2995c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat *dst = dest; 2996c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 2997c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 2998c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst[dstGreenIndex] = rgba[i][GCOMP]; 2999c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst += dstComponents; 3000c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3001c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3002c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3003c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstBlueIndex >= 0) { 3004c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat *dst = dest; 3005c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 3006c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 3007c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst[dstBlueIndex] = rgba[i][BCOMP]; 3008c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst += dstComponents; 3009c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3010c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3011c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3012c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstAlphaIndex >= 0) { 3013c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat *dst = dest; 3014c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 3015c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 3016c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst[dstAlphaIndex] = rgba[i][ACOMP]; 3017c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst += dstComponents; 3018c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3019c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3020c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3021c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstIntensityIndex >= 0) { 3022c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat *dst = dest; 3023c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 3024c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul assert(dstIntensityIndex == 0); 3025c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul assert(dstComponents == 1); 3026c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 3027c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* Intensity comes from red channel */ 3028c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst[i] = rgba[i][RCOMP]; 3029c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3030c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3031c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3032c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstLuminanceIndex >= 0) { 3033c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat *dst = dest; 3034c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 3035c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul assert(dstLuminanceIndex == 0); 3036c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 3037c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* Luminance comes from red channel */ 3038c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst[0] = rgba[i][RCOMP]; 3039c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst += dstComponents; 3040c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3041c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3042c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3043c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul} 3044c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3045c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3046c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3047c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3048c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/* 3049c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack a row of color index data from a client buffer according to 3050fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * the pixel unpacking parameters. 3051c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc. 3052c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * 3053c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Args: ctx - the context 3054c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * n - number of pixels 3055c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * dstType - destination datatype 3056c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * dest - destination array 3057c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * srcType - source pixel type 3058c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * source - source data pointer 3059b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul * srcPacking - pixel unpacking parameters 3060fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * transferOps - the pixel transfer operations to apply 3061c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 3062c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid 3063c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul_mesa_unpack_index_span( const GLcontext *ctx, GLuint n, 3064c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum dstType, GLvoid *dest, 3065c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum srcType, const GLvoid *source, 3066b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul const struct gl_pixelstore_attrib *srcPacking, 3067fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul GLuint transferOps ) 3068c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 3069c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcType == GL_BITMAP || 3070c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_BYTE || 3071c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_BYTE || 3072c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT || 3073c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_SHORT || 3074c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT || 3075c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_INT || 3076c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_FLOAT); 3077c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3078c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(dstType == GL_UNSIGNED_BYTE || 3079c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstType == GL_UNSIGNED_SHORT || 3080c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstType == GL_UNSIGNED_INT); 3081c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3082fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul 3083fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT); 3084c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3085c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* 3086c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Try simple cases first 3087c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 3088fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps == 0 && srcType == GL_UNSIGNED_BYTE 3089c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul && dstType == GL_UNSIGNED_BYTE) { 3090c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul MEMCPY(dest, source, n * sizeof(GLubyte)); 3091c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3092fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul else if (transferOps == 0 && srcType == GL_UNSIGNED_INT 3093b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul && dstType == GL_UNSIGNED_INT && !srcPacking->SwapBytes) { 3094c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul MEMCPY(dest, source, n * sizeof(GLuint)); 3095c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3096c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 3097c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* 3098c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * general solution 3099c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 3100c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint indexes[MAX_WIDTH]; 3101c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(n <= MAX_WIDTH); 3102c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3103c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source, 3104b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul srcPacking); 3105c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3106fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 3107fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* shift and offset indexes */ 3108fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul _mesa_shift_and_offset_ci(ctx, n, indexes); 3109fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul } 3110fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_MAP_COLOR_BIT) { 3111fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* Apply lookup table */ 3112fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul _mesa_map_ci(ctx, n, indexes); 3113c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3114c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3115c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* convert to dest type */ 3116c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul switch (dstType) { 3117c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_BYTE: 3118c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 3119c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dst = (GLubyte *) dest; 3120c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 3121c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 3122c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[i] = (GLubyte) (indexes[i] & 0xff); 3123c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3124c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3125c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 3126c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT: 3127c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 3128c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint *dst = (GLuint *) dest; 3129c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 3130c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 3131c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[i] = (GLushort) (indexes[i] & 0xffff); 3132c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3133c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3134c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 3135c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT: 3136c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul MEMCPY(dest, indexes, n * sizeof(GLuint)); 3137c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 3138c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul default: 313908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad dstType in _mesa_unpack_index_span"); 3140c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3141c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3142c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 3143c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3144c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 314523e8d46e072669e0974d7b2c168d4770183106bdBrian Paulvoid 314623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul_mesa_pack_index_span( const GLcontext *ctx, GLuint n, 314723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLenum dstType, GLvoid *dest, const GLuint *source, 314823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul const struct gl_pixelstore_attrib *dstPacking, 314923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint transferOps ) 315023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul{ 315123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint indexes[MAX_WIDTH]; 315223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 315323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul ASSERT(n <= MAX_WIDTH); 315423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 315523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT); 315623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 315723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (transferOps & (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT)) { 315823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul /* make a copy of input */ 315923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul MEMCPY(indexes, source, n * sizeof(GLuint)); 316023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 316123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_shift_and_offset_ci( ctx, n, indexes); 316223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 316323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (transferOps & IMAGE_MAP_COLOR_BIT) { 316423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_map_ci(ctx, n, indexes); 316523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 316623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul source = indexes; 316723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 316823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 316923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul switch (dstType) { 317023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_UNSIGNED_BYTE: 317123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 317223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLubyte *dst = (GLubyte *) dest; 317323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 317423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 317523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul *dst++ = (GLubyte) source[i]; 317623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 317723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 317823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 317923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_BYTE: 318023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 318123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLbyte *dst = (GLbyte *) dest; 318223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 318323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 318423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = (GLbyte) indexes[i]; 318523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 318623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 318723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 318823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_UNSIGNED_SHORT: 318923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 319023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLushort *dst = (GLushort *) dest; 319123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 319223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 319323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = (GLushort) indexes[i]; 319423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 319523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 319623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap2( (GLushort *) dst, n ); 319723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 319823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 319923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 320023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_SHORT: 320123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 320223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLshort *dst = (GLshort *) dest; 320323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 320423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 320523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = (GLshort) indexes[i]; 320623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 320723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 320823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap2( (GLushort *) dst, n ); 320923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 321023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 321123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 321223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_UNSIGNED_INT: 321323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 321423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint *dst = (GLuint *) dest; 321523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 321623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 321723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = (GLuint) indexes[i]; 321823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 321923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 322023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap4( (GLuint *) dst, n ); 322123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 322223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 322323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 322423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_INT: 322523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 322623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLint *dst = (GLint *) dest; 322723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 322823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 322923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = (GLint) indexes[i]; 323023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 323123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 323223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap4( (GLuint *) dst, n ); 323323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 323423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 323523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 323623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_FLOAT: 323723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 323823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLfloat *dst = (GLfloat *) dest; 323923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 324023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 324123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = (GLfloat) indexes[i]; 324223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 324323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 324423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap4( (GLuint *) dst, n ); 324523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 324623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 324723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 324823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul default: 324908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad type in _mesa_pack_index_span"); 325023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 325123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul} 325223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 325323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 325423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 3255c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/* 3256fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Unpack a row of stencil data from a client buffer according to 3257fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * the pixel unpacking parameters. 3258fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * This is (or will be) used by glDrawPixels 3259fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * 3260fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Args: ctx - the context 3261fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * n - number of pixels 3262fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * dstType - destination datatype 3263fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * dest - destination array 3264fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * srcType - source pixel type 3265fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * source - source data pointer 3266b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul * srcPacking - pixel unpacking parameters 3267fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * transferOps - apply offset/bias/lookup ops? 3268fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */ 3269fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid 3270fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_unpack_stencil_span( const GLcontext *ctx, GLuint n, 3271fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLenum dstType, GLvoid *dest, 3272fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLenum srcType, const GLvoid *source, 3273b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul const struct gl_pixelstore_attrib *srcPacking, 3274fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul GLuint transferOps ) 3275fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{ 3276fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul ASSERT(srcType == GL_BITMAP || 3277fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_UNSIGNED_BYTE || 3278fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_BYTE || 3279fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_UNSIGNED_SHORT || 3280fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_SHORT || 3281fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_UNSIGNED_INT || 3282fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_INT || 3283fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_FLOAT); 3284fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3285fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul ASSERT(dstType == GL_UNSIGNED_BYTE || 3286fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dstType == GL_UNSIGNED_SHORT || 3287fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dstType == GL_UNSIGNED_INT); 3288fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3289fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* only shift and offset apply to stencil */ 3290fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul transferOps &= IMAGE_SHIFT_OFFSET_BIT; 3291fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3292fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* 3293fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Try simple cases first 3294fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */ 3295fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps == 0 && 3296fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul srcType == GL_UNSIGNED_BYTE && 3297fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul dstType == GL_UNSIGNED_BYTE) { 3298fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul MEMCPY(dest, source, n * sizeof(GLubyte)); 3299fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3300fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul else if (transferOps == 0 && 3301fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul srcType == GL_UNSIGNED_INT && 3302fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul dstType == GL_UNSIGNED_INT && 3303b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul !srcPacking->SwapBytes) { 3304fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul MEMCPY(dest, source, n * sizeof(GLuint)); 3305fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3306fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul else { 3307fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* 3308fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * general solution 3309fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */ 3310fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint indexes[MAX_WIDTH]; 3311fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul assert(n <= MAX_WIDTH); 3312fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3313fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source, 3314b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul srcPacking); 3315fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3316fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps) { 3317fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 3318fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* shift and offset indexes */ 3319179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul _mesa_shift_and_offset_ci(ctx, n, indexes); 3320fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3321fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3322fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (ctx->Pixel.MapStencilFlag) { 3323fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* Apply stencil lookup table */ 3324fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint mask = ctx->Pixel.MapStoSsize - 1; 3325fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3326fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i=0;i<n;i++) { 3327fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul indexes[i] = ctx->Pixel.MapStoS[ indexes[i] & mask ]; 3328fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3329fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3330fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3331fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3332fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* convert to dest type */ 3333fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul switch (dstType) { 3334fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_BYTE: 3335fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3336fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLubyte *dst = (GLubyte *) dest; 3337fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3338fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3339fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dst[i] = (GLubyte) (indexes[i] & 0xff); 3340fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3341fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3342fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3343fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_SHORT: 3344fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3345fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint *dst = (GLuint *) dest; 3346fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3347fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3348fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dst[i] = (GLushort) (indexes[i] & 0xffff); 3349fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3350fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3351fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3352fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_INT: 3353fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul MEMCPY(dest, indexes, n * sizeof(GLuint)); 3354fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3355fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul default: 335608836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad dstType in _mesa_unpack_stencil_span"); 3357fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3358fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3359fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 3360fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3361fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 336223e8d46e072669e0974d7b2c168d4770183106bdBrian Paulvoid 336323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul_mesa_pack_stencil_span( const GLcontext *ctx, GLuint n, 336423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLenum dstType, GLvoid *dest, const GLstencil *source, 336523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul const struct gl_pixelstore_attrib *dstPacking ) 336623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul{ 336723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLstencil stencil[MAX_WIDTH]; 336823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 336923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul ASSERT(n <= MAX_WIDTH); 337023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 337123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset || 337223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul ctx->Pixel.MapStencilFlag) { 337323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul /* make a copy of input */ 337423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul MEMCPY(stencil, source, n * sizeof(GLstencil)); 337523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset) { 337623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_shift_and_offset_stencil( ctx, n, stencil ); 337723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 337823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (ctx->Pixel.MapStencilFlag) { 337923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_map_stencil( ctx, n, stencil ); 338023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 338123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul source = stencil; 338223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 338323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 338423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul switch (dstType) { 338523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_UNSIGNED_BYTE: 338623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (sizeof(GLstencil) == 8) { 338723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul MEMCPY( dest, source, n ); 338823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 338923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul else { 339023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLubyte *dst = (GLubyte *) dest; 339123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 339223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i=0;i<n;i++) { 339323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = (GLubyte) source[i]; 339423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 339523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 339623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 339723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_BYTE: 339823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (sizeof(GLstencil) == 8) { 339923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul MEMCPY( dest, source, n ); 340023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 340123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul else { 340223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLbyte *dst = (GLbyte *) dest; 340323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 340423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i=0;i<n;i++) { 340523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = (GLbyte) source[i]; 340623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 340723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 340823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 340923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_UNSIGNED_SHORT: 341023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 341123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLushort *dst = (GLushort *) dest; 341223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 341323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i=0;i<n;i++) { 341423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = (GLushort) source[i]; 341523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 341623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 341723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap2( (GLushort *) dst, n ); 341823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 341923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 342023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 342123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_SHORT: 342223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 342323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLshort *dst = (GLshort *) dest; 342423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 342523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i=0;i<n;i++) { 342623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = (GLshort) source[i]; 342723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 342823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 342923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap2( (GLushort *) dst, n ); 343023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 343123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 343223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 343323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_UNSIGNED_INT: 343423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 343523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint *dst = (GLuint *) dest; 343623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 343723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i=0;i<n;i++) { 343823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = (GLuint) source[i]; 343923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 344023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 344123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap4( (GLuint *) dst, n ); 344223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 344323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 344423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 344523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_INT: 344623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 344723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLint *dst = (GLint *) dest; 344823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 344923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i=0;i<n;i++) { 345023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul *dst++ = (GLint) source[i]; 345123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 345223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 345323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap4( (GLuint *) dst, n ); 345423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 345523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 345623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 345723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_FLOAT: 345823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 345923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLfloat *dst = (GLfloat *) dest; 346023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 346123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i=0;i<n;i++) { 346223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = (GLfloat) source[i]; 346323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 346423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 346523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap4( (GLuint *) dst, n ); 346623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 346723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 346823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 346923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_BITMAP: 347023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->LsbFirst) { 347123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLubyte *dst = (GLubyte *) dest; 347223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLint shift = 0; 347323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 347423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 347523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (shift == 0) 347623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul *dst = 0; 347723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul *dst |= ((source[i] != 0) << shift); 347823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul shift++; 347923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (shift == 8) { 348023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul shift = 0; 348123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst++; 348223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 348323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 348423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 348523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul else { 348623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLubyte *dst = (GLubyte *) dest; 348723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLint shift = 7; 348823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 348923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 349023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (shift == 7) 349123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul *dst = 0; 349223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul *dst |= ((source[i] != 0) << shift); 349323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul shift--; 349423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (shift < 0) { 349523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul shift = 7; 349623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst++; 349723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 349823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 349923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 350023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 350123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul default: 350208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad type in _mesa_pack_index_span"); 350323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 350423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul} 350523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 350623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 3507fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3508fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid 3509e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul_mesa_unpack_depth_span( const GLcontext *ctx, GLuint n, GLfloat *dest, 3510fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLenum srcType, const GLvoid *source, 3511e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul const struct gl_pixelstore_attrib *srcPacking ) 3512fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{ 3513fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul switch (srcType) { 3514fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_BYTE: 3515fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3516fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3517fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLubyte *src = (const GLubyte *) source; 3518fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3519e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul dest[i] = BYTE_TO_FLOAT(src[i]); 3520fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3521fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3522fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3523fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_BYTE: 3524fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3525fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3526fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLubyte *src = (const GLubyte *) source; 3527fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3528e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul dest[i] = UBYTE_TO_FLOAT(src[i]); 3529fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3530fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3531fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3532fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_SHORT: 3533fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3534fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3535fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLshort *src = (const GLshort *) source; 3536fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3537e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul dest[i] = SHORT_TO_FLOAT(src[i]); 3538fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3539fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3540fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3541fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_SHORT: 3542fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3543fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3544fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLushort *src = (const GLushort *) source; 3545fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3546e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul dest[i] = USHORT_TO_FLOAT(src[i]); 3547fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3548fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3549fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3550fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_INT: 3551fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3552fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3553fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLint *src = (const GLint *) source; 3554fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3555e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul dest[i] = INT_TO_FLOAT(src[i]); 3556fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3557fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3558fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3559fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_INT: 3560fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3561fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3562fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLuint *src = (const GLuint *) source; 3563fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3564e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul dest[i] = UINT_TO_FLOAT(src[i]); 3565fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3566fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3567fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3568fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_FLOAT: 3569e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul MEMCPY(dest, source, n * sizeof(GLfloat)); 3570fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3571fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul default: 357208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(NULL, "bad type in _mesa_unpack_depth_span()"); 3573fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return; 3574fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3575fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3576fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3577e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul /* apply depth scale and bias and clamp to [0,1] */ 3578fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) { 3579fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3580fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3581e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul GLfloat d = dest[i] * ctx->Pixel.DepthScale + ctx->Pixel.DepthBias; 3582e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul dest[i] = CLAMP(d, 0.0F, 1.0F); 3583fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3584fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3585fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 3586fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3587fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3588fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3589fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul/* 359023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul * Pack an array of depth values. The values are floats in [0,1]. 359123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul */ 359223e8d46e072669e0974d7b2c168d4770183106bdBrian Paulvoid 3593b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul_mesa_pack_depth_span( const GLcontext *ctx, GLuint n, GLvoid *dest, 359423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLenum dstType, const GLfloat *depthSpan, 359523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul const struct gl_pixelstore_attrib *dstPacking ) 359623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul{ 359723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLfloat depthCopy[MAX_WIDTH]; 359823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul const GLboolean bias_or_scale = ctx->Pixel.DepthBias != 0.0 || 359923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul ctx->Pixel.DepthScale != 1.0; 360023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 360123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul ASSERT(n <= MAX_WIDTH); 360223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 360323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (bias_or_scale) { 360423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 360523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 360623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLfloat d; 360723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul d = depthSpan[i] * ctx->Pixel.DepthScale + ctx->Pixel.DepthBias; 360823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul depthCopy[i] = CLAMP(d, 0.0F, 1.0F); 360923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 361023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul depthSpan = depthCopy; 361123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 361223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 361323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul switch (dstType) { 361423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_UNSIGNED_BYTE: 361523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 361623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLubyte *dst = (GLubyte *) dest; 361723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 361823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 361923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = FLOAT_TO_UBYTE( depthSpan[i] ); 362023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 362123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 362223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 362323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_BYTE: 362423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 362523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLbyte *dst = (GLbyte *) dest; 362623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 362723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 362823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = FLOAT_TO_BYTE( depthSpan[i] ); 362923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 363023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 363123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 363223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_UNSIGNED_SHORT: 363323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 363423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLushort *dst = (GLushort *) dest; 363523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 363623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 363723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = FLOAT_TO_USHORT( depthSpan[i] ); 363823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 363923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 364023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap2( (GLushort *) dst, n ); 364123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 364223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 364323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 364423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_SHORT: 364523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 364623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLshort *dst = (GLshort *) dest; 364723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 364823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 364923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = FLOAT_TO_SHORT( depthSpan[i] ); 365023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 365123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 365223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap2( (GLushort *) dst, n ); 365323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 365423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 365523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 365623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_UNSIGNED_INT: 365723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 365823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint *dst = (GLuint *) dest; 365923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 366023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 366123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = FLOAT_TO_UINT( depthSpan[i] ); 366223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 366323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 366423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap4( (GLuint *) dst, n ); 366523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 366623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 366723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 366823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_INT: 366923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 367023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLint *dst = (GLint *) dest; 367123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 367223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 367323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = FLOAT_TO_INT( depthSpan[i] ); 367423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 367523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 367623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap4( (GLuint *) dst, n ); 367723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 367823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 367923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 368023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_FLOAT: 368123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 368223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLfloat *dst = (GLfloat *) dest; 368323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 368423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 368523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = depthSpan[i]; 368623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 368723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 368823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap4( (GLuint *) dst, n ); 368923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 369023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 369123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 369223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul default: 369308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad type in _mesa_pack_depth_span"); 369423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 369523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul} 369623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 369723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 369823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 369923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 370023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul/* 3701c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack image data. Apply byteswapping, byte flipping (bitmap). 3702c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Return all image data in a contiguous block. 3703c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 3704c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid * 3705c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul_mesa_unpack_image( GLsizei width, GLsizei height, GLsizei depth, 3706c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum format, GLenum type, const GLvoid *pixels, 3707c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const struct gl_pixelstore_attrib *unpack ) 3708c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 3709c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint bytesPerRow, compsPerRow; 3710c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLboolean flipBytes, swap2, swap4; 3711c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3712c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (!pixels) 3713c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return NULL; /* not necessarily an error */ 3714c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3715c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (width <= 0 || height <= 0 || depth <= 0) 3716c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return NULL; /* generate error later */ 3717c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3718c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (format == GL_BITMAP) { 3719c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytesPerRow = (width + 7) >> 3; 3720c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul flipBytes = !unpack->LsbFirst; 3721c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul swap2 = swap4 = GL_FALSE; 3722c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul compsPerRow = 0; 3723c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3724c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 3725b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type); 3726b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const GLint components = _mesa_components_in_format(format); 3727c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint bytesPerComp; 3728c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (bytesPerPixel <= 0 || components <= 0) 3729c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return NULL; /* bad format or type. generate error later */ 3730c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytesPerRow = bytesPerPixel * width; 3731c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytesPerComp = bytesPerPixel / components; 3732c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul flipBytes = GL_FALSE; 3733c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul swap2 = (bytesPerComp == 2) && unpack->SwapBytes; 3734c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul swap4 = (bytesPerComp == 4) && unpack->SwapBytes; 3735c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul compsPerRow = components * width; 3736c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(compsPerRow >= width); 3737c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3738c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3739c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 3740b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul GLubyte *destBuffer = (GLubyte *) MALLOC(bytesPerRow * height * depth); 3741c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dst; 3742c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint img, row; 3743c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (!destBuffer) 3744c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return NULL; /* generate GL_OUT_OF_MEMORY later */ 3745c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3746c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst = destBuffer; 3747c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (img = 0; img < depth; img++) { 3748c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (row = 0; row < height; row++) { 3749b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const GLvoid *src = _mesa_image_address(unpack, pixels, 3750c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul width, height, format, type, img, row, 0); 3751c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul MEMCPY(dst, src, bytesPerRow); 3752c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* byte flipping/swapping */ 3753c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (flipBytes) { 3754b7d076fc96ac27117421653a043d00a95f789d24Brian Paul flip_bytes((GLubyte *) dst, bytesPerRow); 3755c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3756c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (swap2) { 3757b7d076fc96ac27117421653a043d00a95f789d24Brian Paul _mesa_swap2((GLushort*) dst, compsPerRow); 3758c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3759c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (swap4) { 3760b7d076fc96ac27117421653a043d00a95f789d24Brian Paul _mesa_swap4((GLuint*) dst, compsPerRow); 3761c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3762c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += bytesPerRow; 3763c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3764c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3765c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return destBuffer; 3766c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3767c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 3768