1cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/* 2dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008) 3dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved. 4dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * 5dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * Permission is hereby granted, free of charge, to any person obtaining a 6dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * copy of this software and associated documentation files (the "Software"), 7dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * to deal in the Software without restriction, including without limitation 8dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * and/or sell copies of the Software, and to permit persons to whom the 10dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * Software is furnished to do so, subject to the following conditions: 11dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * 12dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * The above copyright notice including the dates of first publication and 13dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * either this permission notice or a reference to 14dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * http://oss.sgi.com/projects/FreeB/ 15dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * shall be included in all copies or substantial portions of the Software. 16dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * 17dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 21dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 22dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * SOFTWARE. 24dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * 25dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * Except as contained in this notice, the name of Silicon Graphics, Inc. 26dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * shall not be used in advertising or otherwise to promote the sale, use or 27dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * other dealings in this Software without prior written authorization from 28dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * Silicon Graphics, Inc. 29dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson */ 30cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 31cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include <GL/gl.h> 32f2ce358331eeab7973e157fbe61cf6f23fc02f46Brian Paul#include "glxclient.h" 33cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 34cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/* 35cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Return the number of elements per group of a specified format 36cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/ 37f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, KristófGLint 38f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf__glElementsPerGroup(GLenum format, GLenum type) 39cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 40f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf /* 41cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** To make row length computation valid for image extraction, 42cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** packed pixel types assume elements per group equals one. 43cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 44f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf switch (type) { 45f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_UNSIGNED_BYTE_3_3_2: 46f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_UNSIGNED_BYTE_2_3_3_REV: 47f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_UNSIGNED_SHORT_5_6_5: 48f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_UNSIGNED_SHORT_5_6_5_REV: 49f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_UNSIGNED_SHORT_4_4_4_4: 50f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_UNSIGNED_SHORT_4_4_4_4_REV: 51f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_UNSIGNED_SHORT_5_5_5_1: 52f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_UNSIGNED_SHORT_1_5_5_5_REV: 53f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_UNSIGNED_SHORT_8_8_APPLE: 54f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_UNSIGNED_SHORT_8_8_REV_APPLE: 55f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_UNSIGNED_INT_8_8_8_8: 56f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_UNSIGNED_INT_8_8_8_8_REV: 57f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_UNSIGNED_INT_10_10_10_2: 58f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_UNSIGNED_INT_2_10_10_10_REV: 59f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_UNSIGNED_INT_24_8_NV: 60cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson return 1; 61f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf default: 62cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson break; 63f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf } 64cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 65f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf switch (format) { 66f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_RGB: 67f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_BGR: 68f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf return 3; 69bb45ab0a96bd17bc4c575ef5460d5c65acd8768bIan Romanick case GL_RG: 70f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_422_EXT: 71f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_422_REV_EXT: 72f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_422_AVERAGE_EXT: 73f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_422_REV_AVERAGE_EXT: 748937c166efaaae6e05d8c8cd30be220b577729b8Jon TURNEY case GL_DEPTH_STENCIL_NV: 75f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_YCBCR_422_APPLE: 76f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_LUMINANCE_ALPHA: 77f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf return 2; 78f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_RGBA: 79f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_BGRA: 80f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_ABGR_EXT: 81f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf return 4; 82f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_COLOR_INDEX: 83f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_STENCIL_INDEX: 84f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_DEPTH_COMPONENT: 85f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_RED: 86f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_GREEN: 87f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_BLUE: 88f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_ALPHA: 89f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_LUMINANCE: 90f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_INTENSITY: 91f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf return 1; 92f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf default: 93f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf return 0; 94f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf } 95cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 96cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 97cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/* 98cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Return the number of bytes per element, based on the element type (other 99cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** than GL_BITMAP). 100cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/ 101f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, KristófGLint 102f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf__glBytesPerElement(GLenum type) 103cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 104f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf switch (type) { 105f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_UNSIGNED_SHORT: 106f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_SHORT: 107f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_UNSIGNED_SHORT_5_6_5: 108f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_UNSIGNED_SHORT_5_6_5_REV: 109f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_UNSIGNED_SHORT_4_4_4_4: 110f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_UNSIGNED_SHORT_4_4_4_4_REV: 111f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_UNSIGNED_SHORT_5_5_5_1: 112f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_UNSIGNED_SHORT_1_5_5_5_REV: 113f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_UNSIGNED_SHORT_8_8_APPLE: 114f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_UNSIGNED_SHORT_8_8_REV_APPLE: 115f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf return 2; 116f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_UNSIGNED_BYTE: 117f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_BYTE: 118f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_UNSIGNED_BYTE_3_3_2: 119f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_UNSIGNED_BYTE_2_3_3_REV: 120f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf return 1; 121f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_INT: 122f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_UNSIGNED_INT: 123f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_FLOAT: 124f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_UNSIGNED_INT_8_8_8_8: 125f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_UNSIGNED_INT_8_8_8_8_REV: 126f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_UNSIGNED_INT_10_10_10_2: 127f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_UNSIGNED_INT_2_10_10_10_REV: 128f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_UNSIGNED_INT_24_8_NV: 129f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf return 4; 130f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf default: 131f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf return 0; 132f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf } 133cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 134cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 135cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/* 136cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Compute memory required for internal packed array of data of given type 137cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** and format. 138cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/ 139f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, KristófGLint 140f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf__glImageSize(GLsizei width, GLsizei height, GLsizei depth, 141f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf GLenum format, GLenum type, GLenum target) 142cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 143f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf int bytes_per_row; 144f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf int components; 145cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 146f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf switch (target) { 147f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_PROXY_TEXTURE_1D: 148f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_PROXY_TEXTURE_2D: 149f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_PROXY_TEXTURE_3D: 150f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_PROXY_TEXTURE_4D_SGIS: 151f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_PROXY_TEXTURE_CUBE_MAP: 152f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_PROXY_TEXTURE_RECTANGLE_ARB: 153f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_PROXY_HISTOGRAM: 154f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_PROXY_COLOR_TABLE: 155f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_PROXY_TEXTURE_COLOR_TABLE_SGI: 156f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_PROXY_POST_CONVOLUTION_COLOR_TABLE: 157f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE: 158f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf case GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP: 159f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf return 0; 160f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf } 1615f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 162f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf if (width < 0 || height < 0 || depth < 0) { 163f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf return 0; 164f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf } 1655f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 166f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf /* 167cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** Zero is returned if either format or type are invalid. 168cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 169f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf components = __glElementsPerGroup(format, type); 170f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf if (type == GL_BITMAP) { 171f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf if (format == GL_COLOR_INDEX || format == GL_STENCIL_INDEX) { 172f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf bytes_per_row = (width + 7) >> 3; 173f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf } 174f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf else { 175f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf return 0; 176f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf } 177f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf } 178f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf else { 179f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf bytes_per_row = __glBytesPerElement(type) * width; 180f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf } 1815f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick 182f788a8ed69f2389dfd8a63a888357887a4f8cdc4RALOVICH, Kristóf return bytes_per_row * height * depth * components; 183cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 184