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

📄 image.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 5 页
字号:
 * by the dstFormat, dstType and dstPacking.  Used by glReadPixels, * glGetConvolutionFilter(), etc. * Incoming colors will be clamped to [0,1] if needed. * Note: the rgba values will be modified by this function when any pixel * transfer ops are enabled. */void_mesa_pack_rgba_span_float(GLcontext *ctx, GLuint n, GLfloat rgba[][4],                           GLenum dstFormat, GLenum dstType,                           GLvoid *dstAddr,                           const struct gl_pixelstore_attrib *dstPacking,                           GLbitfield transferOps){   GLfloat luminance[MAX_WIDTH];   const GLint comps = _mesa_components_in_format(dstFormat);   GLuint i;   if (dstType != GL_FLOAT || ctx->Color.ClampReadColor == GL_TRUE) {      /* need to clamp to [0, 1] */      transferOps |= IMAGE_CLAMP_BIT;   }   if (transferOps) {      _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba);      if ((transferOps & IMAGE_MIN_MAX_BIT) && ctx->MinMax.Sink) {         return;      }   }   if (dstFormat == GL_LUMINANCE || dstFormat == GL_LUMINANCE_ALPHA) {      /* compute luminance values */      if (dstType != GL_FLOAT || ctx->Color.ClampReadColor == GL_TRUE) {         for (i = 0; i < n; i++) {            GLfloat sum = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];            luminance[i] = CLAMP(sum, 0.0F, 1.0F);         }      }      else {         for (i = 0; i < n; i++) {            luminance[i] = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];         }      }   }   /*    * Pack/store the pixels.  Ugh!  Lots of cases!!!    */   switch (dstType) {      case GL_UNSIGNED_BYTE:         {            GLubyte *dst = (GLubyte *) dstAddr;            switch (dstFormat) {               case GL_RED:                  for (i=0;i<n;i++)                     dst[i] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);                  break;               case GL_GREEN:                  for (i=0;i<n;i++)                     dst[i] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);                  break;               case GL_BLUE:                  for (i=0;i<n;i++)                     dst[i] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);                  break;               case GL_ALPHA:                  for (i=0;i<n;i++)                     dst[i] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);                  break;               case GL_LUMINANCE:                  for (i=0;i<n;i++)                     dst[i] = FLOAT_TO_UBYTE(luminance[i]);                  break;               case GL_LUMINANCE_ALPHA:                  for (i=0;i<n;i++) {                     dst[i*2+0] = FLOAT_TO_UBYTE(luminance[i]);                     dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);                  }                  break;               case GL_RGB:                  for (i=0;i<n;i++) {                     dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);                     dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);                     dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);                  }                  break;               case GL_RGBA:                  for (i=0;i<n;i++) {                     dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);                     dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);                     dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);                     dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);                  }                  break;               case GL_BGR:                  for (i=0;i<n;i++) {                     dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);                     dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);                     dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);                  }                  break;               case GL_BGRA:                  for (i=0;i<n;i++) {                     dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);                     dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);                     dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);                     dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);                  }                  break;               case GL_ABGR_EXT:                  for (i=0;i<n;i++) {                     dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);                     dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);                     dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);                     dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);                  }                  break;               default:                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");            }         }         break;      case GL_BYTE:         {            GLbyte *dst = (GLbyte *) dstAddr;            switch (dstFormat) {               case GL_RED:                  for (i=0;i<n;i++)                     dst[i] = FLOAT_TO_BYTE(rgba[i][RCOMP]);                  break;               case GL_GREEN:                  for (i=0;i<n;i++)                     dst[i] = FLOAT_TO_BYTE(rgba[i][GCOMP]);                  break;               case GL_BLUE:                  for (i=0;i<n;i++)                     dst[i] = FLOAT_TO_BYTE(rgba[i][BCOMP]);                  break;               case GL_ALPHA:                  for (i=0;i<n;i++)                     dst[i] = FLOAT_TO_BYTE(rgba[i][ACOMP]);                  break;               case GL_LUMINANCE:                  for (i=0;i<n;i++)                     dst[i] = FLOAT_TO_BYTE(luminance[i]);                  break;               case GL_LUMINANCE_ALPHA:                  for (i=0;i<n;i++) {                     dst[i*2+0] = FLOAT_TO_BYTE(luminance[i]);                     dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][ACOMP]);                  }                  break;               case GL_RGB:                  for (i=0;i<n;i++) {                     dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);                     dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);                     dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]);                  }                  break;               case GL_RGBA:                  for (i=0;i<n;i++) {                     dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);                     dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);                     dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]);                     dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]);                  }                  break;               case GL_BGR:                  for (i=0;i<n;i++) {                     dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]);                     dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);                     dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]);                  }                  break;               case GL_BGRA:                  for (i=0;i<n;i++) {                     dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]);                     dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);                     dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]);                     dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]);                  }		  break;               case GL_ABGR_EXT:                  for (i=0;i<n;i++) {                     dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][ACOMP]);                     dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][BCOMP]);                     dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][GCOMP]);                     dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][RCOMP]);                  }                  break;               default:                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");            }         }         break;      case GL_UNSIGNED_SHORT:         {            GLushort *dst = (GLushort *) dstAddr;            switch (dstFormat) {               case GL_RED:                  for (i=0;i<n;i++)                     CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][RCOMP]);                  break;               case GL_GREEN:                  for (i=0;i<n;i++)                     CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][GCOMP]);                  break;               case GL_BLUE:                  for (i=0;i<n;i++)                     CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][BCOMP]);                  break;               case GL_ALPHA:                  for (i=0;i<n;i++)                     CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][ACOMP]);                  break;               case GL_LUMINANCE:                  for (i=0;i<n;i++)                     UNCLAMPED_FLOAT_TO_USHORT(dst[i], luminance[i]);                  break;               case GL_LUMINANCE_ALPHA:                  for (i=0;i<n;i++) {                     UNCLAMPED_FLOAT_TO_USHORT(dst[i*2+0], luminance[i]);                     CLAMPED_FLOAT_TO_USHORT(dst[i*2+1], rgba[i][ACOMP]);                  }                  break;               case GL_RGB:                  for (i=0;i<n;i++) {                     CLAMPED_FLOAT_TO_USHORT(dst[i*3+0], rgba[i][RCOMP]);                     CLAMPED_FLOAT_TO_USHORT(dst[i*3+1], rgba[i][GCOMP]);                     CLAMPED_FLOAT_TO_USHORT(dst[i*3+2], rgba[i][BCOMP]);                  }                  break;               case GL_RGBA:                  for (i=0;i<n;i++) {                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][RCOMP]);                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][GCOMP]);                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][BCOMP]);                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][ACOMP]);                  }                  break;               case GL_BGR:                  for (i=0;i<n;i++) {                     CLAMPED_FLOAT_TO_USHORT(dst[i*3+0], rgba[i][BCOMP]);                     CLAMPED_FLOAT_TO_USHORT(dst[i*3+1], rgba[i][GCOMP]);                     CLAMPED_FLOAT_TO_USHORT(dst[i*3+2], rgba[i][RCOMP]);                  }                  break;               case GL_BGRA:                  for (i=0;i<n;i++) {                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][BCOMP]);                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][GCOMP]);                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][RCOMP]);                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][ACOMP]);                  }                  break;               case GL_ABGR_EXT:                  for (i=0;i<n;i++) {                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][ACOMP]);                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][BCOMP]);                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][GCOMP]);                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][RCOMP]);                  }                  break;               default:                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");            }         }         break;      case GL_SHORT:         {            GLshort *dst = (GLshort *) dstAddr;            switch (dstFormat) {               case GL_RED:                  for (i=0;i<n;i++)                     dst[i] = FLOAT_TO_SHORT(rgba[i][RCOMP]);                  break;               case GL_GREEN:                  for (i=0;i<n;i++)                     dst[i] = FLOAT_TO_SHORT(rgba[i][GCOMP]);                  break;               case GL_BLUE:                  for (i=0;i<n;i++)                     dst[i] = FLOAT_TO_SHORT(rgba[i][BCOMP]);                  break;               case GL_ALPHA:                  for (i=0;i<n;i++)                     dst[i] = FLOAT_TO_SHORT(rgba[i][ACOMP]);                  break;               case GL_LUMINANCE:                  for (i=0;i<n;i++)                     dst[i] = FLOAT_TO_SHORT(luminance[i]);                  break;               case GL_LUMINANCE_ALPHA:                  for (i=0;i<n;i++) {                     dst[i*2+0] = FLOAT_TO_SHORT(luminance[i]);                     dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][ACOMP]);                  }                  break;               case GL_RGB:                  for (i=0;i<n;i++) {                     dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);                     dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);                     dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]);                  }                  break;               case GL_RGBA:                  for (i=0;i<n;i++) {                     dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);                     dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);                     dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]);                     dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]);                  }                  break;               case GL_BGR:                  for (i=0;i<n;i++) {                     dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]);                     dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);                     dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]);                  }                  break;               case GL_BGRA:                  for (i=0;i<n;i++) {                     dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]);                     dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);                     dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]);                     dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]);                  }		  break;               case GL_ABGR_EXT:                  for (i=0;i<n;i++) {                     dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][ACOMP]);                     dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][BCOMP]);                     dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][GCOMP]);                     dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][RCOMP]);                  }                  break;               default:                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");            }         }         break;      case GL_UNSIGNED_INT:         {            GLuint *dst = (GLuint *) dstAddr;            switch (dstFormat) {               case GL_RED:                  for (i=0;i<n;i++)                     dst[i] = FLOAT_TO_UINT(rgba[i][RCOMP]);                  break;               case GL_GREEN:                  for (i=0;i<n;i++)                     dst[i] = FLOAT_TO_UINT(rgba[i][GCOMP]);                  break;               case GL_BLUE:                  for (i=0;i<n;i++)                     dst[i] = FLOAT_TO_UINT(rgba[i][BCOMP]);                  break;               case GL_ALPHA:                  for (i=0;i<n;i++)                     dst[i] = FLOAT_TO_UINT(rgba[i][ACOMP]);                  break;               case GL_LUMINANCE:                  for (i=0;i<n;i++)                     dst[i] = FLOAT_TO_UINT(luminance[i]);                  break;               case GL_LUMINANCE_ALPHA:                  for (i=0;i<n;i++) {                     dst[i*2+0] = FLOAT_TO_UINT(luminance[i]);                     dst[i*2+1] = FLOAT_TO_UINT(rgba[i][ACOMP]);                  }                  break;               case GL_RGB:                  for (i=0;i<n;i++) {                     dst[i*3+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);                     dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);                     dst[i*3+2] = FLOAT_TO_UINT(rgba[i][BCOMP]);                  }                  break;               case GL_RGBA:                  for (i=0;i<n;i++) {                     dst[i*4+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);                     dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);                     dst[i*4+2] = FLOAT_TO_UINT(rgba[i][BCOMP]);                     dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]);                  }                  break;               case GL_BGR:                  for (i=0;i<n;i++) {                     dst[i*3+0] = FLOAT_TO_UINT(rgba[i][BCOMP]);                     dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);                     dst[i*3+2] = FLOAT_TO_UINT(rgba[i][RCOMP]);                  }                  break;               case GL_BGRA:

⌨️ 快捷键说明

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