|
|
@@ -1,4 +1,4 @@ |
|
|
|
/* $Id: s_bitmap.c,v 1.14 2002/02/02 17:24:11 brianp Exp $ */ |
|
|
|
/* $Id: s_bitmap.c,v 1.15 2002/02/15 03:41:00 brianp Exp $ */ |
|
|
|
|
|
|
|
/* |
|
|
|
* Mesa 3-D graphics library |
|
|
@@ -24,6 +24,11 @@ |
|
|
|
* 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" |
|
|
@@ -144,3 +149,109 @@ _swrast_Bitmap( GLcontext *ctx, GLint px, GLint py, |
|
|
|
|
|
|
|
RENDER_FINISH(swrast,ctx); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#if 0 |
|
|
|
/* |
|
|
|
* XXX this is another way to implement Bitmap. Use horizontal runs of |
|
|
|
* fragments, initializing the mask array to indicate which fragmens 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; |
|
|
|
struct sw_span span; |
|
|
|
|
|
|
|
ASSERT(ctx->RenderMode == GL_RENDER); |
|
|
|
ASSERT(bitmap); |
|
|
|
|
|
|
|
RENDER_START(swrast,ctx); |
|
|
|
|
|
|
|
if (SWRAST_CONTEXT(ctx)->NewState) |
|
|
|
_swrast_validate_derived( ctx ); |
|
|
|
|
|
|
|
INIT_SPAN(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; 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 ); |
|
|
|
|
|
|
|
if (unpack->LsbFirst) { |
|
|
|
/* Lsb first */ |
|
|
|
GLubyte mask = 1U << (unpack->SkipPixels & 0x7); |
|
|
|
for (col=0; col<width; col++) { |
|
|
|
span.mask[col] = (*src & mask) ? GL_TRUE : GL_FALSE; |
|
|
|
if (mask == 128U) { |
|
|
|
src++; |
|
|
|
mask = 1U; |
|
|
|
} |
|
|
|
else { |
|
|
|
mask = mask << 1; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (ctx->Visual.rgbMode) |
|
|
|
_mesa_write_rgba_span(ctx, &span, GL_BITMAP); |
|
|
|
else |
|
|
|
_mesa_write_index_span(ctx, &span, GL_BITMAP); |
|
|
|
|
|
|
|
/* get ready for next row */ |
|
|
|
if (mask != 1) |
|
|
|
src++; |
|
|
|
} |
|
|
|
else { |
|
|
|
/* Msb first */ |
|
|
|
GLubyte mask = 128U >> (unpack->SkipPixels & 0x7); |
|
|
|
for (col=0; col<width; col++) { |
|
|
|
span.mask[col] = (*src & mask) ? GL_TRUE : GL_FALSE; |
|
|
|
if (mask == 1U) { |
|
|
|
src++; |
|
|
|
mask = 128U; |
|
|
|
} |
|
|
|
else { |
|
|
|
mask = mask >> 1; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (ctx->Visual.rgbMode) |
|
|
|
_mesa_write_rgba_span(ctx, &span, GL_BITMAP); |
|
|
|
else |
|
|
|
_mesa_write_index_span(ctx, &span, GL_BITMAP); |
|
|
|
|
|
|
|
/* get ready for next row */ |
|
|
|
if (mask != 128) |
|
|
|
src++; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
RENDER_FINISH(swrast,ctx); |
|
|
|
} |
|
|
|
#endif |