X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fswrast%2Fs_bitmap.c;h=5e7822cf3231576c662aa617048cc79654e1ae43;hb=88f3656ea7ae57d22141225db0c5d90ceab420dd;hp=c5f4127c2e28ca7bdf0908b7722d49273794b727;hpb=23caf20169ac38436ee9c13914f1d6aa7cf6bb5e;p=mesa.git diff --git a/src/mesa/swrast/s_bitmap.c b/src/mesa/swrast/s_bitmap.c index c5f4127c2e2..5e7822cf323 100644 --- a/src/mesa/swrast/s_bitmap.c +++ b/src/mesa/swrast/s_bitmap.c @@ -1,21 +1,19 @@ -/* $Id: s_bitmap.c,v 1.3 2000/11/16 21:05:41 keithw Exp $ */ - /* * Mesa 3-D graphics library - * Version: 3.3 - * - * Copyright (C) 1999 Brian Paul All Rights Reserved. - * + * Version: 7.1 + * + * Copyright (C) 1999-2008 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 @@ -24,65 +22,66 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/** + * \file swrast/s_bitmap.c + * \brief glBitmap rendering. + * \author Brian Paul + */ -#include "glheader.h" -#include "image.h" -#include "macros.h" -#include "pixel.h" +#include "main/glheader.h" +#include "main/bufferobj.h" +#include "main/image.h" +#include "main/macros.h" +#include "main/pixel.h" #include "s_context.h" -#include "s_fog.h" -#include "s_pb.h" +#include "s_span.h" -/* +/** * Render a bitmap. + * Called via ctx->Driver.Bitmap() + * All parameter error checking will have been done before this is called. */ -void +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 = SWRAST_CONTEXT(ctx)->PB; GLint row, col; - GLdepth fragZ; - GLfixed fogCoord; + GLuint count = 0; + SWspan span; ASSERT(ctx->RenderMode == GL_RENDER); - ASSERT(bitmap); + + bitmap = _mesa_map_bitmap_pbo(ctx, unpack, bitmap); + if (!bitmap) + return; + + swrast_render_start(ctx); if (SWRAST_CONTEXT(ctx)->NewState) _swrast_validate_derived( ctx ); - /* 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 ); - } + INIT_SPAN(span, GL_BITMAP); + span.end = width; + span.arrayMask = SPAN_XY; + _swrast_span_default_attribs(ctx, &span); - fragZ = (GLdepth) ( ctx->Current.RasterPos[2] * ctx->Visual.DepthMaxF); - - _mesa_win_fog_coords_from_z( ctx, 1, &fragZ, &fogCoord ); - - for (row=0; rowLsbFirst) { /* Lsb first */ GLubyte mask = 1U << (unpack->SkipPixels & 0x7); - for (col=0; colx[count] = px + col; + span.array->y[count] = py + row; + count++; } if (mask == 128U) { src++; @@ -93,8 +92,6 @@ _swrast_Bitmap( GLcontext *ctx, GLint px, GLint py, } } - PB_CHECK_FLUSH( ctx, PB ); - /* get ready for next row */ if (mask != 1) src++; @@ -102,9 +99,11 @@ _swrast_Bitmap( GLcontext *ctx, GLint px, GLint py, else { /* Msb first */ GLubyte mask = 128U >> (unpack->SkipPixels & 0x7); - for (col=0; colx[count] = px + col; + span.array->y[count] = py + row; + count++; } if (mask == 1U) { src++; @@ -115,16 +114,115 @@ _swrast_Bitmap( GLcontext *ctx, GLint px, GLint py, } } - PB_CHECK_FLUSH( ctx, PB ); - /* get ready for next row */ if (mask != 128) src++; } + + if (count + width >= MAX_WIDTH || row + 1 == height) { + /* flush the span */ + span.end = count; + if (ctx->Visual.rgbMode) + _swrast_write_rgba_span(ctx, &span); + else + _swrast_write_index_span(ctx, &span); + span.end = 0; + count = 0; + } } - gl_flush_pb(ctx); + swrast_render_finish(ctx); + + _mesa_unmap_bitmap_pbo(ctx, unpack); } +#if 0 +/* + * XXX this is another way to implement Bitmap. Use horizontal runs of + * fragments, initializing the mask array to indicate which fragments to + * draw or skip. + */ +void +_swrast_Bitmap( GLcontext *ctx, GLint px, GLint py, + GLsizei width, GLsizei height, + const struct gl_pixelstore_attrib *unpack, + const GLubyte *bitmap ) +{ + SWcontext *swrast = SWRAST_CONTEXT(ctx); + GLint row, col; + SWspan span; + + ASSERT(ctx->RenderMode == GL_RENDER); + ASSERT(bitmap); + + swrast_render_start(ctx); + if (SWRAST_CONTEXT(ctx)->NewState) + _swrast_validate_derived( ctx ); + + INIT_SPAN(span, GL_BITMAP); + span.end = width; + span.arrayMask = SPAN_MASK; + _swrast_span_default_attribs(ctx, &span); + + /*span.arrayMask |= SPAN_MASK;*/ /* we'll init span.mask[] */ + span.x = px; + span.y = py; + /*span.end = width;*/ + + for (row=0; rowLsbFirst) { + /* Lsb first */ + GLubyte mask = 1U << (unpack->SkipPixels & 0x7); + for (col=0; colmask[col] = (*src & mask) ? GL_TRUE : GL_FALSE; + if (mask == 128U) { + src++; + mask = 1U; + } + else { + mask = mask << 1; + } + } + + if (ctx->Visual.rgbMode) + _swrast_write_rgba_span(ctx, &span); + else + _swrast_write_index_span(ctx, &span); + + /* get ready for next row */ + if (mask != 1) + src++; + } + else { + /* Msb first */ + GLubyte mask = 128U >> (unpack->SkipPixels & 0x7); + for (col=0; colmask[col] = (*src & mask) ? GL_TRUE : GL_FALSE; + if (mask == 1U) { + src++; + mask = 128U; + } + else { + mask = mask >> 1; + } + } + + if (ctx->Visual.rgbMode) + _swrast_write_rgba_span(ctx, &span); + else + _swrast_write_index_span(ctx, &span); + + /* get ready for next row */ + if (mask != 128) + src++; + } + } + + swrast_render_finish(ctx); +} +#endif