|
|
@@ -2048,78 +2048,3 @@ _mesa_generate_mipmap(struct gl_context *ctx, GLenum target, |
|
|
|
generate_mipmap_uncompressed(ctx, target, texObj, srcImage, maxLevel); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* Helper function for drivers which need to rescale texture images to |
|
|
|
* certain aspect ratios. |
|
|
|
* Nearest filtering only (for broken hardware that can't support |
|
|
|
* all aspect ratios). This can be made a lot faster, but I don't |
|
|
|
* really care enough... |
|
|
|
*/ |
|
|
|
void |
|
|
|
_mesa_rescale_teximage2d(GLuint bytesPerPixel, |
|
|
|
GLuint srcStrideInPixels, |
|
|
|
GLuint dstRowStride, |
|
|
|
GLint srcWidth, GLint srcHeight, |
|
|
|
GLint dstWidth, GLint dstHeight, |
|
|
|
const GLvoid *srcImage, GLvoid *dstImage) |
|
|
|
{ |
|
|
|
GLint row, col; |
|
|
|
|
|
|
|
#define INNER_LOOP( TYPE, HOP, WOP ) \ |
|
|
|
for ( row = 0 ; row < dstHeight ; row++ ) { \ |
|
|
|
GLint srcRow = row HOP hScale; \ |
|
|
|
for ( col = 0 ; col < dstWidth ; col++ ) { \ |
|
|
|
GLint srcCol = col WOP wScale; \ |
|
|
|
dst[col] = src[srcRow * srcStrideInPixels + srcCol]; \ |
|
|
|
} \ |
|
|
|
dst = (TYPE *) ((GLubyte *) dst + dstRowStride); \ |
|
|
|
} \ |
|
|
|
|
|
|
|
#define RESCALE_IMAGE( TYPE ) \ |
|
|
|
do { \ |
|
|
|
const TYPE *src = (const TYPE *)srcImage; \ |
|
|
|
TYPE *dst = (TYPE *)dstImage; \ |
|
|
|
\ |
|
|
|
if ( srcHeight < dstHeight ) { \ |
|
|
|
const GLint hScale = dstHeight / srcHeight; \ |
|
|
|
if ( srcWidth < dstWidth ) { \ |
|
|
|
const GLint wScale = dstWidth / srcWidth; \ |
|
|
|
INNER_LOOP( TYPE, /, / ); \ |
|
|
|
} \ |
|
|
|
else { \ |
|
|
|
const GLint wScale = srcWidth / dstWidth; \ |
|
|
|
INNER_LOOP( TYPE, /, * ); \ |
|
|
|
} \ |
|
|
|
} \ |
|
|
|
else { \ |
|
|
|
const GLint hScale = srcHeight / dstHeight; \ |
|
|
|
if ( srcWidth < dstWidth ) { \ |
|
|
|
const GLint wScale = dstWidth / srcWidth; \ |
|
|
|
INNER_LOOP( TYPE, *, / ); \ |
|
|
|
} \ |
|
|
|
else { \ |
|
|
|
const GLint wScale = srcWidth / dstWidth; \ |
|
|
|
INNER_LOOP( TYPE, *, * ); \ |
|
|
|
} \ |
|
|
|
} \ |
|
|
|
} while (0) |
|
|
|
|
|
|
|
switch ( bytesPerPixel ) { |
|
|
|
case 4: |
|
|
|
RESCALE_IMAGE( GLuint ); |
|
|
|
break; |
|
|
|
|
|
|
|
case 2: |
|
|
|
RESCALE_IMAGE( GLushort ); |
|
|
|
break; |
|
|
|
|
|
|
|
case 1: |
|
|
|
RESCALE_IMAGE( GLubyte ); |
|
|
|
break; |
|
|
|
default: |
|
|
|
_mesa_problem(NULL,"unexpected bytes/pixel in _mesa_rescale_teximage2d"); |
|
|
|
} |
|
|
|
} |
|
|
|
|