📄 blend.c
字号:
return; } if ( ! _mesa_validate_blend_equation( ctx, modeA, GL_TRUE ) ) { _mesa_error(ctx, GL_INVALID_ENUM, "glBlendEquationSeparateEXT(modeA)"); return; } if ( (ctx->Color.BlendEquationRGB == modeRGB) && (ctx->Color.BlendEquationA == modeA) ) return; FLUSH_VERTICES(ctx, _NEW_COLOR); ctx->Color.BlendEquationRGB = modeRGB; ctx->Color.BlendEquationA = modeA; if (ctx->Driver.BlendEquationSeparate) (*ctx->Driver.BlendEquationSeparate)( ctx, modeRGB, modeA );}#endif/** * Set the blending color. * * \param red red color component. * \param green green color component. * \param blue blue color component. * \param alpha alpha color component. * * \sa glBlendColor(). * * Clamps the parameters and updates gl_colorbuffer_attrib::BlendColor. On a * change, flushes the vertices and notifies the driver via * dd_function_table::BlendColor callback. */void GLAPIENTRY_mesa_BlendColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ){ GLfloat tmp[4]; GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END(ctx); tmp[0] = CLAMP( red, 0.0F, 1.0F ); tmp[1] = CLAMP( green, 0.0F, 1.0F ); tmp[2] = CLAMP( blue, 0.0F, 1.0F ); tmp[3] = CLAMP( alpha, 0.0F, 1.0F ); if (TEST_EQ_4V(tmp, ctx->Color.BlendColor)) return; FLUSH_VERTICES(ctx, _NEW_COLOR); COPY_4FV( ctx->Color.BlendColor, tmp ); if (ctx->Driver.BlendColor) (*ctx->Driver.BlendColor)(ctx, tmp);}/** * Specify the alpha test function. * * \param func alpha comparison function. * \param ref reference value. * * Verifies the parameters and updates gl_colorbuffer_attrib. * On a change, flushes the vertices and notifies the driver via * dd_function_table::AlphaFunc callback. */void GLAPIENTRY_mesa_AlphaFunc( GLenum func, GLclampf ref ){ GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END(ctx); switch (func) { case GL_NEVER: case GL_LESS: case GL_EQUAL: case GL_LEQUAL: case GL_GREATER: case GL_NOTEQUAL: case GL_GEQUAL: case GL_ALWAYS: ref = CLAMP(ref, 0.0F, 1.0F); if (ctx->Color.AlphaFunc == func && ctx->Color.AlphaRef == ref) return; /* no change */ FLUSH_VERTICES(ctx, _NEW_COLOR); ctx->Color.AlphaFunc = func; ctx->Color.AlphaRef = ref; if (ctx->Driver.AlphaFunc) ctx->Driver.AlphaFunc(ctx, func, ref); return; default: _mesa_error( ctx, GL_INVALID_ENUM, "glAlphaFunc(func)" ); return; }}/** * Specify a logic pixel operation for color index rendering. * * \param opcode operation. * * Verifies that \p opcode is a valid enum and updatesgl_colorbuffer_attrib::LogicOp. * On a change, flushes the vertices and notifies the driver via the * dd_function_table::LogicOpcode callback. */void GLAPIENTRY_mesa_LogicOp( GLenum opcode ){ GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END(ctx); switch (opcode) { case GL_CLEAR: case GL_SET: case GL_COPY: case GL_COPY_INVERTED: case GL_NOOP: case GL_INVERT: case GL_AND: case GL_NAND: case GL_OR: case GL_NOR: case GL_XOR: case GL_EQUIV: case GL_AND_REVERSE: case GL_AND_INVERTED: case GL_OR_REVERSE: case GL_OR_INVERTED: break; default: _mesa_error( ctx, GL_INVALID_ENUM, "glLogicOp" ); return; } if (ctx->Color.LogicOp == opcode) return; FLUSH_VERTICES(ctx, _NEW_COLOR); ctx->Color.LogicOp = opcode; if (ctx->Driver.LogicOpcode) ctx->Driver.LogicOpcode( ctx, opcode );}#if _HAVE_FULL_GLvoid GLAPIENTRY_mesa_IndexMask( GLuint mask ){ GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END(ctx); if (ctx->Color.IndexMask == mask) return; FLUSH_VERTICES(ctx, _NEW_COLOR); ctx->Color.IndexMask = mask; if (ctx->Driver.IndexMask) ctx->Driver.IndexMask( ctx, mask );}#endif/** * Enable or disable writing of frame buffer color components. * * \param red whether to mask writing of the red color component. * \param green whether to mask writing of the green color component. * \param blue whether to mask writing of the blue color component. * \param alpha whether to mask writing of the alpha color component. * * \sa glColorMask(). * * Sets the appropriate value of gl_colorbuffer_attrib::ColorMask. On a * change, flushes the vertices and notifies the driver via the * dd_function_table::ColorMask callback. */void GLAPIENTRY_mesa_ColorMask( GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha ){ GET_CURRENT_CONTEXT(ctx); GLubyte tmp[4]; ASSERT_OUTSIDE_BEGIN_END(ctx); if (MESA_VERBOSE & VERBOSE_API) _mesa_debug(ctx, "glColorMask %d %d %d %d\n", red, green, blue, alpha); /* Shouldn't have any information about channel depth in core mesa * -- should probably store these as the native booleans: */ tmp[RCOMP] = red ? 0xff : 0x0; tmp[GCOMP] = green ? 0xff : 0x0; tmp[BCOMP] = blue ? 0xff : 0x0; tmp[ACOMP] = alpha ? 0xff : 0x0; if (TEST_EQ_4UBV(tmp, ctx->Color.ColorMask)) return; FLUSH_VERTICES(ctx, _NEW_COLOR); COPY_4UBV(ctx->Color.ColorMask, tmp); if (ctx->Driver.ColorMask) ctx->Driver.ColorMask( ctx, red, green, blue, alpha );}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 *//*@{*//** * Initialization of the context's Color attribute group. * * \param ctx GL context. * * Initializes the related fields in the context color attribute group, * __GLcontextRec::Color. */void _mesa_init_color( GLcontext * ctx ){ /* Color buffer group */ ctx->Color.IndexMask = ~0u; ctx->Color.ColorMask[0] = 0xff; ctx->Color.ColorMask[1] = 0xff; ctx->Color.ColorMask[2] = 0xff; ctx->Color.ColorMask[3] = 0xff; ctx->Color.ClearIndex = 0; ASSIGN_4V( ctx->Color.ClearColor, 0, 0, 0, 0 ); ctx->Color.AlphaEnabled = GL_FALSE; ctx->Color.AlphaFunc = GL_ALWAYS; ctx->Color.AlphaRef = 0; ctx->Color.BlendEnabled = GL_FALSE; ctx->Color.BlendSrcRGB = GL_ONE; ctx->Color.BlendDstRGB = GL_ZERO; ctx->Color.BlendSrcA = GL_ONE; ctx->Color.BlendDstA = GL_ZERO; ctx->Color.BlendEquationRGB = GL_FUNC_ADD; ctx->Color.BlendEquationA = GL_FUNC_ADD; ASSIGN_4V( ctx->Color.BlendColor, 0.0, 0.0, 0.0, 0.0 ); ctx->Color.IndexLogicOpEnabled = GL_FALSE; ctx->Color.ColorLogicOpEnabled = GL_FALSE; ctx->Color._LogicOpEnabled = GL_FALSE; ctx->Color.LogicOp = GL_COPY; ctx->Color.DitherFlag = GL_TRUE; if (ctx->Visual.doubleBufferMode) { ctx->Color.DrawBuffer[0] = GL_BACK; } else { ctx->Color.DrawBuffer[0] = GL_FRONT; } ctx->Color.ClampFragmentColor = GL_FIXED_ONLY_ARB; ctx->Color.ClampReadColor = GL_FIXED_ONLY_ARB;}/*@}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -