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

📄 drawpix.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 2 页
字号:
   }   if (ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT ||       ctx->ReadBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {      _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT,                  "glCopyPixels(incomplete framebuffer)" );      return;   }   if (!_mesa_source_buffer_exists(ctx, type) ||       !_mesa_dest_buffer_exists(ctx, type)) {      _mesa_error(ctx, GL_INVALID_OPERATION,                  "glCopyPixels(missing source or dest buffer)");      return;   }   if (!ctx->Current.RasterPosValid) {      return;   }   if (ctx->RenderMode == GL_RENDER) {      /* Round to satisfy conformance tests (matches SGI's OpenGL) */      GLint destx = IROUND(ctx->Current.RasterPos[0]);      GLint desty = IROUND(ctx->Current.RasterPos[1]);      ctx->Driver.CopyPixels( ctx, srcx, srcy, width, height, destx, desty,			      type );   }   else if (ctx->RenderMode == GL_FEEDBACK) {      FLUSH_CURRENT( ctx, 0 );      FEEDBACK_TOKEN( ctx, (GLfloat) (GLint) GL_COPY_PIXEL_TOKEN );      _mesa_feedback_vertex( ctx,                              ctx->Current.RasterPos,                             ctx->Current.RasterColor,                             ctx->Current.RasterIndex,                             ctx->Current.RasterTexCoords[0] );   }   else {      ASSERT(ctx->RenderMode == GL_SELECT);      /* Do nothing.  See OpenGL Spec, Appendix B, Corollary 6. */   }}#endif /* _HAVE_FULL_GL */void GLAPIENTRY_mesa_ReadPixels( GLint x, GLint y, GLsizei width, GLsizei height,		  GLenum format, GLenum type, GLvoid *pixels ){   GET_CURRENT_CONTEXT(ctx);   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);   if (width < 0 || height < 0) {      _mesa_error( ctx, GL_INVALID_VALUE,                   "glReadPixels(width=%d height=%d)", width, height );      return;   }   if (ctx->NewState)      _mesa_update_state(ctx);   if (error_check_format_type(ctx, format, type, GL_FALSE)) {      /* found an error */      return;   }   if (ctx->ReadBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {      _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT,                  "glReadPixels(incomplete framebuffer)" );      return;   }   if (!_mesa_source_buffer_exists(ctx, format)) {      _mesa_error(ctx, GL_INVALID_OPERATION, "glReadPixels(no readbuffer)");      return;   }   if (ctx->Pack.BufferObj->Name) {      if (!_mesa_validate_pbo_access(2, &ctx->Pack, width, height, 1,                                     format, type, pixels)) {         _mesa_error(ctx, GL_INVALID_OPERATION,                     "glReadPixels(invalid PBO access)");         return;      }      if (ctx->Pack.BufferObj->Pointer) {         /* buffer is mapped - that's an error */         _mesa_error(ctx, GL_INVALID_OPERATION, "glReadPixels(PBO is mapped)");         return;      }   }   ctx->Driver.ReadPixels(ctx, x, y, width, height,			  format, type, &ctx->Pack, pixels);}void GLAPIENTRY_mesa_Bitmap( GLsizei width, GLsizei height,              GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove,              const GLubyte *bitmap ){   GET_CURRENT_CONTEXT(ctx);   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);   if (width < 0 || height < 0) {      _mesa_error( ctx, GL_INVALID_VALUE, "glBitmap(width or height < 0)" );      return;   }   if (!ctx->Current.RasterPosValid) {      return;    /* do nothing */   }   if (ctx->NewState) {      _mesa_update_state(ctx);   }   if (ctx->FragmentProgram.Enabled && !ctx->FragmentProgram._Enabled) {      _mesa_error(ctx, GL_INVALID_OPERATION,                  "glBitmap (invalid fragment program)");      return;   }   if (ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {      _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT,                  "glBitmap(incomplete framebuffer)");      return;   }   if (ctx->RenderMode == GL_RENDER) {      /* Truncate, to satisfy conformance tests (matches SGI's OpenGL). */      const GLfloat epsilon = 0.0001;      GLint x = IFLOOR(ctx->Current.RasterPos[0] + epsilon - xorig);      GLint y = IFLOOR(ctx->Current.RasterPos[1] + epsilon - yorig);      if (ctx->Unpack.BufferObj->Name) {         /* unpack from PBO */         if (!_mesa_validate_pbo_access(2, &ctx->Unpack, width, height, 1,                                        GL_COLOR_INDEX, GL_BITMAP,                                        (GLvoid *) bitmap)) {            _mesa_error(ctx, GL_INVALID_OPERATION,                        "glBitmap(invalid PBO access)");            return;         }         if (ctx->Unpack.BufferObj->Pointer) {            /* buffer is mapped - that's an error */            _mesa_error(ctx, GL_INVALID_OPERATION, "glBitmap(PBO is mapped)");            return;         }      }      ctx->Driver.Bitmap( ctx, x, y, width, height, &ctx->Unpack, bitmap );   }#if _HAVE_FULL_GL   else if (ctx->RenderMode == GL_FEEDBACK) {      FLUSH_CURRENT(ctx, 0);      FEEDBACK_TOKEN( ctx, (GLfloat) (GLint) GL_BITMAP_TOKEN );      _mesa_feedback_vertex( ctx,                             ctx->Current.RasterPos,                             ctx->Current.RasterColor,                             ctx->Current.RasterIndex,                              ctx->Current.RasterTexCoords[0] );   }   else {      ASSERT(ctx->RenderMode == GL_SELECT);      /* Do nothing.  See OpenGL Spec, Appendix B, Corollary 6. */   }#endif   /* update raster position */   ctx->Current.RasterPos[0] += xmove;   ctx->Current.RasterPos[1] += ymove;}#if 0  /* experimental *//* * Execute glDrawDepthPixelsMESA().  This function accepts both a color * image and depth (Z) image.  Rasterization produces fragments with * color and Z taken from these images.  This function is intended for * Z-compositing.  Normally, this operation requires two glDrawPixels * calls with stencil testing. */void GLAPIENTRY_mesa_DrawDepthPixelsMESA( GLsizei width, GLsizei height,                           GLenum colorFormat, GLenum colorType,                           const GLvoid *colors,                           GLenum depthType, const GLvoid *depths ){   GET_CURRENT_CONTEXT(ctx);   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);   if (width < 0 || height < 0) {      _mesa_error( ctx, GL_INVALID_VALUE,                   "glDrawDepthPixelsMESA(width or height < 0" );      return;   }   if (!ctx->Current.RasterPosValid) {      return;   }   if (ctx->NewState) {      _mesa_update_state(ctx);   }   if (ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {      _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT,                  "glDrawDepthPixelsMESA(incomplete framebuffer)");      return;   }   if (ctx->RenderMode == GL_RENDER) {      /* Round, to satisfy conformance tests (matches SGI's OpenGL) */      GLint x = IROUND(ctx->Current.RasterPos[0]);      GLint y = IROUND(ctx->Current.RasterPos[1]);      ctx->Driver.DrawDepthPixelsMESA(ctx, x, y, width, height,                                      colorFormat, colorType, colors,                                      depthType, depths, &ctx->Unpack);   }   else if (ctx->RenderMode == GL_FEEDBACK) {      /* Feedback the current raster pos info */      FLUSH_CURRENT( ctx, 0 );      FEEDBACK_TOKEN( ctx, (GLfloat) (GLint) GL_DRAW_PIXEL_TOKEN );      _mesa_feedback_vertex( ctx,                             ctx->Current.RasterPos,                             ctx->Current.RasterColor,                             ctx->Current.RasterIndex,                             ctx->Current.RasterTexCoords[0] );   }   else {      ASSERT(ctx->RenderMode == GL_SELECT);      /* Do nothing.  See OpenGL Spec, Appendix B, Corollary 6. */   }}#endif

⌨️ 快捷键说明

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