Color clamping fixes.
authorBrian Paul <brian.paul@tungstengraphics.com>
Sun, 22 Oct 2006 17:18:50 +0000 (17:18 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Sun, 22 Oct 2006 17:18:50 +0000 (17:18 +0000)
src/mesa/main/blend.c
src/mesa/main/blend.h
src/mesa/main/light.c
src/mesa/main/mtypes.h
src/mesa/swrast/s_readpix.c
src/mesa/swrast/s_span.c

index bf886af9e813a0666793652355ac9c8c0ab48ed6..81bd4c2f32038a0eb0d30bb24618d5aa9c25d8b2 100644 (file)
@@ -516,6 +516,37 @@ _mesa_ColorMask( GLboolean red, GLboolean green,
 }
 
 
+extern void GLAPIENTRY
+_mesa_ClampColorARB(GLenum target, GLenum clamp)
+{
+   GET_CURRENT_CONTEXT(ctx);
+
+   ASSERT_OUTSIDE_BEGIN_END(ctx);
+
+   if (clamp != GL_TRUE && clamp != GL_FALSE && clamp != GL_FIXED_ONLY_ARB) {
+      _mesa_error(ctx, GL_INVALID_ENUM, "glClampColorARB(clamp)");
+      return;
+   }
+
+   switch (target) {
+   case GL_CLAMP_VERTEX_COLOR_ARB:
+      ctx->Light.ClampVertexColor = clamp;
+      break;
+   case GL_CLAMP_FRAGMENT_COLOR_ARB:
+      ctx->Color.ClampFragmentColor = clamp;
+      break;
+   case GL_CLAMP_READ_COLOR_ARB:
+      ctx->Color.ClampReadColor = clamp;
+      break;
+   default:
+      _mesa_error(ctx, GL_INVALID_ENUM, "glClampColorARB(target)");
+      return;
+   }
+}
+
+
+
+
 /**********************************************************************/
 /** \name Initialization */
 /*@{*/
index d6c03d903f4add9afe829d6e9e9bf1a20d445049..5c0f2783a735f3794d7cef0d4d4d312ba367da81 100644 (file)
@@ -5,9 +5,9 @@
 
 /*
  * Mesa 3-D graphics library
- * Version:  3.5
+ * Version:  6.5.2
  *
- * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1999-2006  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"),
@@ -72,6 +72,11 @@ extern void GLAPIENTRY
 _mesa_ColorMask( GLboolean red, GLboolean green,
                  GLboolean blue, GLboolean alpha );
 
+
+extern void GLAPIENTRY
+_mesa_ClampColorARB(GLenum target, GLenum clamp);
+
+
 extern void  
 _mesa_init_color( GLcontext * ctx );
 
index 63f88b7229fd304fa8132d58ba0203c7ddf3bd52..984f7b2abc46b111268c94213761b1507e30c6f3 100644 (file)
@@ -1340,6 +1340,7 @@ _mesa_init_lighting( GLcontext *ctx )
                                                NULL );
 
    ctx->Light.ColorMaterialEnabled = GL_FALSE;
+   ctx->Light.ClampVertexColor = GL_TRUE;
 
    /* Lighting miscellaneous */
    ctx->_ShineTabList = MALLOC_STRUCT( gl_shine_tab );
index bedc860599272fab26d7f8cf58cbe1fc5717b6e5..5a326ff0dc9c45a54c67e35346510d69ed88c119 100644 (file)
@@ -888,6 +888,7 @@ struct gl_light_attrib
    GLenum ColorMaterialMode;           /**< GL_AMBIENT, GL_DIFFUSE, etc */
    GLbitfield ColorMaterialBitmask;    /**< bitmask formed from Face and Mode */
    GLboolean ColorMaterialEnabled;
+   GLenum ClampVertexColor;
 
    struct gl_light EnabledList;         /**< List sentinel */
 
index 0189b0e797da36cc7fad50855d5c2f49c8f5a23e..cbfb7712d82624844b19e4bf276c699e34a967e0 100644 (file)
@@ -202,7 +202,8 @@ fast_read_rgba_pixels( GLcontext *ctx,
                        GLsizei width, GLsizei height,
                        GLenum format, GLenum type,
                        GLvoid *pixels,
-                       const struct gl_pixelstore_attrib *packing )
+                       const struct gl_pixelstore_attrib *packing,
+                       GLbitfield transferOps)
 {
    struct gl_renderbuffer *rb = ctx->ReadBuffer->_ColorReadBuffer;
 
@@ -213,7 +214,7 @@ fast_read_rgba_pixels( GLcontext *ctx,
    ASSERT(y + height <= rb->Height);
 
    /* check for things we can't handle here */
-   if (ctx->_ImageTransferState ||
+   if (transferOps ||
        packing->SwapBytes ||
        packing->LsbFirst) {
       return GL_FALSE;
@@ -309,15 +310,20 @@ read_rgba_pixels( GLcontext *ctx,
                   const struct gl_pixelstore_attrib *packing )
 {
    SWcontext *swrast = SWRAST_CONTEXT(ctx);
-   const GLbitfield transferOps = ctx->_ImageTransferState;
+   GLbitfield transferOps = ctx->_ImageTransferState;
    struct gl_framebuffer *fb = ctx->ReadBuffer;
    struct gl_renderbuffer *rb = fb->_ColorReadBuffer;
 
    ASSERT(rb);
 
+   if (type == GL_FLOAT && ((ctx->Color.ClampReadColor == GL_TRUE) ||
+                            (ctx->Color.ClampReadColor == GL_FIXED_ONLY_ARB &&
+                             rb->DataType != GL_FLOAT)))
+      transferOps |= IMAGE_CLAMP_BIT;
+
    /* Try optimized path first */
    if (fast_read_rgba_pixels(ctx, x, y, width, height,
-                             format, type, pixels, packing)) {
+                             format, type, pixels, packing, transferOps)) {
       return; /* done! */
    }
 
@@ -419,7 +425,7 @@ read_rgba_pixels( GLcontext *ctx,
 
          /* pack the row of RGBA pixels into user's buffer */
          _mesa_pack_rgba_span_float(ctx, width, rgba, format, type, dst,
-                                    packing, ctx->_ImageTransferState);
+                                    packing, transferOps);
 
          dst += dstStride;
       }
index ad55e1b10c3ccebd39c122ec9b843695b4a39d58..2e20f7a2965a846a2fc94f7b7a3805e055b3d9fb 100644 (file)
@@ -1583,7 +1583,7 @@ _swrast_write_rgba_span( GLcontext *ctx, SWspan *span)
    }
 
    /* Clamp color/alpha values over the range [0.0, 1.0] before storage */
-   if (ctx->Color.ClampFragmentColor &&
+   if (ctx->Color.ClampFragmentColor == GL_TRUE &&
        span->array->ChanType == GL_FLOAT) {
       clamp_colors(span);
    }