pack.c revision 848b8605
1848b8605Smrg/* 2848b8605Smrg * Mesa 3-D graphics library 3848b8605Smrg * 4848b8605Smrg * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 5848b8605Smrg * Copyright (C) 2009-2010 VMware, Inc. All Rights Reserved. 6848b8605Smrg * 7848b8605Smrg * Permission is hereby granted, free of charge, to any person obtaining a 8848b8605Smrg * copy of this software and associated documentation files (the "Software"), 9848b8605Smrg * to deal in the Software without restriction, including without limitation 10848b8605Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11848b8605Smrg * and/or sell copies of the Software, and to permit persons to whom the 12848b8605Smrg * Software is furnished to do so, subject to the following conditions: 13848b8605Smrg * 14848b8605Smrg * The above copyright notice and this permission notice shall be included 15848b8605Smrg * in all copies or substantial portions of the Software. 16848b8605Smrg * 17848b8605Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18848b8605Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19848b8605Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20848b8605Smrg * THEA AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21848b8605Smrg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22848b8605Smrg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23848b8605Smrg */ 24848b8605Smrg 25848b8605Smrg 26848b8605Smrg/** 27848b8605Smrg * \file pack.c 28848b8605Smrg * Image and pixel span packing and unpacking. 29848b8605Smrg */ 30848b8605Smrg 31848b8605Smrg 32848b8605Smrg/* 33848b8605Smrg * XXX: MSVC takes forever to compile this module for x86_64 unless we disable 34848b8605Smrg * this global optimization. 35848b8605Smrg * 36848b8605Smrg * See also: 37848b8605Smrg * - http://msdn.microsoft.com/en-us/library/1yk3ydd7.aspx 38848b8605Smrg * - http://msdn.microsoft.com/en-us/library/chh3fb0k.aspx 39848b8605Smrg */ 40848b8605Smrg#if defined(_MSC_VER) && defined(_M_X64) 41848b8605Smrg# pragma optimize( "g", off ) 42848b8605Smrg#endif 43848b8605Smrg 44848b8605Smrg 45848b8605Smrg#include "glheader.h" 46848b8605Smrg#include "colormac.h" 47848b8605Smrg#include "enums.h" 48848b8605Smrg#include "image.h" 49848b8605Smrg#include "imports.h" 50848b8605Smrg#include "macros.h" 51848b8605Smrg#include "mtypes.h" 52848b8605Smrg#include "pack.h" 53848b8605Smrg#include "pixeltransfer.h" 54848b8605Smrg#include "imports.h" 55848b8605Smrg#include "glformats.h" 56848b8605Smrg#include "../../gallium/auxiliary/util/u_format_rgb9e5.h" 57848b8605Smrg#include "../../gallium/auxiliary/util/u_format_r11g11b10f.h" 58848b8605Smrg 59848b8605Smrg 60848b8605Smrg/** 61848b8605Smrg * Flip the 8 bits in each byte of the given array. 62848b8605Smrg * 63848b8605Smrg * \param p array. 64848b8605Smrg * \param n number of bytes. 65848b8605Smrg * 66848b8605Smrg * \todo try this trick to flip bytes someday: 67848b8605Smrg * \code 68848b8605Smrg * v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555); 69848b8605Smrg * v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333); 70848b8605Smrg * v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f); 71848b8605Smrg * \endcode 72848b8605Smrg */ 73848b8605Smrgstatic void 74848b8605Smrgflip_bytes( GLubyte *p, GLuint n ) 75848b8605Smrg{ 76848b8605Smrg GLuint i, a, b; 77848b8605Smrg for (i = 0; i < n; i++) { 78848b8605Smrg b = (GLuint) p[i]; /* words are often faster than bytes */ 79848b8605Smrg a = ((b & 0x01) << 7) | 80848b8605Smrg ((b & 0x02) << 5) | 81848b8605Smrg ((b & 0x04) << 3) | 82848b8605Smrg ((b & 0x08) << 1) | 83848b8605Smrg ((b & 0x10) >> 1) | 84848b8605Smrg ((b & 0x20) >> 3) | 85848b8605Smrg ((b & 0x40) >> 5) | 86848b8605Smrg ((b & 0x80) >> 7); 87848b8605Smrg p[i] = (GLubyte) a; 88848b8605Smrg } 89848b8605Smrg} 90848b8605Smrg 91848b8605Smrg 92848b8605Smrg 93848b8605Smrg/* 94848b8605Smrg * Unpack a 32x32 pixel polygon stipple from user memory using the 95848b8605Smrg * current pixel unpack settings. 96848b8605Smrg */ 97848b8605Smrgvoid 98848b8605Smrg_mesa_unpack_polygon_stipple( const GLubyte *pattern, GLuint dest[32], 99848b8605Smrg const struct gl_pixelstore_attrib *unpacking ) 100848b8605Smrg{ 101848b8605Smrg GLubyte *ptrn = (GLubyte *) _mesa_unpack_bitmap(32, 32, pattern, unpacking); 102848b8605Smrg if (ptrn) { 103848b8605Smrg /* Convert pattern from GLubytes to GLuints and handle big/little 104848b8605Smrg * endian differences 105848b8605Smrg */ 106848b8605Smrg GLubyte *p = ptrn; 107848b8605Smrg GLint i; 108848b8605Smrg for (i = 0; i < 32; i++) { 109848b8605Smrg dest[i] = (p[0] << 24) 110848b8605Smrg | (p[1] << 16) 111848b8605Smrg | (p[2] << 8) 112848b8605Smrg | (p[3] ); 113848b8605Smrg p += 4; 114848b8605Smrg } 115848b8605Smrg free(ptrn); 116848b8605Smrg } 117848b8605Smrg} 118848b8605Smrg 119848b8605Smrg 120848b8605Smrg/* 121848b8605Smrg * Pack polygon stipple into user memory given current pixel packing 122848b8605Smrg * settings. 123848b8605Smrg */ 124848b8605Smrgvoid 125848b8605Smrg_mesa_pack_polygon_stipple( const GLuint pattern[32], GLubyte *dest, 126848b8605Smrg const struct gl_pixelstore_attrib *packing ) 127848b8605Smrg{ 128848b8605Smrg /* Convert pattern from GLuints to GLubytes to handle big/little 129848b8605Smrg * endian differences. 130848b8605Smrg */ 131848b8605Smrg GLubyte ptrn[32*4]; 132848b8605Smrg GLint i; 133848b8605Smrg for (i = 0; i < 32; i++) { 134848b8605Smrg ptrn[i * 4 + 0] = (GLubyte) ((pattern[i] >> 24) & 0xff); 135848b8605Smrg ptrn[i * 4 + 1] = (GLubyte) ((pattern[i] >> 16) & 0xff); 136848b8605Smrg ptrn[i * 4 + 2] = (GLubyte) ((pattern[i] >> 8 ) & 0xff); 137848b8605Smrg ptrn[i * 4 + 3] = (GLubyte) ((pattern[i] ) & 0xff); 138848b8605Smrg } 139848b8605Smrg 140848b8605Smrg _mesa_pack_bitmap(32, 32, ptrn, dest, packing); 141848b8605Smrg} 142848b8605Smrg 143848b8605Smrg 144848b8605Smrg/* 145848b8605Smrg * Unpack bitmap data. Resulting data will be in most-significant-bit-first 146848b8605Smrg * order with row alignment = 1 byte. 147848b8605Smrg */ 148848b8605SmrgGLvoid * 149848b8605Smrg_mesa_unpack_bitmap( GLint width, GLint height, const GLubyte *pixels, 150848b8605Smrg const struct gl_pixelstore_attrib *packing ) 151848b8605Smrg{ 152848b8605Smrg GLint bytes, row, width_in_bytes; 153848b8605Smrg GLubyte *buffer, *dst; 154848b8605Smrg 155848b8605Smrg if (!pixels) 156848b8605Smrg return NULL; 157848b8605Smrg 158848b8605Smrg /* Alloc dest storage */ 159848b8605Smrg bytes = ((width + 7) / 8 * height); 160848b8605Smrg buffer = malloc( bytes ); 161848b8605Smrg if (!buffer) 162848b8605Smrg return NULL; 163848b8605Smrg 164848b8605Smrg width_in_bytes = CEILING( width, 8 ); 165848b8605Smrg dst = buffer; 166848b8605Smrg for (row = 0; row < height; row++) { 167848b8605Smrg const GLubyte *src = (const GLubyte *) 168848b8605Smrg _mesa_image_address2d(packing, pixels, width, height, 169848b8605Smrg GL_COLOR_INDEX, GL_BITMAP, row, 0); 170848b8605Smrg if (!src) { 171848b8605Smrg free(buffer); 172848b8605Smrg return NULL; 173848b8605Smrg } 174848b8605Smrg 175848b8605Smrg if ((packing->SkipPixels & 7) == 0) { 176848b8605Smrg memcpy( dst, src, width_in_bytes ); 177848b8605Smrg if (packing->LsbFirst) { 178848b8605Smrg flip_bytes( dst, width_in_bytes ); 179848b8605Smrg } 180848b8605Smrg } 181848b8605Smrg else { 182848b8605Smrg /* handling SkipPixels is a bit tricky (no pun intended!) */ 183848b8605Smrg GLint i; 184848b8605Smrg if (packing->LsbFirst) { 185848b8605Smrg GLubyte srcMask = 1 << (packing->SkipPixels & 0x7); 186848b8605Smrg GLubyte dstMask = 128; 187848b8605Smrg const GLubyte *s = src; 188848b8605Smrg GLubyte *d = dst; 189848b8605Smrg *d = 0; 190848b8605Smrg for (i = 0; i < width; i++) { 191848b8605Smrg if (*s & srcMask) { 192848b8605Smrg *d |= dstMask; 193848b8605Smrg } 194848b8605Smrg if (srcMask == 128) { 195848b8605Smrg srcMask = 1; 196848b8605Smrg s++; 197848b8605Smrg } 198848b8605Smrg else { 199848b8605Smrg srcMask = srcMask << 1; 200848b8605Smrg } 201848b8605Smrg if (dstMask == 1) { 202848b8605Smrg dstMask = 128; 203848b8605Smrg d++; 204848b8605Smrg *d = 0; 205848b8605Smrg } 206848b8605Smrg else { 207848b8605Smrg dstMask = dstMask >> 1; 208848b8605Smrg } 209848b8605Smrg } 210848b8605Smrg } 211848b8605Smrg else { 212848b8605Smrg GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7); 213848b8605Smrg GLubyte dstMask = 128; 214848b8605Smrg const GLubyte *s = src; 215848b8605Smrg GLubyte *d = dst; 216848b8605Smrg *d = 0; 217848b8605Smrg for (i = 0; i < width; i++) { 218848b8605Smrg if (*s & srcMask) { 219848b8605Smrg *d |= dstMask; 220848b8605Smrg } 221848b8605Smrg if (srcMask == 1) { 222848b8605Smrg srcMask = 128; 223848b8605Smrg s++; 224848b8605Smrg } 225848b8605Smrg else { 226848b8605Smrg srcMask = srcMask >> 1; 227848b8605Smrg } 228848b8605Smrg if (dstMask == 1) { 229848b8605Smrg dstMask = 128; 230848b8605Smrg d++; 231848b8605Smrg *d = 0; 232848b8605Smrg } 233848b8605Smrg else { 234848b8605Smrg dstMask = dstMask >> 1; 235848b8605Smrg } 236848b8605Smrg } 237848b8605Smrg } 238848b8605Smrg } 239848b8605Smrg dst += width_in_bytes; 240848b8605Smrg } 241848b8605Smrg 242848b8605Smrg return buffer; 243848b8605Smrg} 244848b8605Smrg 245848b8605Smrg 246848b8605Smrg/* 247848b8605Smrg * Pack bitmap data. 248848b8605Smrg */ 249848b8605Smrgvoid 250848b8605Smrg_mesa_pack_bitmap( GLint width, GLint height, const GLubyte *source, 251848b8605Smrg GLubyte *dest, const struct gl_pixelstore_attrib *packing ) 252848b8605Smrg{ 253848b8605Smrg GLint row, width_in_bytes; 254848b8605Smrg const GLubyte *src; 255848b8605Smrg 256848b8605Smrg if (!source) 257848b8605Smrg return; 258848b8605Smrg 259848b8605Smrg width_in_bytes = CEILING( width, 8 ); 260848b8605Smrg src = source; 261848b8605Smrg for (row = 0; row < height; row++) { 262848b8605Smrg GLubyte *dst = (GLubyte *) _mesa_image_address2d(packing, dest, 263848b8605Smrg width, height, GL_COLOR_INDEX, GL_BITMAP, row, 0); 264848b8605Smrg if (!dst) 265848b8605Smrg return; 266848b8605Smrg 267848b8605Smrg if ((packing->SkipPixels & 7) == 0) { 268848b8605Smrg memcpy( dst, src, width_in_bytes ); 269848b8605Smrg if (packing->LsbFirst) { 270848b8605Smrg flip_bytes( dst, width_in_bytes ); 271848b8605Smrg } 272848b8605Smrg } 273848b8605Smrg else { 274848b8605Smrg /* handling SkipPixels is a bit tricky (no pun intended!) */ 275848b8605Smrg GLint i; 276848b8605Smrg if (packing->LsbFirst) { 277848b8605Smrg GLubyte srcMask = 128; 278848b8605Smrg GLubyte dstMask = 1 << (packing->SkipPixels & 0x7); 279848b8605Smrg const GLubyte *s = src; 280848b8605Smrg GLubyte *d = dst; 281848b8605Smrg *d = 0; 282848b8605Smrg for (i = 0; i < width; i++) { 283848b8605Smrg if (*s & srcMask) { 284848b8605Smrg *d |= dstMask; 285848b8605Smrg } 286848b8605Smrg if (srcMask == 1) { 287848b8605Smrg srcMask = 128; 288848b8605Smrg s++; 289848b8605Smrg } 290848b8605Smrg else { 291848b8605Smrg srcMask = srcMask >> 1; 292848b8605Smrg } 293848b8605Smrg if (dstMask == 128) { 294848b8605Smrg dstMask = 1; 295848b8605Smrg d++; 296848b8605Smrg *d = 0; 297848b8605Smrg } 298848b8605Smrg else { 299848b8605Smrg dstMask = dstMask << 1; 300848b8605Smrg } 301848b8605Smrg } 302848b8605Smrg } 303848b8605Smrg else { 304848b8605Smrg GLubyte srcMask = 128; 305848b8605Smrg GLubyte dstMask = 128 >> (packing->SkipPixels & 0x7); 306848b8605Smrg const GLubyte *s = src; 307848b8605Smrg GLubyte *d = dst; 308848b8605Smrg *d = 0; 309848b8605Smrg for (i = 0; i < width; i++) { 310848b8605Smrg if (*s & srcMask) { 311848b8605Smrg *d |= dstMask; 312848b8605Smrg } 313848b8605Smrg if (srcMask == 1) { 314848b8605Smrg srcMask = 128; 315848b8605Smrg s++; 316848b8605Smrg } 317848b8605Smrg else { 318848b8605Smrg srcMask = srcMask >> 1; 319848b8605Smrg } 320848b8605Smrg if (dstMask == 1) { 321848b8605Smrg dstMask = 128; 322848b8605Smrg d++; 323848b8605Smrg *d = 0; 324848b8605Smrg } 325848b8605Smrg else { 326848b8605Smrg dstMask = dstMask >> 1; 327848b8605Smrg } 328848b8605Smrg } 329848b8605Smrg } 330848b8605Smrg } 331848b8605Smrg src += width_in_bytes; 332848b8605Smrg } 333848b8605Smrg} 334848b8605Smrg 335848b8605Smrg 336848b8605Smrg/** 337848b8605Smrg * Get indexes of color components for a basic color format, such as 338848b8605Smrg * GL_RGBA, GL_RED, GL_LUMINANCE_ALPHA, etc. Return -1 for indexes 339848b8605Smrg * that do not apply. 340848b8605Smrg */ 341848b8605Smrgstatic void 342848b8605Smrgget_component_indexes(GLenum format, 343848b8605Smrg GLint *redIndex, 344848b8605Smrg GLint *greenIndex, 345848b8605Smrg GLint *blueIndex, 346848b8605Smrg GLint *alphaIndex, 347848b8605Smrg GLint *luminanceIndex, 348848b8605Smrg GLint *intensityIndex) 349848b8605Smrg{ 350848b8605Smrg *redIndex = -1; 351848b8605Smrg *greenIndex = -1; 352848b8605Smrg *blueIndex = -1; 353848b8605Smrg *alphaIndex = -1; 354848b8605Smrg *luminanceIndex = -1; 355848b8605Smrg *intensityIndex = -1; 356848b8605Smrg 357848b8605Smrg switch (format) { 358848b8605Smrg case GL_LUMINANCE: 359848b8605Smrg case GL_LUMINANCE_INTEGER_EXT: 360848b8605Smrg *luminanceIndex = 0; 361848b8605Smrg break; 362848b8605Smrg case GL_LUMINANCE_ALPHA: 363848b8605Smrg case GL_LUMINANCE_ALPHA_INTEGER_EXT: 364848b8605Smrg *luminanceIndex = 0; 365848b8605Smrg *alphaIndex = 1; 366848b8605Smrg break; 367848b8605Smrg case GL_INTENSITY: 368848b8605Smrg *intensityIndex = 0; 369848b8605Smrg break; 370848b8605Smrg case GL_RED: 371848b8605Smrg case GL_RED_INTEGER_EXT: 372848b8605Smrg *redIndex = 0; 373848b8605Smrg break; 374848b8605Smrg case GL_GREEN: 375848b8605Smrg case GL_GREEN_INTEGER_EXT: 376848b8605Smrg *greenIndex = 0; 377848b8605Smrg break; 378848b8605Smrg case GL_BLUE: 379848b8605Smrg case GL_BLUE_INTEGER_EXT: 380848b8605Smrg *blueIndex = 0; 381848b8605Smrg break; 382848b8605Smrg case GL_ALPHA: 383848b8605Smrg case GL_ALPHA_INTEGER_EXT: 384848b8605Smrg *alphaIndex = 0; 385848b8605Smrg break; 386848b8605Smrg case GL_RG: 387848b8605Smrg case GL_RG_INTEGER: 388848b8605Smrg *redIndex = 0; 389848b8605Smrg *greenIndex = 1; 390848b8605Smrg break; 391848b8605Smrg case GL_RGB: 392848b8605Smrg case GL_RGB_INTEGER_EXT: 393848b8605Smrg *redIndex = 0; 394848b8605Smrg *greenIndex = 1; 395848b8605Smrg *blueIndex = 2; 396848b8605Smrg break; 397848b8605Smrg case GL_BGR: 398848b8605Smrg case GL_BGR_INTEGER_EXT: 399848b8605Smrg *blueIndex = 0; 400848b8605Smrg *greenIndex = 1; 401848b8605Smrg *redIndex = 2; 402848b8605Smrg break; 403848b8605Smrg case GL_RGBA: 404848b8605Smrg case GL_RGBA_INTEGER_EXT: 405848b8605Smrg *redIndex = 0; 406848b8605Smrg *greenIndex = 1; 407848b8605Smrg *blueIndex = 2; 408848b8605Smrg *alphaIndex = 3; 409848b8605Smrg break; 410848b8605Smrg case GL_BGRA: 411848b8605Smrg case GL_BGRA_INTEGER: 412848b8605Smrg *redIndex = 2; 413848b8605Smrg *greenIndex = 1; 414848b8605Smrg *blueIndex = 0; 415848b8605Smrg *alphaIndex = 3; 416848b8605Smrg break; 417848b8605Smrg case GL_ABGR_EXT: 418848b8605Smrg *redIndex = 3; 419848b8605Smrg *greenIndex = 2; 420848b8605Smrg *blueIndex = 1; 421848b8605Smrg *alphaIndex = 0; 422848b8605Smrg break; 423848b8605Smrg default: 424848b8605Smrg assert(0 && "bad format in get_component_indexes()"); 425848b8605Smrg } 426848b8605Smrg} 427848b8605Smrg 428848b8605Smrg 429848b8605Smrg 430848b8605Smrg/** 431848b8605Smrg * For small integer types, return the min and max possible values. 432848b8605Smrg * Used for clamping floats to unscaled integer types. 433848b8605Smrg * \return GL_TRUE if type is handled, GL_FALSE otherwise. 434848b8605Smrg */ 435848b8605Smrgstatic GLboolean 436848b8605Smrgget_type_min_max(GLenum type, GLfloat *min, GLfloat *max) 437848b8605Smrg{ 438848b8605Smrg switch (type) { 439848b8605Smrg case GL_BYTE: 440848b8605Smrg *min = -128.0; 441848b8605Smrg *max = 127.0; 442848b8605Smrg return GL_TRUE; 443848b8605Smrg case GL_UNSIGNED_BYTE: 444848b8605Smrg *min = 0.0; 445848b8605Smrg *max = 255.0; 446848b8605Smrg return GL_TRUE; 447848b8605Smrg case GL_SHORT: 448848b8605Smrg *min = -32768.0; 449848b8605Smrg *max = 32767.0; 450848b8605Smrg return GL_TRUE; 451848b8605Smrg case GL_UNSIGNED_SHORT: 452848b8605Smrg *min = 0.0; 453848b8605Smrg *max = 65535.0; 454848b8605Smrg return GL_TRUE; 455848b8605Smrg default: 456848b8605Smrg return GL_FALSE; 457848b8605Smrg } 458848b8605Smrg} 459848b8605Smrg 460848b8605Smrg/* Customization of unsigned integer packing. 461848b8605Smrg */ 462848b8605Smrg#define SRC_TYPE GLuint 463848b8605Smrg 464848b8605Smrg#define DST_TYPE GLuint 465848b8605Smrg#define SRC_CONVERT(x) (x) 466848b8605Smrg#define FN_NAME pack_uint_from_uint_rgba 467848b8605Smrg#include "pack_tmp.h" 468848b8605Smrg#undef DST_TYPE 469848b8605Smrg#undef SRC_CONVERT 470848b8605Smrg#undef FN_NAME 471848b8605Smrg 472848b8605Smrg#define DST_TYPE GLint 473848b8605Smrg#define SRC_CONVERT(x) MIN2(x, 0x7fffffff) 474848b8605Smrg#define FN_NAME pack_int_from_uint_rgba 475848b8605Smrg#include "pack_tmp.h" 476848b8605Smrg#undef DST_TYPE 477848b8605Smrg#undef SRC_CONVERT 478848b8605Smrg#undef FN_NAME 479848b8605Smrg 480848b8605Smrg#define DST_TYPE GLushort 481848b8605Smrg#define SRC_CONVERT(x) MIN2(x, 0xffff) 482848b8605Smrg#define FN_NAME pack_ushort_from_uint_rgba 483848b8605Smrg#include "pack_tmp.h" 484848b8605Smrg#undef DST_TYPE 485848b8605Smrg#undef SRC_CONVERT 486848b8605Smrg#undef FN_NAME 487848b8605Smrg 488848b8605Smrg#define DST_TYPE GLshort 489848b8605Smrg#define SRC_CONVERT(x) CLAMP((int)x, -32768, 32767) 490848b8605Smrg#define FN_NAME pack_short_from_uint_rgba 491848b8605Smrg#include "pack_tmp.h" 492848b8605Smrg#undef DST_TYPE 493848b8605Smrg#undef SRC_CONVERT 494848b8605Smrg#undef FN_NAME 495848b8605Smrg 496848b8605Smrg#define DST_TYPE GLubyte 497848b8605Smrg#define SRC_CONVERT(x) MIN2(x, 0xff) 498848b8605Smrg#define FN_NAME pack_ubyte_from_uint_rgba 499848b8605Smrg#include "pack_tmp.h" 500848b8605Smrg#undef DST_TYPE 501848b8605Smrg#undef SRC_CONVERT 502848b8605Smrg#undef FN_NAME 503848b8605Smrg 504848b8605Smrg#define DST_TYPE GLbyte 505848b8605Smrg#define SRC_CONVERT(x) CLAMP((int)x, -128, 127) 506848b8605Smrg#define FN_NAME pack_byte_from_uint_rgba 507848b8605Smrg#include "pack_tmp.h" 508848b8605Smrg#undef DST_TYPE 509848b8605Smrg#undef SRC_CONVERT 510848b8605Smrg#undef FN_NAME 511848b8605Smrg 512848b8605Smrg#undef SRC_TYPE 513848b8605Smrg 514848b8605Smrgstatic void 515848b8605Smrg_pack_rgba_span_from_uints_problem(struct gl_context *ctx, 516848b8605Smrg GLenum dstFormat, GLenum dstType) 517848b8605Smrg{ 518848b8605Smrg _mesa_problem(ctx, 519848b8605Smrg "Unsupported type (%s) / format (%s) " 520848b8605Smrg "in _mesa_pack_rgba_span_from_uints", 521848b8605Smrg _mesa_lookup_enum_by_nr(dstType), 522848b8605Smrg _mesa_lookup_enum_by_nr(dstFormat)); 523848b8605Smrg} 524848b8605Smrg 525848b8605Smrgvoid 526848b8605Smrg_mesa_pack_rgba_span_from_uints(struct gl_context *ctx, GLuint n, GLuint rgba[][4], 527848b8605Smrg GLenum dstFormat, GLenum dstType, 528848b8605Smrg GLvoid *dstAddr) 529848b8605Smrg{ 530848b8605Smrg GLuint i; 531848b8605Smrg 532848b8605Smrg switch(dstType) { 533848b8605Smrg case GL_UNSIGNED_INT: 534848b8605Smrg pack_uint_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n); 535848b8605Smrg break; 536848b8605Smrg case GL_INT: 537848b8605Smrg pack_int_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n); 538848b8605Smrg break; 539848b8605Smrg case GL_UNSIGNED_SHORT: 540848b8605Smrg pack_ushort_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n); 541848b8605Smrg break; 542848b8605Smrg case GL_SHORT: 543848b8605Smrg pack_short_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n); 544848b8605Smrg break; 545848b8605Smrg case GL_UNSIGNED_BYTE: 546848b8605Smrg pack_ubyte_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n); 547848b8605Smrg break; 548848b8605Smrg case GL_BYTE: 549848b8605Smrg pack_byte_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n); 550848b8605Smrg break; 551848b8605Smrg case GL_UNSIGNED_BYTE_3_3_2: 552848b8605Smrg if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) { 553848b8605Smrg GLubyte *dst = (GLubyte *) dstAddr; 554848b8605Smrg for (i=0;i<n;i++) { 555848b8605Smrg dst[i] = (MIN2(rgba[i][RCOMP], 7) << 5) 556848b8605Smrg | (MIN2(rgba[i][GCOMP], 7) << 2) 557848b8605Smrg | (MIN2(rgba[i][BCOMP], 3) ); 558848b8605Smrg } 559848b8605Smrg } else { 560848b8605Smrg _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 561848b8605Smrg } 562848b8605Smrg break; 563848b8605Smrg case GL_UNSIGNED_BYTE_2_3_3_REV: 564848b8605Smrg if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) { 565848b8605Smrg GLubyte *dst = (GLubyte *) dstAddr; 566848b8605Smrg for (i=0;i<n;i++) { 567848b8605Smrg dst[i] = (MIN2(rgba[i][RCOMP], 7) ) 568848b8605Smrg | (MIN2(rgba[i][GCOMP], 7) << 3) 569848b8605Smrg | (MIN2(rgba[i][BCOMP], 3) << 6); 570848b8605Smrg } 571848b8605Smrg } else { 572848b8605Smrg _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 573848b8605Smrg } 574848b8605Smrg break; 575848b8605Smrg case GL_UNSIGNED_SHORT_5_6_5: 576848b8605Smrg if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) { 577848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 578848b8605Smrg for (i=0;i<n;i++) { 579848b8605Smrg dst[i] = (MIN2(rgba[i][RCOMP], 31) << 11) 580848b8605Smrg | (MIN2(rgba[i][GCOMP], 63) << 5) 581848b8605Smrg | (MIN2(rgba[i][BCOMP], 31) ); 582848b8605Smrg } 583848b8605Smrg } else { 584848b8605Smrg _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 585848b8605Smrg } 586848b8605Smrg break; 587848b8605Smrg case GL_UNSIGNED_SHORT_5_6_5_REV: 588848b8605Smrg if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) { 589848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 590848b8605Smrg for (i=0;i<n;i++) { 591848b8605Smrg dst[i] = (MIN2(rgba[i][RCOMP], 31) ) 592848b8605Smrg | (MIN2(rgba[i][GCOMP], 63) << 5) 593848b8605Smrg | (MIN2(rgba[i][BCOMP], 31) << 11); 594848b8605Smrg } 595848b8605Smrg } else { 596848b8605Smrg _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 597848b8605Smrg } 598848b8605Smrg break; 599848b8605Smrg case GL_UNSIGNED_SHORT_4_4_4_4: 600848b8605Smrg if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 601848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 602848b8605Smrg for (i=0;i<n;i++) { 603848b8605Smrg dst[i] = (MIN2(rgba[i][RCOMP], 15) << 12) 604848b8605Smrg | (MIN2(rgba[i][GCOMP], 15) << 8) 605848b8605Smrg | (MIN2(rgba[i][BCOMP], 15) << 4) 606848b8605Smrg | (MIN2(rgba[i][ACOMP], 15) ); 607848b8605Smrg } 608848b8605Smrg } 609848b8605Smrg else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 610848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 611848b8605Smrg for (i=0;i<n;i++) { 612848b8605Smrg dst[i] = (MIN2(rgba[i][BCOMP], 15) << 12) 613848b8605Smrg | (MIN2(rgba[i][GCOMP], 15) << 8) 614848b8605Smrg | (MIN2(rgba[i][RCOMP], 15) << 4) 615848b8605Smrg | (MIN2(rgba[i][ACOMP], 15) ); 616848b8605Smrg } 617848b8605Smrg } 618848b8605Smrg else if (dstFormat == GL_ABGR_EXT) { 619848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 620848b8605Smrg for (i=0;i<n;i++) { 621848b8605Smrg dst[i] = (MIN2(rgba[i][ACOMP], 15) << 12) 622848b8605Smrg | (MIN2(rgba[i][BCOMP], 15) << 8) 623848b8605Smrg | (MIN2(rgba[i][GCOMP], 15) << 4) 624848b8605Smrg | (MIN2(rgba[i][RCOMP], 15) ); 625848b8605Smrg } 626848b8605Smrg } else { 627848b8605Smrg _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 628848b8605Smrg } 629848b8605Smrg break; 630848b8605Smrg case GL_UNSIGNED_SHORT_4_4_4_4_REV: 631848b8605Smrg if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 632848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 633848b8605Smrg for (i=0;i<n;i++) { 634848b8605Smrg dst[i] = (MIN2(rgba[i][RCOMP], 15) ) 635848b8605Smrg | (MIN2(rgba[i][GCOMP], 15) << 4) 636848b8605Smrg | (MIN2(rgba[i][BCOMP], 15) << 8) 637848b8605Smrg | (MIN2(rgba[i][ACOMP], 15) << 12); 638848b8605Smrg } 639848b8605Smrg } 640848b8605Smrg else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 641848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 642848b8605Smrg for (i=0;i<n;i++) { 643848b8605Smrg dst[i] = (MIN2(rgba[i][BCOMP], 15) ) 644848b8605Smrg | (MIN2(rgba[i][GCOMP], 15) << 4) 645848b8605Smrg | (MIN2(rgba[i][RCOMP], 15) << 8) 646848b8605Smrg | (MIN2(rgba[i][ACOMP], 15) << 12); 647848b8605Smrg } 648848b8605Smrg } 649848b8605Smrg else if (dstFormat == GL_ABGR_EXT) { 650848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 651848b8605Smrg for (i=0;i<n;i++) { 652848b8605Smrg dst[i] = (MIN2(rgba[i][ACOMP], 15) ) 653848b8605Smrg | (MIN2(rgba[i][BCOMP], 15) << 4) 654848b8605Smrg | (MIN2(rgba[i][GCOMP], 15) << 8) 655848b8605Smrg | (MIN2(rgba[i][RCOMP], 15) << 12); 656848b8605Smrg } 657848b8605Smrg } else { 658848b8605Smrg _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 659848b8605Smrg } 660848b8605Smrg break; 661848b8605Smrg case GL_UNSIGNED_SHORT_5_5_5_1: 662848b8605Smrg if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 663848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 664848b8605Smrg for (i=0;i<n;i++) { 665848b8605Smrg dst[i] = (MIN2(rgba[i][RCOMP], 31) << 11) 666848b8605Smrg | (MIN2(rgba[i][GCOMP], 31) << 6) 667848b8605Smrg | (MIN2(rgba[i][BCOMP], 31) << 1) 668848b8605Smrg | (MIN2(rgba[i][ACOMP], 1) ); 669848b8605Smrg } 670848b8605Smrg } 671848b8605Smrg else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 672848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 673848b8605Smrg for (i=0;i<n;i++) { 674848b8605Smrg dst[i] = (MIN2(rgba[i][BCOMP], 31) << 11) 675848b8605Smrg | (MIN2(rgba[i][GCOMP], 31) << 6) 676848b8605Smrg | (MIN2(rgba[i][RCOMP], 31) << 1) 677848b8605Smrg | (MIN2(rgba[i][ACOMP], 1) ); 678848b8605Smrg } 679848b8605Smrg } 680848b8605Smrg else if (dstFormat == GL_ABGR_EXT) { 681848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 682848b8605Smrg for (i=0;i<n;i++) { 683848b8605Smrg dst[i] = (MIN2(rgba[i][ACOMP], 31) << 11) 684848b8605Smrg | (MIN2(rgba[i][BCOMP], 31) << 6) 685848b8605Smrg | (MIN2(rgba[i][GCOMP], 31) << 1) 686848b8605Smrg | (MIN2(rgba[i][RCOMP], 1) ); 687848b8605Smrg } 688848b8605Smrg } else { 689848b8605Smrg _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 690848b8605Smrg } 691848b8605Smrg break; 692848b8605Smrg case GL_UNSIGNED_SHORT_1_5_5_5_REV: 693848b8605Smrg if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 694848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 695848b8605Smrg for (i=0;i<n;i++) { 696848b8605Smrg dst[i] = (MIN2(rgba[i][RCOMP], 31) ) 697848b8605Smrg | (MIN2(rgba[i][GCOMP], 31) << 5) 698848b8605Smrg | (MIN2(rgba[i][BCOMP], 31) << 10) 699848b8605Smrg | (MIN2(rgba[i][ACOMP], 1) << 15); 700848b8605Smrg } 701848b8605Smrg } 702848b8605Smrg else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 703848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 704848b8605Smrg for (i=0;i<n;i++) { 705848b8605Smrg dst[i] = (MIN2(rgba[i][BCOMP], 31) ) 706848b8605Smrg | (MIN2(rgba[i][GCOMP], 31) << 5) 707848b8605Smrg | (MIN2(rgba[i][RCOMP], 31) << 10) 708848b8605Smrg | (MIN2(rgba[i][ACOMP], 1) << 15); 709848b8605Smrg } 710848b8605Smrg } 711848b8605Smrg else if (dstFormat == GL_ABGR_EXT) { 712848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 713848b8605Smrg for (i=0;i<n;i++) { 714848b8605Smrg dst[i] = (MIN2(rgba[i][ACOMP], 31) ) 715848b8605Smrg | (MIN2(rgba[i][BCOMP], 31) << 5) 716848b8605Smrg | (MIN2(rgba[i][GCOMP], 31) << 10) 717848b8605Smrg | (MIN2(rgba[i][RCOMP], 1) << 15); 718848b8605Smrg } 719848b8605Smrg } else { 720848b8605Smrg _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 721848b8605Smrg } 722848b8605Smrg break; 723848b8605Smrg case GL_UNSIGNED_INT_8_8_8_8: 724848b8605Smrg if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 725848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 726848b8605Smrg for (i=0;i<n;i++) { 727848b8605Smrg dst[i] = (MIN2(rgba[i][RCOMP], 255) << 24) 728848b8605Smrg | (MIN2(rgba[i][GCOMP], 255) << 16) 729848b8605Smrg | (MIN2(rgba[i][BCOMP], 255) << 8) 730848b8605Smrg | (MIN2(rgba[i][ACOMP], 255) ); 731848b8605Smrg } 732848b8605Smrg } 733848b8605Smrg else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 734848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 735848b8605Smrg for (i=0;i<n;i++) { 736848b8605Smrg dst[i] = (MIN2(rgba[i][BCOMP], 255) << 24) 737848b8605Smrg | (MIN2(rgba[i][GCOMP], 255) << 16) 738848b8605Smrg | (MIN2(rgba[i][RCOMP], 255) << 8) 739848b8605Smrg | (MIN2(rgba[i][ACOMP], 255) ); 740848b8605Smrg } 741848b8605Smrg } 742848b8605Smrg else if (dstFormat == GL_ABGR_EXT) { 743848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 744848b8605Smrg for (i=0;i<n;i++) { 745848b8605Smrg dst[i] = (MIN2(rgba[i][ACOMP], 255) << 24) 746848b8605Smrg | (MIN2(rgba[i][BCOMP], 255) << 16) 747848b8605Smrg | (MIN2(rgba[i][GCOMP], 255) << 8) 748848b8605Smrg | (MIN2(rgba[i][RCOMP], 255) ); 749848b8605Smrg } 750848b8605Smrg } else { 751848b8605Smrg _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 752848b8605Smrg } 753848b8605Smrg break; 754848b8605Smrg case GL_UNSIGNED_INT_8_8_8_8_REV: 755848b8605Smrg if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 756848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 757848b8605Smrg for (i=0;i<n;i++) { 758848b8605Smrg dst[i] = (MIN2(rgba[i][RCOMP], 255) ) 759848b8605Smrg | (MIN2(rgba[i][GCOMP], 255) << 8) 760848b8605Smrg | (MIN2(rgba[i][BCOMP], 255) << 16) 761848b8605Smrg | (MIN2(rgba[i][ACOMP], 255) << 24); 762848b8605Smrg } 763848b8605Smrg } 764848b8605Smrg else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 765848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 766848b8605Smrg for (i=0;i<n;i++) { 767848b8605Smrg dst[i] = (MIN2(rgba[i][BCOMP], 255) ) 768848b8605Smrg | (MIN2(rgba[i][GCOMP], 255) << 8) 769848b8605Smrg | (MIN2(rgba[i][RCOMP], 255) << 16) 770848b8605Smrg | (MIN2(rgba[i][ACOMP], 255) << 24); 771848b8605Smrg } 772848b8605Smrg } 773848b8605Smrg else if (dstFormat == GL_ABGR_EXT) { 774848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 775848b8605Smrg for (i=0;i<n;i++) { 776848b8605Smrg dst[i] = (MIN2(rgba[i][ACOMP], 255) ) 777848b8605Smrg | (MIN2(rgba[i][BCOMP], 255) << 8) 778848b8605Smrg | (MIN2(rgba[i][GCOMP], 255) << 16) 779848b8605Smrg | (MIN2(rgba[i][RCOMP], 255) << 24); 780848b8605Smrg } 781848b8605Smrg } else { 782848b8605Smrg _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 783848b8605Smrg } 784848b8605Smrg break; 785848b8605Smrg case GL_UNSIGNED_INT_10_10_10_2: 786848b8605Smrg if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 787848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 788848b8605Smrg for (i=0;i<n;i++) { 789848b8605Smrg dst[i] = (MIN2(rgba[i][RCOMP], 1023) << 22) 790848b8605Smrg | (MIN2(rgba[i][GCOMP], 1023) << 12) 791848b8605Smrg | (MIN2(rgba[i][BCOMP], 1023) << 2) 792848b8605Smrg | (MIN2(rgba[i][ACOMP], 3) ); 793848b8605Smrg } 794848b8605Smrg } 795848b8605Smrg else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 796848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 797848b8605Smrg for (i=0;i<n;i++) { 798848b8605Smrg dst[i] = (MIN2(rgba[i][BCOMP], 1023) << 22) 799848b8605Smrg | (MIN2(rgba[i][GCOMP], 1023) << 12) 800848b8605Smrg | (MIN2(rgba[i][RCOMP], 1023) << 2) 801848b8605Smrg | (MIN2(rgba[i][ACOMP], 3) ); 802848b8605Smrg } 803848b8605Smrg } 804848b8605Smrg else if (dstFormat == GL_ABGR_EXT) { 805848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 806848b8605Smrg for (i=0;i<n;i++) { 807848b8605Smrg dst[i] = (MIN2(rgba[i][ACOMP], 1023) << 22) 808848b8605Smrg | (MIN2(rgba[i][BCOMP], 1023) << 12) 809848b8605Smrg | (MIN2(rgba[i][GCOMP], 1023) << 2) 810848b8605Smrg | (MIN2(rgba[i][RCOMP], 3) ); 811848b8605Smrg } 812848b8605Smrg } else { 813848b8605Smrg _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 814848b8605Smrg } 815848b8605Smrg break; 816848b8605Smrg case GL_UNSIGNED_INT_2_10_10_10_REV: 817848b8605Smrg if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 818848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 819848b8605Smrg for (i=0;i<n;i++) { 820848b8605Smrg dst[i] = (MIN2(rgba[i][RCOMP], 1023) ) 821848b8605Smrg | (MIN2(rgba[i][GCOMP], 1023) << 10) 822848b8605Smrg | (MIN2(rgba[i][BCOMP], 1023) << 20) 823848b8605Smrg | (MIN2(rgba[i][ACOMP], 3) << 30); 824848b8605Smrg } 825848b8605Smrg } 826848b8605Smrg else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 827848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 828848b8605Smrg for (i=0;i<n;i++) { 829848b8605Smrg dst[i] = (MIN2(rgba[i][BCOMP], 1023) ) 830848b8605Smrg | (MIN2(rgba[i][GCOMP], 1023) << 10) 831848b8605Smrg | (MIN2(rgba[i][RCOMP], 1023) << 20) 832848b8605Smrg | (MIN2(rgba[i][ACOMP], 3) << 30); 833848b8605Smrg } 834848b8605Smrg } 835848b8605Smrg else if (dstFormat == GL_ABGR_EXT) { 836848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 837848b8605Smrg for (i=0;i<n;i++) { 838848b8605Smrg dst[i] = (MIN2(rgba[i][ACOMP], 1023) ) 839848b8605Smrg | (MIN2(rgba[i][BCOMP], 1023) << 10) 840848b8605Smrg | (MIN2(rgba[i][GCOMP], 1023) << 20) 841848b8605Smrg | (MIN2(rgba[i][RCOMP], 3) << 30); 842848b8605Smrg } 843848b8605Smrg } else { 844848b8605Smrg _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 845848b8605Smrg } 846848b8605Smrg break; 847848b8605Smrg default: 848848b8605Smrg _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 849848b8605Smrg return; 850848b8605Smrg } 851848b8605Smrg} 852848b8605Smrg 853848b8605Smrg 854848b8605Smrg/* Customization of signed integer packing. 855848b8605Smrg */ 856848b8605Smrg#define SRC_TYPE GLint 857848b8605Smrg 858848b8605Smrg#define DST_TYPE GLuint 859848b8605Smrg#define SRC_CONVERT(x) MAX2(x, 0) 860848b8605Smrg#define FN_NAME pack_uint_from_int_rgba 861848b8605Smrg#include "pack_tmp.h" 862848b8605Smrg#undef DST_TYPE 863848b8605Smrg#undef SRC_CONVERT 864848b8605Smrg#undef FN_NAME 865848b8605Smrg 866848b8605Smrg#define DST_TYPE GLushort 867848b8605Smrg#define SRC_CONVERT(x) MAX2(x, 0) 868848b8605Smrg#define FN_NAME pack_ushort_from_int_rgba 869848b8605Smrg#include "pack_tmp.h" 870848b8605Smrg#undef DST_TYPE 871848b8605Smrg#undef SRC_CONVERT 872848b8605Smrg#undef FN_NAME 873848b8605Smrg 874848b8605Smrg#define DST_TYPE GLshort 875848b8605Smrg#define SRC_CONVERT(x) CLAMP(x, -0x8000, 0x7fff) 876848b8605Smrg#define FN_NAME pack_short_from_int_rgba 877848b8605Smrg#include "pack_tmp.h" 878848b8605Smrg#undef DST_TYPE 879848b8605Smrg#undef SRC_CONVERT 880848b8605Smrg#undef FN_NAME 881848b8605Smrg 882848b8605Smrg#define DST_TYPE GLubyte 883848b8605Smrg#define SRC_CONVERT(x) MAX2(x, 0) 884848b8605Smrg#define FN_NAME pack_ubyte_from_int_rgba 885848b8605Smrg#include "pack_tmp.h" 886848b8605Smrg#undef DST_TYPE 887848b8605Smrg#undef SRC_CONVERT 888848b8605Smrg#undef FN_NAME 889848b8605Smrg 890848b8605Smrg#define DST_TYPE GLbyte 891848b8605Smrg#define SRC_CONVERT(x) CLAMP(x, -0x80, 0x7f) 892848b8605Smrg#define FN_NAME pack_byte_from_int_rgba 893848b8605Smrg#include "pack_tmp.h" 894848b8605Smrg#undef DST_TYPE 895848b8605Smrg#undef SRC_CONVERT 896848b8605Smrg#undef FN_NAME 897848b8605Smrg 898848b8605Smrg#undef SRC_TYPE 899848b8605Smrg 900848b8605Smrgstatic void 901848b8605Smrg_pack_rgba_span_from_ints_problem(struct gl_context *ctx, 902848b8605Smrg GLenum dstFormat, GLenum dstType) 903848b8605Smrg{ 904848b8605Smrg _mesa_problem(ctx, 905848b8605Smrg "Unsupported type (%s) / format (%s) " 906848b8605Smrg "in _mesa_pack_rgba_span_from_ints", 907848b8605Smrg _mesa_lookup_enum_by_nr(dstType), 908848b8605Smrg _mesa_lookup_enum_by_nr(dstFormat)); 909848b8605Smrg} 910848b8605Smrg 911848b8605Smrgvoid 912848b8605Smrg_mesa_pack_rgba_span_from_ints(struct gl_context *ctx, GLuint n, GLint rgba[][4], 913848b8605Smrg GLenum dstFormat, GLenum dstType, 914848b8605Smrg GLvoid *dstAddr) 915848b8605Smrg{ 916848b8605Smrg GLuint i; 917848b8605Smrg 918848b8605Smrg switch(dstType) { 919848b8605Smrg case GL_UNSIGNED_INT: 920848b8605Smrg pack_uint_from_int_rgba(ctx, dstAddr, dstFormat, rgba, n); 921848b8605Smrg break; 922848b8605Smrg case GL_INT: 923848b8605Smrg /* No conversion necessary. */ 924848b8605Smrg pack_uint_from_uint_rgba(ctx, dstAddr, dstFormat, (GLuint (*)[4]) rgba, n); 925848b8605Smrg break; 926848b8605Smrg case GL_UNSIGNED_SHORT: 927848b8605Smrg pack_ushort_from_int_rgba(ctx, dstAddr, dstFormat, rgba, n); 928848b8605Smrg break; 929848b8605Smrg case GL_SHORT: 930848b8605Smrg pack_short_from_int_rgba(ctx, dstAddr, dstFormat, rgba, n); 931848b8605Smrg break; 932848b8605Smrg case GL_UNSIGNED_BYTE: 933848b8605Smrg pack_ubyte_from_int_rgba(ctx, dstAddr, dstFormat, rgba, n); 934848b8605Smrg break; 935848b8605Smrg case GL_BYTE: 936848b8605Smrg pack_byte_from_int_rgba(ctx, dstAddr, dstFormat, rgba, n); 937848b8605Smrg break; 938848b8605Smrg case GL_UNSIGNED_BYTE_3_3_2: 939848b8605Smrg if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) { 940848b8605Smrg GLubyte *dst = (GLubyte *) dstAddr; 941848b8605Smrg for (i=0;i<n;i++) { 942848b8605Smrg dst[i] = (CLAMP(rgba[i][RCOMP], 0, 7) << 5) 943848b8605Smrg | (CLAMP(rgba[i][GCOMP], 0, 7) << 2) 944848b8605Smrg | (CLAMP(rgba[i][BCOMP], 0, 3) ); 945848b8605Smrg } 946848b8605Smrg } else { 947848b8605Smrg _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 948848b8605Smrg } 949848b8605Smrg break; 950848b8605Smrg case GL_UNSIGNED_BYTE_2_3_3_REV: 951848b8605Smrg if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) { 952848b8605Smrg GLubyte *dst = (GLubyte *) dstAddr; 953848b8605Smrg for (i=0;i<n;i++) { 954848b8605Smrg dst[i] = (CLAMP(rgba[i][RCOMP], 0, 7) ) 955848b8605Smrg | (CLAMP(rgba[i][GCOMP], 0, 7) << 3) 956848b8605Smrg | (CLAMP(rgba[i][BCOMP], 0, 3) << 6); 957848b8605Smrg } 958848b8605Smrg } else { 959848b8605Smrg _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 960848b8605Smrg } 961848b8605Smrg break; 962848b8605Smrg case GL_UNSIGNED_SHORT_5_6_5: 963848b8605Smrg if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) { 964848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 965848b8605Smrg for (i=0;i<n;i++) { 966848b8605Smrg dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31) << 11) 967848b8605Smrg | (CLAMP(rgba[i][GCOMP], 0, 63) << 5) 968848b8605Smrg | (CLAMP(rgba[i][BCOMP], 0, 31) ); 969848b8605Smrg } 970848b8605Smrg } else { 971848b8605Smrg _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 972848b8605Smrg } 973848b8605Smrg break; 974848b8605Smrg case GL_UNSIGNED_SHORT_5_6_5_REV: 975848b8605Smrg if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) { 976848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 977848b8605Smrg for (i=0;i<n;i++) { 978848b8605Smrg dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31) ) 979848b8605Smrg | (CLAMP(rgba[i][GCOMP], 0, 63) << 5) 980848b8605Smrg | (CLAMP(rgba[i][BCOMP], 0, 31) << 11); 981848b8605Smrg } 982848b8605Smrg } else { 983848b8605Smrg _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 984848b8605Smrg } 985848b8605Smrg break; 986848b8605Smrg case GL_UNSIGNED_SHORT_4_4_4_4: 987848b8605Smrg if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 988848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 989848b8605Smrg for (i=0;i<n;i++) { 990848b8605Smrg dst[i] = (CLAMP(rgba[i][RCOMP], 0, 15) << 12) 991848b8605Smrg | (CLAMP(rgba[i][GCOMP], 0, 15) << 8) 992848b8605Smrg | (CLAMP(rgba[i][BCOMP], 0, 15) << 4) 993848b8605Smrg | (CLAMP(rgba[i][ACOMP], 0, 15) ); 994848b8605Smrg } 995848b8605Smrg } 996848b8605Smrg else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 997848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 998848b8605Smrg for (i=0;i<n;i++) { 999848b8605Smrg dst[i] = (CLAMP(rgba[i][BCOMP], 0, 15) << 12) 1000848b8605Smrg | (CLAMP(rgba[i][GCOMP], 0, 15) << 8) 1001848b8605Smrg | (CLAMP(rgba[i][RCOMP], 0, 15) << 4) 1002848b8605Smrg | (CLAMP(rgba[i][ACOMP], 0, 15) ); 1003848b8605Smrg } 1004848b8605Smrg } 1005848b8605Smrg else if (dstFormat == GL_ABGR_EXT) { 1006848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 1007848b8605Smrg for (i=0;i<n;i++) { 1008848b8605Smrg dst[i] = (CLAMP(rgba[i][ACOMP], 0, 15) << 12) 1009848b8605Smrg | (CLAMP(rgba[i][BCOMP], 0, 15) << 8) 1010848b8605Smrg | (CLAMP(rgba[i][GCOMP], 0, 15) << 4) 1011848b8605Smrg | (CLAMP(rgba[i][RCOMP], 0, 15) ); 1012848b8605Smrg } 1013848b8605Smrg } else { 1014848b8605Smrg _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 1015848b8605Smrg } 1016848b8605Smrg break; 1017848b8605Smrg case GL_UNSIGNED_SHORT_4_4_4_4_REV: 1018848b8605Smrg if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 1019848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 1020848b8605Smrg for (i=0;i<n;i++) { 1021848b8605Smrg dst[i] = (CLAMP(rgba[i][RCOMP], 0, 15) ) 1022848b8605Smrg | (CLAMP(rgba[i][GCOMP], 0, 15) << 4) 1023848b8605Smrg | (CLAMP(rgba[i][BCOMP], 0, 15) << 8) 1024848b8605Smrg | (CLAMP(rgba[i][ACOMP], 0, 15) << 12); 1025848b8605Smrg } 1026848b8605Smrg } 1027848b8605Smrg else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 1028848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 1029848b8605Smrg for (i=0;i<n;i++) { 1030848b8605Smrg dst[i] = (CLAMP(rgba[i][BCOMP], 0, 15) ) 1031848b8605Smrg | (CLAMP(rgba[i][GCOMP], 0, 15) << 4) 1032848b8605Smrg | (CLAMP(rgba[i][RCOMP], 0, 15) << 8) 1033848b8605Smrg | (CLAMP(rgba[i][ACOMP], 0, 15) << 12); 1034848b8605Smrg } 1035848b8605Smrg } 1036848b8605Smrg else if (dstFormat == GL_ABGR_EXT) { 1037848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 1038848b8605Smrg for (i=0;i<n;i++) { 1039848b8605Smrg dst[i] = (CLAMP(rgba[i][ACOMP], 0, 15) ) 1040848b8605Smrg | (CLAMP(rgba[i][BCOMP], 0, 15) << 4) 1041848b8605Smrg | (CLAMP(rgba[i][GCOMP], 0, 15) << 8) 1042848b8605Smrg | (CLAMP(rgba[i][RCOMP], 0, 15) << 12); 1043848b8605Smrg } 1044848b8605Smrg } else { 1045848b8605Smrg _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 1046848b8605Smrg } 1047848b8605Smrg break; 1048848b8605Smrg case GL_UNSIGNED_SHORT_5_5_5_1: 1049848b8605Smrg if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 1050848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 1051848b8605Smrg for (i=0;i<n;i++) { 1052848b8605Smrg dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31) << 11) 1053848b8605Smrg | (CLAMP(rgba[i][GCOMP], 0, 31) << 6) 1054848b8605Smrg | (CLAMP(rgba[i][BCOMP], 0, 31) << 1) 1055848b8605Smrg | (CLAMP(rgba[i][ACOMP], 0, 1) ); 1056848b8605Smrg } 1057848b8605Smrg } 1058848b8605Smrg else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 1059848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 1060848b8605Smrg for (i=0;i<n;i++) { 1061848b8605Smrg dst[i] = (CLAMP(rgba[i][BCOMP], 0, 31) << 11) 1062848b8605Smrg | (CLAMP(rgba[i][GCOMP], 0, 31) << 6) 1063848b8605Smrg | (CLAMP(rgba[i][RCOMP], 0, 31) << 1) 1064848b8605Smrg | (CLAMP(rgba[i][ACOMP], 0, 1) ); 1065848b8605Smrg } 1066848b8605Smrg } 1067848b8605Smrg else if (dstFormat == GL_ABGR_EXT) { 1068848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 1069848b8605Smrg for (i=0;i<n;i++) { 1070848b8605Smrg dst[i] = (CLAMP(rgba[i][ACOMP], 0, 31) << 11) 1071848b8605Smrg | (CLAMP(rgba[i][BCOMP], 0, 31) << 6) 1072848b8605Smrg | (CLAMP(rgba[i][GCOMP], 0, 31) << 1) 1073848b8605Smrg | (CLAMP(rgba[i][RCOMP], 0, 1) ); 1074848b8605Smrg } 1075848b8605Smrg } else { 1076848b8605Smrg _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 1077848b8605Smrg } 1078848b8605Smrg break; 1079848b8605Smrg case GL_UNSIGNED_SHORT_1_5_5_5_REV: 1080848b8605Smrg if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 1081848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 1082848b8605Smrg for (i=0;i<n;i++) { 1083848b8605Smrg dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31) ) 1084848b8605Smrg | (CLAMP(rgba[i][GCOMP], 0, 31) << 5) 1085848b8605Smrg | (CLAMP(rgba[i][BCOMP], 0, 31) << 10) 1086848b8605Smrg | (CLAMP(rgba[i][ACOMP], 0, 1) << 15); 1087848b8605Smrg } 1088848b8605Smrg } 1089848b8605Smrg else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 1090848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 1091848b8605Smrg for (i=0;i<n;i++) { 1092848b8605Smrg dst[i] = (CLAMP(rgba[i][BCOMP], 0, 31) ) 1093848b8605Smrg | (CLAMP(rgba[i][GCOMP], 0, 31) << 5) 1094848b8605Smrg | (CLAMP(rgba[i][RCOMP], 0, 31) << 10) 1095848b8605Smrg | (CLAMP(rgba[i][ACOMP], 0, 1) << 15); 1096848b8605Smrg } 1097848b8605Smrg } 1098848b8605Smrg else if (dstFormat == GL_ABGR_EXT) { 1099848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 1100848b8605Smrg for (i=0;i<n;i++) { 1101848b8605Smrg dst[i] = (CLAMP(rgba[i][ACOMP], 0, 31) ) 1102848b8605Smrg | (CLAMP(rgba[i][BCOMP], 0, 31) << 5) 1103848b8605Smrg | (CLAMP(rgba[i][GCOMP], 0, 31) << 10) 1104848b8605Smrg | (CLAMP(rgba[i][RCOMP], 0, 1) << 15); 1105848b8605Smrg } 1106848b8605Smrg } else { 1107848b8605Smrg _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 1108848b8605Smrg } 1109848b8605Smrg break; 1110848b8605Smrg case GL_UNSIGNED_INT_8_8_8_8: 1111848b8605Smrg if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 1112848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 1113848b8605Smrg for (i=0;i<n;i++) { 1114848b8605Smrg dst[i] = (CLAMP(rgba[i][RCOMP], 0, 255) << 24) 1115848b8605Smrg | (CLAMP(rgba[i][GCOMP], 0, 255) << 16) 1116848b8605Smrg | (CLAMP(rgba[i][BCOMP], 0, 255) << 8) 1117848b8605Smrg | (CLAMP(rgba[i][ACOMP], 0, 255) ); 1118848b8605Smrg } 1119848b8605Smrg } 1120848b8605Smrg else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 1121848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 1122848b8605Smrg for (i=0;i<n;i++) { 1123848b8605Smrg dst[i] = (CLAMP(rgba[i][BCOMP], 0, 255) << 24) 1124848b8605Smrg | (CLAMP(rgba[i][GCOMP], 0, 255) << 16) 1125848b8605Smrg | (CLAMP(rgba[i][RCOMP], 0, 255) << 8) 1126848b8605Smrg | (CLAMP(rgba[i][ACOMP], 0, 255) ); 1127848b8605Smrg } 1128848b8605Smrg } 1129848b8605Smrg else if (dstFormat == GL_ABGR_EXT) { 1130848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 1131848b8605Smrg for (i=0;i<n;i++) { 1132848b8605Smrg dst[i] = (CLAMP(rgba[i][ACOMP], 0, 255) << 24) 1133848b8605Smrg | (CLAMP(rgba[i][BCOMP], 0, 255) << 16) 1134848b8605Smrg | (CLAMP(rgba[i][GCOMP], 0, 255) << 8) 1135848b8605Smrg | (CLAMP(rgba[i][RCOMP], 0, 255) ); 1136848b8605Smrg } 1137848b8605Smrg } else { 1138848b8605Smrg _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 1139848b8605Smrg } 1140848b8605Smrg break; 1141848b8605Smrg case GL_UNSIGNED_INT_8_8_8_8_REV: 1142848b8605Smrg if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 1143848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 1144848b8605Smrg for (i=0;i<n;i++) { 1145848b8605Smrg dst[i] = (CLAMP(rgba[i][RCOMP], 0, 255) ) 1146848b8605Smrg | (CLAMP(rgba[i][GCOMP], 0, 255) << 8) 1147848b8605Smrg | (CLAMP(rgba[i][BCOMP], 0, 255) << 16) 1148848b8605Smrg | (CLAMP(rgba[i][ACOMP], 0, 255) << 24); 1149848b8605Smrg } 1150848b8605Smrg } 1151848b8605Smrg else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 1152848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 1153848b8605Smrg for (i=0;i<n;i++) { 1154848b8605Smrg dst[i] = (CLAMP(rgba[i][BCOMP], 0, 255) ) 1155848b8605Smrg | (CLAMP(rgba[i][GCOMP], 0, 255) << 8) 1156848b8605Smrg | (CLAMP(rgba[i][RCOMP], 0, 255) << 16) 1157848b8605Smrg | (CLAMP(rgba[i][ACOMP], 0, 255) << 24); 1158848b8605Smrg } 1159848b8605Smrg } 1160848b8605Smrg else if (dstFormat == GL_ABGR_EXT) { 1161848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 1162848b8605Smrg for (i=0;i<n;i++) { 1163848b8605Smrg dst[i] = (CLAMP(rgba[i][ACOMP], 0, 255) ) 1164848b8605Smrg | (CLAMP(rgba[i][BCOMP], 0, 255) << 8) 1165848b8605Smrg | (CLAMP(rgba[i][GCOMP], 0, 255) << 16) 1166848b8605Smrg | (CLAMP(rgba[i][RCOMP], 0, 255) << 24); 1167848b8605Smrg } 1168848b8605Smrg } else { 1169848b8605Smrg _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 1170848b8605Smrg } 1171848b8605Smrg break; 1172848b8605Smrg case GL_UNSIGNED_INT_10_10_10_2: 1173848b8605Smrg if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 1174848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 1175848b8605Smrg for (i=0;i<n;i++) { 1176848b8605Smrg dst[i] = (CLAMP(rgba[i][RCOMP], 0, 1023) << 22) 1177848b8605Smrg | (CLAMP(rgba[i][GCOMP], 0, 1023) << 12) 1178848b8605Smrg | (CLAMP(rgba[i][BCOMP], 0, 1023) << 2) 1179848b8605Smrg | (CLAMP(rgba[i][ACOMP], 0, 3) ); 1180848b8605Smrg } 1181848b8605Smrg } 1182848b8605Smrg else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 1183848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 1184848b8605Smrg for (i=0;i<n;i++) { 1185848b8605Smrg dst[i] = (CLAMP(rgba[i][BCOMP], 0, 1023) << 22) 1186848b8605Smrg | (CLAMP(rgba[i][GCOMP], 0, 1023) << 12) 1187848b8605Smrg | (CLAMP(rgba[i][RCOMP], 0, 1023) << 2) 1188848b8605Smrg | (CLAMP(rgba[i][ACOMP], 0, 3) ); 1189848b8605Smrg } 1190848b8605Smrg } 1191848b8605Smrg else if (dstFormat == GL_ABGR_EXT) { 1192848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 1193848b8605Smrg for (i=0;i<n;i++) { 1194848b8605Smrg dst[i] = (CLAMP(rgba[i][ACOMP], 0, 1023) << 22) 1195848b8605Smrg | (CLAMP(rgba[i][BCOMP], 0, 1023) << 12) 1196848b8605Smrg | (CLAMP(rgba[i][GCOMP], 0, 1023) << 2) 1197848b8605Smrg | (CLAMP(rgba[i][RCOMP], 0, 3) ); 1198848b8605Smrg } 1199848b8605Smrg } else { 1200848b8605Smrg _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 1201848b8605Smrg } 1202848b8605Smrg break; 1203848b8605Smrg case GL_UNSIGNED_INT_2_10_10_10_REV: 1204848b8605Smrg if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 1205848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 1206848b8605Smrg for (i=0;i<n;i++) { 1207848b8605Smrg dst[i] = (CLAMP(rgba[i][RCOMP], 0, 1023) ) 1208848b8605Smrg | (CLAMP(rgba[i][GCOMP], 0, 1023) << 10) 1209848b8605Smrg | (CLAMP(rgba[i][BCOMP], 0, 1023) << 20) 1210848b8605Smrg | (CLAMP(rgba[i][ACOMP], 0, 3) << 30); 1211848b8605Smrg } 1212848b8605Smrg } 1213848b8605Smrg else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 1214848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 1215848b8605Smrg for (i=0;i<n;i++) { 1216848b8605Smrg dst[i] = (CLAMP(rgba[i][BCOMP], 0, 1023) ) 1217848b8605Smrg | (CLAMP(rgba[i][GCOMP], 0, 1023) << 10) 1218848b8605Smrg | (CLAMP(rgba[i][RCOMP], 0, 1023) << 20) 1219848b8605Smrg | (CLAMP(rgba[i][ACOMP], 0, 3) << 30); 1220848b8605Smrg } 1221848b8605Smrg } 1222848b8605Smrg else if (dstFormat == GL_ABGR_EXT) { 1223848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 1224848b8605Smrg for (i=0;i<n;i++) { 1225848b8605Smrg dst[i] = (CLAMP(rgba[i][ACOMP], 0, 1023) ) 1226848b8605Smrg | (CLAMP(rgba[i][BCOMP], 0, 1023) << 10) 1227848b8605Smrg | (CLAMP(rgba[i][GCOMP], 0, 1023) << 20) 1228848b8605Smrg | (CLAMP(rgba[i][RCOMP], 0, 3) << 30); 1229848b8605Smrg } 1230848b8605Smrg } else { 1231848b8605Smrg _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 1232848b8605Smrg } 1233848b8605Smrg break; 1234848b8605Smrg default: 1235848b8605Smrg _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 1236848b8605Smrg return; 1237848b8605Smrg } 1238848b8605Smrg} 1239848b8605Smrg 1240848b8605Smrg 1241848b8605Smrg/** 1242848b8605Smrg * Used to pack an array [][4] of RGBA float colors as specified 1243848b8605Smrg * by the dstFormat, dstType and dstPacking. Used by glReadPixels. 1244848b8605Smrg * Historically, the RGBA values were in [0,1] and rescaled to fit 1245848b8605Smrg * into GLubytes, etc. But with new integer formats, the RGBA values 1246848b8605Smrg * may have any value and we don't always rescale when converting to 1247848b8605Smrg * integers. 1248848b8605Smrg * 1249848b8605Smrg * Note: the rgba values will be modified by this function when any pixel 1250848b8605Smrg * transfer ops are enabled. 1251848b8605Smrg */ 1252848b8605Smrgvoid 1253848b8605Smrg_mesa_pack_rgba_span_float(struct gl_context *ctx, GLuint n, GLfloat rgba[][4], 1254848b8605Smrg GLenum dstFormat, GLenum dstType, 1255848b8605Smrg GLvoid *dstAddr, 1256848b8605Smrg const struct gl_pixelstore_attrib *dstPacking, 1257848b8605Smrg GLbitfield transferOps) 1258848b8605Smrg{ 1259848b8605Smrg GLfloat *luminance; 1260848b8605Smrg const GLint comps = _mesa_components_in_format(dstFormat); 1261848b8605Smrg const GLboolean intDstFormat = _mesa_is_enum_format_integer(dstFormat); 1262848b8605Smrg GLuint i; 1263848b8605Smrg 1264848b8605Smrg if (dstFormat == GL_LUMINANCE || 1265848b8605Smrg dstFormat == GL_LUMINANCE_ALPHA || 1266848b8605Smrg dstFormat == GL_LUMINANCE_INTEGER_EXT || 1267848b8605Smrg dstFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT) { 1268848b8605Smrg luminance = malloc(n * sizeof(GLfloat)); 1269848b8605Smrg if (!luminance) { 1270848b8605Smrg _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing"); 1271848b8605Smrg return; 1272848b8605Smrg } 1273848b8605Smrg } 1274848b8605Smrg else { 1275848b8605Smrg luminance = NULL; 1276848b8605Smrg } 1277848b8605Smrg 1278848b8605Smrg /* EXT_texture_integer specifies no transfer ops on integer 1279848b8605Smrg * types in the resolved issues section. Just set them to 0 1280848b8605Smrg * for integer surfaces. 1281848b8605Smrg */ 1282848b8605Smrg if (intDstFormat) 1283848b8605Smrg transferOps = 0; 1284848b8605Smrg 1285848b8605Smrg if (transferOps) { 1286848b8605Smrg _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba); 1287848b8605Smrg } 1288848b8605Smrg 1289848b8605Smrg /* 1290848b8605Smrg * Component clamping (besides clamping to [0,1] in 1291848b8605Smrg * _mesa_apply_rgba_transfer_ops()). 1292848b8605Smrg */ 1293848b8605Smrg if (intDstFormat) { 1294848b8605Smrg /* clamping to dest type's min/max values */ 1295848b8605Smrg GLfloat min, max; 1296848b8605Smrg if (get_type_min_max(dstType, &min, &max)) { 1297848b8605Smrg for (i = 0; i < n; i++) { 1298848b8605Smrg rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], min, max); 1299848b8605Smrg rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], min, max); 1300848b8605Smrg rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], min, max); 1301848b8605Smrg rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], min, max); 1302848b8605Smrg } 1303848b8605Smrg } 1304848b8605Smrg } 1305848b8605Smrg else if (dstFormat == GL_LUMINANCE || dstFormat == GL_LUMINANCE_ALPHA) { 1306848b8605Smrg /* compute luminance values */ 1307848b8605Smrg if (transferOps & IMAGE_CLAMP_BIT) { 1308848b8605Smrg for (i = 0; i < n; i++) { 1309848b8605Smrg GLfloat sum = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP]; 1310848b8605Smrg luminance[i] = CLAMP(sum, 0.0F, 1.0F); 1311848b8605Smrg } 1312848b8605Smrg } 1313848b8605Smrg else { 1314848b8605Smrg for (i = 0; i < n; i++) { 1315848b8605Smrg luminance[i] = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP]; 1316848b8605Smrg } 1317848b8605Smrg } 1318848b8605Smrg } 1319848b8605Smrg 1320848b8605Smrg /* 1321848b8605Smrg * Pack/store the pixels. Ugh! Lots of cases!!! 1322848b8605Smrg */ 1323848b8605Smrg switch (dstType) { 1324848b8605Smrg case GL_UNSIGNED_BYTE: 1325848b8605Smrg { 1326848b8605Smrg GLubyte *dst = (GLubyte *) dstAddr; 1327848b8605Smrg switch (dstFormat) { 1328848b8605Smrg case GL_RED: 1329848b8605Smrg for (i=0;i<n;i++) 1330848b8605Smrg dst[i] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1331848b8605Smrg break; 1332848b8605Smrg case GL_GREEN: 1333848b8605Smrg for (i=0;i<n;i++) 1334848b8605Smrg dst[i] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1335848b8605Smrg break; 1336848b8605Smrg case GL_BLUE: 1337848b8605Smrg for (i=0;i<n;i++) 1338848b8605Smrg dst[i] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 1339848b8605Smrg break; 1340848b8605Smrg case GL_ALPHA: 1341848b8605Smrg for (i=0;i<n;i++) 1342848b8605Smrg dst[i] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 1343848b8605Smrg break; 1344848b8605Smrg case GL_LUMINANCE: 1345848b8605Smrg for (i=0;i<n;i++) 1346848b8605Smrg dst[i] = FLOAT_TO_UBYTE(luminance[i]); 1347848b8605Smrg break; 1348848b8605Smrg case GL_LUMINANCE_ALPHA: 1349848b8605Smrg for (i=0;i<n;i++) { 1350848b8605Smrg dst[i*2+0] = FLOAT_TO_UBYTE(luminance[i]); 1351848b8605Smrg dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 1352848b8605Smrg } 1353848b8605Smrg break; 1354848b8605Smrg case GL_RG: 1355848b8605Smrg for (i=0;i<n;i++) { 1356848b8605Smrg dst[i*2+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1357848b8605Smrg dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1358848b8605Smrg } 1359848b8605Smrg break; 1360848b8605Smrg case GL_RGB: 1361848b8605Smrg for (i=0;i<n;i++) { 1362848b8605Smrg dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1363848b8605Smrg dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1364848b8605Smrg dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 1365848b8605Smrg } 1366848b8605Smrg break; 1367848b8605Smrg case GL_RGBA: 1368848b8605Smrg for (i=0;i<n;i++) { 1369848b8605Smrg dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1370848b8605Smrg dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1371848b8605Smrg dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 1372848b8605Smrg dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 1373848b8605Smrg } 1374848b8605Smrg break; 1375848b8605Smrg case GL_BGR: 1376848b8605Smrg for (i=0;i<n;i++) { 1377848b8605Smrg dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 1378848b8605Smrg dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1379848b8605Smrg dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1380848b8605Smrg } 1381848b8605Smrg break; 1382848b8605Smrg case GL_BGRA: 1383848b8605Smrg for (i=0;i<n;i++) { 1384848b8605Smrg dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 1385848b8605Smrg dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1386848b8605Smrg dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1387848b8605Smrg dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 1388848b8605Smrg } 1389848b8605Smrg break; 1390848b8605Smrg case GL_ABGR_EXT: 1391848b8605Smrg for (i=0;i<n;i++) { 1392848b8605Smrg dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 1393848b8605Smrg dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 1394848b8605Smrg dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1395848b8605Smrg dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1396848b8605Smrg } 1397848b8605Smrg break; 1398848b8605Smrg case GL_RED_INTEGER_EXT: 1399848b8605Smrg for (i=0;i<n;i++) { 1400848b8605Smrg dst[i] = (GLubyte) rgba[i][RCOMP]; 1401848b8605Smrg } 1402848b8605Smrg break; 1403848b8605Smrg case GL_GREEN_INTEGER_EXT: 1404848b8605Smrg for (i=0;i<n;i++) { 1405848b8605Smrg dst[i] = (GLubyte) rgba[i][GCOMP]; 1406848b8605Smrg } 1407848b8605Smrg break; 1408848b8605Smrg case GL_BLUE_INTEGER_EXT: 1409848b8605Smrg for (i=0;i<n;i++) { 1410848b8605Smrg dst[i] = (GLubyte) rgba[i][BCOMP]; 1411848b8605Smrg } 1412848b8605Smrg break; 1413848b8605Smrg case GL_ALPHA_INTEGER_EXT: 1414848b8605Smrg for (i=0;i<n;i++) { 1415848b8605Smrg dst[i] = (GLubyte) rgba[i][ACOMP]; 1416848b8605Smrg } 1417848b8605Smrg break; 1418848b8605Smrg case GL_RG_INTEGER: 1419848b8605Smrg for (i=0;i<n;i++) { 1420848b8605Smrg dst[i*2+0] = (GLubyte) rgba[i][RCOMP]; 1421848b8605Smrg dst[i*2+1] = (GLubyte) rgba[i][GCOMP]; 1422848b8605Smrg } 1423848b8605Smrg break; 1424848b8605Smrg case GL_RGB_INTEGER_EXT: 1425848b8605Smrg for (i=0;i<n;i++) { 1426848b8605Smrg dst[i*3+0] = (GLubyte) rgba[i][RCOMP]; 1427848b8605Smrg dst[i*3+1] = (GLubyte) rgba[i][GCOMP]; 1428848b8605Smrg dst[i*3+2] = (GLubyte) rgba[i][BCOMP]; 1429848b8605Smrg } 1430848b8605Smrg break; 1431848b8605Smrg case GL_RGBA_INTEGER_EXT: 1432848b8605Smrg for (i=0;i<n;i++) { 1433848b8605Smrg dst[i*4+0] = (GLubyte) rgba[i][RCOMP]; 1434848b8605Smrg dst[i*4+1] = (GLubyte) rgba[i][GCOMP]; 1435848b8605Smrg dst[i*4+2] = (GLubyte) rgba[i][BCOMP]; 1436848b8605Smrg dst[i*4+3] = (GLubyte) rgba[i][ACOMP]; 1437848b8605Smrg } 1438848b8605Smrg break; 1439848b8605Smrg case GL_BGR_INTEGER_EXT: 1440848b8605Smrg for (i=0;i<n;i++) { 1441848b8605Smrg dst[i*3+0] = (GLubyte) rgba[i][BCOMP]; 1442848b8605Smrg dst[i*3+1] = (GLubyte) rgba[i][GCOMP]; 1443848b8605Smrg dst[i*3+2] = (GLubyte) rgba[i][RCOMP]; 1444848b8605Smrg } 1445848b8605Smrg break; 1446848b8605Smrg case GL_BGRA_INTEGER_EXT: 1447848b8605Smrg for (i=0;i<n;i++) { 1448848b8605Smrg dst[i*4+0] = (GLubyte) rgba[i][BCOMP]; 1449848b8605Smrg dst[i*4+1] = (GLubyte) rgba[i][GCOMP]; 1450848b8605Smrg dst[i*4+2] = (GLubyte) rgba[i][RCOMP]; 1451848b8605Smrg dst[i*4+3] = (GLubyte) rgba[i][ACOMP]; 1452848b8605Smrg } 1453848b8605Smrg break; 1454848b8605Smrg case GL_LUMINANCE_INTEGER_EXT: 1455848b8605Smrg for (i=0;i<n;i++) { 1456848b8605Smrg dst[i*2+0] = (GLubyte) (rgba[i][RCOMP] + 1457848b8605Smrg rgba[i][GCOMP] + 1458848b8605Smrg rgba[i][BCOMP]); 1459848b8605Smrg dst[i*2+1] = (GLubyte) rgba[i][ACOMP]; 1460848b8605Smrg } 1461848b8605Smrg break; 1462848b8605Smrg case GL_LUMINANCE_ALPHA_INTEGER_EXT: 1463848b8605Smrg for (i=0;i<n;i++) { 1464848b8605Smrg dst[i] = (GLubyte) (rgba[i][RCOMP] + 1465848b8605Smrg rgba[i][GCOMP] + 1466848b8605Smrg rgba[i][BCOMP]); 1467848b8605Smrg } 1468848b8605Smrg break; 1469848b8605Smrg default: 1470848b8605Smrg _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1471848b8605Smrg } 1472848b8605Smrg } 1473848b8605Smrg break; 1474848b8605Smrg case GL_BYTE: 1475848b8605Smrg { 1476848b8605Smrg GLbyte *dst = (GLbyte *) dstAddr; 1477848b8605Smrg switch (dstFormat) { 1478848b8605Smrg case GL_RED: 1479848b8605Smrg for (i=0;i<n;i++) 1480848b8605Smrg dst[i] = FLOAT_TO_BYTE_TEX(rgba[i][RCOMP]); 1481848b8605Smrg break; 1482848b8605Smrg case GL_GREEN: 1483848b8605Smrg for (i=0;i<n;i++) 1484848b8605Smrg dst[i] = FLOAT_TO_BYTE_TEX(rgba[i][GCOMP]); 1485848b8605Smrg break; 1486848b8605Smrg case GL_BLUE: 1487848b8605Smrg for (i=0;i<n;i++) 1488848b8605Smrg dst[i] = FLOAT_TO_BYTE_TEX(rgba[i][BCOMP]); 1489848b8605Smrg break; 1490848b8605Smrg case GL_ALPHA: 1491848b8605Smrg for (i=0;i<n;i++) 1492848b8605Smrg dst[i] = FLOAT_TO_BYTE_TEX(rgba[i][ACOMP]); 1493848b8605Smrg break; 1494848b8605Smrg case GL_LUMINANCE: 1495848b8605Smrg for (i=0;i<n;i++) 1496848b8605Smrg dst[i] = FLOAT_TO_BYTE_TEX(luminance[i]); 1497848b8605Smrg break; 1498848b8605Smrg case GL_LUMINANCE_ALPHA: 1499848b8605Smrg for (i=0;i<n;i++) { 1500848b8605Smrg dst[i*2+0] = FLOAT_TO_BYTE_TEX(luminance[i]); 1501848b8605Smrg dst[i*2+1] = FLOAT_TO_BYTE_TEX(rgba[i][ACOMP]); 1502848b8605Smrg } 1503848b8605Smrg break; 1504848b8605Smrg case GL_RG: 1505848b8605Smrg for (i=0;i<n;i++) { 1506848b8605Smrg dst[i*2+0] = FLOAT_TO_BYTE_TEX(rgba[i][RCOMP]); 1507848b8605Smrg dst[i*2+1] = FLOAT_TO_BYTE_TEX(rgba[i][GCOMP]); 1508848b8605Smrg } 1509848b8605Smrg break; 1510848b8605Smrg case GL_RGB: 1511848b8605Smrg for (i=0;i<n;i++) { 1512848b8605Smrg dst[i*3+0] = FLOAT_TO_BYTE_TEX(rgba[i][RCOMP]); 1513848b8605Smrg dst[i*3+1] = FLOAT_TO_BYTE_TEX(rgba[i][GCOMP]); 1514848b8605Smrg dst[i*3+2] = FLOAT_TO_BYTE_TEX(rgba[i][BCOMP]); 1515848b8605Smrg } 1516848b8605Smrg break; 1517848b8605Smrg case GL_RGBA: 1518848b8605Smrg for (i=0;i<n;i++) { 1519848b8605Smrg dst[i*4+0] = FLOAT_TO_BYTE_TEX(rgba[i][RCOMP]); 1520848b8605Smrg dst[i*4+1] = FLOAT_TO_BYTE_TEX(rgba[i][GCOMP]); 1521848b8605Smrg dst[i*4+2] = FLOAT_TO_BYTE_TEX(rgba[i][BCOMP]); 1522848b8605Smrg dst[i*4+3] = FLOAT_TO_BYTE_TEX(rgba[i][ACOMP]); 1523848b8605Smrg } 1524848b8605Smrg break; 1525848b8605Smrg case GL_BGR: 1526848b8605Smrg for (i=0;i<n;i++) { 1527848b8605Smrg dst[i*3+0] = FLOAT_TO_BYTE_TEX(rgba[i][BCOMP]); 1528848b8605Smrg dst[i*3+1] = FLOAT_TO_BYTE_TEX(rgba[i][GCOMP]); 1529848b8605Smrg dst[i*3+2] = FLOAT_TO_BYTE_TEX(rgba[i][RCOMP]); 1530848b8605Smrg } 1531848b8605Smrg break; 1532848b8605Smrg case GL_BGRA: 1533848b8605Smrg for (i=0;i<n;i++) { 1534848b8605Smrg dst[i*4+0] = FLOAT_TO_BYTE_TEX(rgba[i][BCOMP]); 1535848b8605Smrg dst[i*4+1] = FLOAT_TO_BYTE_TEX(rgba[i][GCOMP]); 1536848b8605Smrg dst[i*4+2] = FLOAT_TO_BYTE_TEX(rgba[i][RCOMP]); 1537848b8605Smrg dst[i*4+3] = FLOAT_TO_BYTE_TEX(rgba[i][ACOMP]); 1538848b8605Smrg } 1539848b8605Smrg break; 1540848b8605Smrg case GL_ABGR_EXT: 1541848b8605Smrg for (i=0;i<n;i++) { 1542848b8605Smrg dst[i*4+0] = FLOAT_TO_BYTE_TEX(rgba[i][ACOMP]); 1543848b8605Smrg dst[i*4+1] = FLOAT_TO_BYTE_TEX(rgba[i][BCOMP]); 1544848b8605Smrg dst[i*4+2] = FLOAT_TO_BYTE_TEX(rgba[i][GCOMP]); 1545848b8605Smrg dst[i*4+3] = FLOAT_TO_BYTE_TEX(rgba[i][RCOMP]); 1546848b8605Smrg } 1547848b8605Smrg break; 1548848b8605Smrg case GL_RED_INTEGER_EXT: 1549848b8605Smrg for (i=0;i<n;i++) { 1550848b8605Smrg dst[i] = (GLbyte) rgba[i][RCOMP]; 1551848b8605Smrg } 1552848b8605Smrg break; 1553848b8605Smrg case GL_GREEN_INTEGER_EXT: 1554848b8605Smrg for (i=0;i<n;i++) { 1555848b8605Smrg dst[i] = (GLbyte) rgba[i][GCOMP]; 1556848b8605Smrg } 1557848b8605Smrg break; 1558848b8605Smrg case GL_BLUE_INTEGER_EXT: 1559848b8605Smrg for (i=0;i<n;i++) { 1560848b8605Smrg dst[i] = (GLbyte) rgba[i][BCOMP]; 1561848b8605Smrg } 1562848b8605Smrg break; 1563848b8605Smrg case GL_ALPHA_INTEGER_EXT: 1564848b8605Smrg for (i=0;i<n;i++) { 1565848b8605Smrg dst[i] = (GLbyte) rgba[i][ACOMP]; 1566848b8605Smrg } 1567848b8605Smrg break; 1568848b8605Smrg case GL_RG_INTEGER: 1569848b8605Smrg for (i=0;i<n;i++) { 1570848b8605Smrg dst[i*2+0] = (GLbyte) rgba[i][RCOMP]; 1571848b8605Smrg dst[i*2+1] = (GLbyte) rgba[i][GCOMP]; 1572848b8605Smrg } 1573848b8605Smrg break; 1574848b8605Smrg case GL_RGB_INTEGER_EXT: 1575848b8605Smrg for (i=0;i<n;i++) { 1576848b8605Smrg dst[i*3+0] = (GLbyte) rgba[i][RCOMP]; 1577848b8605Smrg dst[i*3+1] = (GLbyte) rgba[i][GCOMP]; 1578848b8605Smrg dst[i*3+2] = (GLbyte) rgba[i][BCOMP]; 1579848b8605Smrg } 1580848b8605Smrg break; 1581848b8605Smrg case GL_RGBA_INTEGER_EXT: 1582848b8605Smrg for (i=0;i<n;i++) { 1583848b8605Smrg dst[i*4+0] = (GLbyte) rgba[i][RCOMP]; 1584848b8605Smrg dst[i*4+1] = (GLbyte) rgba[i][GCOMP]; 1585848b8605Smrg dst[i*4+2] = (GLbyte) rgba[i][BCOMP]; 1586848b8605Smrg dst[i*4+3] = (GLbyte) rgba[i][ACOMP]; 1587848b8605Smrg } 1588848b8605Smrg break; 1589848b8605Smrg case GL_BGR_INTEGER_EXT: 1590848b8605Smrg for (i=0;i<n;i++) { 1591848b8605Smrg dst[i*3+0] = (GLbyte) rgba[i][BCOMP]; 1592848b8605Smrg dst[i*3+1] = (GLbyte) rgba[i][GCOMP]; 1593848b8605Smrg dst[i*3+2] = (GLbyte) rgba[i][RCOMP]; 1594848b8605Smrg } 1595848b8605Smrg break; 1596848b8605Smrg case GL_BGRA_INTEGER_EXT: 1597848b8605Smrg for (i=0;i<n;i++) { 1598848b8605Smrg dst[i*4+0] = (GLbyte) rgba[i][BCOMP]; 1599848b8605Smrg dst[i*4+1] = (GLbyte) rgba[i][GCOMP]; 1600848b8605Smrg dst[i*4+2] = (GLbyte) rgba[i][RCOMP]; 1601848b8605Smrg dst[i*4+3] = (GLbyte) rgba[i][ACOMP]; 1602848b8605Smrg } 1603848b8605Smrg break; 1604848b8605Smrg case GL_LUMINANCE_INTEGER_EXT: 1605848b8605Smrg for (i=0;i<n;i++) { 1606848b8605Smrg dst[i*2+0] = (GLbyte) (rgba[i][RCOMP] + 1607848b8605Smrg rgba[i][GCOMP] + 1608848b8605Smrg rgba[i][BCOMP]); 1609848b8605Smrg dst[i*2+1] = (GLbyte) rgba[i][ACOMP]; 1610848b8605Smrg } 1611848b8605Smrg break; 1612848b8605Smrg case GL_LUMINANCE_ALPHA_INTEGER_EXT: 1613848b8605Smrg for (i=0;i<n;i++) { 1614848b8605Smrg dst[i] = (GLbyte) (rgba[i][RCOMP] + 1615848b8605Smrg rgba[i][GCOMP] + 1616848b8605Smrg rgba[i][BCOMP]); 1617848b8605Smrg } 1618848b8605Smrg break; 1619848b8605Smrg default: 1620848b8605Smrg _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1621848b8605Smrg } 1622848b8605Smrg } 1623848b8605Smrg break; 1624848b8605Smrg case GL_UNSIGNED_SHORT: 1625848b8605Smrg { 1626848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 1627848b8605Smrg switch (dstFormat) { 1628848b8605Smrg case GL_RED: 1629848b8605Smrg for (i=0;i<n;i++) 1630848b8605Smrg CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][RCOMP]); 1631848b8605Smrg break; 1632848b8605Smrg case GL_GREEN: 1633848b8605Smrg for (i=0;i<n;i++) 1634848b8605Smrg CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][GCOMP]); 1635848b8605Smrg break; 1636848b8605Smrg case GL_BLUE: 1637848b8605Smrg for (i=0;i<n;i++) 1638848b8605Smrg CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][BCOMP]); 1639848b8605Smrg break; 1640848b8605Smrg case GL_ALPHA: 1641848b8605Smrg for (i=0;i<n;i++) 1642848b8605Smrg CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][ACOMP]); 1643848b8605Smrg break; 1644848b8605Smrg case GL_LUMINANCE: 1645848b8605Smrg for (i=0;i<n;i++) 1646848b8605Smrg UNCLAMPED_FLOAT_TO_USHORT(dst[i], luminance[i]); 1647848b8605Smrg break; 1648848b8605Smrg case GL_LUMINANCE_ALPHA: 1649848b8605Smrg for (i=0;i<n;i++) { 1650848b8605Smrg UNCLAMPED_FLOAT_TO_USHORT(dst[i*2+0], luminance[i]); 1651848b8605Smrg CLAMPED_FLOAT_TO_USHORT(dst[i*2+1], rgba[i][ACOMP]); 1652848b8605Smrg } 1653848b8605Smrg break; 1654848b8605Smrg case GL_RG: 1655848b8605Smrg for (i=0;i<n;i++) { 1656848b8605Smrg CLAMPED_FLOAT_TO_USHORT(dst[i*2+0], rgba[i][RCOMP]); 1657848b8605Smrg CLAMPED_FLOAT_TO_USHORT(dst[i*2+1], rgba[i][GCOMP]); 1658848b8605Smrg } 1659848b8605Smrg break; 1660848b8605Smrg case GL_RGB: 1661848b8605Smrg for (i=0;i<n;i++) { 1662848b8605Smrg CLAMPED_FLOAT_TO_USHORT(dst[i*3+0], rgba[i][RCOMP]); 1663848b8605Smrg CLAMPED_FLOAT_TO_USHORT(dst[i*3+1], rgba[i][GCOMP]); 1664848b8605Smrg CLAMPED_FLOAT_TO_USHORT(dst[i*3+2], rgba[i][BCOMP]); 1665848b8605Smrg } 1666848b8605Smrg break; 1667848b8605Smrg case GL_RGBA: 1668848b8605Smrg for (i=0;i<n;i++) { 1669848b8605Smrg CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][RCOMP]); 1670848b8605Smrg CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][GCOMP]); 1671848b8605Smrg CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][BCOMP]); 1672848b8605Smrg CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][ACOMP]); 1673848b8605Smrg } 1674848b8605Smrg break; 1675848b8605Smrg case GL_BGR: 1676848b8605Smrg for (i=0;i<n;i++) { 1677848b8605Smrg CLAMPED_FLOAT_TO_USHORT(dst[i*3+0], rgba[i][BCOMP]); 1678848b8605Smrg CLAMPED_FLOAT_TO_USHORT(dst[i*3+1], rgba[i][GCOMP]); 1679848b8605Smrg CLAMPED_FLOAT_TO_USHORT(dst[i*3+2], rgba[i][RCOMP]); 1680848b8605Smrg } 1681848b8605Smrg break; 1682848b8605Smrg case GL_BGRA: 1683848b8605Smrg for (i=0;i<n;i++) { 1684848b8605Smrg CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][BCOMP]); 1685848b8605Smrg CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][GCOMP]); 1686848b8605Smrg CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][RCOMP]); 1687848b8605Smrg CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][ACOMP]); 1688848b8605Smrg } 1689848b8605Smrg break; 1690848b8605Smrg case GL_ABGR_EXT: 1691848b8605Smrg for (i=0;i<n;i++) { 1692848b8605Smrg CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][ACOMP]); 1693848b8605Smrg CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][BCOMP]); 1694848b8605Smrg CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][GCOMP]); 1695848b8605Smrg CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][RCOMP]); 1696848b8605Smrg } 1697848b8605Smrg break; 1698848b8605Smrg case GL_RED_INTEGER_EXT: 1699848b8605Smrg for (i=0;i<n;i++) { 1700848b8605Smrg dst[i] = (GLushort) rgba[i][RCOMP]; 1701848b8605Smrg } 1702848b8605Smrg break; 1703848b8605Smrg case GL_GREEN_INTEGER_EXT: 1704848b8605Smrg for (i=0;i<n;i++) { 1705848b8605Smrg dst[i] = (GLushort) rgba[i][GCOMP]; 1706848b8605Smrg } 1707848b8605Smrg break; 1708848b8605Smrg case GL_BLUE_INTEGER_EXT: 1709848b8605Smrg for (i=0;i<n;i++) { 1710848b8605Smrg dst[i] = (GLushort) rgba[i][BCOMP]; 1711848b8605Smrg } 1712848b8605Smrg break; 1713848b8605Smrg case GL_ALPHA_INTEGER_EXT: 1714848b8605Smrg for (i=0;i<n;i++) { 1715848b8605Smrg dst[i] = (GLushort) rgba[i][ACOMP]; 1716848b8605Smrg } 1717848b8605Smrg break; 1718848b8605Smrg case GL_RG_INTEGER: 1719848b8605Smrg for (i=0;i<n;i++) { 1720848b8605Smrg dst[i*2+0] = (GLushort) rgba[i][RCOMP]; 1721848b8605Smrg dst[i*2+1] = (GLushort) rgba[i][GCOMP]; 1722848b8605Smrg } 1723848b8605Smrg break; 1724848b8605Smrg case GL_RGB_INTEGER_EXT: 1725848b8605Smrg for (i=0;i<n;i++) { 1726848b8605Smrg dst[i*3+0] = (GLushort) rgba[i][RCOMP]; 1727848b8605Smrg dst[i*3+1] = (GLushort) rgba[i][GCOMP]; 1728848b8605Smrg dst[i*3+2] = (GLushort) rgba[i][BCOMP]; 1729848b8605Smrg } 1730848b8605Smrg break; 1731848b8605Smrg case GL_RGBA_INTEGER_EXT: 1732848b8605Smrg for (i=0;i<n;i++) { 1733848b8605Smrg dst[i*4+0] = (GLushort) rgba[i][RCOMP]; 1734848b8605Smrg dst[i*4+1] = (GLushort) rgba[i][GCOMP]; 1735848b8605Smrg dst[i*4+2] = (GLushort) rgba[i][BCOMP]; 1736848b8605Smrg dst[i*4+3] = (GLushort) rgba[i][ACOMP]; 1737848b8605Smrg } 1738848b8605Smrg break; 1739848b8605Smrg case GL_BGR_INTEGER_EXT: 1740848b8605Smrg for (i=0;i<n;i++) { 1741848b8605Smrg dst[i*3+0] = (GLushort) rgba[i][BCOMP]; 1742848b8605Smrg dst[i*3+1] = (GLushort) rgba[i][GCOMP]; 1743848b8605Smrg dst[i*3+2] = (GLushort) rgba[i][RCOMP]; 1744848b8605Smrg } 1745848b8605Smrg break; 1746848b8605Smrg case GL_BGRA_INTEGER_EXT: 1747848b8605Smrg for (i=0;i<n;i++) { 1748848b8605Smrg dst[i*4+0] = (GLushort) rgba[i][BCOMP]; 1749848b8605Smrg dst[i*4+1] = (GLushort) rgba[i][GCOMP]; 1750848b8605Smrg dst[i*4+2] = (GLushort) rgba[i][RCOMP]; 1751848b8605Smrg dst[i*4+3] = (GLushort) rgba[i][ACOMP]; 1752848b8605Smrg } 1753848b8605Smrg break; 1754848b8605Smrg case GL_LUMINANCE_INTEGER_EXT: 1755848b8605Smrg for (i=0;i<n;i++) { 1756848b8605Smrg dst[i*2+0] = (GLushort) (rgba[i][RCOMP] + 1757848b8605Smrg rgba[i][GCOMP] + 1758848b8605Smrg rgba[i][BCOMP]); 1759848b8605Smrg dst[i*2+1] = (GLushort) rgba[i][ACOMP]; 1760848b8605Smrg } 1761848b8605Smrg break; 1762848b8605Smrg case GL_LUMINANCE_ALPHA_INTEGER_EXT: 1763848b8605Smrg for (i=0;i<n;i++) { 1764848b8605Smrg dst[i] = (GLushort) (rgba[i][RCOMP] + 1765848b8605Smrg rgba[i][GCOMP] + 1766848b8605Smrg rgba[i][BCOMP]); 1767848b8605Smrg } 1768848b8605Smrg break; 1769848b8605Smrg default: 1770848b8605Smrg _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1771848b8605Smrg } 1772848b8605Smrg } 1773848b8605Smrg break; 1774848b8605Smrg case GL_SHORT: 1775848b8605Smrg { 1776848b8605Smrg GLshort *dst = (GLshort *) dstAddr; 1777848b8605Smrg switch (dstFormat) { 1778848b8605Smrg case GL_RED: 1779848b8605Smrg for (i=0;i<n;i++) 1780848b8605Smrg dst[i] = FLOAT_TO_SHORT_TEX(rgba[i][RCOMP]); 1781848b8605Smrg break; 1782848b8605Smrg case GL_GREEN: 1783848b8605Smrg for (i=0;i<n;i++) 1784848b8605Smrg dst[i] = FLOAT_TO_SHORT_TEX(rgba[i][GCOMP]); 1785848b8605Smrg break; 1786848b8605Smrg case GL_BLUE: 1787848b8605Smrg for (i=0;i<n;i++) 1788848b8605Smrg dst[i] = FLOAT_TO_SHORT_TEX(rgba[i][BCOMP]); 1789848b8605Smrg break; 1790848b8605Smrg case GL_ALPHA: 1791848b8605Smrg for (i=0;i<n;i++) 1792848b8605Smrg dst[i] = FLOAT_TO_SHORT_TEX(rgba[i][ACOMP]); 1793848b8605Smrg break; 1794848b8605Smrg case GL_LUMINANCE: 1795848b8605Smrg for (i=0;i<n;i++) 1796848b8605Smrg dst[i] = FLOAT_TO_SHORT_TEX(luminance[i]); 1797848b8605Smrg break; 1798848b8605Smrg case GL_LUMINANCE_ALPHA: 1799848b8605Smrg for (i=0;i<n;i++) { 1800848b8605Smrg dst[i*2+0] = FLOAT_TO_SHORT_TEX(luminance[i]); 1801848b8605Smrg dst[i*2+1] = FLOAT_TO_SHORT_TEX(rgba[i][ACOMP]); 1802848b8605Smrg } 1803848b8605Smrg break; 1804848b8605Smrg case GL_RG: 1805848b8605Smrg for (i=0;i<n;i++) { 1806848b8605Smrg dst[i*2+0] = FLOAT_TO_SHORT_TEX(rgba[i][RCOMP]); 1807848b8605Smrg dst[i*2+1] = FLOAT_TO_SHORT_TEX(rgba[i][GCOMP]); 1808848b8605Smrg } 1809848b8605Smrg break; 1810848b8605Smrg case GL_RGB: 1811848b8605Smrg for (i=0;i<n;i++) { 1812848b8605Smrg dst[i*3+0] = FLOAT_TO_SHORT_TEX(rgba[i][RCOMP]); 1813848b8605Smrg dst[i*3+1] = FLOAT_TO_SHORT_TEX(rgba[i][GCOMP]); 1814848b8605Smrg dst[i*3+2] = FLOAT_TO_SHORT_TEX(rgba[i][BCOMP]); 1815848b8605Smrg } 1816848b8605Smrg break; 1817848b8605Smrg case GL_RGBA: 1818848b8605Smrg for (i=0;i<n;i++) { 1819848b8605Smrg dst[i*4+0] = FLOAT_TO_SHORT_TEX(rgba[i][RCOMP]); 1820848b8605Smrg dst[i*4+1] = FLOAT_TO_SHORT_TEX(rgba[i][GCOMP]); 1821848b8605Smrg dst[i*4+2] = FLOAT_TO_SHORT_TEX(rgba[i][BCOMP]); 1822848b8605Smrg dst[i*4+3] = FLOAT_TO_SHORT_TEX(rgba[i][ACOMP]); 1823848b8605Smrg } 1824848b8605Smrg break; 1825848b8605Smrg case GL_BGR: 1826848b8605Smrg for (i=0;i<n;i++) { 1827848b8605Smrg dst[i*3+0] = FLOAT_TO_SHORT_TEX(rgba[i][BCOMP]); 1828848b8605Smrg dst[i*3+1] = FLOAT_TO_SHORT_TEX(rgba[i][GCOMP]); 1829848b8605Smrg dst[i*3+2] = FLOAT_TO_SHORT_TEX(rgba[i][RCOMP]); 1830848b8605Smrg } 1831848b8605Smrg break; 1832848b8605Smrg case GL_BGRA: 1833848b8605Smrg for (i=0;i<n;i++) { 1834848b8605Smrg dst[i*4+0] = FLOAT_TO_SHORT_TEX(rgba[i][BCOMP]); 1835848b8605Smrg dst[i*4+1] = FLOAT_TO_SHORT_TEX(rgba[i][GCOMP]); 1836848b8605Smrg dst[i*4+2] = FLOAT_TO_SHORT_TEX(rgba[i][RCOMP]); 1837848b8605Smrg dst[i*4+3] = FLOAT_TO_SHORT_TEX(rgba[i][ACOMP]); 1838848b8605Smrg } 1839848b8605Smrg break; 1840848b8605Smrg case GL_ABGR_EXT: 1841848b8605Smrg for (i=0;i<n;i++) { 1842848b8605Smrg dst[i*4+0] = FLOAT_TO_SHORT_TEX(rgba[i][ACOMP]); 1843848b8605Smrg dst[i*4+1] = FLOAT_TO_SHORT_TEX(rgba[i][BCOMP]); 1844848b8605Smrg dst[i*4+2] = FLOAT_TO_SHORT_TEX(rgba[i][GCOMP]); 1845848b8605Smrg dst[i*4+3] = FLOAT_TO_SHORT_TEX(rgba[i][RCOMP]); 1846848b8605Smrg } 1847848b8605Smrg break; 1848848b8605Smrg case GL_RED_INTEGER_EXT: 1849848b8605Smrg for (i=0;i<n;i++) { 1850848b8605Smrg dst[i] = (GLshort) rgba[i][RCOMP]; 1851848b8605Smrg } 1852848b8605Smrg break; 1853848b8605Smrg case GL_GREEN_INTEGER_EXT: 1854848b8605Smrg for (i=0;i<n;i++) { 1855848b8605Smrg dst[i] = (GLshort) rgba[i][GCOMP]; 1856848b8605Smrg } 1857848b8605Smrg break; 1858848b8605Smrg case GL_BLUE_INTEGER_EXT: 1859848b8605Smrg for (i=0;i<n;i++) { 1860848b8605Smrg dst[i] = (GLshort) rgba[i][BCOMP]; 1861848b8605Smrg } 1862848b8605Smrg break; 1863848b8605Smrg case GL_ALPHA_INTEGER_EXT: 1864848b8605Smrg for (i=0;i<n;i++) { 1865848b8605Smrg dst[i] = (GLshort) rgba[i][ACOMP]; 1866848b8605Smrg } 1867848b8605Smrg break; 1868848b8605Smrg case GL_RG_INTEGER: 1869848b8605Smrg for (i=0;i<n;i++) { 1870848b8605Smrg dst[i*2+0] = (GLshort) rgba[i][RCOMP]; 1871848b8605Smrg dst[i*2+1] = (GLshort) rgba[i][GCOMP]; 1872848b8605Smrg } 1873848b8605Smrg break; 1874848b8605Smrg case GL_RGB_INTEGER_EXT: 1875848b8605Smrg for (i=0;i<n;i++) { 1876848b8605Smrg dst[i*3+0] = (GLshort) rgba[i][RCOMP]; 1877848b8605Smrg dst[i*3+1] = (GLshort) rgba[i][GCOMP]; 1878848b8605Smrg dst[i*3+2] = (GLshort) rgba[i][BCOMP]; 1879848b8605Smrg } 1880848b8605Smrg break; 1881848b8605Smrg case GL_RGBA_INTEGER_EXT: 1882848b8605Smrg for (i=0;i<n;i++) { 1883848b8605Smrg dst[i*4+0] = (GLshort) rgba[i][RCOMP]; 1884848b8605Smrg dst[i*4+1] = (GLshort) rgba[i][GCOMP]; 1885848b8605Smrg dst[i*4+2] = (GLshort) rgba[i][BCOMP]; 1886848b8605Smrg dst[i*4+3] = (GLshort) rgba[i][ACOMP]; 1887848b8605Smrg } 1888848b8605Smrg break; 1889848b8605Smrg case GL_BGR_INTEGER_EXT: 1890848b8605Smrg for (i=0;i<n;i++) { 1891848b8605Smrg dst[i*3+0] = (GLshort) rgba[i][BCOMP]; 1892848b8605Smrg dst[i*3+1] = (GLshort) rgba[i][GCOMP]; 1893848b8605Smrg dst[i*3+2] = (GLshort) rgba[i][RCOMP]; 1894848b8605Smrg } 1895848b8605Smrg break; 1896848b8605Smrg case GL_BGRA_INTEGER_EXT: 1897848b8605Smrg for (i=0;i<n;i++) { 1898848b8605Smrg dst[i*4+0] = (GLshort) rgba[i][BCOMP]; 1899848b8605Smrg dst[i*4+1] = (GLshort) rgba[i][GCOMP]; 1900848b8605Smrg dst[i*4+2] = (GLshort) rgba[i][RCOMP]; 1901848b8605Smrg dst[i*4+3] = (GLshort) rgba[i][ACOMP]; 1902848b8605Smrg } 1903848b8605Smrg break; 1904848b8605Smrg case GL_LUMINANCE_INTEGER_EXT: 1905848b8605Smrg for (i=0;i<n;i++) { 1906848b8605Smrg dst[i*2+0] = (GLshort) (rgba[i][RCOMP] + 1907848b8605Smrg rgba[i][GCOMP] + 1908848b8605Smrg rgba[i][BCOMP]); 1909848b8605Smrg dst[i*2+1] = (GLshort) rgba[i][ACOMP]; 1910848b8605Smrg } 1911848b8605Smrg break; 1912848b8605Smrg case GL_LUMINANCE_ALPHA_INTEGER_EXT: 1913848b8605Smrg for (i=0;i<n;i++) { 1914848b8605Smrg dst[i] = (GLshort) (rgba[i][RCOMP] + 1915848b8605Smrg rgba[i][GCOMP] + 1916848b8605Smrg rgba[i][BCOMP]); 1917848b8605Smrg } 1918848b8605Smrg break; 1919848b8605Smrg default: 1920848b8605Smrg _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1921848b8605Smrg } 1922848b8605Smrg } 1923848b8605Smrg break; 1924848b8605Smrg case GL_UNSIGNED_INT: 1925848b8605Smrg { 1926848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 1927848b8605Smrg switch (dstFormat) { 1928848b8605Smrg case GL_RED: 1929848b8605Smrg for (i=0;i<n;i++) 1930848b8605Smrg dst[i] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1931848b8605Smrg break; 1932848b8605Smrg case GL_GREEN: 1933848b8605Smrg for (i=0;i<n;i++) 1934848b8605Smrg dst[i] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1935848b8605Smrg break; 1936848b8605Smrg case GL_BLUE: 1937848b8605Smrg for (i=0;i<n;i++) 1938848b8605Smrg dst[i] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1939848b8605Smrg break; 1940848b8605Smrg case GL_ALPHA: 1941848b8605Smrg for (i=0;i<n;i++) 1942848b8605Smrg dst[i] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1943848b8605Smrg break; 1944848b8605Smrg case GL_LUMINANCE: 1945848b8605Smrg for (i=0;i<n;i++) 1946848b8605Smrg dst[i] = FLOAT_TO_UINT(luminance[i]); 1947848b8605Smrg break; 1948848b8605Smrg case GL_LUMINANCE_ALPHA: 1949848b8605Smrg for (i=0;i<n;i++) { 1950848b8605Smrg dst[i*2+0] = FLOAT_TO_UINT(luminance[i]); 1951848b8605Smrg dst[i*2+1] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1952848b8605Smrg } 1953848b8605Smrg break; 1954848b8605Smrg case GL_RG: 1955848b8605Smrg for (i=0;i<n;i++) { 1956848b8605Smrg dst[i*2+0] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1957848b8605Smrg dst[i*2+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1958848b8605Smrg } 1959848b8605Smrg break; 1960848b8605Smrg case GL_RGB: 1961848b8605Smrg for (i=0;i<n;i++) { 1962848b8605Smrg dst[i*3+0] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1963848b8605Smrg dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1964848b8605Smrg dst[i*3+2] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1965848b8605Smrg } 1966848b8605Smrg break; 1967848b8605Smrg case GL_RGBA: 1968848b8605Smrg for (i=0;i<n;i++) { 1969848b8605Smrg dst[i*4+0] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1970848b8605Smrg dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1971848b8605Smrg dst[i*4+2] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1972848b8605Smrg dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1973848b8605Smrg } 1974848b8605Smrg break; 1975848b8605Smrg case GL_BGR: 1976848b8605Smrg for (i=0;i<n;i++) { 1977848b8605Smrg dst[i*3+0] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1978848b8605Smrg dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1979848b8605Smrg dst[i*3+2] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1980848b8605Smrg } 1981848b8605Smrg break; 1982848b8605Smrg case GL_BGRA: 1983848b8605Smrg for (i=0;i<n;i++) { 1984848b8605Smrg dst[i*4+0] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1985848b8605Smrg dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1986848b8605Smrg dst[i*4+2] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1987848b8605Smrg dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1988848b8605Smrg } 1989848b8605Smrg break; 1990848b8605Smrg case GL_ABGR_EXT: 1991848b8605Smrg for (i=0;i<n;i++) { 1992848b8605Smrg dst[i*4+0] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1993848b8605Smrg dst[i*4+1] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1994848b8605Smrg dst[i*4+2] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1995848b8605Smrg dst[i*4+3] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1996848b8605Smrg } 1997848b8605Smrg break; 1998848b8605Smrg case GL_RED_INTEGER_EXT: 1999848b8605Smrg for (i=0;i<n;i++) { 2000848b8605Smrg dst[i] = (GLuint) rgba[i][RCOMP]; 2001848b8605Smrg } 2002848b8605Smrg break; 2003848b8605Smrg case GL_GREEN_INTEGER_EXT: 2004848b8605Smrg for (i=0;i<n;i++) { 2005848b8605Smrg dst[i] = (GLuint) rgba[i][GCOMP]; 2006848b8605Smrg } 2007848b8605Smrg break; 2008848b8605Smrg case GL_BLUE_INTEGER_EXT: 2009848b8605Smrg for (i=0;i<n;i++) { 2010848b8605Smrg dst[i] = (GLuint) rgba[i][BCOMP]; 2011848b8605Smrg } 2012848b8605Smrg break; 2013848b8605Smrg case GL_ALPHA_INTEGER_EXT: 2014848b8605Smrg for (i=0;i<n;i++) { 2015848b8605Smrg dst[i] = (GLuint) rgba[i][ACOMP]; 2016848b8605Smrg } 2017848b8605Smrg break; 2018848b8605Smrg case GL_RG_INTEGER: 2019848b8605Smrg for (i=0;i<n;i++) { 2020848b8605Smrg dst[i*2+0] = (GLuint) rgba[i][RCOMP]; 2021848b8605Smrg dst[i*2+1] = (GLuint) rgba[i][GCOMP]; 2022848b8605Smrg } 2023848b8605Smrg break; 2024848b8605Smrg case GL_RGB_INTEGER_EXT: 2025848b8605Smrg for (i=0;i<n;i++) { 2026848b8605Smrg dst[i*3+0] = (GLuint) rgba[i][RCOMP]; 2027848b8605Smrg dst[i*3+1] = (GLuint) rgba[i][GCOMP]; 2028848b8605Smrg dst[i*3+2] = (GLuint) rgba[i][BCOMP]; 2029848b8605Smrg } 2030848b8605Smrg break; 2031848b8605Smrg case GL_RGBA_INTEGER_EXT: 2032848b8605Smrg for (i=0;i<n;i++) { 2033848b8605Smrg dst[i*4+0] = (GLuint) rgba[i][RCOMP]; 2034848b8605Smrg dst[i*4+1] = (GLuint) rgba[i][GCOMP]; 2035848b8605Smrg dst[i*4+2] = (GLuint) rgba[i][BCOMP]; 2036848b8605Smrg dst[i*4+3] = (GLuint) rgba[i][ACOMP]; 2037848b8605Smrg } 2038848b8605Smrg break; 2039848b8605Smrg case GL_BGR_INTEGER_EXT: 2040848b8605Smrg for (i=0;i<n;i++) { 2041848b8605Smrg dst[i*3+0] = (GLuint) rgba[i][BCOMP]; 2042848b8605Smrg dst[i*3+1] = (GLuint) rgba[i][GCOMP]; 2043848b8605Smrg dst[i*3+2] = (GLuint) rgba[i][RCOMP]; 2044848b8605Smrg } 2045848b8605Smrg break; 2046848b8605Smrg case GL_BGRA_INTEGER_EXT: 2047848b8605Smrg for (i=0;i<n;i++) { 2048848b8605Smrg dst[i*4+0] = (GLuint) rgba[i][BCOMP]; 2049848b8605Smrg dst[i*4+1] = (GLuint) rgba[i][GCOMP]; 2050848b8605Smrg dst[i*4+2] = (GLuint) rgba[i][RCOMP]; 2051848b8605Smrg dst[i*4+3] = (GLuint) rgba[i][ACOMP]; 2052848b8605Smrg } 2053848b8605Smrg break; 2054848b8605Smrg case GL_LUMINANCE_INTEGER_EXT: 2055848b8605Smrg for (i=0;i<n;i++) { 2056848b8605Smrg dst[i*2+0] = (GLuint) (rgba[i][RCOMP] + 2057848b8605Smrg rgba[i][GCOMP] + 2058848b8605Smrg rgba[i][BCOMP]); 2059848b8605Smrg dst[i*2+1] = (GLuint) rgba[i][ACOMP]; 2060848b8605Smrg } 2061848b8605Smrg break; 2062848b8605Smrg case GL_LUMINANCE_ALPHA_INTEGER_EXT: 2063848b8605Smrg for (i=0;i<n;i++) { 2064848b8605Smrg dst[i] = (GLuint) (rgba[i][RCOMP] + 2065848b8605Smrg rgba[i][GCOMP] + 2066848b8605Smrg rgba[i][BCOMP]); 2067848b8605Smrg } 2068848b8605Smrg break; 2069848b8605Smrg default: 2070848b8605Smrg _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 2071848b8605Smrg } 2072848b8605Smrg } 2073848b8605Smrg break; 2074848b8605Smrg case GL_INT: 2075848b8605Smrg { 2076848b8605Smrg GLint *dst = (GLint *) dstAddr; 2077848b8605Smrg switch (dstFormat) { 2078848b8605Smrg case GL_RED: 2079848b8605Smrg for (i=0;i<n;i++) 2080848b8605Smrg dst[i] = FLOAT_TO_INT(rgba[i][RCOMP]); 2081848b8605Smrg break; 2082848b8605Smrg case GL_GREEN: 2083848b8605Smrg for (i=0;i<n;i++) 2084848b8605Smrg dst[i] = FLOAT_TO_INT(rgba[i][GCOMP]); 2085848b8605Smrg break; 2086848b8605Smrg case GL_BLUE: 2087848b8605Smrg for (i=0;i<n;i++) 2088848b8605Smrg dst[i] = FLOAT_TO_INT(rgba[i][BCOMP]); 2089848b8605Smrg break; 2090848b8605Smrg case GL_ALPHA: 2091848b8605Smrg for (i=0;i<n;i++) 2092848b8605Smrg dst[i] = FLOAT_TO_INT(rgba[i][ACOMP]); 2093848b8605Smrg break; 2094848b8605Smrg case GL_LUMINANCE: 2095848b8605Smrg for (i=0;i<n;i++) 2096848b8605Smrg dst[i] = FLOAT_TO_INT(luminance[i]); 2097848b8605Smrg break; 2098848b8605Smrg case GL_LUMINANCE_ALPHA: 2099848b8605Smrg for (i=0;i<n;i++) { 2100848b8605Smrg dst[i*2+0] = FLOAT_TO_INT(luminance[i]); 2101848b8605Smrg dst[i*2+1] = FLOAT_TO_INT(rgba[i][ACOMP]); 2102848b8605Smrg } 2103848b8605Smrg break; 2104848b8605Smrg case GL_RG: 2105848b8605Smrg for (i=0;i<n;i++) { 2106848b8605Smrg dst[i*2+0] = FLOAT_TO_INT(rgba[i][RCOMP]); 2107848b8605Smrg dst[i*2+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 2108848b8605Smrg } 2109848b8605Smrg break; 2110848b8605Smrg case GL_RGB: 2111848b8605Smrg for (i=0;i<n;i++) { 2112848b8605Smrg dst[i*3+0] = FLOAT_TO_INT(rgba[i][RCOMP]); 2113848b8605Smrg dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 2114848b8605Smrg dst[i*3+2] = FLOAT_TO_INT(rgba[i][BCOMP]); 2115848b8605Smrg } 2116848b8605Smrg break; 2117848b8605Smrg case GL_RGBA: 2118848b8605Smrg for (i=0;i<n;i++) { 2119848b8605Smrg dst[i*4+0] = FLOAT_TO_INT(rgba[i][RCOMP]); 2120848b8605Smrg dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 2121848b8605Smrg dst[i*4+2] = FLOAT_TO_INT(rgba[i][BCOMP]); 2122848b8605Smrg dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]); 2123848b8605Smrg } 2124848b8605Smrg break; 2125848b8605Smrg case GL_BGR: 2126848b8605Smrg for (i=0;i<n;i++) { 2127848b8605Smrg dst[i*3+0] = FLOAT_TO_INT(rgba[i][BCOMP]); 2128848b8605Smrg dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 2129848b8605Smrg dst[i*3+2] = FLOAT_TO_INT(rgba[i][RCOMP]); 2130848b8605Smrg } 2131848b8605Smrg break; 2132848b8605Smrg case GL_BGRA: 2133848b8605Smrg for (i=0;i<n;i++) { 2134848b8605Smrg dst[i*4+0] = FLOAT_TO_INT(rgba[i][BCOMP]); 2135848b8605Smrg dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 2136848b8605Smrg dst[i*4+2] = FLOAT_TO_INT(rgba[i][RCOMP]); 2137848b8605Smrg dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]); 2138848b8605Smrg } 2139848b8605Smrg break; 2140848b8605Smrg case GL_ABGR_EXT: 2141848b8605Smrg for (i=0;i<n;i++) { 2142848b8605Smrg dst[i*4+0] = FLOAT_TO_INT(rgba[i][ACOMP]); 2143848b8605Smrg dst[i*4+1] = FLOAT_TO_INT(rgba[i][BCOMP]); 2144848b8605Smrg dst[i*4+2] = FLOAT_TO_INT(rgba[i][GCOMP]); 2145848b8605Smrg dst[i*4+3] = FLOAT_TO_INT(rgba[i][RCOMP]); 2146848b8605Smrg } 2147848b8605Smrg break; 2148848b8605Smrg case GL_RED_INTEGER_EXT: 2149848b8605Smrg for (i=0;i<n;i++) { 2150848b8605Smrg dst[i] = (GLint) rgba[i][RCOMP]; 2151848b8605Smrg } 2152848b8605Smrg break; 2153848b8605Smrg case GL_GREEN_INTEGER_EXT: 2154848b8605Smrg for (i=0;i<n;i++) { 2155848b8605Smrg dst[i] = (GLint) rgba[i][GCOMP]; 2156848b8605Smrg } 2157848b8605Smrg break; 2158848b8605Smrg case GL_BLUE_INTEGER_EXT: 2159848b8605Smrg for (i=0;i<n;i++) { 2160848b8605Smrg dst[i] = (GLint) rgba[i][BCOMP]; 2161848b8605Smrg } 2162848b8605Smrg break; 2163848b8605Smrg case GL_ALPHA_INTEGER_EXT: 2164848b8605Smrg for (i=0;i<n;i++) { 2165848b8605Smrg dst[i] = (GLint) rgba[i][ACOMP]; 2166848b8605Smrg } 2167848b8605Smrg break; 2168848b8605Smrg case GL_RG_INTEGER: 2169848b8605Smrg for (i=0;i<n;i++) { 2170848b8605Smrg dst[i*2+0] = (GLint) rgba[i][RCOMP]; 2171848b8605Smrg dst[i*2+1] = (GLint) rgba[i][GCOMP]; 2172848b8605Smrg } 2173848b8605Smrg break; 2174848b8605Smrg case GL_RGB_INTEGER_EXT: 2175848b8605Smrg for (i=0;i<n;i++) { 2176848b8605Smrg dst[i*3+0] = (GLint) rgba[i][RCOMP]; 2177848b8605Smrg dst[i*3+1] = (GLint) rgba[i][GCOMP]; 2178848b8605Smrg dst[i*3+2] = (GLint) rgba[i][BCOMP]; 2179848b8605Smrg } 2180848b8605Smrg break; 2181848b8605Smrg case GL_RGBA_INTEGER_EXT: 2182848b8605Smrg for (i=0;i<n;i++) { 2183848b8605Smrg dst[i*4+0] = (GLint) rgba[i][RCOMP]; 2184848b8605Smrg dst[i*4+1] = (GLint) rgba[i][GCOMP]; 2185848b8605Smrg dst[i*4+2] = (GLint) rgba[i][BCOMP]; 2186848b8605Smrg dst[i*4+3] = (GLint) rgba[i][ACOMP]; 2187848b8605Smrg } 2188848b8605Smrg break; 2189848b8605Smrg case GL_BGR_INTEGER_EXT: 2190848b8605Smrg for (i=0;i<n;i++) { 2191848b8605Smrg dst[i*3+0] = (GLint) rgba[i][BCOMP]; 2192848b8605Smrg dst[i*3+1] = (GLint) rgba[i][GCOMP]; 2193848b8605Smrg dst[i*3+2] = (GLint) rgba[i][RCOMP]; 2194848b8605Smrg } 2195848b8605Smrg break; 2196848b8605Smrg case GL_BGRA_INTEGER_EXT: 2197848b8605Smrg for (i=0;i<n;i++) { 2198848b8605Smrg dst[i*4+0] = (GLint) rgba[i][BCOMP]; 2199848b8605Smrg dst[i*4+1] = (GLint) rgba[i][GCOMP]; 2200848b8605Smrg dst[i*4+2] = (GLint) rgba[i][RCOMP]; 2201848b8605Smrg dst[i*4+3] = (GLint) rgba[i][ACOMP]; 2202848b8605Smrg } 2203848b8605Smrg break; 2204848b8605Smrg case GL_LUMINANCE_INTEGER_EXT: 2205848b8605Smrg for (i=0;i<n;i++) { 2206848b8605Smrg dst[i*2+0] = (GLint) (rgba[i][RCOMP] + 2207848b8605Smrg rgba[i][GCOMP] + 2208848b8605Smrg rgba[i][BCOMP]); 2209848b8605Smrg dst[i*2+1] = (GLint) rgba[i][ACOMP]; 2210848b8605Smrg } 2211848b8605Smrg break; 2212848b8605Smrg case GL_LUMINANCE_ALPHA_INTEGER_EXT: 2213848b8605Smrg for (i=0;i<n;i++) { 2214848b8605Smrg dst[i] = (GLint) (rgba[i][RCOMP] + 2215848b8605Smrg rgba[i][GCOMP] + 2216848b8605Smrg rgba[i][BCOMP]); 2217848b8605Smrg } 2218848b8605Smrg break; 2219848b8605Smrg default: 2220848b8605Smrg _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 2221848b8605Smrg } 2222848b8605Smrg } 2223848b8605Smrg break; 2224848b8605Smrg case GL_FLOAT: 2225848b8605Smrg { 2226848b8605Smrg GLfloat *dst = (GLfloat *) dstAddr; 2227848b8605Smrg switch (dstFormat) { 2228848b8605Smrg case GL_RED: 2229848b8605Smrg for (i=0;i<n;i++) 2230848b8605Smrg dst[i] = rgba[i][RCOMP]; 2231848b8605Smrg break; 2232848b8605Smrg case GL_GREEN: 2233848b8605Smrg for (i=0;i<n;i++) 2234848b8605Smrg dst[i] = rgba[i][GCOMP]; 2235848b8605Smrg break; 2236848b8605Smrg case GL_BLUE: 2237848b8605Smrg for (i=0;i<n;i++) 2238848b8605Smrg dst[i] = rgba[i][BCOMP]; 2239848b8605Smrg break; 2240848b8605Smrg case GL_ALPHA: 2241848b8605Smrg for (i=0;i<n;i++) 2242848b8605Smrg dst[i] = rgba[i][ACOMP]; 2243848b8605Smrg break; 2244848b8605Smrg case GL_LUMINANCE: 2245848b8605Smrg for (i=0;i<n;i++) 2246848b8605Smrg dst[i] = luminance[i]; 2247848b8605Smrg break; 2248848b8605Smrg case GL_LUMINANCE_ALPHA: 2249848b8605Smrg for (i=0;i<n;i++) { 2250848b8605Smrg dst[i*2+0] = luminance[i]; 2251848b8605Smrg dst[i*2+1] = rgba[i][ACOMP]; 2252848b8605Smrg } 2253848b8605Smrg break; 2254848b8605Smrg case GL_RG: 2255848b8605Smrg for (i=0;i<n;i++) { 2256848b8605Smrg dst[i*2+0] = rgba[i][RCOMP]; 2257848b8605Smrg dst[i*2+1] = rgba[i][GCOMP]; 2258848b8605Smrg } 2259848b8605Smrg break; 2260848b8605Smrg case GL_RGB: 2261848b8605Smrg for (i=0;i<n;i++) { 2262848b8605Smrg dst[i*3+0] = rgba[i][RCOMP]; 2263848b8605Smrg dst[i*3+1] = rgba[i][GCOMP]; 2264848b8605Smrg dst[i*3+2] = rgba[i][BCOMP]; 2265848b8605Smrg } 2266848b8605Smrg break; 2267848b8605Smrg case GL_RGBA: 2268848b8605Smrg for (i=0;i<n;i++) { 2269848b8605Smrg dst[i*4+0] = rgba[i][RCOMP]; 2270848b8605Smrg dst[i*4+1] = rgba[i][GCOMP]; 2271848b8605Smrg dst[i*4+2] = rgba[i][BCOMP]; 2272848b8605Smrg dst[i*4+3] = rgba[i][ACOMP]; 2273848b8605Smrg } 2274848b8605Smrg break; 2275848b8605Smrg case GL_BGR: 2276848b8605Smrg for (i=0;i<n;i++) { 2277848b8605Smrg dst[i*3+0] = rgba[i][BCOMP]; 2278848b8605Smrg dst[i*3+1] = rgba[i][GCOMP]; 2279848b8605Smrg dst[i*3+2] = rgba[i][RCOMP]; 2280848b8605Smrg } 2281848b8605Smrg break; 2282848b8605Smrg case GL_BGRA: 2283848b8605Smrg for (i=0;i<n;i++) { 2284848b8605Smrg dst[i*4+0] = rgba[i][BCOMP]; 2285848b8605Smrg dst[i*4+1] = rgba[i][GCOMP]; 2286848b8605Smrg dst[i*4+2] = rgba[i][RCOMP]; 2287848b8605Smrg dst[i*4+3] = rgba[i][ACOMP]; 2288848b8605Smrg } 2289848b8605Smrg break; 2290848b8605Smrg case GL_ABGR_EXT: 2291848b8605Smrg for (i=0;i<n;i++) { 2292848b8605Smrg dst[i*4+0] = rgba[i][ACOMP]; 2293848b8605Smrg dst[i*4+1] = rgba[i][BCOMP]; 2294848b8605Smrg dst[i*4+2] = rgba[i][GCOMP]; 2295848b8605Smrg dst[i*4+3] = rgba[i][RCOMP]; 2296848b8605Smrg } 2297848b8605Smrg break; 2298848b8605Smrg default: 2299848b8605Smrg _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 2300848b8605Smrg } 2301848b8605Smrg } 2302848b8605Smrg break; 2303848b8605Smrg case GL_HALF_FLOAT_ARB: 2304848b8605Smrg { 2305848b8605Smrg GLhalfARB *dst = (GLhalfARB *) dstAddr; 2306848b8605Smrg switch (dstFormat) { 2307848b8605Smrg case GL_RED: 2308848b8605Smrg for (i=0;i<n;i++) 2309848b8605Smrg dst[i] = _mesa_float_to_half(rgba[i][RCOMP]); 2310848b8605Smrg break; 2311848b8605Smrg case GL_GREEN: 2312848b8605Smrg for (i=0;i<n;i++) 2313848b8605Smrg dst[i] = _mesa_float_to_half(rgba[i][GCOMP]); 2314848b8605Smrg break; 2315848b8605Smrg case GL_BLUE: 2316848b8605Smrg for (i=0;i<n;i++) 2317848b8605Smrg dst[i] = _mesa_float_to_half(rgba[i][BCOMP]); 2318848b8605Smrg break; 2319848b8605Smrg case GL_ALPHA: 2320848b8605Smrg for (i=0;i<n;i++) 2321848b8605Smrg dst[i] = _mesa_float_to_half(rgba[i][ACOMP]); 2322848b8605Smrg break; 2323848b8605Smrg case GL_LUMINANCE: 2324848b8605Smrg for (i=0;i<n;i++) 2325848b8605Smrg dst[i] = _mesa_float_to_half(luminance[i]); 2326848b8605Smrg break; 2327848b8605Smrg case GL_LUMINANCE_ALPHA: 2328848b8605Smrg for (i=0;i<n;i++) { 2329848b8605Smrg dst[i*2+0] = _mesa_float_to_half(luminance[i]); 2330848b8605Smrg dst[i*2+1] = _mesa_float_to_half(rgba[i][ACOMP]); 2331848b8605Smrg } 2332848b8605Smrg break; 2333848b8605Smrg case GL_RG: 2334848b8605Smrg for (i=0;i<n;i++) { 2335848b8605Smrg dst[i*2+0] = _mesa_float_to_half(rgba[i][RCOMP]); 2336848b8605Smrg dst[i*2+1] = _mesa_float_to_half(rgba[i][GCOMP]); 2337848b8605Smrg } 2338848b8605Smrg break; 2339848b8605Smrg case GL_RGB: 2340848b8605Smrg for (i=0;i<n;i++) { 2341848b8605Smrg dst[i*3+0] = _mesa_float_to_half(rgba[i][RCOMP]); 2342848b8605Smrg dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]); 2343848b8605Smrg dst[i*3+2] = _mesa_float_to_half(rgba[i][BCOMP]); 2344848b8605Smrg } 2345848b8605Smrg break; 2346848b8605Smrg case GL_RGBA: 2347848b8605Smrg for (i=0;i<n;i++) { 2348848b8605Smrg dst[i*4+0] = _mesa_float_to_half(rgba[i][RCOMP]); 2349848b8605Smrg dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]); 2350848b8605Smrg dst[i*4+2] = _mesa_float_to_half(rgba[i][BCOMP]); 2351848b8605Smrg dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]); 2352848b8605Smrg } 2353848b8605Smrg break; 2354848b8605Smrg case GL_BGR: 2355848b8605Smrg for (i=0;i<n;i++) { 2356848b8605Smrg dst[i*3+0] = _mesa_float_to_half(rgba[i][BCOMP]); 2357848b8605Smrg dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]); 2358848b8605Smrg dst[i*3+2] = _mesa_float_to_half(rgba[i][RCOMP]); 2359848b8605Smrg } 2360848b8605Smrg break; 2361848b8605Smrg case GL_BGRA: 2362848b8605Smrg for (i=0;i<n;i++) { 2363848b8605Smrg dst[i*4+0] = _mesa_float_to_half(rgba[i][BCOMP]); 2364848b8605Smrg dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]); 2365848b8605Smrg dst[i*4+2] = _mesa_float_to_half(rgba[i][RCOMP]); 2366848b8605Smrg dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]); 2367848b8605Smrg } 2368848b8605Smrg break; 2369848b8605Smrg case GL_ABGR_EXT: 2370848b8605Smrg for (i=0;i<n;i++) { 2371848b8605Smrg dst[i*4+0] = _mesa_float_to_half(rgba[i][ACOMP]); 2372848b8605Smrg dst[i*4+1] = _mesa_float_to_half(rgba[i][BCOMP]); 2373848b8605Smrg dst[i*4+2] = _mesa_float_to_half(rgba[i][GCOMP]); 2374848b8605Smrg dst[i*4+3] = _mesa_float_to_half(rgba[i][RCOMP]); 2375848b8605Smrg } 2376848b8605Smrg break; 2377848b8605Smrg default: 2378848b8605Smrg _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 2379848b8605Smrg } 2380848b8605Smrg } 2381848b8605Smrg break; 2382848b8605Smrg case GL_UNSIGNED_BYTE_3_3_2: 2383848b8605Smrg if (dstFormat == GL_RGB) { 2384848b8605Smrg GLubyte *dst = (GLubyte *) dstAddr; 2385848b8605Smrg for (i=0;i<n;i++) { 2386848b8605Smrg dst[i] = (F_TO_I(rgba[i][RCOMP] * 7.0F) << 5) 2387848b8605Smrg | (F_TO_I(rgba[i][GCOMP] * 7.0F) << 2) 2388848b8605Smrg | (F_TO_I(rgba[i][BCOMP] * 3.0F) ); 2389848b8605Smrg } 2390848b8605Smrg } 2391848b8605Smrg break; 2392848b8605Smrg case GL_UNSIGNED_BYTE_2_3_3_REV: 2393848b8605Smrg if (dstFormat == GL_RGB) { 2394848b8605Smrg GLubyte *dst = (GLubyte *) dstAddr; 2395848b8605Smrg for (i=0;i<n;i++) { 2396848b8605Smrg dst[i] = (F_TO_I(rgba[i][RCOMP] * 7.0F) ) 2397848b8605Smrg | (F_TO_I(rgba[i][GCOMP] * 7.0F) << 3) 2398848b8605Smrg | (F_TO_I(rgba[i][BCOMP] * 3.0F) << 6); 2399848b8605Smrg } 2400848b8605Smrg } 2401848b8605Smrg break; 2402848b8605Smrg case GL_UNSIGNED_SHORT_5_6_5: 2403848b8605Smrg if (dstFormat == GL_RGB) { 2404848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 2405848b8605Smrg for (i=0;i<n;i++) { 2406848b8605Smrg dst[i] = (F_TO_I(rgba[i][RCOMP] * 31.0F) << 11) 2407848b8605Smrg | (F_TO_I(rgba[i][GCOMP] * 63.0F) << 5) 2408848b8605Smrg | (F_TO_I(rgba[i][BCOMP] * 31.0F) ); 2409848b8605Smrg } 2410848b8605Smrg } 2411848b8605Smrg break; 2412848b8605Smrg case GL_UNSIGNED_SHORT_5_6_5_REV: 2413848b8605Smrg if (dstFormat == GL_RGB) { 2414848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 2415848b8605Smrg for (i=0;i<n;i++) { 2416848b8605Smrg dst[i] = (F_TO_I(rgba[i][RCOMP] * 31.0F) ) 2417848b8605Smrg | (F_TO_I(rgba[i][GCOMP] * 63.0F) << 5) 2418848b8605Smrg | (F_TO_I(rgba[i][BCOMP] * 31.0F) << 11); 2419848b8605Smrg } 2420848b8605Smrg } 2421848b8605Smrg break; 2422848b8605Smrg case GL_UNSIGNED_SHORT_4_4_4_4: 2423848b8605Smrg if (dstFormat == GL_RGBA) { 2424848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 2425848b8605Smrg for (i=0;i<n;i++) { 2426848b8605Smrg dst[i] = (F_TO_I(rgba[i][RCOMP] * 15.0F) << 12) 2427848b8605Smrg | (F_TO_I(rgba[i][GCOMP] * 15.0F) << 8) 2428848b8605Smrg | (F_TO_I(rgba[i][BCOMP] * 15.0F) << 4) 2429848b8605Smrg | (F_TO_I(rgba[i][ACOMP] * 15.0F) ); 2430848b8605Smrg } 2431848b8605Smrg } 2432848b8605Smrg else if (dstFormat == GL_BGRA) { 2433848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 2434848b8605Smrg for (i=0;i<n;i++) { 2435848b8605Smrg dst[i] = (F_TO_I(rgba[i][BCOMP] * 15.0F) << 12) 2436848b8605Smrg | (F_TO_I(rgba[i][GCOMP] * 15.0F) << 8) 2437848b8605Smrg | (F_TO_I(rgba[i][RCOMP] * 15.0F) << 4) 2438848b8605Smrg | (F_TO_I(rgba[i][ACOMP] * 15.0F) ); 2439848b8605Smrg } 2440848b8605Smrg } 2441848b8605Smrg else if (dstFormat == GL_ABGR_EXT) { 2442848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 2443848b8605Smrg for (i=0;i<n;i++) { 2444848b8605Smrg dst[i] = (F_TO_I(rgba[i][ACOMP] * 15.0F) << 12) 2445848b8605Smrg | (F_TO_I(rgba[i][BCOMP] * 15.0F) << 8) 2446848b8605Smrg | (F_TO_I(rgba[i][GCOMP] * 15.0F) << 4) 2447848b8605Smrg | (F_TO_I(rgba[i][RCOMP] * 15.0F) ); 2448848b8605Smrg } 2449848b8605Smrg } 2450848b8605Smrg break; 2451848b8605Smrg case GL_UNSIGNED_SHORT_4_4_4_4_REV: 2452848b8605Smrg if (dstFormat == GL_RGBA) { 2453848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 2454848b8605Smrg for (i=0;i<n;i++) { 2455848b8605Smrg dst[i] = (F_TO_I(rgba[i][RCOMP] * 15.0F) ) 2456848b8605Smrg | (F_TO_I(rgba[i][GCOMP] * 15.0F) << 4) 2457848b8605Smrg | (F_TO_I(rgba[i][BCOMP] * 15.0F) << 8) 2458848b8605Smrg | (F_TO_I(rgba[i][ACOMP] * 15.0F) << 12); 2459848b8605Smrg } 2460848b8605Smrg } 2461848b8605Smrg else if (dstFormat == GL_BGRA) { 2462848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 2463848b8605Smrg for (i=0;i<n;i++) { 2464848b8605Smrg dst[i] = (F_TO_I(rgba[i][BCOMP] * 15.0F) ) 2465848b8605Smrg | (F_TO_I(rgba[i][GCOMP] * 15.0F) << 4) 2466848b8605Smrg | (F_TO_I(rgba[i][RCOMP] * 15.0F) << 8) 2467848b8605Smrg | (F_TO_I(rgba[i][ACOMP] * 15.0F) << 12); 2468848b8605Smrg } 2469848b8605Smrg } 2470848b8605Smrg else if (dstFormat == GL_ABGR_EXT) { 2471848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 2472848b8605Smrg for (i=0;i<n;i++) { 2473848b8605Smrg dst[i] = (F_TO_I(rgba[i][ACOMP] * 15.0F) ) 2474848b8605Smrg | (F_TO_I(rgba[i][BCOMP] * 15.0F) << 4) 2475848b8605Smrg | (F_TO_I(rgba[i][GCOMP] * 15.0F) << 8) 2476848b8605Smrg | (F_TO_I(rgba[i][RCOMP] * 15.0F) << 12); 2477848b8605Smrg } 2478848b8605Smrg } 2479848b8605Smrg break; 2480848b8605Smrg case GL_UNSIGNED_SHORT_5_5_5_1: 2481848b8605Smrg if (dstFormat == GL_RGBA) { 2482848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 2483848b8605Smrg for (i=0;i<n;i++) { 2484848b8605Smrg dst[i] = (F_TO_I(rgba[i][RCOMP] * 31.0F) << 11) 2485848b8605Smrg | (F_TO_I(rgba[i][GCOMP] * 31.0F) << 6) 2486848b8605Smrg | (F_TO_I(rgba[i][BCOMP] * 31.0F) << 1) 2487848b8605Smrg | (F_TO_I(rgba[i][ACOMP] * 1.0F) ); 2488848b8605Smrg } 2489848b8605Smrg } 2490848b8605Smrg else if (dstFormat == GL_BGRA) { 2491848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 2492848b8605Smrg for (i=0;i<n;i++) { 2493848b8605Smrg dst[i] = (F_TO_I(rgba[i][BCOMP] * 31.0F) << 11) 2494848b8605Smrg | (F_TO_I(rgba[i][GCOMP] * 31.0F) << 6) 2495848b8605Smrg | (F_TO_I(rgba[i][RCOMP] * 31.0F) << 1) 2496848b8605Smrg | (F_TO_I(rgba[i][ACOMP] * 1.0F) ); 2497848b8605Smrg } 2498848b8605Smrg } 2499848b8605Smrg else if (dstFormat == GL_ABGR_EXT) { 2500848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 2501848b8605Smrg for (i=0;i<n;i++) { 2502848b8605Smrg dst[i] = (F_TO_I(rgba[i][ACOMP] * 31.0F) << 11) 2503848b8605Smrg | (F_TO_I(rgba[i][BCOMP] * 31.0F) << 6) 2504848b8605Smrg | (F_TO_I(rgba[i][GCOMP] * 31.0F) << 1) 2505848b8605Smrg | (F_TO_I(rgba[i][RCOMP] * 1.0F) ); 2506848b8605Smrg } 2507848b8605Smrg } 2508848b8605Smrg break; 2509848b8605Smrg case GL_UNSIGNED_SHORT_1_5_5_5_REV: 2510848b8605Smrg if (dstFormat == GL_RGBA) { 2511848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 2512848b8605Smrg for (i=0;i<n;i++) { 2513848b8605Smrg dst[i] = (F_TO_I(rgba[i][RCOMP] * 31.0F) ) 2514848b8605Smrg | (F_TO_I(rgba[i][GCOMP] * 31.0F) << 5) 2515848b8605Smrg | (F_TO_I(rgba[i][BCOMP] * 31.0F) << 10) 2516848b8605Smrg | (F_TO_I(rgba[i][ACOMP] * 1.0F) << 15); 2517848b8605Smrg } 2518848b8605Smrg } 2519848b8605Smrg else if (dstFormat == GL_BGRA) { 2520848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 2521848b8605Smrg for (i=0;i<n;i++) { 2522848b8605Smrg dst[i] = (F_TO_I(rgba[i][BCOMP] * 31.0F) ) 2523848b8605Smrg | (F_TO_I(rgba[i][GCOMP] * 31.0F) << 5) 2524848b8605Smrg | (F_TO_I(rgba[i][RCOMP] * 31.0F) << 10) 2525848b8605Smrg | (F_TO_I(rgba[i][ACOMP] * 1.0F) << 15); 2526848b8605Smrg } 2527848b8605Smrg } 2528848b8605Smrg else if (dstFormat == GL_ABGR_EXT) { 2529848b8605Smrg GLushort *dst = (GLushort *) dstAddr; 2530848b8605Smrg for (i=0;i<n;i++) { 2531848b8605Smrg dst[i] = (F_TO_I(rgba[i][ACOMP] * 31.0F) ) 2532848b8605Smrg | (F_TO_I(rgba[i][BCOMP] * 31.0F) << 5) 2533848b8605Smrg | (F_TO_I(rgba[i][GCOMP] * 31.0F) << 10) 2534848b8605Smrg | (F_TO_I(rgba[i][RCOMP] * 1.0F) << 15); 2535848b8605Smrg } 2536848b8605Smrg } 2537848b8605Smrg break; 2538848b8605Smrg case GL_UNSIGNED_INT_8_8_8_8: 2539848b8605Smrg if (dstFormat == GL_RGBA) { 2540848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 2541848b8605Smrg for (i=0;i<n;i++) { 2542848b8605Smrg dst[i] = (F_TO_I(rgba[i][RCOMP] * 255.F) << 24) 2543848b8605Smrg | (F_TO_I(rgba[i][GCOMP] * 255.F) << 16) 2544848b8605Smrg | (F_TO_I(rgba[i][BCOMP] * 255.F) << 8) 2545848b8605Smrg | (F_TO_I(rgba[i][ACOMP] * 255.F) ); 2546848b8605Smrg } 2547848b8605Smrg } 2548848b8605Smrg else if (dstFormat == GL_BGRA) { 2549848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 2550848b8605Smrg for (i=0;i<n;i++) { 2551848b8605Smrg dst[i] = (F_TO_I(rgba[i][BCOMP] * 255.F) << 24) 2552848b8605Smrg | (F_TO_I(rgba[i][GCOMP] * 255.F) << 16) 2553848b8605Smrg | (F_TO_I(rgba[i][RCOMP] * 255.F) << 8) 2554848b8605Smrg | (F_TO_I(rgba[i][ACOMP] * 255.F) ); 2555848b8605Smrg } 2556848b8605Smrg } 2557848b8605Smrg else if (dstFormat == GL_ABGR_EXT) { 2558848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 2559848b8605Smrg for (i=0;i<n;i++) { 2560848b8605Smrg dst[i] = (F_TO_I(rgba[i][ACOMP] * 255.F) << 24) 2561848b8605Smrg | (F_TO_I(rgba[i][BCOMP] * 255.F) << 16) 2562848b8605Smrg | (F_TO_I(rgba[i][GCOMP] * 255.F) << 8) 2563848b8605Smrg | (F_TO_I(rgba[i][RCOMP] * 255.F) ); 2564848b8605Smrg } 2565848b8605Smrg } 2566848b8605Smrg break; 2567848b8605Smrg case GL_UNSIGNED_INT_8_8_8_8_REV: 2568848b8605Smrg if (dstFormat == GL_RGBA) { 2569848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 2570848b8605Smrg for (i=0;i<n;i++) { 2571848b8605Smrg dst[i] = (F_TO_I(rgba[i][RCOMP] * 255.0F) ) 2572848b8605Smrg | (F_TO_I(rgba[i][GCOMP] * 255.0F) << 8) 2573848b8605Smrg | (F_TO_I(rgba[i][BCOMP] * 255.0F) << 16) 2574848b8605Smrg | (F_TO_I(rgba[i][ACOMP] * 255.0F) << 24); 2575848b8605Smrg } 2576848b8605Smrg } 2577848b8605Smrg else if (dstFormat == GL_BGRA) { 2578848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 2579848b8605Smrg for (i=0;i<n;i++) { 2580848b8605Smrg dst[i] = (F_TO_I(rgba[i][BCOMP] * 255.0F) ) 2581848b8605Smrg | (F_TO_I(rgba[i][GCOMP] * 255.0F) << 8) 2582848b8605Smrg | (F_TO_I(rgba[i][RCOMP] * 255.0F) << 16) 2583848b8605Smrg | (F_TO_I(rgba[i][ACOMP] * 255.0F) << 24); 2584848b8605Smrg } 2585848b8605Smrg } 2586848b8605Smrg else if (dstFormat == GL_ABGR_EXT) { 2587848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 2588848b8605Smrg for (i=0;i<n;i++) { 2589848b8605Smrg dst[i] = (F_TO_I(rgba[i][ACOMP] * 255.0F) ) 2590848b8605Smrg | (F_TO_I(rgba[i][BCOMP] * 255.0F) << 8) 2591848b8605Smrg | (F_TO_I(rgba[i][GCOMP] * 255.0F) << 16) 2592848b8605Smrg | (F_TO_I(rgba[i][RCOMP] * 255.0F) << 24); 2593848b8605Smrg } 2594848b8605Smrg } 2595848b8605Smrg break; 2596848b8605Smrg case GL_UNSIGNED_INT_10_10_10_2: 2597848b8605Smrg if (dstFormat == GL_RGBA) { 2598848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 2599848b8605Smrg for (i=0;i<n;i++) { 2600848b8605Smrg dst[i] = (F_TO_I(rgba[i][RCOMP] * 1023.0F) << 22) 2601848b8605Smrg | (F_TO_I(rgba[i][GCOMP] * 1023.0F) << 12) 2602848b8605Smrg | (F_TO_I(rgba[i][BCOMP] * 1023.0F) << 2) 2603848b8605Smrg | (F_TO_I(rgba[i][ACOMP] * 3.0F) ); 2604848b8605Smrg } 2605848b8605Smrg } 2606848b8605Smrg else if (dstFormat == GL_BGRA) { 2607848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 2608848b8605Smrg for (i=0;i<n;i++) { 2609848b8605Smrg dst[i] = (F_TO_I(rgba[i][BCOMP] * 1023.0F) << 22) 2610848b8605Smrg | (F_TO_I(rgba[i][GCOMP] * 1023.0F) << 12) 2611848b8605Smrg | (F_TO_I(rgba[i][RCOMP] * 1023.0F) << 2) 2612848b8605Smrg | (F_TO_I(rgba[i][ACOMP] * 3.0F) ); 2613848b8605Smrg } 2614848b8605Smrg } 2615848b8605Smrg else if (dstFormat == GL_ABGR_EXT) { 2616848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 2617848b8605Smrg for (i=0;i<n;i++) { 2618848b8605Smrg dst[i] = (F_TO_I(rgba[i][ACOMP] * 1023.0F) << 22) 2619848b8605Smrg | (F_TO_I(rgba[i][BCOMP] * 1023.0F) << 12) 2620848b8605Smrg | (F_TO_I(rgba[i][GCOMP] * 1023.0F) << 2) 2621848b8605Smrg | (F_TO_I(rgba[i][RCOMP] * 3.0F) ); 2622848b8605Smrg } 2623848b8605Smrg } 2624848b8605Smrg break; 2625848b8605Smrg case GL_UNSIGNED_INT_2_10_10_10_REV: 2626848b8605Smrg if (dstFormat == GL_RGBA) { 2627848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 2628848b8605Smrg for (i=0;i<n;i++) { 2629848b8605Smrg dst[i] = (F_TO_I(rgba[i][RCOMP] * 1023.0F) ) 2630848b8605Smrg | (F_TO_I(rgba[i][GCOMP] * 1023.0F) << 10) 2631848b8605Smrg | (F_TO_I(rgba[i][BCOMP] * 1023.0F) << 20) 2632848b8605Smrg | (F_TO_I(rgba[i][ACOMP] * 3.0F) << 30); 2633848b8605Smrg } 2634848b8605Smrg } 2635848b8605Smrg else if (dstFormat == GL_BGRA) { 2636848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 2637848b8605Smrg for (i=0;i<n;i++) { 2638848b8605Smrg dst[i] = (F_TO_I(rgba[i][BCOMP] * 1023.0F) ) 2639848b8605Smrg | (F_TO_I(rgba[i][GCOMP] * 1023.0F) << 10) 2640848b8605Smrg | (F_TO_I(rgba[i][RCOMP] * 1023.0F) << 20) 2641848b8605Smrg | (F_TO_I(rgba[i][ACOMP] * 3.0F) << 30); 2642848b8605Smrg } 2643848b8605Smrg } 2644848b8605Smrg else if (dstFormat == GL_ABGR_EXT) { 2645848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 2646848b8605Smrg for (i=0;i<n;i++) { 2647848b8605Smrg dst[i] = (F_TO_I(rgba[i][ACOMP] * 1023.0F) ) 2648848b8605Smrg | (F_TO_I(rgba[i][BCOMP] * 1023.0F) << 10) 2649848b8605Smrg | (F_TO_I(rgba[i][GCOMP] * 1023.0F) << 20) 2650848b8605Smrg | (F_TO_I(rgba[i][RCOMP] * 3.0F) << 30); 2651848b8605Smrg } 2652848b8605Smrg } 2653848b8605Smrg break; 2654848b8605Smrg case GL_UNSIGNED_INT_5_9_9_9_REV: 2655848b8605Smrg { 2656848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 2657848b8605Smrg for (i = 0; i < n; i++) { 2658848b8605Smrg dst[i] = float3_to_rgb9e5(rgba[i]); 2659848b8605Smrg } 2660848b8605Smrg } 2661848b8605Smrg break; 2662848b8605Smrg case GL_UNSIGNED_INT_10F_11F_11F_REV: 2663848b8605Smrg { 2664848b8605Smrg GLuint *dst = (GLuint *) dstAddr; 2665848b8605Smrg for (i = 0; i < n; i++) { 2666848b8605Smrg dst[i] = float3_to_r11g11b10f(rgba[i]); 2667848b8605Smrg } 2668848b8605Smrg } 2669848b8605Smrg break; 2670848b8605Smrg default: 2671848b8605Smrg _mesa_problem(ctx, "bad type in _mesa_pack_rgba_span_float"); 2672848b8605Smrg free(luminance); 2673848b8605Smrg return; 2674848b8605Smrg } 2675848b8605Smrg 2676848b8605Smrg if (dstPacking->SwapBytes) { 2677848b8605Smrg GLint swapSize = _mesa_sizeof_packed_type(dstType); 2678848b8605Smrg if (swapSize == 2) { 2679848b8605Smrg _mesa_swap2((GLushort *) dstAddr, n * comps); 2680848b8605Smrg } 2681848b8605Smrg else if (swapSize == 4) { 2682848b8605Smrg _mesa_swap4((GLuint *) dstAddr, n * comps); 2683848b8605Smrg } 2684848b8605Smrg } 2685848b8605Smrg 2686848b8605Smrg free(luminance); 2687848b8605Smrg} 2688848b8605Smrg 2689848b8605Smrg 2690848b8605Smrg 2691848b8605Smrg#define SWAP2BYTE(VALUE) \ 2692848b8605Smrg { \ 2693848b8605Smrg GLubyte *bytes = (GLubyte *) &(VALUE); \ 2694848b8605Smrg GLubyte tmp = bytes[0]; \ 2695848b8605Smrg bytes[0] = bytes[1]; \ 2696848b8605Smrg bytes[1] = tmp; \ 2697848b8605Smrg } 2698848b8605Smrg 2699848b8605Smrg#define SWAP4BYTE(VALUE) \ 2700848b8605Smrg { \ 2701848b8605Smrg GLubyte *bytes = (GLubyte *) &(VALUE); \ 2702848b8605Smrg GLubyte tmp = bytes[0]; \ 2703848b8605Smrg bytes[0] = bytes[3]; \ 2704848b8605Smrg bytes[3] = tmp; \ 2705848b8605Smrg tmp = bytes[1]; \ 2706848b8605Smrg bytes[1] = bytes[2]; \ 2707848b8605Smrg bytes[2] = tmp; \ 2708848b8605Smrg } 2709848b8605Smrg 2710848b8605Smrg 2711848b8605Smrgstatic void 2712848b8605Smrgextract_uint_indexes(GLuint n, GLuint indexes[], 2713848b8605Smrg GLenum srcFormat, GLenum srcType, const GLvoid *src, 2714848b8605Smrg const struct gl_pixelstore_attrib *unpack ) 2715848b8605Smrg{ 2716848b8605Smrg ASSERT(srcFormat == GL_COLOR_INDEX || srcFormat == GL_STENCIL_INDEX); 2717848b8605Smrg 2718848b8605Smrg ASSERT(srcType == GL_BITMAP || 2719848b8605Smrg srcType == GL_UNSIGNED_BYTE || 2720848b8605Smrg srcType == GL_BYTE || 2721848b8605Smrg srcType == GL_UNSIGNED_SHORT || 2722848b8605Smrg srcType == GL_SHORT || 2723848b8605Smrg srcType == GL_UNSIGNED_INT || 2724848b8605Smrg srcType == GL_INT || 2725848b8605Smrg srcType == GL_UNSIGNED_INT_24_8_EXT || 2726848b8605Smrg srcType == GL_HALF_FLOAT_ARB || 2727848b8605Smrg srcType == GL_FLOAT || 2728848b8605Smrg srcType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV); 2729848b8605Smrg 2730848b8605Smrg switch (srcType) { 2731848b8605Smrg case GL_BITMAP: 2732848b8605Smrg { 2733848b8605Smrg GLubyte *ubsrc = (GLubyte *) src; 2734848b8605Smrg if (unpack->LsbFirst) { 2735848b8605Smrg GLubyte mask = 1 << (unpack->SkipPixels & 0x7); 2736848b8605Smrg GLuint i; 2737848b8605Smrg for (i = 0; i < n; i++) { 2738848b8605Smrg indexes[i] = (*ubsrc & mask) ? 1 : 0; 2739848b8605Smrg if (mask == 128) { 2740848b8605Smrg mask = 1; 2741848b8605Smrg ubsrc++; 2742848b8605Smrg } 2743848b8605Smrg else { 2744848b8605Smrg mask = mask << 1; 2745848b8605Smrg } 2746848b8605Smrg } 2747848b8605Smrg } 2748848b8605Smrg else { 2749848b8605Smrg GLubyte mask = 128 >> (unpack->SkipPixels & 0x7); 2750848b8605Smrg GLuint i; 2751848b8605Smrg for (i = 0; i < n; i++) { 2752848b8605Smrg indexes[i] = (*ubsrc & mask) ? 1 : 0; 2753848b8605Smrg if (mask == 1) { 2754848b8605Smrg mask = 128; 2755848b8605Smrg ubsrc++; 2756848b8605Smrg } 2757848b8605Smrg else { 2758848b8605Smrg mask = mask >> 1; 2759848b8605Smrg } 2760848b8605Smrg } 2761848b8605Smrg } 2762848b8605Smrg } 2763848b8605Smrg break; 2764848b8605Smrg case GL_UNSIGNED_BYTE: 2765848b8605Smrg { 2766848b8605Smrg GLuint i; 2767848b8605Smrg const GLubyte *s = (const GLubyte *) src; 2768848b8605Smrg for (i = 0; i < n; i++) 2769848b8605Smrg indexes[i] = s[i]; 2770848b8605Smrg } 2771848b8605Smrg break; 2772848b8605Smrg case GL_BYTE: 2773848b8605Smrg { 2774848b8605Smrg GLuint i; 2775848b8605Smrg const GLbyte *s = (const GLbyte *) src; 2776848b8605Smrg for (i = 0; i < n; i++) 2777848b8605Smrg indexes[i] = s[i]; 2778848b8605Smrg } 2779848b8605Smrg break; 2780848b8605Smrg case GL_UNSIGNED_SHORT: 2781848b8605Smrg { 2782848b8605Smrg GLuint i; 2783848b8605Smrg const GLushort *s = (const GLushort *) src; 2784848b8605Smrg if (unpack->SwapBytes) { 2785848b8605Smrg for (i = 0; i < n; i++) { 2786848b8605Smrg GLushort value = s[i]; 2787848b8605Smrg SWAP2BYTE(value); 2788848b8605Smrg indexes[i] = value; 2789848b8605Smrg } 2790848b8605Smrg } 2791848b8605Smrg else { 2792848b8605Smrg for (i = 0; i < n; i++) 2793848b8605Smrg indexes[i] = s[i]; 2794848b8605Smrg } 2795848b8605Smrg } 2796848b8605Smrg break; 2797848b8605Smrg case GL_SHORT: 2798848b8605Smrg { 2799848b8605Smrg GLuint i; 2800848b8605Smrg const GLshort *s = (const GLshort *) src; 2801848b8605Smrg if (unpack->SwapBytes) { 2802848b8605Smrg for (i = 0; i < n; i++) { 2803848b8605Smrg GLshort value = s[i]; 2804848b8605Smrg SWAP2BYTE(value); 2805848b8605Smrg indexes[i] = value; 2806848b8605Smrg } 2807848b8605Smrg } 2808848b8605Smrg else { 2809848b8605Smrg for (i = 0; i < n; i++) 2810848b8605Smrg indexes[i] = s[i]; 2811848b8605Smrg } 2812848b8605Smrg } 2813848b8605Smrg break; 2814848b8605Smrg case GL_UNSIGNED_INT: 2815848b8605Smrg { 2816848b8605Smrg GLuint i; 2817848b8605Smrg const GLuint *s = (const GLuint *) src; 2818848b8605Smrg if (unpack->SwapBytes) { 2819848b8605Smrg for (i = 0; i < n; i++) { 2820848b8605Smrg GLuint value = s[i]; 2821848b8605Smrg SWAP4BYTE(value); 2822848b8605Smrg indexes[i] = value; 2823848b8605Smrg } 2824848b8605Smrg } 2825848b8605Smrg else { 2826848b8605Smrg for (i = 0; i < n; i++) 2827848b8605Smrg indexes[i] = s[i]; 2828848b8605Smrg } 2829848b8605Smrg } 2830848b8605Smrg break; 2831848b8605Smrg case GL_INT: 2832848b8605Smrg { 2833848b8605Smrg GLuint i; 2834848b8605Smrg const GLint *s = (const GLint *) src; 2835848b8605Smrg if (unpack->SwapBytes) { 2836848b8605Smrg for (i = 0; i < n; i++) { 2837848b8605Smrg GLint value = s[i]; 2838848b8605Smrg SWAP4BYTE(value); 2839848b8605Smrg indexes[i] = value; 2840848b8605Smrg } 2841848b8605Smrg } 2842848b8605Smrg else { 2843848b8605Smrg for (i = 0; i < n; i++) 2844848b8605Smrg indexes[i] = s[i]; 2845848b8605Smrg } 2846848b8605Smrg } 2847848b8605Smrg break; 2848848b8605Smrg case GL_FLOAT: 2849848b8605Smrg { 2850848b8605Smrg GLuint i; 2851848b8605Smrg const GLfloat *s = (const GLfloat *) src; 2852848b8605Smrg if (unpack->SwapBytes) { 2853848b8605Smrg for (i = 0; i < n; i++) { 2854848b8605Smrg GLfloat value = s[i]; 2855848b8605Smrg SWAP4BYTE(value); 2856848b8605Smrg indexes[i] = (GLuint) value; 2857848b8605Smrg } 2858848b8605Smrg } 2859848b8605Smrg else { 2860848b8605Smrg for (i = 0; i < n; i++) 2861848b8605Smrg indexes[i] = (GLuint) s[i]; 2862848b8605Smrg } 2863848b8605Smrg } 2864848b8605Smrg break; 2865848b8605Smrg case GL_HALF_FLOAT_ARB: 2866848b8605Smrg { 2867848b8605Smrg GLuint i; 2868848b8605Smrg const GLhalfARB *s = (const GLhalfARB *) src; 2869848b8605Smrg if (unpack->SwapBytes) { 2870848b8605Smrg for (i = 0; i < n; i++) { 2871848b8605Smrg GLhalfARB value = s[i]; 2872848b8605Smrg SWAP2BYTE(value); 2873848b8605Smrg indexes[i] = (GLuint) _mesa_half_to_float(value); 2874848b8605Smrg } 2875848b8605Smrg } 2876848b8605Smrg else { 2877848b8605Smrg for (i = 0; i < n; i++) 2878848b8605Smrg indexes[i] = (GLuint) _mesa_half_to_float(s[i]); 2879848b8605Smrg } 2880848b8605Smrg } 2881848b8605Smrg break; 2882848b8605Smrg case GL_UNSIGNED_INT_24_8_EXT: 2883848b8605Smrg { 2884848b8605Smrg GLuint i; 2885848b8605Smrg const GLuint *s = (const GLuint *) src; 2886848b8605Smrg if (unpack->SwapBytes) { 2887848b8605Smrg for (i = 0; i < n; i++) { 2888848b8605Smrg GLuint value = s[i]; 2889848b8605Smrg SWAP4BYTE(value); 2890848b8605Smrg indexes[i] = value & 0xff; /* lower 8 bits */ 2891848b8605Smrg } 2892848b8605Smrg } 2893848b8605Smrg else { 2894848b8605Smrg for (i = 0; i < n; i++) 2895848b8605Smrg indexes[i] = s[i] & 0xff; /* lower 8 bits */ 2896848b8605Smrg } 2897848b8605Smrg } 2898848b8605Smrg break; 2899848b8605Smrg case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 2900848b8605Smrg { 2901848b8605Smrg GLuint i; 2902848b8605Smrg const GLuint *s = (const GLuint *) src; 2903848b8605Smrg if (unpack->SwapBytes) { 2904848b8605Smrg for (i = 0; i < n; i++) { 2905848b8605Smrg GLuint value = s[i*2+1]; 2906848b8605Smrg SWAP4BYTE(value); 2907848b8605Smrg indexes[i] = value & 0xff; /* lower 8 bits */ 2908848b8605Smrg } 2909848b8605Smrg } 2910848b8605Smrg else { 2911848b8605Smrg for (i = 0; i < n; i++) 2912848b8605Smrg indexes[i] = s[i*2+1] & 0xff; /* lower 8 bits */ 2913848b8605Smrg } 2914848b8605Smrg } 2915848b8605Smrg break; 2916848b8605Smrg 2917848b8605Smrg default: 2918848b8605Smrg _mesa_problem(NULL, "bad srcType in extract_uint_indexes"); 2919848b8605Smrg return; 2920848b8605Smrg } 2921848b8605Smrg} 2922848b8605Smrg 2923848b8605Smrg 2924848b8605Smrg/** 2925848b8605Smrg * Return source/dest RGBA indexes for unpacking pixels. 2926848b8605Smrg */ 2927848b8605Smrgstatic void 2928848b8605Smrgget_component_mapping(GLenum format, 2929848b8605Smrg GLint *rSrc, 2930848b8605Smrg GLint *gSrc, 2931848b8605Smrg GLint *bSrc, 2932848b8605Smrg GLint *aSrc, 2933848b8605Smrg GLint *rDst, 2934848b8605Smrg GLint *gDst, 2935848b8605Smrg GLint *bDst, 2936848b8605Smrg GLint *aDst) 2937848b8605Smrg{ 2938848b8605Smrg switch (format) { 2939848b8605Smrg case GL_RED: 2940848b8605Smrg case GL_RED_INTEGER_EXT: 2941848b8605Smrg *rSrc = 0; 2942848b8605Smrg *gSrc = *bSrc = *aSrc = -1; 2943848b8605Smrg break; 2944848b8605Smrg case GL_GREEN: 2945848b8605Smrg case GL_GREEN_INTEGER_EXT: 2946848b8605Smrg *gSrc = 0; 2947848b8605Smrg *rSrc = *bSrc = *aSrc = -1; 2948848b8605Smrg break; 2949848b8605Smrg case GL_BLUE: 2950848b8605Smrg case GL_BLUE_INTEGER_EXT: 2951848b8605Smrg *bSrc = 0; 2952848b8605Smrg *rSrc = *gSrc = *aSrc = -1; 2953848b8605Smrg break; 2954848b8605Smrg case GL_ALPHA: 2955848b8605Smrg case GL_ALPHA_INTEGER_EXT: 2956848b8605Smrg *rSrc = *gSrc = *bSrc = -1; 2957848b8605Smrg *aSrc = 0; 2958848b8605Smrg break; 2959848b8605Smrg case GL_LUMINANCE: 2960848b8605Smrg case GL_LUMINANCE_INTEGER_EXT: 2961848b8605Smrg *rSrc = *gSrc = *bSrc = 0; 2962848b8605Smrg *aSrc = -1; 2963848b8605Smrg break; 2964848b8605Smrg case GL_LUMINANCE_ALPHA: 2965848b8605Smrg case GL_LUMINANCE_ALPHA_INTEGER_EXT: 2966848b8605Smrg *rSrc = *gSrc = *bSrc = 0; 2967848b8605Smrg *aSrc = 1; 2968848b8605Smrg break; 2969848b8605Smrg case GL_INTENSITY: 2970848b8605Smrg *rSrc = *gSrc = *bSrc = *aSrc = 0; 2971848b8605Smrg break; 2972848b8605Smrg case GL_RG: 2973848b8605Smrg case GL_RG_INTEGER: 2974848b8605Smrg *rSrc = 0; 2975848b8605Smrg *gSrc = 1; 2976848b8605Smrg *bSrc = -1; 2977848b8605Smrg *aSrc = -1; 2978848b8605Smrg *rDst = 0; 2979848b8605Smrg *gDst = 1; 2980848b8605Smrg *bDst = 2; 2981848b8605Smrg *aDst = 3; 2982848b8605Smrg break; 2983848b8605Smrg case GL_RGB: 2984848b8605Smrg case GL_RGB_INTEGER: 2985848b8605Smrg *rSrc = 0; 2986848b8605Smrg *gSrc = 1; 2987848b8605Smrg *bSrc = 2; 2988848b8605Smrg *aSrc = -1; 2989848b8605Smrg *rDst = 0; 2990848b8605Smrg *gDst = 1; 2991848b8605Smrg *bDst = 2; 2992848b8605Smrg *aDst = 3; 2993848b8605Smrg break; 2994848b8605Smrg case GL_BGR: 2995848b8605Smrg case GL_BGR_INTEGER: 2996848b8605Smrg *rSrc = 2; 2997848b8605Smrg *gSrc = 1; 2998848b8605Smrg *bSrc = 0; 2999848b8605Smrg *aSrc = -1; 3000848b8605Smrg *rDst = 2; 3001848b8605Smrg *gDst = 1; 3002848b8605Smrg *bDst = 0; 3003848b8605Smrg *aDst = 3; 3004848b8605Smrg break; 3005848b8605Smrg case GL_RGBA: 3006848b8605Smrg case GL_RGBA_INTEGER: 3007848b8605Smrg *rSrc = 0; 3008848b8605Smrg *gSrc = 1; 3009848b8605Smrg *bSrc = 2; 3010848b8605Smrg *aSrc = 3; 3011848b8605Smrg *rDst = 0; 3012848b8605Smrg *gDst = 1; 3013848b8605Smrg *bDst = 2; 3014848b8605Smrg *aDst = 3; 3015848b8605Smrg break; 3016848b8605Smrg case GL_BGRA: 3017848b8605Smrg case GL_BGRA_INTEGER: 3018848b8605Smrg *rSrc = 2; 3019848b8605Smrg *gSrc = 1; 3020848b8605Smrg *bSrc = 0; 3021848b8605Smrg *aSrc = 3; 3022848b8605Smrg *rDst = 2; 3023848b8605Smrg *gDst = 1; 3024848b8605Smrg *bDst = 0; 3025848b8605Smrg *aDst = 3; 3026848b8605Smrg break; 3027848b8605Smrg case GL_ABGR_EXT: 3028848b8605Smrg *rSrc = 3; 3029848b8605Smrg *gSrc = 2; 3030848b8605Smrg *bSrc = 1; 3031848b8605Smrg *aSrc = 0; 3032848b8605Smrg *rDst = 3; 3033848b8605Smrg *gDst = 2; 3034848b8605Smrg *bDst = 1; 3035848b8605Smrg *aDst = 0; 3036848b8605Smrg break; 3037848b8605Smrg default: 3038848b8605Smrg _mesa_problem(NULL, "bad srcFormat %s in get_component_mapping", 3039848b8605Smrg _mesa_lookup_enum_by_nr(format)); 3040848b8605Smrg return; 3041848b8605Smrg } 3042848b8605Smrg} 3043848b8605Smrg 3044848b8605Smrg 3045848b8605Smrg 3046848b8605Smrg/* 3047848b8605Smrg * This function extracts floating point RGBA values from arbitrary 3048848b8605Smrg * image data. srcFormat and srcType are the format and type parameters 3049848b8605Smrg * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc. 3050848b8605Smrg * 3051848b8605Smrg * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function 3052848b8605Smrg * implements the "Conversion to floating point", "Conversion to RGB", 3053848b8605Smrg * and "Final Expansion to RGBA" operations. 3054848b8605Smrg * 3055848b8605Smrg * Args: n - number of pixels 3056848b8605Smrg * rgba - output colors 3057848b8605Smrg * srcFormat - format of incoming data 3058848b8605Smrg * srcType - data type of incoming data 3059848b8605Smrg * src - source data pointer 3060848b8605Smrg * swapBytes - perform byteswapping of incoming data? 3061848b8605Smrg */ 3062848b8605Smrgstatic void 3063848b8605Smrgextract_float_rgba(GLuint n, GLfloat rgba[][4], 3064848b8605Smrg GLenum srcFormat, GLenum srcType, const GLvoid *src, 3065848b8605Smrg GLboolean swapBytes) 3066848b8605Smrg{ 3067848b8605Smrg GLint rSrc, gSrc, bSrc, aSrc; 3068848b8605Smrg GLint stride; 3069848b8605Smrg GLint rDst, bDst, gDst, aDst; 3070848b8605Smrg GLboolean intFormat; 3071848b8605Smrg GLfloat rs = 1.0f, gs = 1.0f, bs = 1.0f, as = 1.0f; /* scale factors */ 3072848b8605Smrg 3073848b8605Smrg ASSERT(srcFormat == GL_RED || 3074848b8605Smrg srcFormat == GL_GREEN || 3075848b8605Smrg srcFormat == GL_BLUE || 3076848b8605Smrg srcFormat == GL_ALPHA || 3077848b8605Smrg srcFormat == GL_LUMINANCE || 3078848b8605Smrg srcFormat == GL_LUMINANCE_ALPHA || 3079848b8605Smrg srcFormat == GL_INTENSITY || 3080848b8605Smrg srcFormat == GL_RG || 3081848b8605Smrg srcFormat == GL_RGB || 3082848b8605Smrg srcFormat == GL_BGR || 3083848b8605Smrg srcFormat == GL_RGBA || 3084848b8605Smrg srcFormat == GL_BGRA || 3085848b8605Smrg srcFormat == GL_ABGR_EXT || 3086848b8605Smrg srcFormat == GL_RED_INTEGER_EXT || 3087848b8605Smrg srcFormat == GL_GREEN_INTEGER_EXT || 3088848b8605Smrg srcFormat == GL_BLUE_INTEGER_EXT || 3089848b8605Smrg srcFormat == GL_ALPHA_INTEGER_EXT || 3090848b8605Smrg srcFormat == GL_RG_INTEGER || 3091848b8605Smrg srcFormat == GL_RGB_INTEGER_EXT || 3092848b8605Smrg srcFormat == GL_RGBA_INTEGER_EXT || 3093848b8605Smrg srcFormat == GL_BGR_INTEGER_EXT || 3094848b8605Smrg srcFormat == GL_BGRA_INTEGER_EXT || 3095848b8605Smrg srcFormat == GL_LUMINANCE_INTEGER_EXT || 3096848b8605Smrg srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT); 3097848b8605Smrg 3098848b8605Smrg ASSERT(srcType == GL_UNSIGNED_BYTE || 3099848b8605Smrg srcType == GL_BYTE || 3100848b8605Smrg srcType == GL_UNSIGNED_SHORT || 3101848b8605Smrg srcType == GL_SHORT || 3102848b8605Smrg srcType == GL_UNSIGNED_INT || 3103848b8605Smrg srcType == GL_INT || 3104848b8605Smrg srcType == GL_HALF_FLOAT_ARB || 3105848b8605Smrg srcType == GL_FLOAT || 3106848b8605Smrg srcType == GL_UNSIGNED_BYTE_3_3_2 || 3107848b8605Smrg srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 3108848b8605Smrg srcType == GL_UNSIGNED_SHORT_5_6_5 || 3109848b8605Smrg srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 3110848b8605Smrg srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 3111848b8605Smrg srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 3112848b8605Smrg srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 3113848b8605Smrg srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 3114848b8605Smrg srcType == GL_UNSIGNED_INT_8_8_8_8 || 3115848b8605Smrg srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 3116848b8605Smrg srcType == GL_UNSIGNED_INT_10_10_10_2 || 3117848b8605Smrg srcType == GL_UNSIGNED_INT_2_10_10_10_REV || 3118848b8605Smrg srcType == GL_UNSIGNED_INT_5_9_9_9_REV || 3119848b8605Smrg srcType == GL_UNSIGNED_INT_10F_11F_11F_REV); 3120848b8605Smrg 3121848b8605Smrg get_component_mapping(srcFormat, 3122848b8605Smrg &rSrc, &gSrc, &bSrc, &aSrc, 3123848b8605Smrg &rDst, &gDst, &bDst, &aDst); 3124848b8605Smrg 3125848b8605Smrg stride = _mesa_components_in_format(srcFormat); 3126848b8605Smrg 3127848b8605Smrg intFormat = _mesa_is_enum_format_integer(srcFormat); 3128848b8605Smrg 3129848b8605Smrg#define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT_FLT, DEFAULT_INT, TYPE, CONVERSION) \ 3130848b8605Smrg if ((SRC_INDEX) < 0) { \ 3131848b8605Smrg GLuint i; \ 3132848b8605Smrg if (intFormat) { \ 3133848b8605Smrg for (i = 0; i < n; i++) { \ 3134848b8605Smrg rgba[i][DST_INDEX] = DEFAULT_INT; \ 3135848b8605Smrg } \ 3136848b8605Smrg } \ 3137848b8605Smrg else { \ 3138848b8605Smrg for (i = 0; i < n; i++) { \ 3139848b8605Smrg rgba[i][DST_INDEX] = DEFAULT_FLT; \ 3140848b8605Smrg } \ 3141848b8605Smrg } \ 3142848b8605Smrg } \ 3143848b8605Smrg else if (swapBytes) { \ 3144848b8605Smrg const TYPE *s = (const TYPE *) src; \ 3145848b8605Smrg GLuint i; \ 3146848b8605Smrg for (i = 0; i < n; i++) { \ 3147848b8605Smrg TYPE value = s[SRC_INDEX]; \ 3148848b8605Smrg if (sizeof(TYPE) == 2) { \ 3149848b8605Smrg SWAP2BYTE(value); \ 3150848b8605Smrg } \ 3151848b8605Smrg else if (sizeof(TYPE) == 4) { \ 3152848b8605Smrg SWAP4BYTE(value); \ 3153848b8605Smrg } \ 3154848b8605Smrg if (intFormat) \ 3155848b8605Smrg rgba[i][DST_INDEX] = (GLfloat) value; \ 3156848b8605Smrg else \ 3157848b8605Smrg rgba[i][DST_INDEX] = (GLfloat) CONVERSION(value); \ 3158848b8605Smrg s += stride; \ 3159848b8605Smrg } \ 3160848b8605Smrg } \ 3161848b8605Smrg else { \ 3162848b8605Smrg const TYPE *s = (const TYPE *) src; \ 3163848b8605Smrg GLuint i; \ 3164848b8605Smrg if (intFormat) { \ 3165848b8605Smrg for (i = 0; i < n; i++) { \ 3166848b8605Smrg rgba[i][DST_INDEX] = (GLfloat) s[SRC_INDEX]; \ 3167848b8605Smrg s += stride; \ 3168848b8605Smrg } \ 3169848b8605Smrg } \ 3170848b8605Smrg else { \ 3171848b8605Smrg for (i = 0; i < n; i++) { \ 3172848b8605Smrg rgba[i][DST_INDEX] = (GLfloat) CONVERSION(s[SRC_INDEX]); \ 3173848b8605Smrg s += stride; \ 3174848b8605Smrg } \ 3175848b8605Smrg } \ 3176848b8605Smrg } 3177848b8605Smrg 3178848b8605Smrg switch (srcType) { 3179848b8605Smrg case GL_UNSIGNED_BYTE: 3180848b8605Smrg PROCESS(rSrc, RCOMP, 0.0F, 0, GLubyte, UBYTE_TO_FLOAT); 3181848b8605Smrg PROCESS(gSrc, GCOMP, 0.0F, 0, GLubyte, UBYTE_TO_FLOAT); 3182848b8605Smrg PROCESS(bSrc, BCOMP, 0.0F, 0, GLubyte, UBYTE_TO_FLOAT); 3183848b8605Smrg PROCESS(aSrc, ACOMP, 1.0F, 255, GLubyte, UBYTE_TO_FLOAT); 3184848b8605Smrg break; 3185848b8605Smrg case GL_BYTE: 3186848b8605Smrg PROCESS(rSrc, RCOMP, 0.0F, 0, GLbyte, BYTE_TO_FLOAT_TEX); 3187848b8605Smrg PROCESS(gSrc, GCOMP, 0.0F, 0, GLbyte, BYTE_TO_FLOAT_TEX); 3188848b8605Smrg PROCESS(bSrc, BCOMP, 0.0F, 0, GLbyte, BYTE_TO_FLOAT_TEX); 3189848b8605Smrg PROCESS(aSrc, ACOMP, 1.0F, 127, GLbyte, BYTE_TO_FLOAT_TEX); 3190848b8605Smrg break; 3191848b8605Smrg case GL_UNSIGNED_SHORT: 3192848b8605Smrg PROCESS(rSrc, RCOMP, 0.0F, 0, GLushort, USHORT_TO_FLOAT); 3193848b8605Smrg PROCESS(gSrc, GCOMP, 0.0F, 0, GLushort, USHORT_TO_FLOAT); 3194848b8605Smrg PROCESS(bSrc, BCOMP, 0.0F, 0, GLushort, USHORT_TO_FLOAT); 3195848b8605Smrg PROCESS(aSrc, ACOMP, 1.0F, 0xffff, GLushort, USHORT_TO_FLOAT); 3196848b8605Smrg break; 3197848b8605Smrg case GL_SHORT: 3198848b8605Smrg PROCESS(rSrc, RCOMP, 0.0F, 0, GLshort, SHORT_TO_FLOAT_TEX); 3199848b8605Smrg PROCESS(gSrc, GCOMP, 0.0F, 0, GLshort, SHORT_TO_FLOAT_TEX); 3200848b8605Smrg PROCESS(bSrc, BCOMP, 0.0F, 0, GLshort, SHORT_TO_FLOAT_TEX); 3201848b8605Smrg PROCESS(aSrc, ACOMP, 1.0F, 32767, GLshort, SHORT_TO_FLOAT_TEX); 3202848b8605Smrg break; 3203848b8605Smrg case GL_UNSIGNED_INT: 3204848b8605Smrg PROCESS(rSrc, RCOMP, 0.0F, 0, GLuint, UINT_TO_FLOAT); 3205848b8605Smrg PROCESS(gSrc, GCOMP, 0.0F, 0, GLuint, UINT_TO_FLOAT); 3206848b8605Smrg PROCESS(bSrc, BCOMP, 0.0F, 0, GLuint, UINT_TO_FLOAT); 3207848b8605Smrg PROCESS(aSrc, ACOMP, 1.0F, 0xffffffff, GLuint, UINT_TO_FLOAT); 3208848b8605Smrg break; 3209848b8605Smrg case GL_INT: 3210848b8605Smrg PROCESS(rSrc, RCOMP, 0.0F, 0, GLint, INT_TO_FLOAT); 3211848b8605Smrg PROCESS(gSrc, GCOMP, 0.0F, 0, GLint, INT_TO_FLOAT); 3212848b8605Smrg PROCESS(bSrc, BCOMP, 0.0F, 0, GLint, INT_TO_FLOAT); 3213848b8605Smrg PROCESS(aSrc, ACOMP, 1.0F, 2147483647, GLint, INT_TO_FLOAT); 3214848b8605Smrg break; 3215848b8605Smrg case GL_FLOAT: 3216848b8605Smrg PROCESS(rSrc, RCOMP, 0.0F, 0.0F, GLfloat, (GLfloat)); 3217848b8605Smrg PROCESS(gSrc, GCOMP, 0.0F, 0.0F, GLfloat, (GLfloat)); 3218848b8605Smrg PROCESS(bSrc, BCOMP, 0.0F, 0.0F, GLfloat, (GLfloat)); 3219848b8605Smrg PROCESS(aSrc, ACOMP, 1.0F, 1.0F, GLfloat, (GLfloat)); 3220848b8605Smrg break; 3221848b8605Smrg case GL_HALF_FLOAT_ARB: 3222848b8605Smrg PROCESS(rSrc, RCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float); 3223848b8605Smrg PROCESS(gSrc, GCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float); 3224848b8605Smrg PROCESS(bSrc, BCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float); 3225848b8605Smrg PROCESS(aSrc, ACOMP, 1.0F, 1.0F, GLhalfARB, _mesa_half_to_float); 3226848b8605Smrg break; 3227848b8605Smrg case GL_UNSIGNED_BYTE_3_3_2: 3228848b8605Smrg { 3229848b8605Smrg const GLubyte *ubsrc = (const GLubyte *) src; 3230848b8605Smrg GLuint i; 3231848b8605Smrg if (!intFormat) { 3232848b8605Smrg rs = 1.0F / 7.0F; 3233848b8605Smrg gs = 1.0F / 7.0F; 3234848b8605Smrg bs = 1.0F / 3.0F; 3235848b8605Smrg } 3236848b8605Smrg for (i = 0; i < n; i ++) { 3237848b8605Smrg GLubyte p = ubsrc[i]; 3238848b8605Smrg rgba[i][rDst] = ((p >> 5) ) * rs; 3239848b8605Smrg rgba[i][gDst] = ((p >> 2) & 0x7) * gs; 3240848b8605Smrg rgba[i][bDst] = ((p ) & 0x3) * bs; 3241848b8605Smrg rgba[i][aDst] = 1.0F; 3242848b8605Smrg } 3243848b8605Smrg } 3244848b8605Smrg break; 3245848b8605Smrg case GL_UNSIGNED_BYTE_2_3_3_REV: 3246848b8605Smrg { 3247848b8605Smrg const GLubyte *ubsrc = (const GLubyte *) src; 3248848b8605Smrg GLuint i; 3249848b8605Smrg if (!intFormat) { 3250848b8605Smrg rs = 1.0F / 7.0F; 3251848b8605Smrg gs = 1.0F / 7.0F; 3252848b8605Smrg bs = 1.0F / 3.0F; 3253848b8605Smrg } 3254848b8605Smrg for (i = 0; i < n; i ++) { 3255848b8605Smrg GLubyte p = ubsrc[i]; 3256848b8605Smrg rgba[i][rDst] = ((p ) & 0x7) * rs; 3257848b8605Smrg rgba[i][gDst] = ((p >> 3) & 0x7) * gs; 3258848b8605Smrg rgba[i][bDst] = ((p >> 6) ) * bs; 3259848b8605Smrg rgba[i][aDst] = 1.0F; 3260848b8605Smrg } 3261848b8605Smrg } 3262848b8605Smrg break; 3263848b8605Smrg case GL_UNSIGNED_SHORT_5_6_5: 3264848b8605Smrg if (!intFormat) { 3265848b8605Smrg rs = 1.0F / 31.0F; 3266848b8605Smrg gs = 1.0F / 63.0F; 3267848b8605Smrg bs = 1.0F / 31.0F; 3268848b8605Smrg } 3269848b8605Smrg if (swapBytes) { 3270848b8605Smrg const GLushort *ussrc = (const GLushort *) src; 3271848b8605Smrg GLuint i; 3272848b8605Smrg for (i = 0; i < n; i ++) { 3273848b8605Smrg GLushort p = ussrc[i]; 3274848b8605Smrg SWAP2BYTE(p); 3275848b8605Smrg rgba[i][rDst] = ((p >> 11) ) * rs; 3276848b8605Smrg rgba[i][gDst] = ((p >> 5) & 0x3f) * gs; 3277848b8605Smrg rgba[i][bDst] = ((p ) & 0x1f) * bs; 3278848b8605Smrg rgba[i][aDst] = 1.0F; 3279848b8605Smrg } 3280848b8605Smrg } 3281848b8605Smrg else { 3282848b8605Smrg const GLushort *ussrc = (const GLushort *) src; 3283848b8605Smrg GLuint i; 3284848b8605Smrg for (i = 0; i < n; i ++) { 3285848b8605Smrg GLushort p = ussrc[i]; 3286848b8605Smrg rgba[i][rDst] = ((p >> 11) ) * rs; 3287848b8605Smrg rgba[i][gDst] = ((p >> 5) & 0x3f) * gs; 3288848b8605Smrg rgba[i][bDst] = ((p ) & 0x1f) * bs; 3289848b8605Smrg rgba[i][aDst] = 1.0F; 3290848b8605Smrg } 3291848b8605Smrg } 3292848b8605Smrg break; 3293848b8605Smrg case GL_UNSIGNED_SHORT_5_6_5_REV: 3294848b8605Smrg if (!intFormat) { 3295848b8605Smrg rs = 1.0F / 31.0F; 3296848b8605Smrg gs = 1.0F / 63.0F; 3297848b8605Smrg bs = 1.0F / 31.0F; 3298848b8605Smrg } 3299848b8605Smrg if (swapBytes) { 3300848b8605Smrg const GLushort *ussrc = (const GLushort *) src; 3301848b8605Smrg GLuint i; 3302848b8605Smrg for (i = 0; i < n; i ++) { 3303848b8605Smrg GLushort p = ussrc[i]; 3304848b8605Smrg SWAP2BYTE(p); 3305848b8605Smrg rgba[i][rDst] = ((p ) & 0x1f) * rs; 3306848b8605Smrg rgba[i][gDst] = ((p >> 5) & 0x3f) * gs; 3307848b8605Smrg rgba[i][bDst] = ((p >> 11) ) * bs; 3308848b8605Smrg rgba[i][aDst] = 1.0F; 3309848b8605Smrg } 3310848b8605Smrg } 3311848b8605Smrg else { 3312848b8605Smrg const GLushort *ussrc = (const GLushort *) src; 3313848b8605Smrg GLuint i; 3314848b8605Smrg for (i = 0; i < n; i ++) { 3315848b8605Smrg GLushort p = ussrc[i]; 3316848b8605Smrg rgba[i][rDst] = ((p ) & 0x1f) * rs; 3317848b8605Smrg rgba[i][gDst] = ((p >> 5) & 0x3f) * gs; 3318848b8605Smrg rgba[i][bDst] = ((p >> 11) ) * bs; 3319848b8605Smrg rgba[i][aDst] = 1.0F; 3320848b8605Smrg } 3321848b8605Smrg } 3322848b8605Smrg break; 3323848b8605Smrg case GL_UNSIGNED_SHORT_4_4_4_4: 3324848b8605Smrg if (!intFormat) { 3325848b8605Smrg rs = gs = bs = as = 1.0F / 15.0F; 3326848b8605Smrg } 3327848b8605Smrg if (swapBytes) { 3328848b8605Smrg const GLushort *ussrc = (const GLushort *) src; 3329848b8605Smrg GLuint i; 3330848b8605Smrg for (i = 0; i < n; i ++) { 3331848b8605Smrg GLushort p = ussrc[i]; 3332848b8605Smrg SWAP2BYTE(p); 3333848b8605Smrg rgba[i][rDst] = ((p >> 12) ) * rs; 3334848b8605Smrg rgba[i][gDst] = ((p >> 8) & 0xf) * gs; 3335848b8605Smrg rgba[i][bDst] = ((p >> 4) & 0xf) * bs; 3336848b8605Smrg rgba[i][aDst] = ((p ) & 0xf) * as; 3337848b8605Smrg } 3338848b8605Smrg } 3339848b8605Smrg else { 3340848b8605Smrg const GLushort *ussrc = (const GLushort *) src; 3341848b8605Smrg GLuint i; 3342848b8605Smrg for (i = 0; i < n; i ++) { 3343848b8605Smrg GLushort p = ussrc[i]; 3344848b8605Smrg rgba[i][rDst] = ((p >> 12) ) * rs; 3345848b8605Smrg rgba[i][gDst] = ((p >> 8) & 0xf) * gs; 3346848b8605Smrg rgba[i][bDst] = ((p >> 4) & 0xf) * bs; 3347848b8605Smrg rgba[i][aDst] = ((p ) & 0xf) * as; 3348848b8605Smrg } 3349848b8605Smrg } 3350848b8605Smrg break; 3351848b8605Smrg case GL_UNSIGNED_SHORT_4_4_4_4_REV: 3352848b8605Smrg if (!intFormat) { 3353848b8605Smrg rs = gs = bs = as = 1.0F / 15.0F; 3354848b8605Smrg } 3355848b8605Smrg if (swapBytes) { 3356848b8605Smrg const GLushort *ussrc = (const GLushort *) src; 3357848b8605Smrg GLuint i; 3358848b8605Smrg for (i = 0; i < n; i ++) { 3359848b8605Smrg GLushort p = ussrc[i]; 3360848b8605Smrg SWAP2BYTE(p); 3361848b8605Smrg rgba[i][rDst] = ((p ) & 0xf) * rs; 3362848b8605Smrg rgba[i][gDst] = ((p >> 4) & 0xf) * gs; 3363848b8605Smrg rgba[i][bDst] = ((p >> 8) & 0xf) * bs; 3364848b8605Smrg rgba[i][aDst] = ((p >> 12) ) * as; 3365848b8605Smrg } 3366848b8605Smrg } 3367848b8605Smrg else { 3368848b8605Smrg const GLushort *ussrc = (const GLushort *) src; 3369848b8605Smrg GLuint i; 3370848b8605Smrg for (i = 0; i < n; i ++) { 3371848b8605Smrg GLushort p = ussrc[i]; 3372848b8605Smrg rgba[i][rDst] = ((p ) & 0xf) * rs; 3373848b8605Smrg rgba[i][gDst] = ((p >> 4) & 0xf) * gs; 3374848b8605Smrg rgba[i][bDst] = ((p >> 8) & 0xf) * bs; 3375848b8605Smrg rgba[i][aDst] = ((p >> 12) ) * as; 3376848b8605Smrg } 3377848b8605Smrg } 3378848b8605Smrg break; 3379848b8605Smrg case GL_UNSIGNED_SHORT_5_5_5_1: 3380848b8605Smrg if (!intFormat) { 3381848b8605Smrg rs = gs = bs = 1.0F / 31.0F; 3382848b8605Smrg } 3383848b8605Smrg if (swapBytes) { 3384848b8605Smrg const GLushort *ussrc = (const GLushort *) src; 3385848b8605Smrg GLuint i; 3386848b8605Smrg for (i = 0; i < n; i ++) { 3387848b8605Smrg GLushort p = ussrc[i]; 3388848b8605Smrg SWAP2BYTE(p); 3389848b8605Smrg rgba[i][rDst] = ((p >> 11) ) * rs; 3390848b8605Smrg rgba[i][gDst] = ((p >> 6) & 0x1f) * gs; 3391848b8605Smrg rgba[i][bDst] = ((p >> 1) & 0x1f) * bs; 3392848b8605Smrg rgba[i][aDst] = ((p ) & 0x1) * as; 3393848b8605Smrg } 3394848b8605Smrg } 3395848b8605Smrg else { 3396848b8605Smrg const GLushort *ussrc = (const GLushort *) src; 3397848b8605Smrg GLuint i; 3398848b8605Smrg for (i = 0; i < n; i ++) { 3399848b8605Smrg GLushort p = ussrc[i]; 3400848b8605Smrg rgba[i][rDst] = ((p >> 11) ) * rs; 3401848b8605Smrg rgba[i][gDst] = ((p >> 6) & 0x1f) * gs; 3402848b8605Smrg rgba[i][bDst] = ((p >> 1) & 0x1f) * bs; 3403848b8605Smrg rgba[i][aDst] = ((p ) & 0x1) * as; 3404848b8605Smrg } 3405848b8605Smrg } 3406848b8605Smrg break; 3407848b8605Smrg case GL_UNSIGNED_SHORT_1_5_5_5_REV: 3408848b8605Smrg if (!intFormat) { 3409848b8605Smrg rs = gs = bs = 1.0F / 31.0F; 3410848b8605Smrg } 3411848b8605Smrg if (swapBytes) { 3412848b8605Smrg const GLushort *ussrc = (const GLushort *) src; 3413848b8605Smrg GLuint i; 3414848b8605Smrg for (i = 0; i < n; i ++) { 3415848b8605Smrg GLushort p = ussrc[i]; 3416848b8605Smrg SWAP2BYTE(p); 3417848b8605Smrg rgba[i][rDst] = ((p ) & 0x1f) * rs; 3418848b8605Smrg rgba[i][gDst] = ((p >> 5) & 0x1f) * gs; 3419848b8605Smrg rgba[i][bDst] = ((p >> 10) & 0x1f) * bs; 3420848b8605Smrg rgba[i][aDst] = ((p >> 15) ) * as; 3421848b8605Smrg } 3422848b8605Smrg } 3423848b8605Smrg else { 3424848b8605Smrg const GLushort *ussrc = (const GLushort *) src; 3425848b8605Smrg GLuint i; 3426848b8605Smrg for (i = 0; i < n; i ++) { 3427848b8605Smrg GLushort p = ussrc[i]; 3428848b8605Smrg rgba[i][rDst] = ((p ) & 0x1f) * rs; 3429848b8605Smrg rgba[i][gDst] = ((p >> 5) & 0x1f) * gs; 3430848b8605Smrg rgba[i][bDst] = ((p >> 10) & 0x1f) * bs; 3431848b8605Smrg rgba[i][aDst] = ((p >> 15) ) * as; 3432848b8605Smrg } 3433848b8605Smrg } 3434848b8605Smrg break; 3435848b8605Smrg case GL_UNSIGNED_INT_8_8_8_8: 3436848b8605Smrg if (swapBytes) { 3437848b8605Smrg const GLuint *uisrc = (const GLuint *) src; 3438848b8605Smrg GLuint i; 3439848b8605Smrg if (intFormat) { 3440848b8605Smrg for (i = 0; i < n; i ++) { 3441848b8605Smrg GLuint p = uisrc[i]; 3442848b8605Smrg rgba[i][rDst] = (GLfloat) ((p ) & 0xff); 3443848b8605Smrg rgba[i][gDst] = (GLfloat) ((p >> 8) & 0xff); 3444848b8605Smrg rgba[i][bDst] = (GLfloat) ((p >> 16) & 0xff); 3445848b8605Smrg rgba[i][aDst] = (GLfloat) ((p >> 24) ); 3446848b8605Smrg } 3447848b8605Smrg } 3448848b8605Smrg else { 3449848b8605Smrg for (i = 0; i < n; i ++) { 3450848b8605Smrg GLuint p = uisrc[i]; 3451848b8605Smrg rgba[i][rDst] = UBYTE_TO_FLOAT((p ) & 0xff); 3452848b8605Smrg rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 3453848b8605Smrg rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 3454848b8605Smrg rgba[i][aDst] = UBYTE_TO_FLOAT((p >> 24) ); 3455848b8605Smrg } 3456848b8605Smrg } 3457848b8605Smrg } 3458848b8605Smrg else { 3459848b8605Smrg const GLuint *uisrc = (const GLuint *) src; 3460848b8605Smrg GLuint i; 3461848b8605Smrg if (intFormat) { 3462848b8605Smrg for (i = 0; i < n; i ++) { 3463848b8605Smrg GLuint p = uisrc[i]; 3464848b8605Smrg rgba[i][rDst] = (GLfloat) ((p >> 24) ); 3465848b8605Smrg rgba[i][gDst] = (GLfloat) ((p >> 16) & 0xff); 3466848b8605Smrg rgba[i][bDst] = (GLfloat) ((p >> 8) & 0xff); 3467848b8605Smrg rgba[i][aDst] = (GLfloat) ((p ) & 0xff); 3468848b8605Smrg } 3469848b8605Smrg } 3470848b8605Smrg else { 3471848b8605Smrg for (i = 0; i < n; i ++) { 3472848b8605Smrg GLuint p = uisrc[i]; 3473848b8605Smrg rgba[i][rDst] = UBYTE_TO_FLOAT((p >> 24) ); 3474848b8605Smrg rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 3475848b8605Smrg rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 3476848b8605Smrg rgba[i][aDst] = UBYTE_TO_FLOAT((p ) & 0xff); 3477848b8605Smrg } 3478848b8605Smrg } 3479848b8605Smrg } 3480848b8605Smrg break; 3481848b8605Smrg case GL_UNSIGNED_INT_8_8_8_8_REV: 3482848b8605Smrg if (swapBytes) { 3483848b8605Smrg const GLuint *uisrc = (const GLuint *) src; 3484848b8605Smrg GLuint i; 3485848b8605Smrg if (intFormat) { 3486848b8605Smrg for (i = 0; i < n; i ++) { 3487848b8605Smrg GLuint p = uisrc[i]; 3488848b8605Smrg rgba[i][rDst] = (GLfloat) ((p >> 24) ); 3489848b8605Smrg rgba[i][gDst] = (GLfloat) ((p >> 16) & 0xff); 3490848b8605Smrg rgba[i][bDst] = (GLfloat) ((p >> 8) & 0xff); 3491848b8605Smrg rgba[i][aDst] = (GLfloat) ((p ) & 0xff); 3492848b8605Smrg } 3493848b8605Smrg } 3494848b8605Smrg else { 3495848b8605Smrg for (i = 0; i < n; i ++) { 3496848b8605Smrg GLuint p = uisrc[i]; 3497848b8605Smrg rgba[i][rDst] = UBYTE_TO_FLOAT((p >> 24) ); 3498848b8605Smrg rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 3499848b8605Smrg rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 3500848b8605Smrg rgba[i][aDst] = UBYTE_TO_FLOAT((p ) & 0xff); 3501848b8605Smrg } 3502848b8605Smrg } 3503848b8605Smrg } 3504848b8605Smrg else { 3505848b8605Smrg const GLuint *uisrc = (const GLuint *) src; 3506848b8605Smrg GLuint i; 3507848b8605Smrg if (intFormat) { 3508848b8605Smrg for (i = 0; i < n; i ++) { 3509848b8605Smrg GLuint p = uisrc[i]; 3510848b8605Smrg rgba[i][rDst] = (GLfloat) ((p ) & 0xff); 3511848b8605Smrg rgba[i][gDst] = (GLfloat) ((p >> 8) & 0xff); 3512848b8605Smrg rgba[i][bDst] = (GLfloat) ((p >> 16) & 0xff); 3513848b8605Smrg rgba[i][aDst] = (GLfloat) ((p >> 24) ); 3514848b8605Smrg } 3515848b8605Smrg } 3516848b8605Smrg else { 3517848b8605Smrg for (i = 0; i < n; i ++) { 3518848b8605Smrg GLuint p = uisrc[i]; 3519848b8605Smrg rgba[i][rDst] = UBYTE_TO_FLOAT((p ) & 0xff); 3520848b8605Smrg rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 3521848b8605Smrg rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 3522848b8605Smrg rgba[i][aDst] = UBYTE_TO_FLOAT((p >> 24) ); 3523848b8605Smrg } 3524848b8605Smrg } 3525848b8605Smrg } 3526848b8605Smrg break; 3527848b8605Smrg case GL_UNSIGNED_INT_10_10_10_2: 3528848b8605Smrg if (!intFormat) { 3529848b8605Smrg rs = 1.0F / 1023.0F; 3530848b8605Smrg gs = 1.0F / 1023.0F; 3531848b8605Smrg bs = 1.0F / 1023.0F; 3532848b8605Smrg as = 1.0F / 3.0F; 3533848b8605Smrg } 3534848b8605Smrg if (swapBytes) { 3535848b8605Smrg const GLuint *uisrc = (const GLuint *) src; 3536848b8605Smrg GLuint i; 3537848b8605Smrg for (i = 0; i < n; i ++) { 3538848b8605Smrg GLuint p = uisrc[i]; 3539848b8605Smrg SWAP4BYTE(p); 3540848b8605Smrg rgba[i][rDst] = ((p >> 22) ) * rs; 3541848b8605Smrg rgba[i][gDst] = ((p >> 12) & 0x3ff) * gs; 3542848b8605Smrg rgba[i][bDst] = ((p >> 2) & 0x3ff) * bs; 3543848b8605Smrg rgba[i][aDst] = ((p ) & 0x3 ) * as; 3544848b8605Smrg } 3545848b8605Smrg } 3546848b8605Smrg else { 3547848b8605Smrg const GLuint *uisrc = (const GLuint *) src; 3548848b8605Smrg GLuint i; 3549848b8605Smrg for (i = 0; i < n; i ++) { 3550848b8605Smrg GLuint p = uisrc[i]; 3551848b8605Smrg rgba[i][rDst] = ((p >> 22) ) * rs; 3552848b8605Smrg rgba[i][gDst] = ((p >> 12) & 0x3ff) * gs; 3553848b8605Smrg rgba[i][bDst] = ((p >> 2) & 0x3ff) * bs; 3554848b8605Smrg rgba[i][aDst] = ((p ) & 0x3 ) * as; 3555848b8605Smrg } 3556848b8605Smrg } 3557848b8605Smrg break; 3558848b8605Smrg case GL_UNSIGNED_INT_2_10_10_10_REV: 3559848b8605Smrg if (!intFormat) { 3560848b8605Smrg rs = 1.0F / 1023.0F; 3561848b8605Smrg gs = 1.0F / 1023.0F; 3562848b8605Smrg bs = 1.0F / 1023.0F; 3563848b8605Smrg as = 1.0F / 3.0F; 3564848b8605Smrg } 3565848b8605Smrg if (swapBytes) { 3566848b8605Smrg const GLuint *uisrc = (const GLuint *) src; 3567848b8605Smrg GLuint i; 3568848b8605Smrg for (i = 0; i < n; i ++) { 3569848b8605Smrg GLuint p = uisrc[i]; 3570848b8605Smrg SWAP4BYTE(p); 3571848b8605Smrg rgba[i][rDst] = ((p ) & 0x3ff) * rs; 3572848b8605Smrg rgba[i][gDst] = ((p >> 10) & 0x3ff) * gs; 3573848b8605Smrg rgba[i][bDst] = ((p >> 20) & 0x3ff) * bs; 3574848b8605Smrg if (aSrc < 0) { 3575848b8605Smrg rgba[i][aDst] = 1.0F; 3576848b8605Smrg } else { 3577848b8605Smrg rgba[i][aDst] = (p >> 30) * as; 3578848b8605Smrg } 3579848b8605Smrg } 3580848b8605Smrg } 3581848b8605Smrg else { 3582848b8605Smrg const GLuint *uisrc = (const GLuint *) src; 3583848b8605Smrg GLuint i; 3584848b8605Smrg for (i = 0; i < n; i ++) { 3585848b8605Smrg GLuint p = uisrc[i]; 3586848b8605Smrg rgba[i][rDst] = ((p ) & 0x3ff) * rs; 3587848b8605Smrg rgba[i][gDst] = ((p >> 10) & 0x3ff) * gs; 3588848b8605Smrg rgba[i][bDst] = ((p >> 20) & 0x3ff) * bs; 3589848b8605Smrg if (aSrc < 0) { 3590848b8605Smrg rgba[i][aDst] = 1.0F; 3591848b8605Smrg } else { 3592848b8605Smrg rgba[i][aDst] = (p >> 30) * as; 3593848b8605Smrg } 3594848b8605Smrg } 3595848b8605Smrg } 3596848b8605Smrg break; 3597848b8605Smrg case GL_UNSIGNED_INT_5_9_9_9_REV: 3598848b8605Smrg if (swapBytes) { 3599848b8605Smrg const GLuint *uisrc = (const GLuint *) src; 3600848b8605Smrg GLuint i; 3601848b8605Smrg GLfloat f[3]; 3602848b8605Smrg for (i = 0; i < n; i ++) { 3603848b8605Smrg GLuint p = uisrc[i]; 3604848b8605Smrg SWAP4BYTE(p); 3605848b8605Smrg rgb9e5_to_float3(p, f); 3606848b8605Smrg rgba[i][rDst] = f[0]; 3607848b8605Smrg rgba[i][gDst] = f[1]; 3608848b8605Smrg rgba[i][bDst] = f[2]; 3609848b8605Smrg rgba[i][aDst] = 1.0F; 3610848b8605Smrg } 3611848b8605Smrg } 3612848b8605Smrg else { 3613848b8605Smrg const GLuint *uisrc = (const GLuint *) src; 3614848b8605Smrg GLuint i; 3615848b8605Smrg GLfloat f[3]; 3616848b8605Smrg for (i = 0; i < n; i ++) { 3617848b8605Smrg rgb9e5_to_float3(uisrc[i], f); 3618848b8605Smrg rgba[i][rDst] = f[0]; 3619848b8605Smrg rgba[i][gDst] = f[1]; 3620848b8605Smrg rgba[i][bDst] = f[2]; 3621848b8605Smrg rgba[i][aDst] = 1.0F; 3622848b8605Smrg } 3623848b8605Smrg } 3624848b8605Smrg break; 3625848b8605Smrg case GL_UNSIGNED_INT_10F_11F_11F_REV: 3626848b8605Smrg if (swapBytes) { 3627848b8605Smrg const GLuint *uisrc = (const GLuint *) src; 3628848b8605Smrg GLuint i; 3629848b8605Smrg GLfloat f[3]; 3630848b8605Smrg for (i = 0; i < n; i ++) { 3631848b8605Smrg GLuint p = uisrc[i]; 3632848b8605Smrg SWAP4BYTE(p); 3633848b8605Smrg r11g11b10f_to_float3(p, f); 3634848b8605Smrg rgba[i][rDst] = f[0]; 3635848b8605Smrg rgba[i][gDst] = f[1]; 3636848b8605Smrg rgba[i][bDst] = f[2]; 3637848b8605Smrg rgba[i][aDst] = 1.0F; 3638848b8605Smrg } 3639848b8605Smrg } 3640848b8605Smrg else { 3641848b8605Smrg const GLuint *uisrc = (const GLuint *) src; 3642848b8605Smrg GLuint i; 3643848b8605Smrg GLfloat f[3]; 3644848b8605Smrg for (i = 0; i < n; i ++) { 3645848b8605Smrg r11g11b10f_to_float3(uisrc[i], f); 3646848b8605Smrg rgba[i][rDst] = f[0]; 3647848b8605Smrg rgba[i][gDst] = f[1]; 3648848b8605Smrg rgba[i][bDst] = f[2]; 3649848b8605Smrg rgba[i][aDst] = 1.0F; 3650848b8605Smrg } 3651848b8605Smrg } 3652848b8605Smrg break; 3653848b8605Smrg default: 3654848b8605Smrg _mesa_problem(NULL, "bad srcType in extract float data"); 3655848b8605Smrg break; 3656848b8605Smrg } 3657848b8605Smrg#undef PROCESS 3658848b8605Smrg} 3659848b8605Smrg 3660848b8605Smrg 3661848b8605Smrgstatic inline GLuint 3662848b8605Smrgclamp_float_to_uint(GLfloat f) 3663848b8605Smrg{ 3664848b8605Smrg return f < 0.0F ? 0 : F_TO_I(f); 3665848b8605Smrg} 3666848b8605Smrg 3667848b8605Smrg 3668848b8605Smrgstatic inline GLuint 3669848b8605Smrgclamp_half_to_uint(GLhalfARB h) 3670848b8605Smrg{ 3671848b8605Smrg GLfloat f = _mesa_half_to_float(h); 3672848b8605Smrg return f < 0.0F ? 0 : F_TO_I(f); 3673848b8605Smrg} 3674848b8605Smrg 3675848b8605Smrg 3676848b8605Smrg/** 3677848b8605Smrg * \sa extract_float_rgba() 3678848b8605Smrg */ 3679848b8605Smrgstatic void 3680848b8605Smrgextract_uint_rgba(GLuint n, GLuint rgba[][4], 3681848b8605Smrg GLenum srcFormat, GLenum srcType, const GLvoid *src, 3682848b8605Smrg GLboolean swapBytes) 3683848b8605Smrg{ 3684848b8605Smrg GLint rSrc, gSrc, bSrc, aSrc; 3685848b8605Smrg GLint stride; 3686848b8605Smrg GLint rDst, bDst, gDst, aDst; 3687848b8605Smrg 3688848b8605Smrg ASSERT(srcFormat == GL_RED || 3689848b8605Smrg srcFormat == GL_GREEN || 3690848b8605Smrg srcFormat == GL_BLUE || 3691848b8605Smrg srcFormat == GL_ALPHA || 3692848b8605Smrg srcFormat == GL_LUMINANCE || 3693848b8605Smrg srcFormat == GL_LUMINANCE_ALPHA || 3694848b8605Smrg srcFormat == GL_INTENSITY || 3695848b8605Smrg srcFormat == GL_RG || 3696848b8605Smrg srcFormat == GL_RGB || 3697848b8605Smrg srcFormat == GL_BGR || 3698848b8605Smrg srcFormat == GL_RGBA || 3699848b8605Smrg srcFormat == GL_BGRA || 3700848b8605Smrg srcFormat == GL_ABGR_EXT || 3701848b8605Smrg srcFormat == GL_RED_INTEGER_EXT || 3702848b8605Smrg srcFormat == GL_RG_INTEGER || 3703848b8605Smrg srcFormat == GL_GREEN_INTEGER_EXT || 3704848b8605Smrg srcFormat == GL_BLUE_INTEGER_EXT || 3705848b8605Smrg srcFormat == GL_ALPHA_INTEGER_EXT || 3706848b8605Smrg srcFormat == GL_RGB_INTEGER_EXT || 3707848b8605Smrg srcFormat == GL_RGBA_INTEGER_EXT || 3708848b8605Smrg srcFormat == GL_BGR_INTEGER_EXT || 3709848b8605Smrg srcFormat == GL_BGRA_INTEGER_EXT || 3710848b8605Smrg srcFormat == GL_LUMINANCE_INTEGER_EXT || 3711848b8605Smrg srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT); 3712848b8605Smrg 3713848b8605Smrg ASSERT(srcType == GL_UNSIGNED_BYTE || 3714848b8605Smrg srcType == GL_BYTE || 3715848b8605Smrg srcType == GL_UNSIGNED_SHORT || 3716848b8605Smrg srcType == GL_SHORT || 3717848b8605Smrg srcType == GL_UNSIGNED_INT || 3718848b8605Smrg srcType == GL_INT || 3719848b8605Smrg srcType == GL_HALF_FLOAT_ARB || 3720848b8605Smrg srcType == GL_FLOAT || 3721848b8605Smrg srcType == GL_UNSIGNED_BYTE_3_3_2 || 3722848b8605Smrg srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 3723848b8605Smrg srcType == GL_UNSIGNED_SHORT_5_6_5 || 3724848b8605Smrg srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 3725848b8605Smrg srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 3726848b8605Smrg srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 3727848b8605Smrg srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 3728848b8605Smrg srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 3729848b8605Smrg srcType == GL_UNSIGNED_INT_8_8_8_8 || 3730848b8605Smrg srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 3731848b8605Smrg srcType == GL_UNSIGNED_INT_10_10_10_2 || 3732848b8605Smrg srcType == GL_UNSIGNED_INT_2_10_10_10_REV || 3733848b8605Smrg srcType == GL_UNSIGNED_INT_5_9_9_9_REV || 3734848b8605Smrg srcType == GL_UNSIGNED_INT_10F_11F_11F_REV); 3735848b8605Smrg 3736848b8605Smrg get_component_mapping(srcFormat, 3737848b8605Smrg &rSrc, &gSrc, &bSrc, &aSrc, 3738848b8605Smrg &rDst, &gDst, &bDst, &aDst); 3739848b8605Smrg 3740848b8605Smrg stride = _mesa_components_in_format(srcFormat); 3741848b8605Smrg 3742848b8605Smrg#define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT, TYPE, CONVERSION) \ 3743848b8605Smrg if ((SRC_INDEX) < 0) { \ 3744848b8605Smrg GLuint i; \ 3745848b8605Smrg for (i = 0; i < n; i++) { \ 3746848b8605Smrg rgba[i][DST_INDEX] = DEFAULT; \ 3747848b8605Smrg } \ 3748848b8605Smrg } \ 3749848b8605Smrg else if (swapBytes) { \ 3750848b8605Smrg const TYPE *s = (const TYPE *) src; \ 3751848b8605Smrg GLuint i; \ 3752848b8605Smrg for (i = 0; i < n; i++) { \ 3753848b8605Smrg TYPE value = s[SRC_INDEX]; \ 3754848b8605Smrg if (sizeof(TYPE) == 2) { \ 3755848b8605Smrg SWAP2BYTE(value); \ 3756848b8605Smrg } \ 3757848b8605Smrg else if (sizeof(TYPE) == 4) { \ 3758848b8605Smrg SWAP4BYTE(value); \ 3759848b8605Smrg } \ 3760848b8605Smrg rgba[i][DST_INDEX] = CONVERSION(value); \ 3761848b8605Smrg s += stride; \ 3762848b8605Smrg } \ 3763848b8605Smrg } \ 3764848b8605Smrg else { \ 3765848b8605Smrg const TYPE *s = (const TYPE *) src; \ 3766848b8605Smrg GLuint i; \ 3767848b8605Smrg for (i = 0; i < n; i++) { \ 3768848b8605Smrg rgba[i][DST_INDEX] = CONVERSION(s[SRC_INDEX]); \ 3769848b8605Smrg s += stride; \ 3770848b8605Smrg } \ 3771848b8605Smrg } 3772848b8605Smrg 3773848b8605Smrg switch (srcType) { 3774848b8605Smrg case GL_UNSIGNED_BYTE: 3775848b8605Smrg PROCESS(rSrc, RCOMP, 0, GLubyte, (GLuint)); 3776848b8605Smrg PROCESS(gSrc, GCOMP, 0, GLubyte, (GLuint)); 3777848b8605Smrg PROCESS(bSrc, BCOMP, 0, GLubyte, (GLuint)); 3778848b8605Smrg PROCESS(aSrc, ACOMP, 1, GLubyte, (GLuint)); 3779848b8605Smrg break; 3780848b8605Smrg case GL_BYTE: 3781848b8605Smrg PROCESS(rSrc, RCOMP, 0, GLbyte, (GLuint)); 3782848b8605Smrg PROCESS(gSrc, GCOMP, 0, GLbyte, (GLuint)); 3783848b8605Smrg PROCESS(bSrc, BCOMP, 0, GLbyte, (GLuint)); 3784848b8605Smrg PROCESS(aSrc, ACOMP, 1, GLbyte, (GLuint)); 3785848b8605Smrg break; 3786848b8605Smrg case GL_UNSIGNED_SHORT: 3787848b8605Smrg PROCESS(rSrc, RCOMP, 0, GLushort, (GLuint)); 3788848b8605Smrg PROCESS(gSrc, GCOMP, 0, GLushort, (GLuint)); 3789848b8605Smrg PROCESS(bSrc, BCOMP, 0, GLushort, (GLuint)); 3790848b8605Smrg PROCESS(aSrc, ACOMP, 1, GLushort, (GLuint)); 3791848b8605Smrg break; 3792848b8605Smrg case GL_SHORT: 3793848b8605Smrg PROCESS(rSrc, RCOMP, 0, GLshort, (GLuint)); 3794848b8605Smrg PROCESS(gSrc, GCOMP, 0, GLshort, (GLuint)); 3795848b8605Smrg PROCESS(bSrc, BCOMP, 0, GLshort, (GLuint)); 3796848b8605Smrg PROCESS(aSrc, ACOMP, 1, GLshort, (GLuint)); 3797848b8605Smrg break; 3798848b8605Smrg case GL_UNSIGNED_INT: 3799848b8605Smrg PROCESS(rSrc, RCOMP, 0, GLuint, (GLuint)); 3800848b8605Smrg PROCESS(gSrc, GCOMP, 0, GLuint, (GLuint)); 3801848b8605Smrg PROCESS(bSrc, BCOMP, 0, GLuint, (GLuint)); 3802848b8605Smrg PROCESS(aSrc, ACOMP, 1, GLuint, (GLuint)); 3803848b8605Smrg break; 3804848b8605Smrg case GL_INT: 3805848b8605Smrg PROCESS(rSrc, RCOMP, 0, GLint, (GLuint)); 3806848b8605Smrg PROCESS(gSrc, GCOMP, 0, GLint, (GLuint)); 3807848b8605Smrg PROCESS(bSrc, BCOMP, 0, GLint, (GLuint)); 3808848b8605Smrg PROCESS(aSrc, ACOMP, 1, GLint, (GLuint)); 3809848b8605Smrg break; 3810848b8605Smrg case GL_FLOAT: 3811848b8605Smrg PROCESS(rSrc, RCOMP, 0, GLfloat, clamp_float_to_uint); 3812848b8605Smrg PROCESS(gSrc, GCOMP, 0, GLfloat, clamp_float_to_uint); 3813848b8605Smrg PROCESS(bSrc, BCOMP, 0, GLfloat, clamp_float_to_uint); 3814848b8605Smrg PROCESS(aSrc, ACOMP, 1, GLfloat, clamp_float_to_uint); 3815848b8605Smrg break; 3816848b8605Smrg case GL_HALF_FLOAT_ARB: 3817848b8605Smrg PROCESS(rSrc, RCOMP, 0, GLhalfARB, clamp_half_to_uint); 3818848b8605Smrg PROCESS(gSrc, GCOMP, 0, GLhalfARB, clamp_half_to_uint); 3819848b8605Smrg PROCESS(bSrc, BCOMP, 0, GLhalfARB, clamp_half_to_uint); 3820848b8605Smrg PROCESS(aSrc, ACOMP, 1, GLhalfARB, clamp_half_to_uint); 3821848b8605Smrg break; 3822848b8605Smrg case GL_UNSIGNED_BYTE_3_3_2: 3823848b8605Smrg { 3824848b8605Smrg const GLubyte *ubsrc = (const GLubyte *) src; 3825848b8605Smrg GLuint i; 3826848b8605Smrg for (i = 0; i < n; i ++) { 3827848b8605Smrg GLubyte p = ubsrc[i]; 3828848b8605Smrg rgba[i][rDst] = ((p >> 5) ); 3829848b8605Smrg rgba[i][gDst] = ((p >> 2) & 0x7); 3830848b8605Smrg rgba[i][bDst] = ((p ) & 0x3); 3831848b8605Smrg rgba[i][aDst] = 1; 3832848b8605Smrg } 3833848b8605Smrg } 3834848b8605Smrg break; 3835848b8605Smrg case GL_UNSIGNED_BYTE_2_3_3_REV: 3836848b8605Smrg { 3837848b8605Smrg const GLubyte *ubsrc = (const GLubyte *) src; 3838848b8605Smrg GLuint i; 3839848b8605Smrg for (i = 0; i < n; i ++) { 3840848b8605Smrg GLubyte p = ubsrc[i]; 3841848b8605Smrg rgba[i][rDst] = ((p ) & 0x7); 3842848b8605Smrg rgba[i][gDst] = ((p >> 3) & 0x7); 3843848b8605Smrg rgba[i][bDst] = ((p >> 6) ); 3844848b8605Smrg rgba[i][aDst] = 1; 3845848b8605Smrg } 3846848b8605Smrg } 3847848b8605Smrg break; 3848848b8605Smrg case GL_UNSIGNED_SHORT_5_6_5: 3849848b8605Smrg if (swapBytes) { 3850848b8605Smrg const GLushort *ussrc = (const GLushort *) src; 3851848b8605Smrg GLuint i; 3852848b8605Smrg for (i = 0; i < n; i ++) { 3853848b8605Smrg GLushort p = ussrc[i]; 3854848b8605Smrg SWAP2BYTE(p); 3855848b8605Smrg rgba[i][rDst] = ((p >> 11) ); 3856848b8605Smrg rgba[i][gDst] = ((p >> 5) & 0x3f); 3857848b8605Smrg rgba[i][bDst] = ((p ) & 0x1f); 3858848b8605Smrg rgba[i][aDst] = 1; 3859848b8605Smrg } 3860848b8605Smrg } 3861848b8605Smrg else { 3862848b8605Smrg const GLushort *ussrc = (const GLushort *) src; 3863848b8605Smrg GLuint i; 3864848b8605Smrg for (i = 0; i < n; i ++) { 3865848b8605Smrg GLushort p = ussrc[i]; 3866848b8605Smrg rgba[i][rDst] = ((p >> 11) ); 3867848b8605Smrg rgba[i][gDst] = ((p >> 5) & 0x3f); 3868848b8605Smrg rgba[i][bDst] = ((p ) & 0x1f); 3869848b8605Smrg rgba[i][aDst] = 1; 3870848b8605Smrg } 3871848b8605Smrg } 3872848b8605Smrg break; 3873848b8605Smrg case GL_UNSIGNED_SHORT_5_6_5_REV: 3874848b8605Smrg if (swapBytes) { 3875848b8605Smrg const GLushort *ussrc = (const GLushort *) src; 3876848b8605Smrg GLuint i; 3877848b8605Smrg for (i = 0; i < n; i ++) { 3878848b8605Smrg GLushort p = ussrc[i]; 3879848b8605Smrg SWAP2BYTE(p); 3880848b8605Smrg rgba[i][rDst] = ((p ) & 0x1f); 3881848b8605Smrg rgba[i][gDst] = ((p >> 5) & 0x3f); 3882848b8605Smrg rgba[i][bDst] = ((p >> 11) ); 3883848b8605Smrg rgba[i][aDst] = 1; 3884848b8605Smrg } 3885848b8605Smrg } 3886848b8605Smrg else { 3887848b8605Smrg const GLushort *ussrc = (const GLushort *) src; 3888848b8605Smrg GLuint i; 3889848b8605Smrg for (i = 0; i < n; i ++) { 3890848b8605Smrg GLushort p = ussrc[i]; 3891848b8605Smrg rgba[i][rDst] = ((p ) & 0x1f); 3892848b8605Smrg rgba[i][gDst] = ((p >> 5) & 0x3f); 3893848b8605Smrg rgba[i][bDst] = ((p >> 11) ); 3894848b8605Smrg rgba[i][aDst] = 1; 3895848b8605Smrg } 3896848b8605Smrg } 3897848b8605Smrg break; 3898848b8605Smrg case GL_UNSIGNED_SHORT_4_4_4_4: 3899848b8605Smrg if (swapBytes) { 3900848b8605Smrg const GLushort *ussrc = (const GLushort *) src; 3901848b8605Smrg GLuint i; 3902848b8605Smrg for (i = 0; i < n; i ++) { 3903848b8605Smrg GLushort p = ussrc[i]; 3904848b8605Smrg SWAP2BYTE(p); 3905848b8605Smrg rgba[i][rDst] = ((p >> 12) ); 3906848b8605Smrg rgba[i][gDst] = ((p >> 8) & 0xf); 3907848b8605Smrg rgba[i][bDst] = ((p >> 4) & 0xf); 3908848b8605Smrg rgba[i][aDst] = ((p ) & 0xf); 3909848b8605Smrg } 3910848b8605Smrg } 3911848b8605Smrg else { 3912848b8605Smrg const GLushort *ussrc = (const GLushort *) src; 3913848b8605Smrg GLuint i; 3914848b8605Smrg for (i = 0; i < n; i ++) { 3915848b8605Smrg GLushort p = ussrc[i]; 3916848b8605Smrg rgba[i][rDst] = ((p >> 12) ); 3917848b8605Smrg rgba[i][gDst] = ((p >> 8) & 0xf); 3918848b8605Smrg rgba[i][bDst] = ((p >> 4) & 0xf); 3919848b8605Smrg rgba[i][aDst] = ((p ) & 0xf); 3920848b8605Smrg } 3921848b8605Smrg } 3922848b8605Smrg break; 3923848b8605Smrg case GL_UNSIGNED_SHORT_4_4_4_4_REV: 3924848b8605Smrg if (swapBytes) { 3925848b8605Smrg const GLushort *ussrc = (const GLushort *) src; 3926848b8605Smrg GLuint i; 3927848b8605Smrg for (i = 0; i < n; i ++) { 3928848b8605Smrg GLushort p = ussrc[i]; 3929848b8605Smrg SWAP2BYTE(p); 3930848b8605Smrg rgba[i][rDst] = ((p ) & 0xf); 3931848b8605Smrg rgba[i][gDst] = ((p >> 4) & 0xf); 3932848b8605Smrg rgba[i][bDst] = ((p >> 8) & 0xf); 3933848b8605Smrg rgba[i][aDst] = ((p >> 12) ); 3934848b8605Smrg } 3935848b8605Smrg } 3936848b8605Smrg else { 3937848b8605Smrg const GLushort *ussrc = (const GLushort *) src; 3938848b8605Smrg GLuint i; 3939848b8605Smrg for (i = 0; i < n; i ++) { 3940848b8605Smrg GLushort p = ussrc[i]; 3941848b8605Smrg rgba[i][rDst] = ((p ) & 0xf); 3942848b8605Smrg rgba[i][gDst] = ((p >> 4) & 0xf); 3943848b8605Smrg rgba[i][bDst] = ((p >> 8) & 0xf); 3944848b8605Smrg rgba[i][aDst] = ((p >> 12) ); 3945848b8605Smrg } 3946848b8605Smrg } 3947848b8605Smrg break; 3948848b8605Smrg case GL_UNSIGNED_SHORT_5_5_5_1: 3949848b8605Smrg if (swapBytes) { 3950848b8605Smrg const GLushort *ussrc = (const GLushort *) src; 3951848b8605Smrg GLuint i; 3952848b8605Smrg for (i = 0; i < n; i ++) { 3953848b8605Smrg GLushort p = ussrc[i]; 3954848b8605Smrg SWAP2BYTE(p); 3955848b8605Smrg rgba[i][rDst] = ((p >> 11) ); 3956848b8605Smrg rgba[i][gDst] = ((p >> 6) & 0x1f); 3957848b8605Smrg rgba[i][bDst] = ((p >> 1) & 0x1f); 3958848b8605Smrg rgba[i][aDst] = ((p ) & 0x1 ); 3959848b8605Smrg } 3960848b8605Smrg } 3961848b8605Smrg else { 3962848b8605Smrg const GLushort *ussrc = (const GLushort *) src; 3963848b8605Smrg GLuint i; 3964848b8605Smrg for (i = 0; i < n; i ++) { 3965848b8605Smrg GLushort p = ussrc[i]; 3966848b8605Smrg rgba[i][rDst] = ((p >> 11) ); 3967848b8605Smrg rgba[i][gDst] = ((p >> 6) & 0x1f); 3968848b8605Smrg rgba[i][bDst] = ((p >> 1) & 0x1f); 3969848b8605Smrg rgba[i][aDst] = ((p ) & 0x1 ); 3970848b8605Smrg } 3971848b8605Smrg } 3972848b8605Smrg break; 3973848b8605Smrg case GL_UNSIGNED_SHORT_1_5_5_5_REV: 3974848b8605Smrg if (swapBytes) { 3975848b8605Smrg const GLushort *ussrc = (const GLushort *) src; 3976848b8605Smrg GLuint i; 3977848b8605Smrg for (i = 0; i < n; i ++) { 3978848b8605Smrg GLushort p = ussrc[i]; 3979848b8605Smrg SWAP2BYTE(p); 3980848b8605Smrg rgba[i][rDst] = ((p ) & 0x1f); 3981848b8605Smrg rgba[i][gDst] = ((p >> 5) & 0x1f); 3982848b8605Smrg rgba[i][bDst] = ((p >> 10) & 0x1f); 3983848b8605Smrg rgba[i][aDst] = ((p >> 15) ); 3984848b8605Smrg } 3985848b8605Smrg } 3986848b8605Smrg else { 3987848b8605Smrg const GLushort *ussrc = (const GLushort *) src; 3988848b8605Smrg GLuint i; 3989848b8605Smrg for (i = 0; i < n; i ++) { 3990848b8605Smrg GLushort p = ussrc[i]; 3991848b8605Smrg rgba[i][rDst] = ((p ) & 0x1f); 3992848b8605Smrg rgba[i][gDst] = ((p >> 5) & 0x1f); 3993848b8605Smrg rgba[i][bDst] = ((p >> 10) & 0x1f); 3994848b8605Smrg rgba[i][aDst] = ((p >> 15) ); 3995848b8605Smrg } 3996848b8605Smrg } 3997848b8605Smrg break; 3998848b8605Smrg case GL_UNSIGNED_INT_8_8_8_8: 3999848b8605Smrg if (swapBytes) { 4000848b8605Smrg const GLuint *uisrc = (const GLuint *) src; 4001848b8605Smrg GLuint i; 4002848b8605Smrg for (i = 0; i < n; i ++) { 4003848b8605Smrg GLuint p = uisrc[i]; 4004848b8605Smrg rgba[i][rDst] = ((p ) & 0xff); 4005848b8605Smrg rgba[i][gDst] = ((p >> 8) & 0xff); 4006848b8605Smrg rgba[i][bDst] = ((p >> 16) & 0xff); 4007848b8605Smrg rgba[i][aDst] = ((p >> 24) ); 4008848b8605Smrg } 4009848b8605Smrg } 4010848b8605Smrg else { 4011848b8605Smrg const GLuint *uisrc = (const GLuint *) src; 4012848b8605Smrg GLuint i; 4013848b8605Smrg for (i = 0; i < n; i ++) { 4014848b8605Smrg GLuint p = uisrc[i]; 4015848b8605Smrg rgba[i][rDst] = ((p >> 24) ); 4016848b8605Smrg rgba[i][gDst] = ((p >> 16) & 0xff); 4017848b8605Smrg rgba[i][bDst] = ((p >> 8) & 0xff); 4018848b8605Smrg rgba[i][aDst] = ((p ) & 0xff); 4019848b8605Smrg } 4020848b8605Smrg } 4021848b8605Smrg break; 4022848b8605Smrg case GL_UNSIGNED_INT_8_8_8_8_REV: 4023848b8605Smrg if (swapBytes) { 4024848b8605Smrg const GLuint *uisrc = (const GLuint *) src; 4025848b8605Smrg GLuint i; 4026848b8605Smrg for (i = 0; i < n; i ++) { 4027848b8605Smrg GLuint p = uisrc[i]; 4028848b8605Smrg rgba[i][rDst] = ((p >> 24) ); 4029848b8605Smrg rgba[i][gDst] = ((p >> 16) & 0xff); 4030848b8605Smrg rgba[i][bDst] = ((p >> 8) & 0xff); 4031848b8605Smrg rgba[i][aDst] = ((p ) & 0xff); 4032848b8605Smrg } 4033848b8605Smrg } 4034848b8605Smrg else { 4035848b8605Smrg const GLuint *uisrc = (const GLuint *) src; 4036848b8605Smrg GLuint i; 4037848b8605Smrg for (i = 0; i < n; i ++) { 4038848b8605Smrg GLuint p = uisrc[i]; 4039848b8605Smrg rgba[i][rDst] = ((p ) & 0xff); 4040848b8605Smrg rgba[i][gDst] = ((p >> 8) & 0xff); 4041848b8605Smrg rgba[i][bDst] = ((p >> 16) & 0xff); 4042848b8605Smrg rgba[i][aDst] = ((p >> 24) ); 4043848b8605Smrg } 4044848b8605Smrg } 4045848b8605Smrg break; 4046848b8605Smrg case GL_UNSIGNED_INT_10_10_10_2: 4047848b8605Smrg if (swapBytes) { 4048848b8605Smrg const GLuint *uisrc = (const GLuint *) src; 4049848b8605Smrg GLuint i; 4050848b8605Smrg for (i = 0; i < n; i ++) { 4051848b8605Smrg GLuint p = uisrc[i]; 4052848b8605Smrg SWAP4BYTE(p); 4053848b8605Smrg rgba[i][rDst] = ((p >> 22) ); 4054848b8605Smrg rgba[i][gDst] = ((p >> 12) & 0x3ff); 4055848b8605Smrg rgba[i][bDst] = ((p >> 2) & 0x3ff); 4056848b8605Smrg rgba[i][aDst] = ((p ) & 0x3 ); 4057848b8605Smrg } 4058848b8605Smrg } 4059848b8605Smrg else { 4060848b8605Smrg const GLuint *uisrc = (const GLuint *) src; 4061848b8605Smrg GLuint i; 4062848b8605Smrg for (i = 0; i < n; i ++) { 4063848b8605Smrg GLuint p = uisrc[i]; 4064848b8605Smrg rgba[i][rDst] = ((p >> 22) ); 4065848b8605Smrg rgba[i][gDst] = ((p >> 12) & 0x3ff); 4066848b8605Smrg rgba[i][bDst] = ((p >> 2) & 0x3ff); 4067848b8605Smrg rgba[i][aDst] = ((p ) & 0x3 ); 4068848b8605Smrg } 4069848b8605Smrg } 4070848b8605Smrg break; 4071848b8605Smrg case GL_UNSIGNED_INT_2_10_10_10_REV: 4072848b8605Smrg if (swapBytes) { 4073848b8605Smrg const GLuint *uisrc = (const GLuint *) src; 4074848b8605Smrg GLuint i; 4075848b8605Smrg for (i = 0; i < n; i ++) { 4076848b8605Smrg GLuint p = uisrc[i]; 4077848b8605Smrg SWAP4BYTE(p); 4078848b8605Smrg rgba[i][rDst] = ((p ) & 0x3ff); 4079848b8605Smrg rgba[i][gDst] = ((p >> 10) & 0x3ff); 4080848b8605Smrg rgba[i][bDst] = ((p >> 20) & 0x3ff); 4081848b8605Smrg rgba[i][aDst] = ((p >> 30) ); 4082848b8605Smrg } 4083848b8605Smrg } 4084848b8605Smrg else { 4085848b8605Smrg const GLuint *uisrc = (const GLuint *) src; 4086848b8605Smrg GLuint i; 4087848b8605Smrg for (i = 0; i < n; i ++) { 4088848b8605Smrg GLuint p = uisrc[i]; 4089848b8605Smrg rgba[i][rDst] = ((p ) & 0x3ff); 4090848b8605Smrg rgba[i][gDst] = ((p >> 10) & 0x3ff); 4091848b8605Smrg rgba[i][bDst] = ((p >> 20) & 0x3ff); 4092848b8605Smrg rgba[i][aDst] = ((p >> 30) ); 4093848b8605Smrg } 4094848b8605Smrg } 4095848b8605Smrg break; 4096848b8605Smrg case GL_UNSIGNED_INT_5_9_9_9_REV: 4097848b8605Smrg if (swapBytes) { 4098848b8605Smrg const GLuint *uisrc = (const GLuint *) src; 4099848b8605Smrg GLuint i; 4100848b8605Smrg float f[3]; 4101848b8605Smrg for (i = 0; i < n; i ++) { 4102848b8605Smrg GLuint p = uisrc[i]; 4103848b8605Smrg SWAP4BYTE(p); 4104848b8605Smrg rgb9e5_to_float3(p, f); 4105848b8605Smrg rgba[i][rDst] = clamp_float_to_uint(f[0]); 4106848b8605Smrg rgba[i][gDst] = clamp_float_to_uint(f[1]); 4107848b8605Smrg rgba[i][bDst] = clamp_float_to_uint(f[2]); 4108848b8605Smrg rgba[i][aDst] = 1; 4109848b8605Smrg } 4110848b8605Smrg } 4111848b8605Smrg else { 4112848b8605Smrg const GLuint *uisrc = (const GLuint *) src; 4113848b8605Smrg GLuint i; 4114848b8605Smrg float f[3]; 4115848b8605Smrg for (i = 0; i < n; i ++) { 4116848b8605Smrg GLuint p = uisrc[i]; 4117848b8605Smrg rgb9e5_to_float3(p, f); 4118848b8605Smrg rgba[i][rDst] = clamp_float_to_uint(f[0]); 4119848b8605Smrg rgba[i][gDst] = clamp_float_to_uint(f[1]); 4120848b8605Smrg rgba[i][bDst] = clamp_float_to_uint(f[2]); 4121848b8605Smrg rgba[i][aDst] = 1; 4122848b8605Smrg } 4123848b8605Smrg } 4124848b8605Smrg break; 4125848b8605Smrg case GL_UNSIGNED_INT_10F_11F_11F_REV: 4126848b8605Smrg if (swapBytes) { 4127848b8605Smrg const GLuint *uisrc = (const GLuint *) src; 4128848b8605Smrg GLuint i; 4129848b8605Smrg float f[3]; 4130848b8605Smrg for (i = 0; i < n; i ++) { 4131848b8605Smrg GLuint p = uisrc[i]; 4132848b8605Smrg SWAP4BYTE(p); 4133848b8605Smrg r11g11b10f_to_float3(p, f); 4134848b8605Smrg rgba[i][rDst] = clamp_float_to_uint(f[0]); 4135848b8605Smrg rgba[i][gDst] = clamp_float_to_uint(f[1]); 4136848b8605Smrg rgba[i][bDst] = clamp_float_to_uint(f[2]); 4137848b8605Smrg rgba[i][aDst] = 1; 4138848b8605Smrg } 4139848b8605Smrg } 4140848b8605Smrg else { 4141848b8605Smrg const GLuint *uisrc = (const GLuint *) src; 4142848b8605Smrg GLuint i; 4143848b8605Smrg float f[3]; 4144848b8605Smrg for (i = 0; i < n; i ++) { 4145848b8605Smrg GLuint p = uisrc[i]; 4146848b8605Smrg r11g11b10f_to_float3(p, f); 4147848b8605Smrg rgba[i][rDst] = clamp_float_to_uint(f[0]); 4148848b8605Smrg rgba[i][gDst] = clamp_float_to_uint(f[1]); 4149848b8605Smrg rgba[i][bDst] = clamp_float_to_uint(f[2]); 4150848b8605Smrg rgba[i][aDst] = 1; 4151848b8605Smrg } 4152848b8605Smrg } 4153848b8605Smrg break; 4154848b8605Smrg default: 4155848b8605Smrg _mesa_problem(NULL, "bad srcType in extract uint data"); 4156848b8605Smrg break; 4157848b8605Smrg } 4158848b8605Smrg#undef PROCESS 4159848b8605Smrg} 4160848b8605Smrg 4161848b8605Smrg 4162848b8605Smrg 4163848b8605Smrg/* 4164848b8605Smrg * Unpack a row of color image data from a client buffer according to 4165848b8605Smrg * the pixel unpacking parameters. 4166848b8605Smrg * Return GLubyte values in the specified dest image format. 4167848b8605Smrg * This is used by glDrawPixels and glTexImage?D(). 4168848b8605Smrg * \param ctx - the context 4169848b8605Smrg * n - number of pixels in the span 4170848b8605Smrg * dstFormat - format of destination color array 4171848b8605Smrg * dest - the destination color array 4172848b8605Smrg * srcFormat - source image format 4173848b8605Smrg * srcType - source image data type 4174848b8605Smrg * source - source image pointer 4175848b8605Smrg * srcPacking - pixel unpacking parameters 4176848b8605Smrg * transferOps - bitmask of IMAGE_*_BIT values of operations to apply 4177848b8605Smrg * 4178848b8605Smrg * XXX perhaps expand this to process whole images someday. 4179848b8605Smrg */ 4180848b8605Smrgvoid 4181848b8605Smrg_mesa_unpack_color_span_ubyte(struct gl_context *ctx, 4182848b8605Smrg GLuint n, GLenum dstFormat, GLubyte dest[], 4183848b8605Smrg GLenum srcFormat, GLenum srcType, 4184848b8605Smrg const GLvoid *source, 4185848b8605Smrg const struct gl_pixelstore_attrib *srcPacking, 4186848b8605Smrg GLbitfield transferOps ) 4187848b8605Smrg{ 4188848b8605Smrg GLboolean intFormat = _mesa_is_enum_format_integer(srcFormat); 4189848b8605Smrg ASSERT(dstFormat == GL_ALPHA || 4190848b8605Smrg dstFormat == GL_LUMINANCE || 4191848b8605Smrg dstFormat == GL_LUMINANCE_ALPHA || 4192848b8605Smrg dstFormat == GL_INTENSITY || 4193848b8605Smrg dstFormat == GL_RED || 4194848b8605Smrg dstFormat == GL_RG || 4195848b8605Smrg dstFormat == GL_RGB || 4196848b8605Smrg dstFormat == GL_RGBA); 4197848b8605Smrg 4198848b8605Smrg ASSERT(srcFormat == GL_RED || 4199848b8605Smrg srcFormat == GL_GREEN || 4200848b8605Smrg srcFormat == GL_BLUE || 4201848b8605Smrg srcFormat == GL_ALPHA || 4202848b8605Smrg srcFormat == GL_LUMINANCE || 4203848b8605Smrg srcFormat == GL_LUMINANCE_ALPHA || 4204848b8605Smrg srcFormat == GL_INTENSITY || 4205848b8605Smrg srcFormat == GL_RG || 4206848b8605Smrg srcFormat == GL_RGB || 4207848b8605Smrg srcFormat == GL_BGR || 4208848b8605Smrg srcFormat == GL_RGBA || 4209848b8605Smrg srcFormat == GL_BGRA || 4210848b8605Smrg srcFormat == GL_ABGR_EXT || 4211848b8605Smrg srcFormat == GL_COLOR_INDEX); 4212848b8605Smrg 4213848b8605Smrg ASSERT(srcType == GL_BITMAP || 4214848b8605Smrg srcType == GL_UNSIGNED_BYTE || 4215848b8605Smrg srcType == GL_BYTE || 4216848b8605Smrg srcType == GL_UNSIGNED_SHORT || 4217848b8605Smrg srcType == GL_SHORT || 4218848b8605Smrg srcType == GL_UNSIGNED_INT || 4219848b8605Smrg srcType == GL_INT || 4220848b8605Smrg srcType == GL_HALF_FLOAT_ARB || 4221848b8605Smrg srcType == GL_FLOAT || 4222848b8605Smrg srcType == GL_UNSIGNED_BYTE_3_3_2 || 4223848b8605Smrg srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 4224848b8605Smrg srcType == GL_UNSIGNED_SHORT_5_6_5 || 4225848b8605Smrg srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 4226848b8605Smrg srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 4227848b8605Smrg srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 4228848b8605Smrg srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 4229848b8605Smrg srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 4230848b8605Smrg srcType == GL_UNSIGNED_INT_8_8_8_8 || 4231848b8605Smrg srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 4232848b8605Smrg srcType == GL_UNSIGNED_INT_10_10_10_2 || 4233848b8605Smrg srcType == GL_UNSIGNED_INT_2_10_10_10_REV || 4234848b8605Smrg srcType == GL_UNSIGNED_INT_5_9_9_9_REV || 4235848b8605Smrg srcType == GL_UNSIGNED_INT_10F_11F_11F_REV); 4236848b8605Smrg 4237848b8605Smrg /* EXT_texture_integer specifies no transfer ops on integer 4238848b8605Smrg * types in the resolved issues section. Just set them to 0 4239848b8605Smrg * for integer surfaces. 4240848b8605Smrg */ 4241848b8605Smrg if (intFormat) 4242848b8605Smrg transferOps = 0; 4243848b8605Smrg 4244848b8605Smrg /* Try simple cases first */ 4245848b8605Smrg if (transferOps == 0) { 4246848b8605Smrg if (srcType == GL_UNSIGNED_BYTE) { 4247848b8605Smrg if (dstFormat == GL_RGBA) { 4248848b8605Smrg if (srcFormat == GL_RGBA) { 4249848b8605Smrg memcpy( dest, source, n * 4 * sizeof(GLubyte) ); 4250848b8605Smrg return; 4251848b8605Smrg } 4252848b8605Smrg else if (srcFormat == GL_RGB) { 4253848b8605Smrg GLuint i; 4254848b8605Smrg const GLubyte *src = (const GLubyte *) source; 4255848b8605Smrg GLubyte *dst = dest; 4256848b8605Smrg for (i = 0; i < n; i++) { 4257848b8605Smrg dst[0] = src[0]; 4258848b8605Smrg dst[1] = src[1]; 4259848b8605Smrg dst[2] = src[2]; 4260848b8605Smrg dst[3] = 255; 4261848b8605Smrg src += 3; 4262848b8605Smrg dst += 4; 4263848b8605Smrg } 4264848b8605Smrg return; 4265848b8605Smrg } 4266848b8605Smrg } 4267848b8605Smrg else if (dstFormat == GL_RGB) { 4268848b8605Smrg if (srcFormat == GL_RGB) { 4269848b8605Smrg memcpy( dest, source, n * 3 * sizeof(GLubyte) ); 4270848b8605Smrg return; 4271848b8605Smrg } 4272848b8605Smrg else if (srcFormat == GL_RGBA) { 4273848b8605Smrg GLuint i; 4274848b8605Smrg const GLubyte *src = (const GLubyte *) source; 4275848b8605Smrg GLubyte *dst = dest; 4276848b8605Smrg for (i = 0; i < n; i++) { 4277848b8605Smrg dst[0] = src[0]; 4278848b8605Smrg dst[1] = src[1]; 4279848b8605Smrg dst[2] = src[2]; 4280848b8605Smrg src += 4; 4281848b8605Smrg dst += 3; 4282848b8605Smrg } 4283848b8605Smrg return; 4284848b8605Smrg } 4285848b8605Smrg } 4286848b8605Smrg else if (dstFormat == srcFormat) { 4287848b8605Smrg GLint comps = _mesa_components_in_format(srcFormat); 4288848b8605Smrg assert(comps > 0); 4289848b8605Smrg memcpy( dest, source, n * comps * sizeof(GLubyte) ); 4290848b8605Smrg return; 4291848b8605Smrg } 4292848b8605Smrg } 4293848b8605Smrg } 4294848b8605Smrg 4295848b8605Smrg 4296848b8605Smrg /* general solution begins here */ 4297848b8605Smrg { 4298848b8605Smrg GLint dstComponents; 4299848b8605Smrg GLint rDst, gDst, bDst, aDst, lDst, iDst; 4300848b8605Smrg GLfloat (*rgba)[4] = malloc(4 * n * sizeof(GLfloat)); 4301848b8605Smrg 4302848b8605Smrg if (!rgba) { 4303848b8605Smrg _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 4304848b8605Smrg return; 4305848b8605Smrg } 4306848b8605Smrg 4307848b8605Smrg dstComponents = _mesa_components_in_format( dstFormat ); 4308848b8605Smrg /* source & dest image formats should have been error checked by now */ 4309848b8605Smrg assert(dstComponents > 0); 4310848b8605Smrg 4311848b8605Smrg /* 4312848b8605Smrg * Extract image data and convert to RGBA floats 4313848b8605Smrg */ 4314848b8605Smrg if (srcFormat == GL_COLOR_INDEX) { 4315848b8605Smrg GLuint *indexes = malloc(n * sizeof(GLuint)); 4316848b8605Smrg 4317848b8605Smrg if (!indexes) { 4318848b8605Smrg _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 4319848b8605Smrg free(rgba); 4320848b8605Smrg return; 4321848b8605Smrg } 4322848b8605Smrg 4323848b8605Smrg extract_uint_indexes(n, indexes, srcFormat, srcType, source, 4324848b8605Smrg srcPacking); 4325848b8605Smrg 4326848b8605Smrg /* Convert indexes to RGBA */ 4327848b8605Smrg if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 4328848b8605Smrg _mesa_shift_and_offset_ci(ctx, n, indexes); 4329848b8605Smrg } 4330848b8605Smrg _mesa_map_ci_to_rgba(ctx, n, indexes, rgba); 4331848b8605Smrg 4332848b8605Smrg /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting 4333848b8605Smrg * with color indexes. 4334848b8605Smrg */ 4335848b8605Smrg transferOps &= ~(IMAGE_SCALE_BIAS_BIT | IMAGE_MAP_COLOR_BIT); 4336848b8605Smrg 4337848b8605Smrg free(indexes); 4338848b8605Smrg } 4339848b8605Smrg else { 4340848b8605Smrg /* non-color index data */ 4341848b8605Smrg extract_float_rgba(n, rgba, srcFormat, srcType, source, 4342848b8605Smrg srcPacking->SwapBytes); 4343848b8605Smrg } 4344848b8605Smrg 4345848b8605Smrg /* Need to clamp if returning GLubytes */ 4346848b8605Smrg transferOps |= IMAGE_CLAMP_BIT; 4347848b8605Smrg 4348848b8605Smrg if (transferOps) { 4349848b8605Smrg _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba); 4350848b8605Smrg } 4351848b8605Smrg 4352848b8605Smrg get_component_indexes(dstFormat, 4353848b8605Smrg &rDst, &gDst, &bDst, &aDst, &lDst, &iDst); 4354848b8605Smrg 4355848b8605Smrg /* Now return the GLubyte data in the requested dstFormat */ 4356848b8605Smrg if (rDst >= 0) { 4357848b8605Smrg GLubyte *dst = dest; 4358848b8605Smrg GLuint i; 4359848b8605Smrg for (i = 0; i < n; i++) { 4360848b8605Smrg CLAMPED_FLOAT_TO_UBYTE(dst[rDst], rgba[i][RCOMP]); 4361848b8605Smrg dst += dstComponents; 4362848b8605Smrg } 4363848b8605Smrg } 4364848b8605Smrg 4365848b8605Smrg if (gDst >= 0) { 4366848b8605Smrg GLubyte *dst = dest; 4367848b8605Smrg GLuint i; 4368848b8605Smrg for (i = 0; i < n; i++) { 4369848b8605Smrg CLAMPED_FLOAT_TO_UBYTE(dst[gDst], rgba[i][GCOMP]); 4370848b8605Smrg dst += dstComponents; 4371848b8605Smrg } 4372848b8605Smrg } 4373848b8605Smrg 4374848b8605Smrg if (bDst >= 0) { 4375848b8605Smrg GLubyte *dst = dest; 4376848b8605Smrg GLuint i; 4377848b8605Smrg for (i = 0; i < n; i++) { 4378848b8605Smrg CLAMPED_FLOAT_TO_UBYTE(dst[bDst], rgba[i][BCOMP]); 4379848b8605Smrg dst += dstComponents; 4380848b8605Smrg } 4381848b8605Smrg } 4382848b8605Smrg 4383848b8605Smrg if (aDst >= 0) { 4384848b8605Smrg GLubyte *dst = dest; 4385848b8605Smrg GLuint i; 4386848b8605Smrg for (i = 0; i < n; i++) { 4387848b8605Smrg CLAMPED_FLOAT_TO_UBYTE(dst[aDst], rgba[i][ACOMP]); 4388848b8605Smrg dst += dstComponents; 4389848b8605Smrg } 4390848b8605Smrg } 4391848b8605Smrg 4392848b8605Smrg if (iDst >= 0) { 4393848b8605Smrg GLubyte *dst = dest; 4394848b8605Smrg GLuint i; 4395848b8605Smrg assert(iDst == 0); 4396848b8605Smrg assert(dstComponents == 1); 4397848b8605Smrg for (i = 0; i < n; i++) { 4398848b8605Smrg /* Intensity comes from red channel */ 4399848b8605Smrg CLAMPED_FLOAT_TO_UBYTE(dst[i], rgba[i][RCOMP]); 4400848b8605Smrg } 4401848b8605Smrg } 4402848b8605Smrg 4403848b8605Smrg if (lDst >= 0) { 4404848b8605Smrg GLubyte *dst = dest; 4405848b8605Smrg GLuint i; 4406848b8605Smrg assert(lDst == 0); 4407848b8605Smrg for (i = 0; i < n; i++) { 4408848b8605Smrg /* Luminance comes from red channel */ 4409848b8605Smrg CLAMPED_FLOAT_TO_UBYTE(dst[0], rgba[i][RCOMP]); 4410848b8605Smrg dst += dstComponents; 4411848b8605Smrg } 4412848b8605Smrg } 4413848b8605Smrg 4414848b8605Smrg free(rgba); 4415848b8605Smrg } 4416848b8605Smrg} 4417848b8605Smrg 4418848b8605Smrg 4419848b8605Smrg/** 4420848b8605Smrg * Same as _mesa_unpack_color_span_ubyte(), but return GLfloat data 4421848b8605Smrg * instead of GLubyte. 4422848b8605Smrg */ 4423848b8605Smrgvoid 4424848b8605Smrg_mesa_unpack_color_span_float( struct gl_context *ctx, 4425848b8605Smrg GLuint n, GLenum dstFormat, GLfloat dest[], 4426848b8605Smrg GLenum srcFormat, GLenum srcType, 4427848b8605Smrg const GLvoid *source, 4428848b8605Smrg const struct gl_pixelstore_attrib *srcPacking, 4429848b8605Smrg GLbitfield transferOps ) 4430848b8605Smrg{ 4431848b8605Smrg ASSERT(dstFormat == GL_ALPHA || 4432848b8605Smrg dstFormat == GL_LUMINANCE || 4433848b8605Smrg dstFormat == GL_LUMINANCE_ALPHA || 4434848b8605Smrg dstFormat == GL_INTENSITY || 4435848b8605Smrg dstFormat == GL_RED || 4436848b8605Smrg dstFormat == GL_RG || 4437848b8605Smrg dstFormat == GL_RGB || 4438848b8605Smrg dstFormat == GL_RGBA); 4439848b8605Smrg 4440848b8605Smrg ASSERT(srcFormat == GL_RED || 4441848b8605Smrg srcFormat == GL_GREEN || 4442848b8605Smrg srcFormat == GL_BLUE || 4443848b8605Smrg srcFormat == GL_ALPHA || 4444848b8605Smrg srcFormat == GL_LUMINANCE || 4445848b8605Smrg srcFormat == GL_LUMINANCE_ALPHA || 4446848b8605Smrg srcFormat == GL_INTENSITY || 4447848b8605Smrg srcFormat == GL_RG || 4448848b8605Smrg srcFormat == GL_RGB || 4449848b8605Smrg srcFormat == GL_BGR || 4450848b8605Smrg srcFormat == GL_RGBA || 4451848b8605Smrg srcFormat == GL_BGRA || 4452848b8605Smrg srcFormat == GL_ABGR_EXT || 4453848b8605Smrg srcFormat == GL_RED_INTEGER_EXT || 4454848b8605Smrg srcFormat == GL_GREEN_INTEGER_EXT || 4455848b8605Smrg srcFormat == GL_BLUE_INTEGER_EXT || 4456848b8605Smrg srcFormat == GL_ALPHA_INTEGER_EXT || 4457848b8605Smrg srcFormat == GL_RG_INTEGER || 4458848b8605Smrg srcFormat == GL_RGB_INTEGER_EXT || 4459848b8605Smrg srcFormat == GL_RGBA_INTEGER_EXT || 4460848b8605Smrg srcFormat == GL_BGR_INTEGER_EXT || 4461848b8605Smrg srcFormat == GL_BGRA_INTEGER_EXT || 4462848b8605Smrg srcFormat == GL_LUMINANCE_INTEGER_EXT || 4463848b8605Smrg srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT || 4464848b8605Smrg srcFormat == GL_COLOR_INDEX); 4465848b8605Smrg 4466848b8605Smrg ASSERT(srcType == GL_BITMAP || 4467848b8605Smrg srcType == GL_UNSIGNED_BYTE || 4468848b8605Smrg srcType == GL_BYTE || 4469848b8605Smrg srcType == GL_UNSIGNED_SHORT || 4470848b8605Smrg srcType == GL_SHORT || 4471848b8605Smrg srcType == GL_UNSIGNED_INT || 4472848b8605Smrg srcType == GL_INT || 4473848b8605Smrg srcType == GL_HALF_FLOAT_ARB || 4474848b8605Smrg srcType == GL_FLOAT || 4475848b8605Smrg srcType == GL_UNSIGNED_BYTE_3_3_2 || 4476848b8605Smrg srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 4477848b8605Smrg srcType == GL_UNSIGNED_SHORT_5_6_5 || 4478848b8605Smrg srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 4479848b8605Smrg srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 4480848b8605Smrg srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 4481848b8605Smrg srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 4482848b8605Smrg srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 4483848b8605Smrg srcType == GL_UNSIGNED_INT_8_8_8_8 || 4484848b8605Smrg srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 4485848b8605Smrg srcType == GL_UNSIGNED_INT_10_10_10_2 || 4486848b8605Smrg srcType == GL_UNSIGNED_INT_2_10_10_10_REV || 4487848b8605Smrg srcType == GL_UNSIGNED_INT_5_9_9_9_REV || 4488848b8605Smrg srcType == GL_UNSIGNED_INT_10F_11F_11F_REV); 4489848b8605Smrg 4490848b8605Smrg /* general solution, no special cases, yet */ 4491848b8605Smrg { 4492848b8605Smrg GLint dstComponents; 4493848b8605Smrg GLint rDst, gDst, bDst, aDst, lDst, iDst; 4494848b8605Smrg GLfloat (*rgba)[4] = malloc(4 * n * sizeof(GLfloat)); 4495848b8605Smrg GLboolean intFormat = _mesa_is_enum_format_integer(srcFormat); 4496848b8605Smrg 4497848b8605Smrg if (!rgba) { 4498848b8605Smrg _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 4499848b8605Smrg return; 4500848b8605Smrg } 4501848b8605Smrg 4502848b8605Smrg dstComponents = _mesa_components_in_format( dstFormat ); 4503848b8605Smrg /* source & dest image formats should have been error checked by now */ 4504848b8605Smrg assert(dstComponents > 0); 4505848b8605Smrg 4506848b8605Smrg /* EXT_texture_integer specifies no transfer ops on integer 4507848b8605Smrg * types in the resolved issues section. Just set them to 0 4508848b8605Smrg * for integer surfaces. 4509848b8605Smrg */ 4510848b8605Smrg if (intFormat) 4511848b8605Smrg transferOps = 0; 4512848b8605Smrg 4513848b8605Smrg /* 4514848b8605Smrg * Extract image data and convert to RGBA floats 4515848b8605Smrg */ 4516848b8605Smrg if (srcFormat == GL_COLOR_INDEX) { 4517848b8605Smrg GLuint *indexes = malloc(n * sizeof(GLuint)); 4518848b8605Smrg 4519848b8605Smrg if (!indexes) { 4520848b8605Smrg _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 4521848b8605Smrg free(rgba); 4522848b8605Smrg return; 4523848b8605Smrg } 4524848b8605Smrg 4525848b8605Smrg extract_uint_indexes(n, indexes, srcFormat, srcType, source, 4526848b8605Smrg srcPacking); 4527848b8605Smrg 4528848b8605Smrg /* Convert indexes to RGBA */ 4529848b8605Smrg if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 4530848b8605Smrg _mesa_shift_and_offset_ci(ctx, n, indexes); 4531848b8605Smrg } 4532848b8605Smrg _mesa_map_ci_to_rgba(ctx, n, indexes, rgba); 4533848b8605Smrg 4534848b8605Smrg /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting 4535848b8605Smrg * with color indexes. 4536848b8605Smrg */ 4537848b8605Smrg transferOps &= ~(IMAGE_SCALE_BIAS_BIT | IMAGE_MAP_COLOR_BIT); 4538848b8605Smrg 4539848b8605Smrg free(indexes); 4540848b8605Smrg } 4541848b8605Smrg else { 4542848b8605Smrg /* non-color index data */ 4543848b8605Smrg extract_float_rgba(n, rgba, srcFormat, srcType, source, 4544848b8605Smrg srcPacking->SwapBytes); 4545848b8605Smrg } 4546848b8605Smrg 4547848b8605Smrg if (transferOps) { 4548848b8605Smrg _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba); 4549848b8605Smrg } 4550848b8605Smrg 4551848b8605Smrg get_component_indexes(dstFormat, 4552848b8605Smrg &rDst, &gDst, &bDst, &aDst, &lDst, &iDst); 4553848b8605Smrg 4554848b8605Smrg /* Now pack results in the requested dstFormat */ 4555848b8605Smrg if (rDst >= 0) { 4556848b8605Smrg GLfloat *dst = dest; 4557848b8605Smrg GLuint i; 4558848b8605Smrg for (i = 0; i < n; i++) { 4559848b8605Smrg dst[rDst] = rgba[i][RCOMP]; 4560848b8605Smrg dst += dstComponents; 4561848b8605Smrg } 4562848b8605Smrg } 4563848b8605Smrg 4564848b8605Smrg if (gDst >= 0) { 4565848b8605Smrg GLfloat *dst = dest; 4566848b8605Smrg GLuint i; 4567848b8605Smrg for (i = 0; i < n; i++) { 4568848b8605Smrg dst[gDst] = rgba[i][GCOMP]; 4569848b8605Smrg dst += dstComponents; 4570848b8605Smrg } 4571848b8605Smrg } 4572848b8605Smrg 4573848b8605Smrg if (bDst >= 0) { 4574848b8605Smrg GLfloat *dst = dest; 4575848b8605Smrg GLuint i; 4576848b8605Smrg for (i = 0; i < n; i++) { 4577848b8605Smrg dst[bDst] = rgba[i][BCOMP]; 4578848b8605Smrg dst += dstComponents; 4579848b8605Smrg } 4580848b8605Smrg } 4581848b8605Smrg 4582848b8605Smrg if (aDst >= 0) { 4583848b8605Smrg GLfloat *dst = dest; 4584848b8605Smrg GLuint i; 4585848b8605Smrg for (i = 0; i < n; i++) { 4586848b8605Smrg dst[aDst] = rgba[i][ACOMP]; 4587848b8605Smrg dst += dstComponents; 4588848b8605Smrg } 4589848b8605Smrg } 4590848b8605Smrg 4591848b8605Smrg if (iDst >= 0) { 4592848b8605Smrg GLfloat *dst = dest; 4593848b8605Smrg GLuint i; 4594848b8605Smrg assert(iDst == 0); 4595848b8605Smrg assert(dstComponents == 1); 4596848b8605Smrg for (i = 0; i < n; i++) { 4597848b8605Smrg /* Intensity comes from red channel */ 4598848b8605Smrg dst[i] = rgba[i][RCOMP]; 4599848b8605Smrg } 4600848b8605Smrg } 4601848b8605Smrg 4602848b8605Smrg if (lDst >= 0) { 4603848b8605Smrg GLfloat *dst = dest; 4604848b8605Smrg GLuint i; 4605848b8605Smrg assert(lDst == 0); 4606848b8605Smrg for (i = 0; i < n; i++) { 4607848b8605Smrg /* Luminance comes from red channel */ 4608848b8605Smrg dst[0] = rgba[i][RCOMP]; 4609848b8605Smrg dst += dstComponents; 4610848b8605Smrg } 4611848b8605Smrg } 4612848b8605Smrg 4613848b8605Smrg free(rgba); 4614848b8605Smrg } 4615848b8605Smrg} 4616848b8605Smrg 4617848b8605Smrg 4618848b8605Smrg/** 4619848b8605Smrg * Same as _mesa_unpack_color_span_ubyte(), but return GLuint data 4620848b8605Smrg * instead of GLubyte. 4621848b8605Smrg * No pixel transfer ops are applied. 4622848b8605Smrg */ 4623848b8605Smrgvoid 4624848b8605Smrg_mesa_unpack_color_span_uint(struct gl_context *ctx, 4625848b8605Smrg GLuint n, GLenum dstFormat, GLuint *dest, 4626848b8605Smrg GLenum srcFormat, GLenum srcType, 4627848b8605Smrg const GLvoid *source, 4628848b8605Smrg const struct gl_pixelstore_attrib *srcPacking) 4629848b8605Smrg{ 4630848b8605Smrg GLuint (*rgba)[4] = malloc(n * 4 * sizeof(GLfloat)); 4631848b8605Smrg 4632848b8605Smrg if (!rgba) { 4633848b8605Smrg _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 4634848b8605Smrg return; 4635848b8605Smrg } 4636848b8605Smrg 4637848b8605Smrg ASSERT(dstFormat == GL_ALPHA || 4638848b8605Smrg dstFormat == GL_LUMINANCE || 4639848b8605Smrg dstFormat == GL_LUMINANCE_ALPHA || 4640848b8605Smrg dstFormat == GL_INTENSITY || 4641848b8605Smrg dstFormat == GL_RED || 4642848b8605Smrg dstFormat == GL_RG || 4643848b8605Smrg dstFormat == GL_RGB || 4644848b8605Smrg dstFormat == GL_RGBA); 4645848b8605Smrg 4646848b8605Smrg ASSERT(srcFormat == GL_RED || 4647848b8605Smrg srcFormat == GL_GREEN || 4648848b8605Smrg srcFormat == GL_BLUE || 4649848b8605Smrg srcFormat == GL_ALPHA || 4650848b8605Smrg srcFormat == GL_LUMINANCE || 4651848b8605Smrg srcFormat == GL_LUMINANCE_ALPHA || 4652848b8605Smrg srcFormat == GL_INTENSITY || 4653848b8605Smrg srcFormat == GL_RG || 4654848b8605Smrg srcFormat == GL_RGB || 4655848b8605Smrg srcFormat == GL_BGR || 4656848b8605Smrg srcFormat == GL_RGBA || 4657848b8605Smrg srcFormat == GL_BGRA || 4658848b8605Smrg srcFormat == GL_ABGR_EXT || 4659848b8605Smrg srcFormat == GL_RED_INTEGER_EXT || 4660848b8605Smrg srcFormat == GL_GREEN_INTEGER_EXT || 4661848b8605Smrg srcFormat == GL_BLUE_INTEGER_EXT || 4662848b8605Smrg srcFormat == GL_ALPHA_INTEGER_EXT || 4663848b8605Smrg srcFormat == GL_RG_INTEGER || 4664848b8605Smrg srcFormat == GL_RGB_INTEGER_EXT || 4665848b8605Smrg srcFormat == GL_RGBA_INTEGER_EXT || 4666848b8605Smrg srcFormat == GL_BGR_INTEGER_EXT || 4667848b8605Smrg srcFormat == GL_BGRA_INTEGER_EXT || 4668848b8605Smrg srcFormat == GL_LUMINANCE_INTEGER_EXT || 4669848b8605Smrg srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT); 4670848b8605Smrg 4671848b8605Smrg ASSERT(srcType == GL_UNSIGNED_BYTE || 4672848b8605Smrg srcType == GL_BYTE || 4673848b8605Smrg srcType == GL_UNSIGNED_SHORT || 4674848b8605Smrg srcType == GL_SHORT || 4675848b8605Smrg srcType == GL_UNSIGNED_INT || 4676848b8605Smrg srcType == GL_INT || 4677848b8605Smrg srcType == GL_HALF_FLOAT_ARB || 4678848b8605Smrg srcType == GL_FLOAT || 4679848b8605Smrg srcType == GL_UNSIGNED_BYTE_3_3_2 || 4680848b8605Smrg srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 4681848b8605Smrg srcType == GL_UNSIGNED_SHORT_5_6_5 || 4682848b8605Smrg srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 4683848b8605Smrg srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 4684848b8605Smrg srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 4685848b8605Smrg srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 4686848b8605Smrg srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 4687848b8605Smrg srcType == GL_UNSIGNED_INT_8_8_8_8 || 4688848b8605Smrg srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 4689848b8605Smrg srcType == GL_UNSIGNED_INT_10_10_10_2 || 4690848b8605Smrg srcType == GL_UNSIGNED_INT_2_10_10_10_REV || 4691848b8605Smrg srcType == GL_UNSIGNED_INT_5_9_9_9_REV || 4692848b8605Smrg srcType == GL_UNSIGNED_INT_10F_11F_11F_REV); 4693848b8605Smrg 4694848b8605Smrg 4695848b8605Smrg /* Extract image data as uint[4] pixels */ 4696848b8605Smrg extract_uint_rgba(n, rgba, srcFormat, srcType, source, 4697848b8605Smrg srcPacking->SwapBytes); 4698848b8605Smrg 4699848b8605Smrg if (dstFormat == GL_RGBA) { 4700848b8605Smrg /* simple case */ 4701848b8605Smrg memcpy(dest, rgba, 4 * sizeof(GLuint) * n); 4702848b8605Smrg } 4703848b8605Smrg else { 4704848b8605Smrg /* general case */ 4705848b8605Smrg GLint rDst, gDst, bDst, aDst, lDst, iDst; 4706848b8605Smrg GLint dstComponents = _mesa_components_in_format( dstFormat ); 4707848b8605Smrg 4708848b8605Smrg assert(dstComponents > 0); 4709848b8605Smrg 4710848b8605Smrg get_component_indexes(dstFormat, 4711848b8605Smrg &rDst, &gDst, &bDst, &aDst, &lDst, &iDst); 4712848b8605Smrg 4713848b8605Smrg /* Now pack values in the requested dest format */ 4714848b8605Smrg if (rDst >= 0) { 4715848b8605Smrg GLuint *dst = dest; 4716848b8605Smrg GLuint i; 4717848b8605Smrg for (i = 0; i < n; i++) { 4718848b8605Smrg dst[rDst] = rgba[i][RCOMP]; 4719848b8605Smrg dst += dstComponents; 4720848b8605Smrg } 4721848b8605Smrg } 4722848b8605Smrg 4723848b8605Smrg if (gDst >= 0) { 4724848b8605Smrg GLuint *dst = dest; 4725848b8605Smrg GLuint i; 4726848b8605Smrg for (i = 0; i < n; i++) { 4727848b8605Smrg dst[gDst] = rgba[i][GCOMP]; 4728848b8605Smrg dst += dstComponents; 4729848b8605Smrg } 4730848b8605Smrg } 4731848b8605Smrg 4732848b8605Smrg if (bDst >= 0) { 4733848b8605Smrg GLuint *dst = dest; 4734848b8605Smrg GLuint i; 4735848b8605Smrg for (i = 0; i < n; i++) { 4736848b8605Smrg dst[bDst] = rgba[i][BCOMP]; 4737848b8605Smrg dst += dstComponents; 4738848b8605Smrg } 4739848b8605Smrg } 4740848b8605Smrg 4741848b8605Smrg if (aDst >= 0) { 4742848b8605Smrg GLuint *dst = dest; 4743848b8605Smrg GLuint i; 4744848b8605Smrg for (i = 0; i < n; i++) { 4745848b8605Smrg dst[aDst] = rgba[i][ACOMP]; 4746848b8605Smrg dst += dstComponents; 4747848b8605Smrg } 4748848b8605Smrg } 4749848b8605Smrg 4750848b8605Smrg if (iDst >= 0) { 4751848b8605Smrg GLuint *dst = dest; 4752848b8605Smrg GLuint i; 4753848b8605Smrg assert(iDst == 0); 4754848b8605Smrg assert(dstComponents == 1); 4755848b8605Smrg for (i = 0; i < n; i++) { 4756848b8605Smrg /* Intensity comes from red channel */ 4757848b8605Smrg dst[i] = rgba[i][RCOMP]; 4758848b8605Smrg } 4759848b8605Smrg } 4760848b8605Smrg 4761848b8605Smrg if (lDst >= 0) { 4762848b8605Smrg GLuint *dst = dest; 4763848b8605Smrg GLuint i; 4764848b8605Smrg assert(lDst == 0); 4765848b8605Smrg for (i = 0; i < n; i++) { 4766848b8605Smrg /* Luminance comes from red channel */ 4767848b8605Smrg dst[0] = rgba[i][RCOMP]; 4768848b8605Smrg dst += dstComponents; 4769848b8605Smrg } 4770848b8605Smrg } 4771848b8605Smrg } 4772848b8605Smrg 4773848b8605Smrg free(rgba); 4774848b8605Smrg} 4775848b8605Smrg 4776848b8605Smrg 4777848b8605Smrg/* 4778848b8605Smrg * Unpack a row of color index data from a client buffer according to 4779848b8605Smrg * the pixel unpacking parameters. 4780848b8605Smrg * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc. 4781848b8605Smrg * 4782848b8605Smrg * Args: ctx - the context 4783848b8605Smrg * n - number of pixels 4784848b8605Smrg * dstType - destination data type 4785848b8605Smrg * dest - destination array 4786848b8605Smrg * srcType - source pixel type 4787848b8605Smrg * source - source data pointer 4788848b8605Smrg * srcPacking - pixel unpacking parameters 4789848b8605Smrg * transferOps - the pixel transfer operations to apply 4790848b8605Smrg */ 4791848b8605Smrgvoid 4792848b8605Smrg_mesa_unpack_index_span( struct gl_context *ctx, GLuint n, 4793848b8605Smrg GLenum dstType, GLvoid *dest, 4794848b8605Smrg GLenum srcType, const GLvoid *source, 4795848b8605Smrg const struct gl_pixelstore_attrib *srcPacking, 4796848b8605Smrg GLbitfield transferOps ) 4797848b8605Smrg{ 4798848b8605Smrg ASSERT(srcType == GL_BITMAP || 4799848b8605Smrg srcType == GL_UNSIGNED_BYTE || 4800848b8605Smrg srcType == GL_BYTE || 4801848b8605Smrg srcType == GL_UNSIGNED_SHORT || 4802848b8605Smrg srcType == GL_SHORT || 4803848b8605Smrg srcType == GL_UNSIGNED_INT || 4804848b8605Smrg srcType == GL_INT || 4805848b8605Smrg srcType == GL_HALF_FLOAT_ARB || 4806848b8605Smrg srcType == GL_FLOAT); 4807848b8605Smrg 4808848b8605Smrg ASSERT(dstType == GL_UNSIGNED_BYTE || 4809848b8605Smrg dstType == GL_UNSIGNED_SHORT || 4810848b8605Smrg dstType == GL_UNSIGNED_INT); 4811848b8605Smrg 4812848b8605Smrg 4813848b8605Smrg transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT); 4814848b8605Smrg 4815848b8605Smrg /* 4816848b8605Smrg * Try simple cases first 4817848b8605Smrg */ 4818848b8605Smrg if (transferOps == 0 && srcType == GL_UNSIGNED_BYTE 4819848b8605Smrg && dstType == GL_UNSIGNED_BYTE) { 4820848b8605Smrg memcpy(dest, source, n * sizeof(GLubyte)); 4821848b8605Smrg } 4822848b8605Smrg else if (transferOps == 0 && srcType == GL_UNSIGNED_INT 4823848b8605Smrg && dstType == GL_UNSIGNED_INT && !srcPacking->SwapBytes) { 4824848b8605Smrg memcpy(dest, source, n * sizeof(GLuint)); 4825848b8605Smrg } 4826848b8605Smrg else { 4827848b8605Smrg /* 4828848b8605Smrg * general solution 4829848b8605Smrg */ 4830848b8605Smrg GLuint *indexes = malloc(n * sizeof(GLuint)); 4831848b8605Smrg 4832848b8605Smrg if (!indexes) { 4833848b8605Smrg _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 4834848b8605Smrg return; 4835848b8605Smrg } 4836848b8605Smrg 4837848b8605Smrg extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source, 4838848b8605Smrg srcPacking); 4839848b8605Smrg 4840848b8605Smrg if (transferOps) 4841848b8605Smrg _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes); 4842848b8605Smrg 4843848b8605Smrg /* convert to dest type */ 4844848b8605Smrg switch (dstType) { 4845848b8605Smrg case GL_UNSIGNED_BYTE: 4846848b8605Smrg { 4847848b8605Smrg GLubyte *dst = (GLubyte *) dest; 4848848b8605Smrg GLuint i; 4849848b8605Smrg for (i = 0; i < n; i++) { 4850848b8605Smrg dst[i] = (GLubyte) (indexes[i] & 0xff); 4851848b8605Smrg } 4852848b8605Smrg } 4853848b8605Smrg break; 4854848b8605Smrg case GL_UNSIGNED_SHORT: 4855848b8605Smrg { 4856848b8605Smrg GLuint *dst = (GLuint *) dest; 4857848b8605Smrg GLuint i; 4858848b8605Smrg for (i = 0; i < n; i++) { 4859848b8605Smrg dst[i] = (GLushort) (indexes[i] & 0xffff); 4860848b8605Smrg } 4861848b8605Smrg } 4862848b8605Smrg break; 4863848b8605Smrg case GL_UNSIGNED_INT: 4864848b8605Smrg memcpy(dest, indexes, n * sizeof(GLuint)); 4865848b8605Smrg break; 4866848b8605Smrg default: 4867848b8605Smrg _mesa_problem(ctx, "bad dstType in _mesa_unpack_index_span"); 4868848b8605Smrg } 4869848b8605Smrg 4870848b8605Smrg free(indexes); 4871848b8605Smrg } 4872848b8605Smrg} 4873848b8605Smrg 4874848b8605Smrg 4875848b8605Smrgvoid 4876848b8605Smrg_mesa_pack_index_span( struct gl_context *ctx, GLuint n, 4877848b8605Smrg GLenum dstType, GLvoid *dest, const GLuint *source, 4878848b8605Smrg const struct gl_pixelstore_attrib *dstPacking, 4879848b8605Smrg GLbitfield transferOps ) 4880848b8605Smrg{ 4881848b8605Smrg GLuint *indexes = malloc(n * sizeof(GLuint)); 4882848b8605Smrg 4883848b8605Smrg if (!indexes) { 4884848b8605Smrg _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing"); 4885848b8605Smrg return; 4886848b8605Smrg } 4887848b8605Smrg 4888848b8605Smrg transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT); 4889848b8605Smrg 4890848b8605Smrg if (transferOps & (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT)) { 4891848b8605Smrg /* make a copy of input */ 4892848b8605Smrg memcpy(indexes, source, n * sizeof(GLuint)); 4893848b8605Smrg _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes); 4894848b8605Smrg source = indexes; 4895848b8605Smrg } 4896848b8605Smrg 4897848b8605Smrg switch (dstType) { 4898848b8605Smrg case GL_UNSIGNED_BYTE: 4899848b8605Smrg { 4900848b8605Smrg GLubyte *dst = (GLubyte *) dest; 4901848b8605Smrg GLuint i; 4902848b8605Smrg for (i = 0; i < n; i++) { 4903848b8605Smrg *dst++ = (GLubyte) source[i]; 4904848b8605Smrg } 4905848b8605Smrg } 4906848b8605Smrg break; 4907848b8605Smrg case GL_BYTE: 4908848b8605Smrg { 4909848b8605Smrg GLbyte *dst = (GLbyte *) dest; 4910848b8605Smrg GLuint i; 4911848b8605Smrg for (i = 0; i < n; i++) { 4912848b8605Smrg dst[i] = (GLbyte) source[i]; 4913848b8605Smrg } 4914848b8605Smrg } 4915848b8605Smrg break; 4916848b8605Smrg case GL_UNSIGNED_SHORT: 4917848b8605Smrg { 4918848b8605Smrg GLushort *dst = (GLushort *) dest; 4919848b8605Smrg GLuint i; 4920848b8605Smrg for (i = 0; i < n; i++) { 4921848b8605Smrg dst[i] = (GLushort) source[i]; 4922848b8605Smrg } 4923848b8605Smrg if (dstPacking->SwapBytes) { 4924848b8605Smrg _mesa_swap2( (GLushort *) dst, n ); 4925848b8605Smrg } 4926848b8605Smrg } 4927848b8605Smrg break; 4928848b8605Smrg case GL_SHORT: 4929848b8605Smrg { 4930848b8605Smrg GLshort *dst = (GLshort *) dest; 4931848b8605Smrg GLuint i; 4932848b8605Smrg for (i = 0; i < n; i++) { 4933848b8605Smrg dst[i] = (GLshort) source[i]; 4934848b8605Smrg } 4935848b8605Smrg if (dstPacking->SwapBytes) { 4936848b8605Smrg _mesa_swap2( (GLushort *) dst, n ); 4937848b8605Smrg } 4938848b8605Smrg } 4939848b8605Smrg break; 4940848b8605Smrg case GL_UNSIGNED_INT: 4941848b8605Smrg { 4942848b8605Smrg GLuint *dst = (GLuint *) dest; 4943848b8605Smrg GLuint i; 4944848b8605Smrg for (i = 0; i < n; i++) { 4945848b8605Smrg dst[i] = (GLuint) source[i]; 4946848b8605Smrg } 4947848b8605Smrg if (dstPacking->SwapBytes) { 4948848b8605Smrg _mesa_swap4( (GLuint *) dst, n ); 4949848b8605Smrg } 4950848b8605Smrg } 4951848b8605Smrg break; 4952848b8605Smrg case GL_INT: 4953848b8605Smrg { 4954848b8605Smrg GLint *dst = (GLint *) dest; 4955848b8605Smrg GLuint i; 4956848b8605Smrg for (i = 0; i < n; i++) { 4957848b8605Smrg dst[i] = (GLint) source[i]; 4958848b8605Smrg } 4959848b8605Smrg if (dstPacking->SwapBytes) { 4960848b8605Smrg _mesa_swap4( (GLuint *) dst, n ); 4961848b8605Smrg } 4962848b8605Smrg } 4963848b8605Smrg break; 4964848b8605Smrg case GL_FLOAT: 4965848b8605Smrg { 4966848b8605Smrg GLfloat *dst = (GLfloat *) dest; 4967848b8605Smrg GLuint i; 4968848b8605Smrg for (i = 0; i < n; i++) { 4969848b8605Smrg dst[i] = (GLfloat) source[i]; 4970848b8605Smrg } 4971848b8605Smrg if (dstPacking->SwapBytes) { 4972848b8605Smrg _mesa_swap4( (GLuint *) dst, n ); 4973848b8605Smrg } 4974848b8605Smrg } 4975848b8605Smrg break; 4976848b8605Smrg case GL_HALF_FLOAT_ARB: 4977848b8605Smrg { 4978848b8605Smrg GLhalfARB *dst = (GLhalfARB *) dest; 4979848b8605Smrg GLuint i; 4980848b8605Smrg for (i = 0; i < n; i++) { 4981848b8605Smrg dst[i] = _mesa_float_to_half((GLfloat) source[i]); 4982848b8605Smrg } 4983848b8605Smrg if (dstPacking->SwapBytes) { 4984848b8605Smrg _mesa_swap2( (GLushort *) dst, n ); 4985848b8605Smrg } 4986848b8605Smrg } 4987848b8605Smrg break; 4988848b8605Smrg default: 4989848b8605Smrg _mesa_problem(ctx, "bad type in _mesa_pack_index_span"); 4990848b8605Smrg } 4991848b8605Smrg 4992848b8605Smrg free(indexes); 4993848b8605Smrg} 4994848b8605Smrg 4995848b8605Smrg 4996848b8605Smrg/* 4997848b8605Smrg * Unpack a row of stencil data from a client buffer according to 4998848b8605Smrg * the pixel unpacking parameters. 4999848b8605Smrg * This is (or will be) used by glDrawPixels 5000848b8605Smrg * 5001848b8605Smrg * Args: ctx - the context 5002848b8605Smrg * n - number of pixels 5003848b8605Smrg * dstType - destination data type 5004848b8605Smrg * dest - destination array 5005848b8605Smrg * srcType - source pixel type 5006848b8605Smrg * source - source data pointer 5007848b8605Smrg * srcPacking - pixel unpacking parameters 5008848b8605Smrg * transferOps - apply offset/bias/lookup ops? 5009848b8605Smrg */ 5010848b8605Smrgvoid 5011848b8605Smrg_mesa_unpack_stencil_span( struct gl_context *ctx, GLuint n, 5012848b8605Smrg GLenum dstType, GLvoid *dest, 5013848b8605Smrg GLenum srcType, const GLvoid *source, 5014848b8605Smrg const struct gl_pixelstore_attrib *srcPacking, 5015848b8605Smrg GLbitfield transferOps ) 5016848b8605Smrg{ 5017848b8605Smrg ASSERT(srcType == GL_BITMAP || 5018848b8605Smrg srcType == GL_UNSIGNED_BYTE || 5019848b8605Smrg srcType == GL_BYTE || 5020848b8605Smrg srcType == GL_UNSIGNED_SHORT || 5021848b8605Smrg srcType == GL_SHORT || 5022848b8605Smrg srcType == GL_UNSIGNED_INT || 5023848b8605Smrg srcType == GL_INT || 5024848b8605Smrg srcType == GL_UNSIGNED_INT_24_8_EXT || 5025848b8605Smrg srcType == GL_HALF_FLOAT_ARB || 5026848b8605Smrg srcType == GL_FLOAT || 5027848b8605Smrg srcType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV); 5028848b8605Smrg 5029848b8605Smrg ASSERT(dstType == GL_UNSIGNED_BYTE || 5030848b8605Smrg dstType == GL_UNSIGNED_SHORT || 5031848b8605Smrg dstType == GL_UNSIGNED_INT || 5032848b8605Smrg dstType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV); 5033848b8605Smrg 5034848b8605Smrg /* only shift and offset apply to stencil */ 5035848b8605Smrg transferOps &= IMAGE_SHIFT_OFFSET_BIT; 5036848b8605Smrg 5037848b8605Smrg /* 5038848b8605Smrg * Try simple cases first 5039848b8605Smrg */ 5040848b8605Smrg if (transferOps == 0 && 5041848b8605Smrg !ctx->Pixel.MapStencilFlag && 5042848b8605Smrg srcType == GL_UNSIGNED_BYTE && 5043848b8605Smrg dstType == GL_UNSIGNED_BYTE) { 5044848b8605Smrg memcpy(dest, source, n * sizeof(GLubyte)); 5045848b8605Smrg } 5046848b8605Smrg else if (transferOps == 0 && 5047848b8605Smrg !ctx->Pixel.MapStencilFlag && 5048848b8605Smrg srcType == GL_UNSIGNED_INT && 5049848b8605Smrg dstType == GL_UNSIGNED_INT && 5050848b8605Smrg !srcPacking->SwapBytes) { 5051848b8605Smrg memcpy(dest, source, n * sizeof(GLuint)); 5052848b8605Smrg } 5053848b8605Smrg else { 5054848b8605Smrg /* 5055848b8605Smrg * general solution 5056848b8605Smrg */ 5057848b8605Smrg GLuint *indexes = malloc(n * sizeof(GLuint)); 5058848b8605Smrg 5059848b8605Smrg if (!indexes) { 5060848b8605Smrg _mesa_error(ctx, GL_OUT_OF_MEMORY, "stencil unpacking"); 5061848b8605Smrg return; 5062848b8605Smrg } 5063848b8605Smrg 5064848b8605Smrg extract_uint_indexes(n, indexes, GL_STENCIL_INDEX, srcType, source, 5065848b8605Smrg srcPacking); 5066848b8605Smrg 5067848b8605Smrg if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 5068848b8605Smrg /* shift and offset indexes */ 5069848b8605Smrg _mesa_shift_and_offset_ci(ctx, n, indexes); 5070848b8605Smrg } 5071848b8605Smrg 5072848b8605Smrg if (ctx->Pixel.MapStencilFlag) { 5073848b8605Smrg /* Apply stencil lookup table */ 5074848b8605Smrg const GLuint mask = ctx->PixelMaps.StoS.Size - 1; 5075848b8605Smrg GLuint i; 5076848b8605Smrg for (i = 0; i < n; i++) { 5077848b8605Smrg indexes[i] = (GLuint)ctx->PixelMaps.StoS.Map[ indexes[i] & mask ]; 5078848b8605Smrg } 5079848b8605Smrg } 5080848b8605Smrg 5081848b8605Smrg /* convert to dest type */ 5082848b8605Smrg switch (dstType) { 5083848b8605Smrg case GL_UNSIGNED_BYTE: 5084848b8605Smrg { 5085848b8605Smrg GLubyte *dst = (GLubyte *) dest; 5086848b8605Smrg GLuint i; 5087848b8605Smrg for (i = 0; i < n; i++) { 5088848b8605Smrg dst[i] = (GLubyte) (indexes[i] & 0xff); 5089848b8605Smrg } 5090848b8605Smrg } 5091848b8605Smrg break; 5092848b8605Smrg case GL_UNSIGNED_SHORT: 5093848b8605Smrg { 5094848b8605Smrg GLuint *dst = (GLuint *) dest; 5095848b8605Smrg GLuint i; 5096848b8605Smrg for (i = 0; i < n; i++) { 5097848b8605Smrg dst[i] = (GLushort) (indexes[i] & 0xffff); 5098848b8605Smrg } 5099848b8605Smrg } 5100848b8605Smrg break; 5101848b8605Smrg case GL_UNSIGNED_INT: 5102848b8605Smrg memcpy(dest, indexes, n * sizeof(GLuint)); 5103848b8605Smrg break; 5104848b8605Smrg case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 5105848b8605Smrg { 5106848b8605Smrg GLuint *dst = (GLuint *) dest; 5107848b8605Smrg GLuint i; 5108848b8605Smrg for (i = 0; i < n; i++) { 5109848b8605Smrg dst[i*2+1] = indexes[i] & 0xff; /* lower 8 bits */ 5110848b8605Smrg } 5111848b8605Smrg } 5112848b8605Smrg break; 5113848b8605Smrg default: 5114848b8605Smrg _mesa_problem(ctx, "bad dstType in _mesa_unpack_stencil_span"); 5115848b8605Smrg } 5116848b8605Smrg 5117848b8605Smrg free(indexes); 5118848b8605Smrg } 5119848b8605Smrg} 5120848b8605Smrg 5121848b8605Smrg 5122848b8605Smrgvoid 5123848b8605Smrg_mesa_pack_stencil_span( struct gl_context *ctx, GLuint n, 5124848b8605Smrg GLenum dstType, GLvoid *dest, const GLubyte *source, 5125848b8605Smrg const struct gl_pixelstore_attrib *dstPacking ) 5126848b8605Smrg{ 5127848b8605Smrg GLubyte *stencil = malloc(n * sizeof(GLubyte)); 5128848b8605Smrg 5129848b8605Smrg if (!stencil) { 5130848b8605Smrg _mesa_error(ctx, GL_OUT_OF_MEMORY, "stencil packing"); 5131848b8605Smrg return; 5132848b8605Smrg } 5133848b8605Smrg 5134848b8605Smrg if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset || 5135848b8605Smrg ctx->Pixel.MapStencilFlag) { 5136848b8605Smrg /* make a copy of input */ 5137848b8605Smrg memcpy(stencil, source, n * sizeof(GLubyte)); 5138848b8605Smrg _mesa_apply_stencil_transfer_ops(ctx, n, stencil); 5139848b8605Smrg source = stencil; 5140848b8605Smrg } 5141848b8605Smrg 5142848b8605Smrg switch (dstType) { 5143848b8605Smrg case GL_UNSIGNED_BYTE: 5144848b8605Smrg memcpy(dest, source, n); 5145848b8605Smrg break; 5146848b8605Smrg case GL_BYTE: 5147848b8605Smrg { 5148848b8605Smrg GLbyte *dst = (GLbyte *) dest; 5149848b8605Smrg GLuint i; 5150848b8605Smrg for (i=0;i<n;i++) { 5151848b8605Smrg dst[i] = (GLbyte) (source[i] & 0x7f); 5152848b8605Smrg } 5153848b8605Smrg } 5154848b8605Smrg break; 5155848b8605Smrg case GL_UNSIGNED_SHORT: 5156848b8605Smrg { 5157848b8605Smrg GLushort *dst = (GLushort *) dest; 5158848b8605Smrg GLuint i; 5159848b8605Smrg for (i=0;i<n;i++) { 5160848b8605Smrg dst[i] = (GLushort) source[i]; 5161848b8605Smrg } 5162848b8605Smrg if (dstPacking->SwapBytes) { 5163848b8605Smrg _mesa_swap2( (GLushort *) dst, n ); 5164848b8605Smrg } 5165848b8605Smrg } 5166848b8605Smrg break; 5167848b8605Smrg case GL_SHORT: 5168848b8605Smrg { 5169848b8605Smrg GLshort *dst = (GLshort *) dest; 5170848b8605Smrg GLuint i; 5171848b8605Smrg for (i=0;i<n;i++) { 5172848b8605Smrg dst[i] = (GLshort) source[i]; 5173848b8605Smrg } 5174848b8605Smrg if (dstPacking->SwapBytes) { 5175848b8605Smrg _mesa_swap2( (GLushort *) dst, n ); 5176848b8605Smrg } 5177848b8605Smrg } 5178848b8605Smrg break; 5179848b8605Smrg case GL_UNSIGNED_INT: 5180848b8605Smrg { 5181848b8605Smrg GLuint *dst = (GLuint *) dest; 5182848b8605Smrg GLuint i; 5183848b8605Smrg for (i=0;i<n;i++) { 5184848b8605Smrg dst[i] = (GLuint) source[i]; 5185848b8605Smrg } 5186848b8605Smrg if (dstPacking->SwapBytes) { 5187848b8605Smrg _mesa_swap4( (GLuint *) dst, n ); 5188848b8605Smrg } 5189848b8605Smrg } 5190848b8605Smrg break; 5191848b8605Smrg case GL_INT: 5192848b8605Smrg { 5193848b8605Smrg GLint *dst = (GLint *) dest; 5194848b8605Smrg GLuint i; 5195848b8605Smrg for (i=0;i<n;i++) { 5196848b8605Smrg dst[i] = (GLint) source[i]; 5197848b8605Smrg } 5198848b8605Smrg if (dstPacking->SwapBytes) { 5199848b8605Smrg _mesa_swap4( (GLuint *) dst, n ); 5200848b8605Smrg } 5201848b8605Smrg } 5202848b8605Smrg break; 5203848b8605Smrg case GL_FLOAT: 5204848b8605Smrg { 5205848b8605Smrg GLfloat *dst = (GLfloat *) dest; 5206848b8605Smrg GLuint i; 5207848b8605Smrg for (i=0;i<n;i++) { 5208848b8605Smrg dst[i] = (GLfloat) source[i]; 5209848b8605Smrg } 5210848b8605Smrg if (dstPacking->SwapBytes) { 5211848b8605Smrg _mesa_swap4( (GLuint *) dst, n ); 5212848b8605Smrg } 5213848b8605Smrg } 5214848b8605Smrg break; 5215848b8605Smrg case GL_HALF_FLOAT_ARB: 5216848b8605Smrg { 5217848b8605Smrg GLhalfARB *dst = (GLhalfARB *) dest; 5218848b8605Smrg GLuint i; 5219848b8605Smrg for (i=0;i<n;i++) { 5220848b8605Smrg dst[i] = _mesa_float_to_half( (float) source[i] ); 5221848b8605Smrg } 5222848b8605Smrg if (dstPacking->SwapBytes) { 5223848b8605Smrg _mesa_swap2( (GLushort *) dst, n ); 5224848b8605Smrg } 5225848b8605Smrg } 5226848b8605Smrg break; 5227848b8605Smrg case GL_BITMAP: 5228848b8605Smrg if (dstPacking->LsbFirst) { 5229848b8605Smrg GLubyte *dst = (GLubyte *) dest; 5230848b8605Smrg GLint shift = 0; 5231848b8605Smrg GLuint i; 5232848b8605Smrg for (i = 0; i < n; i++) { 5233848b8605Smrg if (shift == 0) 5234848b8605Smrg *dst = 0; 5235848b8605Smrg *dst |= ((source[i] != 0) << shift); 5236848b8605Smrg shift++; 5237848b8605Smrg if (shift == 8) { 5238848b8605Smrg shift = 0; 5239848b8605Smrg dst++; 5240848b8605Smrg } 5241848b8605Smrg } 5242848b8605Smrg } 5243848b8605Smrg else { 5244848b8605Smrg GLubyte *dst = (GLubyte *) dest; 5245848b8605Smrg GLint shift = 7; 5246848b8605Smrg GLuint i; 5247848b8605Smrg for (i = 0; i < n; i++) { 5248848b8605Smrg if (shift == 7) 5249848b8605Smrg *dst = 0; 5250848b8605Smrg *dst |= ((source[i] != 0) << shift); 5251848b8605Smrg shift--; 5252848b8605Smrg if (shift < 0) { 5253848b8605Smrg shift = 7; 5254848b8605Smrg dst++; 5255848b8605Smrg } 5256848b8605Smrg } 5257848b8605Smrg } 5258848b8605Smrg break; 5259848b8605Smrg default: 5260848b8605Smrg _mesa_problem(ctx, "bad type in _mesa_pack_index_span"); 5261848b8605Smrg } 5262848b8605Smrg 5263848b8605Smrg free(stencil); 5264848b8605Smrg} 5265848b8605Smrg 5266848b8605Smrg#define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \ 5267848b8605Smrg do { \ 5268848b8605Smrg GLuint i; \ 5269848b8605Smrg const GLTYPE *src = (const GLTYPE *)source; \ 5270848b8605Smrg for (i = 0; i < n; i++) { \ 5271848b8605Smrg GLTYPE value = src[i]; \ 5272848b8605Smrg if (srcPacking->SwapBytes) { \ 5273848b8605Smrg if (sizeof(GLTYPE) == 2) { \ 5274848b8605Smrg SWAP2BYTE(value); \ 5275848b8605Smrg } else if (sizeof(GLTYPE) == 4) { \ 5276848b8605Smrg SWAP4BYTE(value); \ 5277848b8605Smrg } \ 5278848b8605Smrg } \ 5279848b8605Smrg depthValues[i] = GLTYPE2FLOAT(value); \ 5280848b8605Smrg } \ 5281848b8605Smrg } while (0) 5282848b8605Smrg 5283848b8605Smrg 5284848b8605Smrg/** 5285848b8605Smrg * Unpack a row of depth/z values from memory, returning GLushort, GLuint 5286848b8605Smrg * or GLfloat values. 5287848b8605Smrg * The glPixelTransfer (scale/bias) params will be applied. 5288848b8605Smrg * 5289848b8605Smrg * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT 5290848b8605Smrg * \param depthMax max value for returned GLushort or GLuint values 5291848b8605Smrg * (ignored for GLfloat). 5292848b8605Smrg */ 5293848b8605Smrgvoid 5294848b8605Smrg_mesa_unpack_depth_span( struct gl_context *ctx, GLuint n, 5295848b8605Smrg GLenum dstType, GLvoid *dest, GLuint depthMax, 5296848b8605Smrg GLenum srcType, const GLvoid *source, 5297848b8605Smrg const struct gl_pixelstore_attrib *srcPacking ) 5298848b8605Smrg{ 5299848b8605Smrg GLfloat *depthTemp = NULL, *depthValues; 5300848b8605Smrg GLboolean needClamp = GL_FALSE; 5301848b8605Smrg 5302848b8605Smrg /* Look for special cases first. 5303848b8605Smrg * Not only are these faster, they're less prone to numeric conversion 5304848b8605Smrg * problems. Otherwise, converting from an int type to a float then 5305848b8605Smrg * back to an int type can introduce errors that will show up as 5306848b8605Smrg * artifacts in things like depth peeling which uses glCopyTexImage. 5307848b8605Smrg */ 5308848b8605Smrg if (ctx->Pixel.DepthScale == 1.0 && ctx->Pixel.DepthBias == 0.0) { 5309848b8605Smrg if (srcType == GL_UNSIGNED_INT && dstType == GL_UNSIGNED_SHORT) { 5310848b8605Smrg const GLuint *src = (const GLuint *) source; 5311848b8605Smrg GLushort *dst = (GLushort *) dest; 5312848b8605Smrg GLuint i; 5313848b8605Smrg for (i = 0; i < n; i++) { 5314848b8605Smrg dst[i] = src[i] >> 16; 5315848b8605Smrg } 5316848b8605Smrg return; 5317848b8605Smrg } 5318848b8605Smrg if (srcType == GL_UNSIGNED_SHORT 5319848b8605Smrg && dstType == GL_UNSIGNED_INT 5320848b8605Smrg && depthMax == 0xffffffff) { 5321848b8605Smrg const GLushort *src = (const GLushort *) source; 5322848b8605Smrg GLuint *dst = (GLuint *) dest; 5323848b8605Smrg GLuint i; 5324848b8605Smrg for (i = 0; i < n; i++) { 5325848b8605Smrg dst[i] = src[i] | (src[i] << 16); 5326848b8605Smrg } 5327848b8605Smrg return; 5328848b8605Smrg } 5329848b8605Smrg if (srcType == GL_UNSIGNED_INT_24_8 5330848b8605Smrg && dstType == GL_UNSIGNED_INT 5331848b8605Smrg && depthMax == 0xffffff) { 5332848b8605Smrg const GLuint *src = (const GLuint *) source; 5333848b8605Smrg GLuint *dst = (GLuint *) dest; 5334848b8605Smrg GLuint i; 5335848b8605Smrg for (i = 0; i < n; i++) { 5336848b8605Smrg dst[i] = src[i] >> 8; 5337848b8605Smrg } 5338848b8605Smrg return; 5339848b8605Smrg } 5340848b8605Smrg /* XXX may want to add additional cases here someday */ 5341848b8605Smrg } 5342848b8605Smrg 5343848b8605Smrg /* general case path follows */ 5344848b8605Smrg 5345848b8605Smrg if (dstType == GL_FLOAT) { 5346848b8605Smrg depthValues = (GLfloat *) dest; 5347848b8605Smrg } 5348848b8605Smrg else { 5349848b8605Smrg depthTemp = malloc(n * sizeof(GLfloat)); 5350848b8605Smrg if (!depthTemp) { 5351848b8605Smrg _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 5352848b8605Smrg return; 5353848b8605Smrg } 5354848b8605Smrg 5355848b8605Smrg depthValues = depthTemp; 5356848b8605Smrg } 5357848b8605Smrg 5358848b8605Smrg /* Convert incoming values to GLfloat. Some conversions will require 5359848b8605Smrg * clamping, below. 5360848b8605Smrg */ 5361848b8605Smrg switch (srcType) { 5362848b8605Smrg case GL_BYTE: 5363848b8605Smrg DEPTH_VALUES(GLbyte, BYTE_TO_FLOATZ); 5364848b8605Smrg needClamp = GL_TRUE; 5365848b8605Smrg break; 5366848b8605Smrg case GL_UNSIGNED_BYTE: 5367848b8605Smrg DEPTH_VALUES(GLubyte, UBYTE_TO_FLOAT); 5368848b8605Smrg break; 5369848b8605Smrg case GL_SHORT: 5370848b8605Smrg DEPTH_VALUES(GLshort, SHORT_TO_FLOATZ); 5371848b8605Smrg needClamp = GL_TRUE; 5372848b8605Smrg break; 5373848b8605Smrg case GL_UNSIGNED_SHORT: 5374848b8605Smrg DEPTH_VALUES(GLushort, USHORT_TO_FLOAT); 5375848b8605Smrg break; 5376848b8605Smrg case GL_INT: 5377848b8605Smrg DEPTH_VALUES(GLint, INT_TO_FLOAT); 5378848b8605Smrg needClamp = GL_TRUE; 5379848b8605Smrg break; 5380848b8605Smrg case GL_UNSIGNED_INT: 5381848b8605Smrg DEPTH_VALUES(GLuint, UINT_TO_FLOAT); 5382848b8605Smrg break; 5383848b8605Smrg case GL_UNSIGNED_INT_24_8_EXT: /* GL_EXT_packed_depth_stencil */ 5384848b8605Smrg if (dstType == GL_UNSIGNED_INT_24_8_EXT && 5385848b8605Smrg depthMax == 0xffffff && 5386848b8605Smrg ctx->Pixel.DepthScale == 1.0 && 5387848b8605Smrg ctx->Pixel.DepthBias == 0.0) { 5388848b8605Smrg const GLuint *src = (const GLuint *) source; 5389848b8605Smrg GLuint *zValues = (GLuint *) dest; 5390848b8605Smrg GLuint i; 5391848b8605Smrg for (i = 0; i < n; i++) { 5392848b8605Smrg GLuint value = src[i]; 5393848b8605Smrg if (srcPacking->SwapBytes) { 5394848b8605Smrg SWAP4BYTE(value); 5395848b8605Smrg } 5396848b8605Smrg zValues[i] = value & 0xffffff00; 5397848b8605Smrg } 5398848b8605Smrg free(depthTemp); 5399848b8605Smrg return; 5400848b8605Smrg } 5401848b8605Smrg else { 5402848b8605Smrg const GLuint *src = (const GLuint *) source; 5403848b8605Smrg const GLfloat scale = 1.0f / 0xffffff; 5404848b8605Smrg GLuint i; 5405848b8605Smrg for (i = 0; i < n; i++) { 5406848b8605Smrg GLuint value = src[i]; 5407848b8605Smrg if (srcPacking->SwapBytes) { 5408848b8605Smrg SWAP4BYTE(value); 5409848b8605Smrg } 5410848b8605Smrg depthValues[i] = (value >> 8) * scale; 5411848b8605Smrg } 5412848b8605Smrg } 5413848b8605Smrg break; 5414848b8605Smrg case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 5415848b8605Smrg { 5416848b8605Smrg GLuint i; 5417848b8605Smrg const GLfloat *src = (const GLfloat *)source; 5418848b8605Smrg for (i = 0; i < n; i++) { 5419848b8605Smrg GLfloat value = src[i * 2]; 5420848b8605Smrg if (srcPacking->SwapBytes) { 5421848b8605Smrg SWAP4BYTE(value); 5422848b8605Smrg } 5423848b8605Smrg depthValues[i] = value; 5424848b8605Smrg } 5425848b8605Smrg needClamp = GL_TRUE; 5426848b8605Smrg } 5427848b8605Smrg break; 5428848b8605Smrg case GL_FLOAT: 5429848b8605Smrg DEPTH_VALUES(GLfloat, 1*); 5430848b8605Smrg needClamp = GL_TRUE; 5431848b8605Smrg break; 5432848b8605Smrg case GL_HALF_FLOAT_ARB: 5433848b8605Smrg { 5434848b8605Smrg GLuint i; 5435848b8605Smrg const GLhalfARB *src = (const GLhalfARB *) source; 5436848b8605Smrg for (i = 0; i < n; i++) { 5437848b8605Smrg GLhalfARB value = src[i]; 5438848b8605Smrg if (srcPacking->SwapBytes) { 5439848b8605Smrg SWAP2BYTE(value); 5440848b8605Smrg } 5441848b8605Smrg depthValues[i] = _mesa_half_to_float(value); 5442848b8605Smrg } 5443848b8605Smrg needClamp = GL_TRUE; 5444848b8605Smrg } 5445848b8605Smrg break; 5446848b8605Smrg default: 5447848b8605Smrg _mesa_problem(NULL, "bad type in _mesa_unpack_depth_span()"); 5448848b8605Smrg free(depthTemp); 5449848b8605Smrg return; 5450848b8605Smrg } 5451848b8605Smrg 5452848b8605Smrg /* apply depth scale and bias */ 5453848b8605Smrg { 5454848b8605Smrg const GLfloat scale = ctx->Pixel.DepthScale; 5455848b8605Smrg const GLfloat bias = ctx->Pixel.DepthBias; 5456848b8605Smrg if (scale != 1.0 || bias != 0.0) { 5457848b8605Smrg GLuint i; 5458848b8605Smrg for (i = 0; i < n; i++) { 5459848b8605Smrg depthValues[i] = depthValues[i] * scale + bias; 5460848b8605Smrg } 5461848b8605Smrg needClamp = GL_TRUE; 5462848b8605Smrg } 5463848b8605Smrg } 5464848b8605Smrg 5465848b8605Smrg /* clamp to [0, 1] */ 5466848b8605Smrg if (needClamp) { 5467848b8605Smrg GLuint i; 5468848b8605Smrg for (i = 0; i < n; i++) { 5469848b8605Smrg depthValues[i] = (GLfloat)CLAMP(depthValues[i], 0.0, 1.0); 5470848b8605Smrg } 5471848b8605Smrg } 5472848b8605Smrg 5473848b8605Smrg /* 5474848b8605Smrg * Convert values to dstType 5475848b8605Smrg */ 5476848b8605Smrg if (dstType == GL_UNSIGNED_INT) { 5477848b8605Smrg GLuint *zValues = (GLuint *) dest; 5478848b8605Smrg GLuint i; 5479848b8605Smrg if (depthMax <= 0xffffff) { 5480848b8605Smrg /* no overflow worries */ 5481848b8605Smrg for (i = 0; i < n; i++) { 5482848b8605Smrg zValues[i] = (GLuint) (depthValues[i] * (GLfloat) depthMax); 5483848b8605Smrg } 5484848b8605Smrg } 5485848b8605Smrg else { 5486848b8605Smrg /* need to use double precision to prevent overflow problems */ 5487848b8605Smrg for (i = 0; i < n; i++) { 5488848b8605Smrg GLdouble z = depthValues[i] * (GLdouble) depthMax; 5489848b8605Smrg if (z >= (GLdouble) 0xffffffff) 5490848b8605Smrg zValues[i] = 0xffffffff; 5491848b8605Smrg else 5492848b8605Smrg zValues[i] = (GLuint) z; 5493848b8605Smrg } 5494848b8605Smrg } 5495848b8605Smrg } 5496848b8605Smrg else if (dstType == GL_UNSIGNED_SHORT) { 5497848b8605Smrg GLushort *zValues = (GLushort *) dest; 5498848b8605Smrg GLuint i; 5499848b8605Smrg ASSERT(depthMax <= 0xffff); 5500848b8605Smrg for (i = 0; i < n; i++) { 5501848b8605Smrg zValues[i] = (GLushort) (depthValues[i] * (GLfloat) depthMax); 5502848b8605Smrg } 5503848b8605Smrg } 5504848b8605Smrg else if (dstType == GL_FLOAT) { 5505848b8605Smrg /* Nothing to do. depthValues is pointing to dest. */ 5506848b8605Smrg } 5507848b8605Smrg else if (dstType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV) { 5508848b8605Smrg GLfloat *zValues = (GLfloat*) dest; 5509848b8605Smrg GLuint i; 5510848b8605Smrg for (i = 0; i < n; i++) { 5511848b8605Smrg zValues[i*2] = depthValues[i]; 5512848b8605Smrg } 5513848b8605Smrg } 5514848b8605Smrg else { 5515848b8605Smrg ASSERT(0); 5516848b8605Smrg } 5517848b8605Smrg 5518848b8605Smrg free(depthTemp); 5519848b8605Smrg} 5520848b8605Smrg 5521848b8605Smrg 5522848b8605Smrg/* 5523848b8605Smrg * Pack an array of depth values. The values are floats in [0,1]. 5524848b8605Smrg */ 5525848b8605Smrgvoid 5526848b8605Smrg_mesa_pack_depth_span( struct gl_context *ctx, GLuint n, GLvoid *dest, 5527848b8605Smrg GLenum dstType, const GLfloat *depthSpan, 5528848b8605Smrg const struct gl_pixelstore_attrib *dstPacking ) 5529848b8605Smrg{ 5530848b8605Smrg GLfloat *depthCopy = malloc(n * sizeof(GLfloat)); 5531848b8605Smrg if (!depthCopy) { 5532848b8605Smrg _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing"); 5533848b8605Smrg return; 5534848b8605Smrg } 5535848b8605Smrg 5536848b8605Smrg if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) { 5537848b8605Smrg memcpy(depthCopy, depthSpan, n * sizeof(GLfloat)); 5538848b8605Smrg _mesa_scale_and_bias_depth(ctx, n, depthCopy); 5539848b8605Smrg depthSpan = depthCopy; 5540848b8605Smrg } 5541848b8605Smrg 5542848b8605Smrg switch (dstType) { 5543848b8605Smrg case GL_UNSIGNED_BYTE: 5544848b8605Smrg { 5545848b8605Smrg GLubyte *dst = (GLubyte *) dest; 5546848b8605Smrg GLuint i; 5547848b8605Smrg for (i = 0; i < n; i++) { 5548848b8605Smrg dst[i] = FLOAT_TO_UBYTE( depthSpan[i] ); 5549848b8605Smrg } 5550848b8605Smrg } 5551848b8605Smrg break; 5552848b8605Smrg case GL_BYTE: 5553848b8605Smrg { 5554848b8605Smrg GLbyte *dst = (GLbyte *) dest; 5555848b8605Smrg GLuint i; 5556848b8605Smrg for (i = 0; i < n; i++) { 5557848b8605Smrg dst[i] = FLOAT_TO_BYTE( depthSpan[i] ); 5558848b8605Smrg } 5559848b8605Smrg } 5560848b8605Smrg break; 5561848b8605Smrg case GL_UNSIGNED_SHORT: 5562848b8605Smrg { 5563848b8605Smrg GLushort *dst = (GLushort *) dest; 5564848b8605Smrg GLuint i; 5565848b8605Smrg for (i = 0; i < n; i++) { 5566848b8605Smrg CLAMPED_FLOAT_TO_USHORT(dst[i], depthSpan[i]); 5567848b8605Smrg } 5568848b8605Smrg if (dstPacking->SwapBytes) { 5569848b8605Smrg _mesa_swap2( (GLushort *) dst, n ); 5570848b8605Smrg } 5571848b8605Smrg } 5572848b8605Smrg break; 5573848b8605Smrg case GL_SHORT: 5574848b8605Smrg { 5575848b8605Smrg GLshort *dst = (GLshort *) dest; 5576848b8605Smrg GLuint i; 5577848b8605Smrg for (i = 0; i < n; i++) { 5578848b8605Smrg dst[i] = FLOAT_TO_SHORT( depthSpan[i] ); 5579848b8605Smrg } 5580848b8605Smrg if (dstPacking->SwapBytes) { 5581848b8605Smrg _mesa_swap2( (GLushort *) dst, n ); 5582848b8605Smrg } 5583848b8605Smrg } 5584848b8605Smrg break; 5585848b8605Smrg case GL_UNSIGNED_INT: 5586848b8605Smrg { 5587848b8605Smrg GLuint *dst = (GLuint *) dest; 5588848b8605Smrg GLuint i; 5589848b8605Smrg for (i = 0; i < n; i++) { 5590848b8605Smrg dst[i] = FLOAT_TO_UINT( depthSpan[i] ); 5591848b8605Smrg } 5592848b8605Smrg if (dstPacking->SwapBytes) { 5593848b8605Smrg _mesa_swap4( (GLuint *) dst, n ); 5594848b8605Smrg } 5595848b8605Smrg } 5596848b8605Smrg break; 5597848b8605Smrg case GL_INT: 5598848b8605Smrg { 5599848b8605Smrg GLint *dst = (GLint *) dest; 5600848b8605Smrg GLuint i; 5601848b8605Smrg for (i = 0; i < n; i++) { 5602848b8605Smrg dst[i] = FLOAT_TO_INT( depthSpan[i] ); 5603848b8605Smrg } 5604848b8605Smrg if (dstPacking->SwapBytes) { 5605848b8605Smrg _mesa_swap4( (GLuint *) dst, n ); 5606848b8605Smrg } 5607848b8605Smrg } 5608848b8605Smrg break; 5609848b8605Smrg case GL_FLOAT: 5610848b8605Smrg { 5611848b8605Smrg GLfloat *dst = (GLfloat *) dest; 5612848b8605Smrg GLuint i; 5613848b8605Smrg for (i = 0; i < n; i++) { 5614848b8605Smrg dst[i] = depthSpan[i]; 5615848b8605Smrg } 5616848b8605Smrg if (dstPacking->SwapBytes) { 5617848b8605Smrg _mesa_swap4( (GLuint *) dst, n ); 5618848b8605Smrg } 5619848b8605Smrg } 5620848b8605Smrg break; 5621848b8605Smrg case GL_HALF_FLOAT_ARB: 5622848b8605Smrg { 5623848b8605Smrg GLhalfARB *dst = (GLhalfARB *) dest; 5624848b8605Smrg GLuint i; 5625848b8605Smrg for (i = 0; i < n; i++) { 5626848b8605Smrg dst[i] = _mesa_float_to_half(depthSpan[i]); 5627848b8605Smrg } 5628848b8605Smrg if (dstPacking->SwapBytes) { 5629848b8605Smrg _mesa_swap2( (GLushort *) dst, n ); 5630848b8605Smrg } 5631848b8605Smrg } 5632848b8605Smrg break; 5633848b8605Smrg default: 5634848b8605Smrg _mesa_problem(ctx, "bad type in _mesa_pack_depth_span"); 5635848b8605Smrg } 5636848b8605Smrg 5637848b8605Smrg free(depthCopy); 5638848b8605Smrg} 5639848b8605Smrg 5640848b8605Smrg 5641848b8605Smrg 5642848b8605Smrg/** 5643848b8605Smrg * Pack depth and stencil values as GL_DEPTH_STENCIL (GL_UNSIGNED_INT_24_8 etc) 5644848b8605Smrg */ 5645848b8605Smrgvoid 5646848b8605Smrg_mesa_pack_depth_stencil_span(struct gl_context *ctx,GLuint n, 5647848b8605Smrg GLenum dstType, GLuint *dest, 5648848b8605Smrg const GLfloat *depthVals, 5649848b8605Smrg const GLubyte *stencilVals, 5650848b8605Smrg const struct gl_pixelstore_attrib *dstPacking) 5651848b8605Smrg{ 5652848b8605Smrg GLfloat *depthCopy = malloc(n * sizeof(GLfloat)); 5653848b8605Smrg GLubyte *stencilCopy = malloc(n * sizeof(GLubyte)); 5654848b8605Smrg GLuint i; 5655848b8605Smrg 5656848b8605Smrg if (!depthCopy || !stencilCopy) { 5657848b8605Smrg _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing"); 5658848b8605Smrg free(depthCopy); 5659848b8605Smrg free(stencilCopy); 5660848b8605Smrg return; 5661848b8605Smrg } 5662848b8605Smrg 5663848b8605Smrg if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) { 5664848b8605Smrg memcpy(depthCopy, depthVals, n * sizeof(GLfloat)); 5665848b8605Smrg _mesa_scale_and_bias_depth(ctx, n, depthCopy); 5666848b8605Smrg depthVals = depthCopy; 5667848b8605Smrg } 5668848b8605Smrg 5669848b8605Smrg if (ctx->Pixel.IndexShift || 5670848b8605Smrg ctx->Pixel.IndexOffset || 5671848b8605Smrg ctx->Pixel.MapStencilFlag) { 5672848b8605Smrg memcpy(stencilCopy, stencilVals, n * sizeof(GLubyte)); 5673848b8605Smrg _mesa_apply_stencil_transfer_ops(ctx, n, stencilCopy); 5674848b8605Smrg stencilVals = stencilCopy; 5675848b8605Smrg } 5676848b8605Smrg 5677848b8605Smrg switch (dstType) { 5678848b8605Smrg case GL_UNSIGNED_INT_24_8: 5679848b8605Smrg for (i = 0; i < n; i++) { 5680848b8605Smrg GLuint z = (GLuint) (depthVals[i] * 0xffffff); 5681848b8605Smrg dest[i] = (z << 8) | (stencilVals[i] & 0xff); 5682848b8605Smrg } 5683848b8605Smrg break; 5684848b8605Smrg case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 5685848b8605Smrg for (i = 0; i < n; i++) { 5686848b8605Smrg ((GLfloat*)dest)[i*2] = depthVals[i]; 5687848b8605Smrg dest[i*2+1] = stencilVals[i] & 0xff; 5688848b8605Smrg } 5689848b8605Smrg break; 5690848b8605Smrg } 5691848b8605Smrg 5692848b8605Smrg if (dstPacking->SwapBytes) { 5693848b8605Smrg _mesa_swap4(dest, n); 5694848b8605Smrg } 5695848b8605Smrg 5696848b8605Smrg free(depthCopy); 5697848b8605Smrg free(stencilCopy); 5698848b8605Smrg} 5699848b8605Smrg 5700848b8605Smrg 5701848b8605Smrg 5702848b8605Smrg 5703848b8605Smrg/** 5704848b8605Smrg * Unpack image data. Apply byte swapping, byte flipping (bitmap). 5705848b8605Smrg * Return all image data in a contiguous block. This is used when we 5706848b8605Smrg * compile glDrawPixels, glTexImage, etc into a display list. We 5707848b8605Smrg * need a copy of the data in a standard format. 5708848b8605Smrg */ 5709848b8605Smrgvoid * 5710848b8605Smrg_mesa_unpack_image( GLuint dimensions, 5711848b8605Smrg GLsizei width, GLsizei height, GLsizei depth, 5712848b8605Smrg GLenum format, GLenum type, const GLvoid *pixels, 5713848b8605Smrg const struct gl_pixelstore_attrib *unpack ) 5714848b8605Smrg{ 5715848b8605Smrg GLint bytesPerRow, compsPerRow; 5716848b8605Smrg GLboolean flipBytes, swap2, swap4; 5717848b8605Smrg 5718848b8605Smrg if (!pixels) 5719848b8605Smrg return NULL; /* not necessarily an error */ 5720848b8605Smrg 5721848b8605Smrg if (width <= 0 || height <= 0 || depth <= 0) 5722848b8605Smrg return NULL; /* generate error later */ 5723848b8605Smrg 5724848b8605Smrg if (type == GL_BITMAP) { 5725848b8605Smrg bytesPerRow = (width + 7) >> 3; 5726848b8605Smrg flipBytes = unpack->LsbFirst; 5727848b8605Smrg swap2 = swap4 = GL_FALSE; 5728848b8605Smrg compsPerRow = 0; 5729848b8605Smrg } 5730848b8605Smrg else { 5731848b8605Smrg const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type); 5732848b8605Smrg GLint components = _mesa_components_in_format(format); 5733848b8605Smrg GLint bytesPerComp; 5734848b8605Smrg 5735848b8605Smrg if (_mesa_type_is_packed(type)) 5736848b8605Smrg components = 1; 5737848b8605Smrg 5738848b8605Smrg if (bytesPerPixel <= 0 || components <= 0) 5739848b8605Smrg return NULL; /* bad format or type. generate error later */ 5740848b8605Smrg bytesPerRow = bytesPerPixel * width; 5741848b8605Smrg bytesPerComp = bytesPerPixel / components; 5742848b8605Smrg flipBytes = GL_FALSE; 5743848b8605Smrg swap2 = (bytesPerComp == 2) && unpack->SwapBytes; 5744848b8605Smrg swap4 = (bytesPerComp == 4) && unpack->SwapBytes; 5745848b8605Smrg compsPerRow = components * width; 5746848b8605Smrg assert(compsPerRow >= width); 5747848b8605Smrg } 5748848b8605Smrg 5749848b8605Smrg { 5750848b8605Smrg GLubyte *destBuffer 5751848b8605Smrg = malloc(bytesPerRow * height * depth); 5752848b8605Smrg GLubyte *dst; 5753848b8605Smrg GLint img, row; 5754848b8605Smrg if (!destBuffer) 5755848b8605Smrg return NULL; /* generate GL_OUT_OF_MEMORY later */ 5756848b8605Smrg 5757848b8605Smrg dst = destBuffer; 5758848b8605Smrg for (img = 0; img < depth; img++) { 5759848b8605Smrg for (row = 0; row < height; row++) { 5760848b8605Smrg const GLvoid *src = _mesa_image_address(dimensions, unpack, pixels, 5761848b8605Smrg width, height, format, type, img, row, 0); 5762848b8605Smrg 5763848b8605Smrg if ((type == GL_BITMAP) && (unpack->SkipPixels & 0x7)) { 5764848b8605Smrg GLint i; 5765848b8605Smrg flipBytes = GL_FALSE; 5766848b8605Smrg if (unpack->LsbFirst) { 5767848b8605Smrg GLubyte srcMask = 1 << (unpack->SkipPixels & 0x7); 5768848b8605Smrg GLubyte dstMask = 128; 5769848b8605Smrg const GLubyte *s = src; 5770848b8605Smrg GLubyte *d = dst; 5771848b8605Smrg *d = 0; 5772848b8605Smrg for (i = 0; i < width; i++) { 5773848b8605Smrg if (*s & srcMask) { 5774848b8605Smrg *d |= dstMask; 5775848b8605Smrg } 5776848b8605Smrg if (srcMask == 128) { 5777848b8605Smrg srcMask = 1; 5778848b8605Smrg s++; 5779848b8605Smrg } 5780848b8605Smrg else { 5781848b8605Smrg srcMask = srcMask << 1; 5782848b8605Smrg } 5783848b8605Smrg if (dstMask == 1) { 5784848b8605Smrg dstMask = 128; 5785848b8605Smrg d++; 5786848b8605Smrg *d = 0; 5787848b8605Smrg } 5788848b8605Smrg else { 5789848b8605Smrg dstMask = dstMask >> 1; 5790848b8605Smrg } 5791848b8605Smrg } 5792848b8605Smrg } 5793848b8605Smrg else { 5794848b8605Smrg GLubyte srcMask = 128 >> (unpack->SkipPixels & 0x7); 5795848b8605Smrg GLubyte dstMask = 128; 5796848b8605Smrg const GLubyte *s = src; 5797848b8605Smrg GLubyte *d = dst; 5798848b8605Smrg *d = 0; 5799848b8605Smrg for (i = 0; i < width; i++) { 5800848b8605Smrg if (*s & srcMask) { 5801848b8605Smrg *d |= dstMask; 5802848b8605Smrg } 5803848b8605Smrg if (srcMask == 1) { 5804848b8605Smrg srcMask = 128; 5805848b8605Smrg s++; 5806848b8605Smrg } 5807848b8605Smrg else { 5808848b8605Smrg srcMask = srcMask >> 1; 5809848b8605Smrg } 5810848b8605Smrg if (dstMask == 1) { 5811848b8605Smrg dstMask = 128; 5812848b8605Smrg d++; 5813848b8605Smrg *d = 0; 5814848b8605Smrg } 5815848b8605Smrg else { 5816848b8605Smrg dstMask = dstMask >> 1; 5817848b8605Smrg } 5818848b8605Smrg } 5819848b8605Smrg } 5820848b8605Smrg } 5821848b8605Smrg else { 5822848b8605Smrg memcpy(dst, src, bytesPerRow); 5823848b8605Smrg } 5824848b8605Smrg 5825848b8605Smrg /* byte flipping/swapping */ 5826848b8605Smrg if (flipBytes) { 5827848b8605Smrg flip_bytes((GLubyte *) dst, bytesPerRow); 5828848b8605Smrg } 5829848b8605Smrg else if (swap2) { 5830848b8605Smrg _mesa_swap2((GLushort*) dst, compsPerRow); 5831848b8605Smrg } 5832848b8605Smrg else if (swap4) { 5833848b8605Smrg _mesa_swap4((GLuint*) dst, compsPerRow); 5834848b8605Smrg } 5835848b8605Smrg dst += bytesPerRow; 5836848b8605Smrg } 5837848b8605Smrg } 5838848b8605Smrg return destBuffer; 5839848b8605Smrg } 5840848b8605Smrg} 5841848b8605Smrg 5842848b8605Smrg 5843848b8605Smrg 5844848b8605Smrg/** 5845848b8605Smrg * If we unpack colors from a luminance surface, we'll get pixel colors 5846848b8605Smrg * such as (l, l, l, a). 5847848b8605Smrg * When we call _mesa_pack_rgba_span_float(format=GL_LUMINANCE), that 5848848b8605Smrg * function will compute L=R+G+B before packing. The net effect is we'll 5849848b8605Smrg * accidentally store luminance values = 3*l. 5850848b8605Smrg * This function compensates for that by converting (aka rebasing) (l,l,l,a) 5851848b8605Smrg * to be (l,0,0,a). 5852848b8605Smrg * It's a similar story for other formats such as LUMINANCE_ALPHA, ALPHA 5853848b8605Smrg * and INTENSITY. 5854848b8605Smrg * 5855848b8605Smrg * Finally, we also need to do this when the actual surface format does 5856848b8605Smrg * not match the logical surface format. For example, suppose the user 5857848b8605Smrg * requests a GL_LUMINANCE texture but the driver stores it as RGBA. 5858848b8605Smrg * Again, we'll get pixel values like (l,l,l,a). 5859848b8605Smrg */ 5860848b8605Smrgvoid 5861848b8605Smrg_mesa_rebase_rgba_float(GLuint n, GLfloat rgba[][4], GLenum baseFormat) 5862848b8605Smrg{ 5863848b8605Smrg GLuint i; 5864848b8605Smrg 5865848b8605Smrg switch (baseFormat) { 5866848b8605Smrg case GL_ALPHA: 5867848b8605Smrg for (i = 0; i < n; i++) { 5868848b8605Smrg rgba[i][RCOMP] = 0.0F; 5869848b8605Smrg rgba[i][GCOMP] = 0.0F; 5870848b8605Smrg rgba[i][BCOMP] = 0.0F; 5871848b8605Smrg } 5872848b8605Smrg break; 5873848b8605Smrg case GL_INTENSITY: 5874848b8605Smrg /* fall-through */ 5875848b8605Smrg case GL_LUMINANCE: 5876848b8605Smrg for (i = 0; i < n; i++) { 5877848b8605Smrg rgba[i][GCOMP] = 0.0F; 5878848b8605Smrg rgba[i][BCOMP] = 0.0F; 5879848b8605Smrg rgba[i][ACOMP] = 1.0F; 5880848b8605Smrg } 5881848b8605Smrg break; 5882848b8605Smrg case GL_LUMINANCE_ALPHA: 5883848b8605Smrg for (i = 0; i < n; i++) { 5884848b8605Smrg rgba[i][GCOMP] = 0.0F; 5885848b8605Smrg rgba[i][BCOMP] = 0.0F; 5886848b8605Smrg } 5887848b8605Smrg break; 5888848b8605Smrg case GL_RGB: 5889848b8605Smrg for (i = 0; i < n; i++) { 5890848b8605Smrg rgba[i][ACOMP] = 1.0F; 5891848b8605Smrg } 5892848b8605Smrg break; 5893848b8605Smrg case GL_RG: 5894848b8605Smrg for (i = 0; i < n; i++) { 5895848b8605Smrg rgba[i][BCOMP] = 0.0F; 5896848b8605Smrg rgba[i][ACOMP] = 1.0F; 5897848b8605Smrg } 5898848b8605Smrg break; 5899848b8605Smrg case GL_RED: 5900848b8605Smrg for (i = 0; i < n; i++) { 5901848b8605Smrg rgba[i][GCOMP] = 0.0F; 5902848b8605Smrg rgba[i][BCOMP] = 0.0F; 5903848b8605Smrg rgba[i][ACOMP] = 1.0F; 5904848b8605Smrg } 5905848b8605Smrg break; 5906848b8605Smrg 5907848b8605Smrg default: 5908848b8605Smrg /* no-op */ 5909848b8605Smrg ; 5910848b8605Smrg } 5911848b8605Smrg} 5912848b8605Smrg 5913848b8605Smrg 5914848b8605Smrg/** 5915848b8605Smrg * As above, but GLuint components. 5916848b8605Smrg */ 5917848b8605Smrgvoid 5918848b8605Smrg_mesa_rebase_rgba_uint(GLuint n, GLuint rgba[][4], GLenum baseFormat) 5919848b8605Smrg{ 5920848b8605Smrg GLuint i; 5921848b8605Smrg 5922848b8605Smrg switch (baseFormat) { 5923848b8605Smrg case GL_ALPHA: 5924848b8605Smrg for (i = 0; i < n; i++) { 5925848b8605Smrg rgba[i][RCOMP] = 0; 5926848b8605Smrg rgba[i][GCOMP] = 0; 5927848b8605Smrg rgba[i][BCOMP] = 0; 5928848b8605Smrg } 5929848b8605Smrg break; 5930848b8605Smrg case GL_INTENSITY: 5931848b8605Smrg /* fall-through */ 5932848b8605Smrg case GL_LUMINANCE: 5933848b8605Smrg for (i = 0; i < n; i++) { 5934848b8605Smrg rgba[i][GCOMP] = 0; 5935848b8605Smrg rgba[i][BCOMP] = 0; 5936848b8605Smrg rgba[i][ACOMP] = 1; 5937848b8605Smrg } 5938848b8605Smrg break; 5939848b8605Smrg case GL_LUMINANCE_ALPHA: 5940848b8605Smrg for (i = 0; i < n; i++) { 5941848b8605Smrg rgba[i][GCOMP] = 0; 5942848b8605Smrg rgba[i][BCOMP] = 0; 5943848b8605Smrg } 5944848b8605Smrg break; 5945848b8605Smrg case GL_RGB: 5946848b8605Smrg for (i = 0; i < n; i++) { 5947848b8605Smrg rgba[i][ACOMP] = 1; 5948848b8605Smrg } 5949848b8605Smrg break; 5950848b8605Smrg case GL_RG: 5951848b8605Smrg for (i = 0; i < n; i++) { 5952848b8605Smrg rgba[i][BCOMP] = 0; 5953848b8605Smrg rgba[i][ACOMP] = 1; 5954848b8605Smrg } 5955848b8605Smrg break; 5956848b8605Smrg case GL_RED: 5957848b8605Smrg for (i = 0; i < n; i++) { 5958848b8605Smrg rgba[i][GCOMP] = 0; 5959848b8605Smrg rgba[i][BCOMP] = 0; 5960848b8605Smrg rgba[i][ACOMP] = 1; 5961848b8605Smrg } 5962848b8605Smrg default: 5963848b8605Smrg /* no-op */ 5964848b8605Smrg ; 5965848b8605Smrg } 5966848b8605Smrg} 5967848b8605Smrg 5968848b8605Smrg 5969