First import
[xorg_rtime.git] / xorg-server-1.4 / mfb / mfbbres.c
blobee2f10f339a43b363a9612de62266a0c7977ccce
1 /* Combined Purdue/PurduePlus patches, level 2.0, 1/17/89 */
2 /***********************************************************
4 Copyright 1987, 1998 The Open Group
6 Permission to use, copy, modify, distribute, and sell this software and its
7 documentation for any purpose is hereby granted without fee, provided that
8 the above copyright notice appear in all copies and that both that
9 copyright notice and this permission notice appear in supporting
10 documentation.
12 The above copyright notice and this permission notice shall be included in
13 all copies or substantial portions of the Software.
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
19 AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22 Except as contained in this notice, the name of The Open Group shall not be
23 used in advertising or otherwise to promote the sale, use or other dealings
24 in this Software without prior written authorization from The Open Group.
27 Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
29 All Rights Reserved
31 Permission to use, copy, modify, and distribute this software and its
32 documentation for any purpose and without fee is hereby granted,
33 provided that the above copyright notice appear in all copies and that
34 both that copyright notice and this permission notice appear in
35 supporting documentation, and that the name of Digital not be
36 used in advertising or publicity pertaining to distribution of the
37 software without specific, written prior permission.
39 DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
40 ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
41 DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
42 ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
43 WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
44 ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
45 SOFTWARE.
47 ******************************************************************/
48 #ifdef HAVE_DIX_CONFIG_H
49 #include <dix-config.h>
50 #endif
52 #include <X11/X.h>
53 #include "misc.h"
54 #include "mfb.h"
55 #include "maskbits.h"
56 #include "miline.h"
58 /* Solid bresenham line */
59 /* NOTES
60 e2 is used less often than e1, so it's not in a register
63 void
64 mfbBresS(rop, addrlbase, nlwidth, signdx, signdy, axis, x1, y1, e, e1, e2, len)
65 int rop; /* a reduced rasterop */
66 PixelType *addrlbase; /* pointer to base of bitmap */
67 int nlwidth; /* width in longwords of bitmap */
68 int signdx, signdy; /* signs of directions */
69 int axis; /* major axis (Y_AXIS or X_AXIS) */
70 int x1, y1; /* initial point */
71 register int e; /* error accumulator */
72 register int e1; /* bresenham increments */
73 int e2;
74 int len; /* length of line */
76 register int yinc; /* increment to next scanline, in bytes */
77 register PixelType *addrl; /* bitmask 32-bit pointer */
78 register PixelType bit; /* current bit being set/cleared/etc. */
79 PixelType leftbit = mask[0]; /* leftmost bit to process in new word */
80 PixelType rightbit = mask[PPW-1]; /* rightmost bit to process in new word */
82 register int e3 = e2-e1;
83 PixelType tmp;
85 /* point to longword containing first point */
86 addrl = mfbScanline(addrlbase, x1, y1, nlwidth);
87 yinc = signdy * nlwidth;
88 e = e-e1; /* to make looping easier */
89 bit = mask[x1 & PIM];
91 if (!len)
92 return;
93 if (rop == RROP_BLACK)
95 if (axis == X_AXIS)
97 if (signdx > 0)
99 tmp = *addrl;
100 for (;;)
102 tmp &= ~bit;
103 if (!--len)
104 break;
105 bit = SCRRIGHT(bit,1);
106 e += e1;
107 if (e >= 0)
109 *addrl = tmp;
110 mfbScanlineInc(addrl, yinc);
111 e += e3;
112 if (!bit)
114 bit = leftbit;
115 addrl ++;
117 tmp = *addrl;
119 else if (!bit)
121 *addrl = tmp;
122 bit = leftbit;
123 addrl ++;
124 tmp = *addrl;
127 *addrl = tmp;
129 else
131 tmp = *addrl;
132 for (;;)
134 tmp &= ~bit;
135 if (!--len)
136 break;
137 e += e1;
138 bit = SCRLEFT(bit,1);
139 if (e >= 0)
141 *addrl = tmp;
142 mfbScanlineInc(addrl, yinc);
143 e += e3;
144 if (!bit)
146 bit = rightbit;
147 addrl --;
149 tmp = *addrl;
151 else if (!bit)
153 *addrl = tmp;
154 bit = rightbit;
155 addrl --;
156 tmp = *addrl;
159 *addrl = tmp;
161 } /* if X_AXIS */
162 else
164 if (signdx > 0)
166 while(len--)
168 *addrl &= ~bit;
169 e += e1;
170 if (e >= 0)
172 bit = SCRRIGHT(bit,1);
173 if (!bit) { bit = leftbit;addrl ++; }
174 e += e3;
176 mfbScanlineInc(addrl, yinc);
179 else
181 while(len--)
183 *addrl &= ~bit;
184 e += e1;
185 if (e >= 0)
187 bit = SCRLEFT(bit,1);
188 if (!bit) { bit = rightbit;addrl --; }
189 e += e3;
191 mfbScanlineInc(addrl, yinc);
194 } /* else Y_AXIS */
196 else if (rop == RROP_WHITE)
198 if (axis == X_AXIS)
200 if (signdx > 0)
202 tmp = *addrl;
203 for (;;)
205 tmp |= bit;
206 if (!--len)
207 break;
208 e += e1;
209 bit = SCRRIGHT(bit,1);
210 if (e >= 0)
212 *addrl = tmp;
213 mfbScanlineInc(addrl, yinc);
214 e += e3;
215 if (!bit)
217 bit = leftbit;
218 addrl ++;
220 tmp = *addrl;
222 else if (!bit)
224 *addrl = tmp;
225 bit = leftbit;
226 addrl ++;
227 tmp = *addrl;
230 *addrl = tmp;
232 else
234 tmp = *addrl;
235 for (;;)
237 tmp |= bit;
238 if (!--len)
239 break;
240 e += e1;
241 bit = SCRLEFT(bit,1);
242 if (e >= 0)
244 *addrl = tmp;
245 mfbScanlineInc(addrl, yinc);
246 e += e3;
247 if (!bit)
249 bit = rightbit;
250 addrl --;
252 tmp = *addrl;
254 else if (!bit)
256 *addrl = tmp;
257 bit = rightbit;
258 addrl --;
259 tmp = *addrl;
262 *addrl = tmp;
264 } /* if X_AXIS */
265 else
267 if (signdx > 0)
269 while(len--)
271 *addrl |= bit;
272 e += e1;
273 if (e >= 0)
275 bit = SCRRIGHT(bit,1);
276 if (!bit) { bit = leftbit;addrl ++; }
277 e += e3;
279 mfbScanlineInc(addrl, yinc);
282 else
284 while(len--)
286 *addrl |= bit;
287 e += e1;
288 if (e >= 0)
290 bit = SCRLEFT(bit,1);
291 if (!bit) { bit = rightbit;addrl --; }
292 e += e3;
294 mfbScanlineInc(addrl, yinc);
297 } /* else Y_AXIS */
299 else if (rop == RROP_INVERT)
301 if (axis == X_AXIS)
303 if (signdx > 0)
305 while(len--)
307 *addrl ^= bit;
308 e += e1;
309 if (e >= 0)
311 mfbScanlineInc(addrl, yinc);
312 e += e3;
314 bit = SCRRIGHT(bit,1);
315 if (!bit) { bit = leftbit;addrl ++; }
318 else
320 while(len--)
322 *addrl ^= bit;
323 e += e1;
324 if (e >= 0)
326 mfbScanlineInc(addrl, yinc);
327 e += e3;
329 bit = SCRLEFT(bit,1);
330 if (!bit) { bit = rightbit;addrl --; }
333 } /* if X_AXIS */
334 else
336 if (signdx > 0)
338 while(len--)
340 *addrl ^= bit;
341 e += e1;
342 if (e >= 0)
344 bit = SCRRIGHT(bit,1);
345 if (!bit) { bit = leftbit;addrl ++; }
346 e += e3;
348 mfbScanlineInc(addrl, yinc);
351 else
353 while(len--)
355 *addrl ^= bit;
356 e += e1;
357 if (e >= 0)
359 bit = SCRLEFT(bit,1);
360 if (!bit) { bit = rightbit; addrl --; }
361 e += e3;
363 mfbScanlineInc(addrl, yinc);
366 } /* else Y_AXIS */