This is misc.c in view mode; [Download] [Up]
/* $Id: misc.c,v 1.5 1996/10/02 02:51:44 brianp Exp $ */ /* * Mesa 3-D graphics library * Version: 2.0 * Copyright (C) 1995-1996 Brian Paul * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * $Log: misc.c,v $ * Revision 1.5 1996/10/02 02:51:44 brianp * created clear_color_buffers() which handles draw mode GL_FRONT_AND_BACK * * Revision 1.4 1996/09/25 03:22:14 brianp * glDrawBuffer(GL_NONE) works now * * Revision 1.3 1996/09/24 00:16:10 brianp * set NewState flag in glRead/DrawBuffer() and glHint() * fixed display list bug in gl_Hint() * * Revision 1.2 1996/09/15 14:18:37 brianp * now use GLframebuffer and GLvisual * * Revision 1.1 1996/09/13 01:38:16 brianp * Initial revision * */ #include <stdlib.h> #include <string.h> #include "accum.h" #include "alphabuf.h" #include "context.h" #include "depth.h" #include "macros.h" #include "masking.h" #include "misc.h" #include "stencil.h" #include "types.h" void gl_ClearIndex( GLcontext *ctx, GLfloat c ) { if (INSIDE_BEGIN_END(ctx)) { gl_error( ctx, GL_INVALID_OPERATION, "glClearIndex" ); return; } ctx->Color.ClearIndex = (GLuint) c; if (!ctx->Visual->RGBAflag) { /* it's OK to call glClearIndex in RGBA mode but it should be a NOP */ (*ctx->Driver.ClearIndex)( ctx, ctx->Color.ClearIndex ); } } void gl_ClearColor( GLcontext *ctx, GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ) { if (INSIDE_BEGIN_END(ctx)) { gl_error( ctx, GL_INVALID_OPERATION, "glClearColor" ); return; } ctx->Color.ClearColor[0] = CLAMP( red, 0.0F, 1.0F ); ctx->Color.ClearColor[1] = CLAMP( green, 0.0F, 1.0F ); ctx->Color.ClearColor[2] = CLAMP( blue, 0.0F, 1.0F ); ctx->Color.ClearColor[3] = CLAMP( alpha, 0.0F, 1.0F ); if (ctx->Visual->RGBAflag) { GLubyte r = (GLint) (ctx->Color.ClearColor[0] * ctx->Visual->RedScale); GLubyte g = (GLint) (ctx->Color.ClearColor[1] * ctx->Visual->GreenScale); GLubyte b = (GLint) (ctx->Color.ClearColor[2] * ctx->Visual->BlueScale); GLubyte a = (GLint) (ctx->Color.ClearColor[3] * ctx->Visual->AlphaScale); (*ctx->Driver.ClearColor)( ctx, r, g, b, a ); } } /* * Clear the color buffer when glColorMask or glIndexMask is in effect. */ static void clear_color_buffer_with_masking( GLcontext *ctx ) { GLint x, y, height, width; /* Compute region to clear */ if (ctx->Scissor.Enabled) { x = ctx->Buffer->Xmin; y = ctx->Buffer->Ymin; height = ctx->Buffer->Ymax - ctx->Buffer->Ymin + 1; width = ctx->Buffer->Xmax - ctx->Buffer->Xmin + 1; } else { x = 0; y = 0; height = ctx->Buffer->Height; width = ctx->Buffer->Width; } if (ctx->Visual->RGBAflag) { /* RGBA mode */ GLubyte red[MAX_WIDTH], green[MAX_WIDTH]; GLubyte blue[MAX_WIDTH], alpha[MAX_WIDTH]; GLubyte r = ctx->Color.ClearColor[0] * ctx->Visual->RedScale; GLubyte g = ctx->Color.ClearColor[1] * ctx->Visual->GreenScale; GLubyte b = ctx->Color.ClearColor[2] * ctx->Visual->BlueScale; GLubyte a = ctx->Color.ClearColor[3] * ctx->Visual->AlphaScale; GLint i; for (i=0;i<height;i++,y++) { MEMSET( red, (int) r, width ); MEMSET( green, (int) g, width ); MEMSET( blue, (int) b, width ); MEMSET( alpha, (int) a, width ); gl_mask_color_span( ctx, width, x, y, red, green, blue, alpha ); (*ctx->Driver.WriteColorSpan)( ctx, width, x, y, red, green, blue, alpha, NULL ); if (ctx->RasterMask & ALPHABUF_BIT) { gl_write_alpha_span( ctx, width, x, y, alpha, NULL ); } } } else { /* Color index mode */ GLuint indx[MAX_WIDTH]; GLubyte mask[MAX_WIDTH]; GLint i, j; MEMSET( mask, 1, width ); for (i=0;i<height;i++,y++) { for (j=0;j<width;j++) { indx[j] = ctx->Color.ClearIndex; } gl_mask_index_span( ctx, width, x, y, indx ); (*ctx->Driver.WriteIndexSpan)( ctx, width, x, y, indx, mask ); } } } /* * Clear the front and/or back color buffers. Also clear the alpha * buffer(s) if present. */ static void clear_color_buffers( GLcontext *ctx ) { if (ctx->Color.SWmasking) { clear_color_buffer_with_masking( ctx ); } else { (*ctx->Driver.Clear)( ctx, !ctx->Scissor.Enabled, ctx->Scissor.X, ctx->Scissor.Y, ctx->Scissor.Width, ctx->Scissor.Height ); if (ctx->RasterMask & ALPHABUF_BIT) { /* front and/or back alpha buffers will be cleared here */ gl_clear_alpha_buffers( ctx ); } } if (ctx->RasterMask & FRONT_AND_BACK_BIT) { /*** Also clear the back buffer ***/ (*ctx->Driver.SetBuffer)( ctx, GL_BACK ); if (ctx->Color.SWmasking) { clear_color_buffer_with_masking( ctx ); } else { (*ctx->Driver.Clear)( ctx, !ctx->Scissor.Enabled, ctx->Scissor.X, ctx->Scissor.Y, ctx->Scissor.Width, ctx->Scissor.Height ); } (*ctx->Driver.SetBuffer)( ctx, GL_FRONT ); } } void gl_Clear( GLcontext *ctx, GLbitfield mask ) { #ifdef PROFILE GLdouble t0 = gl_time(); #endif if (INSIDE_BEGIN_END(ctx)) { gl_error( ctx, GL_INVALID_OPERATION, "glClear" ); return; } if (ctx->NewState) { gl_update_state( ctx ); } if (mask & GL_COLOR_BUFFER_BIT) clear_color_buffers( ctx ); if (mask & GL_DEPTH_BUFFER_BIT) (*ctx->Driver.ClearDepthBuffer)( ctx ); if (mask & GL_ACCUM_BUFFER_BIT) gl_clear_accum_buffer( ctx ); if (mask & GL_STENCIL_BUFFER_BIT) gl_clear_stencil_buffer( ctx ); #ifdef PROFILE ctx->ClearTime += gl_time() - t0; ctx->ClearCount++; #endif } const GLubyte *gl_GetString( GLcontext *ctx, GLenum name ) { static char *vendor = "Brian Paul"; static char *renderer = "Mesa"; static char *version = "1.1 Mesa 2.0"; static char *extensions = "GL_EXT_blend_color GL_EXT_blend_minmax GL_EXT_blend_logic_op GL_EXT_blend_subtract GL_EXT_vertex_array GL_MESA_window_pos"; if (INSIDE_BEGIN_END(ctx)) { gl_error( ctx, GL_INVALID_OPERATION, "glGetString" ); return (GLubyte *) 0; } switch (name) { case GL_VENDOR: return (GLubyte *) vendor; case GL_RENDERER: return (GLubyte *) renderer; case GL_VERSION: return (GLubyte *) version; case GL_EXTENSIONS: return (GLubyte *) extensions; default: gl_error( ctx, GL_INVALID_ENUM, "glGetString" ); return (GLubyte *) 0; } } void gl_Finish( GLcontext *ctx ) { /* Don't compile into display list */ if (INSIDE_BEGIN_END(ctx)) { gl_error( ctx, GL_INVALID_OPERATION, "glFinish" ); return; } if (ctx->Driver.Finish) { (*ctx->Driver.Finish)( ctx ); } } void gl_Flush( GLcontext *ctx ) { /* Don't compile into display list */ if (INSIDE_BEGIN_END(ctx)) { gl_error( ctx, GL_INVALID_OPERATION, "glFlush" ); return; } if (ctx->Driver.Flush) { (*ctx->Driver.Flush)( ctx ); } } void gl_Hint( GLcontext *ctx, GLenum target, GLenum mode ) { if (INSIDE_BEGIN_END(ctx)) { gl_error( ctx, GL_INVALID_OPERATION, "glHint" ); return; } if (mode!=GL_DONT_CARE && mode!=GL_FASTEST && mode!=GL_NICEST) { gl_error( ctx, GL_INVALID_ENUM, "glHint(mode)" ); return; } switch (target) { case GL_FOG_HINT: ctx->Hint.Fog = mode; break; case GL_LINE_SMOOTH_HINT: ctx->Hint.LineSmooth = mode; break; case GL_PERSPECTIVE_CORRECTION_HINT: ctx->Hint.PerspectiveCorrection = mode; break; case GL_POINT_SMOOTH_HINT: ctx->Hint.PointSmooth = mode; break; case GL_POLYGON_SMOOTH_HINT: ctx->Hint.PolygonSmooth = mode; break; default: gl_error( ctx, GL_INVALID_ENUM, "glHint(target)" ); } ctx->NewState |= NEW_ALL; /* just to be safe */ } void gl_DrawBuffer( GLcontext *ctx, GLenum mode ) { if (INSIDE_BEGIN_END(ctx)) { gl_error( ctx, GL_INVALID_OPERATION, "glDrawBuffer" ); return; } switch (mode) { case GL_FRONT: case GL_FRONT_LEFT: case GL_FRONT_AND_BACK: if ( (*ctx->Driver.SetBuffer)( ctx, GL_FRONT ) == GL_FALSE ) { gl_error( ctx, GL_INVALID_ENUM, "glDrawBuffer" ); return; } ctx->Color.DrawBuffer = mode; ctx->Buffer->Alpha = ctx->Buffer->FrontAlpha; ctx->NewState |= NEW_RASTER_OPS; break; case GL_BACK: case GL_BACK_LEFT: if ( (*ctx->Driver.SetBuffer)( ctx, GL_BACK ) == GL_FALSE) { gl_error( ctx, GL_INVALID_ENUM, "glDrawBuffer" ); return; } ctx->Color.DrawBuffer = mode; ctx->Buffer->Alpha = ctx->Buffer->BackAlpha; ctx->NewState |= NEW_RASTER_OPS; break; case GL_NONE: ctx->Color.DrawBuffer = mode; ctx->Buffer->Alpha = NULL; ctx->NewState |= NEW_RASTER_OPS; break; case GL_FRONT_RIGHT: case GL_BACK_RIGHT: case GL_LEFT: case GL_RIGHT: case GL_AUX0: gl_error( ctx, GL_INVALID_OPERATION, "glDrawBuffer" ); break; default: gl_error( ctx, GL_INVALID_ENUM, "glDrawBuffer" ); } } void gl_ReadBuffer( GLcontext *ctx, GLenum mode ) { if (INSIDE_BEGIN_END(ctx)) { gl_error( ctx, GL_INVALID_OPERATION, "glReadBuffer" ); return; } switch (mode) { case GL_FRONT: case GL_FRONT_LEFT: if ( (*ctx->Driver.SetBuffer)( ctx, GL_FRONT ) == GL_FALSE) { gl_error( ctx, GL_INVALID_ENUM, "glReadBuffer" ); return; } ctx->Pixel.ReadBuffer = mode; ctx->Buffer->Alpha = ctx->Buffer->FrontAlpha; ctx->NewState |= NEW_RASTER_OPS; break; case GL_BACK: case GL_BACK_LEFT: if ( (*ctx->Driver.SetBuffer)( ctx, GL_BACK ) == GL_FALSE) { gl_error( ctx, GL_INVALID_ENUM, "glReadBuffer" ); return; } ctx->Pixel.ReadBuffer = mode; ctx->Buffer->Alpha = ctx->Buffer->BackAlpha; ctx->NewState |= NEW_RASTER_OPS; break; case GL_FRONT_RIGHT: case GL_BACK_RIGHT: case GL_LEFT: case GL_RIGHT: case GL_AUX0: gl_error( ctx, GL_INVALID_OPERATION, "glReadBuffer" ); break; default: gl_error( ctx, GL_INVALID_ENUM, "glReadBuffer" ); } /* Remember, the draw buffer is the default state */ (void) (*ctx->Driver.SetBuffer)( ctx, ctx->Color.DrawBuffer ); } void gl_Rectf( GLcontext *ctx, GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2 ) { if (INSIDE_BEGIN_END(ctx)) { gl_error( ctx, GL_INVALID_OPERATION, "glRect" ); return; } (*ctx->API.Begin)( ctx, GL_QUADS ); (*ctx->API.Vertex4f)( ctx, x1, y1, 0.0F, 1.0F ); (*ctx->API.Vertex4f)( ctx, x2, y1, 0.0F, 1.0F ); (*ctx->API.Vertex4f)( ctx, x2, y2, 0.0F, 1.0F ); (*ctx->API.Vertex4f)( ctx, x1, y2, 0.0F, 1.0F ); (*ctx->API.End)( ctx ); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.