static const char *TextureName (GLenum TC)
{
switch (TC) {
+ case GL_RGB:
+ return "RGB";
case GL_RGBA:
return "RGBA";
case GL_COMPRESSED_RGB:
#include "texcompress.h"
#include "texobj.h"
#include "texstore.h"
-#include "texutil.h"
void
fxMesaContext fxMesa = FX_CONTEXT(ctx);
tfxTexInfo *ti;
tfxMipMapLevel *mml;
- GLint texelBytes;
+ GLint texelBytes, dstRowStride;
if (TDFX_DEBUG & VERBOSE_TEXTURE) {
fprintf(stderr, "fxDDTexImage2D: id=%d int 0x%x format 0x%x type 0x%x %dx%d\n",
/*if (!fxMesa->HaveTexFmt) assert(texelBytes == 1 || texelBytes == 2);*/
mml->glideFormat = fxGlideFormat(texImage->TexFormat->MesaFormat);
- /* [dBorca] Hack alert ZZZ: how do we handle FX_TC_NCC/FX_TC_NAPALM? */
- /* [dBorca] Hack alert ZZZ: how do we handle S3TC outside MESA?!?!?! */
+ /* [dBorca] ZYX: how do we handle FX_TC_NCC/FX_TC_NAPALM? */
+ /* [dBorca] ZYX: how do we handle S3TC outside MESA?!?!?! */
+ /* [dBorca] ZYX: how do we handle aspectratio adjustemnt? */
/* allocate mipmap buffer */
assert(!texImage->Data);
if (texImage->IsCompressed) {
+ dstRowStride = _mesa_compressed_row_stride(texImage->IntFormat, mml->width);
texImage->Data = MESA_PBUFFER_ALLOC(texImage->CompressedSize);
} else {
+ dstRowStride = mml->width * texelBytes;
texImage->Data = MESA_PBUFFER_ALLOC(mml->width * mml->height * texelBytes);
}
if (!texImage->Data) {
texImage->TexFormat->StoreImage(ctx, 2, texImage->Format,
texImage->TexFormat, texImage->Data,
0, 0, 0, /* dstX/Y/Zoffset */
- mml->width * texelBytes, /* dstRowStride */
+ dstRowStride,
0, /* dstImageStride */
mml->width, mml->height, 1,
- GL_BGRA, type, tempImage, packing);
+ GL_BGRA, CHAN_TYPE, tempImage, &ctx->DefaultPacking);
FREE(rgbaImage);
} else {
/* [dBorca] mild case:
texImage->TexFormat->StoreImage(ctx, 2, texImage->Format,
texImage->TexFormat, texImage->Data,
0, 0, 0, /* dstX/Y/Zoffset */
- mml->width * texelBytes, /* dstRowStride */
+ dstRowStride,
0, /* dstImageStride */
width, height, 1,
format, type, pixels, packing);
#include "texstore.h"
-static GLint
+static GLuint
compress_fxt1 (GLcontext *ctx,
- GLint srcWidth,
- GLint srcHeight,
+ GLsizei srcWidth,
+ GLsizei srcHeight,
GLenum srcFormat,
- const GLvoid *pixels,
+ const GLchan *source,
GLint srcRowStride,
- GLvoid *dst,
+ GLubyte *dest,
GLint dstRowStride);
const GLchan *pixels;
GLint srcRowStride;
GLubyte *dst;
- GLint texWidth;
+ const GLint texWidth = dstRowStride * 8 / 16; /* a bit of a hack */
const GLchan *tempImage = NULL;
- dstRowStride = _mesa_compressed_row_stride(GL_COMPRESSED_RGB_FXT1_3DFX, srcWidth);
- texWidth = dstRowStride * 8 / 16; /* a bit of a hack */
-
ASSERT(dstFormat == &_mesa_texformat_rgb_fxt1);
ASSERT(dstXoffset % 8 == 0);
ASSERT(dstYoffset % 4 == 0);
const GLchan *pixels;
GLint srcRowStride;
GLubyte *dst;
- GLint texWidth;
+ GLint texWidth = dstRowStride * 8 / 16; /* a bit of a hack */
const GLchan *tempImage = NULL;
- dstRowStride = _mesa_compressed_row_stride(GL_COMPRESSED_RGBA_FXT1_3DFX, srcWidth);
- texWidth = dstRowStride * 8 / 16; /* a bit of a hack */
-
- ASSERT(dstFormat == &_mesa_texformat_rgba_dxt1);
+ ASSERT(dstFormat == &_mesa_texformat_rgba_fxt1);
ASSERT(dstXoffset % 8 == 0);
ASSERT(dstYoffset % 4 == 0);
ASSERT(dstZoffset == 0);
};
-static GLint
+static GLuint
compress_fxt1 (GLcontext *ctx,
- GLint srcWidth,
- GLint srcHeight,
+ GLsizei srcWidth,
+ GLsizei srcHeight,
GLenum srcFormat,
- const GLvoid *pixels,
+ const GLchan *source,
GLint srcRowStride,
- GLvoid *dst,
+ GLubyte *dest,
GLint dstRowStride)
{
/* here be dragons */
const GLchan *pixels;
GLint srcRowStride;
GLubyte *dst;
- const GLint texWidth = dstRowStride / 2; /* a bit of a hack */
+ const GLint texWidth = dstRowStride * 4 / 8; /* a bit of a hack */
const GLchan *tempImage = NULL;
ASSERT(dstFormat == &_mesa_texformat_rgb_dxt1);
const GLchan *pixels;
GLint srcRowStride;
GLubyte *dst;
- const GLint texWidth = dstRowStride / 2; /* a bit of a hack */
+ const GLint texWidth = dstRowStride * 4 / 8; /* a bit of a hack */
const GLchan *tempImage = NULL;
ASSERT(dstFormat == &_mesa_texformat_rgba_dxt1);
const GLchan *pixels;
GLint srcRowStride;
GLubyte *dst;
- const GLint texWidth = dstRowStride / 4; /* a bit of a hack */
+ const GLint texWidth = dstRowStride * 4 / 16; /* a bit of a hack */
const GLchan *tempImage = NULL;
ASSERT(dstFormat == &_mesa_texformat_rgba_dxt3);
const GLchan *pixels;
GLint srcRowStride;
GLubyte *dst;
- const GLint texWidth = dstRowStride / 4; /* a bit of a hack */
+ const GLint texWidth = dstRowStride * 4 / 16; /* a bit of a hack */
const GLchan *tempImage = NULL;
ASSERT(dstFormat == &_mesa_texformat_rgba_dxt5);
_mesa_problem(NULL,"unexpected bytes/pixel in _mesa_rescale_teximage2d");
}
}
+
+
+/**
+ * Upscale an image by replication, not (typical) stretching.
+ * We use this when the image width or height is less than a
+ * certain size (4, 8) and we need to upscale an image.
+ */
+void
+_mesa_upscale_teximage2d (GLsizei inWidth, GLsizei inHeight,
+ GLsizei outWidth, GLsizei outHeight,
+ GLint comps, const GLchan *src, GLint srcRowStride,
+ GLchan *dest )
+{
+ GLint i, j, k;
+
+ ASSERT(outWidth >= inWidth);
+ ASSERT(outHeight >= inHeight);
+ ASSERT(inWidth == 1 || inWidth == 2 || inHeight == 1 || inHeight == 2);
+#if 0
+ ASSERT((outWidth & 3) == 0);
+ ASSERT((outHeight & 3) == 0);
+#endif
+
+ for (i = 0; i < outHeight; i++) {
+ const GLint ii = i % inHeight;
+ for (j = 0; j < outWidth; j++) {
+ const GLint jj = j % inWidth;
+ for (k = 0; k < comps; k++) {
+ dest[(i * outWidth + j) * comps + k]
+ = src[ii * srcRowStride + jj * comps + k];
+ }
+ }
+ }
+}
GLint dstWidth, GLint dstHeight,
const GLvoid *srcImage, GLvoid *dstImage);
+extern void
+_mesa_upscale_teximage2d( GLsizei inWidth, GLsizei inHeight,
+ GLsizei outWidth, GLsizei outHeight,
+ GLint comps, const GLchan *src, GLint srcRowStride,
+ GLchan *dest );
+
#endif