blob: eecbf0da5de44637a6d288c6277ab4db300845bd [file] [log] [blame]
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Gareth Hughes <gareth@valinux.com>
*/
/* Template for immediate mode color functions.
*
* FIXME: Floating-point color versions of these...
*/
static void TAG(Color3f)( GLfloat r, GLfloat g, GLfloat b )
{
GET_CURRENT;
#ifdef COLOR_IS_FLOAT
CURRENT_COLOR( RCOMP ) = CLAMP(r, 0.0f, 1.0f);
CURRENT_COLOR( GCOMP ) = CLAMP(g, 0.0f, 1.0f);
CURRENT_COLOR( BCOMP ) = CLAMP(b, 0.0f, 1.0f);
CURRENT_COLOR( ACOMP ) = 1.0f;
#else
UNCLAMPED_FLOAT_TO_UBYTE( CURRENT_COLOR( RCOMP ), r );
UNCLAMPED_FLOAT_TO_UBYTE( CURRENT_COLOR( GCOMP ), g );
UNCLAMPED_FLOAT_TO_UBYTE( CURRENT_COLOR( BCOMP ), b );
CURRENT_COLOR( ACOMP ) = 255;
#endif
}
static void TAG(Color3fv)( const GLfloat *v )
{
GET_CURRENT;
#ifdef COLOR_IS_FLOAT
CURRENT_COLOR( RCOMP ) = CLAMP(v[0], 0.0f, 1.0f);
CURRENT_COLOR( GCOMP ) = CLAMP(v[1], 0.0f, 1.0f);
CURRENT_COLOR( BCOMP ) = CLAMP(v[2], 0.0f, 1.0f);
CURRENT_COLOR( ACOMP ) = 1.0f;
#else
UNCLAMPED_FLOAT_TO_UBYTE( CURRENT_COLOR( RCOMP ), v[0] );
UNCLAMPED_FLOAT_TO_UBYTE( CURRENT_COLOR( GCOMP ), v[1] );
UNCLAMPED_FLOAT_TO_UBYTE( CURRENT_COLOR( BCOMP ), v[2] );
CURRENT_COLOR( ACOMP ) = 255;
#endif
}
static void TAG(Color3ub)( GLubyte r, GLubyte g, GLubyte b )
{
GET_CURRENT;
#ifdef COLOR_IS_FLOAT
CURRENT_COLOR( RCOMP ) = UBYTE_TO_FLOAT( r );
CURRENT_COLOR( GCOMP ) = UBYTE_TO_FLOAT( g );
CURRENT_COLOR( BCOMP ) = UBYTE_TO_FLOAT( b );
CURRENT_COLOR( ACOMP ) = 1.0f;
#else
CURRENT_COLOR( RCOMP ) = r;
CURRENT_COLOR( GCOMP ) = g;
CURRENT_COLOR( BCOMP ) = b;
CURRENT_COLOR( ACOMP ) = 255;
#endif
}
static void TAG(Color3ubv)( const GLubyte *v )
{
GET_CURRENT;
#ifdef COLOR_IS_FLOAT
CURRENT_COLOR( RCOMP ) = UBYTE_TO_FLOAT( v[0] );
CURRENT_COLOR( GCOMP ) = UBYTE_TO_FLOAT( v[1] );
CURRENT_COLOR( BCOMP ) = UBYTE_TO_FLOAT( v[2] );
CURRENT_COLOR( ACOMP ) = 1.0f;
#else
CURRENT_COLOR( RCOMP ) = v[0];
CURRENT_COLOR( GCOMP ) = v[1];
CURRENT_COLOR( BCOMP ) = v[2];
CURRENT_COLOR( ACOMP ) = 255;
#endif
}
static void TAG(Color4f)( GLfloat r, GLfloat g, GLfloat b, GLfloat a )
{
GET_CURRENT;
#ifdef COLOR_IS_FLOAT
CURRENT_COLOR( RCOMP ) = CLAMP(r, 0.0f, 1.0f);
CURRENT_COLOR( GCOMP ) = CLAMP(g, 0.0f, 1.0f);
CURRENT_COLOR( BCOMP ) = CLAMP(b, 0.0f, 1.0f);
CURRENT_COLOR( ACOMP ) = CLAMP(a, 0.0f, 1.0f);
#else
UNCLAMPED_FLOAT_TO_UBYTE( CURRENT_COLOR( RCOMP ), r );
UNCLAMPED_FLOAT_TO_UBYTE( CURRENT_COLOR( GCOMP ), g );
UNCLAMPED_FLOAT_TO_UBYTE( CURRENT_COLOR( BCOMP ), b );
UNCLAMPED_FLOAT_TO_UBYTE( CURRENT_COLOR( ACOMP ), a );
#endif
}
static void TAG(Color4fv)( const GLfloat *v )
{
GET_CURRENT;
#ifdef COLOR_IS_FLOAT
CURRENT_COLOR( RCOMP ) = CLAMP(v[0], 0.0f, 1.0f);
CURRENT_COLOR( GCOMP ) = CLAMP(v[1], 0.0f, 1.0f);
CURRENT_COLOR( BCOMP ) = CLAMP(v[2], 0.0f, 1.0f);
CURRENT_COLOR( ACOMP ) = CLAMP(v[3], 0.0f, 1.0f);
#else
UNCLAMPED_FLOAT_TO_UBYTE( CURRENT_COLOR( RCOMP ), v[0] );
UNCLAMPED_FLOAT_TO_UBYTE( CURRENT_COLOR( GCOMP ), v[1] );
UNCLAMPED_FLOAT_TO_UBYTE( CURRENT_COLOR( BCOMP ), v[2] );
UNCLAMPED_FLOAT_TO_UBYTE( CURRENT_COLOR( ACOMP ), v[3] );
#endif
}
static void TAG(Color4ub)( GLubyte r, GLubyte g, GLubyte b, GLubyte a )
{
GET_CURRENT;
#ifdef COLOR_IS_FLOAT
CURRENT_COLOR( RCOMP ) = UBYTE_TO_FLOAT( r );
CURRENT_COLOR( GCOMP ) = UBYTE_TO_FLOAT( g );
CURRENT_COLOR( BCOMP ) = UBYTE_TO_FLOAT( b );
CURRENT_COLOR( ACOMP ) = UBYTE_TO_FLOAT( a );
#else
CURRENT_COLOR( RCOMP ) = r;
CURRENT_COLOR( GCOMP ) = g;
CURRENT_COLOR( BCOMP ) = b;
CURRENT_COLOR( ACOMP ) = a;
#endif
}
static void TAG(Color4ubv)( const GLubyte *v )
{
GET_CURRENT;
#ifdef COLOR_IS_FLOAT
CURRENT_COLOR( RCOMP ) = UBYTE_TO_FLOAT( v[0] );
CURRENT_COLOR( GCOMP ) = UBYTE_TO_FLOAT( v[1] );
CURRENT_COLOR( BCOMP ) = UBYTE_TO_FLOAT( v[2] );
CURRENT_COLOR( ACOMP ) = UBYTE_TO_FLOAT( v[3] );
#else
CURRENT_COLOR( RCOMP ) = v[0];
CURRENT_COLOR( GCOMP ) = v[1];
CURRENT_COLOR( BCOMP ) = v[2];
CURRENT_COLOR( ACOMP ) = v[3];
#endif
}
static void TAG(ColorMaterial3f)( GLfloat r, GLfloat g, GLfloat b )
{
GET_CURRENT_CONTEXT(ctx);
GLfloat *color = ctx->Current.Color;
color[0] = r;
color[1] = g;
color[2] = b;
color[3] = 1.0;
_mesa_update_color_material( ctx, color );
RECALC_BASE_COLOR( ctx );
}
static void TAG(ColorMaterial3fv)( const GLfloat *v )
{
GET_CURRENT_CONTEXT(ctx);
GLfloat *color = ctx->Current.Color;
color[0] = v[0];
color[1] = v[1];
color[2] = v[2];
color[3] = 1.0;
_mesa_update_color_material( ctx, color );
RECALC_BASE_COLOR( ctx );
}
static void TAG(ColorMaterial3ub)( GLubyte r, GLubyte g, GLubyte b )
{
GET_CURRENT_CONTEXT(ctx);
GLfloat *color = ctx->Current.Color;
color[0] = UBYTE_TO_FLOAT( r );
color[1] = UBYTE_TO_FLOAT( g );
color[2] = UBYTE_TO_FLOAT( b );
color[3] = 1.0;
_mesa_update_color_material( ctx, color );
RECALC_BASE_COLOR( ctx );
}
static void TAG(ColorMaterial3ubv)( const GLubyte *v )
{
GET_CURRENT_CONTEXT(ctx);
GLfloat *color = ctx->Current.Color;
color[0] = UBYTE_TO_FLOAT( v[0] );
color[1] = UBYTE_TO_FLOAT( v[1] );
color[2] = UBYTE_TO_FLOAT( v[2] );
color[3] = 1.0;
_mesa_update_color_material( ctx, color );
RECALC_BASE_COLOR( ctx );
}
static void TAG(ColorMaterial4f)( GLfloat r, GLfloat g, GLfloat b, GLfloat a )
{
GET_CURRENT_CONTEXT(ctx);
GLfloat *color = ctx->Current.Color;
color[0] = r;
color[1] = g;
color[2] = b;
color[3] = a;
_mesa_update_color_material( ctx, color );
RECALC_BASE_COLOR( ctx );
}
static void TAG(ColorMaterial4fv)( const GLfloat *v )
{
GET_CURRENT_CONTEXT(ctx);
GLfloat *color = ctx->Current.Color;
color[0] = v[0];
color[1] = v[1];
color[2] = v[2];
color[3] = v[3];
_mesa_update_color_material( ctx, color );
RECALC_BASE_COLOR( ctx );
}
static void TAG(ColorMaterial4ub)( GLubyte r, GLubyte g, GLubyte b, GLubyte a )
{
GET_CURRENT_CONTEXT(ctx);
GLfloat *color = ctx->Current.Color;
color[0] = UBYTE_TO_FLOAT( r );
color[1] = UBYTE_TO_FLOAT( g );
color[2] = UBYTE_TO_FLOAT( b );
color[3] = UBYTE_TO_FLOAT( a );
_mesa_update_color_material( ctx, color );
RECALC_BASE_COLOR( ctx );
}
static void TAG(ColorMaterial4ubv)( const GLubyte *v )
{
GET_CURRENT_CONTEXT(ctx);
GLfloat *color = ctx->Current.Color;
color[0] = UBYTE_TO_FLOAT( v[0] );
color[1] = UBYTE_TO_FLOAT( v[1] );
color[2] = UBYTE_TO_FLOAT( v[2] );
color[3] = UBYTE_TO_FLOAT( v[3] );
_mesa_update_color_material( ctx, color );
RECALC_BASE_COLOR( ctx );
}
/* =============================================================
* Color chooser functions:
*/
static void TAG(choose_Color3f)( GLfloat r, GLfloat g, GLfloat b )
{
GET_CURRENT_CONTEXT(ctx);
if ( ctx->Light.Enabled ) {
if ( ctx->Light.ColorMaterialEnabled ) {
SET_Color3f(ctx->Exec, TAG(ColorMaterial3f));
} else {
SET_Color3f(ctx->Exec, _mesa_noop_Color3f);
}
} else {
SET_Color3f(ctx->Exec, TAG(Color3f));
}
glColor3f( r, g, b );
}
static void TAG(choose_Color3fv)( const GLfloat *v )
{
GET_CURRENT_CONTEXT(ctx);
if ( ctx->Light.Enabled ) {
if ( ctx->Light.ColorMaterialEnabled ) {
SET_Color3fv(ctx->Exec, TAG(ColorMaterial3fv));
} else {
SET_Color3fv(ctx->Exec, _mesa_noop_Color3fv);
}
} else {
SET_Color3fv(ctx->Exec, TAG(Color3fv));
}
glColor3fv( v );
}
static void TAG(choose_Color3ub)( GLubyte r, GLubyte g, GLubyte b )
{
GET_CURRENT_CONTEXT(ctx);
if ( ctx->Light.Enabled ) {
if ( ctx->Light.ColorMaterialEnabled ) {
SET_Color3ub(ctx->Exec, TAG(ColorMaterial3ub));
} else {
SET_Color3ub(ctx->Exec, _mesa_noop_Color3ub);
}
} else {
SET_Color3ub(ctx->Exec, TAG(Color3ub));
}
glColor3ub( r, g, b );
}
static void TAG(choose_Color3ubv)( const GLubyte *v )
{
GET_CURRENT_CONTEXT(ctx);
if ( ctx->Light.Enabled ) {
if ( ctx->Light.ColorMaterialEnabled ) {
SET_Color3ubv(ctx->Exec, TAG(ColorMaterial3ubv));
} else {
SET_Color3ubv(ctx->Exec, _mesa_noop_Color3ubv);
}
} else {
SET_Color3ubv(ctx->Exec, TAG(Color3ubv));
}
glColor3ubv( v );
}
static void TAG(choose_Color4f)( GLfloat r, GLfloat g, GLfloat b, GLfloat a )
{
GET_CURRENT_CONTEXT(ctx);
if ( ctx->Light.Enabled ) {
if ( ctx->Light.ColorMaterialEnabled ) {
SET_Color4f(ctx->Exec, TAG(ColorMaterial4f));
} else {
SET_Color4f(ctx->Exec, _mesa_noop_Color4f);
}
} else {
SET_Color4f(ctx->Exec, TAG(Color4f));
}
glColor4f( r, g, b, a );
}
static void TAG(choose_Color4fv)( const GLfloat *v )
{
GET_CURRENT_CONTEXT(ctx);
if ( ctx->Light.Enabled ) {
if ( ctx->Light.ColorMaterialEnabled ) {
SET_Color4fv(ctx->Exec, TAG(ColorMaterial4fv));
} else {
SET_Color4fv(ctx->Exec, _mesa_noop_Color4fv);
}
} else {
SET_Color4fv(ctx->Exec, TAG(Color4fv));
}
glColor4fv( v );
}
static void TAG(choose_Color4ub)( GLubyte r, GLubyte g, GLubyte b, GLubyte a )
{
GET_CURRENT_CONTEXT(ctx);
if ( ctx->Light.Enabled ) {
if ( ctx->Light.ColorMaterialEnabled ) {
SET_Color4ub(ctx->Exec, TAG(ColorMaterial4ub));
} else {
SET_Color4ub(ctx->Exec, _mesa_noop_Color4ub);
}
} else {
SET_Color4ub(ctx->Exec, TAG(Color4ub));
}
glColor4ub( r, g, b, a );
}
static void TAG(choose_Color4ubv)( const GLubyte *v )
{
GET_CURRENT_CONTEXT(ctx);
if ( ctx->Light.Enabled ) {
if ( ctx->Light.ColorMaterialEnabled ) {
SET_Color4ubv(ctx->Exec, TAG(ColorMaterial4ubv));
} else {
SET_Color4ubv(ctx->Exec, _mesa_noop_Color4ubv);
}
} else {
SET_Color4ubv(ctx->Exec, TAG(Color4ubv));
}
glColor4ubv( v );
}
#undef GET_CURRENT
#undef CURRENT_COLOR
#undef CURRENT_SPECULAR
#undef COLOR_IS_FLOAT
#undef RECALC_BASE_COLOR
#undef TAG