added dispatch override mechanism, used by trace extension
[mesa.git] / src / mesa / swrast / s_bitmap.c
1 /* $Id: s_bitmap.c,v 1.3 2000/11/16 21:05:41 keithw Exp $ */
2
3 /*
4 * Mesa 3-D graphics library
5 * Version: 3.3
6 *
7 * Copyright (C) 1999 Brian Paul All Rights Reserved.
8 *
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:
15 *
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
18 *
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.
25 */
26
27
28 #include "glheader.h"
29 #include "image.h"
30 #include "macros.h"
31 #include "pixel.h"
32
33 #include "s_context.h"
34 #include "s_fog.h"
35 #include "s_pb.h"
36
37
38
39 /*
40 * Render a bitmap.
41 */
42 void
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 )
47 {
48 struct pixel_buffer *PB = SWRAST_CONTEXT(ctx)->PB;
49 GLint row, col;
50 GLdepth fragZ;
51 GLfixed fogCoord;
52
53 ASSERT(ctx->RenderMode == GL_RENDER);
54 ASSERT(bitmap);
55
56 if (SWRAST_CONTEXT(ctx)->NewState)
57 _swrast_validate_derived( ctx );
58
59 /* Set bitmap drawing color */
60 if (ctx->Visual.RGBAflag) {
61 GLint r, g, b, a;
62 r = (GLint) (ctx->Current.RasterColor[0] * CHAN_MAXF);
63 g = (GLint) (ctx->Current.RasterColor[1] * CHAN_MAXF);
64 b = (GLint) (ctx->Current.RasterColor[2] * CHAN_MAXF);
65 a = (GLint) (ctx->Current.RasterColor[3] * CHAN_MAXF);
66 PB_SET_COLOR( PB, r, g, b, a );
67 }
68 else {
69 PB_SET_INDEX( PB, ctx->Current.RasterIndex );
70 }
71
72 fragZ = (GLdepth) ( ctx->Current.RasterPos[2] * ctx->Visual.DepthMaxF);
73
74 _mesa_win_fog_coords_from_z( ctx, 1, &fragZ, &fogCoord );
75
76 for (row=0; row<height; row++) {
77 const GLubyte *src = (const GLubyte *) _mesa_image_address( unpack,
78 bitmap, width, height, GL_COLOR_INDEX, GL_BITMAP, 0, row, 0 );
79
80 if (unpack->LsbFirst) {
81 /* Lsb first */
82 GLubyte mask = 1U << (unpack->SkipPixels & 0x7);
83 for (col=0; col<width; col++) {
84 if (*src & mask) {
85 PB_WRITE_PIXEL( PB, px+col, py+row, fragZ, fogCoord );
86 }
87 if (mask == 128U) {
88 src++;
89 mask = 1U;
90 }
91 else {
92 mask = mask << 1;
93 }
94 }
95
96 PB_CHECK_FLUSH( ctx, PB );
97
98 /* get ready for next row */
99 if (mask != 1)
100 src++;
101 }
102 else {
103 /* Msb first */
104 GLubyte mask = 128U >> (unpack->SkipPixels & 0x7);
105 for (col=0; col<width; col++) {
106 if (*src & mask) {
107 PB_WRITE_PIXEL( PB, px+col, py+row, fragZ, fogCoord );
108 }
109 if (mask == 1U) {
110 src++;
111 mask = 128U;
112 }
113 else {
114 mask = mask >> 1;
115 }
116 }
117
118 PB_CHECK_FLUSH( ctx, PB );
119
120 /* get ready for next row */
121 if (mask != 128)
122 src++;
123 }
124 }
125
126 gl_flush_pb(ctx);
127 }
128
129
130