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