-/* $Id: s_bitmap.c,v 1.15 2002/02/15 03:41:00 brianp Exp $ */
-
/*
* Mesa 3-D graphics library
- * Version: 4.1
+ * Version: 6.1
*
- * Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
+ * Copyright (C) 1999-2004 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"),
#include "glheader.h"
#include "image.h"
#include "macros.h"
-#include "mmath.h"
#include "pixel.h"
#include "s_context.h"
-#include "s_fog.h"
#include "s_span.h"
struct sw_span span;
ASSERT(ctx->RenderMode == GL_RENDER);
- ASSERT(bitmap);
+
+ bitmap = (const GLubyte *) _swrast_validate_pbo_access(unpack, width,
+ height, 1,
+ GL_COLOR_INDEX, GL_BITMAP,
+ (GLvoid *) bitmap);
+ if (!bitmap) {
+ /* XXX GL_INVALID_OPERATION? */
+ return;
+ }
RENDER_START(swrast,ctx);
if (SWRAST_CONTEXT(ctx)->NewState)
_swrast_validate_derived( ctx );
- INIT_SPAN(span);
- span.arrayMask |= SPAN_XY;
- span.end = width;
+ 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);
}
else {
span.interpMask |= SPAN_INDEX;
- span.index = ChanToFixed(ctx->Current.RasterIndex);
+ span.index = FloatToFixed(ctx->Current.RasterIndex);
span.indexStep = 0;
}
if (ctx->Depth.Test)
- _mesa_span_default_z(ctx, &span);
+ _swrast_span_default_z(ctx, &span);
if (ctx->Fog.Enabled)
- _mesa_span_default_fog(ctx, &span);
+ _swrast_span_default_fog(ctx, &span);
+ if (ctx->Texture._EnabledCoordUnits)
+ _swrast_span_default_texcoords(ctx, &span);
for (row = 0; row < height; row++, span.y++) {
const GLubyte *src = (const GLubyte *) _mesa_image_address( unpack,
GLubyte mask = 1U << (unpack->SkipPixels & 0x7);
for (col = 0; col < width; col++) {
if (*src & mask) {
- span.xArray[count] = px + col;
- span.yArray[count] = py + row;
+ span.array->x[count] = px + col;
+ span.array->y[count] = py + row;
count++;
}
if (mask == 128U) {
GLubyte mask = 128U >> (unpack->SkipPixels & 0x7);
for (col = 0; col < width; col++) {
if (*src & mask) {
- span.xArray[count] = px + col;
- span.yArray[count] = py + row;
+ span.array->x[count] = px + col;
+ span.array->y[count] = py + row;
count++;
}
if (mask == 1U) {
/* flush the span */
span.end = count;
if (ctx->Visual.rgbMode)
- _mesa_write_rgba_span(ctx, &span, GL_BITMAP);
+ _swrast_write_rgba_span(ctx, &span);
else
- _mesa_write_index_span(ctx, &span, GL_BITMAP);
+ _swrast_write_index_span(ctx, &span);
span.end = 0;
count = 0;
}
* 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,
if (SWRAST_CONTEXT(ctx)->NewState)
_swrast_validate_derived( ctx );
- INIT_SPAN(span);
- span.arrayMask |= SPAN_MASK; /* we'll init span.mask[] */
+ INIT_SPAN(span, GL_BITMAP, width, 0, SPAN_MASK);
+
+ /*span.arrayMask |= SPAN_MASK;*/ /* we'll init span.mask[] */
span.x = px;
span.y = py;
- span.end = width;
+ /*span.end = width;*/
if (ctx->Visual.rgbMode) {
span.interpMask |= SPAN_RGBA;
span.red = FloatToFixed(ctx->Current.RasterColor[0] * CHAN_MAXF);
}
else {
span.interpMask |= SPAN_INDEX;
- span.index = ChanToFixed(ctx->Current.RasterIndex);
+ span.index = FloatToFixed(ctx->Current.RasterIndex);
span.indexStep = 0;
}
if (ctx->Depth.Test)
- _mesa_span_default_z(ctx, &span);
+ _swrast_span_default_z(ctx, &span);
if (ctx->Fog.Enabled)
- _mesa_span_default_fog(ctx, &span);
+ _swrast_span_default_fog(ctx, &span);
+ if (ctx->Texture._EnabledCoordUnits)
+ _swrast_span_default_texcoords(ctx, &span);
for (row=0; row<height; row++, span.y++) {
const GLubyte *src = (const GLubyte *) _mesa_image_address( unpack,
/* Lsb first */
GLubyte mask = 1U << (unpack->SkipPixels & 0x7);
for (col=0; col<width; col++) {
- span.mask[col] = (*src & mask) ? GL_TRUE : GL_FALSE;
+ span.array->mask[col] = (*src & mask) ? GL_TRUE : GL_FALSE;
if (mask == 128U) {
src++;
mask = 1U;
}
if (ctx->Visual.rgbMode)
- _mesa_write_rgba_span(ctx, &span, GL_BITMAP);
+ _swrast_write_rgba_span(ctx, &span);
else
- _mesa_write_index_span(ctx, &span, GL_BITMAP);
+ _swrast_write_index_span(ctx, &span);
/* get ready for next row */
if (mask != 1)
/* Msb first */
GLubyte mask = 128U >> (unpack->SkipPixels & 0x7);
for (col=0; col<width; col++) {
- span.mask[col] = (*src & mask) ? GL_TRUE : GL_FALSE;
+ span.array->mask[col] = (*src & mask) ? GL_TRUE : GL_FALSE;
if (mask == 1U) {
src++;
mask = 128U;
}
if (ctx->Visual.rgbMode)
- _mesa_write_rgba_span(ctx, &span, GL_BITMAP);
+ _swrast_write_rgba_span(ctx, &span);
else
- _mesa_write_index_span(ctx, &span, GL_BITMAP);
+ _swrast_write_index_span(ctx, &span);
/* get ready for next row */
if (mask != 128)