image.c revision c29714dccb664562958cf36cdedee9c4377585d2
1c29714dccb664562958cf36cdedee9c4377585d2Brian Paul/* $Id: image.c,v 1.35 2000/06/30 22:12:00 brianp Exp $ */ 2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 3afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 4afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Mesa 3-D graphics library 5fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Version: 3.3 6afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * 7276988ec96a48d4ee5c28c0a2da3aa2b5ee0bbeaBrian Paul * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. 8afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * 9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Permission is hereby granted, free of charge, to any person obtaining a 10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * copy of this software and associated documentation files (the "Software"), 11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * to deal in the Software without restriction, including without limitation 12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * the rights to use, copy, modify, merge, publish, distribute, sublicense, 13afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * and/or sell copies of the Software, and to permit persons to whom the 14afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Software is furnished to do so, subject to the following conditions: 15afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * 16afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * The above copyright notice and this permission notice shall be included 17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * in all copies or substantial portions of the Software. 18afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * 19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 26afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 27afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 28afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#ifdef PC_HEADER 29afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "all.h" 30afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#else 31fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul#include "glheader.h" 32afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "context.h" 33afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "image.h" 34c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul#include "imaging.h" 35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "macros.h" 36fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul#include "mem.h" 37afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "mmath.h" 38afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "pixel.h" 39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "types.h" 40afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#endif 41afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 42afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 43afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 44afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 45fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * These are the image packing parameters for Mesa's internal images. 46fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * That is, _mesa_unpack_image() returns image data in this format. 47fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * When we execute image commands (glDrawPixels, glTexImage, etc) 48fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * from within display lists we have to be sure to set the current 49fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * unpacking params to these values! 50fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */ 51279d9e3ea7551332d5639b514e004ee66c37d08bBrian Paulconst struct gl_pixelstore_attrib _mesa_native_packing = { 52fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 1, /* Alignment */ 53fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 0, /* RowLength */ 54fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 0, /* SkipPixels */ 55fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 0, /* SkipRows */ 56fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 0, /* ImageHeight */ 57fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 0, /* SkipImages */ 58fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GL_FALSE, /* SwapBytes */ 59fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GL_FALSE /* LsbFirst */ 60fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul}; 61fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 62fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 63fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 64fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul/* 65afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the 8 bits in each byte of the given array. 66afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 67b7d076fc96ac27117421653a043d00a95f789d24Brian Paulstatic void 68b7d076fc96ac27117421653a043d00a95f789d24Brian Paulflip_bytes( GLubyte *p, GLuint n ) 69afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 70afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach register GLuint i, a, b; 71afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 72afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 73afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach b = (GLuint) p[i]; 74afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach a = ((b & 0x01) << 7) | 75afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x02) << 5) | 76afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x04) << 3) | 77afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x08) << 1) | 78afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x10) >> 1) | 79afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x20) >> 3) | 80afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x40) >> 5) | 81afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x80) >> 7); 82afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach p[i] = (GLubyte) a; 83afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 84afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 86afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 87afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 88afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the order of the 2 bytes in each word in the given array. 89afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 90b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid 91b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_swap2( GLushort *p, GLuint n ) 92afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 93afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach register GLuint i; 94afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 95afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 96afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach p[i] = (p[i] >> 8) | ((p[i] << 8) & 0xff00); 97afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 98afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 99afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the order of the 4 bytes in each word in the given array. 104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 105b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid 106b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_swap4( GLuint *p, GLuint n ) 107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach register GLuint i, a, b; 109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach b = p[i]; 112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach a = (b >> 24) 113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | ((b >> 8) & 0xff00) 114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | ((b << 8) & 0xff0000) 115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | ((b << 24) & 0xff000000); 116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach p[i] = a; 117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 121afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return the size, in bytes, of the given GL datatype. 125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return 0 if GL_BITMAP. 126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return -1 if invalid type enum. 127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 128b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_sizeof_type( GLenum type ) 129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BITMAP: 132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 0; 133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLbyte); 137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLushort); 139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLint); 145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLfloat); 147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 154b7d076fc96ac27117421653a043d00a95f789d24Brian Paul * Same as _mesa_sizeof_packed_type() but we also accept the 155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * packed pixel format datatypes. 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); 174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLfloat); 176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_3_3_2: 177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_2_3_3_REV: 179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5: 181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5_REV: 183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4: 185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4_REV: 187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_5_5_1: 189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_1_5_5_5_REV: 191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8: 193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8_REV: 195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_10_10_10_2: 197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_2_10_10_10_REV: 199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return the number of components in a GL enum pixel type. 209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return -1 if bad format. 210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 211b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_components_in_format( GLenum format ) 212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (format) { 214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX: 215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX1_EXT: 216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX2_EXT: 217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX4_EXT: 218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX8_EXT: 219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX12_EXT: 220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX16_EXT: 221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_STENCIL_INDEX: 222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_DEPTH_COMPONENT: 223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_GREEN: 225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BLUE: 226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ALPHA: 227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE: 228070b2644c6d3b0b4c6da64addd85245d730b6240Brian Paul case GL_INTENSITY: 229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 1; 230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE_ALPHA: 231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 2; 232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 3; 234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGBA: 235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 4; 236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGR: 237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 3; 238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGRA: 239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 4; 240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ABGR_EXT: 241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 4; 242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return bytes per pixel for given format and type 250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return -1 if bad format or type. 251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 252b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_bytes_per_pixel( GLenum format, GLenum type ) 253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 254b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GLint comps = _mesa_components_in_format( format ); 255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (comps < 0) 256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BITMAP: 260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 0; /* special case */ 261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return comps * sizeof(GLubyte); 264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return comps * sizeof(GLshort); 267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return comps * sizeof(GLint); 270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return comps * sizeof(GLfloat); 272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_3_3_2: 273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_2_3_3_REV: 274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB || format == GL_BGR) 275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else 277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; /* error */ 278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5: 279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5_REV: 280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB || format == GL_BGR) 281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else 283afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; /* error */ 284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4: 285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4_REV: 286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_5_5_1: 287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_1_5_5_5_REV: 288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT) 289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLushort); 290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else 291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8: 293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8_REV: 294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_10_10_10_2: 295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_2_10_10_10_REV: 296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT) 297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else 299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 303afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Test if the given pixel format and type are legal. 308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return GL_TRUE for legal, GL_FALSE for illegal. 309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 310b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLboolean 311b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_is_legal_format_and_type( GLenum format, GLenum type ) 312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (format) { 314afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX: 315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_STENCIL_INDEX: 316afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 317afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BITMAP: 318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 320afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_TRUE; 326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_GREEN: 331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BLUE: 332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ALPHA: 3332a1f50aee4f30dbd0c55d8f0b7185b690c841051Brian Paul case GL_INTENSITY: 334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE: 335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE_ALPHA: 336afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_DEPTH_COMPONENT: 337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGR: 338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_TRUE; 347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_3_3_2: 360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_2_3_3_REV: 361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5: 362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5_REV: 363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_TRUE; 364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGBA: 368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGRA: 369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ABGR_EXT: 370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4: 379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4_REV: 380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_5_5_1: 381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_1_5_5_5_REV: 382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8: 383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8_REV: 384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_10_10_10_2: 385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_2_10_10_10_REV: 386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_TRUE; 387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ; /* fall-through */ 392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 394afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return the address of a pixel in an image (actually a volume). 400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Pixel unpacking/packing parameters are observed according to 'packing'. 401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Input: image - start of image data 402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * width, height - size of image 403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * format - image format 404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * type - pixel component type 405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * packing - the pixelstore attributes 406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * img - which image in the volume (0 for 1D or 2D images) 407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * row, column - location of pixel in the image 408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return: address of pixel at (image,row,column) in image or NULL if error. 409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 410b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLvoid * 411b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_image_address( const struct gl_pixelstore_attrib *packing, 412b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const GLvoid *image, GLsizei width, 413b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GLsizei height, GLenum format, GLenum type, 414b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GLint img, GLint row, GLint column ) 415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint alignment; /* 1, 2 or 4 */ 417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint pixels_per_row; 418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint rows_per_image; 419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint skiprows; 420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint skippixels; 421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint skipimages; /* for 3-D volume images */ 422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte *pixel_addr; 423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach alignment = packing->Alignment; 425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->RowLength > 0) { 426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach pixels_per_row = packing->RowLength; 427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach pixels_per_row = width; 430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->ImageHeight > 0) { 432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach rows_per_image = packing->ImageHeight; 433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach rows_per_image = height; 436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach skiprows = packing->SkipRows; 438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach skippixels = packing->SkipPixels; 439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach skipimages = packing->SkipImages; 440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (type==GL_BITMAP) { 442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* BITMAP data */ 443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint comp_per_pixel; /* components per pixel */ 444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint bytes_per_comp; /* bytes per component */ 445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint bytes_per_row; 446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint bytes_per_image; 447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* Compute bytes per component */ 449b7d076fc96ac27117421653a043d00a95f789d24Brian Paul bytes_per_comp = _mesa_sizeof_packed_type( type ); 450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (bytes_per_comp<0) { 451afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return NULL; 452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* Compute number of components per pixel */ 455b7d076fc96ac27117421653a043d00a95f789d24Brian Paul comp_per_pixel = _mesa_components_in_format( format ); 456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (comp_per_pixel<0 && type != GL_BITMAP) { 457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return NULL; 458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_row = alignment 461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * CEILING( comp_per_pixel*pixels_per_row, 8*alignment ); 462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_image = bytes_per_row * rows_per_image; 464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach pixel_addr = (GLubyte *) image 466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skipimages + img) * bytes_per_image 467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skiprows + row) * bytes_per_row 468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skippixels + column) / 8; 469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* Non-BITMAP data */ 472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint bytes_per_pixel, bytes_per_row, remainder, bytes_per_image; 473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 474b7d076fc96ac27117421653a043d00a95f789d24Brian Paul bytes_per_pixel = _mesa_bytes_per_pixel( format, type ); 475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* The pixel type and format should have been error checked earlier */ 477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach assert(bytes_per_pixel > 0); 478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_row = pixels_per_row * bytes_per_pixel; 480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach remainder = bytes_per_row % alignment; 481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (remainder > 0) 482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_row += (alignment - remainder); 483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ASSERT(bytes_per_row % alignment == 0); 485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_image = bytes_per_row * rows_per_image; 487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* compute final pixel address */ 489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach pixel_addr = (GLubyte *) image 490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skipimages + img) * bytes_per_image 491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skiprows + row) * bytes_per_row 492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skippixels + column) * bytes_per_pixel; 493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return (GLvoid *) pixel_addr; 496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 501ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul * Compute the stride between image rows (in bytes) for the given 502ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul * pixel packing parameters and image width, format and type. 503ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul */ 504ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian PaulGLint 505ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul_mesa_image_row_stride( const struct gl_pixelstore_attrib *packing, 506ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul GLint width, GLenum format, GLenum type ) 507ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul{ 508ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul ASSERT(packing); 509ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul if (type == GL_BITMAP) { 510ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul /* BITMAP data */ 511ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul if (packing->RowLength == 0) { 512ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul GLint bytes = (width + 7) / 8; 513ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul return bytes; 514ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 515ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul else { 516ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul GLint bytes = (packing->RowLength + 7) / 8; 517ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul return bytes; 518ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 519ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 520ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul else { 521ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul /* Non-BITMAP data */ 522b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type); 523fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul GLint bytesPerRow, remainder; 524ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul if (bytesPerPixel <= 0) 525ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul return -1; /* error */ 526ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul if (packing->RowLength == 0) { 527fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul bytesPerRow = bytesPerPixel * width; 528ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 529ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul else { 530fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul bytesPerRow = bytesPerPixel * packing->RowLength; 531ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 532fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul remainder = bytesPerRow % packing->Alignment; 533fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul if (remainder > 0) 534fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul bytesPerRow += (packing->Alignment - remainder); 535fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul return bytesPerRow; 536ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 537ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul} 538ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul 539ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul 540ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul 541ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul/* 542afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Unpack a 32x32 pixel polygon stipple from user memory using the 543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * current pixel unpack settings. 544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 5457c652d77220610ecc19aaefa20876216b035e961Brian Paulvoid 5467c652d77220610ecc19aaefa20876216b035e961Brian Paul_mesa_unpack_polygon_stipple( const GLubyte *pattern, GLuint dest[32], 5477c652d77220610ecc19aaefa20876216b035e961Brian Paul const struct gl_pixelstore_attrib *unpacking ) 548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 549959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul GLubyte *ptrn = (GLubyte *) _mesa_unpack_bitmap( 32, 32, pattern, unpacking ); 5507c652d77220610ecc19aaefa20876216b035e961Brian Paul if (ptrn) { 5517c652d77220610ecc19aaefa20876216b035e961Brian Paul /* Convert pattern from GLubytes to GLuints and handle big/little 5527c652d77220610ecc19aaefa20876216b035e961Brian Paul * endian differences 5537c652d77220610ecc19aaefa20876216b035e961Brian Paul */ 5547c652d77220610ecc19aaefa20876216b035e961Brian Paul GLubyte *p = ptrn; 5557c652d77220610ecc19aaefa20876216b035e961Brian Paul GLint i; 5567c652d77220610ecc19aaefa20876216b035e961Brian Paul for (i = 0; i < 32; i++) { 5577c652d77220610ecc19aaefa20876216b035e961Brian Paul dest[i] = (p[0] << 24) 5587c652d77220610ecc19aaefa20876216b035e961Brian Paul | (p[1] << 16) 5597c652d77220610ecc19aaefa20876216b035e961Brian Paul | (p[2] << 8) 5607c652d77220610ecc19aaefa20876216b035e961Brian Paul | (p[3] ); 5617c652d77220610ecc19aaefa20876216b035e961Brian Paul p += 4; 5627c652d77220610ecc19aaefa20876216b035e961Brian Paul } 5637c652d77220610ecc19aaefa20876216b035e961Brian Paul FREE(ptrn); 564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 565afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 566afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 567afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 568fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 569afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 570fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Pack polygon stipple into user memory given current pixel packing 571fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * settings. 572afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 5737c652d77220610ecc19aaefa20876216b035e961Brian Paulvoid 5747c652d77220610ecc19aaefa20876216b035e961Brian Paul_mesa_pack_polygon_stipple( const GLuint pattern[32], GLubyte *dest, 5757c652d77220610ecc19aaefa20876216b035e961Brian Paul const struct gl_pixelstore_attrib *packing ) 576afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 5777c652d77220610ecc19aaefa20876216b035e961Brian Paul /* Convert pattern from GLuints to GLubytes to handle big/little 5787c652d77220610ecc19aaefa20876216b035e961Brian Paul * endian differences. 5797c652d77220610ecc19aaefa20876216b035e961Brian Paul */ 5807c652d77220610ecc19aaefa20876216b035e961Brian Paul GLubyte ptrn[32*4]; 581fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint i; 582fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < 32; i++) { 5837c652d77220610ecc19aaefa20876216b035e961Brian Paul ptrn[i * 4 + 0] = (GLubyte) ((pattern[i] >> 24) & 0xff); 5847c652d77220610ecc19aaefa20876216b035e961Brian Paul ptrn[i * 4 + 1] = (GLubyte) ((pattern[i] >> 16) & 0xff); 5857c652d77220610ecc19aaefa20876216b035e961Brian Paul ptrn[i * 4 + 2] = (GLubyte) ((pattern[i] >> 8 ) & 0xff); 5867c652d77220610ecc19aaefa20876216b035e961Brian Paul ptrn[i * 4 + 3] = (GLubyte) ((pattern[i] ) & 0xff); 587afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 5887c652d77220610ecc19aaefa20876216b035e961Brian Paul 5897c652d77220610ecc19aaefa20876216b035e961Brian Paul _mesa_pack_bitmap(32, 32, ptrn, dest, packing); 590afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 591afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 592afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 593afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 594afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 595afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Pack the given RGBA span into client memory at 'dest' address 596afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * in the given pixel format and type. 597afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Optionally apply the enabled pixel transfer ops. 598afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Pack into memory using the given packing params struct. 599afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * This is used by glReadPixels and glGetTexImage?D() 600afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Input: ctx - the context 601afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * n - number of pixels in the span 602afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * rgba - the pixels 603afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * format - dest packing format 604afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * type - dest packing datatype 605afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * destination - destination packing address 606afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * packing - pixel packing parameters 607afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * applyTransferOps - apply scale/bias/lookup-table ops? 608afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 609b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid 610c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul_mesa_pack_rgba_span( GLcontext *ctx, 611179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul GLuint n, CONST GLubyte srcRgba[][4], 612b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GLenum format, GLenum type, GLvoid *destination, 613b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const struct gl_pixelstore_attrib *packing, 614b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GLboolean applyTransferOps ) 615afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 616179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul applyTransferOps &= (ctx->Pixel.ScaleOrBiasRGBA || 617179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul ctx->Pixel.MapColorFlag || 618179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul ctx->ColorMatrix.type != MATRIX_IDENTITY || 619179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul ctx->Pixel.ScaleOrBiasRGBApcm || 620a5f4cae20a5d47bf5e0f8d1aa35650d16391097dBrian Paul ctx->Pixel.ColorTableEnabled || 621c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul ctx->Pixel.PostColorMatrixColorTableEnabled || 622c29714dccb664562958cf36cdedee9c4377585d2Brian Paul ctx->Pixel.PostConvolutionColorTableEnabled || 6231a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul ctx->Pixel.MinMaxEnabled || 6241a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul ctx->Pixel.HistogramEnabled); 625fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 626afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* Test for optimized case first */ 627fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (!applyTransferOps && format == GL_RGBA && type == GL_UNSIGNED_BYTE) { 6283428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul /* common simple case */ 629179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul MEMCPY( destination, srcRgba, n * 4 * sizeof(GLubyte) ); 630afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 631fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul else if (!applyTransferOps && format == GL_RGB && type == GL_UNSIGNED_BYTE) { 6323428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul /* common simple case */ 6333428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul GLint i; 6343428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul GLubyte *dest = (GLubyte *) destination; 6353428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul for (i = 0; i < n; i++) { 636179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dest[0] = srcRgba[i][RCOMP]; 637179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dest[1] = srcRgba[i][GCOMP]; 638179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dest[2] = srcRgba[i][BCOMP]; 6393428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul dest += 3; 6403428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul } 6413428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul } 642afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 643fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* general solution */ 644179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul GLfloat rgba[MAX_WIDTH][4], luminance[MAX_WIDTH]; 64564b7da799fe82f566706f8b6771b9d12477e4373Brian Paul const GLfloat rscale = 1.0F / 255.0F; 64664b7da799fe82f566706f8b6771b9d12477e4373Brian Paul const GLfloat gscale = 1.0F / 255.0F; 64764b7da799fe82f566706f8b6771b9d12477e4373Brian Paul const GLfloat bscale = 1.0F / 255.0F; 64864b7da799fe82f566706f8b6771b9d12477e4373Brian Paul const GLfloat ascale = 1.0F / 255.0F; 649b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const GLint comps = _mesa_components_in_format(format); 650afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint i; 651afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 65298b607b57da6f7d2ae6e02906c1ae72cd1c3f311Brian Paul assert(n <= MAX_WIDTH); 653afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 654afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* convert color components to floating point */ 655afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 656179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul rgba[i][RCOMP] = srcRgba[i][RCOMP] * rscale; 657179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul rgba[i][GCOMP] = srcRgba[i][GCOMP] * gscale; 658179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul rgba[i][BCOMP] = srcRgba[i][BCOMP] * bscale; 659179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul rgba[i][ACOMP] = srcRgba[i][ACOMP] * ascale; 660afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 661afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 662afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* 663afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Apply scale, bias and lookup-tables if enabled. 664afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 665afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (applyTransferOps) { 666179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul /* scale & bias */ 667afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (ctx->Pixel.ScaleOrBiasRGBA) { 668179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul _mesa_scale_and_bias_rgba( ctx, n, rgba ); 669afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 670a5f4cae20a5d47bf5e0f8d1aa35650d16391097dBrian Paul /* color map lookup */ 671afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (ctx->Pixel.MapColorFlag) { 672179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul _mesa_map_rgba( ctx, n, rgba ); 673179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul } 674a5f4cae20a5d47bf5e0f8d1aa35650d16391097dBrian Paul /* GL_COLOR_TABLE lookup */ 675a5f4cae20a5d47bf5e0f8d1aa35650d16391097dBrian Paul if (ctx->Pixel.ColorTableEnabled) { 676a5f4cae20a5d47bf5e0f8d1aa35650d16391097dBrian Paul _mesa_lookup_rgba(&ctx->ColorTable, n, rgba); 677a5f4cae20a5d47bf5e0f8d1aa35650d16391097dBrian Paul } 678a5f4cae20a5d47bf5e0f8d1aa35650d16391097dBrian Paul /* XXX convolution here */ 679c29714dccb664562958cf36cdedee9c4377585d2Brian Paul /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */ 680c29714dccb664562958cf36cdedee9c4377585d2Brian Paul if (ctx->Pixel.PostConvolutionColorTableEnabled) { 681c29714dccb664562958cf36cdedee9c4377585d2Brian Paul _mesa_lookup_rgba(&ctx->PostConvolutionColorTable, n, rgba); 682c29714dccb664562958cf36cdedee9c4377585d2Brian Paul } 683c29714dccb664562958cf36cdedee9c4377585d2Brian Paul /* color matrix transform */ 684179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul if (ctx->ColorMatrix.type != MATRIX_IDENTITY || 685179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul ctx->Pixel.ScaleOrBiasRGBApcm) { 686179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul _mesa_transform_rgba(ctx, n, rgba); 687179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul } 688a5f4cae20a5d47bf5e0f8d1aa35650d16391097dBrian Paul /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */ 689a5f4cae20a5d47bf5e0f8d1aa35650d16391097dBrian Paul if (ctx->Pixel.PostColorMatrixColorTableEnabled) { 690a5f4cae20a5d47bf5e0f8d1aa35650d16391097dBrian Paul _mesa_lookup_rgba(&ctx->PostColorMatrixColorTable, n, rgba); 691afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 6921a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul /* update histogram count */ 6931a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul if (ctx->Pixel.HistogramEnabled) { 6941a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul _mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba); 6951a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul } 696a5f4cae20a5d47bf5e0f8d1aa35650d16391097dBrian Paul /* XXX min/max here */ 697c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (ctx->Pixel.MinMaxEnabled) { 6981a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul _mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba); 699c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (ctx->MinMax.Sink) 700c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul return; 701c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 702afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 703afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 704afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format==GL_LUMINANCE || format==GL_LUMINANCE_ALPHA) { 705afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 706179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul GLfloat sum = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP]; 707afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach luminance[i] = CLAMP( sum, 0.0F, 1.0F ); 708afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 709afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 710afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 711afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* 712afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Pack/store the pixels. Ugh! Lots of cases!!! 713afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 714afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 715afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 716afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach { 717afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte *dst = (GLubyte *) destination; 718afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (format) { 719afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 720afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 721179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 722afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 723afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_GREEN: 724afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 725179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 726afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 727afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BLUE: 728afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 729179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 730afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 731afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ALPHA: 732afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 733179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 734afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 735afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE: 736afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 737afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_UBYTE(luminance[i]); 738afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 739afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE_ALPHA: 740afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 741afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*2+0] = FLOAT_TO_UBYTE(luminance[i]); 742179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 743afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 744afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 745afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 746afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 747179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 748179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 749179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 750afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 751afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 752afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGBA: 753afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 754179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 755179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 756179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 757179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 758afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 759afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 760afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGR: 761afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 762179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 763179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 764179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 765afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 766afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 767afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGRA: 768afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 769179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 770179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 771179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 772179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 773afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 774afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 775afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ABGR_EXT: 776afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 777179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 778179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 779179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 780179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 781afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 782afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 783afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 784b7d076fc96ac27117421653a043d00a95f789d24Brian Paul gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 785afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 786afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 787afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 788afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 789afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach { 790afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLbyte *dst = (GLbyte *) destination; 791afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (format) { 792afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 793afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 794179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 795afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 796afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_GREEN: 797afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 798179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 799afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 800afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BLUE: 801afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 802179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 803afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 804afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ALPHA: 805afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 806179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 807afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE: 809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 810afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_BYTE(luminance[i]); 811afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 812afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE_ALPHA: 813afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 814afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*2+0] = FLOAT_TO_BYTE(luminance[i]); 815179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 816afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 817afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 818afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 819afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 820179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 821179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 822179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 823afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 824afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 825afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGBA: 826afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 827179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 828179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 829179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 830179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 831afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 832afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 833afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGR: 834afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 835179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 836179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 837179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 838afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 839afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 840afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGRA: 841afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 842179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 843179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 844179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 845179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 846afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 847afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ABGR_EXT: 848afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 849179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 850179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 851179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 852179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 853afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 854afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 855afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 856b7d076fc96ac27117421653a043d00a95f789d24Brian Paul gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 857afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 858afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 859afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 860afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 861afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach { 862afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLushort *dst = (GLushort *) destination; 863afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (format) { 864afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 865afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 866179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 867afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 868afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_GREEN: 869afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 870179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 871afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 872afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BLUE: 873afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 874179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 875afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 876afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ALPHA: 877afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 878179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i] = FLOAT_TO_USHORT(rgba[i][ACOMP]); 879afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 880afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE: 881afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 882afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_USHORT(luminance[i]); 883afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 884afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE_ALPHA: 885afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 886afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*2+0] = FLOAT_TO_USHORT(luminance[i]); 887179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*2+1] = FLOAT_TO_USHORT(rgba[i][ACOMP]); 888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 889afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 890afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 891afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 892179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+0] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 893179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 894179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+2] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 895afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 896afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 897afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGBA: 898afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 899179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 900179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 901179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 902179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][ACOMP]); 903afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 904afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 905afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGR: 906afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 907179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+0] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 908179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 909179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+2] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 910afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 911afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 912afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGRA: 913afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 914179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 915179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 916179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 917179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][ACOMP]); 918afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 919afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 920afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ABGR_EXT: 921afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 922179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][ACOMP]); 923179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 924179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 925179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 926afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 927afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 928afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 929b7d076fc96ac27117421653a043d00a95f789d24Brian Paul gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 930afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 931afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->SwapBytes) { 932b7d076fc96ac27117421653a043d00a95f789d24Brian Paul _mesa_swap2( (GLushort *) dst, n * comps); 933afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 934afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 935afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 936afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 937afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach { 938afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLshort *dst = (GLshort *) destination; 939afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (format) { 940afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 941afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 942179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 943afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 944afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_GREEN: 945afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 946179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 947afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 948afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BLUE: 949afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 950179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 951afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 952afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ALPHA: 953afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 954179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 955afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 956afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE: 957afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 958afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_SHORT(luminance[i]); 959afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 960afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE_ALPHA: 961afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 962afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*2+0] = FLOAT_TO_SHORT(luminance[i]); 963179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 964afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 965afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 966afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 967afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 968179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 969179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 970179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 971afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 972afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 973afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGBA: 974afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 975179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 976179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 977179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 978179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 979afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 980afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 981afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGR: 982afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 983179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 984179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 985179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 986afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 987afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 988afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGRA: 989afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 990179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 991179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 992179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 993179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 994afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 995afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ABGR_EXT: 996afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 997179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 998179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 999179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1000179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1001afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1002afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1003afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 1004b7d076fc96ac27117421653a043d00a95f789d24Brian Paul gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1005afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1006afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->SwapBytes) { 1007b7d076fc96ac27117421653a043d00a95f789d24Brian Paul _mesa_swap2( (GLushort *) dst, n * comps ); 1008afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1009afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1010afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1011afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 1012afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach { 1013afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 1014afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (format) { 1015afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 1016afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1017179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1018afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1019afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_GREEN: 1020afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1021179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1022afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1023afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BLUE: 1024afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1025179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1026afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1027afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ALPHA: 1028afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1029179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1030afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1031afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE: 1032afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1033afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_UINT(luminance[i]); 1034afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1035afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE_ALPHA: 1036afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1037afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*2+0] = FLOAT_TO_UINT(luminance[i]); 1038179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*2+1] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1039afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1040afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1041afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 1042afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1043179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+0] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1044179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1045179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+2] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1046afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1047afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1048afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGBA: 1049afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1050179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+0] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1051179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1052179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+2] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1053179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1054afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1055afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1056afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGR: 1057afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1058179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+0] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1059179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1060179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+2] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1061afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1062afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1063afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGRA: 1064afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1065179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+0] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1066179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1067179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+2] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1068179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1069afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1070afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1071afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ABGR_EXT: 1072afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1073179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+0] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1074179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+1] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1075179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+2] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1076179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+3] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1077afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1078afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1079afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 1080b7d076fc96ac27117421653a043d00a95f789d24Brian Paul gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1081afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1082afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->SwapBytes) { 1083b7d076fc96ac27117421653a043d00a95f789d24Brian Paul _mesa_swap4( (GLuint *) dst, n * comps ); 1084afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1085afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1086afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1087afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 1088afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach { 1089afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint *dst = (GLint *) destination; 1090afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (format) { 1091afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 1092afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1093179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i] = FLOAT_TO_INT(rgba[i][RCOMP]); 1094afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1095afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_GREEN: 1096afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1097179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i] = FLOAT_TO_INT(rgba[i][GCOMP]); 1098afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1099afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BLUE: 1100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1101179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i] = FLOAT_TO_INT(rgba[i][BCOMP]); 1102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ALPHA: 1104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1105179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i] = FLOAT_TO_INT(rgba[i][ACOMP]); 1106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE: 1108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_INT(luminance[i]); 1110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE_ALPHA: 1112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*2+0] = FLOAT_TO_INT(luminance[i]); 1114179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*2+1] = FLOAT_TO_INT(rgba[i][ACOMP]); 1115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 1118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1119179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+0] = FLOAT_TO_INT(rgba[i][RCOMP]); 1120179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 1121179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+2] = FLOAT_TO_INT(rgba[i][BCOMP]); 1122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGBA: 1125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1126179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+0] = FLOAT_TO_INT(rgba[i][RCOMP]); 1127179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 1128179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+2] = FLOAT_TO_INT(rgba[i][BCOMP]); 1129179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]); 1130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGR: 1133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1134179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+0] = FLOAT_TO_INT(rgba[i][BCOMP]); 1135179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 1136179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+2] = FLOAT_TO_INT(rgba[i][RCOMP]); 1137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGRA: 1140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1141179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+0] = FLOAT_TO_INT(rgba[i][BCOMP]); 1142179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 1143179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+2] = FLOAT_TO_INT(rgba[i][RCOMP]); 1144179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]); 1145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ABGR_EXT: 1148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1149179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+0] = FLOAT_TO_INT(rgba[i][ACOMP]); 1150179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+1] = FLOAT_TO_INT(rgba[i][BCOMP]); 1151179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+2] = FLOAT_TO_INT(rgba[i][GCOMP]); 1152179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+3] = FLOAT_TO_INT(rgba[i][RCOMP]); 1153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 1156b7d076fc96ac27117421653a043d00a95f789d24Brian Paul gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->SwapBytes) { 1159b7d076fc96ac27117421653a043d00a95f789d24Brian Paul _mesa_swap4( (GLuint *) dst, n * comps ); 1160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 1164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach { 1165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLfloat *dst = (GLfloat *) destination; 1166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (format) { 1167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 1168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1169179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i] = rgba[i][RCOMP]; 1170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_GREEN: 1172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1173179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i] = rgba[i][GCOMP]; 1174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BLUE: 1176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1177179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i] = rgba[i][BCOMP]; 1178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ALPHA: 1180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1181179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i] = rgba[i][ACOMP]; 1182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE: 1184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = luminance[i]; 1186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE_ALPHA: 1188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*2+0] = luminance[i]; 1190179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*2+1] = rgba[i][ACOMP]; 1191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 1194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1195179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+0] = rgba[i][RCOMP]; 1196179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+1] = rgba[i][GCOMP]; 1197179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+2] = rgba[i][BCOMP]; 1198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGBA: 1201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1202179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+0] = rgba[i][RCOMP]; 1203179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+1] = rgba[i][GCOMP]; 1204179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+2] = rgba[i][BCOMP]; 1205179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+3] = rgba[i][ACOMP]; 1206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGR: 1209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1210179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+0] = rgba[i][BCOMP]; 1211179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+1] = rgba[i][GCOMP]; 1212179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*3+2] = rgba[i][RCOMP]; 1213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGRA: 1216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1217179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+0] = rgba[i][BCOMP]; 1218179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+1] = rgba[i][GCOMP]; 1219179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+2] = rgba[i][RCOMP]; 1220179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+3] = rgba[i][ACOMP]; 1221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ABGR_EXT: 1224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1225179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+0] = rgba[i][ACOMP]; 1226179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+1] = rgba[i][BCOMP]; 1227179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+2] = rgba[i][GCOMP]; 1228179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i*4+3] = rgba[i][RCOMP]; 1229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 1232b7d076fc96ac27117421653a043d00a95f789d24Brian Paul gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->SwapBytes) { 1235b7d076fc96ac27117421653a043d00a95f789d24Brian Paul _mesa_swap4( (GLuint *) dst, n * comps ); 1236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_3_3_2: 1240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB) { 1241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte *dst = (GLubyte *) destination; 1242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 124383aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 7.0F)) << 5) 1244179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul | (((GLint) (rgba[i][GCOMP] * 7.0F)) << 2) 124583aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul | (((GLint) (rgba[i][BCOMP] * 3.0F)) ); 1246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_2_3_3_REV: 1250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB) { 1251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte *dst = (GLubyte *) destination; 1252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 125383aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 7.0F)) ) 1254179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul | (((GLint) (rgba[i][GCOMP] * 7.0F)) << 3) 125583aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul | (((GLint) (rgba[i][BCOMP] * 3.0F)) << 5); 1256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5: 1260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB) { 1261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLushort *dst = (GLushort *) destination; 1262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 126383aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) << 11) 1264179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul | (((GLint) (rgba[i][GCOMP] * 63.0F)) << 5) 126583aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul | (((GLint) (rgba[i][BCOMP] * 31.0F)) ); 1266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5_REV: 1270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB) { 1271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLushort *dst = (GLushort *) destination; 1272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 127383aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) ) 1274179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul | (((GLint) (rgba[i][GCOMP] * 63.0F)) << 5) 127583aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 11); 1276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4: 1280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB) { 1281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLushort *dst = (GLushort *) destination; 1282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 128383aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 15.0F)) << 12) 1284179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 8) 128583aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul | (((GLint) (rgba[i][BCOMP] * 15.0F)) << 4) 1286179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul | (((GLint) (rgba[i][ACOMP] * 15.0F)) ); 1287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4_REV: 1291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB) { 1292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLushort *dst = (GLushort *) destination; 1293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 129483aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 15.0F)) ) 1295179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 4) 129683aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul | (((GLint) (rgba[i][BCOMP] * 15.0F)) << 8) 1297179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul | (((GLint) (rgba[i][ACOMP] * 15.0F)) << 12); 1298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_5_5_1: 1302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB) { 1303afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLushort *dst = (GLushort *) destination; 1304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 130583aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) << 11) 1306179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 6) 130783aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 1) 1308179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul | (((GLint) (rgba[i][ACOMP] * 1.0F)) ); 1309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_1_5_5_5_REV: 1313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB) { 1314afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLushort *dst = (GLushort *) destination; 1315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 131683aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) ) 1317179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 5) 131883aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 10) 1319179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul | (((GLint) (rgba[i][ACOMP] * 1.0F)) << 15); 1320afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8: 1324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGBA) { 1325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 1326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 132783aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul dst[i] = (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 24) 1328179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16) 132983aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 8) 1330179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul | (((GLuint) (rgba[i][ACOMP] * 255.0F)) ); 1331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (format == GL_BGRA) { 1334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 1335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 133683aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul dst[i] = (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 24) 1337179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16) 133883aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul | (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 8) 1339179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul | (((GLuint) (rgba[i][ACOMP] * 255.0F)) ); 1340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (format == GL_ABGR_EXT) { 1343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 1344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1345179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i] = (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24) 134683aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 16) 1347179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 8) 134883aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul | (((GLuint) (rgba[i][RCOMP] * 255.0F)) ); 1349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8_REV: 1353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGBA) { 1354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 1355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 135683aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul dst[i] = (((GLuint) (rgba[i][RCOMP] * 255.0F)) ) 1357179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 8) 135883aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 16) 1359179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul | (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24); 1360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (format == GL_BGRA) { 1363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 1364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 136583aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul dst[i] = (((GLuint) (rgba[i][BCOMP] * 255.0F)) ) 1366179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 8) 136783aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul | (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 16) 1368179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul | (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24); 1369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (format == GL_ABGR_EXT) { 1372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 1373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1374179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i] = (((GLuint) (rgba[i][ACOMP] * 255.0F)) ) 137583aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 8) 1376179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16) 137783aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul | (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 24); 1378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_10_10_10_2: 1382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGBA) { 1383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 1384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 138583aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul dst[i] = (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 22) 1386179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 12) 138783aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 2) 1388179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul | (((GLuint) (rgba[i][ACOMP] * 3.0F)) ); 1389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (format == GL_BGRA) { 1392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 1393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 139483aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul dst[i] = (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 22) 1395179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 12) 139683aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul | (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 2) 1397179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul | (((GLuint) (rgba[i][ACOMP] * 3.0F)) ); 1398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (format == GL_ABGR_EXT) { 1401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 1402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1403179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i] = (((GLuint) (rgba[i][ACOMP] * 1023.0F)) << 22) 140483aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 12) 1405179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 2) 140683aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul | (((GLuint) (rgba[i][RCOMP] * 3.0F)) ); 1407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_2_10_10_10_REV: 1411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGBA) { 1412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 1413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 141483aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul dst[i] = (((GLuint) (rgba[i][RCOMP] * 1023.0F)) ) 1415179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 10) 141683aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 20) 1417179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul | (((GLuint) (rgba[i][ACOMP] * 3.0F)) << 30); 1418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (format == GL_BGRA) { 1421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 1422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 142383aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul dst[i] = (((GLuint) (rgba[i][BCOMP] * 1023.0F)) ) 1424179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 10) 142583aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul | (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 20) 1426179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul | (((GLuint) (rgba[i][ACOMP] * 3.0F)) << 30); 1427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (format == GL_ABGR_EXT) { 1430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 1431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1432179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul dst[i] = (((GLuint) (rgba[i][ACOMP] * 1023.0F)) ) 143383aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 10) 1434179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 20) 143583aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul | (((GLuint) (rgba[i][RCOMP] * 3.0F)) << 30); 1436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 1440b7d076fc96ac27117421653a043d00a95f789d24Brian Paul gl_problem( ctx, "bad type in _mesa_pack_rgba_span" ); 1441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 1444c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1445c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1446179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul 1447c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define SWAP2BYTE(VALUE) \ 1448c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { \ 1449c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *bytes = (GLubyte *) &(VALUE); \ 1450c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte tmp = bytes[0]; \ 1451c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[0] = bytes[1]; \ 1452c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[1] = tmp; \ 1453c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1454c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1455c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define SWAP4BYTE(VALUE) \ 1456c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { \ 1457c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *bytes = (GLubyte *) &(VALUE); \ 1458c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte tmp = bytes[0]; \ 1459c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[0] = bytes[3]; \ 1460c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[3] = tmp; \ 1461c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul tmp = bytes[1]; \ 1462c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[1] = bytes[2]; \ 1463c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[2] = tmp; \ 1464c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1465c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1466c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1467c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic void 1468c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulextract_uint_indexes(GLuint n, GLuint indexes[], 1469c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum srcFormat, GLenum srcType, const GLvoid *src, 1470c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const struct gl_pixelstore_attrib *unpack ) 1471c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 1472c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(srcFormat == GL_COLOR_INDEX); 1473c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1474c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcType == GL_BITMAP || 1475c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_BYTE || 1476c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_BYTE || 1477c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT || 1478c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_SHORT || 1479c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT || 1480c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_INT || 1481c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_FLOAT); 1482c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1483c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul switch (srcType) { 1484c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BITMAP: 1485c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1486c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *ubsrc = (GLubyte *) src; 1487c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->LsbFirst) { 1488c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte mask = 1 << (unpack->SkipPixels & 0x7); 1489c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1490c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 1491c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = (*ubsrc & mask) ? 1 : 0; 1492c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (mask == 128) { 1493c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul mask = 1; 1494c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ubsrc++; 1495c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1496c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1497c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul mask = mask << 1; 1498c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1499c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1500c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1501c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1502c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte mask = 128 >> (unpack->SkipPixels & 0x7); 1503c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1504c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 1505c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = (*ubsrc & mask) ? 1 : 0; 1506c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (mask == 1) { 1507c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul mask = 128; 1508c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ubsrc++; 1509c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1510c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1511c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul mask = mask >> 1; 1512c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1513c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1514c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1515c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1516c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1517c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_BYTE: 1518c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1519c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1520c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLubyte *s = (const GLubyte *) src; 1521c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 1522c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 1523c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1524c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1525c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BYTE: 1526c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1527c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1528c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLbyte *s = (const GLbyte *) src; 1529c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 1530c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 1531c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1532c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1533c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT: 1534c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1535c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1536c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *s = (const GLushort *) src; 1537c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->SwapBytes) { 1538c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 1539c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort value = s[i]; 1540c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(value); 1541c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = value; 1542c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1543c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1544c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1545c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 1546c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 1547c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1548c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1549c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1550c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_SHORT: 1551c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1552c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1553c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLshort *s = (const GLshort *) src; 1554c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->SwapBytes) { 1555c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 1556c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLshort value = s[i]; 1557c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(value); 1558c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = value; 1559c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1560c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1561c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1562c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 1563c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 1564c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1565c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1566c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1567c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT: 1568c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1569c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1570c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *s = (const GLuint *) src; 1571c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->SwapBytes) { 1572c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 1573c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint value = s[i]; 1574c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(value); 1575c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = value; 1576c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1577c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1578c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1579c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 1580c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 1581c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1582c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1583c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1584c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_INT: 1585c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1586c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1587c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLint *s = (const GLint *) src; 1588c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->SwapBytes) { 1589c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 1590c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint value = s[i]; 1591c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(value); 1592c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = value; 1593c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1594c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1595c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1596c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 1597c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 1598c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1599c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1600c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1601c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_FLOAT: 1602c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1603c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1604c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLfloat *s = (const GLfloat *) src; 1605c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->SwapBytes) { 1606c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 1607c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLfloat value = s[i]; 1608c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(value); 1609959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul indexes[i] = (GLuint) value; 1610c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1611c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1612c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1613c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 1614959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul indexes[i] = (GLuint) s[i]; 1615c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1616c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1617c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1618c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul default: 1619c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_problem(NULL, "bad srcType in extract_uint_indexes"); 1620c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 1621c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1622c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 1623c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1624c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1625c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1626c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/* 1627c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This function extracts floating point RGBA values from arbitrary 1628c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * image data. srcFormat and srcType are the format and type parameters 1629c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc. 1630c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * 1631c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function 1632c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * implements the "Conversion to floating point", "Conversion to RGB", 1633c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * and "Final Expansion to RGBA" operations. 1634c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * 1635c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Args: n - number of pixels 1636c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * rgba - output colors 1637c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * srcFormat - format of incoming data 1638c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * srcType - datatype of incoming data 1639c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * src - source data pointer 1640c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * swapBytes - perform byteswapping of incoming data? 1641c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 1642c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic void 1643c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulextract_float_rgba(GLuint n, GLfloat rgba[][4], 1644c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum srcFormat, GLenum srcType, const GLvoid *src, 1645c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLboolean swapBytes) 1646c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 1647c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint redIndex, greenIndex, blueIndex, alphaIndex; 1648c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint stride; 1649c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint rComp, bComp, gComp, aComp; 1650c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1651c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcFormat == GL_RED || 1652c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_GREEN || 1653c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BLUE || 1654c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_ALPHA || 1655c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_LUMINANCE || 1656c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_LUMINANCE_ALPHA || 1657c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_INTENSITY || 1658c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_RGB || 1659c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BGR || 1660c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_RGBA || 1661c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BGRA || 1662c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_ABGR_EXT); 1663c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1664c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcType == GL_UNSIGNED_BYTE || 1665c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_BYTE || 1666c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT || 1667c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_SHORT || 1668c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT || 1669c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_INT || 1670c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_FLOAT || 1671c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_BYTE_3_3_2 || 1672a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 1673a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_5_6_5 || 1674a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 1675c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 1676a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 1677c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 1678a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 1679c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT_8_8_8_8 || 1680a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 1681a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_10_10_10_2 || 1682a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_2_10_10_10_REV); 1683c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1684a0020435f58baef6a67d3c073b62ea6b1d143af1Brian Paul rComp = gComp = bComp = aComp = -1; 1685a0020435f58baef6a67d3c073b62ea6b1d143af1Brian Paul 1686c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul switch (srcFormat) { 1687c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_RED: 1688c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 0; 1689c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = blueIndex = alphaIndex = -1; 1690c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 1691c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1692c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_GREEN: 1693c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 0; 1694c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = blueIndex = alphaIndex = -1; 1695c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 1696c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1697c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BLUE: 1698c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 0; 1699c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = greenIndex = alphaIndex = -1; 1700c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 1701c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1702c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_ALPHA: 1703c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = greenIndex = blueIndex = -1; 1704c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = 0; 1705c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 1706c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1707c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_LUMINANCE: 1708c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = greenIndex = blueIndex = 0; 1709c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = -1; 1710c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 1711c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1712c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_LUMINANCE_ALPHA: 1713c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = greenIndex = blueIndex = 0; 1714c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = 1; 1715c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 2; 1716c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1717c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_INTENSITY: 1718c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 0; 1719c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = blueIndex = alphaIndex = -1; 1720c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 1721c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1722c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_RGB: 1723c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 0; 1724c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 1; 1725c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 2; 1726c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = -1; 1727c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 3; 1728c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1729c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BGR: 1730c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 2; 1731c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 1; 1732c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 0; 1733c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = -1; 1734c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 3; 1735c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1736c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_RGBA: 1737c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 0; 1738c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 1; 1739c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 2; 1740c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = 3; 1741c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rComp = 0; 1742c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gComp = 1; 1743c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bComp = 2; 1744c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul aComp = 3; 1745c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 4; 1746c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1747c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BGRA: 1748c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 2; 1749c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 1; 1750c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 0; 1751c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = 3; 1752c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rComp = 2; 1753c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gComp = 1; 1754c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bComp = 0; 1755c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul aComp = 3; 1756c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 4; 1757c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1758c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_ABGR_EXT: 1759c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 3; 1760c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 2; 1761c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 1; 1762c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = 0; 1763c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rComp = 3; 1764c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gComp = 2; 1765c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bComp = 1; 1766c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul aComp = 0; 1767c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 4; 1768c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1769c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul default: 1770c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_problem(NULL, "bad srcFormat in extract float data"); 1771c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 1772c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1773c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1774c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1775c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define PROCESS(INDEX, CHANNEL, DEFAULT, TYPE, CONVERSION) \ 1776c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if ((INDEX) < 0) { \ 1777c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; \ 1778c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { \ 1779c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][CHANNEL] = DEFAULT; \ 1780c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 1781c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 1782c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (swapBytes) { \ 1783c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const TYPE *s = (const TYPE *) src; \ 1784c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; \ 1785c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { \ 1786c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul TYPE value = s[INDEX]; \ 1787c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (sizeof(TYPE) == 2) { \ 1788c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(value); \ 1789c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 1790c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (sizeof(TYPE) == 4) { \ 1791c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(value); \ 1792c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 1793c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][CHANNEL] = (GLfloat) CONVERSION(value); \ 1794c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul s += stride; \ 1795c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 1796c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 1797c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { \ 1798c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const TYPE *s = (const TYPE *) src; \ 1799c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; \ 1800c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { \ 1801c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][CHANNEL] = (GLfloat) CONVERSION(s[INDEX]); \ 1802c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul s += stride; \ 1803c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 1804c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1805c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1806c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul switch (srcType) { 1807c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_BYTE: 1808c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT); 1809c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT); 1810c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT); 1811c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLubyte, UBYTE_TO_FLOAT); 1812c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1813c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BYTE: 1814c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT); 1815c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT); 1816c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT); 1817c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLbyte, BYTE_TO_FLOAT); 1818c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1819c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT: 1820c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLushort, USHORT_TO_FLOAT); 1821c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLushort, USHORT_TO_FLOAT); 1822c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLushort, USHORT_TO_FLOAT); 1823c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLushort, USHORT_TO_FLOAT); 1824c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1825c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_SHORT: 1826c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLshort, SHORT_TO_FLOAT); 1827c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLshort, SHORT_TO_FLOAT); 1828c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLshort, SHORT_TO_FLOAT); 1829c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLshort, SHORT_TO_FLOAT); 1830c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1831c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT: 1832c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLuint, UINT_TO_FLOAT); 1833c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLuint, UINT_TO_FLOAT); 1834c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLuint, UINT_TO_FLOAT); 1835c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLuint, UINT_TO_FLOAT); 1836c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1837c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_INT: 1838c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLint, INT_TO_FLOAT); 1839c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLint, INT_TO_FLOAT); 1840c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLint, INT_TO_FLOAT); 1841c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLint, INT_TO_FLOAT); 1842c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1843c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_FLOAT: 1844c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLfloat, (GLfloat)); 1845c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLfloat, (GLfloat)); 1846c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLfloat, (GLfloat)); 1847c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLfloat, (GLfloat)); 1848c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1849c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_BYTE_3_3_2: 1850c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1851c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLubyte *ubsrc = (const GLubyte *) src; 1852c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1853c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 1854c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte p = ubsrc[i]; 1855c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p >> 5) ) * (1.0F / 7.0F); 1856c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 2) & 0x7) * (1.0F / 7.0F); 1857c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p ) & 0x3) * (1.0F / 3.0F); 1858c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 1859c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1860c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1861c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1862c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_BYTE_2_3_3_REV: 1863c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1864c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLubyte *ubsrc = (const GLubyte *) src; 1865c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1866c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 1867c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte p = ubsrc[i]; 1868c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p ) & 0x7) * (1.0F / 7.0F); 1869c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 3) & 0x7) * (1.0F / 7.0F); 1870c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p >> 6) ) * (1.0F / 3.0F); 1871c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 1872c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1873c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1874c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1875c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_5_6_5: 1876c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 1877c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 1878c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1879c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 1880c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 1881c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 1882c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p >> 11) ) * (1.0F / 31.0F); 1883c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 5) & 0x3f) * (1.0F / 63.0F); 1884c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p ) & 0x1f) * (1.0F / 31.0F); 1885c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 1886c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1887c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1888c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1889c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 1890c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1891c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 1892c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 1893c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p >> 11) ) * (1.0F / 31.0F); 1894c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 5) & 0x3f) * (1.0F / 63.0F); 1895c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p ) & 0x1f) * (1.0F / 31.0F); 1896c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 1897c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1898c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1899c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1900c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_5_6_5_REV: 1901c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 1902c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 1903c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1904c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 1905c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 1906c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 1907c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p ) & 0x1f) * (1.0F / 31.0F); 1908c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 5) & 0x3f) * (1.0F / 63.0F); 1909c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p >> 11) ) * (1.0F / 31.0F); 1910c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 1911c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1912c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1913c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1914c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 1915c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1916c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 1917c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 1918c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p ) & 0x1f) * (1.0F / 31.0F); 1919c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 5) & 0x3f) * (1.0F / 63.0F); 1920c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p >> 11) ) * (1.0F / 31.0F); 1921c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 1922c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1923c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1924c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1925c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_4_4_4_4: 1926c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 1927c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 1928c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1929c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 1930c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 1931c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 1932c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p >> 12) ) * (1.0F / 15.0F); 1933c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F); 1934c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F); 1935c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p ) & 0xf) * (1.0F / 15.0F); 1936c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1937c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1938c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1939c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 1940c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1941c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 1942c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 1943c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p >> 12) ) * (1.0F / 15.0F); 1944c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F); 1945c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F); 1946c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p ) & 0xf) * (1.0F / 15.0F); 1947c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1948c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1949c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1950c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_4_4_4_4_REV: 1951c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 1952c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 1953c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1954c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 1955c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 1956c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 1957c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0xf) * (1.0F / 15.0F); 1958c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F); 1959c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F); 1960c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 12) ) * (1.0F / 15.0F); 1961c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1962c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1963c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1964c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 1965c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1966c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 1967c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 1968c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0xf) * (1.0F / 15.0F); 1969c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F); 1970c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F); 1971c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 12) ) * (1.0F / 15.0F); 1972c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1973c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1974c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1975c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_5_5_5_1: 1976c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 1977c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 1978c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1979c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 1980c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 1981c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 1982c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p >> 11) ) * (1.0F / 31.0F); 1983c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 6) & 0x1f) * (1.0F / 31.0F); 1984c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 1) & 0x1f) * (1.0F / 31.0F); 1985c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p ) & 0x1) * (1.0F / 1.0F); 1986c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1987c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1988c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1989c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 1990c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1991c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 1992c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 1993c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p >> 11) ) * (1.0F / 31.0F); 1994c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 6) & 0x1f) * (1.0F / 31.0F); 1995c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 1) & 0x1f) * (1.0F / 31.0F); 1996c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p ) & 0x1) * (1.0F / 1.0F); 1997c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1998c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1999c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2000c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_1_5_5_5_REV: 2001c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2002c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2003c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2004c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2005c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2006c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 2007c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0x1f) * (1.0F / 31.0F); 2008c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 5) & 0x1f) * (1.0F / 31.0F); 2009c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F); 2010c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 15) ) * (1.0F / 1.0F); 2011c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2012c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2013c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2014c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 2015c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2016c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2017c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 2018c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0x1f) * (1.0F / 31.0F); 2019c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 5) & 0x1f) * (1.0F / 31.0F); 2020c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F); 2021c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 15) ) * (1.0F / 1.0F); 2022c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2023c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2024c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2025c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT_8_8_8_8: 2026c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2027c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2028c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2029c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2030c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 2031c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p ) & 0xff); 2032c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 8) & 0xff); 2033c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 16) & 0xff); 2034c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 24) ); 2035c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2036c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2037c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2038c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2039c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2040c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2041c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 2042c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 24) ); 2043c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 16) & 0xff); 2044c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 8) & 0xff); 2045c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p ) & 0xff); 2046c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2047c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2048c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2049c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT_8_8_8_8_REV: 2050c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2051c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2052c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2053c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2054c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 2055c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 24) ); 2056c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 16) & 0xff); 2057c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 8) & 0xff); 2058c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p ) & 0xff); 2059c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2060c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2061c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2062c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2063c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2064c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2065c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 2066c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p ) & 0xff); 2067c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 8) & 0xff); 2068c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 16) & 0xff); 2069c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 24) ); 2070c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2071c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2072c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2073c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT_10_10_10_2: 2074c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2075c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2076c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2077c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2078c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 2079c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(p); 2080a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][rComp] = ((p >> 22) ) * (1.0F / 1023.0F); 2081a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F); 2082a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][bComp] = ((p >> 2) & 0x3ff) * (1.0F / 1023.0F); 2083a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][aComp] = ((p ) & 0x3 ) * (1.0F / 3.0F); 2084c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2085c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2086c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2087c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2088c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2089c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2090c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 2091a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][rComp] = ((p >> 22) ) * (1.0F / 1023.0F); 2092a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F); 2093a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][bComp] = ((p >> 2) & 0x3ff) * (1.0F / 1023.0F); 2094a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][aComp] = ((p ) & 0x3 ) * (1.0F / 3.0F); 2095c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2096c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2097c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2098c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT_2_10_10_10_REV: 2099c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2100c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2101c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2102c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2103c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 2104c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(p); 2105c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0x3ff) * (1.0F / 1023.0F); 2106c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F); 2107c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F); 2108c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 30) ) * (1.0F / 3.0F); 2109c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2110c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2111c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2112c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2113c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2114c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2115c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 2116c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0x3ff) * (1.0F / 1023.0F); 2117c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F); 2118c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F); 2119c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 30) ) * (1.0F / 3.0F); 2120c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2121c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2122c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2123c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul default: 2124c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_problem(NULL, "bad srcType in extract float data"); 2125c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2126c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2127c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 2128c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2129c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2130c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2131c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/* 2132c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack a row of color image data from a client buffer according to 2133c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * the pixel unpacking parameters. Apply any enabled pixel transfer 2134c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * ops (PixelMap, scale/bias) if the applyTransferOps flag is enabled. 2135c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Return GLubyte values in the specified dest image format. 2136c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This is (or will be) used by glDrawPixels and glTexImage?D(). 2137c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Input: ctx - the context 2138c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * n - number of pixels in the span 2139c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * dstFormat - format of destination color array 2140c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * dest - the destination color array 2141c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * srcFormat - source image format 2142c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * srcType - source image datatype 2143c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * source - source image pointer 2144c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * unpacking - pixel unpacking parameters 2145c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * applyTransferOps - apply scale/bias/lookup-table ops? 2146c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * 2147c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * XXX perhaps expand this to process whole images someday. 2148c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 2149c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid 2150c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul_mesa_unpack_ubyte_color_span( GLcontext *ctx, 2151c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint n, GLenum dstFormat, GLubyte dest[], 2152c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum srcFormat, GLenum srcType, 2153c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLvoid *source, 2154c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const struct gl_pixelstore_attrib *unpacking, 2155c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLboolean applyTransferOps ) 2156c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 2157c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(dstFormat == GL_ALPHA || 2158c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_LUMINANCE || 2159c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_LUMINANCE_ALPHA || 2160c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_INTENSITY || 2161c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_RGB || 2162c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_RGBA || 2163c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_COLOR_INDEX); 2164c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2165c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcFormat == GL_RED || 2166c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_GREEN || 2167c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BLUE || 2168c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_ALPHA || 2169c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_LUMINANCE || 2170c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_LUMINANCE_ALPHA || 2171c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_INTENSITY || 2172c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_RGB || 2173c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BGR || 2174c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_RGBA || 2175c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BGRA || 2176c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_ABGR_EXT || 2177c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_COLOR_INDEX); 2178c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2179c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcType == GL_BITMAP || 2180c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_BYTE || 2181c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_BYTE || 2182c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT || 2183c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_SHORT || 2184c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT || 2185c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_INT || 2186c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_FLOAT || 2187c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_BYTE_3_3_2 || 2188a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 2189a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_5_6_5 || 2190a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 2191c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 2192a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 2193c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 2194a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 2195c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT_8_8_8_8 || 2196a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 2197a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_10_10_10_2 || 2198a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_2_10_10_10_REV); 2199c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2200250069dbb443f26f4dcc409c9c873019a5f50f9dBrian Paul /* this is intended for RGBA mode only */ 2201fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul assert(ctx->Visual->RGBAflag); 2202c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2203c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul applyTransferOps &= (ctx->Pixel.ScaleOrBiasRGBA || 2204fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul ctx->Pixel.MapColorFlag || 2205250069dbb443f26f4dcc409c9c873019a5f50f9dBrian Paul ctx->ColorMatrix.type != MATRIX_IDENTITY || 2206179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul ctx->Pixel.ScaleOrBiasRGBApcm || 2207a5f4cae20a5d47bf5e0f8d1aa35650d16391097dBrian Paul ctx->Pixel.ColorTableEnabled || 2208c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul ctx->Pixel.PostColorMatrixColorTableEnabled || 2209c29714dccb664562958cf36cdedee9c4377585d2Brian Paul ctx->Pixel.PostConvolutionColorTableEnabled || 22101a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul ctx->Pixel.MinMaxEnabled || 22111a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul ctx->Pixel.HistogramEnabled); 2212c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2213c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Try simple cases first */ 2214c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (!applyTransferOps && srcType == GL_UNSIGNED_BYTE) { 2215c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstFormat == GL_RGBA) { 2216c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (srcFormat == GL_RGBA) { 2217c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul MEMCPY( dest, source, n * 4 * sizeof(GLubyte) ); 2218c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 2219c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2220c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (srcFormat == GL_RGB) { 2221c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2222c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLubyte *src = (const GLubyte *) source; 2223c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dst = dest; 2224c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2225c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[0] = src[0]; 2226c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[1] = src[1]; 2227c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[2] = src[2]; 2228c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[3] = 255; 2229c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul src += 3; 2230c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += 4; 2231c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2232c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 2233c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2234c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2235c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (dstFormat == GL_RGB) { 2236c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (srcFormat == GL_RGB) { 2237c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul MEMCPY( dest, source, n * 3 * sizeof(GLubyte) ); 2238c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 2239c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2240c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (srcFormat == GL_RGBA) { 2241c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2242c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLubyte *src = (const GLubyte *) source; 2243c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dst = dest; 2244c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2245c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[0] = src[0]; 2246c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[1] = src[1]; 2247c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[2] = src[2]; 2248c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul src += 4; 2249c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += 3; 2250c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2251c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 2252c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2253c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2254b09a4cd913e2de612fddf5411185a257da35647cBrian Paul else if (dstFormat == srcFormat) { 2255b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GLint comps = _mesa_components_in_format(srcFormat); 2256b09a4cd913e2de612fddf5411185a257da35647cBrian Paul assert(comps > 0); 2257b09a4cd913e2de612fddf5411185a257da35647cBrian Paul MEMCPY( dest, source, n * comps * sizeof(GLubyte) ); 2258c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 2259c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2260c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2261c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2262c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2263179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul /* general solution begins here */ 2264c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2265c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLfloat rgba[MAX_WIDTH][4]; 2266c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint dstComponents; 2267c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint dstRedIndex, dstGreenIndex, dstBlueIndex, dstAlphaIndex; 2268c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint dstLuminanceIndex, dstIntensityIndex; 2269c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2270b7d076fc96ac27117421653a043d00a95f789d24Brian Paul dstComponents = _mesa_components_in_format( dstFormat ); 2271c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* source & dest image formats should have been error checked by now */ 2272c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(dstComponents > 0); 2273c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2274c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* 2275c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Extract image data and convert to RGBA floats 2276c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 2277c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(n <= MAX_WIDTH); 2278c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (srcFormat == GL_COLOR_INDEX) { 2279c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint indexes[MAX_WIDTH]; 2280c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul extract_uint_indexes(n, indexes, srcFormat, srcType, source, 2281c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul unpacking); 2282c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2283c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (applyTransferOps) { 2284c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (ctx->Pixel.MapColorFlag) { 2285c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_map_ci(ctx, n, indexes); 2286c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2287c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset) { 2288c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_shift_and_offset_ci(ctx, n, indexes); 2289c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2290c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2291c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2292c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstFormat == GL_COLOR_INDEX) { 2293c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* convert to GLubyte and return */ 2294c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 2295c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 2296c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dest[i] = (GLubyte) (indexes[i] & 0xff); 2297c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2298c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul return; 2299c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2300c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2301c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Convert indexes to RGBA */ 2302179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul _mesa_map_ci_to_rgba(ctx, n, indexes, rgba); 2303c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2304c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2305c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2306c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul extract_float_rgba(n, rgba, srcFormat, srcType, source, 2307c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul unpacking->SwapBytes); 2308c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2309c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (applyTransferOps) { 2310c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* scale and bias colors */ 2311c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (ctx->Pixel.ScaleOrBiasRGBA) { 2312c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_scale_and_bias_rgba(ctx, n, rgba); 2313c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2314a5f4cae20a5d47bf5e0f8d1aa35650d16391097dBrian Paul /* color map lookup */ 2315c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (ctx->Pixel.MapColorFlag) { 2316179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul _mesa_map_rgba(ctx, n, rgba); 2317250069dbb443f26f4dcc409c9c873019a5f50f9dBrian Paul } 2318c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2319c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2320c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2321c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (applyTransferOps) { 2322c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* GL_COLOR_TABLE lookup */ 2323c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (ctx->Pixel.ColorTableEnabled) { 2324c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_lookup_rgba(&ctx->ColorTable, n, rgba); 2325c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2326c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* XXX convolution here */ 2327c29714dccb664562958cf36cdedee9c4377585d2Brian Paul /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */ 2328c29714dccb664562958cf36cdedee9c4377585d2Brian Paul if (ctx->Pixel.PostConvolutionColorTableEnabled) { 2329c29714dccb664562958cf36cdedee9c4377585d2Brian Paul _mesa_lookup_rgba(&ctx->PostConvolutionColorTable, n, rgba); 2330c29714dccb664562958cf36cdedee9c4377585d2Brian Paul } 2331c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* color matrix transform */ 2332c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (ctx->ColorMatrix.type != MATRIX_IDENTITY || 2333c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul ctx->Pixel.ScaleOrBiasRGBApcm) { 2334c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_transform_rgba(ctx, n, rgba); 2335c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2336c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */ 2337c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (ctx->Pixel.PostColorMatrixColorTableEnabled) { 2338c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_lookup_rgba(&ctx->PostColorMatrixColorTable, n, rgba); 2339c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 23401a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul /* update histogram count */ 23411a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul if (ctx->Pixel.HistogramEnabled) { 23421a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul _mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba); 23431a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul } 2344c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* XXX min/max here */ 2345c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (ctx->Pixel.MinMaxEnabled) { 23461a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul _mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba); 2347c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2348c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2349c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2350c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* clamp to [0,1] */ 2351c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2352c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2353c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2354c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F); 2355c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F); 2356c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F); 2357c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F); 2358c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2359c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2360c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2361c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Now determine which color channels we need to produce. 2362c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * And determine the dest index (offset) within each color tuple. 2363c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 2364c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul switch (dstFormat) { 2365c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_ALPHA: 2366c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstAlphaIndex = 0; 2367c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = -1; 2368c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstLuminanceIndex = dstIntensityIndex = -1; 2369c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2370c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_LUMINANCE: 2371c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstLuminanceIndex = 0; 2372c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1; 2373c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstIntensityIndex = -1; 2374c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2375c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_LUMINANCE_ALPHA: 2376c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstLuminanceIndex = 0; 2377c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstAlphaIndex = 1; 2378c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = -1; 2379c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstIntensityIndex = -1; 2380c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2381c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_INTENSITY: 2382c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstIntensityIndex = 0; 2383c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1; 2384c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstLuminanceIndex = -1; 2385c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2386c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_RGB: 2387c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = 0; 2388c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstGreenIndex = 1; 2389c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstBlueIndex = 2; 2390c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1; 2391c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2392c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_RGBA: 2393c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = 0; 2394c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstGreenIndex = 1; 2395c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstBlueIndex = 2; 2396c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstAlphaIndex = 3; 2397c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstLuminanceIndex = dstIntensityIndex = -1; 2398c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2399c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul default: 2400c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_problem(ctx, "bad dstFormat in _mesa_unpack_ubyte_span()"); 2401276988ec96a48d4ee5c28c0a2da3aa2b5ee0bbeaBrian Paul return; 2402c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2403c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2404c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2405c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Now return the GLubyte data in the requested dstFormat */ 2406fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2407c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstRedIndex >= 0) { 2408c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dst = dest; 2409c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2410c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2411c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[dstRedIndex] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 2412c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += dstComponents; 2413c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2414c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2415c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2416c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstGreenIndex >= 0) { 2417c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dst = dest; 2418c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2419c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2420c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[dstGreenIndex] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 2421c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += dstComponents; 2422c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2423c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2424c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2425c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstBlueIndex >= 0) { 2426c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dst = dest; 2427c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2428c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2429c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[dstBlueIndex] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 2430c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += dstComponents; 2431c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2432c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2433c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2434c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstAlphaIndex >= 0) { 2435c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dst = dest; 2436c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2437c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2438c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[dstAlphaIndex] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 2439c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += dstComponents; 2440c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2441c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2442c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2443c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstIntensityIndex >= 0) { 2444c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dst = dest; 2445c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2446c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(dstIntensityIndex == 0); 2447c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(dstComponents == 1); 2448c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2449c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Intensity comes from red channel */ 2450c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[i] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 2451c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2452c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2453c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2454c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstLuminanceIndex >= 0) { 2455c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dst = dest; 2456c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2457c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(dstLuminanceIndex == 0); 2458c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2459c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Luminance comes from red channel */ 2460c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 2461c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += dstComponents; 2462c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2463c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2464c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2465c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 2466c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2467c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2468c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paulvoid 2469c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul_mesa_unpack_float_color_span( GLcontext *ctx, 2470c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint n, GLenum dstFormat, GLfloat dest[], 2471c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLenum srcFormat, GLenum srcType, 2472c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul const GLvoid *source, 2473c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul const struct gl_pixelstore_attrib *unpacking, 24747a39d2f833807f8defd2304b0ff180944c23ea0cBrian Paul GLboolean applyTransferOps, GLboolean clamp ) 2475c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul{ 2476c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul ASSERT(dstFormat == GL_ALPHA || 2477c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstFormat == GL_LUMINANCE || 2478c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstFormat == GL_LUMINANCE_ALPHA || 2479c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstFormat == GL_INTENSITY || 2480c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstFormat == GL_RGB || 2481c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstFormat == GL_RGBA || 2482c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstFormat == GL_COLOR_INDEX); 2483c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2484c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul ASSERT(srcFormat == GL_RED || 2485c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_GREEN || 2486c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_BLUE || 2487c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_ALPHA || 2488c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_LUMINANCE || 2489c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_LUMINANCE_ALPHA || 2490c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_INTENSITY || 2491c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_RGB || 2492c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_BGR || 2493c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_RGBA || 2494c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_BGRA || 2495c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_ABGR_EXT || 2496c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcFormat == GL_COLOR_INDEX); 2497c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2498c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul ASSERT(srcType == GL_BITMAP || 2499c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_BYTE || 2500c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_BYTE || 2501c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT || 2502c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_SHORT || 2503c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_INT || 2504c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_INT || 2505c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_FLOAT || 2506c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_BYTE_3_3_2 || 2507c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 2508c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT_5_6_5 || 2509c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 2510c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 2511c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 2512c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 2513c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 2514c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_INT_8_8_8_8 || 2515c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 2516c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_INT_10_10_10_2 || 2517c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul srcType == GL_UNSIGNED_INT_2_10_10_10_REV); 2518c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2519c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* this is intended for RGBA mode only */ 2520c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul assert(ctx->Visual->RGBAflag); 2521c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2522c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul applyTransferOps &= (ctx->Pixel.ScaleOrBiasRGBA || 2523c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul ctx->Pixel.MapColorFlag || 2524c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul ctx->ColorMatrix.type != MATRIX_IDENTITY || 2525c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul ctx->Pixel.ScaleOrBiasRGBApcm || 2526c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul ctx->Pixel.ColorTableEnabled || 2527c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul ctx->Pixel.PostColorMatrixColorTableEnabled || 2528c29714dccb664562958cf36cdedee9c4377585d2Brian Paul ctx->Pixel.PostConvolutionColorTableEnabled || 25291a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul ctx->Pixel.MinMaxEnabled || 25301a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul ctx->Pixel.HistogramEnabled); 2531c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2532c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* general solution, no special cases, yet */ 2533c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul { 2534c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat rgba[MAX_WIDTH][4]; 2535c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLint dstComponents; 2536c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLint dstRedIndex, dstGreenIndex, dstBlueIndex, dstAlphaIndex; 2537c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLint dstLuminanceIndex, dstIntensityIndex; 2538c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2539c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstComponents = _mesa_components_in_format( dstFormat ); 2540c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* source & dest image formats should have been error checked by now */ 2541c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul assert(dstComponents > 0); 2542c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2543c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* 2544c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul * Extract image data and convert to RGBA floats 2545c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul */ 2546c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul assert(n <= MAX_WIDTH); 2547c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (srcFormat == GL_COLOR_INDEX) { 2548c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint indexes[MAX_WIDTH]; 2549c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul extract_uint_indexes(n, indexes, srcFormat, srcType, source, 2550c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul unpacking); 2551c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2552c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (applyTransferOps) { 2553c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (ctx->Pixel.MapColorFlag) { 2554c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_map_ci(ctx, n, indexes); 2555c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2556c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset) { 2557c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_shift_and_offset_ci(ctx, n, indexes); 2558c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2559c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2560c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2561c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstFormat == GL_COLOR_INDEX) { 2562c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* convert to GLubyte and return */ 2563c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 2564c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 2565c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dest[i] = (GLubyte) (indexes[i] & 0xff); 2566c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2567c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul return; 2568c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2569c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul else { 2570c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* Convert indexes to RGBA */ 2571c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_map_ci_to_rgba(ctx, n, indexes, rgba); 2572c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2573c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2574c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul else { 2575c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul extract_float_rgba(n, rgba, srcFormat, srcType, source, 2576c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul unpacking->SwapBytes); 2577c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2578c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (applyTransferOps) { 2579c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* scale and bias colors */ 2580c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (ctx->Pixel.ScaleOrBiasRGBA) { 2581c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_scale_and_bias_rgba(ctx, n, rgba); 2582c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2583c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* color map lookup */ 2584c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (ctx->Pixel.MapColorFlag) { 2585c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_map_rgba(ctx, n, rgba); 2586c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2587c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2588c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2589c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2590c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (applyTransferOps) { 2591c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* GL_COLOR_TABLE lookup */ 2592c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (ctx->Pixel.ColorTableEnabled) { 2593c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_lookup_rgba(&ctx->ColorTable, n, rgba); 2594c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2595c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* XXX convolution here */ 2596c29714dccb664562958cf36cdedee9c4377585d2Brian Paul /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */ 2597c29714dccb664562958cf36cdedee9c4377585d2Brian Paul if (ctx->Pixel.PostConvolutionColorTableEnabled) { 2598c29714dccb664562958cf36cdedee9c4377585d2Brian Paul _mesa_lookup_rgba(&ctx->PostConvolutionColorTable, n, rgba); 2599c29714dccb664562958cf36cdedee9c4377585d2Brian Paul } 2600c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* color matrix transform */ 2601c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (ctx->ColorMatrix.type != MATRIX_IDENTITY || 2602c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul ctx->Pixel.ScaleOrBiasRGBApcm) { 2603c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_transform_rgba(ctx, n, rgba); 2604c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2605c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */ 2606c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (ctx->Pixel.PostColorMatrixColorTableEnabled) { 2607c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul _mesa_lookup_rgba(&ctx->PostColorMatrixColorTable, n, rgba); 2608c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 26091a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul /* update histogram count */ 26101a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul if (ctx->Pixel.HistogramEnabled) { 26111a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul _mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba); 26121a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul } 2613c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* XXX min/max here */ 2614c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (ctx->Pixel.MinMaxEnabled) { 26151a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul _mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba); 2616c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2617c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2618c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2619c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* clamp to [0,1] */ 26207a39d2f833807f8defd2304b0ff180944c23ea0cBrian Paul if (clamp) { 2621c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 2622c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 2623c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F); 2624c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F); 2625c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F); 2626c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F); 2627c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2628c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2629c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2630c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* Now determine which color channels we need to produce. 2631c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul * And determine the dest index (offset) within each color tuple. 2632c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul */ 2633c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul switch (dstFormat) { 2634c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul case GL_ALPHA: 2635c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstAlphaIndex = 0; 2636c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = -1; 2637c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstLuminanceIndex = dstIntensityIndex = -1; 2638c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul break; 2639c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul case GL_LUMINANCE: 2640c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstLuminanceIndex = 0; 2641c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1; 2642c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstIntensityIndex = -1; 2643c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul break; 2644c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul case GL_LUMINANCE_ALPHA: 2645c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstLuminanceIndex = 0; 2646c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstAlphaIndex = 1; 2647c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = -1; 2648c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstIntensityIndex = -1; 2649c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul break; 2650c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul case GL_INTENSITY: 2651c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstIntensityIndex = 0; 2652c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1; 2653c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstLuminanceIndex = -1; 2654c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul break; 2655c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul case GL_RGB: 2656c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstRedIndex = 0; 2657c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstGreenIndex = 1; 2658c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstBlueIndex = 2; 2659c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1; 2660c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul break; 2661c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul case GL_RGBA: 2662c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstRedIndex = 0; 2663c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstGreenIndex = 1; 2664c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstBlueIndex = 2; 2665c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstAlphaIndex = 3; 2666c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dstLuminanceIndex = dstIntensityIndex = -1; 2667c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul break; 2668c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul default: 2669c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul gl_problem(ctx, "bad dstFormat in _mesa_unpack_float_span()"); 2670c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul return; 2671c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2672c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2673c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* Now pack results in teh requested dstFormat */ 2674c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstRedIndex >= 0) { 2675c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat *dst = dest; 2676c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 2677c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 2678c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst[dstRedIndex] = rgba[i][RCOMP]; 2679c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst += dstComponents; 2680c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2681c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2682c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2683c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstGreenIndex >= 0) { 2684c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat *dst = dest; 2685c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 2686c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 2687c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst[dstGreenIndex] = rgba[i][GCOMP]; 2688c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst += dstComponents; 2689c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2690c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2691c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2692c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstBlueIndex >= 0) { 2693c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat *dst = dest; 2694c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 2695c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 2696c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst[dstBlueIndex] = rgba[i][BCOMP]; 2697c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst += dstComponents; 2698c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2699c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2700c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2701c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstAlphaIndex >= 0) { 2702c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat *dst = dest; 2703c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 2704c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 2705c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst[dstAlphaIndex] = rgba[i][ACOMP]; 2706c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst += dstComponents; 2707c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2708c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2709c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2710c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstIntensityIndex >= 0) { 2711c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat *dst = dest; 2712c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 2713c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul assert(dstIntensityIndex == 0); 2714c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul assert(dstComponents == 1); 2715c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 2716c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* Intensity comes from red channel */ 2717c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst[i] = rgba[i][RCOMP]; 2718c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2719c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2720c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2721c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul if (dstLuminanceIndex >= 0) { 2722c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLfloat *dst = dest; 2723c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul GLuint i; 2724c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul assert(dstLuminanceIndex == 0); 2725c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul for (i = 0; i < n; i++) { 2726c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul /* Luminance comes from red channel */ 2727c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst[0] = rgba[i][RCOMP]; 2728c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul dst += dstComponents; 2729c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2730c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2731c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul } 2732c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul} 2733c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2734c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2735c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul 2736c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2737c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/* 2738c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack a row of color index data from a client buffer according to 2739c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * the pixel unpacking parameters. Apply pixel transfer ops if enabled 2740c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * and applyTransferOps is true. 2741c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc. 2742c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * 2743c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Args: ctx - the context 2744c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * n - number of pixels 2745c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * dstType - destination datatype 2746c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * dest - destination array 2747c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * srcType - source pixel type 2748c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * source - source data pointer 2749c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * unpacking - pixel unpacking parameters 2750c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * applyTransferOps - apply offset/bias/lookup ops? 2751c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 2752c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid 2753c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul_mesa_unpack_index_span( const GLcontext *ctx, GLuint n, 2754c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum dstType, GLvoid *dest, 2755c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum srcType, const GLvoid *source, 2756c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const struct gl_pixelstore_attrib *unpacking, 2757c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLboolean applyTransferOps ) 2758c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 2759c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcType == GL_BITMAP || 2760c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_BYTE || 2761c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_BYTE || 2762c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT || 2763c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_SHORT || 2764c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT || 2765c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_INT || 2766c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_FLOAT); 2767c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2768c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(dstType == GL_UNSIGNED_BYTE || 2769c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstType == GL_UNSIGNED_SHORT || 2770c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstType == GL_UNSIGNED_INT); 2771c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2772c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul applyTransferOps &= (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset || ctx->Pixel.MapColorFlag); 2773c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2774c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* 2775c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Try simple cases first 2776c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 2777c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (!applyTransferOps && srcType == GL_UNSIGNED_BYTE 2778c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul && dstType == GL_UNSIGNED_BYTE) { 2779c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul MEMCPY(dest, source, n * sizeof(GLubyte)); 2780c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2781c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (!applyTransferOps && srcType == GL_UNSIGNED_INT 2782c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul && dstType == GL_UNSIGNED_INT && !unpacking->SwapBytes) { 2783c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul MEMCPY(dest, source, n * sizeof(GLuint)); 2784c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2785c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2786c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* 2787c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * general solution 2788c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 2789c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint indexes[MAX_WIDTH]; 2790c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(n <= MAX_WIDTH); 2791c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2792c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source, 2793c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul unpacking); 2794c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2795c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (applyTransferOps) { 2796c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset) { 2797c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* shift and offset indexes */ 2798179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul _mesa_shift_and_offset_ci(ctx, n, indexes); 2799c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2800c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (ctx->Pixel.MapColorFlag) { 2801c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Apply lookup table */ 2802179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul _mesa_map_ci(ctx, n, indexes); 2803c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2804c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2805c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2806c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* convert to dest type */ 2807c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul switch (dstType) { 2808c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_BYTE: 2809c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2810c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dst = (GLubyte *) dest; 2811c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2812c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2813c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[i] = (GLubyte) (indexes[i] & 0xff); 2814c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2815c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2816c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2817c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT: 2818c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2819c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint *dst = (GLuint *) dest; 2820c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2821c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2822c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[i] = (GLushort) (indexes[i] & 0xffff); 2823c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2824c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2825c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2826c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT: 2827c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul MEMCPY(dest, indexes, n * sizeof(GLuint)); 2828c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2829c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul default: 2830c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_problem(ctx, "bad dstType in _mesa_unpack_index_span"); 2831c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2832c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2833c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 2834c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2835c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2836c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/* 2837fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Unpack a row of stencil data from a client buffer according to 2838fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * the pixel unpacking parameters. Apply pixel transfer ops if enabled 2839fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * and applyTransferOps is true. 2840fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * This is (or will be) used by glDrawPixels 2841fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * 2842fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Args: ctx - the context 2843fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * n - number of pixels 2844fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * dstType - destination datatype 2845fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * dest - destination array 2846fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * srcType - source pixel type 2847fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * source - source data pointer 2848fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * unpacking - pixel unpacking parameters 2849fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * applyTransferOps - apply offset/bias/lookup ops? 2850fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */ 2851fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid 2852fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_unpack_stencil_span( const GLcontext *ctx, GLuint n, 2853fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLenum dstType, GLvoid *dest, 2854fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLenum srcType, const GLvoid *source, 2855fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const struct gl_pixelstore_attrib *unpacking, 2856fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLboolean applyTransferOps ) 2857fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{ 2858fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul ASSERT(srcType == GL_BITMAP || 2859fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_UNSIGNED_BYTE || 2860fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_BYTE || 2861fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_UNSIGNED_SHORT || 2862fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_SHORT || 2863fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_UNSIGNED_INT || 2864fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_INT || 2865fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_FLOAT); 2866fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2867fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul ASSERT(dstType == GL_UNSIGNED_BYTE || 2868fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dstType == GL_UNSIGNED_SHORT || 2869fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dstType == GL_UNSIGNED_INT); 2870fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2871fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul applyTransferOps &= (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset || ctx->Pixel.MapColorFlag); 2872fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2873fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* 2874fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Try simple cases first 2875fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */ 2876fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (!applyTransferOps && srcType == GL_UNSIGNED_BYTE 2877fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul && dstType == GL_UNSIGNED_BYTE) { 2878fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul MEMCPY(dest, source, n * sizeof(GLubyte)); 2879fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2880fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul else if (!applyTransferOps && srcType == GL_UNSIGNED_INT 2881fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul && dstType == GL_UNSIGNED_INT && !unpacking->SwapBytes) { 2882fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul MEMCPY(dest, source, n * sizeof(GLuint)); 2883fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2884fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul else { 2885fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* 2886fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * general solution 2887fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */ 2888fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint indexes[MAX_WIDTH]; 2889fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul assert(n <= MAX_WIDTH); 2890fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2891fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source, 2892fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul unpacking); 2893fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2894fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (applyTransferOps) { 2895fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset) { 2896fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* shift and offset indexes */ 2897179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul _mesa_shift_and_offset_ci(ctx, n, indexes); 2898fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2899fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2900fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (ctx->Pixel.MapStencilFlag) { 2901fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* Apply stencil lookup table */ 2902fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint mask = ctx->Pixel.MapStoSsize - 1; 2903fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 2904fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i=0;i<n;i++) { 2905fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul indexes[i] = ctx->Pixel.MapStoS[ indexes[i] & mask ]; 2906fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2907fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2908fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2909fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2910fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* convert to dest type */ 2911fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul switch (dstType) { 2912fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_BYTE: 2913fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 2914fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLubyte *dst = (GLubyte *) dest; 2915fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 2916fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 2917fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dst[i] = (GLubyte) (indexes[i] & 0xff); 2918fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2919fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2920fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 2921fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_SHORT: 2922fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 2923fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint *dst = (GLuint *) dest; 2924fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 2925fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 2926fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dst[i] = (GLushort) (indexes[i] & 0xffff); 2927fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2928fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2929fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 2930fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_INT: 2931fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul MEMCPY(dest, indexes, n * sizeof(GLuint)); 2932fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 2933fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul default: 2934fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul gl_problem(ctx, "bad dstType in _mesa_unpack_stencil_span"); 2935fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2936fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2937fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 2938fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2939fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2940fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2941fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid 2942fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_unpack_depth_span( const GLcontext *ctx, GLuint n, GLdepth *dest, 2943fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLenum srcType, const GLvoid *source, 2944fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const struct gl_pixelstore_attrib *unpacking, 2945fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLboolean applyTransferOps ) 2946fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{ 2947fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLfloat *depth = MALLOC(n * sizeof(GLfloat)); 2948fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (!depth) 2949fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return; 2950fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2951fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul switch (srcType) { 2952fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_BYTE: 2953fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 2954fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 2955fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLubyte *src = (const GLubyte *) source; 2956fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 2957fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul depth[i] = BYTE_TO_FLOAT(src[i]); 2958fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2959fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2960fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 2961fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_BYTE: 2962fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 2963fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 2964fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLubyte *src = (const GLubyte *) source; 2965fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 2966fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul depth[i] = UBYTE_TO_FLOAT(src[i]); 2967fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2968fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2969fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 2970fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_SHORT: 2971fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 2972fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 2973fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLshort *src = (const GLshort *) source; 2974fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 2975fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul depth[i] = SHORT_TO_FLOAT(src[i]); 2976fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2977fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2978fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 2979fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_SHORT: 2980fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 2981fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 2982fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLushort *src = (const GLushort *) source; 2983fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 2984fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul depth[i] = USHORT_TO_FLOAT(src[i]); 2985fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2986fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2987fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 2988fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_INT: 2989fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 2990fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 2991fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLint *src = (const GLint *) source; 2992fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 2993fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul depth[i] = INT_TO_FLOAT(src[i]); 2994fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2995fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2996fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 2997fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_INT: 2998fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 2999fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3000fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLuint *src = (const GLuint *) source; 3001fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3002fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul depth[i] = UINT_TO_FLOAT(src[i]); 3003fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3004fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3005fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3006fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_FLOAT: 3007fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul MEMCPY(depth, source, n * sizeof(GLfloat)); 3008fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 3009fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul default: 3010fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul gl_problem(NULL, "bad type in _mesa_unpack_depth_span()"); 30113c8299c77967611db138169c56a7c6a1c0086d1cBrian Paul FREE(depth); 3012fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return; 3013fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3014fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3015fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3016fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* apply depth scale and bias */ 3017fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) { 3018fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3019fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3020fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul depth[i] = depth[i] * ctx->Pixel.DepthScale + ctx->Pixel.DepthBias; 3021fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3022fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3023fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3024fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* clamp depth values to [0,1] and convert from floats to integers */ 3025fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 3026ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul const GLfloat zs = ctx->Visual->DepthMaxF; 3027fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 3028fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 3029ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul dest[i] = (GLdepth) (CLAMP(depth[i], 0.0F, 1.0F) * zs); 3030fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3031fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3032fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3033fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul FREE(depth); 3034fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 3035fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3036fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3037fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3038fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul/* 3039c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack image data. Apply byteswapping, byte flipping (bitmap). 3040c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Return all image data in a contiguous block. 3041c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 3042c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid * 3043c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul_mesa_unpack_image( GLsizei width, GLsizei height, GLsizei depth, 3044c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum format, GLenum type, const GLvoid *pixels, 3045c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const struct gl_pixelstore_attrib *unpack ) 3046c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 3047c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint bytesPerRow, compsPerRow; 3048c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLboolean flipBytes, swap2, swap4; 3049c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3050c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (!pixels) 3051c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return NULL; /* not necessarily an error */ 3052c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3053c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (width <= 0 || height <= 0 || depth <= 0) 3054c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return NULL; /* generate error later */ 3055c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3056c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (format == GL_BITMAP) { 3057c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytesPerRow = (width + 7) >> 3; 3058c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul flipBytes = !unpack->LsbFirst; 3059c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul swap2 = swap4 = GL_FALSE; 3060c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul compsPerRow = 0; 3061c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3062c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 3063b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type); 3064b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const GLint components = _mesa_components_in_format(format); 3065c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint bytesPerComp; 3066c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (bytesPerPixel <= 0 || components <= 0) 3067c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return NULL; /* bad format or type. generate error later */ 3068c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytesPerRow = bytesPerPixel * width; 3069c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytesPerComp = bytesPerPixel / components; 3070c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul flipBytes = GL_FALSE; 3071c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul swap2 = (bytesPerComp == 2) && unpack->SwapBytes; 3072c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul swap4 = (bytesPerComp == 4) && unpack->SwapBytes; 3073c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul compsPerRow = components * width; 3074c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(compsPerRow >= width); 3075c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3076c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3077c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 3078c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *destBuffer = MALLOC(bytesPerRow * height * depth); 3079c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dst; 3080c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint img, row; 3081c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (!destBuffer) 3082c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return NULL; /* generate GL_OUT_OF_MEMORY later */ 3083c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 3084c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst = destBuffer; 3085c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (img = 0; img < depth; img++) { 3086c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (row = 0; row < height; row++) { 3087b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const GLvoid *src = _mesa_image_address(unpack, pixels, 3088c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul width, height, format, type, img, row, 0); 3089c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul MEMCPY(dst, src, bytesPerRow); 3090c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* byte flipping/swapping */ 3091c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (flipBytes) { 3092b7d076fc96ac27117421653a043d00a95f789d24Brian Paul flip_bytes((GLubyte *) dst, bytesPerRow); 3093c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3094c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (swap2) { 3095b7d076fc96ac27117421653a043d00a95f789d24Brian Paul _mesa_swap2((GLushort*) dst, compsPerRow); 3096c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3097c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (swap4) { 3098b7d076fc96ac27117421653a043d00a95f789d24Brian Paul _mesa_swap4((GLuint*) dst, compsPerRow); 3099c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3100c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += bytesPerRow; 3101c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3102c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3103c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return destBuffer; 3104c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 3105c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 3106fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3107fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3108fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul/* 3109fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Unpack bitmap data. Resulting data will be in most-significant-bit-first 3110fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * order with row alignment = 1 byte. 3111fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */ 3112fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian PaulGLvoid * 3113fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_unpack_bitmap( GLint width, GLint height, const GLubyte *pixels, 3114fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const struct gl_pixelstore_attrib *packing ) 3115fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{ 3116fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint bytes, row, width_in_bytes; 3117fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLubyte *buffer, *dst; 3118fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3119fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (!pixels) 3120fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return NULL; 3121fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3122fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* Alloc dest storage */ 3123fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul bytes = ((width + 7) / 8 * height); 3124fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul buffer = (GLubyte *) MALLOC( bytes ); 3125fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (!buffer) 3126fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return NULL; 3127fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3128fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3129fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul width_in_bytes = CEILING( width, 8 ); 3130fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dst = buffer; 3131fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (row = 0; row < height; row++) { 3132b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GLubyte *src = _mesa_image_address( packing, pixels, width, height, 3133b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GL_COLOR_INDEX, GL_BITMAP, 3134b7d076fc96ac27117421653a043d00a95f789d24Brian Paul 0, row, 0 ); 3135fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (!src) { 3136fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul FREE(buffer); 3137fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return NULL; 3138fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3139fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3140fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (packing->SkipPixels == 0) { 3141fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul MEMCPY( dst, src, width_in_bytes ); 3142fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (packing->LsbFirst) { 3143b7d076fc96ac27117421653a043d00a95f789d24Brian Paul flip_bytes( dst, width_in_bytes ); 3144fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3145fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3146fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul else { 3147fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* handling SkipPixels is a bit tricky (no pun intended!) */ 3148fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint i; 3149fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (packing->LsbFirst) { 3150fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLubyte srcMask = 1 << (packing->SkipPixels & 0x7); 3151fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLubyte dstMask = 128; 3152fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLubyte *s = src; 3153fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLubyte *d = dst; 3154fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *d = 0; 3155fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < width; i++) { 3156fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (*s & srcMask) { 3157fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *d |= dstMask; 3158fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3159fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (srcMask == 128) { 3160fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcMask = 1; 3161fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul s++; 3162fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3163fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul else { 3164fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcMask = srcMask << 1; 3165fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3166fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (dstMask == 1) { 3167fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dstMask = 128; 3168fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul d++; 3169fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *d = 0; 3170fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3171fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul else { 3172fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dstMask = dstMask >> 1; 3173fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3174fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3175fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3176fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul else { 3177fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7); 3178fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLubyte dstMask = 128; 3179fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLubyte *s = src; 3180fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLubyte *d = dst; 3181fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *d = 0; 3182fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < width; i++) { 3183fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (*s & srcMask) { 3184fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *d |= dstMask; 3185fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3186fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (srcMask == 1) { 3187fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcMask = 128; 3188fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul s++; 3189fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3190fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul else { 3191fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcMask = srcMask >> 1; 3192fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3193fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (dstMask == 1) { 3194fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dstMask = 128; 3195fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul d++; 3196fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *d = 0; 3197fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3198fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul else { 3199fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dstMask = dstMask >> 1; 3200fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3201fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3202fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3203fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3204fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dst += width_in_bytes; 3205fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 3206fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 3207fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return buffer; 3208fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 32097c652d77220610ecc19aaefa20876216b035e961Brian Paul 32107c652d77220610ecc19aaefa20876216b035e961Brian Paul 32117c652d77220610ecc19aaefa20876216b035e961Brian Paul/* 32127c652d77220610ecc19aaefa20876216b035e961Brian Paul * Pack bitmap data. 32137c652d77220610ecc19aaefa20876216b035e961Brian Paul */ 32147c652d77220610ecc19aaefa20876216b035e961Brian Paulvoid 32157c652d77220610ecc19aaefa20876216b035e961Brian Paul_mesa_pack_bitmap( GLint width, GLint height, const GLubyte *source, 32167c652d77220610ecc19aaefa20876216b035e961Brian Paul GLubyte *dest, const struct gl_pixelstore_attrib *packing ) 32177c652d77220610ecc19aaefa20876216b035e961Brian Paul{ 32187c652d77220610ecc19aaefa20876216b035e961Brian Paul GLint row, width_in_bytes; 32197c652d77220610ecc19aaefa20876216b035e961Brian Paul const GLubyte *src; 32207c652d77220610ecc19aaefa20876216b035e961Brian Paul 32217c652d77220610ecc19aaefa20876216b035e961Brian Paul if (!source) 32227c652d77220610ecc19aaefa20876216b035e961Brian Paul return; 32237c652d77220610ecc19aaefa20876216b035e961Brian Paul 32247c652d77220610ecc19aaefa20876216b035e961Brian Paul width_in_bytes = CEILING( width, 8 ); 32257c652d77220610ecc19aaefa20876216b035e961Brian Paul src = source; 32267c652d77220610ecc19aaefa20876216b035e961Brian Paul for (row = 0; row < height; row++) { 3227b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GLubyte *dst = _mesa_image_address( packing, dest, width, height, 3228b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GL_COLOR_INDEX, GL_BITMAP, 3229b7d076fc96ac27117421653a043d00a95f789d24Brian Paul 0, row, 0 ); 32307c652d77220610ecc19aaefa20876216b035e961Brian Paul if (!dst) 32317c652d77220610ecc19aaefa20876216b035e961Brian Paul return; 32327c652d77220610ecc19aaefa20876216b035e961Brian Paul 32337c652d77220610ecc19aaefa20876216b035e961Brian Paul if (packing->SkipPixels == 0) { 32347c652d77220610ecc19aaefa20876216b035e961Brian Paul MEMCPY( dst, src, width_in_bytes ); 32357c652d77220610ecc19aaefa20876216b035e961Brian Paul if (packing->LsbFirst) { 3236b7d076fc96ac27117421653a043d00a95f789d24Brian Paul flip_bytes( dst, width_in_bytes ); 32377c652d77220610ecc19aaefa20876216b035e961Brian Paul } 32387c652d77220610ecc19aaefa20876216b035e961Brian Paul } 32397c652d77220610ecc19aaefa20876216b035e961Brian Paul else { 32407c652d77220610ecc19aaefa20876216b035e961Brian Paul /* handling SkipPixels is a bit tricky (no pun intended!) */ 32417c652d77220610ecc19aaefa20876216b035e961Brian Paul GLint i; 32427c652d77220610ecc19aaefa20876216b035e961Brian Paul if (packing->LsbFirst) { 32437c652d77220610ecc19aaefa20876216b035e961Brian Paul GLubyte srcMask = 1 << (packing->SkipPixels & 0x7); 32447c652d77220610ecc19aaefa20876216b035e961Brian Paul GLubyte dstMask = 128; 32457c652d77220610ecc19aaefa20876216b035e961Brian Paul const GLubyte *s = src; 32467c652d77220610ecc19aaefa20876216b035e961Brian Paul GLubyte *d = dst; 32477c652d77220610ecc19aaefa20876216b035e961Brian Paul *d = 0; 32487c652d77220610ecc19aaefa20876216b035e961Brian Paul for (i = 0; i < width; i++) { 32497c652d77220610ecc19aaefa20876216b035e961Brian Paul if (*s & srcMask) { 32507c652d77220610ecc19aaefa20876216b035e961Brian Paul *d |= dstMask; 32517c652d77220610ecc19aaefa20876216b035e961Brian Paul } 32527c652d77220610ecc19aaefa20876216b035e961Brian Paul if (srcMask == 128) { 32537c652d77220610ecc19aaefa20876216b035e961Brian Paul srcMask = 1; 32547c652d77220610ecc19aaefa20876216b035e961Brian Paul s++; 32557c652d77220610ecc19aaefa20876216b035e961Brian Paul } 32567c652d77220610ecc19aaefa20876216b035e961Brian Paul else { 32577c652d77220610ecc19aaefa20876216b035e961Brian Paul srcMask = srcMask << 1; 32587c652d77220610ecc19aaefa20876216b035e961Brian Paul } 32597c652d77220610ecc19aaefa20876216b035e961Brian Paul if (dstMask == 1) { 32607c652d77220610ecc19aaefa20876216b035e961Brian Paul dstMask = 128; 32617c652d77220610ecc19aaefa20876216b035e961Brian Paul d++; 32627c652d77220610ecc19aaefa20876216b035e961Brian Paul *d = 0; 32637c652d77220610ecc19aaefa20876216b035e961Brian Paul } 32647c652d77220610ecc19aaefa20876216b035e961Brian Paul else { 32657c652d77220610ecc19aaefa20876216b035e961Brian Paul dstMask = dstMask >> 1; 32667c652d77220610ecc19aaefa20876216b035e961Brian Paul } 32677c652d77220610ecc19aaefa20876216b035e961Brian Paul } 32687c652d77220610ecc19aaefa20876216b035e961Brian Paul } 32697c652d77220610ecc19aaefa20876216b035e961Brian Paul else { 32707c652d77220610ecc19aaefa20876216b035e961Brian Paul GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7); 32717c652d77220610ecc19aaefa20876216b035e961Brian Paul GLubyte dstMask = 128; 32727c652d77220610ecc19aaefa20876216b035e961Brian Paul const GLubyte *s = src; 32737c652d77220610ecc19aaefa20876216b035e961Brian Paul GLubyte *d = dst; 32747c652d77220610ecc19aaefa20876216b035e961Brian Paul *d = 0; 32757c652d77220610ecc19aaefa20876216b035e961Brian Paul for (i = 0; i < width; i++) { 32767c652d77220610ecc19aaefa20876216b035e961Brian Paul if (*s & srcMask) { 32777c652d77220610ecc19aaefa20876216b035e961Brian Paul *d |= dstMask; 32787c652d77220610ecc19aaefa20876216b035e961Brian Paul } 32797c652d77220610ecc19aaefa20876216b035e961Brian Paul if (srcMask == 1) { 32807c652d77220610ecc19aaefa20876216b035e961Brian Paul srcMask = 128; 32817c652d77220610ecc19aaefa20876216b035e961Brian Paul s++; 32827c652d77220610ecc19aaefa20876216b035e961Brian Paul } 32837c652d77220610ecc19aaefa20876216b035e961Brian Paul else { 32847c652d77220610ecc19aaefa20876216b035e961Brian Paul srcMask = srcMask >> 1; 32857c652d77220610ecc19aaefa20876216b035e961Brian Paul } 32867c652d77220610ecc19aaefa20876216b035e961Brian Paul if (dstMask == 1) { 32877c652d77220610ecc19aaefa20876216b035e961Brian Paul dstMask = 128; 32887c652d77220610ecc19aaefa20876216b035e961Brian Paul d++; 32897c652d77220610ecc19aaefa20876216b035e961Brian Paul *d = 0; 32907c652d77220610ecc19aaefa20876216b035e961Brian Paul } 32917c652d77220610ecc19aaefa20876216b035e961Brian Paul else { 32927c652d77220610ecc19aaefa20876216b035e961Brian Paul dstMask = dstMask >> 1; 32937c652d77220610ecc19aaefa20876216b035e961Brian Paul } 32947c652d77220610ecc19aaefa20876216b035e961Brian Paul } 32957c652d77220610ecc19aaefa20876216b035e961Brian Paul } 32967c652d77220610ecc19aaefa20876216b035e961Brian Paul } 32977c652d77220610ecc19aaefa20876216b035e961Brian Paul src += width_in_bytes; 32987c652d77220610ecc19aaefa20876216b035e961Brian Paul } 32997c652d77220610ecc19aaefa20876216b035e961Brian Paul} 3300