📄 histogram.c
字号:
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][ACOMP] & 0xf) << 12)
| ((rgba[i][RCOMP] & 0xf) << 8)
| ((rgba[i][GCOMP] & 0xf) << 4)
| ((rgba[i][BCOMP] & 0xf) );
}
}
else {
GLushort *dst = (GLushort *) destination;
GLuint i;
ASSERT(format == GL_ABGR_EXT);
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][RCOMP] & 0xf) << 12)
| ((rgba[i][GCOMP] & 0xf) << 8)
| ((rgba[i][BCOMP] & 0xf) << 4)
| ((rgba[i][ACOMP] & 0xf) );
}
}
break;
case GL_UNSIGNED_SHORT_5_5_5_1:
if (format == GL_RGBA) {
GLushort *dst = (GLushort *) destination;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][RCOMP] & 0x1f) << 11)
| ((rgba[i][GCOMP] & 0x1f) << 6)
| ((rgba[i][BCOMP] & 0x1f) << 1)
| ((rgba[i][ACOMP] & 0x1) );
}
}
else if (format == GL_BGRA) {
GLushort *dst = (GLushort *) destination;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][BCOMP] & 0x1f) << 11)
| ((rgba[i][GCOMP] & 0x1f) << 6)
| ((rgba[i][RCOMP] & 0x1f) << 1)
| ((rgba[i][ACOMP] & 0x1) );
}
}
else {
GLushort *dst = (GLushort *) destination;
GLuint i;
ASSERT(format == GL_ABGR_EXT);
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][ACOMP] & 0x1f) << 11)
| ((rgba[i][BCOMP] & 0x1f) << 6)
| ((rgba[i][GCOMP] & 0x1f) << 1)
| ((rgba[i][RCOMP] & 0x1) );
}
}
break;
case GL_UNSIGNED_SHORT_1_5_5_5_REV:
if (format == GL_RGBA) {
GLushort *dst = (GLushort *) destination;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][ACOMP] & 0x1f) << 11)
| ((rgba[i][BCOMP] & 0x1f) << 6)
| ((rgba[i][GCOMP] & 0x1f) << 1)
| ((rgba[i][RCOMP] & 0x1) );
}
}
else if (format == GL_BGRA) {
GLushort *dst = (GLushort *) destination;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][ACOMP] & 0x1f) << 11)
| ((rgba[i][RCOMP] & 0x1f) << 6)
| ((rgba[i][GCOMP] & 0x1f) << 1)
| ((rgba[i][BCOMP] & 0x1) );
}
}
else {
GLushort *dst = (GLushort *) destination;
GLuint i;
ASSERT(format == GL_ABGR_EXT);
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][RCOMP] & 0x1f) << 11)
| ((rgba[i][GCOMP] & 0x1f) << 6)
| ((rgba[i][BCOMP] & 0x1f) << 1)
| ((rgba[i][ACOMP] & 0x1) );
}
}
break;
case GL_UNSIGNED_INT_8_8_8_8:
if (format == GL_RGBA) {
GLuint *dst = (GLuint *) destination;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][RCOMP] & 0xff) << 24)
| ((rgba[i][GCOMP] & 0xff) << 16)
| ((rgba[i][BCOMP] & 0xff) << 8)
| ((rgba[i][ACOMP] & 0xff) );
}
}
else if (format == GL_BGRA) {
GLuint *dst = (GLuint *) destination;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][BCOMP] & 0xff) << 24)
| ((rgba[i][GCOMP] & 0xff) << 16)
| ((rgba[i][RCOMP] & 0xff) << 8)
| ((rgba[i][ACOMP] & 0xff) );
}
}
else {
GLuint *dst = (GLuint *) destination;
GLuint i;
ASSERT(format == GL_ABGR_EXT);
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][ACOMP] & 0xff) << 24)
| ((rgba[i][BCOMP] & 0xff) << 16)
| ((rgba[i][GCOMP] & 0xff) << 8)
| ((rgba[i][RCOMP] & 0xff) );
}
}
break;
case GL_UNSIGNED_INT_8_8_8_8_REV:
if (format == GL_RGBA) {
GLuint *dst = (GLuint *) destination;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][ACOMP] & 0xff) << 24)
| ((rgba[i][BCOMP] & 0xff) << 16)
| ((rgba[i][GCOMP] & 0xff) << 8)
| ((rgba[i][RCOMP] & 0xff) );
}
}
else if (format == GL_BGRA) {
GLuint *dst = (GLuint *) destination;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][ACOMP] & 0xff) << 24)
| ((rgba[i][RCOMP] & 0xff) << 16)
| ((rgba[i][GCOMP] & 0xff) << 8)
| ((rgba[i][BCOMP] & 0xff) );
}
}
else {
GLuint *dst = (GLuint *) destination;
GLuint i;
ASSERT(format == GL_ABGR_EXT);
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][RCOMP] & 0xff) << 24)
| ((rgba[i][GCOMP] & 0xff) << 16)
| ((rgba[i][BCOMP] & 0xff) << 8)
| ((rgba[i][ACOMP] & 0xff) );
}
}
break;
case GL_UNSIGNED_INT_10_10_10_2:
if (format == GL_RGBA) {
GLuint *dst = (GLuint *) destination;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][RCOMP] & 0x3ff) << 22)
| ((rgba[i][GCOMP] & 0x3ff) << 12)
| ((rgba[i][BCOMP] & 0x3ff) << 2)
| ((rgba[i][ACOMP] & 0x3) );
}
}
else if (format == GL_BGRA) {
GLuint *dst = (GLuint *) destination;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][BCOMP] & 0x3ff) << 22)
| ((rgba[i][GCOMP] & 0x3ff) << 12)
| ((rgba[i][RCOMP] & 0x3ff) << 2)
| ((rgba[i][ACOMP] & 0x3) );
}
}
else {
GLuint *dst = (GLuint *) destination;
GLuint i;
ASSERT(format == GL_ABGR_EXT);
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][ACOMP] & 0x3ff) << 22)
| ((rgba[i][BCOMP] & 0x3ff) << 12)
| ((rgba[i][GCOMP] & 0x3ff) << 2)
| ((rgba[i][RCOMP] & 0x3) );
}
}
break;
case GL_UNSIGNED_INT_2_10_10_10_REV:
if (format == GL_RGBA) {
GLuint *dst = (GLuint *) destination;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][ACOMP] & 0x3ff) << 22)
| ((rgba[i][BCOMP] & 0x3ff) << 12)
| ((rgba[i][GCOMP] & 0x3ff) << 2)
| ((rgba[i][RCOMP] & 0x3) );
}
}
else if (format == GL_BGRA) {
GLuint *dst = (GLuint *) destination;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][ACOMP] & 0x3ff) << 22)
| ((rgba[i][RCOMP] & 0x3ff) << 12)
| ((rgba[i][GCOMP] & 0x3ff) << 2)
| ((rgba[i][BCOMP] & 0x3) );
}
}
else {
GLuint *dst = (GLuint *) destination;
GLuint i;
ASSERT(format == GL_ABGR_EXT);
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][RCOMP] & 0x3ff) << 22)
| ((rgba[i][GCOMP] & 0x3ff) << 12)
| ((rgba[i][BCOMP] & 0x3ff) << 2)
| ((rgba[i][ACOMP] & 0x3) );
}
}
break;
default:
_mesa_problem(ctx, "Bad type in pack_histogram");
}
#undef PACK_MACRO
}
/*
* Given an internalFormat token passed to glHistogram or glMinMax,
* return the corresponding base format.
* Return -1 if invalid token.
*/
static GLint
base_histogram_format( GLenum format )
{
switch (format) {
case GL_ALPHA:
case GL_ALPHA4:
case GL_ALPHA8:
case GL_ALPHA12:
case GL_ALPHA16:
return GL_ALPHA;
case GL_LUMINANCE:
case GL_LUMINANCE4:
case GL_LUMINANCE8:
case GL_LUMINANCE12:
case GL_LUMINANCE16:
return GL_LUMINANCE;
case GL_LUMINANCE_ALPHA:
case GL_LUMINANCE4_ALPHA4:
case GL_LUMINANCE6_ALPHA2:
case GL_LUMINANCE8_ALPHA8:
case GL_LUMINANCE12_ALPHA4:
case GL_LUMINANCE12_ALPHA12:
case GL_LUMINANCE16_ALPHA16:
return GL_LUMINANCE_ALPHA;
case GL_RGB:
case GL_R3_G3_B2:
case GL_RGB4:
case GL_RGB5:
case GL_RGB8:
case GL_RGB10:
case GL_RGB12:
case GL_RGB16:
return GL_RGB;
case GL_RGBA:
case GL_RGBA2:
case GL_RGBA4:
case GL_RGB5_A1:
case GL_RGBA8:
case GL_RGB10_A2:
case GL_RGBA12:
case GL_RGBA16:
return GL_RGBA;
default:
return -1; /* error */
}
}
/**********************************************************************
* API functions
*/
void GLAPIENTRY
_mesa_GetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
{
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, "glGetMinmax");
return;
}
if (target != GL_MINMAX) {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetMinmax(target)");
return;
}
if (format != GL_RED &&
format != GL_GREEN &&
format != GL_BLUE &&
format != GL_ALPHA &&
format != GL_RGB &&
format != GL_BGR &&
format != GL_RGBA &&
format != GL_BGRA &&
format != GL_ABGR_EXT &&
format != GL_LUMINANCE &&
format != GL_LUMINANCE_ALPHA) {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetMinMax(format)");
}
if (!_mesa_is_legal_format_and_type(ctx, format, type)) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glGetMinmax(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, 2, 1, 1,
format, type, values)) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"glGetMinMax(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,"glGetMinMax(PBO is mapped)");
return;
}
values = ADD_POINTERS(buf, values);
}
else if (!values) {
/* not an error */
return;
}
{
GLfloat minmax[2][4];
minmax[0][RCOMP] = CLAMP(ctx->MinMax.Min[RCOMP], 0.0F, 1.0F);
minmax[0][GCOMP] = CLAMP(ctx->MinMax.Min[GCOMP], 0.0F, 1.0F);
minmax[0][BCOMP] = CLAMP(ctx->MinMax.Min[BCOMP], 0.0F, 1.0F);
minmax[0][ACOMP] = CLAMP(ctx->MinMax.Min[ACOMP], 0.0F, 1.0F);
minmax[1][RCOMP] = CLAMP(ctx->MinMax.Max[RCOMP], 0.0F, 1.0F);
minmax[1][GCOMP] = CLAMP(ctx->MinMax.Max[GCOMP], 0.0F, 1.0F);
minmax[1][BCOMP] = CLAMP(ctx->MinMax.Max[BCOMP], 0.0F, 1.0F);
minmax[1][ACOMP] = CLAMP(ctx->MinMax.Max[ACOMP], 0.0F, 1.0F);
_mesa_pack_rgba_span_float(ctx, 2, (CONST GLfloat (*)[4]) minmax,
format, type, values, &ctx->Pack, 0);
}
if (ctx->Pack.BufferObj->Name) {
ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT,
ctx->Pack.BufferObj);
}
if (reset) {
_mesa_ResetMinmax(GL_MINMAX);
}
}
void GLAPIENTRY
_mesa_GetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
{
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, "glGetHistogram");
return;
}
if (target != GL_HISTOGRAM) {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetHistogram(target)");
return;
}
if (format != GL_RED &&
format != GL_GREEN &&
format != GL_BLUE &&
format != GL_ALPHA &&
format != GL_RGB &&
format != GL_BGR &&
format != GL_RGBA &&
format != GL_BGRA &&
format != GL_ABGR_EXT &&
format != GL_LUMINANCE &&
format != GL_LUMINANCE_ALPHA) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -