-/* $Id: texutil.c,v 1.25 2001/06/15 15:22:08 brianp Exp $ */
+/* $Id: texutil.c,v 1.26 2002/02/21 15:12:31 brianp Exp $ */
/*
* Mesa 3-D graphics library
- * Version: 3.5
+ * Version: 4.0.2
*
- * 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"),
/* Needed for subimage replacement */
GLenum format, type; /* Source (user) format and type */
- const struct gl_pixelstore_attrib *packing;
+ const struct gl_pixelstore_attrib *unpacking;
const GLvoid *srcImage;
GLvoid *dstImage;
typedef GLboolean (*convert_func)( struct gl_texture_convert *convert );
#define CONVERT_STRIDE_BIT 0x1
-#define CONVERT_PACKING_BIT 0x2
+#define CONVERT_UNPACKING_BIT 0x2
/* See if we need to care about the pixel store attributes when we're
* converting the texture image. This should be stored as
- * packing->_SomeBoolean and updated when the values change, to avoid
+ * unpacking->_SomeBoolean and updated when the values change, to avoid
* testing every time...
*/
static INLINE GLboolean
-convert_needs_packing( const struct gl_pixelstore_attrib *packing,
+convert_needs_unpacking( const struct gl_pixelstore_attrib *unpacking,
GLenum format, GLenum type )
{
- if ( ( packing->Alignment == 1 ||
- ( packing->Alignment == 4 && /* Pick up the common Q3A case... */
+ if ( ( unpacking->Alignment == 1 ||
+ ( unpacking->Alignment == 4 && /* Pick up the common Q3A case... */
format == GL_RGBA && type == GL_UNSIGNED_BYTE ) ) &&
- packing->RowLength == 0 &&
- packing->SkipPixels == 0 &&
- packing->SkipRows == 0 &&
- packing->ImageHeight == 0 &&
- packing->SkipImages == 0 &&
- packing->SwapBytes == GL_FALSE &&
- packing->LsbFirst == GL_FALSE ) {
+ unpacking->RowLength == 0 &&
+ unpacking->SkipPixels == 0 &&
+ unpacking->SkipRows == 0 &&
+ unpacking->ImageHeight == 0 &&
+ unpacking->SkipImages == 0 &&
+ unpacking->SwapBytes == GL_FALSE &&
+ unpacking->LsbFirst == GL_FALSE ) {
return GL_FALSE;
} else {
return GL_TRUE;
GLint xoffset,
GLint width,
GLenum format, GLenum type,
- const struct gl_pixelstore_attrib *packing,
+ const struct gl_pixelstore_attrib *unpacking,
const GLvoid *srcImage, GLvoid *dstImage )
{
struct gl_texture_convert convert;
- ASSERT( packing );
+ ASSERT( unpacking );
ASSERT( srcImage );
ASSERT( dstImage );
convert.height = 1;
convert.format = format;
convert.type = type;
- convert.packing = packing;
+ convert.unpacking = unpacking;
convert.srcImage = srcImage;
convert.dstImage = dstImage;
convert.index = 0;
- if ( convert_needs_packing( packing, format, type ) )
- convert.index |= CONVERT_PACKING_BIT;
+ if ( convert_needs_unpacking( unpacking, format, type ) )
+ convert.index |= CONVERT_UNPACKING_BIT;
return gl_convert_texsubimage2d_tab[mesaFormat]( &convert );
}
* width, height - incoming image size, also size of dest region.
* dstImageWidth - width (row stride) of dest image in pixels
* format, type - incoming image format and type
- * packing - describes incoming image packing
+ * unpacking - describes incoming image unpacking
* srcImage - pointer to source image
* destImage - pointer to dest image
*/
GLint width, GLint height,
GLint destImageWidth,
GLenum format, GLenum type,
- const struct gl_pixelstore_attrib *packing,
+ const struct gl_pixelstore_attrib *unpacking,
const GLvoid *srcImage, GLvoid *dstImage )
{
struct gl_texture_convert convert;
- ASSERT( packing );
+ ASSERT( unpacking );
ASSERT( srcImage );
ASSERT( dstImage );
convert.dstImageWidth = destImageWidth;
convert.format = format;
convert.type = type;
- convert.packing = packing;
+ convert.unpacking = unpacking;
convert.srcImage = srcImage;
convert.dstImage = dstImage;
convert.index = 0;
- if ( convert_needs_packing( packing, format, type ) )
- convert.index |= CONVERT_PACKING_BIT;
+ if ( convert_needs_unpacking( unpacking, format, type ) )
+ convert.index |= CONVERT_UNPACKING_BIT;
if ( width != destImageWidth )
convert.index |= CONVERT_STRIDE_BIT;
GLint width, GLint height, GLint depth,
GLint dstImageWidth, GLint dstImageHeight,
GLenum format, GLenum type,
- const struct gl_pixelstore_attrib *packing,
+ const struct gl_pixelstore_attrib *unpacking,
const GLvoid *srcImage, GLvoid *dstImage )
{
struct gl_texture_convert convert;
- ASSERT( packing );
+ ASSERT( unpacking );
ASSERT( srcImage );
ASSERT( dstImage );
convert.dstImageHeight = dstImageHeight;
convert.format = format;
convert.type = type;
- convert.packing = packing;
+ convert.unpacking = unpacking;
convert.srcImage = srcImage;
convert.dstImage = dstImage;
convert.index = 0;
- if ( convert_needs_packing( packing, format, type ) )
- convert.index |= CONVERT_PACKING_BIT;
+ if ( convert_needs_unpacking( unpacking, format, type ) )
+ convert.index |= CONVERT_UNPACKING_BIT;
if ( width != dstImageWidth || height != dstImageHeight )
convert.index |= CONVERT_STRIDE_BIT;
-/* $Id: texutil_tmp.h,v 1.8 2001/04/20 19:21:41 brianp Exp $ */
+/* $Id: texutil_tmp.h,v 1.9 2002/02/21 15:12:31 brianp Exp $ */
/*
* Mesa 3-D graphics library
- * Version: 3.5
+ * Version: 4.0.2
*
- * 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"),
#define DST_TEXEL_BYTES (4 / DST_TEXELS_PER_DWORD)
-#define DST_ROW_WIDTH (convert->width * DST_TEXEL_BYTES)
+#define DST_ROW_BYTES (convert->width * DST_TEXEL_BYTES)
#define DST_ROW_STRIDE (convert->dstImageWidth * DST_TEXEL_BYTES)
#define DST_IMG_STRIDE (convert->dstImageWidth * \
convert->dstImageHeight * DST_TEXEL_BYTES)
GLuint *dst = (GLuint *)((GLubyte *)convert->dstImage +
(convert->yoffset * convert->dstImageWidth +
convert->xoffset) * DST_TEXEL_BYTES);
- GLint dwords, i;
- (void) dwords; (void) i;
#if DEBUG_TEXUTIL
fprintf( stderr, __FUNCTION__ "\n" );
#endif
#ifdef CONVERT_DIRECT
- MEMCPY( dst, src, convert->height * DST_ROW_WIDTH );
+ MEMCPY( dst, src, convert->height * DST_ROW_BYTES );
#else
- dwords = (convert->width * convert->height +
- DST_TEXELS_PER_DWORD - 1) / DST_TEXELS_PER_DWORD;
-
- for ( i = 0 ; i < dwords ; i++ ) {
- CONVERT_TEXEL_DWORD( *dst++, src );
- src += SRC_TEXEL_BYTES * DST_TEXELS_PER_DWORD;
+ {
+ const GLint texels = convert->width * convert->height;
+ const GLint dwords = texels / DST_TEXELS_PER_DWORD;
+ const GLint leftover = texels - dwords * DST_TEXELS_PER_DWORD;
+ GLint i;
+ for ( i = 0 ; i < dwords ; i++ ) {
+ CONVERT_TEXEL_DWORD( *dst++, src );
+ src += SRC_TEXEL_BYTES * DST_TEXELS_PER_DWORD;
+ }
+ for ( i = 0; i < leftover; i++ ) {
+ CONVERT_TEXEL( *dst++, src );
+ src += SRC_TEXEL_BYTES;
+ }
}
#endif
((convert->zoffset * convert->height +
convert->yoffset) * convert->width +
convert->xoffset) * DST_TEXEL_BYTES);
- GLint dwords, i;
- (void) dwords; (void) i;
-
#if DEBUG_TEXUTIL
fprintf( stderr, __FUNCTION__ "\n" );
#endif
#ifdef CONVERT_DIRECT
- MEMCPY( dst, src, convert->depth * convert->height * DST_ROW_WIDTH );
+ MEMCPY( dst, src, convert->depth * convert->height * DST_ROW_BYTES );
#else
- dwords = (convert->width * convert->height * convert->depth +
- DST_TEXELS_PER_DWORD - 1) / DST_TEXELS_PER_DWORD;
-
- for ( i = 0 ; i < dwords ; i++ ) {
- CONVERT_TEXEL_DWORD( *dst++, src );
- src += SRC_TEXEL_BYTES * DST_TEXELS_PER_DWORD;
+ {
+ const GLint texels = convert->width * convert->height * convert->depth;
+ const GLint dwords = texels / DST_TEXELS_PER_DWORD;
+ const GLint leftover = texels - dwords * DST_TEXELS_PER_DWORD;
+ GLint i;
+ for ( i = 0 ; i < dwords ; i++ ) {
+ CONVERT_TEXEL_DWORD( *dst++, src );
+ src += SRC_TEXEL_BYTES * DST_TEXELS_PER_DWORD;
+ }
+ for ( i = 0; i < leftover; i++ ) {
+ CONVERT_TEXEL( *dst++, src );
+ src += SRC_TEXEL_BYTES;
+ }
}
#endif
* PRE: Require pixelstore attribs, width == dstImageWidth.
*/
static GLboolean
-TAG(texsubimage2d_pack)( struct gl_texture_convert *convert )
+TAG(texsubimage2d_unpack)( struct gl_texture_convert *convert )
{
const GLubyte *src = (const GLubyte *)
- _mesa_image_address( convert->packing, convert->srcImage,
+ _mesa_image_address( convert->unpacking, convert->srcImage,
convert->width, convert->height,
convert->format, convert->type, 0, 0, 0 );
const GLint srcRowStride =
- _mesa_image_row_stride( convert->packing, convert->width,
+ _mesa_image_row_stride( convert->unpacking, convert->width,
convert->format, convert->type );
- GLuint *dst = (GLuint *)((GLubyte *)convert->dstImage +
- (convert->yoffset * convert->width +
- convert->xoffset) * DST_TEXEL_BYTES);
- GLint width;
GLint row, col;
- (void) col;
#if DEBUG_TEXUTIL
fprintf( stderr, __FUNCTION__ "\n" );
#endif
- width = ((convert->width + DST_TEXELS_PER_DWORD - 1)
- & ~(DST_TEXELS_PER_DWORD - 1));
-
- for ( row = 0 ; row < convert->height ; row++ ) {
+ if (convert->width & (DST_TEXELS_PER_DWORD - 1)) {
+ /* Can't use dword conversion (i.e. when width = 1 and texels/dword = 2
+ * or width = 2 and texels/dword = 4).
+ */
+ DST_TYPE *dst = (DST_TYPE *)((GLubyte *)convert->dstImage +
+ (convert->yoffset * convert->width +
+ convert->xoffset) * DST_TEXEL_BYTES);
+ for ( row = 0 ; row < convert->height ; row++ ) {
+ const GLubyte *srcRow = src;
+ for ( col = 0; col < convert->width; col++ ) {
+ CONVERT_TEXEL(*dst, src);
+ src += SRC_TEXEL_BYTES;
+ }
+ src = srcRow + srcRowStride;
+ }
+ }
+ else {
+ /* the common case */
+ GLuint *dst = (GLuint *)((GLubyte *)convert->dstImage +
+ (convert->yoffset * convert->width +
+ convert->xoffset) * DST_TEXEL_BYTES);
+ for ( row = 0 ; row < convert->height ; row++ ) {
#ifdef CONVERT_DIRECT
- MEMCPY( dst, src, DST_ROW_STRIDE );
- src += srcRowStride;
- dst = (GLuint *)((GLubyte *)dst + DST_ROW_STRIDE);
+ MEMCPY( dst, src, DST_ROW_STRIDE );
+ src += srcRowStride;
+ dst = (GLuint *)((GLubyte *)dst + DST_ROW_STRIDE);
#else
- const GLubyte *srcRow = src;
- for ( col = width / DST_TEXELS_PER_DWORD ; col ; col-- ) {
- CONVERT_TEXEL_DWORD( *dst++, src );
- src += SRC_TEXEL_BYTES * DST_TEXELS_PER_DWORD;
- }
- src = srcRow + srcRowStride;
+ const GLubyte *srcRow = src;
+ for ( col = convert->width / DST_TEXELS_PER_DWORD ; col ; col-- ) {
+ CONVERT_TEXEL_DWORD( *dst++, src );
+ src += SRC_TEXEL_BYTES * DST_TEXELS_PER_DWORD;
+ }
+ src = srcRow + srcRowStride;
#endif
+ }
}
return GL_TRUE;
/* PRE: as above, height == dstImageHeight also.
*/
static GLboolean
-TAG(texsubimage3d_pack)( struct gl_texture_convert *convert )
+TAG(texsubimage3d_unpack)( struct gl_texture_convert *convert )
{
const GLubyte *src = (const GLubyte *)
- _mesa_image_address( convert->packing, convert->srcImage,
+ _mesa_image_address( convert->unpacking, convert->srcImage,
convert->width, convert->height,
convert->format, convert->type, 0, 0, 0 );
+ const GLint srcImgStride = (const GLubyte *)
+ _mesa_image_address( convert->unpacking, convert->srcImage,
+ convert->width, convert->height,
+ convert->format, convert->type, 1, 0, 0 ) - src;
const GLint srcRowStride =
- _mesa_image_row_stride( convert->packing, convert->width,
+ _mesa_image_row_stride( convert->unpacking, convert->width,
convert->format, convert->type );
- GLuint *dst = (GLuint *)((GLubyte *)convert->dstImage +
- ((convert->zoffset * convert->height +
- convert->yoffset) * convert->width +
- convert->xoffset) * DST_TEXEL_BYTES);
- GLint width;
GLint row, col, img;
- (void) col;
#if DEBUG_TEXUTIL
fprintf( stderr, __FUNCTION__ "\n" );
#endif
- width = ((convert->width + DST_TEXELS_PER_DWORD - 1)
- & ~(DST_TEXELS_PER_DWORD - 1));
-
- for ( img = 0 ; img < convert->depth ; img++ ) {
- for ( row = 0 ; row < convert->height ; row++ ) {
+ if (convert->width & (DST_TEXELS_PER_DWORD - 1)) {
+ /* Can't use dword conversion (i.e. when width = 1 and texels/dword = 2
+ * or width = 2 and texels/dword = 4).
+ */
+ DST_TYPE *dst = (DST_TYPE *)((GLubyte *)convert->dstImage +
+ ((convert->zoffset * convert->height +
+ convert->yoffset) * convert->width +
+ convert->xoffset) * DST_TEXEL_BYTES);
+ for ( img = 0 ; img < convert->depth ; img++ ) {
+ const GLubyte *srcImage = src;
+ for ( row = 0 ; row < convert->height ; row++ ) {
+ const GLubyte *srcRow = src;
+ for ( col = 0; col < convert->width; col++ ) {
+ CONVERT_TEXEL(*dst, src);
+ src += SRC_TEXEL_BYTES;
+ }
+ src = srcRow + srcRowStride;
+ }
+ src = srcImage + srcImgStride;
+ }
+ }
+ else {
+ /* the common case */
+ GLuint *dst = (GLuint *)((GLubyte *)convert->dstImage +
+ ((convert->zoffset * convert->height +
+ convert->yoffset) * convert->width +
+ convert->xoffset) * DST_TEXEL_BYTES);
+ for ( img = 0 ; img < convert->depth ; img++ ) {
+ const GLubyte *srcImage = src;
+ for ( row = 0 ; row < convert->height ; row++ ) {
#ifdef CONVERT_DIRECT
- MEMCPY( dst, src, DST_ROW_STRIDE );
- src += srcRowStride;
- dst = (GLuint *)((GLubyte *)dst + DST_ROW_STRIDE);
+ MEMCPY( dst, src, DST_ROW_STRIDE );
+ src += srcRowStride;
+ dst = (GLuint *)((GLubyte *)dst + DST_ROW_STRIDE);
#else
- const GLubyte *srcRow = src;
- for ( col = width / DST_TEXELS_PER_DWORD ; col ; col-- ) {
- CONVERT_TEXEL_DWORD( *dst++, src );
- src += SRC_TEXEL_BYTES * DST_TEXELS_PER_DWORD;
- }
- src = srcRow + srcRowStride;
+ const GLubyte *srcRow = src;
+ for ( col = convert->width / DST_TEXELS_PER_DWORD ; col ; col-- ) {
+ CONVERT_TEXEL_DWORD( *dst++, src );
+ src += SRC_TEXEL_BYTES * DST_TEXELS_PER_DWORD;
+ }
+ src = srcRow + srcRowStride;
#endif
+ }
+ src = srcImage + srcImgStride;
}
}
* PRE: Require pixelstore attribs, width != dstImageWidth.
*/
static GLboolean
-TAG(texsubimage2d_stride_pack)( struct gl_texture_convert *convert )
+TAG(texsubimage2d_stride_unpack)( struct gl_texture_convert *convert )
{
const GLubyte *src = (const GLubyte *)
- _mesa_image_address( convert->packing, convert->srcImage,
+ _mesa_image_address( convert->unpacking, convert->srcImage,
convert->width, convert->height,
convert->format, convert->type, 0, 0, 0 );
const GLint srcRowStride =
- _mesa_image_row_stride( convert->packing, convert->width,
+ _mesa_image_row_stride( convert->unpacking, convert->width,
convert->format, convert->type );
DST_TYPE *dst = (DST_TYPE *)((GLubyte *)convert->dstImage +
(convert->yoffset * convert->dstImageWidth +
for ( row = 0 ; row < convert->height ; row++ ) {
#ifdef CONVERT_DIRECT
- MEMCPY( dst, src, DST_ROW_WIDTH );
+ MEMCPY( dst, src, DST_ROW_BYTES );
src += srcRowStride;
dst += convert->dstImageWidth;
#else
/* PRE: As above, or height != dstImageHeight also.
*/
static GLboolean
-TAG(texsubimage3d_stride_pack)( struct gl_texture_convert *convert )
+TAG(texsubimage3d_stride_unpack)( struct gl_texture_convert *convert )
{
const GLubyte *src = (const GLubyte *)
- _mesa_image_address( convert->packing, convert->srcImage,
+ _mesa_image_address( convert->unpacking, convert->srcImage,
convert->width, convert->height,
convert->format, convert->type, 0, 0, 0 );
+ const GLint srcImgStride = (const GLubyte *)
+ _mesa_image_address( convert->unpacking, convert->srcImage,
+ convert->width, convert->height,
+ convert->format, convert->type, 1, 0, 0 ) - src;
const GLint srcRowStride =
- _mesa_image_row_stride( convert->packing, convert->width,
+ _mesa_image_row_stride( convert->unpacking, convert->width,
convert->format, convert->type );
DST_TYPE *dst = (DST_TYPE *)((GLubyte *)convert->dstImage +
((convert->zoffset * convert->dstImageHeight +
#endif
for ( img = 0 ; img < convert->depth ; img++ ) {
+ const GLubyte *srcImage = src;
for ( row = 0 ; row < convert->height ; row++ ) {
#ifdef CONVERT_DIRECT
- MEMCPY( dst, src, DST_ROW_WIDTH );
+ MEMCPY( dst, src, DST_ROW_BYTES );
src += srcRowStride;
dst += convert->dstImageWidth;
#else
dst += adjust;
#endif
}
- /* FIXME: ... */
+ src = srcImage + srcImgStride;
}
return GL_TRUE;
static convert_func TAG(texsubimage2d_tab)[] = {
TAG(texsubimage2d),
TAG(texsubimage2d_stride),
- TAG(texsubimage2d_pack),
- TAG(texsubimage2d_stride_pack),
+ TAG(texsubimage2d_unpack),
+ TAG(texsubimage2d_stride_unpack),
};
static convert_func TAG(texsubimage3d_tab)[] = {
TAG(texsubimage3d),
TAG(texsubimage3d_stride),
- TAG(texsubimage3d_pack),
- TAG(texsubimage3d_stride_pack),
+ TAG(texsubimage3d_unpack),
+ TAG(texsubimage3d_stride_unpack),
};
#undef SRC_TEXEL_BYTES
#undef DST_TEXEL_BYTES
-#undef DST_ROW_WIDTH
+#undef DST_ROW_BYTES
#undef DST_ROW_STRIDE
#undef CONVERT_TEXEL