image.c revision 250069dbb443f26f4dcc409c9c873019a5f50f9d
1250069dbb443f26f4dcc409c9c873019a5f50f9dBrian Paul/* $Id: image.c,v 1.25 2000/04/08 18:57:45 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" 34afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "macros.h" 35fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul#include "mem.h" 36afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "mmath.h" 37afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "pixel.h" 38afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "types.h" 39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#endif 40afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 41afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 42afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 43afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 44fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * These are the image packing parameters for Mesa's internal images. 45fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * That is, _mesa_unpack_image() returns image data in this format. 46fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * When we execute image commands (glDrawPixels, glTexImage, etc) 47fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * from within display lists we have to be sure to set the current 48fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * unpacking params to these values! 49fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */ 50279d9e3ea7551332d5639b514e004ee66c37d08bBrian Paulconst struct gl_pixelstore_attrib _mesa_native_packing = { 51fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 1, /* Alignment */ 52fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 0, /* RowLength */ 53fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 0, /* SkipPixels */ 54fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 0, /* SkipRows */ 55fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 0, /* ImageHeight */ 56fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 0, /* SkipImages */ 57fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GL_FALSE, /* SwapBytes */ 58fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GL_FALSE /* LsbFirst */ 59fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul}; 60fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 61fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 62fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 63fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul/* 64afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the 8 bits in each byte of the given array. 65afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 66b7d076fc96ac27117421653a043d00a95f789d24Brian Paulstatic void 67b7d076fc96ac27117421653a043d00a95f789d24Brian Paulflip_bytes( GLubyte *p, GLuint n ) 68afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 69afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach register GLuint i, a, b; 70afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 71afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 72afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach b = (GLuint) p[i]; 73afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach a = ((b & 0x01) << 7) | 74afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x02) << 5) | 75afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x04) << 3) | 76afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x08) << 1) | 77afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x10) >> 1) | 78afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x20) >> 3) | 79afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x40) >> 5) | 80afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x80) >> 7); 81afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach p[i] = (GLubyte) a; 82afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 83afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 84afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 86afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 87afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the order of the 2 bytes in each word in the given array. 88afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 89b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid 90b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_swap2( GLushort *p, GLuint n ) 91afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 92afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach register GLuint i; 93afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 94afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 95afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach p[i] = (p[i] >> 8) | ((p[i] << 8) & 0xff00); 96afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 97afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 98afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 99afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the order of the 4 bytes in each word in the given array. 103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 104b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid 105b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_swap4( GLuint *p, GLuint n ) 106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach register GLuint i, a, b; 108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach b = p[i]; 111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach a = (b >> 24) 112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | ((b >> 8) & 0xff00) 113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | ((b << 8) & 0xff0000) 114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | ((b << 24) & 0xff000000); 115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach p[i] = a; 116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 121afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return the size, in bytes, of the given GL datatype. 124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return 0 if GL_BITMAP. 125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return -1 if invalid type enum. 126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 127b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_sizeof_type( GLenum type ) 128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BITMAP: 131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 0; 132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLbyte); 136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLushort); 138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLint); 144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLfloat); 146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 153b7d076fc96ac27117421653a043d00a95f789d24Brian Paul * Same as _mesa_sizeof_packed_type() but we also accept the 154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * packed pixel format datatypes. 155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 156b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_sizeof_packed_type( GLenum type ) 157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BITMAP: 160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 0; 161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLbyte); 165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLushort); 167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLint); 173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLfloat); 175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_3_3_2: 176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_2_3_3_REV: 178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5: 180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5_REV: 182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4: 184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4_REV: 186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_5_5_1: 188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_1_5_5_5_REV: 190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8: 192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8_REV: 194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_10_10_10_2: 196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_2_10_10_10_REV: 198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return the number of components in a GL enum pixel type. 208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return -1 if bad format. 209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 210b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_components_in_format( GLenum format ) 211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (format) { 213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX: 214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX1_EXT: 215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX2_EXT: 216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX4_EXT: 217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX8_EXT: 218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX12_EXT: 219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX16_EXT: 220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_STENCIL_INDEX: 221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_DEPTH_COMPONENT: 222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_GREEN: 224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BLUE: 225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ALPHA: 226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE: 227070b2644c6d3b0b4c6da64addd85245d730b6240Brian Paul case GL_INTENSITY: 228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 1; 229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE_ALPHA: 230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 2; 231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 3; 233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGBA: 234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 4; 235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGR: 236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 3; 237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGRA: 238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 4; 239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ABGR_EXT: 240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 4; 241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return bytes per pixel for given format and type 249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return -1 if bad format or type. 250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 251b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_bytes_per_pixel( GLenum format, GLenum type ) 252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 253b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GLint comps = _mesa_components_in_format( format ); 254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (comps < 0) 255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BITMAP: 259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 0; /* special case */ 260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return comps * sizeof(GLubyte); 263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return comps * sizeof(GLshort); 266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return comps * sizeof(GLint); 269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return comps * sizeof(GLfloat); 271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_3_3_2: 272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_2_3_3_REV: 273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB || format == GL_BGR) 274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else 276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; /* error */ 277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5: 278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5_REV: 279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB || format == GL_BGR) 280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else 282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; /* error */ 283afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4: 284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4_REV: 285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_5_5_1: 286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_1_5_5_5_REV: 287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT) 288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLushort); 289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else 290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8: 292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8_REV: 293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_10_10_10_2: 294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_2_10_10_10_REV: 295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT) 296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else 298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 303afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Test if the given pixel format and type are legal. 307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return GL_TRUE for legal, GL_FALSE for illegal. 308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 309b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLboolean 310b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_is_legal_format_and_type( GLenum format, GLenum type ) 311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (format) { 313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX: 314afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_STENCIL_INDEX: 315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 316afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BITMAP: 317afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 320afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_TRUE; 325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_GREEN: 330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BLUE: 331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ALPHA: 332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE: 333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE_ALPHA: 334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_DEPTH_COMPONENT: 335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGR: 336afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_TRUE; 345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_3_3_2: 358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_2_3_3_REV: 359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5: 360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5_REV: 361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_TRUE; 362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGBA: 366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGRA: 367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ABGR_EXT: 368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4: 377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4_REV: 378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_5_5_1: 379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_1_5_5_5_REV: 380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8: 381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8_REV: 382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_10_10_10_2: 383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_2_10_10_10_REV: 384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_TRUE; 385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ; /* fall-through */ 390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 394afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return the address of a pixel in an image (actually a volume). 398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Pixel unpacking/packing parameters are observed according to 'packing'. 399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Input: image - start of image data 400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * width, height - size of image 401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * format - image format 402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * type - pixel component type 403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * packing - the pixelstore attributes 404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * img - which image in the volume (0 for 1D or 2D images) 405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * row, column - location of pixel in the image 406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return: address of pixel at (image,row,column) in image or NULL if error. 407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 408b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLvoid * 409b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_image_address( const struct gl_pixelstore_attrib *packing, 410b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const GLvoid *image, GLsizei width, 411b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GLsizei height, GLenum format, GLenum type, 412b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GLint img, GLint row, GLint column ) 413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint alignment; /* 1, 2 or 4 */ 415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint pixels_per_row; 416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint rows_per_image; 417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint skiprows; 418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint skippixels; 419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint skipimages; /* for 3-D volume images */ 420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte *pixel_addr; 421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach alignment = packing->Alignment; 423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->RowLength > 0) { 424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach pixels_per_row = packing->RowLength; 425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach pixels_per_row = width; 428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->ImageHeight > 0) { 430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach rows_per_image = packing->ImageHeight; 431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach rows_per_image = height; 434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach skiprows = packing->SkipRows; 436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach skippixels = packing->SkipPixels; 437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach skipimages = packing->SkipImages; 438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (type==GL_BITMAP) { 440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* BITMAP data */ 441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint comp_per_pixel; /* components per pixel */ 442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint bytes_per_comp; /* bytes per component */ 443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint bytes_per_row; 444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint bytes_per_image; 445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* Compute bytes per component */ 447b7d076fc96ac27117421653a043d00a95f789d24Brian Paul bytes_per_comp = _mesa_sizeof_packed_type( type ); 448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (bytes_per_comp<0) { 449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return NULL; 450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 451afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* Compute number of components per pixel */ 453b7d076fc96ac27117421653a043d00a95f789d24Brian Paul comp_per_pixel = _mesa_components_in_format( format ); 454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (comp_per_pixel<0 && type != GL_BITMAP) { 455afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return NULL; 456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_row = alignment 459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * CEILING( comp_per_pixel*pixels_per_row, 8*alignment ); 460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_image = bytes_per_row * rows_per_image; 462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach pixel_addr = (GLubyte *) image 464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skipimages + img) * bytes_per_image 465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skiprows + row) * bytes_per_row 466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skippixels + column) / 8; 467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* Non-BITMAP data */ 470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint bytes_per_pixel, bytes_per_row, remainder, bytes_per_image; 471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 472b7d076fc96ac27117421653a043d00a95f789d24Brian Paul bytes_per_pixel = _mesa_bytes_per_pixel( format, type ); 473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* The pixel type and format should have been error checked earlier */ 475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach assert(bytes_per_pixel > 0); 476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_row = pixels_per_row * bytes_per_pixel; 478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach remainder = bytes_per_row % alignment; 479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (remainder > 0) 480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_row += (alignment - remainder); 481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ASSERT(bytes_per_row % alignment == 0); 483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_image = bytes_per_row * rows_per_image; 485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* compute final pixel address */ 487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach pixel_addr = (GLubyte *) image 488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skipimages + img) * bytes_per_image 489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skiprows + row) * bytes_per_row 490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skippixels + column) * bytes_per_pixel; 491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return (GLvoid *) pixel_addr; 494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 499ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul * Compute the stride between image rows (in bytes) for the given 500ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul * pixel packing parameters and image width, format and type. 501ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul */ 502ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian PaulGLint 503ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul_mesa_image_row_stride( const struct gl_pixelstore_attrib *packing, 504ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul GLint width, GLenum format, GLenum type ) 505ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul{ 506ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul ASSERT(packing); 507ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul if (type == GL_BITMAP) { 508ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul /* BITMAP data */ 509ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul if (packing->RowLength == 0) { 510ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul GLint bytes = (width + 7) / 8; 511ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul return bytes; 512ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 513ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul else { 514ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul GLint bytes = (packing->RowLength + 7) / 8; 515ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul return bytes; 516ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 517ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 518ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul else { 519ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul /* Non-BITMAP data */ 520b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type); 521ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul if (bytesPerPixel <= 0) 522ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul return -1; /* error */ 523ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul if (packing->RowLength == 0) { 524ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul GLint bytes = bytesPerPixel * width; 525ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul return bytes; 526ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 527ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul else { 528ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul GLint bytes = bytesPerPixel * packing->RowLength; 529ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul return bytes; 530ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 531ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 532ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul} 533ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul 534ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul 535ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul 536ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul/* 537afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Unpack a 32x32 pixel polygon stipple from user memory using the 538afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * current pixel unpack settings. 539afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 5407c652d77220610ecc19aaefa20876216b035e961Brian Paulvoid 5417c652d77220610ecc19aaefa20876216b035e961Brian Paul_mesa_unpack_polygon_stipple( const GLubyte *pattern, GLuint dest[32], 5427c652d77220610ecc19aaefa20876216b035e961Brian Paul const struct gl_pixelstore_attrib *unpacking ) 543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 544959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul GLubyte *ptrn = (GLubyte *) _mesa_unpack_bitmap( 32, 32, pattern, unpacking ); 5457c652d77220610ecc19aaefa20876216b035e961Brian Paul if (ptrn) { 5467c652d77220610ecc19aaefa20876216b035e961Brian Paul /* Convert pattern from GLubytes to GLuints and handle big/little 5477c652d77220610ecc19aaefa20876216b035e961Brian Paul * endian differences 5487c652d77220610ecc19aaefa20876216b035e961Brian Paul */ 5497c652d77220610ecc19aaefa20876216b035e961Brian Paul GLubyte *p = ptrn; 5507c652d77220610ecc19aaefa20876216b035e961Brian Paul GLint i; 5517c652d77220610ecc19aaefa20876216b035e961Brian Paul for (i = 0; i < 32; i++) { 5527c652d77220610ecc19aaefa20876216b035e961Brian Paul dest[i] = (p[0] << 24) 5537c652d77220610ecc19aaefa20876216b035e961Brian Paul | (p[1] << 16) 5547c652d77220610ecc19aaefa20876216b035e961Brian Paul | (p[2] << 8) 5557c652d77220610ecc19aaefa20876216b035e961Brian Paul | (p[3] ); 5567c652d77220610ecc19aaefa20876216b035e961Brian Paul p += 4; 5577c652d77220610ecc19aaefa20876216b035e961Brian Paul } 5587c652d77220610ecc19aaefa20876216b035e961Brian Paul FREE(ptrn); 559afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 560afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 561afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 562afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 563fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 565fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Pack polygon stipple into user memory given current pixel packing 566fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * settings. 567afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 5687c652d77220610ecc19aaefa20876216b035e961Brian Paulvoid 5697c652d77220610ecc19aaefa20876216b035e961Brian Paul_mesa_pack_polygon_stipple( const GLuint pattern[32], GLubyte *dest, 5707c652d77220610ecc19aaefa20876216b035e961Brian Paul const struct gl_pixelstore_attrib *packing ) 571afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 5727c652d77220610ecc19aaefa20876216b035e961Brian Paul /* Convert pattern from GLuints to GLubytes to handle big/little 5737c652d77220610ecc19aaefa20876216b035e961Brian Paul * endian differences. 5747c652d77220610ecc19aaefa20876216b035e961Brian Paul */ 5757c652d77220610ecc19aaefa20876216b035e961Brian Paul GLubyte ptrn[32*4]; 576fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint i; 577fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < 32; i++) { 5787c652d77220610ecc19aaefa20876216b035e961Brian Paul ptrn[i * 4 + 0] = (GLubyte) ((pattern[i] >> 24) & 0xff); 5797c652d77220610ecc19aaefa20876216b035e961Brian Paul ptrn[i * 4 + 1] = (GLubyte) ((pattern[i] >> 16) & 0xff); 5807c652d77220610ecc19aaefa20876216b035e961Brian Paul ptrn[i * 4 + 2] = (GLubyte) ((pattern[i] >> 8 ) & 0xff); 5817c652d77220610ecc19aaefa20876216b035e961Brian Paul ptrn[i * 4 + 3] = (GLubyte) ((pattern[i] ) & 0xff); 582afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 5837c652d77220610ecc19aaefa20876216b035e961Brian Paul 5847c652d77220610ecc19aaefa20876216b035e961Brian Paul _mesa_pack_bitmap(32, 32, ptrn, dest, packing); 585afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 586afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 587afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 588afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 589afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 590afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Pack the given RGBA span into client memory at 'dest' address 591afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * in the given pixel format and type. 592afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Optionally apply the enabled pixel transfer ops. 593afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Pack into memory using the given packing params struct. 594afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * This is used by glReadPixels and glGetTexImage?D() 595afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Input: ctx - the context 596afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * n - number of pixels in the span 597afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * rgba - the pixels 598afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * format - dest packing format 599afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * type - dest packing datatype 600afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * destination - destination packing address 601afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * packing - pixel packing parameters 602afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * applyTransferOps - apply scale/bias/lookup-table ops? 603afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 604b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid 605b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_pack_rgba_span( const GLcontext *ctx, 606b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GLuint n, CONST GLubyte rgba[][4], 607b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GLenum format, GLenum type, GLvoid *destination, 608b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const struct gl_pixelstore_attrib *packing, 609b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GLboolean applyTransferOps ) 610afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 611fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul applyTransferOps &= (ctx->Pixel.ScaleOrBiasRGBA || ctx->Pixel.MapColorFlag); 612fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 613afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* Test for optimized case first */ 614fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (!applyTransferOps && format == GL_RGBA && type == GL_UNSIGNED_BYTE) { 6153428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul /* common simple case */ 616afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach MEMCPY( destination, rgba, n * 4 * sizeof(GLubyte) ); 617afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 618fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul else if (!applyTransferOps && format == GL_RGB && type == GL_UNSIGNED_BYTE) { 6193428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul /* common simple case */ 6203428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul GLint i; 6213428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul GLubyte *dest = (GLubyte *) destination; 6223428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul for (i = 0; i < n; i++) { 62398b607b57da6f7d2ae6e02906c1ae72cd1c3f311Brian Paul dest[0] = rgba[i][RCOMP]; 62498b607b57da6f7d2ae6e02906c1ae72cd1c3f311Brian Paul dest[1] = rgba[i][GCOMP]; 62598b607b57da6f7d2ae6e02906c1ae72cd1c3f311Brian Paul dest[2] = rgba[i][BCOMP]; 6263428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul dest += 3; 6273428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul } 6283428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul } 629afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 630fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* general solution */ 631afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLfloat red[MAX_WIDTH], green[MAX_WIDTH], blue[MAX_WIDTH]; 632afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLfloat alpha[MAX_WIDTH], luminance[MAX_WIDTH]; 63364b7da799fe82f566706f8b6771b9d12477e4373Brian Paul const GLfloat rscale = 1.0F / 255.0F; 63464b7da799fe82f566706f8b6771b9d12477e4373Brian Paul const GLfloat gscale = 1.0F / 255.0F; 63564b7da799fe82f566706f8b6771b9d12477e4373Brian Paul const GLfloat bscale = 1.0F / 255.0F; 63664b7da799fe82f566706f8b6771b9d12477e4373Brian Paul const GLfloat ascale = 1.0F / 255.0F; 637b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const GLint comps = _mesa_components_in_format(format); 638afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint i; 639afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 64098b607b57da6f7d2ae6e02906c1ae72cd1c3f311Brian Paul assert(n <= MAX_WIDTH); 641afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 642afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* convert color components to floating point */ 643afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 644afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach red[i] = rgba[i][RCOMP] * rscale; 645afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach green[i] = rgba[i][GCOMP] * gscale; 646afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach blue[i] = rgba[i][BCOMP] * bscale; 647afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach alpha[i] = rgba[i][ACOMP] * ascale; 648afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 649afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 650afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* 651afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Apply scale, bias and lookup-tables if enabled. 652afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 653afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (applyTransferOps) { 654afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (ctx->Pixel.ScaleOrBiasRGBA) { 655afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach gl_scale_and_bias_color( ctx, n, red, green, blue, alpha ); 656afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 657afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (ctx->Pixel.MapColorFlag) { 658afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach gl_map_color( ctx, n, red, green, blue, alpha ); 659afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 660afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 661afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 662afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format==GL_LUMINANCE || format==GL_LUMINANCE_ALPHA) { 663afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 664afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLfloat sum = red[i] + green[i] + blue[i]; 665afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach luminance[i] = CLAMP( sum, 0.0F, 1.0F ); 666afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 667afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 668afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 669afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* 670afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Pack/store the pixels. Ugh! Lots of cases!!! 671afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 672afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 673afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 674afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach { 675afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte *dst = (GLubyte *) destination; 676afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (format) { 677afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 678afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 679afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_UBYTE(red[i]); 680afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 681afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_GREEN: 682afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 683afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_UBYTE(green[i]); 684afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 685afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BLUE: 686afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 687afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_UBYTE(blue[i]); 688afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 689afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ALPHA: 690afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 691afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_UBYTE(alpha[i]); 692afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 693afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE: 694afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 695afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_UBYTE(luminance[i]); 696afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 697afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE_ALPHA: 698afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 699afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*2+0] = FLOAT_TO_UBYTE(luminance[i]); 700afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*2+1] = FLOAT_TO_UBYTE(alpha[i]); 701afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 702afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 703afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 704afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 705afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+0] = FLOAT_TO_UBYTE(red[i]); 706afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+1] = FLOAT_TO_UBYTE(green[i]); 707afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+2] = FLOAT_TO_UBYTE(blue[i]); 708afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 709afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 710afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGBA: 711afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 712afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = FLOAT_TO_UBYTE(red[i]); 713afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = FLOAT_TO_UBYTE(green[i]); 714afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = FLOAT_TO_UBYTE(blue[i]); 715afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = FLOAT_TO_UBYTE(alpha[i]); 716afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 717afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 718afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGR: 719afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 720afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+0] = FLOAT_TO_UBYTE(blue[i]); 721afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+1] = FLOAT_TO_UBYTE(green[i]); 722afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+2] = FLOAT_TO_UBYTE(red[i]); 723afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 724afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 725afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGRA: 726afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 727afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = FLOAT_TO_UBYTE(blue[i]); 728afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = FLOAT_TO_UBYTE(green[i]); 729afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = FLOAT_TO_UBYTE(red[i]); 730afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = FLOAT_TO_UBYTE(alpha[i]); 731afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 732afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 733afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ABGR_EXT: 734afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 735afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = FLOAT_TO_UBYTE(alpha[i]); 736afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = FLOAT_TO_UBYTE(blue[i]); 737afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = FLOAT_TO_UBYTE(green[i]); 738afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = FLOAT_TO_UBYTE(red[i]); 739afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 740afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 741afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 742b7d076fc96ac27117421653a043d00a95f789d24Brian Paul gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 743afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 744afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 745afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 746afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 747afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach { 748afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLbyte *dst = (GLbyte *) destination; 749afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (format) { 750afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 751afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 752afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_BYTE(red[i]); 753afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 754afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_GREEN: 755afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 756afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_BYTE(green[i]); 757afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 758afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BLUE: 759afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 760afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_BYTE(blue[i]); 761afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 762afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ALPHA: 763afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 764afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_BYTE(alpha[i]); 765afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 766afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE: 767afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 768afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_BYTE(luminance[i]); 769afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 770afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE_ALPHA: 771afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 772afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*2+0] = FLOAT_TO_BYTE(luminance[i]); 773afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*2+1] = FLOAT_TO_BYTE(alpha[i]); 774afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 775afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 776afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 777afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 778afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+0] = FLOAT_TO_BYTE(red[i]); 779afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+1] = FLOAT_TO_BYTE(green[i]); 780afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+2] = FLOAT_TO_BYTE(blue[i]); 781afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 782afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 783afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGBA: 784afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 785afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = FLOAT_TO_BYTE(red[i]); 786afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = FLOAT_TO_BYTE(green[i]); 787afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = FLOAT_TO_BYTE(blue[i]); 788afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = FLOAT_TO_BYTE(alpha[i]); 789afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 790afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 791afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGR: 792afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 793afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+0] = FLOAT_TO_BYTE(blue[i]); 794afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+1] = FLOAT_TO_BYTE(green[i]); 795afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+2] = FLOAT_TO_BYTE(red[i]); 796afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 797afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 798afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGRA: 799afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 800afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = FLOAT_TO_BYTE(blue[i]); 801afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = FLOAT_TO_BYTE(green[i]); 802afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = FLOAT_TO_BYTE(red[i]); 803afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = FLOAT_TO_BYTE(alpha[i]); 804afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 805afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ABGR_EXT: 806afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 807afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = FLOAT_TO_BYTE(alpha[i]); 808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = FLOAT_TO_BYTE(blue[i]); 809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = FLOAT_TO_BYTE(green[i]); 810afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = FLOAT_TO_BYTE(red[i]); 811afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 812afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 813afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 814b7d076fc96ac27117421653a043d00a95f789d24Brian Paul gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 815afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 816afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 817afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 818afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 819afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach { 820afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLushort *dst = (GLushort *) destination; 821afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (format) { 822afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 823afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 824afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_USHORT(red[i]); 825afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 826afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_GREEN: 827afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 828afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_USHORT(green[i]); 829afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 830afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BLUE: 831afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 832afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_USHORT(blue[i]); 833afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 834afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ALPHA: 835afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 836afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_USHORT(alpha[i]); 837afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 838afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE: 839afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 840afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_USHORT(luminance[i]); 841afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 842afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE_ALPHA: 843afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 844afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*2+0] = FLOAT_TO_USHORT(luminance[i]); 845afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*2+1] = FLOAT_TO_USHORT(alpha[i]); 846afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 847afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 848afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 849afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 850afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+0] = FLOAT_TO_USHORT(red[i]); 851afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+1] = FLOAT_TO_USHORT(green[i]); 852afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+2] = FLOAT_TO_USHORT(blue[i]); 853afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 854afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 855afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGBA: 856afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 857afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = FLOAT_TO_USHORT(red[i]); 858afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = FLOAT_TO_USHORT(green[i]); 859afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = FLOAT_TO_USHORT(blue[i]); 860afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = FLOAT_TO_USHORT(alpha[i]); 861afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 862afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 863afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGR: 864afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 865afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+0] = FLOAT_TO_USHORT(blue[i]); 866afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+1] = FLOAT_TO_USHORT(green[i]); 867afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+2] = FLOAT_TO_USHORT(red[i]); 868afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 869afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 870afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGRA: 871afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 872afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = FLOAT_TO_USHORT(blue[i]); 873afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = FLOAT_TO_USHORT(green[i]); 874afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = FLOAT_TO_USHORT(red[i]); 875afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = FLOAT_TO_USHORT(alpha[i]); 876afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 877afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 878afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ABGR_EXT: 879afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 880afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = FLOAT_TO_USHORT(alpha[i]); 881afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = FLOAT_TO_USHORT(blue[i]); 882afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = FLOAT_TO_USHORT(green[i]); 883afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = FLOAT_TO_USHORT(red[i]); 884afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 885afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 886afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 887b7d076fc96ac27117421653a043d00a95f789d24Brian Paul gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 889afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->SwapBytes) { 890b7d076fc96ac27117421653a043d00a95f789d24Brian Paul _mesa_swap2( (GLushort *) dst, n * comps); 891afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 892afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 893afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 894afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 895afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach { 896afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLshort *dst = (GLshort *) destination; 897afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (format) { 898afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 899afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 900afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_SHORT(red[i]); 901afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 902afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_GREEN: 903afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 904afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_SHORT(green[i]); 905afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 906afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BLUE: 907afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 908afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_SHORT(blue[i]); 909afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 910afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ALPHA: 911afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 912afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_SHORT(alpha[i]); 913afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 914afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE: 915afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 916afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_SHORT(luminance[i]); 917afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 918afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE_ALPHA: 919afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 920afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*2+0] = FLOAT_TO_SHORT(luminance[i]); 921afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*2+1] = FLOAT_TO_SHORT(alpha[i]); 922afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 923afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 924afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 925afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 926afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+0] = FLOAT_TO_SHORT(red[i]); 927afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+1] = FLOAT_TO_SHORT(green[i]); 928afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+2] = FLOAT_TO_SHORT(blue[i]); 929afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 930afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 931afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGBA: 932afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 933afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = FLOAT_TO_SHORT(red[i]); 934afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = FLOAT_TO_SHORT(green[i]); 935afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = FLOAT_TO_SHORT(blue[i]); 936afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = FLOAT_TO_SHORT(alpha[i]); 937afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 938afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 939afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGR: 940afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 941afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+0] = FLOAT_TO_SHORT(blue[i]); 942afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+1] = FLOAT_TO_SHORT(green[i]); 943afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+2] = FLOAT_TO_SHORT(red[i]); 944afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 945afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 946afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGRA: 947afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 948afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = FLOAT_TO_SHORT(blue[i]); 949afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = FLOAT_TO_SHORT(green[i]); 950afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = FLOAT_TO_SHORT(red[i]); 951afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = FLOAT_TO_SHORT(alpha[i]); 952afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 953afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ABGR_EXT: 954afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 955afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = FLOAT_TO_SHORT(alpha[i]); 956afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = FLOAT_TO_SHORT(blue[i]); 957afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = FLOAT_TO_SHORT(green[i]); 958afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = FLOAT_TO_SHORT(red[i]); 959afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 960afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 961afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 962b7d076fc96ac27117421653a043d00a95f789d24Brian Paul gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 963afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 964afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->SwapBytes) { 965b7d076fc96ac27117421653a043d00a95f789d24Brian Paul _mesa_swap2( (GLushort *) dst, n * comps ); 966afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 967afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 968afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 969afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 970afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach { 971afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 972afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (format) { 973afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 974afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 975afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_UINT(red[i]); 976afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 977afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_GREEN: 978afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 979afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_UINT(green[i]); 980afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 981afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BLUE: 982afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 983afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_UINT(blue[i]); 984afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 985afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ALPHA: 986afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 987afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_UINT(alpha[i]); 988afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 989afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE: 990afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 991afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_UINT(luminance[i]); 992afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 993afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE_ALPHA: 994afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 995afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*2+0] = FLOAT_TO_UINT(luminance[i]); 996afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*2+1] = FLOAT_TO_UINT(alpha[i]); 997afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 998afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 999afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 1000afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1001afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+0] = FLOAT_TO_UINT(red[i]); 1002afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+1] = FLOAT_TO_UINT(green[i]); 1003afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+2] = FLOAT_TO_UINT(blue[i]); 1004afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1005afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1006afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGBA: 1007afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1008afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = FLOAT_TO_UINT(red[i]); 1009afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = FLOAT_TO_UINT(green[i]); 1010afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = FLOAT_TO_UINT(blue[i]); 1011afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = FLOAT_TO_UINT(alpha[i]); 1012afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1013afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1014afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGR: 1015afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1016afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+0] = FLOAT_TO_UINT(blue[i]); 1017afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+1] = FLOAT_TO_UINT(green[i]); 1018afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+2] = FLOAT_TO_UINT(red[i]); 1019afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1020afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1021afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGRA: 1022afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1023afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = FLOAT_TO_UINT(blue[i]); 1024afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = FLOAT_TO_UINT(green[i]); 1025afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = FLOAT_TO_UINT(red[i]); 1026afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = FLOAT_TO_UINT(alpha[i]); 1027afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1028afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1029afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ABGR_EXT: 1030afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1031afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = FLOAT_TO_UINT(alpha[i]); 1032afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = FLOAT_TO_UINT(blue[i]); 1033afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = FLOAT_TO_UINT(green[i]); 1034afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = FLOAT_TO_UINT(red[i]); 1035afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1036afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1037afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 1038b7d076fc96ac27117421653a043d00a95f789d24Brian Paul gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1039afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1040afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->SwapBytes) { 1041b7d076fc96ac27117421653a043d00a95f789d24Brian Paul _mesa_swap4( (GLuint *) dst, n * comps ); 1042afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1043afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1044afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1045afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 1046afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach { 1047afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint *dst = (GLint *) destination; 1048afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (format) { 1049afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 1050afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1051afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_INT(red[i]); 1052afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1053afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_GREEN: 1054afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1055afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_INT(green[i]); 1056afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1057afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BLUE: 1058afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1059afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_INT(blue[i]); 1060afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1061afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ALPHA: 1062afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1063afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_INT(alpha[i]); 1064afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1065afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE: 1066afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1067afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_INT(luminance[i]); 1068afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1069afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE_ALPHA: 1070afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1071afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*2+0] = FLOAT_TO_INT(luminance[i]); 1072afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*2+1] = FLOAT_TO_INT(alpha[i]); 1073afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1074afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1075afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 1076afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1077afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+0] = FLOAT_TO_INT(red[i]); 1078afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+1] = FLOAT_TO_INT(green[i]); 1079afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+2] = FLOAT_TO_INT(blue[i]); 1080afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1081afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1082afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGBA: 1083afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1084afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = FLOAT_TO_INT(red[i]); 1085afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = FLOAT_TO_INT(green[i]); 1086afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = FLOAT_TO_INT(blue[i]); 1087afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = FLOAT_TO_INT(alpha[i]); 1088afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1089afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1090afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGR: 1091afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1092afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+0] = FLOAT_TO_INT(blue[i]); 1093afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+1] = FLOAT_TO_INT(green[i]); 1094afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+2] = FLOAT_TO_INT(red[i]); 1095afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1096afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1097afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGRA: 1098afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1099afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = FLOAT_TO_INT(blue[i]); 1100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = FLOAT_TO_INT(green[i]); 1101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = FLOAT_TO_INT(red[i]); 1102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = FLOAT_TO_INT(alpha[i]); 1103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ABGR_EXT: 1106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = FLOAT_TO_INT(alpha[i]); 1108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = FLOAT_TO_INT(blue[i]); 1109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = FLOAT_TO_INT(green[i]); 1110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = FLOAT_TO_INT(red[i]); 1111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 1114b7d076fc96ac27117421653a043d00a95f789d24Brian Paul gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->SwapBytes) { 1117b7d076fc96ac27117421653a043d00a95f789d24Brian Paul _mesa_swap4( (GLuint *) dst, n * comps ); 1118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1121afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 1122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach { 1123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLfloat *dst = (GLfloat *) destination; 1124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (format) { 1125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 1126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = red[i]; 1128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_GREEN: 1130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = green[i]; 1132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BLUE: 1134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = blue[i]; 1136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ALPHA: 1138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = alpha[i]; 1140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE: 1142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = luminance[i]; 1144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE_ALPHA: 1146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*2+0] = luminance[i]; 1148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*2+1] = alpha[i]; 1149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 1152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+0] = red[i]; 1154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+1] = green[i]; 1155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+2] = blue[i]; 1156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGBA: 1159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = red[i]; 1161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = green[i]; 1162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = blue[i]; 1163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = alpha[i]; 1164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGR: 1167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+0] = blue[i]; 1169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+1] = green[i]; 1170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+2] = red[i]; 1171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGRA: 1174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = blue[i]; 1176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = green[i]; 1177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = red[i]; 1178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = alpha[i]; 1179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ABGR_EXT: 1182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = alpha[i]; 1184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = blue[i]; 1185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = green[i]; 1186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = red[i]; 1187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 1190b7d076fc96ac27117421653a043d00a95f789d24Brian Paul gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->SwapBytes) { 1193b7d076fc96ac27117421653a043d00a95f789d24Brian Paul _mesa_swap4( (GLuint *) dst, n * comps ); 1194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_3_3_2: 1198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB) { 1199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte *dst = (GLubyte *) destination; 1200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLint) (red[i] * 7.0F)) << 5) 1202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (green[i] * 7.0F)) << 2) 1203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (blue[i] * 3.0F)) ); 1204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_2_3_3_REV: 1208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB) { 1209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte *dst = (GLubyte *) destination; 1210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLint) (red[i] * 7.0F)) ) 1212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (green[i] * 7.0F)) << 3) 1213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (blue[i] * 3.0F)) << 5); 1214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5: 1218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB) { 1219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLushort *dst = (GLushort *) destination; 1220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLint) (red[i] * 31.0F)) << 11) 1222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (green[i] * 63.0F)) << 5) 1223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (blue[i] * 31.0F)) ); 1224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5_REV: 1228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB) { 1229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLushort *dst = (GLushort *) destination; 1230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLint) (red[i] * 31.0F)) ) 1232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (green[i] * 63.0F)) << 5) 1233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (blue[i] * 31.0F)) << 11); 1234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4: 1238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB) { 1239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLushort *dst = (GLushort *) destination; 1240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLint) (red[i] * 15.0F)) << 12) 1242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (green[i] * 15.0F)) << 8) 1243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (blue[i] * 15.0F)) << 4) 1244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (alpha[i] * 15.0F)) ); 1245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4_REV: 1249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB) { 1250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLushort *dst = (GLushort *) destination; 1251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLint) (red[i] * 15.0F)) ) 1253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (green[i] * 15.0F)) << 4) 1254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (blue[i] * 15.0F)) << 8) 1255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (alpha[i] * 15.0F)) << 12); 1256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_5_5_1: 1260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB) { 1261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLushort *dst = (GLushort *) destination; 1262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLint) (red[i] * 31.0F)) << 11) 1264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (green[i] * 31.0F)) << 6) 1265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (blue[i] * 31.0F)) << 1) 1266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (alpha[i] * 1.0F)) ); 1267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_1_5_5_5_REV: 1271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB) { 1272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLushort *dst = (GLushort *) destination; 1273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLint) (red[i] * 31.0F)) ) 1275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (green[i] * 31.0F)) << 5) 1276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (blue[i] * 31.0F)) << 10) 1277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (alpha[i] * 1.0F)) << 15); 1278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8: 1282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGBA) { 1283afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 1284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLuint) (red[i] * 255.0F)) << 24) 1286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (green[i] * 255.0F)) << 16) 1287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (blue[i] * 255.0F)) << 8) 1288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (alpha[i] * 255.0F)) ); 1289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (format == GL_BGRA) { 1292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 1293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLuint) (blue[i] * 255.0F)) << 24) 1295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (green[i] * 255.0F)) << 16) 1296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (red[i] * 255.0F)) << 8) 1297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (alpha[i] * 255.0F)) ); 1298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (format == GL_ABGR_EXT) { 1301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 1302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1303afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLuint) (alpha[i] * 255.0F)) << 24) 1304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (blue[i] * 255.0F)) << 16) 1305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (green[i] * 255.0F)) << 8) 1306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (red[i] * 255.0F)) ); 1307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8_REV: 1311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGBA) { 1312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 1313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1314afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLuint) (red[i] * 255.0F)) ) 1315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (green[i] * 255.0F)) << 8) 1316afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (blue[i] * 255.0F)) << 16) 1317afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (alpha[i] * 255.0F)) << 24); 1318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1320afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (format == GL_BGRA) { 1321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 1322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLuint) (blue[i] * 255.0F)) ) 1324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (green[i] * 255.0F)) << 8) 1325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (red[i] * 255.0F)) << 16) 1326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (alpha[i] * 255.0F)) << 24); 1327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (format == GL_ABGR_EXT) { 1330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 1331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLuint) (alpha[i] * 255.0F)) ) 1333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (blue[i] * 255.0F)) << 8) 1334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (green[i] * 255.0F)) << 16) 1335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (red[i] * 255.0F)) << 24); 1336afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_10_10_10_2: 1340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGBA) { 1341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 1342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLuint) (red[i] * 1023.0F)) << 22) 1344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (green[i] * 1023.0F)) << 12) 1345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (blue[i] * 1023.0F)) << 2) 1346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (alpha[i] * 3.0F)) ); 1347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (format == GL_BGRA) { 1350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 1351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLuint) (blue[i] * 1023.0F)) << 22) 1353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (green[i] * 1023.0F)) << 12) 1354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (red[i] * 1023.0F)) << 2) 1355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (alpha[i] * 3.0F)) ); 1356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (format == GL_ABGR_EXT) { 1359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 1360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLuint) (alpha[i] * 1023.0F)) << 22) 1362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (blue[i] * 1023.0F)) << 12) 1363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (green[i] * 1023.0F)) << 2) 1364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (red[i] * 3.0F)) ); 1365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_2_10_10_10_REV: 1369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGBA) { 1370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 1371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLuint) (red[i] * 1023.0F)) ) 1373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (green[i] * 1023.0F)) << 10) 1374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (blue[i] * 1023.0F)) << 20) 1375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (alpha[i] * 3.0F)) << 30); 1376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (format == GL_BGRA) { 1379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 1380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLuint) (blue[i] * 1023.0F)) ) 1382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (green[i] * 1023.0F)) << 10) 1383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (red[i] * 1023.0F)) << 20) 1384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (alpha[i] * 3.0F)) << 30); 1385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (format == GL_ABGR_EXT) { 1388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 1389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLuint) (alpha[i] * 1023.0F)) ) 1391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (blue[i] * 1023.0F)) << 10) 1392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (green[i] * 1023.0F)) << 20) 1393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (red[i] * 3.0F)) << 30); 1394afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 1398b7d076fc96ac27117421653a043d00a95f789d24Brian Paul gl_problem( ctx, "bad type in _mesa_pack_rgba_span" ); 1399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 1402c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1403c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1404c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define SWAP2BYTE(VALUE) \ 1405c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { \ 1406c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *bytes = (GLubyte *) &(VALUE); \ 1407c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte tmp = bytes[0]; \ 1408c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[0] = bytes[1]; \ 1409c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[1] = tmp; \ 1410c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1411c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1412c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define SWAP4BYTE(VALUE) \ 1413c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { \ 1414c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *bytes = (GLubyte *) &(VALUE); \ 1415c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte tmp = bytes[0]; \ 1416c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[0] = bytes[3]; \ 1417c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[3] = tmp; \ 1418c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul tmp = bytes[1]; \ 1419c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[1] = bytes[2]; \ 1420c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytes[2] = tmp; \ 1421c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1422c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1423c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1424c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic void 1425c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulextract_uint_indexes(GLuint n, GLuint indexes[], 1426c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum srcFormat, GLenum srcType, const GLvoid *src, 1427c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const struct gl_pixelstore_attrib *unpack ) 1428c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 1429c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(srcFormat == GL_COLOR_INDEX); 1430c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1431c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcType == GL_BITMAP || 1432c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_BYTE || 1433c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_BYTE || 1434c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT || 1435c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_SHORT || 1436c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT || 1437c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_INT || 1438c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_FLOAT); 1439c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1440c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul switch (srcType) { 1441c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BITMAP: 1442c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1443c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *ubsrc = (GLubyte *) src; 1444c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->LsbFirst) { 1445c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte mask = 1 << (unpack->SkipPixels & 0x7); 1446c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1447c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 1448c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = (*ubsrc & mask) ? 1 : 0; 1449c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (mask == 128) { 1450c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul mask = 1; 1451c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ubsrc++; 1452c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1453c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1454c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul mask = mask << 1; 1455c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1456c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1457c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1458c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1459c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte mask = 128 >> (unpack->SkipPixels & 0x7); 1460c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1461c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 1462c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = (*ubsrc & mask) ? 1 : 0; 1463c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (mask == 1) { 1464c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul mask = 128; 1465c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ubsrc++; 1466c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1467c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1468c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul mask = mask >> 1; 1469c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1470c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1471c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1472c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1473c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1474c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_BYTE: 1475c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1476c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1477c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLubyte *s = (const GLubyte *) src; 1478c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 1479c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 1480c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1481c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1482c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BYTE: 1483c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1484c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1485c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLbyte *s = (const GLbyte *) src; 1486c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 1487c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 1488c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1489c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1490c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT: 1491c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1492c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1493c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *s = (const GLushort *) src; 1494c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->SwapBytes) { 1495c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 1496c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort value = s[i]; 1497c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(value); 1498c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = value; 1499c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1500c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1501c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1502c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 1503c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 1504c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1505c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1506c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1507c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_SHORT: 1508c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1509c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1510c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLshort *s = (const GLshort *) src; 1511c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->SwapBytes) { 1512c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 1513c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLshort value = s[i]; 1514c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(value); 1515c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = value; 1516c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1517c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1518c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1519c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 1520c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 1521c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1522c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1523c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1524c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT: 1525c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1526c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1527c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *s = (const GLuint *) src; 1528c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->SwapBytes) { 1529c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 1530c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint value = s[i]; 1531c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(value); 1532c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = value; 1533c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1534c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1535c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1536c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 1537c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 1538c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1539c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1540c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1541c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_INT: 1542c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1543c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1544c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLint *s = (const GLint *) src; 1545c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->SwapBytes) { 1546c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 1547c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint value = s[i]; 1548c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(value); 1549c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = value; 1550c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1551c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1552c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1553c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 1554c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul indexes[i] = s[i]; 1555c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1556c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1557c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1558c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_FLOAT: 1559c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1560c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1561c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLfloat *s = (const GLfloat *) src; 1562c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (unpack->SwapBytes) { 1563c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 1564c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLfloat value = s[i]; 1565c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(value); 1566959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul indexes[i] = (GLuint) value; 1567c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1568c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1569c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1570c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) 1571959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul indexes[i] = (GLuint) s[i]; 1572c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1573c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1574c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1575c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul default: 1576c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_problem(NULL, "bad srcType in extract_uint_indexes"); 1577c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 1578c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1579c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 1580c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1581c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1582c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1583c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/* 1584c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This function extracts floating point RGBA values from arbitrary 1585c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * image data. srcFormat and srcType are the format and type parameters 1586c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc. 1587c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * 1588c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function 1589c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * implements the "Conversion to floating point", "Conversion to RGB", 1590c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * and "Final Expansion to RGBA" operations. 1591c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * 1592c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Args: n - number of pixels 1593c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * rgba - output colors 1594c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * srcFormat - format of incoming data 1595c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * srcType - datatype of incoming data 1596c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * src - source data pointer 1597c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * swapBytes - perform byteswapping of incoming data? 1598c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 1599c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic void 1600c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulextract_float_rgba(GLuint n, GLfloat rgba[][4], 1601c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum srcFormat, GLenum srcType, const GLvoid *src, 1602c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLboolean swapBytes) 1603c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 1604c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint redIndex, greenIndex, blueIndex, alphaIndex; 1605c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint stride; 1606c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint rComp, bComp, gComp, aComp; 1607c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1608c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcFormat == GL_RED || 1609c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_GREEN || 1610c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BLUE || 1611c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_ALPHA || 1612c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_LUMINANCE || 1613c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_LUMINANCE_ALPHA || 1614c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_INTENSITY || 1615c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_RGB || 1616c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BGR || 1617c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_RGBA || 1618c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BGRA || 1619c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_ABGR_EXT); 1620c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1621c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcType == GL_UNSIGNED_BYTE || 1622c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_BYTE || 1623c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT || 1624c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_SHORT || 1625c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT || 1626c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_INT || 1627c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_FLOAT || 1628c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_BYTE_3_3_2 || 1629a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 1630a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_5_6_5 || 1631a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 1632c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 1633a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 1634c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 1635a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 1636c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT_8_8_8_8 || 1637a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 1638a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_10_10_10_2 || 1639a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_2_10_10_10_REV); 1640c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1641a0020435f58baef6a67d3c073b62ea6b1d143af1Brian Paul rComp = gComp = bComp = aComp = -1; 1642a0020435f58baef6a67d3c073b62ea6b1d143af1Brian Paul 1643c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul switch (srcFormat) { 1644c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_RED: 1645c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 0; 1646c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = blueIndex = alphaIndex = -1; 1647c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 1648c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1649c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_GREEN: 1650c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 0; 1651c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = blueIndex = alphaIndex = -1; 1652c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 1653c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1654c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BLUE: 1655c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 0; 1656c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = greenIndex = alphaIndex = -1; 1657c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 1658c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1659c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_ALPHA: 1660c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = greenIndex = blueIndex = -1; 1661c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = 0; 1662c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 1663c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1664c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_LUMINANCE: 1665c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = greenIndex = blueIndex = 0; 1666c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = -1; 1667c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 1668c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1669c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_LUMINANCE_ALPHA: 1670c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = greenIndex = blueIndex = 0; 1671c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = 1; 1672c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 2; 1673c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1674c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_INTENSITY: 1675c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 0; 1676c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = blueIndex = alphaIndex = -1; 1677c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 1; 1678c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1679c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_RGB: 1680c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 0; 1681c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 1; 1682c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 2; 1683c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = -1; 1684c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 3; 1685c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1686c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BGR: 1687c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 2; 1688c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 1; 1689c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 0; 1690c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = -1; 1691c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 3; 1692c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1693c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_RGBA: 1694c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 0; 1695c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 1; 1696c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 2; 1697c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = 3; 1698c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rComp = 0; 1699c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gComp = 1; 1700c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bComp = 2; 1701c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul aComp = 3; 1702c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 4; 1703c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1704c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BGRA: 1705c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 2; 1706c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 1; 1707c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 0; 1708c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = 3; 1709c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rComp = 2; 1710c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gComp = 1; 1711c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bComp = 0; 1712c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul aComp = 3; 1713c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 4; 1714c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1715c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_ABGR_EXT: 1716c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul redIndex = 3; 1717c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul greenIndex = 2; 1718c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul blueIndex = 1; 1719c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul alphaIndex = 0; 1720c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rComp = 3; 1721c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gComp = 2; 1722c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bComp = 1; 1723c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul aComp = 0; 1724c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = 4; 1725c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1726c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul default: 1727c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_problem(NULL, "bad srcFormat in extract float data"); 1728c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 1729c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1730c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1731c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1732c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define PROCESS(INDEX, CHANNEL, DEFAULT, TYPE, CONVERSION) \ 1733c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if ((INDEX) < 0) { \ 1734c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; \ 1735c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { \ 1736c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][CHANNEL] = DEFAULT; \ 1737c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 1738c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 1739c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (swapBytes) { \ 1740c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const TYPE *s = (const TYPE *) src; \ 1741c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; \ 1742c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { \ 1743c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul TYPE value = s[INDEX]; \ 1744c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (sizeof(TYPE) == 2) { \ 1745c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(value); \ 1746c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 1747c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (sizeof(TYPE) == 4) { \ 1748c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(value); \ 1749c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 1750c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][CHANNEL] = (GLfloat) CONVERSION(value); \ 1751c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul s += stride; \ 1752c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 1753c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 1754c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { \ 1755c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const TYPE *s = (const TYPE *) src; \ 1756c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; \ 1757c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { \ 1758c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][CHANNEL] = (GLfloat) CONVERSION(s[INDEX]); \ 1759c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul s += stride; \ 1760c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } \ 1761c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1762c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1763c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul switch (srcType) { 1764c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_BYTE: 1765c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT); 1766c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT); 1767c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT); 1768c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLubyte, UBYTE_TO_FLOAT); 1769c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1770c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_BYTE: 1771c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT); 1772c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT); 1773c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT); 1774c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLbyte, BYTE_TO_FLOAT); 1775c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1776c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT: 1777c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLushort, USHORT_TO_FLOAT); 1778c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLushort, USHORT_TO_FLOAT); 1779c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLushort, USHORT_TO_FLOAT); 1780c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLushort, USHORT_TO_FLOAT); 1781c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1782c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_SHORT: 1783c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLshort, SHORT_TO_FLOAT); 1784c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLshort, SHORT_TO_FLOAT); 1785c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLshort, SHORT_TO_FLOAT); 1786c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLshort, SHORT_TO_FLOAT); 1787c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1788c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT: 1789c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLuint, UINT_TO_FLOAT); 1790c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLuint, UINT_TO_FLOAT); 1791c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLuint, UINT_TO_FLOAT); 1792c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLuint, UINT_TO_FLOAT); 1793c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1794c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_INT: 1795c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLint, INT_TO_FLOAT); 1796c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLint, INT_TO_FLOAT); 1797c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLint, INT_TO_FLOAT); 1798c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLint, INT_TO_FLOAT); 1799c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1800c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_FLOAT: 1801c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(redIndex, RCOMP, 0.0F, GLfloat, (GLfloat)); 1802c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(greenIndex, GCOMP, 0.0F, GLfloat, (GLfloat)); 1803c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(blueIndex, BCOMP, 0.0F, GLfloat, (GLfloat)); 1804c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul PROCESS(alphaIndex, ACOMP, 1.0F, GLfloat, (GLfloat)); 1805c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1806c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_BYTE_3_3_2: 1807c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1808c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLubyte *ubsrc = (const GLubyte *) src; 1809c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1810c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 1811c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte p = ubsrc[i]; 1812c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p >> 5) ) * (1.0F / 7.0F); 1813c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 2) & 0x7) * (1.0F / 7.0F); 1814c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p ) & 0x3) * (1.0F / 3.0F); 1815c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 1816c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1817c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1818c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1819c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_BYTE_2_3_3_REV: 1820c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1821c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLubyte *ubsrc = (const GLubyte *) src; 1822c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1823c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 1824c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte p = ubsrc[i]; 1825c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p ) & 0x7) * (1.0F / 7.0F); 1826c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 3) & 0x7) * (1.0F / 7.0F); 1827c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p >> 6) ) * (1.0F / 3.0F); 1828c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 1829c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1830c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1831c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1832c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_5_6_5: 1833c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 1834c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 1835c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1836c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 1837c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 1838c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 1839c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p >> 11) ) * (1.0F / 31.0F); 1840c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 5) & 0x3f) * (1.0F / 63.0F); 1841c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p ) & 0x1f) * (1.0F / 31.0F); 1842c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 1843c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1844c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1845c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1846c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 1847c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1848c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 1849c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 1850c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p >> 11) ) * (1.0F / 31.0F); 1851c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 5) & 0x3f) * (1.0F / 63.0F); 1852c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p ) & 0x1f) * (1.0F / 31.0F); 1853c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 1854c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1855c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1856c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1857c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_5_6_5_REV: 1858c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 1859c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 1860c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1861c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 1862c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 1863c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 1864c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p ) & 0x1f) * (1.0F / 31.0F); 1865c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 5) & 0x3f) * (1.0F / 63.0F); 1866c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p >> 11) ) * (1.0F / 31.0F); 1867c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 1868c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1869c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1870c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1871c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 1872c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1873c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 1874c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 1875c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = ((p ) & 0x1f) * (1.0F / 31.0F); 1876c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = ((p >> 5) & 0x3f) * (1.0F / 63.0F); 1877c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = ((p >> 11) ) * (1.0F / 31.0F); 1878c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = 1.0F; 1879c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1880c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1881c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1882c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_4_4_4_4: 1883c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 1884c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 1885c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1886c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 1887c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 1888c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 1889c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p >> 12) ) * (1.0F / 15.0F); 1890c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F); 1891c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F); 1892c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p ) & 0xf) * (1.0F / 15.0F); 1893c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1894c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1895c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1896c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 1897c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1898c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 1899c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 1900c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p >> 12) ) * (1.0F / 15.0F); 1901c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F); 1902c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F); 1903c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p ) & 0xf) * (1.0F / 15.0F); 1904c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1905c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1906c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1907c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_4_4_4_4_REV: 1908c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 1909c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 1910c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1911c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 1912c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 1913c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 1914c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0xf) * (1.0F / 15.0F); 1915c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F); 1916c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F); 1917c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 12) ) * (1.0F / 15.0F); 1918c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1919c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1920c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1921c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 1922c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1923c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 1924c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 1925c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0xf) * (1.0F / 15.0F); 1926c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F); 1927c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F); 1928c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 12) ) * (1.0F / 15.0F); 1929c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1930c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1931c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1932c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_5_5_5_1: 1933c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 1934c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 1935c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1936c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 1937c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 1938c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 1939c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p >> 11) ) * (1.0F / 31.0F); 1940c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 6) & 0x1f) * (1.0F / 31.0F); 1941c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 1) & 0x1f) * (1.0F / 31.0F); 1942c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p ) & 0x1) * (1.0F / 1.0F); 1943c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1944c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1945c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1946c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 1947c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1948c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 1949c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 1950c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p >> 11) ) * (1.0F / 31.0F); 1951c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 6) & 0x1f) * (1.0F / 31.0F); 1952c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 1) & 0x1f) * (1.0F / 31.0F); 1953c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p ) & 0x1) * (1.0F / 1.0F); 1954c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1955c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1956c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1957c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT_1_5_5_5_REV: 1958c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 1959c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 1960c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1961c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 1962c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 1963c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP2BYTE(p); 1964c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0x1f) * (1.0F / 31.0F); 1965c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 5) & 0x1f) * (1.0F / 31.0F); 1966c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F); 1967c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 15) ) * (1.0F / 1.0F); 1968c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1969c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1970c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1971c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLushort *ussrc = (const GLushort *) src; 1972c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1973c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 1974c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLushort p = ussrc[i]; 1975c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0x1f) * (1.0F / 31.0F); 1976c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 5) & 0x1f) * (1.0F / 31.0F); 1977c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F); 1978c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 15) ) * (1.0F / 1.0F); 1979c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1980c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1981c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 1982c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT_8_8_8_8: 1983c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 1984c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 1985c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1986c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 1987c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 1988c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p ) & 0xff); 1989c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 8) & 0xff); 1990c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 16) & 0xff); 1991c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 24) ); 1992c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1993c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1994c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1995c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 1996c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 1997c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 1998c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 1999c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 24) ); 2000c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 16) & 0xff); 2001c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 8) & 0xff); 2002c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p ) & 0xff); 2003c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2004c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2005c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2006c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT_8_8_8_8_REV: 2007c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2008c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2009c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2010c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2011c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 2012c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 24) ); 2013c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 16) & 0xff); 2014c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 8) & 0xff); 2015c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p ) & 0xff); 2016c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2017c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2018c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2019c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2020c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2021c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2022c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 2023c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p ) & 0xff); 2024c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 8) & 0xff); 2025c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 16) & 0xff); 2026c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 24) ); 2027c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2028c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2029c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2030c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT_10_10_10_2: 2031c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2032c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2033c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2034c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2035c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 2036c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(p); 2037a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][rComp] = ((p >> 22) ) * (1.0F / 1023.0F); 2038a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F); 2039a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][bComp] = ((p >> 2) & 0x3ff) * (1.0F / 1023.0F); 2040a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][aComp] = ((p ) & 0x3 ) * (1.0F / 3.0F); 2041c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2042c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2043c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2044c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2045c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2046c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2047c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 2048a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][rComp] = ((p >> 22) ) * (1.0F / 1023.0F); 2049a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F); 2050a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][bComp] = ((p >> 2) & 0x3ff) * (1.0F / 1023.0F); 2051a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul rgba[i][aComp] = ((p ) & 0x3 ) * (1.0F / 3.0F); 2052c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2053c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2054c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2055c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT_2_10_10_10_REV: 2056c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (swapBytes) { 2057c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2058c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2059c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2060c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 2061c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul SWAP4BYTE(p); 2062c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0x3ff) * (1.0F / 1023.0F); 2063c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F); 2064c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F); 2065c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 30) ) * (1.0F / 3.0F); 2066c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2067c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2068c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2069c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLuint *uisrc = (const GLuint *) src; 2070c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2071c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i ++) { 2072c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint p = uisrc[i]; 2073c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][rComp] = ((p ) & 0x3ff) * (1.0F / 1023.0F); 2074c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F); 2075c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F); 2076c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][aComp] = ((p >> 30) ) * (1.0F / 3.0F); 2077c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2078c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2079c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2080c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul default: 2081c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_problem(NULL, "bad srcType in extract float data"); 2082c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2083c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2084c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 2085c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2086c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2087c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2088c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/* 2089c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack a row of color image data from a client buffer according to 2090c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * the pixel unpacking parameters. Apply any enabled pixel transfer 2091c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * ops (PixelMap, scale/bias) if the applyTransferOps flag is enabled. 2092c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Return GLubyte values in the specified dest image format. 2093c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This is (or will be) used by glDrawPixels and glTexImage?D(). 2094c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Input: ctx - the context 2095c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * n - number of pixels in the span 2096c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * dstFormat - format of destination color array 2097c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * dest - the destination color array 2098c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * srcFormat - source image format 2099c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * srcType - source image datatype 2100c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * source - source image pointer 2101c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * unpacking - pixel unpacking parameters 2102c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * applyTransferOps - apply scale/bias/lookup-table ops? 2103c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * 2104c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * XXX perhaps expand this to process whole images someday. 2105c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 2106c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid 2107c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul_mesa_unpack_ubyte_color_span( const GLcontext *ctx, 2108c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint n, GLenum dstFormat, GLubyte dest[], 2109c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum srcFormat, GLenum srcType, 2110c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLvoid *source, 2111c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const struct gl_pixelstore_attrib *unpacking, 2112c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLboolean applyTransferOps ) 2113c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 2114c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(dstFormat == GL_ALPHA || 2115c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_LUMINANCE || 2116c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_LUMINANCE_ALPHA || 2117c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_INTENSITY || 2118c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_RGB || 2119c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_RGBA || 2120c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstFormat == GL_COLOR_INDEX); 2121c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2122c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcFormat == GL_RED || 2123c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_GREEN || 2124c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BLUE || 2125c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_ALPHA || 2126c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_LUMINANCE || 2127c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_LUMINANCE_ALPHA || 2128c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_INTENSITY || 2129c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_RGB || 2130c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BGR || 2131c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_RGBA || 2132c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_BGRA || 2133c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_ABGR_EXT || 2134c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat == GL_COLOR_INDEX); 2135c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2136c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcType == GL_BITMAP || 2137c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_BYTE || 2138c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_BYTE || 2139c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT || 2140c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_SHORT || 2141c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT || 2142c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_INT || 2143c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_FLOAT || 2144c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_BYTE_3_3_2 || 2145a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 2146a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_5_6_5 || 2147a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 2148c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 2149a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 2150c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 2151a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 2152c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT_8_8_8_8 || 2153a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 2154a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_10_10_10_2 || 2155a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul srcType == GL_UNSIGNED_INT_2_10_10_10_REV); 2156c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2157250069dbb443f26f4dcc409c9c873019a5f50f9dBrian Paul /* this is intended for RGBA mode only */ 2158fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul assert(ctx->Visual->RGBAflag); 2159c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2160c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul applyTransferOps &= (ctx->Pixel.ScaleOrBiasRGBA || 2161fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul ctx->Pixel.MapColorFlag || 2162250069dbb443f26f4dcc409c9c873019a5f50f9dBrian Paul ctx->ColorMatrix.type != MATRIX_IDENTITY || 2163250069dbb443f26f4dcc409c9c873019a5f50f9dBrian Paul ctx->Pixel.ScaleOrBiasRGBApcm); 2164c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2165c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Try simple cases first */ 2166c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (!applyTransferOps && srcType == GL_UNSIGNED_BYTE) { 2167c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstFormat == GL_RGBA) { 2168c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (srcFormat == GL_RGBA) { 2169c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul MEMCPY( dest, source, n * 4 * sizeof(GLubyte) ); 2170c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 2171c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2172c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (srcFormat == GL_RGB) { 2173c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2174c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLubyte *src = (const GLubyte *) source; 2175c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dst = dest; 2176c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2177c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[0] = src[0]; 2178c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[1] = src[1]; 2179c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[2] = src[2]; 2180c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[3] = 255; 2181c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul src += 3; 2182c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += 4; 2183c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2184c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 2185c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2186c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2187c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (dstFormat == GL_RGB) { 2188c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (srcFormat == GL_RGB) { 2189c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul MEMCPY( dest, source, n * 3 * sizeof(GLubyte) ); 2190c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 2191c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2192c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (srcFormat == GL_RGBA) { 2193c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2194c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLubyte *src = (const GLubyte *) source; 2195c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dst = dest; 2196c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2197c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[0] = src[0]; 2198c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[1] = src[1]; 2199c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[2] = src[2]; 2200c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul src += 4; 2201c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += 3; 2202c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2203c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 2204c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2205c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2206b09a4cd913e2de612fddf5411185a257da35647cBrian Paul else if (dstFormat == srcFormat) { 2207b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GLint comps = _mesa_components_in_format(srcFormat); 2208b09a4cd913e2de612fddf5411185a257da35647cBrian Paul assert(comps > 0); 2209b09a4cd913e2de612fddf5411185a257da35647cBrian Paul MEMCPY( dest, source, n * comps * sizeof(GLubyte) ); 2210c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 2211c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2212c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2213c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2214c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2215c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2216c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* general solution */ 2217c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLfloat rgba[MAX_WIDTH][4]; 2218c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint dstComponents; 2219c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint dstRedIndex, dstGreenIndex, dstBlueIndex, dstAlphaIndex; 2220c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint dstLuminanceIndex, dstIntensityIndex; 2221c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2222b7d076fc96ac27117421653a043d00a95f789d24Brian Paul dstComponents = _mesa_components_in_format( dstFormat ); 2223c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* source & dest image formats should have been error checked by now */ 2224c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(dstComponents > 0); 2225c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2226c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* 2227c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Extract image data and convert to RGBA floats 2228c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 2229c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(n <= MAX_WIDTH); 2230c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (srcFormat == GL_COLOR_INDEX) { 2231c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint indexes[MAX_WIDTH]; 2232c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul extract_uint_indexes(n, indexes, srcFormat, srcType, source, 2233c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul unpacking); 2234c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2235c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* shift and offset indexes */ 2236c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_shift_and_offset_ci(ctx, n, indexes); 2237c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2238c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstFormat == GL_COLOR_INDEX) { 2239c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (applyTransferOps) { 2240c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (ctx->Pixel.MapColorFlag) { 2241c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Apply lookup table */ 2242c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_map_ci(ctx, n, indexes); 2243c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2244c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2245c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset) { 2246c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2247c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2248c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2249c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2250c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* convert to GLubyte and return */ 2251c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2252c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2253c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2254c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dest[i] = (GLubyte) (indexes[i] & 0xff); 2255c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2256c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2257c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2258c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2259c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Convert indexes to RGBA */ 2260c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_map_ci_to_rgba_float(ctx, n, indexes, rgba); 2261c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2262c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2263c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2264c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul extract_float_rgba(n, rgba, srcFormat, srcType, source, 2265c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul unpacking->SwapBytes); 2266c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2267c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (applyTransferOps) { 2268c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* scale and bias colors */ 2269250069dbb443f26f4dcc409c9c873019a5f50f9dBrian Paul _mesa_scale_and_bias_rgba_float(ctx, n, rgba); 2270c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2271c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* color table lookup */ 2272c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (ctx->Pixel.MapColorFlag) { 2273250069dbb443f26f4dcc409c9c873019a5f50f9dBrian Paul _mesa_map_rgba_float(ctx, n, rgba); 2274250069dbb443f26f4dcc409c9c873019a5f50f9dBrian Paul } 2275250069dbb443f26f4dcc409c9c873019a5f50f9dBrian Paul 2276250069dbb443f26f4dcc409c9c873019a5f50f9dBrian Paul if (ctx->ColorMatrix.type != MATRIX_IDENTITY || 2277250069dbb443f26f4dcc409c9c873019a5f50f9dBrian Paul ctx->Pixel.ScaleOrBiasRGBApcm) { 2278250069dbb443f26f4dcc409c9c873019a5f50f9dBrian Paul _mesa_transform_rgba(ctx, n, rgba); 2279c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2280c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2281c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2282c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2283c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2284c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* 2285b09a4cd913e2de612fddf5411185a257da35647cBrian Paul * XXX This is where more color table lookups, convolution, 2286b09a4cd913e2de612fddf5411185a257da35647cBrian Paul * histograms, minmax, color matrix, etc would take place if 2287b09a4cd913e2de612fddf5411185a257da35647cBrian Paul * implemented. 2288b09a4cd913e2de612fddf5411185a257da35647cBrian Paul * See figure 3.7 in the OpenGL 1.2 specification for more info. 2289c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 2290c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2291c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2292c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* clamp to [0,1] */ 2293c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2294c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2295c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2296c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F); 2297c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F); 2298c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F); 2299c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F); 2300c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2301c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2302c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2303c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Now determine which color channels we need to produce. 2304c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * And determine the dest index (offset) within each color tuple. 2305c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 2306c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul switch (dstFormat) { 2307c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_ALPHA: 2308c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstAlphaIndex = 0; 2309c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = -1; 2310c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstLuminanceIndex = dstIntensityIndex = -1; 2311c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2312c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_LUMINANCE: 2313c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstLuminanceIndex = 0; 2314c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1; 2315c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstIntensityIndex = -1; 2316c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2317c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_LUMINANCE_ALPHA: 2318c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstLuminanceIndex = 0; 2319c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstAlphaIndex = 1; 2320c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = -1; 2321c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstIntensityIndex = -1; 2322c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2323c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_INTENSITY: 2324c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstIntensityIndex = 0; 2325c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1; 2326c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstLuminanceIndex = -1; 2327c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2328c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_RGB: 2329c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = 0; 2330c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstGreenIndex = 1; 2331c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstBlueIndex = 2; 2332c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1; 2333c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2334c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_RGBA: 2335c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstRedIndex = 0; 2336c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstGreenIndex = 1; 2337c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstBlueIndex = 2; 2338c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstAlphaIndex = 3; 2339c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstLuminanceIndex = dstIntensityIndex = -1; 2340c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2341c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul default: 2342c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_problem(ctx, "bad dstFormat in _mesa_unpack_ubyte_span()"); 2343276988ec96a48d4ee5c28c0a2da3aa2b5ee0bbeaBrian Paul return; 2344c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2345c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2346c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2347c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Now return the GLubyte data in the requested dstFormat */ 2348fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2349c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstRedIndex >= 0) { 2350c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dst = dest; 2351c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2352c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2353c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[dstRedIndex] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 2354c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += dstComponents; 2355c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2356c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2357c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2358c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstGreenIndex >= 0) { 2359c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dst = dest; 2360c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2361c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2362c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[dstGreenIndex] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 2363c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += dstComponents; 2364c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2365c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2366c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2367c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstBlueIndex >= 0) { 2368c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dst = dest; 2369c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2370c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2371c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[dstBlueIndex] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 2372c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += dstComponents; 2373c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2374c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2375c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2376c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstAlphaIndex >= 0) { 2377c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dst = dest; 2378c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2379c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2380c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[dstAlphaIndex] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 2381c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += dstComponents; 2382c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2383c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2384c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2385c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstIntensityIndex >= 0) { 2386c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dst = dest; 2387c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2388c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(dstIntensityIndex == 0); 2389c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(dstComponents == 1); 2390c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2391c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Intensity comes from red channel */ 2392c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[i] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 2393c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2394c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2395c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2396c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dstLuminanceIndex >= 0) { 2397c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dst = dest; 2398c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2399c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(dstLuminanceIndex == 0); 2400c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2401c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Luminance comes from red channel */ 2402c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 2403c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += dstComponents; 2404c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2405c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2406c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2407c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 2408c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2409c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2410c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2411c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/* 2412c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack a row of color index data from a client buffer according to 2413c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * the pixel unpacking parameters. Apply pixel transfer ops if enabled 2414c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * and applyTransferOps is true. 2415c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc. 2416c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * 2417c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Args: ctx - the context 2418c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * n - number of pixels 2419c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * dstType - destination datatype 2420c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * dest - destination array 2421c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * srcType - source pixel type 2422c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * source - source data pointer 2423c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * unpacking - pixel unpacking parameters 2424c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * applyTransferOps - apply offset/bias/lookup ops? 2425c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 2426c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid 2427c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul_mesa_unpack_index_span( const GLcontext *ctx, GLuint n, 2428c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum dstType, GLvoid *dest, 2429c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum srcType, const GLvoid *source, 2430c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const struct gl_pixelstore_attrib *unpacking, 2431c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLboolean applyTransferOps ) 2432c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 2433c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(srcType == GL_BITMAP || 2434c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_BYTE || 2435c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_BYTE || 2436c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_SHORT || 2437c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_SHORT || 2438c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_UNSIGNED_INT || 2439c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_INT || 2440c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType == GL_FLOAT); 2441c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2442c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT(dstType == GL_UNSIGNED_BYTE || 2443c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstType == GL_UNSIGNED_SHORT || 2444c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dstType == GL_UNSIGNED_INT); 2445c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2446c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul applyTransferOps &= (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset || ctx->Pixel.MapColorFlag); 2447c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2448c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* 2449c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Try simple cases first 2450c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 2451c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (!applyTransferOps && srcType == GL_UNSIGNED_BYTE 2452c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul && dstType == GL_UNSIGNED_BYTE) { 2453c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul MEMCPY(dest, source, n * sizeof(GLubyte)); 2454c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2455c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (!applyTransferOps && srcType == GL_UNSIGNED_INT 2456c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul && dstType == GL_UNSIGNED_INT && !unpacking->SwapBytes) { 2457c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul MEMCPY(dest, source, n * sizeof(GLuint)); 2458c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2459c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2460c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* 2461c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * general solution 2462c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 2463c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint indexes[MAX_WIDTH]; 2464c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(n <= MAX_WIDTH); 2465c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2466c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source, 2467c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul unpacking); 2468c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2469c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (applyTransferOps) { 2470c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset) { 2471c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* shift and offset indexes */ 2472c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_shift_and_offset_ci(ctx, n, indexes); 2473c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2474c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2475c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (ctx->Pixel.MapColorFlag) { 2476c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Apply lookup table */ 2477c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_map_ci(ctx, n, indexes); 2478c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2479c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2480c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2481c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* convert to dest type */ 2482c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul switch (dstType) { 2483c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_BYTE: 2484c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2485c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dst = (GLubyte *) dest; 2486c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2487c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2488c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[i] = (GLubyte) (indexes[i] & 0xff); 2489c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2490c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2491c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2492c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_SHORT: 2493c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2494c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint *dst = (GLuint *) dest; 2495c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLuint i; 2496c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < n; i++) { 2497c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst[i] = (GLushort) (indexes[i] & 0xffff); 2498c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2499c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2500c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2501c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul case GL_UNSIGNED_INT: 2502c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul MEMCPY(dest, indexes, n * sizeof(GLuint)); 2503c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul break; 2504c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul default: 2505c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_problem(ctx, "bad dstType in _mesa_unpack_index_span"); 2506c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2507c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2508c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 2509c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2510c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2511c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/* 2512fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Unpack a row of stencil data from a client buffer according to 2513fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * the pixel unpacking parameters. Apply pixel transfer ops if enabled 2514fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * and applyTransferOps is true. 2515fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * This is (or will be) used by glDrawPixels 2516fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * 2517fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Args: ctx - the context 2518fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * n - number of pixels 2519fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * dstType - destination datatype 2520fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * dest - destination array 2521fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * srcType - source pixel type 2522fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * source - source data pointer 2523fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * unpacking - pixel unpacking parameters 2524fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * applyTransferOps - apply offset/bias/lookup ops? 2525fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */ 2526fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid 2527fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_unpack_stencil_span( const GLcontext *ctx, GLuint n, 2528fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLenum dstType, GLvoid *dest, 2529fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLenum srcType, const GLvoid *source, 2530fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const struct gl_pixelstore_attrib *unpacking, 2531fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLboolean applyTransferOps ) 2532fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{ 2533fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul ASSERT(srcType == GL_BITMAP || 2534fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_UNSIGNED_BYTE || 2535fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_BYTE || 2536fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_UNSIGNED_SHORT || 2537fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_SHORT || 2538fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_UNSIGNED_INT || 2539fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_INT || 2540fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcType == GL_FLOAT); 2541fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2542fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul ASSERT(dstType == GL_UNSIGNED_BYTE || 2543fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dstType == GL_UNSIGNED_SHORT || 2544fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dstType == GL_UNSIGNED_INT); 2545fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2546fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul applyTransferOps &= (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset || ctx->Pixel.MapColorFlag); 2547fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2548fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* 2549fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Try simple cases first 2550fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */ 2551fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (!applyTransferOps && srcType == GL_UNSIGNED_BYTE 2552fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul && dstType == GL_UNSIGNED_BYTE) { 2553fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul MEMCPY(dest, source, n * sizeof(GLubyte)); 2554fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2555fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul else if (!applyTransferOps && srcType == GL_UNSIGNED_INT 2556fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul && dstType == GL_UNSIGNED_INT && !unpacking->SwapBytes) { 2557fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul MEMCPY(dest, source, n * sizeof(GLuint)); 2558fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2559fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul else { 2560fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* 2561fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * general solution 2562fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */ 2563fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint indexes[MAX_WIDTH]; 2564fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul assert(n <= MAX_WIDTH); 2565fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2566fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source, 2567fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul unpacking); 2568fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2569fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (applyTransferOps) { 2570fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset) { 2571fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* shift and offset indexes */ 2572fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul gl_shift_and_offset_ci(ctx, n, indexes); 2573fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2574fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2575fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (ctx->Pixel.MapStencilFlag) { 2576fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* Apply stencil lookup table */ 2577fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint mask = ctx->Pixel.MapStoSsize - 1; 2578fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 2579fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i=0;i<n;i++) { 2580fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul indexes[i] = ctx->Pixel.MapStoS[ indexes[i] & mask ]; 2581fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2582fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2583fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2584fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2585fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* convert to dest type */ 2586fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul switch (dstType) { 2587fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_BYTE: 2588fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 2589fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLubyte *dst = (GLubyte *) dest; 2590fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 2591fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 2592fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dst[i] = (GLubyte) (indexes[i] & 0xff); 2593fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2594fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2595fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 2596fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_SHORT: 2597fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 2598fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint *dst = (GLuint *) dest; 2599fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 2600fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 2601fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dst[i] = (GLushort) (indexes[i] & 0xffff); 2602fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2603fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2604fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 2605fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_INT: 2606fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul MEMCPY(dest, indexes, n * sizeof(GLuint)); 2607fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 2608fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul default: 2609fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul gl_problem(ctx, "bad dstType in _mesa_unpack_stencil_span"); 2610fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2611fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2612fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 2613fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2614fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2615fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2616fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid 2617fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_unpack_depth_span( const GLcontext *ctx, GLuint n, GLdepth *dest, 2618fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLenum srcType, const GLvoid *source, 2619fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const struct gl_pixelstore_attrib *unpacking, 2620fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLboolean applyTransferOps ) 2621fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{ 2622fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLfloat *depth = MALLOC(n * sizeof(GLfloat)); 2623fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (!depth) 2624fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return; 2625fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2626fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul switch (srcType) { 2627fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_BYTE: 2628fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 2629fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 2630fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLubyte *src = (const GLubyte *) source; 2631fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 2632fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul depth[i] = BYTE_TO_FLOAT(src[i]); 2633fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2634fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2635fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 2636fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_BYTE: 2637fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 2638fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 2639fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLubyte *src = (const GLubyte *) source; 2640fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 2641fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul depth[i] = UBYTE_TO_FLOAT(src[i]); 2642fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2643fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2644fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 2645fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_SHORT: 2646fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 2647fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 2648fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLshort *src = (const GLshort *) source; 2649fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 2650fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul depth[i] = SHORT_TO_FLOAT(src[i]); 2651fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2652fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2653fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 2654fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_SHORT: 2655fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 2656fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 2657fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLushort *src = (const GLushort *) source; 2658fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 2659fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul depth[i] = USHORT_TO_FLOAT(src[i]); 2660fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2661fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2662fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 2663fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_INT: 2664fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 2665fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 2666fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLint *src = (const GLint *) source; 2667fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 2668fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul depth[i] = INT_TO_FLOAT(src[i]); 2669fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2670fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2671fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 2672fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_UNSIGNED_INT: 2673fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 2674fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 2675fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLuint *src = (const GLuint *) source; 2676fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 2677fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul depth[i] = UINT_TO_FLOAT(src[i]); 2678fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2679fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2680fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 2681fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case GL_FLOAT: 2682fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul MEMCPY(depth, source, n * sizeof(GLfloat)); 2683fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 2684fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul default: 2685fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul gl_problem(NULL, "bad type in _mesa_unpack_depth_span()"); 2686fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return; 2687fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2688fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2689fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2690fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* apply depth scale and bias */ 2691fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) { 2692fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 2693fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 2694fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul depth[i] = depth[i] * ctx->Pixel.DepthScale + ctx->Pixel.DepthBias; 2695fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2696fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2697fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2698fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* clamp depth values to [0,1] and convert from floats to integers */ 2699fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { 2700ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul const GLfloat zs = ctx->Visual->DepthMaxF; 2701fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLuint i; 2702fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < n; i++) { 2703ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul dest[i] = (GLdepth) (CLAMP(depth[i], 0.0F, 1.0F) * zs); 2704fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2705fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2706fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2707fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul FREE(depth); 2708fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 2709fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2710fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2711fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2712fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul/* 2713c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack image data. Apply byteswapping, byte flipping (bitmap). 2714c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Return all image data in a contiguous block. 2715c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 2716c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid * 2717c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul_mesa_unpack_image( GLsizei width, GLsizei height, GLsizei depth, 2718c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum format, GLenum type, const GLvoid *pixels, 2719c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const struct gl_pixelstore_attrib *unpack ) 2720c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 2721c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint bytesPerRow, compsPerRow; 2722c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLboolean flipBytes, swap2, swap4; 2723c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2724c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (!pixels) 2725c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return NULL; /* not necessarily an error */ 2726c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2727c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (width <= 0 || height <= 0 || depth <= 0) 2728c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return NULL; /* generate error later */ 2729c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2730c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (format == GL_BITMAP) { 2731c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytesPerRow = (width + 7) >> 3; 2732c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul flipBytes = !unpack->LsbFirst; 2733c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul swap2 = swap4 = GL_FALSE; 2734c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul compsPerRow = 0; 2735c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2736c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 2737b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type); 2738b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const GLint components = _mesa_components_in_format(format); 2739c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint bytesPerComp; 2740c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (bytesPerPixel <= 0 || components <= 0) 2741c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return NULL; /* bad format or type. generate error later */ 2742c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytesPerRow = bytesPerPixel * width; 2743c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul bytesPerComp = bytesPerPixel / components; 2744c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul flipBytes = GL_FALSE; 2745c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul swap2 = (bytesPerComp == 2) && unpack->SwapBytes; 2746c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul swap4 = (bytesPerComp == 4) && unpack->SwapBytes; 2747c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul compsPerRow = components * width; 2748c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(compsPerRow >= width); 2749c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2750c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2751c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 2752c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *destBuffer = MALLOC(bytesPerRow * height * depth); 2753c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dst; 2754c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint img, row; 2755c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (!destBuffer) 2756c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return NULL; /* generate GL_OUT_OF_MEMORY later */ 2757c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2758c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst = destBuffer; 2759c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (img = 0; img < depth; img++) { 2760c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (row = 0; row < height; row++) { 2761b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const GLvoid *src = _mesa_image_address(unpack, pixels, 2762c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul width, height, format, type, img, row, 0); 2763c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul MEMCPY(dst, src, bytesPerRow); 2764c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* byte flipping/swapping */ 2765c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (flipBytes) { 2766b7d076fc96ac27117421653a043d00a95f789d24Brian Paul flip_bytes((GLubyte *) dst, bytesPerRow); 2767c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2768c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (swap2) { 2769b7d076fc96ac27117421653a043d00a95f789d24Brian Paul _mesa_swap2((GLushort*) dst, compsPerRow); 2770c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2771c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (swap4) { 2772b7d076fc96ac27117421653a043d00a95f789d24Brian Paul _mesa_swap4((GLuint*) dst, compsPerRow); 2773c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2774c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += bytesPerRow; 2775c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2776c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2777c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return destBuffer; 2778c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2779c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 2780fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2781fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2782fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul/* 2783fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Unpack bitmap data. Resulting data will be in most-significant-bit-first 2784fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * order with row alignment = 1 byte. 2785fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */ 2786fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian PaulGLvoid * 2787fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_unpack_bitmap( GLint width, GLint height, const GLubyte *pixels, 2788fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const struct gl_pixelstore_attrib *packing ) 2789fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{ 2790fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint bytes, row, width_in_bytes; 2791fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLubyte *buffer, *dst; 2792fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2793fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (!pixels) 2794fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return NULL; 2795fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2796fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* Alloc dest storage */ 2797fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul bytes = ((width + 7) / 8 * height); 2798fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul buffer = (GLubyte *) MALLOC( bytes ); 2799fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (!buffer) 2800fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return NULL; 2801fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2802fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2803fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul width_in_bytes = CEILING( width, 8 ); 2804fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dst = buffer; 2805fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (row = 0; row < height; row++) { 2806b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GLubyte *src = _mesa_image_address( packing, pixels, width, height, 2807b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GL_COLOR_INDEX, GL_BITMAP, 2808b7d076fc96ac27117421653a043d00a95f789d24Brian Paul 0, row, 0 ); 2809fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (!src) { 2810fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul FREE(buffer); 2811fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return NULL; 2812fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2813fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2814fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (packing->SkipPixels == 0) { 2815fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul MEMCPY( dst, src, width_in_bytes ); 2816fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (packing->LsbFirst) { 2817b7d076fc96ac27117421653a043d00a95f789d24Brian Paul flip_bytes( dst, width_in_bytes ); 2818fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2819fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2820fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul else { 2821fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul /* handling SkipPixels is a bit tricky (no pun intended!) */ 2822fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint i; 2823fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (packing->LsbFirst) { 2824fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLubyte srcMask = 1 << (packing->SkipPixels & 0x7); 2825fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLubyte dstMask = 128; 2826fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLubyte *s = src; 2827fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLubyte *d = dst; 2828fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *d = 0; 2829fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < width; i++) { 2830fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (*s & srcMask) { 2831fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *d |= dstMask; 2832fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2833fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (srcMask == 128) { 2834fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcMask = 1; 2835fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul s++; 2836fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2837fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul else { 2838fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcMask = srcMask << 1; 2839fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2840fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (dstMask == 1) { 2841fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dstMask = 128; 2842fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul d++; 2843fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *d = 0; 2844fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2845fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul else { 2846fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dstMask = dstMask >> 1; 2847fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2848fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2849fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2850fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul else { 2851fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7); 2852fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLubyte dstMask = 128; 2853fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLubyte *s = src; 2854fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLubyte *d = dst; 2855fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *d = 0; 2856fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (i = 0; i < width; i++) { 2857fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (*s & srcMask) { 2858fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *d |= dstMask; 2859fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2860fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (srcMask == 1) { 2861fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcMask = 128; 2862fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul s++; 2863fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2864fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul else { 2865fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul srcMask = srcMask >> 1; 2866fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2867fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (dstMask == 1) { 2868fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dstMask = 128; 2869fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul d++; 2870fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *d = 0; 2871fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2872fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul else { 2873fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dstMask = dstMask >> 1; 2874fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2875fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2876fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2877fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2878fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul dst += width_in_bytes; 2879fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 2880fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 2881fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return buffer; 2882fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 28837c652d77220610ecc19aaefa20876216b035e961Brian Paul 28847c652d77220610ecc19aaefa20876216b035e961Brian Paul 28857c652d77220610ecc19aaefa20876216b035e961Brian Paul/* 28867c652d77220610ecc19aaefa20876216b035e961Brian Paul * Pack bitmap data. 28877c652d77220610ecc19aaefa20876216b035e961Brian Paul */ 28887c652d77220610ecc19aaefa20876216b035e961Brian Paulvoid 28897c652d77220610ecc19aaefa20876216b035e961Brian Paul_mesa_pack_bitmap( GLint width, GLint height, const GLubyte *source, 28907c652d77220610ecc19aaefa20876216b035e961Brian Paul GLubyte *dest, const struct gl_pixelstore_attrib *packing ) 28917c652d77220610ecc19aaefa20876216b035e961Brian Paul{ 28927c652d77220610ecc19aaefa20876216b035e961Brian Paul GLint row, width_in_bytes; 28937c652d77220610ecc19aaefa20876216b035e961Brian Paul const GLubyte *src; 28947c652d77220610ecc19aaefa20876216b035e961Brian Paul 28957c652d77220610ecc19aaefa20876216b035e961Brian Paul if (!source) 28967c652d77220610ecc19aaefa20876216b035e961Brian Paul return; 28977c652d77220610ecc19aaefa20876216b035e961Brian Paul 28987c652d77220610ecc19aaefa20876216b035e961Brian Paul width_in_bytes = CEILING( width, 8 ); 28997c652d77220610ecc19aaefa20876216b035e961Brian Paul src = source; 29007c652d77220610ecc19aaefa20876216b035e961Brian Paul for (row = 0; row < height; row++) { 2901b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GLubyte *dst = _mesa_image_address( packing, dest, width, height, 2902b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GL_COLOR_INDEX, GL_BITMAP, 2903b7d076fc96ac27117421653a043d00a95f789d24Brian Paul 0, row, 0 ); 29047c652d77220610ecc19aaefa20876216b035e961Brian Paul if (!dst) 29057c652d77220610ecc19aaefa20876216b035e961Brian Paul return; 29067c652d77220610ecc19aaefa20876216b035e961Brian Paul 29077c652d77220610ecc19aaefa20876216b035e961Brian Paul if (packing->SkipPixels == 0) { 29087c652d77220610ecc19aaefa20876216b035e961Brian Paul MEMCPY( dst, src, width_in_bytes ); 29097c652d77220610ecc19aaefa20876216b035e961Brian Paul if (packing->LsbFirst) { 2910b7d076fc96ac27117421653a043d00a95f789d24Brian Paul flip_bytes( dst, width_in_bytes ); 29117c652d77220610ecc19aaefa20876216b035e961Brian Paul } 29127c652d77220610ecc19aaefa20876216b035e961Brian Paul } 29137c652d77220610ecc19aaefa20876216b035e961Brian Paul else { 29147c652d77220610ecc19aaefa20876216b035e961Brian Paul /* handling SkipPixels is a bit tricky (no pun intended!) */ 29157c652d77220610ecc19aaefa20876216b035e961Brian Paul GLint i; 29167c652d77220610ecc19aaefa20876216b035e961Brian Paul if (packing->LsbFirst) { 29177c652d77220610ecc19aaefa20876216b035e961Brian Paul GLubyte srcMask = 1 << (packing->SkipPixels & 0x7); 29187c652d77220610ecc19aaefa20876216b035e961Brian Paul GLubyte dstMask = 128; 29197c652d77220610ecc19aaefa20876216b035e961Brian Paul const GLubyte *s = src; 29207c652d77220610ecc19aaefa20876216b035e961Brian Paul GLubyte *d = dst; 29217c652d77220610ecc19aaefa20876216b035e961Brian Paul *d = 0; 29227c652d77220610ecc19aaefa20876216b035e961Brian Paul for (i = 0; i < width; i++) { 29237c652d77220610ecc19aaefa20876216b035e961Brian Paul if (*s & srcMask) { 29247c652d77220610ecc19aaefa20876216b035e961Brian Paul *d |= dstMask; 29257c652d77220610ecc19aaefa20876216b035e961Brian Paul } 29267c652d77220610ecc19aaefa20876216b035e961Brian Paul if (srcMask == 128) { 29277c652d77220610ecc19aaefa20876216b035e961Brian Paul srcMask = 1; 29287c652d77220610ecc19aaefa20876216b035e961Brian Paul s++; 29297c652d77220610ecc19aaefa20876216b035e961Brian Paul } 29307c652d77220610ecc19aaefa20876216b035e961Brian Paul else { 29317c652d77220610ecc19aaefa20876216b035e961Brian Paul srcMask = srcMask << 1; 29327c652d77220610ecc19aaefa20876216b035e961Brian Paul } 29337c652d77220610ecc19aaefa20876216b035e961Brian Paul if (dstMask == 1) { 29347c652d77220610ecc19aaefa20876216b035e961Brian Paul dstMask = 128; 29357c652d77220610ecc19aaefa20876216b035e961Brian Paul d++; 29367c652d77220610ecc19aaefa20876216b035e961Brian Paul *d = 0; 29377c652d77220610ecc19aaefa20876216b035e961Brian Paul } 29387c652d77220610ecc19aaefa20876216b035e961Brian Paul else { 29397c652d77220610ecc19aaefa20876216b035e961Brian Paul dstMask = dstMask >> 1; 29407c652d77220610ecc19aaefa20876216b035e961Brian Paul } 29417c652d77220610ecc19aaefa20876216b035e961Brian Paul } 29427c652d77220610ecc19aaefa20876216b035e961Brian Paul } 29437c652d77220610ecc19aaefa20876216b035e961Brian Paul else { 29447c652d77220610ecc19aaefa20876216b035e961Brian Paul GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7); 29457c652d77220610ecc19aaefa20876216b035e961Brian Paul GLubyte dstMask = 128; 29467c652d77220610ecc19aaefa20876216b035e961Brian Paul const GLubyte *s = src; 29477c652d77220610ecc19aaefa20876216b035e961Brian Paul GLubyte *d = dst; 29487c652d77220610ecc19aaefa20876216b035e961Brian Paul *d = 0; 29497c652d77220610ecc19aaefa20876216b035e961Brian Paul for (i = 0; i < width; i++) { 29507c652d77220610ecc19aaefa20876216b035e961Brian Paul if (*s & srcMask) { 29517c652d77220610ecc19aaefa20876216b035e961Brian Paul *d |= dstMask; 29527c652d77220610ecc19aaefa20876216b035e961Brian Paul } 29537c652d77220610ecc19aaefa20876216b035e961Brian Paul if (srcMask == 1) { 29547c652d77220610ecc19aaefa20876216b035e961Brian Paul srcMask = 128; 29557c652d77220610ecc19aaefa20876216b035e961Brian Paul s++; 29567c652d77220610ecc19aaefa20876216b035e961Brian Paul } 29577c652d77220610ecc19aaefa20876216b035e961Brian Paul else { 29587c652d77220610ecc19aaefa20876216b035e961Brian Paul srcMask = srcMask >> 1; 29597c652d77220610ecc19aaefa20876216b035e961Brian Paul } 29607c652d77220610ecc19aaefa20876216b035e961Brian Paul if (dstMask == 1) { 29617c652d77220610ecc19aaefa20876216b035e961Brian Paul dstMask = 128; 29627c652d77220610ecc19aaefa20876216b035e961Brian Paul d++; 29637c652d77220610ecc19aaefa20876216b035e961Brian Paul *d = 0; 29647c652d77220610ecc19aaefa20876216b035e961Brian Paul } 29657c652d77220610ecc19aaefa20876216b035e961Brian Paul else { 29667c652d77220610ecc19aaefa20876216b035e961Brian Paul dstMask = dstMask >> 1; 29677c652d77220610ecc19aaefa20876216b035e961Brian Paul } 29687c652d77220610ecc19aaefa20876216b035e961Brian Paul } 29697c652d77220610ecc19aaefa20876216b035e961Brian Paul } 29707c652d77220610ecc19aaefa20876216b035e961Brian Paul } 29717c652d77220610ecc19aaefa20876216b035e961Brian Paul src += width_in_bytes; 29727c652d77220610ecc19aaefa20876216b035e961Brian Paul } 29737c652d77220610ecc19aaefa20876216b035e961Brian Paul} 2974