📄 texformat_tmp.h
字号:
texel[GCOMP] =
texel[BCOMP] = 0.0;
texel[ACOMP] = UBYTE_TO_FLOAT( src[0] );
}
#if DIM == 3
static void store_texel_a8(struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, const void *texel)
{
const GLubyte *rgba = (const GLubyte *) texel;
GLubyte *dst = UBYTE_ADDR(texImage, i, j, k, 1);
*dst = rgba[ACOMP];
}
#endif
/* MESA_FORMAT_L8 ************************************************************/
/* Fetch texel from 1D, 2D or 3D l8 texture, return 4 GLchans */
static void FETCH(l8)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLchan *texel )
{
const GLubyte *src = UBYTE_ADDR( texImage, i, j, k, 1 );
texel[RCOMP] =
texel[GCOMP] =
texel[BCOMP] = UBYTE_TO_CHAN( src[0] );
texel[ACOMP] = CHAN_MAX;
}
/* Fetch texel from 1D, 2D or 3D l8 texture, return 4 GLfloats */
static void FETCH(f_l8)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLfloat *texel )
{
const GLubyte *src = UBYTE_ADDR( texImage, i, j, k, 1 );
texel[RCOMP] =
texel[GCOMP] =
texel[BCOMP] = UBYTE_TO_FLOAT( src[0] );
texel[ACOMP] = 1.0F;
}
#if DIM == 3
static void store_texel_l8(struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, const void *texel)
{
const GLubyte *rgba = (const GLubyte *) texel;
GLubyte *dst = UBYTE_ADDR(texImage, i, j, k, 1);
*dst = rgba[RCOMP];
}
#endif
/* MESA_FORMAT_I8 ************************************************************/
/* Fetch texel from 1D, 2D or 3D i8 texture, return 4 GLchans */
static void FETCH(i8)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLchan *texel )
{
const GLubyte *src = UBYTE_ADDR( texImage, i, j, k, 1 );
texel[RCOMP] =
texel[GCOMP] =
texel[BCOMP] =
texel[ACOMP] = UBYTE_TO_CHAN( src[0] );
}
/* Fetch texel from 1D, 2D or 3D i8 texture, return 4 GLfloats */
static void FETCH(f_i8)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLfloat *texel )
{
const GLubyte *src = UBYTE_ADDR( texImage, i, j, k, 1 );
texel[RCOMP] =
texel[GCOMP] =
texel[BCOMP] =
texel[ACOMP] = UBYTE_TO_FLOAT( src[0] );
}
#if DIM == 3
static void store_texel_i8(struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, const void *texel)
{
const GLubyte *rgba = (const GLubyte *) texel;
GLubyte *dst = UBYTE_ADDR(texImage, i, j, k, 1);
*dst = rgba[RCOMP];
}
#endif
/* MESA_FORMAT_CI8 ***********************************************************/
/* Fetch CI texel from 1D, 2D or 3D ci8 texture, lookup the index in a
* color table, and return 4 GLchans.
*/
static void FETCH(ci8)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLchan *texel )
{
const GLubyte *src = UBYTE_ADDR( texImage, i, j, k, 1 );
const struct gl_color_table *palette;
const GLchan *table;
GLuint index;
GET_CURRENT_CONTEXT(ctx);
if (ctx->Texture.SharedPalette) {
palette = &ctx->Texture.Palette;
}
else {
palette = &texImage->TexObject->Palette;
}
if (palette->Size == 0)
return; /* undefined results */
ASSERT(palette->Type != GL_FLOAT);
table = (const GLchan *) palette->Table;
/* Mask the index against size of palette to avoid going out of bounds */
index = (*src) & (palette->Size - 1);
switch (palette->Format) {
case GL_ALPHA:
texel[RCOMP] =
texel[GCOMP] =
texel[BCOMP] = 0;
texel[ACOMP] = table[index];
return;
case GL_LUMINANCE:
texel[RCOMP] =
texel[GCOMP] =
texel[BCOMP] = table[index];
texel[ACOMP] = CHAN_MAX;
break;
case GL_INTENSITY:
texel[RCOMP] =
texel[GCOMP] =
texel[BCOMP] =
texel[ACOMP] = table[index];
return;
case GL_LUMINANCE_ALPHA:
texel[RCOMP] =
texel[GCOMP] =
texel[BCOMP] = table[index * 2 + 0];
texel[ACOMP] = table[index * 2 + 1];
return;
case GL_RGB:
texel[RCOMP] = table[index * 3 + 0];
texel[GCOMP] = table[index * 3 + 1];
texel[BCOMP] = table[index * 3 + 2];
texel[ACOMP] = CHAN_MAX;
return;
case GL_RGBA:
texel[RCOMP] = table[index * 4 + 0];
texel[GCOMP] = table[index * 4 + 1];
texel[BCOMP] = table[index * 4 + 2];
texel[ACOMP] = table[index * 4 + 3];
return;
default:
_mesa_problem(ctx, "Bad palette format in palette_sample");
}
}
/* Fetch CI texel from 1D, 2D or 3D ci8 texture, lookup the index in a
* color table, and return 4 GLfloats.
*/
static void FETCH(f_ci8)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLfloat *texel )
{
GLchan rgba[4];
/* Sample as GLchan */
FETCH(ci8)(texImage, i, j, k, rgba);
/* and return as floats */
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]);
}
#if DIM == 3
static void store_texel_ci8(struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, const void *texel)
{
const GLubyte *index = (const GLubyte *) texel;
GLubyte *dst = UBYTE_ADDR(texImage, i, j, k, 1);
*dst = *index;
}
#endif
/* MESA_FORMAT_YCBCR *********************************************************/
/* Fetch texel from 1D, 2D or 3D ycbcr texture, return 4 GLchans */
/* We convert YCbCr to RGB here */
/* XXX this may break if GLchan != GLubyte */
static void FETCH(ycbcr)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLchan *texel )
{
const GLushort *src0 = USHORT_ADDR( texImage, (i & ~1), j, k ); /* even */
const GLushort *src1 = src0 + 1; /* odd */
const GLubyte y0 = (*src0 >> 8) & 0xff; /* luminance */
const GLubyte cb = *src0 & 0xff; /* chroma U */
const GLubyte y1 = (*src1 >> 8) & 0xff; /* luminance */
const GLubyte cr = *src1 & 0xff; /* chroma V */
GLint r, g, b;
if (i & 1) {
/* odd pixel: use y1,cr,cb */
r = (GLint) (1.164 * (y1-16) + 1.596 * (cr-128));
g = (GLint) (1.164 * (y1-16) - 0.813 * (cr-128) - 0.391 * (cb-128));
b = (GLint) (1.164 * (y1-16) + 2.018 * (cb-128));
}
else {
/* even pixel: use y0,cr,cb */
r = (GLint) (1.164 * (y0-16) + 1.596 * (cr-128));
g = (GLint) (1.164 * (y0-16) - 0.813 * (cr-128) - 0.391 * (cb-128));
b = (GLint) (1.164 * (y0-16) + 2.018 * (cb-128));
}
texel[RCOMP] = CLAMP(r, 0, CHAN_MAX);
texel[GCOMP] = CLAMP(g, 0, CHAN_MAX);
texel[BCOMP] = CLAMP(b, 0, CHAN_MAX);
texel[ACOMP] = CHAN_MAX;
}
/* Fetch texel from 1D, 2D or 3D ycbcr texture, return 4 GLfloats */
/* We convert YCbCr to RGB here */
static void FETCH(f_ycbcr)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLfloat *texel )
{
const GLushort *src0 = USHORT_ADDR( texImage, (i & ~1), j, k ); /* even */
const GLushort *src1 = src0 + 1; /* odd */
const GLubyte y0 = (*src0 >> 8) & 0xff; /* luminance */
const GLubyte cb = *src0 & 0xff; /* chroma U */
const GLubyte y1 = (*src1 >> 8) & 0xff; /* luminance */
const GLubyte cr = *src1 & 0xff; /* chroma V */
GLfloat r, g, b;
if (i & 1) {
/* odd pixel: use y1,cr,cb */
r = (1.164 * (y1-16) + 1.596 * (cr-128));
g = (1.164 * (y1-16) - 0.813 * (cr-128) - 0.391 * (cb-128));
b = (1.164 * (y1-16) + 2.018 * (cb-128));
}
else {
/* even pixel: use y0,cr,cb */
r = (1.164 * (y0-16) + 1.596 * (cr-128));
g = (1.164 * (y0-16) - 0.813 * (cr-128) - 0.391 * (cb-128));
b = (1.164 * (y0-16) + 2.018 * (cb-128));
}
/* XXX remove / 255 here by tweaking arithmetic above */
r /= 255.0;
g /= 255.0;
b /= 255.0;
/* XXX should we really clamp??? */
texel[RCOMP] = CLAMP(r, 0.0, 1.0);
texel[GCOMP] = CLAMP(g, 0.0, 1.0);
texel[BCOMP] = CLAMP(b, 0.0, 1.0);
texel[ACOMP] = 1.0F;
}
#if DIM == 3
static void store_texel_ycbcr(struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, const void *texel)
{
/* XXX to do */
}
#endif
/* MESA_FORMAT_YCBCR_REV *****************************************************/
/* Fetch texel from 1D, 2D or 3D ycbcr_rev texture, return 4 GLchans */
/* We convert YCbCr to RGB here */
/* XXX this may break if GLchan != GLubyte */
static void FETCH(ycbcr_rev)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLchan *texel )
{
const GLushort *src0 = USHORT_ADDR( texImage, (i & ~1), j, k ); /* even */
const GLushort *src1 = src0 + 1; /* odd */
const GLubyte y0 = *src0 & 0xff; /* luminance */
const GLubyte cr = (*src0 >> 8) & 0xff; /* chroma V */
const GLubyte y1 = *src1 & 0xff; /* luminance */
const GLubyte cb = (*src1 >> 8) & 0xff; /* chroma U */
GLint r, g, b;
if (i & 1) {
/* odd pixel: use y1,cr,cb */
r = (GLint) (1.164 * (y1-16) + 1.596 * (cr-128));
g = (GLint) (1.164 * (y1-16) - 0.813 * (cr-128) - 0.391 * (cb-128));
b = (GLint) (1.164 * (y1-16) + 2.018 * (cb-128));
}
else {
/* even pixel: use y0,cr,cb */
r = (GLint) (1.164 * (y0-16) + 1.596 * (cr-128));
g = (GLint) (1.164 * (y0-16) - 0.813 * (cr-128) - 0.391 * (cb-128));
b = (GLint) (1.164 * (y0-16) + 2.018 * (cb-128));
}
texel[RCOMP] = CLAMP(r, 0, CHAN_MAX);
texel[GCOMP] = CLAMP(g, 0, CHAN_MAX);
texel[BCOMP] = CLAMP(b, 0, CHAN_MAX);
texel[ACOMP] = CHAN_MAX;
}
/* Fetch texel from 1D, 2D or 3D ycbcr_rev texture, return 4 GLfloats */
/* We convert YCbCr to RGB here */
static void FETCH(f_ycbcr_rev)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLfloat *texel )
{
const GLushort *src0 = USHORT_ADDR( texImage, (i & ~1), j, k ); /* even */
const GLushort *src1 = src0 + 1; /* odd */
const GLubyte y0 = *src0 & 0xff; /* luminance */
const GLubyte cr = (*src0 >> 8) & 0xff; /* chroma V */
const GLubyte y1 = *src1 & 0xff; /* luminance */
const GLubyte cb = (*src1 >> 8) & 0xff; /* chroma U */
GLfloat r, g, b;
if (i & 1) {
/* odd pixel: use y1,cr,cb */
r = (1.164 * (y1-16) + 1.596 * (cr-128));
g = (1.164 * (y1-16) - 0.813 * (cr-128) - 0.391 * (cb-128));
b = (1.164 * (y1-16) + 2.018 * (cb-128));
}
else {
/* even pixel: use y0,cr,cb */
r = (1.164 * (y0-16) + 1.596 * (cr-128));
g = (1.164 * (y0-16) - 0.813 * (cr-128) - 0.391 * (cb-128));
b = (1.164 * (y0-16) + 2.018 * (cb-128));
}
/* XXX remove / 255 here by tweaking arithmetic above */
r /= 255.0;
g /= 255.0;
b /= 255.0;
/* XXX should we really clamp??? */
texel[RCOMP] = CLAMP(r, 0.0, 1.0);
texel[GCOMP] = CLAMP(g, 0.0, 1.0);
texel[BCOMP] = CLAMP(b, 0.0, 1.0);
texel[ACOMP] = 1.0F;
}
#if DIM == 3
static void store_texel_ycbcr_rev(struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, const void *texel)
{
/* XXX to do */
}
#endif
#undef CHAN_ADDR
#undef UBYTE_ADDR
#undef USHORT_ADDR
#undef UINT_ADDR
#undef FLOAT_ADDR
#undef HALF_ADDR
#undef FETCH
#undef DIM
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -