From: José Fonseca Date: Sun, 21 Nov 2010 00:38:30 +0000 (+0000) Subject: Handle more TexImage format types in size computation. X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=cbba9872a14f73b7dc7999ff03baa9c4d6e05cec;p=apitrace Handle more TexImage format types in size computation. --- diff --git a/glhelpers.hpp b/glhelpers.hpp index 757c334..cfd9545 100644 --- a/glhelpers.hpp +++ b/glhelpers.hpp @@ -31,21 +31,70 @@ static inline size_t __gl_image_size(GLenum format, GLenum type, GLsizei width, GLsizei height, GLsizei depth, GLint border) { - size_t bits_per_channel; - switch (type) { - case GL_UNSIGNED_BYTE: - bits_per_channel = 8; + size_t num_channels; + switch (format) { + case GL_COLOR_INDEX: + case GL_RED: + case GL_GREEN: + case GL_BLUE: + case GL_ALPHA: + case GL_INTENSITY: + case GL_DEPTH_COMPONENT: + case GL_STENCIL_INDEX: + num_channels = 1; + break; + case GL_LUMINANCE_ALPHA: + num_channels = 2; + break; + case GL_RGB: + case GL_BGR: + num_channels = 3; + break; + case GL_RGBA: + case GL_BGRA: + num_channels = 4; break; default: assert(0); - bits_per_channel = 0; + num_channels = 0; break; } size_t bits_per_pixel; - switch (format) { - case GL_RGB: - bits_per_pixel = bits_per_channel * 3; + switch (type) { + case GL_BITMAP: + bits_per_pixel = 1; + break; + case GL_BYTE: + case GL_UNSIGNED_BYTE: + bits_per_pixel = 8 * num_channels; + break; + case GL_SHORT: + case GL_UNSIGNED_SHORT: + bits_per_pixel = 16 * num_channels; + break; + case GL_INT: + case GL_UNSIGNED_INT: + case GL_FLOAT: + bits_per_pixel = 32 * num_channels; + break; + case GL_UNSIGNED_BYTE_3_3_2: + case GL_UNSIGNED_BYTE_2_3_3_REV: + case GL_UNSIGNED_SHORT_5_6_5: + case GL_UNSIGNED_SHORT_5_6_5_REV: + bits_per_pixel = 8; + break; + case GL_UNSIGNED_SHORT_4_4_4_4: + case GL_UNSIGNED_SHORT_4_4_4_4_REV: + case GL_UNSIGNED_SHORT_5_5_5_1: + case GL_UNSIGNED_SHORT_1_5_5_5_REV: + bits_per_pixel = 16; + break; + case GL_UNSIGNED_INT_8_8_8_8: + case GL_UNSIGNED_INT_8_8_8_8_REV: + case GL_UNSIGNED_INT_10_10_10_2: + case GL_UNSIGNED_INT_2_10_10_10_REV: + bits_per_pixel = 32; break; default: assert(0); @@ -53,6 +102,8 @@ __gl_image_size(GLenum format, GLenum type, GLsizei width, GLsizei height, GLsiz break; } + /* FIXME: consider glPixelStore settings */ + size_t row_stride = (width*bits_per_pixel + 7)/8; size_t slice_stride = height*row_stride;