1 /* $Id: s_bitmap.c,v 1.13 2001/12/14 02:50:57 brianp Exp $ */
4 * Mesa 3-D graphics library
7 * Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
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:
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
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.
33 #include "s_context.h"
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
)
48 SWcontext
*swrast
= SWRAST_CONTEXT(ctx
);
49 struct pixel_buffer
*PB
= swrast
->PB
;
54 ASSERT(ctx
->RenderMode
== GL_RENDER
);
57 RENDER_START(swrast
,ctx
);
59 if (SWRAST_CONTEXT(ctx
)->NewState
)
60 _swrast_validate_derived( ctx
);
62 /* Set bitmap drawing color */
63 if (ctx
->Visual
.rgbMode
) {
65 r
= (GLint
) (ctx
->Current
.RasterColor
[0] * CHAN_MAXF
);
66 g
= (GLint
) (ctx
->Current
.RasterColor
[1] * CHAN_MAXF
);
67 b
= (GLint
) (ctx
->Current
.RasterColor
[2] * CHAN_MAXF
);
68 a
= (GLint
) (ctx
->Current
.RasterColor
[3] * CHAN_MAXF
);
69 PB_SET_COLOR( PB
, r
, g
, b
, a
);
72 PB_SET_INDEX( PB
, ctx
->Current
.RasterIndex
);
75 fragZ
= (GLdepth
) ( ctx
->Current
.RasterPos
[2] * ctx
->DepthMaxF
);
77 if (ctx
->Fog
.Enabled
) {
78 if (ctx
->Fog
.FogCoordinateSource
== GL_FOG_COORDINATE_EXT
)
79 fog
= _mesa_z_to_fogfactor(ctx
, ctx
->Current
.Attrib
[VERT_ATTRIB_FOG
][0]);
81 fog
= _mesa_z_to_fogfactor(ctx
, ctx
->Current
.RasterDistance
);
87 for (row
=0; row
<height
; row
++) {
88 const GLubyte
*src
= (const GLubyte
*) _mesa_image_address( unpack
,
89 bitmap
, width
, height
, GL_COLOR_INDEX
, GL_BITMAP
, 0, row
, 0 );
91 if (unpack
->LsbFirst
) {
93 GLubyte mask
= 1U << (unpack
->SkipPixels
& 0x7);
94 for (col
=0; col
<width
; col
++) {
96 PB_WRITE_PIXEL( PB
, px
+col
, py
+row
, fragZ
, fog
);
107 PB_CHECK_FLUSH( ctx
, PB
);
109 /* get ready for next row */
115 GLubyte mask
= 128U >> (unpack
->SkipPixels
& 0x7);
116 for (col
=0; col
<width
; col
++) {
118 PB_WRITE_PIXEL( PB
, px
+col
, py
+row
, fragZ
, fog
);
129 PB_CHECK_FLUSH( ctx
, PB
);
131 /* get ready for next row */
139 RENDER_FINISH(swrast
,ctx
);