Initial commit
[xorg_rtime.git] / xorg-server-1.4 / afb / afbbres.c
blobdae4746a096c8a4aa4c97b89fa28666c91a1fafd
1 /* Combined Purdue/PurduePlus patches, level 2.0, 1/17/89 */
2 /***********************************************************
4 Copyright (c) 1987 X Consortium
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
13 The above copyright notice and this permission notice shall be included in
14 all copies or substantial portions of the Software.
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
20 AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 Except as contained in this notice, the name of the X Consortium shall not be
24 used in advertising or otherwise to promote the sale, use or other dealings
25 in this Software without prior written authorization from the X Consortium.
28 Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
30 All Rights Reserved
32 Permission to use, copy, modify, and distribute this software and its
33 documentation for any purpose and without fee is hereby granted,
34 provided that the above copyright notice appear in all copies and that
35 both that copyright notice and this permission notice appear in
36 supporting documentation, and that the name of Digital not be
37 used in advertising or publicity pertaining to distribution of the
38 software without specific, written prior permission.
40 DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
41 ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
42 DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
43 ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
44 WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
45 ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
46 SOFTWARE.
48 ******************************************************************/
50 #ifdef HAVE_DIX_CONFIG_H
51 #include <dix-config.h>
52 #endif
54 #include <X11/X.h>
55 #include "misc.h"
56 #include "afb.h"
57 #include "maskbits.h"
58 #include "miline.h"
60 /* Solid bresenham line */
61 /* NOTES
62 e2 is used less often than e1, so it's not in a register
65 void
66 afbBresS(addrlbase, nlwidth, sizeDst, depthDst, signdx, signdy, axis, x1, y1,
67 e, e1, e2, len, rrops)
68 PixelType *addrlbase; /* pointer to base of bitmap */
69 int nlwidth; /* width in longwords of bitmap */
70 int sizeDst;
71 int depthDst;
72 int signdx, signdy; /* signs of directions */
73 int axis; /* major axis (Y_AXIS or X_AXIS) */
74 int x1, y1; /* initial point */
75 register int e; /* error accumulator */
76 register int e1; /* bresenham increments */
77 int e2;
78 int len; /* length of line */
79 unsigned char *rrops;
81 register int yinc; /* increment to next scanline, in bytes */
82 register PixelType *addrl; /* bitmask long pointer */
83 register PixelType bit; /* current bit being set/cleared/etc. */
84 PixelType leftbit = mfbGetmask(0); /* leftmost bit to process in new word */
85 PixelType rightbit = mfbGetmask(PPW-1); /* rightmost bit to process in new word */
87 register int e3 = e2-e1;
88 PixelType tmp;
89 int saveE;
90 int saveLen;
91 int d;
93 /* point to longword containing first point */
94 yinc = signdy * nlwidth;
95 e = e-e1; /* to make looping easier */
97 if (!len)
98 return;
100 saveLen = len;
101 saveE = e;
103 for (d = 0; d < depthDst; d++) {
104 addrl = afbScanline(addrlbase, x1, y1, nlwidth);
105 addrlbase += sizeDst; /* @@@ NEXT PLANE @@@ */
106 len = saveLen;
107 e = saveE;
108 bit = mfbGetmask(x1 & PIM);
110 switch (rrops[d]) {
111 case RROP_BLACK:
112 if (axis == X_AXIS) {
113 if (signdx > 0) {
114 tmp = *addrl;
115 for (;;) {
116 tmp &= ~bit;
117 if (!--len)
118 break;
119 bit = SCRRIGHT(bit,1);
120 e += e1;
121 if (e >= 0) {
122 *addrl = tmp;
123 afbScanlineInc(addrl, yinc);
124 e += e3;
125 if (!bit) {
126 bit = leftbit;
127 addrl ++;
129 tmp = *addrl;
130 } else if (!bit) {
131 *addrl = tmp;
132 bit = leftbit;
133 addrl ++;
134 tmp = *addrl;
137 *addrl = tmp;
138 } else {
139 tmp = *addrl;
140 for (;;) {
141 tmp &= ~bit;
142 if (!--len)
143 break;
144 e += e1;
145 bit = SCRLEFT(bit,1);
146 if (e >= 0) {
147 *addrl = tmp;
148 afbScanlineInc(addrl, yinc);
149 e += e3;
150 if (!bit) {
151 bit = rightbit;
152 addrl --;
154 tmp = *addrl;
155 } else if (!bit) {
156 *addrl = tmp;
157 bit = rightbit;
158 addrl --;
159 tmp = *addrl;
162 *addrl = tmp;
164 } /* if X_AXIS */ else {
165 if (signdx > 0) {
166 while(len--) {
167 *addrl &= ~bit;
168 e += e1;
169 if (e >= 0) {
170 bit = SCRRIGHT(bit,1);
171 if (!bit) { bit = leftbit;addrl ++; }
172 e += e3;
174 afbScanlineInc(addrl, yinc);
176 } else {
177 while(len--) {
178 *addrl &= ~bit;
179 e += e1;
180 if (e >= 0) {
181 bit = SCRLEFT(bit,1);
182 if (!bit) { bit = rightbit;addrl --; }
183 e += e3;
185 afbScanlineInc(addrl, yinc);
188 } /* else Y_AXIS */
189 break;
191 case RROP_WHITE:
192 if (axis == X_AXIS) {
193 if (signdx > 0) {
194 tmp = *addrl;
195 for (;;) {
196 tmp |= bit;
197 if (!--len)
198 break;
199 e += e1;
200 bit = SCRRIGHT(bit,1);
201 if (e >= 0) {
202 *addrl = tmp;
203 afbScanlineInc(addrl, yinc);
204 e += e3;
205 if (!bit) {
206 bit = leftbit;
207 addrl ++;
209 tmp = *addrl;
210 } else if (!bit) {
211 *addrl = tmp;
212 bit = leftbit;
213 addrl ++;
214 tmp = *addrl;
217 *addrl = tmp;
218 } else {
219 tmp = *addrl;
220 for (;;) {
221 tmp |= bit;
222 if (!--len)
223 break;
224 e += e1;
225 bit = SCRLEFT(bit,1);
226 if (e >= 0) {
227 *addrl = tmp;
228 afbScanlineInc(addrl, yinc);
229 e += e3;
230 if (!bit) {
231 bit = rightbit;
232 addrl --;
234 tmp = *addrl;
235 } else if (!bit) {
236 *addrl = tmp;
237 bit = rightbit;
238 addrl --;
239 tmp = *addrl;
242 *addrl = tmp;
244 } /* if X_AXIS */ else {
245 if (signdx > 0) {
246 while(len--) {
247 *addrl |= bit;
248 e += e1;
249 if (e >= 0) {
250 bit = SCRRIGHT(bit,1);
251 if (!bit) { bit = leftbit;addrl ++; }
252 e += e3;
254 afbScanlineInc(addrl, yinc);
256 } else {
257 while(len--) {
258 *addrl |= bit;
259 e += e1;
260 if (e >= 0) {
261 bit = SCRLEFT(bit,1);
262 if (!bit) { bit = rightbit;addrl --; }
263 e += e3;
265 afbScanlineInc(addrl, yinc);
268 } /* else Y_AXIS */
269 break;
271 case RROP_INVERT:
272 if (axis == X_AXIS) {
273 if (signdx > 0) {
274 while(len--) {
275 *addrl ^= bit;
276 e += e1;
277 if (e >= 0) {
278 afbScanlineInc(addrl, yinc);
279 e += e3;
281 bit = SCRRIGHT(bit,1);
282 if (!bit) { bit = leftbit;addrl ++; }
284 } else {
285 while(len--) {
286 *addrl ^= bit;
287 e += e1;
288 if (e >= 0) {
289 afbScanlineInc(addrl, yinc);
290 e += e3;
292 bit = SCRLEFT(bit,1);
293 if (!bit) { bit = rightbit;addrl --; }
296 } /* if X_AXIS */ else {
297 if (signdx > 0) {
298 while(len--) {
299 *addrl ^= bit;
300 e += e1;
301 if (e >= 0) {
302 bit = SCRRIGHT(bit,1);
303 if (!bit) { bit = leftbit;addrl ++; }
304 e += e3;
306 afbScanlineInc(addrl, yinc);
308 } else {
309 while(len--) {
310 *addrl ^= bit;
311 e += e1;
312 if (e >= 0) {
313 bit = SCRLEFT(bit,1);
314 if (!bit) { bit = rightbit; addrl --; }
315 e += e3;
317 afbScanlineInc(addrl, yinc);
320 } /* else Y_AXIS */
321 } /* switch */
322 } /* for (d = ... ) */