📄 histogram.c
字号:
_mesa_error(ctx, GL_INVALID_ENUM, "glGetHistogram(format)"); } if (!_mesa_is_legal_format_and_type(ctx, format, type)) { _mesa_error(ctx, GL_INVALID_OPERATION, "glGetHistogram(format or type)"); return; } if (ctx->Pack.BufferObj->Name) { /* pack min/max values into a PBO */ GLubyte *buf; if (!_mesa_validate_pbo_access(1, &ctx->Pack, ctx->Histogram.Width, 1, 1, format, type, values)) { _mesa_error(ctx, GL_INVALID_OPERATION, "glGetHistogram(invalid PBO access)"); return; } buf = (GLubyte *) ctx->Driver.MapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT, GL_WRITE_ONLY_ARB, ctx->Pack.BufferObj); if (!buf) { /* buffer is already mapped - that's an error */ _mesa_error(ctx,GL_INVALID_OPERATION,"glGetHistogram(PBO is mapped)"); return; } values = ADD_POINTERS(buf, values); } else if (!values) { /* not an error */ return; } pack_histogram(ctx, ctx->Histogram.Width, (CONST GLuint (*)[4]) ctx->Histogram.Count, format, type, values, &ctx->Pack); if (ctx->Pack.BufferObj->Name) { ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT, ctx->Pack.BufferObj); } if (reset) { GLuint i; for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) { ctx->Histogram.Count[i][0] = 0; ctx->Histogram.Count[i][1] = 0; ctx->Histogram.Count[i][2] = 0; ctx->Histogram.Count[i][3] = 0; } }}void GLAPIENTRY_mesa_GetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params){ GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END(ctx); if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) { _mesa_error(ctx, GL_INVALID_OPERATION, "glGetHistogramParameterfv"); return; } if (target != GL_HISTOGRAM && target != GL_PROXY_HISTOGRAM) { _mesa_error(ctx, GL_INVALID_ENUM, "glGetHistogramParameterfv(target)"); return; } switch (pname) { case GL_HISTOGRAM_WIDTH: *params = (GLfloat) ctx->Histogram.Width; break; case GL_HISTOGRAM_FORMAT: *params = (GLfloat) ctx->Histogram.Format; break; case GL_HISTOGRAM_RED_SIZE: *params = (GLfloat) ctx->Histogram.RedSize; break; case GL_HISTOGRAM_GREEN_SIZE: *params = (GLfloat) ctx->Histogram.GreenSize; break; case GL_HISTOGRAM_BLUE_SIZE: *params = (GLfloat) ctx->Histogram.BlueSize; break; case GL_HISTOGRAM_ALPHA_SIZE: *params = (GLfloat) ctx->Histogram.AlphaSize; break; case GL_HISTOGRAM_LUMINANCE_SIZE: *params = (GLfloat) ctx->Histogram.LuminanceSize; break; case GL_HISTOGRAM_SINK: *params = (GLfloat) ctx->Histogram.Sink; break; default: _mesa_error(ctx, GL_INVALID_ENUM, "glGetHistogramParameterfv(pname)"); }}void GLAPIENTRY_mesa_GetHistogramParameteriv(GLenum target, GLenum pname, GLint *params){ GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END(ctx); if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) { _mesa_error(ctx, GL_INVALID_OPERATION, "glGetHistogramParameteriv"); return; } if (target != GL_HISTOGRAM && target != GL_PROXY_HISTOGRAM) { _mesa_error(ctx, GL_INVALID_ENUM, "glGetHistogramParameteriv(target)"); return; } switch (pname) { case GL_HISTOGRAM_WIDTH: *params = (GLint) ctx->Histogram.Width; break; case GL_HISTOGRAM_FORMAT: *params = (GLint) ctx->Histogram.Format; break; case GL_HISTOGRAM_RED_SIZE: *params = (GLint) ctx->Histogram.RedSize; break; case GL_HISTOGRAM_GREEN_SIZE: *params = (GLint) ctx->Histogram.GreenSize; break; case GL_HISTOGRAM_BLUE_SIZE: *params = (GLint) ctx->Histogram.BlueSize; break; case GL_HISTOGRAM_ALPHA_SIZE: *params = (GLint) ctx->Histogram.AlphaSize; break; case GL_HISTOGRAM_LUMINANCE_SIZE: *params = (GLint) ctx->Histogram.LuminanceSize; break; case GL_HISTOGRAM_SINK: *params = (GLint) ctx->Histogram.Sink; break; default: _mesa_error(ctx, GL_INVALID_ENUM, "glGetHistogramParameteriv(pname)"); }}void GLAPIENTRY_mesa_GetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params){ GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END(ctx); if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) { _mesa_error(ctx, GL_INVALID_OPERATION, "glGetMinmaxParameterfv"); return; } if (target != GL_MINMAX) { _mesa_error(ctx, GL_INVALID_ENUM, "glGetMinmaxParameterfv(target)"); return; } if (pname == GL_MINMAX_FORMAT) { *params = (GLfloat) ctx->MinMax.Format; } else if (pname == GL_MINMAX_SINK) { *params = (GLfloat) ctx->MinMax.Sink; } else { _mesa_error(ctx, GL_INVALID_ENUM, "glGetMinMaxParameterfv(pname)"); }}void GLAPIENTRY_mesa_GetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params){ GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END(ctx); if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) { _mesa_error(ctx, GL_INVALID_OPERATION, "glGetMinmaxParameteriv"); return; } if (target != GL_MINMAX) { _mesa_error(ctx, GL_INVALID_ENUM, "glGetMinmaxParameteriv(target)"); return; } if (pname == GL_MINMAX_FORMAT) { *params = (GLint) ctx->MinMax.Format; } else if (pname == GL_MINMAX_SINK) { *params = (GLint) ctx->MinMax.Sink; } else { _mesa_error(ctx, GL_INVALID_ENUM, "glGetMinMaxParameteriv(pname)"); }}void GLAPIENTRY_mesa_Histogram(GLenum target, GLsizei width, GLenum internalFormat, GLboolean sink){ GLuint i; GLboolean error = GL_FALSE; GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); /* sideeffects */ if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) { _mesa_error(ctx, GL_INVALID_OPERATION, "glHistogram"); return; } if (target != GL_HISTOGRAM && target != GL_PROXY_HISTOGRAM) { _mesa_error(ctx, GL_INVALID_ENUM, "glHistogram(target)"); return; } if (width < 0 || width > HISTOGRAM_TABLE_SIZE) { if (target == GL_PROXY_HISTOGRAM) { error = GL_TRUE; } else { if (width < 0) _mesa_error(ctx, GL_INVALID_VALUE, "glHistogram(width)"); else _mesa_error(ctx, GL_TABLE_TOO_LARGE, "glHistogram(width)"); return; } } if (width != 0 && _mesa_bitcount(width) != 1) { if (target == GL_PROXY_HISTOGRAM) { error = GL_TRUE; } else { _mesa_error(ctx, GL_INVALID_VALUE, "glHistogram(width)"); return; } } if (base_histogram_format(internalFormat) < 0) { if (target == GL_PROXY_HISTOGRAM) { error = GL_TRUE; } else { _mesa_error(ctx, GL_INVALID_ENUM, "glHistogram(internalFormat)"); return; } } /* reset histograms */ for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) { ctx->Histogram.Count[i][0] = 0; ctx->Histogram.Count[i][1] = 0; ctx->Histogram.Count[i][2] = 0; ctx->Histogram.Count[i][3] = 0; } if (error) { ctx->Histogram.Width = 0; ctx->Histogram.Format = 0; ctx->Histogram.RedSize = 0; ctx->Histogram.GreenSize = 0; ctx->Histogram.BlueSize = 0; ctx->Histogram.AlphaSize = 0; ctx->Histogram.LuminanceSize = 0; } else { ctx->Histogram.Width = width; ctx->Histogram.Format = internalFormat; ctx->Histogram.Sink = sink; ctx->Histogram.RedSize = 8 * sizeof(GLuint); ctx->Histogram.GreenSize = 8 * sizeof(GLuint); ctx->Histogram.BlueSize = 8 * sizeof(GLuint); ctx->Histogram.AlphaSize = 8 * sizeof(GLuint); ctx->Histogram.LuminanceSize = 8 * sizeof(GLuint); } ctx->NewState |= _NEW_PIXEL;}void GLAPIENTRY_mesa_Minmax(GLenum target, GLenum internalFormat, GLboolean sink){ GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END(ctx); if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) { _mesa_error(ctx, GL_INVALID_OPERATION, "glMinmax"); return; } if (target != GL_MINMAX) { _mesa_error(ctx, GL_INVALID_ENUM, "glMinMax(target)"); return; } if (base_histogram_format(internalFormat) < 0) { _mesa_error(ctx, GL_INVALID_ENUM, "glMinMax(internalFormat)"); return; } if (ctx->MinMax.Sink == sink) return; FLUSH_VERTICES(ctx, _NEW_PIXEL); ctx->MinMax.Sink = sink;}void GLAPIENTRY_mesa_ResetHistogram(GLenum target){ GLuint i; GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); /* sideeffects */ if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) { _mesa_error(ctx, GL_INVALID_OPERATION, "glResetHistogram"); return; } if (target != GL_HISTOGRAM) { _mesa_error(ctx, GL_INVALID_ENUM, "glResetHistogram(target)"); return; } for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) { ctx->Histogram.Count[i][0] = 0; ctx->Histogram.Count[i][1] = 0; ctx->Histogram.Count[i][2] = 0; ctx->Histogram.Count[i][3] = 0; } ctx->NewState |= _NEW_PIXEL;}void GLAPIENTRY_mesa_ResetMinmax(GLenum target){ GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) { _mesa_error(ctx, GL_INVALID_OPERATION, "glResetMinmax"); return; } if (target != GL_MINMAX) { _mesa_error(ctx, GL_INVALID_ENUM, "glResetMinMax(target)"); return; } ctx->MinMax.Min[RCOMP] = 1000; ctx->MinMax.Max[RCOMP] = -1000; ctx->MinMax.Min[GCOMP] = 1000; ctx->MinMax.Max[GCOMP] = -1000; ctx->MinMax.Min[BCOMP] = 1000; ctx->MinMax.Max[BCOMP] = -1000; ctx->MinMax.Min[ACOMP] = 1000; ctx->MinMax.Max[ACOMP] = -1000; ctx->NewState |= _NEW_PIXEL;}/**********************************************************************//***** Initialization *****//**********************************************************************/void _mesa_init_histogram( GLcontext * ctx ){ int i; /* Histogram group */ ctx->Histogram.Width = 0; ctx->Histogram.Format = GL_RGBA; ctx->Histogram.Sink = GL_FALSE; ctx->Histogram.RedSize = 0; ctx->Histogram.GreenSize = 0; ctx->Histogram.BlueSize = 0; ctx->Histogram.AlphaSize = 0; ctx->Histogram.LuminanceSize = 0; for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) { ctx->Histogram.Count[i][0] = 0; ctx->Histogram.Count[i][1] = 0; ctx->Histogram.Count[i][2] = 0; ctx->Histogram.Count[i][3] = 0; } /* Min/Max group */ ctx->MinMax.Format = GL_RGBA; ctx->MinMax.Sink = GL_FALSE; ctx->MinMax.Min[RCOMP] = 1000; ctx->MinMax.Max[RCOMP] = -1000; ctx->MinMax.Min[GCOMP] = 1000; ctx->MinMax.Max[GCOMP] = -1000; ctx->MinMax.Min[BCOMP] = 1000; ctx->MinMax.Max[BCOMP] = -1000; ctx->MinMax.Min[ACOMP] = 1000; ctx->MinMax.Max[ACOMP] = -1000;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -