diff options
Diffstat (limited to 'xc/extras/Mesa/src/image.c')
-rw-r--r-- | xc/extras/Mesa/src/image.c | 113 |
1 files changed, 92 insertions, 21 deletions
diff --git a/xc/extras/Mesa/src/image.c b/xc/extras/Mesa/src/image.c index da2e6953f..892544cce 100644 --- a/xc/extras/Mesa/src/image.c +++ b/xc/extras/Mesa/src/image.c @@ -1,9 +1,10 @@ +/* $Id: image.c,v 1.25.4.1 2003/03/30 04:50:18 ldelgass Exp $ */ /* * Mesa 3-D graphics library - * Version: 3.5 + * Version: 4.1 * - * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -23,22 +24,16 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - -#ifdef PC_HEADER -#include "all.h" -#else #include "glheader.h" #include "colormac.h" #include "context.h" #include "image.h" +#include "imports.h" #include "histogram.h" #include "macros.h" -#include "mem.h" #include "mmath.h" #include "pixel.h" #include "mtypes.h" -#endif - /* @@ -56,7 +51,9 @@ const struct gl_pixelstore_attrib _mesa_native_packing = { 0, /* ImageHeight */ 0, /* SkipImages */ GL_FALSE, /* SwapBytes */ - GL_FALSE /* LsbFirst */ + GL_FALSE, /* LsbFirst */ + GL_FALSE, /* ClientStorage */ + GL_FALSE /* Invert */ }; @@ -183,17 +180,17 @@ GLint _mesa_sizeof_packed_type( GLenum type ) case GL_UNSIGNED_BYTE_2_3_3_REV: return sizeof(GLubyte); case GL_UNSIGNED_SHORT_5_6_5: - return sizeof(GLshort); + return sizeof(GLushort); case GL_UNSIGNED_SHORT_5_6_5_REV: - return sizeof(GLshort); + return sizeof(GLushort); case GL_UNSIGNED_SHORT_4_4_4_4: - return sizeof(GLshort); + return sizeof(GLushort); case GL_UNSIGNED_SHORT_4_4_4_4_REV: - return sizeof(GLshort); + return sizeof(GLushort); case GL_UNSIGNED_SHORT_5_5_5_1: - return sizeof(GLshort); + return sizeof(GLushort); case GL_UNSIGNED_SHORT_1_5_5_5_REV: - return sizeof(GLshort); + return sizeof(GLushort); case GL_UNSIGNED_INT_8_8_8_8: return sizeof(GLuint); case GL_UNSIGNED_INT_8_8_8_8_REV: @@ -202,6 +199,9 @@ GLint _mesa_sizeof_packed_type( GLenum type ) return sizeof(GLuint); case GL_UNSIGNED_INT_2_10_10_10_REV: return sizeof(GLuint); + case GL_UNSIGNED_SHORT_8_8_MESA: + case GL_UNSIGNED_SHORT_8_8_REV_MESA: + return sizeof(GLushort); default: return -1; } @@ -244,6 +244,8 @@ GLint _mesa_components_in_format( GLenum format ) return 4; case GL_ABGR_EXT: return 4; + case GL_YCBCR_MESA: + return 2; default: return -1; } @@ -283,7 +285,7 @@ GLint _mesa_bytes_per_pixel( GLenum format, GLenum type ) case GL_UNSIGNED_SHORT_5_6_5: case GL_UNSIGNED_SHORT_5_6_5_REV: if (format == GL_RGB || format == GL_BGR) - return sizeof(GLshort); + return sizeof(GLushort); else return -1; /* error */ case GL_UNSIGNED_SHORT_4_4_4_4: @@ -302,6 +304,12 @@ GLint _mesa_bytes_per_pixel( GLenum format, GLenum type ) return sizeof(GLuint); else return -1; + case GL_UNSIGNED_SHORT_8_8_MESA: + case GL_UNSIGNED_SHORT_8_8_REV_MESA: + if (format == GL_YCBCR_MESA) + return sizeof(GLushort); + else + return -1; default: return -1; } @@ -392,6 +400,12 @@ _mesa_is_legal_format_and_type( GLenum format, GLenum type ) default: return GL_FALSE; } + case GL_YCBCR_MESA: + if (type == GL_UNSIGNED_SHORT_8_8_MESA || + type == GL_UNSIGNED_SHORT_8_8_REV_MESA) + return GL_TRUE; + else + return GL_FALSE; default: ; /* fall-through */ } @@ -475,6 +489,7 @@ _mesa_image_address( const struct gl_pixelstore_attrib *packing, else { /* Non-BITMAP data */ GLint bytes_per_pixel, bytes_per_row, remainder, bytes_per_image; + GLint topOfImage; bytes_per_pixel = _mesa_bytes_per_pixel( format, type ); @@ -490,9 +505,19 @@ _mesa_image_address( const struct gl_pixelstore_attrib *packing, bytes_per_image = bytes_per_row * rows_per_image; + if (packing->Invert) { + /* set pixel_addr to the last row */ + topOfImage = bytes_per_row * (height - 1); + bytes_per_row = -bytes_per_row; + } + else { + topOfImage = 0; + } + /* compute final pixel address */ pixel_addr = (GLubyte *) image + (skipimages + img) * bytes_per_image + + topOfImage + (skiprows + row) * bytes_per_row + (skippixels + column) * bytes_per_pixel; } @@ -513,14 +538,18 @@ _mesa_image_row_stride( const struct gl_pixelstore_attrib *packing, ASSERT(packing); if (type == GL_BITMAP) { /* BITMAP data */ + GLint bytes; if (packing->RowLength == 0) { - GLint bytes = (width + 7) / 8; - return bytes; + bytes = (width + 7) / 8; } else { - GLint bytes = (packing->RowLength + 7) / 8; - return bytes; + bytes = (packing->RowLength + 7) / 8; + } + if (packing->Invert) { + /* negate the bytes per row (negative row stride) */ + bytes = -bytes; } + return bytes; } else { /* Non-BITMAP data */ @@ -537,6 +566,8 @@ _mesa_image_row_stride( const struct gl_pixelstore_attrib *packing, remainder = bytesPerRow % packing->Alignment; if (remainder > 0) bytesPerRow += (packing->Alignment - remainder); + if (packing->Invert) + bytesPerRow = -bytesPerRow; return bytesPerRow; } } @@ -544,6 +575,46 @@ _mesa_image_row_stride( const struct gl_pixelstore_attrib *packing, /* + * Compute the stride between images in a 3D texture (in bytes) for the given + * pixel packing parameters and image width, format and type. + */ +GLint +_mesa_image_image_stride( const struct gl_pixelstore_attrib *packing, + GLint width, GLint height, + GLenum format, GLenum type ) +{ + ASSERT(packing); + ASSERT(type != GL_BITMAP); + + { + const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type); + GLint bytesPerRow, bytesPerImage, remainder; + + if (bytesPerPixel <= 0) + return -1; /* error */ + if (packing->RowLength == 0) { + bytesPerRow = bytesPerPixel * width; + } + else { + bytesPerRow = bytesPerPixel * packing->RowLength; + } + remainder = bytesPerRow % packing->Alignment; + if (remainder > 0) + bytesPerRow += (packing->Alignment - remainder); + + if (packing->ImageHeight == 0) + bytesPerImage = bytesPerRow * height; + else + bytesPerImage = bytesPerRow * packing->ImageHeight; + + return bytesPerImage; + } +} + + + + +/* * Unpack a 32x32 pixel polygon stipple from user memory using the * current pixel unpack settings. */ |