|
|
1.1 root 1: /***********************************************************
2: Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
3: and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
4:
5: All Rights Reserved
6:
7: Permission to use, copy, modify, and distribute this software and its
8: documentation for any purpose and without fee is hereby granted,
9: provided that the above copyright notice appear in all copies and that
10: both that copyright notice and this permission notice appear in
11: supporting documentation, and that the names of Digital or MIT not be
12: used in advertising or publicity pertaining to distribution of the
13: software without specific, written prior permission.
14:
15: DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
16: ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
17: DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
18: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
19: WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
20: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
21: SOFTWARE.
22:
23: ******************************************************************/
24: /* $Header: mfbpntarea.c,v 1.5 87/09/11 07:48:36 toddb Exp $ */
25: #include "X.h"
26:
27: #include "windowstr.h"
28: #include "regionstr.h"
29: #include "pixmapstr.h"
30: #include "scrnintstr.h"
31:
32: #include "mfb.h"
33: #include "maskbits.h"
34:
35: /*
36: the solid fillers are called for rectangles and window backgrounds.
37: the boxes are already translated.
38: maybe this should always take a pixmap instead of a drawable?
39:
40: NOTE:
41: iy = ++iy < tileHeight ? iy : 0
42: is equivalent to iy%= tileheight, and saves a division.
43: */
44:
45: /*
46: MFBSOLIDFILLAREA OPEQ EQWHOLEOWRD
47: mfbSolidWhiteArea |= = ~0
48: mfbSolidBlackArea &=~ = 0
49: mfbSolidInvertArea ^= ^= ~0
50:
51: EQWHOLEWORD is used to write whole longwords. it could use OPEQ,
52: but *p++ |= ~0 on at least two compilers generates much
53: worse code than *p++ = ~0. similarly for *p++ &= ~~0
54: and *p++ = 0.
55:
56: */
57:
58: void
59: MFBSOLIDFILLAREA(pDraw, nbox, pbox, alu, nop)
60: DrawablePtr pDraw;
61: int nbox;
62: BoxPtr pbox;
63: int alu;
64: PixmapPtr nop;
65: {
66: int nlwidth; /* width in longwords of the drawable */
67: int w; /* width of current box */
68: register int h; /* height of current box */
69: register int startmask;
70: int endmask; /* masks for reggedy bits at either end of line */
71: int nlwMiddle; /* number of longwords between sides of boxes */
72: register int nlwExtra;
73: /* to get from right of box to left of next span */
74: register int nlw; /* loop version of nlwMiddle */
75: register unsigned int *p; /* pointer to bits we're writing */
76: unsigned int *pbits; /* pointer to start of drawable */
77:
78: if (pDraw->type == DRAWABLE_WINDOW)
79: {
80: pbits = (unsigned int *)
81: (((PixmapPtr)(pDraw->pScreen->devPrivate))->devPrivate);
82: nlwidth = (int)
83: (((PixmapPtr)(pDraw->pScreen->devPrivate))->devKind) >> 2;
84: }
85: else
86: {
87: pbits = (unsigned int *)(((PixmapPtr)pDraw)->devPrivate);
88: nlwidth = (int)(((PixmapPtr)pDraw)->devKind) >> 2;
89: }
90:
91:
92: while (nbox--)
93: {
94: w = pbox->x2 - pbox->x1;
95: h = pbox->y2 - pbox->y1;
96: p = pbits + (pbox->y1 * nlwidth) + (pbox->x1 >> 5);
97:
98: if ( ((pbox->x1 & 0x1f) + w) < 32)
99: {
100: maskpartialbits(pbox->x1, w, startmask);
101: nlwExtra = nlwidth;
102: while (h--)
103: {
104: *p OPEQ startmask;
105: p += nlwExtra;
106: }
107: }
108: else
109: {
110: maskbits(pbox->x1, w, startmask, endmask, nlwMiddle);
111: nlwExtra = nlwidth - nlwMiddle;
112:
113: if (startmask && endmask)
114: {
115: nlwExtra -= 1;
116: while (h--)
117: {
118: nlw = nlwMiddle;
119: *p OPEQ startmask;
120: p++;
121: while (nlw--)
122: *p++ EQWHOLEWORD;
123: *p OPEQ endmask;
124: p += nlwExtra;
125: }
126: }
127: else if (startmask && !endmask)
128: {
129: nlwExtra -= 1;
130: while (h--)
131: {
132: nlw = nlwMiddle;
133: *p OPEQ startmask;
134: p++;
135: while (nlw--)
136: *p++ EQWHOLEWORD;
137: p += nlwExtra;
138: }
139: }
140: else if (!startmask && endmask)
141: {
142: while (h--)
143: {
144: nlw = nlwMiddle;
145: while (nlw--)
146: *p++ EQWHOLEWORD;
147: *p OPEQ endmask;
148: p += nlwExtra;
149: }
150: }
151: else /* no ragged bits at either end */
152: {
153: while (h--)
154: {
155: nlw = nlwMiddle;
156: while (nlw--)
157: *p++ EQWHOLEWORD;
158: p += nlwExtra;
159: }
160: }
161: }
162: pbox++;
163: }
164: }
165:
166:
167:
168: /* stipple a list of boxes
169:
170: you can use the reduced rasterop for stipples. if rrop is
171: black, AND the destination with (not stipple pattern). if rrop is
172: white OR the destination with the stipple pattern. if rrop is invert,
173: XOR the destination with the stipple pattern.
174:
175: MFBSTIPPLEFILLAREA OPEQ
176: mfbStippleWhiteArea |=
177: mfbStippleBlackArea &=~
178: mfbStippleInveryArea ^=
179: */
180:
181: void
182: MFBSTIPPLEFILLAREA(pDraw, nbox, pbox, alu, pstipple)
183: DrawablePtr pDraw;
184: int nbox;
185: BoxPtr pbox;
186: int alu;
187: PixmapPtr pstipple;
188: {
189: register unsigned int *psrc;
190: /* pointer to bits in tile, if needed */
191: int tileHeight; /* height of the tile */
192: register unsigned int srcpix;
193:
194: int nlwidth; /* width in longwords of the drawable */
195: int w; /* width of current box */
196: register int h; /* height of current box */
197: int startmask;
198: int endmask; /* masks for reggedy bits at either end of line */
199: int nlwMiddle; /* number of longwords between sides of boxes */
200: register int nlwExtra;
201: /* to get from right of box to left of next span */
202:
203: register int nlw; /* loop version of nlwMiddle */
204: register unsigned int *p; /* pointer to bits we're writing */
205: int iy; /* index of current scanline in tile */
206:
207:
208: unsigned int *pbits; /* pointer to start of drawable */
209:
210: if (pDraw->type == DRAWABLE_WINDOW)
211: {
212: pbits = (unsigned int *)
213: (((PixmapPtr)(pDraw->pScreen->devPrivate))->devPrivate);
214: nlwidth = (int)
215: (((PixmapPtr)(pDraw->pScreen->devPrivate))->devKind) >> 2;
216: }
217: else
218: {
219: pbits = (unsigned int *)(((PixmapPtr)pDraw)->devPrivate);
220: nlwidth = (int)(((PixmapPtr)pDraw)->devKind) >> 2;
221: }
222:
223: tileHeight = pstipple->height;
224: psrc = (unsigned int *)(pstipple->devPrivate);
225:
226: while (nbox--)
227: {
228: w = pbox->x2 - pbox->x1;
229: h = pbox->y2 - pbox->y1;
230: iy = pbox->y1 % tileHeight;
231: p = pbits + (pbox->y1 * nlwidth) + (pbox->x1 >> 5);
232:
233: if ( ((pbox->x1 & 0x1f) + w) < 32)
234: {
235: maskpartialbits(pbox->x1, w, startmask);
236: nlwExtra = nlwidth;
237: while (h--)
238: {
239: srcpix = psrc[iy];
240: iy = ++iy < tileHeight ? iy : 0;
241: *p OPEQ (srcpix & startmask);
242: p += nlwExtra;
243: }
244: }
245: else
246: {
247: maskbits(pbox->x1, w, startmask, endmask, nlwMiddle);
248: nlwExtra = nlwidth - nlwMiddle;
249:
250: if (startmask && endmask)
251: {
252: nlwExtra -= 1;
253: while (h--)
254: {
255: srcpix = psrc[iy];
256: iy = ++iy < tileHeight ? iy : 0;
257: nlw = nlwMiddle;
258: *p OPEQ (srcpix & startmask);
259: p++;
260: while (nlw--)
261: {
262: *p OPEQ srcpix;
263: p++;
264: }
265: *p OPEQ (srcpix & endmask);
266: p += nlwExtra;
267: }
268: }
269: else if (startmask && !endmask)
270: {
271: nlwExtra -= 1;
272: while (h--)
273: {
274: srcpix = psrc[iy];
275: iy = ++iy < tileHeight ? iy : 0;
276: nlw = nlwMiddle;
277: *p OPEQ (srcpix & startmask);
278: p++;
279: while (nlw--)
280: {
281: *p OPEQ srcpix;
282: p++;
283: }
284: p += nlwExtra;
285: }
286: }
287: else if (!startmask && endmask)
288: {
289: while (h--)
290: {
291: srcpix = psrc[iy];
292: iy = ++iy < tileHeight ? iy : 0;
293: nlw = nlwMiddle;
294: while (nlw--)
295: {
296: *p OPEQ srcpix;
297: p++;
298: }
299: *p OPEQ (srcpix & endmask);
300: p += nlwExtra;
301: }
302: }
303: else /* no ragged bits at either end */
304: {
305: while (h--)
306: {
307: srcpix = psrc[iy];
308: iy = ++iy < tileHeight ? iy : 0;
309: nlw = nlwMiddle;
310: while (nlw--)
311: {
312: *p OPEQ srcpix;
313: p++;
314: }
315: p += nlwExtra;
316: }
317: }
318: }
319: pbox++;
320: }
321: }
322:
323:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.