diff options
author | Keith Whitwell <[email protected]> | 2000-10-31 18:00:04 +0000 |
---|---|---|
committer | Keith Whitwell <[email protected]> | 2000-10-31 18:00:04 +0000 |
commit | e3a051e0538a605551f4d58294c94f5eb00ed07f (patch) | |
tree | ea5ccfd6d578fee1f8adb5a5c7f34f12d601c1c9 /src/mesa/swrast/s_bitmap.c | |
parent | 6e0f0f51e0371688a434ed65c4ae0da1b061a4b5 (diff) |
Moved software rasterizer functionality to new directory.
Diffstat (limited to 'src/mesa/swrast/s_bitmap.c')
-rw-r--r-- | src/mesa/swrast/s_bitmap.c | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/src/mesa/swrast/s_bitmap.c b/src/mesa/swrast/s_bitmap.c new file mode 100644 index 00000000000..646081b83e1 --- /dev/null +++ b/src/mesa/swrast/s_bitmap.c @@ -0,0 +1,131 @@ +/* $Id: s_bitmap.c,v 1.1 2000/10/31 18:00:04 keithw Exp $ */ + +/* + * Mesa 3-D graphics library + * Version: 3.3 + * + * Copyright (C) 1999 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"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + +#include "glheader.h" +#include "image.h" +#include "macros.h" +#include "pixel.h" + +#include "s_fog.h" +#include "s_pb.h" + + + +/* + * Render a bitmap. + */ +void +_swrast_Bitmap( GLcontext *ctx, GLint px, GLint py, + GLsizei width, GLsizei height, + const struct gl_pixelstore_attrib *unpack, + const GLubyte *bitmap ) +{ + struct pixel_buffer *PB = ctx->PB; + GLint row, col; + GLdepth fragZ; + GLfixed fogCoord; + + ASSERT(ctx->RenderMode == GL_RENDER); + ASSERT(bitmap); + + if (ctx->PB->primitive != GL_BITMAP) { + gl_flush_pb( ctx ); + ctx->PB->primitive = GL_BITMAP; + } + + /* Set bitmap drawing color */ + if (ctx->Visual.RGBAflag) { + GLint r, g, b, a; + r = (GLint) (ctx->Current.RasterColor[0] * CHAN_MAXF); + g = (GLint) (ctx->Current.RasterColor[1] * CHAN_MAXF); + b = (GLint) (ctx->Current.RasterColor[2] * CHAN_MAXF); + a = (GLint) (ctx->Current.RasterColor[3] * CHAN_MAXF); + PB_SET_COLOR( PB, r, g, b, a ); + } + else { + PB_SET_INDEX( PB, ctx->Current.RasterIndex ); + } + + fragZ = (GLdepth) ( ctx->Current.RasterPos[2] * ctx->Visual.DepthMaxF); + + _mesa_win_fog_coords_from_z( ctx, 1, &fragZ, &fogCoord ); + + for (row=0; row<height; row++) { + const GLubyte *src = (const GLubyte *) _mesa_image_address( unpack, + bitmap, width, height, GL_COLOR_INDEX, GL_BITMAP, 0, row, 0 ); + + if (unpack->LsbFirst) { + /* Lsb first */ + GLubyte mask = 1U << (unpack->SkipPixels & 0x7); + for (col=0; col<width; col++) { + if (*src & mask) { + PB_WRITE_PIXEL( PB, px+col, py+row, fragZ, fogCoord ); + } + if (mask == 128U) { + src++; + mask = 1U; + } + else { + mask = mask << 1; + } + } + + PB_CHECK_FLUSH( ctx, PB ); + + /* get ready for next row */ + if (mask != 1) + src++; + } + else { + /* Msb first */ + GLubyte mask = 128U >> (unpack->SkipPixels & 0x7); + for (col=0; col<width; col++) { + if (*src & mask) { + PB_WRITE_PIXEL( PB, px+col, py+row, fragZ, fogCoord ); + } + if (mask == 1U) { + src++; + mask = 128U; + } + else { + mask = mask >> 1; + } + } + + PB_CHECK_FLUSH( ctx, PB ); + + /* get ready for next row */ + if (mask != 128) + src++; + } + } + + gl_flush_pb(ctx); +} + + + |