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

📄 pixel.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 4 页
字号:
   GET_CURRENT_CONTEXT(ctx);   ASSERT_OUTSIDE_BEGIN_END(ctx);   if (mapsize < 1 || mapsize > MAX_PIXEL_MAP_TABLE) {      _mesa_error( ctx, GL_INVALID_VALUE, "glPixelMapuiv(mapsize)" );      return;   }   if (map >= GL_PIXEL_MAP_S_TO_S && map <= GL_PIXEL_MAP_I_TO_A) {      /* test that mapsize is a power of two */      if (_mesa_bitcount((GLuint) mapsize) != 1) {	 _mesa_error( ctx, GL_INVALID_VALUE, "glPixelMapuiv(mapsize)" );         return;      }   }   FLUSH_VERTICES(ctx, _NEW_PIXEL);   if (ctx->Unpack.BufferObj->Name) {      /* unpack pixelmap from PBO */      GLubyte *buf;      /* Note, need to use DefaultPacking and Unpack's buffer object */      ctx->DefaultPacking.BufferObj = ctx->Unpack.BufferObj;      if (!_mesa_validate_pbo_access(1, &ctx->DefaultPacking, mapsize, 1, 1,                                     GL_INTENSITY, GL_UNSIGNED_INT, values)) {         _mesa_error(ctx, GL_INVALID_OPERATION,                     "glPixelMapuiv(invalid PBO access)");         return;      }      /* restore */      ctx->DefaultPacking.BufferObj = ctx->Array.NullBufferObj;      buf = (GLubyte *) ctx->Driver.MapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,                                              GL_READ_ONLY_ARB,                                              ctx->Unpack.BufferObj);      if (!buf) {         /* buffer is already mapped - that's an error */         _mesa_error(ctx, GL_INVALID_OPERATION,                     "glPixelMapuiv(PBO is mapped)");         return;      }      values = (const GLuint *) ADD_POINTERS(buf, values);   }   else if (!values) {      return;   }   /* convert to floats */   if (map == GL_PIXEL_MAP_I_TO_I || map == GL_PIXEL_MAP_S_TO_S) {      GLint i;      for (i = 0; i < mapsize; i++) {         fvalues[i] = (GLfloat) values[i];      }   }   else {      GLint i;      for (i = 0; i < mapsize; i++) {         fvalues[i] = UINT_TO_FLOAT( values[i] );      }   }   if (ctx->Unpack.BufferObj->Name) {      ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,                              ctx->Unpack.BufferObj);   }   store_pixelmap(ctx, map, mapsize, fvalues);}void GLAPIENTRY_mesa_PixelMapusv(GLenum map, GLsizei mapsize, const GLushort *values ){   GLfloat fvalues[MAX_PIXEL_MAP_TABLE];   GET_CURRENT_CONTEXT(ctx);   ASSERT_OUTSIDE_BEGIN_END(ctx);   if (mapsize < 1 || mapsize > MAX_PIXEL_MAP_TABLE) {      _mesa_error( ctx, GL_INVALID_VALUE, "glPixelMapusv(mapsize)" );      return;   }   if (map >= GL_PIXEL_MAP_S_TO_S && map <= GL_PIXEL_MAP_I_TO_A) {      /* test that mapsize is a power of two */      if (_mesa_bitcount((GLuint) mapsize) != 1) {	 _mesa_error( ctx, GL_INVALID_VALUE, "glPixelMapuiv(mapsize)" );         return;      }   }   FLUSH_VERTICES(ctx, _NEW_PIXEL);   if (ctx->Unpack.BufferObj->Name) {      /* unpack pixelmap from PBO */      GLubyte *buf;      /* Note, need to use DefaultPacking and Unpack's buffer object */      ctx->DefaultPacking.BufferObj = ctx->Unpack.BufferObj;      if (!_mesa_validate_pbo_access(1, &ctx->DefaultPacking, mapsize, 1, 1,                                     GL_INTENSITY, GL_UNSIGNED_SHORT,                                     values)) {         _mesa_error(ctx, GL_INVALID_OPERATION,                     "glPixelMapusv(invalid PBO access)");         return;      }      /* restore */      ctx->DefaultPacking.BufferObj = ctx->Array.NullBufferObj;      buf = (GLubyte *) ctx->Driver.MapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,                                              GL_READ_ONLY_ARB,                                              ctx->Unpack.BufferObj);      if (!buf) {         /* buffer is already mapped - that's an error */         _mesa_error(ctx, GL_INVALID_OPERATION,                     "glPixelMapusv(PBO is mapped)");         return;      }      values = (const GLushort *) ADD_POINTERS(buf, values);   }   else if (!values) {      return;   }   /* convert to floats */   if (map == GL_PIXEL_MAP_I_TO_I || map == GL_PIXEL_MAP_S_TO_S) {      GLint i;      for (i = 0; i < mapsize; i++) {         fvalues[i] = (GLfloat) values[i];      }   }   else {      GLint i;      for (i = 0; i < mapsize; i++) {         fvalues[i] = USHORT_TO_FLOAT( values[i] );      }   }   if (ctx->Unpack.BufferObj->Name) {      ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,                              ctx->Unpack.BufferObj);   }   store_pixelmap(ctx, map, mapsize, fvalues);}void GLAPIENTRY_mesa_GetPixelMapfv( GLenum map, GLfloat *values ){   GET_CURRENT_CONTEXT(ctx);   GLuint mapsize, i;   const struct gl_pixelmap *pm;   ASSERT_OUTSIDE_BEGIN_END(ctx);   pm = get_pixelmap(ctx, map);   if (!pm) {      _mesa_error(ctx, GL_INVALID_ENUM, "glGetPixelMapfv(map)");      return;   }   mapsize = pm->Size;   if (ctx->Pack.BufferObj->Name) {      /* pack pixelmap into PBO */      GLubyte *buf;      /* Note, need to use DefaultPacking and Pack's buffer object */      ctx->DefaultPacking.BufferObj = ctx->Pack.BufferObj;      if (!_mesa_validate_pbo_access(1, &ctx->DefaultPacking, mapsize, 1, 1,                                     GL_INTENSITY, GL_FLOAT, values)) {         _mesa_error(ctx, GL_INVALID_OPERATION,                     "glGetPixelMapfv(invalid PBO access)");         return;      }      /* restore */      ctx->DefaultPacking.BufferObj = ctx->Array.NullBufferObj;      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,                     "glGetPixelMapfv(PBO is mapped)");         return;      }      values = (GLfloat *) ADD_POINTERS(buf, values);   }   else if (!values) {      return;   }   if (map == GL_PIXEL_MAP_S_TO_S) {      /* special case */      for (i = 0; i < mapsize; i++) {         values[i] = (GLfloat) ctx->PixelMaps.StoS.Map[i];      }   }   else {      MEMCPY(values, pm->Map, mapsize * sizeof(GLfloat));   }   if (ctx->Pack.BufferObj->Name) {      ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT,                              ctx->Pack.BufferObj);   }}void GLAPIENTRY_mesa_GetPixelMapuiv( GLenum map, GLuint *values ){   GET_CURRENT_CONTEXT(ctx);   GLint mapsize, i;   const struct gl_pixelmap *pm;   ASSERT_OUTSIDE_BEGIN_END(ctx);   pm = get_pixelmap(ctx, map);   if (!pm) {      _mesa_error(ctx, GL_INVALID_ENUM, "glGetPixelMapuiv(map)");      return;   }   mapsize = pm->Size;   if (ctx->Pack.BufferObj->Name) {      /* pack pixelmap into PBO */      GLubyte *buf;      /* Note, need to use DefaultPacking and Pack's buffer object */      ctx->DefaultPacking.BufferObj = ctx->Pack.BufferObj;      if (!_mesa_validate_pbo_access(1, &ctx->DefaultPacking, mapsize, 1, 1,                                     GL_INTENSITY, GL_UNSIGNED_INT, values)) {         _mesa_error(ctx, GL_INVALID_OPERATION,                     "glGetPixelMapuiv(invalid PBO access)");         return;      }      /* restore */      ctx->DefaultPacking.BufferObj = ctx->Array.NullBufferObj;      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,                     "glGetPixelMapuiv(PBO is mapped)");         return;      }      values = (GLuint *) ADD_POINTERS(buf, values);   }   else if (!values) {      return;   }   if (map == GL_PIXEL_MAP_S_TO_S) {      /* special case */      MEMCPY(values, ctx->PixelMaps.StoS.Map, mapsize * sizeof(GLint));   }   else {      for (i = 0; i < mapsize; i++) {         values[i] = FLOAT_TO_UINT( pm->Map[i] );      }   }   if (ctx->Pack.BufferObj->Name) {      ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT,                              ctx->Pack.BufferObj);   }}void GLAPIENTRY_mesa_GetPixelMapusv( GLenum map, GLushort *values ){   GET_CURRENT_CONTEXT(ctx);   GLint mapsize, i;   const struct gl_pixelmap *pm;   ASSERT_OUTSIDE_BEGIN_END(ctx);   pm = get_pixelmap(ctx, map);   if (!pm) {      _mesa_error(ctx, GL_INVALID_ENUM, "glGetPixelMapusv(map)");      return;   }   mapsize = pm ? pm->Size : 0;   if (ctx->Pack.BufferObj->Name) {      /* pack pixelmap into PBO */      GLubyte *buf;      /* Note, need to use DefaultPacking and Pack's buffer object */      ctx->DefaultPacking.BufferObj = ctx->Pack.BufferObj;      if (!_mesa_validate_pbo_access(1, &ctx->DefaultPacking, mapsize, 1, 1,                                     GL_INTENSITY, GL_UNSIGNED_SHORT,                                     values)) {         _mesa_error(ctx, GL_INVALID_OPERATION,                     "glGetPixelMapusv(invalid PBO access)");         return;      }      /* restore */      ctx->DefaultPacking.BufferObj = ctx->Array.NullBufferObj;      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,                     "glGetPixelMapusv(PBO is mapped)");         return;      }      values = (GLushort *) ADD_POINTERS(buf, values);   }   else if (!values) {      return;   }   switch (map) {   /* special cases */   case GL_PIXEL_MAP_I_TO_I:      for (i = 0; i < mapsize; i++) {         values[i] = (GLushort) CLAMP(ctx->PixelMaps.ItoI.Map[i], 0.0, 65535.);      }      break;   case GL_PIXEL_MAP_S_TO_S:      for (i = 0; i < mapsize; i++) {         values[i] = (GLushort) CLAMP(ctx->PixelMaps.StoS.Map[i], 0.0, 65535.);      }      break;   default:      for (i = 0; i < mapsize; i++) {         CLAMPED_FLOAT_TO_USHORT(values[i], pm->Map[i] );      }   }   if (ctx->Pack.BufferObj->Name) {      ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT,                              ctx->Pack.BufferObj);   }}/**********************************************************************//*****                       glPixelTransfer                      *****//**********************************************************************//* * Implements glPixelTransfer[fi] whether called immediately or from a * display list. */void GLAPIENTRY_mesa_PixelTransferf( GLenum pname, GLfloat param ){   GET_CURRENT_CONTEXT(ctx);   ASSERT_OUTSIDE_BEGIN_END(ctx);   switch (pname) {      case GL_MAP_COLOR:         if (ctx->Pixel.MapColorFlag == (param ? GL_TRUE : GL_FALSE))	    return;	 FLUSH_VERTICES(ctx, _NEW_PIXEL);         ctx->Pixel.MapColorFlag = param ? GL_TRUE : GL_FALSE;	 break;      case GL_MAP_STENCIL:         if (ctx->Pixel.MapStencilFlag == (param ? GL_TRUE : GL_FALSE))	    return;	 FLUSH_VERTICES(ctx, _NEW_PIXEL);         ctx->Pixel.MapStencilFlag = param ? GL_TRUE : GL_FALSE;	 break;      case GL_INDEX_SHIFT:         if (ctx->Pixel.IndexShift == (GLint) param)	    return;	 FLUSH_VERTICES(ctx, _NEW_PIXEL);         ctx->Pixel.IndexShift = (GLint) param;	 break;      case GL_INDEX_OFFSET:         if (ctx->Pixel.IndexOffset == (GLint) param)	    return;	 FLUSH_VERTICES(ctx, _NEW_PIXEL);         ctx->Pixel.IndexOffset = (GLint) param;	 break;      case GL_RED_SCALE:         if (ctx->Pixel.RedScale == param)	    return;	 FLUSH_VERTICES(ctx, _NEW_PIXEL);         ctx->Pixel.RedScale = param;	 break;      case GL_RED_BIAS:         if (ctx->Pixel.RedBias == param)	    return;	 FLUSH_VERTICES(ctx, _NEW_PIXEL);         ctx->Pixel.RedBias = param;	 break;      case GL_GREEN_SCALE:         if (ctx->Pixel.GreenScale == param)

⌨️ 快捷键说明

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