⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 colortab.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 3 页
字号:
   baseFormat = base_colortab_format(internalFormat);   if (baseFormat < 0) {      _mesa_error(ctx, GL_INVALID_ENUM, "glColorTable(internalFormat)");      return;   }   if (width < 0 || (width != 0 && _mesa_bitcount(width) != 1)) {      /* error */      if (proxy) {         table->Size = 0;         table->InternalFormat = (GLenum) 0;         table->_BaseFormat = (GLenum) 0;      }      else {         _mesa_error(ctx, GL_INVALID_VALUE, "glColorTable(width=%d)", width);      }      return;   }   if (width > (GLsizei) ctx->Const.MaxColorTableSize) {      if (proxy) {         table->Size = 0;         table->InternalFormat = (GLenum) 0;         table->_BaseFormat = (GLenum) 0;      }      else {         _mesa_error(ctx, GL_TABLE_TOO_LARGE, "glColorTable(width)");      }      return;   }   table->Size = width;   table->InternalFormat = internalFormat;   table->_BaseFormat = (GLenum) baseFormat;   comps = _mesa_components_in_format(table->_BaseFormat);   assert(comps > 0);  /* error should have been caught sooner */   if (!proxy) {      _mesa_free_colortable_data(table);      if (width > 0) {         table->TableF = (GLfloat *) _mesa_malloc(comps * width * sizeof(GLfloat));         table->TableUB = (GLubyte *) _mesa_malloc(comps * width * sizeof(GLubyte));	 if (!table->TableF || !table->TableUB) {	    _mesa_error(ctx, GL_OUT_OF_MEMORY, "glColorTable");	    return;	 }	 store_colortable_entries(ctx, table,				  0, width,  /* start, count */				  format, type, data,				  scale[0], bias[0],				  scale[1], bias[1],				  scale[2], bias[2],				  scale[3], bias[3]);      }   } /* proxy */   /* do this after the table's Type and Format are set */   set_component_sizes(table);   if (texObj || target == GL_SHARED_TEXTURE_PALETTE_EXT) {      /* texture object palette, texObj==NULL means the shared palette */      if (ctx->Driver.UpdateTexturePalette) {         (*ctx->Driver.UpdateTexturePalette)( ctx, texObj );      }   }   ctx->NewState |= _NEW_PIXEL;}void GLAPIENTRY_mesa_ColorSubTable( GLenum target, GLsizei start,                     GLsizei count, GLenum format, GLenum type,                     const GLvoid *data ){   static const GLfloat one[4] = { 1.0, 1.0, 1.0, 1.0 };   static const GLfloat zero[4] = { 0.0, 0.0, 0.0, 0.0 };   GET_CURRENT_CONTEXT(ctx);   struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];   struct gl_texture_object *texObj = NULL;   struct gl_color_table *table = NULL;   const GLfloat *scale = one, *bias = zero;   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);   switch (target) {      case GL_SHARED_TEXTURE_PALETTE_EXT:         table = &ctx->Texture.Palette;         break;      case GL_COLOR_TABLE:         table = &ctx->ColorTable[COLORTABLE_PRECONVOLUTION];         scale = ctx->Pixel.ColorTableScale[COLORTABLE_PRECONVOLUTION];         bias = ctx->Pixel.ColorTableBias[COLORTABLE_PRECONVOLUTION];         break;      case GL_TEXTURE_COLOR_TABLE_SGI:         if (!ctx->Extensions.SGI_texture_color_table) {            _mesa_error(ctx, GL_INVALID_ENUM, "glColorSubTable(target)");            return;         }         table = &(texUnit->ColorTable);         scale = ctx->Pixel.TextureColorTableScale;         bias = ctx->Pixel.TextureColorTableBias;         break;      case GL_POST_CONVOLUTION_COLOR_TABLE:         table = &ctx->ColorTable[COLORTABLE_POSTCONVOLUTION];         scale = ctx->Pixel.ColorTableScale[COLORTABLE_POSTCONVOLUTION];         bias = ctx->Pixel.ColorTableBias[COLORTABLE_POSTCONVOLUTION];         break;      case GL_POST_COLOR_MATRIX_COLOR_TABLE:         table = &ctx->ColorTable[COLORTABLE_POSTCOLORMATRIX];         scale = ctx->Pixel.ColorTableScale[COLORTABLE_POSTCOLORMATRIX];         bias = ctx->Pixel.ColorTableBias[COLORTABLE_POSTCOLORMATRIX];         break;      default:         /* try texture targets */         texObj = _mesa_select_tex_object(ctx, texUnit, target);         if (texObj && !_mesa_is_proxy_texture(target)) {            table = &texObj->Palette;         }         else {            _mesa_error(ctx, GL_INVALID_ENUM, "glColorSubTable(target)");            return;         }   }   assert(table);   if (!_mesa_is_legal_format_and_type(ctx, format, type) ||       format == GL_INTENSITY) {      _mesa_error(ctx, GL_INVALID_OPERATION, "glColorSubTable(format or type)");      return;   }   if (count < 1) {      _mesa_error(ctx, GL_INVALID_VALUE, "glColorSubTable(count)");      return;   }   /* error should have been caught sooner */   assert(_mesa_components_in_format(table->_BaseFormat) > 0);   if (start + count > (GLint) table->Size) {      _mesa_error(ctx, GL_INVALID_VALUE, "glColorSubTable(count)");      return;   }   if (!table->TableF || !table->TableUB) {      /* a GL_OUT_OF_MEMORY error would have been recorded previously */      return;   }   store_colortable_entries(ctx, table, start, count,			    format, type, data,                            scale[0], bias[0],                            scale[1], bias[1],                            scale[2], bias[2],                            scale[3], bias[3]);   if (texObj || target == GL_SHARED_TEXTURE_PALETTE_EXT) {      /* per-texture object palette */      if (ctx->Driver.UpdateTexturePalette) {         (*ctx->Driver.UpdateTexturePalette)( ctx, texObj );      }   }   ctx->NewState |= _NEW_PIXEL;}void GLAPIENTRY_mesa_CopyColorTable(GLenum target, GLenum internalformat,                     GLint x, GLint y, GLsizei width){   GET_CURRENT_CONTEXT(ctx);   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);   /* Select buffer to read from */   ctx->Driver.CopyColorTable( ctx, target, internalformat, x, y, width );}void GLAPIENTRY_mesa_CopyColorSubTable(GLenum target, GLsizei start,                        GLint x, GLint y, GLsizei width){   GET_CURRENT_CONTEXT(ctx);   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);   ctx->Driver.CopyColorSubTable( ctx, target, start, x, y, width );}void GLAPIENTRY_mesa_GetColorTable( GLenum target, GLenum format,                     GLenum type, GLvoid *data ){   GET_CURRENT_CONTEXT(ctx);   struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];   struct gl_color_table *table = NULL;   GLfloat rgba[MAX_COLOR_TABLE_SIZE][4];   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);   if (ctx->NewState) {      _mesa_update_state(ctx);   }   switch (target) {      case GL_SHARED_TEXTURE_PALETTE_EXT:         table = &ctx->Texture.Palette;         break;      case GL_COLOR_TABLE:         table = &ctx->ColorTable[COLORTABLE_PRECONVOLUTION];         break;      case GL_TEXTURE_COLOR_TABLE_SGI:         if (!ctx->Extensions.SGI_texture_color_table) {            _mesa_error(ctx, GL_INVALID_ENUM, "glGetColorTable(target)");            return;         }         table = &(texUnit->ColorTable);         break;      case GL_POST_CONVOLUTION_COLOR_TABLE:         table = &ctx->ColorTable[COLORTABLE_POSTCONVOLUTION];         break;      case GL_POST_COLOR_MATRIX_COLOR_TABLE:         table = &ctx->ColorTable[COLORTABLE_POSTCOLORMATRIX];         break;      default:         /* try texture targets */         {            struct gl_texture_object *texobj               = _mesa_select_tex_object(ctx, texUnit, target);            if (texobj && !_mesa_is_proxy_texture(target)) {               table = &texobj->Palette;            }            else {               _mesa_error(ctx, GL_INVALID_ENUM, "glGetColorTable(target)");               return;            }         }   }   ASSERT(table);   if (table->Size <= 0) {      return;   }   switch (table->_BaseFormat) {   case GL_ALPHA:      {         GLuint i;         for (i = 0; i < table->Size; i++) {            rgba[i][RCOMP] = 0;            rgba[i][GCOMP] = 0;            rgba[i][BCOMP] = 0;            rgba[i][ACOMP] = table->TableF[i];         }      }      break;   case GL_LUMINANCE:      {         GLuint i;         for (i = 0; i < table->Size; i++) {            rgba[i][RCOMP] =            rgba[i][GCOMP] =            rgba[i][BCOMP] = table->TableF[i];            rgba[i][ACOMP] = 1.0F;         }      }      break;   case GL_LUMINANCE_ALPHA:      {         GLuint i;         for (i = 0; i < table->Size; i++) {            rgba[i][RCOMP] =            rgba[i][GCOMP] =            rgba[i][BCOMP] = table->TableF[i*2+0];            rgba[i][ACOMP] = table->TableF[i*2+1];         }      }      break;   case GL_INTENSITY:      {         GLuint i;         for (i = 0; i < table->Size; i++) {            rgba[i][RCOMP] =            rgba[i][GCOMP] =            rgba[i][BCOMP] =            rgba[i][ACOMP] = table->TableF[i];         }      }      break;   case GL_RGB:      {         GLuint i;         for (i = 0; i < table->Size; i++) {            rgba[i][RCOMP] = table->TableF[i*3+0];            rgba[i][GCOMP] = table->TableF[i*3+1];            rgba[i][BCOMP] = table->TableF[i*3+2];            rgba[i][ACOMP] = 1.0F;         }      }      break;   case GL_RGBA:      _mesa_memcpy(rgba, table->TableF, 4 * table->Size * sizeof(GLfloat));      break;   default:      _mesa_problem(ctx, "bad table format in glGetColorTable");      return;   }   if (ctx->Pack.BufferObj->Name) {      /* pack color table into PBO */      GLubyte *buf;      if (!_mesa_validate_pbo_access(1, &ctx->Pack, table->Size, 1, 1,                                     format, type, data)) {         _mesa_error(ctx, GL_INVALID_OPERATION,                     "glGetColorTable(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,                     "glGetColorTable(PBO is mapped)");         return;      }      data = ADD_POINTERS(buf, data);   }   _mesa_pack_rgba_span_float(ctx, table->Size, rgba,                              format, type, data, &ctx->Pack, 0x0);   if (ctx->Pack.BufferObj->Name) {      ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT,                              ctx->Pack.BufferObj);   }}void GLAPIENTRY_mesa_ColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params){   GLfloat *scale, *bias;   GET_CURRENT_CONTEXT(ctx);   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);   switch (target) {   case GL_COLOR_TABLE_SGI:      scale = ctx->Pixel.ColorTableScale[COLORTABLE_PRECONVOLUTION];      bias  = ctx->Pixel.ColorTableBias[COLORTABLE_PRECONVOLUTION];      break;   case GL_TEXTURE_COLOR_TABLE_SGI:      scale = ctx->Pixel.TextureColorTableScale;      bias  = ctx->Pixel.TextureColorTableBias;      break;   case GL_POST_CONVOLUTION_COLOR_TABLE_SGI:      scale = ctx->Pixel.ColorTableScale[COLORTABLE_POSTCONVOLUTION];      bias  = ctx->Pixel.ColorTableBias[COLORTABLE_POSTCONVOLUTION];      break;   case GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI:      scale = ctx->Pixel.ColorTableScale[COLORTABLE_POSTCOLORMATRIX];      bias  = ctx->Pixel.ColorTableBias[COLORTABLE_POSTCOLORMATRIX];      break;   default:      _mesa_error(ctx, GL_INVALID_ENUM, "glColorTableParameter(target)");      return;   }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -