windows-nt/Source/XPSP1/NT/multimedia/opengl/server/soft/so_texfn.c
2020-09-26 16:20:57 +08:00

727 lines
21 KiB
C

/*
** Copyright 1991,1992, Silicon Graphics, Inc.
** All Rights Reserved.
**
** This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
** the contents of this file may not be disclosed to third parties, copied or
** duplicated in any form, in whole or in part, without the prior written
** permission of Silicon Graphics, Inc.
**
** RESTRICTED RIGHTS LEGEND:
** Use, duplication or disclosure by the Government is subject to restrictions
** as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
** and Computer Software clause at DFARS 252.227-7013, and/or in similar or
** successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
** rights reserved under the Copyright Laws of the United States.
**
*/
#include "precomp.h"
#pragma hdrstop
/* 1 Component modulate */
void FASTCALL __glTextureModulateL(__GLcontext *gc, __GLcolor *color, __GLtexel *texel)
{
#ifdef __GL_LINT
gc = gc;
#endif
color->r = texel->luminance * color->r;
color->g = texel->luminance * color->g;
color->b = texel->luminance * color->b;
}
/* 2 Component modulate */
void FASTCALL __glTextureModulateLA(__GLcontext *gc, __GLcolor *color, __GLtexel *texel)
{
#ifdef __GL_LINT
gc = gc;
#endif
color->r = texel->luminance * color->r;
color->g = texel->luminance * color->g;
color->b = texel->luminance * color->b;
color->a = texel->alpha * color->a;
}
/* 3 Component modulate */
void FASTCALL __glTextureModulateRGB(__GLcontext *gc, __GLcolor *color, __GLtexel *texel)
{
#ifdef __GL_LINT
gc = gc;
#endif
color->r = texel->r * color->r;
color->g = texel->g * color->g;
color->b = texel->b * color->b;
}
/* 4 Component modulate */
void FASTCALL __glTextureModulateRGBA(__GLcontext *gc, __GLcolor *color, __GLtexel *texel)
{
#ifdef __GL_LINT
gc = gc;
#endif
color->r = texel->r * color->r;
color->g = texel->g * color->g;
color->b = texel->b * color->b;
color->a = texel->alpha * color->a;
}
/* Alpha modulate */
void FASTCALL __glTextureModulateA(__GLcontext *gc, __GLcolor *color, __GLtexel *texel)
{
#ifdef __GL_LINT
gc = gc;
#endif
color->a = texel->alpha * color->a;
}
/* Intensity modulate */
void FASTCALL __glTextureModulateI(__GLcontext *gc, __GLcolor *color, __GLtexel *texel)
{
#ifdef __GL_LINT
gc = gc;
#endif
color->r = texel->intensity * color->r;
color->g = texel->intensity * color->g;
color->b = texel->intensity * color->b;
color->a = texel->intensity * color->a;
}
/***********************************************************************/
/* 3 Component decal */
void FASTCALL __glTextureDecalRGB(__GLcontext *gc, __GLcolor *color, __GLtexel *texel)
{
color->r = texel->r * gc->frontBuffer.redScale;
color->g = texel->g * gc->frontBuffer.greenScale;
color->b = texel->b * gc->frontBuffer.blueScale;
}
/* 4 Component decal */
void FASTCALL __glTextureDecalRGBA(__GLcontext *gc, __GLcolor *color, __GLtexel *texel)
{
__GLfloat a = texel->alpha;
__GLfloat oma = __glOne - a;
color->r = oma * color->r
+ a * texel->r * gc->frontBuffer.redScale;
color->g = oma * color->g
+ a * texel->g * gc->frontBuffer.greenScale;
color->b = oma * color->b
+ a * texel->b * gc->frontBuffer.blueScale;
}
/***********************************************************************/
/* 1 Component blend */
void FASTCALL __glTextureBlendL(__GLcontext *gc, __GLcolor *color, __GLtexel *texel)
{
__GLfloat l = texel->luminance;
__GLfloat oml = __glOne - l;
__GLcolor *cc = &gc->state.texture.env[0].color;
color->r = oml * color->r + l * cc->r;
color->g = oml * color->g + l * cc->g;
color->b = oml * color->b + l * cc->b;
}
/* 2 Component blend */
void FASTCALL __glTextureBlendLA(__GLcontext *gc, __GLcolor *color, __GLtexel *texel)
{
__GLfloat l = texel->luminance;
__GLfloat oml = __glOne - l;
__GLcolor *cc = &gc->state.texture.env[0].color;
color->r = oml * color->r + l * cc->r;
color->g = oml * color->g + l * cc->g;
color->b = oml * color->b + l * cc->b;
color->a = texel->alpha * color->a;
}
/* 3 Component blend */
void FASTCALL __glTextureBlendRGB(__GLcontext *gc, __GLcolor *color, __GLtexel *texel)
{
__GLfloat r = texel->r;
__GLfloat g = texel->g;
__GLfloat b = texel->b;
__GLcolor *cc = &gc->state.texture.env[0].color;
color->r = (__glOne - r) * color->r + r * cc->r;
color->g = (__glOne - g) * color->g + g * cc->g;
color->b = (__glOne - b) * color->b + b * cc->b;
}
/* 4 Component blend */
void FASTCALL __glTextureBlendRGBA(__GLcontext *gc, __GLcolor *color, __GLtexel *texel)
{
__GLfloat r = texel->r;
__GLfloat g = texel->g;
__GLfloat b = texel->b;
__GLcolor *cc = &gc->state.texture.env[0].color;
color->r = (__glOne - r) * color->r + r * cc->r;
color->g = (__glOne - g) * color->g + g * cc->g;
color->b = (__glOne - b) * color->b + b * cc->b;
color->a = texel->alpha * color->a;
}
/* Alpha blend */
void FASTCALL __glTextureBlendA(__GLcontext *gc, __GLcolor *color, __GLtexel *texel)
{
#ifdef __GL_LINT
gc = gc;
#endif
color->a = texel->alpha * color->a;
}
/* Intensity blend */
void FASTCALL __glTextureBlendI(__GLcontext *gc, __GLcolor *color, __GLtexel *texel)
{
__GLfloat i = texel->intensity;
__GLfloat omi = __glOne - i;
__GLcolor *cc = &gc->state.texture.env[0].color;
color->r = omi * color->r + i * cc->r;
color->g = omi * color->g + i * cc->g;
color->b = omi * color->b + i * cc->b;
color->a = omi * color->a + i * cc->a;
}
/***********************************************************************/
/* 1 Component replace */
void FASTCALL __glTextureReplaceL(__GLcontext *gc, __GLcolor *color, __GLtexel *texel)
{
color->r = texel->luminance * gc->frontBuffer.redScale;
color->g = texel->luminance * gc->frontBuffer.greenScale;
color->b = texel->luminance * gc->frontBuffer.blueScale;
}
/* 2 Component replace */
void FASTCALL __glTextureReplaceLA(__GLcontext *gc, __GLcolor *color, __GLtexel *texel)
{
color->r = texel->luminance * gc->frontBuffer.redScale;
color->g = texel->luminance * gc->frontBuffer.greenScale;
color->b = texel->luminance * gc->frontBuffer.blueScale;
color->a = texel->alpha * gc->frontBuffer.alphaScale;
}
/* 3 Component replace */
void FASTCALL __glTextureReplaceRGB(__GLcontext *gc, __GLcolor *color, __GLtexel *texel)
{
color->r = texel->r * gc->frontBuffer.redScale;
color->g = texel->g * gc->frontBuffer.greenScale;
color->b = texel->b * gc->frontBuffer.blueScale;
}
/* 4 Component replace */
void FASTCALL __glTextureReplaceRGBA(__GLcontext *gc, __GLcolor *color, __GLtexel *texel)
{
color->r = texel->r * gc->frontBuffer.redScale;
color->g = texel->g * gc->frontBuffer.greenScale;
color->b = texel->b * gc->frontBuffer.blueScale;
color->a = texel->alpha * gc->frontBuffer.alphaScale;
}
/* Alpha replace */
void FASTCALL __glTextureReplaceA(__GLcontext *gc, __GLcolor *color, __GLtexel *texel)
{
color->a = texel->alpha * gc->frontBuffer.alphaScale;
}
/* Intensity replace */
void FASTCALL __glTextureReplaceI(__GLcontext *gc, __GLcolor *color, __GLtexel *texel)
{
color->r = texel->intensity * gc->frontBuffer.redScale;
color->g = texel->intensity * gc->frontBuffer.greenScale;
color->b = texel->intensity * gc->frontBuffer.blueScale;
color->a = texel->intensity * gc->frontBuffer.alphaScale;
}
/************************************************************************/
/*
** Get a texture element out of the one component texture buffer
** with no border.
*/
void FASTCALL __glExtractTexelL(__GLmipMapLevel *level, __GLtexture *tex,
GLint row, GLint col, __GLtexel *result)
{
__GLtextureBuffer *image;
if ((row < 0) || (col < 0) || (row >= level->height2) ||
(col >= level->width2)) {
/*
** Use border color when the texture supplies no border.
*/
result->luminance = tex->params.borderColor.r;
} else {
image = level->buffer + ((row << level->widthLog2) + col);
result->luminance = image[0];
}
}
/*
** Get a texture element out of the two component texture buffer
** with no border.
*/
void FASTCALL __glExtractTexelLA(__GLmipMapLevel *level, __GLtexture *tex,
GLint row, GLint col, __GLtexel *result)
{
__GLtextureBuffer *image;
if ((row < 0) || (col < 0) || (row >= level->height2) ||
(col >= level->width2)) {
/*
** Use border color when the texture supplies no border.
*/
result->luminance = tex->params.borderColor.r;
result->alpha = tex->params.borderColor.a;
} else {
image = level->buffer + ((row << level->widthLog2) + col) * 2;
result->luminance = image[0];
result->alpha = image[1];
}
}
/*
** Get a texture element out of the three component texture buffer
** with no border.
*/
void FASTCALL __glExtractTexelRGB(__GLmipMapLevel *level, __GLtexture *tex,
GLint row, GLint col, __GLtexel *result)
{
__GLtextureBuffer *image;
if ((row < 0) || (col < 0) || (row >= level->height2) ||
(col >= level->width2)) {
/*
** Use border color when the texture supplies no border.
*/
result->r = tex->params.borderColor.r;
result->g = tex->params.borderColor.g;
result->b = tex->params.borderColor.b;
} else {
image = level->buffer + ((row << level->widthLog2) + col) * 3;
result->r = image[0];
result->g = image[1];
result->b = image[2];
}
}
/*
** Get a texture element out of the four component texture buffer
** with no border.
*/
void FASTCALL __glExtractTexelRGBA(__GLmipMapLevel *level, __GLtexture *tex,
GLint row, GLint col, __GLtexel *result)
{
__GLtextureBuffer *image;
if ((row < 0) || (col < 0) || (row >= level->height2) ||
(col >= level->width2)) {
/*
** Use border color when the texture supplies no border.
*/
result->r = tex->params.borderColor.r;
result->g = tex->params.borderColor.g;
result->b = tex->params.borderColor.b;
result->alpha = tex->params.borderColor.a;
} else {
image = level->buffer + ((row << level->widthLog2) + col) * 4;
result->r = image[0];
result->g = image[1];
result->b = image[2];
result->alpha = image[3];
}
}
void FASTCALL __glExtractTexelA(__GLmipMapLevel *level, __GLtexture *tex,
GLint row, GLint col, __GLtexel *result)
{
__GLtextureBuffer *image;
if ((row < 0) || (col < 0) || (row >= level->height2) ||
(col >= level->width2)) {
/*
** Use border color when the texture supplies no border.
*/
result->alpha = tex->params.borderColor.a;
} else {
image = level->buffer + ((row << level->widthLog2) + col);
result->alpha = image[0];
}
}
void FASTCALL __glExtractTexelI(__GLmipMapLevel *level, __GLtexture *tex,
GLint row, GLint col, __GLtexel *result)
{
__GLtextureBuffer *image;
if ((row < 0) || (col < 0) || (row >= level->height2) ||
(col >= level->width2)) {
/*
** Use border color when the texture supplies no border.
*/
result->intensity = tex->params.borderColor.r;
} else {
image = level->buffer + ((row << level->widthLog2) + col);
result->intensity = image[0];
}
}
void FASTCALL __glExtractTexelBGR8(__GLmipMapLevel *level, __GLtexture *tex,
GLint row, GLint col, __GLtexel *result)
{
__GLcontext *gc = tex->gc;
GLubyte *image;
if ((row < 0) || (col < 0) || (row >= level->height2) ||
(col >= level->width2)) {
/*
** Use border color when the texture supplies no border.
*/
result->r = tex->params.borderColor.r;
result->g = tex->params.borderColor.g;
result->b = tex->params.borderColor.b;
} else {
image = (GLubyte *)level->buffer + ((row << level->widthLog2) + col) * 4;
result->r = __GL_UB_TO_FLOAT(image[2]);
result->g = __GL_UB_TO_FLOAT(image[1]);
result->b = __GL_UB_TO_FLOAT(image[0]);
}
}
void FASTCALL __glExtractTexelBGRA8(__GLmipMapLevel *level, __GLtexture *tex,
GLint row, GLint col, __GLtexel *result)
{
__GLcontext *gc = tex->gc;
GLubyte *image;
if ((row < 0) || (col < 0) || (row >= level->height2) ||
(col >= level->width2)) {
/*
** Use border color when the texture supplies no border.
*/
result->r = tex->params.borderColor.r;
result->g = tex->params.borderColor.g;
result->b = tex->params.borderColor.b;
result->alpha = tex->params.borderColor.a;
} else {
image = (GLubyte *)level->buffer + ((row << level->widthLog2) + col) * 4;
result->r = __GL_UB_TO_FLOAT(image[2]);
result->g = __GL_UB_TO_FLOAT(image[1]);
result->b = __GL_UB_TO_FLOAT(image[0]);
result->alpha = __GL_UB_TO_FLOAT(image[3]);
}
}
#ifdef GL_EXT_paletted_texture
void FASTCALL __glExtractTexelPI8BGRA(__GLmipMapLevel *level, __GLtexture *tex,
GLint row, GLint col, __GLtexel *result)
{
__GLcontext *gc = tex->gc;
GLubyte *image;
RGBQUAD *rgb;
if ((row < 0) || (col < 0) || (row >= level->height2) ||
(col >= level->width2)) {
/*
** Use border color when the texture supplies no border.
*/
result->r = tex->params.borderColor.r;
result->g = tex->params.borderColor.g;
result->b = tex->params.borderColor.b;
result->alpha = tex->params.borderColor.a;
} else {
image = (GLubyte *)level->buffer + ((row << level->widthLog2) + col);
rgb = &tex->paletteData[image[0] & (tex->paletteSize-1)];
result->r = __GL_UB_TO_FLOAT(rgb->rgbRed);
result->g = __GL_UB_TO_FLOAT(rgb->rgbGreen);
result->b = __GL_UB_TO_FLOAT(rgb->rgbBlue);
result->alpha = __GL_UB_TO_FLOAT(rgb->rgbReserved);
}
}
void FASTCALL __glExtractTexelPI8BGR(__GLmipMapLevel *level, __GLtexture *tex,
GLint row, GLint col, __GLtexel *result)
{
__GLcontext *gc = tex->gc;
GLubyte *image;
RGBQUAD *rgb;
if ((row < 0) || (col < 0) || (row >= level->height2) ||
(col >= level->width2)) {
/*
** Use border color when the texture supplies no border.
*/
result->r = tex->params.borderColor.r;
result->g = tex->params.borderColor.g;
result->b = tex->params.borderColor.b;
} else {
image = (GLubyte *)level->buffer + ((row << level->widthLog2) + col);
rgb = &tex->paletteData[image[0] & (tex->paletteSize-1)];
result->r = __GL_UB_TO_FLOAT(rgb->rgbRed);
result->g = __GL_UB_TO_FLOAT(rgb->rgbGreen);
result->b = __GL_UB_TO_FLOAT(rgb->rgbBlue);
}
}
void FASTCALL __glExtractTexelPI16BGRA(__GLmipMapLevel *level, __GLtexture *tex,
GLint row, GLint col, __GLtexel *result)
{
__GLcontext *gc = tex->gc;
GLushort *image;
RGBQUAD *rgb;
if ((row < 0) || (col < 0) || (row >= level->height2) ||
(col >= level->width2)) {
/*
** Use border color when the texture supplies no border.
*/
result->r = tex->params.borderColor.r;
result->g = tex->params.borderColor.g;
result->b = tex->params.borderColor.b;
result->alpha = tex->params.borderColor.a;
} else {
image = (GLushort *)level->buffer + ((row << level->widthLog2) + col);
rgb = &tex->paletteData[image[0] & (tex->paletteSize-1)];
result->r = __GL_UB_TO_FLOAT(rgb->rgbRed);
result->g = __GL_UB_TO_FLOAT(rgb->rgbGreen);
result->b = __GL_UB_TO_FLOAT(rgb->rgbBlue);
result->alpha = __GL_UB_TO_FLOAT(rgb->rgbReserved);
}
}
void FASTCALL __glExtractTexelPI16BGR(__GLmipMapLevel *level, __GLtexture *tex,
GLint row, GLint col, __GLtexel *result)
{
__GLcontext *gc = tex->gc;
GLushort *image;
RGBQUAD *rgb;
if ((row < 0) || (col < 0) || (row >= level->height2) ||
(col >= level->width2)) {
/*
** Use border color when the texture supplies no border.
*/
result->r = tex->params.borderColor.r;
result->g = tex->params.borderColor.g;
result->b = tex->params.borderColor.b;
} else {
image = (GLushort *)level->buffer + ((row << level->widthLog2) + col);
rgb = &tex->paletteData[image[0] & (tex->paletteSize-1)];
result->r = __GL_UB_TO_FLOAT(rgb->rgbRed);
result->g = __GL_UB_TO_FLOAT(rgb->rgbGreen);
result->b = __GL_UB_TO_FLOAT(rgb->rgbBlue);
}
}
#endif // GL_EXT_paletted_texture
/*
** Get a texture element out of the one component texture buffer
** with a border.
*/
void FASTCALL __glExtractTexelL_B(__GLmipMapLevel *level, __GLtexture *tex,
GLint row, GLint col, __GLtexel *result)
{
__GLtextureBuffer *image;
#ifdef __GL_LINT
tex = tex;
#endif
row++;
col++;
image = level->buffer + (row * level->width + col);
result->luminance = image[0];
}
/*
** Get a texture element out of the two component texture buffer
** with a border.
*/
void FASTCALL __glExtractTexelLA_B(__GLmipMapLevel *level, __GLtexture *tex,
GLint row, GLint col, __GLtexel *result)
{
__GLtextureBuffer *image;
#ifdef __GL_LINT
tex = tex;
#endif
row++;
col++;
image = level->buffer + (row * level->width + col) * 2;
result->luminance = image[0];
result->alpha = image[1];
}
/*
** Get a texture element out of the three component texture buffer
** with a border.
*/
void FASTCALL __glExtractTexelRGB_B(__GLmipMapLevel *level, __GLtexture *tex,
GLint row, GLint col, __GLtexel *result)
{
__GLtextureBuffer *image;
#ifdef __GL_LINT
tex = tex;
#endif
row++;
col++;
image = level->buffer + (row * level->width + col) * 3;
result->r = image[0];
result->g = image[1];
result->b = image[2];
}
/*
** Get a texture element out of the four component texture buffer
** with a border.
*/
void FASTCALL __glExtractTexelRGBA_B(__GLmipMapLevel *level, __GLtexture *tex,
GLint row, GLint col, __GLtexel *result)
{
__GLtextureBuffer *image;
#ifdef __GL_LINT
tex = tex;
#endif
row++;
col++;
image = level->buffer + (row * level->width + col) * 4;
result->r = image[0];
result->g = image[1];
result->b = image[2];
result->alpha = image[3];
}
void FASTCALL __glExtractTexelA_B(__GLmipMapLevel *level, __GLtexture *tex,
GLint row, GLint col, __GLtexel *result)
{
__GLtextureBuffer *image;
#ifdef __GL_LINT
tex = tex;
#endif
row++;
col++;
image = level->buffer + (row * level->width + col);
result->alpha = image[0];
}
void FASTCALL __glExtractTexelI_B(__GLmipMapLevel *level, __GLtexture *tex,
GLint row, GLint col, __GLtexel *result)
{
__GLtextureBuffer *image;
#ifdef __GL_LINT
tex = tex;
#endif
row++;
col++;
image = level->buffer + (row * level->width + col);
result->intensity = image[0];
}
void FASTCALL __glExtractTexelBGR8_B(__GLmipMapLevel *level, __GLtexture *tex,
GLint row, GLint col, __GLtexel *result)
{
__GLcontext *gc = tex->gc;
GLubyte *image;
#ifdef __GL_LINT
tex = tex;
#endif
row++;
col++;
image = (GLubyte *)level->buffer + (row * level->width + col) * 4;
result->r = __GL_UB_TO_FLOAT(image[2]);
result->g = __GL_UB_TO_FLOAT(image[1]);
result->b = __GL_UB_TO_FLOAT(image[0]);
}
void FASTCALL __glExtractTexelBGRA8_B(__GLmipMapLevel *level, __GLtexture *tex,
GLint row, GLint col, __GLtexel *result)
{
__GLcontext *gc = tex->gc;
GLubyte *image;
#ifdef __GL_LINT
tex = tex;
#endif
row++;
col++;
image = (GLubyte *)level->buffer + (row * level->width + col) * 4;
result->r = __GL_UB_TO_FLOAT(image[2]);
result->g = __GL_UB_TO_FLOAT(image[1]);
result->b = __GL_UB_TO_FLOAT(image[0]);
result->alpha = __GL_UB_TO_FLOAT(image[3]);
}
#ifdef GL_EXT_paletted_texture
void FASTCALL __glExtractTexelPI8BGRA_B(__GLmipMapLevel *level, __GLtexture *tex,
GLint row, GLint col, __GLtexel *result)
{
__GLcontext *gc = tex->gc;
GLubyte *image;
RGBQUAD *rgb;
row++;
col++;
image = (GLubyte *)level->buffer + (row * level->width + col);
rgb = &tex->paletteData[image[0] & (tex->paletteSize-1)];
result->r = __GL_UB_TO_FLOAT(rgb->rgbRed);
result->g = __GL_UB_TO_FLOAT(rgb->rgbGreen);
result->b = __GL_UB_TO_FLOAT(rgb->rgbBlue);
result->alpha = __GL_UB_TO_FLOAT(rgb->rgbReserved);
}
void FASTCALL __glExtractTexelPI8BGR_B(__GLmipMapLevel *level, __GLtexture *tex,
GLint row, GLint col, __GLtexel *result)
{
__GLcontext *gc = tex->gc;
GLubyte *image;
RGBQUAD *rgb;
row++;
col++;
image = (GLubyte *)level->buffer + (row * level->width + col);
rgb = &tex->paletteData[image[0] & (tex->paletteSize-1)];
result->r = __GL_UB_TO_FLOAT(rgb->rgbRed);
result->g = __GL_UB_TO_FLOAT(rgb->rgbGreen);
result->b = __GL_UB_TO_FLOAT(rgb->rgbBlue);
}
void FASTCALL __glExtractTexelPI16BGRA_B(__GLmipMapLevel *level, __GLtexture *tex,
GLint row, GLint col, __GLtexel *result)
{
__GLcontext *gc = tex->gc;
GLushort *image;
RGBQUAD *rgb;
row++;
col++;
image = (GLushort *)level->buffer + (row * level->width + col);
rgb = &tex->paletteData[image[0] & (tex->paletteSize-1)];
result->r = __GL_UB_TO_FLOAT(rgb->rgbRed);
result->g = __GL_UB_TO_FLOAT(rgb->rgbGreen);
result->b = __GL_UB_TO_FLOAT(rgb->rgbBlue);
result->alpha = __GL_UB_TO_FLOAT(rgb->rgbReserved);
}
void FASTCALL __glExtractTexelPI16BGR_B(__GLmipMapLevel *level, __GLtexture *tex,
GLint row, GLint col, __GLtexel *result)
{
__GLcontext *gc = tex->gc;
GLushort *image;
RGBQUAD *rgb;
row++;
col++;
image = (GLushort *)level->buffer + (row * level->width + col);
rgb = &tex->paletteData[image[0] & (tex->paletteSize-1)];
result->r = __GL_UB_TO_FLOAT(rgb->rgbRed);
result->g = __GL_UB_TO_FLOAT(rgb->rgbGreen);
result->b = __GL_UB_TO_FLOAT(rgb->rgbBlue);
}
#endif // GL_EXT_paletted_texture