Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Mesa 3-D graphics library
  3.  * Version:  6.5
  4.  *
  5.  * Copyright (C) 1999-2005  Brian Paul   All Rights Reserved.
  6.  *
  7.  * Permission is hereby granted, free of charge, to any person obtaining a
  8.  * copy of this software and associated documentation files (the "Software"),
  9.  * to deal in the Software without restriction, including without limitation
  10.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  11.  * and/or sell copies of the Software, and to permit persons to whom the
  12.  * Software is furnished to do so, subject to the following conditions:
  13.  *
  14.  * The above copyright notice and this permission notice shall be included
  15.  * in all copies or substantial portions of the Software.
  16.  *
  17.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  18.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  20.  * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
  21.  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  22.  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  23.  */
  24.  
  25. #include "glheader.h"
  26. #include "accum.h"
  27. #include "context.h"
  28. #include "imports.h"
  29. #include "macros.h"
  30. #include "state.h"
  31. #include "mtypes.h"
  32. #include "main/dispatch.h"
  33.  
  34.  
  35. #if FEATURE_accum
  36.  
  37.  
  38. void GLAPIENTRY
  39. _mesa_ClearAccum( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha )
  40. {
  41.    GLfloat tmp[4];
  42.    GET_CURRENT_CONTEXT(ctx);
  43.    ASSERT_OUTSIDE_BEGIN_END(ctx);
  44.  
  45.    tmp[0] = CLAMP( red,   -1.0F, 1.0F );
  46.    tmp[1] = CLAMP( green, -1.0F, 1.0F );
  47.    tmp[2] = CLAMP( blue,  -1.0F, 1.0F );
  48.    tmp[3] = CLAMP( alpha, -1.0F, 1.0F );
  49.  
  50.    if (TEST_EQ_4V(tmp, ctx->Accum.ClearColor))
  51.       return;
  52.  
  53.    FLUSH_VERTICES(ctx, _NEW_ACCUM);
  54.    COPY_4FV( ctx->Accum.ClearColor, tmp );
  55. }
  56.  
  57.  
  58. static void GLAPIENTRY
  59. _mesa_Accum( GLenum op, GLfloat value )
  60. {
  61.    GET_CURRENT_CONTEXT(ctx);
  62.    ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
  63.  
  64.    switch (op) {
  65.    case GL_ADD:
  66.    case GL_MULT:
  67.    case GL_ACCUM:
  68.    case GL_LOAD:
  69.    case GL_RETURN:
  70.       /* OK */
  71.       break;
  72.    default:
  73.       _mesa_error(ctx, GL_INVALID_ENUM, "glAccum(op)");
  74.       return;
  75.    }
  76.  
  77.    if (ctx->DrawBuffer->Visual.haveAccumBuffer == 0) {
  78.       _mesa_error(ctx, GL_INVALID_OPERATION, "glAccum(no accum buffer)");
  79.       return;
  80.    }
  81.  
  82.    if (ctx->DrawBuffer != ctx->ReadBuffer) {
  83.       /* See GLX_SGI_make_current_read or WGL_ARB_make_current_read,
  84.        * or GL_EXT_framebuffer_blit.
  85.        */
  86.       _mesa_error(ctx, GL_INVALID_OPERATION,
  87.                   "glAccum(different read/draw buffers)");
  88.       return;
  89.    }
  90.  
  91.    if (ctx->NewState)
  92.       _mesa_update_state(ctx);
  93.  
  94.    if (ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
  95.       _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT,
  96.                   "glAccum(incomplete framebuffer)");
  97.       return;
  98.    }
  99.  
  100.    if (ctx->RenderMode == GL_RENDER) {
  101.       ctx->Driver.Accum(ctx, op, value);
  102.    }
  103. }
  104.  
  105.  
  106. void
  107. _mesa_init_accum_dispatch(struct _glapi_table *disp)
  108. {
  109.    SET_Accum(disp, _mesa_Accum);
  110.    SET_ClearAccum(disp, _mesa_ClearAccum);
  111. }
  112.  
  113.  
  114. #endif /* FEATURE_accum */
  115.  
  116.  
  117. void
  118. _mesa_init_accum( struct gl_context *ctx )
  119. {
  120.    /* Accumulate buffer group */
  121.    ASSIGN_4V( ctx->Accum.ClearColor, 0.0, 0.0, 0.0, 0.0 );
  122. }
  123.