pack.c revision fd41cbc557509a36ae513eb7170edffbaa5e5715
11c131752c3e07ef91f49d4970dafca6d26585334Brian Paul/* 21c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Mesa 3-D graphics library 31c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * 41c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 51c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Copyright (C) 2009-2010 VMware, Inc. All Rights Reserved. 61c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * 71c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Permission is hereby granted, free of charge, to any person obtaining a 81c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * copy of this software and associated documentation files (the "Software"), 91c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * to deal in the Software without restriction, including without limitation 101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * the rights to use, copy, modify, merge, publish, distribute, sublicense, 111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * and/or sell copies of the Software, and to permit persons to whom the 121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Software is furnished to do so, subject to the following conditions: 131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * 141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * The above copyright notice and this permission notice shall be included 151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * in all copies or substantial portions of the Software. 161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * 171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * THEA AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */ 241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul/** 271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * \file pack.c 281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Image and pixel span packing and unpacking. 291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */ 301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 321a8f6ac5a46dfbb8287ee2bacdd11c3a1a3a65c7José Fonseca/* 331a8f6ac5a46dfbb8287ee2bacdd11c3a1a3a65c7José Fonseca * XXX: MSVC takes forever to compile this module for x86_64 unless we disable 341a8f6ac5a46dfbb8287ee2bacdd11c3a1a3a65c7José Fonseca * this global optimization. 351a8f6ac5a46dfbb8287ee2bacdd11c3a1a3a65c7José Fonseca * 361a8f6ac5a46dfbb8287ee2bacdd11c3a1a3a65c7José Fonseca * See also: 371a8f6ac5a46dfbb8287ee2bacdd11c3a1a3a65c7José Fonseca * - http://msdn.microsoft.com/en-us/library/1yk3ydd7.aspx 381a8f6ac5a46dfbb8287ee2bacdd11c3a1a3a65c7José Fonseca * - http://msdn.microsoft.com/en-us/library/chh3fb0k.aspx 391a8f6ac5a46dfbb8287ee2bacdd11c3a1a3a65c7José Fonseca */ 401a8f6ac5a46dfbb8287ee2bacdd11c3a1a3a65c7José Fonseca#if defined(_MSC_VER) && defined(_M_X64) 411a8f6ac5a46dfbb8287ee2bacdd11c3a1a3a65c7José Fonseca# pragma optimize( "g", off ) 421a8f6ac5a46dfbb8287ee2bacdd11c3a1a3a65c7José Fonseca#endif 431a8f6ac5a46dfbb8287ee2bacdd11c3a1a3a65c7José Fonseca 441a8f6ac5a46dfbb8287ee2bacdd11c3a1a3a65c7José Fonseca 451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul#include "glheader.h" 461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul#include "colormac.h" 471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul#include "enums.h" 481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul#include "image.h" 49b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul#include "imports.h" 50b098e1af1cdaea8767b8f1416469cdd02a9c39a9Brian Paul#include "macros.h" 510117da40cd7edd3d165bb28569c289b37eca12b9Vinson Lee#include "mtypes.h" 521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul#include "pack.h" 531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul#include "pixeltransfer.h" 549d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák#include "imports.h" 559ad8f431b2a47060bf05517246ab0fa8d249c800Jordan Justen#include "glformats.h" 561271424615b62544662a606bb23f6d7117a8b0e7Marek Olšák#include "../../gallium/auxiliary/util/u_format_rgb9e5.h" 57631d23daa91c569bf268a2191bd466df73a64263Marek Olšák#include "../../gallium/auxiliary/util/u_format_r11g11b10f.h" 581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul/** 611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Flip the 8 bits in each byte of the given array. 621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * 631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * \param p array. 641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * \param n number of bytes. 651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * 661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * \todo try this trick to flip bytes someday: 671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * \code 681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555); 691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333); 701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f); 711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * \endcode 721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */ 731c131752c3e07ef91f49d4970dafca6d26585334Brian Paulstatic void 741c131752c3e07ef91f49d4970dafca6d26585334Brian Paulflip_bytes( GLubyte *p, GLuint n ) 751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{ 761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i, a, b; 771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul b = (GLuint) p[i]; /* words are often faster than bytes */ 791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul a = ((b & 0x01) << 7) | 801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul ((b & 0x02) << 5) | 811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul ((b & 0x04) << 3) | 821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul ((b & 0x08) << 1) | 831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul ((b & 0x10) >> 1) | 841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul ((b & 0x20) >> 3) | 851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul ((b & 0x40) >> 5) | 861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul ((b & 0x80) >> 7); 871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul p[i] = (GLubyte) a; 881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul} 901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul/* 941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Unpack a 32x32 pixel polygon stipple from user memory using the 951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * current pixel unpack settings. 961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */ 971c131752c3e07ef91f49d4970dafca6d26585334Brian Paulvoid 981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul_mesa_unpack_polygon_stipple( const GLubyte *pattern, GLuint dest[32], 991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const struct gl_pixelstore_attrib *unpacking ) 1001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{ 1011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte *ptrn = (GLubyte *) _mesa_unpack_bitmap(32, 32, pattern, unpacking); 1021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (ptrn) { 1031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* Convert pattern from GLubytes to GLuints and handle big/little 1041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * endian differences 1051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */ 1061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte *p = ptrn; 1071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLint i; 1081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < 32; i++) { 1091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dest[i] = (p[0] << 24) 1101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul | (p[1] << 16) 1111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul | (p[2] << 8) 1121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul | (p[3] ); 1131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul p += 4; 1141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 1151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul free(ptrn); 1161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 1171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul} 1181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 1191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 1201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul/* 1211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Pack polygon stipple into user memory given current pixel packing 1221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * settings. 1231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */ 1241c131752c3e07ef91f49d4970dafca6d26585334Brian Paulvoid 1251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul_mesa_pack_polygon_stipple( const GLuint pattern[32], GLubyte *dest, 1261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const struct gl_pixelstore_attrib *packing ) 1271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{ 1281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* Convert pattern from GLuints to GLubytes to handle big/little 1291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * endian differences. 1301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */ 1311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte ptrn[32*4]; 1321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLint i; 1331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < 32; i++) { 1341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul ptrn[i * 4 + 0] = (GLubyte) ((pattern[i] >> 24) & 0xff); 1351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul ptrn[i * 4 + 1] = (GLubyte) ((pattern[i] >> 16) & 0xff); 1361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul ptrn[i * 4 + 2] = (GLubyte) ((pattern[i] >> 8 ) & 0xff); 1371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul ptrn[i * 4 + 3] = (GLubyte) ((pattern[i] ) & 0xff); 1381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 1391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 1401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_pack_bitmap(32, 32, ptrn, dest, packing); 1411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul} 1421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 1431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 1441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul/* 1451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Unpack bitmap data. Resulting data will be in most-significant-bit-first 1461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * order with row alignment = 1 byte. 1471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */ 1481c131752c3e07ef91f49d4970dafca6d26585334Brian PaulGLvoid * 1491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul_mesa_unpack_bitmap( GLint width, GLint height, const GLubyte *pixels, 1501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const struct gl_pixelstore_attrib *packing ) 1511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{ 1521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLint bytes, row, width_in_bytes; 1531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte *buffer, *dst; 1541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 1551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (!pixels) 1561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul return NULL; 1571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 1581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* Alloc dest storage */ 1591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul bytes = ((width + 7) / 8 * height); 1601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul buffer = (GLubyte *) malloc( bytes ); 1611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (!buffer) 1621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul return NULL; 1631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 1641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul width_in_bytes = CEILING( width, 8 ); 1651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst = buffer; 1661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (row = 0; row < height; row++) { 1671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLubyte *src = (const GLubyte *) 1681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_image_address2d(packing, pixels, width, height, 1691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GL_COLOR_INDEX, GL_BITMAP, row, 0); 1701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (!src) { 1711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul free(buffer); 1721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul return NULL; 1731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 1741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 1751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if ((packing->SkipPixels & 7) == 0) { 1761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul memcpy( dst, src, width_in_bytes ); 1771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (packing->LsbFirst) { 1781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul flip_bytes( dst, width_in_bytes ); 1791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 1801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 1811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 1821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* handling SkipPixels is a bit tricky (no pun intended!) */ 1831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLint i; 1841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (packing->LsbFirst) { 1851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte srcMask = 1 << (packing->SkipPixels & 0x7); 1861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte dstMask = 128; 1871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLubyte *s = src; 1881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte *d = dst; 1891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *d = 0; 1901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < width; i++) { 1911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (*s & srcMask) { 1921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *d |= dstMask; 1931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 1941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (srcMask == 128) { 1951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcMask = 1; 1961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul s++; 1971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 1981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 1991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcMask = srcMask << 1; 2001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 2011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstMask == 1) { 2021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dstMask = 128; 2031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul d++; 2041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *d = 0; 2051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 2061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 2071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dstMask = dstMask >> 1; 2081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 2091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 2101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 2111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 2121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7); 2131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte dstMask = 128; 2141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLubyte *s = src; 2151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte *d = dst; 2161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *d = 0; 2171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < width; i++) { 2181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (*s & srcMask) { 2191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *d |= dstMask; 2201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 2211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (srcMask == 1) { 2221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcMask = 128; 2231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul s++; 2241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 2251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 2261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcMask = srcMask >> 1; 2271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 2281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstMask == 1) { 2291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dstMask = 128; 2301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul d++; 2311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *d = 0; 2321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 2331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 2341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dstMask = dstMask >> 1; 2351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 2361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 2371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 2381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 2391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst += width_in_bytes; 2401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 2411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 2421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul return buffer; 2431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul} 2441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 2451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 2461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul/* 2471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Pack bitmap data. 2481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */ 2491c131752c3e07ef91f49d4970dafca6d26585334Brian Paulvoid 2501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul_mesa_pack_bitmap( GLint width, GLint height, const GLubyte *source, 2511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte *dest, const struct gl_pixelstore_attrib *packing ) 2521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{ 2531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLint row, width_in_bytes; 2541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLubyte *src; 2551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 2561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (!source) 2571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul return; 2581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 2591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul width_in_bytes = CEILING( width, 8 ); 2601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul src = source; 2611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (row = 0; row < height; row++) { 2621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte *dst = (GLubyte *) _mesa_image_address2d(packing, dest, 2631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul width, height, GL_COLOR_INDEX, GL_BITMAP, row, 0); 2641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (!dst) 2651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul return; 2661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 2671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if ((packing->SkipPixels & 7) == 0) { 2681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul memcpy( dst, src, width_in_bytes ); 2691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (packing->LsbFirst) { 2701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul flip_bytes( dst, width_in_bytes ); 2711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 2721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 2731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 2741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* handling SkipPixels is a bit tricky (no pun intended!) */ 2751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLint i; 2761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (packing->LsbFirst) { 2771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte srcMask = 128; 2781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte dstMask = 1 << (packing->SkipPixels & 0x7); 2791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLubyte *s = src; 2801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte *d = dst; 2811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *d = 0; 2821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < width; i++) { 2831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (*s & srcMask) { 2841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *d |= dstMask; 2851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 2861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (srcMask == 1) { 2871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcMask = 128; 2881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul s++; 2891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 2901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 2911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcMask = srcMask >> 1; 2921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 2931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstMask == 128) { 2941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dstMask = 1; 2951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul d++; 2961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *d = 0; 2971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 2981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 2991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dstMask = dstMask << 1; 3001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 3011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 3021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 3031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 3041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte srcMask = 128; 3051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte dstMask = 128 >> (packing->SkipPixels & 0x7); 3061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLubyte *s = src; 3071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte *d = dst; 3081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *d = 0; 3091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < width; i++) { 3101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (*s & srcMask) { 3111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *d |= dstMask; 3121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 3131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (srcMask == 1) { 3141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcMask = 128; 3151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul s++; 3161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 3171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 3181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcMask = srcMask >> 1; 3191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 3201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstMask == 1) { 3211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dstMask = 128; 3221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul d++; 3231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *d = 0; 3241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 3251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 3261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dstMask = dstMask >> 1; 3271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 3281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 3291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 3301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 3311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul src += width_in_bytes; 3321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 3331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul} 3341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 3351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 336e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul/** 337e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul * Get indexes of color components for a basic color format, such as 338e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul * GL_RGBA, GL_RED, GL_LUMINANCE_ALPHA, etc. Return -1 for indexes 339e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul * that do not apply. 340e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul */ 341e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paulstatic void 342e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paulget_component_indexes(GLenum format, 343e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul GLint *redIndex, 344e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul GLint *greenIndex, 345e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul GLint *blueIndex, 346e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul GLint *alphaIndex, 347e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul GLint *luminanceIndex, 348e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul GLint *intensityIndex) 349e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul{ 350e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul *redIndex = -1; 351e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul *greenIndex = -1; 352e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul *blueIndex = -1; 353e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul *alphaIndex = -1; 354e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul *luminanceIndex = -1; 355e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul *intensityIndex = -1; 356e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul 357e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul switch (format) { 358e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_LUMINANCE: 359e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_LUMINANCE_INTEGER_EXT: 360e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul *luminanceIndex = 0; 361e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul break; 362e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_LUMINANCE_ALPHA: 363e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_LUMINANCE_ALPHA_INTEGER_EXT: 364e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul *luminanceIndex = 0; 365e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul *alphaIndex = 1; 366e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul break; 367e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_INTENSITY: 368e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul *intensityIndex = 0; 369e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul break; 370e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_RED: 371e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_RED_INTEGER_EXT: 372e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul *redIndex = 0; 373e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul break; 374e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_GREEN: 375e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_GREEN_INTEGER_EXT: 376e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul *greenIndex = 0; 377e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul break; 378e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_BLUE: 379e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_BLUE_INTEGER_EXT: 380e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul *blueIndex = 0; 381e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul break; 382e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_ALPHA: 383e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_ALPHA_INTEGER_EXT: 384e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul *alphaIndex = 0; 385e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul break; 386e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_RG: 387e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_RG_INTEGER: 388e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul *redIndex = 0; 389e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul *greenIndex = 1; 390e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul break; 391e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_RGB: 392e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_RGB_INTEGER_EXT: 393e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul *redIndex = 0; 394e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul *greenIndex = 1; 395e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul *blueIndex = 2; 396e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul break; 397e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_BGR: 398e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_BGR_INTEGER_EXT: 399e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul *blueIndex = 0; 400e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul *greenIndex = 1; 401e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul *redIndex = 2; 402e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul break; 403e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_RGBA: 404e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_RGBA_INTEGER_EXT: 405e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul *redIndex = 0; 406e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul *greenIndex = 1; 407e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul *blueIndex = 2; 408e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul *alphaIndex = 3; 409e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul break; 410e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_BGRA: 411e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_BGRA_INTEGER: 412e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul *redIndex = 2; 413e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul *greenIndex = 1; 414e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul *blueIndex = 0; 415e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul *alphaIndex = 3; 416e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul break; 417e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_ABGR_EXT: 418e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul *redIndex = 3; 419e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul *greenIndex = 2; 420e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul *blueIndex = 1; 421e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul *alphaIndex = 0; 422e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul break; 423e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_DU8DV8_ATI: 424e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_DUDV_ATI: 425e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul *redIndex = 0; 426e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul *greenIndex = 1; 427e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul break; 428e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul default: 429e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul assert(0 && "bad format in get_component_indexes()"); 430e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul } 431e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul} 432e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul 433e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul 4341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 435f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul/** 436f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul * For small integer types, return the min and max possible values. 437f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul * Used for clamping floats to unscaled integer types. 438f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul * \return GL_TRUE if type is handled, GL_FALSE otherwise. 439f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul */ 440f6dbb693d211feca9980437c54897ca6619e0a15Brian Paulstatic GLboolean 441f6dbb693d211feca9980437c54897ca6619e0a15Brian Paulget_type_min_max(GLenum type, GLfloat *min, GLfloat *max) 442f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul{ 443f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul switch (type) { 444f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_BYTE: 445f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul *min = -128.0; 446f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul *max = 127.0; 447f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul return GL_TRUE; 448f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_UNSIGNED_BYTE: 449f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul *min = 0.0; 450f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul *max = 255.0; 451f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul return GL_TRUE; 452f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_SHORT: 453f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul *min = -32768.0; 454f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul *max = 32767.0; 455f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul return GL_TRUE; 456f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_UNSIGNED_SHORT: 457f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul *min = 0.0; 458f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul *max = 65535.0; 459f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul return GL_TRUE; 460f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul default: 461f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul return GL_FALSE; 462f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 463f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul} 464f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul 4657ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen/* Customization of unsigned integer packing. 4668f9edbad6f972792a51234715aad83c406e1845dDave Airlie */ 467d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#define SRC_TYPE GLuint 468d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt 469d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#define DST_TYPE GLuint 470d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#define SRC_CONVERT(x) (x) 471d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#define FN_NAME pack_uint_from_uint_rgba 472d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#include "pack_tmp.h" 473d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#undef DST_TYPE 474d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#undef SRC_CONVERT 475d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#undef FN_NAME 476d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt 4777ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define DST_TYPE GLint 4787ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define SRC_CONVERT(x) MIN2(x, 0x7fffffff) 4797ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define FN_NAME pack_int_from_uint_rgba 4807ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#include "pack_tmp.h" 4817ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef DST_TYPE 4827ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef SRC_CONVERT 4837ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef FN_NAME 4847ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen 485d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#define DST_TYPE GLushort 4868b97bb02fb1a55a6b0fe558ea1eb97bb4dae0347Eric Anholt#define SRC_CONVERT(x) MIN2(x, 0xffff) 487d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#define FN_NAME pack_ushort_from_uint_rgba 488d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#include "pack_tmp.h" 489d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#undef DST_TYPE 490d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#undef SRC_CONVERT 491d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#undef FN_NAME 492d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt 493d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#define DST_TYPE GLshort 4948b97bb02fb1a55a6b0fe558ea1eb97bb4dae0347Eric Anholt#define SRC_CONVERT(x) CLAMP((int)x, -32768, 32767) 495d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#define FN_NAME pack_short_from_uint_rgba 496d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#include "pack_tmp.h" 497d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#undef DST_TYPE 498d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#undef SRC_CONVERT 499d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#undef FN_NAME 500d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt 501d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#define DST_TYPE GLubyte 5028b97bb02fb1a55a6b0fe558ea1eb97bb4dae0347Eric Anholt#define SRC_CONVERT(x) MIN2(x, 0xff) 503d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#define FN_NAME pack_ubyte_from_uint_rgba 504d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#include "pack_tmp.h" 505d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#undef DST_TYPE 506d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#undef SRC_CONVERT 507d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#undef FN_NAME 508d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt 509d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#define DST_TYPE GLbyte 5108b97bb02fb1a55a6b0fe558ea1eb97bb4dae0347Eric Anholt#define SRC_CONVERT(x) CLAMP((int)x, -128, 127) 511d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#define FN_NAME pack_byte_from_uint_rgba 512d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#include "pack_tmp.h" 513d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#undef DST_TYPE 514d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#undef SRC_CONVERT 515d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#undef FN_NAME 516d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt 5177ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef SRC_TYPE 5187ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen 519f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justenstatic void 520f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen_pack_rgba_span_from_uints_problem(struct gl_context *ctx, 521f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLenum dstFormat, GLenum dstType) 522f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen{ 523f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen _mesa_problem(ctx, 524f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen "Unsupported type (%s) / format (%s) " 525f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen "in _mesa_pack_rgba_span_from_uints", 526f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen _mesa_lookup_enum_by_nr(dstType), 527f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen _mesa_lookup_enum_by_nr(dstFormat)); 528f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen} 529f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen 5308f9edbad6f972792a51234715aad83c406e1845dDave Airlievoid 5317ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen_mesa_pack_rgba_span_from_uints(struct gl_context *ctx, GLuint n, GLuint rgba[][4], 5327ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen GLenum dstFormat, GLenum dstType, 5337ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen GLvoid *dstAddr) 5348f9edbad6f972792a51234715aad83c406e1845dDave Airlie{ 535f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLuint i; 536f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen 5378f9edbad6f972792a51234715aad83c406e1845dDave Airlie switch(dstType) { 538d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt case GL_UNSIGNED_INT: 5398c265cf5ef47ac8ae8565456d8ac023d6c847d57Jordan Justen pack_uint_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n); 5408f9edbad6f972792a51234715aad83c406e1845dDave Airlie break; 541d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt case GL_INT: 5427ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen pack_int_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n); 543d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt break; 544d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt case GL_UNSIGNED_SHORT: 5458c265cf5ef47ac8ae8565456d8ac023d6c847d57Jordan Justen pack_ushort_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n); 546d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt break; 547d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt case GL_SHORT: 5488c265cf5ef47ac8ae8565456d8ac023d6c847d57Jordan Justen pack_short_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n); 549d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt break; 550d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt case GL_UNSIGNED_BYTE: 5518c265cf5ef47ac8ae8565456d8ac023d6c847d57Jordan Justen pack_ubyte_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n); 552d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt break; 553d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt case GL_BYTE: 5548c265cf5ef47ac8ae8565456d8ac023d6c847d57Jordan Justen pack_byte_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n); 5558f9edbad6f972792a51234715aad83c406e1845dDave Airlie break; 556f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen case GL_UNSIGNED_BYTE_3_3_2: 557f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) { 558f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLubyte *dst = (GLubyte *) dstAddr; 559f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 560f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][RCOMP], 0, 7) << 5) 561f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 7) << 2) 562f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 3) ); 563f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 564f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } else { 565f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 566f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 567f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen break; 568f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen case GL_UNSIGNED_BYTE_2_3_3_REV: 569f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) { 570f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLubyte *dst = (GLubyte *) dstAddr; 571f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 572f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][RCOMP], 0, 7) ) 573f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 7) << 3) 574f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 3) << 6); 575f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 576f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } else { 577f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 578f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 579f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen break; 580f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen case GL_UNSIGNED_SHORT_5_6_5: 581f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) { 582f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLushort *dst = (GLushort *) dstAddr; 583f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 584f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31) << 11) 585f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 63) << 5) 586f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 31) ); 587f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 588f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } else { 589f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 590f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 591f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen break; 592f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen case GL_UNSIGNED_SHORT_5_6_5_REV: 593f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) { 594f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLushort *dst = (GLushort *) dstAddr; 595f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 596f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31) ) 597f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 63) << 5) 598f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 31) << 11); 599f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 600f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } else { 601f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 602f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 603f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen break; 604f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen case GL_UNSIGNED_SHORT_4_4_4_4: 605f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 606f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLushort *dst = (GLushort *) dstAddr; 607f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 608f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][RCOMP], 0, 15) << 12) 609f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 15) << 8) 610f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 15) << 4) 611f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][ACOMP], 0, 15) ); 612f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 613f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 614f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 615f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLushort *dst = (GLushort *) dstAddr; 616f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 617f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][BCOMP], 0, 15) << 12) 618f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 15) << 8) 619f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][RCOMP], 0, 15) << 4) 620f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][ACOMP], 0, 15) ); 621f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 622f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 623f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen else if (dstFormat == GL_ABGR_EXT) { 624f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLushort *dst = (GLushort *) dstAddr; 625f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 626f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][ACOMP], 0, 15) << 12) 627f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 15) << 8) 628f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 15) << 4) 629f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][RCOMP], 0, 15) ); 630f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 631f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } else { 632f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 633f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 634f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen break; 635f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen case GL_UNSIGNED_SHORT_4_4_4_4_REV: 636f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 637f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLushort *dst = (GLushort *) dstAddr; 638f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 639f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][RCOMP], 0, 15) ) 640f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 15) << 4) 641f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 15) << 8) 642f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][ACOMP], 0, 15) << 12); 643f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 644f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 645f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 646f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLushort *dst = (GLushort *) dstAddr; 647f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 648f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][BCOMP], 0, 15) ) 649f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 15) << 4) 650f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][RCOMP], 0, 15) << 8) 651f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][ACOMP], 0, 15) << 12); 652f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 653f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 654f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen else if (dstFormat == GL_ABGR_EXT) { 655f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLushort *dst = (GLushort *) dstAddr; 656f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 657f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][ACOMP], 0, 15) ) 658f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 15) << 4) 659f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 15) << 8) 660f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][RCOMP], 0, 15) << 12); 661f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 662f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } else { 663f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 664f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 665f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen break; 666f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen case GL_UNSIGNED_SHORT_5_5_5_1: 667f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 668f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLushort *dst = (GLushort *) dstAddr; 669f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 670f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31) << 11) 671f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 31) << 6) 672f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 31) << 1) 673f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][ACOMP], 0, 1) ); 674f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 675f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 676f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 677f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLushort *dst = (GLushort *) dstAddr; 678f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 679f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][BCOMP], 0, 31) << 11) 680f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 31) << 6) 681f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][RCOMP], 0, 31) << 1) 682f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][ACOMP], 0, 1) ); 683f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 684f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 685f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen else if (dstFormat == GL_ABGR_EXT) { 686f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLushort *dst = (GLushort *) dstAddr; 687f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 688f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][ACOMP], 0, 31) << 11) 689f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 31) << 6) 690f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 31) << 1) 691f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][RCOMP], 0, 1) ); 692f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 693f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } else { 694f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 695f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 696f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen break; 697f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen case GL_UNSIGNED_SHORT_1_5_5_5_REV: 698f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 699f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLushort *dst = (GLushort *) dstAddr; 700f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 701f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31) ) 702f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 31) << 5) 703f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 31) << 10) 704f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][ACOMP], 0, 1) << 15); 705f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 706f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 707f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 708f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLushort *dst = (GLushort *) dstAddr; 709f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 710f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][BCOMP], 0, 31) ) 711f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 31) << 5) 712f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][RCOMP], 0, 31) << 10) 713f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][ACOMP], 0, 1) << 15); 714f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 715f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 716f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen else if (dstFormat == GL_ABGR_EXT) { 717f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLushort *dst = (GLushort *) dstAddr; 718f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 719f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][ACOMP], 0, 31) ) 720f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 31) << 5) 721f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 31) << 10) 722f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][RCOMP], 0, 1) << 15); 723f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 724f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } else { 725f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 726f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 727f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen break; 728f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen case GL_UNSIGNED_INT_8_8_8_8: 729f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 730f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLuint *dst = (GLuint *) dstAddr; 731f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 732f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][RCOMP], 0, 255) << 24) 733f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 255) << 16) 734f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 255) << 8) 735f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][ACOMP], 0, 255) ); 736f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 737f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 738f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 739f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLuint *dst = (GLuint *) dstAddr; 740f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 741f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][BCOMP], 0, 255) << 24) 742f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 255) << 16) 743f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][RCOMP], 0, 255) << 8) 744f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][ACOMP], 0, 255) ); 745f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 746f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 747f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen else if (dstFormat == GL_ABGR_EXT) { 748f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLuint *dst = (GLuint *) dstAddr; 749f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 750f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][ACOMP], 0, 255) << 24) 751f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 255) << 16) 752f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 255) << 8) 753f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][RCOMP], 0, 255) ); 754f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 755f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } else { 756f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 757f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 758f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen break; 759f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen case GL_UNSIGNED_INT_8_8_8_8_REV: 760f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 761f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLuint *dst = (GLuint *) dstAddr; 762f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 763f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][RCOMP], 0, 255) ) 764f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 255) << 8) 765f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 255) << 16) 766f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][ACOMP], 0, 255) << 24); 767f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 768f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 769f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 770f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLuint *dst = (GLuint *) dstAddr; 771f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 772f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][BCOMP], 0, 255) ) 773f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 255) << 8) 774f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][RCOMP], 0, 255) << 16) 775f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][ACOMP], 0, 255) << 24); 776f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 777f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 778f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen else if (dstFormat == GL_ABGR_EXT) { 779f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLuint *dst = (GLuint *) dstAddr; 780f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 781f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][ACOMP], 0, 255) ) 782f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 255) << 8) 783f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 255) << 16) 784f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][RCOMP], 0, 255) << 24); 785f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 786f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } else { 787f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 788f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 789f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen break; 790f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen case GL_UNSIGNED_INT_10_10_10_2: 791f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 792f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLuint *dst = (GLuint *) dstAddr; 793f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 794f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][RCOMP], 0, 1023) << 22) 795f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 1023) << 12) 796f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 1023) << 2) 797f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][ACOMP], 0, 3) ); 798f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 799f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 800f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 801f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLuint *dst = (GLuint *) dstAddr; 802f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 803f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][BCOMP], 0, 1023) << 22) 804f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 1023) << 12) 805f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][RCOMP], 0, 1023) << 2) 806f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][ACOMP], 0, 3) ); 807f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 808f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 809f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen else if (dstFormat == GL_ABGR_EXT) { 810f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLuint *dst = (GLuint *) dstAddr; 811f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 812f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][ACOMP], 0, 1023) << 22) 813f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 1023) << 12) 814f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 1023) << 2) 815f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][RCOMP], 0, 3) ); 816f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 817f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } else { 818f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 819f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 820f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen break; 821f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen case GL_UNSIGNED_INT_2_10_10_10_REV: 822f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 823f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLuint *dst = (GLuint *) dstAddr; 824f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 825f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][RCOMP], 0, 1023) ) 826f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 1023) << 10) 827f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 1023) << 20) 828f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][ACOMP], 0, 3) << 30); 829f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 830f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 831f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 832f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLuint *dst = (GLuint *) dstAddr; 833f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 834f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][BCOMP], 0, 1023) ) 835f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 1023) << 10) 836f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][RCOMP], 0, 1023) << 20) 837f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][ACOMP], 0, 3) << 30); 838f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 839f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 840f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen else if (dstFormat == GL_ABGR_EXT) { 841f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLuint *dst = (GLuint *) dstAddr; 842f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 843f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][ACOMP], 0, 1023) ) 844f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 1023) << 10) 845f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 1023) << 20) 846f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][RCOMP], 0, 3) << 30); 847f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 848f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } else { 849f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 850f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 851f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen break; 8527ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen default: 853f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 8547ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen return; 8557ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen } 8567ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen} 8577ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen 8587ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen 8597ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen/* Customization of signed integer packing. 8607ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen */ 8617ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define SRC_TYPE GLint 8627ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen 8637ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define DST_TYPE GLuint 8647ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define SRC_CONVERT(x) MAX2(x, 0) 8657ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define FN_NAME pack_uint_from_int_rgba 8667ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#include "pack_tmp.h" 8677ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef DST_TYPE 8687ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef SRC_CONVERT 8697ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef FN_NAME 8707ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen 8717ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define DST_TYPE GLushort 8727ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define SRC_CONVERT(x) MAX2(x, 0) 8737ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define FN_NAME pack_ushort_from_int_rgba 8747ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#include "pack_tmp.h" 8757ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef DST_TYPE 8767ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef SRC_CONVERT 8777ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef FN_NAME 8787ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen 8797ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define DST_TYPE GLshort 8807ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define SRC_CONVERT(x) CLAMP(x, -0x8000, 0x7fff) 8817ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define FN_NAME pack_short_from_int_rgba 8827ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#include "pack_tmp.h" 8837ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef DST_TYPE 8847ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef SRC_CONVERT 8857ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef FN_NAME 8867ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen 8877ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define DST_TYPE GLubyte 8887ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define SRC_CONVERT(x) MAX2(x, 0) 8897ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define FN_NAME pack_ubyte_from_int_rgba 8907ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#include "pack_tmp.h" 8917ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef DST_TYPE 8927ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef SRC_CONVERT 8937ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef FN_NAME 8947ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen 8957ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define DST_TYPE GLbyte 8967ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define SRC_CONVERT(x) CLAMP(x, -0x80, 0x7f) 8977ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define FN_NAME pack_byte_from_int_rgba 8987ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#include "pack_tmp.h" 8997ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef DST_TYPE 9007ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef SRC_CONVERT 9017ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef FN_NAME 9027ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen 9037ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef SRC_TYPE 9047ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen 905f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justenstatic void 906f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen_pack_rgba_span_from_ints_problem(struct gl_context *ctx, 907f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLenum dstFormat, GLenum dstType) 908f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen{ 909f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen _mesa_problem(ctx, 910f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen "Unsupported type (%s) / format (%s) " 911f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen "in _mesa_pack_rgba_span_from_ints", 912f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen _mesa_lookup_enum_by_nr(dstType), 913f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen _mesa_lookup_enum_by_nr(dstFormat)); 914f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen} 915f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen 9167ef270867cb1f3e19067c93449e48987a32730d3Jordan Justenvoid 9177ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen_mesa_pack_rgba_span_from_ints(struct gl_context *ctx, GLuint n, GLint rgba[][4], 9187ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen GLenum dstFormat, GLenum dstType, 9197ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen GLvoid *dstAddr) 9207ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen{ 921f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLuint i; 9227ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen 9237ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen switch(dstType) { 9247ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen case GL_UNSIGNED_INT: 9257ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen pack_uint_from_int_rgba(ctx, dstAddr, dstFormat, rgba, n); 9267ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen break; 9277ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen case GL_INT: 9287ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen /* No conversion necessary. */ 929fd41cbc557509a36ae513eb7170edffbaa5e5715Brian Paul pack_uint_from_uint_rgba(ctx, dstAddr, dstFormat, (GLuint (*)[4]) rgba, n); 9307ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen break; 9317ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen case GL_UNSIGNED_SHORT: 9327ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen pack_ushort_from_int_rgba(ctx, dstAddr, dstFormat, rgba, n); 9337ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen break; 9347ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen case GL_SHORT: 9357ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen pack_short_from_int_rgba(ctx, dstAddr, dstFormat, rgba, n); 9367ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen break; 9377ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen case GL_UNSIGNED_BYTE: 9387ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen pack_ubyte_from_int_rgba(ctx, dstAddr, dstFormat, rgba, n); 9397ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen break; 9407ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen case GL_BYTE: 9417ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen pack_byte_from_int_rgba(ctx, dstAddr, dstFormat, rgba, n); 9427ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen break; 943f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen case GL_UNSIGNED_BYTE_3_3_2: 944f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) { 945f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLubyte *dst = (GLubyte *) dstAddr; 946f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 947f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][RCOMP], 0, 7) << 5) 948f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 7) << 2) 949f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 3) ); 950f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 951f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } else { 952f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 953f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 954f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen break; 955f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen case GL_UNSIGNED_BYTE_2_3_3_REV: 956f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) { 957f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLubyte *dst = (GLubyte *) dstAddr; 958f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 959f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][RCOMP], 0, 7) ) 960f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 7) << 3) 961f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 3) << 6); 962f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 963f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } else { 964f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 965f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 966f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen break; 967f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen case GL_UNSIGNED_SHORT_5_6_5: 968f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) { 969f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLushort *dst = (GLushort *) dstAddr; 970f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 971f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31) << 11) 972f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 63) << 5) 973f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 31) ); 974f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 975f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } else { 976f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 977f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 978f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen break; 979f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen case GL_UNSIGNED_SHORT_5_6_5_REV: 980f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) { 981f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLushort *dst = (GLushort *) dstAddr; 982f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 983f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31) ) 984f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 63) << 5) 985f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 31) << 11); 986f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 987f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } else { 988f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 989f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 990f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen break; 991f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen case GL_UNSIGNED_SHORT_4_4_4_4: 992f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 993f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLushort *dst = (GLushort *) dstAddr; 994f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 995f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][RCOMP], 0, 15) << 12) 996f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 15) << 8) 997f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 15) << 4) 998f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][ACOMP], 0, 15) ); 999f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1000f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1001f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 1002f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLushort *dst = (GLushort *) dstAddr; 1003f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 1004f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][BCOMP], 0, 15) << 12) 1005f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 15) << 8) 1006f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][RCOMP], 0, 15) << 4) 1007f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][ACOMP], 0, 15) ); 1008f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1009f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1010f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen else if (dstFormat == GL_ABGR_EXT) { 1011f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLushort *dst = (GLushort *) dstAddr; 1012f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 1013f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][ACOMP], 0, 15) << 12) 1014f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 15) << 8) 1015f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 15) << 4) 1016f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][RCOMP], 0, 15) ); 1017f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1018f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } else { 1019f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 1020f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1021f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen break; 1022f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen case GL_UNSIGNED_SHORT_4_4_4_4_REV: 1023f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 1024f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLushort *dst = (GLushort *) dstAddr; 1025f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 1026f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][RCOMP], 0, 15) ) 1027f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 15) << 4) 1028f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 15) << 8) 1029f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][ACOMP], 0, 15) << 12); 1030f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1031f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1032f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 1033f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLushort *dst = (GLushort *) dstAddr; 1034f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 1035f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][BCOMP], 0, 15) ) 1036f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 15) << 4) 1037f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][RCOMP], 0, 15) << 8) 1038f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][ACOMP], 0, 15) << 12); 1039f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1040f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1041f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen else if (dstFormat == GL_ABGR_EXT) { 1042f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLushort *dst = (GLushort *) dstAddr; 1043f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 1044f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][ACOMP], 0, 15) ) 1045f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 15) << 4) 1046f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 15) << 8) 1047f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][RCOMP], 0, 15) << 12); 1048f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1049f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } else { 1050f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 1051f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1052f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen break; 1053f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen case GL_UNSIGNED_SHORT_5_5_5_1: 1054f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 1055f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLushort *dst = (GLushort *) dstAddr; 1056f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 1057f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31) << 11) 1058f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 31) << 6) 1059f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 31) << 1) 1060f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][ACOMP], 0, 1) ); 1061f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1062f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1063f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 1064f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLushort *dst = (GLushort *) dstAddr; 1065f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 1066f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][BCOMP], 0, 31) << 11) 1067f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 31) << 6) 1068f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][RCOMP], 0, 31) << 1) 1069f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][ACOMP], 0, 1) ); 1070f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1071f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1072f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen else if (dstFormat == GL_ABGR_EXT) { 1073f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLushort *dst = (GLushort *) dstAddr; 1074f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 1075f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][ACOMP], 0, 31) << 11) 1076f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 31) << 6) 1077f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 31) << 1) 1078f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][RCOMP], 0, 1) ); 1079f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1080f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } else { 1081f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 1082f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1083f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen break; 1084f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen case GL_UNSIGNED_SHORT_1_5_5_5_REV: 1085f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 1086f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLushort *dst = (GLushort *) dstAddr; 1087f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 1088f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31) ) 1089f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 31) << 5) 1090f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 31) << 10) 1091f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][ACOMP], 0, 1) << 15); 1092f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1093f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1094f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 1095f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLushort *dst = (GLushort *) dstAddr; 1096f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 1097f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][BCOMP], 0, 31) ) 1098f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 31) << 5) 1099f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][RCOMP], 0, 31) << 10) 1100f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][ACOMP], 0, 1) << 15); 1101f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1102f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1103f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen else if (dstFormat == GL_ABGR_EXT) { 1104f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLushort *dst = (GLushort *) dstAddr; 1105f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 1106f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][ACOMP], 0, 31) ) 1107f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 31) << 5) 1108f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 31) << 10) 1109f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][RCOMP], 0, 1) << 15); 1110f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1111f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } else { 1112f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 1113f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1114f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen break; 1115f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen case GL_UNSIGNED_INT_8_8_8_8: 1116f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 1117f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLuint *dst = (GLuint *) dstAddr; 1118f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 1119f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][RCOMP], 0, 255) << 24) 1120f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 255) << 16) 1121f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 255) << 8) 1122f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][ACOMP], 0, 255) ); 1123f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1124f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1125f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 1126f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLuint *dst = (GLuint *) dstAddr; 1127f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 1128f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][BCOMP], 0, 255) << 24) 1129f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 255) << 16) 1130f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][RCOMP], 0, 255) << 8) 1131f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][ACOMP], 0, 255) ); 1132f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1133f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1134f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen else if (dstFormat == GL_ABGR_EXT) { 1135f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLuint *dst = (GLuint *) dstAddr; 1136f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 1137f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][ACOMP], 0, 255) << 24) 1138f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 255) << 16) 1139f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 255) << 8) 1140f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][RCOMP], 0, 255) ); 1141f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1142f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } else { 1143f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 1144f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1145f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen break; 1146f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen case GL_UNSIGNED_INT_8_8_8_8_REV: 1147f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 1148f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLuint *dst = (GLuint *) dstAddr; 1149f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 1150f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][RCOMP], 0, 255) ) 1151f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 255) << 8) 1152f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 255) << 16) 1153f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][ACOMP], 0, 255) << 24); 1154f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1155f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1156f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 1157f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLuint *dst = (GLuint *) dstAddr; 1158f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 1159f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][BCOMP], 0, 255) ) 1160f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 255) << 8) 1161f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][RCOMP], 0, 255) << 16) 1162f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][ACOMP], 0, 255) << 24); 1163f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1164f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1165f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen else if (dstFormat == GL_ABGR_EXT) { 1166f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLuint *dst = (GLuint *) dstAddr; 1167f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 1168f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][ACOMP], 0, 255) ) 1169f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 255) << 8) 1170f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 255) << 16) 1171f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][RCOMP], 0, 255) << 24); 1172f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1173f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } else { 1174f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 1175f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1176f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen break; 1177f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen case GL_UNSIGNED_INT_10_10_10_2: 1178f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 1179f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLuint *dst = (GLuint *) dstAddr; 1180f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 1181f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][RCOMP], 0, 1023) << 22) 1182f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 1023) << 12) 1183f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 1023) << 2) 1184f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][ACOMP], 0, 3) ); 1185f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1186f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1187f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 1188f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLuint *dst = (GLuint *) dstAddr; 1189f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 1190f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][BCOMP], 0, 1023) << 22) 1191f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 1023) << 12) 1192f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][RCOMP], 0, 1023) << 2) 1193f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][ACOMP], 0, 3) ); 1194f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1195f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1196f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen else if (dstFormat == GL_ABGR_EXT) { 1197f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLuint *dst = (GLuint *) dstAddr; 1198f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 1199f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][ACOMP], 0, 1023) << 22) 1200f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 1023) << 12) 1201f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 1023) << 2) 1202f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][RCOMP], 0, 3) ); 1203f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1204f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } else { 1205f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 1206f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1207f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen break; 1208f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen case GL_UNSIGNED_INT_2_10_10_10_REV: 1209f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 1210f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLuint *dst = (GLuint *) dstAddr; 1211f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 1212f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][RCOMP], 0, 1023) ) 1213f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 1023) << 10) 1214f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 1023) << 20) 1215f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][ACOMP], 0, 3) << 30); 1216f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1217f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1218f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 1219f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLuint *dst = (GLuint *) dstAddr; 1220f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 1221f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][BCOMP], 0, 1023) ) 1222f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 1023) << 10) 1223f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][RCOMP], 0, 1023) << 20) 1224f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][ACOMP], 0, 3) << 30); 1225f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1226f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1227f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen else if (dstFormat == GL_ABGR_EXT) { 1228f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen GLuint *dst = (GLuint *) dstAddr; 1229f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen for (i=0;i<n;i++) { 1230f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen dst[i] = (CLAMP(rgba[i][ACOMP], 0, 1023) ) 1231f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][BCOMP], 0, 1023) << 10) 1232f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][GCOMP], 0, 1023) << 20) 1233f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen | (CLAMP(rgba[i][RCOMP], 0, 3) << 30); 1234f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1235f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } else { 1236f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 1237f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen } 1238f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen break; 12398f9edbad6f972792a51234715aad83c406e1845dDave Airlie default: 1240f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 12418f9edbad6f972792a51234715aad83c406e1845dDave Airlie return; 12428f9edbad6f972792a51234715aad83c406e1845dDave Airlie } 12438f9edbad6f972792a51234715aad83c406e1845dDave Airlie} 12441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 12451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 12461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul/** 12471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Used to pack an array [][4] of RGBA float colors as specified 1248f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul * by the dstFormat, dstType and dstPacking. Used by glReadPixels. 1249f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul * Historically, the RGBA values were in [0,1] and rescaled to fit 1250f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul * into GLubytes, etc. But with new integer formats, the RGBA values 1251f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul * may have any value and we don't always rescale when converting to 1252f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul * integers. 1253f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul * 12541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Note: the rgba values will be modified by this function when any pixel 12551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * transfer ops are enabled. 12561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */ 12571c131752c3e07ef91f49d4970dafca6d26585334Brian Paulvoid 12581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul_mesa_pack_rgba_span_float(struct gl_context *ctx, GLuint n, GLfloat rgba[][4], 12591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLenum dstFormat, GLenum dstType, 12601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLvoid *dstAddr, 12611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const struct gl_pixelstore_attrib *dstPacking, 12621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLbitfield transferOps) 12631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{ 126436b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul GLfloat *luminance; 12651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLint comps = _mesa_components_in_format(dstFormat); 12669ad8f431b2a47060bf05517246ab0fa8d249c800Jordan Justen const GLboolean intDstFormat = _mesa_is_enum_format_integer(dstFormat); 12671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 12681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 126936b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul if (dstFormat == GL_LUMINANCE || 127036b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul dstFormat == GL_LUMINANCE_ALPHA || 127136b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul dstFormat == GL_LUMINANCE_INTEGER_EXT || 127236b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul dstFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT) { 127336b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul luminance = (GLfloat *) malloc(n * sizeof(GLfloat)); 127436b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul if (!luminance) { 127536b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing"); 127636b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul return; 127736b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul } 127836b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul } 127936b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul else { 128036b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul luminance = NULL; 128136b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul } 128236b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul 12831ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie /* EXT_texture_integer specifies no transfer ops on integer 12841ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie * types in the resolved issues section. Just set them to 0 12851ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie * for integer surfaces. 12861ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie */ 12871ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie if (intDstFormat) 12881ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie transferOps = 0; 12891ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie 12901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (transferOps) { 12911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba); 12921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 12931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 1294f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul /* 1295f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul * Component clamping (besides clamping to [0,1] in 1296f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul * _mesa_apply_rgba_transfer_ops()). 1297f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul */ 1298f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul if (intDstFormat) { 1299f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul /* clamping to dest type's min/max values */ 1300f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul GLfloat min, max; 1301f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul if (get_type_min_max(dstType, &min, &max)) { 1302f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i = 0; i < n; i++) { 1303f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], min, max); 1304f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], min, max); 1305f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], min, max); 1306f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], min, max); 1307f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1308f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1309f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1310f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul else if (dstFormat == GL_LUMINANCE || dstFormat == GL_LUMINANCE_ALPHA) { 13111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* compute luminance values */ 13121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (transferOps & IMAGE_CLAMP_BIT) { 13131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 13141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLfloat sum = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP]; 13151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul luminance[i] = CLAMP(sum, 0.0F, 1.0F); 13161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 13171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 13181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 13191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 13201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul luminance[i] = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP]; 13211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 13221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 13231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 13241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 13251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* 13261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Pack/store the pixels. Ugh! Lots of cases!!! 13271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */ 13281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul switch (dstType) { 13291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_BYTE: 13301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 13311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte *dst = (GLubyte *) dstAddr; 13321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul switch (dstFormat) { 13331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_RED: 13341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 13351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 13361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 13371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_GREEN: 13381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 13391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 13401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 13411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_BLUE: 13421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 13431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 13441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 13451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_ALPHA: 13461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 13471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 13481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 13491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_LUMINANCE: 13501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 13511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = FLOAT_TO_UBYTE(luminance[i]); 13521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 13531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_LUMINANCE_ALPHA: 13541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 13551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*2+0] = FLOAT_TO_UBYTE(luminance[i]); 13561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 13571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 13581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 1359f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_RG: 1360f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1361f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*2+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1362f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1363f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1364f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 13651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_RGB: 13661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 13671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 13681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 13691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 13701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 13711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 13721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_RGBA: 13731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 13741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 13751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 13761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 13771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 13781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 13791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 13801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_BGR: 13811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 13821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 13831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 13841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 13851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 13861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 13871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_BGRA: 13881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 13891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 13901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 13911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 13921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 13931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 13941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 13951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_ABGR_EXT: 13961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 13971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 13981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 13991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 14001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 14011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 14021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 1403f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_RED_INTEGER_EXT: 1404f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1405f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i] = (GLubyte) rgba[i][RCOMP]; 1406f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1407f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 1408f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_GREEN_INTEGER_EXT: 1409f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1410f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i] = (GLubyte) rgba[i][GCOMP]; 1411f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1412f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 1413f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_BLUE_INTEGER_EXT: 1414f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1415f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i] = (GLubyte) rgba[i][BCOMP]; 1416f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1417f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 1418f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_ALPHA_INTEGER_EXT: 1419f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1420f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i] = (GLubyte) rgba[i][ACOMP]; 1421f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1422f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 14230e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick case GL_RG_INTEGER: 14240e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick for (i=0;i<n;i++) { 14250e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick dst[i*2+0] = (GLubyte) rgba[i][RCOMP]; 14260e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick dst[i*2+1] = (GLubyte) rgba[i][GCOMP]; 14270e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick } 14280e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick break; 1429f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_RGB_INTEGER_EXT: 1430f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1431f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*3+0] = (GLubyte) rgba[i][RCOMP]; 1432f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*3+1] = (GLubyte) rgba[i][GCOMP]; 1433f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*3+2] = (GLubyte) rgba[i][BCOMP]; 1434f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1435f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 1436f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_RGBA_INTEGER_EXT: 1437f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1438f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+0] = (GLubyte) rgba[i][RCOMP]; 1439f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+1] = (GLubyte) rgba[i][GCOMP]; 1440f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+2] = (GLubyte) rgba[i][BCOMP]; 1441f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+3] = (GLubyte) rgba[i][ACOMP]; 1442f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1443f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 1444f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_BGR_INTEGER_EXT: 1445f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1446f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*3+0] = (GLubyte) rgba[i][BCOMP]; 1447f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*3+1] = (GLubyte) rgba[i][GCOMP]; 1448f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*3+2] = (GLubyte) rgba[i][RCOMP]; 1449f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1450f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 1451f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_BGRA_INTEGER_EXT: 1452f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1453f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+0] = (GLubyte) rgba[i][BCOMP]; 1454f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+1] = (GLubyte) rgba[i][GCOMP]; 1455f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+2] = (GLubyte) rgba[i][RCOMP]; 1456f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+3] = (GLubyte) rgba[i][ACOMP]; 1457f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1458f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 1459f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_LUMINANCE_INTEGER_EXT: 1460f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1461f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*2+0] = (GLubyte) (rgba[i][RCOMP] + 1462f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul rgba[i][GCOMP] + 1463f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul rgba[i][BCOMP]); 1464f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*2+1] = (GLubyte) rgba[i][ACOMP]; 1465f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1466f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 1467f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_LUMINANCE_ALPHA_INTEGER_EXT: 1468f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1469f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i] = (GLubyte) (rgba[i][RCOMP] + 1470f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul rgba[i][GCOMP] + 1471f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul rgba[i][BCOMP]); 1472f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1473f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 14741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_DUDV_ATI: 14751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_DU8DV8_ATI: 14761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 14771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*2+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 14781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 14791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 14801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 14811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul default: 14821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 14831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 14841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 14851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 14861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_BYTE: 14871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 14881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLbyte *dst = (GLbyte *) dstAddr; 14891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul switch (dstFormat) { 14901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_RED: 14911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 14921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 14931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 14941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_GREEN: 14951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 14961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 14971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 14981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_BLUE: 14991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 15001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 15011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 15021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_ALPHA: 15031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 15041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 15051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 15061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_LUMINANCE: 15071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 15081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = FLOAT_TO_BYTE(luminance[i]); 15091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 15101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_LUMINANCE_ALPHA: 15111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 15121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*2+0] = FLOAT_TO_BYTE(luminance[i]); 15131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 15141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 15151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 1516f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_RG: 1517f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1518f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*2+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1519f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1520f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1521f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 15221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_RGB: 15231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 15241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 15251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 15261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 15271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 15281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 15291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_RGBA: 15301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 15311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 15321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 15331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 15341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 15351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 15361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 15371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_BGR: 15381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 15391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 15401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 15411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 15421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 15431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 15441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_BGRA: 15451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 15461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 15471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 15481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 15491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 15501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 15511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 15521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_ABGR_EXT: 15531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 15541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 15551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 15561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 15571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 15581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 15591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 1560f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_RED_INTEGER_EXT: 1561f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1562f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i] = (GLbyte) rgba[i][RCOMP]; 1563f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1564f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 1565f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_GREEN_INTEGER_EXT: 1566f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1567f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i] = (GLbyte) rgba[i][GCOMP]; 1568f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1569f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 1570f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_BLUE_INTEGER_EXT: 1571f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1572f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i] = (GLbyte) rgba[i][BCOMP]; 1573f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1574f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 1575f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_ALPHA_INTEGER_EXT: 1576f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1577f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i] = (GLbyte) rgba[i][ACOMP]; 1578f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1579f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 15800e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick case GL_RG_INTEGER: 15810e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick for (i=0;i<n;i++) { 15820e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick dst[i*2+0] = (GLbyte) rgba[i][RCOMP]; 15830e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick dst[i*2+1] = (GLbyte) rgba[i][GCOMP]; 15840e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick } 15850e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick break; 1586f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_RGB_INTEGER_EXT: 1587f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1588f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*3+0] = (GLbyte) rgba[i][RCOMP]; 1589f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*3+1] = (GLbyte) rgba[i][GCOMP]; 1590f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*3+2] = (GLbyte) rgba[i][BCOMP]; 1591f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1592f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 1593f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_RGBA_INTEGER_EXT: 1594f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1595f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+0] = (GLbyte) rgba[i][RCOMP]; 1596f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+1] = (GLbyte) rgba[i][GCOMP]; 1597f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+2] = (GLbyte) rgba[i][BCOMP]; 1598f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+3] = (GLbyte) rgba[i][ACOMP]; 1599f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1600f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 1601f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_BGR_INTEGER_EXT: 1602f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1603f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*3+0] = (GLbyte) rgba[i][BCOMP]; 1604f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*3+1] = (GLbyte) rgba[i][GCOMP]; 1605f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*3+2] = (GLbyte) rgba[i][RCOMP]; 1606f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1607f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 1608f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_BGRA_INTEGER_EXT: 1609f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1610f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+0] = (GLbyte) rgba[i][BCOMP]; 1611f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+1] = (GLbyte) rgba[i][GCOMP]; 1612f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+2] = (GLbyte) rgba[i][RCOMP]; 1613f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+3] = (GLbyte) rgba[i][ACOMP]; 1614f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1615f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 1616f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_LUMINANCE_INTEGER_EXT: 1617f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1618f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*2+0] = (GLbyte) (rgba[i][RCOMP] + 1619f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul rgba[i][GCOMP] + 1620f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul rgba[i][BCOMP]); 1621f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*2+1] = (GLbyte) rgba[i][ACOMP]; 1622f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1623f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 1624f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_LUMINANCE_ALPHA_INTEGER_EXT: 1625f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1626f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i] = (GLbyte) (rgba[i][RCOMP] + 1627f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul rgba[i][GCOMP] + 1628f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul rgba[i][BCOMP]); 1629f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1630f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 16311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_DUDV_ATI: 16321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_DU8DV8_ATI: 16331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 16341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*2+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 16351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 16361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 16371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 16381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul default: 16391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 16401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 16411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 16421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 16431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_SHORT: 16441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 16451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLushort *dst = (GLushort *) dstAddr; 16461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul switch (dstFormat) { 16471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_RED: 16481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 16491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][RCOMP]); 16501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 16511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_GREEN: 16521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 16531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][GCOMP]); 16541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 16551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_BLUE: 16561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 16571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][BCOMP]); 16581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 16591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_ALPHA: 16601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 16611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][ACOMP]); 16621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 16631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_LUMINANCE: 16641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 16651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul UNCLAMPED_FLOAT_TO_USHORT(dst[i], luminance[i]); 16661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 16671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_LUMINANCE_ALPHA: 16681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 16691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul UNCLAMPED_FLOAT_TO_USHORT(dst[i*2+0], luminance[i]); 16701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul CLAMPED_FLOAT_TO_USHORT(dst[i*2+1], rgba[i][ACOMP]); 16711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 16721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 1673f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_RG: 1674f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1675f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul CLAMPED_FLOAT_TO_USHORT(dst[i*2+0], rgba[i][RCOMP]); 1676f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul CLAMPED_FLOAT_TO_USHORT(dst[i*2+1], rgba[i][GCOMP]); 1677f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1678f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 16791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_RGB: 16801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 16811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul CLAMPED_FLOAT_TO_USHORT(dst[i*3+0], rgba[i][RCOMP]); 16821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul CLAMPED_FLOAT_TO_USHORT(dst[i*3+1], rgba[i][GCOMP]); 16831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul CLAMPED_FLOAT_TO_USHORT(dst[i*3+2], rgba[i][BCOMP]); 16841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 16851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 16861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_RGBA: 16871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 16881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][RCOMP]); 16891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][GCOMP]); 16901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][BCOMP]); 16911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][ACOMP]); 16921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 16931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 16941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_BGR: 16951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 16961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul CLAMPED_FLOAT_TO_USHORT(dst[i*3+0], rgba[i][BCOMP]); 16971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul CLAMPED_FLOAT_TO_USHORT(dst[i*3+1], rgba[i][GCOMP]); 16981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul CLAMPED_FLOAT_TO_USHORT(dst[i*3+2], rgba[i][RCOMP]); 16991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 17001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 17011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_BGRA: 17021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 17031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][BCOMP]); 17041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][GCOMP]); 17051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][RCOMP]); 17061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][ACOMP]); 17071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 17081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 17091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_ABGR_EXT: 17101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 17111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][ACOMP]); 17121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][BCOMP]); 17131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][GCOMP]); 17141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][RCOMP]); 17151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 17161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 1717f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_RED_INTEGER_EXT: 1718f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1719f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i] = (GLushort) rgba[i][RCOMP]; 1720f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1721f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 1722f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_GREEN_INTEGER_EXT: 1723f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1724f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i] = (GLushort) rgba[i][GCOMP]; 1725f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1726f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 1727f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_BLUE_INTEGER_EXT: 1728f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1729f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i] = (GLushort) rgba[i][BCOMP]; 1730f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1731f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 1732f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_ALPHA_INTEGER_EXT: 1733f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1734f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i] = (GLushort) rgba[i][ACOMP]; 1735f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1736f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 17370e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick case GL_RG_INTEGER: 17380e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick for (i=0;i<n;i++) { 17390e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick dst[i*2+0] = (GLushort) rgba[i][RCOMP]; 17400e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick dst[i*2+1] = (GLushort) rgba[i][GCOMP]; 17410e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick } 17420e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick break; 1743f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_RGB_INTEGER_EXT: 1744f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1745f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*3+0] = (GLushort) rgba[i][RCOMP]; 1746f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*3+1] = (GLushort) rgba[i][GCOMP]; 1747f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*3+2] = (GLushort) rgba[i][BCOMP]; 1748f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1749f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 1750f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_RGBA_INTEGER_EXT: 1751f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1752f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+0] = (GLushort) rgba[i][RCOMP]; 1753f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+1] = (GLushort) rgba[i][GCOMP]; 1754f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+2] = (GLushort) rgba[i][BCOMP]; 1755f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+3] = (GLushort) rgba[i][ACOMP]; 1756f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1757f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 1758f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_BGR_INTEGER_EXT: 1759f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1760f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*3+0] = (GLushort) rgba[i][BCOMP]; 1761f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*3+1] = (GLushort) rgba[i][GCOMP]; 1762f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*3+2] = (GLushort) rgba[i][RCOMP]; 1763f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1764f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 1765f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_BGRA_INTEGER_EXT: 1766f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1767f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+0] = (GLushort) rgba[i][BCOMP]; 1768f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+1] = (GLushort) rgba[i][GCOMP]; 1769f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+2] = (GLushort) rgba[i][RCOMP]; 1770f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+3] = (GLushort) rgba[i][ACOMP]; 1771f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1772f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 1773f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_LUMINANCE_INTEGER_EXT: 1774f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1775f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*2+0] = (GLushort) (rgba[i][RCOMP] + 1776f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul rgba[i][GCOMP] + 1777f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul rgba[i][BCOMP]); 1778f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*2+1] = (GLushort) rgba[i][ACOMP]; 1779f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1780f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 1781f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_LUMINANCE_ALPHA_INTEGER_EXT: 1782f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1783f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i] = (GLushort) (rgba[i][RCOMP] + 1784f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul rgba[i][GCOMP] + 1785f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul rgba[i][BCOMP]); 1786f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1787f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 17881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_DUDV_ATI: 17891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_DU8DV8_ATI: 17901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 17911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*2+0] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 17921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*2+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 17931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 17941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 17951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul default: 17961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 17971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 17981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 17991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 18001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_SHORT: 18011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 18021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLshort *dst = (GLshort *) dstAddr; 18031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul switch (dstFormat) { 18041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_RED: 18051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 18061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 18071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 18081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_GREEN: 18091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 18101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 18111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 18121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_BLUE: 18131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 18141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 18151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 18161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_ALPHA: 18171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 18181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 18191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 18201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_LUMINANCE: 18211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 18221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = FLOAT_TO_SHORT(luminance[i]); 18231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 18241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_LUMINANCE_ALPHA: 18251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 18261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*2+0] = FLOAT_TO_SHORT(luminance[i]); 18271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 18281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 18291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 1830f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_RG: 1831f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1832f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*2+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1833f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1834f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1835f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 18361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_RGB: 18371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 18381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 18391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 18401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 18411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 18421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 18431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_RGBA: 18441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 18451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 18461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 18471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 18481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 18491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 18501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 18511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_BGR: 18521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 18531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 18541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 18551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 18561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 18571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 18581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_BGRA: 18591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 18601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 18611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 18621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 18631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 18641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 18651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 18661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_ABGR_EXT: 18671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 18681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 18691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 18701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 18711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 18721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 18731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 1874f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_RED_INTEGER_EXT: 1875f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1876f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i] = (GLshort) rgba[i][RCOMP]; 1877f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1878f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 1879f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_GREEN_INTEGER_EXT: 1880f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1881f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i] = (GLshort) rgba[i][GCOMP]; 1882f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1883f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 1884f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_BLUE_INTEGER_EXT: 1885f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1886f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i] = (GLshort) rgba[i][BCOMP]; 1887f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1888f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 1889f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_ALPHA_INTEGER_EXT: 1890f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1891f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i] = (GLshort) rgba[i][ACOMP]; 1892f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1893f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 18940e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick case GL_RG_INTEGER: 18950e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick for (i=0;i<n;i++) { 18962e8f8cb383320b83ba5d85c27808ac2d841834e6Ian Romanick dst[i*2+0] = (GLshort) rgba[i][RCOMP]; 18972e8f8cb383320b83ba5d85c27808ac2d841834e6Ian Romanick dst[i*2+1] = (GLshort) rgba[i][GCOMP]; 18980e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick } 18990e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick break; 1900f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_RGB_INTEGER_EXT: 1901f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1902f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*3+0] = (GLshort) rgba[i][RCOMP]; 1903f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*3+1] = (GLshort) rgba[i][GCOMP]; 1904f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*3+2] = (GLshort) rgba[i][BCOMP]; 1905f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1906f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 1907f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_RGBA_INTEGER_EXT: 1908f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1909f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+0] = (GLshort) rgba[i][RCOMP]; 1910f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+1] = (GLshort) rgba[i][GCOMP]; 1911f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+2] = (GLshort) rgba[i][BCOMP]; 1912f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+3] = (GLshort) rgba[i][ACOMP]; 1913f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1914f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 1915f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_BGR_INTEGER_EXT: 1916f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1917f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*3+0] = (GLshort) rgba[i][BCOMP]; 1918f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*3+1] = (GLshort) rgba[i][GCOMP]; 1919f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*3+2] = (GLshort) rgba[i][RCOMP]; 1920f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1921f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 1922f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_BGRA_INTEGER_EXT: 1923f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1924f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+0] = (GLshort) rgba[i][BCOMP]; 1925f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+1] = (GLshort) rgba[i][GCOMP]; 1926f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+2] = (GLshort) rgba[i][RCOMP]; 1927f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+3] = (GLshort) rgba[i][ACOMP]; 1928f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1929f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 1930f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_LUMINANCE_INTEGER_EXT: 1931f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1932f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*2+0] = (GLshort) (rgba[i][RCOMP] + 1933f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul rgba[i][GCOMP] + 1934f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul rgba[i][BCOMP]); 1935f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*2+1] = (GLshort) rgba[i][ACOMP]; 1936f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1937f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 1938f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_LUMINANCE_ALPHA_INTEGER_EXT: 1939f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1940f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i] = (GLshort) (rgba[i][RCOMP] + 1941f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul rgba[i][GCOMP] + 1942f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul rgba[i][BCOMP]); 1943f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1944f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 19451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_DUDV_ATI: 19461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_DU8DV8_ATI: 19471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 19481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*2+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 19491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 19501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 19511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 19521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul default: 19531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 19541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 19551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 19561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 19571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_INT: 19581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 19591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint *dst = (GLuint *) dstAddr; 19601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul switch (dstFormat) { 19611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_RED: 19621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 19631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = FLOAT_TO_UINT(rgba[i][RCOMP]); 19641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 19651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_GREEN: 19661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 19671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = FLOAT_TO_UINT(rgba[i][GCOMP]); 19681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 19691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_BLUE: 19701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 19711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = FLOAT_TO_UINT(rgba[i][BCOMP]); 19721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 19731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_ALPHA: 19741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 19751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = FLOAT_TO_UINT(rgba[i][ACOMP]); 19761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 19771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_LUMINANCE: 19781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 19791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = FLOAT_TO_UINT(luminance[i]); 19801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 19811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_LUMINANCE_ALPHA: 19821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 19831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*2+0] = FLOAT_TO_UINT(luminance[i]); 19841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*2+1] = FLOAT_TO_UINT(rgba[i][ACOMP]); 19851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 19861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 1987f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_RG: 1988f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 1989f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*2+0] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1990f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*2+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1991f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 1992f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 19931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_RGB: 19941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 19951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+0] = FLOAT_TO_UINT(rgba[i][RCOMP]); 19961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 19971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+2] = FLOAT_TO_UINT(rgba[i][BCOMP]); 19981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 19991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 20001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_RGBA: 20011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 20021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+0] = FLOAT_TO_UINT(rgba[i][RCOMP]); 20031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 20041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+2] = FLOAT_TO_UINT(rgba[i][BCOMP]); 20051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]); 20061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 20071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 20081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_BGR: 20091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 20101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+0] = FLOAT_TO_UINT(rgba[i][BCOMP]); 20111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 20121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+2] = FLOAT_TO_UINT(rgba[i][RCOMP]); 20131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 20141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 20151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_BGRA: 20161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 20171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+0] = FLOAT_TO_UINT(rgba[i][BCOMP]); 20181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 20191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+2] = FLOAT_TO_UINT(rgba[i][RCOMP]); 20201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]); 20211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 20221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 20231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_ABGR_EXT: 20241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 20251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+0] = FLOAT_TO_UINT(rgba[i][ACOMP]); 20261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+1] = FLOAT_TO_UINT(rgba[i][BCOMP]); 20271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+2] = FLOAT_TO_UINT(rgba[i][GCOMP]); 20281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+3] = FLOAT_TO_UINT(rgba[i][RCOMP]); 20291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 20301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 2031f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_RED_INTEGER_EXT: 2032f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 2033f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i] = (GLuint) rgba[i][RCOMP]; 2034f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 2035f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 2036f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_GREEN_INTEGER_EXT: 2037f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 2038f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i] = (GLuint) rgba[i][GCOMP]; 2039f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 2040f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 2041f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_BLUE_INTEGER_EXT: 2042f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 2043f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i] = (GLuint) rgba[i][BCOMP]; 2044f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 2045f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 2046f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_ALPHA_INTEGER_EXT: 2047f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 2048f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i] = (GLuint) rgba[i][ACOMP]; 2049f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 2050f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 20510e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick case GL_RG_INTEGER: 20520e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick for (i=0;i<n;i++) { 20530e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick dst[i*2+0] = (GLuint) rgba[i][RCOMP]; 20540e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick dst[i*2+1] = (GLuint) rgba[i][GCOMP]; 20550e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick } 20560e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick break; 2057f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_RGB_INTEGER_EXT: 2058f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 2059f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*3+0] = (GLuint) rgba[i][RCOMP]; 2060f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*3+1] = (GLuint) rgba[i][GCOMP]; 2061f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*3+2] = (GLuint) rgba[i][BCOMP]; 2062f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 2063f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 2064f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_RGBA_INTEGER_EXT: 2065f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 2066f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+0] = (GLuint) rgba[i][RCOMP]; 2067f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+1] = (GLuint) rgba[i][GCOMP]; 2068f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+2] = (GLuint) rgba[i][BCOMP]; 2069f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+3] = (GLuint) rgba[i][ACOMP]; 2070f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 2071f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 2072f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_BGR_INTEGER_EXT: 2073f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 2074f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*3+0] = (GLuint) rgba[i][BCOMP]; 2075f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*3+1] = (GLuint) rgba[i][GCOMP]; 2076f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*3+2] = (GLuint) rgba[i][RCOMP]; 2077f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 2078f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 2079f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_BGRA_INTEGER_EXT: 2080f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 2081f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+0] = (GLuint) rgba[i][BCOMP]; 2082f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+1] = (GLuint) rgba[i][GCOMP]; 2083f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+2] = (GLuint) rgba[i][RCOMP]; 2084f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+3] = (GLuint) rgba[i][ACOMP]; 2085f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 2086f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 2087f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_LUMINANCE_INTEGER_EXT: 2088f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 2089f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*2+0] = (GLuint) (rgba[i][RCOMP] + 2090f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul rgba[i][GCOMP] + 2091f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul rgba[i][BCOMP]); 2092f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*2+1] = (GLuint) rgba[i][ACOMP]; 2093f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 2094f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 2095f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_LUMINANCE_ALPHA_INTEGER_EXT: 2096f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 2097f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i] = (GLuint) (rgba[i][RCOMP] + 2098f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul rgba[i][GCOMP] + 2099f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul rgba[i][BCOMP]); 2100f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 2101f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 21021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_DUDV_ATI: 21031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_DU8DV8_ATI: 21041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 21051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*2+0] = FLOAT_TO_UINT(rgba[i][RCOMP]); 21061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*2+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 21071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 21081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 21091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul default: 21101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 21111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 21121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 21131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 21141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_INT: 21151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 21161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLint *dst = (GLint *) dstAddr; 21171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul switch (dstFormat) { 21181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_RED: 21191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 21201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = FLOAT_TO_INT(rgba[i][RCOMP]); 21211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 21221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_GREEN: 21231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 21241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = FLOAT_TO_INT(rgba[i][GCOMP]); 21251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 21261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_BLUE: 21271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 21281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = FLOAT_TO_INT(rgba[i][BCOMP]); 21291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 21301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_ALPHA: 21311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 21321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = FLOAT_TO_INT(rgba[i][ACOMP]); 21331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 21341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_LUMINANCE: 21351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 21361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = FLOAT_TO_INT(luminance[i]); 21371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 21381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_LUMINANCE_ALPHA: 21391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 21401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*2+0] = FLOAT_TO_INT(luminance[i]); 21411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*2+1] = FLOAT_TO_INT(rgba[i][ACOMP]); 21421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 21431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 2144f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_RG: 2145f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 2146f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*2+0] = FLOAT_TO_INT(rgba[i][RCOMP]); 2147f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*2+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 2148f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 2149f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 21501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_RGB: 21511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 21521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+0] = FLOAT_TO_INT(rgba[i][RCOMP]); 21531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 21541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+2] = FLOAT_TO_INT(rgba[i][BCOMP]); 21551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 21561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 21571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_RGBA: 21581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 21591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+0] = FLOAT_TO_INT(rgba[i][RCOMP]); 21601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 21611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+2] = FLOAT_TO_INT(rgba[i][BCOMP]); 21621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]); 21631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 21641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 21651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_BGR: 21661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 21671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+0] = FLOAT_TO_INT(rgba[i][BCOMP]); 21681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 21691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+2] = FLOAT_TO_INT(rgba[i][RCOMP]); 21701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 21711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 21721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_BGRA: 21731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 21741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+0] = FLOAT_TO_INT(rgba[i][BCOMP]); 21751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 21761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+2] = FLOAT_TO_INT(rgba[i][RCOMP]); 21771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]); 21781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 21791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 21801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_ABGR_EXT: 21811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 21821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+0] = FLOAT_TO_INT(rgba[i][ACOMP]); 21831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+1] = FLOAT_TO_INT(rgba[i][BCOMP]); 21841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+2] = FLOAT_TO_INT(rgba[i][GCOMP]); 21851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+3] = FLOAT_TO_INT(rgba[i][RCOMP]); 21861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 21871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 21881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_DUDV_ATI: 21891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_DU8DV8_ATI: 21901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 21911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*2+0] = FLOAT_TO_INT(rgba[i][RCOMP]); 21921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*2+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 21931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 21941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 2195f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_RED_INTEGER_EXT: 2196f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 2197f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i] = (GLint) rgba[i][RCOMP]; 2198f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 2199f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 2200f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_GREEN_INTEGER_EXT: 2201f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 2202f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i] = (GLint) rgba[i][GCOMP]; 2203f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 2204f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 2205f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_BLUE_INTEGER_EXT: 2206f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 2207f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i] = (GLint) rgba[i][BCOMP]; 2208f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 2209f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 2210f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_ALPHA_INTEGER_EXT: 2211f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 2212f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i] = (GLint) rgba[i][ACOMP]; 2213f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 2214f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 22150e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick case GL_RG_INTEGER: 22160e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick for (i=0;i<n;i++) { 22170e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick dst[i*2+0] = (GLint) rgba[i][RCOMP]; 22180e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick dst[i*2+1] = (GLint) rgba[i][GCOMP]; 22190e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick } 22200e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick break; 2221f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_RGB_INTEGER_EXT: 2222f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 2223f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*3+0] = (GLint) rgba[i][RCOMP]; 2224f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*3+1] = (GLint) rgba[i][GCOMP]; 2225f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*3+2] = (GLint) rgba[i][BCOMP]; 2226f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 2227f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 2228f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_RGBA_INTEGER_EXT: 2229f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 2230f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+0] = (GLint) rgba[i][RCOMP]; 2231f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+1] = (GLint) rgba[i][GCOMP]; 2232f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+2] = (GLint) rgba[i][BCOMP]; 2233f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+3] = (GLint) rgba[i][ACOMP]; 2234f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 2235f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 2236f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_BGR_INTEGER_EXT: 2237f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 2238f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*3+0] = (GLint) rgba[i][BCOMP]; 2239f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*3+1] = (GLint) rgba[i][GCOMP]; 2240f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*3+2] = (GLint) rgba[i][RCOMP]; 2241f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 2242f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 2243f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_BGRA_INTEGER_EXT: 2244f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 2245f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+0] = (GLint) rgba[i][BCOMP]; 2246f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+1] = (GLint) rgba[i][GCOMP]; 2247f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+2] = (GLint) rgba[i][RCOMP]; 2248f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*4+3] = (GLint) rgba[i][ACOMP]; 2249f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 2250f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 2251f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_LUMINANCE_INTEGER_EXT: 2252f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 2253f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*2+0] = (GLint) (rgba[i][RCOMP] + 2254f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul rgba[i][GCOMP] + 2255f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul rgba[i][BCOMP]); 2256f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*2+1] = (GLint) rgba[i][ACOMP]; 2257f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 2258f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 2259f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_LUMINANCE_ALPHA_INTEGER_EXT: 2260f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 2261f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i] = (GLint) (rgba[i][RCOMP] + 2262f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul rgba[i][GCOMP] + 2263f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul rgba[i][BCOMP]); 2264f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 2265f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 22661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul default: 22671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 22681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 22691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 22701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 22711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_FLOAT: 22721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 22731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLfloat *dst = (GLfloat *) dstAddr; 22741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul switch (dstFormat) { 22751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_RED: 22761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 22771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = rgba[i][RCOMP]; 22781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 22791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_GREEN: 22801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 22811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = rgba[i][GCOMP]; 22821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 22831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_BLUE: 22841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 22851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = rgba[i][BCOMP]; 22861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 22871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_ALPHA: 22881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 22891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = rgba[i][ACOMP]; 22901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 22911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_LUMINANCE: 22921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 22931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = luminance[i]; 22941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 22951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_LUMINANCE_ALPHA: 22961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 22971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*2+0] = luminance[i]; 22981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*2+1] = rgba[i][ACOMP]; 22991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 23001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 2301f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_RG: 2302f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 2303f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*2+0] = rgba[i][RCOMP]; 2304f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*2+1] = rgba[i][GCOMP]; 2305f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 2306f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 23071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_RGB: 23081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 23091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+0] = rgba[i][RCOMP]; 23101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+1] = rgba[i][GCOMP]; 23111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+2] = rgba[i][BCOMP]; 23121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 23131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 23141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_RGBA: 23151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 23161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+0] = rgba[i][RCOMP]; 23171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+1] = rgba[i][GCOMP]; 23181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+2] = rgba[i][BCOMP]; 23191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+3] = rgba[i][ACOMP]; 23201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 23211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 23221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_BGR: 23231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 23241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+0] = rgba[i][BCOMP]; 23251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+1] = rgba[i][GCOMP]; 23261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+2] = rgba[i][RCOMP]; 23271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 23281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 23291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_BGRA: 23301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 23311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+0] = rgba[i][BCOMP]; 23321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+1] = rgba[i][GCOMP]; 23331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+2] = rgba[i][RCOMP]; 23341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+3] = rgba[i][ACOMP]; 23351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 23361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 23371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_ABGR_EXT: 23381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 23391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+0] = rgba[i][ACOMP]; 23401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+1] = rgba[i][BCOMP]; 23411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+2] = rgba[i][GCOMP]; 23421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+3] = rgba[i][RCOMP]; 23431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 23441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 23451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_DUDV_ATI: 23461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_DU8DV8_ATI: 23471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 23481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*2+0] = rgba[i][RCOMP]; 23491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*2+1] = rgba[i][GCOMP]; 23501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 23511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 23521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul default: 23531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 23541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 23551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 23561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 23571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_HALF_FLOAT_ARB: 23581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 23591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLhalfARB *dst = (GLhalfARB *) dstAddr; 23601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul switch (dstFormat) { 23611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_RED: 23621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 23631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = _mesa_float_to_half(rgba[i][RCOMP]); 23641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 23651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_GREEN: 23661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 23671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = _mesa_float_to_half(rgba[i][GCOMP]); 23681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 23691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_BLUE: 23701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 23711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = _mesa_float_to_half(rgba[i][BCOMP]); 23721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 23731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_ALPHA: 23741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 23751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = _mesa_float_to_half(rgba[i][ACOMP]); 23761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 23771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_LUMINANCE: 23781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) 23791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = _mesa_float_to_half(luminance[i]); 23801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 23811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_LUMINANCE_ALPHA: 23821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 23831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*2+0] = _mesa_float_to_half(luminance[i]); 23841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*2+1] = _mesa_float_to_half(rgba[i][ACOMP]); 23851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 23861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 2387f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul case GL_RG: 2388f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul for (i=0;i<n;i++) { 2389f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*2+0] = _mesa_float_to_half(rgba[i][RCOMP]); 2390f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul dst[i*2+1] = _mesa_float_to_half(rgba[i][GCOMP]); 2391f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul } 2392f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul break; 23931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_RGB: 23941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 23951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+0] = _mesa_float_to_half(rgba[i][RCOMP]); 23961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]); 23971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+2] = _mesa_float_to_half(rgba[i][BCOMP]); 23981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 23991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 24001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_RGBA: 24011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 24021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+0] = _mesa_float_to_half(rgba[i][RCOMP]); 24031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]); 24041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+2] = _mesa_float_to_half(rgba[i][BCOMP]); 24051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]); 24061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 24071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 24081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_BGR: 24091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 24101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+0] = _mesa_float_to_half(rgba[i][BCOMP]); 24111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]); 24121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*3+2] = _mesa_float_to_half(rgba[i][RCOMP]); 24131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 24141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 24151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_BGRA: 24161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 24171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+0] = _mesa_float_to_half(rgba[i][BCOMP]); 24181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]); 24191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+2] = _mesa_float_to_half(rgba[i][RCOMP]); 24201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]); 24211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 24221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 24231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_ABGR_EXT: 24241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 24251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+0] = _mesa_float_to_half(rgba[i][ACOMP]); 24261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+1] = _mesa_float_to_half(rgba[i][BCOMP]); 24271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+2] = _mesa_float_to_half(rgba[i][GCOMP]); 24281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*4+3] = _mesa_float_to_half(rgba[i][RCOMP]); 24291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 24301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 24311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_DUDV_ATI: 24321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_DU8DV8_ATI: 24331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 24341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*2+0] = _mesa_float_to_half(rgba[i][RCOMP]); 24351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i*2+1] = _mesa_float_to_half(rgba[i][GCOMP]); 24361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 24371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 24381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul default: 24391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 24401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 24411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 24421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 24431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_BYTE_3_3_2: 24441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstFormat == GL_RGB) { 24451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte *dst = (GLubyte *) dstAddr; 24461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 2447c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul dst[i] = (F_TO_I(rgba[i][RCOMP] * 7.0F) << 5) 2448c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][GCOMP] * 7.0F) << 2) 2449c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][BCOMP] * 3.0F) ); 24501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 24511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 24521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 24531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_BYTE_2_3_3_REV: 24541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstFormat == GL_RGB) { 24551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte *dst = (GLubyte *) dstAddr; 24561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 2457c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul dst[i] = (F_TO_I(rgba[i][RCOMP] * 7.0F) ) 2458c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][GCOMP] * 7.0F) << 3) 2459c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][BCOMP] * 3.0F) << 6); 24601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 24611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 24621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 24631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_SHORT_5_6_5: 24641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstFormat == GL_RGB) { 24651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLushort *dst = (GLushort *) dstAddr; 24661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 2467c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul dst[i] = (F_TO_I(rgba[i][RCOMP] * 31.0F) << 11) 2468c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][GCOMP] * 63.0F) << 5) 2469c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][BCOMP] * 31.0F) ); 24701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 24711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 24721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 24731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_SHORT_5_6_5_REV: 24741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstFormat == GL_RGB) { 24751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLushort *dst = (GLushort *) dstAddr; 24761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 2477c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul dst[i] = (F_TO_I(rgba[i][RCOMP] * 31.0F) ) 2478c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][GCOMP] * 63.0F) << 5) 2479c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][BCOMP] * 31.0F) << 11); 24801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 24811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 24821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 24831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_SHORT_4_4_4_4: 24841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstFormat == GL_RGBA) { 24851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLushort *dst = (GLushort *) dstAddr; 24861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 2487c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul dst[i] = (F_TO_I(rgba[i][RCOMP] * 15.0F) << 12) 2488c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][GCOMP] * 15.0F) << 8) 2489c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][BCOMP] * 15.0F) << 4) 2490c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][ACOMP] * 15.0F) ); 24911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 24921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 24931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else if (dstFormat == GL_BGRA) { 24941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLushort *dst = (GLushort *) dstAddr; 24951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 2496c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul dst[i] = (F_TO_I(rgba[i][BCOMP] * 15.0F) << 12) 2497c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][GCOMP] * 15.0F) << 8) 2498c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][RCOMP] * 15.0F) << 4) 2499c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][ACOMP] * 15.0F) ); 25001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 25011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 25021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else if (dstFormat == GL_ABGR_EXT) { 25031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLushort *dst = (GLushort *) dstAddr; 25041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 2505c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul dst[i] = (F_TO_I(rgba[i][ACOMP] * 15.0F) << 12) 2506c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][BCOMP] * 15.0F) << 8) 2507c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][GCOMP] * 15.0F) << 4) 2508c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][RCOMP] * 15.0F) ); 25091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 25101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 25111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 25121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_SHORT_4_4_4_4_REV: 25131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstFormat == GL_RGBA) { 25141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLushort *dst = (GLushort *) dstAddr; 25151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 2516c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul dst[i] = (F_TO_I(rgba[i][RCOMP] * 15.0F) ) 2517c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][GCOMP] * 15.0F) << 4) 2518c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][BCOMP] * 15.0F) << 8) 2519c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][ACOMP] * 15.0F) << 12); 25201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 25211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 25221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else if (dstFormat == GL_BGRA) { 25231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLushort *dst = (GLushort *) dstAddr; 25241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 2525c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul dst[i] = (F_TO_I(rgba[i][BCOMP] * 15.0F) ) 2526c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][GCOMP] * 15.0F) << 4) 2527c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][RCOMP] * 15.0F) << 8) 2528c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][ACOMP] * 15.0F) << 12); 25291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 25301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 25311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else if (dstFormat == GL_ABGR_EXT) { 25321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLushort *dst = (GLushort *) dstAddr; 25331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 2534c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul dst[i] = (F_TO_I(rgba[i][ACOMP] * 15.0F) ) 2535c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][BCOMP] * 15.0F) << 4) 2536c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][GCOMP] * 15.0F) << 8) 2537c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][RCOMP] * 15.0F) << 12); 25381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 25391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 25401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 25411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_SHORT_5_5_5_1: 25421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstFormat == GL_RGBA) { 25431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLushort *dst = (GLushort *) dstAddr; 25441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 2545c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul dst[i] = (F_TO_I(rgba[i][RCOMP] * 31.0F) << 11) 2546c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][GCOMP] * 31.0F) << 6) 2547c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][BCOMP] * 31.0F) << 1) 2548c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][ACOMP] * 1.0F) ); 25491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 25501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 25511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else if (dstFormat == GL_BGRA) { 25521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLushort *dst = (GLushort *) dstAddr; 25531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 2554c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul dst[i] = (F_TO_I(rgba[i][BCOMP] * 31.0F) << 11) 2555c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][GCOMP] * 31.0F) << 6) 2556c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][RCOMP] * 31.0F) << 1) 2557c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][ACOMP] * 1.0F) ); 25581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 25591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 25601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else if (dstFormat == GL_ABGR_EXT) { 25611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLushort *dst = (GLushort *) dstAddr; 25621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 2563c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul dst[i] = (F_TO_I(rgba[i][ACOMP] * 31.0F) << 11) 2564c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][BCOMP] * 31.0F) << 6) 2565c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][GCOMP] * 31.0F) << 1) 2566c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][RCOMP] * 1.0F) ); 25671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 25681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 25691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 25701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_SHORT_1_5_5_5_REV: 25711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstFormat == GL_RGBA) { 25721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLushort *dst = (GLushort *) dstAddr; 25731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 2574c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul dst[i] = (F_TO_I(rgba[i][RCOMP] * 31.0F) ) 2575c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][GCOMP] * 31.0F) << 5) 2576c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][BCOMP] * 31.0F) << 10) 2577c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][ACOMP] * 1.0F) << 15); 25781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 25791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 25801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else if (dstFormat == GL_BGRA) { 25811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLushort *dst = (GLushort *) dstAddr; 25821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 2583c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul dst[i] = (F_TO_I(rgba[i][BCOMP] * 31.0F) ) 2584c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][GCOMP] * 31.0F) << 5) 2585c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][RCOMP] * 31.0F) << 10) 2586c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][ACOMP] * 1.0F) << 15); 25871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 25881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 25891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else if (dstFormat == GL_ABGR_EXT) { 25901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLushort *dst = (GLushort *) dstAddr; 25911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 2592c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul dst[i] = (F_TO_I(rgba[i][ACOMP] * 31.0F) ) 2593c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][BCOMP] * 31.0F) << 5) 2594c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][GCOMP] * 31.0F) << 10) 2595c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][RCOMP] * 1.0F) << 15); 25961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 25971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 25981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 25991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_INT_8_8_8_8: 26001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstFormat == GL_RGBA) { 26011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint *dst = (GLuint *) dstAddr; 26021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 2603c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul dst[i] = (F_TO_I(rgba[i][RCOMP] * 255.F) << 24) 2604c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][GCOMP] * 255.F) << 16) 2605c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][BCOMP] * 255.F) << 8) 2606c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][ACOMP] * 255.F) ); 26071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 26081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 26091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else if (dstFormat == GL_BGRA) { 26101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint *dst = (GLuint *) dstAddr; 26111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 2612c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul dst[i] = (F_TO_I(rgba[i][BCOMP] * 255.F) << 24) 2613c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][GCOMP] * 255.F) << 16) 2614c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][RCOMP] * 255.F) << 8) 2615c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][ACOMP] * 255.F) ); 26161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 26171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 26181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else if (dstFormat == GL_ABGR_EXT) { 26191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint *dst = (GLuint *) dstAddr; 26201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 2621c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul dst[i] = (F_TO_I(rgba[i][ACOMP] * 255.F) << 24) 2622c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][BCOMP] * 255.F) << 16) 2623c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][GCOMP] * 255.F) << 8) 2624c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][RCOMP] * 255.F) ); 26251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 26261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 26271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 26281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_INT_8_8_8_8_REV: 26291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstFormat == GL_RGBA) { 26301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint *dst = (GLuint *) dstAddr; 26311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 2632c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul dst[i] = (F_TO_I(rgba[i][RCOMP] * 255.0F) ) 2633c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][GCOMP] * 255.0F) << 8) 2634c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][BCOMP] * 255.0F) << 16) 2635c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][ACOMP] * 255.0F) << 24); 26361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 26371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 26381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else if (dstFormat == GL_BGRA) { 26391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint *dst = (GLuint *) dstAddr; 26401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 2641c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul dst[i] = (F_TO_I(rgba[i][BCOMP] * 255.0F) ) 2642c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][GCOMP] * 255.0F) << 8) 2643c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][RCOMP] * 255.0F) << 16) 2644c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][ACOMP] * 255.0F) << 24); 26451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 26461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 26471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else if (dstFormat == GL_ABGR_EXT) { 26481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint *dst = (GLuint *) dstAddr; 26491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 2650c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul dst[i] = (F_TO_I(rgba[i][ACOMP] * 255.0F) ) 2651c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][BCOMP] * 255.0F) << 8) 2652c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][GCOMP] * 255.0F) << 16) 2653c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][RCOMP] * 255.0F) << 24); 26541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 26551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 26561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 26571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_INT_10_10_10_2: 26581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstFormat == GL_RGBA) { 26591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint *dst = (GLuint *) dstAddr; 26601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 2661c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul dst[i] = (F_TO_I(rgba[i][RCOMP] * 1023.0F) << 22) 2662c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][GCOMP] * 1023.0F) << 12) 2663c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][BCOMP] * 1023.0F) << 2) 2664c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][ACOMP] * 3.0F) ); 26651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 26661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 26671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else if (dstFormat == GL_BGRA) { 26681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint *dst = (GLuint *) dstAddr; 26691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 2670c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul dst[i] = (F_TO_I(rgba[i][BCOMP] * 1023.0F) << 22) 2671c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][GCOMP] * 1023.0F) << 12) 2672c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][RCOMP] * 1023.0F) << 2) 2673c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][ACOMP] * 3.0F) ); 26741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 26751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 26761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else if (dstFormat == GL_ABGR_EXT) { 26771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint *dst = (GLuint *) dstAddr; 26781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 2679c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul dst[i] = (F_TO_I(rgba[i][ACOMP] * 1023.0F) << 22) 2680c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][BCOMP] * 1023.0F) << 12) 2681c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][GCOMP] * 1023.0F) << 2) 2682c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][RCOMP] * 3.0F) ); 26831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 26841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 26851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 26861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_INT_2_10_10_10_REV: 26871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstFormat == GL_RGBA) { 26881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint *dst = (GLuint *) dstAddr; 26891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 2690c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul dst[i] = (F_TO_I(rgba[i][RCOMP] * 1023.0F) ) 2691c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][GCOMP] * 1023.0F) << 10) 2692c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][BCOMP] * 1023.0F) << 20) 2693c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][ACOMP] * 3.0F) << 30); 26941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 26951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 26961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else if (dstFormat == GL_BGRA) { 26971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint *dst = (GLuint *) dstAddr; 26981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 2699c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul dst[i] = (F_TO_I(rgba[i][BCOMP] * 1023.0F) ) 2700c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][GCOMP] * 1023.0F) << 10) 2701c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][RCOMP] * 1023.0F) << 20) 2702c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][ACOMP] * 3.0F) << 30); 27031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 27041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 27051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else if (dstFormat == GL_ABGR_EXT) { 27061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint *dst = (GLuint *) dstAddr; 27071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 2708c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul dst[i] = (F_TO_I(rgba[i][ACOMP] * 1023.0F) ) 2709c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][BCOMP] * 1023.0F) << 10) 2710c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][GCOMP] * 1023.0F) << 20) 2711c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul | (F_TO_I(rgba[i][RCOMP] * 3.0F) << 30); 27121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 27131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 27141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 27159d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák case GL_UNSIGNED_INT_5_9_9_9_REV: 27169d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák { 27179d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák GLuint *dst = (GLuint *) dstAddr; 27189d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák for (i = 0; i < n; i++) { 27199d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák dst[i] = float3_to_rgb9e5(rgba[i]); 27209d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák } 27219d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák } 27229d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák break; 2723631d23daa91c569bf268a2191bd466df73a64263Marek Olšák case GL_UNSIGNED_INT_10F_11F_11F_REV: 2724631d23daa91c569bf268a2191bd466df73a64263Marek Olšák { 2725631d23daa91c569bf268a2191bd466df73a64263Marek Olšák GLuint *dst = (GLuint *) dstAddr; 2726631d23daa91c569bf268a2191bd466df73a64263Marek Olšák for (i = 0; i < n; i++) { 2727631d23daa91c569bf268a2191bd466df73a64263Marek Olšák dst[i] = float3_to_r11g11b10f(rgba[i]); 2728631d23daa91c569bf268a2191bd466df73a64263Marek Olšák } 2729631d23daa91c569bf268a2191bd466df73a64263Marek Olšák } 2730631d23daa91c569bf268a2191bd466df73a64263Marek Olšák break; 27311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul default: 27321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_problem(ctx, "bad type in _mesa_pack_rgba_span_float"); 27333d6d44348150cef8316f32de79470d9a0ed71155Vinson Lee free(luminance); 27341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul return; 27351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 27361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 27371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstPacking->SwapBytes) { 27381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLint swapSize = _mesa_sizeof_packed_type(dstType); 27391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (swapSize == 2) { 2740370e5d2106c88bad0587265254edf3a8cffbaef2Brian Paul _mesa_swap2((GLushort *) dstAddr, n * comps); 27411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 27421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else if (swapSize == 4) { 2743370e5d2106c88bad0587265254edf3a8cffbaef2Brian Paul _mesa_swap4((GLuint *) dstAddr, n * comps); 27441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 27451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 274636b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul 274736b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul free(luminance); 27481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul} 27491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 27501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 27511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 27521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul#define SWAP2BYTE(VALUE) \ 27531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { \ 27541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte *bytes = (GLubyte *) &(VALUE); \ 27551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte tmp = bytes[0]; \ 27561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul bytes[0] = bytes[1]; \ 27571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul bytes[1] = tmp; \ 27581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 27591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 27601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul#define SWAP4BYTE(VALUE) \ 27611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { \ 27621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte *bytes = (GLubyte *) &(VALUE); \ 27631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte tmp = bytes[0]; \ 27641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul bytes[0] = bytes[3]; \ 27651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul bytes[3] = tmp; \ 27661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul tmp = bytes[1]; \ 27671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul bytes[1] = bytes[2]; \ 27681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul bytes[2] = tmp; \ 27691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 27701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 27711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 27721c131752c3e07ef91f49d4970dafca6d26585334Brian Paulstatic void 27731c131752c3e07ef91f49d4970dafca6d26585334Brian Paulextract_uint_indexes(GLuint n, GLuint indexes[], 27741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLenum srcFormat, GLenum srcType, const GLvoid *src, 27751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const struct gl_pixelstore_attrib *unpack ) 27761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{ 27771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul ASSERT(srcFormat == GL_COLOR_INDEX || srcFormat == GL_STENCIL_INDEX); 27781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 27791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul ASSERT(srcType == GL_BITMAP || 27801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_BYTE || 27811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_BYTE || 27821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_SHORT || 27831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_SHORT || 27841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_INT || 27851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_INT || 27861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_INT_24_8_EXT || 27871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_HALF_FLOAT_ARB || 2788ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák srcType == GL_FLOAT || 2789ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák srcType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV); 27901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 27911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul switch (srcType) { 27921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_BITMAP: 27931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 27941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte *ubsrc = (GLubyte *) src; 27951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (unpack->LsbFirst) { 27961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte mask = 1 << (unpack->SkipPixels & 0x7); 27971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 27981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 27991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul indexes[i] = (*ubsrc & mask) ? 1 : 0; 28001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (mask == 128) { 28011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul mask = 1; 28021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul ubsrc++; 28031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 28041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 28051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul mask = mask << 1; 28061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 28071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 28081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 28091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 28101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte mask = 128 >> (unpack->SkipPixels & 0x7); 28111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 28121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 28131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul indexes[i] = (*ubsrc & mask) ? 1 : 0; 28141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (mask == 1) { 28151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul mask = 128; 28161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul ubsrc++; 28171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 28181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 28191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul mask = mask >> 1; 28201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 28211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 28221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 28231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 28241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 28251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_BYTE: 28261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 28271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 28281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLubyte *s = (const GLubyte *) src; 28291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) 28301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul indexes[i] = s[i]; 28311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 28321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 28331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_BYTE: 28341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 28351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 28361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLbyte *s = (const GLbyte *) src; 28371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) 28381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul indexes[i] = s[i]; 28391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 28401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 28411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_SHORT: 28421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 28431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 28441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLushort *s = (const GLushort *) src; 28451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (unpack->SwapBytes) { 28461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 28471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLushort value = s[i]; 28481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul SWAP2BYTE(value); 28491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul indexes[i] = value; 28501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 28511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 28521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 28531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) 28541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul indexes[i] = s[i]; 28551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 28561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 28571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 28581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_SHORT: 28591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 28601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 28611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLshort *s = (const GLshort *) src; 28621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (unpack->SwapBytes) { 28631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 28641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLshort value = s[i]; 28651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul SWAP2BYTE(value); 28661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul indexes[i] = value; 28671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 28681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 28691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 28701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) 28711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul indexes[i] = s[i]; 28721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 28731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 28741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 28751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_INT: 28761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 28771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 28781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLuint *s = (const GLuint *) src; 28791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (unpack->SwapBytes) { 28801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 28811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint value = s[i]; 28821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul SWAP4BYTE(value); 28831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul indexes[i] = value; 28841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 28851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 28861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 28871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) 28881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul indexes[i] = s[i]; 28891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 28901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 28911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 28921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_INT: 28931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 28941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 28951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLint *s = (const GLint *) src; 28961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (unpack->SwapBytes) { 28971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 28981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLint value = s[i]; 28991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul SWAP4BYTE(value); 29001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul indexes[i] = value; 29011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 29021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 29031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 29041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) 29051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul indexes[i] = s[i]; 29061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 29071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 29081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 29091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_FLOAT: 29101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 29111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 29121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLfloat *s = (const GLfloat *) src; 29131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (unpack->SwapBytes) { 29141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 29151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLfloat value = s[i]; 29161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul SWAP4BYTE(value); 29171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul indexes[i] = (GLuint) value; 29181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 29191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 29201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 29211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) 29221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul indexes[i] = (GLuint) s[i]; 29231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 29241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 29251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 29261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_HALF_FLOAT_ARB: 29271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 29281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 29291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLhalfARB *s = (const GLhalfARB *) src; 29301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (unpack->SwapBytes) { 29311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 29321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLhalfARB value = s[i]; 29331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul SWAP2BYTE(value); 29341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul indexes[i] = (GLuint) _mesa_half_to_float(value); 29351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 29361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 29371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 29381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) 29391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul indexes[i] = (GLuint) _mesa_half_to_float(s[i]); 29401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 29411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 29421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 29431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_INT_24_8_EXT: 29441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 29451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 29461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLuint *s = (const GLuint *) src; 29471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (unpack->SwapBytes) { 29481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 29491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint value = s[i]; 29501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul SWAP4BYTE(value); 29511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul indexes[i] = value & 0xff; /* lower 8 bits */ 29521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 29531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 29541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 29551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) 29561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul indexes[i] = s[i] & 0xff; /* lower 8 bits */ 29571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 29581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 29591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 2960ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 2961ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák { 2962ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák GLuint i; 2963ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák const GLuint *s = (const GLuint *) src; 2964ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák if (unpack->SwapBytes) { 2965ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák for (i = 0; i < n; i++) { 2966ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák GLuint value = s[i*2+1]; 2967ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák SWAP4BYTE(value); 2968ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák indexes[i] = value & 0xff; /* lower 8 bits */ 2969ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák } 2970ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák } 2971ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák else { 2972ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák for (i = 0; i < n; i++) 2973ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák indexes[i] = s[i*2+1] & 0xff; /* lower 8 bits */ 2974ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák } 2975ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák } 2976ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák break; 29771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 29781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul default: 29791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_problem(NULL, "bad srcType in extract_uint_indexes"); 29801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul return; 29811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 29821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul} 29831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 29841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 2985e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul/** 2986e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul * Return source/dest RGBA indexes for unpacking pixels. 2987e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul */ 2988e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paulstatic void 2989e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paulget_component_mapping(GLenum format, 299090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul GLint *rSrc, 299190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul GLint *gSrc, 299290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul GLint *bSrc, 299390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul GLint *aSrc, 299490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul GLint *rDst, 299590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul GLint *gDst, 299690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul GLint *bDst, 299790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul GLint *aDst) 2998e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul{ 2999e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul switch (format) { 3000e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_RED: 3001e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_RED_INTEGER_EXT: 300290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *rSrc = 0; 300390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *gSrc = *bSrc = *aSrc = -1; 3004e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul break; 3005e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_GREEN: 3006e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_GREEN_INTEGER_EXT: 300790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *gSrc = 0; 300890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *rSrc = *bSrc = *aSrc = -1; 3009e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul break; 3010b50e017ae1941c91cd73099b5c76e292080312e4Dave Airlie case GL_BLUE: 3011e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_BLUE_INTEGER_EXT: 301290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *bSrc = 0; 301390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *rSrc = *gSrc = *aSrc = -1; 3014e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul break; 3015e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_ALPHA: 3016e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_ALPHA_INTEGER_EXT: 301790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *rSrc = *gSrc = *bSrc = -1; 301890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *aSrc = 0; 3019e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul break; 3020e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_LUMINANCE: 3021e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_LUMINANCE_INTEGER_EXT: 302290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *rSrc = *gSrc = *bSrc = 0; 302390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *aSrc = -1; 3024e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul break; 3025e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_LUMINANCE_ALPHA: 3026e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_LUMINANCE_ALPHA_INTEGER_EXT: 302790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *rSrc = *gSrc = *bSrc = 0; 302890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *aSrc = 1; 3029e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul break; 3030e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_INTENSITY: 303190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *rSrc = *gSrc = *bSrc = *aSrc = 0; 3032e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul break; 3033e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_RG: 3034e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_RG_INTEGER: 303590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *rSrc = 0; 303690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *gSrc = 1; 303790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *bSrc = -1; 303890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *aSrc = -1; 303990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *rDst = 0; 304090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *gDst = 1; 304190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *bDst = 2; 304290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *aDst = 3; 3043e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul break; 3044e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_RGB: 3045e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_RGB_INTEGER: 304690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *rSrc = 0; 304790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *gSrc = 1; 304890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *bSrc = 2; 304990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *aSrc = -1; 305090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *rDst = 0; 305190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *gDst = 1; 305290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *bDst = 2; 305390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *aDst = 3; 3054e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul break; 3055e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_BGR: 305647e2e367170edec022481f1487cd980e00ef3203Dave Airlie case GL_BGR_INTEGER: 305790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *rSrc = 2; 305890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *gSrc = 1; 305990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *bSrc = 0; 306090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *aSrc = -1; 306190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *rDst = 2; 306290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *gDst = 1; 306390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *bDst = 0; 306490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *aDst = 3; 3065e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul break; 3066e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_RGBA: 3067e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_RGBA_INTEGER: 306890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *rSrc = 0; 306990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *gSrc = 1; 307090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *bSrc = 2; 307190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *aSrc = 3; 307290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *rDst = 0; 307390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *gDst = 1; 307490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *bDst = 2; 307590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *aDst = 3; 3076e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul break; 3077e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_BGRA: 307847e2e367170edec022481f1487cd980e00ef3203Dave Airlie case GL_BGRA_INTEGER: 307990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *rSrc = 2; 308090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *gSrc = 1; 308190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *bSrc = 0; 308290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *aSrc = 3; 308390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *rDst = 2; 308490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *gDst = 1; 308590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *bDst = 0; 308690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *aDst = 3; 3087e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul break; 3088e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_ABGR_EXT: 308990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *rSrc = 3; 309090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *gSrc = 2; 309190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *bSrc = 1; 309290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *aSrc = 0; 309390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *rDst = 3; 309490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *gDst = 2; 309590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *bDst = 1; 309690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *aDst = 0; 3097e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul break; 3098e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_DU8DV8_ATI: 3099e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul case GL_DUDV_ATI: 310090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *rSrc = 0; 310190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *gSrc = 1; 310290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *bSrc = -1; 310390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul *aSrc = -1; 3104e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul break; 3105e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul default: 3106e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul _mesa_problem(NULL, "bad srcFormat %s in get_component_mapping", 3107e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul _mesa_lookup_enum_by_nr(format)); 3108e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul return; 3109e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul } 3110e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul} 3111e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul 3112e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul 3113e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul 31141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul/* 31151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * This function extracts floating point RGBA values from arbitrary 31161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * image data. srcFormat and srcType are the format and type parameters 31171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc. 31181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * 31191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function 31201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * implements the "Conversion to floating point", "Conversion to RGB", 31211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * and "Final Expansion to RGBA" operations. 31221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * 31231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Args: n - number of pixels 31241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * rgba - output colors 31251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * srcFormat - format of incoming data 31261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * srcType - data type of incoming data 31271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * src - source data pointer 31281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * swapBytes - perform byteswapping of incoming data? 31291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */ 31301c131752c3e07ef91f49d4970dafca6d26585334Brian Paulstatic void 31311c131752c3e07ef91f49d4970dafca6d26585334Brian Paulextract_float_rgba(GLuint n, GLfloat rgba[][4], 31321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLenum srcFormat, GLenum srcType, const GLvoid *src, 31331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLboolean swapBytes) 31341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{ 313590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul GLint rSrc, gSrc, bSrc, aSrc; 31361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLint stride; 313790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul GLint rDst, bDst, gDst, aDst; 31381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLboolean intFormat; 31391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLfloat rs = 1.0f, gs = 1.0f, bs = 1.0f, as = 1.0f; /* scale factors */ 31401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 31411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul ASSERT(srcFormat == GL_RED || 31421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_GREEN || 31431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_BLUE || 31441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_ALPHA || 31451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_LUMINANCE || 31461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_LUMINANCE_ALPHA || 31471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_INTENSITY || 31481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_RG || 31491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_RGB || 31501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_BGR || 31511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_RGBA || 31521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_BGRA || 31531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_ABGR_EXT || 31541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_DU8DV8_ATI || 31551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_DUDV_ATI || 31561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_RED_INTEGER_EXT || 31571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_GREEN_INTEGER_EXT || 31581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_BLUE_INTEGER_EXT || 31591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_ALPHA_INTEGER_EXT || 31600e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick srcFormat == GL_RG_INTEGER || 31611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_RGB_INTEGER_EXT || 31621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_RGBA_INTEGER_EXT || 31631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_BGR_INTEGER_EXT || 31641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_BGRA_INTEGER_EXT || 31651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_LUMINANCE_INTEGER_EXT || 31661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT); 31671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 31681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul ASSERT(srcType == GL_UNSIGNED_BYTE || 31691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_BYTE || 31701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_SHORT || 31711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_SHORT || 31721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_INT || 31731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_INT || 31741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_HALF_FLOAT_ARB || 31751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_FLOAT || 31761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_BYTE_3_3_2 || 31771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 31781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_SHORT_5_6_5 || 31791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 31801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 31811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 31821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 31831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 31841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_INT_8_8_8_8 || 31851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 31861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_INT_10_10_10_2 || 31879d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák srcType == GL_UNSIGNED_INT_2_10_10_10_REV || 3188631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcType == GL_UNSIGNED_INT_5_9_9_9_REV || 3189631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcType == GL_UNSIGNED_INT_10F_11F_11F_REV); 31901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 3191e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul get_component_mapping(srcFormat, 319290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul &rSrc, &gSrc, &bSrc, &aSrc, 319390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul &rDst, &gDst, &bDst, &aDst); 31941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 3195e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul stride = _mesa_components_in_format(srcFormat); 31961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 31979ad8f431b2a47060bf05517246ab0fa8d249c800Jordan Justen intFormat = _mesa_is_enum_format_integer(srcFormat); 31981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 319990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul#define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT_FLT, DEFAULT_INT, TYPE, CONVERSION) \ 320090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul if ((SRC_INDEX) < 0) { \ 32011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; \ 32021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (intFormat) { \ 32031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { \ 320490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][DST_INDEX] = DEFAULT_INT; \ 32051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } \ 32061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } \ 32071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { \ 32081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { \ 320990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][DST_INDEX] = DEFAULT_FLT; \ 32101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } \ 32111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } \ 32121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } \ 32131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else if (swapBytes) { \ 32141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const TYPE *s = (const TYPE *) src; \ 32151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; \ 32161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { \ 321790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul TYPE value = s[SRC_INDEX]; \ 32181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (sizeof(TYPE) == 2) { \ 32191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul SWAP2BYTE(value); \ 32201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } \ 32211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else if (sizeof(TYPE) == 4) { \ 32221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul SWAP4BYTE(value); \ 32231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } \ 32241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (intFormat) \ 322590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][DST_INDEX] = (GLfloat) value; \ 32261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else \ 322790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][DST_INDEX] = (GLfloat) CONVERSION(value); \ 32281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul s += stride; \ 32291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } \ 32301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } \ 32311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { \ 32321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const TYPE *s = (const TYPE *) src; \ 32331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; \ 32341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (intFormat) { \ 32351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { \ 323690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][DST_INDEX] = (GLfloat) s[SRC_INDEX]; \ 32371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul s += stride; \ 32381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } \ 32391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } \ 32401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { \ 32411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { \ 324290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][DST_INDEX] = (GLfloat) CONVERSION(s[SRC_INDEX]); \ 32431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul s += stride; \ 32441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } \ 32451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } \ 32461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 32471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 32481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul switch (srcType) { 32491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_BYTE: 325090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(rSrc, RCOMP, 0.0F, 0, GLubyte, UBYTE_TO_FLOAT); 325190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(gSrc, GCOMP, 0.0F, 0, GLubyte, UBYTE_TO_FLOAT); 325290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(bSrc, BCOMP, 0.0F, 0, GLubyte, UBYTE_TO_FLOAT); 325390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(aSrc, ACOMP, 1.0F, 255, GLubyte, UBYTE_TO_FLOAT); 32541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 32551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_BYTE: 3256546f76d58f619e3d7e016b3eb04254d5c5c3f39fBrian Paul PROCESS(rSrc, RCOMP, 0.0F, 0, GLbyte, BYTE_TO_FLOATZ); 3257546f76d58f619e3d7e016b3eb04254d5c5c3f39fBrian Paul PROCESS(gSrc, GCOMP, 0.0F, 0, GLbyte, BYTE_TO_FLOATZ); 3258546f76d58f619e3d7e016b3eb04254d5c5c3f39fBrian Paul PROCESS(bSrc, BCOMP, 0.0F, 0, GLbyte, BYTE_TO_FLOATZ); 3259546f76d58f619e3d7e016b3eb04254d5c5c3f39fBrian Paul PROCESS(aSrc, ACOMP, 1.0F, 127, GLbyte, BYTE_TO_FLOATZ); 32601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 32611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_SHORT: 326290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(rSrc, RCOMP, 0.0F, 0, GLushort, USHORT_TO_FLOAT); 326390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(gSrc, GCOMP, 0.0F, 0, GLushort, USHORT_TO_FLOAT); 326490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(bSrc, BCOMP, 0.0F, 0, GLushort, USHORT_TO_FLOAT); 326590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(aSrc, ACOMP, 1.0F, 0xffff, GLushort, USHORT_TO_FLOAT); 32661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 32671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_SHORT: 3268546f76d58f619e3d7e016b3eb04254d5c5c3f39fBrian Paul PROCESS(rSrc, RCOMP, 0.0F, 0, GLshort, SHORT_TO_FLOATZ); 3269546f76d58f619e3d7e016b3eb04254d5c5c3f39fBrian Paul PROCESS(gSrc, GCOMP, 0.0F, 0, GLshort, SHORT_TO_FLOATZ); 3270546f76d58f619e3d7e016b3eb04254d5c5c3f39fBrian Paul PROCESS(bSrc, BCOMP, 0.0F, 0, GLshort, SHORT_TO_FLOATZ); 3271546f76d58f619e3d7e016b3eb04254d5c5c3f39fBrian Paul PROCESS(aSrc, ACOMP, 1.0F, 32767, GLshort, SHORT_TO_FLOATZ); 32721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 32731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_INT: 327490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(rSrc, RCOMP, 0.0F, 0, GLuint, UINT_TO_FLOAT); 327590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(gSrc, GCOMP, 0.0F, 0, GLuint, UINT_TO_FLOAT); 327690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(bSrc, BCOMP, 0.0F, 0, GLuint, UINT_TO_FLOAT); 327790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(aSrc, ACOMP, 1.0F, 0xffffffff, GLuint, UINT_TO_FLOAT); 32781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 32791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_INT: 328090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(rSrc, RCOMP, 0.0F, 0, GLint, INT_TO_FLOAT); 328190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(gSrc, GCOMP, 0.0F, 0, GLint, INT_TO_FLOAT); 328290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(bSrc, BCOMP, 0.0F, 0, GLint, INT_TO_FLOAT); 328390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(aSrc, ACOMP, 1.0F, 2147483647, GLint, INT_TO_FLOAT); 32841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 32851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_FLOAT: 328690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(rSrc, RCOMP, 0.0F, 0.0F, GLfloat, (GLfloat)); 328790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(gSrc, GCOMP, 0.0F, 0.0F, GLfloat, (GLfloat)); 328890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(bSrc, BCOMP, 0.0F, 0.0F, GLfloat, (GLfloat)); 328990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(aSrc, ACOMP, 1.0F, 1.0F, GLfloat, (GLfloat)); 32901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 32911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_HALF_FLOAT_ARB: 329290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(rSrc, RCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float); 329390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(gSrc, GCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float); 329490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(bSrc, BCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float); 329590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(aSrc, ACOMP, 1.0F, 1.0F, GLhalfARB, _mesa_half_to_float); 32961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 32971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_BYTE_3_3_2: 32981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 32991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLubyte *ubsrc = (const GLubyte *) src; 33001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 33011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (!intFormat) { 33021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul rs = 1.0F / 7.0F; 33031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul gs = 1.0F / 7.0F; 33041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul bs = 1.0F / 3.0F; 33051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 33061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i ++) { 33071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte p = ubsrc[i]; 330890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p >> 5) ) * rs; 330990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 2) & 0x7) * gs; 331090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p ) & 0x3) * bs; 331190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = 1.0F; 33121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 33131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 33141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 33151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_BYTE_2_3_3_REV: 33161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 33171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLubyte *ubsrc = (const GLubyte *) src; 33181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 33191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (!intFormat) { 33201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul rs = 1.0F / 7.0F; 33211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul gs = 1.0F / 7.0F; 33221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul bs = 1.0F / 3.0F; 33231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 33241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i ++) { 33251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte p = ubsrc[i]; 332690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p ) & 0x7) * rs; 332790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 3) & 0x7) * gs; 332890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p >> 6) ) * bs; 332990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = 1.0F; 33301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 33311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 33321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 33331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_SHORT_5_6_5: 33341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (!intFormat) { 33351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul rs = 1.0F / 31.0F; 33361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul gs = 1.0F / 63.0F; 33371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul bs = 1.0F / 31.0F; 33381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 33391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (swapBytes) { 33401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLushort *ussrc = (const GLushort *) src; 33411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 33421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i ++) { 33431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLushort p = ussrc[i]; 33441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul SWAP2BYTE(p); 334590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p >> 11) ) * rs; 334690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 5) & 0x3f) * gs; 334790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p ) & 0x1f) * bs; 334890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = 1.0F; 33491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 33501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 33511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 33521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLushort *ussrc = (const GLushort *) src; 33531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 33541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i ++) { 33551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLushort p = ussrc[i]; 335690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p >> 11) ) * rs; 335790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 5) & 0x3f) * gs; 335890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p ) & 0x1f) * bs; 335990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = 1.0F; 33601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 33611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 33621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 33631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_SHORT_5_6_5_REV: 33641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (!intFormat) { 33651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul rs = 1.0F / 31.0F; 33661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul gs = 1.0F / 63.0F; 33671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul bs = 1.0F / 31.0F; 33681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 33691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (swapBytes) { 33701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLushort *ussrc = (const GLushort *) src; 33711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 33721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i ++) { 33731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLushort p = ussrc[i]; 33741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul SWAP2BYTE(p); 337590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p ) & 0x1f) * rs; 337690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 5) & 0x3f) * gs; 337790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p >> 11) ) * bs; 337890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = 1.0F; 33791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 33801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 33811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 33821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLushort *ussrc = (const GLushort *) src; 33831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 33841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i ++) { 33851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLushort p = ussrc[i]; 338690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p ) & 0x1f) * rs; 338790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 5) & 0x3f) * gs; 338890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p >> 11) ) * bs; 338990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = 1.0F; 33901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 33911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 33921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 33931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_SHORT_4_4_4_4: 33941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (!intFormat) { 33951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul rs = gs = bs = as = 1.0F / 15.0F; 33961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 33971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (swapBytes) { 33981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLushort *ussrc = (const GLushort *) src; 33991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 34001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i ++) { 34011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLushort p = ussrc[i]; 34021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul SWAP2BYTE(p); 340390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p >> 12) ) * rs; 340490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 8) & 0xf) * gs; 340590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p >> 4) & 0xf) * bs; 340690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = ((p ) & 0xf) * as; 34071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 34081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 34091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 34101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLushort *ussrc = (const GLushort *) src; 34111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 34121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i ++) { 34131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLushort p = ussrc[i]; 341490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p >> 12) ) * rs; 341590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 8) & 0xf) * gs; 341690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p >> 4) & 0xf) * bs; 341790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = ((p ) & 0xf) * as; 34181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 34191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 34201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 34211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_SHORT_4_4_4_4_REV: 34221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (!intFormat) { 34231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul rs = gs = bs = as = 1.0F / 15.0F; 34241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 34251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (swapBytes) { 34261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLushort *ussrc = (const GLushort *) src; 34271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 34281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i ++) { 34291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLushort p = ussrc[i]; 34301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul SWAP2BYTE(p); 343190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p ) & 0xf) * rs; 343290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 4) & 0xf) * gs; 343390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p >> 8) & 0xf) * bs; 343490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = ((p >> 12) ) * as; 34351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 34361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 34371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 34381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLushort *ussrc = (const GLushort *) src; 34391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 34401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i ++) { 34411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLushort p = ussrc[i]; 344290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p ) & 0xf) * rs; 344390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 4) & 0xf) * gs; 344490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p >> 8) & 0xf) * bs; 344590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = ((p >> 12) ) * as; 34461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 34471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 34481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 34491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_SHORT_5_5_5_1: 34501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (!intFormat) { 34511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul rs = gs = bs = 1.0F / 31.0F; 34521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 34531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (swapBytes) { 34541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLushort *ussrc = (const GLushort *) src; 34551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 34561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i ++) { 34571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLushort p = ussrc[i]; 34581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul SWAP2BYTE(p); 345990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p >> 11) ) * rs; 346090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 6) & 0x1f) * gs; 346190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p >> 1) & 0x1f) * bs; 346290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = ((p ) & 0x1) * as; 34631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 34641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 34651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 34661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLushort *ussrc = (const GLushort *) src; 34671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 34681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i ++) { 34691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLushort p = ussrc[i]; 347090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p >> 11) ) * rs; 347190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 6) & 0x1f) * gs; 347290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p >> 1) & 0x1f) * bs; 347390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = ((p ) & 0x1) * as; 34741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 34751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 34761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 34771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_SHORT_1_5_5_5_REV: 34781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (!intFormat) { 34791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul rs = gs = bs = 1.0F / 31.0F; 34801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 34811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (swapBytes) { 34821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLushort *ussrc = (const GLushort *) src; 34831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 34841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i ++) { 34851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLushort p = ussrc[i]; 34861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul SWAP2BYTE(p); 348790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p ) & 0x1f) * rs; 348890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 5) & 0x1f) * gs; 348990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p >> 10) & 0x1f) * bs; 349090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = ((p >> 15) ) * as; 34911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 34921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 34931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 34941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLushort *ussrc = (const GLushort *) src; 34951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 34961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i ++) { 34971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLushort p = ussrc[i]; 349890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p ) & 0x1f) * rs; 349990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 5) & 0x1f) * gs; 350090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p >> 10) & 0x1f) * bs; 350190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = ((p >> 15) ) * as; 35021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 35031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 35041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 35051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_INT_8_8_8_8: 35061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (swapBytes) { 35071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLuint *uisrc = (const GLuint *) src; 35081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 35091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (intFormat) { 35101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i ++) { 35111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint p = uisrc[i]; 351290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = (GLfloat) ((p ) & 0xff); 351390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = (GLfloat) ((p >> 8) & 0xff); 351490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = (GLfloat) ((p >> 16) & 0xff); 351590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = (GLfloat) ((p >> 24) ); 35161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 35171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 35181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 35191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i ++) { 35201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint p = uisrc[i]; 352190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = UBYTE_TO_FLOAT((p ) & 0xff); 352290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 352390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 352490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = UBYTE_TO_FLOAT((p >> 24) ); 35251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 35261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 35271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 35281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 35291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLuint *uisrc = (const GLuint *) src; 35301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 35311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (intFormat) { 35321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i ++) { 35331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint p = uisrc[i]; 353490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = (GLfloat) ((p >> 24) ); 353590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = (GLfloat) ((p >> 16) & 0xff); 353690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = (GLfloat) ((p >> 8) & 0xff); 353790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = (GLfloat) ((p ) & 0xff); 35381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 35391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 35401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 35411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i ++) { 35421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint p = uisrc[i]; 354390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = UBYTE_TO_FLOAT((p >> 24) ); 354490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 354590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 354690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = UBYTE_TO_FLOAT((p ) & 0xff); 35471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 35481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 35491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 35501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 35511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_INT_8_8_8_8_REV: 35521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (swapBytes) { 35531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLuint *uisrc = (const GLuint *) src; 35541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 35551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (intFormat) { 35561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i ++) { 35571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint p = uisrc[i]; 355890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = (GLfloat) ((p >> 24) ); 355990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = (GLfloat) ((p >> 16) & 0xff); 356090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = (GLfloat) ((p >> 8) & 0xff); 356190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = (GLfloat) ((p ) & 0xff); 35621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 35631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 35641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 35651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i ++) { 35661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint p = uisrc[i]; 356790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = UBYTE_TO_FLOAT((p >> 24) ); 356890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 356990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 357090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = UBYTE_TO_FLOAT((p ) & 0xff); 35711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 35721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 35731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 35741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 35751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLuint *uisrc = (const GLuint *) src; 35761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 35771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (intFormat) { 35781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i ++) { 35791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint p = uisrc[i]; 358090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = (GLfloat) ((p ) & 0xff); 358190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = (GLfloat) ((p >> 8) & 0xff); 358290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = (GLfloat) ((p >> 16) & 0xff); 358390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = (GLfloat) ((p >> 24) ); 35841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 35851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 35861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 35871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i ++) { 35881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint p = uisrc[i]; 358990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = UBYTE_TO_FLOAT((p ) & 0xff); 359090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 359190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 359290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = UBYTE_TO_FLOAT((p >> 24) ); 35931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 35941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 35951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 35961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 35971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_INT_10_10_10_2: 35981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (!intFormat) { 35991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul rs = 1.0F / 1023.0F; 36001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul gs = 1.0F / 1023.0F; 36011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul bs = 1.0F / 1023.0F; 36021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul as = 1.0F / 3.0F; 36031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 36041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (swapBytes) { 36051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLuint *uisrc = (const GLuint *) src; 36061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 36071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i ++) { 36081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint p = uisrc[i]; 36091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul SWAP4BYTE(p); 361090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p >> 22) ) * rs; 361190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 12) & 0x3ff) * gs; 361290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p >> 2) & 0x3ff) * bs; 361390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = ((p ) & 0x3 ) * as; 36141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 36151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 36161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 36171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLuint *uisrc = (const GLuint *) src; 36181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 36191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i ++) { 36201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint p = uisrc[i]; 362190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p >> 22) ) * rs; 362290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 12) & 0x3ff) * gs; 362390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p >> 2) & 0x3ff) * bs; 362490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = ((p ) & 0x3 ) * as; 36251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 36261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 36271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 36281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_INT_2_10_10_10_REV: 36291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (!intFormat) { 36301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul rs = 1.0F / 1023.0F; 36311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul gs = 1.0F / 1023.0F; 36321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul bs = 1.0F / 1023.0F; 36331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul as = 1.0F / 3.0F; 36341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 36351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (swapBytes) { 36361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLuint *uisrc = (const GLuint *) src; 36371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 36381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i ++) { 36391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint p = uisrc[i]; 36401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul SWAP4BYTE(p); 364190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p ) & 0x3ff) * rs; 364290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 10) & 0x3ff) * gs; 364390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p >> 20) & 0x3ff) * bs; 364490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = ((p >> 30) ) * as; 36451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 36461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 36471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 36481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLuint *uisrc = (const GLuint *) src; 36491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 36501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i ++) { 36511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint p = uisrc[i]; 365290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p ) & 0x3ff) * rs; 365390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 10) & 0x3ff) * gs; 365490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p >> 20) & 0x3ff) * bs; 365590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = ((p >> 30) ) * as; 36561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 36571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 36581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 36599d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák case GL_UNSIGNED_INT_5_9_9_9_REV: 36609d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák if (swapBytes) { 36619d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák const GLuint *uisrc = (const GLuint *) src; 36629d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák GLuint i; 36639d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák GLfloat f[3]; 36649d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák for (i = 0; i < n; i ++) { 36659d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák GLuint p = uisrc[i]; 36669d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák SWAP4BYTE(p); 36679d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák rgb9e5_to_float3(p, f); 36689d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák rgba[i][rDst] = f[0]; 36699d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák rgba[i][gDst] = f[1]; 36709d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák rgba[i][bDst] = f[2]; 36719d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák rgba[i][aDst] = 1.0F; 36729d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák } 36739d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák } 36749d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák else { 36759d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák const GLuint *uisrc = (const GLuint *) src; 36769d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák GLuint i; 36779d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák GLfloat f[3]; 36789d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák for (i = 0; i < n; i ++) { 36799d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák rgb9e5_to_float3(uisrc[i], f); 36809d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák rgba[i][rDst] = f[0]; 36819d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák rgba[i][gDst] = f[1]; 36829d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák rgba[i][bDst] = f[2]; 36839d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák rgba[i][aDst] = 1.0F; 36849d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák } 36859d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák } 36869d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák break; 3687631d23daa91c569bf268a2191bd466df73a64263Marek Olšák case GL_UNSIGNED_INT_10F_11F_11F_REV: 3688631d23daa91c569bf268a2191bd466df73a64263Marek Olšák if (swapBytes) { 3689631d23daa91c569bf268a2191bd466df73a64263Marek Olšák const GLuint *uisrc = (const GLuint *) src; 3690631d23daa91c569bf268a2191bd466df73a64263Marek Olšák GLuint i; 3691631d23daa91c569bf268a2191bd466df73a64263Marek Olšák GLfloat f[3]; 3692631d23daa91c569bf268a2191bd466df73a64263Marek Olšák for (i = 0; i < n; i ++) { 3693631d23daa91c569bf268a2191bd466df73a64263Marek Olšák GLuint p = uisrc[i]; 3694631d23daa91c569bf268a2191bd466df73a64263Marek Olšák SWAP4BYTE(p); 3695631d23daa91c569bf268a2191bd466df73a64263Marek Olšák r11g11b10f_to_float3(p, f); 3696631d23daa91c569bf268a2191bd466df73a64263Marek Olšák rgba[i][rDst] = f[0]; 3697631d23daa91c569bf268a2191bd466df73a64263Marek Olšák rgba[i][gDst] = f[1]; 3698631d23daa91c569bf268a2191bd466df73a64263Marek Olšák rgba[i][bDst] = f[2]; 3699631d23daa91c569bf268a2191bd466df73a64263Marek Olšák rgba[i][aDst] = 1.0F; 3700631d23daa91c569bf268a2191bd466df73a64263Marek Olšák } 3701631d23daa91c569bf268a2191bd466df73a64263Marek Olšák } 3702631d23daa91c569bf268a2191bd466df73a64263Marek Olšák else { 3703631d23daa91c569bf268a2191bd466df73a64263Marek Olšák const GLuint *uisrc = (const GLuint *) src; 3704631d23daa91c569bf268a2191bd466df73a64263Marek Olšák GLuint i; 3705631d23daa91c569bf268a2191bd466df73a64263Marek Olšák GLfloat f[3]; 3706631d23daa91c569bf268a2191bd466df73a64263Marek Olšák for (i = 0; i < n; i ++) { 3707631d23daa91c569bf268a2191bd466df73a64263Marek Olšák r11g11b10f_to_float3(uisrc[i], f); 3708631d23daa91c569bf268a2191bd466df73a64263Marek Olšák rgba[i][rDst] = f[0]; 3709631d23daa91c569bf268a2191bd466df73a64263Marek Olšák rgba[i][gDst] = f[1]; 3710631d23daa91c569bf268a2191bd466df73a64263Marek Olšák rgba[i][bDst] = f[2]; 3711631d23daa91c569bf268a2191bd466df73a64263Marek Olšák rgba[i][aDst] = 1.0F; 3712631d23daa91c569bf268a2191bd466df73a64263Marek Olšák } 3713631d23daa91c569bf268a2191bd466df73a64263Marek Olšák } 3714631d23daa91c569bf268a2191bd466df73a64263Marek Olšák break; 37151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul default: 37161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_problem(NULL, "bad srcType in extract float data"); 37171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 37181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 3719b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul#undef PROCESS 37201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul} 37211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 37221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 37239520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline GLuint 3724b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paulclamp_float_to_uint(GLfloat f) 3725b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul{ 3726c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul return f < 0.0F ? 0 : F_TO_I(f); 3727b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul} 3728b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 3729b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 37309520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline GLuint 3731b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paulclamp_half_to_uint(GLhalfARB h) 3732b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul{ 3733b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLfloat f = _mesa_half_to_float(h); 3734c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul return f < 0.0F ? 0 : F_TO_I(f); 3735b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul} 3736b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 3737b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 3738b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul/** 3739b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul * \sa extract_float_rgba() 37401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */ 3741b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paulstatic void 3742b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paulextract_uint_rgba(GLuint n, GLuint rgba[][4], 3743b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLenum srcFormat, GLenum srcType, const GLvoid *src, 3744b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLboolean swapBytes) 37451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{ 374690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul GLint rSrc, gSrc, bSrc, aSrc; 3747b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLint stride; 374890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul GLint rDst, bDst, gDst, aDst; 37491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 37501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul ASSERT(srcFormat == GL_RED || 37511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_GREEN || 37521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_BLUE || 37531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_ALPHA || 37541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_LUMINANCE || 37551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_LUMINANCE_ALPHA || 37561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_INTENSITY || 37571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_RG || 37581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_RGB || 37591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_BGR || 37601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_RGBA || 37611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_BGRA || 37621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_ABGR_EXT || 3763b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_DU8DV8_ATI || 3764b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_DUDV_ATI || 3765b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_RED_INTEGER_EXT || 3766f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie srcFormat == GL_RG_INTEGER || 3767b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_GREEN_INTEGER_EXT || 3768b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_BLUE_INTEGER_EXT || 3769b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_ALPHA_INTEGER_EXT || 3770b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_RGB_INTEGER_EXT || 3771b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_RGBA_INTEGER_EXT || 3772b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_BGR_INTEGER_EXT || 3773b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_BGRA_INTEGER_EXT || 3774b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_LUMINANCE_INTEGER_EXT || 3775b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT); 37761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 3777b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul ASSERT(srcType == GL_UNSIGNED_BYTE || 37781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_BYTE || 37791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_SHORT || 37801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_SHORT || 37811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_INT || 37821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_INT || 37831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_HALF_FLOAT_ARB || 37841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_FLOAT || 37851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_BYTE_3_3_2 || 37861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 37871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_SHORT_5_6_5 || 37881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 37891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 37901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 37911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 37921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 37931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_INT_8_8_8_8 || 37941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 37951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_INT_10_10_10_2 || 37969d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák srcType == GL_UNSIGNED_INT_2_10_10_10_REV || 3797631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcType == GL_UNSIGNED_INT_5_9_9_9_REV || 3798631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcType == GL_UNSIGNED_INT_10F_11F_11F_REV); 37991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 3800e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul get_component_mapping(srcFormat, 380190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul &rSrc, &gSrc, &bSrc, &aSrc, 380290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul &rDst, &gDst, &bDst, &aDst); 38031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 3804e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul stride = _mesa_components_in_format(srcFormat); 3805b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 380690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul#define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT, TYPE, CONVERSION) \ 380790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul if ((SRC_INDEX) < 0) { \ 3808b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint i; \ 3809b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul for (i = 0; i < n; i++) { \ 381090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][DST_INDEX] = DEFAULT; \ 3811b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } \ 3812b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } \ 3813b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul else if (swapBytes) { \ 3814b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul const TYPE *s = (const TYPE *) src; \ 3815b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint i; \ 3816b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul for (i = 0; i < n; i++) { \ 381790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul TYPE value = s[SRC_INDEX]; \ 3818b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul if (sizeof(TYPE) == 2) { \ 3819b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul SWAP2BYTE(value); \ 3820b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } \ 3821b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul else if (sizeof(TYPE) == 4) { \ 3822b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul SWAP4BYTE(value); \ 3823b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } \ 382490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][DST_INDEX] = CONVERSION(value); \ 3825b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul s += stride; \ 3826b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } \ 3827b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } \ 3828b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul else { \ 3829b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul const TYPE *s = (const TYPE *) src; \ 3830b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint i; \ 3831b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul for (i = 0; i < n; i++) { \ 383290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][DST_INDEX] = CONVERSION(s[SRC_INDEX]); \ 3833b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul s += stride; \ 3834b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } \ 3835b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 3836b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 3837b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul switch (srcType) { 3838b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul case GL_UNSIGNED_BYTE: 383990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(rSrc, RCOMP, 0, GLubyte, (GLuint)); 384090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(gSrc, GCOMP, 0, GLubyte, (GLuint)); 384190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(bSrc, BCOMP, 0, GLubyte, (GLuint)); 384290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(aSrc, ACOMP, 1, GLubyte, (GLuint)); 3843b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul break; 3844b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul case GL_BYTE: 3845dadbec1e90415f0744eb91e684bf9d7496f474c0Eric Anholt PROCESS(rSrc, RCOMP, 0, GLbyte, (GLuint)); 3846dadbec1e90415f0744eb91e684bf9d7496f474c0Eric Anholt PROCESS(gSrc, GCOMP, 0, GLbyte, (GLuint)); 3847dadbec1e90415f0744eb91e684bf9d7496f474c0Eric Anholt PROCESS(bSrc, BCOMP, 0, GLbyte, (GLuint)); 3848dadbec1e90415f0744eb91e684bf9d7496f474c0Eric Anholt PROCESS(aSrc, ACOMP, 1, GLbyte, (GLuint)); 3849b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul break; 3850b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul case GL_UNSIGNED_SHORT: 385190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(rSrc, RCOMP, 0, GLushort, (GLuint)); 385290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(gSrc, GCOMP, 0, GLushort, (GLuint)); 385390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(bSrc, BCOMP, 0, GLushort, (GLuint)); 385490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(aSrc, ACOMP, 1, GLushort, (GLuint)); 3855b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul break; 3856b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul case GL_SHORT: 3857dadbec1e90415f0744eb91e684bf9d7496f474c0Eric Anholt PROCESS(rSrc, RCOMP, 0, GLshort, (GLuint)); 3858dadbec1e90415f0744eb91e684bf9d7496f474c0Eric Anholt PROCESS(gSrc, GCOMP, 0, GLshort, (GLuint)); 3859dadbec1e90415f0744eb91e684bf9d7496f474c0Eric Anholt PROCESS(bSrc, BCOMP, 0, GLshort, (GLuint)); 3860dadbec1e90415f0744eb91e684bf9d7496f474c0Eric Anholt PROCESS(aSrc, ACOMP, 1, GLshort, (GLuint)); 3861b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul break; 3862b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul case GL_UNSIGNED_INT: 386390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(rSrc, RCOMP, 0, GLuint, (GLuint)); 386490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(gSrc, GCOMP, 0, GLuint, (GLuint)); 386590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(bSrc, BCOMP, 0, GLuint, (GLuint)); 386690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(aSrc, ACOMP, 1, GLuint, (GLuint)); 3867b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul break; 3868b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul case GL_INT: 3869dadbec1e90415f0744eb91e684bf9d7496f474c0Eric Anholt PROCESS(rSrc, RCOMP, 0, GLint, (GLuint)); 3870dadbec1e90415f0744eb91e684bf9d7496f474c0Eric Anholt PROCESS(gSrc, GCOMP, 0, GLint, (GLuint)); 3871dadbec1e90415f0744eb91e684bf9d7496f474c0Eric Anholt PROCESS(bSrc, BCOMP, 0, GLint, (GLuint)); 3872dadbec1e90415f0744eb91e684bf9d7496f474c0Eric Anholt PROCESS(aSrc, ACOMP, 1, GLint, (GLuint)); 3873b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul break; 3874b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul case GL_FLOAT: 387590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(rSrc, RCOMP, 0, GLfloat, clamp_float_to_uint); 387690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(gSrc, GCOMP, 0, GLfloat, clamp_float_to_uint); 387790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(bSrc, BCOMP, 0, GLfloat, clamp_float_to_uint); 387890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(aSrc, ACOMP, 1, GLfloat, clamp_float_to_uint); 3879b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul break; 3880b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul case GL_HALF_FLOAT_ARB: 388190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(rSrc, RCOMP, 0, GLhalfARB, clamp_half_to_uint); 388290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(gSrc, GCOMP, 0, GLhalfARB, clamp_half_to_uint); 388390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(bSrc, BCOMP, 0, GLhalfARB, clamp_half_to_uint); 388490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul PROCESS(aSrc, ACOMP, 1, GLhalfARB, clamp_half_to_uint); 3885b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul break; 3886b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul case GL_UNSIGNED_BYTE_3_3_2: 3887b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul { 3888b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul const GLubyte *ubsrc = (const GLubyte *) src; 3889b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint i; 3890b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul for (i = 0; i < n; i ++) { 3891b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLubyte p = ubsrc[i]; 389290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p >> 5) ); 389390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 2) & 0x7); 389490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p ) & 0x3); 389590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = 1; 3896b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 3897b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 3898b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul break; 3899b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul case GL_UNSIGNED_BYTE_2_3_3_REV: 3900b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul { 3901b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul const GLubyte *ubsrc = (const GLubyte *) src; 3902b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint i; 3903b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul for (i = 0; i < n; i ++) { 3904b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLubyte p = ubsrc[i]; 390590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p ) & 0x7); 390690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 3) & 0x7); 390790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p >> 6) ); 390890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = 1; 3909b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 3910b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 3911b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul break; 3912b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul case GL_UNSIGNED_SHORT_5_6_5: 3913b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul if (swapBytes) { 3914b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul const GLushort *ussrc = (const GLushort *) src; 3915b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint i; 3916b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul for (i = 0; i < n; i ++) { 3917b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLushort p = ussrc[i]; 3918b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul SWAP2BYTE(p); 391990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p >> 11) ); 392090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 5) & 0x3f); 392190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p ) & 0x1f); 392290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = 1; 3923b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 3924b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 3925b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul else { 3926b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul const GLushort *ussrc = (const GLushort *) src; 3927b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint i; 3928b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul for (i = 0; i < n; i ++) { 3929b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLushort p = ussrc[i]; 393090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p >> 11) ); 393190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 5) & 0x3f); 393290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p ) & 0x1f); 393390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = 1; 3934b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 3935b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 3936b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul break; 3937b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul case GL_UNSIGNED_SHORT_5_6_5_REV: 3938b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul if (swapBytes) { 3939b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul const GLushort *ussrc = (const GLushort *) src; 3940b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint i; 3941b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul for (i = 0; i < n; i ++) { 3942b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLushort p = ussrc[i]; 3943b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul SWAP2BYTE(p); 394490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p ) & 0x1f); 394590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 5) & 0x3f); 394690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p >> 11) ); 394790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = 1; 3948b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 3949b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 3950b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul else { 3951b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul const GLushort *ussrc = (const GLushort *) src; 3952b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint i; 3953b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul for (i = 0; i < n; i ++) { 3954b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLushort p = ussrc[i]; 395590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p ) & 0x1f); 395690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 5) & 0x3f); 395790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p >> 11) ); 395890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = 1; 3959b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 3960b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 3961b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul break; 3962b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul case GL_UNSIGNED_SHORT_4_4_4_4: 3963b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul if (swapBytes) { 3964b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul const GLushort *ussrc = (const GLushort *) src; 3965b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint i; 3966b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul for (i = 0; i < n; i ++) { 3967b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLushort p = ussrc[i]; 3968b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul SWAP2BYTE(p); 396990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p >> 12) ); 397090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 8) & 0xf); 397190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p >> 4) & 0xf); 397290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = ((p ) & 0xf); 3973b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 3974b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 3975b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul else { 3976b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul const GLushort *ussrc = (const GLushort *) src; 3977b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint i; 3978b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul for (i = 0; i < n; i ++) { 3979b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLushort p = ussrc[i]; 398090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p >> 12) ); 398190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 8) & 0xf); 398290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p >> 4) & 0xf); 398390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = ((p ) & 0xf); 3984b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 3985b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 3986b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul break; 3987b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul case GL_UNSIGNED_SHORT_4_4_4_4_REV: 3988b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul if (swapBytes) { 3989b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul const GLushort *ussrc = (const GLushort *) src; 3990b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint i; 3991b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul for (i = 0; i < n; i ++) { 3992b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLushort p = ussrc[i]; 3993b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul SWAP2BYTE(p); 399490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p ) & 0xf); 399590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 4) & 0xf); 399690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p >> 8) & 0xf); 399790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = ((p >> 12) ); 3998b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 3999b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4000b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul else { 4001b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul const GLushort *ussrc = (const GLushort *) src; 4002b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint i; 4003b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul for (i = 0; i < n; i ++) { 4004b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLushort p = ussrc[i]; 400590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p ) & 0xf); 400690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 4) & 0xf); 400790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p >> 8) & 0xf); 400890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = ((p >> 12) ); 4009b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4010b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4011b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul break; 4012b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul case GL_UNSIGNED_SHORT_5_5_5_1: 4013b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul if (swapBytes) { 4014b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul const GLushort *ussrc = (const GLushort *) src; 4015b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint i; 4016b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul for (i = 0; i < n; i ++) { 4017b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLushort p = ussrc[i]; 4018b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul SWAP2BYTE(p); 401990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p >> 11) ); 402090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 6) & 0x1f); 402190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p >> 1) & 0x1f); 402290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = ((p ) & 0x1 ); 4023b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4024b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4025b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul else { 4026b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul const GLushort *ussrc = (const GLushort *) src; 4027b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint i; 4028b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul for (i = 0; i < n; i ++) { 4029b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLushort p = ussrc[i]; 403090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p >> 11) ); 403190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 6) & 0x1f); 403290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p >> 1) & 0x1f); 403390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = ((p ) & 0x1 ); 4034b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4035b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4036b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul break; 4037b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul case GL_UNSIGNED_SHORT_1_5_5_5_REV: 4038b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul if (swapBytes) { 4039b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul const GLushort *ussrc = (const GLushort *) src; 4040b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint i; 4041b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul for (i = 0; i < n; i ++) { 4042b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLushort p = ussrc[i]; 4043b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul SWAP2BYTE(p); 404490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p ) & 0x1f); 404590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 5) & 0x1f); 404690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p >> 10) & 0x1f); 404790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = ((p >> 15) ); 4048b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4049b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4050b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul else { 4051b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul const GLushort *ussrc = (const GLushort *) src; 4052b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint i; 4053b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul for (i = 0; i < n; i ++) { 4054b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLushort p = ussrc[i]; 405590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p ) & 0x1f); 405690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 5) & 0x1f); 405790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p >> 10) & 0x1f); 405890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = ((p >> 15) ); 4059b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4060b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4061b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul break; 4062b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul case GL_UNSIGNED_INT_8_8_8_8: 4063b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul if (swapBytes) { 4064b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul const GLuint *uisrc = (const GLuint *) src; 4065b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint i; 4066b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul for (i = 0; i < n; i ++) { 4067b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint p = uisrc[i]; 406890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p ) & 0xff); 406990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 8) & 0xff); 407090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p >> 16) & 0xff); 407190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = ((p >> 24) ); 4072b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4073b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4074b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul else { 4075b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul const GLuint *uisrc = (const GLuint *) src; 4076b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint i; 4077b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul for (i = 0; i < n; i ++) { 4078b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint p = uisrc[i]; 407990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p >> 24) ); 408090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 16) & 0xff); 408190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p >> 8) & 0xff); 408290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = ((p ) & 0xff); 4083b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4084b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4085b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul break; 4086b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul case GL_UNSIGNED_INT_8_8_8_8_REV: 4087b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul if (swapBytes) { 4088b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul const GLuint *uisrc = (const GLuint *) src; 4089b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint i; 4090b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul for (i = 0; i < n; i ++) { 4091b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint p = uisrc[i]; 409290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p >> 24) ); 409390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 16) & 0xff); 409490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p >> 8) & 0xff); 409590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = ((p ) & 0xff); 4096b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4097b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4098b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul else { 4099b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul const GLuint *uisrc = (const GLuint *) src; 4100b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint i; 4101b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul for (i = 0; i < n; i ++) { 4102b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint p = uisrc[i]; 410390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p ) & 0xff); 410490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 8) & 0xff); 410590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p >> 16) & 0xff); 410690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = ((p >> 24) ); 4107b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4108b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4109b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul break; 4110b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul case GL_UNSIGNED_INT_10_10_10_2: 4111b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul if (swapBytes) { 4112b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul const GLuint *uisrc = (const GLuint *) src; 4113b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint i; 4114b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul for (i = 0; i < n; i ++) { 4115b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint p = uisrc[i]; 4116b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul SWAP4BYTE(p); 411790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p >> 22) ); 411890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 12) & 0x3ff); 411990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p >> 2) & 0x3ff); 412090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = ((p ) & 0x3 ); 4121b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4122b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4123b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul else { 4124b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul const GLuint *uisrc = (const GLuint *) src; 4125b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint i; 4126b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul for (i = 0; i < n; i ++) { 4127b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint p = uisrc[i]; 412890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p >> 22) ); 412990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 12) & 0x3ff); 413090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p >> 2) & 0x3ff); 413190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = ((p ) & 0x3 ); 4132b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4133b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4134b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul break; 4135b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul case GL_UNSIGNED_INT_2_10_10_10_REV: 4136b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul if (swapBytes) { 4137b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul const GLuint *uisrc = (const GLuint *) src; 4138b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint i; 4139b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul for (i = 0; i < n; i ++) { 4140b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint p = uisrc[i]; 4141b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul SWAP4BYTE(p); 414290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p ) & 0x3ff); 414390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 10) & 0x3ff); 414490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p >> 20) & 0x3ff); 414590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = ((p >> 30) ); 4146b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4147b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4148b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul else { 4149b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul const GLuint *uisrc = (const GLuint *) src; 4150b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint i; 4151b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul for (i = 0; i < n; i ++) { 4152b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint p = uisrc[i]; 415390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][rDst] = ((p ) & 0x3ff); 415490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][gDst] = ((p >> 10) & 0x3ff); 415590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][bDst] = ((p >> 20) & 0x3ff); 415690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul rgba[i][aDst] = ((p >> 30) ); 4157b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4158b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4159b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul break; 41609d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák case GL_UNSIGNED_INT_5_9_9_9_REV: 41619d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák if (swapBytes) { 41629d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák const GLuint *uisrc = (const GLuint *) src; 41639d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák GLuint i; 41649d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák float f[3]; 41659d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák for (i = 0; i < n; i ++) { 41669d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák GLuint p = uisrc[i]; 41679d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák SWAP4BYTE(p); 41689d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák rgb9e5_to_float3(p, f); 41699d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák rgba[i][rDst] = clamp_float_to_uint(f[0]); 41709d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák rgba[i][gDst] = clamp_float_to_uint(f[1]); 41719d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák rgba[i][bDst] = clamp_float_to_uint(f[2]); 41729d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák rgba[i][aDst] = 1; 41739d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák } 41749d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák } 41759d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák else { 41769d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák const GLuint *uisrc = (const GLuint *) src; 41779d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák GLuint i; 41789d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák float f[3]; 41799d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák for (i = 0; i < n; i ++) { 41809d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák GLuint p = uisrc[i]; 41819d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák rgb9e5_to_float3(p, f); 41829d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák rgba[i][rDst] = clamp_float_to_uint(f[0]); 41839d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák rgba[i][gDst] = clamp_float_to_uint(f[1]); 41849d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák rgba[i][bDst] = clamp_float_to_uint(f[2]); 41859d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák rgba[i][aDst] = 1; 41869d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák } 41879d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák } 41889d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák break; 4189631d23daa91c569bf268a2191bd466df73a64263Marek Olšák case GL_UNSIGNED_INT_10F_11F_11F_REV: 4190631d23daa91c569bf268a2191bd466df73a64263Marek Olšák if (swapBytes) { 4191631d23daa91c569bf268a2191bd466df73a64263Marek Olšák const GLuint *uisrc = (const GLuint *) src; 4192631d23daa91c569bf268a2191bd466df73a64263Marek Olšák GLuint i; 4193631d23daa91c569bf268a2191bd466df73a64263Marek Olšák float f[3]; 4194631d23daa91c569bf268a2191bd466df73a64263Marek Olšák for (i = 0; i < n; i ++) { 4195631d23daa91c569bf268a2191bd466df73a64263Marek Olšák GLuint p = uisrc[i]; 4196631d23daa91c569bf268a2191bd466df73a64263Marek Olšák SWAP4BYTE(p); 4197631d23daa91c569bf268a2191bd466df73a64263Marek Olšák r11g11b10f_to_float3(p, f); 4198631d23daa91c569bf268a2191bd466df73a64263Marek Olšák rgba[i][rDst] = clamp_float_to_uint(f[0]); 4199631d23daa91c569bf268a2191bd466df73a64263Marek Olšák rgba[i][gDst] = clamp_float_to_uint(f[1]); 4200631d23daa91c569bf268a2191bd466df73a64263Marek Olšák rgba[i][bDst] = clamp_float_to_uint(f[2]); 4201631d23daa91c569bf268a2191bd466df73a64263Marek Olšák rgba[i][aDst] = 1; 4202631d23daa91c569bf268a2191bd466df73a64263Marek Olšák } 4203631d23daa91c569bf268a2191bd466df73a64263Marek Olšák } 4204631d23daa91c569bf268a2191bd466df73a64263Marek Olšák else { 4205631d23daa91c569bf268a2191bd466df73a64263Marek Olšák const GLuint *uisrc = (const GLuint *) src; 4206631d23daa91c569bf268a2191bd466df73a64263Marek Olšák GLuint i; 4207631d23daa91c569bf268a2191bd466df73a64263Marek Olšák float f[3]; 4208631d23daa91c569bf268a2191bd466df73a64263Marek Olšák for (i = 0; i < n; i ++) { 4209631d23daa91c569bf268a2191bd466df73a64263Marek Olšák GLuint p = uisrc[i]; 4210631d23daa91c569bf268a2191bd466df73a64263Marek Olšák r11g11b10f_to_float3(p, f); 4211631d23daa91c569bf268a2191bd466df73a64263Marek Olšák rgba[i][rDst] = clamp_float_to_uint(f[0]); 4212631d23daa91c569bf268a2191bd466df73a64263Marek Olšák rgba[i][gDst] = clamp_float_to_uint(f[1]); 4213631d23daa91c569bf268a2191bd466df73a64263Marek Olšák rgba[i][bDst] = clamp_float_to_uint(f[2]); 4214631d23daa91c569bf268a2191bd466df73a64263Marek Olšák rgba[i][aDst] = 1; 4215631d23daa91c569bf268a2191bd466df73a64263Marek Olšák } 4216631d23daa91c569bf268a2191bd466df73a64263Marek Olšák } 4217631d23daa91c569bf268a2191bd466df73a64263Marek Olšák break; 4218b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul default: 4219b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul _mesa_problem(NULL, "bad srcType in extract uint data"); 4220b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul break; 4221b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4222b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul#undef PROCESS 4223b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul} 4224b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 4225b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 4226b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 4227b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul/* 4228b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul * Unpack a row of color image data from a client buffer according to 4229b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul * the pixel unpacking parameters. 4230e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul * Return GLubyte values in the specified dest image format. 4231b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul * This is used by glDrawPixels and glTexImage?D(). 4232b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul * \param ctx - the context 4233b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul * n - number of pixels in the span 4234b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul * dstFormat - format of destination color array 4235b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul * dest - the destination color array 4236b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul * srcFormat - source image format 4237b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul * srcType - source image data type 4238b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul * source - source image pointer 4239b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul * srcPacking - pixel unpacking parameters 4240b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul * transferOps - bitmask of IMAGE_*_BIT values of operations to apply 4241b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul * 4242b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul * XXX perhaps expand this to process whole images someday. 4243b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul */ 4244b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paulvoid 4245e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul_mesa_unpack_color_span_ubyte(struct gl_context *ctx, 4246e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul GLuint n, GLenum dstFormat, GLubyte dest[], 4247b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLenum srcFormat, GLenum srcType, 4248b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul const GLvoid *source, 4249b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul const struct gl_pixelstore_attrib *srcPacking, 4250b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLbitfield transferOps ) 4251b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul{ 42529ad8f431b2a47060bf05517246ab0fa8d249c800Jordan Justen GLboolean intFormat = _mesa_is_enum_format_integer(srcFormat); 4253b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul ASSERT(dstFormat == GL_ALPHA || 4254b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul dstFormat == GL_LUMINANCE || 4255b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul dstFormat == GL_LUMINANCE_ALPHA || 4256b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul dstFormat == GL_INTENSITY || 4257b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul dstFormat == GL_RED || 4258b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul dstFormat == GL_RG || 4259b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul dstFormat == GL_RGB || 42603602fbb201bdea158590692a3a7a7245e0ff69ceIan Romanick dstFormat == GL_RGBA); 4261b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 4262b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul ASSERT(srcFormat == GL_RED || 4263b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_GREEN || 4264b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_BLUE || 4265b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_ALPHA || 4266b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_LUMINANCE || 4267b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_LUMINANCE_ALPHA || 4268b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_INTENSITY || 4269b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_RG || 4270b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_RGB || 4271b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_BGR || 4272b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_RGBA || 4273b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_BGRA || 4274b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_ABGR_EXT || 4275b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_COLOR_INDEX); 4276b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 4277b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul ASSERT(srcType == GL_BITMAP || 4278b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_UNSIGNED_BYTE || 4279b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_BYTE || 4280b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_UNSIGNED_SHORT || 4281b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_SHORT || 4282b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_UNSIGNED_INT || 4283b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_INT || 4284b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_HALF_FLOAT_ARB || 4285b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_FLOAT || 4286b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_UNSIGNED_BYTE_3_3_2 || 4287b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 4288b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_UNSIGNED_SHORT_5_6_5 || 4289b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 4290b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 4291b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 4292b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 4293b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 4294b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_UNSIGNED_INT_8_8_8_8 || 4295b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 4296b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_UNSIGNED_INT_10_10_10_2 || 42979d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák srcType == GL_UNSIGNED_INT_2_10_10_10_REV || 4298631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcType == GL_UNSIGNED_INT_5_9_9_9_REV || 4299631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcType == GL_UNSIGNED_INT_10F_11F_11F_REV); 4300b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 43011ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie /* EXT_texture_integer specifies no transfer ops on integer 43021ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie * types in the resolved issues section. Just set them to 0 43031ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie * for integer surfaces. 43041ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie */ 43051ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie if (intFormat) 43061ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie transferOps = 0; 43071ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie 4308b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul /* Try simple cases first */ 4309b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul if (transferOps == 0) { 4310e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul if (srcType == GL_UNSIGNED_BYTE) { 4311b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul if (dstFormat == GL_RGBA) { 4312b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul if (srcFormat == GL_RGBA) { 4313e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul memcpy( dest, source, n * 4 * sizeof(GLubyte) ); 4314b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul return; 4315b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4316b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul else if (srcFormat == GL_RGB) { 4317b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint i; 4318e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul const GLubyte *src = (const GLubyte *) source; 4319e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul GLubyte *dst = dest; 4320b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul for (i = 0; i < n; i++) { 4321b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul dst[0] = src[0]; 4322b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul dst[1] = src[1]; 4323b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul dst[2] = src[2]; 4324e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul dst[3] = 255; 4325b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul src += 3; 4326b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul dst += 4; 4327b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4328b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul return; 4329b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4330b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4331b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul else if (dstFormat == GL_RGB) { 4332b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul if (srcFormat == GL_RGB) { 4333e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul memcpy( dest, source, n * 3 * sizeof(GLubyte) ); 4334b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul return; 4335b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4336b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul else if (srcFormat == GL_RGBA) { 4337b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint i; 4338e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul const GLubyte *src = (const GLubyte *) source; 4339e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul GLubyte *dst = dest; 4340b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul for (i = 0; i < n; i++) { 4341b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul dst[0] = src[0]; 4342b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul dst[1] = src[1]; 4343b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul dst[2] = src[2]; 4344b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul src += 4; 4345b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul dst += 3; 4346b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4347b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul return; 4348b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4349b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4350b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul else if (dstFormat == srcFormat) { 4351b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLint comps = _mesa_components_in_format(srcFormat); 4352b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul assert(comps > 0); 4353e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul memcpy( dest, source, n * comps * sizeof(GLubyte) ); 4354b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul return; 4355b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4356b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4357b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4358b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 4359b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 4360b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul /* general solution begins here */ 4361b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul { 4362b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLint dstComponents; 436390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul GLint rDst, gDst, bDst, aDst, lDst, iDst; 43642addcb7b50e6f1e821c06a295038194216ca1869Brian Paul GLfloat (*rgba)[4] = (GLfloat (*)[4]) malloc(4 * n * sizeof(GLfloat)); 43652addcb7b50e6f1e821c06a295038194216ca1869Brian Paul 43662addcb7b50e6f1e821c06a295038194216ca1869Brian Paul if (!rgba) { 43672addcb7b50e6f1e821c06a295038194216ca1869Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 43682addcb7b50e6f1e821c06a295038194216ca1869Brian Paul return; 43692addcb7b50e6f1e821c06a295038194216ca1869Brian Paul } 4370b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 4371b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul dstComponents = _mesa_components_in_format( dstFormat ); 4372b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul /* source & dest image formats should have been error checked by now */ 4373b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul assert(dstComponents > 0); 4374b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 4375b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul /* 4376b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul * Extract image data and convert to RGBA floats 4377b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul */ 4378b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul if (srcFormat == GL_COLOR_INDEX) { 437936b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint)); 438036b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul 438136b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul if (!indexes) { 438236b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 43834e6a0b40c5bb31101718f25ffaff8ffeb3d921b9Vinson Lee free(rgba); 438436b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul return; 438536b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul } 438636b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul 4387b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul extract_uint_indexes(n, indexes, srcFormat, srcType, source, 4388b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcPacking); 4389b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 43903602fbb201bdea158590692a3a7a7245e0ff69ceIan Romanick /* Convert indexes to RGBA */ 43913602fbb201bdea158590692a3a7a7245e0ff69ceIan Romanick if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 43923602fbb201bdea158590692a3a7a7245e0ff69ceIan Romanick _mesa_shift_and_offset_ci(ctx, n, indexes); 43933602fbb201bdea158590692a3a7a7245e0ff69ceIan Romanick } 43943602fbb201bdea158590692a3a7a7245e0ff69ceIan Romanick _mesa_map_ci_to_rgba(ctx, n, indexes, rgba); 4395b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 4396b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting 4397b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul * with color indexes. 4398b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul */ 4399b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul transferOps &= ~(IMAGE_SCALE_BIAS_BIT | IMAGE_MAP_COLOR_BIT); 440036b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul 440136b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul free(indexes); 4402b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4403b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul else { 4404b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul /* non-color index data */ 4405b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul extract_float_rgba(n, rgba, srcFormat, srcType, source, 4406b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcPacking->SwapBytes); 4407b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4408b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 4409e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul /* Need to clamp if returning GLubytes */ 4410b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul transferOps |= IMAGE_CLAMP_BIT; 4411b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 4412b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul if (transferOps) { 4413b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba); 4414b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4415b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 441690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul get_component_indexes(dstFormat, 441790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul &rDst, &gDst, &bDst, &aDst, &lDst, &iDst); 44181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 4419e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul /* Now return the GLubyte data in the requested dstFormat */ 442090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul if (rDst >= 0) { 4421e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul GLubyte *dst = dest; 44221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 44231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 4424e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul CLAMPED_FLOAT_TO_UBYTE(dst[rDst], rgba[i][RCOMP]); 44251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst += dstComponents; 44261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 44271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 44281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 442990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul if (gDst >= 0) { 4430e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul GLubyte *dst = dest; 44311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 44321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 4433e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul CLAMPED_FLOAT_TO_UBYTE(dst[gDst], rgba[i][GCOMP]); 44341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst += dstComponents; 44351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 44361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 44371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 443890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul if (bDst >= 0) { 4439e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul GLubyte *dst = dest; 44401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 44411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 4442e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul CLAMPED_FLOAT_TO_UBYTE(dst[bDst], rgba[i][BCOMP]); 44431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst += dstComponents; 44441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 44451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 44461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 444790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul if (aDst >= 0) { 4448e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul GLubyte *dst = dest; 44491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 44501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 4451e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul CLAMPED_FLOAT_TO_UBYTE(dst[aDst], rgba[i][ACOMP]); 44521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst += dstComponents; 44531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 44541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 44551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 445690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul if (iDst >= 0) { 4457e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul GLubyte *dst = dest; 44581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 445990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul assert(iDst == 0); 44601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul assert(dstComponents == 1); 44611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 44621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* Intensity comes from red channel */ 4463e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul CLAMPED_FLOAT_TO_UBYTE(dst[i], rgba[i][RCOMP]); 44641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 44651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 44661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 446790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul if (lDst >= 0) { 4468e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul GLubyte *dst = dest; 44691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 447090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul assert(lDst == 0); 44711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 44721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* Luminance comes from red channel */ 4473e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul CLAMPED_FLOAT_TO_UBYTE(dst[0], rgba[i][RCOMP]); 44741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst += dstComponents; 44751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 44761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 44772addcb7b50e6f1e821c06a295038194216ca1869Brian Paul 44782addcb7b50e6f1e821c06a295038194216ca1869Brian Paul free(rgba); 44791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 44801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul} 44811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 44821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 44831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul/** 4484e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul * Same as _mesa_unpack_color_span_ubyte(), but return GLfloat data 4485e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul * instead of GLubyte. 44861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */ 44871c131752c3e07ef91f49d4970dafca6d26585334Brian Paulvoid 44881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul_mesa_unpack_color_span_float( struct gl_context *ctx, 44891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint n, GLenum dstFormat, GLfloat dest[], 44901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLenum srcFormat, GLenum srcType, 44911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLvoid *source, 44921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const struct gl_pixelstore_attrib *srcPacking, 44931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLbitfield transferOps ) 44941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{ 44951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul ASSERT(dstFormat == GL_ALPHA || 44961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dstFormat == GL_LUMINANCE || 44971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dstFormat == GL_LUMINANCE_ALPHA || 44981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dstFormat == GL_INTENSITY || 44991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dstFormat == GL_RED || 45001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dstFormat == GL_RG || 45011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dstFormat == GL_RGB || 45023602fbb201bdea158590692a3a7a7245e0ff69ceIan Romanick dstFormat == GL_RGBA); 45031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 45041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul ASSERT(srcFormat == GL_RED || 45051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_GREEN || 45061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_BLUE || 45071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_ALPHA || 45081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_LUMINANCE || 45091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_LUMINANCE_ALPHA || 45101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_INTENSITY || 45111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_RG || 45121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_RGB || 45131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_BGR || 45141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_RGBA || 45151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_BGRA || 45161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_ABGR_EXT || 45171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_RED_INTEGER_EXT || 45181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_GREEN_INTEGER_EXT || 45191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_BLUE_INTEGER_EXT || 45201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_ALPHA_INTEGER_EXT || 45210e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick srcFormat == GL_RG_INTEGER || 45221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_RGB_INTEGER_EXT || 45231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_RGBA_INTEGER_EXT || 45241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_BGR_INTEGER_EXT || 45251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_BGRA_INTEGER_EXT || 45261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_LUMINANCE_INTEGER_EXT || 45271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT || 45281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcFormat == GL_COLOR_INDEX); 45291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 45301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul ASSERT(srcType == GL_BITMAP || 45311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_BYTE || 45321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_BYTE || 45331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_SHORT || 45341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_SHORT || 45351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_INT || 45361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_INT || 45371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_HALF_FLOAT_ARB || 45381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_FLOAT || 45391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_BYTE_3_3_2 || 45401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 45411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_SHORT_5_6_5 || 45421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 45431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 45441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 45451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 45461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 45471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_INT_8_8_8_8 || 45481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 45491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_INT_10_10_10_2 || 45509d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák srcType == GL_UNSIGNED_INT_2_10_10_10_REV || 4551631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcType == GL_UNSIGNED_INT_5_9_9_9_REV || 4552631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcType == GL_UNSIGNED_INT_10F_11F_11F_REV); 45531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 45541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* general solution, no special cases, yet */ 45551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 45561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLint dstComponents; 455790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul GLint rDst, gDst, bDst, aDst, lDst, iDst; 45582addcb7b50e6f1e821c06a295038194216ca1869Brian Paul GLfloat (*rgba)[4] = (GLfloat (*)[4]) malloc(4 * n * sizeof(GLfloat)); 45599ad8f431b2a47060bf05517246ab0fa8d249c800Jordan Justen GLboolean intFormat = _mesa_is_enum_format_integer(srcFormat); 45602addcb7b50e6f1e821c06a295038194216ca1869Brian Paul 45612addcb7b50e6f1e821c06a295038194216ca1869Brian Paul if (!rgba) { 45622addcb7b50e6f1e821c06a295038194216ca1869Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 45632addcb7b50e6f1e821c06a295038194216ca1869Brian Paul return; 45642addcb7b50e6f1e821c06a295038194216ca1869Brian Paul } 45651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 45661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dstComponents = _mesa_components_in_format( dstFormat ); 45671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* source & dest image formats should have been error checked by now */ 45681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul assert(dstComponents > 0); 45691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 45701ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie /* EXT_texture_integer specifies no transfer ops on integer 45711ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie * types in the resolved issues section. Just set them to 0 45721ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie * for integer surfaces. 45731ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie */ 45741ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie if (intFormat) 45751ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie transferOps = 0; 45761ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie 45771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* 45781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Extract image data and convert to RGBA floats 45791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */ 45801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (srcFormat == GL_COLOR_INDEX) { 458136b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint)); 458236b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul 458336b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul if (!indexes) { 458436b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 458536b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul free(rgba); 458636b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul return; 458736b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul } 458836b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul 45891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul extract_uint_indexes(n, indexes, srcFormat, srcType, source, 45901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcPacking); 45911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 45923602fbb201bdea158590692a3a7a7245e0ff69ceIan Romanick /* Convert indexes to RGBA */ 45933602fbb201bdea158590692a3a7a7245e0ff69ceIan Romanick if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 45943602fbb201bdea158590692a3a7a7245e0ff69ceIan Romanick _mesa_shift_and_offset_ci(ctx, n, indexes); 45953602fbb201bdea158590692a3a7a7245e0ff69ceIan Romanick } 45963602fbb201bdea158590692a3a7a7245e0ff69ceIan Romanick _mesa_map_ci_to_rgba(ctx, n, indexes, rgba); 45971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 45981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting 45991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * with color indexes. 46001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */ 46011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul transferOps &= ~(IMAGE_SCALE_BIAS_BIT | IMAGE_MAP_COLOR_BIT); 46022addcb7b50e6f1e821c06a295038194216ca1869Brian Paul 460336b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul free(indexes); 46041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 46051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 46061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* non-color index data */ 46071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul extract_float_rgba(n, rgba, srcFormat, srcType, source, 46081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcPacking->SwapBytes); 46091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 46101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 46111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (transferOps) { 46121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba); 46131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 46141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 461590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul get_component_indexes(dstFormat, 461690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul &rDst, &gDst, &bDst, &aDst, &lDst, &iDst); 46171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 46181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* Now pack results in the requested dstFormat */ 461990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul if (rDst >= 0) { 46201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLfloat *dst = dest; 46211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 46221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 462390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul dst[rDst] = rgba[i][RCOMP]; 46241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst += dstComponents; 46251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 46261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 46271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 462890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul if (gDst >= 0) { 46291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLfloat *dst = dest; 46301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 46311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 463290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul dst[gDst] = rgba[i][GCOMP]; 46331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst += dstComponents; 46341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 46351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 46361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 463790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul if (bDst >= 0) { 46381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLfloat *dst = dest; 46391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 46401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 464190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul dst[bDst] = rgba[i][BCOMP]; 46421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst += dstComponents; 46431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 46441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 46451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 464690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul if (aDst >= 0) { 46471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLfloat *dst = dest; 46481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 46491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 465090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul dst[aDst] = rgba[i][ACOMP]; 46511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst += dstComponents; 46521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 46531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 46541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 465590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul if (iDst >= 0) { 46561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLfloat *dst = dest; 46571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 465890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul assert(iDst == 0); 46591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul assert(dstComponents == 1); 46601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 46611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* Intensity comes from red channel */ 46621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = rgba[i][RCOMP]; 46631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 46641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 46651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 466690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul if (lDst >= 0) { 46671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLfloat *dst = dest; 46681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 466990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul assert(lDst == 0); 46701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 46711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* Luminance comes from red channel */ 46721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[0] = rgba[i][RCOMP]; 46731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst += dstComponents; 46741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 46751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 467636b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul 467736b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul free(rgba); 46781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 46791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul} 46801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 4681b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 4682b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul/** 4683e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul * Same as _mesa_unpack_color_span_ubyte(), but return GLuint data 4684e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul * instead of GLubyte. 4685b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul * No pixel transfer ops are applied. 4686b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul */ 4687b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paulvoid 4688b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul_mesa_unpack_color_span_uint(struct gl_context *ctx, 4689b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint n, GLenum dstFormat, GLuint *dest, 4690b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLenum srcFormat, GLenum srcType, 4691b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul const GLvoid *source, 4692b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul const struct gl_pixelstore_attrib *srcPacking) 4693b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul{ 46942addcb7b50e6f1e821c06a295038194216ca1869Brian Paul GLuint (*rgba)[4] = (GLuint (*)[4]) malloc(n * 4 * sizeof(GLfloat)); 46952addcb7b50e6f1e821c06a295038194216ca1869Brian Paul 46962addcb7b50e6f1e821c06a295038194216ca1869Brian Paul if (!rgba) { 46972addcb7b50e6f1e821c06a295038194216ca1869Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 46982addcb7b50e6f1e821c06a295038194216ca1869Brian Paul return; 46992addcb7b50e6f1e821c06a295038194216ca1869Brian Paul } 4700b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 4701b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul ASSERT(dstFormat == GL_ALPHA || 4702b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul dstFormat == GL_LUMINANCE || 4703b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul dstFormat == GL_LUMINANCE_ALPHA || 4704b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul dstFormat == GL_INTENSITY || 4705b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul dstFormat == GL_RED || 4706b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul dstFormat == GL_RG || 4707b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul dstFormat == GL_RGB || 4708b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul dstFormat == GL_RGBA); 4709b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 4710b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul ASSERT(srcFormat == GL_RED || 4711b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_GREEN || 4712b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_BLUE || 4713b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_ALPHA || 4714b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_LUMINANCE || 4715b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_LUMINANCE_ALPHA || 4716b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_INTENSITY || 4717b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_RG || 4718b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_RGB || 4719b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_BGR || 4720b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_RGBA || 4721b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_BGRA || 4722b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_ABGR_EXT || 4723b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_RED_INTEGER_EXT || 4724b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_GREEN_INTEGER_EXT || 4725b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_BLUE_INTEGER_EXT || 4726b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_ALPHA_INTEGER_EXT || 4727f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie srcFormat == GL_RG_INTEGER || 4728b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_RGB_INTEGER_EXT || 4729b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_RGBA_INTEGER_EXT || 4730b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_BGR_INTEGER_EXT || 4731b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_BGRA_INTEGER_EXT || 4732b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_LUMINANCE_INTEGER_EXT || 4733b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT); 4734b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 4735b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul ASSERT(srcType == GL_UNSIGNED_BYTE || 4736b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_BYTE || 4737b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_UNSIGNED_SHORT || 4738b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_SHORT || 4739b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_UNSIGNED_INT || 4740b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_INT || 4741b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_HALF_FLOAT_ARB || 4742b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_FLOAT || 4743b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_UNSIGNED_BYTE_3_3_2 || 4744b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 4745b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_UNSIGNED_SHORT_5_6_5 || 4746b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 4747b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 4748b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 4749b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 4750b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 4751b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_UNSIGNED_INT_8_8_8_8 || 4752b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 4753b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcType == GL_UNSIGNED_INT_10_10_10_2 || 47549d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák srcType == GL_UNSIGNED_INT_2_10_10_10_REV || 4755631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcType == GL_UNSIGNED_INT_5_9_9_9_REV || 4756631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcType == GL_UNSIGNED_INT_10F_11F_11F_REV); 4757b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 4758b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 4759b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul /* Extract image data as uint[4] pixels */ 4760b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul extract_uint_rgba(n, rgba, srcFormat, srcType, source, 4761b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul srcPacking->SwapBytes); 4762b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 4763b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul if (dstFormat == GL_RGBA) { 4764b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul /* simple case */ 4765b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul memcpy(dest, rgba, 4 * sizeof(GLuint) * n); 4766b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4767b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul else { 4768b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul /* general case */ 476990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul GLint rDst, gDst, bDst, aDst, lDst, iDst; 4770b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLint dstComponents = _mesa_components_in_format( dstFormat ); 4771b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 4772b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul assert(dstComponents > 0); 4773b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 477490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul get_component_indexes(dstFormat, 477590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul &rDst, &gDst, &bDst, &aDst, &lDst, &iDst); 4776b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 4777b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul /* Now pack values in the requested dest format */ 477890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul if (rDst >= 0) { 4779b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint *dst = dest; 4780b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint i; 4781b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul for (i = 0; i < n; i++) { 478290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul dst[rDst] = rgba[i][RCOMP]; 4783b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul dst += dstComponents; 4784b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4785b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4786b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 478790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul if (gDst >= 0) { 4788b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint *dst = dest; 4789b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint i; 4790b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul for (i = 0; i < n; i++) { 479190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul dst[gDst] = rgba[i][GCOMP]; 4792b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul dst += dstComponents; 4793b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4794b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4795b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 479690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul if (bDst >= 0) { 4797b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint *dst = dest; 4798b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint i; 4799b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul for (i = 0; i < n; i++) { 480090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul dst[bDst] = rgba[i][BCOMP]; 4801b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul dst += dstComponents; 4802b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4803b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4804b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 480590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul if (aDst >= 0) { 4806b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint *dst = dest; 4807b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint i; 4808b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul for (i = 0; i < n; i++) { 480990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul dst[aDst] = rgba[i][ACOMP]; 4810b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul dst += dstComponents; 4811b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4812b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4813b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 481490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul if (iDst >= 0) { 4815b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint *dst = dest; 4816b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint i; 481790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul assert(iDst == 0); 4818b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul assert(dstComponents == 1); 4819b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul for (i = 0; i < n; i++) { 4820b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul /* Intensity comes from red channel */ 4821b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul dst[i] = rgba[i][RCOMP]; 4822b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4823b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4824b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 482590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul if (lDst >= 0) { 4826b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint *dst = dest; 4827b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul GLuint i; 482890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul assert(lDst == 0); 4829b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul for (i = 0; i < n; i++) { 4830b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul /* Luminance comes from red channel */ 4831b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul dst[0] = rgba[i][RCOMP]; 4832b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul dst += dstComponents; 4833b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4834b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 4835b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul } 48362addcb7b50e6f1e821c06a295038194216ca1869Brian Paul 48372addcb7b50e6f1e821c06a295038194216ca1869Brian Paul free(rgba); 4838b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul} 4839b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 4840b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 4841b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul 48421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul/** 48431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba, 48441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * directly return GLbyte data, no transfer ops apply. 48451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */ 48461c131752c3e07ef91f49d4970dafca6d26585334Brian Paulvoid 48471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul_mesa_unpack_dudv_span_byte( struct gl_context *ctx, 48481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint n, GLenum dstFormat, GLbyte dest[], 48491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLenum srcFormat, GLenum srcType, 48501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLvoid *source, 48511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const struct gl_pixelstore_attrib *srcPacking, 48521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLbitfield transferOps ) 48531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{ 48541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul ASSERT(dstFormat == GL_DUDV_ATI); 485514eedf3028422e98ac05713a3e3c37e6c9b4cf37Eric Anholt ASSERT(srcFormat == GL_DUDV_ATI || 485614eedf3028422e98ac05713a3e3c37e6c9b4cf37Eric Anholt srcFormat == GL_DU8DV8_ATI); 48571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 48581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul ASSERT(srcType == GL_UNSIGNED_BYTE || 48591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_BYTE || 48601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_SHORT || 48611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_SHORT || 48621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_INT || 48631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_INT || 48641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_HALF_FLOAT_ARB || 48651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_FLOAT); 48661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 48671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* general solution */ 48681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 48691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLint dstComponents; 48701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLbyte *dst = dest; 48711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 48722addcb7b50e6f1e821c06a295038194216ca1869Brian Paul GLfloat (*rgba)[4] = (GLfloat (*)[4]) malloc(4 * n * sizeof(GLfloat)); 48732addcb7b50e6f1e821c06a295038194216ca1869Brian Paul 48742addcb7b50e6f1e821c06a295038194216ca1869Brian Paul if (!rgba) { 48752addcb7b50e6f1e821c06a295038194216ca1869Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 48762addcb7b50e6f1e821c06a295038194216ca1869Brian Paul return; 48772addcb7b50e6f1e821c06a295038194216ca1869Brian Paul } 48781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 48791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dstComponents = _mesa_components_in_format( dstFormat ); 48801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* source & dest image formats should have been error checked by now */ 48811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul assert(dstComponents > 0); 48821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 48831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* 48841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Extract image data and convert to RGBA floats 48851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */ 48861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul extract_float_rgba(n, rgba, srcFormat, srcType, source, 48871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcPacking->SwapBytes); 48881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 48891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 48901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* Now determine which color channels we need to produce. 48911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * And determine the dest index (offset) within each color tuple. 48921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */ 48931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 48941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* Now pack results in the requested dstFormat */ 48951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 48961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* not sure - need clamp[-1,1] here? */ 48971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[0] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 48981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 48991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst += dstComponents; 49001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 49012addcb7b50e6f1e821c06a295038194216ca1869Brian Paul 49022addcb7b50e6f1e821c06a295038194216ca1869Brian Paul free(rgba); 49031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 49041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul} 49051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 49061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul/* 49071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Unpack a row of color index data from a client buffer according to 49081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * the pixel unpacking parameters. 49091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc. 49101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * 49111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Args: ctx - the context 49121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * n - number of pixels 49131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * dstType - destination data type 49141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * dest - destination array 49151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * srcType - source pixel type 49161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * source - source data pointer 49171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * srcPacking - pixel unpacking parameters 49181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * transferOps - the pixel transfer operations to apply 49191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */ 49201c131752c3e07ef91f49d4970dafca6d26585334Brian Paulvoid 492136b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul_mesa_unpack_index_span( struct gl_context *ctx, GLuint n, 49221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLenum dstType, GLvoid *dest, 49231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLenum srcType, const GLvoid *source, 49241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const struct gl_pixelstore_attrib *srcPacking, 49251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLbitfield transferOps ) 49261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{ 49271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul ASSERT(srcType == GL_BITMAP || 49281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_BYTE || 49291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_BYTE || 49301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_SHORT || 49311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_SHORT || 49321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_INT || 49331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_INT || 49341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_HALF_FLOAT_ARB || 49351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_FLOAT); 49361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 49371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul ASSERT(dstType == GL_UNSIGNED_BYTE || 49381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dstType == GL_UNSIGNED_SHORT || 49391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dstType == GL_UNSIGNED_INT); 49401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 49411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 49421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT); 49431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 49441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* 49451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Try simple cases first 49461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */ 49471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (transferOps == 0 && srcType == GL_UNSIGNED_BYTE 49481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul && dstType == GL_UNSIGNED_BYTE) { 49491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul memcpy(dest, source, n * sizeof(GLubyte)); 49501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 49511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else if (transferOps == 0 && srcType == GL_UNSIGNED_INT 49521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul && dstType == GL_UNSIGNED_INT && !srcPacking->SwapBytes) { 49531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul memcpy(dest, source, n * sizeof(GLuint)); 49541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 49551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 49561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* 49571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * general solution 49581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */ 495936b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint)); 496036b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul 496136b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul if (!indexes) { 496236b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 496336b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul return; 496436b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul } 49651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 49661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source, 49671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcPacking); 49681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 49691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (transferOps) 49701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes); 49711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 49721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* convert to dest type */ 49731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul switch (dstType) { 49741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_BYTE: 49751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 49761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte *dst = (GLubyte *) dest; 49771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 49781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 49791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = (GLubyte) (indexes[i] & 0xff); 49801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 49811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 49821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 49831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_SHORT: 49841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 49851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint *dst = (GLuint *) dest; 49861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 49871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 49881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = (GLushort) (indexes[i] & 0xffff); 49891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 49901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 49911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 49921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_INT: 49931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul memcpy(dest, indexes, n * sizeof(GLuint)); 49941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 49951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul default: 49961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_problem(ctx, "bad dstType in _mesa_unpack_index_span"); 49971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 499836b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul 499936b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul free(indexes); 50001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 50011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul} 50021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 50031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 50041c131752c3e07ef91f49d4970dafca6d26585334Brian Paulvoid 500536b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul_mesa_pack_index_span( struct gl_context *ctx, GLuint n, 50061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLenum dstType, GLvoid *dest, const GLuint *source, 50071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const struct gl_pixelstore_attrib *dstPacking, 50081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLbitfield transferOps ) 50091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{ 501036b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint)); 50111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 501236b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul if (!indexes) { 501336b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing"); 501436b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul return; 501536b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul } 50161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 50171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT); 50181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 50191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (transferOps & (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT)) { 50201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* make a copy of input */ 50211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul memcpy(indexes, source, n * sizeof(GLuint)); 50221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes); 50231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul source = indexes; 50241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 50251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 50261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul switch (dstType) { 50271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_BYTE: 50281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 50291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte *dst = (GLubyte *) dest; 50301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 50311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 50321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *dst++ = (GLubyte) source[i]; 50331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 50341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 50351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 50361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_BYTE: 50371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 50381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLbyte *dst = (GLbyte *) dest; 50391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 50401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 50411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = (GLbyte) source[i]; 50421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 50431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 50441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 50451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_SHORT: 50461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 50471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLushort *dst = (GLushort *) dest; 50481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 50491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 50501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = (GLushort) source[i]; 50511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 50521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstPacking->SwapBytes) { 50531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_swap2( (GLushort *) dst, n ); 50541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 50551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 50561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 50571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_SHORT: 50581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 50591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLshort *dst = (GLshort *) dest; 50601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 50611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 50621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = (GLshort) source[i]; 50631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 50641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstPacking->SwapBytes) { 50651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_swap2( (GLushort *) dst, n ); 50661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 50671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 50681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 50691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_INT: 50701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 50711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint *dst = (GLuint *) dest; 50721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 50731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 50741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = (GLuint) source[i]; 50751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 50761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstPacking->SwapBytes) { 50771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_swap4( (GLuint *) dst, n ); 50781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 50791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 50801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 50811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_INT: 50821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 50831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLint *dst = (GLint *) dest; 50841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 50851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 50861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = (GLint) source[i]; 50871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 50881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstPacking->SwapBytes) { 50891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_swap4( (GLuint *) dst, n ); 50901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 50911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 50921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 50931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_FLOAT: 50941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 50951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLfloat *dst = (GLfloat *) dest; 50961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 50971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 50981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = (GLfloat) source[i]; 50991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 51001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstPacking->SwapBytes) { 51011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_swap4( (GLuint *) dst, n ); 51021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 51031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 51041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 51051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_HALF_FLOAT_ARB: 51061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 51071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLhalfARB *dst = (GLhalfARB *) dest; 51081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 51091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 51101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = _mesa_float_to_half((GLfloat) source[i]); 51111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 51121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstPacking->SwapBytes) { 51131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_swap2( (GLushort *) dst, n ); 51141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 51151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 51161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 51171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul default: 51181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_problem(ctx, "bad type in _mesa_pack_index_span"); 51191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 512036b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul 512136b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul free(indexes); 51221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul} 51231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 51241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 51251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul/* 51261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Unpack a row of stencil data from a client buffer according to 51271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * the pixel unpacking parameters. 51281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * This is (or will be) used by glDrawPixels 51291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * 51301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Args: ctx - the context 51311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * n - number of pixels 51321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * dstType - destination data type 51331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * dest - destination array 51341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * srcType - source pixel type 51351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * source - source data pointer 51361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * srcPacking - pixel unpacking parameters 51371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * transferOps - apply offset/bias/lookup ops? 51381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */ 51391c131752c3e07ef91f49d4970dafca6d26585334Brian Paulvoid 514036b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul_mesa_unpack_stencil_span( struct gl_context *ctx, GLuint n, 51411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLenum dstType, GLvoid *dest, 51421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLenum srcType, const GLvoid *source, 51431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const struct gl_pixelstore_attrib *srcPacking, 51441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLbitfield transferOps ) 51451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{ 51461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul ASSERT(srcType == GL_BITMAP || 51471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_BYTE || 51481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_BYTE || 51491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_SHORT || 51501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_SHORT || 51511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_INT || 51521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_INT || 51531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_INT_24_8_EXT || 51541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_HALF_FLOAT_ARB || 5155ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák srcType == GL_FLOAT || 5156ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák srcType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV); 51571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 51581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul ASSERT(dstType == GL_UNSIGNED_BYTE || 51591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dstType == GL_UNSIGNED_SHORT || 5160ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák dstType == GL_UNSIGNED_INT || 5161ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák dstType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV); 51621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 51631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* only shift and offset apply to stencil */ 51641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul transferOps &= IMAGE_SHIFT_OFFSET_BIT; 51651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 51661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* 51671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Try simple cases first 51681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */ 51691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (transferOps == 0 && 51701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul !ctx->Pixel.MapStencilFlag && 51711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_BYTE && 51721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dstType == GL_UNSIGNED_BYTE) { 51731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul memcpy(dest, source, n * sizeof(GLubyte)); 51741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 51751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else if (transferOps == 0 && 51761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul !ctx->Pixel.MapStencilFlag && 51771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcType == GL_UNSIGNED_INT && 51781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dstType == GL_UNSIGNED_INT && 51791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul !srcPacking->SwapBytes) { 51801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul memcpy(dest, source, n * sizeof(GLuint)); 51811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 51821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 51831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* 51841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * general solution 51851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */ 518636b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint)); 518736b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul 518836b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul if (!indexes) { 518936b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "stencil unpacking"); 519036b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul return; 519136b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul } 51921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 51931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul extract_uint_indexes(n, indexes, GL_STENCIL_INDEX, srcType, source, 51941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcPacking); 51951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 51961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 51971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* shift and offset indexes */ 51981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_shift_and_offset_ci(ctx, n, indexes); 51991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 52001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 52011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (ctx->Pixel.MapStencilFlag) { 52021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* Apply stencil lookup table */ 52031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLuint mask = ctx->PixelMaps.StoS.Size - 1; 52041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 52051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 52061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul indexes[i] = (GLuint)ctx->PixelMaps.StoS.Map[ indexes[i] & mask ]; 52071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 52081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 52091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 52101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* convert to dest type */ 52111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul switch (dstType) { 52121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_BYTE: 52131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 52141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte *dst = (GLubyte *) dest; 52151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 52161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 52171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = (GLubyte) (indexes[i] & 0xff); 52181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 52191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 52201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 52211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_SHORT: 52221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 52231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint *dst = (GLuint *) dest; 52241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 52251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 52261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = (GLushort) (indexes[i] & 0xffff); 52271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 52281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 52291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 52301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_INT: 52311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul memcpy(dest, indexes, n * sizeof(GLuint)); 52321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 5233ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 5234ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák { 5235ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák GLuint *dst = (GLuint *) dest; 5236ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák GLuint i; 5237ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák for (i = 0; i < n; i++) { 5238ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák dst[i*2+1] = indexes[i] & 0xff; /* lower 8 bits */ 5239ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák } 5240ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák } 5241ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák break; 52421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul default: 52431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_problem(ctx, "bad dstType in _mesa_unpack_stencil_span"); 52441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 524536b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul 524636b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul free(indexes); 52471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 52481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul} 52491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 52501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 52511c131752c3e07ef91f49d4970dafca6d26585334Brian Paulvoid 525236b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul_mesa_pack_stencil_span( struct gl_context *ctx, GLuint n, 52536d68855df133bdd4891e8aa428787b520739e0feBrian Paul GLenum dstType, GLvoid *dest, const GLubyte *source, 52541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const struct gl_pixelstore_attrib *dstPacking ) 52551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{ 52566d68855df133bdd4891e8aa428787b520739e0feBrian Paul GLubyte *stencil = (GLubyte *) malloc(n * sizeof(GLubyte)); 52571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 525836b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul if (!stencil) { 525936b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "stencil packing"); 526036b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul return; 526136b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul } 52621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 52631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset || 52641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul ctx->Pixel.MapStencilFlag) { 52651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* make a copy of input */ 52666d68855df133bdd4891e8aa428787b520739e0feBrian Paul memcpy(stencil, source, n * sizeof(GLubyte)); 52671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_apply_stencil_transfer_ops(ctx, n, stencil); 52681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul source = stencil; 52691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 52701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 52711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul switch (dstType) { 52721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_BYTE: 52736d68855df133bdd4891e8aa428787b520739e0feBrian Paul memcpy(dest, source, n); 52741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 52751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_BYTE: 52761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 52771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLbyte *dst = (GLbyte *) dest; 52781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 52791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 52801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = (GLbyte) (source[i] & 0x7f); 52811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 52821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 52831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 52841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_SHORT: 52851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 52861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLushort *dst = (GLushort *) dest; 52871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 52881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 52891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = (GLushort) source[i]; 52901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 52911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstPacking->SwapBytes) { 52921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_swap2( (GLushort *) dst, n ); 52931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 52941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 52951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 52961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_SHORT: 52971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 52981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLshort *dst = (GLshort *) dest; 52991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 53001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 53011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = (GLshort) source[i]; 53021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 53031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstPacking->SwapBytes) { 53041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_swap2( (GLushort *) dst, n ); 53051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 53061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 53071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 53081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_INT: 53091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 53101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint *dst = (GLuint *) dest; 53111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 53121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 53131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = (GLuint) source[i]; 53141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 53151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstPacking->SwapBytes) { 53161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_swap4( (GLuint *) dst, n ); 53171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 53181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 53191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 53201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_INT: 53211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 53221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLint *dst = (GLint *) dest; 53231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 53241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 53251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = (GLint) source[i]; 53261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 53271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstPacking->SwapBytes) { 53281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_swap4( (GLuint *) dst, n ); 53291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 53301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 53311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 53321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_FLOAT: 53331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 53341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLfloat *dst = (GLfloat *) dest; 53351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 53361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 53371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = (GLfloat) source[i]; 53381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 53391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstPacking->SwapBytes) { 53401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_swap4( (GLuint *) dst, n ); 53411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 53421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 53431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 53441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_HALF_FLOAT_ARB: 53451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 53461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLhalfARB *dst = (GLhalfARB *) dest; 53471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 53481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i=0;i<n;i++) { 53491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = _mesa_float_to_half( (float) source[i] ); 53501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 53511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstPacking->SwapBytes) { 53521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_swap2( (GLushort *) dst, n ); 53531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 53541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 53551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 53561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_BITMAP: 53571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstPacking->LsbFirst) { 53581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte *dst = (GLubyte *) dest; 53591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLint shift = 0; 53601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 53611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 53621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (shift == 0) 53631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *dst = 0; 53641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *dst |= ((source[i] != 0) << shift); 53651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul shift++; 53661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (shift == 8) { 53671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul shift = 0; 53681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst++; 53691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 53701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 53711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 53721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 53731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte *dst = (GLubyte *) dest; 53741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLint shift = 7; 53751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 53761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 53771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (shift == 7) 53781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *dst = 0; 53791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *dst |= ((source[i] != 0) << shift); 53801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul shift--; 53811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (shift < 0) { 53821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul shift = 7; 53831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst++; 53841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 53851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 53861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 53871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 53881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul default: 53891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_problem(ctx, "bad type in _mesa_pack_index_span"); 53901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 539136b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul 539236b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul free(stencil); 53931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul} 53941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 53951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul#define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \ 53961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul do { \ 53971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; \ 53981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLTYPE *src = (const GLTYPE *)source; \ 53991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { \ 54001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLTYPE value = src[i]; \ 54011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (srcPacking->SwapBytes) { \ 54021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (sizeof(GLTYPE) == 2) { \ 54031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul SWAP2BYTE(value); \ 54041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } else if (sizeof(GLTYPE) == 4) { \ 54051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul SWAP4BYTE(value); \ 54061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } \ 54071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } \ 54081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul depthValues[i] = GLTYPE2FLOAT(value); \ 54091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } \ 54101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } while (0) 54111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 54121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 54131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul/** 54141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Unpack a row of depth/z values from memory, returning GLushort, GLuint 54151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * or GLfloat values. 54161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * The glPixelTransfer (scale/bias) params will be applied. 54171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * 54181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT 54191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * \param depthMax max value for returned GLushort or GLuint values 54201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * (ignored for GLfloat). 54211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */ 54221c131752c3e07ef91f49d4970dafca6d26585334Brian Paulvoid 542336b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul_mesa_unpack_depth_span( struct gl_context *ctx, GLuint n, 54241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLenum dstType, GLvoid *dest, GLuint depthMax, 54251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLenum srcType, const GLvoid *source, 54261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const struct gl_pixelstore_attrib *srcPacking ) 54271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{ 5428100a37587f9919d986e6af6f7e2ddecdc5bcfd09Marek Olšák GLfloat *depthTemp = NULL, *depthValues; 54291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLboolean needClamp = GL_FALSE; 54301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 54311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* Look for special cases first. 54321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Not only are these faster, they're less prone to numeric conversion 54331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * problems. Otherwise, converting from an int type to a float then 54341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * back to an int type can introduce errors that will show up as 54351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * artifacts in things like depth peeling which uses glCopyTexImage. 54361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */ 54371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (ctx->Pixel.DepthScale == 1.0 && ctx->Pixel.DepthBias == 0.0) { 54381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (srcType == GL_UNSIGNED_INT && dstType == GL_UNSIGNED_SHORT) { 54391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLuint *src = (const GLuint *) source; 54401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLushort *dst = (GLushort *) dest; 54411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 54421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 54431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = src[i] >> 16; 54441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 54451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul return; 54461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 54471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (srcType == GL_UNSIGNED_SHORT 54481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul && dstType == GL_UNSIGNED_INT 54491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul && depthMax == 0xffffffff) { 54501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLushort *src = (const GLushort *) source; 54511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint *dst = (GLuint *) dest; 54521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 54531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 54541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = src[i] | (src[i] << 16); 54551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 54561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul return; 54571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 54581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (srcType == GL_UNSIGNED_INT_24_8 54591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul && dstType == GL_UNSIGNED_INT 54601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul && depthMax == 0xffffff) { 54611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLuint *src = (const GLuint *) source; 54621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint *dst = (GLuint *) dest; 54631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 54641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 54651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = src[i] >> 8; 54661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 54671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul return; 54681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 54691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* XXX may want to add additional cases here someday */ 54701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 54711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 54721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* general case path follows */ 54731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 54741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstType == GL_FLOAT) { 54751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul depthValues = (GLfloat *) dest; 54761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 54771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 5478100a37587f9919d986e6af6f7e2ddecdc5bcfd09Marek Olšák depthTemp = (GLfloat *) malloc(n * sizeof(GLfloat)); 5479100a37587f9919d986e6af6f7e2ddecdc5bcfd09Marek Olšák if (!depthTemp) { 5480100a37587f9919d986e6af6f7e2ddecdc5bcfd09Marek Olšák _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 5481100a37587f9919d986e6af6f7e2ddecdc5bcfd09Marek Olšák return; 5482100a37587f9919d986e6af6f7e2ddecdc5bcfd09Marek Olšák } 5483100a37587f9919d986e6af6f7e2ddecdc5bcfd09Marek Olšák 54841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul depthValues = depthTemp; 54851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 54861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 54871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* Convert incoming values to GLfloat. Some conversions will require 54881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * clamping, below. 54891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */ 54901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul switch (srcType) { 54911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_BYTE: 5492546f76d58f619e3d7e016b3eb04254d5c5c3f39fBrian Paul DEPTH_VALUES(GLbyte, BYTE_TO_FLOATZ); 54931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul needClamp = GL_TRUE; 54941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 54951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_BYTE: 54961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul DEPTH_VALUES(GLubyte, UBYTE_TO_FLOAT); 54971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 54981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_SHORT: 5499546f76d58f619e3d7e016b3eb04254d5c5c3f39fBrian Paul DEPTH_VALUES(GLshort, SHORT_TO_FLOATZ); 55001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul needClamp = GL_TRUE; 55011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 55021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_SHORT: 55031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul DEPTH_VALUES(GLushort, USHORT_TO_FLOAT); 55041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 55051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_INT: 55061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul DEPTH_VALUES(GLint, INT_TO_FLOAT); 55071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul needClamp = GL_TRUE; 55081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 55091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_INT: 55101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul DEPTH_VALUES(GLuint, UINT_TO_FLOAT); 55111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 55121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_INT_24_8_EXT: /* GL_EXT_packed_depth_stencil */ 55131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstType == GL_UNSIGNED_INT_24_8_EXT && 55141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul depthMax == 0xffffff && 55151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul ctx->Pixel.DepthScale == 1.0 && 55161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul ctx->Pixel.DepthBias == 0.0) { 55171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLuint *src = (const GLuint *) source; 55181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint *zValues = (GLuint *) dest; 55191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 55201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 55211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint value = src[i]; 55221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (srcPacking->SwapBytes) { 55231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul SWAP4BYTE(value); 55241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 55251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul zValues[i] = value & 0xffffff00; 55261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 552712c105b5de7dfb0e1c1f1fbe4ee71ddd54b020a7Marek Olšák free(depthTemp); 55281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul return; 55291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 55301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 55311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLuint *src = (const GLuint *) source; 55321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLfloat scale = 1.0f / 0xffffff; 55331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 55341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 55351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint value = src[i]; 55361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (srcPacking->SwapBytes) { 55371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul SWAP4BYTE(value); 55381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 55391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul depthValues[i] = (value >> 8) * scale; 55401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 55411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 55421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 5543bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 5544bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák { 5545bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák GLuint i; 5546bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák const GLfloat *src = (const GLfloat *)source; 5547bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák for (i = 0; i < n; i++) { 5548bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák GLfloat value = src[i * 2]; 5549bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák if (srcPacking->SwapBytes) { 5550bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák SWAP4BYTE(value); 5551bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák } 5552bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák depthValues[i] = value; 5553bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák } 5554bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák needClamp = GL_TRUE; 5555bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák } 5556bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák break; 55571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_FLOAT: 55581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul DEPTH_VALUES(GLfloat, 1*); 55591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul needClamp = GL_TRUE; 55601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 55611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_HALF_FLOAT_ARB: 55621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 55631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 55641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLhalfARB *src = (const GLhalfARB *) source; 55651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 55661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLhalfARB value = src[i]; 55671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (srcPacking->SwapBytes) { 55681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul SWAP2BYTE(value); 55691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 55701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul depthValues[i] = _mesa_half_to_float(value); 55711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 55721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul needClamp = GL_TRUE; 55731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 55741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 55751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul default: 55761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_problem(NULL, "bad type in _mesa_unpack_depth_span()"); 557736b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul free(depthTemp); 55781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul return; 55791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 55801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 55811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* apply depth scale and bias */ 55821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 55831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLfloat scale = ctx->Pixel.DepthScale; 55841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLfloat bias = ctx->Pixel.DepthBias; 55851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (scale != 1.0 || bias != 0.0) { 55861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 55871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 55881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul depthValues[i] = depthValues[i] * scale + bias; 55891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 55901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul needClamp = GL_TRUE; 55911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 55921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 55931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 55941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* clamp to [0, 1] */ 55951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (needClamp) { 55961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 55971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 55981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul depthValues[i] = (GLfloat)CLAMP(depthValues[i], 0.0, 1.0); 55991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 56001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 56011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 56021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* 56031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Convert values to dstType 56041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */ 56051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstType == GL_UNSIGNED_INT) { 56061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint *zValues = (GLuint *) dest; 56071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 56081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (depthMax <= 0xffffff) { 56091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* no overflow worries */ 56101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 56111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul zValues[i] = (GLuint) (depthValues[i] * (GLfloat) depthMax); 56121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 56131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 56141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 56151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* need to use double precision to prevent overflow problems */ 56161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 5617605f964d5cc7016fc74e0563829fa794da845c20Kenneth Graunke GLdouble z = depthValues[i] * (GLdouble) depthMax; 56181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (z >= (GLdouble) 0xffffffff) 56191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul zValues[i] = 0xffffffff; 56201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else 56211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul zValues[i] = (GLuint) z; 56221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 56231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 56241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 56251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else if (dstType == GL_UNSIGNED_SHORT) { 56261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLushort *zValues = (GLushort *) dest; 56271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 56281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul ASSERT(depthMax <= 0xffff); 56291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 56301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul zValues[i] = (GLushort) (depthValues[i] * (GLfloat) depthMax); 56311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 56321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 5633bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák else if (dstType == GL_FLOAT) { 5634bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák /* Nothing to do. depthValues is pointing to dest. */ 5635bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák } 5636bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák else if (dstType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV) { 5637bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák GLfloat *zValues = (GLfloat*) dest; 5638bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák GLuint i; 5639bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák for (i = 0; i < n; i++) { 5640bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák zValues[i*2] = depthValues[i]; 5641bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák } 5642bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák } 56431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 5644bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák ASSERT(0); 56451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 564636b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul 564736b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul free(depthTemp); 56481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul} 56491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 56501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 56511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul/* 56521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Pack an array of depth values. The values are floats in [0,1]. 56531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */ 56541c131752c3e07ef91f49d4970dafca6d26585334Brian Paulvoid 565536b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul_mesa_pack_depth_span( struct gl_context *ctx, GLuint n, GLvoid *dest, 56561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLenum dstType, const GLfloat *depthSpan, 56571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const struct gl_pixelstore_attrib *dstPacking ) 56581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{ 565936b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul GLfloat *depthCopy = (GLfloat *) malloc(n * sizeof(GLfloat)); 566036b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul if (!depthCopy) { 566136b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing"); 566236b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul return; 566336b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul } 56641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 56651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) { 56661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul memcpy(depthCopy, depthSpan, n * sizeof(GLfloat)); 56671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_scale_and_bias_depth(ctx, n, depthCopy); 56681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul depthSpan = depthCopy; 56691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 56701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 56711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul switch (dstType) { 56721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_BYTE: 56731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 56741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte *dst = (GLubyte *) dest; 56751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 56761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 56771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = FLOAT_TO_UBYTE( depthSpan[i] ); 56781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 56791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 56801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 56811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_BYTE: 56821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 56831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLbyte *dst = (GLbyte *) dest; 56841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 56851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 56861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = FLOAT_TO_BYTE( depthSpan[i] ); 56871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 56881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 56891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 56901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_SHORT: 56911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 56921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLushort *dst = (GLushort *) dest; 56931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 56941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 56951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul CLAMPED_FLOAT_TO_USHORT(dst[i], depthSpan[i]); 56961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 56971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstPacking->SwapBytes) { 56981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_swap2( (GLushort *) dst, n ); 56991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 57001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 57011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 57021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_SHORT: 57031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 57041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLshort *dst = (GLshort *) dest; 57051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 57061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 57071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = FLOAT_TO_SHORT( depthSpan[i] ); 57081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 57091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstPacking->SwapBytes) { 57101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_swap2( (GLushort *) dst, n ); 57111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 57121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 57131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 57141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_UNSIGNED_INT: 57151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 57161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint *dst = (GLuint *) dest; 57171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 57181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 57191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = FLOAT_TO_UINT( depthSpan[i] ); 57201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 57211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstPacking->SwapBytes) { 57221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_swap4( (GLuint *) dst, n ); 57231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 57241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 57251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 57261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_INT: 57271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 57281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLint *dst = (GLint *) dest; 57291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 57301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 57311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = FLOAT_TO_INT( depthSpan[i] ); 57321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 57331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstPacking->SwapBytes) { 57341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_swap4( (GLuint *) dst, n ); 57351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 57361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 57371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 57381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_FLOAT: 57391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 57401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLfloat *dst = (GLfloat *) dest; 57411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 57421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 57431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = depthSpan[i]; 57441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 57451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstPacking->SwapBytes) { 57461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_swap4( (GLuint *) dst, n ); 57471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 57481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 57491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 57501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul case GL_HALF_FLOAT_ARB: 57511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 57521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLhalfARB *dst = (GLhalfARB *) dest; 57531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 57541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < n; i++) { 57551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst[i] = _mesa_float_to_half(depthSpan[i]); 57561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 57571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstPacking->SwapBytes) { 57581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_swap2( (GLushort *) dst, n ); 57591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 57601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 57611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul break; 57621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul default: 57631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_problem(ctx, "bad type in _mesa_pack_depth_span"); 57641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 576536b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul 576636b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul free(depthCopy); 57671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul} 57681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 57691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 57701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 57711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul/** 577201f48a979d85525acd060c8055ec835a1b56ea87Marek Olšák * Pack depth and stencil values as GL_DEPTH_STENCIL (GL_UNSIGNED_INT_24_8 etc) 57731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */ 57741c131752c3e07ef91f49d4970dafca6d26585334Brian Paulvoid 577501f48a979d85525acd060c8055ec835a1b56ea87Marek Olšák_mesa_pack_depth_stencil_span(struct gl_context *ctx,GLuint n, 577601f48a979d85525acd060c8055ec835a1b56ea87Marek Olšák GLenum dstType, GLuint *dest, 57771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLfloat *depthVals, 57786d68855df133bdd4891e8aa428787b520739e0feBrian Paul const GLubyte *stencilVals, 57791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const struct gl_pixelstore_attrib *dstPacking) 57801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{ 578136b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul GLfloat *depthCopy = (GLfloat *) malloc(n * sizeof(GLfloat)); 57826d68855df133bdd4891e8aa428787b520739e0feBrian Paul GLubyte *stencilCopy = (GLubyte *) malloc(n * sizeof(GLubyte)); 57831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLuint i; 57841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 578536b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul if (!depthCopy || !stencilCopy) { 578636b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing"); 578736b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul free(depthCopy); 578836b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul free(stencilCopy); 578936b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul return; 579036b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul } 57911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 57921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) { 57931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul memcpy(depthCopy, depthVals, n * sizeof(GLfloat)); 57941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_scale_and_bias_depth(ctx, n, depthCopy); 57951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul depthVals = depthCopy; 57961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 57971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 57981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (ctx->Pixel.IndexShift || 57991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul ctx->Pixel.IndexOffset || 58001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul ctx->Pixel.MapStencilFlag) { 58016d68855df133bdd4891e8aa428787b520739e0feBrian Paul memcpy(stencilCopy, stencilVals, n * sizeof(GLubyte)); 58021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_apply_stencil_transfer_ops(ctx, n, stencilCopy); 58031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul stencilVals = stencilCopy; 58041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 58051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 580601f48a979d85525acd060c8055ec835a1b56ea87Marek Olšák switch (dstType) { 580701f48a979d85525acd060c8055ec835a1b56ea87Marek Olšák case GL_UNSIGNED_INT_24_8: 580801f48a979d85525acd060c8055ec835a1b56ea87Marek Olšák for (i = 0; i < n; i++) { 580901f48a979d85525acd060c8055ec835a1b56ea87Marek Olšák GLuint z = (GLuint) (depthVals[i] * 0xffffff); 581001f48a979d85525acd060c8055ec835a1b56ea87Marek Olšák dest[i] = (z << 8) | (stencilVals[i] & 0xff); 581101f48a979d85525acd060c8055ec835a1b56ea87Marek Olšák } 581201f48a979d85525acd060c8055ec835a1b56ea87Marek Olšák break; 581301f48a979d85525acd060c8055ec835a1b56ea87Marek Olšák case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 581401f48a979d85525acd060c8055ec835a1b56ea87Marek Olšák for (i = 0; i < n; i++) { 581501f48a979d85525acd060c8055ec835a1b56ea87Marek Olšák ((GLfloat*)dest)[i*2] = depthVals[i]; 581601f48a979d85525acd060c8055ec835a1b56ea87Marek Olšák dest[i*2+1] = stencilVals[i] & 0xff; 581701f48a979d85525acd060c8055ec835a1b56ea87Marek Olšák } 581801f48a979d85525acd060c8055ec835a1b56ea87Marek Olšák break; 58191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 58201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 58211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstPacking->SwapBytes) { 58221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_swap4(dest, n); 58231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 582436b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul 582536b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul free(depthCopy); 582636b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul free(stencilCopy); 58271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul} 58281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 58291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 58301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 58311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 58321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul/** 58331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Unpack image data. Apply byte swapping, byte flipping (bitmap). 58341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Return all image data in a contiguous block. This is used when we 58351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * compile glDrawPixels, glTexImage, etc into a display list. We 58361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * need a copy of the data in a standard format. 58371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */ 58381c131752c3e07ef91f49d4970dafca6d26585334Brian Paulvoid * 58391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul_mesa_unpack_image( GLuint dimensions, 58401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLsizei width, GLsizei height, GLsizei depth, 58411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLenum format, GLenum type, const GLvoid *pixels, 58421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const struct gl_pixelstore_attrib *unpack ) 58431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{ 58441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLint bytesPerRow, compsPerRow; 58451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLboolean flipBytes, swap2, swap4; 58461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 58471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (!pixels) 58481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul return NULL; /* not necessarily an error */ 58491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 58501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (width <= 0 || height <= 0 || depth <= 0) 58511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul return NULL; /* generate error later */ 58521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 58531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (type == GL_BITMAP) { 58541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul bytesPerRow = (width + 7) >> 3; 58551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul flipBytes = unpack->LsbFirst; 58561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul swap2 = swap4 = GL_FALSE; 58571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul compsPerRow = 0; 58581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 58591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 58601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type); 58611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLint components = _mesa_components_in_format(format); 58621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLint bytesPerComp; 58631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 58641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (_mesa_type_is_packed(type)) 58651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul components = 1; 58661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 58671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (bytesPerPixel <= 0 || components <= 0) 58681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul return NULL; /* bad format or type. generate error later */ 58691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul bytesPerRow = bytesPerPixel * width; 58701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul bytesPerComp = bytesPerPixel / components; 58711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul flipBytes = GL_FALSE; 58721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul swap2 = (bytesPerComp == 2) && unpack->SwapBytes; 58731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul swap4 = (bytesPerComp == 4) && unpack->SwapBytes; 58741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul compsPerRow = components * width; 58751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul assert(compsPerRow >= width); 58761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 58771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 58781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul { 58791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte *destBuffer 58801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul = (GLubyte *) malloc(bytesPerRow * height * depth); 58811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte *dst; 58821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLint img, row; 58831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (!destBuffer) 58841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul return NULL; /* generate GL_OUT_OF_MEMORY later */ 58851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 58861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst = destBuffer; 58871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (img = 0; img < depth; img++) { 58881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (row = 0; row < height; row++) { 58891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLvoid *src = _mesa_image_address(dimensions, unpack, pixels, 58901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul width, height, format, type, img, row, 0); 58911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 58921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if ((type == GL_BITMAP) && (unpack->SkipPixels & 0x7)) { 58931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLint i; 58941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul flipBytes = GL_FALSE; 58951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (unpack->LsbFirst) { 58961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte srcMask = 1 << (unpack->SkipPixels & 0x7); 58971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte dstMask = 128; 58981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLubyte *s = src; 58991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte *d = dst; 59001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *d = 0; 59011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < width; i++) { 59021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (*s & srcMask) { 59031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *d |= dstMask; 59041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 59051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (srcMask == 128) { 59061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcMask = 1; 59071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul s++; 59081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 59091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 59101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcMask = srcMask << 1; 59111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 59121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstMask == 1) { 59131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dstMask = 128; 59141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul d++; 59151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *d = 0; 59161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 59171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 59181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dstMask = dstMask >> 1; 59191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 59201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 59211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 59221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 59231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte srcMask = 128 >> (unpack->SkipPixels & 0x7); 59241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte dstMask = 128; 59251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul const GLubyte *s = src; 59261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul GLubyte *d = dst; 59271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *d = 0; 59281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul for (i = 0; i < width; i++) { 59291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (*s & srcMask) { 59301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *d |= dstMask; 59311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 59321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (srcMask == 1) { 59331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcMask = 128; 59341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul s++; 59351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 59361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 59371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul srcMask = srcMask >> 1; 59381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 59391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (dstMask == 1) { 59401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dstMask = 128; 59411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul d++; 59421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *d = 0; 59431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 59441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 59451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dstMask = dstMask >> 1; 59461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 59471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 59481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 59491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 59501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else { 59511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul memcpy(dst, src, bytesPerRow); 59521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 59531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 59541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul /* byte flipping/swapping */ 59551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul if (flipBytes) { 59561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul flip_bytes((GLubyte *) dst, bytesPerRow); 59571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 59581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else if (swap2) { 59591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_swap2((GLushort*) dst, compsPerRow); 59601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 59611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul else if (swap4) { 59621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul _mesa_swap4((GLuint*) dst, compsPerRow); 59631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 59641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul dst += bytesPerRow; 59651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 59661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 59671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul return destBuffer; 59681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul } 59691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul} 59701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul 5971774c4027651436451b3486f62b9a8903f29a715bBrian Paul 5972774c4027651436451b3486f62b9a8903f29a715bBrian Paul 5973774c4027651436451b3486f62b9a8903f29a715bBrian Paul/** 5974774c4027651436451b3486f62b9a8903f29a715bBrian Paul * If we unpack colors from a luminance surface, we'll get pixel colors 5975774c4027651436451b3486f62b9a8903f29a715bBrian Paul * such as (l, l, l, a). 5976774c4027651436451b3486f62b9a8903f29a715bBrian Paul * When we call _mesa_pack_rgba_span_float(format=GL_LUMINANCE), that 5977774c4027651436451b3486f62b9a8903f29a715bBrian Paul * function will compute L=R+G+B before packing. The net effect is we'll 5978774c4027651436451b3486f62b9a8903f29a715bBrian Paul * accidentally store luminance values = 3*l. 5979774c4027651436451b3486f62b9a8903f29a715bBrian Paul * This function compensates for that by converting (aka rebasing) (l,l,l,a) 5980774c4027651436451b3486f62b9a8903f29a715bBrian Paul * to be (l,0,0,a). 5981774c4027651436451b3486f62b9a8903f29a715bBrian Paul * It's a similar story for other formats such as LUMINANCE_ALPHA, ALPHA 5982774c4027651436451b3486f62b9a8903f29a715bBrian Paul * and INTENSITY. 5983774c4027651436451b3486f62b9a8903f29a715bBrian Paul * 5984774c4027651436451b3486f62b9a8903f29a715bBrian Paul * Finally, we also need to do this when the actual surface format does 5985774c4027651436451b3486f62b9a8903f29a715bBrian Paul * not match the logical surface format. For example, suppose the user 5986774c4027651436451b3486f62b9a8903f29a715bBrian Paul * requests a GL_LUMINANCE texture but the driver stores it as RGBA. 5987774c4027651436451b3486f62b9a8903f29a715bBrian Paul * Again, we'll get pixel values like (l,l,l,a). 5988774c4027651436451b3486f62b9a8903f29a715bBrian Paul */ 5989774c4027651436451b3486f62b9a8903f29a715bBrian Paulvoid 5990774c4027651436451b3486f62b9a8903f29a715bBrian Paul_mesa_rebase_rgba_float(GLuint n, GLfloat rgba[][4], GLenum baseFormat) 5991774c4027651436451b3486f62b9a8903f29a715bBrian Paul{ 5992774c4027651436451b3486f62b9a8903f29a715bBrian Paul GLuint i; 5993774c4027651436451b3486f62b9a8903f29a715bBrian Paul 5994774c4027651436451b3486f62b9a8903f29a715bBrian Paul switch (baseFormat) { 5995774c4027651436451b3486f62b9a8903f29a715bBrian Paul case GL_ALPHA: 5996774c4027651436451b3486f62b9a8903f29a715bBrian Paul for (i = 0; i < n; i++) { 5997774c4027651436451b3486f62b9a8903f29a715bBrian Paul rgba[i][RCOMP] = 0.0F; 5998774c4027651436451b3486f62b9a8903f29a715bBrian Paul rgba[i][GCOMP] = 0.0F; 5999774c4027651436451b3486f62b9a8903f29a715bBrian Paul rgba[i][BCOMP] = 0.0F; 6000774c4027651436451b3486f62b9a8903f29a715bBrian Paul } 6001774c4027651436451b3486f62b9a8903f29a715bBrian Paul break; 6002774c4027651436451b3486f62b9a8903f29a715bBrian Paul case GL_INTENSITY: 6003774c4027651436451b3486f62b9a8903f29a715bBrian Paul /* fall-through */ 6004774c4027651436451b3486f62b9a8903f29a715bBrian Paul case GL_LUMINANCE: 6005774c4027651436451b3486f62b9a8903f29a715bBrian Paul for (i = 0; i < n; i++) { 6006774c4027651436451b3486f62b9a8903f29a715bBrian Paul rgba[i][GCOMP] = 0.0F; 6007774c4027651436451b3486f62b9a8903f29a715bBrian Paul rgba[i][BCOMP] = 0.0F; 6008774c4027651436451b3486f62b9a8903f29a715bBrian Paul rgba[i][ACOMP] = 1.0F; 6009774c4027651436451b3486f62b9a8903f29a715bBrian Paul } 6010774c4027651436451b3486f62b9a8903f29a715bBrian Paul break; 6011774c4027651436451b3486f62b9a8903f29a715bBrian Paul case GL_LUMINANCE_ALPHA: 6012774c4027651436451b3486f62b9a8903f29a715bBrian Paul for (i = 0; i < n; i++) { 6013774c4027651436451b3486f62b9a8903f29a715bBrian Paul rgba[i][GCOMP] = 0.0F; 6014774c4027651436451b3486f62b9a8903f29a715bBrian Paul rgba[i][BCOMP] = 0.0F; 6015774c4027651436451b3486f62b9a8903f29a715bBrian Paul } 6016774c4027651436451b3486f62b9a8903f29a715bBrian Paul break; 6017774c4027651436451b3486f62b9a8903f29a715bBrian Paul default: 6018774c4027651436451b3486f62b9a8903f29a715bBrian Paul /* no-op */ 6019774c4027651436451b3486f62b9a8903f29a715bBrian Paul ; 6020774c4027651436451b3486f62b9a8903f29a715bBrian Paul } 6021774c4027651436451b3486f62b9a8903f29a715bBrian Paul} 6022774c4027651436451b3486f62b9a8903f29a715bBrian Paul 6023774c4027651436451b3486f62b9a8903f29a715bBrian Paul 6024774c4027651436451b3486f62b9a8903f29a715bBrian Paul/** 6025774c4027651436451b3486f62b9a8903f29a715bBrian Paul * As above, but GLuint components. 6026774c4027651436451b3486f62b9a8903f29a715bBrian Paul */ 6027774c4027651436451b3486f62b9a8903f29a715bBrian Paulvoid 6028774c4027651436451b3486f62b9a8903f29a715bBrian Paul_mesa_rebase_rgba_uint(GLuint n, GLuint rgba[][4], GLenum baseFormat) 6029774c4027651436451b3486f62b9a8903f29a715bBrian Paul{ 6030774c4027651436451b3486f62b9a8903f29a715bBrian Paul GLuint i; 6031774c4027651436451b3486f62b9a8903f29a715bBrian Paul 6032774c4027651436451b3486f62b9a8903f29a715bBrian Paul switch (baseFormat) { 6033774c4027651436451b3486f62b9a8903f29a715bBrian Paul case GL_ALPHA: 6034774c4027651436451b3486f62b9a8903f29a715bBrian Paul for (i = 0; i < n; i++) { 6035774c4027651436451b3486f62b9a8903f29a715bBrian Paul rgba[i][RCOMP] = 0; 6036774c4027651436451b3486f62b9a8903f29a715bBrian Paul rgba[i][GCOMP] = 0; 6037774c4027651436451b3486f62b9a8903f29a715bBrian Paul rgba[i][BCOMP] = 0; 6038774c4027651436451b3486f62b9a8903f29a715bBrian Paul } 6039774c4027651436451b3486f62b9a8903f29a715bBrian Paul break; 6040774c4027651436451b3486f62b9a8903f29a715bBrian Paul case GL_INTENSITY: 6041774c4027651436451b3486f62b9a8903f29a715bBrian Paul /* fall-through */ 6042774c4027651436451b3486f62b9a8903f29a715bBrian Paul case GL_LUMINANCE: 6043774c4027651436451b3486f62b9a8903f29a715bBrian Paul for (i = 0; i < n; i++) { 6044774c4027651436451b3486f62b9a8903f29a715bBrian Paul rgba[i][GCOMP] = 0; 6045774c4027651436451b3486f62b9a8903f29a715bBrian Paul rgba[i][BCOMP] = 0; 6046774c4027651436451b3486f62b9a8903f29a715bBrian Paul rgba[i][ACOMP] = 1; 6047774c4027651436451b3486f62b9a8903f29a715bBrian Paul } 6048774c4027651436451b3486f62b9a8903f29a715bBrian Paul break; 6049774c4027651436451b3486f62b9a8903f29a715bBrian Paul case GL_LUMINANCE_ALPHA: 6050774c4027651436451b3486f62b9a8903f29a715bBrian Paul for (i = 0; i < n; i++) { 6051774c4027651436451b3486f62b9a8903f29a715bBrian Paul rgba[i][GCOMP] = 0; 6052774c4027651436451b3486f62b9a8903f29a715bBrian Paul rgba[i][BCOMP] = 0; 6053774c4027651436451b3486f62b9a8903f29a715bBrian Paul } 6054774c4027651436451b3486f62b9a8903f29a715bBrian Paul break; 6055774c4027651436451b3486f62b9a8903f29a715bBrian Paul default: 6056774c4027651436451b3486f62b9a8903f29a715bBrian Paul /* no-op */ 6057774c4027651436451b3486f62b9a8903f29a715bBrian Paul ; 6058774c4027651436451b3486f62b9a8903f29a715bBrian Paul } 6059774c4027651436451b3486f62b9a8903f29a715bBrian Paul} 6060774c4027651436451b3486f62b9a8903f29a715bBrian Paul 6061774c4027651436451b3486f62b9a8903f29a715bBrian Paul 6062