image.c revision 3428162e27c5937291a3ea16d4cd339728ee7f52
13428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul/* $Id: image.c,v 1.8 1999/10/22 10:59:15 brianp Exp $ */ 2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 3afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 4afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Mesa 3-D graphics library 5afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Version: 3.1 6afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * 7afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Copyright (C) 1999 Brian Paul All Rights Reserved. 8afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * 9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Permission is hereby granted, free of charge, to any person obtaining a 10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * copy of this software and associated documentation files (the "Software"), 11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * to deal in the Software without restriction, including without limitation 12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * the rights to use, copy, modify, merge, publish, distribute, sublicense, 13afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * and/or sell copies of the Software, and to permit persons to whom the 14afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Software is furnished to do so, subject to the following conditions: 15afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * 16afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * The above copyright notice and this permission notice shall be included 17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * in all copies or substantial portions of the Software. 18afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * 19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 26afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 27afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 28afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 29afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#ifdef PC_HEADER 30afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "all.h" 31afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#else 32485f04074151686fa24d40e3eeb83029d3d8c425Keith Whitwell#ifndef XFree86Server 33afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include <assert.h> 34afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include <stdlib.h> 35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include <string.h> 36485f04074151686fa24d40e3eeb83029d3d8c425Keith Whitwell#else 37485f04074151686fa24d40e3eeb83029d3d8c425Keith Whitwell#include "GL/xf86glx.h" 38485f04074151686fa24d40e3eeb83029d3d8c425Keith Whitwell#endif 39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "context.h" 40afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "image.h" 41afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "macros.h" 42afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "mmath.h" 43afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "pixel.h" 44afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "types.h" 45afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#ifdef XFree86Server 46afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "GL/xf86glx.h" 47afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#endif 48afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#endif 49afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 50afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 51afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 52afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 53afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the 8 bits in each byte of the given array. 54afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 55afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachvoid gl_flip_bytes( GLubyte *p, GLuint n ) 56afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 57afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach register GLuint i, a, b; 58afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 59afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 60afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach b = (GLuint) p[i]; 61afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach a = ((b & 0x01) << 7) | 62afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x02) << 5) | 63afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x04) << 3) | 64afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x08) << 1) | 65afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x10) >> 1) | 66afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x20) >> 3) | 67afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x40) >> 5) | 68afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((b & 0x80) >> 7); 69afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach p[i] = (GLubyte) a; 70afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 71afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 72afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 73afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 74afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 75afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the order of the 2 bytes in each word in the given array. 76afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 77afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachvoid gl_swap2( GLushort *p, GLuint n ) 78afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 79afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach register GLuint i; 80afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 81afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 82afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach p[i] = (p[i] >> 8) | ((p[i] << 8) & 0xff00); 83afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 84afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 86afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 87afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 88afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 89afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the order of the 4 bytes in each word in the given array. 90afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 91afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachvoid gl_swap4( GLuint *p, GLuint n ) 92afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 93afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach register GLuint i, a, b; 94afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 95afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 96afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach b = p[i]; 97afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach a = (b >> 24) 98afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | ((b >> 8) & 0xff00) 99afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | ((b << 8) & 0xff0000) 100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | ((b << 24) & 0xff000000); 101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach p[i] = a; 102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return the size, in bytes, of the given GL datatype. 110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return 0 if GL_BITMAP. 111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return -1 if invalid type enum. 112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen GerlachGLint gl_sizeof_type( GLenum type ) 114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BITMAP: 117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 0; 118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 121afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLbyte); 122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLushort); 124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLint); 130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLfloat); 132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Same as gl_sizeof_packed_type() but we also accept the 140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * packed pixel format datatypes. 141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen GerlachGLint gl_sizeof_packed_type( GLenum type ) 143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BITMAP: 146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 0; 147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLbyte); 151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLushort); 153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLint); 159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLfloat); 161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_3_3_2: 162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_2_3_3_REV: 164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5: 166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5_REV: 168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4: 170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4_REV: 172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_5_5_1: 174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_1_5_5_5_REV: 176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8: 178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8_REV: 180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_10_10_10_2: 182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_2_10_10_10_REV: 184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return the number of components in a GL enum pixel type. 194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return -1 if bad format. 195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen GerlachGLint gl_components_in_format( GLenum format ) 197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (format) { 199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX: 200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX1_EXT: 201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX2_EXT: 202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX4_EXT: 203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX8_EXT: 204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX12_EXT: 205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX16_EXT: 206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_STENCIL_INDEX: 207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_DEPTH_COMPONENT: 208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_GREEN: 210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BLUE: 211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ALPHA: 212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE: 213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 1; 214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE_ALPHA: 215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 2; 216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 3; 218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGBA: 219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 4; 220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGR: 221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 3; 222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGRA: 223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 4; 224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ABGR_EXT: 225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 4; 226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return bytes per pixel for given format and type 234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return -1 if bad format or type. 235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen GerlachGLint gl_bytes_per_pixel( GLenum format, GLenum type ) 237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint comps = gl_components_in_format( format ); 239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (comps < 0) 240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BITMAP: 244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 0; /* special case */ 245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return comps * sizeof(GLubyte); 248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return comps * sizeof(GLshort); 251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return comps * sizeof(GLint); 254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return comps * sizeof(GLfloat); 256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_3_3_2: 257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_2_3_3_REV: 258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB || format == GL_BGR) 259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else 261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; /* error */ 262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5: 263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5_REV: 264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB || format == GL_BGR) 265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else 267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; /* error */ 268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4: 269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4_REV: 270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_5_5_1: 271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_1_5_5_5_REV: 272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT) 273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLushort); 274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else 275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8: 277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8_REV: 278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_10_10_10_2: 279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_2_10_10_10_REV: 280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT) 281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else 283afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Test if the given pixel format and type are legal. 292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return GL_TRUE for legal, GL_FALSE for illegal. 293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen GerlachGLboolean gl_is_legal_format_and_type( GLenum format, GLenum type ) 295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (format) { 297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX: 298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_STENCIL_INDEX: 299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BITMAP: 301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 303afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_TRUE; 309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_GREEN: 314afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BLUE: 315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ALPHA: 316afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE: 317afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE_ALPHA: 318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_DEPTH_COMPONENT: 319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGR: 320afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_TRUE; 329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 336afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_3_3_2: 342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_2_3_3_REV: 343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5: 344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5_REV: 345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_TRUE; 346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGBA: 350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGRA: 351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ABGR_EXT: 352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4: 361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4_REV: 362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_5_5_1: 363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_1_5_5_5_REV: 364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8: 365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8_REV: 366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_10_10_10_2: 367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_2_10_10_10_REV: 368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_TRUE; 369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ; /* fall-through */ 374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return the address of a pixel in an image (actually a volume). 382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Pixel unpacking/packing parameters are observed according to 'packing'. 383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Input: image - start of image data 384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * width, height - size of image 385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * format - image format 386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * type - pixel component type 387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * packing - the pixelstore attributes 388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * img - which image in the volume (0 for 1D or 2D images) 389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * row, column - location of pixel in the image 390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return: address of pixel at (image,row,column) in image or NULL if error. 391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen GerlachGLvoid *gl_pixel_addr_in_image( const struct gl_pixelstore_attrib *packing, 393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach const GLvoid *image, GLsizei width, 394afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLsizei height, GLenum format, GLenum type, 395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint img, GLint row, GLint column ) 396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint alignment; /* 1, 2 or 4 */ 398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint pixels_per_row; 399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint rows_per_image; 400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint skiprows; 401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint skippixels; 402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint skipimages; /* for 3-D volume images */ 403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte *pixel_addr; 404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach alignment = packing->Alignment; 406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->RowLength > 0) { 407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach pixels_per_row = packing->RowLength; 408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach pixels_per_row = width; 411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->ImageHeight > 0) { 413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach rows_per_image = packing->ImageHeight; 414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach rows_per_image = height; 417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach skiprows = packing->SkipRows; 419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach skippixels = packing->SkipPixels; 420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach skipimages = packing->SkipImages; 421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (type==GL_BITMAP) { 423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* BITMAP data */ 424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint comp_per_pixel; /* components per pixel */ 425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint bytes_per_comp; /* bytes per component */ 426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint bytes_per_row; 427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint bytes_per_image; 428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* Compute bytes per component */ 430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_comp = gl_sizeof_packed_type( type ); 431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (bytes_per_comp<0) { 432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return NULL; 433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* Compute number of components per pixel */ 436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach comp_per_pixel = gl_components_in_format( format ); 437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (comp_per_pixel<0 && type != GL_BITMAP) { 438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return NULL; 439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_row = alignment 442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * CEILING( comp_per_pixel*pixels_per_row, 8*alignment ); 443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_image = bytes_per_row * rows_per_image; 445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach pixel_addr = (GLubyte *) image 447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skipimages + img) * bytes_per_image 448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skiprows + row) * bytes_per_row 449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skippixels + column) / 8; 450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 451afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* Non-BITMAP data */ 453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint bytes_per_pixel, bytes_per_row, remainder, bytes_per_image; 454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 455afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_pixel = gl_bytes_per_pixel( format, type ); 456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* The pixel type and format should have been error checked earlier */ 458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach assert(bytes_per_pixel > 0); 459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_row = pixels_per_row * bytes_per_pixel; 461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach remainder = bytes_per_row % alignment; 462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (remainder > 0) 463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_row += (alignment - remainder); 464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ASSERT(bytes_per_row % alignment == 0); 466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_image = bytes_per_row * rows_per_image; 468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* compute final pixel address */ 470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach pixel_addr = (GLubyte *) image 471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skipimages + img) * bytes_per_image 472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skiprows + row) * bytes_per_row 473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skippixels + column) * bytes_per_pixel; 474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return (GLvoid *) pixel_addr; 477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Allocate a new gl_image. All fields are initialized to zero. 483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachstatic struct gl_image *alloc_image( void ) 485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 486bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul return CALLOC_STRUCT(gl_image); 487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Allocate a new gl_image with the error flag set. 493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachstatic struct gl_image *alloc_error_image( GLint width, GLint height, 495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint depth, GLenum format, 496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLenum type ) 497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach struct gl_image *image = alloc_image(); 499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (image) { 500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Width = width; 501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Height = height; 502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Depth = depth; 503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Format = format; 504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Type = type; 505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->ErrorFlag = GL_TRUE; 506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return image; 508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Free a gl_image. 514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachvoid gl_free_image( struct gl_image *image ) 516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (image->Data) { 518bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul FREE(image->Data); 519afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 520bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul FREE(image); 521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 522afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Do error checking on an image. If there's an error, register it and 527afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * return GL_TRUE, else return GL_FALSE. 528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 529afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen GerlachGLboolean gl_image_error_test( GLcontext *ctx, const struct gl_image *image, 530afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach const char *msg ) 531afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (!image) { 533afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach gl_error( ctx, GL_OUT_OF_MEMORY, msg ); 534afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_TRUE; 535afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 536afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (image->Width <= 0 || image->Height <= 0 || image->Depth <= 0) { 537afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach gl_error( ctx, GL_INVALID_VALUE, msg ); 538afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_TRUE; 539afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 540351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul else if (!gl_is_legal_format_and_type(image->Format, image->Type)) { 541351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul return GL_TRUE; 542351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul } 543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 545afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 546afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 547afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 550afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 551afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Unpack a depth-buffer image storing values as GLshort, GLuint, or GLfloats. 552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Input: type - datatype of src depth image 553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return pointer to a new gl_image structure. 554afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * 555afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Notes: if the source image type is GLushort then the gl_image will 556afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * also store GLushorts. If the src image type is GLuint then the gl_image 557afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * will also store GLuints. For all other src image types the gl_image 558afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * will store GLfloats. The integer cases can later be optimized. 559afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 560afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachstatic struct gl_image * 561afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachunpack_depth_image( GLcontext *ctx, GLenum type, GLint width, GLint height, 562afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach const GLvoid *pixels, 563afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach const struct gl_pixelstore_attrib *packing) 564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 565afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 566afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach struct gl_image *image; 567afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLfloat *fDst; 568afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLushort *sDst; 569afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *iDst; 570afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint i, j; 571351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul GLboolean errorType; 572351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul 573351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul errorType = type != GL_BYTE && 574351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul type != GL_UNSIGNED_BYTE && 575351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul type != GL_SHORT && 576351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul type != GL_UNSIGNED_SHORT && 577351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul type != GL_INT && 578351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul type != GL_UNSIGNED_INT && 579351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul type != GL_FLOAT; 580afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 581afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image = alloc_image(); 582afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (image) { 583afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Width = width; 584afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Height = height; 585afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Depth = 1; 586afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Components = 1; 587afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Format = GL_DEPTH_COMPONENT; 588351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul if (errorType) { 589351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul image->Type = type; 590351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul image->Data = NULL; 591351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul } 592afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (type==GL_UNSIGNED_SHORT) { 593afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Type = GL_UNSIGNED_SHORT; 594bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul image->Data = MALLOC( width * height * sizeof(GLushort)); 595afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 596afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (type==GL_UNSIGNED_INT) { 597afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Type = GL_UNSIGNED_INT; 598bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul image->Data = MALLOC( width * height * sizeof(GLuint)); 599afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 600afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 601afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Type = GL_FLOAT; 602bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul image->Data = MALLOC( width * height * sizeof(GLfloat)); 603afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 604afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->RefCount = 0; 605afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (!image->Data) 606afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return image; 607afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 608afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 609afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return NULL; 610afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 611afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 612351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul if (errorType) 613351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul return image; 614351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul 615afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach fDst = (GLfloat *) image->Data; 616afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach sDst = (GLushort *) image->Data; 617afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach iDst = (GLuint *) image->Data; 618afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 619afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<height;i++) { 620afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLvoid *src = gl_pixel_addr_in_image( packing, pixels, 621afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach width, height, 622afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GL_DEPTH_COMPONENT, type, 623afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 0, i, 0 ); 624afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (!src) { 625afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return image; 626afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 627afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 628afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 629afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 630afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach assert(image->Type == GL_FLOAT); 631afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0; j<width; j++) { 632afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *fDst++ = BYTE_TO_FLOAT(((GLbyte*)src)[j]); 633afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 634afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 635afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 636afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach assert(image->Type == GL_FLOAT); 637afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0; j<width; j++) { 638afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *fDst++ = UBYTE_TO_FLOAT(((GLubyte*)src)[j]); 639afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 640afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 641afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 642afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach assert(image->Type == GL_UNSIGNED_SHORT); 643afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach MEMCPY( sDst, src, width * sizeof(GLushort) ); 644afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->SwapBytes) { 645afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach gl_swap2( sDst, width ); 646afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 647afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach sDst += width; 648afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 649afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 650afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach assert(image->Type == GL_FLOAT); 651afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->SwapBytes) { 652afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0;j<width;j++) { 653afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLshort value = ((GLshort*)src)[j]; 654afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach value = ((value >> 8) & 0xff) | ((value&0xff) << 8); 655afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *fDst++ = SHORT_TO_FLOAT(value); 656afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 657afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 658afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 659afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0;j<width;j++) { 660afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *fDst++ = SHORT_TO_FLOAT(((GLshort*)src)[j]); 661afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 662afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 663afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 664afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 665afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach assert(image->Type == GL_FLOAT); 666afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->SwapBytes) { 667afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0;j<width;j++) { 668afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint value = ((GLint*)src)[j]; 669afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach value = ((value >> 24) & 0x000000ff) | 670afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((value >> 8) & 0x0000ff00) | 671afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((value << 8) & 0x00ff0000) | 672afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ((value << 24) & 0xff000000); 673afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *fDst++ = INT_TO_FLOAT(value); 674afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 675afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 676afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 677afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0;j<width;j++) { 678afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *fDst++ = INT_TO_FLOAT(((GLint*)src)[j]); 679afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 680afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 681afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach iDst += width; 682afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 683afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 684afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach assert(image->Type == GL_UNSIGNED_INT); 685afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach MEMCPY( iDst, src, width * sizeof(GLuint) ); 686afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->SwapBytes) { 687afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach gl_swap4( iDst, width ); 688afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 689afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach iDst += width; 690afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 691afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 692afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach assert(image->Type == GL_FLOAT); 693afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach MEMCPY( fDst, src, width * sizeof(GLfloat) ); 694afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->SwapBytes) { 695afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach gl_swap4( (GLuint*) fDst, width ); 696afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 697afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach fDst += width; 698afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 699afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 700afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach gl_problem(ctx, "unpack_depth_image type" ); 701afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return image; 702afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 703afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 704afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 705afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return image; 706afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 707afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 708afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 709afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 710afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 711afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Unpack a stencil image. Store as GLubytes in a gl_image structure. 712afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return: pointer to new gl_image structure. 713afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 714afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachstatic struct gl_image * 715afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachunpack_stencil_image( GLcontext *ctx, GLenum type, GLint width, GLint height, 716afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach const GLvoid *pixels, 717afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach const struct gl_pixelstore_attrib *packing ) 718afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 719afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach struct gl_image *image; 720afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte *dst; 721afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint i, j; 722351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul GLboolean errorType; 723afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 724afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach assert(sizeof(GLstencil) == sizeof(GLubyte)); 725afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 726351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul errorType = type != GL_BYTE && 727351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul type != GL_UNSIGNED_BYTE && 728351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul type != GL_SHORT && 729351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul type != GL_UNSIGNED_SHORT && 730351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul type != GL_INT && 731351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul type != GL_UNSIGNED_INT && 732351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul type != GL_FLOAT && 733351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul type != GL_BITMAP; 734351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul 735afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image = alloc_image(); 736afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (image) { 737afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Width = width; 738afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Height = height; 739afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Depth = 1; 740afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Components = 1; 741afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Format = GL_STENCIL_INDEX; 742351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul if (errorType) { 743351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul image->Type = type; 744351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul image->Data = NULL; 745351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul } 746351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul else { 747351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul image->Type = GL_UNSIGNED_BYTE; 748351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul image->Data = MALLOC( width * height * sizeof(GLubyte)); 749351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul } 750afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->RefCount = 0; 751afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (!image->Data) 752afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return image; 753afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 754afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 755afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return NULL; 756afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 757afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 758351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul if (errorType) 759351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul return image; /* error will be generated later */ 760351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul 761afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst = (GLubyte *) image->Data; 762afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 763afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<height;i++) { 764afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLvoid *src = gl_pixel_addr_in_image( packing, pixels, 765afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach width, height, 766afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GL_STENCIL_INDEX, type, 767afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 0, i, 0 ); 768afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (!src) { 769afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return image; 770afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 771afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 772afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 773afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 774afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 775afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach MEMCPY( dst, src, width * sizeof(GLubyte) ); 776afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst += width * sizeof(GLubyte); 777afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 778afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 779afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 780afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->SwapBytes) { 781afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* grab upper byte */ 782afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0; j < width; j++) { 783afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = (((GLushort*)src)[j] & 0xff00) >> 8; 784afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 785afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 786afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 787afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0; j < width; j++) { 788afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = (((GLushort*)src)[j]) & 0xff; 789afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 790afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 791afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 792afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 793afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->SwapBytes) { 794afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* grab upper byte */ 795afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0; j < width; j++) { 796afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = (((GLuint*)src)[j] & 0xff000000) >> 8; 797afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 798afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 799afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 800afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0; j < width; j++) { 801afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = (((GLuint*)src)[j]) & 0xff; 802afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 803afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 804afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 805afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 806afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->SwapBytes) { 807afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* grab upper byte */ 808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0; j < width; j++) { 809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = (((GLuint*)src)[j] & 0xff000000) >> 8; 810afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 811afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 812afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 813afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0; j < width; j++) { 814afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = (((GLuint*)src)[j]) & 0xff; 815afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 816afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 817afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 818afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 819afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->SwapBytes) { 820afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0; j < width; j++) { 821afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLfloat fvalue; 822afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint value = ((GLuint*)src)[j]; 823afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach value = ((value & 0xff000000) >> 24) 824afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | ((value & 0x00ff0000) >> 8) 825afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | ((value & 0x0000ff00) << 8) 826afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | ((value & 0x000000ff) << 24); 827afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach fvalue = *((GLfloat*) &value); 828afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((GLint) fvalue) & 0xff; 829afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 830afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 831afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 832afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0; j < width; j++) { 833afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLfloat fvalue = ((GLfloat *)src)[j]; 834afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((GLint) fvalue) & 0xff; 835afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 836afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 837afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 838afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 839afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach gl_problem(ctx, "unpack_stencil_image type" ); 840afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return image; 841afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 842afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 843afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 844afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return image; 845afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 846afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 847afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 848afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 849afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 850afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Unpack a bitmap, return a new gl_image struct. 851afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 852afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachstatic struct gl_image * 853af19f37b797942e08c5847cfcc9be9792b2ebc32Brian Paulunpack_bitmap( GLenum format, GLint width, GLint height, 854afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach const GLvoid *pixels, 855afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach const struct gl_pixelstore_attrib *packing ) 856afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 857afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach struct gl_image *image; 858afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint bytes, i, width_in_bytes; 859afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte *buffer, *dst; 860afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 861afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach assert(format == GL_COLOR_INDEX || format == GL_STENCIL_INDEX); 862afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 863afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* Alloc dest storage */ 864afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes = ((width+7)/8 * height); 865afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (bytes>0 && pixels!=NULL) { 866bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul buffer = (GLubyte *) MALLOC( bytes ); 867afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (!buffer) { 868afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return NULL; 869afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 870afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* Copy/unpack pixel data to buffer */ 871afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach width_in_bytes = CEILING( width, 8 ); 872afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst = buffer; 873afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0; i<height; i++) { 874afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLvoid *src = gl_pixel_addr_in_image( packing, pixels, 875afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach width, height, 876afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GL_COLOR_INDEX, GL_BITMAP, 877afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 0, i, 0 ); 878afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (!src) { 879bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul FREE(buffer); 880afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return NULL; 881afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 882afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach MEMCPY( dst, src, width_in_bytes ); 883afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst += width_in_bytes; 884afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 885afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* Bit flipping */ 886afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->LsbFirst) { 887afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach gl_flip_bytes( buffer, bytes ); 888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 889afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 890afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 891afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* a 'null' bitmap */ 892afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach buffer = NULL; 893afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 894afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 895afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image = alloc_image(); 896afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (image) { 897afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Width = width; 898afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Height = height; 899afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Depth = 1; 900afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Components = 0; 901afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Format = format; 902afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Type = GL_BITMAP; 903afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Data = buffer; 904afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->RefCount = 0; 905afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 906afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 907bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul FREE( buffer ); 908afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return NULL; 909afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 910afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 911afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return image; 912afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 913afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 914afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 915afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 916afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 917afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Unpack a 32x32 pixel polygon stipple from user memory using the 918afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * current pixel unpack settings. 919afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 920afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachvoid gl_unpack_polygon_stipple( const GLcontext *ctx, 921afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach const GLubyte *pattern, GLuint dest[32] ) 922afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 923afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint i; 924afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i = 0; i < 32; i++) { 925afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte *src = (GLubyte *) gl_pixel_addr_in_image( &ctx->Unpack, pattern, 926afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 32, 32, GL_COLOR_INDEX, GL_BITMAP, 0, i, 0 ); 927afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dest[i] = (src[0] << 24) 928afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (src[1] << 16) 929afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (src[2] << 8) 930afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (src[3] ); 931afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 932afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 933afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* Bit flipping within each byte */ 934afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (ctx->Unpack.LsbFirst) { 935afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach gl_flip_bytes( (GLubyte *) dest, 32 * 4 ); 936afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 937afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 938afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 939afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 940afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 941afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 942afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Pack polygon stipple into user memory given current pixel packing 943afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * settings. 944afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 945afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachvoid gl_pack_polygon_stipple( const GLcontext *ctx, 946afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach const GLuint pattern[32], 947afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte *dest ) 948afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 949afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint i; 950afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i = 0; i < 32; i++) { 951afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte *dst = (GLubyte *) gl_pixel_addr_in_image( &ctx->Pack, dest, 952afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 32, 32, GL_COLOR_INDEX, GL_BITMAP, 0, i, 0 ); 953afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[0] = (pattern[i] >> 24) & 0xff; 954afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[1] = (pattern[i] >> 16) & 0xff; 955afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[2] = (pattern[i] >> 8) & 0xff; 956afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[3] = (pattern[i] ) & 0xff; 957afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 958afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* Bit flipping within each byte */ 959afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (ctx->Pack.LsbFirst) { 960afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach gl_flip_bytes( (GLubyte *) dst, 4 ); 961afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 962afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 963afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 964afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 965afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 966afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 967afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 968afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Unpack an RGBA or CI image and store it as unsigned bytes 969afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 970afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachstatic struct gl_image * 971af19f37b797942e08c5847cfcc9be9792b2ebc32Brian Paulunpack_ubyte_image( GLint width, GLint height, 972afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint depth, GLenum format, const GLvoid *pixels, 973afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach const struct gl_pixelstore_attrib *packing ) 974afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 975afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach struct gl_image *image; 976afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint width_in_bytes; 977afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint components; 978afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte *buffer, *dst; 979afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint i, d; 980afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 981afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach components = gl_components_in_format( format ); 982afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 983afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach width_in_bytes = width * components * sizeof(GLubyte); 984bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul buffer = (GLubyte *) MALLOC( height * width_in_bytes * depth ); 985afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (!buffer) { 986afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return NULL; 987afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 988afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 989afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* Copy/unpack pixel data to buffer */ 990afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst = buffer; 991afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (d=0; d<depth; d++ ) { 992afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<height;i++) { 993afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte *src = (GLubyte *) gl_pixel_addr_in_image( packing, 994afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach pixels, width, height, format, GL_UNSIGNED_BYTE, 995afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach d, i, 0 ); 996afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (!src) { 997bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul FREE(buffer); 998afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return NULL; 999afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1000afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach MEMCPY( dst, src, width_in_bytes ); 1001afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst += width_in_bytes; 1002afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1003afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1004afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1005afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_BGR) { 1006afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* swap order of every ubyte triplet from BGR to RGB */ 1007afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0; i<width*height; i++) { 1008afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte b = buffer[i*3+0]; 1009afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte r = buffer[i*3+2]; 1010afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach buffer[i*3+0] = r; 1011afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach buffer[i*3+2] = b; 1012afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1013afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1014afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (format == GL_BGRA) { 1015afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* swap order of every ubyte quadruplet from BGRA to RGBA */ 1016afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0; i<width*height; i++) { 1017afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte b = buffer[i*4+0]; 1018afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte r = buffer[i*4+2]; 1019afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach buffer[i*4+0] = r; 1020afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach buffer[i*4+2] = b; 1021afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1022afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1023afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (format == GL_ABGR_EXT) { 1024afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* swap order of every ubyte quadruplet from ABGR to RGBA */ 1025afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0; i<width*height; i++) { 1026afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte a = buffer[i*4+0]; 1027afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte b = buffer[i*4+1]; 1028afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte g = buffer[i*4+2]; 1029afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte r = buffer[i*4+3]; 1030afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach buffer[i*4+0] = r; 1031afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach buffer[i*4+1] = g; 1032afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach buffer[i*4+2] = b; 1033afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach buffer[i*4+3] = a; 1034afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1035afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1036afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1037afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1038afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image = alloc_image(); 1039afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (image) { 1040afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Width = width; 1041afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Height = height; 1042afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Depth = depth; 1043afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Components = components; 1044afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_BGR) 1045afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Format = GL_RGB; 1046afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (format == GL_BGRA) 1047afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Format = GL_RGBA; 1048afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (format == GL_ABGR_EXT) 1049afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Format = GL_RGBA; 1050afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else 1051afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Format = format; 1052afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Type = GL_UNSIGNED_BYTE; 1053afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Data = buffer; 1054afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->RefCount = 0; 1055afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1056afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 1057bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul FREE( buffer ); 1058afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1059afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1060afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return image; 1061afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 1062afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1063afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1064afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1065afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 1066afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Unpack a color image storing image as GLfloats 1067afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 1068afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachstatic struct gl_image * 1069afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachunpack_float_image( GLcontext *ctx, GLint width, GLint height, GLint depth, 1070afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLenum format, GLenum type, const GLvoid *pixels, 1071afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach const struct gl_pixelstore_attrib *packing ) 1072afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 1073afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach struct gl_image *image; 1074afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLfloat *dst; 1075afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint elems_per_row; 1076afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint components; 1077afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint i, j, d; 1078afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLboolean normalize; 1079afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1080afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach assert(type != GL_BITMAP); 1081afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1082afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach components = gl_components_in_format( format ); 1083afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach assert(components > 0); /* should have been caught earlier */ 1084afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1085afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (!gl_is_legal_format_and_type( format, type )) { 1086afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* bad pixel type for format, make dummy image */ 1087afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image = alloc_image(); 1088afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (image) { 1089afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Width = width; 1090afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Height = height; 1091afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Depth = depth; 1092afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Components = components; 1093afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Format = format; 1094afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Type = type; 1095afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Data = NULL; 1096afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->RefCount = 0; 1097afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1098afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return image; 1099afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach elems_per_row = width * components; 1102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image = alloc_image(); 1104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (image) { 1105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Width = width; 1106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Height = height; 1107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Depth = depth; 1108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Components = components; 1109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_BGR) 1110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Format = GL_RGB; 1111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (format == GL_BGRA) 1112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Format = GL_RGBA; 1113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (format == GL_ABGR_EXT) 1114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Format = GL_RGBA; 1115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else 1116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Format = format; 1117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->Type = GL_FLOAT; 1118bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul image->Data = MALLOC( elems_per_row * height * depth * sizeof(GLfloat)); 1119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach image->RefCount = 0; 1120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (!image->Data) 1121afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return image; 1122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 1124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return NULL; 1125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach normalize = (format != GL_COLOR_INDEX) && (format != GL_STENCIL_INDEX); 1128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst = (GLfloat *) image->Data; 1130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (d=0; d<depth; d++) { 1132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<height;i++) { 1133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLvoid *src = gl_pixel_addr_in_image( packing, pixels, 1134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach width, height, 1135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach format, type, 1136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach d, i, 0 ); 1137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (!src) { 1138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return image; 1139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 1142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 1143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach { 1144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte *ubsrc = (GLubyte *) src; 1145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (normalize) { 1146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0;j<elems_per_row;j++) { 1147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = UBYTE_TO_FLOAT(ubsrc[j]); 1148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 1151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0;j<elems_per_row;j++) { 1152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = (GLfloat) ubsrc[j]; 1153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 1158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (normalize) { 1159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0;j<elems_per_row;j++) { 1160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = BYTE_TO_FLOAT(((GLbyte*)src)[j]); 1161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 1164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0;j<elems_per_row;j++) { 1165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = (GLfloat) ((GLbyte*)src)[j]; 1166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 1170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->SwapBytes) { 1171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0;j<elems_per_row;j++) { 1172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLushort value = ((GLushort*)src)[j]; 1173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach value = ((value >> 8) & 0xff) | ((value&0xff) << 8); 1174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (normalize) { 1175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = USHORT_TO_FLOAT(value); 1176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 1178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = (GLfloat) value; 1179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 1183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (normalize) { 1184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0;j<elems_per_row;j++) { 1185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = USHORT_TO_FLOAT(((GLushort*)src)[j]); 1186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 1189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0;j<elems_per_row;j++) { 1190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = (GLfloat) ((GLushort*)src)[j]; 1191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 1196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->SwapBytes) { 1197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0;j<elems_per_row;j++) { 1198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLshort value = ((GLshort*)src)[j]; 1199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach value = ((value >> 8) & 0xff) | ((value&0xff) << 8); 1200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (normalize) { 1201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = SHORT_TO_FLOAT(value); 1202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 1204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = (GLfloat) value; 1205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 1209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (normalize) { 1210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0;j<elems_per_row;j++) { 1211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = SHORT_TO_FLOAT(((GLshort*)src)[j]); 1212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 1215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0;j<elems_per_row;j++) { 1216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = (GLfloat) ((GLshort*)src)[j]; 1217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 1222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->SwapBytes) { 1223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint value; 1224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0;j<elems_per_row;j++) { 1225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach value = ((GLuint*)src)[j]; 1226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach value = ((value & 0xff000000) >> 24) 1227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | ((value & 0x00ff0000) >> 8) 1228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | ((value & 0x0000ff00) << 8) 1229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | ((value & 0x000000ff) << 24); 1230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (normalize) { 1231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = UINT_TO_FLOAT(value); 1232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 1234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = (GLfloat) value; 1235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 1239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (normalize) { 1240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0;j<elems_per_row;j++) { 1241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = UINT_TO_FLOAT(((GLuint*)src)[j]); 1242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 1245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0;j<elems_per_row;j++) { 1246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = (GLfloat) ((GLuint*)src)[j]; 1247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 1252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->SwapBytes) { 1253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint value; 1254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0;j<elems_per_row;j++) { 1255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach value = ((GLint*)src)[j]; 1256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach value = ((value & 0xff000000) >> 24) 1257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | ((value & 0x00ff0000) >> 8) 1258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | ((value & 0x0000ff00) << 8) 1259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | ((value & 0x000000ff) << 24); 1260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (normalize) { 1261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = INT_TO_FLOAT(value); 1262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 1264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = (GLfloat) value; 1265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 1269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (normalize) { 1270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0;j<elems_per_row;j++) { 1271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = INT_TO_FLOAT(((GLint*)src)[j]); 1272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 1275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0;j<elems_per_row;j++) { 1276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = (GLfloat) ((GLint*)src)[j]; 1277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 1282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->SwapBytes) { 1283afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint value; 1284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0;j<elems_per_row;j++) { 1285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach value = ((GLuint*)src)[j]; 1286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach value = ((value & 0xff000000) >> 24) 1287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | ((value & 0x00ff0000) >> 8) 1288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | ((value & 0x0000ff00) << 8) 1289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | ((value & 0x000000ff) << 24); 1290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = *((GLfloat*) &value); 1291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 1294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach MEMCPY( dst, src, elems_per_row*sizeof(GLfloat) ); 1295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst += elems_per_row; 1296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_3_3_2: 1299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach { 1300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte *ubsrc = (GLubyte *) src; 1301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0;j<width;j++) { 1302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte p = ubsrc[j]; 1303afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((p >> 5) ) * (1.0F / 7.0F); /* red */ 1304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((p >> 2) & 0x7) * (1.0F / 7.0F); /* green */ 1305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((p ) & 0x3) * (1.0F / 3.0F); /* blue */ 1306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_2_3_3_REV: 1310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach { 1311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte *ubsrc = (GLubyte *) src; 1312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0;j<width;j++) { 1313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte p = ubsrc[j]; 1314afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((p ) & 0x7) * (1.0F / 7.0F); /* red */ 1315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((p >> 3) & 0x7) * (1.0F / 7.0F); /* green */ 1316afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((p >> 6) ) * (1.0F / 3.0F); /* blue */ 1317afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1320afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5: 1321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach { 1322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLushort *ussrc = (GLushort *) src; 1323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0;j<width;j++) { 1324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLushort p = ussrc[j]; 1325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((p >> 11) ) * (1.0F / 31.0F); /* red */ 1326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((p >> 5) & 0x3f) * (1.0F / 63.0F); /* green */ 1327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((p ) & 0x1f) * (1.0F / 31.0F); /* blue */ 1328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5_REV: 1332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach { 1333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLushort *ussrc = (GLushort *) src; 1334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0;j<width;j++) { 1335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLushort p = ussrc[j]; 1336afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((p ) & 0x1f) * (1.0F / 31.0F); /* red */ 1337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((p >> 5) & 0x3f) * (1.0F / 63.0F); /* green */ 1338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((p >> 11) ) * (1.0F / 31.0F); /* blue */ 1339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4: 1343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach { 1344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLushort *ussrc = (GLushort *) src; 1345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0;j<width;j++) { 1346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLushort p = ussrc[j]; 1347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((p >> 12) ) * (1.0F / 15.0F); /* red */ 1348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((p >> 8) & 0xf) * (1.0F / 15.0F); /* green */ 1349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((p >> 4) & 0xf) * (1.0F / 15.0F); /* blue */ 1350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((p ) & 0xf) * (1.0F / 15.0F); /* alpha */ 1351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4_REV: 1355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach { 1356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLushort *ussrc = (GLushort *) src; 1357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0;j<width;j++) { 1358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLushort p = ussrc[j]; 1359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((p ) & 0xf) * (1.0F / 15.0F); /* red */ 1360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((p >> 4) & 0xf) * (1.0F / 15.0F); /* green */ 1361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((p >> 8) & 0xf) * (1.0F / 15.0F); /* blue */ 1362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((p >> 12) ) * (1.0F / 15.0F); /* alpha */ 1363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_5_5_1: 1367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach { 1368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLushort *ussrc = (GLushort *) src; 1369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0;j<width;j++) { 1370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLushort p = ussrc[j]; 1371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((p >> 11) ) * (1.0F / 31.0F); /* red */ 1372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((p >> 6) & 0x1f) * (1.0F / 31.0F); /* green */ 1373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((p >> 1) & 0x1f) * (1.0F / 31.0F); /* blue */ 1374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((p ) & 0x1) * (1.0F / 1.0F); /* alpha */ 1375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_1_5_5_5_REV: 1379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach { 1380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLushort *ussrc = (GLushort *) src; 1381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0;j<width;j++) { 1382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLushort p = ussrc[j]; 1383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((p ) & 0x1f) * (1.0F / 31.0F); /* red */ 1384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((p >> 5) & 0x1f) * (1.0F / 31.0F); /* green */ 1385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((p >> 10) & 0x1f) * (1.0F / 31.0F); /* blue */ 1386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((p >> 15) ) * (1.0F / 1.0F); /* alpha */ 1387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8: 1391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach { 1392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *uisrc = (GLuint *) src; 1393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0;j<width;j++) { 1394afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint p = uisrc[j]; 1395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 24) ); 1396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 16) & 0xff); 1397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 8) & 0xff); 1398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = UBYTE_COLOR_TO_FLOAT_COLOR((p ) & 0xff); 1399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8_REV: 1403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach { 1404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *uisrc = (GLuint *) src; 1405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0;j<width;j++) { 1406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint p = uisrc[j]; 1407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = UBYTE_COLOR_TO_FLOAT_COLOR((p ) & 0xff); 1408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 8) & 0xff); 1409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 16) & 0xff); 1410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 24) ); 1411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_10_10_10_2: 1415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach { 1416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *uisrc = (GLuint *) src; 1417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0;j<width;j++) { 1418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint p = uisrc[j]; 1419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((p >> 22) ) * (1.0F / 1023.0F); /* r */ 1420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F); /* g */ 1421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((p >> 2) & 0x3ff) * (1.0F / 1023.0F); /* b */ 1422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((p ) & 0x3 ) * (1.0F / 3.0F); /* a */ 1423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_2_10_10_10_REV: 1427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach { 1428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *uisrc = (GLuint *) src; 1429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (j=0;j<width;j++) { 1430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint p = uisrc[j]; 1431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((p ) & 0x3ff) * (1.0F / 1023.0F); /* r*/ 1432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F); /* g */ 1433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F); /* b */ 1434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *dst++ = ((p >> 30) ) * (1.0F / 3.0F); /* a */ 1435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 1439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach gl_problem(ctx, "unpack_float_image type" ); 1440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return image; 1441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_BGR) { 1446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* swap order of every float triplet from BGR to RGBA */ 1447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLfloat *buffer = (GLfloat *) image->Data; 1448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0; i<width*height*depth; i++) { 1449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLfloat b = buffer[i*3+0]; 1450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLfloat r = buffer[i*3+2]; 1451afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach buffer[i*3+0] = r; 1452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach buffer[i*3+2] = b; 1453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1455afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (format == GL_BGRA) { 1456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* swap order of every float quadruplet from BGRA to RGBA */ 1457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLfloat *buffer = (GLfloat *) image->Data; 1458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0; i<width*height*depth; i++) { 1459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLfloat b = buffer[i*4+0]; 1460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLfloat r = buffer[i*4+2]; 1461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach buffer[i*4+0] = r; 1462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach buffer[i*4+2] = b; 1463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (format == GL_ABGR_EXT) { 1466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* swap order of every float quadruplet from ABGR to RGBA */ 1467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLfloat *buffer = (GLfloat *) image->Data; 1468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0; i<width*height*depth; i++) { 1469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLfloat a = buffer[i*4+0]; 1470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLfloat b = buffer[i*4+1]; 1471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLfloat g = buffer[i*4+2]; 1472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLfloat r = buffer[i*4+3]; 1473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach buffer[i*4+0] = r; 1474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach buffer[i*4+1] = g; 1475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach buffer[i*4+2] = b; 1476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach buffer[i*4+3] = a; 1477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return image; 1481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 1482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 1486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Unpack a bitmap image, using current glPixelStore parameters, 1487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * making a new gl_image. 1488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 1489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachstruct gl_image *gl_unpack_bitmap( GLcontext *ctx, 1490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLsizei width, GLsizei height, 1491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach const GLubyte *bitmap, 1492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach const struct gl_pixelstore_attrib *packing ) 1493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 1494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return gl_unpack_image( ctx, width, height, 1495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GL_COLOR_INDEX, GL_BITMAP, bitmap, packing ); 1496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 1497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 1501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Unpack a 2-D image from user's buffer. Return pointer to new 1502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * gl_image struct. 1503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * 1504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Input: width, height - size in pixels 1505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * format - format of incoming pixel data 1506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * type - datatype of incoming pixel data 1507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * pixels - pointer to unpacked image in user buffer 1508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 1509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachstruct gl_image *gl_unpack_image( GLcontext *ctx, 1510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint width, GLint height, 1511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLenum format, GLenum type, 1512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach const GLvoid *pixels, 1513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach const struct gl_pixelstore_attrib *packing ) 1514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 1515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return gl_unpack_image3D( ctx, width, height, 1, 1516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach format, type, pixels, packing ); 1517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 1518afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1519afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 1522afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Unpack a 1, 2 or 3-D image from user-supplied address, returning a 1523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * pointer to a new gl_image struct. 1524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * This function is always called by a higher-level unpack function such 1525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * as gl_unpack_texsubimage() or gl_unpack_bitmap(). 1526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * 1527afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Input: width, height, depth - size in pixels 1528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * format - format of incoming pixel data 1529afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * type - datatype of incoming pixel data 1530afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * pixels - pointer to unpacked image. 1531afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 1532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachstruct gl_image *gl_unpack_image3D( GLcontext *ctx, 1533afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint width, GLint height, GLint depth, 1534afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLenum format, GLenum type, 1535afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach const GLvoid *pixels, 1536afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach const struct gl_pixelstore_attrib *packing) 1537afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 1538afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (width <= 0 || height <= 0 || depth <= 0) { 1539afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return alloc_error_image(width, height, depth, format, type); 1540afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1541afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1542afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (type==GL_BITMAP) { 1543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format != GL_COLOR_INDEX && format != GL_STENCIL_INDEX) { 1544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return alloc_error_image(width, height, depth, format, type); 1545afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1546afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 1547af19f37b797942e08c5847cfcc9be9792b2ebc32Brian Paul return unpack_bitmap( format, width, height, pixels, packing ); 1548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1550afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (format==GL_DEPTH_COMPONENT) { 1551afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* TODO: pack as GLdepth values (GLushort or GLuint) */ 1552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return unpack_depth_image( ctx, type, width, height, pixels, packing ); 1553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1554afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (format==GL_STENCIL_INDEX) { 1555afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* TODO: pack as GLstencil (GLubyte or GLushort) */ 1556afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return unpack_stencil_image( ctx, type, width, height, pixels, packing ); 1557afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1558afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (type==GL_UNSIGNED_BYTE) { 1559afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* upack, convert to GLubytes */ 1560af19f37b797942e08c5847cfcc9be9792b2ebc32Brian Paul return unpack_ubyte_image( width, height, depth, format, pixels, packing ); 1561afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1562afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 1563afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* upack, convert to floats */ 1564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return unpack_float_image( ctx, width, height, depth, 1565afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach format, type, pixels, packing ); 1566afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1567afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1568afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* never get here */ 1569afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /*return NULL;*/ 1570afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 1571afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1572afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1573afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 1574afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Apply pixel-transfer operations (scale, bias, mapping) to a single row 1575afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * of a gl_image. Put resulting color components into result array. 1576afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 1577afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachvoid gl_scale_bias_map_image_data( const GLcontext *ctx, 1578afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach const struct gl_image *image, 1579afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint row, GLubyte result[] ) 1580afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 1581afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint start, i; 1582afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1583afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach assert(ctx); 1584afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach assert(image); 1585afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach assert(result); 1586afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach assert(row >= 0); 1587afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1588afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach start = row * image->Width * image->Components; 1589afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1590afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0; i < image->Width; i++) { 1591afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint pos = start+i; 1592afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLfloat red, green, blue, alpha; 1593afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (image->Type == GL_UNSIGNED_BYTE) { 1594afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach const GLubyte *data = (GLubyte *) image->Data; 1595afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (image->Format) { 1596afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 1597afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach red = data[pos] * (1.0F/255.0F); 1598afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach green = 0; 1599afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach blue = 0; 1600afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach alpha = 0; 1601afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1602afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 1603afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach red = data[pos*3+0] * (1.0F/255.0F); 1604afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach green = data[pos*3+1] * (1.0F/255.0F); 1605afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach blue = data[pos*3+2] * (1.0F/255.0F); 1606afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach alpha = 0; 1607afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1608afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 1609afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach gl_problem(ctx, "bad image format in gl_scale...image_data"); 1610afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return; 1611afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1612afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1613afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (image->Type == GL_FLOAT) { 1614afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach const GLubyte *data = (GLubyte *) image->Data; 1615afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (image->Format) { 1616afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 1617afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach red = data[pos]; 1618afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach green = 0; 1619afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach blue = 0; 1620afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach alpha = 0; 1621afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1622afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 1623afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach red = data[pos*3+0]; 1624afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach green = data[pos*3+1]; 1625afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach blue = data[pos*3+2]; 1626afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach alpha = 0; 1627afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1628afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 1629afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach gl_problem(ctx, "bad image format in gl_scale...image_data"); 1630afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return; 1631afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1632afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1633afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 1634afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach gl_problem(ctx, "Bad image type in gl_scale_...image_data"); 1635afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return; 1636afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1637afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1638afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach assert(red >= 0.0 && red <= 1.0); 1639afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach assert(green >= 0.0 && green <= 1.0); 1640afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach assert(blue >= 0.0 && blue <= 1.0); 1641afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach assert(alpha >= 0.0 && alpha <= 1.0); 1642afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1643afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* 1644afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (scale or bias) { 1645afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1646afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1647afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1648afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (mapping) { 1649afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1650afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1651afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 1652afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1653afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach result[i*4+0] = (GLubyte) (red * 255.0); 1654afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach result[i*4+1] = (GLubyte) (green * 255.0); 1655afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach result[i*4+2] = (GLubyte) (blue * 255.0); 1656afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach result[i*4+3] = (GLubyte) (alpha * 255.0); 1657afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1658afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 1659afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1660afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1661afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1662afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 1663afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Pack the given RGBA span into client memory at 'dest' address 1664afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * in the given pixel format and type. 1665afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Optionally apply the enabled pixel transfer ops. 1666afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Pack into memory using the given packing params struct. 1667afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * This is used by glReadPixels and glGetTexImage?D() 1668afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Input: ctx - the context 1669afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * n - number of pixels in the span 1670afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * rgba - the pixels 1671afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * format - dest packing format 1672afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * type - dest packing datatype 1673afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * destination - destination packing address 1674afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * packing - pixel packing parameters 1675afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * applyTransferOps - apply scale/bias/lookup-table ops? 1676afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 1677afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachvoid gl_pack_rgba_span( const GLcontext *ctx, 1678afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint n, CONST GLubyte rgba[][4], 1679afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLenum format, GLenum type, GLvoid *destination, 1680afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach const struct gl_pixelstore_attrib *packing, 1681afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLboolean applyTransferOps ) 1682afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 1683afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* Test for optimized case first */ 1684afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (!ctx->Pixel.ScaleOrBiasRGBA && !ctx->Pixel.MapColorFlag && 1685afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach format == GL_RGBA && type == GL_UNSIGNED_BYTE) { 16863428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul /* common simple case */ 1687afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach MEMCPY( destination, rgba, n * 4 * sizeof(GLubyte) ); 1688afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 16893428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul else if (!ctx->Pixel.ScaleOrBiasRGBA && !ctx->Pixel.MapColorFlag && 16903428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul format == GL_RGB && type == GL_UNSIGNED_BYTE) { 16913428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul /* common simple case */ 16923428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul GLint i; 16933428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul GLubyte *dest = (GLubyte *) destination; 16943428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul for (i = 0; i < n; i++) { 16953428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul dest[i+0] = rgba[i][RCOMP]; 16963428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul dest[i+1] = rgba[i][GCOMP]; 16973428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul dest[i+2] = rgba[i][BCOMP]; 16983428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul dest += 3; 16993428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul } 17003428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul } 1701afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 1702afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLfloat red[MAX_WIDTH], green[MAX_WIDTH], blue[MAX_WIDTH]; 1703afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLfloat alpha[MAX_WIDTH], luminance[MAX_WIDTH]; 1704afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLfloat rscale = 1.0F / 255.0F; 1705afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLfloat gscale = 1.0F / 255.0F; 1706afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLfloat bscale = 1.0F / 255.0F; 1707afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLfloat ascale = 1.0F / 255.0F; 1708afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint i; 1709afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1710afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach assert( n < MAX_WIDTH ); 1711afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1712afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* convert color components to floating point */ 1713afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1714afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach red[i] = rgba[i][RCOMP] * rscale; 1715afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach green[i] = rgba[i][GCOMP] * gscale; 1716afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach blue[i] = rgba[i][BCOMP] * bscale; 1717afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach alpha[i] = rgba[i][ACOMP] * ascale; 1718afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1719afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1720afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* 1721afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Apply scale, bias and lookup-tables if enabled. 1722afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 1723afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (applyTransferOps) { 1724afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (ctx->Pixel.ScaleOrBiasRGBA) { 1725afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach gl_scale_and_bias_color( ctx, n, red, green, blue, alpha ); 1726afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1727afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (ctx->Pixel.MapColorFlag) { 1728afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach gl_map_color( ctx, n, red, green, blue, alpha ); 1729afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1730afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1731afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1732afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format==GL_LUMINANCE || format==GL_LUMINANCE_ALPHA) { 1733afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1734afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLfloat sum = red[i] + green[i] + blue[i]; 1735afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach luminance[i] = CLAMP( sum, 0.0F, 1.0F ); 1736afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1737afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1738afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1739afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* 1740afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Pack/store the pixels. Ugh! Lots of cases!!! 1741afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 1742afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 1743afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 1744afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach { 1745afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte *dst = (GLubyte *) destination; 1746afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (format) { 1747afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 1748afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1749afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_UBYTE(red[i]); 1750afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1751afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_GREEN: 1752afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1753afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_UBYTE(green[i]); 1754afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1755afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BLUE: 1756afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1757afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_UBYTE(blue[i]); 1758afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1759afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ALPHA: 1760afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1761afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_UBYTE(alpha[i]); 1762afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1763afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE: 1764afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1765afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_UBYTE(luminance[i]); 1766afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1767afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE_ALPHA: 1768afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1769afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*2+0] = FLOAT_TO_UBYTE(luminance[i]); 1770afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*2+1] = FLOAT_TO_UBYTE(alpha[i]); 1771afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1772afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1773afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 1774afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1775afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+0] = FLOAT_TO_UBYTE(red[i]); 1776afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+1] = FLOAT_TO_UBYTE(green[i]); 1777afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+2] = FLOAT_TO_UBYTE(blue[i]); 1778afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1779afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1780afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGBA: 1781afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1782afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = FLOAT_TO_UBYTE(red[i]); 1783afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = FLOAT_TO_UBYTE(green[i]); 1784afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = FLOAT_TO_UBYTE(blue[i]); 1785afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = FLOAT_TO_UBYTE(alpha[i]); 1786afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1787afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1788afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGR: 1789afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1790afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+0] = FLOAT_TO_UBYTE(blue[i]); 1791afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+1] = FLOAT_TO_UBYTE(green[i]); 1792afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+2] = FLOAT_TO_UBYTE(red[i]); 1793afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1794afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1795afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGRA: 1796afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1797afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = FLOAT_TO_UBYTE(blue[i]); 1798afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = FLOAT_TO_UBYTE(green[i]); 1799afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = FLOAT_TO_UBYTE(red[i]); 1800afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = FLOAT_TO_UBYTE(alpha[i]); 1801afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1802afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1803afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ABGR_EXT: 1804afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1805afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = FLOAT_TO_UBYTE(alpha[i]); 1806afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = FLOAT_TO_UBYTE(blue[i]); 1807afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = FLOAT_TO_UBYTE(green[i]); 1808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = FLOAT_TO_UBYTE(red[i]); 1809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1810afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1811afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 1812afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach gl_problem(ctx, "bad format in gl_pack_rgba_span\n"); 1813afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1814afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1815afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1816afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 1817afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach { 1818afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLbyte *dst = (GLbyte *) destination; 1819afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (format) { 1820afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 1821afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1822afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_BYTE(red[i]); 1823afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1824afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_GREEN: 1825afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1826afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_BYTE(green[i]); 1827afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1828afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BLUE: 1829afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1830afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_BYTE(blue[i]); 1831afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1832afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ALPHA: 1833afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1834afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_BYTE(alpha[i]); 1835afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1836afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE: 1837afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1838afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_BYTE(luminance[i]); 1839afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1840afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE_ALPHA: 1841afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1842afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*2+0] = FLOAT_TO_BYTE(luminance[i]); 1843afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*2+1] = FLOAT_TO_BYTE(alpha[i]); 1844afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1845afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1846afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 1847afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1848afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+0] = FLOAT_TO_BYTE(red[i]); 1849afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+1] = FLOAT_TO_BYTE(green[i]); 1850afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+2] = FLOAT_TO_BYTE(blue[i]); 1851afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1852afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1853afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGBA: 1854afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1855afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = FLOAT_TO_BYTE(red[i]); 1856afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = FLOAT_TO_BYTE(green[i]); 1857afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = FLOAT_TO_BYTE(blue[i]); 1858afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = FLOAT_TO_BYTE(alpha[i]); 1859afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1860afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1861afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGR: 1862afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1863afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+0] = FLOAT_TO_BYTE(blue[i]); 1864afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+1] = FLOAT_TO_BYTE(green[i]); 1865afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+2] = FLOAT_TO_BYTE(red[i]); 1866afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1867afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1868afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGRA: 1869afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1870afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = FLOAT_TO_BYTE(blue[i]); 1871afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = FLOAT_TO_BYTE(green[i]); 1872afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = FLOAT_TO_BYTE(red[i]); 1873afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = FLOAT_TO_BYTE(alpha[i]); 1874afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1875afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ABGR_EXT: 1876afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1877afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = FLOAT_TO_BYTE(alpha[i]); 1878afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = FLOAT_TO_BYTE(blue[i]); 1879afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = FLOAT_TO_BYTE(green[i]); 1880afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = FLOAT_TO_BYTE(red[i]); 1881afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1882afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1883afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 1884afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach gl_problem(ctx, "bad format in gl_pack_rgba_span\n"); 1885afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1886afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1887afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 1889afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach { 1890afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLushort *dst = (GLushort *) destination; 1891afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (format) { 1892afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 1893afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1894afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_USHORT(red[i]); 1895afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1896afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_GREEN: 1897afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1898afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_USHORT(green[i]); 1899afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1900afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BLUE: 1901afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1902afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_USHORT(blue[i]); 1903afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1904afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ALPHA: 1905afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1906afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_USHORT(alpha[i]); 1907afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1908afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE: 1909afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1910afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_USHORT(luminance[i]); 1911afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1912afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE_ALPHA: 1913afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1914afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*2+0] = FLOAT_TO_USHORT(luminance[i]); 1915afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*2+1] = FLOAT_TO_USHORT(alpha[i]); 1916afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1917afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1918afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 1919afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1920afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+0] = FLOAT_TO_USHORT(red[i]); 1921afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+1] = FLOAT_TO_USHORT(green[i]); 1922afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+2] = FLOAT_TO_USHORT(blue[i]); 1923afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1924afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1925afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGBA: 1926afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1927afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = FLOAT_TO_USHORT(red[i]); 1928afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = FLOAT_TO_USHORT(green[i]); 1929afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = FLOAT_TO_USHORT(blue[i]); 1930afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = FLOAT_TO_USHORT(alpha[i]); 1931afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1932afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1933afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGR: 1934afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1935afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+0] = FLOAT_TO_USHORT(blue[i]); 1936afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+1] = FLOAT_TO_USHORT(green[i]); 1937afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+2] = FLOAT_TO_USHORT(red[i]); 1938afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1939afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1940afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGRA: 1941afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1942afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = FLOAT_TO_USHORT(blue[i]); 1943afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = FLOAT_TO_USHORT(green[i]); 1944afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = FLOAT_TO_USHORT(red[i]); 1945afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = FLOAT_TO_USHORT(alpha[i]); 1946afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1947afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1948afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ABGR_EXT: 1949afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1950afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = FLOAT_TO_USHORT(alpha[i]); 1951afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = FLOAT_TO_USHORT(blue[i]); 1952afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = FLOAT_TO_USHORT(green[i]); 1953afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = FLOAT_TO_USHORT(red[i]); 1954afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1955afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1956afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 1957afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach gl_problem(ctx, "bad format in gl_pack_rgba_span\n"); 1958afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1959afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->SwapBytes) { 1960afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach gl_swap2( (GLushort *) dst, n ); 1961afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1962afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1963afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1964afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 1965afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach { 1966afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLshort *dst = (GLshort *) destination; 1967afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (format) { 1968afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 1969afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1970afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_SHORT(red[i]); 1971afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1972afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_GREEN: 1973afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1974afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_SHORT(green[i]); 1975afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1976afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BLUE: 1977afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1978afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_SHORT(blue[i]); 1979afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1980afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ALPHA: 1981afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1982afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_SHORT(alpha[i]); 1983afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1984afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE: 1985afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 1986afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_SHORT(luminance[i]); 1987afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1988afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE_ALPHA: 1989afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1990afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*2+0] = FLOAT_TO_SHORT(luminance[i]); 1991afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*2+1] = FLOAT_TO_SHORT(alpha[i]); 1992afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1993afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 1994afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 1995afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 1996afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+0] = FLOAT_TO_SHORT(red[i]); 1997afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+1] = FLOAT_TO_SHORT(green[i]); 1998afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+2] = FLOAT_TO_SHORT(blue[i]); 1999afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2000afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2001afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGBA: 2002afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2003afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = FLOAT_TO_SHORT(red[i]); 2004afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = FLOAT_TO_SHORT(green[i]); 2005afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = FLOAT_TO_SHORT(blue[i]); 2006afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = FLOAT_TO_SHORT(alpha[i]); 2007afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2008afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2009afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGR: 2010afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2011afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+0] = FLOAT_TO_SHORT(blue[i]); 2012afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+1] = FLOAT_TO_SHORT(green[i]); 2013afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+2] = FLOAT_TO_SHORT(red[i]); 2014afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2015afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2016afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGRA: 2017afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2018afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = FLOAT_TO_SHORT(blue[i]); 2019afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = FLOAT_TO_SHORT(green[i]); 2020afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = FLOAT_TO_SHORT(red[i]); 2021afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = FLOAT_TO_SHORT(alpha[i]); 2022afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2023afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ABGR_EXT: 2024afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2025afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = FLOAT_TO_SHORT(alpha[i]); 2026afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = FLOAT_TO_SHORT(blue[i]); 2027afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = FLOAT_TO_SHORT(green[i]); 2028afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = FLOAT_TO_SHORT(red[i]); 2029afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2030afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2031afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 2032afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach gl_problem(ctx, "bad format in gl_pack_rgba_span\n"); 2033afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2034afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->SwapBytes) { 2035afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach gl_swap2( (GLushort *) dst, n ); 2036afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2037afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2038afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2039afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 2040afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach { 2041afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 2042afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (format) { 2043afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 2044afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 2045afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_UINT(red[i]); 2046afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2047afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_GREEN: 2048afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 2049afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_UINT(green[i]); 2050afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2051afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BLUE: 2052afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 2053afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_UINT(blue[i]); 2054afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2055afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ALPHA: 2056afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 2057afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_UINT(alpha[i]); 2058afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2059afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE: 2060afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 2061afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_UINT(luminance[i]); 2062afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2063afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE_ALPHA: 2064afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2065afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*2+0] = FLOAT_TO_UINT(luminance[i]); 2066afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*2+1] = FLOAT_TO_UINT(alpha[i]); 2067afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2068afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2069afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 2070afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2071afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+0] = FLOAT_TO_UINT(red[i]); 2072afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+1] = FLOAT_TO_UINT(green[i]); 2073afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+2] = FLOAT_TO_UINT(blue[i]); 2074afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2075afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2076afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGBA: 2077afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2078afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = FLOAT_TO_UINT(red[i]); 2079afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = FLOAT_TO_UINT(green[i]); 2080afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = FLOAT_TO_UINT(blue[i]); 2081afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = FLOAT_TO_UINT(alpha[i]); 2082afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2083afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2084afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGR: 2085afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2086afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+0] = FLOAT_TO_UINT(blue[i]); 2087afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+1] = FLOAT_TO_UINT(green[i]); 2088afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+2] = FLOAT_TO_UINT(red[i]); 2089afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2090afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2091afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGRA: 2092afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2093afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = FLOAT_TO_UINT(blue[i]); 2094afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = FLOAT_TO_UINT(green[i]); 2095afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = FLOAT_TO_UINT(red[i]); 2096afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = FLOAT_TO_UINT(alpha[i]); 2097afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2098afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2099afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ABGR_EXT: 2100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = FLOAT_TO_UINT(alpha[i]); 2102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = FLOAT_TO_UINT(blue[i]); 2103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = FLOAT_TO_UINT(green[i]); 2104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = FLOAT_TO_UINT(red[i]); 2105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 2108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach gl_problem(ctx, "bad format in gl_pack_rgba_span\n"); 2109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->SwapBytes) { 2111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach gl_swap4( (GLuint *) dst, n ); 2112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 2116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach { 2117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint *dst = (GLint *) destination; 2118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (format) { 2119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 2120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 2121afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_INT(red[i]); 2122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_GREEN: 2124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 2125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_INT(green[i]); 2126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BLUE: 2128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 2129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_INT(blue[i]); 2130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ALPHA: 2132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 2133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_INT(alpha[i]); 2134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE: 2136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 2137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = FLOAT_TO_INT(luminance[i]); 2138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE_ALPHA: 2140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*2+0] = FLOAT_TO_INT(luminance[i]); 2142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*2+1] = FLOAT_TO_INT(alpha[i]); 2143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 2146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+0] = FLOAT_TO_INT(red[i]); 2148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+1] = FLOAT_TO_INT(green[i]); 2149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+2] = FLOAT_TO_INT(blue[i]); 2150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGBA: 2153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = FLOAT_TO_INT(red[i]); 2155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = FLOAT_TO_INT(green[i]); 2156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = FLOAT_TO_INT(blue[i]); 2157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = FLOAT_TO_INT(alpha[i]); 2158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGR: 2161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+0] = FLOAT_TO_INT(blue[i]); 2163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+1] = FLOAT_TO_INT(green[i]); 2164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+2] = FLOAT_TO_INT(red[i]); 2165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGRA: 2168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = FLOAT_TO_INT(blue[i]); 2170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = FLOAT_TO_INT(green[i]); 2171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = FLOAT_TO_INT(red[i]); 2172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = FLOAT_TO_INT(alpha[i]); 2173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ABGR_EXT: 2176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = FLOAT_TO_INT(alpha[i]); 2178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = FLOAT_TO_INT(blue[i]); 2179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = FLOAT_TO_INT(green[i]); 2180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = FLOAT_TO_INT(red[i]); 2181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 2184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach gl_problem(ctx, "bad format in gl_pack_rgba_span\n"); 2185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->SwapBytes) { 2187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach gl_swap4( (GLuint *) dst, n ); 2188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 2192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach { 2193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLfloat *dst = (GLfloat *) destination; 2194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (format) { 2195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 2196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 2197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = red[i]; 2198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_GREEN: 2200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 2201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = green[i]; 2202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BLUE: 2204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 2205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = blue[i]; 2206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ALPHA: 2208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 2209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = alpha[i]; 2210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE: 2212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) 2213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = luminance[i]; 2214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE_ALPHA: 2216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*2+0] = luminance[i]; 2218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*2+1] = alpha[i]; 2219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 2222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+0] = red[i]; 2224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+1] = green[i]; 2225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+2] = blue[i]; 2226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGBA: 2229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = red[i]; 2231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = green[i]; 2232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = blue[i]; 2233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = alpha[i]; 2234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGR: 2237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+0] = blue[i]; 2239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+1] = green[i]; 2240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*3+2] = red[i]; 2241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGRA: 2244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = blue[i]; 2246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = green[i]; 2247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = red[i]; 2248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = alpha[i]; 2249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ABGR_EXT: 2252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+0] = alpha[i]; 2254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+1] = blue[i]; 2255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+2] = green[i]; 2256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i*4+3] = red[i]; 2257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 2260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach gl_problem(ctx, "bad format in gl_pack_rgba_span\n"); 2261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->SwapBytes) { 2263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach gl_swap4( (GLuint *) dst, n ); 2264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_3_3_2: 2268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB) { 2269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte *dst = (GLubyte *) destination; 2270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLint) (red[i] * 7.0F)) << 5) 2272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (green[i] * 7.0F)) << 2) 2273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (blue[i] * 3.0F)) ); 2274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_2_3_3_REV: 2278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB) { 2279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte *dst = (GLubyte *) destination; 2280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLint) (red[i] * 7.0F)) ) 2282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (green[i] * 7.0F)) << 3) 2283afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (blue[i] * 3.0F)) << 5); 2284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5: 2288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB) { 2289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLushort *dst = (GLushort *) destination; 2290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLint) (red[i] * 31.0F)) << 11) 2292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (green[i] * 63.0F)) << 5) 2293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (blue[i] * 31.0F)) ); 2294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5_REV: 2298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB) { 2299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLushort *dst = (GLushort *) destination; 2300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLint) (red[i] * 31.0F)) ) 2302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (green[i] * 63.0F)) << 5) 2303afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (blue[i] * 31.0F)) << 11); 2304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4: 2308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB) { 2309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLushort *dst = (GLushort *) destination; 2310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLint) (red[i] * 15.0F)) << 12) 2312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (green[i] * 15.0F)) << 8) 2313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (blue[i] * 15.0F)) << 4) 2314afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (alpha[i] * 15.0F)) ); 2315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2316afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2317afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4_REV: 2319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB) { 2320afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLushort *dst = (GLushort *) destination; 2321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLint) (red[i] * 15.0F)) ) 2323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (green[i] * 15.0F)) << 4) 2324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (blue[i] * 15.0F)) << 8) 2325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (alpha[i] * 15.0F)) << 12); 2326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_5_5_1: 2330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB) { 2331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLushort *dst = (GLushort *) destination; 2332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLint) (red[i] * 31.0F)) << 11) 2334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (green[i] * 31.0F)) << 6) 2335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (blue[i] * 31.0F)) << 1) 2336afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (alpha[i] * 1.0F)) ); 2337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_1_5_5_5_REV: 2341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGB) { 2342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLushort *dst = (GLushort *) destination; 2343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLint) (red[i] * 31.0F)) ) 2345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (green[i] * 31.0F)) << 5) 2346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (blue[i] * 31.0F)) << 10) 2347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLint) (alpha[i] * 1.0F)) << 15); 2348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8: 2352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGBA) { 2353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 2354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLuint) (red[i] * 255.0F)) << 24) 2356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (green[i] * 255.0F)) << 16) 2357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (blue[i] * 255.0F)) << 8) 2358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (alpha[i] * 255.0F)) ); 2359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (format == GL_BGRA) { 2362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 2363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLuint) (blue[i] * 255.0F)) << 24) 2365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (green[i] * 255.0F)) << 16) 2366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (red[i] * 255.0F)) << 8) 2367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (alpha[i] * 255.0F)) ); 2368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (format == GL_ABGR_EXT) { 2371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 2372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLuint) (alpha[i] * 255.0F)) << 24) 2374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (blue[i] * 255.0F)) << 16) 2375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (green[i] * 255.0F)) << 8) 2376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (red[i] * 255.0F)) ); 2377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8_REV: 2381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGBA) { 2382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 2383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLuint) (red[i] * 255.0F)) ) 2385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (green[i] * 255.0F)) << 8) 2386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (blue[i] * 255.0F)) << 16) 2387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (alpha[i] * 255.0F)) << 24); 2388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (format == GL_BGRA) { 2391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 2392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLuint) (blue[i] * 255.0F)) ) 2394afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (green[i] * 255.0F)) << 8) 2395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (red[i] * 255.0F)) << 16) 2396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (alpha[i] * 255.0F)) << 24); 2397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (format == GL_ABGR_EXT) { 2400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 2401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLuint) (alpha[i] * 255.0F)) ) 2403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (blue[i] * 255.0F)) << 8) 2404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (green[i] * 255.0F)) << 16) 2405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (red[i] * 255.0F)) << 24); 2406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_10_10_10_2: 2410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGBA) { 2411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 2412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLuint) (red[i] * 1023.0F)) << 22) 2414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (green[i] * 1023.0F)) << 12) 2415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (blue[i] * 1023.0F)) << 2) 2416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (alpha[i] * 3.0F)) ); 2417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (format == GL_BGRA) { 2420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 2421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLuint) (blue[i] * 1023.0F)) << 22) 2423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (green[i] * 1023.0F)) << 12) 2424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (red[i] * 1023.0F)) << 2) 2425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (alpha[i] * 3.0F)) ); 2426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (format == GL_ABGR_EXT) { 2429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 2430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLuint) (alpha[i] * 1023.0F)) << 22) 2432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (blue[i] * 1023.0F)) << 12) 2433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (green[i] * 1023.0F)) << 2) 2434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (red[i] * 3.0F)) ); 2435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_2_10_10_10_REV: 2439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (format == GL_RGBA) { 2440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 2441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLuint) (red[i] * 1023.0F)) ) 2443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (green[i] * 1023.0F)) << 10) 2444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (blue[i] * 1023.0F)) << 20) 2445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (alpha[i] * 3.0F)) << 30); 2446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (format == GL_BGRA) { 2449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 2450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2451afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLuint) (blue[i] * 1023.0F)) ) 2452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (green[i] * 1023.0F)) << 10) 2453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (red[i] * 1023.0F)) << 20) 2454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (alpha[i] * 3.0F)) << 30); 2455afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else if (format == GL_ABGR_EXT) { 2458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLuint *dst = (GLuint *) destination; 2459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach for (i=0;i<n;i++) { 2460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach dst[i] = (((GLuint) (alpha[i] * 1023.0F)) ) 2461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (blue[i] * 1023.0F)) << 10) 2462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (green[i] * 1023.0F)) << 20) 2463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | (((GLuint) (red[i] * 3.0F)) << 30); 2464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach break; 2467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 2468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach gl_problem( ctx, "bad type in gl_pack_rgba_span" ); 2469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 2471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 2472