X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fmain%2Fdrawpix.c;h=12b9f2930d898dbfdc75ddd13cc841ac67f51e5a;hb=263581bba4d61291c54313648063a30c47106f0b;hp=1b069078833811248105ca96c3cf3683b2c3ca20;hpb=acc722d4b890da7ed0ede24751e2bcaf28cc1468;p=mesa.git diff --git a/src/mesa/main/drawpix.c b/src/mesa/main/drawpix.c index 1b069078833..12b9f2930d8 100644 --- a/src/mesa/main/drawpix.c +++ b/src/mesa/main/drawpix.c @@ -1,10 +1,9 @@ -/* $Id: drawpix.c,v 1.56 2001/06/26 21:15:35 brianp Exp $ */ /* * Mesa 3-D graphics library - * Version: 3.5 + * Version: 4.1 * - * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -24,34 +23,33 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - -#ifdef PC_HEADER -#include "all.h" -#else #include "glheader.h" +#include "imports.h" #include "colormac.h" #include "context.h" #include "drawpix.h" #include "feedback.h" #include "macros.h" -#include "mem.h" -#include "mmath.h" #include "state.h" #include "mtypes.h" -#endif - +#if _HAVE_FULL_GL /* * Execute glDrawPixels */ -void +void GLAPIENTRY _mesa_DrawPixels( GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels ) { GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); + if (width < 0 || height < 0) { + _mesa_error( ctx, GL_INVALID_VALUE, "glDrawPixels(width or height < 0" ); + return; + } + if (ctx->RenderMode==GL_RENDER) { GLint x, y; if (!pixels || !ctx->Current.RasterPosValid) { @@ -71,21 +69,15 @@ _mesa_DrawPixels( GLsizei width, GLsizei height, &ctx->Unpack, pixels); } else if (ctx->RenderMode==GL_FEEDBACK) { + /* Feedback the current raster pos info */ if (ctx->Current.RasterPosValid) { - GLfloat texcoord[4], invq; - - FLUSH_CURRENT(ctx, 0); - invq = 1.0F / ctx->Current.Texcoord[0][3]; - texcoord[0] = ctx->Current.Texcoord[0][0] * invq; - texcoord[1] = ctx->Current.Texcoord[0][1] * invq; - texcoord[2] = ctx->Current.Texcoord[0][2] * invq; - texcoord[3] = ctx->Current.Texcoord[0][3]; + FLUSH_CURRENT( ctx, 0 ); FEEDBACK_TOKEN( ctx, (GLfloat) (GLint) GL_DRAW_PIXEL_TOKEN ); _mesa_feedback_vertex( ctx, ctx->Current.RasterPos, - ctx->Current.Color, - ctx->Current.Index, - texcoord ); + ctx->Current.RasterColor, + ctx->Current.RasterIndex, + ctx->Current.RasterTexCoords[0] ); } } else if (ctx->RenderMode==GL_SELECT) { @@ -95,31 +87,7 @@ _mesa_DrawPixels( GLsizei width, GLsizei height, } } - - -void -_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 (!pixels) { - _mesa_error( ctx, GL_INVALID_VALUE, "glReadPixels(pixels)" ); - return; - } - - if (ctx->NewState) - _mesa_update_state(ctx); - - ctx->Driver.ReadPixels(ctx, x, y, width, height, - format, type, &ctx->Pack, pixels); - -} - - - -void +void GLAPIENTRY _mesa_CopyPixels( GLint srcx, GLint srcy, GLsizei width, GLsizei height, GLenum type ) { @@ -128,7 +96,7 @@ _mesa_CopyPixels( GLint srcx, GLint srcy, GLsizei width, GLsizei height, ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); if (width < 0 || height < 0) { - _mesa_error( ctx, GL_INVALID_VALUE, "glCopyPixels" ); + _mesa_error( ctx, GL_INVALID_VALUE, "glCopyPixels(width or height < 0)" ); return; } @@ -152,22 +120,55 @@ _mesa_CopyPixels( GLint srcx, GLint srcy, GLsizei width, GLsizei height, 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.Color, - ctx->Current.Index, - ctx->Current.Texcoord[0] ); + if (ctx->Current.RasterPosValid) { + 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 if (ctx->RenderMode == GL_SELECT) { _mesa_update_hitflag( ctx, ctx->Current.RasterPos[2] ); } } +#endif + + + +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 (!pixels) { + _mesa_error( ctx, GL_INVALID_VALUE, "glReadPixels(pixels)" ); + return; + } + if (ctx->NewState) + _mesa_update_state(ctx); -void + 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 ) @@ -175,10 +176,8 @@ _mesa_Bitmap( GLsizei width, GLsizei height, GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); - - /* Error checking */ if (width < 0 || height < 0) { - _mesa_error( ctx, GL_INVALID_VALUE, "glBitmap" ); + _mesa_error( ctx, GL_INVALID_VALUE, "glBitmap(width or height < 0)" ); return; } @@ -200,31 +199,90 @@ _mesa_Bitmap( GLsizei width, GLsizei height, ctx->Driver.Bitmap( ctx, x, y, width, height, &ctx->Unpack, bitmap ); } } +#if _HAVE_FULL_GL else if (ctx->RenderMode==GL_FEEDBACK) { - GLfloat color[4], texcoord[4], invq; - - color[0] = ctx->Current.RasterColor[0]; - color[1] = ctx->Current.RasterColor[1]; - color[2] = ctx->Current.RasterColor[2]; - color[3] = ctx->Current.RasterColor[3]; - if (ctx->Current.Texcoord[0][3] == 0.0) - invq = 1.0F; - else - invq = 1.0F / ctx->Current.RasterTexCoord[3]; - texcoord[0] = ctx->Current.RasterTexCoord[0] * invq; - texcoord[1] = ctx->Current.RasterTexCoord[1] * invq; - texcoord[2] = ctx->Current.RasterTexCoord[2] * invq; - texcoord[3] = ctx->Current.RasterTexCoord[3]; - FEEDBACK_TOKEN( ctx, (GLfloat) (GLint) GL_BITMAP_TOKEN ); - _mesa_feedback_vertex( ctx, - ctx->Current.RasterPos, - color, ctx->Current.RasterIndex, texcoord ); + if (ctx->Current.RasterPosValid) { + 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 if (ctx->RenderMode==GL_SELECT) { + else { + ASSERT(ctx->RenderMode == GL_SELECT); /* Bitmaps don't generate selection hits. See appendix B of 1.1 spec. */ } +#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->RenderMode==GL_RENDER) { + GLint x, y; + if (!colors || !depths || !ctx->Current.RasterPosValid) { + return; + } + + if (ctx->NewState) { + _mesa_update_state(ctx); + } + + /* Round, to satisfy conformance tests (matches SGI's OpenGL) */ + x = IROUND(ctx->Current.RasterPos[0]); + y = IROUND(ctx->Current.RasterPos[1]); + + ctx->OcclusionResult = GL_TRUE; + 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 */ + if (ctx->Current.RasterPosValid) { + 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 if (ctx->RenderMode==GL_SELECT) { + if (ctx->Current.RasterPosValid) { + _mesa_update_hitflag( ctx, ctx->Current.RasterPos[2] ); + } + } +} + +#endif