image.c revision 7a6b71ef2944bae1718e8167b2faaceb8422071c
16dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 26dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \file image.c 36dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Image handling. 46dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */ 5afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 6afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 7afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Mesa 3-D graphics library 87a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul * Version: 6.1 95e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 107a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul * Copyright (C) 1999-2004 Brian Paul All Rights Reserved. 115e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Permission is hereby granted, free of charge, to any person obtaining a 13afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * copy of this software and associated documentation files (the "Software"), 14afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * to deal in the Software without restriction, including without limitation 15afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * the rights to use, copy, modify, merge, publish, distribute, sublicense, 16afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * and/or sell copies of the Software, and to permit persons to whom the 17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Software is furnished to do so, subject to the following conditions: 185e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * The above copyright notice and this permission notice shall be included 20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * in all copies or substantial portions of the Software. 215e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 26afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 27afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 28afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 29afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 306dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell 31fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul#include "glheader.h" 327a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul#include "bufferobj.h" 33c893a015d8a50a38cd3f727d99835e7e7e2ccea9Brian Paul#include "colormac.h" 34afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "context.h" 35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "image.h" 363c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul#include "imports.h" 378a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul#include "histogram.h" 38afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "macros.h" 39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "pixel.h" 405e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "mtypes.h" 41afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 42afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 436dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** Compute ceiling of integer quotient of A divided by B. */ 4427558a160a9fe91745728d7626995cd88f8fe339Brian Paul#define CEILING( A, B ) ( (A) % (B) == 0 ? (A)/(B) : (A)/(B)+1 ) 4527558a160a9fe91745728d7626995cd88f8fe339Brian Paul 4627558a160a9fe91745728d7626995cd88f8fe339Brian Paul 476dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 48afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the 8 bits in each byte of the given array. 4964a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul * 506dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param p array. 516dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param n number of bytes. 526dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 536dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \todo try this trick to flip bytes someday: 546dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \code 5564a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul * v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555); 5664a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul * v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333); 5764a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul * v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f); 586dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \endcode 59afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 60b7d076fc96ac27117421653a043d00a95f789d24Brian Paulstatic void 61b7d076fc96ac27117421653a043d00a95f789d24Brian Paulflip_bytes( GLubyte *p, GLuint n ) 62afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 63afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach register GLuint i, a, b; 64afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 65afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 6664a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul b = (GLuint) p[i]; /* words are often faster than bytes */ 67afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach a = ((b & 0x01) << 7) | 68afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x02) << 5) | 69afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x04) << 3) | 70afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x08) << 1) | 71afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x10) >> 1) | 72afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x20) >> 3) | 73afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x40) >> 5) | 74afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x80) >> 7); 75afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach p[i] = (GLubyte) a; 76afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 77afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 78afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 79afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 806dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 81afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the order of the 2 bytes in each word in the given array. 826dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 836dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param p array. 846dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param n number of words. 85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 86b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid 87b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_swap2( GLushort *p, GLuint n ) 88afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 89afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach register GLuint i; 90afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 91afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 92afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach p[i] = (p[i] >> 8) | ((p[i] << 8) & 0xff00); 93afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 94afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 95afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 96afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 97afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 98afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 99afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the order of the 4 bytes in each word in the given array. 100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 101b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid 102b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_swap4( GLuint *p, GLuint n ) 103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach register GLuint i, a, b; 105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach b = p[i]; 108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach a = (b >> 24) 109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | ((b >> 8) & 0xff00) 110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | ((b << 8) & 0xff0000) 111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | ((b << 24) & 0xff000000); 112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach p[i] = a; 113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1176dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 1186dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Get the size of a GL data type. 1196dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 1206dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param type GL data type. 1216dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 1226dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return the size, in bytes, of the given data type, 0 if a GL_BITMAP, or -1 1236dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * if an invalid type enum. 124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 125b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_sizeof_type( GLenum type ) 126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BITMAP: 129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 0; 130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLbyte); 134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLushort); 136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLint); 142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLfloat); 1447eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul case GL_HALF_FLOAT_NV: 1457eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul return sizeof(GLhalfNV); 146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1526dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 1536dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Same as _mesa_sizeof_type() but also accepting the packed pixel 1546dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * format data types. 155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 156b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_sizeof_packed_type( GLenum type ) 157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BITMAP: 160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 0; 161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLbyte); 165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLushort); 167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLint); 1737eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul case GL_HALF_FLOAT_NV: 1747eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul return sizeof(GLhalfNV); 175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLfloat); 177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_3_3_2: 178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_2_3_3_REV: 180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5: 182c450d57991628318696ee7a2bd052f91f480cda3Brian Paul return sizeof(GLushort); 183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5_REV: 184c450d57991628318696ee7a2bd052f91f480cda3Brian Paul return sizeof(GLushort); 185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4: 186c450d57991628318696ee7a2bd052f91f480cda3Brian Paul return sizeof(GLushort); 187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4_REV: 188c450d57991628318696ee7a2bd052f91f480cda3Brian Paul return sizeof(GLushort); 189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_5_5_1: 190c450d57991628318696ee7a2bd052f91f480cda3Brian Paul return sizeof(GLushort); 191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_1_5_5_5_REV: 192c450d57991628318696ee7a2bd052f91f480cda3Brian Paul return sizeof(GLushort); 193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8: 194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8_REV: 196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_10_10_10_2: 198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_2_10_10_10_REV: 200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 201c5b995066020191982b2315fc45d05e068eee761Brian Paul case GL_UNSIGNED_SHORT_8_8_MESA: 202c5b995066020191982b2315fc45d05e068eee761Brian Paul case GL_UNSIGNED_SHORT_8_8_REV_MESA: 203c5b995066020191982b2315fc45d05e068eee761Brian Paul return sizeof(GLushort); 204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 2106dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 2116dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Get the number of components in a pixel format. 2126dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 2136dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param format pixel format. 2146dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 2156dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return the number of components in the given format, or -1 if a 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; 248c5b995066020191982b2315fc45d05e068eee761Brian Paul case GL_YCBCR_MESA: 249c5b995066020191982b2315fc45d05e068eee761Brian Paul return 2; 250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 2566dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 2576dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Get the bytes per pixel of pixel format type pair. 2586dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 2596dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param format pixel format. 2606dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param type pixel type. 2616dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 2626dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return bytes per pixel, or -1 if a bad format or type was given. 263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 264b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_bytes_per_pixel( GLenum format, GLenum type ) 265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 266b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GLint comps = _mesa_components_in_format( format ); 267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (comps < 0) 268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BITMAP: 272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 0; /* special case */ 273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return comps * sizeof(GLubyte); 276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return comps * sizeof(GLshort); 279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return comps * sizeof(GLint); 282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 283afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return comps * sizeof(GLfloat); 2847eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul case GL_HALF_FLOAT_NV: 2857eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul return comps * sizeof(GLhalfNV); 286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_3_3_2: 287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_2_3_3_REV: 288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB || format == GL_BGR) 289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else 291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; /* error */ 292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5: 293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5_REV: 294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB || format == GL_BGR) 295c450d57991628318696ee7a2bd052f91f480cda3Brian Paul return sizeof(GLushort); 296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else 297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; /* error */ 298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4: 299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4_REV: 300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_5_5_1: 301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_1_5_5_5_REV: 302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT) 303afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLushort); 304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else 305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8: 307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8_REV: 308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_10_10_10_2: 309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_2_10_10_10_REV: 310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT) 311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else 313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 314c5b995066020191982b2315fc45d05e068eee761Brian Paul case GL_UNSIGNED_SHORT_8_8_MESA: 315c5b995066020191982b2315fc45d05e068eee761Brian Paul case GL_UNSIGNED_SHORT_8_8_REV_MESA: 316c5b995066020191982b2315fc45d05e068eee761Brian Paul if (format == GL_YCBCR_MESA) 317c5b995066020191982b2315fc45d05e068eee761Brian Paul return sizeof(GLushort); 318c5b995066020191982b2315fc45d05e068eee761Brian Paul else 319c5b995066020191982b2315fc45d05e068eee761Brian Paul return -1; 320afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 3266dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 3276dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Test for a legal pixel format and type. 3286dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 3296dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param format pixel format. 3306dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param type pixel type. 3316dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 3326dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return GL_TRUE if the given pixel format and type are legal, or GL_FALSE 3336dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * otherwise. 334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 335b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLboolean 336b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_is_legal_format_and_type( GLenum format, GLenum type ) 337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (format) { 339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX: 340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_STENCIL_INDEX: 341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BITMAP: 343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 3507eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul case GL_HALF_FLOAT_NV: 351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_TRUE; 352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_GREEN: 357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BLUE: 358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ALPHA: 3592a1f50aee4f30dbd0c55d8f0b7185b690c841051Brian Paul case GL_INTENSITY: 360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE: 361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE_ALPHA: 362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_DEPTH_COMPONENT: 363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 3717eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul case GL_HALF_FLOAT_NV: 372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_TRUE; 373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 3773d960a0d84be0ffdd491dd37ff80bedf4a44fe92Brian Paul case GL_BGR: 378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 3867eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul case GL_HALF_FLOAT_NV: 387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_3_3_2: 388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_2_3_3_REV: 389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5: 390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5_REV: 391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_TRUE; 392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 394afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGBA: 396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGRA: 397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ABGR_EXT: 398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 4067eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul case GL_HALF_FLOAT_NV: 407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4: 408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4_REV: 409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_5_5_1: 410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_1_5_5_5_REV: 411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8: 412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8_REV: 413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_10_10_10_2: 414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_2_10_10_10_REV: 415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_TRUE; 416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 419c5b995066020191982b2315fc45d05e068eee761Brian Paul case GL_YCBCR_MESA: 420c5b995066020191982b2315fc45d05e068eee761Brian Paul if (type == GL_UNSIGNED_SHORT_8_8_MESA || 421c5b995066020191982b2315fc45d05e068eee761Brian Paul type == GL_UNSIGNED_SHORT_8_8_REV_MESA) 422c5b995066020191982b2315fc45d05e068eee761Brian Paul return GL_TRUE; 423c5b995066020191982b2315fc45d05e068eee761Brian Paul else 424c5b995066020191982b2315fc45d05e068eee761Brian Paul return GL_FALSE; 425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ; /* fall-through */ 427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 4326dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 4336dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Get the address of a pixel in an image (actually a volume). 4346dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 4356dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Pixel unpacking/packing parameters are observed according to \p packing. 4366dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 4376dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param image start of image data. 4386dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param width image width. 4396dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param height image height. 4406dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param format pixel format. 4416dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param type pixel data type. 4426dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param packing the pixelstore attributes 4436dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param img which image in the volume (0 for 1D or 2D images) 4446dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param row of pixel in the image 4456dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param column of pixel in the image 4466dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 4476dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return address of pixel on success, or NULL on error. 4486dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 4496dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * According to the \p packing information calculates the number of pixel/bytes 4506dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * per row/image and refers it. 4516dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 4526dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa gl_pixelstore_attrib. 453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 454b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLvoid * 455b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_image_address( const struct gl_pixelstore_attrib *packing, 456b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const GLvoid *image, GLsizei width, 457b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GLsizei height, GLenum format, GLenum type, 458b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GLint img, GLint row, GLint column ) 459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint alignment; /* 1, 2 or 4 */ 461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint pixels_per_row; 462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint rows_per_image; 463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint skiprows; 464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint skippixels; 465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint skipimages; /* for 3-D volume images */ 466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte *pixel_addr; 467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach alignment = packing->Alignment; 469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->RowLength > 0) { 470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach pixels_per_row = packing->RowLength; 471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach pixels_per_row = width; 474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->ImageHeight > 0) { 476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach rows_per_image = packing->ImageHeight; 477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach rows_per_image = height; 480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach skiprows = packing->SkipRows; 482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach skippixels = packing->SkipPixels; 483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach skipimages = packing->SkipImages; 484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (type==GL_BITMAP) { 486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* BITMAP data */ 487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint comp_per_pixel; /* components per pixel */ 488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint bytes_per_comp; /* bytes per component */ 489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint bytes_per_row; 490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint bytes_per_image; 491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* Compute bytes per component */ 493b7d076fc96ac27117421653a043d00a95f789d24Brian Paul bytes_per_comp = _mesa_sizeof_packed_type( type ); 494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (bytes_per_comp<0) { 495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return NULL; 496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* Compute number of components per pixel */ 499b7d076fc96ac27117421653a043d00a95f789d24Brian Paul comp_per_pixel = _mesa_components_in_format( format ); 500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (comp_per_pixel<0 && type != GL_BITMAP) { 501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return NULL; 502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_row = alignment 505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * CEILING( comp_per_pixel*pixels_per_row, 8*alignment ); 506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_image = bytes_per_row * rows_per_image; 508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach pixel_addr = (GLubyte *) image 510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skipimages + img) * bytes_per_image 511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skiprows + row) * bytes_per_row 512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skippixels + column) / 8; 513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* Non-BITMAP data */ 516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint bytes_per_pixel, bytes_per_row, remainder, bytes_per_image; 517551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul GLint topOfImage; 518afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 519b7d076fc96ac27117421653a043d00a95f789d24Brian Paul bytes_per_pixel = _mesa_bytes_per_pixel( format, type ); 520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* The pixel type and format should have been error checked earlier */ 522afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach assert(bytes_per_pixel > 0); 523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_row = pixels_per_row * bytes_per_pixel; 525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach remainder = bytes_per_row % alignment; 526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (remainder > 0) 527afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_row += (alignment - remainder); 528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 529afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ASSERT(bytes_per_row % alignment == 0); 530afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 531afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_image = bytes_per_row * rows_per_image; 532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 533551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul if (packing->Invert) { 534551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul /* set pixel_addr to the last row */ 535551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul topOfImage = bytes_per_row * (height - 1); 536551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul bytes_per_row = -bytes_per_row; 537551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul } 538551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul else { 539551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul topOfImage = 0; 540551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul } 541551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul 542afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* compute final pixel address */ 543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach pixel_addr = (GLubyte *) image 544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skipimages + img) * bytes_per_image 545551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul + topOfImage 546afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skiprows + row) * bytes_per_row 547afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skippixels + column) * bytes_per_pixel; 548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 550afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return (GLvoid *) pixel_addr; 551afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 5546dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 5556dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Compute the stride between image rows. 5566dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 5576dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param packing the pixelstore attributes 5586dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param width image width. 5596dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param format pixel format. 5606dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param type pixel data type. 5616dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 5626dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return the stride in bytes for the given parameters. 5636dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 5646dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Computes the number of bytes per pixel and row and compensates for alignment. 5656dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 5666dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa gl_pixelstore_attrib. 567ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul */ 568ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian PaulGLint 569ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul_mesa_image_row_stride( const struct gl_pixelstore_attrib *packing, 570ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul GLint width, GLenum format, GLenum type ) 571ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul{ 572ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul ASSERT(packing); 573ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul if (type == GL_BITMAP) { 574ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul /* BITMAP data */ 575551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul GLint bytes; 576ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul if (packing->RowLength == 0) { 577551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul bytes = (width + 7) / 8; 578ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 579ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul else { 580551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul bytes = (packing->RowLength + 7) / 8; 581551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul } 582551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul if (packing->Invert) { 583551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul /* negate the bytes per row (negative row stride) */ 584551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul bytes = -bytes; 585ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 586551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul return bytes; 587ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 588ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul else { 589ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul /* Non-BITMAP data */ 590b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type); 591fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul GLint bytesPerRow, remainder; 592ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul if (bytesPerPixel <= 0) 593ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul return -1; /* error */ 594ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul if (packing->RowLength == 0) { 595fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul bytesPerRow = bytesPerPixel * width; 596ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 597ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul else { 598fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul bytesPerRow = bytesPerPixel * packing->RowLength; 599ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 600fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul remainder = bytesPerRow % packing->Alignment; 601fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul if (remainder > 0) 602fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul bytesPerRow += (packing->Alignment - remainder); 603551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul if (packing->Invert) 604551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul bytesPerRow = -bytesPerRow; 605fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul return bytesPerRow; 606ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 607ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul} 608ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul 609ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul 6106dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell#if _HAVE_FULL_GL 611ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul 612ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul/* 613d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul * Compute the stride between images in a 3D texture (in bytes) for the given 614d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul * pixel packing parameters and image width, format and type. 615d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul */ 616d488af5b34e390a9b81dac96053bd45f34ffffffBrian PaulGLint 617d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul_mesa_image_image_stride( const struct gl_pixelstore_attrib *packing, 618d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul GLint width, GLint height, 619d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul GLenum format, GLenum type ) 620d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul{ 621d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul ASSERT(packing); 622d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul ASSERT(type != GL_BITMAP); 623d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul 624d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul { 625d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type); 626d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul GLint bytesPerRow, bytesPerImage, remainder; 627d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul 628d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul if (bytesPerPixel <= 0) 629d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul return -1; /* error */ 630d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul if (packing->RowLength == 0) { 631d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul bytesPerRow = bytesPerPixel * width; 632d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul } 633d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul else { 634d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul bytesPerRow = bytesPerPixel * packing->RowLength; 635d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul } 636d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul remainder = bytesPerRow % packing->Alignment; 637d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul if (remainder > 0) 638d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul bytesPerRow += (packing->Alignment - remainder); 639d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul 640d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul if (packing->ImageHeight == 0) 641d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul bytesPerImage = bytesPerRow * height; 642d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul else 643d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul bytesPerImage = bytesPerRow * packing->ImageHeight; 644d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul 645d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul return bytesPerImage; 646d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul } 647d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul} 648d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul 649d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul 650d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul/* 651afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Unpack a 32x32 pixel polygon stipple from user memory using the 652afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * current pixel unpack settings. 653afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 6547c652d77220610ecc19aaefa20876216b035e961Brian Paulvoid 6557c652d77220610ecc19aaefa20876216b035e961Brian Paul_mesa_unpack_polygon_stipple( const GLubyte *pattern, GLuint dest[32], 6567c652d77220610ecc19aaefa20876216b035e961Brian Paul const struct gl_pixelstore_attrib *unpacking ) 657afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 658959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul GLubyte *ptrn = (GLubyte *) _mesa_unpack_bitmap( 32, 32, pattern, unpacking ); 6597c652d77220610ecc19aaefa20876216b035e961Brian Paul if (ptrn) { 6607c652d77220610ecc19aaefa20876216b035e961Brian Paul /* Convert pattern from GLubytes to GLuints and handle big/little 6617c652d77220610ecc19aaefa20876216b035e961Brian Paul * endian differences 6627c652d77220610ecc19aaefa20876216b035e961Brian Paul */ 6637c652d77220610ecc19aaefa20876216b035e961Brian Paul GLubyte *p = ptrn; 6647c652d77220610ecc19aaefa20876216b035e961Brian Paul GLint i; 6657c652d77220610ecc19aaefa20876216b035e961Brian Paul for (i = 0; i < 32; i++) { 6667c652d77220610ecc19aaefa20876216b035e961Brian Paul dest[i] = (p[0] << 24) 6677c652d77220610ecc19aaefa20876216b035e961Brian Paul | (p[1] << 16) 6687c652d77220610ecc19aaefa20876216b035e961Brian Paul | (p[2] << 8) 6697c652d77220610ecc19aaefa20876216b035e961Brian Paul | (p[3] ); 6707c652d77220610ecc19aaefa20876216b035e961Brian Paul p += 4; 6717c652d77220610ecc19aaefa20876216b035e961Brian Paul } 6727c652d77220610ecc19aaefa20876216b035e961Brian Paul FREE(ptrn); 673afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 674afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 675afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 676afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 677afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 678fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Pack polygon stipple into user memory given current pixel packing 679fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * settings. 680afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 6817c652d77220610ecc19aaefa20876216b035e961Brian Paulvoid 6827c652d77220610ecc19aaefa20876216b035e961Brian Paul_mesa_pack_polygon_stipple( const GLuint pattern[32], GLubyte *dest, 6837c652d77220610ecc19aaefa20876216b035e961Brian Paul const struct gl_pixelstore_attrib *packing ) 684afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 6857c652d77220610ecc19aaefa20876216b035e961Brian Paul /* Convert pattern from GLuints to GLubytes to handle big/little 6867c652d77220610ecc19aaefa20876216b035e961Brian Paul * endian differences. 6877c652d77220610ecc19aaefa20876216b035e961Brian Paul */ 6887c652d77220610ecc19aaefa20876216b035e961Brian Paul GLubyte ptrn[32*4]; 689fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint i; 690fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < 32; i++) { 6917c652d77220610ecc19aaefa20876216b035e961Brian Paul ptrn[i * 4 + 0] = (GLubyte) ((pattern[i] >> 24) & 0xff); 6927c652d77220610ecc19aaefa20876216b035e961Brian Paul ptrn[i * 4 + 1] = (GLubyte) ((pattern[i] >> 16) & 0xff); 6937c652d77220610ecc19aaefa20876216b035e961Brian Paul ptrn[i * 4 + 2] = (GLubyte) ((pattern[i] >> 8 ) & 0xff); 6947c652d77220610ecc19aaefa20876216b035e961Brian Paul ptrn[i * 4 + 3] = (GLubyte) ((pattern[i] ) & 0xff); 695afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 6967c652d77220610ecc19aaefa20876216b035e961Brian Paul 6977c652d77220610ecc19aaefa20876216b035e961Brian Paul _mesa_pack_bitmap(32, 32, ptrn, dest, packing); 698afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 699afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 700afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 701699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul/* 702699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Unpack bitmap data. Resulting data will be in most-significant-bit-first 703699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * order with row alignment = 1 byte. 704699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul */ 705699bc7b73d2fede77d3290f66c1ec355afd0373eBrian PaulGLvoid * 706699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul_mesa_unpack_bitmap( GLint width, GLint height, const GLubyte *pixels, 707699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul const struct gl_pixelstore_attrib *packing ) 708699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul{ 709699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLint bytes, row, width_in_bytes; 710699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte *buffer, *dst; 711699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 712699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (!pixels) 713699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul return NULL; 714699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 715699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* Alloc dest storage */ 716699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul bytes = ((width + 7) / 8 * height); 717699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul buffer = (GLubyte *) MALLOC( bytes ); 718699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (!buffer) 719699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul return NULL; 720699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 721699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 722699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul width_in_bytes = CEILING( width, 8 ); 723699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dst = buffer; 724699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul for (row = 0; row < height; row++) { 725b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul const GLubyte *src = (const GLubyte *) 726b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul _mesa_image_address(packing, pixels, width, height, 727b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul GL_COLOR_INDEX, GL_BITMAP, 0, row, 0); 728699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (!src) { 729699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul FREE(buffer); 730699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul return NULL; 731699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 732699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 733699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (packing->SkipPixels == 0) { 734699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul MEMCPY( dst, src, width_in_bytes ); 735699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (packing->LsbFirst) { 736699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul flip_bytes( dst, width_in_bytes ); 737699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 738699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 739699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 740699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* handling SkipPixels is a bit tricky (no pun intended!) */ 741699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLint i; 742699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (packing->LsbFirst) { 743699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte srcMask = 1 << (packing->SkipPixels & 0x7); 744699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte dstMask = 128; 745b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul const GLubyte *s = src; 746699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte *d = dst; 747699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d = 0; 748699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul for (i = 0; i < width; i++) { 749699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (*s & srcMask) { 750699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d |= dstMask; 751699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 752699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (srcMask == 128) { 753699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul srcMask = 1; 754699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul s++; 755699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 756699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 757699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul srcMask = srcMask << 1; 758699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 759699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (dstMask == 1) { 760699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstMask = 128; 761699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul d++; 762699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d = 0; 763699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 764699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 765699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstMask = dstMask >> 1; 766699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 767699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 768699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 769699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 770699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7); 771699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte dstMask = 128; 772b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul const GLubyte *s = src; 773699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte *d = dst; 774699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d = 0; 775699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul for (i = 0; i < width; i++) { 776699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (*s & srcMask) { 777699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d |= dstMask; 778699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 779699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (srcMask == 1) { 780699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul srcMask = 128; 781699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul s++; 782699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 783699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 784699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul srcMask = srcMask >> 1; 785699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 786699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (dstMask == 1) { 787699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstMask = 128; 788699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul d++; 789699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d = 0; 790699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 791699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 792699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstMask = dstMask >> 1; 793699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 794699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 795699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 796699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 797699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dst += width_in_bytes; 798699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 799699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 800699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul return buffer; 801699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul} 802699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 803afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 804afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 805699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Pack bitmap data. 806afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 807b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid 808699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul_mesa_pack_bitmap( GLint width, GLint height, const GLubyte *source, 809699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte *dest, const struct gl_pixelstore_attrib *packing ) 810afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 811699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLint row, width_in_bytes; 812699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul const GLubyte *src; 813fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 814699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (!source) 815699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul return; 816699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 817699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul width_in_bytes = CEILING( width, 8 ); 818699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul src = source; 819699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul for (row = 0; row < height; row++) { 820b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul GLubyte *dst = (GLubyte *) _mesa_image_address( packing, dest, 821b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul width, height, GL_COLOR_INDEX, GL_BITMAP, 0, row, 0 ); 822699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (!dst) 823699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul return; 824699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 825699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (packing->SkipPixels == 0) { 826699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul MEMCPY( dst, src, width_in_bytes ); 827699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (packing->LsbFirst) { 828699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul flip_bytes( dst, width_in_bytes ); 829699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 8303428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul } 831699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 832699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* handling SkipPixels is a bit tricky (no pun intended!) */ 833699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLint i; 834699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (packing->LsbFirst) { 835699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte srcMask = 1 << (packing->SkipPixels & 0x7); 836699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte dstMask = 128; 837699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul const GLubyte *s = src; 838699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte *d = dst; 839699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d = 0; 840699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul for (i = 0; i < width; i++) { 841699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (*s & srcMask) { 842699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d |= dstMask; 843699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 844699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (srcMask == 128) { 845699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul srcMask = 1; 846699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul s++; 847699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 848699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 849699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul srcMask = srcMask << 1; 850699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 851699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (dstMask == 1) { 852699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstMask = 128; 853699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul d++; 854699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d = 0; 855699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 856699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 857699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstMask = dstMask >> 1; 858699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 859699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 860699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 861699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 862699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7); 863699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte dstMask = 128; 864699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul const GLubyte *s = src; 865699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte *d = dst; 866699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d = 0; 867699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul for (i = 0; i < width; i++) { 868699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (*s & srcMask) { 869699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d |= dstMask; 870699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 871699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (srcMask == 1) { 872699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul srcMask = 128; 873699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul s++; 874699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 875699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 876699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul srcMask = srcMask >> 1; 877699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 878699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (dstMask == 1) { 879699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstMask = 128; 880699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul d++; 881699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d = 0; 882699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 883699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 884699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstMask = dstMask >> 1; 885699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 886699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 887699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 889699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul src += width_in_bytes; 890116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 891116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul} 892afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 893116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul 894833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul/** 895833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul * Apply various pixel transfer operations to an array of RGBA pixels 896833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul * as indicated by the transferOps bitmask 897833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul */ 898833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paulvoid 899833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul_mesa_apply_rgba_transfer_ops(GLcontext *ctx, GLuint transferOps, 900833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul GLuint n, GLfloat rgba[][4]) 901833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul{ 902833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul /* scale & bias */ 903833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul if (transferOps & IMAGE_SCALE_BIAS_BIT) { 904833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul _mesa_scale_and_bias_rgba(ctx, n, rgba, 905833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul ctx->Pixel.RedScale, ctx->Pixel.GreenScale, 906833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul ctx->Pixel.BlueScale, ctx->Pixel.AlphaScale, 907833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul ctx->Pixel.RedBias, ctx->Pixel.GreenBias, 908833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul ctx->Pixel.BlueBias, ctx->Pixel.AlphaBias); 909833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul } 910833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul /* color map lookup */ 911833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul if (transferOps & IMAGE_MAP_COLOR_BIT) { 912833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul _mesa_map_rgba( ctx, n, rgba ); 913833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul } 914833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul /* GL_COLOR_TABLE lookup */ 915833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul if (transferOps & IMAGE_COLOR_TABLE_BIT) { 916833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul _mesa_lookup_rgba_float(&ctx->ColorTable, n, rgba); 917833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul } 918833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul /* convolution */ 919833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul if (transferOps & IMAGE_CONVOLUTION_BIT) { 920833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul /* this has to be done in the calling code */ 921833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul _mesa_problem(ctx, "IMAGE_CONVOLUTION_BIT set in _mesa_apply_transfer_ops"); 922833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul } 923833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */ 924833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul if (transferOps & IMAGE_POST_CONVOLUTION_SCALE_BIAS) { 925833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul _mesa_scale_and_bias_rgba(ctx, n, rgba, 926833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul ctx->Pixel.PostConvolutionScale[RCOMP], 927833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul ctx->Pixel.PostConvolutionScale[GCOMP], 928833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul ctx->Pixel.PostConvolutionScale[BCOMP], 929833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul ctx->Pixel.PostConvolutionScale[ACOMP], 930833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul ctx->Pixel.PostConvolutionBias[RCOMP], 931833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul ctx->Pixel.PostConvolutionBias[GCOMP], 932833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul ctx->Pixel.PostConvolutionBias[BCOMP], 933833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul ctx->Pixel.PostConvolutionBias[ACOMP]); 934833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul } 935833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */ 936833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul if (transferOps & IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT) { 937833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul _mesa_lookup_rgba_float(&ctx->PostConvolutionColorTable, n, rgba); 938833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul } 939833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul /* color matrix transform */ 940833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul if (transferOps & IMAGE_COLOR_MATRIX_BIT) { 941833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul _mesa_transform_rgba(ctx, n, rgba); 942833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul } 943833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */ 944833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul if (transferOps & IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT) { 945833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul _mesa_lookup_rgba_float(&ctx->PostColorMatrixColorTable, n, rgba); 946833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul } 947833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul /* update histogram count */ 948833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul if (transferOps & IMAGE_HISTOGRAM_BIT) { 949833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul _mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba); 950833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul } 951833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul /* update min/max values */ 952833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul if (transferOps & IMAGE_MIN_MAX_BIT) { 953833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul _mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba); 954833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul } 9554923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul /* clamping to [0,1] */ 956833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul if (transferOps & IMAGE_CLAMP_BIT) { 957833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul GLuint i; 958833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul for (i = 0; i < n; i++) { 959833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F); 960833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F); 961833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F); 962833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F); 963833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul } 964833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul } 965833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul} 966833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul 967833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul 968833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul 96996385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul/* 97096385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul * Used to pack an array [][4] of RGBA GLchan colors as specified 97196385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul * by the dstFormat, dstType and dstPacking. Used by glReadPixels, 97296385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul * glGetConvolutionFilter(), etc. 97396385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul */ 974116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paulvoid 9758cfd08b6134e2036ddceb1facfa82e15026068a2Brian Paul_mesa_pack_rgba_span_float( GLcontext *ctx, 976116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul GLuint n, CONST GLfloat rgbaIn[][4], 977b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLenum dstFormat, GLenum dstType, 978b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLvoid *dstAddr, 979b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul const struct gl_pixelstore_attrib *dstPacking, 980116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul GLuint transferOps ) 981116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul{ 982b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul const GLint comps = _mesa_components_in_format(dstFormat); 983116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul GLfloat luminance[MAX_WIDTH]; 98494f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul const GLfloat (*rgba)[4]; 985116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul GLuint i; 986116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul 987116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul if (transferOps) { 988116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* make copy of incoming data */ 98947cf442c1164b6b406117fccfb8b564602741ee3Brian Paul DEFMARRAY(GLfloat, rgbaCopy, MAX_WIDTH, 4); /* mac 32k limitation */ 99047cf442c1164b6b406117fccfb8b564602741ee3Brian Paul CHECKARRAY(rgbaCopy, return); /* mac 32k limitation */ 99147cf442c1164b6b406117fccfb8b564602741ee3Brian Paul 992833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul _mesa_memcpy(rgbaCopy, rgbaIn, n * 4 * sizeof(GLfloat)); 99394f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgbaCopy); 99494f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul rgba = (const GLfloat (*)[4]) rgbaCopy; 995833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul 996833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul if ((transferOps & IMAGE_MIN_MAX_BIT) && ctx->MinMax.Sink) { 997833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul UNDEFARRAY(rgbaCopy); /* mac 32k limitation */ 998833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul return; 999116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 100047cf442c1164b6b406117fccfb8b564602741ee3Brian Paul UNDEFARRAY(rgbaCopy); /* mac 32k limitation */ 1001116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1002116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul else { 1003116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* use incoming data, not a copy */ 100494f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul rgba = (const GLfloat (*)[4]) rgbaIn; 1005116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1006ef9025a641624991113b7df2eecdf7c8e330a31cBrian Paul 1007b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_LUMINANCE || dstFormat == GL_LUMINANCE_ALPHA) { 100894f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul /* compute luminance values */ 10094923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul if (ctx->ClampFragmentColors) { 10104923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul for (i = 0; i < n; i++) { 10114923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul GLfloat sum = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP]; 10124923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul luminance[i] = CLAMP(sum, 0.0F, 1.0F); 10134923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul } 10144923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul } 10154923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul else { 10164923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul for (i = 0; i < n; i++) { 10174923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul luminance[i] = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP]; 10184923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul } 1019afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1020116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1021afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1022116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* 1023116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul * Pack/store the pixels. Ugh! Lots of cases!!! 1024116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul */ 1025b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstType) { 1026116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_BYTE: 1027116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul { 1028b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLubyte *dst = (GLubyte *) dstAddr; 1029b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstFormat) { 1030116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RED: 1031116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1032116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1033116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1034116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_GREEN: 1035116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1036116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1037116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1038116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BLUE: 1039116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1040116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 1041116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1042116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ALPHA: 1043116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1044116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 1045116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1046116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE: 1047116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1048116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UBYTE(luminance[i]); 1049116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1050116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE_ALPHA: 1051116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1052116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+0] = FLOAT_TO_UBYTE(luminance[i]); 1053116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 1054116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1055116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1056116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGB: 1057116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1058116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1059116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1060116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 1061116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1062116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1063116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGBA: 1064116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1065116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1066116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1067116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 1068116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 1069116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1070116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1071116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGR: 1072116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1073116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 1074116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1075116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1076116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1077116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1078116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGRA: 1079116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1080116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 1081116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1082116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1083116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 1084116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1085116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1086116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ABGR_EXT: 1087116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1088116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 1089116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 1090116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1091116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1092116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1093116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1094116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 109508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1096116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1097116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1098116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1099116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BYTE: 1100116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul { 1101b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLbyte *dst = (GLbyte *) dstAddr; 1102b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstFormat) { 1103116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RED: 1104116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1105116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1106116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1107116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_GREEN: 1108116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1109116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1110116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1111116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BLUE: 1112116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1113116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1114116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1115116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ALPHA: 1116116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1117116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 1118116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1119116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE: 1120116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1121116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_BYTE(luminance[i]); 1122116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1123116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE_ALPHA: 1124116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1125116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+0] = FLOAT_TO_BYTE(luminance[i]); 1126116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 1127116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1128116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1129116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGB: 1130116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1131116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1132116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1133116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1134116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1135116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1136116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGBA: 1137116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1138116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1139116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1140116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1141116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 1142116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1143116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1144116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGR: 1145116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1146116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1147116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1148116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1149116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1150116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1151116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGRA: 1152116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1153116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1154116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1155116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1156116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 1157116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1158116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ABGR_EXT: 1159116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1160116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 1161116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1162116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1163116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1164116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1165116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1166116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 116708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1168116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1169116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1170116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1171116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_SHORT: 1172116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul { 1173b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLushort *dst = (GLushort *) dstAddr; 1174b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstFormat) { 1175116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RED: 1176116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1177116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 1178116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1179116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_GREEN: 1180116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1181116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1182116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1183116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BLUE: 1184116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1185116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 1186116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1187116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ALPHA: 1188116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1189116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_USHORT(rgba[i][ACOMP]); 1190116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1191116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE: 1192116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1193116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_USHORT(luminance[i]); 1194116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1195116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE_ALPHA: 1196116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1197116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+0] = FLOAT_TO_USHORT(luminance[i]); 1198116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+1] = FLOAT_TO_USHORT(rgba[i][ACOMP]); 1199116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1200116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1201116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGB: 1202116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1203116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 1204116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1205116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 1206116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1207116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1208116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGBA: 1209116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1210116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 1211116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1212116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 1213116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][ACOMP]); 1214116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1215116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1216116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGR: 1217116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1218116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 1219116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1220116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 1221116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1222116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1223116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGRA: 1224116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1225116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 1226116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1227116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 1228116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][ACOMP]); 1229116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1230116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1231116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ABGR_EXT: 1232116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1233116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][ACOMP]); 1234116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 1235116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1236116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 1237116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1238116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1239116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 124008836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1241116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1242b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstPacking->SwapBytes) { 1243116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_swap2( (GLushort *) dst, n * comps); 1244116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1245116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1246116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1247116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_SHORT: 1248116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul { 1249b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLshort *dst = (GLshort *) dstAddr; 1250b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstFormat) { 1251116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RED: 1252116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1253116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1254116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1255116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_GREEN: 1256116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1257116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1258116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1259116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BLUE: 1260116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1261116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1262116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1263116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ALPHA: 1264116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1265116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1266116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1267116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE: 1268116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1269116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_SHORT(luminance[i]); 1270116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1271116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE_ALPHA: 1272116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1273116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+0] = FLOAT_TO_SHORT(luminance[i]); 1274116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1275116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1276116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1277116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGB: 1278116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1279116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1280116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1281116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1282116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1283116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1284116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGBA: 1285116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1286116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1287116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1288116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1289116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1290116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1291116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1292116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGR: 1293116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1294116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1295116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1296116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1297116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1298116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1299116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGRA: 1300116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1301116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1302116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1303116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1304116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1305116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1306116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ABGR_EXT: 1307116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1308116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1309116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1310116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1311116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1312116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1313116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1314116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 131508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1316afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1317b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstPacking->SwapBytes) { 1318116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_swap2( (GLushort *) dst, n * comps ); 1319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1320116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1321116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1322116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_INT: 1323116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul { 1324b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1325b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstFormat) { 1326116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RED: 1327116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1328116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1329116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1330116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_GREEN: 1331116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1332116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1333116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1334116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BLUE: 1335116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1336116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1337116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1338116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ALPHA: 1339116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1340116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1341116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1342116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE: 1343116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1344116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UINT(luminance[i]); 1345116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1346116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE_ALPHA: 1347116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1348116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+0] = FLOAT_TO_UINT(luminance[i]); 1349116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+1] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1350116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1351116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1352116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGB: 1353116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1354116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1355116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1356116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1357116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1358116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1359116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGBA: 1360116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1361116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1362116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1363116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1364116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1365116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1366116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1367116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGR: 1368116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1369116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1370116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1371116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1372116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1373116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1374116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGRA: 1375116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1376116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1377116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1378116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1379116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1380116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1381116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1382116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ABGR_EXT: 1383116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1384116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1385116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1386116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1387116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1388116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1389116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1390116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 139108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1393b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstPacking->SwapBytes) { 1394116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_swap4( (GLuint *) dst, n * comps ); 1395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1396116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1397116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1398116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_INT: 1399116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul { 1400b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLint *dst = (GLint *) dstAddr; 1401b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstFormat) { 1402116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RED: 1403116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1404116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_INT(rgba[i][RCOMP]); 1405116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1406116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_GREEN: 1407116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1408116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_INT(rgba[i][GCOMP]); 1409116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1410116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BLUE: 1411116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1412116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_INT(rgba[i][BCOMP]); 1413116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1414116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ALPHA: 1415116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1416116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_INT(rgba[i][ACOMP]); 1417116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1418116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE: 1419116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1420116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_INT(luminance[i]); 1421116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1422116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE_ALPHA: 1423116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1424116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+0] = FLOAT_TO_INT(luminance[i]); 1425116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+1] = FLOAT_TO_INT(rgba[i][ACOMP]); 1426116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1427116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1428116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGB: 1429116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1430116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_INT(rgba[i][RCOMP]); 1431116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 1432116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_INT(rgba[i][BCOMP]); 1433116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1434116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1435116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGBA: 1436116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1437116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_INT(rgba[i][RCOMP]); 1438116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 1439116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_INT(rgba[i][BCOMP]); 1440116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]); 1441116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1442116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1443116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGR: 1444116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1445116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_INT(rgba[i][BCOMP]); 1446116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 1447116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_INT(rgba[i][RCOMP]); 1448116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1449116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1450116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGRA: 1451116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1452116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_INT(rgba[i][BCOMP]); 1453116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 1454116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_INT(rgba[i][RCOMP]); 1455116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]); 1456116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1457116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1458116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ABGR_EXT: 1459116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1460116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_INT(rgba[i][ACOMP]); 1461116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_INT(rgba[i][BCOMP]); 1462116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_INT(rgba[i][GCOMP]); 1463116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_INT(rgba[i][RCOMP]); 1464116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1465116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1466116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 146708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1469b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstPacking->SwapBytes) { 1470116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_swap4( (GLuint *) dst, n * comps ); 1471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1472116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1473116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1474116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_FLOAT: 1475116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul { 1476b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLfloat *dst = (GLfloat *) dstAddr; 1477b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstFormat) { 1478116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RED: 1479116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1480116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = rgba[i][RCOMP]; 1481116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1482116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_GREEN: 1483116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1484116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = rgba[i][GCOMP]; 1485116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1486116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BLUE: 1487116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1488116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = rgba[i][BCOMP]; 1489116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1490116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ALPHA: 1491116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1492116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = rgba[i][ACOMP]; 1493116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1494116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE: 1495116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1496116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = luminance[i]; 1497116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1498116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE_ALPHA: 1499116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1500116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+0] = luminance[i]; 1501116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+1] = rgba[i][ACOMP]; 1502116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1503116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1504116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGB: 1505116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1506116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = rgba[i][RCOMP]; 1507116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = rgba[i][GCOMP]; 1508116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = rgba[i][BCOMP]; 1509116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1510116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1511116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGBA: 1512116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1513116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = rgba[i][RCOMP]; 1514116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = rgba[i][GCOMP]; 1515116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = rgba[i][BCOMP]; 1516116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = rgba[i][ACOMP]; 1517116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1518116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1519116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGR: 1520116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1521116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = rgba[i][BCOMP]; 1522116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = rgba[i][GCOMP]; 1523116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = rgba[i][RCOMP]; 1524116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1525116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1526116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGRA: 1527116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1528116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = rgba[i][BCOMP]; 1529116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = rgba[i][GCOMP]; 1530116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = rgba[i][RCOMP]; 1531116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = rgba[i][ACOMP]; 1532116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1533116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1534116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ABGR_EXT: 1535116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1536116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = rgba[i][ACOMP]; 1537116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = rgba[i][BCOMP]; 1538116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = rgba[i][GCOMP]; 1539116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = rgba[i][RCOMP]; 1540116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1541116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1542116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 154308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1545b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstPacking->SwapBytes) { 1546116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_swap4( (GLuint *) dst, n * comps ); 1547afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1548116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1549116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 15507eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul case GL_HALF_FLOAT_NV: 15517eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul { 15527eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul GLhalfNV *dst = (GLhalfNV *) dstAddr; 15537eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul switch (dstFormat) { 15547eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul case GL_RED: 15557eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul for (i=0;i<n;i++) 15567eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i] = _mesa_float_to_half(rgba[i][RCOMP]); 15577eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul break; 15587eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul case GL_GREEN: 15597eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul for (i=0;i<n;i++) 15607eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i] = _mesa_float_to_half(rgba[i][GCOMP]); 15617eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul break; 15627eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul case GL_BLUE: 15637eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul for (i=0;i<n;i++) 15647eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i] = _mesa_float_to_half(rgba[i][BCOMP]); 15657eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul break; 15667eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul case GL_ALPHA: 15677eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul for (i=0;i<n;i++) 15687eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i] = _mesa_float_to_half(rgba[i][ACOMP]); 15697eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul break; 15707eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul case GL_LUMINANCE: 15717eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul for (i=0;i<n;i++) 15727eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i] = _mesa_float_to_half(luminance[i]); 15737eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul break; 15747eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul case GL_LUMINANCE_ALPHA: 15757eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul for (i=0;i<n;i++) { 15767eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*2+0] = _mesa_float_to_half(luminance[i]); 15777eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*2+1] = _mesa_float_to_half(rgba[i][ACOMP]); 15787eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 15797eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul break; 15807eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul case GL_RGB: 15817eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul for (i=0;i<n;i++) { 15827eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*3+0] = _mesa_float_to_half(rgba[i][RCOMP]); 15837eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]); 15847eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*3+2] = _mesa_float_to_half(rgba[i][BCOMP]); 15857eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 15867eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul break; 15877eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul case GL_RGBA: 15887eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul for (i=0;i<n;i++) { 15897eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*4+0] = _mesa_float_to_half(rgba[i][RCOMP]); 15907eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]); 15917eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*4+2] = _mesa_float_to_half(rgba[i][BCOMP]); 15927eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]); 15937eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 15947eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul break; 15957eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul case GL_BGR: 15967eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul for (i=0;i<n;i++) { 15977eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*3+0] = _mesa_float_to_half(rgba[i][BCOMP]); 15987eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]); 15997eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*3+2] = _mesa_float_to_half(rgba[i][RCOMP]); 16007eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 16017eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul break; 16027eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul case GL_BGRA: 16037eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul for (i=0;i<n;i++) { 16047eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*4+0] = _mesa_float_to_half(rgba[i][BCOMP]); 16057eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]); 16067eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*4+2] = _mesa_float_to_half(rgba[i][RCOMP]); 16077eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]); 16087eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 16097eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul break; 16107eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul case GL_ABGR_EXT: 16117eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul for (i=0;i<n;i++) { 16127eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*4+0] = _mesa_float_to_half(rgba[i][ACOMP]); 16137eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*4+1] = _mesa_float_to_half(rgba[i][BCOMP]); 16147eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*4+2] = _mesa_float_to_half(rgba[i][GCOMP]); 16157eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*4+3] = _mesa_float_to_half(rgba[i][RCOMP]); 16167eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 16177eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul break; 16187eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul default: 16197eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 16207eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 16217eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul if (dstPacking->SwapBytes) { 16227eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul _mesa_swap2( (GLushort *) dst, n * comps ); 16237eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 16247eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 16257eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul break; 1626116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_BYTE_3_3_2: 1627b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGB) { 1628b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLubyte *dst = (GLubyte *) dstAddr; 1629116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1630116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 7.0F)) << 5) 1631116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 7.0F)) << 2) 1632116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 3.0F)) ); 1633afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1634116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1635116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1636116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_BYTE_2_3_3_REV: 1637b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGB) { 1638b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLubyte *dst = (GLubyte *) dstAddr; 1639116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1640116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 7.0F)) ) 1641116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 7.0F)) << 3) 1642116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 3.0F)) << 5); 1643afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1644116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1645116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1646116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_SHORT_5_6_5: 1647b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGB) { 1648b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLushort *dst = (GLushort *) dstAddr; 1649116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1650116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) << 11) 1651116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 63.0F)) << 5) 1652116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 31.0F)) ); 1653afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1654116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1655116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1656116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_SHORT_5_6_5_REV: 1657b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGB) { 1658b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLushort *dst = (GLushort *) dstAddr; 1659116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1660116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) ) 1661116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 63.0F)) << 5) 1662116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 11); 1663afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1664116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1665116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1666116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_SHORT_4_4_4_4: 1667881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul if (dstFormat == GL_RGBA) { 1668b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLushort *dst = (GLushort *) dstAddr; 1669116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1670116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 15.0F)) << 12) 1671116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 8) 1672116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 15.0F)) << 4) 1673116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][ACOMP] * 15.0F)) ); 1674afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1675116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1676881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_BGRA) { 1677881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1678881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1679881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][BCOMP] * 15.0F)) << 12) 1680881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 8) 1681881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 15.0F)) << 4) 1682881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][ACOMP] * 15.0F)) ); 1683881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1684881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1685881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1686881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1687881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1688881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][ACOMP] * 15.0F)) << 4) 1689881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][BCOMP] * 15.0F)) << 8) 1690881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 12) 1691881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 15.0F)) ); 1692881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1693881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1694116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1695116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_SHORT_4_4_4_4_REV: 1696881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul if (dstFormat == GL_RGBA) { 1697b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLushort *dst = (GLushort *) dstAddr; 1698116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1699116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 15.0F)) ) 1700116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 4) 1701116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 15.0F)) << 8) 1702116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][ACOMP] * 15.0F)) << 12); 1703afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1704116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1705881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_BGRA) { 1706881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1707881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1708881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][BCOMP] * 15.0F)) ) 1709881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 4) 1710881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 15.0F)) << 8) 1711881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][ACOMP] * 15.0F)) << 12); 1712881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1713881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1714881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1715881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1716881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1717881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][ACOMP] * 15.0F)) ) 1718881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][BCOMP] * 15.0F)) << 4) 1719881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 8) 1720881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 15.0F)) << 12); 1721881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1722881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1723116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1724116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_SHORT_5_5_5_1: 1725881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul if (dstFormat == GL_RGBA) { 1726b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLushort *dst = (GLushort *) dstAddr; 1727116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1728116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) << 11) 1729116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 6) 1730116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 1) 1731116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][ACOMP] * 1.0F)) ); 1732afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1733116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1734881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_BGRA) { 1735881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1736881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1737881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][BCOMP] * 31.0F)) << 11) 1738881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 6) 1739881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 31.0F)) << 1) 1740881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][ACOMP] * 1.0F)) ); 1741881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1742881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1743881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1744881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1745881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1746881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][ACOMP] * 31.0F)) << 11) 1747881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 6) 1748881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 1) 1749881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 1.0F)) ); 1750881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1751881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1752116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1753116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_SHORT_1_5_5_5_REV: 1754881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul if (dstFormat == GL_RGBA) { 1755b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLushort *dst = (GLushort *) dstAddr; 1756116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1757116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) ) 1758116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 5) 1759116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 10) 1760116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][ACOMP] * 1.0F)) << 15); 1761afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1762116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1763881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_BGRA) { 1764881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1765881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1766881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][BCOMP] * 31.0F)) ) 1767881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 5) 1768881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 31.0F)) << 10) 1769881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][ACOMP] * 1.0F)) << 15); 1770881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1771881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1772881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1773881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1774881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1775881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][ACOMP] * 31.0F)) ) 1776881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 5) 1777881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 10) 1778881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 1.0F)) << 15); 1779881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1780881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1781116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1782116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_INT_8_8_8_8: 1783b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGBA) { 1784b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1785116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1786116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 24) 1787116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16) 1788116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 8) 1789116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 255.0F)) ); 1790afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1791116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1792b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_BGRA) { 1793b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1794116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1795116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 24) 1796116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16) 1797116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 8) 1798116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 255.0F)) ); 1799afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1800116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1801b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1802b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1803116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1804116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24) 1805116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 16) 1806116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 8) 1807116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 255.0F)) ); 1808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1809116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1810116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1811116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_INT_8_8_8_8_REV: 1812b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGBA) { 1813b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1814116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1815116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][RCOMP] * 255.0F)) ) 1816116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 8) 1817116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 16) 1818116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24); 1819afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1820116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1821b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_BGRA) { 1822b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1823116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1824116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][BCOMP] * 255.0F)) ) 1825116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 8) 1826116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 16) 1827116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24); 1828afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1829116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1830b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1831b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1832116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1833116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][ACOMP] * 255.0F)) ) 1834116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 8) 1835116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16) 1836116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 24); 1837afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1838116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1839116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1840116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_INT_10_10_10_2: 1841b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGBA) { 1842b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1843116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1844116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 22) 1845116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 12) 1846116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 2) 1847116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 3.0F)) ); 1848afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1849116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1850b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_BGRA) { 1851b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1852116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1853116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 22) 1854116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 12) 1855116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 2) 1856116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 3.0F)) ); 1857afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1858116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1859b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1860b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1861116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1862116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][ACOMP] * 1023.0F)) << 22) 1863116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 12) 1864116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 2) 1865116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 3.0F)) ); 1866116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1867116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1868116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1869116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_INT_2_10_10_10_REV: 1870b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGBA) { 1871b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1872116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1873116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][RCOMP] * 1023.0F)) ) 1874116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 10) 1875116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 20) 1876116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 3.0F)) << 30); 1877116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1878116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1879b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_BGRA) { 1880b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1881116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1882116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][BCOMP] * 1023.0F)) ) 1883116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 10) 1884116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 20) 1885116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 3.0F)) << 30); 1886116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1887116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1888b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1889b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1890116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1891116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][ACOMP] * 1023.0F)) ) 1892116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 10) 1893116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 20) 1894116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 3.0F)) << 30); 1895116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1896116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1897116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1898116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 18998cfd08b6134e2036ddceb1facfa82e15026068a2Brian Paul _mesa_problem(ctx, "bad type in _mesa_pack_rgba_span_float"); 1900afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1901afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 1902c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1903c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1904699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul/* 1905699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Pack the given RGBA span into client memory at 'dest' address 1906699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * in the given pixel format and type. 1907699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Optionally apply the enabled pixel transfer ops. 1908699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Pack into memory using the given packing params struct. 1909699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * This is used by glReadPixels and glGetTexImage?D() 19106dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx - the context 1911699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * n - number of pixels in the span 1912699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * rgba - the pixels 1913699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * format - dest packing format 19146dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * type - dest packing data type 1915699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * destination - destination packing address 1916699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * packing - pixel packing parameters 1917699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * transferOps - bitmask of IMAGE_*_BIT operations to apply 1918699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul */ 1919699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paulvoid 19208cfd08b6134e2036ddceb1facfa82e15026068a2Brian Paul_mesa_pack_rgba_span_chan( GLcontext *ctx, 1921833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul GLuint n, CONST GLchan srcRgba[][4], 1922833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul GLenum dstFormat, GLenum dstType, 1923833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul GLvoid *dstAddr, 1924833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul const struct gl_pixelstore_attrib *dstPacking, 1925833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul GLuint transferOps) 1926699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul{ 1927cc22179cd855dad85a28c40416873a07e8b7cc0cBrian Paul ASSERT((ctx->NewState & _NEW_PIXEL) == 0 || transferOps == 0); 1928699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 1929699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* Test for optimized case first */ 1930699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (transferOps == 0 && dstFormat == GL_RGBA && dstType == CHAN_TYPE) { 1931699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* common simple case */ 1932699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul MEMCPY(dstAddr, srcRgba, n * 4 * sizeof(GLchan)); 1933699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 1934699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else if (transferOps == 0 && dstFormat == GL_RGB && dstType == CHAN_TYPE) { 1935699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* common simple case */ 1936b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul GLuint i; 1937699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dest = (GLchan *) dstAddr; 1938699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul for (i = 0; i < n; i++) { 1939699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dest[0] = srcRgba[i][RCOMP]; 1940699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dest[1] = srcRgba[i][GCOMP]; 1941699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dest[2] = srcRgba[i][BCOMP]; 1942699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dest += 3; 1943699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 1944699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 1945aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul else if (transferOps == 0 && dstFormat == GL_RGBA && dstType == GL_UNSIGNED_BYTE) { 1946aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul /* common simple case */ 1947aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLuint i; 1948aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLubyte *dest = (GLubyte *) dstAddr; 1949aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul for (i = 0; i < n; i++) { 1950aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dest[0] = CHAN_TO_UBYTE(srcRgba[i][RCOMP]); 1951aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dest[1] = CHAN_TO_UBYTE(srcRgba[i][GCOMP]); 1952aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dest[2] = CHAN_TO_UBYTE(srcRgba[i][BCOMP]); 1953aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dest[3] = CHAN_TO_UBYTE(srcRgba[i][ACOMP]); 1954aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dest += 4; 1955aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 1956aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 1957699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 1958699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* general solution */ 1959699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLuint i; 196047cf442c1164b6b406117fccfb8b564602741ee3Brian Paul DEFMARRAY(GLfloat, rgba, MAX_WIDTH, 4); /* mac 32k limitation */ 196147cf442c1164b6b406117fccfb8b564602741ee3Brian Paul CHECKARRAY(rgba, return); /* mac 32k limitation */ 196247cf442c1164b6b406117fccfb8b564602741ee3Brian Paul 1963699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul assert(n <= MAX_WIDTH); 1964699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* convert color components to floating point */ 196594f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul for (i = 0; i < n; i++) { 1966699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul rgba[i][RCOMP] = CHAN_TO_FLOAT(srcRgba[i][RCOMP]); 1967699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul rgba[i][GCOMP] = CHAN_TO_FLOAT(srcRgba[i][GCOMP]); 1968699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul rgba[i][BCOMP] = CHAN_TO_FLOAT(srcRgba[i][BCOMP]); 1969699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul rgba[i][ACOMP] = CHAN_TO_FLOAT(srcRgba[i][ACOMP]); 1970699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 19718cfd08b6134e2036ddceb1facfa82e15026068a2Brian Paul _mesa_pack_rgba_span_float(ctx, n, (const GLfloat (*)[4]) rgba, 1972699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstFormat, dstType, dstAddr, 1973699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstPacking, transferOps); 197447cf442c1164b6b406117fccfb8b564602741ee3Brian Paul UNDEFARRAY(rgba); /* mac 32k limitation */ 1975699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 1976699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul} 1977699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 1978699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 1979c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define SWAP2BYTE(VALUE) \ 1980c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { \ 1981c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *bytes = (GLubyte *) &(VALUE); \ 1982c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte tmp = bytes[0]; \ 1983c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[0] = bytes[1]; \ 1984c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[1] = tmp; \ 1985c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1986c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1987c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define SWAP4BYTE(VALUE) \ 1988c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { \ 1989c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *bytes = (GLubyte *) &(VALUE); \ 1990c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte tmp = bytes[0]; \ 1991c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[0] = bytes[3]; \ 1992c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[3] = tmp; \ 1993c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul tmp = bytes[1]; \ 1994c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[1] = bytes[2]; \ 1995c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[2] = tmp; \ 1996c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1997c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1998c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1999c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic void 2000c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulextract_uint_indexes(GLuint n, GLuint indexes[], 2001c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum srcFormat, GLenum srcType, const GLvoid *src, 2002c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const struct gl_pixelstore_attrib *unpack ) 2003c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 2004c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(srcFormat == GL_COLOR_INDEX); 2005c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2006c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcType == GL_BITMAP || 2007c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_BYTE || 2008c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_BYTE || 2009c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT || 2010c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_SHORT || 2011c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT || 2012c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_INT || 20137eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul srcType == GL_HALF_FLOAT_NV || 2014c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_FLOAT); 2015c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2016c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul switch (srcType) { 2017c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BITMAP: 2018c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2019c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *ubsrc = (GLubyte *) src; 2020c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->LsbFirst) { 2021c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte mask = 1 << (unpack->SkipPixels & 0x7); 2022c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2023c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2024c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = (*ubsrc & mask) ? 1 : 0; 2025c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (mask == 128) { 2026c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul mask = 1; 2027c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ubsrc++; 2028c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2029c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2030c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul mask = mask << 1; 2031c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2032c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2033c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2034c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2035c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte mask = 128 >> (unpack->SkipPixels & 0x7); 2036c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2037c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2038c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = (*ubsrc & mask) ? 1 : 0; 2039c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (mask == 1) { 2040c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul mask = 128; 2041c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ubsrc++; 2042c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2043c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2044c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul mask = mask >> 1; 2045c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2046c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2047c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2048c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2049c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2050c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_BYTE: 2051c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2052c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2053c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLubyte *s = (const GLubyte *) src; 2054c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 2055c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 2056c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2057c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2058c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BYTE: 2059c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2060c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2061c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLbyte *s = (const GLbyte *) src; 2062c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 2063c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 2064c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2065c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2066c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT: 2067c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2068c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2069c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *s = (const GLushort *) src; 2070c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->SwapBytes) { 2071c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2072c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort value = s[i]; 2073c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(value); 2074c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = value; 2075c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2076c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2077c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2078c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 2079c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 2080c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2081c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2082c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2083c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_SHORT: 2084c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2085c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2086c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLshort *s = (const GLshort *) src; 2087c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->SwapBytes) { 2088c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2089c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLshort value = s[i]; 2090c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(value); 2091c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = value; 2092c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2093c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2094c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2095c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 2096c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 2097c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2098c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2099c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2100c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT: 2101c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2102c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2103c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *s = (const GLuint *) src; 2104c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->SwapBytes) { 2105c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2106c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint value = s[i]; 2107c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(value); 2108c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = value; 2109c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2110c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2111c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2112c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 2113c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 2114c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2115c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2116c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2117c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_INT: 2118c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2119c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2120c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLint *s = (const GLint *) src; 2121c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->SwapBytes) { 2122c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2123c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint value = s[i]; 2124c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(value); 2125c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = value; 2126c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2127c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2128c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2129c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 2130c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 2131c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2132c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2133c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2134c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_FLOAT: 2135c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2136c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2137c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLfloat *s = (const GLfloat *) src; 2138c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->SwapBytes) { 2139c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2140c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLfloat value = s[i]; 2141c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(value); 2142959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul indexes[i] = (GLuint) value; 2143c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2144c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2145c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2146c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 2147959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul indexes[i] = (GLuint) s[i]; 2148c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2149c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2150c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 21517eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul case GL_HALF_FLOAT_NV: 21527eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul { 21537eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul GLuint i; 21547eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul const GLhalfNV *s = (const GLhalfNV *) src; 21557eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul if (unpack->SwapBytes) { 21567eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul for (i = 0; i < n; i++) { 21577eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul GLhalfNV value = s[i]; 21587eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul SWAP2BYTE(value); 21597eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul indexes[i] = (GLuint) _mesa_half_to_float(value); 21607eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 21617eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 21627eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul else { 21637eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul for (i = 0; i < n; i++) 21647eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul indexes[i] = (GLuint) _mesa_half_to_float(s[i]); 21657eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 21667eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 21677eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul break; 2168c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul default: 216908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(NULL, "bad srcType in extract_uint_indexes"); 2170c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 2171c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2172c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 2173c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2174c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2175c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/* 2176c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This function extracts floating point RGBA values from arbitrary 2177c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * image data. srcFormat and srcType are the format and type parameters 2178c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc. 2179c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * 2180c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function 2181c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * implements the "Conversion to floating point", "Conversion to RGB", 2182c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * and "Final Expansion to RGBA" operations. 2183c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * 2184c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Args: n - number of pixels 2185c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * rgba - output colors 2186c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * srcFormat - format of incoming data 21876dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * srcType - data type of incoming data 2188c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * src - source data pointer 2189c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * swapBytes - perform byteswapping of incoming data? 2190c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 2191c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic void 2192c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulextract_float_rgba(GLuint n, GLfloat rgba[][4], 2193c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum srcFormat, GLenum srcType, const GLvoid *src, 2194c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLboolean swapBytes) 2195c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 2196c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint redIndex, greenIndex, blueIndex, alphaIndex; 2197c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint stride; 2198c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint rComp, bComp, gComp, aComp; 2199c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2200c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcFormat == GL_RED || 2201c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_GREEN || 2202c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BLUE || 2203c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_ALPHA || 2204c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_LUMINANCE || 2205c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_LUMINANCE_ALPHA || 2206c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_INTENSITY || 2207c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_RGB || 2208c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BGR || 2209c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_RGBA || 2210c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BGRA || 2211c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_ABGR_EXT); 2212c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2213c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcType == GL_UNSIGNED_BYTE || 2214c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_BYTE || 2215c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT || 2216c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_SHORT || 2217c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT || 2218c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_INT || 22197eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul srcType == GL_HALF_FLOAT_NV || 2220c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_FLOAT || 2221c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_BYTE_3_3_2 || 2222a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 2223a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_5_6_5 || 2224a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 2225c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 2226a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 2227c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 2228a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 2229c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT_8_8_8_8 || 2230a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 2231a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_10_10_10_2 || 2232a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_2_10_10_10_REV); 2233c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2234a0020435f58baef6a67d3c073b62ea6b1d143af1Brian Paul rComp = gComp = bComp = aComp = -1; 2235a0020435f58baef6a67d3c073b62ea6b1d143af1Brian Paul 2236c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul switch (srcFormat) { 2237c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_RED: 2238c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 0; 2239c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = blueIndex = alphaIndex = -1; 2240c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 2241c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2242c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_GREEN: 2243c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 0; 2244c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = blueIndex = alphaIndex = -1; 2245c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 2246c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2247c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BLUE: 2248c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 0; 2249c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = greenIndex = alphaIndex = -1; 2250c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 2251c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2252c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_ALPHA: 2253c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = greenIndex = blueIndex = -1; 2254c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = 0; 2255c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 2256c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 22575e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen case GL_LUMINANCE: 2258c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = greenIndex = blueIndex = 0; 2259c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = -1; 2260c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 2261c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2262c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_LUMINANCE_ALPHA: 2263c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = greenIndex = blueIndex = 0; 2264c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = 1; 2265c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 2; 2266c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2267c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_INTENSITY: 226801429fa46a05cba7d2d11825facd7d8e6117dacdBrian Paul redIndex = greenIndex = blueIndex = alphaIndex = 0; 2269c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 2270c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2271c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_RGB: 2272c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 0; 2273c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 1; 2274c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 2; 2275c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = -1; 2276c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 3; 2277c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2278c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BGR: 2279c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 2; 2280c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 1; 2281c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 0; 2282c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = -1; 2283c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 3; 2284c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2285c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_RGBA: 2286c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 0; 2287c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 1; 2288c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 2; 2289c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = 3; 2290c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rComp = 0; 2291c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gComp = 1; 2292c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bComp = 2; 2293c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul aComp = 3; 2294c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 4; 2295c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2296c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BGRA: 2297c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 2; 2298c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 1; 2299c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 0; 2300c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = 3; 2301c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rComp = 2; 2302c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gComp = 1; 2303c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bComp = 0; 2304c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul aComp = 3; 2305c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 4; 2306c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2307c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_ABGR_EXT: 2308c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 3; 2309c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 2; 2310c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 1; 2311c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = 0; 2312c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rComp = 3; 2313c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gComp = 2; 2314c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bComp = 1; 2315c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul aComp = 0; 2316c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 4; 2317c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2318c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul default: 231908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(NULL, "bad srcFormat in extract float data"); 2320c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 2321c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2322c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2323c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2324c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define PROCESS(INDEX, CHANNEL, DEFAULT, TYPE, CONVERSION) \ 2325c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if ((INDEX) < 0) { \ 2326c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; \ 2327c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { \ 2328c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][CHANNEL] = DEFAULT; \ 2329c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 2330c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 2331c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (swapBytes) { \ 2332c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const TYPE *s = (const TYPE *) src; \ 2333c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; \ 2334c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { \ 2335c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul TYPE value = s[INDEX]; \ 2336c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (sizeof(TYPE) == 2) { \ 2337c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(value); \ 2338c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 2339c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (sizeof(TYPE) == 4) { \ 2340c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(value); \ 2341c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 2342c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][CHANNEL] = (GLfloat) CONVERSION(value); \ 2343c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul s += stride; \ 2344c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 2345c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 2346c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { \ 2347c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const TYPE *s = (const TYPE *) src; \ 2348c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; \ 2349c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { \ 2350c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][CHANNEL] = (GLfloat) CONVERSION(s[INDEX]); \ 2351c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul s += stride; \ 2352c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 2353c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2354c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2355c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul switch (srcType) { 2356c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_BYTE: 2357c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT); 2358c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT); 2359c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT); 2360c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLubyte, UBYTE_TO_FLOAT); 2361c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2362c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BYTE: 2363c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT); 2364c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT); 2365c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT); 2366c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLbyte, BYTE_TO_FLOAT); 2367c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2368c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT: 2369c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLushort, USHORT_TO_FLOAT); 2370c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLushort, USHORT_TO_FLOAT); 2371c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLushort, USHORT_TO_FLOAT); 2372c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLushort, USHORT_TO_FLOAT); 2373c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2374c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_SHORT: 2375c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLshort, SHORT_TO_FLOAT); 2376c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLshort, SHORT_TO_FLOAT); 2377c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLshort, SHORT_TO_FLOAT); 2378c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLshort, SHORT_TO_FLOAT); 2379c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2380c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT: 2381c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLuint, UINT_TO_FLOAT); 2382c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLuint, UINT_TO_FLOAT); 2383c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLuint, UINT_TO_FLOAT); 2384c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLuint, UINT_TO_FLOAT); 2385c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2386c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_INT: 2387c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLint, INT_TO_FLOAT); 2388c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLint, INT_TO_FLOAT); 2389c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLint, INT_TO_FLOAT); 2390c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLint, INT_TO_FLOAT); 2391c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2392c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_FLOAT: 2393c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLfloat, (GLfloat)); 2394c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLfloat, (GLfloat)); 2395c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLfloat, (GLfloat)); 2396c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLfloat, (GLfloat)); 2397c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 23987eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul case GL_HALF_FLOAT_NV: 23997eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLhalfNV, _mesa_half_to_float); 24007eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLhalfNV, _mesa_half_to_float); 24017eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLhalfNV, _mesa_half_to_float); 24027eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLhalfNV, _mesa_half_to_float); 24037eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul break; 2404c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_BYTE_3_3_2: 2405c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2406c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLubyte *ubsrc = (const GLubyte *) src; 2407c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2408c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2409c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte p = ubsrc[i]; 2410c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p >> 5) ) * (1.0F / 7.0F); 2411c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 2) & 0x7) * (1.0F / 7.0F); 2412c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p ) & 0x3) * (1.0F / 3.0F); 2413c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 2414c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2415c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2416c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2417c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_BYTE_2_3_3_REV: 2418c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2419c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLubyte *ubsrc = (const GLubyte *) src; 2420c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2421c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2422c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte p = ubsrc[i]; 2423c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p ) & 0x7) * (1.0F / 7.0F); 2424c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 3) & 0x7) * (1.0F / 7.0F); 2425c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p >> 6) ) * (1.0F / 3.0F); 2426c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 2427c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2428c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2429c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2430c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_5_6_5: 2431c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2432c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2433c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2434c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2435c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2436c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 2437c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p >> 11) ) * (1.0F / 31.0F); 2438c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 5) & 0x3f) * (1.0F / 63.0F); 2439c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p ) & 0x1f) * (1.0F / 31.0F); 2440c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 2441c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2442c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2443c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2444c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2445c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2446c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2447c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2448c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p >> 11) ) * (1.0F / 31.0F); 2449c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 5) & 0x3f) * (1.0F / 63.0F); 2450c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p ) & 0x1f) * (1.0F / 31.0F); 2451c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 2452c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2453c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2454c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2455c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_5_6_5_REV: 2456c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2457c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2458c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2459c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2460c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2461c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 2462c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p ) & 0x1f) * (1.0F / 31.0F); 2463c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 5) & 0x3f) * (1.0F / 63.0F); 2464c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p >> 11) ) * (1.0F / 31.0F); 2465c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 2466c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2467c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2468c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2469c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2470c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2471c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2472c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2473c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p ) & 0x1f) * (1.0F / 31.0F); 2474c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 5) & 0x3f) * (1.0F / 63.0F); 2475c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p >> 11) ) * (1.0F / 31.0F); 2476c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 2477c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2478c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2479c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2480c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_4_4_4_4: 2481c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2482c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2483c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2484c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2485c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2486c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 2487c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p >> 12) ) * (1.0F / 15.0F); 2488c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F); 2489c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F); 2490c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p ) & 0xf) * (1.0F / 15.0F); 2491c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2492c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2493c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2494c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2495c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2496c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2497c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2498c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p >> 12) ) * (1.0F / 15.0F); 2499c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F); 2500c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F); 2501c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p ) & 0xf) * (1.0F / 15.0F); 2502c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2503c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2504c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2505c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_4_4_4_4_REV: 2506c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2507c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2508c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2509c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2510c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2511c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 2512c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0xf) * (1.0F / 15.0F); 2513c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F); 2514c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F); 2515c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 12) ) * (1.0F / 15.0F); 2516c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2517c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2518c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2519c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2520c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2521c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2522c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2523c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0xf) * (1.0F / 15.0F); 2524c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F); 2525c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F); 2526c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 12) ) * (1.0F / 15.0F); 2527c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2528c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2529c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2530c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_5_5_5_1: 2531c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2532c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2533c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2534c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2535c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2536c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 2537c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p >> 11) ) * (1.0F / 31.0F); 2538c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 6) & 0x1f) * (1.0F / 31.0F); 2539c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 1) & 0x1f) * (1.0F / 31.0F); 2540c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p ) & 0x1) * (1.0F / 1.0F); 2541c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2542c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2543c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2544c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2545c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2546c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2547c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2548c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p >> 11) ) * (1.0F / 31.0F); 2549c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 6) & 0x1f) * (1.0F / 31.0F); 2550c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 1) & 0x1f) * (1.0F / 31.0F); 2551c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p ) & 0x1) * (1.0F / 1.0F); 2552c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2553c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2554c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2555c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_1_5_5_5_REV: 2556c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2557c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2558c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2559c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2560c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2561c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 2562c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0x1f) * (1.0F / 31.0F); 2563c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 5) & 0x1f) * (1.0F / 31.0F); 2564c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F); 2565c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 15) ) * (1.0F / 1.0F); 2566c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2567c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2568c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2569c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2570c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2571c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2572c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2573c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0x1f) * (1.0F / 31.0F); 2574c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 5) & 0x1f) * (1.0F / 31.0F); 2575c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F); 2576c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 15) ) * (1.0F / 1.0F); 2577c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2578c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2579c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2580c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT_8_8_8_8: 2581c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2582c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2583c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2584c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2585c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 25863041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][rComp] = UBYTE_TO_FLOAT((p ) & 0xff); 25873041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 25883041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 25893041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][aComp] = UBYTE_TO_FLOAT((p >> 24) ); 2590c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2591c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2592c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2593c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2594c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2595c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2596c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 25973041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][rComp] = UBYTE_TO_FLOAT((p >> 24) ); 25983041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 25993041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 26003041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][aComp] = UBYTE_TO_FLOAT((p ) & 0xff); 2601c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2602c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2603c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2604c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT_8_8_8_8_REV: 2605c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2606c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2607c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2608c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2609c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 26103041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][rComp] = UBYTE_TO_FLOAT((p >> 24) ); 26113041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 26123041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 26133041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][aComp] = UBYTE_TO_FLOAT((p ) & 0xff); 2614c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2615c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2616c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2617c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2618c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2619c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2620c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 26213041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][rComp] = UBYTE_TO_FLOAT((p ) & 0xff); 26223041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 26233041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 26243041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][aComp] = UBYTE_TO_FLOAT((p >> 24) ); 2625c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2626c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2627c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2628c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT_10_10_10_2: 2629c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2630c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2631c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2632c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2633c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 2634c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(p); 2635a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][rComp] = ((p >> 22) ) * (1.0F / 1023.0F); 2636a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F); 2637a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][bComp] = ((p >> 2) & 0x3ff) * (1.0F / 1023.0F); 2638a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][aComp] = ((p ) & 0x3 ) * (1.0F / 3.0F); 2639c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2640c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2641c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2642c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2643c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2644c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2645c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 2646a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][rComp] = ((p >> 22) ) * (1.0F / 1023.0F); 2647a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F); 2648a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][bComp] = ((p >> 2) & 0x3ff) * (1.0F / 1023.0F); 2649a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][aComp] = ((p ) & 0x3 ) * (1.0F / 3.0F); 2650c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2651c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2652c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2653c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT_2_10_10_10_REV: 2654c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2655c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2656c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2657c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2658c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 2659c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(p); 2660c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0x3ff) * (1.0F / 1023.0F); 2661c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F); 2662c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F); 2663c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 30) ) * (1.0F / 3.0F); 2664c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2665c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2666c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2667c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2668c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2669c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2670c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 2671c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0x3ff) * (1.0F / 1023.0F); 2672c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F); 2673c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F); 2674c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 30) ) * (1.0F / 3.0F); 2675c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2676c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2677c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2678c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul default: 267908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(NULL, "bad srcType in extract float data"); 2680c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2681c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2682c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 2683c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2684c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2685c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/* 2686c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack a row of color image data from a client buffer according to 2687fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * the pixel unpacking parameters. 268894f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul * Return GLchan values in the specified dest image format. 268994f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul * This is used by glDrawPixels and glTexImage?D(). 26906dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx - the context 2691c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * n - number of pixels in the span 2692c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * dstFormat - format of destination color array 2693c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * dest - the destination color array 2694c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * srcFormat - source image format 26956dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * srcType - source image data type 2696c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * source - source image pointer 2697b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul * srcPacking - pixel unpacking parameters 2698fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * transferOps - bitmask of IMAGE_*_BIT values of operations to apply 2699c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * 2700c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * XXX perhaps expand this to process whole images someday. 2701c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 2702c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid 27038cfd08b6134e2036ddceb1facfa82e15026068a2Brian Paul_mesa_unpack_color_span_chan( GLcontext *ctx, 2704699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLuint n, GLenum dstFormat, GLchan dest[], 2705699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLenum srcFormat, GLenum srcType, 2706699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul const GLvoid *source, 2707699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul const struct gl_pixelstore_attrib *srcPacking, 2708699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLuint transferOps ) 2709c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 2710c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(dstFormat == GL_ALPHA || 27115e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen dstFormat == GL_LUMINANCE || 2712c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_LUMINANCE_ALPHA || 2713c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_INTENSITY || 2714c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_RGB || 2715c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_RGBA || 2716c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_COLOR_INDEX); 2717c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2718c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcFormat == GL_RED || 2719c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_GREEN || 2720c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BLUE || 2721c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_ALPHA || 2722c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_LUMINANCE || 2723c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_LUMINANCE_ALPHA || 2724c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_INTENSITY || 2725c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_RGB || 2726c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BGR || 2727c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_RGBA || 2728c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BGRA || 2729c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_ABGR_EXT || 2730c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_COLOR_INDEX); 2731c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2732c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcType == GL_BITMAP || 2733c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_BYTE || 2734c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_BYTE || 2735c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT || 2736c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_SHORT || 2737c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT || 2738c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_INT || 27397eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul srcType == GL_HALF_FLOAT_NV || 2740c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_FLOAT || 2741c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_BYTE_3_3_2 || 2742a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 2743a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_5_6_5 || 2744a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 2745c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 2746a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 2747c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 2748a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 2749c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT_8_8_8_8 || 2750a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 2751a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_10_10_10_2 || 2752a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_2_10_10_10_REV); 2753c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2754c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Try simple cases first */ 2755aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul if (transferOps == 0 ){ 2756aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul if (srcType == CHAN_TYPE) { 2757aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul if (dstFormat == GL_RGBA) { 2758aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul if (srcFormat == GL_RGBA) { 2759aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul MEMCPY( dest, source, n * 4 * sizeof(GLchan) ); 2760aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul return; 2761aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2762aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul else if (srcFormat == GL_RGB) { 2763aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLuint i; 2764aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul const GLchan *src = (const GLchan *) source; 2765aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLchan *dst = dest; 2766aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul for (i = 0; i < n; i++) { 2767aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[0] = src[0]; 2768aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[1] = src[1]; 2769aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[2] = src[2]; 2770aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[3] = CHAN_MAX; 2771aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul src += 3; 2772aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst += 4; 2773aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2774aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul return; 2775aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2776c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2777aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul else if (dstFormat == GL_RGB) { 2778aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul if (srcFormat == GL_RGB) { 2779aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul MEMCPY( dest, source, n * 3 * sizeof(GLchan) ); 2780aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul return; 2781aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2782aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul else if (srcFormat == GL_RGBA) { 2783aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLuint i; 2784aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul const GLchan *src = (const GLchan *) source; 2785aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLchan *dst = dest; 2786aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul for (i = 0; i < n; i++) { 2787aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[0] = src[0]; 2788aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[1] = src[1]; 2789aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[2] = src[2]; 2790aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul src += 4; 2791aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst += 3; 2792aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2793aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul return; 2794c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2795aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2796aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul else if (dstFormat == srcFormat) { 2797aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLint comps = _mesa_components_in_format(srcFormat); 2798aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul assert(comps > 0); 2799aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul MEMCPY( dest, source, n * comps * sizeof(GLchan) ); 2800c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 2801c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2802c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2803aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul /* 2804aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul * Common situation, loading 8bit RGBA/RGB source images 2805aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul * into 16/32 bit destination. (OSMesa16/32) 2806aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul */ 2807aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul else if (srcType == GL_UNSIGNED_BYTE) { 2808aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul if (dstFormat == GL_RGBA) { 2809aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul if (srcFormat == GL_RGB) { 2810aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLuint i; 2811aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul const GLubyte *src = (const GLubyte *) source; 2812aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLchan *dst = dest; 2813aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul for (i = 0; i < n; i++) { 2814aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[0] = UBYTE_TO_CHAN(src[0]); 2815aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[1] = UBYTE_TO_CHAN(src[1]); 2816aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[2] = UBYTE_TO_CHAN(src[2]); 2817aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[3] = CHAN_MAX; 2818aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul src += 3; 2819aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst += 4; 2820aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2821aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul return; 2822aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2823aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul else if (srcFormat == GL_RGBA) { 2824aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLuint i; 2825aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul const GLubyte *src = (const GLubyte *) source; 2826aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLchan *dst = dest; 2827aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul for (i = 0; i < n; i++) { 2828aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[0] = UBYTE_TO_CHAN(src[0]); 2829aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[1] = UBYTE_TO_CHAN(src[1]); 2830aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[2] = UBYTE_TO_CHAN(src[2]); 2831aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[3] = UBYTE_TO_CHAN(src[3]); 2832aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul src += 4; 2833aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst += 4; 2834aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2835aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul return; 2836aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2837c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2838aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul else if (dstFormat == GL_RGB) { 2839aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul if (srcFormat == GL_RGB) { 2840aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLuint i; 2841aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul const GLubyte *src = (const GLubyte *) source; 2842aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLchan *dst = dest; 2843aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul for (i = 0; i < n; i++) { 2844aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[0] = UBYTE_TO_CHAN(src[0]); 2845aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[1] = UBYTE_TO_CHAN(src[1]); 2846aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[2] = UBYTE_TO_CHAN(src[2]); 2847aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul src += 3; 2848aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst += 3; 2849aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2850aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul return; 2851aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2852aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul else if (srcFormat == GL_RGBA) { 2853aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLuint i; 2854aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul const GLubyte *src = (const GLubyte *) source; 2855aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLchan *dst = dest; 2856aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul for (i = 0; i < n; i++) { 2857aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[0] = UBYTE_TO_CHAN(src[0]); 2858aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[1] = UBYTE_TO_CHAN(src[1]); 2859aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[2] = UBYTE_TO_CHAN(src[2]); 2860aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul src += 4; 2861aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst += 3; 2862aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2863aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul return; 2864c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2865c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2866c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2867c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2868c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2869c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2870179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul /* general solution begins here */ 2871c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2872c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint dstComponents; 2873c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint dstRedIndex, dstGreenIndex, dstBlueIndex, dstAlphaIndex; 2874c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint dstLuminanceIndex, dstIntensityIndex; 287547cf442c1164b6b406117fccfb8b564602741ee3Brian Paul DEFMARRAY(GLfloat, rgba, MAX_WIDTH, 4); /* mac 32k limitation */ 287647cf442c1164b6b406117fccfb8b564602741ee3Brian Paul CHECKARRAY(rgba, return); /* mac 32k limitation */ 2877c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2878b7d076fc96ac27117421653a043d00a95f789d24Brian Paul dstComponents = _mesa_components_in_format( dstFormat ); 2879c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* source & dest image formats should have been error checked by now */ 2880c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(dstComponents > 0); 2881c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2882c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* 2883c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Extract image data and convert to RGBA floats 2884c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 2885c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(n <= MAX_WIDTH); 2886c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (srcFormat == GL_COLOR_INDEX) { 2887c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint indexes[MAX_WIDTH]; 2888c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul extract_uint_indexes(n, indexes, srcFormat, srcType, source, 2889b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul srcPacking); 2890c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2891fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul if (dstFormat == GL_COLOR_INDEX 2892fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul && (transferOps & IMAGE_MAP_COLOR_BIT)) { 2893fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul _mesa_map_ci(ctx, n, indexes); 2894fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul } 2895fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 2896fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul _mesa_shift_and_offset_ci(ctx, n, indexes); 2897c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2898c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2899c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstFormat == GL_COLOR_INDEX) { 2900699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* convert to GLchan and return */ 2901c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 2902c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 2903699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dest[i] = (GLchan) (indexes[i] & 0xff); 2904c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 290547cf442c1164b6b406117fccfb8b564602741ee3Brian Paul UNDEFARRAY(rgba); /* mac 32k limitation */ 2906c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul return; 2907c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2908c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2909c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Convert indexes to RGBA */ 2910179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul _mesa_map_ci_to_rgba(ctx, n, indexes, rgba); 2911c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2912833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul 2913833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting 2914833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul * with color indexes. 2915833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul */ 2916833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul transferOps &= ~(IMAGE_SCALE_BIAS_BIT | IMAGE_MAP_COLOR_BIT); 2917c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2918c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2919833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul /* non-color index data */ 2920c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul extract_float_rgba(n, rgba, srcFormat, srcType, source, 2921b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul srcPacking->SwapBytes); 2922c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2923c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 29244923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul /* Need to clamp if returning GLubytes or GLushorts */ 292596385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul#if CHAN_TYPE != GL_FLOAT 2926833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul transferOps |= IMAGE_CLAMP_BIT; 292796385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul#endif 2928c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2929833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul if (transferOps) { 2930833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba); 2931833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul } 2932833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul 2933c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Now determine which color channels we need to produce. 2934c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * And determine the dest index (offset) within each color tuple. 2935c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 2936c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul switch (dstFormat) { 2937c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_ALPHA: 2938c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstAlphaIndex = 0; 2939c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = -1; 2940c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstLuminanceIndex = dstIntensityIndex = -1; 2941c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 29425e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen case GL_LUMINANCE: 2943c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstLuminanceIndex = 0; 2944c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1; 2945c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstIntensityIndex = -1; 2946c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2947c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_LUMINANCE_ALPHA: 2948c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstLuminanceIndex = 0; 2949c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstAlphaIndex = 1; 2950c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = -1; 2951c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstIntensityIndex = -1; 2952c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2953c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_INTENSITY: 2954c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstIntensityIndex = 0; 2955c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1; 2956c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstLuminanceIndex = -1; 2957c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2958c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_RGB: 2959c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = 0; 2960c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstGreenIndex = 1; 2961c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstBlueIndex = 2; 2962c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1; 2963c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2964c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_RGBA: 2965c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = 0; 2966c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstGreenIndex = 1; 2967c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstBlueIndex = 2; 2968c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstAlphaIndex = 3; 2969c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstLuminanceIndex = dstIntensityIndex = -1; 2970c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2971c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul default: 297208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad dstFormat in _mesa_unpack_chan_span()"); 297347cf442c1164b6b406117fccfb8b564602741ee3Brian Paul UNDEFARRAY(rgba); /* mac 32k limitation */ 2974276988ec96a48d4ee5c28c0a2da3aa2b5ee0bbeaBrian Paul return; 2975c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2976c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2977c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2978699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* Now return the GLchan data in the requested dstFormat */ 2979fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2980c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstRedIndex >= 0) { 2981699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dst = dest; 2982c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2983c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 29846532db986883ea1a431c043126de4947465834a1Brian Paul CLAMPED_FLOAT_TO_CHAN(dst[dstRedIndex], rgba[i][RCOMP]); 2985c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += dstComponents; 2986c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2987c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2988c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2989c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstGreenIndex >= 0) { 2990699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dst = dest; 2991c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2992c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 29936532db986883ea1a431c043126de4947465834a1Brian Paul CLAMPED_FLOAT_TO_CHAN(dst[dstGreenIndex], rgba[i][GCOMP]); 2994c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += dstComponents; 2995c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2996c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2997c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2998c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstBlueIndex >= 0) { 2999699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dst = dest; 3000c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 3001c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 30026532db986883ea1a431c043126de4947465834a1Brian Paul CLAMPED_FLOAT_TO_CHAN(dst[dstBlueIndex], rgba[i][BCOMP]); 3003c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += dstComponents; 3004c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3005c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3006c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3007c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstAlphaIndex >= 0) { 3008699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dst = dest; 3009c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 3010c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 30116532db986883ea1a431c043126de4947465834a1Brian Paul CLAMPED_FLOAT_TO_CHAN(dst[dstAlphaIndex], rgba[i][ACOMP]); 3012c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += dstComponents; 3013c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3014c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3015c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3016c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstIntensityIndex >= 0) { 3017699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dst = dest; 3018c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 3019c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(dstIntensityIndex == 0); 3020c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(dstComponents == 1); 3021c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 3022c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Intensity comes from red channel */ 30236532db986883ea1a431c043126de4947465834a1Brian Paul CLAMPED_FLOAT_TO_CHAN(dst[i], rgba[i][RCOMP]); 3024c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3025c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3026c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3027c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstLuminanceIndex >= 0) { 3028699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dst = dest; 3029c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 3030c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(dstLuminanceIndex == 0); 3031c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 3032c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Luminance comes from red channel */ 30336532db986883ea1a431c043126de4947465834a1Brian Paul CLAMPED_FLOAT_TO_CHAN(dst[0], rgba[i][RCOMP]); 3034c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += dstComponents; 3035c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3036c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 303747cf442c1164b6b406117fccfb8b564602741ee3Brian Paul UNDEFARRAY(rgba); /* mac 32k limitation */ 3038c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3039c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 3040c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3041c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 304294f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul/** 304394f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul * Same as _mesa_unpack_color_span_chan(), but return GLfloat data 304494f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul * instead of GLchan. 304594f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul */ 3046c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paulvoid 30478cfd08b6134e2036ddceb1facfa82e15026068a2Brian Paul_mesa_unpack_color_span_float( GLcontext *ctx, 3048c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint n, GLenum dstFormat, GLfloat dest[], 3049c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLenum srcFormat, GLenum srcType, 3050c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul const GLvoid *source, 3051b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul const struct gl_pixelstore_attrib *srcPacking, 30524923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul GLuint transferOps ) 3053c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul{ 3054c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul ASSERT(dstFormat == GL_ALPHA || 30555e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen dstFormat == GL_LUMINANCE || 3056c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstFormat == GL_LUMINANCE_ALPHA || 3057c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstFormat == GL_INTENSITY || 3058c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstFormat == GL_RGB || 3059c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstFormat == GL_RGBA || 3060c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstFormat == GL_COLOR_INDEX); 3061c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3062c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul ASSERT(srcFormat == GL_RED || 3063c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_GREEN || 3064c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_BLUE || 3065c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_ALPHA || 3066c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_LUMINANCE || 3067c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_LUMINANCE_ALPHA || 3068c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_INTENSITY || 3069c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_RGB || 3070c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_BGR || 3071c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_RGBA || 3072c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_BGRA || 3073c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_ABGR_EXT || 3074c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_COLOR_INDEX); 3075c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3076c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul ASSERT(srcType == GL_BITMAP || 3077c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_BYTE || 3078c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_BYTE || 3079c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT || 3080c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_SHORT || 3081c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_INT || 3082c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_INT || 30837eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul srcType == GL_HALF_FLOAT_NV || 3084c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_FLOAT || 3085c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_BYTE_3_3_2 || 3086c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 3087c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT_5_6_5 || 3088c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 3089c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 3090c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 3091c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 3092c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 3093c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_INT_8_8_8_8 || 3094c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 3095c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_INT_10_10_10_2 || 3096c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_INT_2_10_10_10_REV); 3097c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3098c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* general solution, no special cases, yet */ 3099c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul { 3100c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLint dstComponents; 3101c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLint dstRedIndex, dstGreenIndex, dstBlueIndex, dstAlphaIndex; 3102c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLint dstLuminanceIndex, dstIntensityIndex; 310347cf442c1164b6b406117fccfb8b564602741ee3Brian Paul DEFMARRAY(GLfloat, rgba, MAX_WIDTH, 4); /* mac 32k limitation */ 310447cf442c1164b6b406117fccfb8b564602741ee3Brian Paul CHECKARRAY(rgba, return); /* mac 32k limitation */ 3105c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3106c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstComponents = _mesa_components_in_format( dstFormat ); 3107c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* source & dest image formats should have been error checked by now */ 3108c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul assert(dstComponents > 0); 3109c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3110c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* 3111c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul * Extract image data and convert to RGBA floats 3112c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul */ 3113c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul assert(n <= MAX_WIDTH); 3114c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (srcFormat == GL_COLOR_INDEX) { 3115c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint indexes[MAX_WIDTH]; 3116c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul extract_uint_indexes(n, indexes, srcFormat, srcType, source, 3117b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul srcPacking); 3118c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3119fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul if (dstFormat == GL_COLOR_INDEX 3120fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul && (transferOps & IMAGE_MAP_COLOR_BIT)) { 3121fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul _mesa_map_ci(ctx, n, indexes); 3122fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul } 3123fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 3124fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul _mesa_shift_and_offset_ci(ctx, n, indexes); 3125c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3126c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3127c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstFormat == GL_COLOR_INDEX) { 3128699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* convert to GLchan and return */ 3129c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 3130c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 3131699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dest[i] = (GLchan) (indexes[i] & 0xff); 3132c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 313347cf442c1164b6b406117fccfb8b564602741ee3Brian Paul UNDEFARRAY(rgba); /* mac 32k limitation */ 3134c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul return; 3135c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3136c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul else { 3137c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* Convert indexes to RGBA */ 3138c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_map_ci_to_rgba(ctx, n, indexes, rgba); 3139c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3140833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul 3141833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting 3142833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul * with color indexes. 3143833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul */ 3144833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul transferOps &= ~(IMAGE_SCALE_BIAS_BIT | IMAGE_MAP_COLOR_BIT); 3145c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3146c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul else { 3147833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul /* non-color index data */ 3148c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul extract_float_rgba(n, rgba, srcFormat, srcType, source, 3149b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul srcPacking->SwapBytes); 3150c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3151c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3152833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul if (transferOps) { 3153833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba); 3154833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul } 3155833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul 3156c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* Now determine which color channels we need to produce. 3157c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul * And determine the dest index (offset) within each color tuple. 3158c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul */ 3159c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul switch (dstFormat) { 3160c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul case GL_ALPHA: 3161c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstAlphaIndex = 0; 3162c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = -1; 3163c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstLuminanceIndex = dstIntensityIndex = -1; 3164c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul break; 31655e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen case GL_LUMINANCE: 3166c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstLuminanceIndex = 0; 3167c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1; 3168c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstIntensityIndex = -1; 3169c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul break; 3170c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul case GL_LUMINANCE_ALPHA: 3171c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstLuminanceIndex = 0; 3172c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstAlphaIndex = 1; 3173c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = -1; 3174c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstIntensityIndex = -1; 3175c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul break; 3176c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul case GL_INTENSITY: 3177c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstIntensityIndex = 0; 3178c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1; 3179c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstLuminanceIndex = -1; 3180c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul break; 3181c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul case GL_RGB: 3182c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstRedIndex = 0; 3183c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstGreenIndex = 1; 3184c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstBlueIndex = 2; 3185c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1; 3186c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul break; 3187c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul case GL_RGBA: 3188c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstRedIndex = 0; 3189c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstGreenIndex = 1; 3190c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstBlueIndex = 2; 3191c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstAlphaIndex = 3; 3192c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstLuminanceIndex = dstIntensityIndex = -1; 3193c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul break; 3194c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul default: 31958cfd08b6134e2036ddceb1facfa82e15026068a2Brian Paul _mesa_problem(ctx, "bad dstFormat in _mesa_unpack_color_span_float()"); 319647cf442c1164b6b406117fccfb8b564602741ee3Brian Paul UNDEFARRAY(rgba); /* mac 32k limitation */ 3197c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul return; 3198c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3199c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3200fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* Now pack results in the requested dstFormat */ 3201c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstRedIndex >= 0) { 3202c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat *dst = dest; 3203c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 3204c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 3205c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst[dstRedIndex] = rgba[i][RCOMP]; 3206c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst += dstComponents; 3207c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3208c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3209c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3210c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstGreenIndex >= 0) { 3211c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat *dst = dest; 3212c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 3213c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 3214c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst[dstGreenIndex] = rgba[i][GCOMP]; 3215c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst += dstComponents; 3216c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3217c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3218c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3219c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstBlueIndex >= 0) { 3220c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat *dst = dest; 3221c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 3222c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 3223c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst[dstBlueIndex] = rgba[i][BCOMP]; 3224c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst += dstComponents; 3225c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3226c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3227c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3228c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstAlphaIndex >= 0) { 3229c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat *dst = dest; 3230c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 3231c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 3232c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst[dstAlphaIndex] = rgba[i][ACOMP]; 3233c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst += dstComponents; 3234c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3235c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3236c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3237c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstIntensityIndex >= 0) { 3238c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat *dst = dest; 3239c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 3240c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul assert(dstIntensityIndex == 0); 3241c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul assert(dstComponents == 1); 3242c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 3243c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* Intensity comes from red channel */ 3244c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst[i] = rgba[i][RCOMP]; 3245c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3246c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3247c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3248c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstLuminanceIndex >= 0) { 3249c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat *dst = dest; 3250c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 3251c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul assert(dstLuminanceIndex == 0); 3252c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 3253c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* Luminance comes from red channel */ 3254c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst[0] = rgba[i][RCOMP]; 3255c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst += dstComponents; 3256c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3257c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 325847cf442c1164b6b406117fccfb8b564602741ee3Brian Paul UNDEFARRAY(rgba); /* mac 32k limitation */ 3259c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3260c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul} 3261c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3262c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3263c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/* 3264c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack a row of color index data from a client buffer according to 3265fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * the pixel unpacking parameters. 3266c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc. 3267c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * 3268c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Args: ctx - the context 3269c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * n - number of pixels 32706dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * dstType - destination data type 3271c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * dest - destination array 3272c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * srcType - source pixel type 3273c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * source - source data pointer 3274b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul * srcPacking - pixel unpacking parameters 3275fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * transferOps - the pixel transfer operations to apply 3276c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 3277c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid 3278c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul_mesa_unpack_index_span( const GLcontext *ctx, GLuint n, 3279c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum dstType, GLvoid *dest, 3280c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum srcType, const GLvoid *source, 3281b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul const struct gl_pixelstore_attrib *srcPacking, 3282fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul GLuint transferOps ) 3283c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 3284c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcType == GL_BITMAP || 3285c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_BYTE || 3286c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_BYTE || 3287c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT || 3288c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_SHORT || 3289c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT || 3290c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_INT || 32917eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul srcType == GL_HALF_FLOAT_NV || 3292c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_FLOAT); 3293c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3294c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(dstType == GL_UNSIGNED_BYTE || 3295c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstType == GL_UNSIGNED_SHORT || 3296c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstType == GL_UNSIGNED_INT); 3297c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3298fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul 3299fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT); 3300c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3301c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* 3302c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Try simple cases first 3303c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 3304fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps == 0 && srcType == GL_UNSIGNED_BYTE 3305c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul && dstType == GL_UNSIGNED_BYTE) { 3306c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul MEMCPY(dest, source, n * sizeof(GLubyte)); 3307c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3308fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul else if (transferOps == 0 && srcType == GL_UNSIGNED_INT 3309b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul && dstType == GL_UNSIGNED_INT && !srcPacking->SwapBytes) { 3310c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul MEMCPY(dest, source, n * sizeof(GLuint)); 3311c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3312c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 3313c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* 3314c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * general solution 3315c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 3316c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint indexes[MAX_WIDTH]; 3317c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(n <= MAX_WIDTH); 3318c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3319c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source, 3320b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul srcPacking); 3321c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3322fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 3323fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* shift and offset indexes */ 3324fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul _mesa_shift_and_offset_ci(ctx, n, indexes); 3325fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul } 3326fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_MAP_COLOR_BIT) { 3327fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* Apply lookup table */ 3328fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul _mesa_map_ci(ctx, n, indexes); 3329c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3330c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3331c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* convert to dest type */ 3332c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul switch (dstType) { 3333c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_BYTE: 3334c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 3335c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dst = (GLubyte *) dest; 3336c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 3337c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 3338c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[i] = (GLubyte) (indexes[i] & 0xff); 3339c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3340c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3341c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 3342c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT: 3343c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 3344c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint *dst = (GLuint *) dest; 3345c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 3346c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 3347c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[i] = (GLushort) (indexes[i] & 0xffff); 3348c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3349c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3350c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 3351c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT: 3352c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul MEMCPY(dest, indexes, n * sizeof(GLuint)); 3353c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 3354c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul default: 335508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad dstType in _mesa_unpack_index_span"); 3356c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3357c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3358c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 3359c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3360c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 336123e8d46e072669e0974d7b2c168d4770183106bdBrian Paulvoid 336223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul_mesa_pack_index_span( const GLcontext *ctx, GLuint n, 336323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLenum dstType, GLvoid *dest, const GLuint *source, 336423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul const struct gl_pixelstore_attrib *dstPacking, 336523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint transferOps ) 336623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul{ 336723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint indexes[MAX_WIDTH]; 336823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 336923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul ASSERT(n <= MAX_WIDTH); 337023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 337123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT); 337223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 337323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (transferOps & (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT)) { 337423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul /* make a copy of input */ 337523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul MEMCPY(indexes, source, n * sizeof(GLuint)); 337623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 337723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_shift_and_offset_ci( ctx, n, indexes); 337823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 337923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (transferOps & IMAGE_MAP_COLOR_BIT) { 338023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_map_ci(ctx, n, indexes); 338123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 338223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul source = indexes; 338323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 338423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 338523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul switch (dstType) { 338623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_UNSIGNED_BYTE: 338723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 338823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLubyte *dst = (GLubyte *) dest; 338923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 339023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 339123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul *dst++ = (GLubyte) source[i]; 339223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 339323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 339423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 339523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_BYTE: 339623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 339723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLbyte *dst = (GLbyte *) dest; 339823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 339923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 3400a51f07d5a148705c1c118dece1630972753ca349Brian Paul dst[i] = (GLbyte) source[i]; 340123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 340223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 340323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 340423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_UNSIGNED_SHORT: 340523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 340623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLushort *dst = (GLushort *) dest; 340723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 340823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 3409a51f07d5a148705c1c118dece1630972753ca349Brian Paul dst[i] = (GLushort) source[i]; 341023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 341123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 341223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap2( (GLushort *) dst, n ); 341323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 341423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 341523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 341623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_SHORT: 341723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 341823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLshort *dst = (GLshort *) dest; 341923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 342023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 3421a51f07d5a148705c1c118dece1630972753ca349Brian Paul dst[i] = (GLshort) source[i]; 342223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 342323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 342423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap2( (GLushort *) dst, n ); 342523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 342623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 342723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 342823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_UNSIGNED_INT: 342923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 343023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint *dst = (GLuint *) dest; 343123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 343223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 3433a51f07d5a148705c1c118dece1630972753ca349Brian Paul dst[i] = (GLuint) source[i]; 343423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 343523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 343623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap4( (GLuint *) dst, n ); 343723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 343823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 343923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 344023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_INT: 344123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 344223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLint *dst = (GLint *) dest; 344323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 344423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 3445a51f07d5a148705c1c118dece1630972753ca349Brian Paul dst[i] = (GLint) source[i]; 344623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 344723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 344823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap4( (GLuint *) dst, n ); 344923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 345023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 345123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 345223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_FLOAT: 345323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 345423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLfloat *dst = (GLfloat *) dest; 345523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 345623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 3457a51f07d5a148705c1c118dece1630972753ca349Brian Paul dst[i] = (GLfloat) source[i]; 345823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 345923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 346023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap4( (GLuint *) dst, n ); 346123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 346223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 346323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 34647eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul case GL_HALF_FLOAT_NV: 34657eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul { 34667eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul GLhalfNV *dst = (GLhalfNV *) dest; 34677eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul GLuint i; 34687eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul for (i = 0; i < n; i++) { 34697eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i] = _mesa_float_to_half((GLfloat) source[i]); 34707eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 34717eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul if (dstPacking->SwapBytes) { 34727eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul _mesa_swap2( (GLushort *) dst, n ); 34737eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 34747eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 34757eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul break; 347623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul default: 347708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad type in _mesa_pack_index_span"); 347823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 347923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul} 348023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 348123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 3482c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/* 3483fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Unpack a row of stencil data from a client buffer according to 3484fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * the pixel unpacking parameters. 3485fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * This is (or will be) used by glDrawPixels 3486fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * 3487fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Args: ctx - the context 3488fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * n - number of pixels 34896dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * dstType - destination data type 3490fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * dest - destination array 3491fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * srcType - source pixel type 3492fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * source - source data pointer 3493b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul * srcPacking - pixel unpacking parameters 3494fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * transferOps - apply offset/bias/lookup ops? 3495fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */ 3496fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid 3497fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_unpack_stencil_span( const GLcontext *ctx, GLuint n, 3498fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLenum dstType, GLvoid *dest, 3499fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLenum srcType, const GLvoid *source, 3500b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul const struct gl_pixelstore_attrib *srcPacking, 3501fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul GLuint transferOps ) 3502fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{ 3503fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul ASSERT(srcType == GL_BITMAP || 3504fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_UNSIGNED_BYTE || 3505fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_BYTE || 3506fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_UNSIGNED_SHORT || 3507fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_SHORT || 3508fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_UNSIGNED_INT || 3509fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_INT || 35107eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul srcType == GL_HALF_FLOAT_NV || 3511fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_FLOAT); 3512fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3513fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul ASSERT(dstType == GL_UNSIGNED_BYTE || 3514fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dstType == GL_UNSIGNED_SHORT || 3515fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dstType == GL_UNSIGNED_INT); 3516fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3517fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* only shift and offset apply to stencil */ 3518fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul transferOps &= IMAGE_SHIFT_OFFSET_BIT; 3519fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3520fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* 3521fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Try simple cases first 3522fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */ 3523fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps == 0 && 3524fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul srcType == GL_UNSIGNED_BYTE && 3525fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul dstType == GL_UNSIGNED_BYTE) { 3526fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul MEMCPY(dest, source, n * sizeof(GLubyte)); 3527fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3528fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul else if (transferOps == 0 && 3529fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul srcType == GL_UNSIGNED_INT && 3530fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul dstType == GL_UNSIGNED_INT && 3531b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul !srcPacking->SwapBytes) { 3532fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul MEMCPY(dest, source, n * sizeof(GLuint)); 3533fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3534fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul else { 3535fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* 3536fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * general solution 3537fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */ 3538fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint indexes[MAX_WIDTH]; 3539fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul assert(n <= MAX_WIDTH); 3540fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3541fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source, 3542b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul srcPacking); 3543fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3544fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps) { 3545fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 3546fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* shift and offset indexes */ 3547179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul _mesa_shift_and_offset_ci(ctx, n, indexes); 3548fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3549fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3550fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (ctx->Pixel.MapStencilFlag) { 3551fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* Apply stencil lookup table */ 3552fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint mask = ctx->Pixel.MapStoSsize - 1; 3553fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3554fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i=0;i<n;i++) { 3555fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul indexes[i] = ctx->Pixel.MapStoS[ indexes[i] & mask ]; 3556fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3557fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3558fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3559fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3560fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* convert to dest type */ 3561fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul switch (dstType) { 3562fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_BYTE: 3563fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3564fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLubyte *dst = (GLubyte *) dest; 3565fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3566fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3567fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dst[i] = (GLubyte) (indexes[i] & 0xff); 3568fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3569fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3570fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3571fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_SHORT: 3572fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3573fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint *dst = (GLuint *) dest; 3574fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3575fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3576fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dst[i] = (GLushort) (indexes[i] & 0xffff); 3577fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3578fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3579fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3580fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_INT: 3581fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul MEMCPY(dest, indexes, n * sizeof(GLuint)); 3582fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3583fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul default: 358408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad dstType in _mesa_unpack_stencil_span"); 3585fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3586fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3587fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 3588fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3589fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 359023e8d46e072669e0974d7b2c168d4770183106bdBrian Paulvoid 359123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul_mesa_pack_stencil_span( const GLcontext *ctx, GLuint n, 359223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLenum dstType, GLvoid *dest, const GLstencil *source, 359323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul const struct gl_pixelstore_attrib *dstPacking ) 359423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul{ 359523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLstencil stencil[MAX_WIDTH]; 359623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 359723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul ASSERT(n <= MAX_WIDTH); 359823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 359923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset || 360023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul ctx->Pixel.MapStencilFlag) { 360123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul /* make a copy of input */ 360223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul MEMCPY(stencil, source, n * sizeof(GLstencil)); 360323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset) { 360423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_shift_and_offset_stencil( ctx, n, stencil ); 360523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 360623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (ctx->Pixel.MapStencilFlag) { 360723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_map_stencil( ctx, n, stencil ); 360823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 360923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul source = stencil; 361023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 361123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 361223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul switch (dstType) { 361323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_UNSIGNED_BYTE: 361423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (sizeof(GLstencil) == 8) { 361523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul MEMCPY( dest, source, n ); 361623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 361723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul else { 361823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLubyte *dst = (GLubyte *) dest; 361923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 362023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i=0;i<n;i++) { 362123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = (GLubyte) source[i]; 362223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 362323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 362423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 362523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_BYTE: 362623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (sizeof(GLstencil) == 8) { 362723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul MEMCPY( dest, source, n ); 362823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 362923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul else { 363023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLbyte *dst = (GLbyte *) dest; 363123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 363223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i=0;i<n;i++) { 363323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = (GLbyte) source[i]; 363423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 363523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 363623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 363723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_UNSIGNED_SHORT: 363823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 363923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLushort *dst = (GLushort *) dest; 364023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 364123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i=0;i<n;i++) { 364223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = (GLushort) source[i]; 364323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 364423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 364523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap2( (GLushort *) dst, n ); 364623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 364723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 364823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 364923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_SHORT: 365023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 365123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLshort *dst = (GLshort *) dest; 365223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 365323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i=0;i<n;i++) { 365423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = (GLshort) source[i]; 365523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 365623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 365723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap2( (GLushort *) dst, n ); 365823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 365923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 366023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 366123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_UNSIGNED_INT: 366223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 366323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint *dst = (GLuint *) dest; 366423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 366523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i=0;i<n;i++) { 366623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = (GLuint) source[i]; 366723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 366823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 366923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap4( (GLuint *) dst, n ); 367023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 367123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 367223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 367323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_INT: 367423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 367523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLint *dst = (GLint *) dest; 367623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 367723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i=0;i<n;i++) { 367823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul *dst++ = (GLint) source[i]; 367923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 368023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 368123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap4( (GLuint *) dst, n ); 368223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 368323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 368423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 368523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_FLOAT: 368623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 368723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLfloat *dst = (GLfloat *) dest; 368823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 368923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i=0;i<n;i++) { 369023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = (GLfloat) source[i]; 369123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 369223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 369323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap4( (GLuint *) dst, n ); 369423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 369523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 369623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 36977eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul case GL_HALF_FLOAT_NV: 36987eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul { 36997eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul GLhalfNV *dst = (GLhalfNV *) dest; 37007eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul GLuint i; 37017eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul for (i=0;i<n;i++) { 37022c9f50dd4acc65ddfeb8e3fde98137711167e579Brian Paul dst[i] = _mesa_float_to_half( (float) source[i] ); 37037eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 37047eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul if (dstPacking->SwapBytes) { 37057eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul _mesa_swap2( (GLushort *) dst, n ); 37067eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 37077eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 37087eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul break; 370923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_BITMAP: 371023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->LsbFirst) { 371123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLubyte *dst = (GLubyte *) dest; 371223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLint shift = 0; 371323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 371423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 371523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (shift == 0) 371623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul *dst = 0; 371723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul *dst |= ((source[i] != 0) << shift); 371823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul shift++; 371923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (shift == 8) { 372023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul shift = 0; 372123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst++; 372223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 372323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 372423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 372523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul else { 372623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLubyte *dst = (GLubyte *) dest; 372723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLint shift = 7; 372823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 372923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 373023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (shift == 7) 373123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul *dst = 0; 373223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul *dst |= ((source[i] != 0) << shift); 373323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul shift--; 373423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (shift < 0) { 373523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul shift = 7; 373623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst++; 373723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 373823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 373923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 374023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 374123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul default: 374208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad type in _mesa_pack_index_span"); 374323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 374423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul} 374523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 374623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 3747fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid 3748e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul_mesa_unpack_depth_span( const GLcontext *ctx, GLuint n, GLfloat *dest, 3749fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLenum srcType, const GLvoid *source, 3750e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul const struct gl_pixelstore_attrib *srcPacking ) 3751fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{ 3752fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul switch (srcType) { 3753fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_BYTE: 3754fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3755fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3756fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLubyte *src = (const GLubyte *) source; 3757fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3758e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul dest[i] = BYTE_TO_FLOAT(src[i]); 3759fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3760fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3761fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3762fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_BYTE: 3763fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3764fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3765fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLubyte *src = (const GLubyte *) source; 3766fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3767e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul dest[i] = UBYTE_TO_FLOAT(src[i]); 3768fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3769fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3770fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3771fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_SHORT: 3772fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3773fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3774fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLshort *src = (const GLshort *) source; 3775fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3776e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul dest[i] = SHORT_TO_FLOAT(src[i]); 3777fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3778fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3779fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3780fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_SHORT: 3781fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3782fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3783fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLushort *src = (const GLushort *) source; 3784fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3785e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul dest[i] = USHORT_TO_FLOAT(src[i]); 3786fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3787fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3788fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3789fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_INT: 3790fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3791fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3792fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLint *src = (const GLint *) source; 3793fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3794e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul dest[i] = INT_TO_FLOAT(src[i]); 3795fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3796fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3797fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3798fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_INT: 3799fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3800fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3801fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLuint *src = (const GLuint *) source; 3802fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3803e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul dest[i] = UINT_TO_FLOAT(src[i]); 3804fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3805fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3806fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3807fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_FLOAT: 3808e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul MEMCPY(dest, source, n * sizeof(GLfloat)); 3809fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 38107eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul case GL_HALF_FLOAT_NV: 38117eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul { 38127eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul GLuint i; 38137eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul const GLhalfNV *src = (const GLhalfNV *) source; 38147eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul for (i = 0; i < n; i++) { 38157eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dest[i] = _mesa_half_to_float(src[i]); 38167eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 38177eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 38187eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul break; 3819fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul default: 382008836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(NULL, "bad type in _mesa_unpack_depth_span()"); 3821fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return; 3822fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3823fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3824fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3825e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul /* apply depth scale and bias and clamp to [0,1] */ 3826fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) { 3827fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3828fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3829e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul GLfloat d = dest[i] * ctx->Pixel.DepthScale + ctx->Pixel.DepthBias; 3830e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul dest[i] = CLAMP(d, 0.0F, 1.0F); 3831fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3832fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3833fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 3834fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3835fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3836fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul/* 383723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul * Pack an array of depth values. The values are floats in [0,1]. 383823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul */ 383923e8d46e072669e0974d7b2c168d4770183106bdBrian Paulvoid 3840b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul_mesa_pack_depth_span( const GLcontext *ctx, GLuint n, GLvoid *dest, 384123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLenum dstType, const GLfloat *depthSpan, 384223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul const struct gl_pixelstore_attrib *dstPacking ) 384323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul{ 384423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLfloat depthCopy[MAX_WIDTH]; 384523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul const GLboolean bias_or_scale = ctx->Pixel.DepthBias != 0.0 || 384623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul ctx->Pixel.DepthScale != 1.0; 384723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 384823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul ASSERT(n <= MAX_WIDTH); 384923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 385023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (bias_or_scale) { 385123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 385223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 385323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLfloat d; 385423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul d = depthSpan[i] * ctx->Pixel.DepthScale + ctx->Pixel.DepthBias; 385523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul depthCopy[i] = CLAMP(d, 0.0F, 1.0F); 385623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 385723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul depthSpan = depthCopy; 385823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 385923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 386023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul switch (dstType) { 386123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_UNSIGNED_BYTE: 386223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 386323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLubyte *dst = (GLubyte *) dest; 386423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 386523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 386623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = FLOAT_TO_UBYTE( depthSpan[i] ); 386723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 386823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 386923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 387023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_BYTE: 387123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 387223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLbyte *dst = (GLbyte *) dest; 387323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 387423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 387523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = FLOAT_TO_BYTE( depthSpan[i] ); 387623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 387723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 387823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 387923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_UNSIGNED_SHORT: 388023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 388123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLushort *dst = (GLushort *) dest; 388223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 388323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 388423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = FLOAT_TO_USHORT( depthSpan[i] ); 388523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 388623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 388723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap2( (GLushort *) dst, n ); 388823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 388923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 389023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 389123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_SHORT: 389223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 389323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLshort *dst = (GLshort *) dest; 389423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 389523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 389623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = FLOAT_TO_SHORT( depthSpan[i] ); 389723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 389823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 389923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap2( (GLushort *) dst, n ); 390023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 390123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 390223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 390323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_UNSIGNED_INT: 390423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 390523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint *dst = (GLuint *) dest; 390623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 390723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 390823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = FLOAT_TO_UINT( depthSpan[i] ); 390923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 391023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 391123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap4( (GLuint *) dst, n ); 391223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 391323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 391423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 391523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_INT: 391623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 391723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLint *dst = (GLint *) dest; 391823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 391923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 392023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = FLOAT_TO_INT( depthSpan[i] ); 392123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 392223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 392323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap4( (GLuint *) dst, n ); 392423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 392523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 392623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 392723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_FLOAT: 392823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 392923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLfloat *dst = (GLfloat *) dest; 393023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 393123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 393223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = depthSpan[i]; 393323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 393423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 393523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap4( (GLuint *) dst, n ); 393623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 393723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 393823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 39397eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul case GL_HALF_FLOAT_NV: 39407eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul { 39417eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul GLhalfNV *dst = (GLhalfNV *) dest; 39427eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul GLuint i; 39437eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul for (i = 0; i < n; i++) { 39447eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i] = _mesa_float_to_half(depthSpan[i]); 39457eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 39467eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul if (dstPacking->SwapBytes) { 39477eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul _mesa_swap2( (GLushort *) dst, n ); 39487eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 39497eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 39507eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul break; 395123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul default: 395208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad type in _mesa_pack_depth_span"); 395323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 395423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul} 395523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 395623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 39577a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul/** 39587a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul * Unpack image data. Apply byte swapping, byte flipping (bitmap). 39597a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul * Return all image data in a contiguous block. This is used when we 39607a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul * compile glDrawPixels, glTexImage, etc into a display list. We 39617a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul * need a copy of the data in a standard format. 3962c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 3963c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid * 3964c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul_mesa_unpack_image( GLsizei width, GLsizei height, GLsizei depth, 3965c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum format, GLenum type, const GLvoid *pixels, 3966c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const struct gl_pixelstore_attrib *unpack ) 3967c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 3968c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint bytesPerRow, compsPerRow; 3969c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLboolean flipBytes, swap2, swap4; 3970c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3971c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (!pixels) 3972c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return NULL; /* not necessarily an error */ 3973c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3974c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (width <= 0 || height <= 0 || depth <= 0) 3975c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return NULL; /* generate error later */ 3976c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3977c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (format == GL_BITMAP) { 3978c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytesPerRow = (width + 7) >> 3; 3979c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul flipBytes = !unpack->LsbFirst; 3980c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul swap2 = swap4 = GL_FALSE; 3981c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul compsPerRow = 0; 3982c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3983c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 3984b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type); 3985b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const GLint components = _mesa_components_in_format(format); 3986c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint bytesPerComp; 3987c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (bytesPerPixel <= 0 || components <= 0) 3988c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return NULL; /* bad format or type. generate error later */ 3989c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytesPerRow = bytesPerPixel * width; 3990c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytesPerComp = bytesPerPixel / components; 3991c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul flipBytes = GL_FALSE; 3992c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul swap2 = (bytesPerComp == 2) && unpack->SwapBytes; 3993c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul swap4 = (bytesPerComp == 4) && unpack->SwapBytes; 3994c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul compsPerRow = components * width; 3995c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(compsPerRow >= width); 3996c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3997c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3998c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 3999b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul GLubyte *destBuffer = (GLubyte *) MALLOC(bytesPerRow * height * depth); 4000c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dst; 4001c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint img, row; 4002c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (!destBuffer) 4003c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return NULL; /* generate GL_OUT_OF_MEMORY later */ 4004c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 4005c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst = destBuffer; 4006c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (img = 0; img < depth; img++) { 4007c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (row = 0; row < height; row++) { 4008b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const GLvoid *src = _mesa_image_address(unpack, pixels, 4009c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul width, height, format, type, img, row, 0); 4010c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul MEMCPY(dst, src, bytesPerRow); 4011c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* byte flipping/swapping */ 4012c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (flipBytes) { 4013b7d076fc96ac27117421653a043d00a95f789d24Brian Paul flip_bytes((GLubyte *) dst, bytesPerRow); 4014c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 4015c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (swap2) { 4016b7d076fc96ac27117421653a043d00a95f789d24Brian Paul _mesa_swap2((GLushort*) dst, compsPerRow); 4017c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 4018c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (swap4) { 4019b7d076fc96ac27117421653a043d00a95f789d24Brian Paul _mesa_swap4((GLuint*) dst, compsPerRow); 4020c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 4021c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += bytesPerRow; 4022c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 4023c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 4024c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return destBuffer; 4025c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 4026c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 40276dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell 40286dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell#endif 4029