texcompress_s3tc.c

来自「mesa-6.5-minigui源码」· C语言 代码 · 共 564 行 · 第 1/2 页

C
564
字号
      pixels = tempImage;      srcRowStride = 4 * srcWidth;   }   else {      pixels = (const GLchan *) srcAddr;      srcRowStride = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat,                                            srcType) / sizeof(GLchan);   }   dst = _mesa_compressed_image_address(dstXoffset, dstYoffset, 0,                                        GL_COMPRESSED_RGBA_S3TC_DXT3_EXT,                                        texWidth, (GLubyte *) dstAddr);   if (ext_tx_compress_dxtn) {      (*ext_tx_compress_dxtn)(4, srcWidth, srcHeight, pixels,  GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, dst, dstRowStride);   }   else {      _mesa_problem(ctx, "external dxt library not available");   }   if (tempImage)      _mesa_free((void *) tempImage);   return GL_TRUE;}/** * Called via TexFormat->StoreImage to store an RGBA_DXT5 texture. */static GLbooleantexstore_rgba_dxt5(STORE_PARAMS){   const GLchan *pixels;   GLint srcRowStride;   GLubyte *dst;   const GLint texWidth = dstRowStride * 4 / 16; /* a bit of a hack */   const GLchan *tempImage = NULL;   ASSERT(dstFormat == &_mesa_texformat_rgba_dxt5);   ASSERT(dstXoffset % 4 == 0);   ASSERT(dstYoffset % 4 == 0);   ASSERT(dstZoffset % 4 == 0);   (void) dstZoffset; (void) dstImageStride;   if (srcFormat != GL_RGBA ||       srcType != CHAN_TYPE ||       ctx->_ImageTransferState ||       srcPacking->SwapBytes) {      /* convert image to RGBA/GLchan */      tempImage = _mesa_make_temp_chan_image(ctx, dims,                                             baseInternalFormat,                                             dstFormat->BaseFormat,                                             srcWidth, srcHeight, srcDepth,                                             srcFormat, srcType, srcAddr,                                             srcPacking);      if (!tempImage)         return GL_FALSE; /* out of memory */      _mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight);      pixels = tempImage;      srcRowStride = 4 * srcWidth;   }   else {      pixels = (const GLchan *) srcAddr;      srcRowStride = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat,                                            srcType) / sizeof(GLchan);   }   dst = _mesa_compressed_image_address(dstXoffset, dstYoffset, 0,                                        GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,                                        texWidth, (GLubyte *) dstAddr);   if (ext_tx_compress_dxtn) {      (*ext_tx_compress_dxtn)(4, srcWidth, srcHeight, pixels,  GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, dst, dstRowStride);   }   else {      _mesa_problem(ctx, "external dxt library not available");   }   if (tempImage)      _mesa_free((void *) tempImage);   return GL_TRUE;}static voidfetch_texel_2d_rgb_dxt1( const struct gl_texture_image *texImage,                         GLint i, GLint j, GLint k, GLchan *texel ){    (void) k;    if (fetch_ext_rgb_dxt1) {       ASSERT (sizeof(GLchan) == sizeof(GLubyte));       (*fetch_ext_rgb_dxt1)((texImage)->RowStride, (GLubyte *)(texImage)->Data, i, j, texel);    }    else _mesa_debug(NULL, "attempted to decode s3tc texture without library available\n");}static voidfetch_texel_2d_f_rgb_dxt1( const struct gl_texture_image *texImage,                            GLint i, GLint j, GLint k, GLfloat *texel ){   /* just sample as GLchan and convert to float here */   GLchan rgba[4];   fetch_texel_2d_rgb_dxt1(texImage, i, j, k, rgba);   texel[RCOMP] = CHAN_TO_FLOAT(rgba[RCOMP]);   texel[GCOMP] = CHAN_TO_FLOAT(rgba[GCOMP]);   texel[BCOMP] = CHAN_TO_FLOAT(rgba[BCOMP]);   texel[ACOMP] = CHAN_TO_FLOAT(rgba[ACOMP]);}static voidfetch_texel_2d_rgba_dxt1( const struct gl_texture_image *texImage,                          GLint i, GLint j, GLint k, GLchan *texel ){   (void) k;   if (fetch_ext_rgba_dxt1) {       (*fetch_ext_rgba_dxt1)((texImage)->RowStride, (GLubyte *)(texImage)->Data, i, j, texel);    }    else _mesa_debug(NULL, "attempted to decode s3tc texture without library available\n");}static voidfetch_texel_2d_f_rgba_dxt1( const struct gl_texture_image *texImage,                            GLint i, GLint j, GLint k, GLfloat *texel ){   /* just sample as GLchan and convert to float here */   GLchan rgba[4];   fetch_texel_2d_rgba_dxt1(texImage, i, j, k, rgba);   texel[RCOMP] = CHAN_TO_FLOAT(rgba[RCOMP]);   texel[GCOMP] = CHAN_TO_FLOAT(rgba[GCOMP]);   texel[BCOMP] = CHAN_TO_FLOAT(rgba[BCOMP]);   texel[ACOMP] = CHAN_TO_FLOAT(rgba[ACOMP]);}static voidfetch_texel_2d_rgba_dxt3( const struct gl_texture_image *texImage,                          GLint i, GLint j, GLint k, GLchan *texel ){   (void) k;   if (fetch_ext_rgba_dxt3) {       ASSERT (sizeof(GLchan) == sizeof(GLubyte));       (*fetch_ext_rgba_dxt3)((texImage)->RowStride, (GLubyte *)(texImage)->Data, i, j, texel);    }    else _mesa_debug(NULL, "attempted to decode s3tc texture without library available\n");}static voidfetch_texel_2d_f_rgba_dxt3( const struct gl_texture_image *texImage,                            GLint i, GLint j, GLint k, GLfloat *texel ){   /* just sample as GLchan and convert to float here */   GLchan rgba[4];   fetch_texel_2d_rgba_dxt3(texImage, i, j, k, rgba);   texel[RCOMP] = CHAN_TO_FLOAT(rgba[RCOMP]);   texel[GCOMP] = CHAN_TO_FLOAT(rgba[GCOMP]);   texel[BCOMP] = CHAN_TO_FLOAT(rgba[BCOMP]);   texel[ACOMP] = CHAN_TO_FLOAT(rgba[ACOMP]);}static voidfetch_texel_2d_rgba_dxt5( const struct gl_texture_image *texImage,                          GLint i, GLint j, GLint k, GLchan *texel ){   (void) k;   if (fetch_ext_rgba_dxt5) {       (*fetch_ext_rgba_dxt5)((texImage)->RowStride, (GLubyte *)(texImage)->Data, i, j, texel);    }    else _mesa_debug(NULL, "attempted to decode s3tc texture without library available\n");}static voidfetch_texel_2d_f_rgba_dxt5( const struct gl_texture_image *texImage,                            GLint i, GLint j, GLint k, GLfloat *texel ){   /* just sample as GLchan and convert to float here */   GLchan rgba[4];   fetch_texel_2d_rgba_dxt5(texImage, i, j, k, rgba);   texel[RCOMP] = CHAN_TO_FLOAT(rgba[RCOMP]);   texel[GCOMP] = CHAN_TO_FLOAT(rgba[GCOMP]);   texel[BCOMP] = CHAN_TO_FLOAT(rgba[BCOMP]);   texel[ACOMP] = CHAN_TO_FLOAT(rgba[ACOMP]);}const struct gl_texture_format _mesa_texformat_rgb_dxt1 = {   MESA_FORMAT_RGB_DXT1,		/* MesaFormat */   GL_RGB,				/* BaseFormat */   GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */   4, /*approx*/			/* RedBits */   4, /*approx*/			/* GreenBits */   4, /*approx*/			/* BlueBits */   0,					/* AlphaBits */   0,					/* LuminanceBits */   0,					/* IntensityBits */   0,					/* IndexBits */   0,					/* DepthBits */   0,					/* StencilBits */   0,					/* TexelBytes */   texstore_rgb_dxt1,			/* StoreTexImageFunc */   NULL, /*impossible*/ 		/* FetchTexel1D */   fetch_texel_2d_rgb_dxt1, 		/* FetchTexel2D */   NULL, /*impossible*/ 		/* FetchTexel3D */   NULL, /*impossible*/ 		/* FetchTexel1Df */   fetch_texel_2d_f_rgb_dxt1, 		/* FetchTexel2Df */   NULL, /*impossible*/ 		/* FetchTexel3Df */};const struct gl_texture_format _mesa_texformat_rgba_dxt1 = {   MESA_FORMAT_RGBA_DXT1,		/* MesaFormat */   GL_RGBA,				/* BaseFormat */   GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */   4, /*approx*/			/* RedBits */   4, /*approx*/			/* GreenBits */   4, /*approx*/			/* BlueBits */   1, /*approx*/			/* AlphaBits */   0,					/* LuminanceBits */   0,					/* IntensityBits */   0,					/* IndexBits */   0,					/* DepthBits */   0,					/* StencilBits */   0,					/* TexelBytes */   texstore_rgba_dxt1,			/* StoreTexImageFunc */   NULL, /*impossible*/ 		/* FetchTexel1D */   fetch_texel_2d_rgba_dxt1, 		/* FetchTexel2D */   NULL, /*impossible*/ 		/* FetchTexel3D */   NULL, /*impossible*/ 		/* FetchTexel1Df */   fetch_texel_2d_f_rgba_dxt1, 		/* FetchTexel2Df */   NULL, /*impossible*/ 		/* FetchTexel3Df */};const struct gl_texture_format _mesa_texformat_rgba_dxt3 = {   MESA_FORMAT_RGBA_DXT3,		/* MesaFormat */   GL_RGBA,				/* BaseFormat */   GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */   4, /*approx*/			/* RedBits */   4, /*approx*/			/* GreenBits */   4, /*approx*/			/* BlueBits */   4, /*approx*/			/* AlphaBits */   0,					/* LuminanceBits */   0,					/* IntensityBits */   0,					/* IndexBits */   0,					/* DepthBits */   0,					/* StencilBits */   0,					/* TexelBytes */   texstore_rgba_dxt3,			/* StoreTexImageFunc */   NULL, /*impossible*/ 		/* FetchTexel1D */   fetch_texel_2d_rgba_dxt3, 		/* FetchTexel2D */   NULL, /*impossible*/ 		/* FetchTexel3D */   NULL, /*impossible*/ 		/* FetchTexel1Df */   fetch_texel_2d_f_rgba_dxt3, 		/* FetchTexel2Df */   NULL, /*impossible*/ 		/* FetchTexel3Df */};const struct gl_texture_format _mesa_texformat_rgba_dxt5 = {   MESA_FORMAT_RGBA_DXT5,		/* MesaFormat */   GL_RGBA,				/* BaseFormat */   GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */   4,/*approx*/				/* RedBits */   4,/*approx*/				/* GreenBits */   4,/*approx*/				/* BlueBits */   4,/*approx*/				/* AlphaBits */   0,					/* LuminanceBits */   0,					/* IntensityBits */   0,					/* IndexBits */   0,					/* DepthBits */   0,					/* StencilBits */   0,					/* TexelBytes */   texstore_rgba_dxt5,			/* StoreTexImageFunc */   NULL, /*impossible*/ 		/* FetchTexel1D */   fetch_texel_2d_rgba_dxt5, 		/* FetchTexel2D */   NULL, /*impossible*/ 		/* FetchTexel3D */   NULL, /*impossible*/ 		/* FetchTexel1Df */   fetch_texel_2d_f_rgba_dxt5, 		/* FetchTexel2Df */   NULL, /*impossible*/ 		/* FetchTexel3Df */};

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?