s_bitmap.c revision b6bcae5698df88f7730d40004ce7ce0462e97a20
1/* $Id: s_bitmap.c,v 1.4 2001/01/23 23:39:37 brianp Exp $ */ 2 3/* 4 * Mesa 3-D graphics library 5 * Version: 3.5 6 * 7 * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. 8 * 9 * Permission is hereby granted, free of charge, to any person obtaining a 10 * copy of this software and associated documentation files (the "Software"), 11 * to deal in the Software without restriction, including without limitation 12 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 13 * and/or sell copies of the Software, and to permit persons to whom the 14 * Software is furnished to do so, subject to the following conditions: 15 * 16 * The above copyright notice and this permission notice shall be included 17 * in all copies or substantial portions of the Software. 18 * 19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 22 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 23 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 24 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 */ 26 27 28#include "glheader.h" 29#include "image.h" 30#include "macros.h" 31#include "pixel.h" 32 33#include "s_context.h" 34#include "s_fog.h" 35#include "s_pb.h" 36 37 38 39/* 40 * Render a bitmap. 41 */ 42void 43_swrast_Bitmap( GLcontext *ctx, GLint px, GLint py, 44 GLsizei width, GLsizei height, 45 const struct gl_pixelstore_attrib *unpack, 46 const GLubyte *bitmap ) 47{ 48 struct pixel_buffer *PB = SWRAST_CONTEXT(ctx)->PB; 49 GLint row, col; 50 GLdepth fragZ; 51 GLfixed fogCoord; 52 53 ASSERT(ctx->RenderMode == GL_RENDER); 54 ASSERT(bitmap); 55 56 if (SWRAST_CONTEXT(ctx)->NewState) 57 _swrast_validate_derived( ctx ); 58 59 /* Set bitmap drawing color */ 60 if (ctx->Visual.rgbMode) { 61 GLint r, g, b, a; 62 r = (GLint) (ctx->Current.RasterColor[0] * CHAN_MAXF); 63 g = (GLint) (ctx->Current.RasterColor[1] * CHAN_MAXF); 64 b = (GLint) (ctx->Current.RasterColor[2] * CHAN_MAXF); 65 a = (GLint) (ctx->Current.RasterColor[3] * CHAN_MAXF); 66 PB_SET_COLOR( PB, r, g, b, a ); 67 } 68 else { 69 PB_SET_INDEX( PB, ctx->Current.RasterIndex ); 70 } 71 72 fragZ = (GLdepth) ( ctx->Current.RasterPos[2] * ctx->DepthMaxF); 73 74 _mesa_win_fog_coords_from_z( ctx, 1, &fragZ, &fogCoord ); 75 76 for (row=0; row<height; row++) { 77 const GLubyte *src = (const GLubyte *) _mesa_image_address( unpack, 78 bitmap, width, height, GL_COLOR_INDEX, GL_BITMAP, 0, row, 0 ); 79 80 if (unpack->LsbFirst) { 81 /* Lsb first */ 82 GLubyte mask = 1U << (unpack->SkipPixels & 0x7); 83 for (col=0; col<width; col++) { 84 if (*src & mask) { 85 PB_WRITE_PIXEL( PB, px+col, py+row, fragZ, fogCoord ); 86 } 87 if (mask == 128U) { 88 src++; 89 mask = 1U; 90 } 91 else { 92 mask = mask << 1; 93 } 94 } 95 96 PB_CHECK_FLUSH( ctx, PB ); 97 98 /* get ready for next row */ 99 if (mask != 1) 100 src++; 101 } 102 else { 103 /* Msb first */ 104 GLubyte mask = 128U >> (unpack->SkipPixels & 0x7); 105 for (col=0; col<width; col++) { 106 if (*src & mask) { 107 PB_WRITE_PIXEL( PB, px+col, py+row, fragZ, fogCoord ); 108 } 109 if (mask == 1U) { 110 src++; 111 mask = 128U; 112 } 113 else { 114 mask = mask >> 1; 115 } 116 } 117 118 PB_CHECK_FLUSH( ctx, PB ); 119 120 /* get ready for next row */ 121 if (mask != 128) 122 src++; 123 } 124 } 125 126 gl_flush_pb(ctx); 127} 128 129 130 131