image.c revision 1614de4045c36ab6ec060e3bd0d1f3394d05b91e
1afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Mesa 3-D graphics library 3995456f9305593005f8466520314ee087f3d422aBrian Paul * Version: 7.5 45e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 518d2822905ac3187318bd662f80c2836bdfa7c1fBrian Paul * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 6995456f9305593005f8466520314ee087f3d422aBrian Paul * Copyright (C) 2009 VMware, Inc. All Rights Reserved. 75e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 8afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Permission is hereby granted, free of charge, to any person obtaining a 9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * copy of this software and associated documentation files (the "Software"), 10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * to deal in the Software without restriction, including without limitation 11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * the rights to use, copy, modify, merge, publish, distribute, sublicense, 12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * and/or sell copies of the Software, and to permit persons to whom the 13afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Software is furnished to do so, subject to the following conditions: 145e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 15afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * The above copyright notice and this permission notice shall be included 16afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * in all copies or substantial portions of the Software. 175e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 18afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 266dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell 27f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 28f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \file image.c 29f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Image handling. 30f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 31f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 32f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 33fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul#include "glheader.h" 34c893a015d8a50a38cd3f727d99835e7e7e2ccea9Brian Paul#include "colormac.h" 35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "image.h" 363c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul#include "imports.h" 37afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "macros.h" 38db61b9ce39bccc43140357652ceb78baaf2aea44Vinson Lee#include "mfeatures.h" 390117da40cd7edd3d165bb28569c289b37eca12b9Vinson Lee#include "mtypes.h" 40afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 41afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 4227558a160a9fe91745728d7626995cd88f8fe339Brian Paul 436dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 4453f83b435ce9a94092503712e3d4e16d4c942752Xiang, Haihao * \return GL_TRUE if type is packed pixel type, GL_FALSE otherwise. 4553f83b435ce9a94092503712e3d4e16d4c942752Xiang, Haihao */ 46f1f022dbb103947b0edf5ae984fcff00f6a8e539Xiang, HaihaoGLboolean 4753f83b435ce9a94092503712e3d4e16d4c942752Xiang, Haihao_mesa_type_is_packed(GLenum type) 48f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul{ 49f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul switch (type) { 50f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul case GL_UNSIGNED_BYTE_3_3_2: 51f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul case GL_UNSIGNED_BYTE_2_3_3_REV: 524d6994e40ebccf9428fc757d845e25c0e0c12cefMarek Olšák case MESA_UNSIGNED_BYTE_4_4: 53f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul case GL_UNSIGNED_SHORT_5_6_5: 54f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul case GL_UNSIGNED_SHORT_5_6_5_REV: 55f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul case GL_UNSIGNED_SHORT_4_4_4_4: 56f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul case GL_UNSIGNED_SHORT_4_4_4_4_REV: 57f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul case GL_UNSIGNED_SHORT_5_5_5_1: 58f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul case GL_UNSIGNED_SHORT_1_5_5_5_REV: 59f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul case GL_UNSIGNED_INT_8_8_8_8: 60f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul case GL_UNSIGNED_INT_8_8_8_8_REV: 61f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul case GL_UNSIGNED_INT_10_10_10_2: 62f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul case GL_UNSIGNED_INT_2_10_10_10_REV: 63f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul case GL_UNSIGNED_SHORT_8_8_MESA: 64f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul case GL_UNSIGNED_SHORT_8_8_REV_MESA: 65f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul case GL_UNSIGNED_INT_24_8_EXT: 669d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák case GL_UNSIGNED_INT_5_9_9_9_REV: 67631d23daa91c569bf268a2191bd466df73a64263Marek Olšák case GL_UNSIGNED_INT_10F_11F_11F_REV: 681165280cbd37dee1e499358633478ab869de21dfMarek Olšák case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 69f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul return GL_TRUE; 70f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul } 71f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul 72f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul return GL_FALSE; 7353f83b435ce9a94092503712e3d4e16d4c942752Xiang, Haihao} 7453f83b435ce9a94092503712e3d4e16d4c942752Xiang, Haihao 75afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 76afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 776dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 78afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the order of the 2 bytes in each word in the given array. 796dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 806dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param p array. 816dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param n number of words. 82afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 83b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid 84b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_swap2( GLushort *p, GLuint n ) 85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 86f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul GLuint i; 87f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul for (i = 0; i < n; i++) { 88afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach p[i] = (p[i] >> 8) | ((p[i] << 8) & 0xff00); 89afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 90afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 91afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 92afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 93afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 94afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* 95afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the order of the 4 bytes in each word in the given array. 96afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 97b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid 98b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_swap4( GLuint *p, GLuint n ) 99afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 100f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul GLuint i, a, b; 101f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul for (i = 0; i < n; i++) { 102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach b = p[i]; 103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach a = (b >> 24) 104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | ((b >> 8) & 0xff00) 105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | ((b << 8) & 0xff0000) 106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach | ((b << 24) & 0xff000000); 107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach p[i] = a; 108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1126dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 1136dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Get the size of a GL data type. 1146dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 1156dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param type GL data type. 1166dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 1176dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return the size, in bytes, of the given data type, 0 if a GL_BITMAP, or -1 1186dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * if an invalid type enum. 119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 12085bc17495b5fe263f288904aa97dcf16d7eb6910Brian PaulGLint 12185bc17495b5fe263f288904aa97dcf16d7eb6910Brian Paul_mesa_sizeof_type( GLenum type ) 122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BITMAP: 125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 0; 126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLbyte); 130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLushort); 132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLint); 138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLfloat); 14087ba2285fe11dfe068798e5f8ea8e089a5d8b28bBrian Paul case GL_DOUBLE: 14187ba2285fe11dfe068798e5f8ea8e089a5d8b28bBrian Paul return sizeof(GLdouble); 142f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_HALF_FLOAT_ARB: 143f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return sizeof(GLhalfARB); 1442d270ac0904a1e3779906f7dbf493f31e5b3823bChia-I Wu case GL_FIXED: 1452d270ac0904a1e3779906f7dbf493f31e5b3823bChia-I Wu return sizeof(GLfixed); 146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1526dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 1536dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Same as _mesa_sizeof_type() but also accepting the packed pixel 1546dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * format data types. 155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 15685bc17495b5fe263f288904aa97dcf16d7eb6910Brian PaulGLint 15785bc17495b5fe263f288904aa97dcf16d7eb6910Brian Paul_mesa_sizeof_packed_type( GLenum type ) 158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BITMAP: 161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 0; 162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLbyte); 166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLushort); 168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLshort); 170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLint); 174f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_HALF_FLOAT_ARB: 175f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return sizeof(GLhalfARB); 176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLfloat); 178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_3_3_2: 179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_2_3_3_REV: 1804d6994e40ebccf9428fc757d845e25c0e0c12cefMarek Olšák case MESA_UNSIGNED_BYTE_4_4: 1814d6994e40ebccf9428fc757d845e25c0e0c12cefMarek Olšák return sizeof(GLubyte); 182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5: 183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5_REV: 184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4: 185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4_REV: 186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_5_5_1: 187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_1_5_5_5_REV: 18883863d468e2375696478e3ec83c42aaab9fbc19cBrian Paul case GL_UNSIGNED_SHORT_8_8_MESA: 18983863d468e2375696478e3ec83c42aaab9fbc19cBrian Paul case GL_UNSIGNED_SHORT_8_8_REV_MESA: 190c450d57991628318696ee7a2bd052f91f480cda3Brian Paul return sizeof(GLushort); 191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8: 192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8_REV: 193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_10_10_10_2: 194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_2_10_10_10_REV: 1951ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul case GL_UNSIGNED_INT_24_8_EXT: 1969d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák case GL_UNSIGNED_INT_5_9_9_9_REV: 197631d23daa91c569bf268a2191bd466df73a64263Marek Olšák case GL_UNSIGNED_INT_10F_11F_11F_REV: 198631d23daa91c569bf268a2191bd466df73a64263Marek Olšák return sizeof(GLuint); 1991165280cbd37dee1e499358633478ab869de21dfMarek Olšák case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 2001165280cbd37dee1e499358633478ab869de21dfMarek Olšák return 8; 201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 2076dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 2086dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Get the number of components in a pixel format. 2096dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 2106dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param format pixel format. 2116dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 2126dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return the number of components in the given format, or -1 if a bad format. 213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 21485bc17495b5fe263f288904aa97dcf16d7eb6910Brian PaulGLint 21585bc17495b5fe263f288904aa97dcf16d7eb6910Brian Paul_mesa_components_in_format( GLenum format ) 216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (format) { 218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX: 219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_STENCIL_INDEX: 220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_DEPTH_COMPONENT: 221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 222abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_RED_INTEGER_EXT: 223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_GREEN: 224abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_GREEN_INTEGER_EXT: 225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BLUE: 226abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_BLUE_INTEGER_EXT: 227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ALPHA: 228abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_ALPHA_INTEGER_EXT: 229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE: 230abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_LUMINANCE_INTEGER_EXT: 231070b2644c6d3b0b4c6da64addd85245d730b6240Brian Paul case GL_INTENSITY: 232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 1; 23383863d468e2375696478e3ec83c42aaab9fbc19cBrian Paul 234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE_ALPHA: 235abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_LUMINANCE_ALPHA_INTEGER_EXT: 2365d1387b2da3626326410804026f8b92f1a121fdcIan Romanick case GL_RG: 23783863d468e2375696478e3ec83c42aaab9fbc19cBrian Paul case GL_YCBCR_MESA: 23883863d468e2375696478e3ec83c42aaab9fbc19cBrian Paul case GL_DEPTH_STENCIL_EXT: 23983863d468e2375696478e3ec83c42aaab9fbc19cBrian Paul case GL_DUDV_ATI: 24083863d468e2375696478e3ec83c42aaab9fbc19cBrian Paul case GL_DU8DV8_ATI: 241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 2; 24283863d468e2375696478e3ec83c42aaab9fbc19cBrian Paul 243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 24483863d468e2375696478e3ec83c42aaab9fbc19cBrian Paul case GL_BGR: 245abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_RGB_INTEGER_EXT: 24647e2e367170edec022481f1487cd980e00ef3203Dave Airlie case GL_BGR_INTEGER_EXT: 247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 3; 24883863d468e2375696478e3ec83c42aaab9fbc19cBrian Paul 249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGBA: 250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGRA: 251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ABGR_EXT: 25283863d468e2375696478e3ec83c42aaab9fbc19cBrian Paul case GL_RGBA_INTEGER_EXT: 25347e2e367170edec022481f1487cd980e00ef3203Dave Airlie case GL_BGRA_INTEGER_EXT: 254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 4; 25583863d468e2375696478e3ec83c42aaab9fbc19cBrian Paul 256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 2626dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 2636dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Get the bytes per pixel of pixel format type pair. 2646dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 2656dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param format pixel format. 2666dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param type pixel type. 2676dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 2686dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return bytes per pixel, or -1 if a bad format or type was given. 269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 27085bc17495b5fe263f288904aa97dcf16d7eb6910Brian PaulGLint 27185bc17495b5fe263f288904aa97dcf16d7eb6910Brian Paul_mesa_bytes_per_pixel( GLenum format, GLenum type ) 272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 273b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GLint comps = _mesa_components_in_format( format ); 274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (comps < 0) 275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BITMAP: 279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return 0; /* special case */ 280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return comps * sizeof(GLubyte); 283afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return comps * sizeof(GLshort); 286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return comps * sizeof(GLint); 289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return comps * sizeof(GLfloat); 291f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_HALF_FLOAT_ARB: 292f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return comps * sizeof(GLhalfARB); 293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_3_3_2: 294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE_2_3_3_REV: 2950a3566cec02f4fc3fef5a29b31ca990d2c08e293Brian Paul if (format == GL_RGB || format == GL_BGR || 2960a3566cec02f4fc3fef5a29b31ca990d2c08e293Brian Paul format == GL_RGB_INTEGER_EXT || format == GL_BGR_INTEGER_EXT) 297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLubyte); 298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else 299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; /* error */ 300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5: 301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_6_5_REV: 3020a3566cec02f4fc3fef5a29b31ca990d2c08e293Brian Paul if (format == GL_RGB || format == GL_BGR || 3030a3566cec02f4fc3fef5a29b31ca990d2c08e293Brian Paul format == GL_RGB_INTEGER_EXT || format == GL_BGR_INTEGER_EXT) 304c450d57991628318696ee7a2bd052f91f480cda3Brian Paul return sizeof(GLushort); 305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else 306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; /* error */ 307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4: 308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4_REV: 309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_5_5_1: 310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_1_5_5_5_REV: 3110a3566cec02f4fc3fef5a29b31ca990d2c08e293Brian Paul if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT || 3120a3566cec02f4fc3fef5a29b31ca990d2c08e293Brian Paul format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT) 313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLushort); 314afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else 315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 316afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8: 317afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8_REV: 318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_10_10_10_2: 319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_2_10_10_10_REV: 3200a3566cec02f4fc3fef5a29b31ca990d2c08e293Brian Paul if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT || 3210a3566cec02f4fc3fef5a29b31ca990d2c08e293Brian Paul format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT) 322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return sizeof(GLuint); 323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else 324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 325c5b995066020191982b2315fc45d05e068eee761Brian Paul case GL_UNSIGNED_SHORT_8_8_MESA: 326c5b995066020191982b2315fc45d05e068eee761Brian Paul case GL_UNSIGNED_SHORT_8_8_REV_MESA: 327c5b995066020191982b2315fc45d05e068eee761Brian Paul if (format == GL_YCBCR_MESA) 328c5b995066020191982b2315fc45d05e068eee761Brian Paul return sizeof(GLushort); 329c5b995066020191982b2315fc45d05e068eee761Brian Paul else 330c5b995066020191982b2315fc45d05e068eee761Brian Paul return -1; 3311ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul case GL_UNSIGNED_INT_24_8_EXT: 3321ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul if (format == GL_DEPTH_STENCIL_EXT) 3331ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul return sizeof(GLuint); 3341ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul else 3351ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul return -1; 3369d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák case GL_UNSIGNED_INT_5_9_9_9_REV: 3379d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák if (format == GL_RGB) 3389d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák return sizeof(GLuint); 3399d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák else 3409d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák return -1; 341631d23daa91c569bf268a2191bd466df73a64263Marek Olšák case GL_UNSIGNED_INT_10F_11F_11F_REV: 342631d23daa91c569bf268a2191bd466df73a64263Marek Olšák if (format == GL_RGB) 343631d23daa91c569bf268a2191bd466df73a64263Marek Olšák return sizeof(GLuint); 344631d23daa91c569bf268a2191bd466df73a64263Marek Olšák else 345631d23daa91c569bf268a2191bd466df73a64263Marek Olšák return -1; 3461165280cbd37dee1e499358633478ab869de21dfMarek Olšák case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 3471165280cbd37dee1e499358633478ab869de21dfMarek Olšák if (format == GL_DEPTH_STENCIL) 3481165280cbd37dee1e499358633478ab869de21dfMarek Olšák return 8; 3491165280cbd37dee1e499358633478ab869de21dfMarek Olšák else 3501165280cbd37dee1e499358633478ab869de21dfMarek Olšák return -1; 351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return -1; 353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 3576dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 3586dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Test for a legal pixel format and type. 3596dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 3606dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param format pixel format. 3616dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param type pixel type. 3626dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 3636dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return GL_TRUE if the given pixel format and type are legal, or GL_FALSE 3646dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * otherwise. 365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 366b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLboolean 3677faf521fad970d6f6706fc9d3c3f4644f2e158acBrian Paul_mesa_is_legal_format_and_type(const struct gl_context *ctx, 3687faf521fad970d6f6706fc9d3c3f4644f2e158acBrian Paul GLenum format, GLenum type) 369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (format) { 371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_COLOR_INDEX: 372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_STENCIL_INDEX: 373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BITMAP: 375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_TRUE; 383f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_HALF_FLOAT_ARB: 384f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return ctx->Extensions.ARB_half_float_pixel; 385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RED: 389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_GREEN: 390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BLUE: 391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ALPHA: 3925b05a187dc34fa3ab6b5ab6bc1a6e98df80a2553Brian Paul#if 0 /* not legal! see table 3.6 of the 1.5 spec */ 3932a1f50aee4f30dbd0c55d8f0b7185b690c841051Brian Paul case GL_INTENSITY: 3945b05a187dc34fa3ab6b5ab6bc1a6e98df80a2553Brian Paul#endif 395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE: 396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_LUMINANCE_ALPHA: 397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_DEPTH_COMPONENT: 398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_TRUE; 407f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_HALF_FLOAT_ARB: 408f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return ctx->Extensions.ARB_half_float_pixel; 409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 4125d1387b2da3626326410804026f8b92f1a121fdcIan Romanick case GL_RG: 4135d1387b2da3626326410804026f8b92f1a121fdcIan Romanick if (!ctx->Extensions.ARB_texture_rg) 4145d1387b2da3626326410804026f8b92f1a121fdcIan Romanick return GL_FALSE; 4155d1387b2da3626326410804026f8b92f1a121fdcIan Romanick 4165d1387b2da3626326410804026f8b92f1a121fdcIan Romanick switch (type) { 4175d1387b2da3626326410804026f8b92f1a121fdcIan Romanick case GL_BYTE: 4185d1387b2da3626326410804026f8b92f1a121fdcIan Romanick case GL_UNSIGNED_BYTE: 4195d1387b2da3626326410804026f8b92f1a121fdcIan Romanick case GL_SHORT: 4205d1387b2da3626326410804026f8b92f1a121fdcIan Romanick case GL_UNSIGNED_SHORT: 4215d1387b2da3626326410804026f8b92f1a121fdcIan Romanick case GL_INT: 4225d1387b2da3626326410804026f8b92f1a121fdcIan Romanick case GL_UNSIGNED_INT: 4235d1387b2da3626326410804026f8b92f1a121fdcIan Romanick case GL_FLOAT: 4245d1387b2da3626326410804026f8b92f1a121fdcIan Romanick return GL_TRUE; 4255d1387b2da3626326410804026f8b92f1a121fdcIan Romanick case GL_HALF_FLOAT_ARB: 4265d1387b2da3626326410804026f8b92f1a121fdcIan Romanick return ctx->Extensions.ARB_half_float_pixel; 4275d1387b2da3626326410804026f8b92f1a121fdcIan Romanick default: 4285d1387b2da3626326410804026f8b92f1a121fdcIan Romanick return GL_FALSE; 4295d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGB: 431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 43931a66ada72e5d9eb728f5149b72121bb04776016Brian Paul case GL_UNSIGNED_BYTE_3_3_2: 44031a66ada72e5d9eb728f5149b72121bb04776016Brian Paul case GL_UNSIGNED_BYTE_2_3_3_REV: 44131a66ada72e5d9eb728f5149b72121bb04776016Brian Paul case GL_UNSIGNED_SHORT_5_6_5: 44231a66ada72e5d9eb728f5149b72121bb04776016Brian Paul case GL_UNSIGNED_SHORT_5_6_5_REV: 443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_TRUE; 444f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_HALF_FLOAT_ARB: 445f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return ctx->Extensions.ARB_half_float_pixel; 4469d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák case GL_UNSIGNED_INT_5_9_9_9_REV: 4479d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák return ctx->Extensions.EXT_texture_shared_exponent; 448631d23daa91c569bf268a2191bd466df73a64263Marek Olšák case GL_UNSIGNED_INT_10F_11F_11F_REV: 449631d23daa91c569bf268a2191bd466df73a64263Marek Olšák return ctx->Extensions.EXT_packed_float; 450db862e4d4c575fa9ea306fd4d271b58d1b77e83bBrian Paul default: 451db862e4d4c575fa9ea306fd4d271b58d1b77e83bBrian Paul return GL_FALSE; 452db862e4d4c575fa9ea306fd4d271b58d1b77e83bBrian Paul } 453db862e4d4c575fa9ea306fd4d271b58d1b77e83bBrian Paul case GL_BGR: 454db862e4d4c575fa9ea306fd4d271b58d1b77e83bBrian Paul switch (type) { 45531a66ada72e5d9eb728f5149b72121bb04776016Brian Paul /* NOTE: no packed types are supported with BGR. That's 45631a66ada72e5d9eb728f5149b72121bb04776016Brian Paul * intentional, according to the GL spec. 45731a66ada72e5d9eb728f5149b72121bb04776016Brian Paul */ 458db862e4d4c575fa9ea306fd4d271b58d1b77e83bBrian Paul case GL_BYTE: 459db862e4d4c575fa9ea306fd4d271b58d1b77e83bBrian Paul case GL_UNSIGNED_BYTE: 460db862e4d4c575fa9ea306fd4d271b58d1b77e83bBrian Paul case GL_SHORT: 461db862e4d4c575fa9ea306fd4d271b58d1b77e83bBrian Paul case GL_UNSIGNED_SHORT: 462db862e4d4c575fa9ea306fd4d271b58d1b77e83bBrian Paul case GL_INT: 463db862e4d4c575fa9ea306fd4d271b58d1b77e83bBrian Paul case GL_UNSIGNED_INT: 464db862e4d4c575fa9ea306fd4d271b58d1b77e83bBrian Paul case GL_FLOAT: 465db862e4d4c575fa9ea306fd4d271b58d1b77e83bBrian Paul return GL_TRUE; 466db862e4d4c575fa9ea306fd4d271b58d1b77e83bBrian Paul case GL_HALF_FLOAT_ARB: 467db862e4d4c575fa9ea306fd4d271b58d1b77e83bBrian Paul return ctx->Extensions.ARB_half_float_pixel; 468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_RGBA: 472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BGRA: 473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_ABGR_EXT: 474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach switch (type) { 475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_BYTE: 476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_BYTE: 477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_SHORT: 478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT: 479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_INT: 480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT: 481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_FLOAT: 482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4: 483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_4_4_4_4_REV: 484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_5_5_5_1: 485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_SHORT_1_5_5_5_REV: 486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8: 487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_8_8_8_8_REV: 488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_10_10_10_2: 489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach case GL_UNSIGNED_INT_2_10_10_10_REV: 490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_TRUE; 491f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_HALF_FLOAT_ARB: 492f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return ctx->Extensions.ARB_half_float_pixel; 493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 496c5b995066020191982b2315fc45d05e068eee761Brian Paul case GL_YCBCR_MESA: 497c5b995066020191982b2315fc45d05e068eee761Brian Paul if (type == GL_UNSIGNED_SHORT_8_8_MESA || 498c5b995066020191982b2315fc45d05e068eee761Brian Paul type == GL_UNSIGNED_SHORT_8_8_REV_MESA) 499c5b995066020191982b2315fc45d05e068eee761Brian Paul return GL_TRUE; 500c5b995066020191982b2315fc45d05e068eee761Brian Paul else 501c5b995066020191982b2315fc45d05e068eee761Brian Paul return GL_FALSE; 5021ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul case GL_DEPTH_STENCIL_EXT: 5031165280cbd37dee1e499358633478ab869de21dfMarek Olšák if ((ctx->Extensions.EXT_packed_depth_stencil && 5041165280cbd37dee1e499358633478ab869de21dfMarek Olšák type == GL_UNSIGNED_INT_24_8_EXT) || 5051165280cbd37dee1e499358633478ab869de21dfMarek Olšák (ctx->Extensions.ARB_depth_buffer_float && 5061165280cbd37dee1e499358633478ab869de21dfMarek Olšák type == GL_FLOAT_32_UNSIGNED_INT_24_8_REV)) 5071ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul return GL_TRUE; 5081ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul else 5091ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul return GL_FALSE; 510114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger case GL_DUDV_ATI: 511114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger case GL_DU8DV8_ATI: 512114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger switch (type) { 513114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger case GL_BYTE: 514114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger case GL_UNSIGNED_BYTE: 515114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger case GL_SHORT: 516114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger case GL_UNSIGNED_SHORT: 517114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger case GL_INT: 518114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger case GL_UNSIGNED_INT: 519114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger case GL_FLOAT: 520114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger return GL_TRUE; 521114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger default: 522114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger return GL_FALSE; 523114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 524113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul 525113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul /* integer-valued formats */ 526abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_RED_INTEGER_EXT: 527abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_GREEN_INTEGER_EXT: 528abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_BLUE_INTEGER_EXT: 529abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_ALPHA_INTEGER_EXT: 530113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul switch (type) { 531113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_BYTE: 532113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_UNSIGNED_BYTE: 533113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_SHORT: 534113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_UNSIGNED_SHORT: 535113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_INT: 536113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_UNSIGNED_INT: 537113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul return ctx->Extensions.EXT_texture_integer; 538113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul default: 539113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul return GL_FALSE; 540113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul } 541113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul 542abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_RGB_INTEGER_EXT: 543113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul switch (type) { 544113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_BYTE: 545113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_UNSIGNED_BYTE: 546113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_SHORT: 547113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_UNSIGNED_SHORT: 548113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_INT: 549113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_UNSIGNED_INT: 550923f143335ad1cba4795276e79cb1a5b0cd19bbcDave Airlie return ctx->Extensions.EXT_texture_integer; 551113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_UNSIGNED_BYTE_3_3_2: 552113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_UNSIGNED_BYTE_2_3_3_REV: 553113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_UNSIGNED_SHORT_5_6_5: 554113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_UNSIGNED_SHORT_5_6_5_REV: 555923f143335ad1cba4795276e79cb1a5b0cd19bbcDave Airlie return ctx->Extensions.ARB_texture_rgb10_a2ui; 556113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul default: 557113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul return GL_FALSE; 558113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul } 559113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul 560abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_BGR_INTEGER_EXT: 561113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul switch (type) { 562113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_BYTE: 563113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_UNSIGNED_BYTE: 564113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_SHORT: 565113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_UNSIGNED_SHORT: 566113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_INT: 567113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_UNSIGNED_INT: 568113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul /* NOTE: no packed formats w/ BGR format */ 569113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul return ctx->Extensions.EXT_texture_integer; 570113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul default: 571113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul return GL_FALSE; 572113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul } 573113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul 574113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_RGBA_INTEGER_EXT: 575abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_BGRA_INTEGER_EXT: 576113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul switch (type) { 577113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_BYTE: 578113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_UNSIGNED_BYTE: 579113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_SHORT: 580113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_UNSIGNED_SHORT: 581113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_INT: 582113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_UNSIGNED_INT: 583923f143335ad1cba4795276e79cb1a5b0cd19bbcDave Airlie return ctx->Extensions.EXT_texture_integer; 584113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_UNSIGNED_SHORT_4_4_4_4: 585113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_UNSIGNED_SHORT_4_4_4_4_REV: 586113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_UNSIGNED_SHORT_5_5_5_1: 587113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_UNSIGNED_SHORT_1_5_5_5_REV: 588113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_UNSIGNED_INT_8_8_8_8: 589113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_UNSIGNED_INT_8_8_8_8_REV: 590113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_UNSIGNED_INT_10_10_10_2: 591113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul case GL_UNSIGNED_INT_2_10_10_10_REV: 592923f143335ad1cba4795276e79cb1a5b0cd19bbcDave Airlie return ctx->Extensions.ARB_texture_rgb10_a2ui; 593113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul default: 594113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul return GL_FALSE; 595113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul } 596113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul 597abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_LUMINANCE_INTEGER_EXT: 598abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_LUMINANCE_ALPHA_INTEGER_EXT: 599abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul switch (type) { 600abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_BYTE: 601abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_UNSIGNED_BYTE: 602abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_SHORT: 603abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_UNSIGNED_SHORT: 604abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_INT: 605abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_UNSIGNED_INT: 606abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return ctx->Extensions.EXT_texture_integer; 607abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul default: 608abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_FALSE; 609abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 610abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 611afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach default: 612afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ; /* fall-through */ 613afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 614afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return GL_FALSE; 615afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 616afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 617afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 6186dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 61973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul * Test if the given image format is a color/RGBA format (i.e., not color 62073b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul * index, depth, stencil, etc). 62173b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul * \param format the image format value (may by an internal texture format) 62273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul * \return GL_TRUE if its a color/RGBA format, GL_FALSE otherwise. 62373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul */ 62473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian PaulGLboolean 62573b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul_mesa_is_color_format(GLenum format) 62673b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul{ 62773b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul switch (format) { 62873b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_RED: 62973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_GREEN: 63073b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_BLUE: 63173b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_ALPHA: 63273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_ALPHA4: 63373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_ALPHA8: 63473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_ALPHA12: 63573b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_ALPHA16: 63673b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case 1: 63773b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_LUMINANCE: 63873b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_LUMINANCE4: 63973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_LUMINANCE8: 64073b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_LUMINANCE12: 64173b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_LUMINANCE16: 64273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case 2: 64373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_LUMINANCE_ALPHA: 64473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_LUMINANCE4_ALPHA4: 64573b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_LUMINANCE6_ALPHA2: 64673b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_LUMINANCE8_ALPHA8: 64773b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_LUMINANCE12_ALPHA4: 64873b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_LUMINANCE12_ALPHA12: 64973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_LUMINANCE16_ALPHA16: 65073b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_INTENSITY: 65173b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_INTENSITY4: 65273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_INTENSITY8: 65373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_INTENSITY12: 65473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_INTENSITY16: 6555d1387b2da3626326410804026f8b92f1a121fdcIan Romanick case GL_R8: 6565d1387b2da3626326410804026f8b92f1a121fdcIan Romanick case GL_R16: 6575d1387b2da3626326410804026f8b92f1a121fdcIan Romanick case GL_RG: 6585d1387b2da3626326410804026f8b92f1a121fdcIan Romanick case GL_RG8: 6595d1387b2da3626326410804026f8b92f1a121fdcIan Romanick case GL_RG16: 66073b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case 3: 66173b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_RGB: 66273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_BGR: 66373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_R3_G3_B2: 66473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_RGB4: 66573b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_RGB5: 66673b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_RGB8: 66773b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_RGB10: 66873b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_RGB12: 66973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_RGB16: 67073b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case 4: 67173b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_ABGR_EXT: 67273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_RGBA: 67373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_BGRA: 67473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_RGBA2: 67573b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_RGBA4: 67673b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_RGB5_A1: 67773b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_RGBA8: 67873b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_RGB10_A2: 67973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_RGBA12: 68073b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_RGBA16: 68173b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul /* float texture formats */ 68273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_ALPHA16F_ARB: 68373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_ALPHA32F_ARB: 68473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_LUMINANCE16F_ARB: 68573b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_LUMINANCE32F_ARB: 68673b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_LUMINANCE_ALPHA16F_ARB: 68773b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_LUMINANCE_ALPHA32F_ARB: 68873b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_INTENSITY16F_ARB: 68973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_INTENSITY32F_ARB: 6905d1387b2da3626326410804026f8b92f1a121fdcIan Romanick case GL_R16F: 6915d1387b2da3626326410804026f8b92f1a121fdcIan Romanick case GL_R32F: 6925d1387b2da3626326410804026f8b92f1a121fdcIan Romanick case GL_RG16F: 6935d1387b2da3626326410804026f8b92f1a121fdcIan Romanick case GL_RG32F: 69473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_RGB16F_ARB: 69573b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_RGB32F_ARB: 69673b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_RGBA16F_ARB: 69773b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_RGBA32F_ARB: 69873b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul /* compressed formats */ 69973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_COMPRESSED_ALPHA: 70073b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_COMPRESSED_LUMINANCE: 70173b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_COMPRESSED_LUMINANCE_ALPHA: 70273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_COMPRESSED_INTENSITY: 7037c6147014a726eefb7a73c8520a0b48a57248a03Ian Romanick case GL_COMPRESSED_RED: 7047c6147014a726eefb7a73c8520a0b48a57248a03Ian Romanick case GL_COMPRESSED_RG: 70573b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_COMPRESSED_RGB: 70673b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_COMPRESSED_RGBA: 70773b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_RGB_S3TC: 70873b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_RGB4_S3TC: 70973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_RGBA_S3TC: 71073b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_RGBA4_S3TC: 71173b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: 71273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 71373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: 71473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: 71573b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_COMPRESSED_RGB_FXT1_3DFX: 71673b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_COMPRESSED_RGBA_FXT1_3DFX: 71773b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul#if FEATURE_EXT_texture_sRGB 71873b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_SRGB_EXT: 71973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_SRGB8_EXT: 72073b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_SRGB_ALPHA_EXT: 72173b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_SRGB8_ALPHA8_EXT: 72273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_SLUMINANCE_ALPHA_EXT: 72373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_SLUMINANCE8_ALPHA8_EXT: 72473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_SLUMINANCE_EXT: 72573b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_SLUMINANCE8_EXT: 72673b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_COMPRESSED_SRGB_EXT: 72773b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: 72873b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_COMPRESSED_SRGB_ALPHA_EXT: 72973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 73073b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 73173b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 73273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_COMPRESSED_SLUMINANCE_EXT: 73373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT: 73473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul#endif /* FEATURE_EXT_texture_sRGB */ 7351ca6cbec1b1168b55fecb264d4e75a26de2cccafIan Romanick case GL_COMPRESSED_RED_RGTC1: 7361ca6cbec1b1168b55fecb264d4e75a26de2cccafIan Romanick case GL_COMPRESSED_SIGNED_RED_RGTC1: 7371ca6cbec1b1168b55fecb264d4e75a26de2cccafIan Romanick case GL_COMPRESSED_RG_RGTC2: 7381ca6cbec1b1168b55fecb264d4e75a26de2cccafIan Romanick case GL_COMPRESSED_SIGNED_RG_RGTC2: 7397d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák case GL_COMPRESSED_LUMINANCE_LATC1_EXT: 7407d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT: 7417d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT: 7427d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT: 74369f16accd0aa3b8d414092a5e52ccc99649da01aMarek Olšák case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI: 744d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu case GL_ETC1_RGB8_OES: 745862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul /* generic integer formats */ 746862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_RED_INTEGER_EXT: 747862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_GREEN_INTEGER_EXT: 748862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_BLUE_INTEGER_EXT: 749862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_ALPHA_INTEGER_EXT: 750862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_RGB_INTEGER_EXT: 751862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_RGBA_INTEGER_EXT: 752862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_BGR_INTEGER_EXT: 753862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_BGRA_INTEGER_EXT: 754862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_LUMINANCE_INTEGER_EXT: 755862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_LUMINANCE_ALPHA_INTEGER_EXT: 756862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul /* sized integer formats */ 757862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_RGBA32UI_EXT: 758862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_RGB32UI_EXT: 759862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_ALPHA32UI_EXT: 760862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_INTENSITY32UI_EXT: 761862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_LUMINANCE32UI_EXT: 762862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_LUMINANCE_ALPHA32UI_EXT: 763862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_RGBA16UI_EXT: 764862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_RGB16UI_EXT: 765862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_ALPHA16UI_EXT: 766862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_INTENSITY16UI_EXT: 767862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_LUMINANCE16UI_EXT: 768862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_LUMINANCE_ALPHA16UI_EXT: 769862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_RGBA8UI_EXT: 770862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_RGB8UI_EXT: 771862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_ALPHA8UI_EXT: 772862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_INTENSITY8UI_EXT: 773862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_LUMINANCE8UI_EXT: 774862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_LUMINANCE_ALPHA8UI_EXT: 775862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_RGBA32I_EXT: 776862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_RGB32I_EXT: 777862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_ALPHA32I_EXT: 778862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_INTENSITY32I_EXT: 779862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_LUMINANCE32I_EXT: 780862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_LUMINANCE_ALPHA32I_EXT: 781862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_RGBA16I_EXT: 782862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_RGB16I_EXT: 783862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_ALPHA16I_EXT: 784862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_INTENSITY16I_EXT: 785862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_LUMINANCE16I_EXT: 786862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_LUMINANCE_ALPHA16I_EXT: 787862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_RGBA8I_EXT: 788862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_RGB8I_EXT: 789862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_ALPHA8I_EXT: 790862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_INTENSITY8I_EXT: 791862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_LUMINANCE8I_EXT: 792862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_LUMINANCE_ALPHA8I_EXT: 7930be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák /* signed, normalized texture formats */ 7940be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_RED_SNORM: 7950be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_R8_SNORM: 7960be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_R16_SNORM: 7970be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_RG_SNORM: 7980be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_RG8_SNORM: 7990be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_RG16_SNORM: 8000be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_RGB_SNORM: 8010be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_RGB8_SNORM: 8020be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_RGB16_SNORM: 8030be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_RGBA_SNORM: 8040be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_RGBA8_SNORM: 8050be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_RGBA16_SNORM: 8060be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_ALPHA_SNORM: 8070be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_ALPHA8_SNORM: 8080be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_ALPHA16_SNORM: 8090be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_LUMINANCE_SNORM: 8100be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_LUMINANCE8_SNORM: 8110be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_LUMINANCE16_SNORM: 8120be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_LUMINANCE_ALPHA_SNORM: 8130be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_LUMINANCE8_ALPHA8_SNORM: 8140be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_LUMINANCE16_ALPHA16_SNORM: 8150be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_INTENSITY_SNORM: 8160be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_INTENSITY8_SNORM: 8170be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_INTENSITY16_SNORM: 8189d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák case GL_RGB9_E5: 819631d23daa91c569bf268a2191bd466df73a64263Marek Olšák case GL_R11F_G11F_B10F: 820f449be660e70aac2aefd2ce84581e137de25520bDave Airlie case GL_RGB10_A2UI: 82173b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul return GL_TRUE; 82273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_YCBCR_MESA: /* not considered to be RGB */ 82373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul /* fall-through */ 82473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul default: 82573b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul return GL_FALSE; 82673b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul } 82773b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul} 82873b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul 82973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul 83073b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul/** 83173b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul * Test if the given image format is a depth component format. 83273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul */ 83373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian PaulGLboolean 83473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul_mesa_is_depth_format(GLenum format) 83573b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul{ 83673b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul switch (format) { 83773b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_DEPTH_COMPONENT: 83873b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_DEPTH_COMPONENT16: 83973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_DEPTH_COMPONENT24: 84073b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_DEPTH_COMPONENT32: 8411165280cbd37dee1e499358633478ab869de21dfMarek Olšák case GL_DEPTH_COMPONENT32F: 84273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul return GL_TRUE; 84373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul default: 84473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul return GL_FALSE; 84573b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul } 84673b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul} 84773b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul 84873b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul 84973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul/** 85010d81f466794c61c11225c94b2125bf2dd23748eBrian Paul * Test if the given image format is a stencil format. 85110d81f466794c61c11225c94b2125bf2dd23748eBrian Paul */ 85210d81f466794c61c11225c94b2125bf2dd23748eBrian PaulGLboolean 85310d81f466794c61c11225c94b2125bf2dd23748eBrian Paul_mesa_is_stencil_format(GLenum format) 85410d81f466794c61c11225c94b2125bf2dd23748eBrian Paul{ 85510d81f466794c61c11225c94b2125bf2dd23748eBrian Paul switch (format) { 85610d81f466794c61c11225c94b2125bf2dd23748eBrian Paul case GL_STENCIL_INDEX: 85710d81f466794c61c11225c94b2125bf2dd23748eBrian Paul return GL_TRUE; 85810d81f466794c61c11225c94b2125bf2dd23748eBrian Paul default: 85910d81f466794c61c11225c94b2125bf2dd23748eBrian Paul return GL_FALSE; 86010d81f466794c61c11225c94b2125bf2dd23748eBrian Paul } 86110d81f466794c61c11225c94b2125bf2dd23748eBrian Paul} 86210d81f466794c61c11225c94b2125bf2dd23748eBrian Paul 86310d81f466794c61c11225c94b2125bf2dd23748eBrian Paul 86410d81f466794c61c11225c94b2125bf2dd23748eBrian Paul/** 86573b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul * Test if the given image format is a YCbCr format. 86673b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul */ 86773b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian PaulGLboolean 86873b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul_mesa_is_ycbcr_format(GLenum format) 86973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul{ 87073b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul switch (format) { 87173b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_YCBCR_MESA: 87273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul return GL_TRUE; 87373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul default: 87473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul return GL_FALSE; 87573b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul } 87673b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul} 87773b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul 87873b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul 87973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul/** 88073b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul * Test if the given image format is a depth+stencil format. 88173b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul */ 88273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian PaulGLboolean 88373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul_mesa_is_depthstencil_format(GLenum format) 88473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul{ 88573b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul switch (format) { 88673b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_DEPTH24_STENCIL8_EXT: 88773b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_DEPTH_STENCIL_EXT: 8881165280cbd37dee1e499358633478ab869de21dfMarek Olšák case GL_DEPTH32F_STENCIL8: 88973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul return GL_TRUE; 89073b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul default: 89173b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul return GL_FALSE; 89273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul } 89373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul} 89473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul 895e485af774efba897dcbef4697158428c2298d964Brian Paul 896e485af774efba897dcbef4697158428c2298d964Brian Paul/** 897e485af774efba897dcbef4697158428c2298d964Brian Paul * Test if the given image format is a depth or stencil format. 898e485af774efba897dcbef4697158428c2298d964Brian Paul */ 899e485af774efba897dcbef4697158428c2298d964Brian PaulGLboolean 900e485af774efba897dcbef4697158428c2298d964Brian Paul_mesa_is_depth_or_stencil_format(GLenum format) 901e485af774efba897dcbef4697158428c2298d964Brian Paul{ 902e485af774efba897dcbef4697158428c2298d964Brian Paul switch (format) { 903e485af774efba897dcbef4697158428c2298d964Brian Paul case GL_DEPTH_COMPONENT: 904e485af774efba897dcbef4697158428c2298d964Brian Paul case GL_DEPTH_COMPONENT16: 905e485af774efba897dcbef4697158428c2298d964Brian Paul case GL_DEPTH_COMPONENT24: 906e485af774efba897dcbef4697158428c2298d964Brian Paul case GL_DEPTH_COMPONENT32: 907e485af774efba897dcbef4697158428c2298d964Brian Paul case GL_STENCIL_INDEX: 908e485af774efba897dcbef4697158428c2298d964Brian Paul case GL_STENCIL_INDEX1_EXT: 909e485af774efba897dcbef4697158428c2298d964Brian Paul case GL_STENCIL_INDEX4_EXT: 910e485af774efba897dcbef4697158428c2298d964Brian Paul case GL_STENCIL_INDEX8_EXT: 911e485af774efba897dcbef4697158428c2298d964Brian Paul case GL_STENCIL_INDEX16_EXT: 912e485af774efba897dcbef4697158428c2298d964Brian Paul case GL_DEPTH_STENCIL_EXT: 913e485af774efba897dcbef4697158428c2298d964Brian Paul case GL_DEPTH24_STENCIL8_EXT: 9141165280cbd37dee1e499358633478ab869de21dfMarek Olšák case GL_DEPTH_COMPONENT32F: 9151165280cbd37dee1e499358633478ab869de21dfMarek Olšák case GL_DEPTH32F_STENCIL8: 916e485af774efba897dcbef4697158428c2298d964Brian Paul return GL_TRUE; 917e485af774efba897dcbef4697158428c2298d964Brian Paul default: 918e485af774efba897dcbef4697158428c2298d964Brian Paul return GL_FALSE; 919e485af774efba897dcbef4697158428c2298d964Brian Paul } 920e485af774efba897dcbef4697158428c2298d964Brian Paul} 921e485af774efba897dcbef4697158428c2298d964Brian Paul 922e485af774efba897dcbef4697158428c2298d964Brian Paul 92373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul/** 92473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul * Test if the given image format is a dudv format. 92573b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul */ 92673b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian PaulGLboolean 92773b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul_mesa_is_dudv_format(GLenum format) 92873b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul{ 92973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul switch (format) { 93073b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_DUDV_ATI: 93173b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul case GL_DU8DV8_ATI: 93273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul return GL_TRUE; 93373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul default: 93473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul return GL_FALSE; 93573b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul } 93673b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul} 93773b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul 93873b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul 93973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul/** 940abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul * Test if the given format is an integer (non-normalized) format. 941abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul */ 942abd5627a6a034885b0b01b995c73870da1361bb0Brian PaulGLboolean 943abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_is_integer_format(GLenum format) 944abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{ 945abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul switch (format) { 946862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul /* generic integer formats */ 947abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_RED_INTEGER_EXT: 948abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_GREEN_INTEGER_EXT: 949abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_BLUE_INTEGER_EXT: 950abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_ALPHA_INTEGER_EXT: 951abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_RGB_INTEGER_EXT: 952abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_RGBA_INTEGER_EXT: 953abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_BGR_INTEGER_EXT: 954abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_BGRA_INTEGER_EXT: 955abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_LUMINANCE_INTEGER_EXT: 956abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_LUMINANCE_ALPHA_INTEGER_EXT: 957862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul /* specific integer formats */ 958862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_RGBA32UI_EXT: 959862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_RGB32UI_EXT: 9602bf9aeaa19f75816c6342fe564ad7c4bcdc97e12Eric Anholt case GL_RG32UI: 9612bf9aeaa19f75816c6342fe564ad7c4bcdc97e12Eric Anholt case GL_R32UI: 962862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_ALPHA32UI_EXT: 963862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_INTENSITY32UI_EXT: 964862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_LUMINANCE32UI_EXT: 965862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_LUMINANCE_ALPHA32UI_EXT: 966862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_RGBA16UI_EXT: 967862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_RGB16UI_EXT: 9682bf9aeaa19f75816c6342fe564ad7c4bcdc97e12Eric Anholt case GL_RG16UI: 9692bf9aeaa19f75816c6342fe564ad7c4bcdc97e12Eric Anholt case GL_R16UI: 970862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_ALPHA16UI_EXT: 971862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_INTENSITY16UI_EXT: 972862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_LUMINANCE16UI_EXT: 973862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_LUMINANCE_ALPHA16UI_EXT: 974862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_RGBA8UI_EXT: 975862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_RGB8UI_EXT: 9762bf9aeaa19f75816c6342fe564ad7c4bcdc97e12Eric Anholt case GL_RG8UI: 9772bf9aeaa19f75816c6342fe564ad7c4bcdc97e12Eric Anholt case GL_R8UI: 978862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_ALPHA8UI_EXT: 979862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_INTENSITY8UI_EXT: 980862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_LUMINANCE8UI_EXT: 981862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_LUMINANCE_ALPHA8UI_EXT: 982862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_RGBA32I_EXT: 983862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_RGB32I_EXT: 9842bf9aeaa19f75816c6342fe564ad7c4bcdc97e12Eric Anholt case GL_RG32I: 9852bf9aeaa19f75816c6342fe564ad7c4bcdc97e12Eric Anholt case GL_R32I: 986862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_ALPHA32I_EXT: 987862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_INTENSITY32I_EXT: 988862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_LUMINANCE32I_EXT: 989862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_LUMINANCE_ALPHA32I_EXT: 990862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_RGBA16I_EXT: 991862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_RGB16I_EXT: 9922bf9aeaa19f75816c6342fe564ad7c4bcdc97e12Eric Anholt case GL_RG16I: 9932bf9aeaa19f75816c6342fe564ad7c4bcdc97e12Eric Anholt case GL_R16I: 994862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_ALPHA16I_EXT: 995862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_INTENSITY16I_EXT: 996862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_LUMINANCE16I_EXT: 997862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_LUMINANCE_ALPHA16I_EXT: 998862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_RGBA8I_EXT: 999862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_RGB8I_EXT: 10002bf9aeaa19f75816c6342fe564ad7c4bcdc97e12Eric Anholt case GL_RG8I: 10012bf9aeaa19f75816c6342fe564ad7c4bcdc97e12Eric Anholt case GL_R8I: 1002862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_ALPHA8I_EXT: 1003862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_INTENSITY8I_EXT: 1004862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_LUMINANCE8I_EXT: 1005862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul case GL_LUMINANCE_ALPHA8I_EXT: 1006f449be660e70aac2aefd2ce84581e137de25520bDave Airlie case GL_RGB10_A2UI: 1007abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_TRUE; 1008abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul default: 1009abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_FALSE; 1010abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 1011abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul} 1012abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 1013abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 1014abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/** 1015c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul * Test if an image format is a supported compressed format. 1016c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul * \param format the internal format token provided by the user. 1017c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul * \return GL_TRUE if compressed, GL_FALSE if uncompressed 1018c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul */ 1019c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian PaulGLboolean 1020f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_is_compressed_format(struct gl_context *ctx, GLenum format) 1021c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul{ 1022c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul switch (format) { 1023c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: 1024c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 1025c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: 1026c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: 1027c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul return ctx->Extensions.EXT_texture_compression_s3tc; 1028c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul case GL_RGB_S3TC: 1029c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul case GL_RGB4_S3TC: 1030c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul case GL_RGBA_S3TC: 1031c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul case GL_RGBA4_S3TC: 1032c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul return ctx->Extensions.S3_s3tc; 1033c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: 1034c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 1035c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 1036c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 1037c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul return ctx->Extensions.EXT_texture_sRGB 1038c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul && ctx->Extensions.EXT_texture_compression_s3tc; 1039c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul case GL_COMPRESSED_RGB_FXT1_3DFX: 1040c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul case GL_COMPRESSED_RGBA_FXT1_3DFX: 1041c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul return ctx->Extensions.TDFX_texture_compression_FXT1; 10421ca6cbec1b1168b55fecb264d4e75a26de2cccafIan Romanick case GL_COMPRESSED_RED_RGTC1: 10431ca6cbec1b1168b55fecb264d4e75a26de2cccafIan Romanick case GL_COMPRESSED_SIGNED_RED_RGTC1: 10441ca6cbec1b1168b55fecb264d4e75a26de2cccafIan Romanick case GL_COMPRESSED_RG_RGTC2: 10451ca6cbec1b1168b55fecb264d4e75a26de2cccafIan Romanick case GL_COMPRESSED_SIGNED_RG_RGTC2: 10461ca6cbec1b1168b55fecb264d4e75a26de2cccafIan Romanick return ctx->Extensions.ARB_texture_compression_rgtc; 10477d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák case GL_COMPRESSED_LUMINANCE_LATC1_EXT: 10487d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT: 10497d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT: 10507d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT: 10517d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák return ctx->Extensions.EXT_texture_compression_latc; 105269f16accd0aa3b8d414092a5e52ccc99649da01aMarek Olšák case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI: 105369f16accd0aa3b8d414092a5e52ccc99649da01aMarek Olšák return ctx->Extensions.ATI_texture_compression_3dc; 1054d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu case GL_ETC1_RGB8_OES: 1055d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu return ctx->Extensions.OES_compressed_ETC1_RGB8_texture; 1056a454c835fa4f1d243f9e2072007dd52cf0d71dacIan Romanick#if FEATURE_ES 1057a454c835fa4f1d243f9e2072007dd52cf0d71dacIan Romanick case GL_PALETTE4_RGB8_OES: 1058a454c835fa4f1d243f9e2072007dd52cf0d71dacIan Romanick case GL_PALETTE4_RGBA8_OES: 1059a454c835fa4f1d243f9e2072007dd52cf0d71dacIan Romanick case GL_PALETTE4_R5_G6_B5_OES: 1060a454c835fa4f1d243f9e2072007dd52cf0d71dacIan Romanick case GL_PALETTE4_RGBA4_OES: 1061a454c835fa4f1d243f9e2072007dd52cf0d71dacIan Romanick case GL_PALETTE4_RGB5_A1_OES: 1062a454c835fa4f1d243f9e2072007dd52cf0d71dacIan Romanick case GL_PALETTE8_RGB8_OES: 1063a454c835fa4f1d243f9e2072007dd52cf0d71dacIan Romanick case GL_PALETTE8_RGBA8_OES: 1064a454c835fa4f1d243f9e2072007dd52cf0d71dacIan Romanick case GL_PALETTE8_R5_G6_B5_OES: 1065a454c835fa4f1d243f9e2072007dd52cf0d71dacIan Romanick case GL_PALETTE8_RGBA4_OES: 1066a454c835fa4f1d243f9e2072007dd52cf0d71dacIan Romanick case GL_PALETTE8_RGB5_A1_OES: 1067a454c835fa4f1d243f9e2072007dd52cf0d71dacIan Romanick return ctx->API == API_OPENGLES; 1068a454c835fa4f1d243f9e2072007dd52cf0d71dacIan Romanick#endif 1069c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul default: 1070c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul return GL_FALSE; 1071c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul } 107237bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul} 107337bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul 107437bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul 107537bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul/** 107637bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul * Does the given base texture/renderbuffer format have the channel 107737bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul * named by 'pname'? 107837bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul */ 107937bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian PaulGLboolean 108037bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul_mesa_base_format_has_channel(GLenum base_format, GLenum pname) 108137bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul{ 108237bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul switch (pname) { 108337bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul case GL_TEXTURE_RED_SIZE: 108437bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul case GL_TEXTURE_RED_TYPE: 108537bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul case GL_RENDERBUFFER_RED_SIZE_EXT: 108637bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE: 108737bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul if (base_format == GL_RED || 108837bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul base_format == GL_RG || 108937bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul base_format == GL_RGB || 109037bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul base_format == GL_RGBA) { 109137bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul return GL_TRUE; 109237bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul } 109337bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul return GL_FALSE; 109437bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul case GL_TEXTURE_GREEN_SIZE: 109537bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul case GL_TEXTURE_GREEN_TYPE: 109637bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul case GL_RENDERBUFFER_GREEN_SIZE_EXT: 109737bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE: 109837bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul if (base_format == GL_RG || 109937bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul base_format == GL_RGB || 110037bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul base_format == GL_RGBA) { 110137bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul return GL_TRUE; 110237bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul } 110337bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul return GL_FALSE; 110437bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul case GL_TEXTURE_BLUE_SIZE: 110537bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul case GL_TEXTURE_BLUE_TYPE: 110637bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul case GL_RENDERBUFFER_BLUE_SIZE_EXT: 110737bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE: 110837bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul if (base_format == GL_RGB || 110937bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul base_format == GL_RGBA) { 111037bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul return GL_TRUE; 111137bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul } 111237bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul return GL_FALSE; 111337bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul case GL_TEXTURE_ALPHA_SIZE: 111437bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul case GL_TEXTURE_ALPHA_TYPE: 111537bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul case GL_RENDERBUFFER_ALPHA_SIZE_EXT: 111637bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE: 111737bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul if (base_format == GL_RGBA || 111837bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul base_format == GL_ALPHA || 111937bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul base_format == GL_LUMINANCE_ALPHA) { 112037bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul return GL_TRUE; 112137bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul } 112237bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul return GL_FALSE; 112337bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul case GL_TEXTURE_LUMINANCE_SIZE: 112437bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul case GL_TEXTURE_LUMINANCE_TYPE: 112537bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul if (base_format == GL_LUMINANCE || 112637bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul base_format == GL_LUMINANCE_ALPHA) { 112737bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul return GL_TRUE; 112837bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul } 112937bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul return GL_FALSE; 113037bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul case GL_TEXTURE_INTENSITY_SIZE: 113137bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul case GL_TEXTURE_INTENSITY_TYPE: 113237bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul if (base_format == GL_INTENSITY) { 113337bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul return GL_TRUE; 113437bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul } 113537bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul return GL_FALSE; 113637bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul case GL_TEXTURE_DEPTH_SIZE: 113737bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul case GL_TEXTURE_DEPTH_TYPE: 113837bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul case GL_RENDERBUFFER_DEPTH_SIZE_EXT: 113937bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE: 114037bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul if (base_format == GL_DEPTH_STENCIL || 114137bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul base_format == GL_DEPTH_COMPONENT) { 114237bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul return GL_TRUE; 114337bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul } 114437bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul return GL_FALSE; 114537bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul case GL_RENDERBUFFER_STENCIL_SIZE_EXT: 114637bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE: 114737bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul if (base_format == GL_DEPTH_STENCIL || 114837bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul base_format == GL_STENCIL_INDEX) { 114937bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul return GL_TRUE; 115037bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul } 115137bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul return GL_FALSE; 115237bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul default: 115337bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul _mesa_warning(NULL, "%s: Unexpected channel token 0x%x\n", 115437bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul __FUNCTION__, pname); 115537bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul return GL_FALSE; 115637bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul } 115737bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul 115837bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul return GL_FALSE; 1159c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul} 1160c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul 1161c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul 1162c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul/** 116360909388ab136d849d99eab49e782a53772a618fBrian Paul * Return the address of a specific pixel in an image (1D, 2D or 3D). 11646dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 11656dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Pixel unpacking/packing parameters are observed according to \p packing. 11666dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 116760909388ab136d849d99eab49e782a53772a618fBrian Paul * \param dimensions either 1, 2 or 3 to indicate dimensionality of image 116860909388ab136d849d99eab49e782a53772a618fBrian Paul * \param image starting address of image data 116960909388ab136d849d99eab49e782a53772a618fBrian Paul * \param width the image width 117060909388ab136d849d99eab49e782a53772a618fBrian Paul * \param height theimage height 117160909388ab136d849d99eab49e782a53772a618fBrian Paul * \param format the pixel format 117260909388ab136d849d99eab49e782a53772a618fBrian Paul * \param type the pixel data type 117360909388ab136d849d99eab49e782a53772a618fBrian Paul * \param packing the pixelstore attributes 117460909388ab136d849d99eab49e782a53772a618fBrian Paul * \param img which image in the volume (0 for 1D or 2D images) 117560909388ab136d849d99eab49e782a53772a618fBrian Paul * \param row row of pixel in the image (0 for 1D images) 117660909388ab136d849d99eab49e782a53772a618fBrian Paul * \param column column of pixel in the image 11776dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 11786dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return address of pixel on success, or NULL on error. 11796dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 11806dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa gl_pixelstore_attrib. 1181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */ 1182b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLvoid * 118360909388ab136d849d99eab49e782a53772a618fBrian Paul_mesa_image_address( GLuint dimensions, 118460909388ab136d849d99eab49e782a53772a618fBrian Paul const struct gl_pixelstore_attrib *packing, 118560909388ab136d849d99eab49e782a53772a618fBrian Paul const GLvoid *image, 118660909388ab136d849d99eab49e782a53772a618fBrian Paul GLsizei width, GLsizei height, 118760909388ab136d849d99eab49e782a53772a618fBrian Paul GLenum format, GLenum type, 1188b7d076fc96ac27117421653a043d00a95f789d24Brian Paul GLint img, GLint row, GLint column ) 1189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{ 1190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint alignment; /* 1, 2 or 4 */ 1191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint pixels_per_row; 1192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint rows_per_image; 1193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint skiprows; 1194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint skippixels; 1195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint skipimages; /* for 3-D volume images */ 1196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLubyte *pixel_addr; 1197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 119860909388ab136d849d99eab49e782a53772a618fBrian Paul ASSERT(dimensions >= 1 && dimensions <= 3); 119960909388ab136d849d99eab49e782a53772a618fBrian Paul 1200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach alignment = packing->Alignment; 1201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->RowLength > 0) { 1202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach pixels_per_row = packing->RowLength; 1203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 1205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach pixels_per_row = width; 1206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (packing->ImageHeight > 0) { 1208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach rows_per_image = packing->ImageHeight; 1209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 1211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach rows_per_image = height; 1212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 121360909388ab136d849d99eab49e782a53772a618fBrian Paul 1214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach skippixels = packing->SkipPixels; 121560909388ab136d849d99eab49e782a53772a618fBrian Paul /* Note: SKIP_ROWS _is_ used for 1D images */ 121660909388ab136d849d99eab49e782a53772a618fBrian Paul skiprows = packing->SkipRows; 121760909388ab136d849d99eab49e782a53772a618fBrian Paul /* Note: SKIP_IMAGES is only used for 3D images */ 121860909388ab136d849d99eab49e782a53772a618fBrian Paul skipimages = (dimensions == 3) ? packing->SkipImages : 0; 1219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1220450e917c9d71f696bca2ba11960a521e64385ec2Brian Paul if (type == GL_BITMAP) { 1221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* BITMAP data */ 1222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint comp_per_pixel; /* components per pixel */ 1223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint bytes_per_comp; /* bytes per component */ 1224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint bytes_per_row; 1225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint bytes_per_image; 1226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* Compute bytes per component */ 1228b7d076fc96ac27117421653a043d00a95f789d24Brian Paul bytes_per_comp = _mesa_sizeof_packed_type( type ); 1229450e917c9d71f696bca2ba11960a521e64385ec2Brian Paul if (bytes_per_comp < 0) { 1230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return NULL; 1231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* Compute number of components per pixel */ 1234b7d076fc96ac27117421653a043d00a95f789d24Brian Paul comp_per_pixel = _mesa_components_in_format( format ); 1235450e917c9d71f696bca2ba11960a521e64385ec2Brian Paul if (comp_per_pixel < 0) { 1236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return NULL; 1237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_row = alignment 1240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * CEILING( comp_per_pixel*pixels_per_row, 8*alignment ); 1241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_image = bytes_per_row * rows_per_image; 1243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach pixel_addr = (GLubyte *) image 1245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skipimages + img) * bytes_per_image 1246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skiprows + row) * bytes_per_row 1247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skippixels + column) / 8; 1248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach else { 1250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* Non-BITMAP data */ 1251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach GLint bytes_per_pixel, bytes_per_row, remainder, bytes_per_image; 1252551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul GLint topOfImage; 1253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1254b7d076fc96ac27117421653a043d00a95f789d24Brian Paul bytes_per_pixel = _mesa_bytes_per_pixel( format, type ); 1255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* The pixel type and format should have been error checked earlier */ 1257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach assert(bytes_per_pixel > 0); 1258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_row = pixels_per_row * bytes_per_pixel; 1260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach remainder = bytes_per_row % alignment; 1261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach if (remainder > 0) 1262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_row += (alignment - remainder); 1263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach ASSERT(bytes_per_row % alignment == 0); 1265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach bytes_per_image = bytes_per_row * rows_per_image; 1267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1268551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul if (packing->Invert) { 1269551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul /* set pixel_addr to the last row */ 1270551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul topOfImage = bytes_per_row * (height - 1); 1271551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul bytes_per_row = -bytes_per_row; 1272551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul } 1273551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul else { 1274551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul topOfImage = 0; 1275551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul } 1276551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul 1277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach /* compute final pixel address */ 1278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach pixel_addr = (GLubyte *) image 1279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skipimages + img) * bytes_per_image 1280551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul + topOfImage 1281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skiprows + row) * bytes_per_row 1282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach + (skippixels + column) * bytes_per_pixel; 1283afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach } 1284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach return (GLvoid *) pixel_addr; 1286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach} 1287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 1288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 128960909388ab136d849d99eab49e782a53772a618fBrian PaulGLvoid * 129060909388ab136d849d99eab49e782a53772a618fBrian Paul_mesa_image_address1d( const struct gl_pixelstore_attrib *packing, 129160909388ab136d849d99eab49e782a53772a618fBrian Paul const GLvoid *image, 129260909388ab136d849d99eab49e782a53772a618fBrian Paul GLsizei width, 129360909388ab136d849d99eab49e782a53772a618fBrian Paul GLenum format, GLenum type, 129460909388ab136d849d99eab49e782a53772a618fBrian Paul GLint column ) 129560909388ab136d849d99eab49e782a53772a618fBrian Paul{ 129660909388ab136d849d99eab49e782a53772a618fBrian Paul return _mesa_image_address(1, packing, image, width, 1, 129760909388ab136d849d99eab49e782a53772a618fBrian Paul format, type, 0, 0, column); 129860909388ab136d849d99eab49e782a53772a618fBrian Paul} 129960909388ab136d849d99eab49e782a53772a618fBrian Paul 130060909388ab136d849d99eab49e782a53772a618fBrian Paul 130160909388ab136d849d99eab49e782a53772a618fBrian PaulGLvoid * 130260909388ab136d849d99eab49e782a53772a618fBrian Paul_mesa_image_address2d( const struct gl_pixelstore_attrib *packing, 130360909388ab136d849d99eab49e782a53772a618fBrian Paul const GLvoid *image, 130460909388ab136d849d99eab49e782a53772a618fBrian Paul GLsizei width, GLsizei height, 130560909388ab136d849d99eab49e782a53772a618fBrian Paul GLenum format, GLenum type, 130660909388ab136d849d99eab49e782a53772a618fBrian Paul GLint row, GLint column ) 130760909388ab136d849d99eab49e782a53772a618fBrian Paul{ 130860909388ab136d849d99eab49e782a53772a618fBrian Paul return _mesa_image_address(2, packing, image, width, height, 130960909388ab136d849d99eab49e782a53772a618fBrian Paul format, type, 0, row, column); 131060909388ab136d849d99eab49e782a53772a618fBrian Paul} 131160909388ab136d849d99eab49e782a53772a618fBrian Paul 131260909388ab136d849d99eab49e782a53772a618fBrian Paul 131360909388ab136d849d99eab49e782a53772a618fBrian PaulGLvoid * 131460909388ab136d849d99eab49e782a53772a618fBrian Paul_mesa_image_address3d( const struct gl_pixelstore_attrib *packing, 131560909388ab136d849d99eab49e782a53772a618fBrian Paul const GLvoid *image, 131660909388ab136d849d99eab49e782a53772a618fBrian Paul GLsizei width, GLsizei height, 131760909388ab136d849d99eab49e782a53772a618fBrian Paul GLenum format, GLenum type, 131860909388ab136d849d99eab49e782a53772a618fBrian Paul GLint img, GLint row, GLint column ) 131960909388ab136d849d99eab49e782a53772a618fBrian Paul{ 132060909388ab136d849d99eab49e782a53772a618fBrian Paul return _mesa_image_address(3, packing, image, width, height, 132160909388ab136d849d99eab49e782a53772a618fBrian Paul format, type, img, row, column); 132260909388ab136d849d99eab49e782a53772a618fBrian Paul} 132360909388ab136d849d99eab49e782a53772a618fBrian Paul 132460909388ab136d849d99eab49e782a53772a618fBrian Paul 132560909388ab136d849d99eab49e782a53772a618fBrian Paul 13266dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 132717fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul * Compute the stride (in bytes) between image rows. 13286dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 13296dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param packing the pixelstore attributes 13306dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param width image width. 13316dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param format pixel format. 13326dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param type pixel data type. 13336dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 133417fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul * \return the stride in bytes for the given parameters, or -1 if error 1335ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul */ 1336ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian PaulGLint 1337ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul_mesa_image_row_stride( const struct gl_pixelstore_attrib *packing, 1338ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul GLint width, GLenum format, GLenum type ) 1339ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul{ 134017fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul GLint bytesPerRow, remainder; 134117fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul 1342ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul ASSERT(packing); 134317fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul 1344ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul if (type == GL_BITMAP) { 1345ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul if (packing->RowLength == 0) { 134617fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul bytesPerRow = (width + 7) / 8; 1347ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 1348ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul else { 134917fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul bytesPerRow = (packing->RowLength + 7) / 8; 1350551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul } 1351ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 1352ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul else { 1353ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul /* Non-BITMAP data */ 1354b7d076fc96ac27117421653a043d00a95f789d24Brian Paul const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type); 1355ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul if (bytesPerPixel <= 0) 1356ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul return -1; /* error */ 1357ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul if (packing->RowLength == 0) { 1358fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul bytesPerRow = bytesPerPixel * width; 1359ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 1360ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul else { 1361fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul bytesPerRow = bytesPerPixel * packing->RowLength; 1362ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 1363ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul } 136417fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul 136517fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul remainder = bytesPerRow % packing->Alignment; 136617fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul if (remainder > 0) { 136717fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul bytesPerRow += (packing->Alignment - remainder); 136817fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul } 136917fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul 137017fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul if (packing->Invert) { 137117fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul /* negate the bytes per row (negative row stride) */ 137217fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul bytesPerRow = -bytesPerRow; 137317fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul } 137417fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul 137517fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul return bytesPerRow; 1376ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul} 1377ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul 1378ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul 1379ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul/* 1380d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul * Compute the stride between images in a 3D texture (in bytes) for the given 1381d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul * pixel packing parameters and image width, format and type. 1382d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul */ 1383d488af5b34e390a9b81dac96053bd45f34ffffffBrian PaulGLint 1384d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul_mesa_image_image_stride( const struct gl_pixelstore_attrib *packing, 1385d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul GLint width, GLint height, 1386d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul GLenum format, GLenum type ) 1387d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul{ 1388995456f9305593005f8466520314ee087f3d422aBrian Paul GLint bytesPerRow, bytesPerImage, remainder; 1389995456f9305593005f8466520314ee087f3d422aBrian Paul 1390d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul ASSERT(packing); 1391d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul 1392995456f9305593005f8466520314ee087f3d422aBrian Paul if (type == GL_BITMAP) { 1393995456f9305593005f8466520314ee087f3d422aBrian Paul if (packing->RowLength == 0) { 1394995456f9305593005f8466520314ee087f3d422aBrian Paul bytesPerRow = (width + 7) / 8; 1395995456f9305593005f8466520314ee087f3d422aBrian Paul } 1396995456f9305593005f8466520314ee087f3d422aBrian Paul else { 1397995456f9305593005f8466520314ee087f3d422aBrian Paul bytesPerRow = (packing->RowLength + 7) / 8; 1398995456f9305593005f8466520314ee087f3d422aBrian Paul } 1399995456f9305593005f8466520314ee087f3d422aBrian Paul } 1400995456f9305593005f8466520314ee087f3d422aBrian Paul else { 1401d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type); 1402d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul 1403d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul if (bytesPerPixel <= 0) 1404d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul return -1; /* error */ 1405d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul if (packing->RowLength == 0) { 1406d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul bytesPerRow = bytesPerPixel * width; 1407d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul } 1408d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul else { 1409d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul bytesPerRow = bytesPerPixel * packing->RowLength; 1410d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul } 1411995456f9305593005f8466520314ee087f3d422aBrian Paul } 1412d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul 1413995456f9305593005f8466520314ee087f3d422aBrian Paul remainder = bytesPerRow % packing->Alignment; 1414995456f9305593005f8466520314ee087f3d422aBrian Paul if (remainder > 0) 1415995456f9305593005f8466520314ee087f3d422aBrian Paul bytesPerRow += (packing->Alignment - remainder); 1416d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul 1417995456f9305593005f8466520314ee087f3d422aBrian Paul if (packing->ImageHeight == 0) 1418995456f9305593005f8466520314ee087f3d422aBrian Paul bytesPerImage = bytesPerRow * height; 1419995456f9305593005f8466520314ee087f3d422aBrian Paul else 1420995456f9305593005f8466520314ee087f3d422aBrian Paul bytesPerImage = bytesPerRow * packing->ImageHeight; 1421995456f9305593005f8466520314ee087f3d422aBrian Paul 1422995456f9305593005f8466520314ee087f3d422aBrian Paul return bytesPerImage; 1423d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul} 1424d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul 1425d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul 1426116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul 1427278e76832fc26678592368b7b89bfddc137e0e93Brian Paul/** 1428278e76832fc26678592368b7b89bfddc137e0e93Brian Paul * "Expand" a bitmap from 1-bit per pixel to 8-bits per pixel. 1429278e76832fc26678592368b7b89bfddc137e0e93Brian Paul * This is typically used to convert a bitmap into a GLubyte/pixel texture. 1430278e76832fc26678592368b7b89bfddc137e0e93Brian Paul * "On" bits will set texels to \p onValue. 1431278e76832fc26678592368b7b89bfddc137e0e93Brian Paul * "Off" bits will not modify texels. 1432278e76832fc26678592368b7b89bfddc137e0e93Brian Paul * \param width src bitmap width in pixels 1433278e76832fc26678592368b7b89bfddc137e0e93Brian Paul * \param height src bitmap height in pixels 1434278e76832fc26678592368b7b89bfddc137e0e93Brian Paul * \param unpack bitmap unpacking state 1435278e76832fc26678592368b7b89bfddc137e0e93Brian Paul * \param bitmap the src bitmap data 1436278e76832fc26678592368b7b89bfddc137e0e93Brian Paul * \param destBuffer start of dest buffer 1437278e76832fc26678592368b7b89bfddc137e0e93Brian Paul * \param destStride row stride in dest buffer 1438278e76832fc26678592368b7b89bfddc137e0e93Brian Paul * \param onValue if bit is 1, set destBuffer pixel to this value 1439278e76832fc26678592368b7b89bfddc137e0e93Brian Paul */ 1440278e76832fc26678592368b7b89bfddc137e0e93Brian Paulvoid 1441278e76832fc26678592368b7b89bfddc137e0e93Brian Paul_mesa_expand_bitmap(GLsizei width, GLsizei height, 1442278e76832fc26678592368b7b89bfddc137e0e93Brian Paul const struct gl_pixelstore_attrib *unpack, 1443278e76832fc26678592368b7b89bfddc137e0e93Brian Paul const GLubyte *bitmap, 1444278e76832fc26678592368b7b89bfddc137e0e93Brian Paul GLubyte *destBuffer, GLint destStride, 1445278e76832fc26678592368b7b89bfddc137e0e93Brian Paul GLubyte onValue) 1446278e76832fc26678592368b7b89bfddc137e0e93Brian Paul{ 1447278e76832fc26678592368b7b89bfddc137e0e93Brian Paul const GLubyte *srcRow = (const GLubyte *) 1448278e76832fc26678592368b7b89bfddc137e0e93Brian Paul _mesa_image_address2d(unpack, bitmap, width, height, 1449278e76832fc26678592368b7b89bfddc137e0e93Brian Paul GL_COLOR_INDEX, GL_BITMAP, 0, 0); 1450278e76832fc26678592368b7b89bfddc137e0e93Brian Paul const GLint srcStride = _mesa_image_row_stride(unpack, width, 1451278e76832fc26678592368b7b89bfddc137e0e93Brian Paul GL_COLOR_INDEX, GL_BITMAP); 1452278e76832fc26678592368b7b89bfddc137e0e93Brian Paul GLint row, col; 1453278e76832fc26678592368b7b89bfddc137e0e93Brian Paul 1454278e76832fc26678592368b7b89bfddc137e0e93Brian Paul#define SET_PIXEL(COL, ROW) \ 1455278e76832fc26678592368b7b89bfddc137e0e93Brian Paul destBuffer[(ROW) * destStride + (COL)] = onValue; 1456278e76832fc26678592368b7b89bfddc137e0e93Brian Paul 1457278e76832fc26678592368b7b89bfddc137e0e93Brian Paul for (row = 0; row < height; row++) { 1458278e76832fc26678592368b7b89bfddc137e0e93Brian Paul const GLubyte *src = srcRow; 1459278e76832fc26678592368b7b89bfddc137e0e93Brian Paul 1460278e76832fc26678592368b7b89bfddc137e0e93Brian Paul if (unpack->LsbFirst) { 1461278e76832fc26678592368b7b89bfddc137e0e93Brian Paul /* Lsb first */ 1462278e76832fc26678592368b7b89bfddc137e0e93Brian Paul GLubyte mask = 1U << (unpack->SkipPixels & 0x7); 1463278e76832fc26678592368b7b89bfddc137e0e93Brian Paul for (col = 0; col < width; col++) { 1464278e76832fc26678592368b7b89bfddc137e0e93Brian Paul 1465278e76832fc26678592368b7b89bfddc137e0e93Brian Paul if (*src & mask) { 1466278e76832fc26678592368b7b89bfddc137e0e93Brian Paul SET_PIXEL(col, row); 1467278e76832fc26678592368b7b89bfddc137e0e93Brian Paul } 1468278e76832fc26678592368b7b89bfddc137e0e93Brian Paul 1469278e76832fc26678592368b7b89bfddc137e0e93Brian Paul if (mask == 128U) { 1470278e76832fc26678592368b7b89bfddc137e0e93Brian Paul src++; 1471278e76832fc26678592368b7b89bfddc137e0e93Brian Paul mask = 1U; 1472278e76832fc26678592368b7b89bfddc137e0e93Brian Paul } 1473278e76832fc26678592368b7b89bfddc137e0e93Brian Paul else { 1474278e76832fc26678592368b7b89bfddc137e0e93Brian Paul mask = mask << 1; 1475278e76832fc26678592368b7b89bfddc137e0e93Brian Paul } 1476278e76832fc26678592368b7b89bfddc137e0e93Brian Paul } 1477278e76832fc26678592368b7b89bfddc137e0e93Brian Paul 1478278e76832fc26678592368b7b89bfddc137e0e93Brian Paul /* get ready for next row */ 1479278e76832fc26678592368b7b89bfddc137e0e93Brian Paul if (mask != 1) 1480278e76832fc26678592368b7b89bfddc137e0e93Brian Paul src++; 1481278e76832fc26678592368b7b89bfddc137e0e93Brian Paul } 1482278e76832fc26678592368b7b89bfddc137e0e93Brian Paul else { 1483278e76832fc26678592368b7b89bfddc137e0e93Brian Paul /* Msb first */ 1484278e76832fc26678592368b7b89bfddc137e0e93Brian Paul GLubyte mask = 128U >> (unpack->SkipPixels & 0x7); 1485278e76832fc26678592368b7b89bfddc137e0e93Brian Paul for (col = 0; col < width; col++) { 1486278e76832fc26678592368b7b89bfddc137e0e93Brian Paul 1487278e76832fc26678592368b7b89bfddc137e0e93Brian Paul if (*src & mask) { 1488278e76832fc26678592368b7b89bfddc137e0e93Brian Paul SET_PIXEL(col, row); 1489278e76832fc26678592368b7b89bfddc137e0e93Brian Paul } 1490278e76832fc26678592368b7b89bfddc137e0e93Brian Paul 1491278e76832fc26678592368b7b89bfddc137e0e93Brian Paul if (mask == 1U) { 1492278e76832fc26678592368b7b89bfddc137e0e93Brian Paul src++; 1493278e76832fc26678592368b7b89bfddc137e0e93Brian Paul mask = 128U; 1494278e76832fc26678592368b7b89bfddc137e0e93Brian Paul } 1495278e76832fc26678592368b7b89bfddc137e0e93Brian Paul else { 1496278e76832fc26678592368b7b89bfddc137e0e93Brian Paul mask = mask >> 1; 1497278e76832fc26678592368b7b89bfddc137e0e93Brian Paul } 1498278e76832fc26678592368b7b89bfddc137e0e93Brian Paul } 1499278e76832fc26678592368b7b89bfddc137e0e93Brian Paul 1500278e76832fc26678592368b7b89bfddc137e0e93Brian Paul /* get ready for next row */ 1501278e76832fc26678592368b7b89bfddc137e0e93Brian Paul if (mask != 128) 1502278e76832fc26678592368b7b89bfddc137e0e93Brian Paul src++; 1503278e76832fc26678592368b7b89bfddc137e0e93Brian Paul } 1504278e76832fc26678592368b7b89bfddc137e0e93Brian Paul 1505278e76832fc26678592368b7b89bfddc137e0e93Brian Paul srcRow += srcStride; 1506278e76832fc26678592368b7b89bfddc137e0e93Brian Paul } /* row */ 1507278e76832fc26678592368b7b89bfddc137e0e93Brian Paul 1508278e76832fc26678592368b7b89bfddc137e0e93Brian Paul#undef SET_PIXEL 1509278e76832fc26678592368b7b89bfddc137e0e93Brian Paul} 1510278e76832fc26678592368b7b89bfddc137e0e93Brian Paul 1511278e76832fc26678592368b7b89bfddc137e0e93Brian Paul 15124084e3c215d4db6370422fc718217bade7445618Brian Paul 151332a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul 151432a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul/** 151532a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul * Convert an array of RGBA colors from one datatype to another. 15164bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul * NOTE: src may equal dst. In that case, we use a temporary buffer. 151732a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul */ 151832a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paulvoid 151932a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul_mesa_convert_colors(GLenum srcType, const GLvoid *src, 152032a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul GLenum dstType, GLvoid *dst, 152132a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul GLuint count, const GLubyte mask[]) 152232a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul{ 15231614de4045c36ab6ec060e3bd0d1f3394d05b91eBrian Paul GLuint *tempBuffer; 15244bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul const GLboolean useTemp = (src == dst); 15254bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul 15261614de4045c36ab6ec060e3bd0d1f3394d05b91eBrian Paul tempBuffer = malloc(count * MAX_PIXEL_BYTES); 15271614de4045c36ab6ec060e3bd0d1f3394d05b91eBrian Paul if (!tempBuffer) 15281614de4045c36ab6ec060e3bd0d1f3394d05b91eBrian Paul return; 15291614de4045c36ab6ec060e3bd0d1f3394d05b91eBrian Paul 153032a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul ASSERT(srcType != dstType); 153132a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul 153232a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul switch (srcType) { 153332a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul case GL_UNSIGNED_BYTE: 153432a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul if (dstType == GL_UNSIGNED_SHORT) { 15354bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul const GLubyte (*src1)[4] = (const GLubyte (*)[4]) src; 15364bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul GLushort (*dst2)[4] = (GLushort (*)[4]) (useTemp ? tempBuffer : dst); 153732a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul GLuint i; 153832a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul for (i = 0; i < count; i++) { 153932a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul if (!mask || mask[i]) { 15404bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul dst2[i][RCOMP] = UBYTE_TO_USHORT(src1[i][RCOMP]); 15414bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul dst2[i][GCOMP] = UBYTE_TO_USHORT(src1[i][GCOMP]); 15424bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul dst2[i][BCOMP] = UBYTE_TO_USHORT(src1[i][BCOMP]); 15434bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul dst2[i][ACOMP] = UBYTE_TO_USHORT(src1[i][ACOMP]); 154432a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul } 154532a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul } 15464bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul if (useTemp) 1547c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke memcpy(dst, tempBuffer, count * 4 * sizeof(GLushort)); 154832a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul } 154932a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul else { 15504bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul const GLubyte (*src1)[4] = (const GLubyte (*)[4]) src; 15514bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul GLfloat (*dst4)[4] = (GLfloat (*)[4]) (useTemp ? tempBuffer : dst); 155232a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul GLuint i; 155332a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul ASSERT(dstType == GL_FLOAT); 155432a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul for (i = 0; i < count; i++) { 155532a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul if (!mask || mask[i]) { 15564bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul dst4[i][RCOMP] = UBYTE_TO_FLOAT(src1[i][RCOMP]); 15574bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul dst4[i][GCOMP] = UBYTE_TO_FLOAT(src1[i][GCOMP]); 15584bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul dst4[i][BCOMP] = UBYTE_TO_FLOAT(src1[i][BCOMP]); 15594bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul dst4[i][ACOMP] = UBYTE_TO_FLOAT(src1[i][ACOMP]); 156032a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul } 156132a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul } 15624bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul if (useTemp) 1563c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke memcpy(dst, tempBuffer, count * 4 * sizeof(GLfloat)); 156432a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul } 156532a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul break; 156632a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul case GL_UNSIGNED_SHORT: 156732a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul if (dstType == GL_UNSIGNED_BYTE) { 15684bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul const GLushort (*src2)[4] = (const GLushort (*)[4]) src; 15694bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul GLubyte (*dst1)[4] = (GLubyte (*)[4]) (useTemp ? tempBuffer : dst); 157032a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul GLuint i; 157132a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul for (i = 0; i < count; i++) { 157232a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul if (!mask || mask[i]) { 15734bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul dst1[i][RCOMP] = USHORT_TO_UBYTE(src2[i][RCOMP]); 15744bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul dst1[i][GCOMP] = USHORT_TO_UBYTE(src2[i][GCOMP]); 15754bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul dst1[i][BCOMP] = USHORT_TO_UBYTE(src2[i][BCOMP]); 15764bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul dst1[i][ACOMP] = USHORT_TO_UBYTE(src2[i][ACOMP]); 157732a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul } 157832a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul } 15794bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul if (useTemp) 1580c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke memcpy(dst, tempBuffer, count * 4 * sizeof(GLubyte)); 158132a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul } 158232a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul else { 15834bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul const GLushort (*src2)[4] = (const GLushort (*)[4]) src; 15844bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul GLfloat (*dst4)[4] = (GLfloat (*)[4]) (useTemp ? tempBuffer : dst); 158532a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul GLuint i; 158632a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul ASSERT(dstType == GL_FLOAT); 158732a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul for (i = 0; i < count; i++) { 158832a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul if (!mask || mask[i]) { 15894bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul dst4[i][RCOMP] = USHORT_TO_FLOAT(src2[i][RCOMP]); 15904bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul dst4[i][GCOMP] = USHORT_TO_FLOAT(src2[i][GCOMP]); 15914bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul dst4[i][BCOMP] = USHORT_TO_FLOAT(src2[i][BCOMP]); 15924bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul dst4[i][ACOMP] = USHORT_TO_FLOAT(src2[i][ACOMP]); 159332a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul } 159432a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul } 15954bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul if (useTemp) 1596c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke memcpy(dst, tempBuffer, count * 4 * sizeof(GLfloat)); 159732a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul } 159832a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul break; 159932a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul case GL_FLOAT: 160032a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul if (dstType == GL_UNSIGNED_BYTE) { 16014bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul const GLfloat (*src4)[4] = (const GLfloat (*)[4]) src; 16024bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul GLubyte (*dst1)[4] = (GLubyte (*)[4]) (useTemp ? tempBuffer : dst); 160332a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul GLuint i; 160432a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul for (i = 0; i < count; i++) { 160581a86aea4f0990a1b8795f9e00e7a6c4ba368281Dave Airlie if (!mask || mask[i]) 160681a86aea4f0990a1b8795f9e00e7a6c4ba368281Dave Airlie _mesa_unclamped_float_rgba_to_ubyte(dst1[i], src4[i]); 160732a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul } 16084bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul if (useTemp) 1609c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke memcpy(dst, tempBuffer, count * 4 * sizeof(GLubyte)); 161032a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul } 161132a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul else { 16124bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul const GLfloat (*src4)[4] = (const GLfloat (*)[4]) src; 16134bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul GLushort (*dst2)[4] = (GLushort (*)[4]) (useTemp ? tempBuffer : dst); 161432a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul GLuint i; 161532a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul ASSERT(dstType == GL_UNSIGNED_SHORT); 161632a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul for (i = 0; i < count; i++) { 161732a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul if (!mask || mask[i]) { 16184bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul UNCLAMPED_FLOAT_TO_USHORT(dst2[i][RCOMP], src4[i][RCOMP]); 16194bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul UNCLAMPED_FLOAT_TO_USHORT(dst2[i][GCOMP], src4[i][GCOMP]); 16204bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul UNCLAMPED_FLOAT_TO_USHORT(dst2[i][BCOMP], src4[i][BCOMP]); 16214bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul UNCLAMPED_FLOAT_TO_USHORT(dst2[i][ACOMP], src4[i][ACOMP]); 162232a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul } 162332a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul } 16244bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul if (useTemp) 1625c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke memcpy(dst, tempBuffer, count * 4 * sizeof(GLushort)); 162632a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul } 162732a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul break; 162832a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul default: 162932a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul _mesa_problem(NULL, "Invalid datatype in _mesa_convert_colors"); 163032a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul } 16311614de4045c36ab6ec060e3bd0d1f3394d05b91eBrian Paul 16321614de4045c36ab6ec060e3bd0d1f3394d05b91eBrian Paul free(tempBuffer); 163332a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul} 163432a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul 163532a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul 163632a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul 163732a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul 16384084e3c215d4db6370422fc718217bade7445618Brian Paul/** 163932a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul * Perform basic clipping for glDrawPixels. The image's position and size 164032a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul * and the unpack SkipPixels and SkipRows are adjusted so that the image 164132a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul * region is entirely within the window and scissor bounds. 164232a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul * NOTE: this will only work when glPixelZoom is (1, 1) or (1, -1). 164332a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul * If Pixel.ZoomY is -1, *destY will be changed to be the first row which 164432a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul * we'll actually write. Beforehand, *destY-1 is the first drawing row. 16454084e3c215d4db6370422fc718217bade7445618Brian Paul * 16464084e3c215d4db6370422fc718217bade7445618Brian Paul * \return GL_TRUE if image is ready for drawing or 16474084e3c215d4db6370422fc718217bade7445618Brian Paul * GL_FALSE if image was completely clipped away (draw nothing) 16484084e3c215d4db6370422fc718217bade7445618Brian Paul */ 16494084e3c215d4db6370422fc718217bade7445618Brian PaulGLboolean 1650f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_clip_drawpixels(const struct gl_context *ctx, 16514084e3c215d4db6370422fc718217bade7445618Brian Paul GLint *destX, GLint *destY, 16524084e3c215d4db6370422fc718217bade7445618Brian Paul GLsizei *width, GLsizei *height, 16531ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul struct gl_pixelstore_attrib *unpack) 16544084e3c215d4db6370422fc718217bade7445618Brian Paul{ 165531aca27c08d6a385c595d34fe4ee06390bf5b0e8Kristian Høgsberg const struct gl_framebuffer *buffer = ctx->DrawBuffer; 16564084e3c215d4db6370422fc718217bade7445618Brian Paul 16571ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul if (unpack->RowLength == 0) { 16581ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul unpack->RowLength = *width; 16591ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul } 16601ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul 166132a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul ASSERT(ctx->Pixel.ZoomX == 1.0F); 166232a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul ASSERT(ctx->Pixel.ZoomY == 1.0F || ctx->Pixel.ZoomY == -1.0F); 1663e677da9e54e836609f94a3aaca27d68a0bacbb96Brian Paul 16644084e3c215d4db6370422fc718217bade7445618Brian Paul /* left clipping */ 16654084e3c215d4db6370422fc718217bade7445618Brian Paul if (*destX < buffer->_Xmin) { 16661ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul unpack->SkipPixels += (buffer->_Xmin - *destX); 16674084e3c215d4db6370422fc718217bade7445618Brian Paul *width -= (buffer->_Xmin - *destX); 16684084e3c215d4db6370422fc718217bade7445618Brian Paul *destX = buffer->_Xmin; 16694084e3c215d4db6370422fc718217bade7445618Brian Paul } 16704084e3c215d4db6370422fc718217bade7445618Brian Paul /* right clipping */ 16714084e3c215d4db6370422fc718217bade7445618Brian Paul if (*destX + *width > buffer->_Xmax) 16724084e3c215d4db6370422fc718217bade7445618Brian Paul *width -= (*destX + *width - buffer->_Xmax); 16734084e3c215d4db6370422fc718217bade7445618Brian Paul 16744084e3c215d4db6370422fc718217bade7445618Brian Paul if (*width <= 0) 16754084e3c215d4db6370422fc718217bade7445618Brian Paul return GL_FALSE; 16764084e3c215d4db6370422fc718217bade7445618Brian Paul 167732a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul if (ctx->Pixel.ZoomY == 1.0F) { 167832a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul /* bottom clipping */ 167932a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul if (*destY < buffer->_Ymin) { 168032a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul unpack->SkipRows += (buffer->_Ymin - *destY); 168132a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul *height -= (buffer->_Ymin - *destY); 168232a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul *destY = buffer->_Ymin; 168332a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul } 168432a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul /* top clipping */ 168532a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul if (*destY + *height > buffer->_Ymax) 168632a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul *height -= (*destY + *height - buffer->_Ymax); 168732a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul } 168832a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul else { /* upside down */ 168932a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul /* top clipping */ 169032a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul if (*destY > buffer->_Ymax) { 169132a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul unpack->SkipRows += (*destY - buffer->_Ymax); 169232a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul *height -= (*destY - buffer->_Ymax); 169332a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul *destY = buffer->_Ymax; 169432a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul } 169532a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul /* bottom clipping */ 169632a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul if (*destY - *height < buffer->_Ymin) 169732a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul *height -= (buffer->_Ymin - (*destY - *height)); 169832a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul /* adjust destY so it's the first row to write to */ 169932a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul (*destY)--; 17004084e3c215d4db6370422fc718217bade7445618Brian Paul } 17014084e3c215d4db6370422fc718217bade7445618Brian Paul 17024084e3c215d4db6370422fc718217bade7445618Brian Paul if (*height <= 0) 17037aeaca33c331f70d507fc83583b13b8d9fc3e847Ben Skeggs return GL_FALSE; 17044084e3c215d4db6370422fc718217bade7445618Brian Paul 17054084e3c215d4db6370422fc718217bade7445618Brian Paul return GL_TRUE; 17064084e3c215d4db6370422fc718217bade7445618Brian Paul} 17074084e3c215d4db6370422fc718217bade7445618Brian Paul 17084084e3c215d4db6370422fc718217bade7445618Brian Paul 17094084e3c215d4db6370422fc718217bade7445618Brian Paul/** 17104084e3c215d4db6370422fc718217bade7445618Brian Paul * Perform clipping for glReadPixels. The image's window position 17111ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul * and size, and the pack skipPixels, skipRows and rowLength are adjusted 17121ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul * so that the image region is entirely within the window bounds. 17134084e3c215d4db6370422fc718217bade7445618Brian Paul * Note: this is different from _mesa_clip_drawpixels() in that the 17141ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul * scissor box is ignored, and we use the bounds of the current readbuffer 17151ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul * surface. 17164084e3c215d4db6370422fc718217bade7445618Brian Paul * 1717d44fbd3c9d976763ec1f4a8f0314f294be8c14f4Brian Paul * \return GL_TRUE if region to read is in bounds 1718d44fbd3c9d976763ec1f4a8f0314f294be8c14f4Brian Paul * GL_FALSE if region is completely out of bounds (nothing to read) 17194084e3c215d4db6370422fc718217bade7445618Brian Paul */ 17204084e3c215d4db6370422fc718217bade7445618Brian PaulGLboolean 1721f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_clip_readpixels(const struct gl_context *ctx, 17224084e3c215d4db6370422fc718217bade7445618Brian Paul GLint *srcX, GLint *srcY, 17234084e3c215d4db6370422fc718217bade7445618Brian Paul GLsizei *width, GLsizei *height, 17241ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul struct gl_pixelstore_attrib *pack) 17254084e3c215d4db6370422fc718217bade7445618Brian Paul{ 172631aca27c08d6a385c595d34fe4ee06390bf5b0e8Kristian Høgsberg const struct gl_framebuffer *buffer = ctx->ReadBuffer; 17274084e3c215d4db6370422fc718217bade7445618Brian Paul 17281ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul if (pack->RowLength == 0) { 17291ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul pack->RowLength = *width; 17301ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul } 17311ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul 17324084e3c215d4db6370422fc718217bade7445618Brian Paul /* left clipping */ 17334084e3c215d4db6370422fc718217bade7445618Brian Paul if (*srcX < 0) { 17341ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul pack->SkipPixels += (0 - *srcX); 17354084e3c215d4db6370422fc718217bade7445618Brian Paul *width -= (0 - *srcX); 17364084e3c215d4db6370422fc718217bade7445618Brian Paul *srcX = 0; 17374084e3c215d4db6370422fc718217bade7445618Brian Paul } 17384084e3c215d4db6370422fc718217bade7445618Brian Paul /* right clipping */ 1739a760ccf6d8a1f94d505b4c211ff4c30bc1d325a8Brian Paul if (*srcX + *width > (GLsizei) buffer->Width) 17404084e3c215d4db6370422fc718217bade7445618Brian Paul *width -= (*srcX + *width - buffer->Width); 17414084e3c215d4db6370422fc718217bade7445618Brian Paul 17424084e3c215d4db6370422fc718217bade7445618Brian Paul if (*width <= 0) 17434084e3c215d4db6370422fc718217bade7445618Brian Paul return GL_FALSE; 17444084e3c215d4db6370422fc718217bade7445618Brian Paul 17454084e3c215d4db6370422fc718217bade7445618Brian Paul /* bottom clipping */ 17464084e3c215d4db6370422fc718217bade7445618Brian Paul if (*srcY < 0) { 17471ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul pack->SkipRows += (0 - *srcY); 17484084e3c215d4db6370422fc718217bade7445618Brian Paul *height -= (0 - *srcY); 17494084e3c215d4db6370422fc718217bade7445618Brian Paul *srcY = 0; 17504084e3c215d4db6370422fc718217bade7445618Brian Paul } 17514084e3c215d4db6370422fc718217bade7445618Brian Paul /* top clipping */ 1752a760ccf6d8a1f94d505b4c211ff4c30bc1d325a8Brian Paul if (*srcY + *height > (GLsizei) buffer->Height) 17534084e3c215d4db6370422fc718217bade7445618Brian Paul *height -= (*srcY + *height - buffer->Height); 17544084e3c215d4db6370422fc718217bade7445618Brian Paul 17554084e3c215d4db6370422fc718217bade7445618Brian Paul if (*height <= 0) 17567aeaca33c331f70d507fc83583b13b8d9fc3e847Ben Skeggs return GL_FALSE; 17574084e3c215d4db6370422fc718217bade7445618Brian Paul 17584084e3c215d4db6370422fc718217bade7445618Brian Paul return GL_TRUE; 17594084e3c215d4db6370422fc718217bade7445618Brian Paul} 17604084e3c215d4db6370422fc718217bade7445618Brian Paul 1761ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 1762ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul/** 176303bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul * Do clipping for a glCopyTexSubImage call. 176403bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul * The framebuffer source region might extend outside the framebuffer 176503bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul * bounds. Clip the source region against the framebuffer bounds and 176603bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul * adjust the texture/dest position and size accordingly. 176703bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul * 176803bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul * \return GL_FALSE if region is totally clipped, GL_TRUE otherwise. 176903bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul */ 177003bafd1f9fa000abdb794b2ae344a68840c83201Brian PaulGLboolean 1771f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_clip_copytexsubimage(const struct gl_context *ctx, 177203bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul GLint *destX, GLint *destY, 177303bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul GLint *srcX, GLint *srcY, 177403bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul GLsizei *width, GLsizei *height) 177503bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul{ 177603bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul const struct gl_framebuffer *fb = ctx->ReadBuffer; 177703bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul const GLint srcX0 = *srcX, srcY0 = *srcY; 177803bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul 1779d01c44aacaeabe1dd187163f9e204f40401698bcEric Anholt if (_mesa_clip_to_region(0, 0, fb->Width, fb->Height, 178003bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul srcX, srcY, width, height)) { 178103bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul *destX = *destX + *srcX - srcX0; 178203bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul *destY = *destY + *srcY - srcY0; 178303bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul 178403bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul return GL_TRUE; 178503bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul } 178603bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul else { 178703bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul return GL_FALSE; 178803bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul } 178903bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul} 179003bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul 179103bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul 179203bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul 179303bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul/** 1794ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * Clip the rectangle defined by (x, y, width, height) against the bounds 1795ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * specified by [xmin, xmax) and [ymin, ymax). 1796ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * \return GL_FALSE if rect is totally clipped, GL_TRUE otherwise. 1797ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul */ 1798ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian PaulGLboolean 1799ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul_mesa_clip_to_region(GLint xmin, GLint ymin, 1800ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLint xmax, GLint ymax, 1801ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLint *x, GLint *y, 1802ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLsizei *width, GLsizei *height ) 1803ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul{ 1804ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul /* left clipping */ 1805ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (*x < xmin) { 1806ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul *width -= (xmin - *x); 1807ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul *x = xmin; 1808ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 1809ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 1810ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul /* right clipping */ 1811ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (*x + *width > xmax) 1812aa09e0a1d532d0de2e094957d0509a7f60ebeafaEric Anholt *width -= (*x + *width - xmax); 1813ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 1814ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (*width <= 0) 1815ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul return GL_FALSE; 1816ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 1817ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul /* bottom (or top) clipping */ 1818ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (*y < ymin) { 1819ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul *height -= (ymin - *y); 1820ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul *y = ymin; 1821ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul } 1822ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 1823ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul /* top (or bottom) clipping */ 1824ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (*y + *height > ymax) 1825aa09e0a1d532d0de2e094957d0509a7f60ebeafaEric Anholt *height -= (*y + *height - ymax); 1826ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 1827ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul if (*height <= 0) 1828ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul return GL_FALSE; 1829ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 1830ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul return GL_TRUE; 1831ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul} 1832727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul 1833727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul 1834727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul/** 1835727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul * Clip dst coords against Xmax (or Ymax). 1836727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul */ 18379520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline void 1838727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paulclip_right_or_top(GLint *srcX0, GLint *srcX1, 1839727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul GLint *dstX0, GLint *dstX1, 1840727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul GLint maxValue) 1841727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul{ 1842727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul GLfloat t, bias; 1843727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul 1844727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul if (*dstX1 > maxValue) { 1845727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul /* X1 outside right edge */ 1846727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul ASSERT(*dstX0 < maxValue); /* X0 should be inside right edge */ 1847727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul t = (GLfloat) (maxValue - *dstX0) / (GLfloat) (*dstX1 - *dstX0); 1848727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul /* chop off [t, 1] part */ 1849727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul ASSERT(t >= 0.0 && t <= 1.0); 1850727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul *dstX1 = maxValue; 1851b30898f4ab533085d97a33638ad0a1cf9ddb1d67Karl Schultz bias = (*srcX0 < *srcX1) ? 0.5F : -0.5F; 1852727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul *srcX1 = *srcX0 + (GLint) (t * (*srcX1 - *srcX0) + bias); 1853727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul } 1854727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul else if (*dstX0 > maxValue) { 1855727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul /* X0 outside right edge */ 1856727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul ASSERT(*dstX1 < maxValue); /* X1 should be inside right edge */ 1857727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul t = (GLfloat) (maxValue - *dstX1) / (GLfloat) (*dstX0 - *dstX1); 1858727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul /* chop off [t, 1] part */ 1859727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul ASSERT(t >= 0.0 && t <= 1.0); 1860727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul *dstX0 = maxValue; 1861b30898f4ab533085d97a33638ad0a1cf9ddb1d67Karl Schultz bias = (*srcX0 < *srcX1) ? -0.5F : 0.5F; 1862727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul *srcX0 = *srcX1 + (GLint) (t * (*srcX0 - *srcX1) + bias); 1863727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul } 1864727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul} 1865727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul 1866727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul 1867727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul/** 1868727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul * Clip dst coords against Xmin (or Ymin). 1869727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul */ 18709520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline void 1871727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paulclip_left_or_bottom(GLint *srcX0, GLint *srcX1, 1872727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul GLint *dstX0, GLint *dstX1, 1873727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul GLint minValue) 1874727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul{ 1875727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul GLfloat t, bias; 1876727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul 1877727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul if (*dstX0 < minValue) { 1878727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul /* X0 outside left edge */ 1879727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul ASSERT(*dstX1 > minValue); /* X1 should be inside left edge */ 1880727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul t = (GLfloat) (minValue - *dstX0) / (GLfloat) (*dstX1 - *dstX0); 1881727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul /* chop off [0, t] part */ 1882727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul ASSERT(t >= 0.0 && t <= 1.0); 1883727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul *dstX0 = minValue; 1884b30898f4ab533085d97a33638ad0a1cf9ddb1d67Karl Schultz bias = (*srcX0 < *srcX1) ? 0.5F : -0.5F; /* flipped??? */ 1885727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul *srcX0 = *srcX0 + (GLint) (t * (*srcX1 - *srcX0) + bias); 1886727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul } 1887727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul else if (*dstX1 < minValue) { 1888727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul /* X1 outside left edge */ 1889727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul ASSERT(*dstX0 > minValue); /* X0 should be inside left edge */ 1890727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul t = (GLfloat) (minValue - *dstX1) / (GLfloat) (*dstX0 - *dstX1); 1891727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul /* chop off [0, t] part */ 1892727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul ASSERT(t >= 0.0 && t <= 1.0); 1893727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul *dstX1 = minValue; 1894b30898f4ab533085d97a33638ad0a1cf9ddb1d67Karl Schultz bias = (*srcX0 < *srcX1) ? 0.5F : -0.5F; 1895727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul *srcX1 = *srcX1 + (GLint) (t * (*srcX0 - *srcX1) + bias); 1896727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul } 1897727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul} 1898727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul 1899727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul 1900727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul/** 1901727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul * Do clipping of blit src/dest rectangles. 1902727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul * The dest rect is clipped against both the buffer bounds and scissor bounds. 1903727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul * The src rect is just clipped against the buffer bounds. 1904727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul * 1905727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul * When either the src or dest rect is clipped, the other is also clipped 1906727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul * proportionately! 1907727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul * 1908727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul * Note that X0 need not be less than X1 (same for Y) for either the source 1909727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul * and dest rects. That makes the clipping a little trickier. 1910727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul * 1911727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul * \return GL_TRUE if anything is left to draw, GL_FALSE if totally clipped 1912727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul */ 1913727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian PaulGLboolean 1914f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_clip_blit(struct gl_context *ctx, 1915727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul GLint *srcX0, GLint *srcY0, GLint *srcX1, GLint *srcY1, 1916727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul GLint *dstX0, GLint *dstY0, GLint *dstX1, GLint *dstY1) 1917727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul{ 1918727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul const GLint srcXmin = 0; 1919727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul const GLint srcXmax = ctx->ReadBuffer->Width; 1920727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul const GLint srcYmin = 0; 1921727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul const GLint srcYmax = ctx->ReadBuffer->Height; 1922727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul 1923727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul /* these include scissor bounds */ 1924727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul const GLint dstXmin = ctx->DrawBuffer->_Xmin; 1925727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul const GLint dstXmax = ctx->DrawBuffer->_Xmax; 1926727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul const GLint dstYmin = ctx->DrawBuffer->_Ymin; 1927727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul const GLint dstYmax = ctx->DrawBuffer->_Ymax; 1928727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul 1929727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul /* 1930727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul printf("PreClipX: src: %d .. %d dst: %d .. %d\n", 1931727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul *srcX0, *srcX1, *dstX0, *dstX1); 1932727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul printf("PreClipY: src: %d .. %d dst: %d .. %d\n", 1933727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul *srcY0, *srcY1, *dstY0, *dstY1); 1934727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul */ 1935727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul 1936727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul /* trivial rejection tests */ 1937727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul if (*dstX0 == *dstX1) 1938727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul return GL_FALSE; /* no width */ 1939727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul if (*dstX0 <= dstXmin && *dstX1 <= dstXmin) 1940727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul return GL_FALSE; /* totally out (left) of bounds */ 1941727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul if (*dstX0 >= dstXmax && *dstX1 >= dstXmax) 1942727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul return GL_FALSE; /* totally out (right) of bounds */ 1943727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul 1944727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul if (*dstY0 == *dstY1) 1945727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul return GL_FALSE; 1946727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul if (*dstY0 <= dstYmin && *dstY1 <= dstYmin) 1947727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul return GL_FALSE; 1948727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul if (*dstY0 >= dstYmax && *dstY1 >= dstYmax) 1949727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul return GL_FALSE; 1950727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul 1951727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul if (*srcX0 == *srcX1) 1952727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul return GL_FALSE; 1953727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul if (*srcX0 <= srcXmin && *srcX1 <= srcXmin) 1954727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul return GL_FALSE; 1955727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul if (*srcX0 >= srcXmax && *srcX1 >= srcXmax) 1956727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul return GL_FALSE; 1957727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul 1958727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul if (*srcY0 == *srcY1) 1959727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul return GL_FALSE; 1960727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul if (*srcY0 <= srcYmin && *srcY1 <= srcYmin) 1961727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul return GL_FALSE; 1962727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul if (*srcY0 >= srcYmax && *srcY1 >= srcYmax) 1963727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul return GL_FALSE; 1964727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul 1965727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul /* 1966727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul * dest clip 1967727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul */ 1968727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul clip_right_or_top(srcX0, srcX1, dstX0, dstX1, dstXmax); 1969727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul clip_right_or_top(srcY0, srcY1, dstY0, dstY1, dstYmax); 1970727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul clip_left_or_bottom(srcX0, srcX1, dstX0, dstX1, dstXmin); 1971727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul clip_left_or_bottom(srcY0, srcY1, dstY0, dstY1, dstYmin); 1972727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul 1973727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul /* 1974727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul * src clip (just swap src/dst values from above) 1975727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul */ 1976727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul clip_right_or_top(dstX0, dstX1, srcX0, srcX1, srcXmax); 1977727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul clip_right_or_top(dstY0, dstY1, srcY0, srcY1, srcYmax); 1978727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul clip_left_or_bottom(dstX0, dstX1, srcX0, srcX1, srcXmin); 1979727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul clip_left_or_bottom(dstY0, dstY1, srcY0, srcY1, srcYmin); 1980727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul 1981727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul /* 1982727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul printf("PostClipX: src: %d .. %d dst: %d .. %d\n", 1983727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul *srcX0, *srcX1, *dstX0, *dstX1); 1984727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul printf("PostClipY: src: %d .. %d dst: %d .. %d\n", 1985727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul *srcY0, *srcY1, *dstY0, *dstY1); 1986727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul */ 1987727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul 1988727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul ASSERT(*dstX0 >= dstXmin); 1989727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul ASSERT(*dstX0 <= dstXmax); 1990727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul ASSERT(*dstX1 >= dstXmin); 1991727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul ASSERT(*dstX1 <= dstXmax); 1992727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul 1993727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul ASSERT(*dstY0 >= dstYmin); 1994727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul ASSERT(*dstY0 <= dstYmax); 1995727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul ASSERT(*dstY1 >= dstYmin); 1996727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul ASSERT(*dstY1 <= dstYmax); 1997727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul 1998727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul ASSERT(*srcX0 >= srcXmin); 1999727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul ASSERT(*srcX0 <= srcXmax); 2000727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul ASSERT(*srcX1 >= srcXmin); 2001727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul ASSERT(*srcX1 <= srcXmax); 2002727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul 2003727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul ASSERT(*srcY0 >= srcYmin); 2004727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul ASSERT(*srcY0 <= srcYmax); 2005727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul ASSERT(*srcY1 >= srcYmin); 2006727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul ASSERT(*srcY1 <= srcYmax); 2007727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul 2008727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul return GL_TRUE; 2009727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul} 2010