X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fswrast%2Fs_bitmap.c;h=5e7822cf3231576c662aa617048cc79654e1ae43;hb=88f3656ea7ae57d22141225db0c5d90ceab420dd;hp=abe5825d9d24228f50352cb0f8e056bea5f176f0;hpb=77df88727cb0a423dd5cb41498c2302d9df4fce7;p=mesa.git diff --git a/src/mesa/swrast/s_bitmap.c b/src/mesa/swrast/s_bitmap.c index abe5825d9d2..5e7822cf323 100644 --- a/src/mesa/swrast/s_bitmap.c +++ b/src/mesa/swrast/s_bitmap.c @@ -1,10 +1,8 @@ -/* $Id: s_bitmap.c,v 1.19 2002/08/07 00:45:07 brianp Exp $ */ - /* * Mesa 3-D graphics library - * Version: 4.1 + * Version: 7.1 * - * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. + * 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"), @@ -30,19 +28,21 @@ * \author Brian Paul */ -#include "glheader.h" -#include "image.h" -#include "macros.h" -#include "mmath.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_span.h" -/* +/** * Render a bitmap. + * Called via ctx->Driver.Bitmap() + * All parameter error checking will have been done before this is called. */ void _swrast_Bitmap( GLcontext *ctx, GLint px, GLint py, @@ -50,43 +50,29 @@ _swrast_Bitmap( GLcontext *ctx, GLint px, GLint py, const struct gl_pixelstore_attrib *unpack, const GLubyte *bitmap ) { - SWcontext *swrast = SWRAST_CONTEXT(ctx); GLint row, col; GLuint count = 0; - struct sw_span span; + SWspan span; ASSERT(ctx->RenderMode == GL_RENDER); - ASSERT(bitmap); - RENDER_START(swrast,ctx); + bitmap = _mesa_map_bitmap_pbo(ctx, unpack, bitmap); + if (!bitmap) + return; + + swrast_render_start(ctx); if (SWRAST_CONTEXT(ctx)->NewState) _swrast_validate_derived( ctx ); - INIT_SPAN(span, GL_BITMAP, width, 0, SPAN_XY); - - if (ctx->Visual.rgbMode) { - span.interpMask |= SPAN_RGBA; - span.red = FloatToFixed(ctx->Current.RasterColor[0] * CHAN_MAXF); - span.green = FloatToFixed(ctx->Current.RasterColor[1] * CHAN_MAXF); - span.blue = FloatToFixed(ctx->Current.RasterColor[2] * CHAN_MAXF); - span.alpha = FloatToFixed(ctx->Current.RasterColor[3] * CHAN_MAXF); - span.redStep = span.greenStep = span.blueStep = span.alphaStep = 0; - } - else { - span.interpMask |= SPAN_INDEX; - span.index = ChanToFixed(ctx->Current.RasterIndex); - span.indexStep = 0; - } + INIT_SPAN(span, GL_BITMAP); + span.end = width; + span.arrayMask = SPAN_XY; + _swrast_span_default_attribs(ctx, &span); - if (ctx->Depth.Test) - _mesa_span_default_z(ctx, &span); - if (ctx->Fog.Enabled) - _mesa_span_default_fog(ctx, &span); - - for (row = 0; row < height; row++, span.y++) { - const GLubyte *src = (const GLubyte *) _mesa_image_address( unpack, - bitmap, width, height, GL_COLOR_INDEX, GL_BITMAP, 0, row, 0 ); + for (row = 0; row < height; row++) { + const GLubyte *src = (const GLubyte *) _mesa_image_address2d(unpack, + bitmap, width, height, GL_COLOR_INDEX, GL_BITMAP, row, 0); if (unpack->LsbFirst) { /* Lsb first */ @@ -137,22 +123,24 @@ _swrast_Bitmap( GLcontext *ctx, GLint px, GLint py, /* flush the span */ span.end = count; if (ctx->Visual.rgbMode) - _mesa_write_rgba_span(ctx, &span); + _swrast_write_rgba_span(ctx, &span); else - _mesa_write_index_span(ctx, &span); + _swrast_write_index_span(ctx, &span); span.end = 0; count = 0; } } - RENDER_FINISH(swrast,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 fragmens to + * fragments, initializing the mask array to indicate which fragments to * draw or skip. */ void @@ -163,44 +151,29 @@ _swrast_Bitmap( GLcontext *ctx, GLint px, GLint py, { SWcontext *swrast = SWRAST_CONTEXT(ctx); GLint row, col; - struct sw_span span; + SWspan span; ASSERT(ctx->RenderMode == GL_RENDER); ASSERT(bitmap); - RENDER_START(swrast,ctx); + swrast_render_start(ctx); if (SWRAST_CONTEXT(ctx)->NewState) _swrast_validate_derived( ctx ); - INIT_SPAN(span, GL_BITMAP, width, 0, SPAN_MASK); + 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;*/ - if (ctx->Visual.rgbMode) { - span.interpMask |= SPAN_RGBA; - span.red = FloatToFixed(ctx->Current.RasterColor[0] * CHAN_MAXF); - span.green = FloatToFixed(ctx->Current.RasterColor[1] * CHAN_MAXF); - span.blue = FloatToFixed(ctx->Current.RasterColor[2] * CHAN_MAXF); - span.alpha = FloatToFixed(ctx->Current.RasterColor[3] * CHAN_MAXF); - span.redStep = span.greenStep = span.blueStep = span.alphaStep = 0; - } - else { - span.interpMask |= SPAN_INDEX; - span.index = ChanToFixed(ctx->Current.RasterIndex); - span.indexStep = 0; - } - - if (ctx->Depth.Test) - _mesa_span_default_z(ctx, &span); - if (ctx->Fog.Enabled) - _mesa_span_default_fog(ctx, &span); for (row=0; rowLsbFirst) { /* Lsb first */ @@ -217,9 +190,9 @@ _swrast_Bitmap( GLcontext *ctx, GLint px, GLint py, } if (ctx->Visual.rgbMode) - _mesa_write_rgba_span(ctx, &span); + _swrast_write_rgba_span(ctx, &span); else - _mesa_write_index_span(ctx, &span); + _swrast_write_index_span(ctx, &span); /* get ready for next row */ if (mask != 1) @@ -240,9 +213,9 @@ _swrast_Bitmap( GLcontext *ctx, GLint px, GLint py, } if (ctx->Visual.rgbMode) - _mesa_write_rgba_span(ctx, &span); + _swrast_write_rgba_span(ctx, &span); else - _mesa_write_index_span(ctx, &span); + _swrast_write_index_span(ctx, &span); /* get ready for next row */ if (mask != 128) @@ -250,6 +223,6 @@ _swrast_Bitmap( GLcontext *ctx, GLint px, GLint py, } } - RENDER_FINISH(swrast,ctx); + swrast_render_finish(ctx); } #endif