1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2009-2010 VMware, Inc. All Rights Reserved. 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software. 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THEA AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \file pack.c 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Image and pixel span packing and unpacking. 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 334ba6f50a5bc78554a4108750a342c2b5b6b99e73kbr@chromium.org * XXX: MSVC takes forever to compile this module unless we disable 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * this global optimization. 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * See also: 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - http://msdn.microsoft.com/en-us/library/1yk3ydd7.aspx 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - http://msdn.microsoft.com/en-us/library/chh3fb0k.aspx 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 404ba6f50a5bc78554a4108750a342c2b5b6b99e73kbr@chromium.org#if defined(_MSC_VER) 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# pragma optimize( "g", off ) 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glheader.h" 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "colormac.h" 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "enums.h" 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "image.h" 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "imports.h" 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "macros.h" 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "mtypes.h" 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pack.h" 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pixeltransfer.h" 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "imports.h" 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glformats.h" 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "../../gallium/auxiliary/util/u_format_rgb9e5.h" 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "../../gallium/auxiliary/util/u_format_r11g11b10f.h" 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Flip the 8 bits in each byte of the given array. 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param p array. 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param n number of bytes. 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \todo try this trick to flip bytes someday: 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \code 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555); 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333); 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f); 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \endcode 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgflip_bytes( GLubyte *p, GLuint n ) 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i, a, b; 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b = (GLuint) p[i]; /* words are often faster than bytes */ 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org a = ((b & 0x01) << 7) | 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((b & 0x02) << 5) | 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((b & 0x04) << 3) | 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((b & 0x08) << 1) | 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((b & 0x10) >> 1) | 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((b & 0x20) >> 3) | 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((b & 0x40) >> 5) | 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((b & 0x80) >> 7); 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p[i] = (GLubyte) a; 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Unpack a 32x32 pixel polygon stipple from user memory using the 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * current pixel unpack settings. 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_unpack_polygon_stipple( const GLubyte *pattern, GLuint dest[32], 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_pixelstore_attrib *unpacking ) 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *ptrn = (GLubyte *) _mesa_unpack_bitmap(32, 32, pattern, unpacking); 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ptrn) { 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Convert pattern from GLubytes to GLuints and handle big/little 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * endian differences 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *p = ptrn; 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i; 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 32; i++) { 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dest[i] = (p[0] << 24) 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (p[1] << 16) 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (p[2] << 8) 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (p[3] ); 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p += 4; 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(ptrn); 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Pack polygon stipple into user memory given current pixel packing 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * settings. 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_pack_polygon_stipple( const GLuint pattern[32], GLubyte *dest, 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_pixelstore_attrib *packing ) 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Convert pattern from GLuints to GLubytes to handle big/little 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * endian differences. 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte ptrn[32*4]; 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i; 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 32; i++) { 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ptrn[i * 4 + 0] = (GLubyte) ((pattern[i] >> 24) & 0xff); 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ptrn[i * 4 + 1] = (GLubyte) ((pattern[i] >> 16) & 0xff); 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ptrn[i * 4 + 2] = (GLubyte) ((pattern[i] >> 8 ) & 0xff); 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ptrn[i * 4 + 3] = (GLubyte) ((pattern[i] ) & 0xff); 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_pack_bitmap(32, 32, ptrn, dest, packing); 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Unpack bitmap data. Resulting data will be in most-significant-bit-first 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * order with row alignment = 1 byte. 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLvoid * 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_unpack_bitmap( GLint width, GLint height, const GLubyte *pixels, 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_pixelstore_attrib *packing ) 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint bytes, row, width_in_bytes; 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *buffer, *dst; 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!pixels) 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Alloc dest storage */ 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bytes = ((width + 7) / 8 * height); 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer = (GLubyte *) malloc( bytes ); 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!buffer) 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width_in_bytes = CEILING( width, 8 ); 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst = buffer; 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < height; row++) { 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *src = (const GLubyte *) 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_image_address2d(packing, pixels, width, height, 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GL_COLOR_INDEX, GL_BITMAP, row, 0); 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!src) { 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(buffer); 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((packing->SkipPixels & 7) == 0) { 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy( dst, src, width_in_bytes ); 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (packing->LsbFirst) { 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flip_bytes( dst, width_in_bytes ); 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* handling SkipPixels is a bit tricky (no pun intended!) */ 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i; 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (packing->LsbFirst) { 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte srcMask = 1 << (packing->SkipPixels & 0x7); 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte dstMask = 128; 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *s = src; 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *d = dst; 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *d = 0; 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < width; i++) { 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*s & srcMask) { 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *d |= dstMask; 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srcMask == 128) { 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcMask = 1; 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s++; 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcMask = srcMask << 1; 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstMask == 1) { 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstMask = 128; 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org d++; 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *d = 0; 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstMask = dstMask >> 1; 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7); 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte dstMask = 128; 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *s = src; 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *d = dst; 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *d = 0; 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < width; i++) { 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*s & srcMask) { 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *d |= dstMask; 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srcMask == 1) { 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcMask = 128; 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s++; 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcMask = srcMask >> 1; 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstMask == 1) { 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstMask = 128; 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org d++; 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *d = 0; 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstMask = dstMask >> 1; 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += width_in_bytes; 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return buffer; 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Pack bitmap data. 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_pack_bitmap( GLint width, GLint height, const GLubyte *source, 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dest, const struct gl_pixelstore_attrib *packing ) 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint row, width_in_bytes; 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *src; 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!source) 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width_in_bytes = CEILING( width, 8 ); 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src = source; 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < height; row++) { 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dst = (GLubyte *) _mesa_image_address2d(packing, dest, 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width, height, GL_COLOR_INDEX, GL_BITMAP, row, 0); 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dst) 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((packing->SkipPixels & 7) == 0) { 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy( dst, src, width_in_bytes ); 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (packing->LsbFirst) { 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flip_bytes( dst, width_in_bytes ); 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* handling SkipPixels is a bit tricky (no pun intended!) */ 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i; 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (packing->LsbFirst) { 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte srcMask = 128; 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte dstMask = 1 << (packing->SkipPixels & 0x7); 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *s = src; 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *d = dst; 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *d = 0; 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < width; i++) { 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*s & srcMask) { 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *d |= dstMask; 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srcMask == 1) { 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcMask = 128; 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s++; 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcMask = srcMask >> 1; 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstMask == 128) { 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstMask = 1; 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org d++; 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *d = 0; 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstMask = dstMask << 1; 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte srcMask = 128; 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte dstMask = 128 >> (packing->SkipPixels & 0x7); 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *s = src; 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *d = dst; 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *d = 0; 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < width; i++) { 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*s & srcMask) { 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *d |= dstMask; 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srcMask == 1) { 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcMask = 128; 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s++; 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcMask = srcMask >> 1; 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstMask == 1) { 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstMask = 128; 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org d++; 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *d = 0; 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstMask = dstMask >> 1; 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += width_in_bytes; 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Get indexes of color components for a basic color format, such as 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GL_RGBA, GL_RED, GL_LUMINANCE_ALPHA, etc. Return -1 for indexes 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * that do not apply. 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_component_indexes(GLenum format, 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint *redIndex, 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint *greenIndex, 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint *blueIndex, 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint *alphaIndex, 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint *luminanceIndex, 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint *intensityIndex) 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *redIndex = -1; 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *greenIndex = -1; 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *blueIndex = -1; 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *alphaIndex = -1; 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *luminanceIndex = -1; 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *intensityIndex = -1; 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (format) { 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE: 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_INTEGER_EXT: 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *luminanceIndex = 0; 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA: 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA_INTEGER_EXT: 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *luminanceIndex = 0; 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *alphaIndex = 1; 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY: 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *intensityIndex = 0; 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RED: 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RED_INTEGER_EXT: 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *redIndex = 0; 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_GREEN: 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_GREEN_INTEGER_EXT: 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *greenIndex = 0; 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BLUE: 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BLUE_INTEGER_EXT: 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *blueIndex = 0; 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA: 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA_INTEGER_EXT: 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *alphaIndex = 0; 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG: 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG_INTEGER: 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *redIndex = 0; 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *greenIndex = 1; 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB: 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB_INTEGER_EXT: 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *redIndex = 0; 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *greenIndex = 1; 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *blueIndex = 2; 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGR: 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGR_INTEGER_EXT: 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *blueIndex = 0; 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *greenIndex = 1; 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *redIndex = 2; 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA: 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA_INTEGER_EXT: 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *redIndex = 0; 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *greenIndex = 1; 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *blueIndex = 2; 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *alphaIndex = 3; 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGRA: 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGRA_INTEGER: 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *redIndex = 2; 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *greenIndex = 1; 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *blueIndex = 0; 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *alphaIndex = 3; 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ABGR_EXT: 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *redIndex = 3; 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *greenIndex = 2; 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *blueIndex = 1; 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *alphaIndex = 0; 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DU8DV8_ATI: 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DUDV_ATI: 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *redIndex = 0; 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *greenIndex = 1; 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0 && "bad format in get_component_indexes()"); 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For small integer types, return the min and max possible values. 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Used for clamping floats to unscaled integer types. 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return GL_TRUE if type is handled, GL_FALSE otherwise. 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_type_min_max(GLenum type, GLfloat *min, GLfloat *max) 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (type) { 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BYTE: 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *min = -128.0; 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *max = 127.0; 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_BYTE: 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *min = 0.0; 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *max = 255.0; 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SHORT: 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *min = -32768.0; 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *max = 32767.0; 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT: 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *min = 0.0; 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *max = 65535.0; 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Customization of unsigned integer packing. 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SRC_TYPE GLuint 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DST_TYPE GLuint 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SRC_CONVERT(x) (x) 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FN_NAME pack_uint_from_uint_rgba 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pack_tmp.h" 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef DST_TYPE 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef SRC_CONVERT 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef FN_NAME 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DST_TYPE GLint 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SRC_CONVERT(x) MIN2(x, 0x7fffffff) 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FN_NAME pack_int_from_uint_rgba 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pack_tmp.h" 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef DST_TYPE 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef SRC_CONVERT 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef FN_NAME 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DST_TYPE GLushort 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SRC_CONVERT(x) MIN2(x, 0xffff) 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FN_NAME pack_ushort_from_uint_rgba 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pack_tmp.h" 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef DST_TYPE 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef SRC_CONVERT 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef FN_NAME 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DST_TYPE GLshort 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SRC_CONVERT(x) CLAMP((int)x, -32768, 32767) 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FN_NAME pack_short_from_uint_rgba 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pack_tmp.h" 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef DST_TYPE 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef SRC_CONVERT 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef FN_NAME 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DST_TYPE GLubyte 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SRC_CONVERT(x) MIN2(x, 0xff) 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FN_NAME pack_ubyte_from_uint_rgba 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pack_tmp.h" 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef DST_TYPE 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef SRC_CONVERT 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef FN_NAME 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DST_TYPE GLbyte 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SRC_CONVERT(x) CLAMP((int)x, -128, 127) 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FN_NAME pack_byte_from_uint_rgba 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pack_tmp.h" 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef DST_TYPE 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef SRC_CONVERT 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef FN_NAME 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef SRC_TYPE 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_pack_rgba_span_from_uints_problem(struct gl_context *ctx, 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum dstFormat, GLenum dstType) 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "Unsupported type (%s) / format (%s) " 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "in _mesa_pack_rgba_span_from_uints", 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lookup_enum_by_nr(dstType), 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lookup_enum_by_nr(dstFormat)); 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_pack_rgba_span_from_uints(struct gl_context *ctx, GLuint n, GLuint rgba[][4], 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum dstFormat, GLenum dstType, 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLvoid *dstAddr) 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch(dstType) { 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT: 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pack_uint_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n); 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INT: 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pack_int_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n); 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT: 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pack_ushort_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n); 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SHORT: 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pack_short_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n); 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_BYTE: 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pack_ubyte_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n); 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BYTE: 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pack_byte_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n); 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_BYTE_3_3_2: 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) { 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dst = (GLubyte *) dstAddr; 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][RCOMP], 0, 7) << 5) 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 7) << 2) 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 3) ); 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_BYTE_2_3_3_REV: 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) { 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dst = (GLubyte *) dstAddr; 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][RCOMP], 0, 7) ) 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 7) << 3) 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 3) << 6); 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_5_6_5: 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) { 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31) << 11) 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 63) << 5) 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 31) ); 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_5_6_5_REV: 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) { 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31) ) 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 63) << 5) 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 31) << 11); 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_4_4_4_4: 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][RCOMP], 0, 15) << 12) 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 15) << 8) 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 15) << 4) 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][ACOMP], 0, 15) ); 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][BCOMP], 0, 15) << 12) 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 15) << 8) 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][RCOMP], 0, 15) << 4) 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][ACOMP], 0, 15) ); 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstFormat == GL_ABGR_EXT) { 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][ACOMP], 0, 15) << 12) 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 15) << 8) 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 15) << 4) 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][RCOMP], 0, 15) ); 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_4_4_4_4_REV: 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][RCOMP], 0, 15) ) 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 15) << 4) 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 15) << 8) 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][ACOMP], 0, 15) << 12); 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][BCOMP], 0, 15) ) 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 15) << 4) 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][RCOMP], 0, 15) << 8) 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][ACOMP], 0, 15) << 12); 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstFormat == GL_ABGR_EXT) { 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][ACOMP], 0, 15) ) 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 15) << 4) 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 15) << 8) 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][RCOMP], 0, 15) << 12); 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_5_5_5_1: 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31) << 11) 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 31) << 6) 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 31) << 1) 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][ACOMP], 0, 1) ); 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][BCOMP], 0, 31) << 11) 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 31) << 6) 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][RCOMP], 0, 31) << 1) 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][ACOMP], 0, 1) ); 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstFormat == GL_ABGR_EXT) { 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][ACOMP], 0, 31) << 11) 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 31) << 6) 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 31) << 1) 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][RCOMP], 0, 1) ); 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_1_5_5_5_REV: 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31) ) 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 31) << 5) 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 31) << 10) 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][ACOMP], 0, 1) << 15); 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][BCOMP], 0, 31) ) 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 31) << 5) 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][RCOMP], 0, 31) << 10) 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][ACOMP], 0, 1) << 15); 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstFormat == GL_ABGR_EXT) { 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][ACOMP], 0, 31) ) 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 31) << 5) 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 31) << 10) 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][RCOMP], 0, 1) << 15); 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT_8_8_8_8: 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][RCOMP], 0, 255) << 24) 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 255) << 16) 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 255) << 8) 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][ACOMP], 0, 255) ); 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][BCOMP], 0, 255) << 24) 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 255) << 16) 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][RCOMP], 0, 255) << 8) 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][ACOMP], 0, 255) ); 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstFormat == GL_ABGR_EXT) { 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][ACOMP], 0, 255) << 24) 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 255) << 16) 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 255) << 8) 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][RCOMP], 0, 255) ); 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT_8_8_8_8_REV: 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][RCOMP], 0, 255) ) 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 255) << 8) 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 255) << 16) 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][ACOMP], 0, 255) << 24); 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][BCOMP], 0, 255) ) 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 255) << 8) 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][RCOMP], 0, 255) << 16) 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][ACOMP], 0, 255) << 24); 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstFormat == GL_ABGR_EXT) { 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][ACOMP], 0, 255) ) 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 255) << 8) 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 255) << 16) 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][RCOMP], 0, 255) << 24); 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT_10_10_10_2: 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][RCOMP], 0, 1023) << 22) 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 1023) << 12) 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 1023) << 2) 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][ACOMP], 0, 3) ); 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][BCOMP], 0, 1023) << 22) 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 1023) << 12) 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][RCOMP], 0, 1023) << 2) 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][ACOMP], 0, 3) ); 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstFormat == GL_ABGR_EXT) { 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][ACOMP], 0, 1023) << 22) 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 1023) << 12) 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 1023) << 2) 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][RCOMP], 0, 3) ); 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT_2_10_10_10_REV: 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][RCOMP], 0, 1023) ) 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 1023) << 10) 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 1023) << 20) 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][ACOMP], 0, 3) << 30); 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][BCOMP], 0, 1023) ) 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 1023) << 10) 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][RCOMP], 0, 1023) << 20) 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][ACOMP], 0, 3) << 30); 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstFormat == GL_ABGR_EXT) { 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][ACOMP], 0, 1023) ) 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 1023) << 10) 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 1023) << 20) 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][RCOMP], 0, 3) << 30); 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Customization of signed integer packing. 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SRC_TYPE GLint 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DST_TYPE GLuint 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SRC_CONVERT(x) MAX2(x, 0) 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FN_NAME pack_uint_from_int_rgba 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pack_tmp.h" 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef DST_TYPE 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef SRC_CONVERT 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef FN_NAME 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DST_TYPE GLushort 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SRC_CONVERT(x) MAX2(x, 0) 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FN_NAME pack_ushort_from_int_rgba 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pack_tmp.h" 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef DST_TYPE 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef SRC_CONVERT 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef FN_NAME 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DST_TYPE GLshort 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SRC_CONVERT(x) CLAMP(x, -0x8000, 0x7fff) 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FN_NAME pack_short_from_int_rgba 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pack_tmp.h" 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef DST_TYPE 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef SRC_CONVERT 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef FN_NAME 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DST_TYPE GLubyte 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SRC_CONVERT(x) MAX2(x, 0) 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FN_NAME pack_ubyte_from_int_rgba 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pack_tmp.h" 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef DST_TYPE 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef SRC_CONVERT 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef FN_NAME 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DST_TYPE GLbyte 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SRC_CONVERT(x) CLAMP(x, -0x80, 0x7f) 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FN_NAME pack_byte_from_int_rgba 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pack_tmp.h" 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef DST_TYPE 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef SRC_CONVERT 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef FN_NAME 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef SRC_TYPE 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_pack_rgba_span_from_ints_problem(struct gl_context *ctx, 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum dstFormat, GLenum dstType) 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "Unsupported type (%s) / format (%s) " 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "in _mesa_pack_rgba_span_from_ints", 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lookup_enum_by_nr(dstType), 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lookup_enum_by_nr(dstFormat)); 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_pack_rgba_span_from_ints(struct gl_context *ctx, GLuint n, GLint rgba[][4], 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum dstFormat, GLenum dstType, 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLvoid *dstAddr) 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch(dstType) { 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT: 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pack_uint_from_int_rgba(ctx, dstAddr, dstFormat, rgba, n); 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INT: 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* No conversion necessary. */ 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pack_uint_from_uint_rgba(ctx, dstAddr, dstFormat, (GLuint (*)[4]) rgba, n); 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT: 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pack_ushort_from_int_rgba(ctx, dstAddr, dstFormat, rgba, n); 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SHORT: 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pack_short_from_int_rgba(ctx, dstAddr, dstFormat, rgba, n); 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_BYTE: 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pack_ubyte_from_int_rgba(ctx, dstAddr, dstFormat, rgba, n); 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BYTE: 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pack_byte_from_int_rgba(ctx, dstAddr, dstFormat, rgba, n); 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_BYTE_3_3_2: 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) { 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dst = (GLubyte *) dstAddr; 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][RCOMP], 0, 7) << 5) 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 7) << 2) 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 3) ); 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_BYTE_2_3_3_REV: 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) { 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dst = (GLubyte *) dstAddr; 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][RCOMP], 0, 7) ) 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 7) << 3) 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 3) << 6); 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_5_6_5: 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) { 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31) << 11) 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 63) << 5) 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 31) ); 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_5_6_5_REV: 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) { 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31) ) 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 63) << 5) 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 31) << 11); 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_4_4_4_4: 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][RCOMP], 0, 15) << 12) 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 15) << 8) 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 15) << 4) 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][ACOMP], 0, 15) ); 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][BCOMP], 0, 15) << 12) 1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 15) << 8) 1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][RCOMP], 0, 15) << 4) 1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][ACOMP], 0, 15) ); 1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstFormat == GL_ABGR_EXT) { 1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][ACOMP], 0, 15) << 12) 1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 15) << 8) 1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 15) << 4) 1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][RCOMP], 0, 15) ); 1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_4_4_4_4_REV: 1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][RCOMP], 0, 15) ) 1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 15) << 4) 1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 15) << 8) 1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][ACOMP], 0, 15) << 12); 1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][BCOMP], 0, 15) ) 1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 15) << 4) 1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][RCOMP], 0, 15) << 8) 1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][ACOMP], 0, 15) << 12); 1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstFormat == GL_ABGR_EXT) { 1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][ACOMP], 0, 15) ) 1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 15) << 4) 1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 15) << 8) 1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][RCOMP], 0, 15) << 12); 1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_5_5_5_1: 1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31) << 11) 1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 31) << 6) 1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 31) << 1) 1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][ACOMP], 0, 1) ); 1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][BCOMP], 0, 31) << 11) 1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 31) << 6) 1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][RCOMP], 0, 31) << 1) 1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][ACOMP], 0, 1) ); 1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstFormat == GL_ABGR_EXT) { 1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][ACOMP], 0, 31) << 11) 1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 31) << 6) 1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 31) << 1) 1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][RCOMP], 0, 1) ); 1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_1_5_5_5_REV: 1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31) ) 1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 31) << 5) 1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 31) << 10) 1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][ACOMP], 0, 1) << 15); 1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][BCOMP], 0, 31) ) 1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 31) << 5) 1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][RCOMP], 0, 31) << 10) 1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][ACOMP], 0, 1) << 15); 1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstFormat == GL_ABGR_EXT) { 1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][ACOMP], 0, 31) ) 1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 31) << 5) 1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 31) << 10) 1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][RCOMP], 0, 1) << 15); 1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT_8_8_8_8: 1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][RCOMP], 0, 255) << 24) 1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 255) << 16) 1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 255) << 8) 1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][ACOMP], 0, 255) ); 1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][BCOMP], 0, 255) << 24) 1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 255) << 16) 1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][RCOMP], 0, 255) << 8) 1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][ACOMP], 0, 255) ); 1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstFormat == GL_ABGR_EXT) { 1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][ACOMP], 0, 255) << 24) 1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 255) << 16) 1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 255) << 8) 1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][RCOMP], 0, 255) ); 1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT_8_8_8_8_REV: 1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][RCOMP], 0, 255) ) 1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 255) << 8) 1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 255) << 16) 1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][ACOMP], 0, 255) << 24); 1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][BCOMP], 0, 255) ) 1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 255) << 8) 1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][RCOMP], 0, 255) << 16) 1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][ACOMP], 0, 255) << 24); 1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstFormat == GL_ABGR_EXT) { 1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][ACOMP], 0, 255) ) 1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 255) << 8) 1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 255) << 16) 1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][RCOMP], 0, 255) << 24); 1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT_10_10_10_2: 1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][RCOMP], 0, 1023) << 22) 1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 1023) << 12) 1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 1023) << 2) 1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][ACOMP], 0, 3) ); 1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][BCOMP], 0, 1023) << 22) 1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 1023) << 12) 1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][RCOMP], 0, 1023) << 2) 1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][ACOMP], 0, 3) ); 1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstFormat == GL_ABGR_EXT) { 1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][ACOMP], 0, 1023) << 22) 1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 1023) << 12) 1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 1023) << 2) 1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][RCOMP], 0, 3) ); 1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT_2_10_10_10_REV: 1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][RCOMP], 0, 1023) ) 1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 1023) << 10) 1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 1023) << 20) 1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][ACOMP], 0, 3) << 30); 1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][BCOMP], 0, 1023) ) 1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 1023) << 10) 1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][RCOMP], 0, 1023) << 20) 1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][ACOMP], 0, 3) << 30); 1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstFormat == GL_ABGR_EXT) { 1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (CLAMP(rgba[i][ACOMP], 0, 1023) ) 1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][BCOMP], 0, 1023) << 10) 1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][GCOMP], 0, 1023) << 20) 1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (CLAMP(rgba[i][RCOMP], 0, 3) << 30); 1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Used to pack an array [][4] of RGBA float colors as specified 1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * by the dstFormat, dstType and dstPacking. Used by glReadPixels. 1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Historically, the RGBA values were in [0,1] and rescaled to fit 1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * into GLubytes, etc. But with new integer formats, the RGBA values 1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * may have any value and we don't always rescale when converting to 1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * integers. 1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note: the rgba values will be modified by this function when any pixel 1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * transfer ops are enabled. 1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_pack_rgba_span_float(struct gl_context *ctx, GLuint n, GLfloat rgba[][4], 1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum dstFormat, GLenum dstType, 1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLvoid *dstAddr, 1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_pixelstore_attrib *dstPacking, 1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLbitfield transferOps) 1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *luminance; 1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint comps = _mesa_components_in_format(dstFormat); 1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLboolean intDstFormat = _mesa_is_enum_format_integer(dstFormat); 1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstFormat == GL_LUMINANCE || 1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == GL_LUMINANCE_ALPHA || 1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == GL_LUMINANCE_INTEGER_EXT || 1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT) { 1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org luminance = (GLfloat *) malloc(n * sizeof(GLfloat)); 1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!luminance) { 1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing"); 1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org luminance = NULL; 1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* EXT_texture_integer specifies no transfer ops on integer 1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * types in the resolved issues section. Just set them to 0 1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * for integer surfaces. 1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intDstFormat) 1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transferOps = 0; 1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (transferOps) { 1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba); 1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Component clamping (besides clamping to [0,1] in 1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * _mesa_apply_rgba_transfer_ops()). 1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intDstFormat) { 1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* clamping to dest type's min/max values */ 1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat min, max; 1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (get_type_min_max(dstType, &min, &max)) { 1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], min, max); 1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], min, max); 1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], min, max); 1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], min, max); 1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstFormat == GL_LUMINANCE || dstFormat == GL_LUMINANCE_ALPHA) { 1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* compute luminance values */ 1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (transferOps & IMAGE_CLAMP_BIT) { 1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat sum = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP]; 1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org luminance[i] = CLAMP(sum, 0.0F, 1.0F); 1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org luminance[i] = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP]; 1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Pack/store the pixels. Ugh! Lots of cases!!! 1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (dstType) { 1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_BYTE: 1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dst = (GLubyte *) dstAddr; 1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (dstFormat) { 1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RED: 1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_GREEN: 1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BLUE: 1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA: 1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE: 1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = FLOAT_TO_UBYTE(luminance[i]); 1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA: 1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+0] = FLOAT_TO_UBYTE(luminance[i]); 1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG: 1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB: 1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA: 1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGR: 1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGRA: 1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ABGR_EXT: 1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RED_INTEGER_EXT: 1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLubyte) rgba[i][RCOMP]; 1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_GREEN_INTEGER_EXT: 1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLubyte) rgba[i][GCOMP]; 1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BLUE_INTEGER_EXT: 1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLubyte) rgba[i][BCOMP]; 1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA_INTEGER_EXT: 1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLubyte) rgba[i][ACOMP]; 1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG_INTEGER: 1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+0] = (GLubyte) rgba[i][RCOMP]; 1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+1] = (GLubyte) rgba[i][GCOMP]; 1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB_INTEGER_EXT: 1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+0] = (GLubyte) rgba[i][RCOMP]; 1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+1] = (GLubyte) rgba[i][GCOMP]; 1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+2] = (GLubyte) rgba[i][BCOMP]; 1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA_INTEGER_EXT: 1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+0] = (GLubyte) rgba[i][RCOMP]; 1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+1] = (GLubyte) rgba[i][GCOMP]; 1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+2] = (GLubyte) rgba[i][BCOMP]; 1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+3] = (GLubyte) rgba[i][ACOMP]; 1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGR_INTEGER_EXT: 1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+0] = (GLubyte) rgba[i][BCOMP]; 1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+1] = (GLubyte) rgba[i][GCOMP]; 1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+2] = (GLubyte) rgba[i][RCOMP]; 1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGRA_INTEGER_EXT: 1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+0] = (GLubyte) rgba[i][BCOMP]; 1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+1] = (GLubyte) rgba[i][GCOMP]; 1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+2] = (GLubyte) rgba[i][RCOMP]; 1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+3] = (GLubyte) rgba[i][ACOMP]; 1457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_INTEGER_EXT: 1460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+0] = (GLubyte) (rgba[i][RCOMP] + 1462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][GCOMP] + 1463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][BCOMP]); 1464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+1] = (GLubyte) rgba[i][ACOMP]; 1465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA_INTEGER_EXT: 1468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLubyte) (rgba[i][RCOMP] + 1470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][GCOMP] + 1471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][BCOMP]); 1472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DUDV_ATI: 1475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DU8DV8_ATI: 1476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BYTE: 1487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLbyte *dst = (GLbyte *) dstAddr; 1489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (dstFormat) { 1490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RED: 1491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 1492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_GREEN: 1495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 1496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BLUE: 1499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 1500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA: 1503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 1504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 1505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE: 1507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 1508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = FLOAT_TO_BYTE(luminance[i]); 1509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA: 1511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+0] = FLOAT_TO_BYTE(luminance[i]); 1513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 1514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG: 1517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB: 1523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA: 1530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 1535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGR: 1538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGRA: 1545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 1550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ABGR_EXT: 1553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 1555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RED_INTEGER_EXT: 1561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLbyte) rgba[i][RCOMP]; 1563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_GREEN_INTEGER_EXT: 1566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLbyte) rgba[i][GCOMP]; 1568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BLUE_INTEGER_EXT: 1571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLbyte) rgba[i][BCOMP]; 1573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA_INTEGER_EXT: 1576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLbyte) rgba[i][ACOMP]; 1578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG_INTEGER: 1581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+0] = (GLbyte) rgba[i][RCOMP]; 1583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+1] = (GLbyte) rgba[i][GCOMP]; 1584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB_INTEGER_EXT: 1587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+0] = (GLbyte) rgba[i][RCOMP]; 1589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+1] = (GLbyte) rgba[i][GCOMP]; 1590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+2] = (GLbyte) rgba[i][BCOMP]; 1591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA_INTEGER_EXT: 1594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+0] = (GLbyte) rgba[i][RCOMP]; 1596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+1] = (GLbyte) rgba[i][GCOMP]; 1597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+2] = (GLbyte) rgba[i][BCOMP]; 1598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+3] = (GLbyte) rgba[i][ACOMP]; 1599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGR_INTEGER_EXT: 1602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+0] = (GLbyte) rgba[i][BCOMP]; 1604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+1] = (GLbyte) rgba[i][GCOMP]; 1605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+2] = (GLbyte) rgba[i][RCOMP]; 1606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGRA_INTEGER_EXT: 1609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+0] = (GLbyte) rgba[i][BCOMP]; 1611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+1] = (GLbyte) rgba[i][GCOMP]; 1612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+2] = (GLbyte) rgba[i][RCOMP]; 1613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+3] = (GLbyte) rgba[i][ACOMP]; 1614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_INTEGER_EXT: 1617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+0] = (GLbyte) (rgba[i][RCOMP] + 1619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][GCOMP] + 1620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][BCOMP]); 1621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+1] = (GLbyte) rgba[i][ACOMP]; 1622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA_INTEGER_EXT: 1625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLbyte) (rgba[i][RCOMP] + 1627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][GCOMP] + 1628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][BCOMP]); 1629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DUDV_ATI: 1632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DU8DV8_ATI: 1633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT: 1644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 1646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (dstFormat) { 1647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RED: 1648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 1649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][RCOMP]); 1650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_GREEN: 1652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 1653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][GCOMP]); 1654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BLUE: 1656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 1657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][BCOMP]); 1658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA: 1660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 1661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][ACOMP]); 1662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE: 1664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 1665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_USHORT(dst[i], luminance[i]); 1666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA: 1668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_USHORT(dst[i*2+0], luminance[i]); 1670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_USHORT(dst[i*2+1], rgba[i][ACOMP]); 1671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG: 1674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_USHORT(dst[i*2+0], rgba[i][RCOMP]); 1676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_USHORT(dst[i*2+1], rgba[i][GCOMP]); 1677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB: 1680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_USHORT(dst[i*3+0], rgba[i][RCOMP]); 1682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_USHORT(dst[i*3+1], rgba[i][GCOMP]); 1683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_USHORT(dst[i*3+2], rgba[i][BCOMP]); 1684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA: 1687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][RCOMP]); 1689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][GCOMP]); 1690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][BCOMP]); 1691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][ACOMP]); 1692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGR: 1695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_USHORT(dst[i*3+0], rgba[i][BCOMP]); 1697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_USHORT(dst[i*3+1], rgba[i][GCOMP]); 1698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_USHORT(dst[i*3+2], rgba[i][RCOMP]); 1699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGRA: 1702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][BCOMP]); 1704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][GCOMP]); 1705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][RCOMP]); 1706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][ACOMP]); 1707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ABGR_EXT: 1710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][ACOMP]); 1712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][BCOMP]); 1713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][GCOMP]); 1714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][RCOMP]); 1715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RED_INTEGER_EXT: 1718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLushort) rgba[i][RCOMP]; 1720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_GREEN_INTEGER_EXT: 1723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLushort) rgba[i][GCOMP]; 1725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BLUE_INTEGER_EXT: 1728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLushort) rgba[i][BCOMP]; 1730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA_INTEGER_EXT: 1733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLushort) rgba[i][ACOMP]; 1735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG_INTEGER: 1738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+0] = (GLushort) rgba[i][RCOMP]; 1740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+1] = (GLushort) rgba[i][GCOMP]; 1741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB_INTEGER_EXT: 1744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+0] = (GLushort) rgba[i][RCOMP]; 1746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+1] = (GLushort) rgba[i][GCOMP]; 1747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+2] = (GLushort) rgba[i][BCOMP]; 1748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA_INTEGER_EXT: 1751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+0] = (GLushort) rgba[i][RCOMP]; 1753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+1] = (GLushort) rgba[i][GCOMP]; 1754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+2] = (GLushort) rgba[i][BCOMP]; 1755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+3] = (GLushort) rgba[i][ACOMP]; 1756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGR_INTEGER_EXT: 1759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+0] = (GLushort) rgba[i][BCOMP]; 1761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+1] = (GLushort) rgba[i][GCOMP]; 1762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+2] = (GLushort) rgba[i][RCOMP]; 1763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGRA_INTEGER_EXT: 1766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+0] = (GLushort) rgba[i][BCOMP]; 1768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+1] = (GLushort) rgba[i][GCOMP]; 1769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+2] = (GLushort) rgba[i][RCOMP]; 1770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+3] = (GLushort) rgba[i][ACOMP]; 1771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_INTEGER_EXT: 1774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+0] = (GLushort) (rgba[i][RCOMP] + 1776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][GCOMP] + 1777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][BCOMP]); 1778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+1] = (GLushort) rgba[i][ACOMP]; 1779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA_INTEGER_EXT: 1782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLushort) (rgba[i][RCOMP] + 1784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][GCOMP] + 1785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][BCOMP]); 1786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DUDV_ATI: 1789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DU8DV8_ATI: 1790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+0] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 1792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SHORT: 1801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLshort *dst = (GLshort *) dstAddr; 1803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (dstFormat) { 1804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RED: 1805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 1806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_GREEN: 1809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 1810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BLUE: 1813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 1814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA: 1817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 1818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE: 1821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 1822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = FLOAT_TO_SHORT(luminance[i]); 1823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA: 1825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+0] = FLOAT_TO_SHORT(luminance[i]); 1827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG: 1831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB: 1837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA: 1844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGR: 1852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGRA: 1859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ABGR_EXT: 1867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RED_INTEGER_EXT: 1875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLshort) rgba[i][RCOMP]; 1877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_GREEN_INTEGER_EXT: 1880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLshort) rgba[i][GCOMP]; 1882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BLUE_INTEGER_EXT: 1885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLshort) rgba[i][BCOMP]; 1887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA_INTEGER_EXT: 1890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLshort) rgba[i][ACOMP]; 1892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG_INTEGER: 1895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+0] = (GLshort) rgba[i][RCOMP]; 1897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+1] = (GLshort) rgba[i][GCOMP]; 1898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB_INTEGER_EXT: 1901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+0] = (GLshort) rgba[i][RCOMP]; 1903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+1] = (GLshort) rgba[i][GCOMP]; 1904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+2] = (GLshort) rgba[i][BCOMP]; 1905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA_INTEGER_EXT: 1908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+0] = (GLshort) rgba[i][RCOMP]; 1910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+1] = (GLshort) rgba[i][GCOMP]; 1911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+2] = (GLshort) rgba[i][BCOMP]; 1912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+3] = (GLshort) rgba[i][ACOMP]; 1913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGR_INTEGER_EXT: 1916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+0] = (GLshort) rgba[i][BCOMP]; 1918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+1] = (GLshort) rgba[i][GCOMP]; 1919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+2] = (GLshort) rgba[i][RCOMP]; 1920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGRA_INTEGER_EXT: 1923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+0] = (GLshort) rgba[i][BCOMP]; 1925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+1] = (GLshort) rgba[i][GCOMP]; 1926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+2] = (GLshort) rgba[i][RCOMP]; 1927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+3] = (GLshort) rgba[i][ACOMP]; 1928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_INTEGER_EXT: 1931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+0] = (GLshort) (rgba[i][RCOMP] + 1933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][GCOMP] + 1934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][BCOMP]); 1935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+1] = (GLshort) rgba[i][ACOMP]; 1936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA_INTEGER_EXT: 1939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLshort) (rgba[i][RCOMP] + 1941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][GCOMP] + 1942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][BCOMP]); 1943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DUDV_ATI: 1946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DU8DV8_ATI: 1947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT: 1958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 1960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (dstFormat) { 1961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RED: 1962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 1963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_GREEN: 1966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 1967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BLUE: 1970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 1971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA: 1974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 1975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE: 1978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 1979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = FLOAT_TO_UINT(luminance[i]); 1980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA: 1982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+0] = FLOAT_TO_UINT(luminance[i]); 1984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+1] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG: 1988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+0] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB: 1994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 1995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+0] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+2] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA: 2001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+0] = FLOAT_TO_UINT(rgba[i][RCOMP]); 2003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 2004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+2] = FLOAT_TO_UINT(rgba[i][BCOMP]); 2005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]); 2006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGR: 2009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+0] = FLOAT_TO_UINT(rgba[i][BCOMP]); 2011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 2012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+2] = FLOAT_TO_UINT(rgba[i][RCOMP]); 2013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGRA: 2016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+0] = FLOAT_TO_UINT(rgba[i][BCOMP]); 2018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 2019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+2] = FLOAT_TO_UINT(rgba[i][RCOMP]); 2020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]); 2021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ABGR_EXT: 2024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+0] = FLOAT_TO_UINT(rgba[i][ACOMP]); 2026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+1] = FLOAT_TO_UINT(rgba[i][BCOMP]); 2027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+2] = FLOAT_TO_UINT(rgba[i][GCOMP]); 2028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+3] = FLOAT_TO_UINT(rgba[i][RCOMP]); 2029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RED_INTEGER_EXT: 2032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLuint) rgba[i][RCOMP]; 2034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_GREEN_INTEGER_EXT: 2037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLuint) rgba[i][GCOMP]; 2039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BLUE_INTEGER_EXT: 2042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLuint) rgba[i][BCOMP]; 2044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA_INTEGER_EXT: 2047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLuint) rgba[i][ACOMP]; 2049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG_INTEGER: 2052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+0] = (GLuint) rgba[i][RCOMP]; 2054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+1] = (GLuint) rgba[i][GCOMP]; 2055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB_INTEGER_EXT: 2058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+0] = (GLuint) rgba[i][RCOMP]; 2060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+1] = (GLuint) rgba[i][GCOMP]; 2061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+2] = (GLuint) rgba[i][BCOMP]; 2062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA_INTEGER_EXT: 2065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+0] = (GLuint) rgba[i][RCOMP]; 2067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+1] = (GLuint) rgba[i][GCOMP]; 2068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+2] = (GLuint) rgba[i][BCOMP]; 2069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+3] = (GLuint) rgba[i][ACOMP]; 2070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGR_INTEGER_EXT: 2073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+0] = (GLuint) rgba[i][BCOMP]; 2075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+1] = (GLuint) rgba[i][GCOMP]; 2076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+2] = (GLuint) rgba[i][RCOMP]; 2077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGRA_INTEGER_EXT: 2080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+0] = (GLuint) rgba[i][BCOMP]; 2082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+1] = (GLuint) rgba[i][GCOMP]; 2083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+2] = (GLuint) rgba[i][RCOMP]; 2084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+3] = (GLuint) rgba[i][ACOMP]; 2085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_INTEGER_EXT: 2088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+0] = (GLuint) (rgba[i][RCOMP] + 2090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][GCOMP] + 2091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][BCOMP]); 2092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+1] = (GLuint) rgba[i][ACOMP]; 2093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA_INTEGER_EXT: 2096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLuint) (rgba[i][RCOMP] + 2098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][GCOMP] + 2099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][BCOMP]); 2100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DUDV_ATI: 2103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DU8DV8_ATI: 2104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+0] = FLOAT_TO_UINT(rgba[i][RCOMP]); 2106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 2107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 2110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 2111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INT: 2115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 2116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint *dst = (GLint *) dstAddr; 2117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (dstFormat) { 2118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RED: 2119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 2120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = FLOAT_TO_INT(rgba[i][RCOMP]); 2121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_GREEN: 2123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 2124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = FLOAT_TO_INT(rgba[i][GCOMP]); 2125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BLUE: 2127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 2128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = FLOAT_TO_INT(rgba[i][BCOMP]); 2129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA: 2131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 2132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = FLOAT_TO_INT(rgba[i][ACOMP]); 2133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE: 2135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 2136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = FLOAT_TO_INT(luminance[i]); 2137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA: 2139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+0] = FLOAT_TO_INT(luminance[i]); 2141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+1] = FLOAT_TO_INT(rgba[i][ACOMP]); 2142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG: 2145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+0] = FLOAT_TO_INT(rgba[i][RCOMP]); 2147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 2148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB: 2151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+0] = FLOAT_TO_INT(rgba[i][RCOMP]); 2153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 2154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+2] = FLOAT_TO_INT(rgba[i][BCOMP]); 2155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA: 2158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+0] = FLOAT_TO_INT(rgba[i][RCOMP]); 2160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 2161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+2] = FLOAT_TO_INT(rgba[i][BCOMP]); 2162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]); 2163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGR: 2166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+0] = FLOAT_TO_INT(rgba[i][BCOMP]); 2168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 2169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+2] = FLOAT_TO_INT(rgba[i][RCOMP]); 2170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGRA: 2173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+0] = FLOAT_TO_INT(rgba[i][BCOMP]); 2175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 2176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+2] = FLOAT_TO_INT(rgba[i][RCOMP]); 2177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]); 2178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ABGR_EXT: 2181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+0] = FLOAT_TO_INT(rgba[i][ACOMP]); 2183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+1] = FLOAT_TO_INT(rgba[i][BCOMP]); 2184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+2] = FLOAT_TO_INT(rgba[i][GCOMP]); 2185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+3] = FLOAT_TO_INT(rgba[i][RCOMP]); 2186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DUDV_ATI: 2189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DU8DV8_ATI: 2190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+0] = FLOAT_TO_INT(rgba[i][RCOMP]); 2192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 2193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RED_INTEGER_EXT: 2196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLint) rgba[i][RCOMP]; 2198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_GREEN_INTEGER_EXT: 2201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLint) rgba[i][GCOMP]; 2203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BLUE_INTEGER_EXT: 2206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLint) rgba[i][BCOMP]; 2208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA_INTEGER_EXT: 2211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLint) rgba[i][ACOMP]; 2213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG_INTEGER: 2216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+0] = (GLint) rgba[i][RCOMP]; 2218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+1] = (GLint) rgba[i][GCOMP]; 2219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB_INTEGER_EXT: 2222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+0] = (GLint) rgba[i][RCOMP]; 2224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+1] = (GLint) rgba[i][GCOMP]; 2225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+2] = (GLint) rgba[i][BCOMP]; 2226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA_INTEGER_EXT: 2229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+0] = (GLint) rgba[i][RCOMP]; 2231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+1] = (GLint) rgba[i][GCOMP]; 2232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+2] = (GLint) rgba[i][BCOMP]; 2233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+3] = (GLint) rgba[i][ACOMP]; 2234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGR_INTEGER_EXT: 2237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+0] = (GLint) rgba[i][BCOMP]; 2239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+1] = (GLint) rgba[i][GCOMP]; 2240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+2] = (GLint) rgba[i][RCOMP]; 2241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGRA_INTEGER_EXT: 2244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+0] = (GLint) rgba[i][BCOMP]; 2246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+1] = (GLint) rgba[i][GCOMP]; 2247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+2] = (GLint) rgba[i][RCOMP]; 2248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+3] = (GLint) rgba[i][ACOMP]; 2249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_INTEGER_EXT: 2252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+0] = (GLint) (rgba[i][RCOMP] + 2254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][GCOMP] + 2255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][BCOMP]); 2256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+1] = (GLint) rgba[i][ACOMP]; 2257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA_INTEGER_EXT: 2260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLint) (rgba[i][RCOMP] + 2262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][GCOMP] + 2263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][BCOMP]); 2264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 2267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 2268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_FLOAT: 2272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 2273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *dst = (GLfloat *) dstAddr; 2274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (dstFormat) { 2275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RED: 2276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 2277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = rgba[i][RCOMP]; 2278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_GREEN: 2280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 2281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = rgba[i][GCOMP]; 2282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BLUE: 2284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 2285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = rgba[i][BCOMP]; 2286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA: 2288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 2289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = rgba[i][ACOMP]; 2290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE: 2292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 2293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = luminance[i]; 2294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA: 2296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+0] = luminance[i]; 2298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+1] = rgba[i][ACOMP]; 2299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG: 2302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+0] = rgba[i][RCOMP]; 2304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+1] = rgba[i][GCOMP]; 2305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB: 2308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+0] = rgba[i][RCOMP]; 2310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+1] = rgba[i][GCOMP]; 2311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+2] = rgba[i][BCOMP]; 2312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA: 2315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+0] = rgba[i][RCOMP]; 2317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+1] = rgba[i][GCOMP]; 2318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+2] = rgba[i][BCOMP]; 2319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+3] = rgba[i][ACOMP]; 2320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGR: 2323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+0] = rgba[i][BCOMP]; 2325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+1] = rgba[i][GCOMP]; 2326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+2] = rgba[i][RCOMP]; 2327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGRA: 2330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+0] = rgba[i][BCOMP]; 2332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+1] = rgba[i][GCOMP]; 2333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+2] = rgba[i][RCOMP]; 2334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+3] = rgba[i][ACOMP]; 2335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ABGR_EXT: 2338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+0] = rgba[i][ACOMP]; 2340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+1] = rgba[i][BCOMP]; 2341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+2] = rgba[i][GCOMP]; 2342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+3] = rgba[i][RCOMP]; 2343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DUDV_ATI: 2346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DU8DV8_ATI: 2347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+0] = rgba[i][RCOMP]; 2349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+1] = rgba[i][GCOMP]; 2350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 2353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 2354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_HALF_FLOAT_ARB: 2358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 2359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLhalfARB *dst = (GLhalfARB *) dstAddr; 2360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (dstFormat) { 2361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RED: 2362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 2363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = _mesa_float_to_half(rgba[i][RCOMP]); 2364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_GREEN: 2366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 2367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = _mesa_float_to_half(rgba[i][GCOMP]); 2368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BLUE: 2370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 2371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = _mesa_float_to_half(rgba[i][BCOMP]); 2372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA: 2374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 2375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = _mesa_float_to_half(rgba[i][ACOMP]); 2376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE: 2378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) 2379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = _mesa_float_to_half(luminance[i]); 2380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA: 2382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+0] = _mesa_float_to_half(luminance[i]); 2384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+1] = _mesa_float_to_half(rgba[i][ACOMP]); 2385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG: 2388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+0] = _mesa_float_to_half(rgba[i][RCOMP]); 2390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+1] = _mesa_float_to_half(rgba[i][GCOMP]); 2391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB: 2394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+0] = _mesa_float_to_half(rgba[i][RCOMP]); 2396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]); 2397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+2] = _mesa_float_to_half(rgba[i][BCOMP]); 2398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA: 2401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+0] = _mesa_float_to_half(rgba[i][RCOMP]); 2403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]); 2404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+2] = _mesa_float_to_half(rgba[i][BCOMP]); 2405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]); 2406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGR: 2409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+0] = _mesa_float_to_half(rgba[i][BCOMP]); 2411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]); 2412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*3+2] = _mesa_float_to_half(rgba[i][RCOMP]); 2413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGRA: 2416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+0] = _mesa_float_to_half(rgba[i][BCOMP]); 2418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]); 2419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+2] = _mesa_float_to_half(rgba[i][RCOMP]); 2420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]); 2421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ABGR_EXT: 2424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+0] = _mesa_float_to_half(rgba[i][ACOMP]); 2426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+1] = _mesa_float_to_half(rgba[i][BCOMP]); 2427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+2] = _mesa_float_to_half(rgba[i][GCOMP]); 2428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*4+3] = _mesa_float_to_half(rgba[i][RCOMP]); 2429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DUDV_ATI: 2432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DU8DV8_ATI: 2433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+0] = _mesa_float_to_half(rgba[i][RCOMP]); 2435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+1] = _mesa_float_to_half(rgba[i][GCOMP]); 2436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 2439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 2440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_BYTE_3_3_2: 2444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstFormat == GL_RGB) { 2445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dst = (GLubyte *) dstAddr; 2446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (F_TO_I(rgba[i][RCOMP] * 7.0F) << 5) 2448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][GCOMP] * 7.0F) << 2) 2449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][BCOMP] * 3.0F) ); 2450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_BYTE_2_3_3_REV: 2454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstFormat == GL_RGB) { 2455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dst = (GLubyte *) dstAddr; 2456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (F_TO_I(rgba[i][RCOMP] * 7.0F) ) 2458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][GCOMP] * 7.0F) << 3) 2459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][BCOMP] * 3.0F) << 6); 2460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_5_6_5: 2464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstFormat == GL_RGB) { 2465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 2466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (F_TO_I(rgba[i][RCOMP] * 31.0F) << 11) 2468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][GCOMP] * 63.0F) << 5) 2469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][BCOMP] * 31.0F) ); 2470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_5_6_5_REV: 2474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstFormat == GL_RGB) { 2475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 2476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (F_TO_I(rgba[i][RCOMP] * 31.0F) ) 2478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][GCOMP] * 63.0F) << 5) 2479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][BCOMP] * 31.0F) << 11); 2480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_4_4_4_4: 2484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstFormat == GL_RGBA) { 2485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 2486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (F_TO_I(rgba[i][RCOMP] * 15.0F) << 12) 2488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][GCOMP] * 15.0F) << 8) 2489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][BCOMP] * 15.0F) << 4) 2490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][ACOMP] * 15.0F) ); 2491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstFormat == GL_BGRA) { 2494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 2495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (F_TO_I(rgba[i][BCOMP] * 15.0F) << 12) 2497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][GCOMP] * 15.0F) << 8) 2498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][RCOMP] * 15.0F) << 4) 2499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][ACOMP] * 15.0F) ); 2500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstFormat == GL_ABGR_EXT) { 2503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 2504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (F_TO_I(rgba[i][ACOMP] * 15.0F) << 12) 2506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][BCOMP] * 15.0F) << 8) 2507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][GCOMP] * 15.0F) << 4) 2508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][RCOMP] * 15.0F) ); 2509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_4_4_4_4_REV: 2513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstFormat == GL_RGBA) { 2514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 2515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (F_TO_I(rgba[i][RCOMP] * 15.0F) ) 2517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][GCOMP] * 15.0F) << 4) 2518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][BCOMP] * 15.0F) << 8) 2519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][ACOMP] * 15.0F) << 12); 2520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstFormat == GL_BGRA) { 2523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 2524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (F_TO_I(rgba[i][BCOMP] * 15.0F) ) 2526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][GCOMP] * 15.0F) << 4) 2527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][RCOMP] * 15.0F) << 8) 2528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][ACOMP] * 15.0F) << 12); 2529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstFormat == GL_ABGR_EXT) { 2532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 2533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (F_TO_I(rgba[i][ACOMP] * 15.0F) ) 2535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][BCOMP] * 15.0F) << 4) 2536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][GCOMP] * 15.0F) << 8) 2537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][RCOMP] * 15.0F) << 12); 2538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_5_5_5_1: 2542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstFormat == GL_RGBA) { 2543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 2544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (F_TO_I(rgba[i][RCOMP] * 31.0F) << 11) 2546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][GCOMP] * 31.0F) << 6) 2547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][BCOMP] * 31.0F) << 1) 2548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][ACOMP] * 1.0F) ); 2549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstFormat == GL_BGRA) { 2552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 2553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (F_TO_I(rgba[i][BCOMP] * 31.0F) << 11) 2555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][GCOMP] * 31.0F) << 6) 2556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][RCOMP] * 31.0F) << 1) 2557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][ACOMP] * 1.0F) ); 2558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstFormat == GL_ABGR_EXT) { 2561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 2562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (F_TO_I(rgba[i][ACOMP] * 31.0F) << 11) 2564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][BCOMP] * 31.0F) << 6) 2565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][GCOMP] * 31.0F) << 1) 2566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][RCOMP] * 1.0F) ); 2567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_1_5_5_5_REV: 2571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstFormat == GL_RGBA) { 2572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 2573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (F_TO_I(rgba[i][RCOMP] * 31.0F) ) 2575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][GCOMP] * 31.0F) << 5) 2576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][BCOMP] * 31.0F) << 10) 2577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][ACOMP] * 1.0F) << 15); 2578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstFormat == GL_BGRA) { 2581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 2582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (F_TO_I(rgba[i][BCOMP] * 31.0F) ) 2584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][GCOMP] * 31.0F) << 5) 2585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][RCOMP] * 31.0F) << 10) 2586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][ACOMP] * 1.0F) << 15); 2587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstFormat == GL_ABGR_EXT) { 2590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dstAddr; 2591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (F_TO_I(rgba[i][ACOMP] * 31.0F) ) 2593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][BCOMP] * 31.0F) << 5) 2594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][GCOMP] * 31.0F) << 10) 2595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][RCOMP] * 1.0F) << 15); 2596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT_8_8_8_8: 2600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstFormat == GL_RGBA) { 2601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 2602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (F_TO_I(rgba[i][RCOMP] * 255.F) << 24) 2604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][GCOMP] * 255.F) << 16) 2605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][BCOMP] * 255.F) << 8) 2606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][ACOMP] * 255.F) ); 2607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstFormat == GL_BGRA) { 2610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 2611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (F_TO_I(rgba[i][BCOMP] * 255.F) << 24) 2613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][GCOMP] * 255.F) << 16) 2614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][RCOMP] * 255.F) << 8) 2615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][ACOMP] * 255.F) ); 2616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstFormat == GL_ABGR_EXT) { 2619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 2620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (F_TO_I(rgba[i][ACOMP] * 255.F) << 24) 2622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][BCOMP] * 255.F) << 16) 2623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][GCOMP] * 255.F) << 8) 2624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][RCOMP] * 255.F) ); 2625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT_8_8_8_8_REV: 2629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstFormat == GL_RGBA) { 2630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 2631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (F_TO_I(rgba[i][RCOMP] * 255.0F) ) 2633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][GCOMP] * 255.0F) << 8) 2634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][BCOMP] * 255.0F) << 16) 2635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][ACOMP] * 255.0F) << 24); 2636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstFormat == GL_BGRA) { 2639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 2640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (F_TO_I(rgba[i][BCOMP] * 255.0F) ) 2642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][GCOMP] * 255.0F) << 8) 2643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][RCOMP] * 255.0F) << 16) 2644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][ACOMP] * 255.0F) << 24); 2645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstFormat == GL_ABGR_EXT) { 2648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 2649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (F_TO_I(rgba[i][ACOMP] * 255.0F) ) 2651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][BCOMP] * 255.0F) << 8) 2652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][GCOMP] * 255.0F) << 16) 2653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][RCOMP] * 255.0F) << 24); 2654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT_10_10_10_2: 2658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstFormat == GL_RGBA) { 2659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 2660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (F_TO_I(rgba[i][RCOMP] * 1023.0F) << 22) 2662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][GCOMP] * 1023.0F) << 12) 2663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][BCOMP] * 1023.0F) << 2) 2664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][ACOMP] * 3.0F) ); 2665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstFormat == GL_BGRA) { 2668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 2669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (F_TO_I(rgba[i][BCOMP] * 1023.0F) << 22) 2671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][GCOMP] * 1023.0F) << 12) 2672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][RCOMP] * 1023.0F) << 2) 2673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][ACOMP] * 3.0F) ); 2674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstFormat == GL_ABGR_EXT) { 2677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 2678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (F_TO_I(rgba[i][ACOMP] * 1023.0F) << 22) 2680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][BCOMP] * 1023.0F) << 12) 2681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][GCOMP] * 1023.0F) << 2) 2682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][RCOMP] * 3.0F) ); 2683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT_2_10_10_10_REV: 2687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstFormat == GL_RGBA) { 2688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 2689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (F_TO_I(rgba[i][RCOMP] * 1023.0F) ) 2691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][GCOMP] * 1023.0F) << 10) 2692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][BCOMP] * 1023.0F) << 20) 2693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][ACOMP] * 3.0F) << 30); 2694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstFormat == GL_BGRA) { 2697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 2698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (F_TO_I(rgba[i][BCOMP] * 1023.0F) ) 2700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][GCOMP] * 1023.0F) << 10) 2701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][RCOMP] * 1023.0F) << 20) 2702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][ACOMP] * 3.0F) << 30); 2703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstFormat == GL_ABGR_EXT) { 2706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 2707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 2708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (F_TO_I(rgba[i][ACOMP] * 1023.0F) ) 2709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][BCOMP] * 1023.0F) << 10) 2710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][GCOMP] * 1023.0F) << 20) 2711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (F_TO_I(rgba[i][RCOMP] * 3.0F) << 30); 2712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT_5_9_9_9_REV: 2716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 2717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 2718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 2719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = float3_to_rgb9e5(rgba[i]); 2720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT_10F_11F_11F_REV: 2724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 2725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstAddr; 2726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 2727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = float3_to_r11g11b10f(rgba[i]); 2728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 2732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, "bad type in _mesa_pack_rgba_span_float"); 2733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(luminance); 2734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 2735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstPacking->SwapBytes) { 2738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint swapSize = _mesa_sizeof_packed_type(dstType); 2739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (swapSize == 2) { 2740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_swap2((GLushort *) dstAddr, n * comps); 2741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (swapSize == 4) { 2743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_swap4((GLuint *) dstAddr, n * comps); 2744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(luminance); 2748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SWAP2BYTE(VALUE) \ 2753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { \ 2754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *bytes = (GLubyte *) &(VALUE); \ 2755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte tmp = bytes[0]; \ 2756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bytes[0] = bytes[1]; \ 2757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bytes[1] = tmp; \ 2758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SWAP4BYTE(VALUE) \ 2761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { \ 2762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *bytes = (GLubyte *) &(VALUE); \ 2763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte tmp = bytes[0]; \ 2764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bytes[0] = bytes[3]; \ 2765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bytes[3] = tmp; \ 2766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = bytes[1]; \ 2767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bytes[1] = bytes[2]; \ 2768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bytes[2] = tmp; \ 2769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 2773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextract_uint_indexes(GLuint n, GLuint indexes[], 2774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum srcFormat, GLenum srcType, const GLvoid *src, 2775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_pixelstore_attrib *unpack ) 2776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(srcFormat == GL_COLOR_INDEX || srcFormat == GL_STENCIL_INDEX); 2778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(srcType == GL_BITMAP || 2780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_BYTE || 2781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_BYTE || 2782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT || 2783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_SHORT || 2784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT || 2785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_INT || 2786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_24_8_EXT || 2787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_HALF_FLOAT_ARB || 2788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_FLOAT || 2789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV); 2790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (srcType) { 2792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BITMAP: 2793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 2794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *ubsrc = (GLubyte *) src; 2795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unpack->LsbFirst) { 2796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte mask = 1 << (unpack->SkipPixels & 0x7); 2797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 2798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 2799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org indexes[i] = (*ubsrc & mask) ? 1 : 0; 2800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask == 128) { 2801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask = 1; 2802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ubsrc++; 2803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 2805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask = mask << 1; 2806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 2810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte mask = 128 >> (unpack->SkipPixels & 0x7); 2811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 2812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 2813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org indexes[i] = (*ubsrc & mask) ? 1 : 0; 2814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask == 1) { 2815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask = 128; 2816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ubsrc++; 2817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 2819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask = mask >> 1; 2820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_BYTE: 2826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 2827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 2828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *s = (const GLubyte *) src; 2829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) 2830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org indexes[i] = s[i]; 2831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BYTE: 2834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 2835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 2836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLbyte *s = (const GLbyte *) src; 2837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) 2838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org indexes[i] = s[i]; 2839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT: 2842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 2843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 2844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLushort *s = (const GLushort *) src; 2845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unpack->SwapBytes) { 2846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 2847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort value = s[i]; 2848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP2BYTE(value); 2849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org indexes[i] = value; 2850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 2853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) 2854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org indexes[i] = s[i]; 2855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SHORT: 2859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 2860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 2861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLshort *s = (const GLshort *) src; 2862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unpack->SwapBytes) { 2863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 2864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLshort value = s[i]; 2865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP2BYTE(value); 2866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org indexes[i] = value; 2867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 2870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) 2871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org indexes[i] = s[i]; 2872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT: 2876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 2877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 2878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *s = (const GLuint *) src; 2879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unpack->SwapBytes) { 2880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 2881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint value = s[i]; 2882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP4BYTE(value); 2883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org indexes[i] = value; 2884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 2887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) 2888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org indexes[i] = s[i]; 2889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INT: 2893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 2894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 2895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint *s = (const GLint *) src; 2896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unpack->SwapBytes) { 2897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 2898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint value = s[i]; 2899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP4BYTE(value); 2900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org indexes[i] = value; 2901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 2904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) 2905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org indexes[i] = s[i]; 2906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_FLOAT: 2910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 2911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 2912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *s = (const GLfloat *) src; 2913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unpack->SwapBytes) { 2914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 2915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat value = s[i]; 2916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP4BYTE(value); 2917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org indexes[i] = (GLuint) value; 2918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 2921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) 2922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org indexes[i] = (GLuint) s[i]; 2923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_HALF_FLOAT_ARB: 2927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 2928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 2929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLhalfARB *s = (const GLhalfARB *) src; 2930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unpack->SwapBytes) { 2931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 2932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLhalfARB value = s[i]; 2933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP2BYTE(value); 2934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org indexes[i] = (GLuint) _mesa_half_to_float(value); 2935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 2938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) 2939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org indexes[i] = (GLuint) _mesa_half_to_float(s[i]); 2940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT_24_8_EXT: 2944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 2945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 2946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *s = (const GLuint *) src; 2947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unpack->SwapBytes) { 2948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 2949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint value = s[i]; 2950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP4BYTE(value); 2951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org indexes[i] = value & 0xff; /* lower 8 bits */ 2952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 2955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) 2956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org indexes[i] = s[i] & 0xff; /* lower 8 bits */ 2957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 2961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 2962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 2963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *s = (const GLuint *) src; 2964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unpack->SwapBytes) { 2965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 2966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint value = s[i*2+1]; 2967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP4BYTE(value); 2968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org indexes[i] = value & 0xff; /* lower 8 bits */ 2969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 2972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) 2973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org indexes[i] = s[i*2+1] & 0xff; /* lower 8 bits */ 2974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 2979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(NULL, "bad srcType in extract_uint_indexes"); 2980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 2981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 2986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return source/dest RGBA indexes for unpacking pixels. 2987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 2989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_component_mapping(GLenum format, 2990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint *rSrc, 2991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint *gSrc, 2992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint *bSrc, 2993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint *aSrc, 2994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint *rDst, 2995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint *gDst, 2996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint *bDst, 2997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint *aDst) 2998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (format) { 3000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RED: 3001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RED_INTEGER_EXT: 3002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *rSrc = 0; 3003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *gSrc = *bSrc = *aSrc = -1; 3004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_GREEN: 3006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_GREEN_INTEGER_EXT: 3007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *gSrc = 0; 3008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *rSrc = *bSrc = *aSrc = -1; 3009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BLUE: 3011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BLUE_INTEGER_EXT: 3012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *bSrc = 0; 3013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *rSrc = *gSrc = *aSrc = -1; 3014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA: 3016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA_INTEGER_EXT: 3017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *rSrc = *gSrc = *bSrc = -1; 3018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *aSrc = 0; 3019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE: 3021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_INTEGER_EXT: 3022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *rSrc = *gSrc = *bSrc = 0; 3023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *aSrc = -1; 3024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA: 3026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA_INTEGER_EXT: 3027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *rSrc = *gSrc = *bSrc = 0; 3028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *aSrc = 1; 3029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY: 3031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *rSrc = *gSrc = *bSrc = *aSrc = 0; 3032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG: 3034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG_INTEGER: 3035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *rSrc = 0; 3036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *gSrc = 1; 3037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *bSrc = -1; 3038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *aSrc = -1; 3039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *rDst = 0; 3040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *gDst = 1; 3041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *bDst = 2; 3042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *aDst = 3; 3043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB: 3045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB_INTEGER: 3046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *rSrc = 0; 3047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *gSrc = 1; 3048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *bSrc = 2; 3049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *aSrc = -1; 3050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *rDst = 0; 3051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *gDst = 1; 3052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *bDst = 2; 3053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *aDst = 3; 3054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGR: 3056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGR_INTEGER: 3057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *rSrc = 2; 3058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *gSrc = 1; 3059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *bSrc = 0; 3060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *aSrc = -1; 3061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *rDst = 2; 3062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *gDst = 1; 3063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *bDst = 0; 3064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *aDst = 3; 3065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA: 3067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA_INTEGER: 3068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *rSrc = 0; 3069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *gSrc = 1; 3070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *bSrc = 2; 3071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *aSrc = 3; 3072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *rDst = 0; 3073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *gDst = 1; 3074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *bDst = 2; 3075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *aDst = 3; 3076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGRA: 3078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGRA_INTEGER: 3079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *rSrc = 2; 3080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *gSrc = 1; 3081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *bSrc = 0; 3082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *aSrc = 3; 3083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *rDst = 2; 3084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *gDst = 1; 3085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *bDst = 0; 3086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *aDst = 3; 3087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ABGR_EXT: 3089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *rSrc = 3; 3090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *gSrc = 2; 3091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *bSrc = 1; 3092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *aSrc = 0; 3093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *rDst = 3; 3094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *gDst = 2; 3095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *bDst = 1; 3096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *aDst = 0; 3097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DU8DV8_ATI: 3099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DUDV_ATI: 3100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *rSrc = 0; 3101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *gSrc = 1; 3102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *bSrc = -1; 3103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *aSrc = -1; 3104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 3106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(NULL, "bad srcFormat %s in get_component_mapping", 3107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lookup_enum_by_nr(format)); 3108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 3109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 3115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This function extracts floating point RGBA values from arbitrary 3116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * image data. srcFormat and srcType are the format and type parameters 3117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc. 3118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function 3120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * implements the "Conversion to floating point", "Conversion to RGB", 3121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and "Final Expansion to RGBA" operations. 3122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Args: n - number of pixels 3124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * rgba - output colors 3125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * srcFormat - format of incoming data 3126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * srcType - data type of incoming data 3127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * src - source data pointer 3128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * swapBytes - perform byteswapping of incoming data? 3129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 3130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 3131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextract_float_rgba(GLuint n, GLfloat rgba[][4], 3132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum srcFormat, GLenum srcType, const GLvoid *src, 3133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean swapBytes) 3134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint rSrc, gSrc, bSrc, aSrc; 3136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint stride; 3137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint rDst, bDst, gDst, aDst; 3138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean intFormat; 3139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat rs = 1.0f, gs = 1.0f, bs = 1.0f, as = 1.0f; /* scale factors */ 3140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(srcFormat == GL_RED || 3142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_GREEN || 3143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_BLUE || 3144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_ALPHA || 3145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_LUMINANCE || 3146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_LUMINANCE_ALPHA || 3147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_INTENSITY || 3148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RG || 3149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RGB || 3150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_BGR || 3151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RGBA || 3152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_BGRA || 3153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_ABGR_EXT || 3154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_DU8DV8_ATI || 3155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_DUDV_ATI || 3156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RED_INTEGER_EXT || 3157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_GREEN_INTEGER_EXT || 3158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_BLUE_INTEGER_EXT || 3159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_ALPHA_INTEGER_EXT || 3160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RG_INTEGER || 3161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RGB_INTEGER_EXT || 3162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RGBA_INTEGER_EXT || 3163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_BGR_INTEGER_EXT || 3164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_BGRA_INTEGER_EXT || 3165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_LUMINANCE_INTEGER_EXT || 3166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT); 3167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(srcType == GL_UNSIGNED_BYTE || 3169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_BYTE || 3170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT || 3171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_SHORT || 3172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT || 3173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_INT || 3174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_HALF_FLOAT_ARB || 3175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_FLOAT || 3176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_BYTE_3_3_2 || 3177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 3178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT_5_6_5 || 3179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 3180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 3181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 3182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 3183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 3184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_8_8_8_8 || 3185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 3186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_10_10_10_2 || 3187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_2_10_10_10_REV || 3188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_5_9_9_9_REV || 3189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_10F_11F_11F_REV); 3190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_component_mapping(srcFormat, 3192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &rSrc, &gSrc, &bSrc, &aSrc, 3193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &rDst, &gDst, &bDst, &aDst); 3194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stride = _mesa_components_in_format(srcFormat); 3196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org intFormat = _mesa_is_enum_format_integer(srcFormat); 3198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT_FLT, DEFAULT_INT, TYPE, CONVERSION) \ 3200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((SRC_INDEX) < 0) { \ 3201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; \ 3202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intFormat) { \ 3203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { \ 3204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][DST_INDEX] = DEFAULT_INT; \ 3205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 3206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 3207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { \ 3208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { \ 3209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][DST_INDEX] = DEFAULT_FLT; \ 3210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 3211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 3212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 3213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (swapBytes) { \ 3214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const TYPE *s = (const TYPE *) src; \ 3215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; \ 3216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { \ 3217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TYPE value = s[SRC_INDEX]; \ 3218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sizeof(TYPE) == 2) { \ 3219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP2BYTE(value); \ 3220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 3221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (sizeof(TYPE) == 4) { \ 3222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP4BYTE(value); \ 3223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 3224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intFormat) \ 3225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][DST_INDEX] = (GLfloat) value; \ 3226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else \ 3227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][DST_INDEX] = (GLfloat) CONVERSION(value); \ 3228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s += stride; \ 3229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 3230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 3231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { \ 3232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const TYPE *s = (const TYPE *) src; \ 3233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; \ 3234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intFormat) { \ 3235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { \ 3236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][DST_INDEX] = (GLfloat) s[SRC_INDEX]; \ 3237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s += stride; \ 3238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 3239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 3240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { \ 3241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { \ 3242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][DST_INDEX] = (GLfloat) CONVERSION(s[SRC_INDEX]); \ 3243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s += stride; \ 3244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 3245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 3246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (srcType) { 3249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_BYTE: 3250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(rSrc, RCOMP, 0.0F, 0, GLubyte, UBYTE_TO_FLOAT); 3251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(gSrc, GCOMP, 0.0F, 0, GLubyte, UBYTE_TO_FLOAT); 3252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(bSrc, BCOMP, 0.0F, 0, GLubyte, UBYTE_TO_FLOAT); 3253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(aSrc, ACOMP, 1.0F, 255, GLubyte, UBYTE_TO_FLOAT); 3254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BYTE: 3256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(rSrc, RCOMP, 0.0F, 0, GLbyte, BYTE_TO_FLOATZ); 3257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(gSrc, GCOMP, 0.0F, 0, GLbyte, BYTE_TO_FLOATZ); 3258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(bSrc, BCOMP, 0.0F, 0, GLbyte, BYTE_TO_FLOATZ); 3259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(aSrc, ACOMP, 1.0F, 127, GLbyte, BYTE_TO_FLOATZ); 3260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT: 3262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(rSrc, RCOMP, 0.0F, 0, GLushort, USHORT_TO_FLOAT); 3263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(gSrc, GCOMP, 0.0F, 0, GLushort, USHORT_TO_FLOAT); 3264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(bSrc, BCOMP, 0.0F, 0, GLushort, USHORT_TO_FLOAT); 3265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(aSrc, ACOMP, 1.0F, 0xffff, GLushort, USHORT_TO_FLOAT); 3266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SHORT: 3268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(rSrc, RCOMP, 0.0F, 0, GLshort, SHORT_TO_FLOATZ); 3269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(gSrc, GCOMP, 0.0F, 0, GLshort, SHORT_TO_FLOATZ); 3270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(bSrc, BCOMP, 0.0F, 0, GLshort, SHORT_TO_FLOATZ); 3271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(aSrc, ACOMP, 1.0F, 32767, GLshort, SHORT_TO_FLOATZ); 3272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT: 3274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(rSrc, RCOMP, 0.0F, 0, GLuint, UINT_TO_FLOAT); 3275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(gSrc, GCOMP, 0.0F, 0, GLuint, UINT_TO_FLOAT); 3276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(bSrc, BCOMP, 0.0F, 0, GLuint, UINT_TO_FLOAT); 3277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(aSrc, ACOMP, 1.0F, 0xffffffff, GLuint, UINT_TO_FLOAT); 3278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INT: 3280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(rSrc, RCOMP, 0.0F, 0, GLint, INT_TO_FLOAT); 3281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(gSrc, GCOMP, 0.0F, 0, GLint, INT_TO_FLOAT); 3282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(bSrc, BCOMP, 0.0F, 0, GLint, INT_TO_FLOAT); 3283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(aSrc, ACOMP, 1.0F, 2147483647, GLint, INT_TO_FLOAT); 3284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_FLOAT: 3286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(rSrc, RCOMP, 0.0F, 0.0F, GLfloat, (GLfloat)); 3287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(gSrc, GCOMP, 0.0F, 0.0F, GLfloat, (GLfloat)); 3288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(bSrc, BCOMP, 0.0F, 0.0F, GLfloat, (GLfloat)); 3289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(aSrc, ACOMP, 1.0F, 1.0F, GLfloat, (GLfloat)); 3290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_HALF_FLOAT_ARB: 3292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(rSrc, RCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float); 3293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(gSrc, GCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float); 3294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(bSrc, BCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float); 3295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(aSrc, ACOMP, 1.0F, 1.0F, GLhalfARB, _mesa_half_to_float); 3296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_BYTE_3_3_2: 3298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 3299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *ubsrc = (const GLubyte *) src; 3300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 3301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!intFormat) { 3302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs = 1.0F / 7.0F; 3303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gs = 1.0F / 7.0F; 3304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bs = 1.0F / 3.0F; 3305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte p = ubsrc[i]; 3308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p >> 5) ) * rs; 3309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 2) & 0x7) * gs; 3310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p ) & 0x3) * bs; 3311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = 1.0F; 3312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_BYTE_2_3_3_REV: 3316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 3317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *ubsrc = (const GLubyte *) src; 3318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 3319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!intFormat) { 3320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs = 1.0F / 7.0F; 3321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gs = 1.0F / 7.0F; 3322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bs = 1.0F / 3.0F; 3323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte p = ubsrc[i]; 3326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p ) & 0x7) * rs; 3327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 3) & 0x7) * gs; 3328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p >> 6) ) * bs; 3329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = 1.0F; 3330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_5_6_5: 3334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!intFormat) { 3335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs = 1.0F / 31.0F; 3336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gs = 1.0F / 63.0F; 3337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bs = 1.0F / 31.0F; 3338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (swapBytes) { 3340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLushort *ussrc = (const GLushort *) src; 3341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 3342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort p = ussrc[i]; 3344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP2BYTE(p); 3345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p >> 11) ) * rs; 3346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 5) & 0x3f) * gs; 3347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p ) & 0x1f) * bs; 3348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = 1.0F; 3349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLushort *ussrc = (const GLushort *) src; 3353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 3354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort p = ussrc[i]; 3356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p >> 11) ) * rs; 3357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 5) & 0x3f) * gs; 3358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p ) & 0x1f) * bs; 3359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = 1.0F; 3360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_5_6_5_REV: 3364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!intFormat) { 3365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs = 1.0F / 31.0F; 3366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gs = 1.0F / 63.0F; 3367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bs = 1.0F / 31.0F; 3368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (swapBytes) { 3370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLushort *ussrc = (const GLushort *) src; 3371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 3372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort p = ussrc[i]; 3374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP2BYTE(p); 3375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p ) & 0x1f) * rs; 3376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 5) & 0x3f) * gs; 3377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p >> 11) ) * bs; 3378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = 1.0F; 3379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLushort *ussrc = (const GLushort *) src; 3383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 3384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort p = ussrc[i]; 3386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p ) & 0x1f) * rs; 3387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 5) & 0x3f) * gs; 3388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p >> 11) ) * bs; 3389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = 1.0F; 3390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_4_4_4_4: 3394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!intFormat) { 3395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs = gs = bs = as = 1.0F / 15.0F; 3396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (swapBytes) { 3398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLushort *ussrc = (const GLushort *) src; 3399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 3400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort p = ussrc[i]; 3402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP2BYTE(p); 3403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p >> 12) ) * rs; 3404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 8) & 0xf) * gs; 3405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p >> 4) & 0xf) * bs; 3406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = ((p ) & 0xf) * as; 3407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLushort *ussrc = (const GLushort *) src; 3411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 3412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort p = ussrc[i]; 3414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p >> 12) ) * rs; 3415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 8) & 0xf) * gs; 3416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p >> 4) & 0xf) * bs; 3417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = ((p ) & 0xf) * as; 3418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_4_4_4_4_REV: 3422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!intFormat) { 3423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs = gs = bs = as = 1.0F / 15.0F; 3424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (swapBytes) { 3426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLushort *ussrc = (const GLushort *) src; 3427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 3428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort p = ussrc[i]; 3430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP2BYTE(p); 3431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p ) & 0xf) * rs; 3432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 4) & 0xf) * gs; 3433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p >> 8) & 0xf) * bs; 3434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = ((p >> 12) ) * as; 3435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLushort *ussrc = (const GLushort *) src; 3439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 3440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort p = ussrc[i]; 3442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p ) & 0xf) * rs; 3443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 4) & 0xf) * gs; 3444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p >> 8) & 0xf) * bs; 3445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = ((p >> 12) ) * as; 3446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_5_5_5_1: 3450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!intFormat) { 3451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs = gs = bs = 1.0F / 31.0F; 3452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (swapBytes) { 3454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLushort *ussrc = (const GLushort *) src; 3455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 3456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort p = ussrc[i]; 3458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP2BYTE(p); 3459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p >> 11) ) * rs; 3460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 6) & 0x1f) * gs; 3461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p >> 1) & 0x1f) * bs; 3462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = ((p ) & 0x1) * as; 3463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLushort *ussrc = (const GLushort *) src; 3467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 3468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort p = ussrc[i]; 3470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p >> 11) ) * rs; 3471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 6) & 0x1f) * gs; 3472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p >> 1) & 0x1f) * bs; 3473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = ((p ) & 0x1) * as; 3474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_1_5_5_5_REV: 3478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!intFormat) { 3479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs = gs = bs = 1.0F / 31.0F; 3480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (swapBytes) { 3482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLushort *ussrc = (const GLushort *) src; 3483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 3484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort p = ussrc[i]; 3486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP2BYTE(p); 3487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p ) & 0x1f) * rs; 3488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 5) & 0x1f) * gs; 3489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p >> 10) & 0x1f) * bs; 3490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = ((p >> 15) ) * as; 3491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLushort *ussrc = (const GLushort *) src; 3495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 3496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort p = ussrc[i]; 3498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p ) & 0x1f) * rs; 3499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 5) & 0x1f) * gs; 3500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p >> 10) & 0x1f) * bs; 3501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = ((p >> 15) ) * as; 3502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT_8_8_8_8: 3506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (swapBytes) { 3507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *uisrc = (const GLuint *) src; 3508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 3509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intFormat) { 3510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint p = uisrc[i]; 3512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = (GLfloat) ((p ) & 0xff); 3513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = (GLfloat) ((p >> 8) & 0xff); 3514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = (GLfloat) ((p >> 16) & 0xff); 3515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = (GLfloat) ((p >> 24) ); 3516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint p = uisrc[i]; 3521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = UBYTE_TO_FLOAT((p ) & 0xff); 3522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 3523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 3524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = UBYTE_TO_FLOAT((p >> 24) ); 3525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *uisrc = (const GLuint *) src; 3530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 3531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intFormat) { 3532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint p = uisrc[i]; 3534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = (GLfloat) ((p >> 24) ); 3535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = (GLfloat) ((p >> 16) & 0xff); 3536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = (GLfloat) ((p >> 8) & 0xff); 3537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = (GLfloat) ((p ) & 0xff); 3538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint p = uisrc[i]; 3543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = UBYTE_TO_FLOAT((p >> 24) ); 3544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 3545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 3546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = UBYTE_TO_FLOAT((p ) & 0xff); 3547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT_8_8_8_8_REV: 3552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (swapBytes) { 3553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *uisrc = (const GLuint *) src; 3554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 3555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intFormat) { 3556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint p = uisrc[i]; 3558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = (GLfloat) ((p >> 24) ); 3559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = (GLfloat) ((p >> 16) & 0xff); 3560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = (GLfloat) ((p >> 8) & 0xff); 3561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = (GLfloat) ((p ) & 0xff); 3562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint p = uisrc[i]; 3567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = UBYTE_TO_FLOAT((p >> 24) ); 3568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 3569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 3570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = UBYTE_TO_FLOAT((p ) & 0xff); 3571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *uisrc = (const GLuint *) src; 3576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 3577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intFormat) { 3578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint p = uisrc[i]; 3580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = (GLfloat) ((p ) & 0xff); 3581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = (GLfloat) ((p >> 8) & 0xff); 3582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = (GLfloat) ((p >> 16) & 0xff); 3583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = (GLfloat) ((p >> 24) ); 3584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint p = uisrc[i]; 3589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = UBYTE_TO_FLOAT((p ) & 0xff); 3590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 3591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 3592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = UBYTE_TO_FLOAT((p >> 24) ); 3593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT_10_10_10_2: 3598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!intFormat) { 3599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs = 1.0F / 1023.0F; 3600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gs = 1.0F / 1023.0F; 3601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bs = 1.0F / 1023.0F; 3602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org as = 1.0F / 3.0F; 3603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (swapBytes) { 3605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *uisrc = (const GLuint *) src; 3606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 3607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint p = uisrc[i]; 3609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP4BYTE(p); 3610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p >> 22) ) * rs; 3611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 12) & 0x3ff) * gs; 3612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p >> 2) & 0x3ff) * bs; 3613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = ((p ) & 0x3 ) * as; 3614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *uisrc = (const GLuint *) src; 3618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 3619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint p = uisrc[i]; 3621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p >> 22) ) * rs; 3622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 12) & 0x3ff) * gs; 3623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p >> 2) & 0x3ff) * bs; 3624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = ((p ) & 0x3 ) * as; 3625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT_2_10_10_10_REV: 3629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!intFormat) { 3630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs = 1.0F / 1023.0F; 3631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gs = 1.0F / 1023.0F; 3632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bs = 1.0F / 1023.0F; 3633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org as = 1.0F / 3.0F; 3634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (swapBytes) { 3636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *uisrc = (const GLuint *) src; 3637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 3638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint p = uisrc[i]; 3640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP4BYTE(p); 3641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p ) & 0x3ff) * rs; 3642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 10) & 0x3ff) * gs; 3643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p >> 20) & 0x3ff) * bs; 3644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = ((p >> 30) ) * as; 3645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *uisrc = (const GLuint *) src; 3649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 3650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint p = uisrc[i]; 3652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p ) & 0x3ff) * rs; 3653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 10) & 0x3ff) * gs; 3654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p >> 20) & 0x3ff) * bs; 3655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = ((p >> 30) ) * as; 3656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT_5_9_9_9_REV: 3660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (swapBytes) { 3661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *uisrc = (const GLuint *) src; 3662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 3663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat f[3]; 3664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint p = uisrc[i]; 3666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP4BYTE(p); 3667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgb9e5_to_float3(p, f); 3668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = f[0]; 3669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = f[1]; 3670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = f[2]; 3671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = 1.0F; 3672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *uisrc = (const GLuint *) src; 3676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 3677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat f[3]; 3678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgb9e5_to_float3(uisrc[i], f); 3680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = f[0]; 3681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = f[1]; 3682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = f[2]; 3683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = 1.0F; 3684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT_10F_11F_11F_REV: 3688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (swapBytes) { 3689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *uisrc = (const GLuint *) src; 3690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 3691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat f[3]; 3692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint p = uisrc[i]; 3694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP4BYTE(p); 3695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r11g11b10f_to_float3(p, f); 3696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = f[0]; 3697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = f[1]; 3698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = f[2]; 3699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = 1.0F; 3700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *uisrc = (const GLuint *) src; 3704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 3705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat f[3]; 3706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r11g11b10f_to_float3(uisrc[i], f); 3708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = f[0]; 3709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = f[1]; 3710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = f[2]; 3711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = 1.0F; 3712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 3716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(NULL, "bad srcType in extract float data"); 3717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef PROCESS 3720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline GLuint 3724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclamp_float_to_uint(GLfloat f) 3725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return f < 0.0F ? 0 : F_TO_I(f); 3727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline GLuint 3731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclamp_half_to_uint(GLhalfARB h) 3732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat f = _mesa_half_to_float(h); 3734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return f < 0.0F ? 0 : F_TO_I(f); 3735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 3739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \sa extract_float_rgba() 3740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 3741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 3742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextract_uint_rgba(GLuint n, GLuint rgba[][4], 3743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum srcFormat, GLenum srcType, const GLvoid *src, 3744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean swapBytes) 3745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint rSrc, gSrc, bSrc, aSrc; 3747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint stride; 3748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint rDst, bDst, gDst, aDst; 3749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(srcFormat == GL_RED || 3751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_GREEN || 3752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_BLUE || 3753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_ALPHA || 3754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_LUMINANCE || 3755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_LUMINANCE_ALPHA || 3756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_INTENSITY || 3757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RG || 3758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RGB || 3759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_BGR || 3760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RGBA || 3761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_BGRA || 3762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_ABGR_EXT || 3763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_DU8DV8_ATI || 3764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_DUDV_ATI || 3765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RED_INTEGER_EXT || 3766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RG_INTEGER || 3767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_GREEN_INTEGER_EXT || 3768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_BLUE_INTEGER_EXT || 3769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_ALPHA_INTEGER_EXT || 3770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RGB_INTEGER_EXT || 3771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RGBA_INTEGER_EXT || 3772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_BGR_INTEGER_EXT || 3773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_BGRA_INTEGER_EXT || 3774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_LUMINANCE_INTEGER_EXT || 3775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT); 3776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(srcType == GL_UNSIGNED_BYTE || 3778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_BYTE || 3779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT || 3780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_SHORT || 3781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT || 3782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_INT || 3783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_HALF_FLOAT_ARB || 3784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_FLOAT || 3785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_BYTE_3_3_2 || 3786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 3787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT_5_6_5 || 3788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 3789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 3790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 3791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 3792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 3793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_8_8_8_8 || 3794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 3795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_10_10_10_2 || 3796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_2_10_10_10_REV || 3797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_5_9_9_9_REV || 3798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_10F_11F_11F_REV); 3799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_component_mapping(srcFormat, 3801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &rSrc, &gSrc, &bSrc, &aSrc, 3802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &rDst, &gDst, &bDst, &aDst); 3803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stride = _mesa_components_in_format(srcFormat); 3805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT, TYPE, CONVERSION) \ 3807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((SRC_INDEX) < 0) { \ 3808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; \ 3809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { \ 3810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][DST_INDEX] = DEFAULT; \ 3811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 3812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 3813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (swapBytes) { \ 3814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const TYPE *s = (const TYPE *) src; \ 3815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; \ 3816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { \ 3817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TYPE value = s[SRC_INDEX]; \ 3818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sizeof(TYPE) == 2) { \ 3819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP2BYTE(value); \ 3820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 3821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (sizeof(TYPE) == 4) { \ 3822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP4BYTE(value); \ 3823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 3824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][DST_INDEX] = CONVERSION(value); \ 3825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s += stride; \ 3826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 3827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 3828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { \ 3829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const TYPE *s = (const TYPE *) src; \ 3830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; \ 3831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { \ 3832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][DST_INDEX] = CONVERSION(s[SRC_INDEX]); \ 3833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s += stride; \ 3834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 3835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (srcType) { 3838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_BYTE: 3839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(rSrc, RCOMP, 0, GLubyte, (GLuint)); 3840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(gSrc, GCOMP, 0, GLubyte, (GLuint)); 3841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(bSrc, BCOMP, 0, GLubyte, (GLuint)); 3842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(aSrc, ACOMP, 1, GLubyte, (GLuint)); 3843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BYTE: 3845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(rSrc, RCOMP, 0, GLbyte, (GLuint)); 3846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(gSrc, GCOMP, 0, GLbyte, (GLuint)); 3847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(bSrc, BCOMP, 0, GLbyte, (GLuint)); 3848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(aSrc, ACOMP, 1, GLbyte, (GLuint)); 3849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT: 3851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(rSrc, RCOMP, 0, GLushort, (GLuint)); 3852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(gSrc, GCOMP, 0, GLushort, (GLuint)); 3853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(bSrc, BCOMP, 0, GLushort, (GLuint)); 3854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(aSrc, ACOMP, 1, GLushort, (GLuint)); 3855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SHORT: 3857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(rSrc, RCOMP, 0, GLshort, (GLuint)); 3858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(gSrc, GCOMP, 0, GLshort, (GLuint)); 3859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(bSrc, BCOMP, 0, GLshort, (GLuint)); 3860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(aSrc, ACOMP, 1, GLshort, (GLuint)); 3861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT: 3863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(rSrc, RCOMP, 0, GLuint, (GLuint)); 3864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(gSrc, GCOMP, 0, GLuint, (GLuint)); 3865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(bSrc, BCOMP, 0, GLuint, (GLuint)); 3866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(aSrc, ACOMP, 1, GLuint, (GLuint)); 3867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INT: 3869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(rSrc, RCOMP, 0, GLint, (GLuint)); 3870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(gSrc, GCOMP, 0, GLint, (GLuint)); 3871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(bSrc, BCOMP, 0, GLint, (GLuint)); 3872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(aSrc, ACOMP, 1, GLint, (GLuint)); 3873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_FLOAT: 3875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(rSrc, RCOMP, 0, GLfloat, clamp_float_to_uint); 3876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(gSrc, GCOMP, 0, GLfloat, clamp_float_to_uint); 3877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(bSrc, BCOMP, 0, GLfloat, clamp_float_to_uint); 3878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(aSrc, ACOMP, 1, GLfloat, clamp_float_to_uint); 3879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_HALF_FLOAT_ARB: 3881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(rSrc, RCOMP, 0, GLhalfARB, clamp_half_to_uint); 3882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(gSrc, GCOMP, 0, GLhalfARB, clamp_half_to_uint); 3883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(bSrc, BCOMP, 0, GLhalfARB, clamp_half_to_uint); 3884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROCESS(aSrc, ACOMP, 1, GLhalfARB, clamp_half_to_uint); 3885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_BYTE_3_3_2: 3887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 3888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *ubsrc = (const GLubyte *) src; 3889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 3890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte p = ubsrc[i]; 3892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p >> 5) ); 3893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 2) & 0x7); 3894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p ) & 0x3); 3895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = 1; 3896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_BYTE_2_3_3_REV: 3900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 3901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *ubsrc = (const GLubyte *) src; 3902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 3903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte p = ubsrc[i]; 3905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p ) & 0x7); 3906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 3) & 0x7); 3907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p >> 6) ); 3908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = 1; 3909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_5_6_5: 3913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (swapBytes) { 3914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLushort *ussrc = (const GLushort *) src; 3915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 3916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort p = ussrc[i]; 3918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP2BYTE(p); 3919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p >> 11) ); 3920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 5) & 0x3f); 3921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p ) & 0x1f); 3922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = 1; 3923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLushort *ussrc = (const GLushort *) src; 3927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 3928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort p = ussrc[i]; 3930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p >> 11) ); 3931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 5) & 0x3f); 3932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p ) & 0x1f); 3933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = 1; 3934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_5_6_5_REV: 3938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (swapBytes) { 3939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLushort *ussrc = (const GLushort *) src; 3940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 3941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort p = ussrc[i]; 3943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP2BYTE(p); 3944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p ) & 0x1f); 3945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 5) & 0x3f); 3946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p >> 11) ); 3947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = 1; 3948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLushort *ussrc = (const GLushort *) src; 3952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 3953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort p = ussrc[i]; 3955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p ) & 0x1f); 3956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 5) & 0x3f); 3957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p >> 11) ); 3958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = 1; 3959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_4_4_4_4: 3963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (swapBytes) { 3964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLushort *ussrc = (const GLushort *) src; 3965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 3966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort p = ussrc[i]; 3968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP2BYTE(p); 3969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p >> 12) ); 3970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 8) & 0xf); 3971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p >> 4) & 0xf); 3972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = ((p ) & 0xf); 3973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLushort *ussrc = (const GLushort *) src; 3977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 3978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort p = ussrc[i]; 3980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p >> 12) ); 3981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 8) & 0xf); 3982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p >> 4) & 0xf); 3983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = ((p ) & 0xf); 3984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_4_4_4_4_REV: 3988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (swapBytes) { 3989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLushort *ussrc = (const GLushort *) src; 3990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 3991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 3992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort p = ussrc[i]; 3993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP2BYTE(p); 3994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p ) & 0xf); 3995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 4) & 0xf); 3996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p >> 8) & 0xf); 3997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = ((p >> 12) ); 3998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 4001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLushort *ussrc = (const GLushort *) src; 4002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 4004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort p = ussrc[i]; 4005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p ) & 0xf); 4006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 4) & 0xf); 4007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p >> 8) & 0xf); 4008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = ((p >> 12) ); 4009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_5_5_5_1: 4013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (swapBytes) { 4014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLushort *ussrc = (const GLushort *) src; 4015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 4017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort p = ussrc[i]; 4018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP2BYTE(p); 4019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p >> 11) ); 4020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 6) & 0x1f); 4021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p >> 1) & 0x1f); 4022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = ((p ) & 0x1 ); 4023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 4026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLushort *ussrc = (const GLushort *) src; 4027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 4029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort p = ussrc[i]; 4030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p >> 11) ); 4031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 6) & 0x1f); 4032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p >> 1) & 0x1f); 4033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = ((p ) & 0x1 ); 4034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_1_5_5_5_REV: 4038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (swapBytes) { 4039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLushort *ussrc = (const GLushort *) src; 4040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 4042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort p = ussrc[i]; 4043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP2BYTE(p); 4044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p ) & 0x1f); 4045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 5) & 0x1f); 4046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p >> 10) & 0x1f); 4047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = ((p >> 15) ); 4048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 4051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLushort *ussrc = (const GLushort *) src; 4052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 4054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort p = ussrc[i]; 4055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p ) & 0x1f); 4056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 5) & 0x1f); 4057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p >> 10) & 0x1f); 4058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = ((p >> 15) ); 4059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT_8_8_8_8: 4063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (swapBytes) { 4064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *uisrc = (const GLuint *) src; 4065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 4067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint p = uisrc[i]; 4068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p ) & 0xff); 4069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 8) & 0xff); 4070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p >> 16) & 0xff); 4071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = ((p >> 24) ); 4072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 4075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *uisrc = (const GLuint *) src; 4076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 4078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint p = uisrc[i]; 4079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p >> 24) ); 4080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 16) & 0xff); 4081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p >> 8) & 0xff); 4082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = ((p ) & 0xff); 4083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT_8_8_8_8_REV: 4087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (swapBytes) { 4088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *uisrc = (const GLuint *) src; 4089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 4091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint p = uisrc[i]; 4092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p >> 24) ); 4093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 16) & 0xff); 4094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p >> 8) & 0xff); 4095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = ((p ) & 0xff); 4096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 4099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *uisrc = (const GLuint *) src; 4100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 4102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint p = uisrc[i]; 4103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p ) & 0xff); 4104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 8) & 0xff); 4105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p >> 16) & 0xff); 4106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = ((p >> 24) ); 4107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT_10_10_10_2: 4111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (swapBytes) { 4112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *uisrc = (const GLuint *) src; 4113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 4115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint p = uisrc[i]; 4116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP4BYTE(p); 4117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p >> 22) ); 4118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 12) & 0x3ff); 4119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p >> 2) & 0x3ff); 4120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = ((p ) & 0x3 ); 4121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 4124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *uisrc = (const GLuint *) src; 4125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 4127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint p = uisrc[i]; 4128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p >> 22) ); 4129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 12) & 0x3ff); 4130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p >> 2) & 0x3ff); 4131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = ((p ) & 0x3 ); 4132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT_2_10_10_10_REV: 4136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (swapBytes) { 4137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *uisrc = (const GLuint *) src; 4138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 4140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint p = uisrc[i]; 4141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP4BYTE(p); 4142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p ) & 0x3ff); 4143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 10) & 0x3ff); 4144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p >> 20) & 0x3ff); 4145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = ((p >> 30) ); 4146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 4149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *uisrc = (const GLuint *) src; 4150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 4152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint p = uisrc[i]; 4153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = ((p ) & 0x3ff); 4154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = ((p >> 10) & 0x3ff); 4155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = ((p >> 20) & 0x3ff); 4156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = ((p >> 30) ); 4157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT_5_9_9_9_REV: 4161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (swapBytes) { 4162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *uisrc = (const GLuint *) src; 4163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float f[3]; 4165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 4166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint p = uisrc[i]; 4167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP4BYTE(p); 4168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgb9e5_to_float3(p, f); 4169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = clamp_float_to_uint(f[0]); 4170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = clamp_float_to_uint(f[1]); 4171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = clamp_float_to_uint(f[2]); 4172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = 1; 4173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 4176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *uisrc = (const GLuint *) src; 4177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float f[3]; 4179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 4180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint p = uisrc[i]; 4181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgb9e5_to_float3(p, f); 4182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = clamp_float_to_uint(f[0]); 4183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = clamp_float_to_uint(f[1]); 4184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = clamp_float_to_uint(f[2]); 4185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = 1; 4186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT_10F_11F_11F_REV: 4190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (swapBytes) { 4191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *uisrc = (const GLuint *) src; 4192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float f[3]; 4194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 4195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint p = uisrc[i]; 4196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP4BYTE(p); 4197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r11g11b10f_to_float3(p, f); 4198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = clamp_float_to_uint(f[0]); 4199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = clamp_float_to_uint(f[1]); 4200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = clamp_float_to_uint(f[2]); 4201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = 1; 4202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 4205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *uisrc = (const GLuint *) src; 4206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float f[3]; 4208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i ++) { 4209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint p = uisrc[i]; 4210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r11g11b10f_to_float3(p, f); 4211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][rDst] = clamp_float_to_uint(f[0]); 4212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][gDst] = clamp_float_to_uint(f[1]); 4213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][bDst] = clamp_float_to_uint(f[2]); 4214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][aDst] = 1; 4215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 4219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(NULL, "bad srcType in extract uint data"); 4220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef PROCESS 4223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 4224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 4228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Unpack a row of color image data from a client buffer according to 4229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the pixel unpacking parameters. 4230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return GLubyte values in the specified dest image format. 4231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is used by glDrawPixels and glTexImage?D(). 4232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx - the context 4233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * n - number of pixels in the span 4234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * dstFormat - format of destination color array 4235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * dest - the destination color array 4236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * srcFormat - source image format 4237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * srcType - source image data type 4238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * source - source image pointer 4239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * srcPacking - pixel unpacking parameters 4240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * transferOps - bitmask of IMAGE_*_BIT values of operations to apply 4241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 4242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * XXX perhaps expand this to process whole images someday. 4243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 4244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 4245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_unpack_color_span_ubyte(struct gl_context *ctx, 4246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint n, GLenum dstFormat, GLubyte dest[], 4247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum srcFormat, GLenum srcType, 4248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvoid *source, 4249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_pixelstore_attrib *srcPacking, 4250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLbitfield transferOps ) 4251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 4252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean intFormat = _mesa_is_enum_format_integer(srcFormat); 4253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == GL_ALPHA || 4254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == GL_LUMINANCE || 4255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == GL_LUMINANCE_ALPHA || 4256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == GL_INTENSITY || 4257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == GL_RED || 4258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == GL_RG || 4259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == GL_RGB || 4260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == GL_RGBA); 4261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(srcFormat == GL_RED || 4263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_GREEN || 4264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_BLUE || 4265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_ALPHA || 4266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_LUMINANCE || 4267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_LUMINANCE_ALPHA || 4268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_INTENSITY || 4269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RG || 4270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RGB || 4271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_BGR || 4272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RGBA || 4273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_BGRA || 4274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_ABGR_EXT || 4275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_COLOR_INDEX); 4276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(srcType == GL_BITMAP || 4278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_BYTE || 4279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_BYTE || 4280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT || 4281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_SHORT || 4282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT || 4283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_INT || 4284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_HALF_FLOAT_ARB || 4285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_FLOAT || 4286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_BYTE_3_3_2 || 4287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 4288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT_5_6_5 || 4289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 4290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 4291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 4292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 4293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 4294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_8_8_8_8 || 4295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 4296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_10_10_10_2 || 4297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_2_10_10_10_REV || 4298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_5_9_9_9_REV || 4299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_10F_11F_11F_REV); 4300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* EXT_texture_integer specifies no transfer ops on integer 4302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * types in the resolved issues section. Just set them to 0 4303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * for integer surfaces. 4304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 4305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intFormat) 4306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transferOps = 0; 4307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Try simple cases first */ 4309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (transferOps == 0) { 4310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srcType == GL_UNSIGNED_BYTE) { 4311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstFormat == GL_RGBA) { 4312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srcFormat == GL_RGBA) { 4313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy( dest, source, n * 4 * sizeof(GLubyte) ); 4314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 4315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (srcFormat == GL_RGB) { 4317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *src = (const GLubyte *) source; 4319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dst = dest; 4320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 4321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[0] = src[0]; 4322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[1] = src[1]; 4323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[2] = src[2]; 4324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[3] = 255; 4325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += 3; 4326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += 4; 4327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 4329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstFormat == GL_RGB) { 4332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srcFormat == GL_RGB) { 4333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy( dest, source, n * 3 * sizeof(GLubyte) ); 4334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 4335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (srcFormat == GL_RGBA) { 4337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *src = (const GLubyte *) source; 4339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dst = dest; 4340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 4341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[0] = src[0]; 4342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[1] = src[1]; 4343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[2] = src[2]; 4344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += 4; 4345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += 3; 4346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 4348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstFormat == srcFormat) { 4351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint comps = _mesa_components_in_format(srcFormat); 4352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(comps > 0); 4353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy( dest, source, n * comps * sizeof(GLubyte) ); 4354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 4355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general solution begins here */ 4361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 4362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint dstComponents; 4363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint rDst, gDst, bDst, aDst, lDst, iDst; 4364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat (*rgba)[4] = (GLfloat (*)[4]) malloc(4 * n * sizeof(GLfloat)); 4365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!rgba) { 4367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 4368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 4369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstComponents = _mesa_components_in_format( dstFormat ); 4372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* source & dest image formats should have been error checked by now */ 4373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dstComponents > 0); 4374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 4376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Extract image data and convert to RGBA floats 4377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 4378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srcFormat == GL_COLOR_INDEX) { 4379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint)); 4380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!indexes) { 4382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 4383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(rgba); 4384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 4385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org extract_uint_indexes(n, indexes, srcFormat, srcType, source, 4388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking); 4389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Convert indexes to RGBA */ 4391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 4392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_shift_and_offset_ci(ctx, n, indexes); 4393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_map_ci_to_rgba(ctx, n, indexes, rgba); 4395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting 4397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * with color indexes. 4398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 4399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transferOps &= ~(IMAGE_SCALE_BIAS_BIT | IMAGE_MAP_COLOR_BIT); 4400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(indexes); 4402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 4404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* non-color index data */ 4405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org extract_float_rgba(n, rgba, srcFormat, srcType, source, 4406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking->SwapBytes); 4407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Need to clamp if returning GLubytes */ 4410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transferOps |= IMAGE_CLAMP_BIT; 4411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (transferOps) { 4413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba); 4414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_component_indexes(dstFormat, 4417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &rDst, &gDst, &bDst, &aDst, &lDst, &iDst); 4418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Now return the GLubyte data in the requested dstFormat */ 4420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rDst >= 0) { 4421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dst = dest; 4422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 4424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_UBYTE(dst[rDst], rgba[i][RCOMP]); 4425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += dstComponents; 4426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (gDst >= 0) { 4430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dst = dest; 4431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 4433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_UBYTE(dst[gDst], rgba[i][GCOMP]); 4434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += dstComponents; 4435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bDst >= 0) { 4439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dst = dest; 4440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 4442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_UBYTE(dst[bDst], rgba[i][BCOMP]); 4443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += dstComponents; 4444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (aDst >= 0) { 4448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dst = dest; 4449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 4451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_UBYTE(dst[aDst], rgba[i][ACOMP]); 4452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += dstComponents; 4453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (iDst >= 0) { 4457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dst = dest; 4458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(iDst == 0); 4460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dstComponents == 1); 4461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 4462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Intensity comes from red channel */ 4463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_UBYTE(dst[i], rgba[i][RCOMP]); 4464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (lDst >= 0) { 4468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dst = dest; 4469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(lDst == 0); 4471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 4472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Luminance comes from red channel */ 4473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_UBYTE(dst[0], rgba[i][RCOMP]); 4474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += dstComponents; 4475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(rgba); 4479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 4481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 4484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Same as _mesa_unpack_color_span_ubyte(), but return GLfloat data 4485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * instead of GLubyte. 4486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 4487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 4488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_unpack_color_span_float( struct gl_context *ctx, 4489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint n, GLenum dstFormat, GLfloat dest[], 4490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum srcFormat, GLenum srcType, 4491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvoid *source, 4492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_pixelstore_attrib *srcPacking, 4493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLbitfield transferOps ) 4494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 4495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == GL_ALPHA || 4496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == GL_LUMINANCE || 4497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == GL_LUMINANCE_ALPHA || 4498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == GL_INTENSITY || 4499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == GL_RED || 4500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == GL_RG || 4501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == GL_RGB || 4502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == GL_RGBA); 4503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(srcFormat == GL_RED || 4505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_GREEN || 4506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_BLUE || 4507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_ALPHA || 4508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_LUMINANCE || 4509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_LUMINANCE_ALPHA || 4510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_INTENSITY || 4511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RG || 4512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RGB || 4513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_BGR || 4514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RGBA || 4515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_BGRA || 4516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_ABGR_EXT || 4517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RED_INTEGER_EXT || 4518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_GREEN_INTEGER_EXT || 4519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_BLUE_INTEGER_EXT || 4520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_ALPHA_INTEGER_EXT || 4521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RG_INTEGER || 4522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RGB_INTEGER_EXT || 4523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RGBA_INTEGER_EXT || 4524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_BGR_INTEGER_EXT || 4525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_BGRA_INTEGER_EXT || 4526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_LUMINANCE_INTEGER_EXT || 4527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT || 4528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_COLOR_INDEX); 4529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(srcType == GL_BITMAP || 4531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_BYTE || 4532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_BYTE || 4533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT || 4534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_SHORT || 4535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT || 4536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_INT || 4537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_HALF_FLOAT_ARB || 4538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_FLOAT || 4539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_BYTE_3_3_2 || 4540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 4541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT_5_6_5 || 4542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 4543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 4544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 4545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 4546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 4547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_8_8_8_8 || 4548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 4549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_10_10_10_2 || 4550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_2_10_10_10_REV || 4551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_5_9_9_9_REV || 4552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_10F_11F_11F_REV); 4553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general solution, no special cases, yet */ 4555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 4556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint dstComponents; 4557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint rDst, gDst, bDst, aDst, lDst, iDst; 4558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat (*rgba)[4] = (GLfloat (*)[4]) malloc(4 * n * sizeof(GLfloat)); 4559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean intFormat = _mesa_is_enum_format_integer(srcFormat); 4560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!rgba) { 4562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 4563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 4564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstComponents = _mesa_components_in_format( dstFormat ); 4567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* source & dest image formats should have been error checked by now */ 4568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dstComponents > 0); 4569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* EXT_texture_integer specifies no transfer ops on integer 4571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * types in the resolved issues section. Just set them to 0 4572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * for integer surfaces. 4573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 4574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intFormat) 4575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transferOps = 0; 4576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 4578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Extract image data and convert to RGBA floats 4579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 4580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srcFormat == GL_COLOR_INDEX) { 4581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint)); 4582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!indexes) { 4584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 4585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(rgba); 4586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 4587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org extract_uint_indexes(n, indexes, srcFormat, srcType, source, 4590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking); 4591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Convert indexes to RGBA */ 4593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 4594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_shift_and_offset_ci(ctx, n, indexes); 4595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_map_ci_to_rgba(ctx, n, indexes, rgba); 4597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting 4599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * with color indexes. 4600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 4601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transferOps &= ~(IMAGE_SCALE_BIAS_BIT | IMAGE_MAP_COLOR_BIT); 4602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(indexes); 4604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 4606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* non-color index data */ 4607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org extract_float_rgba(n, rgba, srcFormat, srcType, source, 4608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking->SwapBytes); 4609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (transferOps) { 4612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba); 4613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_component_indexes(dstFormat, 4616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &rDst, &gDst, &bDst, &aDst, &lDst, &iDst); 4617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Now pack results in the requested dstFormat */ 4619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rDst >= 0) { 4620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *dst = dest; 4621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 4623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[rDst] = rgba[i][RCOMP]; 4624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += dstComponents; 4625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (gDst >= 0) { 4629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *dst = dest; 4630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 4632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[gDst] = rgba[i][GCOMP]; 4633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += dstComponents; 4634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bDst >= 0) { 4638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *dst = dest; 4639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 4641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[bDst] = rgba[i][BCOMP]; 4642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += dstComponents; 4643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (aDst >= 0) { 4647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *dst = dest; 4648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 4650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[aDst] = rgba[i][ACOMP]; 4651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += dstComponents; 4652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (iDst >= 0) { 4656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *dst = dest; 4657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(iDst == 0); 4659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dstComponents == 1); 4660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 4661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Intensity comes from red channel */ 4662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = rgba[i][RCOMP]; 4663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (lDst >= 0) { 4667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *dst = dest; 4668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(lDst == 0); 4670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 4671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Luminance comes from red channel */ 4672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[0] = rgba[i][RCOMP]; 4673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += dstComponents; 4674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(rgba); 4678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 4680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 4683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Same as _mesa_unpack_color_span_ubyte(), but return GLuint data 4684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * instead of GLubyte. 4685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * No pixel transfer ops are applied. 4686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 4687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 4688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_unpack_color_span_uint(struct gl_context *ctx, 4689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint n, GLenum dstFormat, GLuint *dest, 4690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum srcFormat, GLenum srcType, 4691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvoid *source, 4692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_pixelstore_attrib *srcPacking) 4693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 4694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint (*rgba)[4] = (GLuint (*)[4]) malloc(n * 4 * sizeof(GLfloat)); 4695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!rgba) { 4697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 4698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 4699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == GL_ALPHA || 4702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == GL_LUMINANCE || 4703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == GL_LUMINANCE_ALPHA || 4704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == GL_INTENSITY || 4705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == GL_RED || 4706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == GL_RG || 4707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == GL_RGB || 4708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == GL_RGBA); 4709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(srcFormat == GL_RED || 4711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_GREEN || 4712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_BLUE || 4713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_ALPHA || 4714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_LUMINANCE || 4715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_LUMINANCE_ALPHA || 4716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_INTENSITY || 4717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RG || 4718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RGB || 4719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_BGR || 4720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RGBA || 4721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_BGRA || 4722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_ABGR_EXT || 4723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RED_INTEGER_EXT || 4724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_GREEN_INTEGER_EXT || 4725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_BLUE_INTEGER_EXT || 4726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_ALPHA_INTEGER_EXT || 4727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RG_INTEGER || 4728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RGB_INTEGER_EXT || 4729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RGBA_INTEGER_EXT || 4730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_BGR_INTEGER_EXT || 4731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_BGRA_INTEGER_EXT || 4732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_LUMINANCE_INTEGER_EXT || 4733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT); 4734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(srcType == GL_UNSIGNED_BYTE || 4736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_BYTE || 4737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT || 4738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_SHORT || 4739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT || 4740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_INT || 4741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_HALF_FLOAT_ARB || 4742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_FLOAT || 4743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_BYTE_3_3_2 || 4744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 4745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT_5_6_5 || 4746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 4747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 4748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 4749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 4750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 4751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_8_8_8_8 || 4752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 4753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_10_10_10_2 || 4754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_2_10_10_10_REV || 4755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_5_9_9_9_REV || 4756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_10F_11F_11F_REV); 4757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Extract image data as uint[4] pixels */ 4760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org extract_uint_rgba(n, rgba, srcFormat, srcType, source, 4761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking->SwapBytes); 4762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstFormat == GL_RGBA) { 4764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple case */ 4765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(dest, rgba, 4 * sizeof(GLuint) * n); 4766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 4768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general case */ 4769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint rDst, gDst, bDst, aDst, lDst, iDst; 4770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint dstComponents = _mesa_components_in_format( dstFormat ); 4771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dstComponents > 0); 4773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_component_indexes(dstFormat, 4775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &rDst, &gDst, &bDst, &aDst, &lDst, &iDst); 4776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Now pack values in the requested dest format */ 4778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rDst >= 0) { 4779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = dest; 4780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 4782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[rDst] = rgba[i][RCOMP]; 4783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += dstComponents; 4784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (gDst >= 0) { 4788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = dest; 4789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 4791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[gDst] = rgba[i][GCOMP]; 4792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += dstComponents; 4793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bDst >= 0) { 4797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = dest; 4798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 4800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[bDst] = rgba[i][BCOMP]; 4801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += dstComponents; 4802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (aDst >= 0) { 4806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = dest; 4807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 4809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[aDst] = rgba[i][ACOMP]; 4810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += dstComponents; 4811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (iDst >= 0) { 4815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = dest; 4816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(iDst == 0); 4818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dstComponents == 1); 4819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 4820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Intensity comes from red channel */ 4821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = rgba[i][RCOMP]; 4822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (lDst >= 0) { 4826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = dest; 4827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(lDst == 0); 4829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 4830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Luminance comes from red channel */ 4831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[0] = rgba[i][RCOMP]; 4832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += dstComponents; 4833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(rgba); 4838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 4839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 4843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba, 4844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * directly return GLbyte data, no transfer ops apply. 4845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 4846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 4847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_unpack_dudv_span_byte( struct gl_context *ctx, 4848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint n, GLenum dstFormat, GLbyte dest[], 4849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum srcFormat, GLenum srcType, 4850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvoid *source, 4851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_pixelstore_attrib *srcPacking, 4852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLbitfield transferOps ) 4853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 4854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == GL_DUDV_ATI); 4855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(srcFormat == GL_DUDV_ATI || 4856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_DU8DV8_ATI); 4857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(srcType == GL_UNSIGNED_BYTE || 4859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_BYTE || 4860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT || 4861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_SHORT || 4862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT || 4863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_INT || 4864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_HALF_FLOAT_ARB || 4865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_FLOAT); 4866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general solution */ 4868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 4869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint dstComponents; 4870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLbyte *dst = dest; 4871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat (*rgba)[4] = (GLfloat (*)[4]) malloc(4 * n * sizeof(GLfloat)); 4873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!rgba) { 4875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 4876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 4877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstComponents = _mesa_components_in_format( dstFormat ); 4880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* source & dest image formats should have been error checked by now */ 4881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dstComponents > 0); 4882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 4884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Extract image data and convert to RGBA floats 4885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 4886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org extract_float_rgba(n, rgba, srcFormat, srcType, source, 4887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking->SwapBytes); 4888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Now determine which color channels we need to produce. 4891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * And determine the dest index (offset) within each color tuple. 4892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 4893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Now pack results in the requested dstFormat */ 4895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 4896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* not sure - need clamp[-1,1] here? */ 4897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[0] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 4898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 4899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += dstComponents; 4900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(rgba); 4903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 4905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 4907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Unpack a row of color index data from a client buffer according to 4908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the pixel unpacking parameters. 4909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc. 4910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 4911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Args: ctx - the context 4912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * n - number of pixels 4913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * dstType - destination data type 4914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * dest - destination array 4915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * srcType - source pixel type 4916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * source - source data pointer 4917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * srcPacking - pixel unpacking parameters 4918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * transferOps - the pixel transfer operations to apply 4919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 4920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 4921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_unpack_index_span( struct gl_context *ctx, GLuint n, 4922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum dstType, GLvoid *dest, 4923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum srcType, const GLvoid *source, 4924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_pixelstore_attrib *srcPacking, 4925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLbitfield transferOps ) 4926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 4927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(srcType == GL_BITMAP || 4928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_BYTE || 4929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_BYTE || 4930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT || 4931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_SHORT || 4932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT || 4933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_INT || 4934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_HALF_FLOAT_ARB || 4935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_FLOAT); 4936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstType == GL_UNSIGNED_BYTE || 4938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstType == GL_UNSIGNED_SHORT || 4939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstType == GL_UNSIGNED_INT); 4940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT); 4943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 4945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Try simple cases first 4946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 4947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (transferOps == 0 && srcType == GL_UNSIGNED_BYTE 4948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && dstType == GL_UNSIGNED_BYTE) { 4949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(dest, source, n * sizeof(GLubyte)); 4950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (transferOps == 0 && srcType == GL_UNSIGNED_INT 4952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && dstType == GL_UNSIGNED_INT && !srcPacking->SwapBytes) { 4953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(dest, source, n * sizeof(GLuint)); 4954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 4956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 4957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * general solution 4958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 4959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint)); 4960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!indexes) { 4962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 4963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 4964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source, 4967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking); 4968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (transferOps) 4970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes); 4971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* convert to dest type */ 4973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (dstType) { 4974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_BYTE: 4975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 4976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dst = (GLubyte *) dest; 4977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 4979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLubyte) (indexes[i] & 0xff); 4980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT: 4984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 4985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dest; 4986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 4987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 4988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLushort) (indexes[i] & 0xffff); 4989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT: 4993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(dest, indexes, n * sizeof(GLuint)); 4994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 4996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, "bad dstType in _mesa_unpack_index_span"); 4997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(indexes); 5000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 5002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 5005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_pack_index_span( struct gl_context *ctx, GLuint n, 5006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum dstType, GLvoid *dest, const GLuint *source, 5007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_pixelstore_attrib *dstPacking, 5008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLbitfield transferOps ) 5009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 5010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint)); 5011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!indexes) { 5013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing"); 5014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 5015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT); 5018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (transferOps & (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT)) { 5020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* make a copy of input */ 5021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(indexes, source, n * sizeof(GLuint)); 5022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes); 5023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org source = indexes; 5024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (dstType) { 5027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_BYTE: 5028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 5029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dst = (GLubyte *) dest; 5030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *dst++ = (GLubyte) source[i]; 5033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BYTE: 5037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 5038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLbyte *dst = (GLbyte *) dest; 5039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLbyte) source[i]; 5042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT: 5046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 5047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dest; 5048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLushort) source[i]; 5051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstPacking->SwapBytes) { 5053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_swap2( (GLushort *) dst, n ); 5054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SHORT: 5058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 5059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLshort *dst = (GLshort *) dest; 5060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLshort) source[i]; 5063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstPacking->SwapBytes) { 5065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_swap2( (GLushort *) dst, n ); 5066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT: 5070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 5071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dest; 5072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLuint) source[i]; 5075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstPacking->SwapBytes) { 5077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_swap4( (GLuint *) dst, n ); 5078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INT: 5082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 5083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint *dst = (GLint *) dest; 5084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLint) source[i]; 5087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstPacking->SwapBytes) { 5089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_swap4( (GLuint *) dst, n ); 5090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_FLOAT: 5094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 5095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *dst = (GLfloat *) dest; 5096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLfloat) source[i]; 5099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstPacking->SwapBytes) { 5101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_swap4( (GLuint *) dst, n ); 5102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_HALF_FLOAT_ARB: 5106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 5107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLhalfARB *dst = (GLhalfARB *) dest; 5108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = _mesa_float_to_half((GLfloat) source[i]); 5111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstPacking->SwapBytes) { 5113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_swap2( (GLushort *) dst, n ); 5114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 5118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, "bad type in _mesa_pack_index_span"); 5119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(indexes); 5122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 5123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 5126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Unpack a row of stencil data from a client buffer according to 5127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the pixel unpacking parameters. 5128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is (or will be) used by glDrawPixels 5129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Args: ctx - the context 5131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * n - number of pixels 5132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * dstType - destination data type 5133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * dest - destination array 5134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * srcType - source pixel type 5135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * source - source data pointer 5136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * srcPacking - pixel unpacking parameters 5137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * transferOps - apply offset/bias/lookup ops? 5138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 5139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 5140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_unpack_stencil_span( struct gl_context *ctx, GLuint n, 5141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum dstType, GLvoid *dest, 5142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum srcType, const GLvoid *source, 5143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_pixelstore_attrib *srcPacking, 5144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLbitfield transferOps ) 5145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 5146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(srcType == GL_BITMAP || 5147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_BYTE || 5148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_BYTE || 5149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT || 5150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_SHORT || 5151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT || 5152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_INT || 5153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_24_8_EXT || 5154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_HALF_FLOAT_ARB || 5155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_FLOAT || 5156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV); 5157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstType == GL_UNSIGNED_BYTE || 5159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstType == GL_UNSIGNED_SHORT || 5160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstType == GL_UNSIGNED_INT || 5161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV); 5162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* only shift and offset apply to stencil */ 5164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transferOps &= IMAGE_SHIFT_OFFSET_BIT; 5165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 5167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Try simple cases first 5168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 5169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (transferOps == 0 && 5170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !ctx->Pixel.MapStencilFlag && 5171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_BYTE && 5172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstType == GL_UNSIGNED_BYTE) { 5173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(dest, source, n * sizeof(GLubyte)); 5174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (transferOps == 0 && 5176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !ctx->Pixel.MapStencilFlag && 5177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT && 5178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstType == GL_UNSIGNED_INT && 5179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !srcPacking->SwapBytes) { 5180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(dest, source, n * sizeof(GLuint)); 5181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 5183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 5184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * general solution 5185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 5186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint)); 5187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!indexes) { 5189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_OUT_OF_MEMORY, "stencil unpacking"); 5190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 5191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org extract_uint_indexes(n, indexes, GL_STENCIL_INDEX, srcType, source, 5194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking); 5195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 5197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* shift and offset indexes */ 5198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_shift_and_offset_ci(ctx, n, indexes); 5199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Pixel.MapStencilFlag) { 5202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Apply stencil lookup table */ 5203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint mask = ctx->PixelMaps.StoS.Size - 1; 5204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org indexes[i] = (GLuint)ctx->PixelMaps.StoS.Map[ indexes[i] & mask ]; 5207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* convert to dest type */ 5211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (dstType) { 5212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_BYTE: 5213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 5214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dst = (GLubyte *) dest; 5215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLubyte) (indexes[i] & 0xff); 5218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT: 5222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 5223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dest; 5224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLushort) (indexes[i] & 0xffff); 5227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT: 5231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(dest, indexes, n * sizeof(GLuint)); 5232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 5234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 5235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dest; 5236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i*2+1] = indexes[i] & 0xff; /* lower 8 bits */ 5239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 5243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, "bad dstType in _mesa_unpack_stencil_span"); 5244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(indexes); 5247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 5249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 5252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_pack_stencil_span( struct gl_context *ctx, GLuint n, 5253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum dstType, GLvoid *dest, const GLubyte *source, 5254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_pixelstore_attrib *dstPacking ) 5255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 5256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *stencil = (GLubyte *) malloc(n * sizeof(GLubyte)); 5257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!stencil) { 5259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_OUT_OF_MEMORY, "stencil packing"); 5260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 5261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset || 5264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Pixel.MapStencilFlag) { 5265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* make a copy of input */ 5266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(stencil, source, n * sizeof(GLubyte)); 5267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_apply_stencil_transfer_ops(ctx, n, stencil); 5268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org source = stencil; 5269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (dstType) { 5272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_BYTE: 5273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(dest, source, n); 5274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BYTE: 5276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 5277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLbyte *dst = (GLbyte *) dest; 5278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 5280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLbyte) (source[i] & 0x7f); 5281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT: 5285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 5286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dest; 5287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 5289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLushort) source[i]; 5290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstPacking->SwapBytes) { 5292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_swap2( (GLushort *) dst, n ); 5293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SHORT: 5297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 5298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLshort *dst = (GLshort *) dest; 5299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 5301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLshort) source[i]; 5302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstPacking->SwapBytes) { 5304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_swap2( (GLushort *) dst, n ); 5305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT: 5309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 5310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dest; 5311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 5313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLuint) source[i]; 5314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstPacking->SwapBytes) { 5316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_swap4( (GLuint *) dst, n ); 5317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INT: 5321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 5322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint *dst = (GLint *) dest; 5323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 5325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLint) source[i]; 5326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstPacking->SwapBytes) { 5328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_swap4( (GLuint *) dst, n ); 5329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_FLOAT: 5333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 5334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *dst = (GLfloat *) dest; 5335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 5337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = (GLfloat) source[i]; 5338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstPacking->SwapBytes) { 5340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_swap4( (GLuint *) dst, n ); 5341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_HALF_FLOAT_ARB: 5345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 5346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLhalfARB *dst = (GLhalfARB *) dest; 5347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<n;i++) { 5349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = _mesa_float_to_half( (float) source[i] ); 5350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstPacking->SwapBytes) { 5352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_swap2( (GLushort *) dst, n ); 5353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BITMAP: 5357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstPacking->LsbFirst) { 5358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dst = (GLubyte *) dest; 5359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint shift = 0; 5360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (shift == 0) 5363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *dst = 0; 5364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *dst |= ((source[i] != 0) << shift); 5365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shift++; 5366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (shift == 8) { 5367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shift = 0; 5368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst++; 5369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 5373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dst = (GLubyte *) dest; 5374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint shift = 7; 5375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (shift == 7) 5378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *dst = 0; 5379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *dst |= ((source[i] != 0) << shift); 5380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shift--; 5381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (shift < 0) { 5382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shift = 7; 5383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst++; 5384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 5389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, "bad type in _mesa_pack_index_span"); 5390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(stencil); 5393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 5394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \ 5396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org do { \ 5397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; \ 5398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLTYPE *src = (const GLTYPE *)source; \ 5399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { \ 5400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLTYPE value = src[i]; \ 5401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srcPacking->SwapBytes) { \ 5402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sizeof(GLTYPE) == 2) { \ 5403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP2BYTE(value); \ 5404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (sizeof(GLTYPE) == 4) { \ 5405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP4BYTE(value); \ 5406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 5407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 5408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depthValues[i] = GLTYPE2FLOAT(value); \ 5409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 5410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } while (0) 5411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 5414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Unpack a row of depth/z values from memory, returning GLushort, GLuint 5415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * or GLfloat values. 5416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The glPixelTransfer (scale/bias) params will be applied. 5417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT 5419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param depthMax max value for returned GLushort or GLuint values 5420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (ignored for GLfloat). 5421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 5422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 5423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_unpack_depth_span( struct gl_context *ctx, GLuint n, 5424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum dstType, GLvoid *dest, GLuint depthMax, 5425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum srcType, const GLvoid *source, 5426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_pixelstore_attrib *srcPacking ) 5427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 5428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *depthTemp = NULL, *depthValues; 5429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean needClamp = GL_FALSE; 5430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Look for special cases first. 5432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Not only are these faster, they're less prone to numeric conversion 5433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * problems. Otherwise, converting from an int type to a float then 5434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * back to an int type can introduce errors that will show up as 5435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * artifacts in things like depth peeling which uses glCopyTexImage. 5436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 5437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Pixel.DepthScale == 1.0 && ctx->Pixel.DepthBias == 0.0) { 5438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srcType == GL_UNSIGNED_INT && dstType == GL_UNSIGNED_SHORT) { 5439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *src = (const GLuint *) source; 5440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dest; 5441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = src[i] >> 16; 5444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 5446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srcType == GL_UNSIGNED_SHORT 5448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && dstType == GL_UNSIGNED_INT 5449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && depthMax == 0xffffffff) { 5450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLushort *src = (const GLushort *) source; 5451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dest; 5452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = src[i] | (src[i] << 16); 5455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 5457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srcType == GL_UNSIGNED_INT_24_8 5459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && dstType == GL_UNSIGNED_INT 5460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && depthMax == 0xffffff) { 5461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *src = (const GLuint *) source; 5462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dest; 5463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = src[i] >> 8; 5466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 5468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX may want to add additional cases here someday */ 5470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general case path follows */ 5473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstType == GL_FLOAT) { 5475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depthValues = (GLfloat *) dest; 5476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 5478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depthTemp = (GLfloat *) malloc(n * sizeof(GLfloat)); 5479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!depthTemp) { 5480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 5481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 5482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depthValues = depthTemp; 5485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Convert incoming values to GLfloat. Some conversions will require 5488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * clamping, below. 5489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 5490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (srcType) { 5491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BYTE: 5492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DEPTH_VALUES(GLbyte, BYTE_TO_FLOATZ); 5493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org needClamp = GL_TRUE; 5494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_BYTE: 5496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DEPTH_VALUES(GLubyte, UBYTE_TO_FLOAT); 5497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SHORT: 5499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DEPTH_VALUES(GLshort, SHORT_TO_FLOATZ); 5500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org needClamp = GL_TRUE; 5501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT: 5503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DEPTH_VALUES(GLushort, USHORT_TO_FLOAT); 5504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INT: 5506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DEPTH_VALUES(GLint, INT_TO_FLOAT); 5507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org needClamp = GL_TRUE; 5508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT: 5510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DEPTH_VALUES(GLuint, UINT_TO_FLOAT); 5511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT_24_8_EXT: /* GL_EXT_packed_depth_stencil */ 5513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstType == GL_UNSIGNED_INT_24_8_EXT && 5514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depthMax == 0xffffff && 5515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Pixel.DepthScale == 1.0 && 5516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Pixel.DepthBias == 0.0) { 5517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *src = (const GLuint *) source; 5518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *zValues = (GLuint *) dest; 5519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint value = src[i]; 5522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srcPacking->SwapBytes) { 5523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP4BYTE(value); 5524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org zValues[i] = value & 0xffffff00; 5526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(depthTemp); 5528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 5529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 5531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *src = (const GLuint *) source; 5532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat scale = 1.0f / 0xffffff; 5533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint value = src[i]; 5536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srcPacking->SwapBytes) { 5537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP4BYTE(value); 5538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depthValues[i] = (value >> 8) * scale; 5540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 5544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 5545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *src = (const GLfloat *)source; 5547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat value = src[i * 2]; 5549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srcPacking->SwapBytes) { 5550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP4BYTE(value); 5551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depthValues[i] = value; 5553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org needClamp = GL_TRUE; 5555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_FLOAT: 5558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DEPTH_VALUES(GLfloat, 1*); 5559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org needClamp = GL_TRUE; 5560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_HALF_FLOAT_ARB: 5562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 5563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLhalfARB *src = (const GLhalfARB *) source; 5565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLhalfARB value = src[i]; 5567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srcPacking->SwapBytes) { 5568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWAP2BYTE(value); 5569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depthValues[i] = _mesa_half_to_float(value); 5571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org needClamp = GL_TRUE; 5573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 5576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(NULL, "bad type in _mesa_unpack_depth_span()"); 5577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(depthTemp); 5578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 5579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* apply depth scale and bias */ 5582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 5583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat scale = ctx->Pixel.DepthScale; 5584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat bias = ctx->Pixel.DepthBias; 5585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (scale != 1.0 || bias != 0.0) { 5586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depthValues[i] = depthValues[i] * scale + bias; 5589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org needClamp = GL_TRUE; 5591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* clamp to [0, 1] */ 5595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (needClamp) { 5596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depthValues[i] = (GLfloat)CLAMP(depthValues[i], 0.0, 1.0); 5599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 5603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Convert values to dstType 5604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 5605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstType == GL_UNSIGNED_INT) { 5606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *zValues = (GLuint *) dest; 5607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (depthMax <= 0xffffff) { 5609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* no overflow worries */ 5610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org zValues[i] = (GLuint) (depthValues[i] * (GLfloat) depthMax); 5612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 5615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* need to use double precision to prevent overflow problems */ 5616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLdouble z = depthValues[i] * (GLdouble) depthMax; 5618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (z >= (GLdouble) 0xffffffff) 5619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org zValues[i] = 0xffffffff; 5620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 5621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org zValues[i] = (GLuint) z; 5622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstType == GL_UNSIGNED_SHORT) { 5626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *zValues = (GLushort *) dest; 5627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(depthMax <= 0xffff); 5629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org zValues[i] = (GLushort) (depthValues[i] * (GLfloat) depthMax); 5631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstType == GL_FLOAT) { 5634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Nothing to do. depthValues is pointing to dest. */ 5635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dstType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV) { 5637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *zValues = (GLfloat*) dest; 5638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org zValues[i*2] = depthValues[i]; 5641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 5644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(0); 5645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(depthTemp); 5648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 5649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 5652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Pack an array of depth values. The values are floats in [0,1]. 5653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 5654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 5655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_pack_depth_span( struct gl_context *ctx, GLuint n, GLvoid *dest, 5656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum dstType, const GLfloat *depthSpan, 5657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_pixelstore_attrib *dstPacking ) 5658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 5659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *depthCopy = (GLfloat *) malloc(n * sizeof(GLfloat)); 5660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!depthCopy) { 5661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing"); 5662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 5663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) { 5666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(depthCopy, depthSpan, n * sizeof(GLfloat)); 5667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_scale_and_bias_depth(ctx, n, depthCopy); 5668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depthSpan = depthCopy; 5669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (dstType) { 5672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_BYTE: 5673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 5674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dst = (GLubyte *) dest; 5675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = FLOAT_TO_UBYTE( depthSpan[i] ); 5678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BYTE: 5682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 5683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLbyte *dst = (GLbyte *) dest; 5684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = FLOAT_TO_BYTE( depthSpan[i] ); 5687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT: 5691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 5692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst = (GLushort *) dest; 5693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLAMPED_FLOAT_TO_USHORT(dst[i], depthSpan[i]); 5696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstPacking->SwapBytes) { 5698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_swap2( (GLushort *) dst, n ); 5699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SHORT: 5703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 5704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLshort *dst = (GLshort *) dest; 5705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = FLOAT_TO_SHORT( depthSpan[i] ); 5708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstPacking->SwapBytes) { 5710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_swap2( (GLushort *) dst, n ); 5711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT: 5715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 5716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dest; 5717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = FLOAT_TO_UINT( depthSpan[i] ); 5720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstPacking->SwapBytes) { 5722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_swap4( (GLuint *) dst, n ); 5723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INT: 5727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 5728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint *dst = (GLint *) dest; 5729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = FLOAT_TO_INT( depthSpan[i] ); 5732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstPacking->SwapBytes) { 5734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_swap4( (GLuint *) dst, n ); 5735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_FLOAT: 5739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 5740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *dst = (GLfloat *) dest; 5741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = depthSpan[i]; 5744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstPacking->SwapBytes) { 5746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_swap4( (GLuint *) dst, n ); 5747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_HALF_FLOAT_ARB: 5751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 5752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLhalfARB *dst = (GLhalfARB *) dest; 5753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] = _mesa_float_to_half(depthSpan[i]); 5756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstPacking->SwapBytes) { 5758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_swap2( (GLushort *) dst, n ); 5759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 5763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, "bad type in _mesa_pack_depth_span"); 5764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(depthCopy); 5767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 5768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 5772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Pack depth and stencil values as GL_DEPTH_STENCIL (GL_UNSIGNED_INT_24_8 etc) 5773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 5774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 5775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_pack_depth_stencil_span(struct gl_context *ctx,GLuint n, 5776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum dstType, GLuint *dest, 5777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *depthVals, 5778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *stencilVals, 5779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_pixelstore_attrib *dstPacking) 5780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 5781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *depthCopy = (GLfloat *) malloc(n * sizeof(GLfloat)); 5782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *stencilCopy = (GLubyte *) malloc(n * sizeof(GLubyte)); 5783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!depthCopy || !stencilCopy) { 5786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing"); 5787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(depthCopy); 5788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(stencilCopy); 5789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 5790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) { 5793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(depthCopy, depthVals, n * sizeof(GLfloat)); 5794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_scale_and_bias_depth(ctx, n, depthCopy); 5795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depthVals = depthCopy; 5796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Pixel.IndexShift || 5799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Pixel.IndexOffset || 5800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Pixel.MapStencilFlag) { 5801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(stencilCopy, stencilVals, n * sizeof(GLubyte)); 5802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_apply_stencil_transfer_ops(ctx, n, stencilCopy); 5803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stencilVals = stencilCopy; 5804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (dstType) { 5807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT_24_8: 5808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint z = (GLuint) (depthVals[i] * 0xffffff); 5810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dest[i] = (z << 8) | (stencilVals[i] & 0xff); 5811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 5814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((GLfloat*)dest)[i*2] = depthVals[i]; 5816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dest[i*2+1] = stencilVals[i] & 0xff; 5817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstPacking->SwapBytes) { 5822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_swap4(dest, n); 5823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(depthCopy); 5826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(stencilCopy); 5827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 5828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 5833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Unpack image data. Apply byte swapping, byte flipping (bitmap). 5834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return all image data in a contiguous block. This is used when we 5835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * compile glDrawPixels, glTexImage, etc into a display list. We 5836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * need a copy of the data in a standard format. 5837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 5838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid * 5839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_unpack_image( GLuint dimensions, 5840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei width, GLsizei height, GLsizei depth, 5841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum format, GLenum type, const GLvoid *pixels, 5842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_pixelstore_attrib *unpack ) 5843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 5844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint bytesPerRow, compsPerRow; 5845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean flipBytes, swap2, swap4; 5846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!pixels) 5848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; /* not necessarily an error */ 5849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (width <= 0 || height <= 0 || depth <= 0) 5851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; /* generate error later */ 5852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (type == GL_BITMAP) { 5854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bytesPerRow = (width + 7) >> 3; 5855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flipBytes = unpack->LsbFirst; 5856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swap2 = swap4 = GL_FALSE; 5857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compsPerRow = 0; 5858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 5860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type); 5861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint components = _mesa_components_in_format(format); 5862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint bytesPerComp; 5863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_type_is_packed(type)) 5865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org components = 1; 5866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bytesPerPixel <= 0 || components <= 0) 5868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; /* bad format or type. generate error later */ 5869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bytesPerRow = bytesPerPixel * width; 5870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bytesPerComp = bytesPerPixel / components; 5871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flipBytes = GL_FALSE; 5872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swap2 = (bytesPerComp == 2) && unpack->SwapBytes; 5873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swap4 = (bytesPerComp == 4) && unpack->SwapBytes; 5874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compsPerRow = components * width; 5875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(compsPerRow >= width); 5876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 5879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *destBuffer 5880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org = (GLubyte *) malloc(bytesPerRow * height * depth); 5881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dst; 5882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row; 5883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!destBuffer) 5884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; /* generate GL_OUT_OF_MEMORY later */ 5885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst = destBuffer; 5887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < depth; img++) { 5888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < height; row++) { 5889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvoid *src = _mesa_image_address(dimensions, unpack, pixels, 5890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width, height, format, type, img, row, 0); 5891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((type == GL_BITMAP) && (unpack->SkipPixels & 0x7)) { 5893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i; 5894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flipBytes = GL_FALSE; 5895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unpack->LsbFirst) { 5896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte srcMask = 1 << (unpack->SkipPixels & 0x7); 5897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte dstMask = 128; 5898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *s = src; 5899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *d = dst; 5900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *d = 0; 5901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < width; i++) { 5902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*s & srcMask) { 5903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *d |= dstMask; 5904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srcMask == 128) { 5906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcMask = 1; 5907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s++; 5908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 5910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcMask = srcMask << 1; 5911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstMask == 1) { 5913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstMask = 128; 5914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org d++; 5915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *d = 0; 5916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 5918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstMask = dstMask >> 1; 5919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 5923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte srcMask = 128 >> (unpack->SkipPixels & 0x7); 5924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte dstMask = 128; 5925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *s = src; 5926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *d = dst; 5927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *d = 0; 5928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < width; i++) { 5929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*s & srcMask) { 5930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *d |= dstMask; 5931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srcMask == 1) { 5933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcMask = 128; 5934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s++; 5935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 5937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcMask = srcMask >> 1; 5938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstMask == 1) { 5940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstMask = 128; 5941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org d++; 5942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *d = 0; 5943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 5945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstMask = dstMask >> 1; 5946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 5951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(dst, src, bytesPerRow); 5952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* byte flipping/swapping */ 5955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (flipBytes) { 5956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flip_bytes((GLubyte *) dst, bytesPerRow); 5957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (swap2) { 5959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_swap2((GLushort*) dst, compsPerRow); 5960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (swap4) { 5962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_swap4((GLuint*) dst, compsPerRow); 5963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += bytesPerRow; 5965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return destBuffer; 5968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 5970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 5974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If we unpack colors from a luminance surface, we'll get pixel colors 5975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * such as (l, l, l, a). 5976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * When we call _mesa_pack_rgba_span_float(format=GL_LUMINANCE), that 5977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * function will compute L=R+G+B before packing. The net effect is we'll 5978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * accidentally store luminance values = 3*l. 5979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This function compensates for that by converting (aka rebasing) (l,l,l,a) 5980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to be (l,0,0,a). 5981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * It's a similar story for other formats such as LUMINANCE_ALPHA, ALPHA 5982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and INTENSITY. 5983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Finally, we also need to do this when the actual surface format does 5985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * not match the logical surface format. For example, suppose the user 5986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * requests a GL_LUMINANCE texture but the driver stores it as RGBA. 5987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Again, we'll get pixel values like (l,l,l,a). 5988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 5989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 5990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_rebase_rgba_float(GLuint n, GLfloat rgba[][4], GLenum baseFormat) 5991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 5992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 5993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (baseFormat) { 5995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA: 5996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 5997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][RCOMP] = 0.0F; 5998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][GCOMP] = 0.0F; 5999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][BCOMP] = 0.0F; 6000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 6001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 6002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY: 6003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fall-through */ 6004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE: 6005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 6006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][GCOMP] = 0.0F; 6007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][BCOMP] = 0.0F; 6008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][ACOMP] = 1.0F; 6009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 6010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 6011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA: 6012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 6013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][GCOMP] = 0.0F; 6014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][BCOMP] = 0.0F; 6015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 6016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 6017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 6018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* no-op */ 6019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; 6020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 6021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 6022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 6023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 6024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 6025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * As above, but GLuint components. 6026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 6027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 6028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_rebase_rgba_uint(GLuint n, GLuint rgba[][4], GLenum baseFormat) 6029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 6030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 6031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 6032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (baseFormat) { 6033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA: 6034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 6035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][RCOMP] = 0; 6036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][GCOMP] = 0; 6037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][BCOMP] = 0; 6038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 6039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 6040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY: 6041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fall-through */ 6042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE: 6043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 6044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][GCOMP] = 0; 6045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][BCOMP] = 0; 6046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][ACOMP] = 1; 6047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 6048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 6049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA: 6050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 6051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][GCOMP] = 0; 6052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][BCOMP] = 0; 6053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 6054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 6055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 6056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* no-op */ 6057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; 6058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 6059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 6060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 6061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 6062