image.c revision 3041d05bbcccfddba01a1eeaba01e5da0e1e99af
13041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul/* $Id: image.c,v 1.51 2001/01/02 22:02:51 brianp Exp $ */ 2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 3afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 4afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Mesa 3-D graphics library 5fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * Version: 3.5 65e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 7276988ec96a48d4ee5c28c0a2da3aa2b5ee0bbeaBrian Paul * Copyright (C) 1999-2000 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++) { 623699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte *src = _mesa_image_address( packing, pixels, width, height, 624699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GL_COLOR_INDEX, GL_BITMAP, 625699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 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; 643699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 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; 670699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 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++) { 718699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte *dst = _mesa_image_address( packing, dest, width, height, 719699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GL_COLOR_INDEX, GL_BITMAP, 720699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 0, row, 0 ); 721699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (!dst) 722699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul return; 723699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 724699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (packing->SkipPixels == 0) { 725699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul MEMCPY( dst, src, width_in_bytes ); 726699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (packing->LsbFirst) { 727699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul flip_bytes( dst, width_in_bytes ); 728699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 7293428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul } 730699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 731699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* handling SkipPixels is a bit tricky (no pun intended!) */ 732699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLint i; 733699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (packing->LsbFirst) { 734699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte srcMask = 1 << (packing->SkipPixels & 0x7); 735699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte dstMask = 128; 736699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul const GLubyte *s = src; 737699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte *d = dst; 738699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d = 0; 739699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul for (i = 0; i < width; i++) { 740699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (*s & srcMask) { 741699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d |= dstMask; 742699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 743699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (srcMask == 128) { 744699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul srcMask = 1; 745699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul s++; 746699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 747699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 748699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul srcMask = srcMask << 1; 749699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 750699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (dstMask == 1) { 751699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstMask = 128; 752699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul d++; 753699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d = 0; 754699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 755699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 756699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstMask = dstMask >> 1; 757699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 758699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 759699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 760699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 761699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7); 762699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte dstMask = 128; 763699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul const GLubyte *s = src; 764699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte *d = dst; 765699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d = 0; 766699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul for (i = 0; i < width; i++) { 767699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (*s & srcMask) { 768699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d |= dstMask; 769699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 770699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (srcMask == 1) { 771699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul srcMask = 128; 772699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul s++; 773699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 774699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 775699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul srcMask = srcMask >> 1; 776699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 777699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (dstMask == 1) { 778699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstMask = 128; 779699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul d++; 780699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d = 0; 781699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 782699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 783699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstMask = dstMask >> 1; 784699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 785699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 786699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 787afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 788699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul src += width_in_bytes; 789116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 790116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul} 791afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 792116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul 793699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 794116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paulvoid 795116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul_mesa_pack_float_rgba_span( GLcontext *ctx, 796116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul GLuint n, CONST GLfloat rgbaIn[][4], 797b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLenum dstFormat, GLenum dstType, 798b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLvoid *dstAddr, 799b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul const struct gl_pixelstore_attrib *dstPacking, 800116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul GLuint transferOps ) 801116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul{ 802b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul const GLint comps = _mesa_components_in_format(dstFormat); 803116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul GLfloat luminance[MAX_WIDTH]; 804116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul GLfloat (*rgba)[4]; 805116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul GLuint i; 806116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul 807116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul if (transferOps) { 808116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* make copy of incoming data */ 809116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul GLfloat rgbaCopy[MAX_WIDTH][4]; 810116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i = 0; i < n; i++) { 811116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul rgbaCopy[i][0] = rgbaIn[i][0]; 812116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul rgbaCopy[i][1] = rgbaIn[i][1]; 813116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul rgbaCopy[i][2] = rgbaIn[i][2]; 814116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul rgbaCopy[i][3] = rgbaIn[i][3]; 815afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 816afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 817116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul rgba = (GLfloat (*)[4]) rgbaCopy; 818ef9025a641624991113b7df2eecdf7c8e330a31cBrian Paul 819116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* scale & bias */ 820116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul if (transferOps & IMAGE_SCALE_BIAS_BIT) { 82145015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul _mesa_scale_and_bias_rgba(ctx, n, rgba, 82245015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.RedScale, ctx->Pixel.GreenScale, 82345015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.BlueScale, ctx->Pixel.AlphaScale, 82445015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.RedBias, ctx->Pixel.GreenBias, 82545015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.BlueBias, ctx->Pixel.AlphaBias); 826116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 827116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* color map lookup */ 828116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul if (transferOps & IMAGE_MAP_COLOR_BIT) { 829116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_map_rgba( ctx, n, rgba ); 830116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 831116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* GL_COLOR_TABLE lookup */ 832116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul if (transferOps & IMAGE_COLOR_TABLE_BIT) { 833116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_lookup_rgba(&ctx->ColorTable, n, rgba); 834116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 835116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* convolution */ 836116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul if (transferOps & IMAGE_CONVOLUTION_BIT) { 837116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* this has to be done in the calling code */ 838116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 83945015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */ 84045015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul if (transferOps & IMAGE_POST_CONVOLUTION_SCALE_BIAS) { 84145015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul _mesa_scale_and_bias_rgba(ctx, n, rgba, 84245015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionScale[RCOMP], 84345015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionScale[GCOMP], 84445015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionScale[BCOMP], 84545015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionScale[ACOMP], 84645015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionBias[RCOMP], 84745015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionBias[GCOMP], 84845015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionBias[BCOMP], 84945015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionBias[ACOMP]); 85045015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul } 851116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */ 852116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul if (transferOps & IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT) { 853116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_lookup_rgba(&ctx->PostConvolutionColorTable, n, rgba); 854116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 855116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* color matrix transform */ 856116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul if (transferOps & IMAGE_COLOR_MATRIX_BIT) { 857116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_transform_rgba(ctx, n, rgba); 858116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 859116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */ 860116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul if (transferOps & IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT) { 861116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_lookup_rgba(&ctx->PostColorMatrixColorTable, n, rgba); 862116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 863116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* update histogram count */ 864116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul if (transferOps & IMAGE_HISTOGRAM_BIT) { 865116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba); 866116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 867116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* min/max here */ 868116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul if (transferOps & IMAGE_MIN_MAX_BIT) { 869116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba); 870116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul if (ctx->MinMax.Sink) 871116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul return; 872116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 873116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 874116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul else { 875116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* use incoming data, not a copy */ 876116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul rgba = (GLfloat (*)[4]) rgbaIn; 877116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 878ef9025a641624991113b7df2eecdf7c8e330a31cBrian Paul 879116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* XXX clamp rgba to [0,1]? */ 880116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul 881116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul 882b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_LUMINANCE || dstFormat == GL_LUMINANCE_ALPHA) { 883116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i = 0; i < n; i++) { 884116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul GLfloat sum = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP]; 885116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul luminance[i] = CLAMP(sum, 0.0F, 1.0F); 886afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 887116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 889116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* 890116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul * Pack/store the pixels. Ugh! Lots of cases!!! 891116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul */ 892b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstType) { 893116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_BYTE: 894116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul { 895b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLubyte *dst = (GLubyte *) dstAddr; 896b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstFormat) { 897116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RED: 898116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 899116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 900116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 901116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_GREEN: 902116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 903116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 904116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 905116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BLUE: 906116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 907116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 908116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 909116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ALPHA: 910116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 911116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 912116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 913116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE: 914116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 915116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UBYTE(luminance[i]); 916116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 917116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE_ALPHA: 918116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 919116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+0] = FLOAT_TO_UBYTE(luminance[i]); 920116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 921116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 922116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 923116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGB: 924116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 925116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 926116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 927116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 928116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 929116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 930116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGBA: 931116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 932116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 933116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 934116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 935116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 936116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 937116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 938116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGR: 939116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 940116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 941116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 942116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 943116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 944116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 945116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGRA: 946116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 947116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 948116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 949116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 950116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 951116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 952116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 953116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ABGR_EXT: 954116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 955116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 956116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 957116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 958116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 959116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 960116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 961116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 962116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 963116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 964116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 965116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 966116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BYTE: 967116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul { 968b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLbyte *dst = (GLbyte *) dstAddr; 969b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstFormat) { 970116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RED: 971116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 972116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 973116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 974116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_GREEN: 975116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 976116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 977116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 978116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BLUE: 979116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 980116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 981116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 982116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ALPHA: 983116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 984116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 985116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 986116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE: 987116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 988116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_BYTE(luminance[i]); 989116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 990116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE_ALPHA: 991116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 992116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+0] = FLOAT_TO_BYTE(luminance[i]); 993116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 994116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 995116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 996116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGB: 997116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 998116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 999116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1000116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1001116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1002116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1003116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGBA: 1004116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1005116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1006116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1007116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1008116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 1009116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1010116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1011116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGR: 1012116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1013116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1014116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1015116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1016116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1017116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1018116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGRA: 1019116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1020116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1021116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1022116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1023116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 1024116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1025116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ABGR_EXT: 1026116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1027116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 1028116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1029116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1030116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1031116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1032116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1033116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 1034116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1035116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1036116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1037116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1038116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_SHORT: 1039116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul { 1040b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLushort *dst = (GLushort *) dstAddr; 1041b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstFormat) { 1042116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RED: 1043116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1044116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 1045116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1046116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_GREEN: 1047116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1048116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1049116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1050116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BLUE: 1051116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1052116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 1053116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1054116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ALPHA: 1055116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1056116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_USHORT(rgba[i][ACOMP]); 1057116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1058116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE: 1059116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1060116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_USHORT(luminance[i]); 1061116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1062116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE_ALPHA: 1063116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1064116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+0] = FLOAT_TO_USHORT(luminance[i]); 1065116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+1] = FLOAT_TO_USHORT(rgba[i][ACOMP]); 1066116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1067116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1068116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGB: 1069116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1070116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 1071116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1072116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 1073116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1074116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1075116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGBA: 1076116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1077116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 1078116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1079116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 1080116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][ACOMP]); 1081116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1082116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1083116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGR: 1084116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1085116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 1086116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1087116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 1088116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1089116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1090116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGRA: 1091116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1092116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 1093116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1094116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 1095116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][ACOMP]); 1096116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1097116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1098116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ABGR_EXT: 1099116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1100116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][ACOMP]); 1101116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 1102116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1103116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 1104116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1105116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1106116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 1107116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1108116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1109b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstPacking->SwapBytes) { 1110116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_swap2( (GLushort *) dst, n * comps); 1111116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1112116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1113116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1114116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_SHORT: 1115116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul { 1116b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLshort *dst = (GLshort *) dstAddr; 1117b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstFormat) { 1118116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RED: 1119116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1120116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1121116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1122116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_GREEN: 1123116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1124116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1125116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1126116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BLUE: 1127116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1128116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1129116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1130116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ALPHA: 1131116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1132116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1133116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1134116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE: 1135116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1136116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_SHORT(luminance[i]); 1137116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1138116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE_ALPHA: 1139116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1140116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+0] = FLOAT_TO_SHORT(luminance[i]); 1141116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1142116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1143116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1144116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGB: 1145116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1146116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1147116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1148116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1149116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1150116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1151116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGBA: 1152116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1153116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1154116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1155116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1156116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1157116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1158116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1159116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGR: 1160116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1161116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1162116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1163116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1164116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1165116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1166116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGRA: 1167116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1168116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1169116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1170116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1171116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1172116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1173116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ABGR_EXT: 1174116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1175116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1176116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1177116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1178116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1179116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1180116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1181116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 1182116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1184b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstPacking->SwapBytes) { 1185116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_swap2( (GLushort *) dst, n * comps ); 1186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1187116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1188116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1189116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_INT: 1190116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul { 1191b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1192b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstFormat) { 1193116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RED: 1194116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1195116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1196116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1197116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_GREEN: 1198116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1199116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1200116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1201116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BLUE: 1202116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1203116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1204116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1205116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ALPHA: 1206116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1207116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1208116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1209116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE: 1210116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1211116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UINT(luminance[i]); 1212116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1213116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE_ALPHA: 1214116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1215116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+0] = FLOAT_TO_UINT(luminance[i]); 1216116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+1] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1217116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1218116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1219116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGB: 1220116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1221116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1222116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1223116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1224116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1225116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1226116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGBA: 1227116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1228116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1229116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1230116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1231116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1232116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1233116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1234116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGR: 1235116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1236116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1237116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1238116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1239116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1240116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1241116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGRA: 1242116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1243116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1244116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1245116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1246116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1247116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1248116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1249116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ABGR_EXT: 1250116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1251116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1252116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1253116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1254116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1255116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1256116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1257116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 1258116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1260b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstPacking->SwapBytes) { 1261116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_swap4( (GLuint *) dst, n * comps ); 1262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1263116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1264116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1265116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_INT: 1266116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul { 1267b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLint *dst = (GLint *) dstAddr; 1268b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstFormat) { 1269116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RED: 1270116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1271116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_INT(rgba[i][RCOMP]); 1272116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1273116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_GREEN: 1274116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1275116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_INT(rgba[i][GCOMP]); 1276116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1277116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BLUE: 1278116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1279116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_INT(rgba[i][BCOMP]); 1280116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1281116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ALPHA: 1282116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1283116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_INT(rgba[i][ACOMP]); 1284116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1285116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE: 1286116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1287116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_INT(luminance[i]); 1288116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1289116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE_ALPHA: 1290116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1291116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+0] = FLOAT_TO_INT(luminance[i]); 1292116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+1] = FLOAT_TO_INT(rgba[i][ACOMP]); 1293116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1294116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1295116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGB: 1296116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1297116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_INT(rgba[i][RCOMP]); 1298116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 1299116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_INT(rgba[i][BCOMP]); 1300116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1301116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1302116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGBA: 1303116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1304116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_INT(rgba[i][RCOMP]); 1305116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 1306116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_INT(rgba[i][BCOMP]); 1307116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]); 1308116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1309116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1310116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGR: 1311116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1312116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_INT(rgba[i][BCOMP]); 1313116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 1314116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_INT(rgba[i][RCOMP]); 1315116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1316116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1317116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGRA: 1318116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1319116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_INT(rgba[i][BCOMP]); 1320116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 1321116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_INT(rgba[i][RCOMP]); 1322116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]); 1323116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1324116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1325116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ABGR_EXT: 1326116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1327116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_INT(rgba[i][ACOMP]); 1328116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_INT(rgba[i][BCOMP]); 1329116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_INT(rgba[i][GCOMP]); 1330116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_INT(rgba[i][RCOMP]); 1331116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1332116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1333116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 1334116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1336b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstPacking->SwapBytes) { 1337116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_swap4( (GLuint *) dst, n * comps ); 1338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1339116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1340116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1341116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_FLOAT: 1342116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul { 1343b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLfloat *dst = (GLfloat *) dstAddr; 1344b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstFormat) { 1345116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RED: 1346116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1347116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = rgba[i][RCOMP]; 1348116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1349116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_GREEN: 1350116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1351116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = rgba[i][GCOMP]; 1352116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1353116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BLUE: 1354116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1355116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = rgba[i][BCOMP]; 1356116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1357116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ALPHA: 1358116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1359116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = rgba[i][ACOMP]; 1360116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1361116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE: 1362116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1363116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = luminance[i]; 1364116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1365116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE_ALPHA: 1366116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1367116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+0] = luminance[i]; 1368116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+1] = rgba[i][ACOMP]; 1369116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1370116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1371116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGB: 1372116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1373116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = rgba[i][RCOMP]; 1374116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = rgba[i][GCOMP]; 1375116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = rgba[i][BCOMP]; 1376116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1377116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1378116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGBA: 1379116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1380116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = rgba[i][RCOMP]; 1381116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = rgba[i][GCOMP]; 1382116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = rgba[i][BCOMP]; 1383116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = rgba[i][ACOMP]; 1384116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1385116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1386116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGR: 1387116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1388116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = rgba[i][BCOMP]; 1389116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = rgba[i][GCOMP]; 1390116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = rgba[i][RCOMP]; 1391116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1392116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1393116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGRA: 1394116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1395116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = rgba[i][BCOMP]; 1396116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = rgba[i][GCOMP]; 1397116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = rgba[i][RCOMP]; 1398116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = rgba[i][ACOMP]; 1399116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1400116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1401116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ABGR_EXT: 1402116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1403116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = rgba[i][ACOMP]; 1404116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = rgba[i][BCOMP]; 1405116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = rgba[i][GCOMP]; 1406116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = rgba[i][RCOMP]; 1407116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1408116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1409116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 1410116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1412b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstPacking->SwapBytes) { 1413116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_swap4( (GLuint *) dst, n * comps ); 1414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1415116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1416116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1417116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_BYTE_3_3_2: 1418b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGB) { 1419b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLubyte *dst = (GLubyte *) dstAddr; 1420116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1421116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 7.0F)) << 5) 1422116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 7.0F)) << 2) 1423116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 3.0F)) ); 1424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1425116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1426116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1427116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_BYTE_2_3_3_REV: 1428b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGB) { 1429b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLubyte *dst = (GLubyte *) dstAddr; 1430116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1431116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 7.0F)) ) 1432116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 7.0F)) << 3) 1433116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 3.0F)) << 5); 1434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1435116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1436116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1437116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_SHORT_5_6_5: 1438b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGB) { 1439b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLushort *dst = (GLushort *) dstAddr; 1440116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1441116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) << 11) 1442116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 63.0F)) << 5) 1443116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 31.0F)) ); 1444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1445116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1446116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1447116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_SHORT_5_6_5_REV: 1448b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGB) { 1449b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLushort *dst = (GLushort *) dstAddr; 1450116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1451116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) ) 1452116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 63.0F)) << 5) 1453116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 11); 1454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1455116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1456116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1457116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_SHORT_4_4_4_4: 1458881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul if (dstFormat == GL_RGBA) { 1459b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLushort *dst = (GLushort *) dstAddr; 1460116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1461116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 15.0F)) << 12) 1462116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 8) 1463116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 15.0F)) << 4) 1464116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][ACOMP] * 15.0F)) ); 1465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1466116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1467881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_BGRA) { 1468881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1469881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1470881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][BCOMP] * 15.0F)) << 12) 1471881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 8) 1472881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 15.0F)) << 4) 1473881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][ACOMP] * 15.0F)) ); 1474881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1475881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1476881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1477881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1478881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1479881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][ACOMP] * 15.0F)) << 4) 1480881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][BCOMP] * 15.0F)) << 8) 1481881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 12) 1482881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 15.0F)) ); 1483881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1484881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1485116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1486116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_SHORT_4_4_4_4_REV: 1487881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul if (dstFormat == GL_RGBA) { 1488b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLushort *dst = (GLushort *) dstAddr; 1489116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1490116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 15.0F)) ) 1491116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 4) 1492116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 15.0F)) << 8) 1493116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][ACOMP] * 15.0F)) << 12); 1494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1495116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1496881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_BGRA) { 1497881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1498881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1499881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][BCOMP] * 15.0F)) ) 1500881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 4) 1501881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 15.0F)) << 8) 1502881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][ACOMP] * 15.0F)) << 12); 1503881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1504881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1505881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1506881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1507881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1508881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][ACOMP] * 15.0F)) ) 1509881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][BCOMP] * 15.0F)) << 4) 1510881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 8) 1511881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 15.0F)) << 12); 1512881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1513881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1514116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1515116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_SHORT_5_5_5_1: 1516881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul if (dstFormat == GL_RGBA) { 1517b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLushort *dst = (GLushort *) dstAddr; 1518116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1519116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) << 11) 1520116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 6) 1521116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 1) 1522116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][ACOMP] * 1.0F)) ); 1523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1524116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1525881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_BGRA) { 1526881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1527881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1528881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][BCOMP] * 31.0F)) << 11) 1529881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 6) 1530881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 31.0F)) << 1) 1531881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][ACOMP] * 1.0F)) ); 1532881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1533881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1534881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1535881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1536881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1537881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][ACOMP] * 31.0F)) << 11) 1538881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 6) 1539881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 1) 1540881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 1.0F)) ); 1541881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1542881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1543116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1544116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_SHORT_1_5_5_5_REV: 1545881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul if (dstFormat == GL_RGBA) { 1546b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLushort *dst = (GLushort *) dstAddr; 1547116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1548116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) ) 1549116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 5) 1550116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 10) 1551116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][ACOMP] * 1.0F)) << 15); 1552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1553116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1554881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_BGRA) { 1555881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1556881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1557881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][BCOMP] * 31.0F)) ) 1558881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 5) 1559881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 31.0F)) << 10) 1560881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][ACOMP] * 1.0F)) << 15); 1561881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1562881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1563881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1564881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1565881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1566881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][ACOMP] * 31.0F)) ) 1567881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 5) 1568881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 10) 1569881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 1.0F)) << 15); 1570881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1571881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1572116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1573116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_INT_8_8_8_8: 1574b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGBA) { 1575b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1576116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1577116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 24) 1578116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16) 1579116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 8) 1580116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 255.0F)) ); 1581afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1582116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1583b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_BGRA) { 1584b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1585116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1586116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 24) 1587116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16) 1588116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 8) 1589116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 255.0F)) ); 1590afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1591116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1592b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1593b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1594116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1595116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24) 1596116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 16) 1597116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 8) 1598116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 255.0F)) ); 1599afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1600116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1601116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1602116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_INT_8_8_8_8_REV: 1603b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGBA) { 1604b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1605116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1606116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][RCOMP] * 255.0F)) ) 1607116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 8) 1608116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 16) 1609116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24); 1610afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1611116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1612b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_BGRA) { 1613b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1614116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1615116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][BCOMP] * 255.0F)) ) 1616116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 8) 1617116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 16) 1618116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24); 1619afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1620116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1621b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1622b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1623116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1624116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][ACOMP] * 255.0F)) ) 1625116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 8) 1626116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16) 1627116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 24); 1628afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1629116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1630116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1631116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_INT_10_10_10_2: 1632b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGBA) { 1633b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1634116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1635116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 22) 1636116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 12) 1637116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 2) 1638116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 3.0F)) ); 1639afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1640116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1641b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_BGRA) { 1642b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1643116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1644116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 22) 1645116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 12) 1646116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 2) 1647116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 3.0F)) ); 1648afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1649116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1650b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1651b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1652116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1653116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][ACOMP] * 1023.0F)) << 22) 1654116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 12) 1655116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 2) 1656116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 3.0F)) ); 1657116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1658116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1659116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1660116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_INT_2_10_10_10_REV: 1661b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGBA) { 1662b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1663116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1664116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][RCOMP] * 1023.0F)) ) 1665116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 10) 1666116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 20) 1667116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 3.0F)) << 30); 1668116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1669116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1670b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_BGRA) { 1671b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1672116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1673116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][BCOMP] * 1023.0F)) ) 1674116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 10) 1675116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 20) 1676116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 3.0F)) << 30); 1677116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1678116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1679b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1680b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1681116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1682116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][ACOMP] * 1023.0F)) ) 1683116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 10) 1684116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 20) 1685116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 3.0F)) << 30); 1686116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1687116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1688116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1689116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 1690116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul gl_problem(ctx, "bad type in _mesa_pack_float_rgba_span"); 1691afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1692afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 1693c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1694c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1695179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul 1696699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul/* 1697699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Pack the given RGBA span into client memory at 'dest' address 1698699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * in the given pixel format and type. 1699699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Optionally apply the enabled pixel transfer ops. 1700699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Pack into memory using the given packing params struct. 1701699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * This is used by glReadPixels and glGetTexImage?D() 1702699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Input: ctx - the context 1703699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * n - number of pixels in the span 1704699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * rgba - the pixels 1705699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * format - dest packing format 1706699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * type - dest packing datatype 1707699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * destination - destination packing address 1708699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * packing - pixel packing parameters 1709699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * transferOps - bitmask of IMAGE_*_BIT operations to apply 1710699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul */ 1711699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paulvoid 1712699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul_mesa_pack_rgba_span( GLcontext *ctx, 1713699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLuint n, CONST GLchan srcRgba[][4], 1714699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLenum dstFormat, GLenum dstType, 1715699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLvoid *dstAddr, 1716699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul const struct gl_pixelstore_attrib *dstPacking, 1717699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLuint transferOps) 1718699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul{ 17199499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul ASSERT((ctx->NewState & _NEW_PIXEL) == 0); 1720699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 1721699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* Test for optimized case first */ 1722699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (transferOps == 0 && dstFormat == GL_RGBA && dstType == CHAN_TYPE) { 1723699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* common simple case */ 1724699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul MEMCPY(dstAddr, srcRgba, n * 4 * sizeof(GLchan)); 1725699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 1726699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else if (transferOps == 0 && dstFormat == GL_RGB && dstType == CHAN_TYPE) { 1727699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* common simple case */ 1728699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLint i; 1729699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dest = (GLchan *) dstAddr; 1730699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul for (i = 0; i < n; i++) { 1731699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dest[0] = srcRgba[i][RCOMP]; 1732699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dest[1] = srcRgba[i][GCOMP]; 1733699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dest[2] = srcRgba[i][BCOMP]; 1734699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dest += 3; 1735699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 1736699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 1737699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 1738699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* general solution */ 1739699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLfloat rgba[MAX_WIDTH][4]; 1740699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLuint i; 1741699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul assert(n <= MAX_WIDTH); 1742699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* convert color components to floating point */ 1743699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul for (i=0;i<n;i++) { 1744699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul rgba[i][RCOMP] = CHAN_TO_FLOAT(srcRgba[i][RCOMP]); 1745699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul rgba[i][GCOMP] = CHAN_TO_FLOAT(srcRgba[i][GCOMP]); 1746699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul rgba[i][BCOMP] = CHAN_TO_FLOAT(srcRgba[i][BCOMP]); 1747699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul rgba[i][ACOMP] = CHAN_TO_FLOAT(srcRgba[i][ACOMP]); 1748699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 1749699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul _mesa_pack_float_rgba_span(ctx, n, (const GLfloat (*)[4]) rgba, 1750699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstFormat, dstType, dstAddr, 1751699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstPacking, transferOps); 1752699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 1753699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul} 1754699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 1755699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 1756c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define SWAP2BYTE(VALUE) \ 1757c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { \ 1758c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *bytes = (GLubyte *) &(VALUE); \ 1759c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte tmp = bytes[0]; \ 1760c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[0] = bytes[1]; \ 1761c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[1] = tmp; \ 1762c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1763c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1764c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define SWAP4BYTE(VALUE) \ 1765c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { \ 1766c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *bytes = (GLubyte *) &(VALUE); \ 1767c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte tmp = bytes[0]; \ 1768c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[0] = bytes[3]; \ 1769c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[3] = tmp; \ 1770c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul tmp = bytes[1]; \ 1771c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[1] = bytes[2]; \ 1772c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[2] = tmp; \ 1773c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1774c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1775c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1776c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic void 1777c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulextract_uint_indexes(GLuint n, GLuint indexes[], 1778c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum srcFormat, GLenum srcType, const GLvoid *src, 1779c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const struct gl_pixelstore_attrib *unpack ) 1780c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 1781c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(srcFormat == GL_COLOR_INDEX); 1782c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1783c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcType == GL_BITMAP || 1784c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_BYTE || 1785c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_BYTE || 1786c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT || 1787c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_SHORT || 1788c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT || 1789c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_INT || 1790c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_FLOAT); 1791c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1792c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul switch (srcType) { 1793c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BITMAP: 1794c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1795c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *ubsrc = (GLubyte *) src; 1796c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->LsbFirst) { 1797c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte mask = 1 << (unpack->SkipPixels & 0x7); 1798c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1799c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 1800c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = (*ubsrc & mask) ? 1 : 0; 1801c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (mask == 128) { 1802c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul mask = 1; 1803c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ubsrc++; 1804c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1805c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1806c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul mask = mask << 1; 1807c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1808c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1809c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1810c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1811c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte mask = 128 >> (unpack->SkipPixels & 0x7); 1812c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1813c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 1814c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = (*ubsrc & mask) ? 1 : 0; 1815c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (mask == 1) { 1816c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul mask = 128; 1817c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ubsrc++; 1818c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1819c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1820c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul mask = mask >> 1; 1821c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1822c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1823c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1824c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1825c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1826c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_BYTE: 1827c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1828c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1829c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLubyte *s = (const GLubyte *) src; 1830c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 1831c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 1832c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1833c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1834c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BYTE: 1835c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1836c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1837c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLbyte *s = (const GLbyte *) src; 1838c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 1839c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 1840c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1841c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1842c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT: 1843c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1844c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1845c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *s = (const GLushort *) src; 1846c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->SwapBytes) { 1847c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 1848c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort value = s[i]; 1849c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(value); 1850c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = value; 1851c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1852c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1853c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1854c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 1855c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 1856c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1857c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1858c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1859c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_SHORT: 1860c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1861c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1862c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLshort *s = (const GLshort *) src; 1863c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->SwapBytes) { 1864c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 1865c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLshort value = s[i]; 1866c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(value); 1867c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = value; 1868c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1869c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1870c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1871c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 1872c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 1873c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1874c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1875c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1876c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT: 1877c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1878c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1879c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *s = (const GLuint *) src; 1880c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->SwapBytes) { 1881c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 1882c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint value = s[i]; 1883c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(value); 1884c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = value; 1885c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1886c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1887c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1888c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 1889c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 1890c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1891c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1892c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1893c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_INT: 1894c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1895c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1896c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLint *s = (const GLint *) src; 1897c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->SwapBytes) { 1898c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 1899c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint value = s[i]; 1900c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(value); 1901c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = value; 1902c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1903c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1904c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1905c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 1906c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 1907c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1908c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1909c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1910c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_FLOAT: 1911c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1912c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1913c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLfloat *s = (const GLfloat *) src; 1914c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->SwapBytes) { 1915c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 1916c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLfloat value = s[i]; 1917c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(value); 1918959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul indexes[i] = (GLuint) value; 1919c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1920c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1921c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1922c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 1923959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul indexes[i] = (GLuint) s[i]; 1924c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1925c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1926c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1927c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul default: 1928c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_problem(NULL, "bad srcType in extract_uint_indexes"); 1929c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 1930c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1931c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 1932c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1933c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1934c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1935c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/* 1936c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This function extracts floating point RGBA values from arbitrary 1937c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * image data. srcFormat and srcType are the format and type parameters 1938c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc. 1939c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * 1940c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function 1941c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * implements the "Conversion to floating point", "Conversion to RGB", 1942c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * and "Final Expansion to RGBA" operations. 1943c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * 1944c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Args: n - number of pixels 1945c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * rgba - output colors 1946c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * srcFormat - format of incoming data 1947c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * srcType - datatype of incoming data 1948c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * src - source data pointer 1949c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * swapBytes - perform byteswapping of incoming data? 1950c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 1951c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic void 1952c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulextract_float_rgba(GLuint n, GLfloat rgba[][4], 1953c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum srcFormat, GLenum srcType, const GLvoid *src, 1954c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLboolean swapBytes) 1955c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 1956c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint redIndex, greenIndex, blueIndex, alphaIndex; 1957c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint stride; 1958c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint rComp, bComp, gComp, aComp; 1959c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1960c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcFormat == GL_RED || 1961c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_GREEN || 1962c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BLUE || 1963c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_ALPHA || 1964c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_LUMINANCE || 1965c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_LUMINANCE_ALPHA || 1966c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_INTENSITY || 1967c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_RGB || 1968c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BGR || 1969c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_RGBA || 1970c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BGRA || 1971c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_ABGR_EXT); 1972c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1973c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcType == GL_UNSIGNED_BYTE || 1974c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_BYTE || 1975c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT || 1976c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_SHORT || 1977c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT || 1978c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_INT || 1979c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_FLOAT || 1980c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_BYTE_3_3_2 || 1981a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 1982a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_5_6_5 || 1983a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 1984c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 1985a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 1986c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 1987a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 1988c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT_8_8_8_8 || 1989a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 1990a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_10_10_10_2 || 1991a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_2_10_10_10_REV); 1992c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1993a0020435f58baef6a67d3c073b62ea6b1d143af1Brian Paul rComp = gComp = bComp = aComp = -1; 1994a0020435f58baef6a67d3c073b62ea6b1d143af1Brian Paul 1995c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul switch (srcFormat) { 1996c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_RED: 1997c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 0; 1998c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = blueIndex = alphaIndex = -1; 1999c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 2000c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2001c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_GREEN: 2002c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 0; 2003c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = blueIndex = alphaIndex = -1; 2004c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 2005c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2006c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BLUE: 2007c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 0; 2008c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = greenIndex = alphaIndex = -1; 2009c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 2010c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2011c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_ALPHA: 2012c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = greenIndex = blueIndex = -1; 2013c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = 0; 2014c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 2015c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 20165e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen case GL_LUMINANCE: 2017c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = greenIndex = blueIndex = 0; 2018c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = -1; 2019c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 2020c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2021c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_LUMINANCE_ALPHA: 2022c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = greenIndex = blueIndex = 0; 2023c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = 1; 2024c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 2; 2025c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2026c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_INTENSITY: 2027c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 0; 2028c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = blueIndex = alphaIndex = -1; 2029c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 2030c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2031c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_RGB: 2032c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 0; 2033c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 1; 2034c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 2; 2035c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = -1; 2036c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 3; 2037c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2038c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BGR: 2039c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 2; 2040c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 1; 2041c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 0; 2042c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = -1; 2043c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 3; 2044c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2045c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_RGBA: 2046c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 0; 2047c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 1; 2048c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 2; 2049c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = 3; 2050c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rComp = 0; 2051c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gComp = 1; 2052c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bComp = 2; 2053c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul aComp = 3; 2054c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 4; 2055c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2056c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BGRA: 2057c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 2; 2058c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 1; 2059c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 0; 2060c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = 3; 2061c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rComp = 2; 2062c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gComp = 1; 2063c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bComp = 0; 2064c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul aComp = 3; 2065c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 4; 2066c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2067c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_ABGR_EXT: 2068c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 3; 2069c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 2; 2070c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 1; 2071c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = 0; 2072c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rComp = 3; 2073c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gComp = 2; 2074c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bComp = 1; 2075c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul aComp = 0; 2076c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 4; 2077c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2078c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul default: 2079c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_problem(NULL, "bad srcFormat in extract float data"); 2080c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 2081c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2082c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2083c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2084c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define PROCESS(INDEX, CHANNEL, DEFAULT, TYPE, CONVERSION) \ 2085c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if ((INDEX) < 0) { \ 2086c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; \ 2087c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { \ 2088c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][CHANNEL] = DEFAULT; \ 2089c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 2090c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 2091c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (swapBytes) { \ 2092c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const TYPE *s = (const TYPE *) src; \ 2093c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; \ 2094c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { \ 2095c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul TYPE value = s[INDEX]; \ 2096c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (sizeof(TYPE) == 2) { \ 2097c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(value); \ 2098c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 2099c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (sizeof(TYPE) == 4) { \ 2100c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(value); \ 2101c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 2102c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][CHANNEL] = (GLfloat) CONVERSION(value); \ 2103c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul s += stride; \ 2104c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 2105c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 2106c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { \ 2107c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const TYPE *s = (const TYPE *) src; \ 2108c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; \ 2109c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { \ 2110c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][CHANNEL] = (GLfloat) CONVERSION(s[INDEX]); \ 2111c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul s += stride; \ 2112c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 2113c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2114c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2115c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul switch (srcType) { 2116c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_BYTE: 2117c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT); 2118c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT); 2119c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT); 2120c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLubyte, UBYTE_TO_FLOAT); 2121c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2122c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BYTE: 2123c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT); 2124c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT); 2125c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT); 2126c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLbyte, BYTE_TO_FLOAT); 2127c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2128c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT: 2129c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLushort, USHORT_TO_FLOAT); 2130c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLushort, USHORT_TO_FLOAT); 2131c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLushort, USHORT_TO_FLOAT); 2132c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLushort, USHORT_TO_FLOAT); 2133c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2134c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_SHORT: 2135c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLshort, SHORT_TO_FLOAT); 2136c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLshort, SHORT_TO_FLOAT); 2137c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLshort, SHORT_TO_FLOAT); 2138c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLshort, SHORT_TO_FLOAT); 2139c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2140c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT: 2141c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLuint, UINT_TO_FLOAT); 2142c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLuint, UINT_TO_FLOAT); 2143c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLuint, UINT_TO_FLOAT); 2144c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLuint, UINT_TO_FLOAT); 2145c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2146c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_INT: 2147c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLint, INT_TO_FLOAT); 2148c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLint, INT_TO_FLOAT); 2149c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLint, INT_TO_FLOAT); 2150c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLint, INT_TO_FLOAT); 2151c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2152c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_FLOAT: 2153c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLfloat, (GLfloat)); 2154c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLfloat, (GLfloat)); 2155c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLfloat, (GLfloat)); 2156c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLfloat, (GLfloat)); 2157c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2158c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_BYTE_3_3_2: 2159c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2160c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLubyte *ubsrc = (const GLubyte *) src; 2161c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2162c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2163c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte p = ubsrc[i]; 2164c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p >> 5) ) * (1.0F / 7.0F); 2165c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 2) & 0x7) * (1.0F / 7.0F); 2166c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p ) & 0x3) * (1.0F / 3.0F); 2167c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 2168c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2169c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2170c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2171c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_BYTE_2_3_3_REV: 2172c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2173c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLubyte *ubsrc = (const GLubyte *) src; 2174c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2175c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2176c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte p = ubsrc[i]; 2177c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p ) & 0x7) * (1.0F / 7.0F); 2178c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 3) & 0x7) * (1.0F / 7.0F); 2179c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p >> 6) ) * (1.0F / 3.0F); 2180c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 2181c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2182c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2183c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2184c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_5_6_5: 2185c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2186c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2187c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2188c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2189c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2190c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 2191c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p >> 11) ) * (1.0F / 31.0F); 2192c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 5) & 0x3f) * (1.0F / 63.0F); 2193c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p ) & 0x1f) * (1.0F / 31.0F); 2194c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 2195c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2196c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2197c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2198c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2199c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2200c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2201c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2202c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p >> 11) ) * (1.0F / 31.0F); 2203c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 5) & 0x3f) * (1.0F / 63.0F); 2204c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p ) & 0x1f) * (1.0F / 31.0F); 2205c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 2206c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2207c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2208c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2209c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_5_6_5_REV: 2210c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2211c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2212c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2213c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2214c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2215c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 2216c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p ) & 0x1f) * (1.0F / 31.0F); 2217c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 5) & 0x3f) * (1.0F / 63.0F); 2218c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p >> 11) ) * (1.0F / 31.0F); 2219c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 2220c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2221c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2222c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2223c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2224c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2225c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2226c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2227c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p ) & 0x1f) * (1.0F / 31.0F); 2228c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 5) & 0x3f) * (1.0F / 63.0F); 2229c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p >> 11) ) * (1.0F / 31.0F); 2230c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 2231c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2232c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2233c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2234c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_4_4_4_4: 2235c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2236c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2237c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2238c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2239c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2240c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 2241c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p >> 12) ) * (1.0F / 15.0F); 2242c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F); 2243c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F); 2244c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p ) & 0xf) * (1.0F / 15.0F); 2245c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2246c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2247c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2248c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2249c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2250c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2251c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2252c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p >> 12) ) * (1.0F / 15.0F); 2253c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F); 2254c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F); 2255c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p ) & 0xf) * (1.0F / 15.0F); 2256c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2257c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2258c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2259c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_4_4_4_4_REV: 2260c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2261c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2262c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2263c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2264c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2265c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 2266c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0xf) * (1.0F / 15.0F); 2267c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F); 2268c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F); 2269c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 12) ) * (1.0F / 15.0F); 2270c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2271c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2272c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2273c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2274c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2275c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2276c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2277c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0xf) * (1.0F / 15.0F); 2278c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F); 2279c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F); 2280c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 12) ) * (1.0F / 15.0F); 2281c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2282c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2283c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2284c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_5_5_5_1: 2285c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2286c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2287c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2288c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2289c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2290c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 2291c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p >> 11) ) * (1.0F / 31.0F); 2292c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 6) & 0x1f) * (1.0F / 31.0F); 2293c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 1) & 0x1f) * (1.0F / 31.0F); 2294c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p ) & 0x1) * (1.0F / 1.0F); 2295c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2296c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2297c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2298c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2299c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2300c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2301c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2302c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p >> 11) ) * (1.0F / 31.0F); 2303c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 6) & 0x1f) * (1.0F / 31.0F); 2304c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 1) & 0x1f) * (1.0F / 31.0F); 2305c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p ) & 0x1) * (1.0F / 1.0F); 2306c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2307c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2308c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2309c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_1_5_5_5_REV: 2310c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2311c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2312c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2313c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2314c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2315c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 2316c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0x1f) * (1.0F / 31.0F); 2317c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 5) & 0x1f) * (1.0F / 31.0F); 2318c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F); 2319c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 15) ) * (1.0F / 1.0F); 2320c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2321c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2322c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2323c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2324c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2325c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2326c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2327c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0x1f) * (1.0F / 31.0F); 2328c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 5) & 0x1f) * (1.0F / 31.0F); 2329c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F); 2330c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 15) ) * (1.0F / 1.0F); 2331c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2332c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2333c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2334c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT_8_8_8_8: 2335c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2336c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2337c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2338c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2339c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 23403041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][rComp] = UBYTE_TO_FLOAT((p ) & 0xff); 23413041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 23423041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 23433041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][aComp] = UBYTE_TO_FLOAT((p >> 24) ); 2344c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2345c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2346c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2347c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2348c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2349c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2350c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 23513041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][rComp] = UBYTE_TO_FLOAT((p >> 24) ); 23523041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 23533041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 23543041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][aComp] = UBYTE_TO_FLOAT((p ) & 0xff); 2355c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2356c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2357c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2358c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT_8_8_8_8_REV: 2359c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2360c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2361c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2362c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2363c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 23643041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][rComp] = UBYTE_TO_FLOAT((p >> 24) ); 23653041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 23663041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 23673041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][aComp] = UBYTE_TO_FLOAT((p ) & 0xff); 2368c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2369c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2370c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2371c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2372c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2373c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2374c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 23753041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][rComp] = UBYTE_TO_FLOAT((p ) & 0xff); 23763041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 23773041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 23783041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][aComp] = UBYTE_TO_FLOAT((p >> 24) ); 2379c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2380c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2381c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2382c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT_10_10_10_2: 2383c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2384c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2385c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2386c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2387c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 2388c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(p); 2389a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][rComp] = ((p >> 22) ) * (1.0F / 1023.0F); 2390a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F); 2391a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][bComp] = ((p >> 2) & 0x3ff) * (1.0F / 1023.0F); 2392a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][aComp] = ((p ) & 0x3 ) * (1.0F / 3.0F); 2393c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2394c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2395c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2396c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2397c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2398c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2399c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 2400a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][rComp] = ((p >> 22) ) * (1.0F / 1023.0F); 2401a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F); 2402a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][bComp] = ((p >> 2) & 0x3ff) * (1.0F / 1023.0F); 2403a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][aComp] = ((p ) & 0x3 ) * (1.0F / 3.0F); 2404c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2405c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2406c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2407c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT_2_10_10_10_REV: 2408c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2409c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2410c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2411c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2412c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 2413c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(p); 2414c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0x3ff) * (1.0F / 1023.0F); 2415c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F); 2416c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F); 2417c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 30) ) * (1.0F / 3.0F); 2418c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2419c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2420c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2421c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2422c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2423c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2424c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 2425c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0x3ff) * (1.0F / 1023.0F); 2426c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F); 2427c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F); 2428c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 30) ) * (1.0F / 3.0F); 2429c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2430c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2431c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2432c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul default: 2433c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_problem(NULL, "bad srcType in extract float data"); 2434c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2435c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2436c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 2437c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2438c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2439c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2440c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/* 2441c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack a row of color image data from a client buffer according to 2442fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * the pixel unpacking parameters. 2443c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Return GLubyte values in the specified dest image format. 2444c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This is (or will be) used by glDrawPixels and glTexImage?D(). 2445c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Input: ctx - the context 2446c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * n - number of pixels in the span 2447c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * dstFormat - format of destination color array 2448c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * dest - the destination color array 2449c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * srcFormat - source image format 2450c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * srcType - source image datatype 2451c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * source - source image pointer 2452b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul * srcPacking - pixel unpacking parameters 2453fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * transferOps - bitmask of IMAGE_*_BIT values of operations to apply 2454c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * 2455c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * XXX perhaps expand this to process whole images someday. 2456c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 2457c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid 2458699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul_mesa_unpack_chan_color_span( GLcontext *ctx, 2459699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLuint n, GLenum dstFormat, GLchan dest[], 2460699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLenum srcFormat, GLenum srcType, 2461699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul const GLvoid *source, 2462699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul const struct gl_pixelstore_attrib *srcPacking, 2463699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLuint transferOps ) 2464c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 2465c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(dstFormat == GL_ALPHA || 24665e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen dstFormat == GL_LUMINANCE || 2467c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_LUMINANCE_ALPHA || 2468c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_INTENSITY || 2469c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_RGB || 2470c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_RGBA || 2471c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_COLOR_INDEX); 2472c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2473c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcFormat == GL_RED || 2474c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_GREEN || 2475c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BLUE || 2476c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_ALPHA || 2477c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_LUMINANCE || 2478c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_LUMINANCE_ALPHA || 2479c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_INTENSITY || 2480c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_RGB || 2481c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BGR || 2482c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_RGBA || 2483c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BGRA || 2484c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_ABGR_EXT || 2485c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_COLOR_INDEX); 2486c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2487c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcType == GL_BITMAP || 2488c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_BYTE || 2489c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_BYTE || 2490c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT || 2491c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_SHORT || 2492c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT || 2493c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_INT || 2494c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_FLOAT || 2495c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_BYTE_3_3_2 || 2496a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 2497a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_5_6_5 || 2498a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 2499c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 2500a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 2501c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 2502a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 2503c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT_8_8_8_8 || 2504a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 2505a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_10_10_10_2 || 2506a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_2_10_10_10_REV); 2507c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2508250069dbb443f26f4dcc409c9c873019a5f50f9dBrian Paul /* this is intended for RGBA mode only */ 2509b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul assert(ctx->Visual.RGBAflag); 2510c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2511c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Try simple cases first */ 2512699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (transferOps == 0 && srcType == CHAN_TYPE) { 2513c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstFormat == GL_RGBA) { 2514c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (srcFormat == GL_RGBA) { 2515699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul MEMCPY( dest, source, n * 4 * sizeof(GLchan) ); 2516c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 2517c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2518c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (srcFormat == GL_RGB) { 2519c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2520699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul const GLchan *src = (const GLchan *) source; 2521699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dst = dest; 2522c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2523c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[0] = src[0]; 2524c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[1] = src[1]; 2525c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[2] = src[2]; 2526699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dst[3] = CHAN_MAX; 2527c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul src += 3; 2528c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += 4; 2529c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2530c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 2531c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2532c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2533c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (dstFormat == GL_RGB) { 2534c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (srcFormat == GL_RGB) { 2535699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul MEMCPY( dest, source, n * 3 * sizeof(GLchan) ); 2536c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 2537c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2538c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (srcFormat == GL_RGBA) { 2539c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2540699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul const GLchan *src = (const GLchan *) source; 2541699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dst = dest; 2542c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2543c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[0] = src[0]; 2544c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[1] = src[1]; 2545c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[2] = src[2]; 2546c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul src += 4; 2547c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += 3; 2548c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2549c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 2550c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2551c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2552b09a4cd913e2de612fddf5411185a257da35647cBrian Paul else if (dstFormat == srcFormat) { 2553b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GLint comps = _mesa_components_in_format(srcFormat); 2554b09a4cd913e2de612fddf5411185a257da35647cBrian Paul assert(comps > 0); 2555699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul MEMCPY( dest, source, n * comps * sizeof(GLchan) ); 2556c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 2557c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2558c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2559c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2560c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2561179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul /* general solution begins here */ 2562c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2563c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLfloat rgba[MAX_WIDTH][4]; 2564c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint dstComponents; 2565c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint dstRedIndex, dstGreenIndex, dstBlueIndex, dstAlphaIndex; 2566c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint dstLuminanceIndex, dstIntensityIndex; 2567c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2568b7d076fc96ac27117421653a043d00a95f789d24Brian Paul dstComponents = _mesa_components_in_format( dstFormat ); 2569c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* source & dest image formats should have been error checked by now */ 2570c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(dstComponents > 0); 2571c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2572c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* 2573c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Extract image data and convert to RGBA floats 2574c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 2575c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(n <= MAX_WIDTH); 2576c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (srcFormat == GL_COLOR_INDEX) { 2577c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint indexes[MAX_WIDTH]; 2578c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul extract_uint_indexes(n, indexes, srcFormat, srcType, source, 2579b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul srcPacking); 2580c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2581fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul if (dstFormat == GL_COLOR_INDEX 2582fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul && (transferOps & IMAGE_MAP_COLOR_BIT)) { 2583fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul _mesa_map_ci(ctx, n, indexes); 2584fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul } 2585fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 2586fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul _mesa_shift_and_offset_ci(ctx, n, indexes); 2587c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2588c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2589c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstFormat == GL_COLOR_INDEX) { 2590699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* convert to GLchan and return */ 2591c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 2592c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 2593699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dest[i] = (GLchan) (indexes[i] & 0xff); 2594c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2595c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul return; 2596c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2597c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2598c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Convert indexes to RGBA */ 2599179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul _mesa_map_ci_to_rgba(ctx, n, indexes, rgba); 2600c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2601c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2602c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2603c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul extract_float_rgba(n, rgba, srcFormat, srcType, source, 2604b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul srcPacking->SwapBytes); 2605c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2606fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* scale and bias colors */ 2607fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_SCALE_BIAS_BIT) { 260845015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul _mesa_scale_and_bias_rgba(ctx, n, rgba, 260945015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.RedScale, ctx->Pixel.GreenScale, 261045015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.BlueScale, ctx->Pixel.AlphaScale, 261145015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.RedBias, ctx->Pixel.GreenBias, 261245015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.BlueBias, ctx->Pixel.AlphaBias); 2613fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul } 2614fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* color map lookup */ 2615fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_MAP_COLOR_BIT) { 2616fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul _mesa_map_rgba(ctx, n, rgba); 2617c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2618c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2619c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2620fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps) { 2621c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* GL_COLOR_TABLE lookup */ 2622fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_COLOR_TABLE_BIT) { 2623c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_lookup_rgba(&ctx->ColorTable, n, rgba); 2624c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2625fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* convolution */ 2626fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_CONVOLUTION_BIT) { 2627ef9025a641624991113b7df2eecdf7c8e330a31cBrian Paul /* this has to be done in the calling code */ 2628fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul } 262945015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */ 263045015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul if (transferOps & IMAGE_POST_CONVOLUTION_SCALE_BIAS) { 263145015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul _mesa_scale_and_bias_rgba(ctx, n, rgba, 263245015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionScale[RCOMP], 263345015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionScale[GCOMP], 263445015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionScale[BCOMP], 263545015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionScale[ACOMP], 263645015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionBias[RCOMP], 263745015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionBias[GCOMP], 263845015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionBias[BCOMP], 263945015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionBias[ACOMP]); 264045015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul } 2641c29714dccb664562958cf36cdedee9c4377585d2Brian Paul /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */ 2642fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT) { 2643c29714dccb664562958cf36cdedee9c4377585d2Brian Paul _mesa_lookup_rgba(&ctx->PostConvolutionColorTable, n, rgba); 2644c29714dccb664562958cf36cdedee9c4377585d2Brian Paul } 2645c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* color matrix transform */ 2646fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_COLOR_MATRIX_BIT) { 2647c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_transform_rgba(ctx, n, rgba); 2648c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2649c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */ 2650fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT) { 2651c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_lookup_rgba(&ctx->PostColorMatrixColorTable, n, rgba); 2652c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 26531a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul /* update histogram count */ 2654fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_HISTOGRAM_BIT) { 26551a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul _mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba); 26561a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul } 2657fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* min/max here */ 2658fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_MIN_MAX_BIT) { 26591a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul _mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba); 2660c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2661c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2662c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2663c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* clamp to [0,1] */ 2664c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2665c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2666c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2667c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F); 2668c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F); 2669c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F); 2670c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F); 2671c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2672c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2673c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2674c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Now determine which color channels we need to produce. 2675c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * And determine the dest index (offset) within each color tuple. 2676c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 2677c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul switch (dstFormat) { 2678c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_ALPHA: 2679c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstAlphaIndex = 0; 2680c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = -1; 2681c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstLuminanceIndex = dstIntensityIndex = -1; 2682c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 26835e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen case GL_LUMINANCE: 2684c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstLuminanceIndex = 0; 2685c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1; 2686c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstIntensityIndex = -1; 2687c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2688c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_LUMINANCE_ALPHA: 2689c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstLuminanceIndex = 0; 2690c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstAlphaIndex = 1; 2691c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = -1; 2692c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstIntensityIndex = -1; 2693c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2694c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_INTENSITY: 2695c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstIntensityIndex = 0; 2696c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1; 2697c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstLuminanceIndex = -1; 2698c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2699c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_RGB: 2700c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = 0; 2701c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstGreenIndex = 1; 2702c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstBlueIndex = 2; 2703c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1; 2704c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2705c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_RGBA: 2706c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = 0; 2707c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstGreenIndex = 1; 2708c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstBlueIndex = 2; 2709c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstAlphaIndex = 3; 2710c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstLuminanceIndex = dstIntensityIndex = -1; 2711c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2712c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul default: 2713699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul gl_problem(ctx, "bad dstFormat in _mesa_unpack_chan_span()"); 2714276988ec96a48d4ee5c28c0a2da3aa2b5ee0bbeaBrian Paul return; 2715c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2716c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2717c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2718699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* Now return the GLchan data in the requested dstFormat */ 2719fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2720c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstRedIndex >= 0) { 2721699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dst = dest; 2722c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2723c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2724699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dst[dstRedIndex] = FLOAT_TO_CHAN(rgba[i][RCOMP]); 2725c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += dstComponents; 2726c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2727c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2728c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2729c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstGreenIndex >= 0) { 2730699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dst = dest; 2731c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2732c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2733699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dst[dstGreenIndex] = FLOAT_TO_CHAN(rgba[i][GCOMP]); 2734c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += dstComponents; 2735c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2736c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2737c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2738c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstBlueIndex >= 0) { 2739699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dst = dest; 2740c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2741c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2742699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dst[dstBlueIndex] = FLOAT_TO_CHAN(rgba[i][BCOMP]); 2743c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += dstComponents; 2744c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2745c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2746c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2747c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstAlphaIndex >= 0) { 2748699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dst = dest; 2749c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2750c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2751699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dst[dstAlphaIndex] = FLOAT_TO_CHAN(rgba[i][ACOMP]); 2752c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += dstComponents; 2753c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2754c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2755c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2756c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstIntensityIndex >= 0) { 2757699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dst = dest; 2758c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2759c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(dstIntensityIndex == 0); 2760c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(dstComponents == 1); 2761c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2762c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Intensity comes from red channel */ 2763699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dst[i] = FLOAT_TO_CHAN(rgba[i][RCOMP]); 2764c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2765c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2766c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2767c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstLuminanceIndex >= 0) { 2768699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dst = dest; 2769c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2770c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(dstLuminanceIndex == 0); 2771c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2772c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Luminance comes from red channel */ 2773699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dst[0] = FLOAT_TO_CHAN(rgba[i][RCOMP]); 2774c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += dstComponents; 2775c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2776c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2777c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2778c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 2779c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2780c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2781c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paulvoid 2782c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul_mesa_unpack_float_color_span( GLcontext *ctx, 2783c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint n, GLenum dstFormat, GLfloat dest[], 2784c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLenum srcFormat, GLenum srcType, 2785c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul const GLvoid *source, 2786b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul const struct gl_pixelstore_attrib *srcPacking, 2787fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul GLuint transferOps, GLboolean clamp ) 2788c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul{ 2789c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul ASSERT(dstFormat == GL_ALPHA || 27905e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen dstFormat == GL_LUMINANCE || 2791c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstFormat == GL_LUMINANCE_ALPHA || 2792c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstFormat == GL_INTENSITY || 2793c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstFormat == GL_RGB || 2794c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstFormat == GL_RGBA || 2795c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstFormat == GL_COLOR_INDEX); 2796c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2797c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul ASSERT(srcFormat == GL_RED || 2798c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_GREEN || 2799c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_BLUE || 2800c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_ALPHA || 2801c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_LUMINANCE || 2802c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_LUMINANCE_ALPHA || 2803c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_INTENSITY || 2804c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_RGB || 2805c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_BGR || 2806c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_RGBA || 2807c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_BGRA || 2808c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_ABGR_EXT || 2809c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_COLOR_INDEX); 2810c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2811c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul ASSERT(srcType == GL_BITMAP || 2812c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_BYTE || 2813c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_BYTE || 2814c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT || 2815c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_SHORT || 2816c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_INT || 2817c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_INT || 2818c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_FLOAT || 2819c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_BYTE_3_3_2 || 2820c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 2821c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT_5_6_5 || 2822c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 2823c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 2824c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 2825c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 2826c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 2827c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_INT_8_8_8_8 || 2828c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 2829c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_INT_10_10_10_2 || 2830c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_INT_2_10_10_10_REV); 2831c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2832c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* this is intended for RGBA mode only */ 2833b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul assert(ctx->Visual.RGBAflag); 2834c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2835c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* general solution, no special cases, yet */ 2836c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul { 2837c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat rgba[MAX_WIDTH][4]; 2838c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLint dstComponents; 2839c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLint dstRedIndex, dstGreenIndex, dstBlueIndex, dstAlphaIndex; 2840c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLint dstLuminanceIndex, dstIntensityIndex; 2841c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2842c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstComponents = _mesa_components_in_format( dstFormat ); 2843c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* source & dest image formats should have been error checked by now */ 2844c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul assert(dstComponents > 0); 2845c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2846c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* 2847c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul * Extract image data and convert to RGBA floats 2848c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul */ 2849c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul assert(n <= MAX_WIDTH); 2850c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (srcFormat == GL_COLOR_INDEX) { 2851c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint indexes[MAX_WIDTH]; 2852c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul extract_uint_indexes(n, indexes, srcFormat, srcType, source, 2853b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul srcPacking); 2854c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2855fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul if (dstFormat == GL_COLOR_INDEX 2856fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul && (transferOps & IMAGE_MAP_COLOR_BIT)) { 2857fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul _mesa_map_ci(ctx, n, indexes); 2858fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul } 2859fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 2860fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul _mesa_shift_and_offset_ci(ctx, n, indexes); 2861c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2862c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2863c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstFormat == GL_COLOR_INDEX) { 2864699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* convert to GLchan and return */ 2865c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 2866c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 2867699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dest[i] = (GLchan) (indexes[i] & 0xff); 2868c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2869c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul return; 2870c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2871c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul else { 2872c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* Convert indexes to RGBA */ 2873c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_map_ci_to_rgba(ctx, n, indexes, rgba); 2874c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2875c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2876c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul else { 2877c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul extract_float_rgba(n, rgba, srcFormat, srcType, source, 2878b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul srcPacking->SwapBytes); 2879c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2880fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* scale and bias colors */ 2881fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_SCALE_BIAS_BIT) { 288245015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul _mesa_scale_and_bias_rgba(ctx, n, rgba, 288345015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.RedScale, ctx->Pixel.GreenScale, 288445015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.BlueScale, ctx->Pixel.AlphaScale, 288545015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.RedBias, ctx->Pixel.GreenBias, 288645015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.BlueBias, ctx->Pixel.AlphaBias); 2887fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul } 2888fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* color map lookup */ 2889fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_MAP_COLOR_BIT) { 2890fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul _mesa_map_rgba(ctx, n, rgba); 2891c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2892c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2893c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2894fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps) { 2895c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* GL_COLOR_TABLE lookup */ 2896fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_COLOR_TABLE_BIT) { 2897c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_lookup_rgba(&ctx->ColorTable, n, rgba); 2898c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2899fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* convolution */ 2900fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_CONVOLUTION_BIT) { 2901fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* XXX to do */ 2902fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul } 290345015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */ 290445015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul if (transferOps & IMAGE_POST_CONVOLUTION_SCALE_BIAS) { 290545015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul _mesa_scale_and_bias_rgba(ctx, n, rgba, 290645015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionScale[RCOMP], 290745015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionScale[GCOMP], 290845015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionScale[BCOMP], 290945015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionScale[ACOMP], 291045015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionBias[RCOMP], 291145015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionBias[GCOMP], 291245015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionBias[BCOMP], 291345015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul ctx->Pixel.PostConvolutionBias[ACOMP]); 291445015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul } 2915c29714dccb664562958cf36cdedee9c4377585d2Brian Paul /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */ 2916fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT) { 2917c29714dccb664562958cf36cdedee9c4377585d2Brian Paul _mesa_lookup_rgba(&ctx->PostConvolutionColorTable, n, rgba); 2918c29714dccb664562958cf36cdedee9c4377585d2Brian Paul } 2919c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* color matrix transform */ 2920fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_COLOR_MATRIX_BIT) { 2921c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_transform_rgba(ctx, n, rgba); 2922c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2923c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */ 2924fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT) { 2925c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_lookup_rgba(&ctx->PostColorMatrixColorTable, n, rgba); 2926c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 29271a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul /* update histogram count */ 2928fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_HISTOGRAM_BIT) { 29291a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul _mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba); 29301a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul } 2931fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* min/max here */ 2932fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_MIN_MAX_BIT) { 29331a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul _mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba); 2934c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2935c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2936c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2937c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* clamp to [0,1] */ 29387a39d2f833807f8defd2304b0ff180944c23ea0cBrian Paul if (clamp) { 2939c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 2940c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 2941c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F); 2942c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F); 2943c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F); 2944c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F); 2945c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2946c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2947c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2948c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* Now determine which color channels we need to produce. 2949c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul * And determine the dest index (offset) within each color tuple. 2950c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul */ 2951c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul switch (dstFormat) { 2952c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul case GL_ALPHA: 2953c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstAlphaIndex = 0; 2954c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = -1; 2955c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstLuminanceIndex = dstIntensityIndex = -1; 2956c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul break; 29575e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen case GL_LUMINANCE: 2958c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstLuminanceIndex = 0; 2959c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1; 2960c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstIntensityIndex = -1; 2961c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul break; 2962c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul case GL_LUMINANCE_ALPHA: 2963c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstLuminanceIndex = 0; 2964c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstAlphaIndex = 1; 2965c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = -1; 2966c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstIntensityIndex = -1; 2967c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul break; 2968c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul case GL_INTENSITY: 2969c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstIntensityIndex = 0; 2970c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1; 2971c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstLuminanceIndex = -1; 2972c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul break; 2973c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul case GL_RGB: 2974c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstRedIndex = 0; 2975c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstGreenIndex = 1; 2976c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstBlueIndex = 2; 2977c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1; 2978c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul break; 2979c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul case GL_RGBA: 2980c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstRedIndex = 0; 2981c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstGreenIndex = 1; 2982c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstBlueIndex = 2; 2983c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstAlphaIndex = 3; 2984c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstLuminanceIndex = dstIntensityIndex = -1; 2985c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul break; 2986c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul default: 2987fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul gl_problem(ctx, "bad dstFormat in _mesa_unpack_float_color_span()"); 2988c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul return; 2989c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2990c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2991fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* Now pack results in the requested dstFormat */ 2992c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstRedIndex >= 0) { 2993c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat *dst = dest; 2994c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 2995c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 2996c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst[dstRedIndex] = rgba[i][RCOMP]; 2997c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst += dstComponents; 2998c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2999c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3000c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3001c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstGreenIndex >= 0) { 3002c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat *dst = dest; 3003c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 3004c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 3005c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst[dstGreenIndex] = rgba[i][GCOMP]; 3006c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst += dstComponents; 3007c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3008c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3009c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3010c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstBlueIndex >= 0) { 3011c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat *dst = dest; 3012c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 3013c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 3014c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst[dstBlueIndex] = rgba[i][BCOMP]; 3015c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst += dstComponents; 3016c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3017c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3018c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3019c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstAlphaIndex >= 0) { 3020c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat *dst = dest; 3021c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 3022c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 3023c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst[dstAlphaIndex] = rgba[i][ACOMP]; 3024c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst += dstComponents; 3025c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3026c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3027c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3028c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstIntensityIndex >= 0) { 3029c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat *dst = dest; 3030c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 3031c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul assert(dstIntensityIndex == 0); 3032c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul assert(dstComponents == 1); 3033c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 3034c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* Intensity comes from red channel */ 3035c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst[i] = rgba[i][RCOMP]; 3036c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3037c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3038c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3039c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstLuminanceIndex >= 0) { 3040c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat *dst = dest; 3041c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 3042c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul assert(dstLuminanceIndex == 0); 3043c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 3044c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* Luminance comes from red channel */ 3045c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst[0] = rgba[i][RCOMP]; 3046c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst += dstComponents; 3047c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3048c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3049c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3050c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul} 3051c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3052c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3053c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3054c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3055c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/* 3056c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack a row of color index data from a client buffer according to 3057fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * the pixel unpacking parameters. 3058c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc. 3059c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * 3060c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Args: ctx - the context 3061c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * n - number of pixels 3062c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * dstType - destination datatype 3063c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * dest - destination array 3064c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * srcType - source pixel type 3065c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * source - source data pointer 3066b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul * srcPacking - pixel unpacking parameters 3067fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * transferOps - the pixel transfer operations to apply 3068c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 3069c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid 3070c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul_mesa_unpack_index_span( const GLcontext *ctx, GLuint n, 3071c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum dstType, GLvoid *dest, 3072c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum srcType, const GLvoid *source, 3073b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul const struct gl_pixelstore_attrib *srcPacking, 3074fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul GLuint transferOps ) 3075c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 3076c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcType == GL_BITMAP || 3077c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_BYTE || 3078c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_BYTE || 3079c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT || 3080c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_SHORT || 3081c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT || 3082c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_INT || 3083c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_FLOAT); 3084c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3085c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(dstType == GL_UNSIGNED_BYTE || 3086c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstType == GL_UNSIGNED_SHORT || 3087c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstType == GL_UNSIGNED_INT); 3088c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3089fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul 3090fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT); 3091c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3092c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* 3093c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Try simple cases first 3094c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 3095fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps == 0 && srcType == GL_UNSIGNED_BYTE 3096c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul && dstType == GL_UNSIGNED_BYTE) { 3097c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul MEMCPY(dest, source, n * sizeof(GLubyte)); 3098c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3099fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul else if (transferOps == 0 && srcType == GL_UNSIGNED_INT 3100b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul && dstType == GL_UNSIGNED_INT && !srcPacking->SwapBytes) { 3101c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul MEMCPY(dest, source, n * sizeof(GLuint)); 3102c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3103c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 3104c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* 3105c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * general solution 3106c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 3107c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint indexes[MAX_WIDTH]; 3108c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(n <= MAX_WIDTH); 3109c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3110c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source, 3111b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul srcPacking); 3112c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3113fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 3114fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* shift and offset indexes */ 3115fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul _mesa_shift_and_offset_ci(ctx, n, indexes); 3116fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul } 3117fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_MAP_COLOR_BIT) { 3118fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* Apply lookup table */ 3119fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul _mesa_map_ci(ctx, n, indexes); 3120c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3121c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3122c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* convert to dest type */ 3123c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul switch (dstType) { 3124c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_BYTE: 3125c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 3126c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dst = (GLubyte *) dest; 3127c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 3128c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 3129c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[i] = (GLubyte) (indexes[i] & 0xff); 3130c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3131c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3132c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 3133c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT: 3134c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 3135c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint *dst = (GLuint *) dest; 3136c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 3137c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 3138c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[i] = (GLushort) (indexes[i] & 0xffff); 3139c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3140c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3141c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 3142c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT: 3143c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul MEMCPY(dest, indexes, n * sizeof(GLuint)); 3144c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 3145c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul default: 3146c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_problem(ctx, "bad dstType in _mesa_unpack_index_span"); 3147c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3148c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3149c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 3150c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3151c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3152c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/* 3153fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Unpack a row of stencil data from a client buffer according to 3154fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * the pixel unpacking parameters. 3155fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * This is (or will be) used by glDrawPixels 3156fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * 3157fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Args: ctx - the context 3158fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * n - number of pixels 3159fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * dstType - destination datatype 3160fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * dest - destination array 3161fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * srcType - source pixel type 3162fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * source - source data pointer 3163b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul * srcPacking - pixel unpacking parameters 3164fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * transferOps - apply offset/bias/lookup ops? 3165fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */ 3166fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid 3167fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_unpack_stencil_span( const GLcontext *ctx, GLuint n, 3168fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLenum dstType, GLvoid *dest, 3169fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLenum srcType, const GLvoid *source, 3170b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul const struct gl_pixelstore_attrib *srcPacking, 3171fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul GLuint transferOps ) 3172fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{ 3173fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul ASSERT(srcType == GL_BITMAP || 3174fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_UNSIGNED_BYTE || 3175fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_BYTE || 3176fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_UNSIGNED_SHORT || 3177fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_SHORT || 3178fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_UNSIGNED_INT || 3179fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_INT || 3180fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_FLOAT); 3181fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3182fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul ASSERT(dstType == GL_UNSIGNED_BYTE || 3183fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dstType == GL_UNSIGNED_SHORT || 3184fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dstType == GL_UNSIGNED_INT); 3185fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3186fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* only shift and offset apply to stencil */ 3187fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul transferOps &= IMAGE_SHIFT_OFFSET_BIT; 3188fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3189fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* 3190fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Try simple cases first 3191fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */ 3192fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps == 0 && 3193fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul srcType == GL_UNSIGNED_BYTE && 3194fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul dstType == GL_UNSIGNED_BYTE) { 3195fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul MEMCPY(dest, source, n * sizeof(GLubyte)); 3196fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3197fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul else if (transferOps == 0 && 3198fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul srcType == GL_UNSIGNED_INT && 3199fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul dstType == GL_UNSIGNED_INT && 3200b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul !srcPacking->SwapBytes) { 3201fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul MEMCPY(dest, source, n * sizeof(GLuint)); 3202fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3203fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul else { 3204fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* 3205fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * general solution 3206fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */ 3207fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint indexes[MAX_WIDTH]; 3208fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul assert(n <= MAX_WIDTH); 3209fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3210fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source, 3211b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul srcPacking); 3212fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3213fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps) { 3214fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 3215fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* shift and offset indexes */ 3216179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul _mesa_shift_and_offset_ci(ctx, n, indexes); 3217fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3218fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3219fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (ctx->Pixel.MapStencilFlag) { 3220fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* Apply stencil lookup table */ 3221fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint mask = ctx->Pixel.MapStoSsize - 1; 3222fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3223fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i=0;i<n;i++) { 3224fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul indexes[i] = ctx->Pixel.MapStoS[ indexes[i] & mask ]; 3225fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3226fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3227fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3228fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3229fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* convert to dest type */ 3230fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul switch (dstType) { 3231fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_BYTE: 3232fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3233fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLubyte *dst = (GLubyte *) dest; 3234fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3235fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3236fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dst[i] = (GLubyte) (indexes[i] & 0xff); 3237fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3238fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3239fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3240fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_SHORT: 3241fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3242fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint *dst = (GLuint *) dest; 3243fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3244fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3245fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dst[i] = (GLushort) (indexes[i] & 0xffff); 3246fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3247fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3248fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3249fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_INT: 3250fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul MEMCPY(dest, indexes, n * sizeof(GLuint)); 3251fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3252fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul default: 3253fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul gl_problem(ctx, "bad dstType in _mesa_unpack_stencil_span"); 3254fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3255fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3256fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 3257fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3258fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3259fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3260fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid 3261fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_unpack_depth_span( const GLcontext *ctx, GLuint n, GLdepth *dest, 3262fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLenum srcType, const GLvoid *source, 3263b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul const struct gl_pixelstore_attrib *srcPacking, 3264fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul GLuint transferOps ) 3265fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{ 3266fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLfloat *depth = MALLOC(n * sizeof(GLfloat)); 3267fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (!depth) 3268fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return; 3269fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3270fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul switch (srcType) { 3271fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_BYTE: 3272fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3273fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3274fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLubyte *src = (const GLubyte *) source; 3275fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3276fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul depth[i] = BYTE_TO_FLOAT(src[i]); 3277fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3278fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3279fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3280fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_BYTE: 3281fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3282fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3283fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLubyte *src = (const GLubyte *) source; 3284fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3285fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul depth[i] = UBYTE_TO_FLOAT(src[i]); 3286fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3287fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3288fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3289fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_SHORT: 3290fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3291fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3292fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLshort *src = (const GLshort *) source; 3293fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3294fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul depth[i] = SHORT_TO_FLOAT(src[i]); 3295fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3296fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3297fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3298fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_SHORT: 3299fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3300fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3301fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLushort *src = (const GLushort *) source; 3302fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3303fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul depth[i] = USHORT_TO_FLOAT(src[i]); 3304fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3305fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3306fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3307fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_INT: 3308fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3309fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3310fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLint *src = (const GLint *) source; 3311fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3312fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul depth[i] = INT_TO_FLOAT(src[i]); 3313fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3314fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3315fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3316fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_INT: 3317fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3318fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3319fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLuint *src = (const GLuint *) source; 3320fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3321fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul depth[i] = UINT_TO_FLOAT(src[i]); 3322fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3323fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3324fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3325fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_FLOAT: 3326fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul MEMCPY(depth, source, n * sizeof(GLfloat)); 3327fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3328fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul default: 3329fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul gl_problem(NULL, "bad type in _mesa_unpack_depth_span()"); 33303c8299c77967611db138169c56a7c6a1c0086d1cBrian Paul FREE(depth); 3331fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return; 3332fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3333fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3334fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3335fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* apply depth scale and bias */ 3336fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) { 3337fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3338fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3339fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul depth[i] = depth[i] * ctx->Pixel.DepthScale + ctx->Pixel.DepthBias; 3340fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3341fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3342fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3343fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* clamp depth values to [0,1] and convert from floats to integers */ 3344fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3345b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul const GLfloat zs = ctx->Visual.DepthMaxF; 3346fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3347fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3348ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul dest[i] = (GLdepth) (CLAMP(depth[i], 0.0F, 1.0F) * zs); 3349fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3350fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3351fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3352fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul FREE(depth); 3353fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 3354fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3355fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3356fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3357fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul/* 3358c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack image data. Apply byteswapping, byte flipping (bitmap). 3359c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Return all image data in a contiguous block. 3360c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 3361c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid * 3362c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul_mesa_unpack_image( GLsizei width, GLsizei height, GLsizei depth, 3363c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum format, GLenum type, const GLvoid *pixels, 3364c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const struct gl_pixelstore_attrib *unpack ) 3365c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 3366c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint bytesPerRow, compsPerRow; 3367c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLboolean flipBytes, swap2, swap4; 3368c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3369c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (!pixels) 3370c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return NULL; /* not necessarily an error */ 3371c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3372c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (width <= 0 || height <= 0 || depth <= 0) 3373c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return NULL; /* generate error later */ 3374c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3375c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (format == GL_BITMAP) { 3376c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytesPerRow = (width + 7) >> 3; 3377c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul flipBytes = !unpack->LsbFirst; 3378c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul swap2 = swap4 = GL_FALSE; 3379c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul compsPerRow = 0; 3380c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3381c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 3382b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type); 3383b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const GLint components = _mesa_components_in_format(format); 3384c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint bytesPerComp; 3385c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (bytesPerPixel <= 0 || components <= 0) 3386c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return NULL; /* bad format or type. generate error later */ 3387c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytesPerRow = bytesPerPixel * width; 3388c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytesPerComp = bytesPerPixel / components; 3389c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul flipBytes = GL_FALSE; 3390c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul swap2 = (bytesPerComp == 2) && unpack->SwapBytes; 3391c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul swap4 = (bytesPerComp == 4) && unpack->SwapBytes; 3392c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul compsPerRow = components * width; 3393c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(compsPerRow >= width); 3394c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3395c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3396c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 3397c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *destBuffer = MALLOC(bytesPerRow * height * depth); 3398c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dst; 3399c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint img, row; 3400c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (!destBuffer) 3401c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return NULL; /* generate GL_OUT_OF_MEMORY later */ 3402c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3403c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst = destBuffer; 3404c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (img = 0; img < depth; img++) { 3405c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (row = 0; row < height; row++) { 3406b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const GLvoid *src = _mesa_image_address(unpack, pixels, 3407c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul width, height, format, type, img, row, 0); 3408c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul MEMCPY(dst, src, bytesPerRow); 3409c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* byte flipping/swapping */ 3410c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (flipBytes) { 3411b7d076fc96ac27117421653a043d00a95f789d24Brian Paul flip_bytes((GLubyte *) dst, bytesPerRow); 3412c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3413c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (swap2) { 3414b7d076fc96ac27117421653a043d00a95f789d24Brian Paul _mesa_swap2((GLushort*) dst, compsPerRow); 3415c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3416c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (swap4) { 3417b7d076fc96ac27117421653a043d00a95f789d24Brian Paul _mesa_swap4((GLuint*) dst, compsPerRow); 3418c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3419c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += bytesPerRow; 3420c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3421c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3422c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return destBuffer; 3423c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3424c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 3425