image.c revision f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97
1afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Mesa 3-D graphics library 37a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul * Version: 6.1 45e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 57a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul * Copyright (C) 1999-2004 Brian Paul All Rights Reserved. 65e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 7afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Permission is hereby granted, free of charge, to any person obtaining a 8afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * copy of this software and associated documentation files (the "Software"), 9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * to deal in the Software without restriction, including without limitation 10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * and/or sell copies of the Software, and to permit persons to whom the 12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Software is furnished to do so, subject to the following conditions: 135e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 14afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * The above copyright notice and this permission notice shall be included 15afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * in all copies or substantial portions of the Software. 165e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 256dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell 26f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 27f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \file image.c 28f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Image handling. 29f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 30f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 31f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 32fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul#include "glheader.h" 337a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul#include "bufferobj.h" 34c893a015d8a50a38cd3f727d99835e7e7e2ccea9Brian Paul#include "colormac.h" 35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "context.h" 36afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "image.h" 373c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul#include "imports.h" 388a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul#include "histogram.h" 39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "macros.h" 40afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "pixel.h" 415e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "mtypes.h" 42afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 43afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 446dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** Compute ceiling of integer quotient of A divided by B. */ 4527558a160a9fe91745728d7626995cd88f8fe339Brian Paul#define CEILING( A, B ) ( (A) % (B) == 0 ? (A)/(B) : (A)/(B)+1 ) 4627558a160a9fe91745728d7626995cd88f8fe339Brian Paul 4727558a160a9fe91745728d7626995cd88f8fe339Brian Paul 486dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 49afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the 8 bits in each byte of the given array. 5064a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul * 516dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param p array. 526dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param n number of bytes. 536dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 546dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \todo try this trick to flip bytes someday: 556dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \code 5664a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul * v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555); 5764a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul * v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333); 5864a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul * v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f); 596dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \endcode 60afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 61b7d076fc96ac27117421653a043d00a95f789d24Brian Paulstatic void 62b7d076fc96ac27117421653a043d00a95f789d24Brian Paulflip_bytes( GLubyte *p, GLuint n ) 63afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 64afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach register GLuint i, a, b; 65afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 66afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 6764a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul b = (GLuint) p[i]; /* words are often faster than bytes */ 68afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach a = ((b & 0x01) << 7) | 69afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x02) << 5) | 70afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x04) << 3) | 71afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x08) << 1) | 72afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x10) >> 1) | 73afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x20) >> 3) | 74afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x40) >> 5) | 75afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x80) >> 7); 76afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach p[i] = (GLubyte) a; 77afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 78afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 79afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 80afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 816dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 82afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the order of the 2 bytes in each word in the given array. 836dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 846dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param p array. 856dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param n number of words. 86afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 87b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid 88b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_swap2( GLushort *p, GLuint n ) 89afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 90afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach register GLuint i; 91afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 92afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 93afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach p[i] = (p[i] >> 8) | ((p[i] << 8) & 0xff00); 94afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 95afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 96afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 97afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 98afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 99afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the order of the 4 bytes in each word in the given array. 101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 102b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid 103b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_swap4( GLuint *p, GLuint n ) 104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach register GLuint i, a, b; 106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach b = p[i]; 109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach a = (b >> 24) 110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | ((b >> 8) & 0xff00) 111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | ((b << 8) & 0xff0000) 112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | ((b << 24) & 0xff000000); 113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach p[i] = a; 114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1186dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 1196dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Get the size of a GL data type. 1206dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 1216dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param type GL data type. 1226dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 1236dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return the size, in bytes, of the given data type, 0 if a GL_BITMAP, or -1 1246dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * if an invalid type enum. 125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 126b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_sizeof_type( GLenum type ) 127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BITMAP: 130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 0; 131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLbyte); 135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLushort); 137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLint); 143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLfloat); 145f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_HALF_FLOAT_ARB: 146f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return sizeof(GLhalfARB); 147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1536dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 1546dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Same as _mesa_sizeof_type() but also accepting the packed pixel 1556dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * format data types. 156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 157b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_sizeof_packed_type( GLenum type ) 158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BITMAP: 161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 0; 162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLbyte); 166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLushort); 168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLint); 174f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_HALF_FLOAT_ARB: 175f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return sizeof(GLhalfARB); 176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLfloat); 178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_3_3_2: 179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_2_3_3_REV: 181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5: 183c450d57991628318696ee7a2bd052f91f480cda3Brian Paul return sizeof(GLushort); 184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5_REV: 185c450d57991628318696ee7a2bd052f91f480cda3Brian Paul return sizeof(GLushort); 186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4: 187c450d57991628318696ee7a2bd052f91f480cda3Brian Paul return sizeof(GLushort); 188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4_REV: 189c450d57991628318696ee7a2bd052f91f480cda3Brian Paul return sizeof(GLushort); 190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_5_5_1: 191c450d57991628318696ee7a2bd052f91f480cda3Brian Paul return sizeof(GLushort); 192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_1_5_5_5_REV: 193c450d57991628318696ee7a2bd052f91f480cda3Brian Paul return sizeof(GLushort); 194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8: 195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8_REV: 197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_10_10_10_2: 199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_2_10_10_10_REV: 201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 202c5b995066020191982b2315fc45d05e068eee761Brian Paul case GL_UNSIGNED_SHORT_8_8_MESA: 203c5b995066020191982b2315fc45d05e068eee761Brian Paul case GL_UNSIGNED_SHORT_8_8_REV_MESA: 204c5b995066020191982b2315fc45d05e068eee761Brian Paul return sizeof(GLushort); 205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 2116dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 2126dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Get the number of components in a pixel format. 2136dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 2146dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param format pixel format. 2156dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 2166dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return the number of components in the given format, or -1 if a bad format. 217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 218b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_components_in_format( GLenum format ) 219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (format) { 221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX: 222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX1_EXT: 223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX2_EXT: 224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX4_EXT: 225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX8_EXT: 226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX12_EXT: 227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX16_EXT: 228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_STENCIL_INDEX: 229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_DEPTH_COMPONENT: 230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_GREEN: 232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BLUE: 233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ALPHA: 234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE: 235070b2644c6d3b0b4c6da64addd85245d730b6240Brian Paul case GL_INTENSITY: 236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 1; 237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE_ALPHA: 238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 2; 239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 3; 241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGBA: 242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 4; 243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGR: 244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 3; 245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGRA: 246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 4; 247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ABGR_EXT: 248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 4; 249c5b995066020191982b2315fc45d05e068eee761Brian Paul case GL_YCBCR_MESA: 250c5b995066020191982b2315fc45d05e068eee761Brian Paul return 2; 251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 2576dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 2586dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Get the bytes per pixel of pixel format type pair. 2596dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 2606dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param format pixel format. 2616dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param type pixel type. 2626dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 2636dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return bytes per pixel, or -1 if a bad format or type was given. 264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 265b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_bytes_per_pixel( GLenum format, GLenum type ) 266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 267b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GLint comps = _mesa_components_in_format( format ); 268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (comps < 0) 269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BITMAP: 273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 0; /* special case */ 274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return comps * sizeof(GLubyte); 277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return comps * sizeof(GLshort); 280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return comps * sizeof(GLint); 283afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return comps * sizeof(GLfloat); 285f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_HALF_FLOAT_ARB: 286f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return comps * sizeof(GLhalfARB); 287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_3_3_2: 288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_2_3_3_REV: 289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB || format == GL_BGR) 290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else 292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; /* error */ 293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5: 294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5_REV: 295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB || format == GL_BGR) 296c450d57991628318696ee7a2bd052f91f480cda3Brian Paul return sizeof(GLushort); 297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else 298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; /* error */ 299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4: 300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4_REV: 301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_5_5_1: 302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_1_5_5_5_REV: 303afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT) 304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLushort); 305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else 306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8: 308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8_REV: 309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_10_10_10_2: 310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_2_10_10_10_REV: 311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT) 312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else 314afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 315c5b995066020191982b2315fc45d05e068eee761Brian Paul case GL_UNSIGNED_SHORT_8_8_MESA: 316c5b995066020191982b2315fc45d05e068eee761Brian Paul case GL_UNSIGNED_SHORT_8_8_REV_MESA: 317c5b995066020191982b2315fc45d05e068eee761Brian Paul if (format == GL_YCBCR_MESA) 318c5b995066020191982b2315fc45d05e068eee761Brian Paul return sizeof(GLushort); 319c5b995066020191982b2315fc45d05e068eee761Brian Paul else 320c5b995066020191982b2315fc45d05e068eee761Brian Paul return -1; 321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 3276dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 3286dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Test for a legal pixel format and type. 3296dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 3306dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param format pixel format. 3316dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param type pixel type. 3326dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 3336dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return GL_TRUE if the given pixel format and type are legal, or GL_FALSE 3346dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * otherwise. 335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 336b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLboolean 337f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul_mesa_is_legal_format_and_type( GLcontext *ctx, GLenum format, GLenum type ) 338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (format) { 340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX: 341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_STENCIL_INDEX: 342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BITMAP: 344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_TRUE; 352f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_HALF_FLOAT_ARB: 353f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return ctx->Extensions.ARB_half_float_pixel; 354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_GREEN: 359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BLUE: 360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ALPHA: 3612a1f50aee4f30dbd0c55d8f0b7185b690c841051Brian Paul case GL_INTENSITY: 362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE: 363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE_ALPHA: 364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_DEPTH_COMPONENT: 365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_TRUE; 374f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_HALF_FLOAT_ARB: 375f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return ctx->Extensions.ARB_half_float_pixel; 376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 3803d960a0d84be0ffdd491dd37ff80bedf4a44fe92Brian Paul case GL_BGR: 381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_3_3_2: 390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_2_3_3_REV: 391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5: 392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5_REV: 393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_TRUE; 394f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_HALF_FLOAT_ARB: 395f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return ctx->Extensions.ARB_half_float_pixel; 396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGBA: 400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGRA: 401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ABGR_EXT: 402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4: 411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4_REV: 412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_5_5_1: 413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_1_5_5_5_REV: 414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8: 415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8_REV: 416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_10_10_10_2: 417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_2_10_10_10_REV: 418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_TRUE; 419f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_HALF_FLOAT_ARB: 420f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return ctx->Extensions.ARB_half_float_pixel; 421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 424c5b995066020191982b2315fc45d05e068eee761Brian Paul case GL_YCBCR_MESA: 425c5b995066020191982b2315fc45d05e068eee761Brian Paul if (type == GL_UNSIGNED_SHORT_8_8_MESA || 426c5b995066020191982b2315fc45d05e068eee761Brian Paul type == GL_UNSIGNED_SHORT_8_8_REV_MESA) 427c5b995066020191982b2315fc45d05e068eee761Brian Paul return GL_TRUE; 428c5b995066020191982b2315fc45d05e068eee761Brian Paul else 429c5b995066020191982b2315fc45d05e068eee761Brian Paul return GL_FALSE; 430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ; /* fall-through */ 432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 4376dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 4386dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Get the address of a pixel in an image (actually a volume). 4396dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 4406dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Pixel unpacking/packing parameters are observed according to \p packing. 4416dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 4426dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param image start of image data. 4436dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param width image width. 4446dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param height image height. 4456dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param format pixel format. 4466dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param type pixel data type. 4476dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param packing the pixelstore attributes 4486dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param img which image in the volume (0 for 1D or 2D images) 4496dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param row of pixel in the image 4506dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param column of pixel in the image 4516dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 4526dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return address of pixel on success, or NULL on error. 4536dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 4546dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * According to the \p packing information calculates the number of pixel/bytes 4556dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * per row/image and refers it. 4566dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 4576dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa gl_pixelstore_attrib. 458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 459b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLvoid * 460b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_image_address( const struct gl_pixelstore_attrib *packing, 461b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const GLvoid *image, GLsizei width, 462b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GLsizei height, GLenum format, GLenum type, 463b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GLint img, GLint row, GLint column ) 464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint alignment; /* 1, 2 or 4 */ 466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint pixels_per_row; 467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint rows_per_image; 468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint skiprows; 469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint skippixels; 470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint skipimages; /* for 3-D volume images */ 471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte *pixel_addr; 472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach alignment = packing->Alignment; 474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->RowLength > 0) { 475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach pixels_per_row = packing->RowLength; 476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach pixels_per_row = width; 479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->ImageHeight > 0) { 481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach rows_per_image = packing->ImageHeight; 482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach rows_per_image = height; 485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach skiprows = packing->SkipRows; 487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach skippixels = packing->SkipPixels; 488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach skipimages = packing->SkipImages; 489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (type==GL_BITMAP) { 491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* BITMAP data */ 492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint comp_per_pixel; /* components per pixel */ 493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint bytes_per_comp; /* bytes per component */ 494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint bytes_per_row; 495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint bytes_per_image; 496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* Compute bytes per component */ 498b7d076fc96ac27117421653a043d00a95f789d24Brian Paul bytes_per_comp = _mesa_sizeof_packed_type( type ); 499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (bytes_per_comp<0) { 500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return NULL; 501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* Compute number of components per pixel */ 504b7d076fc96ac27117421653a043d00a95f789d24Brian Paul comp_per_pixel = _mesa_components_in_format( format ); 505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (comp_per_pixel<0 && type != GL_BITMAP) { 506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return NULL; 507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_row = alignment 510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * CEILING( comp_per_pixel*pixels_per_row, 8*alignment ); 511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_image = bytes_per_row * rows_per_image; 513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach pixel_addr = (GLubyte *) image 515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skipimages + img) * bytes_per_image 516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skiprows + row) * bytes_per_row 517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skippixels + column) / 8; 518afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 519afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* Non-BITMAP data */ 521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint bytes_per_pixel, bytes_per_row, remainder, bytes_per_image; 522551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul GLint topOfImage; 523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 524b7d076fc96ac27117421653a043d00a95f789d24Brian Paul bytes_per_pixel = _mesa_bytes_per_pixel( format, type ); 525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* The pixel type and format should have been error checked earlier */ 527afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach assert(bytes_per_pixel > 0); 528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 529afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_row = pixels_per_row * bytes_per_pixel; 530afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach remainder = bytes_per_row % alignment; 531afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (remainder > 0) 532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_row += (alignment - remainder); 533afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 534afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ASSERT(bytes_per_row % alignment == 0); 535afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 536afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_image = bytes_per_row * rows_per_image; 537afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 538551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul if (packing->Invert) { 539551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul /* set pixel_addr to the last row */ 540551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul topOfImage = bytes_per_row * (height - 1); 541551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul bytes_per_row = -bytes_per_row; 542551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul } 543551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul else { 544551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul topOfImage = 0; 545551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul } 546551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul 547afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* compute final pixel address */ 548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach pixel_addr = (GLubyte *) image 549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skipimages + img) * bytes_per_image 550551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul + topOfImage 551afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skiprows + row) * bytes_per_row 552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skippixels + column) * bytes_per_pixel; 553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 554afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 555afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return (GLvoid *) pixel_addr; 556afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 557afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 558afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 5596dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 5606dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Compute the stride between image rows. 5616dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 5626dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param packing the pixelstore attributes 5636dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param width image width. 5646dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param format pixel format. 5656dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param type pixel data type. 5666dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 5676dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return the stride in bytes for the given parameters. 5686dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 5696dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Computes the number of bytes per pixel and row and compensates for alignment. 5706dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 5716dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa gl_pixelstore_attrib. 572ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul */ 573ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian PaulGLint 574ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul_mesa_image_row_stride( const struct gl_pixelstore_attrib *packing, 575ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul GLint width, GLenum format, GLenum type ) 576ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul{ 577ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul ASSERT(packing); 578ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul if (type == GL_BITMAP) { 579ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul /* BITMAP data */ 580551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul GLint bytes; 581ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul if (packing->RowLength == 0) { 582551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul bytes = (width + 7) / 8; 583ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 584ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul else { 585551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul bytes = (packing->RowLength + 7) / 8; 586551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul } 587551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul if (packing->Invert) { 588551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul /* negate the bytes per row (negative row stride) */ 589551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul bytes = -bytes; 590ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 591551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul return bytes; 592ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 593ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul else { 594ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul /* Non-BITMAP data */ 595b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type); 596fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul GLint bytesPerRow, remainder; 597ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul if (bytesPerPixel <= 0) 598ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul return -1; /* error */ 599ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul if (packing->RowLength == 0) { 600fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul bytesPerRow = bytesPerPixel * width; 601ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 602ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul else { 603fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul bytesPerRow = bytesPerPixel * packing->RowLength; 604ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 605fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul remainder = bytesPerRow % packing->Alignment; 606fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul if (remainder > 0) 607fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul bytesPerRow += (packing->Alignment - remainder); 608551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul if (packing->Invert) 609551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul bytesPerRow = -bytesPerRow; 610fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul return bytesPerRow; 611ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 612ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul} 613ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul 614ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul 6156dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell#if _HAVE_FULL_GL 616ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul 617ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul/* 618d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul * Compute the stride between images in a 3D texture (in bytes) for the given 619d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul * pixel packing parameters and image width, format and type. 620d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul */ 621d488af5b34e390a9b81dac96053bd45f34ffffffBrian PaulGLint 622d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul_mesa_image_image_stride( const struct gl_pixelstore_attrib *packing, 623d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul GLint width, GLint height, 624d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul GLenum format, GLenum type ) 625d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul{ 626d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul ASSERT(packing); 627d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul ASSERT(type != GL_BITMAP); 628d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul 629d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul { 630d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type); 631d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul GLint bytesPerRow, bytesPerImage, remainder; 632d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul 633d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul if (bytesPerPixel <= 0) 634d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul return -1; /* error */ 635d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul if (packing->RowLength == 0) { 636d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul bytesPerRow = bytesPerPixel * width; 637d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul } 638d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul else { 639d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul bytesPerRow = bytesPerPixel * packing->RowLength; 640d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul } 641d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul remainder = bytesPerRow % packing->Alignment; 642d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul if (remainder > 0) 643d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul bytesPerRow += (packing->Alignment - remainder); 644d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul 645d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul if (packing->ImageHeight == 0) 646d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul bytesPerImage = bytesPerRow * height; 647d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul else 648d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul bytesPerImage = bytesPerRow * packing->ImageHeight; 649d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul 650d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul return bytesPerImage; 651d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul } 652d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul} 653d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul 654d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul 655d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul/* 656afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Unpack a 32x32 pixel polygon stipple from user memory using the 657afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * current pixel unpack settings. 658afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 6597c652d77220610ecc19aaefa20876216b035e961Brian Paulvoid 6607c652d77220610ecc19aaefa20876216b035e961Brian Paul_mesa_unpack_polygon_stipple( const GLubyte *pattern, GLuint dest[32], 6617c652d77220610ecc19aaefa20876216b035e961Brian Paul const struct gl_pixelstore_attrib *unpacking ) 662afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 663959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul GLubyte *ptrn = (GLubyte *) _mesa_unpack_bitmap( 32, 32, pattern, unpacking ); 6647c652d77220610ecc19aaefa20876216b035e961Brian Paul if (ptrn) { 6657c652d77220610ecc19aaefa20876216b035e961Brian Paul /* Convert pattern from GLubytes to GLuints and handle big/little 6667c652d77220610ecc19aaefa20876216b035e961Brian Paul * endian differences 6677c652d77220610ecc19aaefa20876216b035e961Brian Paul */ 6687c652d77220610ecc19aaefa20876216b035e961Brian Paul GLubyte *p = ptrn; 6697c652d77220610ecc19aaefa20876216b035e961Brian Paul GLint i; 6707c652d77220610ecc19aaefa20876216b035e961Brian Paul for (i = 0; i < 32; i++) { 6717c652d77220610ecc19aaefa20876216b035e961Brian Paul dest[i] = (p[0] << 24) 6727c652d77220610ecc19aaefa20876216b035e961Brian Paul | (p[1] << 16) 6737c652d77220610ecc19aaefa20876216b035e961Brian Paul | (p[2] << 8) 6747c652d77220610ecc19aaefa20876216b035e961Brian Paul | (p[3] ); 6757c652d77220610ecc19aaefa20876216b035e961Brian Paul p += 4; 6767c652d77220610ecc19aaefa20876216b035e961Brian Paul } 6777c652d77220610ecc19aaefa20876216b035e961Brian Paul FREE(ptrn); 678afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 679afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 680afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 681afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 682afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 683fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Pack polygon stipple into user memory given current pixel packing 684fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * settings. 685afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 6867c652d77220610ecc19aaefa20876216b035e961Brian Paulvoid 6877c652d77220610ecc19aaefa20876216b035e961Brian Paul_mesa_pack_polygon_stipple( const GLuint pattern[32], GLubyte *dest, 6887c652d77220610ecc19aaefa20876216b035e961Brian Paul const struct gl_pixelstore_attrib *packing ) 689afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 6907c652d77220610ecc19aaefa20876216b035e961Brian Paul /* Convert pattern from GLuints to GLubytes to handle big/little 6917c652d77220610ecc19aaefa20876216b035e961Brian Paul * endian differences. 6927c652d77220610ecc19aaefa20876216b035e961Brian Paul */ 6937c652d77220610ecc19aaefa20876216b035e961Brian Paul GLubyte ptrn[32*4]; 694fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint i; 695fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < 32; i++) { 6967c652d77220610ecc19aaefa20876216b035e961Brian Paul ptrn[i * 4 + 0] = (GLubyte) ((pattern[i] >> 24) & 0xff); 6977c652d77220610ecc19aaefa20876216b035e961Brian Paul ptrn[i * 4 + 1] = (GLubyte) ((pattern[i] >> 16) & 0xff); 6987c652d77220610ecc19aaefa20876216b035e961Brian Paul ptrn[i * 4 + 2] = (GLubyte) ((pattern[i] >> 8 ) & 0xff); 6997c652d77220610ecc19aaefa20876216b035e961Brian Paul ptrn[i * 4 + 3] = (GLubyte) ((pattern[i] ) & 0xff); 700afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 7017c652d77220610ecc19aaefa20876216b035e961Brian Paul 7027c652d77220610ecc19aaefa20876216b035e961Brian Paul _mesa_pack_bitmap(32, 32, ptrn, dest, packing); 703afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 704afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 705afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 706699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul/* 707699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Unpack bitmap data. Resulting data will be in most-significant-bit-first 708699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * order with row alignment = 1 byte. 709699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul */ 710699bc7b73d2fede77d3290f66c1ec355afd0373eBrian PaulGLvoid * 711699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul_mesa_unpack_bitmap( GLint width, GLint height, const GLubyte *pixels, 712699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul const struct gl_pixelstore_attrib *packing ) 713699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul{ 714699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLint bytes, row, width_in_bytes; 715699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte *buffer, *dst; 716699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 717699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (!pixels) 718699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul return NULL; 719699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 720699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* Alloc dest storage */ 721699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul bytes = ((width + 7) / 8 * height); 722699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul buffer = (GLubyte *) MALLOC( bytes ); 723699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (!buffer) 724699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul return NULL; 725699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 726699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 727699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul width_in_bytes = CEILING( width, 8 ); 728699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dst = buffer; 729699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul for (row = 0; row < height; row++) { 730b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul const GLubyte *src = (const GLubyte *) 731b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul _mesa_image_address(packing, pixels, width, height, 732b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul GL_COLOR_INDEX, GL_BITMAP, 0, row, 0); 733699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (!src) { 734699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul FREE(buffer); 735699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul return NULL; 736699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 737699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 738699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (packing->SkipPixels == 0) { 739699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul MEMCPY( dst, src, width_in_bytes ); 740699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (packing->LsbFirst) { 741699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul flip_bytes( dst, width_in_bytes ); 742699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 743699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 744699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 745699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* handling SkipPixels is a bit tricky (no pun intended!) */ 746699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLint i; 747699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (packing->LsbFirst) { 748699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte srcMask = 1 << (packing->SkipPixels & 0x7); 749699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte dstMask = 128; 750b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul const GLubyte *s = src; 751699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte *d = dst; 752699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d = 0; 753699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul for (i = 0; i < width; i++) { 754699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (*s & srcMask) { 755699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d |= dstMask; 756699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 757699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (srcMask == 128) { 758699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul srcMask = 1; 759699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul s++; 760699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 761699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 762699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul srcMask = srcMask << 1; 763699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 764699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (dstMask == 1) { 765699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstMask = 128; 766699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul d++; 767699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d = 0; 768699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 769699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 770699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstMask = dstMask >> 1; 771699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 772699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 773699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 774699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 775699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7); 776699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte dstMask = 128; 777b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul const GLubyte *s = src; 778699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte *d = dst; 779699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d = 0; 780699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul for (i = 0; i < width; i++) { 781699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (*s & srcMask) { 782699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d |= dstMask; 783699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 784699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (srcMask == 1) { 785699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul srcMask = 128; 786699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul s++; 787699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 788699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 789699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul srcMask = srcMask >> 1; 790699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 791699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (dstMask == 1) { 792699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstMask = 128; 793699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul d++; 794699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d = 0; 795699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 796699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 797699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstMask = dstMask >> 1; 798699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 799699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 800699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 801699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 802699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dst += width_in_bytes; 803699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 804699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 805699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul return buffer; 806699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul} 807699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 810699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Pack bitmap data. 811afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 812b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid 813699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul_mesa_pack_bitmap( GLint width, GLint height, const GLubyte *source, 814699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte *dest, const struct gl_pixelstore_attrib *packing ) 815afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 816699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLint row, width_in_bytes; 817699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul const GLubyte *src; 818fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 819699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (!source) 820699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul return; 821699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 822699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul width_in_bytes = CEILING( width, 8 ); 823699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul src = source; 824699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul for (row = 0; row < height; row++) { 825b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul GLubyte *dst = (GLubyte *) _mesa_image_address( packing, dest, 826b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul width, height, GL_COLOR_INDEX, GL_BITMAP, 0, row, 0 ); 827699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (!dst) 828699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul return; 829699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 830699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (packing->SkipPixels == 0) { 831699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul MEMCPY( dst, src, width_in_bytes ); 832699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (packing->LsbFirst) { 833699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul flip_bytes( dst, width_in_bytes ); 834699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 8353428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul } 836699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 837699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* handling SkipPixels is a bit tricky (no pun intended!) */ 838699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLint i; 839699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (packing->LsbFirst) { 840699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte srcMask = 1 << (packing->SkipPixels & 0x7); 841699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte dstMask = 128; 842699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul const GLubyte *s = src; 843699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte *d = dst; 844699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d = 0; 845699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul for (i = 0; i < width; i++) { 846699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (*s & srcMask) { 847699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d |= dstMask; 848699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 849699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (srcMask == 128) { 850699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul srcMask = 1; 851699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul s++; 852699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 853699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 854699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul srcMask = srcMask << 1; 855699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 856699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (dstMask == 1) { 857699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstMask = 128; 858699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul d++; 859699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d = 0; 860699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 861699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 862699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstMask = dstMask >> 1; 863699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 864699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 865699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 866699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 867699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7); 868699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte dstMask = 128; 869699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul const GLubyte *s = src; 870699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLubyte *d = dst; 871699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d = 0; 872699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul for (i = 0; i < width; i++) { 873699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (*s & srcMask) { 874699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d |= dstMask; 875699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 876699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (srcMask == 1) { 877699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul srcMask = 128; 878699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul s++; 879699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 880699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 881699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul srcMask = srcMask >> 1; 882699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 883699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (dstMask == 1) { 884699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstMask = 128; 885699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul d++; 886699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *d = 0; 887699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 888699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 889699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstMask = dstMask >> 1; 890699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 891699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 892699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 893afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 894699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul src += width_in_bytes; 895116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 896116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul} 897afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 898116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul 899833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul/** 900833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul * Apply various pixel transfer operations to an array of RGBA pixels 901833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul * as indicated by the transferOps bitmask 902833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul */ 903833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paulvoid 904833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul_mesa_apply_rgba_transfer_ops(GLcontext *ctx, GLuint transferOps, 905833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul GLuint n, GLfloat rgba[][4]) 906833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul{ 907833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul /* scale & bias */ 908833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul if (transferOps & IMAGE_SCALE_BIAS_BIT) { 909833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul _mesa_scale_and_bias_rgba(ctx, n, rgba, 910833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul ctx->Pixel.RedScale, ctx->Pixel.GreenScale, 911833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul ctx->Pixel.BlueScale, ctx->Pixel.AlphaScale, 912833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul ctx->Pixel.RedBias, ctx->Pixel.GreenBias, 913833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul ctx->Pixel.BlueBias, ctx->Pixel.AlphaBias); 914833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul } 915833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul /* color map lookup */ 916833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul if (transferOps & IMAGE_MAP_COLOR_BIT) { 917833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul _mesa_map_rgba( ctx, n, rgba ); 918833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul } 919833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul /* GL_COLOR_TABLE lookup */ 920833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul if (transferOps & IMAGE_COLOR_TABLE_BIT) { 921833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul _mesa_lookup_rgba_float(&ctx->ColorTable, n, rgba); 922833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul } 923833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul /* convolution */ 924833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul if (transferOps & IMAGE_CONVOLUTION_BIT) { 925833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul /* this has to be done in the calling code */ 926833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul _mesa_problem(ctx, "IMAGE_CONVOLUTION_BIT set in _mesa_apply_transfer_ops"); 927833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul } 928833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */ 929833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul if (transferOps & IMAGE_POST_CONVOLUTION_SCALE_BIAS) { 930833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul _mesa_scale_and_bias_rgba(ctx, n, rgba, 931833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul ctx->Pixel.PostConvolutionScale[RCOMP], 932833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul ctx->Pixel.PostConvolutionScale[GCOMP], 933833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul ctx->Pixel.PostConvolutionScale[BCOMP], 934833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul ctx->Pixel.PostConvolutionScale[ACOMP], 935833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul ctx->Pixel.PostConvolutionBias[RCOMP], 936833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul ctx->Pixel.PostConvolutionBias[GCOMP], 937833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul ctx->Pixel.PostConvolutionBias[BCOMP], 938833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul ctx->Pixel.PostConvolutionBias[ACOMP]); 939833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul } 940833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */ 941833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul if (transferOps & IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT) { 942833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul _mesa_lookup_rgba_float(&ctx->PostConvolutionColorTable, n, rgba); 943833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul } 944833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul /* color matrix transform */ 945833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul if (transferOps & IMAGE_COLOR_MATRIX_BIT) { 946833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul _mesa_transform_rgba(ctx, n, rgba); 947833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul } 948833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */ 949833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul if (transferOps & IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT) { 950833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul _mesa_lookup_rgba_float(&ctx->PostColorMatrixColorTable, n, rgba); 951833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul } 952833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul /* update histogram count */ 953833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul if (transferOps & IMAGE_HISTOGRAM_BIT) { 954833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul _mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba); 955833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul } 956833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul /* update min/max values */ 957833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul if (transferOps & IMAGE_MIN_MAX_BIT) { 958833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul _mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba); 959833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul } 9604923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul /* clamping to [0,1] */ 961833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul if (transferOps & IMAGE_CLAMP_BIT) { 962833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul GLuint i; 963833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul for (i = 0; i < n; i++) { 964833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F); 965833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F); 966833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F); 967833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F); 968833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul } 969833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul } 970833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul} 971833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul 972833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul 973833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul 97496385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul/* 97596385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul * Used to pack an array [][4] of RGBA GLchan colors as specified 97696385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul * by the dstFormat, dstType and dstPacking. Used by glReadPixels, 97796385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul * glGetConvolutionFilter(), etc. 97896385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul */ 979116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paulvoid 9808cfd08b6134e2036ddceb1facfa82e15026068a2Brian Paul_mesa_pack_rgba_span_float( GLcontext *ctx, 981116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul GLuint n, CONST GLfloat rgbaIn[][4], 982b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLenum dstFormat, GLenum dstType, 983b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLvoid *dstAddr, 984b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul const struct gl_pixelstore_attrib *dstPacking, 985116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul GLuint transferOps ) 986116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul{ 987b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul const GLint comps = _mesa_components_in_format(dstFormat); 988116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul GLfloat luminance[MAX_WIDTH]; 98994f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul const GLfloat (*rgba)[4]; 990116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul GLuint i; 991116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul 992116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul if (transferOps) { 993116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* make copy of incoming data */ 99447cf442c1164b6b406117fccfb8b564602741ee3Brian Paul DEFMARRAY(GLfloat, rgbaCopy, MAX_WIDTH, 4); /* mac 32k limitation */ 99547cf442c1164b6b406117fccfb8b564602741ee3Brian Paul CHECKARRAY(rgbaCopy, return); /* mac 32k limitation */ 99647cf442c1164b6b406117fccfb8b564602741ee3Brian Paul 997833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul _mesa_memcpy(rgbaCopy, rgbaIn, n * 4 * sizeof(GLfloat)); 99894f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgbaCopy); 99994f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul rgba = (const GLfloat (*)[4]) rgbaCopy; 1000833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul 1001833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul if ((transferOps & IMAGE_MIN_MAX_BIT) && ctx->MinMax.Sink) { 1002833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul UNDEFARRAY(rgbaCopy); /* mac 32k limitation */ 1003833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul return; 1004116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 100547cf442c1164b6b406117fccfb8b564602741ee3Brian Paul UNDEFARRAY(rgbaCopy); /* mac 32k limitation */ 1006116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1007116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul else { 1008116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* use incoming data, not a copy */ 100994f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul rgba = (const GLfloat (*)[4]) rgbaIn; 1010116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1011ef9025a641624991113b7df2eecdf7c8e330a31cBrian Paul 1012b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_LUMINANCE || dstFormat == GL_LUMINANCE_ALPHA) { 101394f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul /* compute luminance values */ 10144923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul if (ctx->ClampFragmentColors) { 10154923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul for (i = 0; i < n; i++) { 10164923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul GLfloat sum = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP]; 10174923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul luminance[i] = CLAMP(sum, 0.0F, 1.0F); 10184923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul } 10194923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul } 10204923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul else { 10214923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul for (i = 0; i < n; i++) { 10224923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul luminance[i] = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP]; 10234923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul } 1024afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1025116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1026afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1027116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul /* 1028116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul * Pack/store the pixels. Ugh! Lots of cases!!! 1029116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul */ 1030b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstType) { 1031116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_BYTE: 1032116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul { 1033b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLubyte *dst = (GLubyte *) dstAddr; 1034b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstFormat) { 1035116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RED: 1036116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1037116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1038116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1039116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_GREEN: 1040116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1041116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1042116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1043116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BLUE: 1044116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1045116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 1046116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1047116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ALPHA: 1048116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1049116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 1050116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1051116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE: 1052116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1053116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UBYTE(luminance[i]); 1054116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1055116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE_ALPHA: 1056116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1057116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+0] = FLOAT_TO_UBYTE(luminance[i]); 1058116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 1059116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1060116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1061116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGB: 1062116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1063116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1064116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1065116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 1066116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1067116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1068116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGBA: 1069116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1070116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1071116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1072116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 1073116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 1074116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1075116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1076116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGR: 1077116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1078116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 1079116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1080116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1081116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1082116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1083116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGRA: 1084116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1085116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 1086116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1087116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1088116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 1089116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1090116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1091116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ABGR_EXT: 1092116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1093116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 1094116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 1095116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1096116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1097116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1098116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1099116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 110008836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1101116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1102116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1103116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1104116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BYTE: 1105116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul { 1106b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLbyte *dst = (GLbyte *) dstAddr; 1107b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstFormat) { 1108116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RED: 1109116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1110116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1111116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1112116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_GREEN: 1113116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1114116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1115116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1116116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BLUE: 1117116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1118116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1119116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1120116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ALPHA: 1121116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1122116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 1123116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1124116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE: 1125116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1126116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_BYTE(luminance[i]); 1127116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1128116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE_ALPHA: 1129116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1130116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+0] = FLOAT_TO_BYTE(luminance[i]); 1131116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 1132116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1133116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1134116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGB: 1135116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1136116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1137116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1138116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1139116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1140116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1141116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGBA: 1142116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1143116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1144116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1145116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1146116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 1147116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1148116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1149116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGR: 1150116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1151116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1152116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1153116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1154116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1155116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1156116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGRA: 1157116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1158116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1159116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1160116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1161116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 1162116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1163116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ABGR_EXT: 1164116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1165116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 1166116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1167116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1168116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1169116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1170116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1171116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 117208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1173116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1174116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1175116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1176116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_SHORT: 1177116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul { 1178b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLushort *dst = (GLushort *) dstAddr; 1179b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstFormat) { 1180116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RED: 1181116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1182116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 1183116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1184116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_GREEN: 1185116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1186116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1187116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1188116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BLUE: 1189116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1190116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 1191116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1192116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ALPHA: 1193116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1194116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_USHORT(rgba[i][ACOMP]); 1195116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1196116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE: 1197116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1198116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_USHORT(luminance[i]); 1199116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1200116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE_ALPHA: 1201116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1202116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+0] = FLOAT_TO_USHORT(luminance[i]); 1203116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+1] = FLOAT_TO_USHORT(rgba[i][ACOMP]); 1204116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1205116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1206116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGB: 1207116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1208116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 1209116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1210116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 1211116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1212116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1213116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGBA: 1214116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1215116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 1216116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1217116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 1218116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][ACOMP]); 1219116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1220116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1221116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGR: 1222116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1223116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 1224116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1225116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 1226116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1227116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1228116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGRA: 1229116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1230116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 1231116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1232116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 1233116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][ACOMP]); 1234116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1235116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1236116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ABGR_EXT: 1237116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1238116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][ACOMP]); 1239116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 1240116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1241116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 1242116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1243116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1244116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 124508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1246116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1247b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstPacking->SwapBytes) { 1248116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_swap2( (GLushort *) dst, n * comps); 1249116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1250116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1251116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1252116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_SHORT: 1253116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul { 1254b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLshort *dst = (GLshort *) dstAddr; 1255b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstFormat) { 1256116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RED: 1257116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1258116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1259116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1260116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_GREEN: 1261116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1262116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1263116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1264116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BLUE: 1265116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1266116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1267116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1268116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ALPHA: 1269116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1270116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1271116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1272116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE: 1273116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1274116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_SHORT(luminance[i]); 1275116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1276116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE_ALPHA: 1277116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1278116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+0] = FLOAT_TO_SHORT(luminance[i]); 1279116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1280116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1281116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1282116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGB: 1283116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1284116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1285116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1286116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1287116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1288116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1289116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGBA: 1290116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1291116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1292116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1293116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1294116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1295116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1296116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1297116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGR: 1298116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1299116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1300116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1301116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1302116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1303116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1304116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGRA: 1305116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1306116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1307116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1308116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1309116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1310116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1311116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ABGR_EXT: 1312116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1313116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1314116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1315116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1316116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1317116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1318116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1319116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 132008836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1322b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstPacking->SwapBytes) { 1323116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_swap2( (GLushort *) dst, n * comps ); 1324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1325116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1326116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1327116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_INT: 1328116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul { 1329b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1330b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstFormat) { 1331116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RED: 1332116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1333116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1334116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1335116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_GREEN: 1336116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1337116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1338116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1339116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BLUE: 1340116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1341116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1342116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1343116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ALPHA: 1344116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1345116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1346116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1347116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE: 1348116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1349116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_UINT(luminance[i]); 1350116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1351116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE_ALPHA: 1352116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1353116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+0] = FLOAT_TO_UINT(luminance[i]); 1354116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+1] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1355116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1356116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1357116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGB: 1358116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1359116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1360116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1361116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1362116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1363116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1364116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGBA: 1365116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1366116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1367116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1368116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1369116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1370116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1371116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1372116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGR: 1373116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1374116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1375116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1376116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1377116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1378116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1379116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGRA: 1380116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1381116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1382116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1383116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1384116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1385116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1386116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1387116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ABGR_EXT: 1388116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1389116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1390116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1391116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1392116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1393116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1394116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1395116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 139608836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1398b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstPacking->SwapBytes) { 1399116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_swap4( (GLuint *) dst, n * comps ); 1400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1401116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1402116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1403116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_INT: 1404116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul { 1405b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLint *dst = (GLint *) dstAddr; 1406b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstFormat) { 1407116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RED: 1408116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1409116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_INT(rgba[i][RCOMP]); 1410116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1411116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_GREEN: 1412116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1413116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_INT(rgba[i][GCOMP]); 1414116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1415116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BLUE: 1416116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1417116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_INT(rgba[i][BCOMP]); 1418116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1419116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ALPHA: 1420116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1421116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_INT(rgba[i][ACOMP]); 1422116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1423116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE: 1424116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1425116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = FLOAT_TO_INT(luminance[i]); 1426116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1427116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE_ALPHA: 1428116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1429116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+0] = FLOAT_TO_INT(luminance[i]); 1430116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+1] = FLOAT_TO_INT(rgba[i][ACOMP]); 1431116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1432116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1433116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGB: 1434116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1435116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_INT(rgba[i][RCOMP]); 1436116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 1437116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_INT(rgba[i][BCOMP]); 1438116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1439116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1440116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGBA: 1441116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1442116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_INT(rgba[i][RCOMP]); 1443116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 1444116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_INT(rgba[i][BCOMP]); 1445116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]); 1446116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1447116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1448116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGR: 1449116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1450116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = FLOAT_TO_INT(rgba[i][BCOMP]); 1451116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 1452116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = FLOAT_TO_INT(rgba[i][RCOMP]); 1453116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1454116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1455116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGRA: 1456116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1457116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_INT(rgba[i][BCOMP]); 1458116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 1459116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_INT(rgba[i][RCOMP]); 1460116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]); 1461116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1462116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1463116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ABGR_EXT: 1464116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1465116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = FLOAT_TO_INT(rgba[i][ACOMP]); 1466116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = FLOAT_TO_INT(rgba[i][BCOMP]); 1467116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = FLOAT_TO_INT(rgba[i][GCOMP]); 1468116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = FLOAT_TO_INT(rgba[i][RCOMP]); 1469116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1470116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1471116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 147208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1474b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstPacking->SwapBytes) { 1475116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_swap4( (GLuint *) dst, n * comps ); 1476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1477116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1478116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1479116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_FLOAT: 1480116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul { 1481b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLfloat *dst = (GLfloat *) dstAddr; 1482b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul switch (dstFormat) { 1483116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RED: 1484116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1485116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = rgba[i][RCOMP]; 1486116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1487116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_GREEN: 1488116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1489116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = rgba[i][GCOMP]; 1490116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1491116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BLUE: 1492116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1493116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = rgba[i][BCOMP]; 1494116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1495116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ALPHA: 1496116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1497116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = rgba[i][ACOMP]; 1498116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1499116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE: 1500116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) 1501116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = luminance[i]; 1502116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1503116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_LUMINANCE_ALPHA: 1504116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1505116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+0] = luminance[i]; 1506116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*2+1] = rgba[i][ACOMP]; 1507116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1508116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1509116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGB: 1510116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1511116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = rgba[i][RCOMP]; 1512116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = rgba[i][GCOMP]; 1513116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = rgba[i][BCOMP]; 1514116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1515116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1516116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_RGBA: 1517116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1518116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = rgba[i][RCOMP]; 1519116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = rgba[i][GCOMP]; 1520116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = rgba[i][BCOMP]; 1521116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = rgba[i][ACOMP]; 1522116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1523116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1524116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGR: 1525116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1526116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+0] = rgba[i][BCOMP]; 1527116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+1] = rgba[i][GCOMP]; 1528116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*3+2] = rgba[i][RCOMP]; 1529116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1530116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1531116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_BGRA: 1532116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1533116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = rgba[i][BCOMP]; 1534116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = rgba[i][GCOMP]; 1535116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = rgba[i][RCOMP]; 1536116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = rgba[i][ACOMP]; 1537116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1538116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1539116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_ABGR_EXT: 1540116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1541116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+0] = rgba[i][ACOMP]; 1542116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+1] = rgba[i][BCOMP]; 1543116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+2] = rgba[i][GCOMP]; 1544116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i*4+3] = rgba[i][RCOMP]; 1545116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1546116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1547116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 154808836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1550b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstPacking->SwapBytes) { 1551116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul _mesa_swap4( (GLuint *) dst, n * comps ); 1552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1553116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1554116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1555f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_HALF_FLOAT_ARB: 15567eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul { 1557f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLhalfARB *dst = (GLhalfARB *) dstAddr; 15587eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul switch (dstFormat) { 15597eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul case GL_RED: 15607eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul for (i=0;i<n;i++) 15617eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i] = _mesa_float_to_half(rgba[i][RCOMP]); 15627eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul break; 15637eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul case GL_GREEN: 15647eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul for (i=0;i<n;i++) 15657eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i] = _mesa_float_to_half(rgba[i][GCOMP]); 15667eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul break; 15677eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul case GL_BLUE: 15687eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul for (i=0;i<n;i++) 15697eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i] = _mesa_float_to_half(rgba[i][BCOMP]); 15707eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul break; 15717eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul case GL_ALPHA: 15727eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul for (i=0;i<n;i++) 15737eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i] = _mesa_float_to_half(rgba[i][ACOMP]); 15747eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul break; 15757eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul case GL_LUMINANCE: 15767eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul for (i=0;i<n;i++) 15777eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i] = _mesa_float_to_half(luminance[i]); 15787eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul break; 15797eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul case GL_LUMINANCE_ALPHA: 15807eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul for (i=0;i<n;i++) { 15817eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*2+0] = _mesa_float_to_half(luminance[i]); 15827eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*2+1] = _mesa_float_to_half(rgba[i][ACOMP]); 15837eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 15847eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul break; 15857eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul case GL_RGB: 15867eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul for (i=0;i<n;i++) { 15877eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*3+0] = _mesa_float_to_half(rgba[i][RCOMP]); 15887eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]); 15897eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*3+2] = _mesa_float_to_half(rgba[i][BCOMP]); 15907eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 15917eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul break; 15927eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul case GL_RGBA: 15937eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul for (i=0;i<n;i++) { 15947eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*4+0] = _mesa_float_to_half(rgba[i][RCOMP]); 15957eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]); 15967eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*4+2] = _mesa_float_to_half(rgba[i][BCOMP]); 15977eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]); 15987eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 15997eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul break; 16007eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul case GL_BGR: 16017eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul for (i=0;i<n;i++) { 16027eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*3+0] = _mesa_float_to_half(rgba[i][BCOMP]); 16037eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]); 16047eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*3+2] = _mesa_float_to_half(rgba[i][RCOMP]); 16057eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 16067eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul break; 16077eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul case GL_BGRA: 16087eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul for (i=0;i<n;i++) { 16097eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*4+0] = _mesa_float_to_half(rgba[i][BCOMP]); 16107eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]); 16117eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*4+2] = _mesa_float_to_half(rgba[i][RCOMP]); 16127eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]); 16137eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 16147eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul break; 16157eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul case GL_ABGR_EXT: 16167eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul for (i=0;i<n;i++) { 16177eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*4+0] = _mesa_float_to_half(rgba[i][ACOMP]); 16187eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*4+1] = _mesa_float_to_half(rgba[i][BCOMP]); 16197eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*4+2] = _mesa_float_to_half(rgba[i][GCOMP]); 16207eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i*4+3] = _mesa_float_to_half(rgba[i][RCOMP]); 16217eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 16227eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul break; 16237eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul default: 16247eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 16257eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 16267eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul if (dstPacking->SwapBytes) { 16277eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul _mesa_swap2( (GLushort *) dst, n * comps ); 16287eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 16297eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 16307eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul break; 1631116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_BYTE_3_3_2: 1632b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGB) { 1633b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLubyte *dst = (GLubyte *) dstAddr; 1634116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1635116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 7.0F)) << 5) 1636116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 7.0F)) << 2) 1637116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 3.0F)) ); 1638afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1639116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1640116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1641116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_BYTE_2_3_3_REV: 1642b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGB) { 1643b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLubyte *dst = (GLubyte *) dstAddr; 1644116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1645116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 7.0F)) ) 1646116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 7.0F)) << 3) 1647116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 3.0F)) << 5); 1648afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1649116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1650116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1651116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_SHORT_5_6_5: 1652b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGB) { 1653b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLushort *dst = (GLushort *) dstAddr; 1654116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1655116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) << 11) 1656116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 63.0F)) << 5) 1657116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 31.0F)) ); 1658afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1659116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1660116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1661116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_SHORT_5_6_5_REV: 1662b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGB) { 1663b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLushort *dst = (GLushort *) dstAddr; 1664116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1665116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) ) 1666116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 63.0F)) << 5) 1667116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 11); 1668afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1669116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1670116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1671116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_SHORT_4_4_4_4: 1672881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul if (dstFormat == GL_RGBA) { 1673b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLushort *dst = (GLushort *) dstAddr; 1674116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1675116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 15.0F)) << 12) 1676116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 8) 1677116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 15.0F)) << 4) 1678116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][ACOMP] * 15.0F)) ); 1679afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1680116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1681881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_BGRA) { 1682881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1683881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1684881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][BCOMP] * 15.0F)) << 12) 1685881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 8) 1686881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 15.0F)) << 4) 1687881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][ACOMP] * 15.0F)) ); 1688881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1689881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1690881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1691881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1692881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1693881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][ACOMP] * 15.0F)) << 4) 1694881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][BCOMP] * 15.0F)) << 8) 1695881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 12) 1696881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 15.0F)) ); 1697881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1698881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1699116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1700116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_SHORT_4_4_4_4_REV: 1701881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul if (dstFormat == GL_RGBA) { 1702b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLushort *dst = (GLushort *) dstAddr; 1703116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1704116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 15.0F)) ) 1705116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 4) 1706116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 15.0F)) << 8) 1707116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][ACOMP] * 15.0F)) << 12); 1708afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1709116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1710881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_BGRA) { 1711881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1712881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1713881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][BCOMP] * 15.0F)) ) 1714881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 4) 1715881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 15.0F)) << 8) 1716881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][ACOMP] * 15.0F)) << 12); 1717881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1718881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1719881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1720881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1721881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1722881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][ACOMP] * 15.0F)) ) 1723881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][BCOMP] * 15.0F)) << 4) 1724881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 8) 1725881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 15.0F)) << 12); 1726881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1727881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1728116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1729116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_SHORT_5_5_5_1: 1730881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul if (dstFormat == GL_RGBA) { 1731b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLushort *dst = (GLushort *) dstAddr; 1732116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1733116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) << 11) 1734116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 6) 1735116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 1) 1736116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][ACOMP] * 1.0F)) ); 1737afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1738116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1739881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_BGRA) { 1740881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1741881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1742881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][BCOMP] * 31.0F)) << 11) 1743881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 6) 1744881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 31.0F)) << 1) 1745881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][ACOMP] * 1.0F)) ); 1746881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1747881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1748881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1749881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1750881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1751881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][ACOMP] * 31.0F)) << 11) 1752881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 6) 1753881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 1) 1754881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 1.0F)) ); 1755881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1756881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1757116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1758116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_SHORT_1_5_5_5_REV: 1759881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul if (dstFormat == GL_RGBA) { 1760b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLushort *dst = (GLushort *) dstAddr; 1761116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1762116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) ) 1763116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 5) 1764116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 10) 1765116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLint) (rgba[i][ACOMP] * 1.0F)) << 15); 1766afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1767116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1768881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_BGRA) { 1769881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1770881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1771881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][BCOMP] * 31.0F)) ) 1772881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 5) 1773881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 31.0F)) << 10) 1774881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][ACOMP] * 1.0F)) << 15); 1775881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1776881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1777881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1778881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul GLushort *dst = (GLushort *) dstAddr; 1779881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul for (i=0;i<n;i++) { 1780881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul dst[i] = (((GLint) (rgba[i][ACOMP] * 31.0F)) ) 1781881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 5) 1782881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 10) 1783881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul | (((GLint) (rgba[i][RCOMP] * 1.0F)) << 15); 1784881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1785881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul } 1786116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1787116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_INT_8_8_8_8: 1788b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGBA) { 1789b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1790116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1791116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 24) 1792116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16) 1793116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 8) 1794116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 255.0F)) ); 1795afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1796116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1797b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_BGRA) { 1798b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1799116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1800116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 24) 1801116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16) 1802116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 8) 1803116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 255.0F)) ); 1804afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1805116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1806b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1807b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1808116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1809116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24) 1810116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 16) 1811116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 8) 1812116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 255.0F)) ); 1813afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1814116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1815116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1816116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_INT_8_8_8_8_REV: 1817b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGBA) { 1818b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1819116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1820116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][RCOMP] * 255.0F)) ) 1821116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 8) 1822116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 16) 1823116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24); 1824afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1825116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1826b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_BGRA) { 1827b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1828116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1829116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][BCOMP] * 255.0F)) ) 1830116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 8) 1831116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 16) 1832116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24); 1833afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1834116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1835b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1836b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1837116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1838116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][ACOMP] * 255.0F)) ) 1839116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 8) 1840116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16) 1841116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 24); 1842afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1843116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1844116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1845116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_INT_10_10_10_2: 1846b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGBA) { 1847b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1848116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1849116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 22) 1850116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 12) 1851116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 2) 1852116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 3.0F)) ); 1853afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1854116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1855b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_BGRA) { 1856b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1857116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1858116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 22) 1859116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 12) 1860116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 2) 1861116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 3.0F)) ); 1862afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1863116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1864b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1865b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1866116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1867116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][ACOMP] * 1023.0F)) << 22) 1868116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 12) 1869116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 2) 1870116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 3.0F)) ); 1871116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1872116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1873116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1874116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul case GL_UNSIGNED_INT_2_10_10_10_REV: 1875b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul if (dstFormat == GL_RGBA) { 1876b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1877116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1878116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][RCOMP] * 1023.0F)) ) 1879116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 10) 1880116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 20) 1881116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 3.0F)) << 30); 1882116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1883116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1884b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_BGRA) { 1885b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1886116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1887116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][BCOMP] * 1023.0F)) ) 1888116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 10) 1889116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 20) 1890116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][ACOMP] * 3.0F)) << 30); 1891116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1892116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1893b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul else if (dstFormat == GL_ABGR_EXT) { 1894b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul GLuint *dst = (GLuint *) dstAddr; 1895116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul for (i=0;i<n;i++) { 1896116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul dst[i] = (((GLuint) (rgba[i][ACOMP] * 1023.0F)) ) 1897116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 10) 1898116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 20) 1899116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul | (((GLuint) (rgba[i][RCOMP] * 3.0F)) << 30); 1900116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1901116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul } 1902116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul break; 1903116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul default: 19048cfd08b6134e2036ddceb1facfa82e15026068a2Brian Paul _mesa_problem(ctx, "bad type in _mesa_pack_rgba_span_float"); 1905afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1906afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 1907c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1908c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1909699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul/* 1910699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Pack the given RGBA span into client memory at 'dest' address 1911699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * in the given pixel format and type. 1912699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Optionally apply the enabled pixel transfer ops. 1913699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Pack into memory using the given packing params struct. 1914699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * This is used by glReadPixels and glGetTexImage?D() 19156dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx - the context 1916699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * n - number of pixels in the span 1917699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * rgba - the pixels 1918699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * format - dest packing format 19196dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * type - dest packing data type 1920699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * destination - destination packing address 1921699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * packing - pixel packing parameters 1922699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * transferOps - bitmask of IMAGE_*_BIT operations to apply 1923699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul */ 1924699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paulvoid 19258cfd08b6134e2036ddceb1facfa82e15026068a2Brian Paul_mesa_pack_rgba_span_chan( GLcontext *ctx, 1926833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul GLuint n, CONST GLchan srcRgba[][4], 1927833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul GLenum dstFormat, GLenum dstType, 1928833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul GLvoid *dstAddr, 1929833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul const struct gl_pixelstore_attrib *dstPacking, 1930833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul GLuint transferOps) 1931699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul{ 1932cc22179cd855dad85a28c40416873a07e8b7cc0cBrian Paul ASSERT((ctx->NewState & _NEW_PIXEL) == 0 || transferOps == 0); 1933699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 1934699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* Test for optimized case first */ 1935699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul if (transferOps == 0 && dstFormat == GL_RGBA && dstType == CHAN_TYPE) { 1936699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* common simple case */ 1937699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul MEMCPY(dstAddr, srcRgba, n * 4 * sizeof(GLchan)); 1938699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 1939699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else if (transferOps == 0 && dstFormat == GL_RGB && dstType == CHAN_TYPE) { 1940699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* common simple case */ 1941b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul GLuint i; 1942699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dest = (GLchan *) dstAddr; 1943699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul for (i = 0; i < n; i++) { 1944699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dest[0] = srcRgba[i][RCOMP]; 1945699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dest[1] = srcRgba[i][GCOMP]; 1946699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dest[2] = srcRgba[i][BCOMP]; 1947699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dest += 3; 1948699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 1949699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 1950aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul else if (transferOps == 0 && dstFormat == GL_RGBA && dstType == GL_UNSIGNED_BYTE) { 1951aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul /* common simple case */ 1952aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLuint i; 1953aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLubyte *dest = (GLubyte *) dstAddr; 1954aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul for (i = 0; i < n; i++) { 1955aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dest[0] = CHAN_TO_UBYTE(srcRgba[i][RCOMP]); 1956aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dest[1] = CHAN_TO_UBYTE(srcRgba[i][GCOMP]); 1957aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dest[2] = CHAN_TO_UBYTE(srcRgba[i][BCOMP]); 1958aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dest[3] = CHAN_TO_UBYTE(srcRgba[i][ACOMP]); 1959aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dest += 4; 1960aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 1961aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 1962699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul else { 1963699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* general solution */ 1964699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLuint i; 196547cf442c1164b6b406117fccfb8b564602741ee3Brian Paul DEFMARRAY(GLfloat, rgba, MAX_WIDTH, 4); /* mac 32k limitation */ 196647cf442c1164b6b406117fccfb8b564602741ee3Brian Paul CHECKARRAY(rgba, return); /* mac 32k limitation */ 196747cf442c1164b6b406117fccfb8b564602741ee3Brian Paul 1968699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul assert(n <= MAX_WIDTH); 1969699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* convert color components to floating point */ 197094f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul for (i = 0; i < n; i++) { 1971699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul rgba[i][RCOMP] = CHAN_TO_FLOAT(srcRgba[i][RCOMP]); 1972699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul rgba[i][GCOMP] = CHAN_TO_FLOAT(srcRgba[i][GCOMP]); 1973699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul rgba[i][BCOMP] = CHAN_TO_FLOAT(srcRgba[i][BCOMP]); 1974699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul rgba[i][ACOMP] = CHAN_TO_FLOAT(srcRgba[i][ACOMP]); 1975699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 19768cfd08b6134e2036ddceb1facfa82e15026068a2Brian Paul _mesa_pack_rgba_span_float(ctx, n, (const GLfloat (*)[4]) rgba, 1977699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstFormat, dstType, dstAddr, 1978699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dstPacking, transferOps); 197947cf442c1164b6b406117fccfb8b564602741ee3Brian Paul UNDEFARRAY(rgba); /* mac 32k limitation */ 1980699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul } 1981699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul} 1982699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 1983699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul 1984c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define SWAP2BYTE(VALUE) \ 1985c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { \ 1986c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *bytes = (GLubyte *) &(VALUE); \ 1987c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte tmp = bytes[0]; \ 1988c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[0] = bytes[1]; \ 1989c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[1] = tmp; \ 1990c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1991c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1992c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define SWAP4BYTE(VALUE) \ 1993c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { \ 1994c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *bytes = (GLubyte *) &(VALUE); \ 1995c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte tmp = bytes[0]; \ 1996c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[0] = bytes[3]; \ 1997c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[3] = tmp; \ 1998c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul tmp = bytes[1]; \ 1999c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[1] = bytes[2]; \ 2000c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[2] = tmp; \ 2001c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2002c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2003c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2004c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic void 2005c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulextract_uint_indexes(GLuint n, GLuint indexes[], 2006c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum srcFormat, GLenum srcType, const GLvoid *src, 2007c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const struct gl_pixelstore_attrib *unpack ) 2008c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 2009c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(srcFormat == GL_COLOR_INDEX); 2010c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2011c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcType == GL_BITMAP || 2012c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_BYTE || 2013c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_BYTE || 2014c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT || 2015c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_SHORT || 2016c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT || 2017c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_INT || 2018f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_HALF_FLOAT_ARB || 2019c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_FLOAT); 2020c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2021c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul switch (srcType) { 2022c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BITMAP: 2023c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2024c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *ubsrc = (GLubyte *) src; 2025c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->LsbFirst) { 2026c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte mask = 1 << (unpack->SkipPixels & 0x7); 2027c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2028c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2029c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = (*ubsrc & mask) ? 1 : 0; 2030c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (mask == 128) { 2031c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul mask = 1; 2032c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ubsrc++; 2033c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2034c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2035c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul mask = mask << 1; 2036c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2037c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2038c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2039c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2040c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte mask = 128 >> (unpack->SkipPixels & 0x7); 2041c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2042c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2043c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = (*ubsrc & mask) ? 1 : 0; 2044c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (mask == 1) { 2045c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul mask = 128; 2046c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ubsrc++; 2047c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2048c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2049c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul mask = mask >> 1; 2050c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2051c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2052c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2053c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2054c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2055c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_BYTE: 2056c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2057c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2058c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLubyte *s = (const GLubyte *) src; 2059c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 2060c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 2061c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2062c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2063c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BYTE: 2064c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2065c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2066c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLbyte *s = (const GLbyte *) src; 2067c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 2068c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 2069c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2070c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2071c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT: 2072c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2073c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2074c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *s = (const GLushort *) src; 2075c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->SwapBytes) { 2076c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2077c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort value = s[i]; 2078c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(value); 2079c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = value; 2080c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2081c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2082c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2083c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 2084c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 2085c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2086c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2087c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2088c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_SHORT: 2089c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2090c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2091c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLshort *s = (const GLshort *) src; 2092c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->SwapBytes) { 2093c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2094c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLshort value = s[i]; 2095c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(value); 2096c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = value; 2097c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2098c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2099c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2100c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 2101c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 2102c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2103c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2104c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2105c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT: 2106c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2107c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2108c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *s = (const GLuint *) src; 2109c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->SwapBytes) { 2110c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2111c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint value = s[i]; 2112c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(value); 2113c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = value; 2114c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2115c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2116c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2117c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 2118c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 2119c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2120c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2121c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2122c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_INT: 2123c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2124c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2125c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLint *s = (const GLint *) src; 2126c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->SwapBytes) { 2127c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2128c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint value = s[i]; 2129c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(value); 2130c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = value; 2131c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2132c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2133c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2134c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 2135c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 2136c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2137c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2138c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2139c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_FLOAT: 2140c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2141c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2142c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLfloat *s = (const GLfloat *) src; 2143c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->SwapBytes) { 2144c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2145c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLfloat value = s[i]; 2146c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(value); 2147959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul indexes[i] = (GLuint) value; 2148c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2149c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2150c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2151c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 2152959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul indexes[i] = (GLuint) s[i]; 2153c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2154c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2155c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2156f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_HALF_FLOAT_ARB: 21577eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul { 21587eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul GLuint i; 2159f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLhalfARB *s = (const GLhalfARB *) src; 21607eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul if (unpack->SwapBytes) { 21617eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul for (i = 0; i < n; i++) { 2162f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLhalfARB value = s[i]; 21637eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul SWAP2BYTE(value); 21647eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul indexes[i] = (GLuint) _mesa_half_to_float(value); 21657eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 21667eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 21677eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul else { 21687eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul for (i = 0; i < n; i++) 21697eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul indexes[i] = (GLuint) _mesa_half_to_float(s[i]); 21707eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 21717eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 21727eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul break; 2173c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul default: 217408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(NULL, "bad srcType in extract_uint_indexes"); 2175c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 2176c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2177c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 2178c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2179c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2180c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/* 2181c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This function extracts floating point RGBA values from arbitrary 2182c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * image data. srcFormat and srcType are the format and type parameters 2183c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc. 2184c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * 2185c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function 2186c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * implements the "Conversion to floating point", "Conversion to RGB", 2187c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * and "Final Expansion to RGBA" operations. 2188c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * 2189c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Args: n - number of pixels 2190c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * rgba - output colors 2191c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * srcFormat - format of incoming data 21926dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * srcType - data type of incoming data 2193c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * src - source data pointer 2194c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * swapBytes - perform byteswapping of incoming data? 2195c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 2196c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic void 2197c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulextract_float_rgba(GLuint n, GLfloat rgba[][4], 2198c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum srcFormat, GLenum srcType, const GLvoid *src, 2199c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLboolean swapBytes) 2200c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 2201c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint redIndex, greenIndex, blueIndex, alphaIndex; 2202c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint stride; 2203c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint rComp, bComp, gComp, aComp; 2204c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2205c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcFormat == GL_RED || 2206c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_GREEN || 2207c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BLUE || 2208c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_ALPHA || 2209c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_LUMINANCE || 2210c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_LUMINANCE_ALPHA || 2211c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_INTENSITY || 2212c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_RGB || 2213c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BGR || 2214c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_RGBA || 2215c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BGRA || 2216c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_ABGR_EXT); 2217c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2218c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcType == GL_UNSIGNED_BYTE || 2219c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_BYTE || 2220c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT || 2221c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_SHORT || 2222c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT || 2223c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_INT || 2224f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_HALF_FLOAT_ARB || 2225c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_FLOAT || 2226c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_BYTE_3_3_2 || 2227a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 2228a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_5_6_5 || 2229a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 2230c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 2231a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 2232c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 2233a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 2234c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT_8_8_8_8 || 2235a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 2236a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_10_10_10_2 || 2237a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_2_10_10_10_REV); 2238c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2239a0020435f58baef6a67d3c073b62ea6b1d143af1Brian Paul rComp = gComp = bComp = aComp = -1; 2240a0020435f58baef6a67d3c073b62ea6b1d143af1Brian Paul 2241c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul switch (srcFormat) { 2242c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_RED: 2243c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 0; 2244c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = blueIndex = alphaIndex = -1; 2245c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 2246c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2247c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_GREEN: 2248c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 0; 2249c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = blueIndex = alphaIndex = -1; 2250c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 2251c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2252c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BLUE: 2253c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 0; 2254c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = greenIndex = alphaIndex = -1; 2255c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 2256c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2257c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_ALPHA: 2258c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = greenIndex = blueIndex = -1; 2259c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = 0; 2260c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 2261c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 22625e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen case GL_LUMINANCE: 2263c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = greenIndex = blueIndex = 0; 2264c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = -1; 2265c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 2266c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2267c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_LUMINANCE_ALPHA: 2268c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = greenIndex = blueIndex = 0; 2269c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = 1; 2270c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 2; 2271c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2272c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_INTENSITY: 227301429fa46a05cba7d2d11825facd7d8e6117dacdBrian Paul redIndex = greenIndex = blueIndex = alphaIndex = 0; 2274c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 2275c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2276c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_RGB: 2277c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 0; 2278c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 1; 2279c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 2; 2280c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = -1; 2281c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 3; 2282c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2283c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BGR: 2284c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 2; 2285c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 1; 2286c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 0; 2287c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = -1; 2288c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 3; 2289c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2290c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_RGBA: 2291c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 0; 2292c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 1; 2293c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 2; 2294c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = 3; 2295c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rComp = 0; 2296c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gComp = 1; 2297c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bComp = 2; 2298c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul aComp = 3; 2299c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 4; 2300c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2301c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BGRA: 2302c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 2; 2303c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 1; 2304c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 0; 2305c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = 3; 2306c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rComp = 2; 2307c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gComp = 1; 2308c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bComp = 0; 2309c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul aComp = 3; 2310c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 4; 2311c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2312c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_ABGR_EXT: 2313c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 3; 2314c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 2; 2315c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 1; 2316c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = 0; 2317c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rComp = 3; 2318c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gComp = 2; 2319c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bComp = 1; 2320c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul aComp = 0; 2321c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 4; 2322c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2323c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul default: 232408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(NULL, "bad srcFormat in extract float data"); 2325c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 2326c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2327c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2328c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2329c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define PROCESS(INDEX, CHANNEL, DEFAULT, TYPE, CONVERSION) \ 2330c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if ((INDEX) < 0) { \ 2331c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; \ 2332c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { \ 2333c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][CHANNEL] = DEFAULT; \ 2334c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 2335c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 2336c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (swapBytes) { \ 2337c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const TYPE *s = (const TYPE *) src; \ 2338c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; \ 2339c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { \ 2340c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul TYPE value = s[INDEX]; \ 2341c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (sizeof(TYPE) == 2) { \ 2342c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(value); \ 2343c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 2344c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (sizeof(TYPE) == 4) { \ 2345c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(value); \ 2346c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 2347c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][CHANNEL] = (GLfloat) CONVERSION(value); \ 2348c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul s += stride; \ 2349c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 2350c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 2351c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { \ 2352c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const TYPE *s = (const TYPE *) src; \ 2353c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; \ 2354c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { \ 2355c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][CHANNEL] = (GLfloat) CONVERSION(s[INDEX]); \ 2356c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul s += stride; \ 2357c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 2358c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2359c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2360c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul switch (srcType) { 2361c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_BYTE: 2362c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT); 2363c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT); 2364c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT); 2365c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLubyte, UBYTE_TO_FLOAT); 2366c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2367c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BYTE: 2368c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT); 2369c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT); 2370c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT); 2371c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLbyte, BYTE_TO_FLOAT); 2372c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2373c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT: 2374c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLushort, USHORT_TO_FLOAT); 2375c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLushort, USHORT_TO_FLOAT); 2376c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLushort, USHORT_TO_FLOAT); 2377c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLushort, USHORT_TO_FLOAT); 2378c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2379c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_SHORT: 2380c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLshort, SHORT_TO_FLOAT); 2381c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLshort, SHORT_TO_FLOAT); 2382c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLshort, SHORT_TO_FLOAT); 2383c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLshort, SHORT_TO_FLOAT); 2384c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2385c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT: 2386c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLuint, UINT_TO_FLOAT); 2387c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLuint, UINT_TO_FLOAT); 2388c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLuint, UINT_TO_FLOAT); 2389c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLuint, UINT_TO_FLOAT); 2390c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2391c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_INT: 2392c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLint, INT_TO_FLOAT); 2393c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLint, INT_TO_FLOAT); 2394c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLint, INT_TO_FLOAT); 2395c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLint, INT_TO_FLOAT); 2396c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2397c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_FLOAT: 2398c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLfloat, (GLfloat)); 2399c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLfloat, (GLfloat)); 2400c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLfloat, (GLfloat)); 2401c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLfloat, (GLfloat)); 2402c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2403f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_HALF_FLOAT_ARB: 2404f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul PROCESS(redIndex, RCOMP, 0.0F, GLhalfARB, _mesa_half_to_float); 2405f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLhalfARB, _mesa_half_to_float); 2406f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLhalfARB, _mesa_half_to_float); 2407f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLhalfARB, _mesa_half_to_float); 24087eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul break; 2409c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_BYTE_3_3_2: 2410c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2411c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLubyte *ubsrc = (const GLubyte *) src; 2412c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2413c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2414c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte p = ubsrc[i]; 2415c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p >> 5) ) * (1.0F / 7.0F); 2416c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 2) & 0x7) * (1.0F / 7.0F); 2417c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p ) & 0x3) * (1.0F / 3.0F); 2418c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 2419c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2420c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2421c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2422c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_BYTE_2_3_3_REV: 2423c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2424c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLubyte *ubsrc = (const GLubyte *) src; 2425c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2426c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2427c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte p = ubsrc[i]; 2428c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p ) & 0x7) * (1.0F / 7.0F); 2429c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 3) & 0x7) * (1.0F / 7.0F); 2430c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p >> 6) ) * (1.0F / 3.0F); 2431c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 2432c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2433c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2434c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2435c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_5_6_5: 2436c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2437c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2438c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2439c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2440c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2441c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 2442c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p >> 11) ) * (1.0F / 31.0F); 2443c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 5) & 0x3f) * (1.0F / 63.0F); 2444c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p ) & 0x1f) * (1.0F / 31.0F); 2445c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 2446c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2447c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2448c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2449c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2450c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2451c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2452c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2453c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p >> 11) ) * (1.0F / 31.0F); 2454c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 5) & 0x3f) * (1.0F / 63.0F); 2455c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p ) & 0x1f) * (1.0F / 31.0F); 2456c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 2457c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2458c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2459c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2460c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_5_6_5_REV: 2461c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2462c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2463c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2464c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2465c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2466c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 2467c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p ) & 0x1f) * (1.0F / 31.0F); 2468c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 5) & 0x3f) * (1.0F / 63.0F); 2469c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p >> 11) ) * (1.0F / 31.0F); 2470c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 2471c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2472c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2473c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2474c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2475c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2476c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2477c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2478c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p ) & 0x1f) * (1.0F / 31.0F); 2479c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 5) & 0x3f) * (1.0F / 63.0F); 2480c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p >> 11) ) * (1.0F / 31.0F); 2481c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 2482c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2483c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2484c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2485c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_4_4_4_4: 2486c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2487c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2488c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2489c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2490c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2491c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 2492c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p >> 12) ) * (1.0F / 15.0F); 2493c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F); 2494c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F); 2495c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p ) & 0xf) * (1.0F / 15.0F); 2496c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2497c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2498c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2499c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2500c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2501c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2502c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2503c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p >> 12) ) * (1.0F / 15.0F); 2504c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F); 2505c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F); 2506c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p ) & 0xf) * (1.0F / 15.0F); 2507c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2508c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2509c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2510c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_4_4_4_4_REV: 2511c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2512c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2513c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2514c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2515c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2516c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 2517c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0xf) * (1.0F / 15.0F); 2518c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F); 2519c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F); 2520c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 12) ) * (1.0F / 15.0F); 2521c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2522c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2523c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2524c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2525c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2526c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2527c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2528c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0xf) * (1.0F / 15.0F); 2529c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F); 2530c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F); 2531c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 12) ) * (1.0F / 15.0F); 2532c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2533c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2534c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2535c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_5_5_5_1: 2536c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2537c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2538c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2539c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2540c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2541c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 2542c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p >> 11) ) * (1.0F / 31.0F); 2543c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 6) & 0x1f) * (1.0F / 31.0F); 2544c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 1) & 0x1f) * (1.0F / 31.0F); 2545c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p ) & 0x1) * (1.0F / 1.0F); 2546c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2547c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2548c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2549c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2550c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2551c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2552c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2553c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p >> 11) ) * (1.0F / 31.0F); 2554c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 6) & 0x1f) * (1.0F / 31.0F); 2555c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 1) & 0x1f) * (1.0F / 31.0F); 2556c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p ) & 0x1) * (1.0F / 1.0F); 2557c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2558c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2559c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2560c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_1_5_5_5_REV: 2561c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2562c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2563c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2564c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2565c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2566c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 2567c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0x1f) * (1.0F / 31.0F); 2568c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 5) & 0x1f) * (1.0F / 31.0F); 2569c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F); 2570c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 15) ) * (1.0F / 1.0F); 2571c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2572c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2573c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2574c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2575c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2576c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2577c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2578c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0x1f) * (1.0F / 31.0F); 2579c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 5) & 0x1f) * (1.0F / 31.0F); 2580c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F); 2581c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 15) ) * (1.0F / 1.0F); 2582c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2583c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2584c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2585c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT_8_8_8_8: 2586c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2587c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2588c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2589c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2590c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 25913041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][rComp] = UBYTE_TO_FLOAT((p ) & 0xff); 25923041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 25933041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 25943041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][aComp] = UBYTE_TO_FLOAT((p >> 24) ); 2595c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2596c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2597c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2598c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2599c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2600c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2601c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 26023041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][rComp] = UBYTE_TO_FLOAT((p >> 24) ); 26033041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 26043041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 26053041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][aComp] = UBYTE_TO_FLOAT((p ) & 0xff); 2606c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2607c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2608c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2609c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT_8_8_8_8_REV: 2610c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2611c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2612c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2613c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2614c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 26153041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][rComp] = UBYTE_TO_FLOAT((p >> 24) ); 26163041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 26173041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 26183041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][aComp] = UBYTE_TO_FLOAT((p ) & 0xff); 2619c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2620c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2621c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2622c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2623c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2624c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2625c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 26263041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][rComp] = UBYTE_TO_FLOAT((p ) & 0xff); 26273041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 26283041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 26293041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul rgba[i][aComp] = UBYTE_TO_FLOAT((p >> 24) ); 2630c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2631c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2632c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2633c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT_10_10_10_2: 2634c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2635c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2636c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2637c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2638c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 2639c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(p); 2640a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][rComp] = ((p >> 22) ) * (1.0F / 1023.0F); 2641a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F); 2642a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][bComp] = ((p >> 2) & 0x3ff) * (1.0F / 1023.0F); 2643a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][aComp] = ((p ) & 0x3 ) * (1.0F / 3.0F); 2644c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2645c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2646c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2647c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2648c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2649c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2650c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 2651a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][rComp] = ((p >> 22) ) * (1.0F / 1023.0F); 2652a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F); 2653a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][bComp] = ((p >> 2) & 0x3ff) * (1.0F / 1023.0F); 2654a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][aComp] = ((p ) & 0x3 ) * (1.0F / 3.0F); 2655c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2656c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2657c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2658c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT_2_10_10_10_REV: 2659c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2660c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2661c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2662c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2663c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 2664c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(p); 2665c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0x3ff) * (1.0F / 1023.0F); 2666c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F); 2667c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F); 2668c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 30) ) * (1.0F / 3.0F); 2669c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2670c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2671c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2672c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2673c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2674c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2675c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 2676c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0x3ff) * (1.0F / 1023.0F); 2677c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F); 2678c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F); 2679c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 30) ) * (1.0F / 3.0F); 2680c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2681c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2682c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2683c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul default: 268408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(NULL, "bad srcType in extract float data"); 2685c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2686c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2687c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 2688c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2689c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2690c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/* 2691c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack a row of color image data from a client buffer according to 2692fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * the pixel unpacking parameters. 269394f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul * Return GLchan values in the specified dest image format. 269494f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul * This is used by glDrawPixels and glTexImage?D(). 26956dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx - the context 2696c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * n - number of pixels in the span 2697c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * dstFormat - format of destination color array 2698c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * dest - the destination color array 2699c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * srcFormat - source image format 27006dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * srcType - source image data type 2701c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * source - source image pointer 2702b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul * srcPacking - pixel unpacking parameters 2703fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * transferOps - bitmask of IMAGE_*_BIT values of operations to apply 2704c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * 2705c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * XXX perhaps expand this to process whole images someday. 2706c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 2707c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid 27088cfd08b6134e2036ddceb1facfa82e15026068a2Brian Paul_mesa_unpack_color_span_chan( GLcontext *ctx, 2709699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLuint n, GLenum dstFormat, GLchan dest[], 2710699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLenum srcFormat, GLenum srcType, 2711699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul const GLvoid *source, 2712699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul const struct gl_pixelstore_attrib *srcPacking, 2713699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLuint transferOps ) 2714c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 2715c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(dstFormat == GL_ALPHA || 27165e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen dstFormat == GL_LUMINANCE || 2717c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_LUMINANCE_ALPHA || 2718c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_INTENSITY || 2719c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_RGB || 2720c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_RGBA || 2721c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_COLOR_INDEX); 2722c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2723c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcFormat == GL_RED || 2724c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_GREEN || 2725c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BLUE || 2726c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_ALPHA || 2727c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_LUMINANCE || 2728c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_LUMINANCE_ALPHA || 2729c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_INTENSITY || 2730c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_RGB || 2731c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BGR || 2732c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_RGBA || 2733c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BGRA || 2734c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_ABGR_EXT || 2735c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_COLOR_INDEX); 2736c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2737c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcType == GL_BITMAP || 2738c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_BYTE || 2739c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_BYTE || 2740c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT || 2741c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_SHORT || 2742c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT || 2743c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_INT || 2744f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_HALF_FLOAT_ARB || 2745c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_FLOAT || 2746c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_BYTE_3_3_2 || 2747a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 2748a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_5_6_5 || 2749a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 2750c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 2751a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 2752c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 2753a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 2754c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT_8_8_8_8 || 2755a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 2756a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_10_10_10_2 || 2757a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_2_10_10_10_REV); 2758c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2759c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Try simple cases first */ 2760f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (transferOps == 0) { 2761aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul if (srcType == CHAN_TYPE) { 2762aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul if (dstFormat == GL_RGBA) { 2763aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul if (srcFormat == GL_RGBA) { 2764aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul MEMCPY( dest, source, n * 4 * sizeof(GLchan) ); 2765aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul return; 2766aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2767aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul else if (srcFormat == GL_RGB) { 2768aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLuint i; 2769aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul const GLchan *src = (const GLchan *) source; 2770aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLchan *dst = dest; 2771aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul for (i = 0; i < n; i++) { 2772aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[0] = src[0]; 2773aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[1] = src[1]; 2774aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[2] = src[2]; 2775aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[3] = CHAN_MAX; 2776aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul src += 3; 2777aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst += 4; 2778aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2779aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul return; 2780aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2781c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2782aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul else if (dstFormat == GL_RGB) { 2783aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul if (srcFormat == GL_RGB) { 2784aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul MEMCPY( dest, source, n * 3 * sizeof(GLchan) ); 2785aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul return; 2786aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2787aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul else if (srcFormat == GL_RGBA) { 2788aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLuint i; 2789aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul const GLchan *src = (const GLchan *) source; 2790aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLchan *dst = dest; 2791aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul for (i = 0; i < n; i++) { 2792aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[0] = src[0]; 2793aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[1] = src[1]; 2794aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[2] = src[2]; 2795aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul src += 4; 2796aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst += 3; 2797aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2798aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul return; 2799c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2800aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2801aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul else if (dstFormat == srcFormat) { 2802aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLint comps = _mesa_components_in_format(srcFormat); 2803aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul assert(comps > 0); 2804aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul MEMCPY( dest, source, n * comps * sizeof(GLchan) ); 2805c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 2806c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2807c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2808aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul /* 2809aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul * Common situation, loading 8bit RGBA/RGB source images 2810aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul * into 16/32 bit destination. (OSMesa16/32) 2811aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul */ 2812aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul else if (srcType == GL_UNSIGNED_BYTE) { 2813aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul if (dstFormat == GL_RGBA) { 2814aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul if (srcFormat == GL_RGB) { 2815aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLuint i; 2816aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul const GLubyte *src = (const GLubyte *) source; 2817aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLchan *dst = dest; 2818aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul for (i = 0; i < n; i++) { 2819aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[0] = UBYTE_TO_CHAN(src[0]); 2820aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[1] = UBYTE_TO_CHAN(src[1]); 2821aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[2] = UBYTE_TO_CHAN(src[2]); 2822aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[3] = CHAN_MAX; 2823aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul src += 3; 2824aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst += 4; 2825aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2826aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul return; 2827aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2828aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul else if (srcFormat == GL_RGBA) { 2829aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLuint i; 2830aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul const GLubyte *src = (const GLubyte *) source; 2831aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLchan *dst = dest; 2832aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul for (i = 0; i < n; i++) { 2833aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[0] = UBYTE_TO_CHAN(src[0]); 2834aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[1] = UBYTE_TO_CHAN(src[1]); 2835aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[2] = UBYTE_TO_CHAN(src[2]); 2836aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[3] = UBYTE_TO_CHAN(src[3]); 2837aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul src += 4; 2838aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst += 4; 2839aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2840aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul return; 2841aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2842c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2843aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul else if (dstFormat == GL_RGB) { 2844aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul if (srcFormat == GL_RGB) { 2845aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLuint i; 2846aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul const GLubyte *src = (const GLubyte *) source; 2847aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLchan *dst = dest; 2848aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul for (i = 0; i < n; i++) { 2849aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[0] = UBYTE_TO_CHAN(src[0]); 2850aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[1] = UBYTE_TO_CHAN(src[1]); 2851aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[2] = UBYTE_TO_CHAN(src[2]); 2852aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul src += 3; 2853aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst += 3; 2854aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2855aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul return; 2856aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2857aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul else if (srcFormat == GL_RGBA) { 2858aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLuint i; 2859aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul const GLubyte *src = (const GLubyte *) source; 2860aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul GLchan *dst = dest; 2861aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul for (i = 0; i < n; i++) { 2862aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[0] = UBYTE_TO_CHAN(src[0]); 2863aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[1] = UBYTE_TO_CHAN(src[1]); 2864aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst[2] = UBYTE_TO_CHAN(src[2]); 2865aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul src += 4; 2866aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul dst += 3; 2867aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul } 2868aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul return; 2869c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2870c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2871c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2872c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2873c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2874c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2875179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul /* general solution begins here */ 2876c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2877c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint dstComponents; 2878c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint dstRedIndex, dstGreenIndex, dstBlueIndex, dstAlphaIndex; 2879c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint dstLuminanceIndex, dstIntensityIndex; 288047cf442c1164b6b406117fccfb8b564602741ee3Brian Paul DEFMARRAY(GLfloat, rgba, MAX_WIDTH, 4); /* mac 32k limitation */ 288147cf442c1164b6b406117fccfb8b564602741ee3Brian Paul CHECKARRAY(rgba, return); /* mac 32k limitation */ 2882c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2883b7d076fc96ac27117421653a043d00a95f789d24Brian Paul dstComponents = _mesa_components_in_format( dstFormat ); 2884c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* source & dest image formats should have been error checked by now */ 2885c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(dstComponents > 0); 2886c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2887c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* 2888c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Extract image data and convert to RGBA floats 2889c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 2890c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(n <= MAX_WIDTH); 2891c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (srcFormat == GL_COLOR_INDEX) { 2892c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint indexes[MAX_WIDTH]; 2893c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul extract_uint_indexes(n, indexes, srcFormat, srcType, source, 2894b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul srcPacking); 2895c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2896fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul if (dstFormat == GL_COLOR_INDEX 2897fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul && (transferOps & IMAGE_MAP_COLOR_BIT)) { 2898fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul _mesa_map_ci(ctx, n, indexes); 2899fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul } 2900fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 2901fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul _mesa_shift_and_offset_ci(ctx, n, indexes); 2902c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2903c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2904c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstFormat == GL_COLOR_INDEX) { 2905699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* convert to GLchan and return */ 2906c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 2907c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 2908699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dest[i] = (GLchan) (indexes[i] & 0xff); 2909c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 291047cf442c1164b6b406117fccfb8b564602741ee3Brian Paul UNDEFARRAY(rgba); /* mac 32k limitation */ 2911c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul return; 2912c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2913c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2914c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Convert indexes to RGBA */ 2915179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul _mesa_map_ci_to_rgba(ctx, n, indexes, rgba); 2916c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2917833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul 2918833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting 2919833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul * with color indexes. 2920833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul */ 2921833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul transferOps &= ~(IMAGE_SCALE_BIAS_BIT | IMAGE_MAP_COLOR_BIT); 2922c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2923c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2924833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul /* non-color index data */ 2925c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul extract_float_rgba(n, rgba, srcFormat, srcType, source, 2926b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul srcPacking->SwapBytes); 2927c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2928c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 29294923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul /* Need to clamp if returning GLubytes or GLushorts */ 293096385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul#if CHAN_TYPE != GL_FLOAT 2931833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul transferOps |= IMAGE_CLAMP_BIT; 293296385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul#endif 2933c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2934833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul if (transferOps) { 2935833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba); 2936833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul } 2937833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul 2938c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Now determine which color channels we need to produce. 2939c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * And determine the dest index (offset) within each color tuple. 2940c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 2941c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul switch (dstFormat) { 2942c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_ALPHA: 2943c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstAlphaIndex = 0; 2944c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = -1; 2945c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstLuminanceIndex = dstIntensityIndex = -1; 2946c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 29475e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen case GL_LUMINANCE: 2948c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstLuminanceIndex = 0; 2949c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1; 2950c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstIntensityIndex = -1; 2951c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2952c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_LUMINANCE_ALPHA: 2953c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstLuminanceIndex = 0; 2954c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstAlphaIndex = 1; 2955c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = -1; 2956c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstIntensityIndex = -1; 2957c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2958c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_INTENSITY: 2959c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstIntensityIndex = 0; 2960c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1; 2961c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstLuminanceIndex = -1; 2962c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2963c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_RGB: 2964c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = 0; 2965c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstGreenIndex = 1; 2966c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstBlueIndex = 2; 2967c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1; 2968c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2969c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_RGBA: 2970c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = 0; 2971c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstGreenIndex = 1; 2972c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstBlueIndex = 2; 2973c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstAlphaIndex = 3; 2974c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstLuminanceIndex = dstIntensityIndex = -1; 2975c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2976c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul default: 297708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad dstFormat in _mesa_unpack_chan_span()"); 297847cf442c1164b6b406117fccfb8b564602741ee3Brian Paul UNDEFARRAY(rgba); /* mac 32k limitation */ 2979276988ec96a48d4ee5c28c0a2da3aa2b5ee0bbeaBrian Paul return; 2980c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2981c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2982c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2983699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* Now return the GLchan data in the requested dstFormat */ 2984fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2985c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstRedIndex >= 0) { 2986699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dst = dest; 2987c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2988c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 29896532db986883ea1a431c043126de4947465834a1Brian Paul CLAMPED_FLOAT_TO_CHAN(dst[dstRedIndex], rgba[i][RCOMP]); 2990c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += dstComponents; 2991c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2992c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2993c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2994c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstGreenIndex >= 0) { 2995699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dst = dest; 2996c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2997c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 29986532db986883ea1a431c043126de4947465834a1Brian Paul CLAMPED_FLOAT_TO_CHAN(dst[dstGreenIndex], rgba[i][GCOMP]); 2999c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += dstComponents; 3000c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3001c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3002c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3003c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstBlueIndex >= 0) { 3004699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dst = dest; 3005c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 3006c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 30076532db986883ea1a431c043126de4947465834a1Brian Paul CLAMPED_FLOAT_TO_CHAN(dst[dstBlueIndex], rgba[i][BCOMP]); 3008c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += dstComponents; 3009c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3010c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3011c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3012c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstAlphaIndex >= 0) { 3013699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dst = dest; 3014c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 3015c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 30166532db986883ea1a431c043126de4947465834a1Brian Paul CLAMPED_FLOAT_TO_CHAN(dst[dstAlphaIndex], rgba[i][ACOMP]); 3017c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += dstComponents; 3018c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3019c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3020c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3021c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstIntensityIndex >= 0) { 3022699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dst = dest; 3023c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 3024c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(dstIntensityIndex == 0); 3025c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(dstComponents == 1); 3026c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 3027c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Intensity comes from red channel */ 30286532db986883ea1a431c043126de4947465834a1Brian Paul CLAMPED_FLOAT_TO_CHAN(dst[i], rgba[i][RCOMP]); 3029c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3030c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3031c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3032c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstLuminanceIndex >= 0) { 3033699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul GLchan *dst = dest; 3034c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 3035c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(dstLuminanceIndex == 0); 3036c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 3037c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Luminance comes from red channel */ 30386532db986883ea1a431c043126de4947465834a1Brian Paul CLAMPED_FLOAT_TO_CHAN(dst[0], rgba[i][RCOMP]); 3039c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += dstComponents; 3040c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3041c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 304247cf442c1164b6b406117fccfb8b564602741ee3Brian Paul UNDEFARRAY(rgba); /* mac 32k limitation */ 3043c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3044c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 3045c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3046c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 304794f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul/** 304894f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul * Same as _mesa_unpack_color_span_chan(), but return GLfloat data 304994f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul * instead of GLchan. 305094f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul */ 3051c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paulvoid 30528cfd08b6134e2036ddceb1facfa82e15026068a2Brian Paul_mesa_unpack_color_span_float( GLcontext *ctx, 3053c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint n, GLenum dstFormat, GLfloat dest[], 3054c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLenum srcFormat, GLenum srcType, 3055c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul const GLvoid *source, 3056b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul const struct gl_pixelstore_attrib *srcPacking, 30574923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul GLuint transferOps ) 3058c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul{ 3059c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul ASSERT(dstFormat == GL_ALPHA || 30605e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen dstFormat == GL_LUMINANCE || 3061c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstFormat == GL_LUMINANCE_ALPHA || 3062c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstFormat == GL_INTENSITY || 3063c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstFormat == GL_RGB || 3064c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstFormat == GL_RGBA || 3065c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstFormat == GL_COLOR_INDEX); 3066c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3067c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul ASSERT(srcFormat == GL_RED || 3068c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_GREEN || 3069c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_BLUE || 3070c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_ALPHA || 3071c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_LUMINANCE || 3072c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_LUMINANCE_ALPHA || 3073c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_INTENSITY || 3074c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_RGB || 3075c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_BGR || 3076c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_RGBA || 3077c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_BGRA || 3078c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_ABGR_EXT || 3079c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_COLOR_INDEX); 3080c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3081c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul ASSERT(srcType == GL_BITMAP || 3082c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_BYTE || 3083c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_BYTE || 3084c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT || 3085c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_SHORT || 3086c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_INT || 3087c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_INT || 3088f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_HALF_FLOAT_ARB || 3089c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_FLOAT || 3090c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_BYTE_3_3_2 || 3091c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 3092c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT_5_6_5 || 3093c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 3094c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 3095c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 3096c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 3097c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 3098c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_INT_8_8_8_8 || 3099c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 3100c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_INT_10_10_10_2 || 3101c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_INT_2_10_10_10_REV); 3102c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3103c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* general solution, no special cases, yet */ 3104c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul { 3105c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLint dstComponents; 3106c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLint dstRedIndex, dstGreenIndex, dstBlueIndex, dstAlphaIndex; 3107c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLint dstLuminanceIndex, dstIntensityIndex; 310847cf442c1164b6b406117fccfb8b564602741ee3Brian Paul DEFMARRAY(GLfloat, rgba, MAX_WIDTH, 4); /* mac 32k limitation */ 310947cf442c1164b6b406117fccfb8b564602741ee3Brian Paul CHECKARRAY(rgba, return); /* mac 32k limitation */ 3110c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3111c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstComponents = _mesa_components_in_format( dstFormat ); 3112c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* source & dest image formats should have been error checked by now */ 3113c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul assert(dstComponents > 0); 3114c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3115c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* 3116c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul * Extract image data and convert to RGBA floats 3117c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul */ 3118c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul assert(n <= MAX_WIDTH); 3119c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (srcFormat == GL_COLOR_INDEX) { 3120c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint indexes[MAX_WIDTH]; 3121c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul extract_uint_indexes(n, indexes, srcFormat, srcType, source, 3122b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul srcPacking); 3123c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3124fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul if (dstFormat == GL_COLOR_INDEX 3125fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul && (transferOps & IMAGE_MAP_COLOR_BIT)) { 3126fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul _mesa_map_ci(ctx, n, indexes); 3127fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul } 3128fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 3129fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul _mesa_shift_and_offset_ci(ctx, n, indexes); 3130c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3131c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3132c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstFormat == GL_COLOR_INDEX) { 3133699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul /* convert to GLchan and return */ 3134c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 3135c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 3136699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul dest[i] = (GLchan) (indexes[i] & 0xff); 3137c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 313847cf442c1164b6b406117fccfb8b564602741ee3Brian Paul UNDEFARRAY(rgba); /* mac 32k limitation */ 3139c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul return; 3140c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3141c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul else { 3142c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* Convert indexes to RGBA */ 3143c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_map_ci_to_rgba(ctx, n, indexes, rgba); 3144c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3145833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul 3146833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting 3147833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul * with color indexes. 3148833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul */ 3149833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul transferOps &= ~(IMAGE_SCALE_BIAS_BIT | IMAGE_MAP_COLOR_BIT); 3150c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3151c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul else { 3152833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul /* non-color index data */ 3153c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul extract_float_rgba(n, rgba, srcFormat, srcType, source, 3154b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul srcPacking->SwapBytes); 3155c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3156c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3157833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul if (transferOps) { 3158833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba); 3159833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul } 3160833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul 3161c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* Now determine which color channels we need to produce. 3162c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul * And determine the dest index (offset) within each color tuple. 3163c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul */ 3164c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul switch (dstFormat) { 3165c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul case GL_ALPHA: 3166c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstAlphaIndex = 0; 3167c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = -1; 3168c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstLuminanceIndex = dstIntensityIndex = -1; 3169c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul break; 31705e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen case GL_LUMINANCE: 3171c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstLuminanceIndex = 0; 3172c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1; 3173c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstIntensityIndex = -1; 3174c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul break; 3175c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul case GL_LUMINANCE_ALPHA: 3176c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstLuminanceIndex = 0; 3177c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstAlphaIndex = 1; 3178c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = -1; 3179c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstIntensityIndex = -1; 3180c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul break; 3181c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul case GL_INTENSITY: 3182c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstIntensityIndex = 0; 3183c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1; 3184c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstLuminanceIndex = -1; 3185c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul break; 3186c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul case GL_RGB: 3187c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstRedIndex = 0; 3188c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstGreenIndex = 1; 3189c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstBlueIndex = 2; 3190c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1; 3191c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul break; 3192c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul case GL_RGBA: 3193c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstRedIndex = 0; 3194c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstGreenIndex = 1; 3195c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstBlueIndex = 2; 3196c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstAlphaIndex = 3; 3197c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstLuminanceIndex = dstIntensityIndex = -1; 3198c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul break; 3199c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul default: 32008cfd08b6134e2036ddceb1facfa82e15026068a2Brian Paul _mesa_problem(ctx, "bad dstFormat in _mesa_unpack_color_span_float()"); 320147cf442c1164b6b406117fccfb8b564602741ee3Brian Paul UNDEFARRAY(rgba); /* mac 32k limitation */ 3202c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul return; 3203c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3204c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3205fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* Now pack results in the requested dstFormat */ 3206c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstRedIndex >= 0) { 3207c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat *dst = dest; 3208c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 3209c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 3210c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst[dstRedIndex] = rgba[i][RCOMP]; 3211c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst += dstComponents; 3212c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3213c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3214c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3215c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstGreenIndex >= 0) { 3216c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat *dst = dest; 3217c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 3218c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 3219c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst[dstGreenIndex] = rgba[i][GCOMP]; 3220c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst += dstComponents; 3221c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3222c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3223c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3224c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstBlueIndex >= 0) { 3225c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat *dst = dest; 3226c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 3227c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 3228c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst[dstBlueIndex] = rgba[i][BCOMP]; 3229c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst += dstComponents; 3230c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3231c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3232c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3233c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstAlphaIndex >= 0) { 3234c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat *dst = dest; 3235c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 3236c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 3237c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst[dstAlphaIndex] = rgba[i][ACOMP]; 3238c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst += dstComponents; 3239c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3240c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3241c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3242c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstIntensityIndex >= 0) { 3243c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat *dst = dest; 3244c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 3245c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul assert(dstIntensityIndex == 0); 3246c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul assert(dstComponents == 1); 3247c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 3248c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* Intensity comes from red channel */ 3249c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst[i] = rgba[i][RCOMP]; 3250c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3251c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3252c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3253c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstLuminanceIndex >= 0) { 3254c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat *dst = dest; 3255c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 3256c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul assert(dstLuminanceIndex == 0); 3257c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 3258c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* Luminance comes from red channel */ 3259c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst[0] = rgba[i][RCOMP]; 3260c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst += dstComponents; 3261c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3262c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 326347cf442c1164b6b406117fccfb8b564602741ee3Brian Paul UNDEFARRAY(rgba); /* mac 32k limitation */ 3264c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 3265c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul} 3266c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3267c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 3268c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/* 3269c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack a row of color index data from a client buffer according to 3270fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * the pixel unpacking parameters. 3271c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc. 3272c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * 3273c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Args: ctx - the context 3274c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * n - number of pixels 32756dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * dstType - destination data type 3276c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * dest - destination array 3277c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * srcType - source pixel type 3278c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * source - source data pointer 3279b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul * srcPacking - pixel unpacking parameters 3280fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * transferOps - the pixel transfer operations to apply 3281c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 3282c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid 3283c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul_mesa_unpack_index_span( const GLcontext *ctx, GLuint n, 3284c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum dstType, GLvoid *dest, 3285c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum srcType, const GLvoid *source, 3286b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul const struct gl_pixelstore_attrib *srcPacking, 3287fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul GLuint transferOps ) 3288c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 3289c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcType == GL_BITMAP || 3290c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_BYTE || 3291c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_BYTE || 3292c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT || 3293c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_SHORT || 3294c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT || 3295c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_INT || 3296f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_HALF_FLOAT_ARB || 3297c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_FLOAT); 3298c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3299c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(dstType == GL_UNSIGNED_BYTE || 3300c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstType == GL_UNSIGNED_SHORT || 3301c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstType == GL_UNSIGNED_INT); 3302c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3303fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul 3304fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT); 3305c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3306c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* 3307c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Try simple cases first 3308c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 3309fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps == 0 && srcType == GL_UNSIGNED_BYTE 3310c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul && dstType == GL_UNSIGNED_BYTE) { 3311c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul MEMCPY(dest, source, n * sizeof(GLubyte)); 3312c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3313fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul else if (transferOps == 0 && srcType == GL_UNSIGNED_INT 3314b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul && dstType == GL_UNSIGNED_INT && !srcPacking->SwapBytes) { 3315c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul MEMCPY(dest, source, n * sizeof(GLuint)); 3316c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3317c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 3318c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* 3319c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * general solution 3320c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 3321c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint indexes[MAX_WIDTH]; 3322c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(n <= MAX_WIDTH); 3323c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3324c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source, 3325b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul srcPacking); 3326c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3327fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 3328fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* shift and offset indexes */ 3329fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul _mesa_shift_and_offset_ci(ctx, n, indexes); 3330fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul } 3331fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_MAP_COLOR_BIT) { 3332fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* Apply lookup table */ 3333fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul _mesa_map_ci(ctx, n, indexes); 3334c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3335c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3336c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* convert to dest type */ 3337c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul switch (dstType) { 3338c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_BYTE: 3339c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 3340c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dst = (GLubyte *) dest; 3341c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 3342c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 3343c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[i] = (GLubyte) (indexes[i] & 0xff); 3344c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3345c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3346c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 3347c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT: 3348c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 3349c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint *dst = (GLuint *) dest; 3350c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 3351c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 3352c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[i] = (GLushort) (indexes[i] & 0xffff); 3353c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3354c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3355c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 3356c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT: 3357c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul MEMCPY(dest, indexes, n * sizeof(GLuint)); 3358c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 3359c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul default: 336008836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad dstType in _mesa_unpack_index_span"); 3361c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3362c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3363c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 3364c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3365c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 336623e8d46e072669e0974d7b2c168d4770183106bdBrian Paulvoid 336723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul_mesa_pack_index_span( const GLcontext *ctx, GLuint n, 336823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLenum dstType, GLvoid *dest, const GLuint *source, 336923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul const struct gl_pixelstore_attrib *dstPacking, 337023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint transferOps ) 337123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul{ 337223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint indexes[MAX_WIDTH]; 337323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 337423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul ASSERT(n <= MAX_WIDTH); 337523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 337623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT); 337723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 337823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (transferOps & (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT)) { 337923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul /* make a copy of input */ 338023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul MEMCPY(indexes, source, n * sizeof(GLuint)); 338123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 338223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_shift_and_offset_ci( ctx, n, indexes); 338323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 338423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (transferOps & IMAGE_MAP_COLOR_BIT) { 338523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_map_ci(ctx, n, indexes); 338623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 338723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul source = indexes; 338823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 338923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 339023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul switch (dstType) { 339123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_UNSIGNED_BYTE: 339223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 339323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLubyte *dst = (GLubyte *) dest; 339423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 339523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 339623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul *dst++ = (GLubyte) source[i]; 339723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 339823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 339923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 340023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_BYTE: 340123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 340223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLbyte *dst = (GLbyte *) dest; 340323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 340423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 3405a51f07d5a148705c1c118dece1630972753ca349Brian Paul dst[i] = (GLbyte) source[i]; 340623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 340723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 340823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 340923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_UNSIGNED_SHORT: 341023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 341123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLushort *dst = (GLushort *) dest; 341223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 341323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 3414a51f07d5a148705c1c118dece1630972753ca349Brian Paul dst[i] = (GLushort) source[i]; 341523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 341623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 341723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap2( (GLushort *) dst, n ); 341823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 341923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 342023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 342123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_SHORT: 342223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 342323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLshort *dst = (GLshort *) dest; 342423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 342523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 3426a51f07d5a148705c1c118dece1630972753ca349Brian Paul dst[i] = (GLshort) source[i]; 342723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 342823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 342923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap2( (GLushort *) dst, n ); 343023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 343123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 343223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 343323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_UNSIGNED_INT: 343423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 343523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint *dst = (GLuint *) dest; 343623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 343723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 3438a51f07d5a148705c1c118dece1630972753ca349Brian Paul dst[i] = (GLuint) source[i]; 343923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 344023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 344123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap4( (GLuint *) dst, n ); 344223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 344323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 344423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 344523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_INT: 344623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 344723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLint *dst = (GLint *) dest; 344823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 344923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 3450a51f07d5a148705c1c118dece1630972753ca349Brian Paul dst[i] = (GLint) source[i]; 345123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 345223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 345323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap4( (GLuint *) dst, n ); 345423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 345523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 345623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 345723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_FLOAT: 345823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 345923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLfloat *dst = (GLfloat *) dest; 346023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 346123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 3462a51f07d5a148705c1c118dece1630972753ca349Brian Paul dst[i] = (GLfloat) source[i]; 346323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 346423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 346523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap4( (GLuint *) dst, n ); 346623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 346723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 346823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 3469f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_HALF_FLOAT_ARB: 34707eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul { 3471f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLhalfARB *dst = (GLhalfARB *) dest; 34727eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul GLuint i; 34737eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul for (i = 0; i < n; i++) { 34747eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i] = _mesa_float_to_half((GLfloat) source[i]); 34757eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 34767eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul if (dstPacking->SwapBytes) { 34777eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul _mesa_swap2( (GLushort *) dst, n ); 34787eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 34797eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 34807eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul break; 348123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul default: 348208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad type in _mesa_pack_index_span"); 348323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 348423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul} 348523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 348623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 3487c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/* 3488fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Unpack a row of stencil data from a client buffer according to 3489fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * the pixel unpacking parameters. 3490fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * This is (or will be) used by glDrawPixels 3491fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * 3492fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Args: ctx - the context 3493fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * n - number of pixels 34946dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * dstType - destination data type 3495fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * dest - destination array 3496fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * srcType - source pixel type 3497fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * source - source data pointer 3498b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul * srcPacking - pixel unpacking parameters 3499fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * transferOps - apply offset/bias/lookup ops? 3500fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */ 3501fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid 3502fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_unpack_stencil_span( const GLcontext *ctx, GLuint n, 3503fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLenum dstType, GLvoid *dest, 3504fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLenum srcType, const GLvoid *source, 3505b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul const struct gl_pixelstore_attrib *srcPacking, 3506fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul GLuint transferOps ) 3507fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{ 3508fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul ASSERT(srcType == GL_BITMAP || 3509fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_UNSIGNED_BYTE || 3510fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_BYTE || 3511fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_UNSIGNED_SHORT || 3512fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_SHORT || 3513fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_UNSIGNED_INT || 3514fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_INT || 3515f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_HALF_FLOAT_ARB || 3516fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_FLOAT); 3517fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3518fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul ASSERT(dstType == GL_UNSIGNED_BYTE || 3519fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dstType == GL_UNSIGNED_SHORT || 3520fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dstType == GL_UNSIGNED_INT); 3521fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3522fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul /* only shift and offset apply to stencil */ 3523fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul transferOps &= IMAGE_SHIFT_OFFSET_BIT; 3524fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3525fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* 3526fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Try simple cases first 3527fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */ 3528fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps == 0 && 3529fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul srcType == GL_UNSIGNED_BYTE && 3530fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul dstType == GL_UNSIGNED_BYTE) { 3531fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul MEMCPY(dest, source, n * sizeof(GLubyte)); 3532fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3533fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul else if (transferOps == 0 && 3534fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul srcType == GL_UNSIGNED_INT && 3535fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul dstType == GL_UNSIGNED_INT && 3536b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul !srcPacking->SwapBytes) { 3537fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul MEMCPY(dest, source, n * sizeof(GLuint)); 3538fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3539fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul else { 3540fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* 3541fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * general solution 3542fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */ 3543fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint indexes[MAX_WIDTH]; 3544fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul assert(n <= MAX_WIDTH); 3545fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3546fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source, 3547b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul srcPacking); 3548fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3549fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps) { 3550fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 3551fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* shift and offset indexes */ 3552179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul _mesa_shift_and_offset_ci(ctx, n, indexes); 3553fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3554fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3555fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (ctx->Pixel.MapStencilFlag) { 3556fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* Apply stencil lookup table */ 3557fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint mask = ctx->Pixel.MapStoSsize - 1; 3558fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3559fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i=0;i<n;i++) { 3560fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul indexes[i] = ctx->Pixel.MapStoS[ indexes[i] & mask ]; 3561fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3562fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3563fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3564fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3565fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* convert to dest type */ 3566fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul switch (dstType) { 3567fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_BYTE: 3568fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3569fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLubyte *dst = (GLubyte *) dest; 3570fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3571fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3572fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dst[i] = (GLubyte) (indexes[i] & 0xff); 3573fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3574fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3575fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3576fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_SHORT: 3577fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3578fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint *dst = (GLuint *) dest; 3579fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3580fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3581fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dst[i] = (GLushort) (indexes[i] & 0xffff); 3582fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3583fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3584fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3585fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_INT: 3586fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul MEMCPY(dest, indexes, n * sizeof(GLuint)); 3587fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3588fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul default: 358908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad dstType in _mesa_unpack_stencil_span"); 3590fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3591fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3592fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 3593fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3594fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 359523e8d46e072669e0974d7b2c168d4770183106bdBrian Paulvoid 359623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul_mesa_pack_stencil_span( const GLcontext *ctx, GLuint n, 359723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLenum dstType, GLvoid *dest, const GLstencil *source, 359823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul const struct gl_pixelstore_attrib *dstPacking ) 359923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul{ 360023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLstencil stencil[MAX_WIDTH]; 360123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 360223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul ASSERT(n <= MAX_WIDTH); 360323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 360423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset || 360523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul ctx->Pixel.MapStencilFlag) { 360623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul /* make a copy of input */ 360723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul MEMCPY(stencil, source, n * sizeof(GLstencil)); 360823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset) { 360923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_shift_and_offset_stencil( ctx, n, stencil ); 361023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 361123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (ctx->Pixel.MapStencilFlag) { 361223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_map_stencil( ctx, n, stencil ); 361323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 361423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul source = stencil; 361523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 361623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 361723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul switch (dstType) { 361823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_UNSIGNED_BYTE: 361923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (sizeof(GLstencil) == 8) { 362023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul MEMCPY( dest, source, n ); 362123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 362223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul else { 362323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLubyte *dst = (GLubyte *) dest; 362423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 362523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i=0;i<n;i++) { 362623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = (GLubyte) source[i]; 362723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 362823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 362923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 363023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_BYTE: 363123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (sizeof(GLstencil) == 8) { 363223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul MEMCPY( dest, source, n ); 363323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 363423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul else { 363523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLbyte *dst = (GLbyte *) dest; 363623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 363723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i=0;i<n;i++) { 363823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = (GLbyte) source[i]; 363923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 364023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 364123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 364223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_UNSIGNED_SHORT: 364323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 364423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLushort *dst = (GLushort *) dest; 364523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 364623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i=0;i<n;i++) { 364723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = (GLushort) source[i]; 364823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 364923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 365023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap2( (GLushort *) dst, n ); 365123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 365223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 365323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 365423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_SHORT: 365523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 365623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLshort *dst = (GLshort *) dest; 365723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 365823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i=0;i<n;i++) { 365923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = (GLshort) source[i]; 366023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 366123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 366223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap2( (GLushort *) dst, n ); 366323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 366423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 366523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 366623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_UNSIGNED_INT: 366723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 366823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint *dst = (GLuint *) dest; 366923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 367023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i=0;i<n;i++) { 367123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = (GLuint) source[i]; 367223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 367323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 367423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap4( (GLuint *) dst, n ); 367523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 367623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 367723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 367823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_INT: 367923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 368023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLint *dst = (GLint *) dest; 368123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 368223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i=0;i<n;i++) { 368323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul *dst++ = (GLint) source[i]; 368423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 368523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 368623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap4( (GLuint *) dst, n ); 368723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 368823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 368923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 369023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_FLOAT: 369123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 369223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLfloat *dst = (GLfloat *) dest; 369323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 369423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i=0;i<n;i++) { 369523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = (GLfloat) source[i]; 369623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 369723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 369823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap4( (GLuint *) dst, n ); 369923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 370023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 370123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 3702f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_HALF_FLOAT_ARB: 37037eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul { 3704f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLhalfARB *dst = (GLhalfARB *) dest; 37057eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul GLuint i; 37067eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul for (i=0;i<n;i++) { 37072c9f50dd4acc65ddfeb8e3fde98137711167e579Brian Paul dst[i] = _mesa_float_to_half( (float) source[i] ); 37087eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 37097eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul if (dstPacking->SwapBytes) { 37107eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul _mesa_swap2( (GLushort *) dst, n ); 37117eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 37127eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 37137eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul break; 371423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_BITMAP: 371523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->LsbFirst) { 371623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLubyte *dst = (GLubyte *) dest; 371723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLint shift = 0; 371823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 371923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 372023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (shift == 0) 372123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul *dst = 0; 372223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul *dst |= ((source[i] != 0) << shift); 372323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul shift++; 372423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (shift == 8) { 372523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul shift = 0; 372623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst++; 372723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 372823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 372923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 373023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul else { 373123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLubyte *dst = (GLubyte *) dest; 373223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLint shift = 7; 373323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 373423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 373523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (shift == 7) 373623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul *dst = 0; 373723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul *dst |= ((source[i] != 0) << shift); 373823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul shift--; 373923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (shift < 0) { 374023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul shift = 7; 374123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst++; 374223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 374323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 374423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 374523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 374623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul default: 374708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad type in _mesa_pack_index_span"); 374823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 374923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul} 375023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 375123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 3752fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid 3753e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul_mesa_unpack_depth_span( const GLcontext *ctx, GLuint n, GLfloat *dest, 3754fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLenum srcType, const GLvoid *source, 3755e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul const struct gl_pixelstore_attrib *srcPacking ) 3756fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{ 3757fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul switch (srcType) { 3758fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_BYTE: 3759fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3760fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3761fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLubyte *src = (const GLubyte *) source; 3762fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3763e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul dest[i] = BYTE_TO_FLOAT(src[i]); 3764fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3765fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3766fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3767fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_BYTE: 3768fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3769fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3770fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLubyte *src = (const GLubyte *) source; 3771fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3772e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul dest[i] = UBYTE_TO_FLOAT(src[i]); 3773fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3774fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3775fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3776fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_SHORT: 3777fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3778fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3779fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLshort *src = (const GLshort *) source; 3780fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3781e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul dest[i] = SHORT_TO_FLOAT(src[i]); 3782fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3783fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3784fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3785fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_SHORT: 3786fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3787fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3788fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLushort *src = (const GLushort *) source; 3789fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3790e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul dest[i] = USHORT_TO_FLOAT(src[i]); 3791fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3792fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3793fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3794fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_INT: 3795fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3796fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3797fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLint *src = (const GLint *) source; 3798fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3799e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul dest[i] = INT_TO_FLOAT(src[i]); 3800fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3801fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3802fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3803fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_INT: 3804fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3805fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3806fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLuint *src = (const GLuint *) source; 3807fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3808e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul dest[i] = UINT_TO_FLOAT(src[i]); 3809fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3810fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3811fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3812fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_FLOAT: 3813e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul MEMCPY(dest, source, n * sizeof(GLfloat)); 3814fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3815f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_HALF_FLOAT_ARB: 38167eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul { 38177eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul GLuint i; 3818f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLhalfARB *src = (const GLhalfARB *) source; 38197eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul for (i = 0; i < n; i++) { 38207eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dest[i] = _mesa_half_to_float(src[i]); 38217eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 38227eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 38237eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul break; 3824fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul default: 382508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(NULL, "bad type in _mesa_unpack_depth_span()"); 3826fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return; 3827fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3828fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3829fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3830e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul /* apply depth scale and bias and clamp to [0,1] */ 3831fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) { 3832fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3833fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3834e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul GLfloat d = dest[i] * ctx->Pixel.DepthScale + ctx->Pixel.DepthBias; 3835e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul dest[i] = CLAMP(d, 0.0F, 1.0F); 3836fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3837fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3838fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 3839fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3840fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3841fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul/* 384223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul * Pack an array of depth values. The values are floats in [0,1]. 384323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul */ 384423e8d46e072669e0974d7b2c168d4770183106bdBrian Paulvoid 3845b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul_mesa_pack_depth_span( const GLcontext *ctx, GLuint n, GLvoid *dest, 384623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLenum dstType, const GLfloat *depthSpan, 384723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul const struct gl_pixelstore_attrib *dstPacking ) 384823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul{ 384923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLfloat depthCopy[MAX_WIDTH]; 385023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul const GLboolean bias_or_scale = ctx->Pixel.DepthBias != 0.0 || 385123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul ctx->Pixel.DepthScale != 1.0; 385223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 385323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul ASSERT(n <= MAX_WIDTH); 385423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 385523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (bias_or_scale) { 385623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 385723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 385823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLfloat d; 385923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul d = depthSpan[i] * ctx->Pixel.DepthScale + ctx->Pixel.DepthBias; 386023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul depthCopy[i] = CLAMP(d, 0.0F, 1.0F); 386123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 386223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul depthSpan = depthCopy; 386323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 386423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 386523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul switch (dstType) { 386623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_UNSIGNED_BYTE: 386723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 386823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLubyte *dst = (GLubyte *) dest; 386923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 387023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 387123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = FLOAT_TO_UBYTE( depthSpan[i] ); 387223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 387323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 387423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 387523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_BYTE: 387623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 387723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLbyte *dst = (GLbyte *) dest; 387823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 387923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 388023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = FLOAT_TO_BYTE( depthSpan[i] ); 388123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 388223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 388323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 388423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_UNSIGNED_SHORT: 388523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 388623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLushort *dst = (GLushort *) dest; 388723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 388823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 388923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = FLOAT_TO_USHORT( depthSpan[i] ); 389023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 389123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 389223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap2( (GLushort *) dst, n ); 389323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 389423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 389523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 389623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_SHORT: 389723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 389823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLshort *dst = (GLshort *) dest; 389923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 390023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 390123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = FLOAT_TO_SHORT( depthSpan[i] ); 390223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 390323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 390423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap2( (GLushort *) dst, n ); 390523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 390623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 390723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 390823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_UNSIGNED_INT: 390923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 391023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint *dst = (GLuint *) dest; 391123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 391223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 391323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = FLOAT_TO_UINT( depthSpan[i] ); 391423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 391523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 391623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap4( (GLuint *) dst, n ); 391723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 391823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 391923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 392023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_INT: 392123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 392223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLint *dst = (GLint *) dest; 392323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 392423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 392523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = FLOAT_TO_INT( depthSpan[i] ); 392623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 392723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 392823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap4( (GLuint *) dst, n ); 392923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 393023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 393123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 393223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul case GL_FLOAT: 393323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul { 393423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLfloat *dst = (GLfloat *) dest; 393523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul GLuint i; 393623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul for (i = 0; i < n; i++) { 393723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul dst[i] = depthSpan[i]; 393823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 393923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul if (dstPacking->SwapBytes) { 394023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul _mesa_swap4( (GLuint *) dst, n ); 394123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 394223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 394323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul break; 3944f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_HALF_FLOAT_ARB: 39457eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul { 3946f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLhalfARB *dst = (GLhalfARB *) dest; 39477eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul GLuint i; 39487eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul for (i = 0; i < n; i++) { 39497eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul dst[i] = _mesa_float_to_half(depthSpan[i]); 39507eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 39517eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul if (dstPacking->SwapBytes) { 39527eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul _mesa_swap2( (GLushort *) dst, n ); 39537eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 39547eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul } 39557eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul break; 395623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul default: 395708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad type in _mesa_pack_depth_span"); 395823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul } 395923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul} 396023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 396123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul 39627a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul/** 39637a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul * Unpack image data. Apply byte swapping, byte flipping (bitmap). 39647a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul * Return all image data in a contiguous block. This is used when we 39657a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul * compile glDrawPixels, glTexImage, etc into a display list. We 39667a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul * need a copy of the data in a standard format. 3967c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 3968c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid * 3969c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul_mesa_unpack_image( GLsizei width, GLsizei height, GLsizei depth, 3970c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum format, GLenum type, const GLvoid *pixels, 3971c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const struct gl_pixelstore_attrib *unpack ) 3972c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 3973c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint bytesPerRow, compsPerRow; 3974c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLboolean flipBytes, swap2, swap4; 3975c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3976c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (!pixels) 3977c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return NULL; /* not necessarily an error */ 3978c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3979c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (width <= 0 || height <= 0 || depth <= 0) 3980c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return NULL; /* generate error later */ 3981c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3982c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (format == GL_BITMAP) { 3983c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytesPerRow = (width + 7) >> 3; 3984c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul flipBytes = !unpack->LsbFirst; 3985c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul swap2 = swap4 = GL_FALSE; 3986c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul compsPerRow = 0; 3987c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3988c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 3989b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type); 3990b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const GLint components = _mesa_components_in_format(format); 3991c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint bytesPerComp; 3992c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (bytesPerPixel <= 0 || components <= 0) 3993c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return NULL; /* bad format or type. generate error later */ 3994c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytesPerRow = bytesPerPixel * width; 3995c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytesPerComp = bytesPerPixel / components; 3996c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul flipBytes = GL_FALSE; 3997c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul swap2 = (bytesPerComp == 2) && unpack->SwapBytes; 3998c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul swap4 = (bytesPerComp == 4) && unpack->SwapBytes; 3999c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul compsPerRow = components * width; 4000c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(compsPerRow >= width); 4001c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 4002c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 4003c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 4004b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul GLubyte *destBuffer = (GLubyte *) MALLOC(bytesPerRow * height * depth); 4005c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dst; 4006c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint img, row; 4007c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (!destBuffer) 4008c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return NULL; /* generate GL_OUT_OF_MEMORY later */ 4009c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 4010c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst = destBuffer; 4011c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (img = 0; img < depth; img++) { 4012c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (row = 0; row < height; row++) { 4013b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const GLvoid *src = _mesa_image_address(unpack, pixels, 4014c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul width, height, format, type, img, row, 0); 4015c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul MEMCPY(dst, src, bytesPerRow); 4016c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* byte flipping/swapping */ 4017c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (flipBytes) { 4018b7d076fc96ac27117421653a043d00a95f789d24Brian Paul flip_bytes((GLubyte *) dst, bytesPerRow); 4019c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 4020c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (swap2) { 4021b7d076fc96ac27117421653a043d00a95f789d24Brian Paul _mesa_swap2((GLushort*) dst, compsPerRow); 4022c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 4023c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (swap4) { 4024b7d076fc96ac27117421653a043d00a95f789d24Brian Paul _mesa_swap4((GLuint*) dst, compsPerRow); 4025c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 4026c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += bytesPerRow; 4027c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 4028c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 4029c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return destBuffer; 4030c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 4031c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 40326dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell 40336dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell#endif 4034