|
|
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: mfbfillsp.c,v 1.29 87/09/07 19:08:34 toddb Exp $ */
25: #include "X.h"
26: #include "Xmd.h"
27: #include "gcstruct.h"
28: #include "window.h"
29: #include "pixmapstr.h"
30: #include "scrnintstr.h"
31: #include "windowstr.h"
32: #include "mfb.h"
33: #include "maskbits.h"
34:
35: #include "servermd.h"
36:
37: /* scanline filling for monochrome frame buffer
38: written by drewry, oct 1986
39:
40: these routines all clip. they assume that anything that has called
41: them has already translated the points (i.e. pGC->miTranslate is
42: non-zero, which is howit gets set in mfbCreateGC().)
43:
44: the number of new scnalines created by clipping ==
45: MaxRectsPerBand * nSpans.
46:
47: FillSolid is overloaded to be used for OpaqueStipple as well,
48: if fgPixel == bgPixel.
49:
50:
51: FillTiled is overloaded to be used for OpaqueStipple, if
52: fgPixel != bgPixel. based on the fill style, it uses
53: {RotatedTile, gc.alu} or {RotatedStipple, PrivGC.ropOpStip}
54: */
55:
56:
57: void mfbBlackSolidFS(pDrawable, pGC, nInit, pptInit, pwidthInit, fSorted)
58: DrawablePtr pDrawable;
59: GCPtr pGC;
60: int nInit; /* number of spans to fill */
61: DDXPointPtr pptInit; /* pointer to list of start points */
62: int *pwidthInit; /* pointer to list of n widths */
63: int fSorted;
64: {
65: /* next three parameters are post-clip */
66: int n; /* number of spans to fill */
67: register DDXPointPtr ppt; /* pointer to list of start points */
68: register int *pwidth; /* pointer to list of n widths */
69: int *addrlBase; /* pointer to start of bitmap */
70: int nlwidth; /* width in longwords of bitmap */
71: register int *addrl; /* pointer to current longword in bitmap */
72: register int startmask;
73: register int endmask;
74: register int nlmiddle;
75: int *pwidthFree; /* copies of the pointers to free */
76: DDXPointPtr pptFree;
77:
78: if (!(pGC->planemask & 1))
79: return;
80:
81: n = nInit * miFindMaxBand(((mfbPrivGC *)(pGC->devPriv))->pCompositeClip);
82: pwidthFree = (int *)ALLOCATE_LOCAL(n * sizeof(int));
83: pptFree = (DDXPointRec *)ALLOCATE_LOCAL(n * sizeof(DDXPointRec));
84: if(!pptFree || !pwidthFree)
85: {
86: DEALLOCATE_LOCAL(pptFree);
87: DEALLOCATE_LOCAL(pwidthFree);
88: return;
89: }
90: pwidth = pwidthFree;
91: ppt = pptFree;
92: n = miClipSpans(((mfbPrivGC *)(pGC->devPriv))->pCompositeClip,
93: pptInit, pwidthInit, nInit,
94: ppt, pwidth, fSorted);
95:
96: if (pDrawable->type == DRAWABLE_WINDOW)
97: {
98: addrlBase = (int *)
99: (((PixmapPtr)(pDrawable->pScreen->devPrivate))->devPrivate);
100: nlwidth = (int)
101: (((PixmapPtr)(pDrawable->pScreen->devPrivate))->devKind) >> 2;
102: }
103: else
104: {
105: addrlBase = (int *)(((PixmapPtr)pDrawable)->devPrivate);
106: nlwidth = (int)(((PixmapPtr)pDrawable)->devKind) >> 2;
107: }
108:
109: while (n--)
110: {
111: addrl = addrlBase + (ppt->y * nlwidth) + (ppt->x >> 5);
112:
113: if (*pwidth)
114: {
115: if ( ((ppt->x & 0x1f) + *pwidth) < 32)
116: {
117: /* all bits inside same longword */
118: maskpartialbits(ppt->x, *pwidth, startmask);
119: *addrl &= ~startmask;
120: }
121: else
122: {
123: maskbits(ppt->x, *pwidth, startmask, endmask, nlmiddle);
124: if (startmask)
125: *addrl++ &= ~startmask;
126: while (nlmiddle--)
127: *addrl++ = 0x0;
128: if (endmask)
129: *addrl &= ~endmask;
130: }
131: }
132: pwidth++;
133: ppt++;
134: }
135: DEALLOCATE_LOCAL(pptFree);
136: DEALLOCATE_LOCAL(pwidthFree);
137: }
138:
139:
140:
141: void mfbWhiteSolidFS(pDrawable, pGC, nInit, pptInit, pwidthInit, fSorted)
142: DrawablePtr pDrawable;
143: GCPtr pGC;
144: int nInit; /* number of spans to fill */
145: DDXPointPtr pptInit; /* pointer to list of start points */
146: int *pwidthInit; /* pointer to list of n widths */
147: int fSorted;
148: {
149: /* next three parameters are post-clip */
150: int n; /* number of spans to fill */
151: register DDXPointPtr ppt; /* pointer to list of start points */
152: register int *pwidth; /* pointer to list of n widths */
153: int *addrlBase; /* pointer to start of bitmap */
154: int nlwidth; /* width in longwords of bitmap */
155: register int *addrl; /* pointer to current longword in bitmap */
156: register int startmask;
157: register int endmask;
158: register int nlmiddle;
159: int *pwidthFree; /* copies of the pointers to free */
160: DDXPointPtr pptFree;
161:
162: if (!(pGC->planemask & 1))
163: return;
164:
165: n = nInit * miFindMaxBand(((mfbPrivGC *)(pGC->devPriv))->pCompositeClip);
166: pwidthFree = (int *)ALLOCATE_LOCAL(n * sizeof(int));
167: pptFree = (DDXPointRec *)ALLOCATE_LOCAL(n * sizeof(DDXPointRec));
168: if(!pptFree || !pwidthFree)
169: {
170: DEALLOCATE_LOCAL(pptFree);
171: DEALLOCATE_LOCAL(pwidthFree);
172: return;
173: }
174: pwidth = pwidthFree;
175: ppt = pptFree;
176: n = miClipSpans(((mfbPrivGC *)(pGC->devPriv))->pCompositeClip,
177: pptInit, pwidthInit, nInit,
178: ppt, pwidth, fSorted);
179:
180: if (pDrawable->type == DRAWABLE_WINDOW)
181: {
182: addrlBase = (int *)
183: (((PixmapPtr)(pDrawable->pScreen->devPrivate))->devPrivate);
184: nlwidth = (int)
185: (((PixmapPtr)(pDrawable->pScreen->devPrivate))->devKind) >> 2;
186: }
187: else
188: {
189: addrlBase = (int *)(((PixmapPtr)pDrawable)->devPrivate);
190: nlwidth = (int)(((PixmapPtr)pDrawable)->devKind) >> 2;
191: }
192:
193: while (n--)
194: {
195: addrl = addrlBase + (ppt->y * nlwidth) + (ppt->x >> 5);
196:
197: if (*pwidth)
198: {
199: if ( ((ppt->x & 0x1f) + *pwidth) < 32)
200: {
201: /* all bits inside same longword */
202: maskpartialbits(ppt->x, *pwidth, startmask);
203: *addrl |= startmask;
204: }
205: else
206: {
207: maskbits(ppt->x, *pwidth, startmask, endmask, nlmiddle);
208: if (startmask)
209: *addrl++ |= startmask;
210: while (nlmiddle--)
211: *addrl++ = 0xffffffff;
212: if (endmask)
213: *addrl |= endmask;
214: }
215: }
216: pwidth++;
217: ppt++;
218: }
219: DEALLOCATE_LOCAL(pptFree);
220: DEALLOCATE_LOCAL(pwidthFree);
221: }
222:
223:
224:
225: void mfbInvertSolidFS(pDrawable, pGC, nInit, pptInit, pwidthInit, fSorted)
226: DrawablePtr pDrawable;
227: GCPtr pGC;
228: int nInit; /* number of spans to fill */
229: DDXPointPtr pptInit; /* pointer to list of start points */
230: int *pwidthInit; /* pointer to list of n widths */
231: int fSorted;
232: {
233: /* next three parameters are post-clip */
234: int n; /* number of spans to fill */
235: register DDXPointPtr ppt; /* pointer to list of start points */
236: register int *pwidth; /* pointer to list of n widths */
237: int *addrlBase; /* pointer to start of bitmap */
238: int nlwidth; /* width in longwords of bitmap */
239: register int *addrl; /* pointer to current longword in bitmap */
240: register int startmask;
241: register int endmask;
242: register int nlmiddle;
243: int *pwidthFree; /* copies of the pointers to free */
244: DDXPointPtr pptFree;
245:
246: if (!(pGC->planemask & 1))
247: return;
248:
249: n = nInit * miFindMaxBand(((mfbPrivGC *)(pGC->devPriv))->pCompositeClip);
250: pwidthFree = (int *)ALLOCATE_LOCAL(n * sizeof(int));
251: pptFree = (DDXPointRec *)ALLOCATE_LOCAL(n * sizeof(DDXPointRec));
252: if(!pptFree || !pwidthFree)
253: {
254: DEALLOCATE_LOCAL(pptFree);
255: DEALLOCATE_LOCAL(pwidthFree);
256: return;
257: }
258: pwidth = pwidthFree;
259: ppt = pptFree;
260: n = miClipSpans(((mfbPrivGC *)(pGC->devPriv))->pCompositeClip,
261: pptInit, pwidthInit, nInit,
262: ppt, pwidth, fSorted);
263:
264: if (pDrawable->type == DRAWABLE_WINDOW)
265: {
266: addrlBase = (int *)
267: (((PixmapPtr)(pDrawable->pScreen->devPrivate))->devPrivate);
268: nlwidth = (int)
269: (((PixmapPtr)(pDrawable->pScreen->devPrivate))->devKind) >> 2;
270: }
271: else
272: {
273: addrlBase = (int *)(((PixmapPtr)pDrawable)->devPrivate);
274: nlwidth = (int)(((PixmapPtr)pDrawable)->devKind) >> 2;
275: }
276:
277: while (n--)
278: {
279: addrl = addrlBase + (ppt->y * nlwidth) + (ppt->x >> 5);
280:
281: if (*pwidth)
282: {
283: if ( ((ppt->x & 0x1f) + *pwidth) < 32)
284: {
285: /* all bits inside same longword */
286: maskpartialbits(ppt->x, *pwidth, startmask);
287: *addrl ^= startmask;
288: }
289: else
290: {
291: maskbits(ppt->x, *pwidth, startmask, endmask, nlmiddle);
292: if (startmask)
293: *addrl++ ^= startmask;
294: while (nlmiddle--)
295: *addrl++ ^= 0xffffffff;
296: if (endmask)
297: *addrl ^= endmask;
298: }
299: }
300: pwidth++;
301: ppt++;
302: }
303: DEALLOCATE_LOCAL(pptFree);
304: DEALLOCATE_LOCAL(pwidthFree);
305: }
306:
307:
308: void
309: mfbWhiteStippleFS(pDrawable, pGC, nInit, pptInit, pwidthInit, fSorted)
310: DrawablePtr pDrawable;
311: GC *pGC;
312: int nInit; /* number of spans to fill */
313: DDXPointPtr pptInit; /* pointer to list of start points */
314: int *pwidthInit; /* pointer to list of n widths */
315: int fSorted;
316: {
317: /* next three parameters are post-clip */
318: int n; /* number of spans to fill */
319: register DDXPointPtr ppt; /* pointer to list of start points */
320: register int *pwidth; /* pointer to list of n widths */
321: int *addrlBase; /* pointer to start of bitmap */
322: int nlwidth; /* width in longwords of bitmap */
323: register int *addrl; /* pointer to current longword in bitmap */
324: register int startmask;
325: register int endmask;
326: register int nlmiddle;
327: PixmapPtr pStipple;
328: int *psrc;
329: int src;
330: int tileHeight;
331: int *pwidthFree; /* copies of the pointers to free */
332: DDXPointPtr pptFree;
333:
334: if (!(pGC->planemask & 1))
335: return;
336:
337: n = nInit * miFindMaxBand(((mfbPrivGC *)(pGC->devPriv))->pCompositeClip);
338: pwidthFree = (int *)ALLOCATE_LOCAL(n * sizeof(int));
339: pptFree = (DDXPointRec *)ALLOCATE_LOCAL(n * sizeof(DDXPointRec));
340: if(!pptFree || !pwidthFree)
341: {
342: DEALLOCATE_LOCAL(pptFree);
343: DEALLOCATE_LOCAL(pwidthFree);
344: return;
345: }
346: pwidth = pwidthFree;
347: ppt = pptFree;
348: n = miClipSpans(((mfbPrivGC *)(pGC->devPriv))->pCompositeClip,
349: pptInit, pwidthInit, nInit,
350: ppt, pwidth, fSorted);
351:
352: if (pDrawable->type == DRAWABLE_WINDOW)
353: {
354: addrlBase = (int *)
355: (((PixmapPtr)(pDrawable->pScreen->devPrivate))->devPrivate);
356: nlwidth = (int)
357: (((PixmapPtr)(pDrawable->pScreen->devPrivate))->devKind) >> 2;
358: }
359: else
360: {
361: addrlBase = (int *)(((PixmapPtr)pDrawable)->devPrivate);
362: nlwidth = (int)(((PixmapPtr)pDrawable)->devKind) >> 2;
363: }
364:
365: pStipple = ((mfbPrivGC *)(pGC->devPriv))->pRotatedStipple;
366: tileHeight = pStipple->height;
367: psrc = (int *)(pStipple->devPrivate);
368:
369: while (n--)
370: {
371: addrl = addrlBase + (ppt->y * nlwidth) + (ppt->x >> 5);
372: src = psrc[ppt->y % tileHeight];
373:
374: /* all bits inside same longword */
375: if ( ((ppt->x & 0x1f) + *pwidth) < 32)
376: {
377: maskpartialbits(ppt->x, *pwidth, startmask);
378: *addrl |= (src & startmask);
379: }
380: else
381: {
382: maskbits(ppt->x, *pwidth, startmask, endmask, nlmiddle);
383: if (startmask)
384: *addrl++ |= (src & startmask);
385: while (nlmiddle--)
386: *addrl++ |= src;
387: if (endmask)
388: *addrl |= (src & endmask);
389: }
390: pwidth++;
391: ppt++;
392: }
393: DEALLOCATE_LOCAL(pptFree);
394: DEALLOCATE_LOCAL(pwidthFree);
395: }
396:
397:
398: void
399: mfbBlackStippleFS(pDrawable, pGC, nInit, pptInit, pwidthInit, fSorted)
400: DrawablePtr pDrawable;
401: GC *pGC;
402: int nInit; /* number of spans to fill */
403: DDXPointPtr pptInit; /* pointer to list of start points */
404: int *pwidthInit; /* pointer to list of n widths */
405: int fSorted;
406: {
407: /* next three parameters are post-clip */
408: int n; /* number of spans to fill */
409: register DDXPointPtr ppt; /* pointer to list of start points */
410: register int *pwidth; /* pointer to list of n widths */
411: int *addrlBase; /* pointer to start of bitmap */
412: int nlwidth; /* width in longwords of bitmap */
413: register int *addrl; /* pointer to current longword in bitmap */
414: register int startmask;
415: register int endmask;
416: register int nlmiddle;
417: PixmapPtr pStipple;
418: int *psrc;
419: int src;
420: int tileHeight;
421: int *pwidthFree; /* copies of the pointers to free */
422: DDXPointPtr pptFree;
423:
424: if (!(pGC->planemask & 1))
425: return;
426:
427: n = nInit * miFindMaxBand(((mfbPrivGC *)(pGC->devPriv))->pCompositeClip);
428: pwidthFree = (int *)ALLOCATE_LOCAL(n * sizeof(int));
429: pptFree = (DDXPointRec *)ALLOCATE_LOCAL(n * sizeof(DDXPointRec));
430: if(!pptFree || !pwidthFree)
431: {
432: DEALLOCATE_LOCAL(pptFree);
433: DEALLOCATE_LOCAL(pwidthFree);
434: return;
435: }
436: pwidth = pwidthFree;
437: ppt = pptFree;
438: n = miClipSpans(((mfbPrivGC *)(pGC->devPriv))->pCompositeClip,
439: pptInit, pwidthInit, nInit,
440: ppt, pwidth, fSorted);
441:
442: if (pDrawable->type == DRAWABLE_WINDOW)
443: {
444: addrlBase = (int *)
445: (((PixmapPtr)(pDrawable->pScreen->devPrivate))->devPrivate);
446: nlwidth = (int)
447: (((PixmapPtr)(pDrawable->pScreen->devPrivate))->devKind) >> 2;
448: }
449: else
450: {
451: addrlBase = (int *)(((PixmapPtr)pDrawable)->devPrivate);
452: nlwidth = (int)(((PixmapPtr)pDrawable)->devKind) >> 2;
453: }
454:
455: pStipple = ((mfbPrivGC *)(pGC->devPriv))->pRotatedStipple;
456: tileHeight = pStipple->height;
457: psrc = (int *)(pStipple->devPrivate);
458:
459: while (n--)
460: {
461: addrl = addrlBase + (ppt->y * nlwidth) + (ppt->x >> 5);
462: src = psrc[ppt->y % tileHeight];
463:
464: /* all bits inside same longword */
465: if ( ((ppt->x & 0x1f) + *pwidth) < 32)
466: {
467: maskpartialbits(ppt->x, *pwidth, startmask);
468: *addrl &= ~(src & startmask);
469: }
470: else
471: {
472: maskbits(ppt->x, *pwidth, startmask, endmask, nlmiddle);
473: if (startmask)
474: *addrl++ &= ~(src & startmask);
475: while (nlmiddle--)
476: *addrl++ &= ~src;
477: if (endmask)
478: *addrl &= ~(src & endmask);
479: }
480: pwidth++;
481: ppt++;
482: }
483: DEALLOCATE_LOCAL(pptFree);
484: DEALLOCATE_LOCAL(pwidthFree);
485: }
486:
487:
488: void
489: mfbInvertStippleFS(pDrawable, pGC, nInit, pptInit, pwidthInit, fSorted)
490: DrawablePtr pDrawable;
491: GC *pGC;
492: int nInit; /* number of spans to fill */
493: DDXPointPtr pptInit; /* pointer to list of start points */
494: int *pwidthInit; /* pointer to list of n widths */
495: int fSorted;
496: {
497: /* next three parameters are post-clip */
498: int n; /* number of spans to fill */
499: register DDXPointPtr ppt; /* pointer to list of start points */
500: register int *pwidth; /* pointer to list of n widths */
501: int *addrlBase; /* pointer to start of bitmap */
502: int nlwidth; /* width in longwords of bitmap */
503: register int *addrl; /* pointer to current longword in bitmap */
504: register int startmask;
505: register int endmask;
506: register int nlmiddle;
507: PixmapPtr pStipple;
508: int *psrc;
509: int src;
510: int tileHeight;
511: int *pwidthFree; /* copies of the pointers to free */
512: DDXPointPtr pptFree;
513:
514: if (!(pGC->planemask & 1))
515: return;
516:
517: n = nInit * miFindMaxBand(((mfbPrivGC *)(pGC->devPriv))->pCompositeClip);
518: pwidthFree = (int *)ALLOCATE_LOCAL(n * sizeof(int));
519: pptFree = (DDXPointRec *)ALLOCATE_LOCAL(n * sizeof(DDXPointRec));
520: if(!pptFree || !pwidthFree)
521: {
522: DEALLOCATE_LOCAL(pptFree);
523: DEALLOCATE_LOCAL(pwidthFree);
524: return;
525: }
526: pwidth = pwidthFree;
527: ppt = pptFree;
528: n = miClipSpans(((mfbPrivGC *)(pGC->devPriv))->pCompositeClip,
529: pptInit, pwidthInit, nInit,
530: ppt, pwidth, fSorted);
531:
532: if (pDrawable->type == DRAWABLE_WINDOW)
533: {
534: addrlBase = (int *)
535: (((PixmapPtr)(pDrawable->pScreen->devPrivate))->devPrivate);
536: nlwidth = (int)
537: (((PixmapPtr)(pDrawable->pScreen->devPrivate))->devKind) >> 2;
538: }
539: else
540: {
541: addrlBase = (int *)(((PixmapPtr)pDrawable)->devPrivate);
542: nlwidth = (int)(((PixmapPtr)pDrawable)->devKind) >> 2;
543: }
544:
545: pStipple = ((mfbPrivGC *)(pGC->devPriv))->pRotatedStipple;
546: tileHeight = pStipple->height;
547: psrc = (int *)(pStipple->devPrivate);
548:
549: while (n--)
550: {
551: addrl = addrlBase + (ppt->y * nlwidth) + (ppt->x >> 5);
552: src = psrc[ppt->y % tileHeight];
553:
554: /* all bits inside same longword */
555: if ( ((ppt->x & 0x1f) + *pwidth) < 32)
556: {
557: maskpartialbits(ppt->x, *pwidth, startmask);
558: *addrl ^= (src & startmask);
559: }
560: else
561: {
562: maskbits(ppt->x, *pwidth, startmask, endmask, nlmiddle);
563: if (startmask)
564: *addrl++ ^= (src & startmask);
565: while (nlmiddle--)
566: *addrl++ ^= src;
567: if (endmask)
568: *addrl ^= (src & endmask);
569: }
570: pwidth++;
571: ppt++;
572: }
573: DEALLOCATE_LOCAL(pptFree);
574: DEALLOCATE_LOCAL(pwidthFree);
575: }
576:
577:
578: /* this works with tiles of width == 32 */
579: #define FILLSPAN32(ROP) \
580: while (n--) \
581: { \
582: if (*pwidth) \
583: { \
584: addrl = addrlBase + (ppt->y * nlwidth) + (ppt->x >> 5); \
585: src = psrc[ppt->y % tileHeight]; \
586: if ( ((ppt->x & 0x1f) + *pwidth) < 32) \
587: { \
588: maskpartialbits(ppt->x, *pwidth, startmask); \
589: *addrl = (*addrl & ~startmask) | \
590: (ROP(src, *addrl) & startmask); \
591: } \
592: else \
593: { \
594: maskbits(ppt->x, *pwidth, startmask, endmask, nlmiddle); \
595: if (startmask) \
596: { \
597: *addrl = (*addrl & ~startmask) | \
598: (ROP(src, *addrl) & startmask); \
599: addrl++; \
600: } \
601: while (nlmiddle--) \
602: { \
603: *addrl = ROP(src, *addrl); \
604: addrl++; \
605: } \
606: if (endmask) \
607: *addrl = (*addrl & ~endmask) | \
608: (ROP(src, *addrl) & endmask); \
609: } \
610: } \
611: pwidth++; \
612: ppt++; \
613: }
614:
615:
616:
617: void mfbTileFS(pDrawable, pGC, nInit, pptInit, pwidthInit, fSorted)
618: DrawablePtr pDrawable;
619: GC *pGC;
620: int nInit; /* number of spans to fill */
621: DDXPointPtr pptInit; /* pointer to list of start points */
622: int *pwidthInit; /* pointer to list of n widths */
623: int fSorted;
624: {
625: /* next three parameters are post-clip */
626: int n; /* number of spans to fill */
627: register DDXPointPtr ppt; /* pointer to list of start points */
628: register int *pwidth; /* pointer to list of n widths */
629: int *addrlBase; /* pointer to start of bitmap */
630: int nlwidth; /* width in longwords of bitmap */
631: register int *addrl; /* pointer to current longword in bitmap */
632: register int startmask;
633: register int endmask;
634: register int nlmiddle;
635: PixmapPtr pTile;
636: int *psrc;
637: register int src;
638: int tileHeight;
639: int rop;
640: int *pwidthFree; /* copies of the pointers to free */
641: DDXPointPtr pptFree;
642:
643: if (!(pGC->planemask & 1))
644: return;
645:
646: n = nInit * miFindMaxBand(((mfbPrivGC *)(pGC->devPriv))->pCompositeClip);
647: pwidthFree = (int *)ALLOCATE_LOCAL(n * sizeof(int));
648: pptFree = (DDXPointRec *)ALLOCATE_LOCAL(n * sizeof(DDXPointRec));
649: if(!pptFree || !pwidthFree)
650: {
651: DEALLOCATE_LOCAL(pptFree);
652: DEALLOCATE_LOCAL(pwidthFree);
653: return;
654: }
655: pwidth = pwidthFree;
656: ppt = pptFree;
657: n = miClipSpans(((mfbPrivGC *)(pGC->devPriv))->pCompositeClip,
658: pptInit, pwidthInit, nInit,
659: ppt, pwidth, fSorted);
660:
661: if (pDrawable->type == DRAWABLE_WINDOW)
662: {
663: addrlBase = (int *)
664: (((PixmapPtr)(pDrawable->pScreen->devPrivate))->devPrivate);
665: nlwidth = (int)
666: (((PixmapPtr)(pDrawable->pScreen->devPrivate))->devKind) >> 2;
667: }
668: else
669: {
670: addrlBase = (int *)(((PixmapPtr)pDrawable)->devPrivate);
671: nlwidth = (int)(((PixmapPtr)pDrawable)->devKind) >> 2;
672: }
673:
674: if (pGC->fillStyle == FillTiled)
675: {
676: pTile = ((mfbPrivGC *)(pGC->devPriv))->pRotatedTile;
677: tileHeight = pTile->height;
678: psrc = (int *)(pTile->devPrivate);
679: rop = pGC->alu;
680: }
681: else
682: {
683: pTile = ((mfbPrivGC *)(pGC->devPriv))->pRotatedStipple;
684: tileHeight = pTile->height;
685: psrc = (int *)(pTile->devPrivate);
686: rop = ((mfbPrivGC *)(pGC->devPriv))->ropOpStip;
687: }
688:
689:
690: switch(rop)
691: {
692: case GXclear:
693: FILLSPAN32(fnCLEAR)
694: break;
695: case GXand:
696: FILLSPAN32(fnAND)
697: break;
698: case GXandReverse:
699: FILLSPAN32(fnANDREVERSE)
700: break;
701: case GXcopy:
702: FILLSPAN32(fnCOPY)
703: break;
704: case GXandInverted:
705: FILLSPAN32(fnANDINVERTED)
706: break;
707: case GXnoop:
708: break;
709: case GXxor:
710: FILLSPAN32(fnXOR)
711: break;
712: case GXor:
713: FILLSPAN32(fnOR)
714: break;
715: case GXnor:
716: FILLSPAN32(fnNOR)
717: break;
718: case GXequiv:
719: FILLSPAN32(fnEQUIV)
720: break;
721: case GXinvert:
722: FILLSPAN32(fnINVERT)
723: break;
724: case GXorReverse:
725: FILLSPAN32(fnORREVERSE)
726: break;
727: case GXcopyInverted:
728: FILLSPAN32(fnCOPYINVERTED)
729: break;
730: case GXorInverted:
731: FILLSPAN32(fnORINVERTED)
732: break;
733: case GXnand:
734: FILLSPAN32(fnNAND)
735: break;
736: case GXset:
737: FILLSPAN32(fnSET)
738: break;
739: }
740: DEALLOCATE_LOCAL(pptFree);
741: DEALLOCATE_LOCAL(pwidthFree);
742: }
743:
744:
745: /* Fill spans with tiles that aren't 32 bits wide */
746: void
747: mfbUnnaturalTileFS(pDrawable, pGC, nInit, pptInit, pwidthInit, fSorted)
748: DrawablePtr pDrawable;
749: GC *pGC;
750: int nInit; /* number of spans to fill */
751: DDXPointPtr pptInit; /* pointer to list of start points */
752: int *pwidthInit; /* pointer to list of n widths */
753: int fSorted;
754: {
755: int iline; /* first line of tile to use */
756: /* next three parameters are post-clip */
757: int n; /* number of spans to fill */
758: register DDXPointPtr ppt; /* pointer to list of start points */
759: register int *pwidth; /* pointer to list of n widths */
760: int *addrlBase; /* pointer to start of bitmap */
761: int nlwidth; /* width in longwords of bitmap */
762: register int *pdst; /* pointer to current word in bitmap */
763: register int *psrc; /* pointer to current word in tile */
764: register int startmask;
765: register int nlMiddle;
766: PixmapPtr pTile; /* pointer to tile we want to fill with */
767: int w, width, x, xSrc, ySrc, tmpSrc, srcStartOver, nstart, nend;
768: int endmask, tlwidth, rem, tileWidth, *psrcT, endinc, rop;
769: int *pwidthFree; /* copies of the pointers to free */
770: DDXPointPtr pptFree;
771:
772: if (!(pGC->planemask & 1))
773: return;
774:
775: n = nInit * miFindMaxBand(((mfbPrivGC *)(pGC->devPriv))->pCompositeClip);
776: pwidthFree = (int *)ALLOCATE_LOCAL(n * sizeof(int));
777: pptFree = (DDXPointRec *)ALLOCATE_LOCAL(n * sizeof(DDXPointRec));
778: if(!pptFree || !pwidthFree)
779: {
780: DEALLOCATE_LOCAL(pptFree);
781: DEALLOCATE_LOCAL(pwidthFree);
782: return;
783: }
784: pwidth = pwidthFree;
785: ppt = pptFree;
786: n = miClipSpans(((mfbPrivGC *)(pGC->devPriv))->pCompositeClip,
787: pptInit, pwidthInit, nInit,
788: ppt, pwidth, fSorted);
789:
790: if (pGC->fillStyle == FillTiled)
791: {
792: pTile = pGC->tile;
793: tlwidth = pTile->devKind >> 2;
794: rop = pGC->alu;
795: }
796: else
797: {
798: pTile = pGC->stipple;
799: tlwidth = pTile->devKind >> 2;
800: rop = ((mfbPrivGC *)(pGC->devPriv))->ropOpStip;
801: }
802:
803: if (pDrawable->type == DRAWABLE_WINDOW)
804: {
805: addrlBase = (int *)
806: (((PixmapPtr)(pDrawable->pScreen->devPrivate))->devPrivate);
807: nlwidth = (int)
808: (((PixmapPtr)(pDrawable->pScreen->devPrivate))->devKind) >> 2;
809: xSrc = ((WindowPtr) pDrawable)->absCorner.x;
810: ySrc = ((WindowPtr) pDrawable)->absCorner.y;
811: }
812: else
813: {
814: addrlBase = (int *)(((PixmapPtr)pDrawable)->devPrivate);
815: nlwidth = (int)(((PixmapPtr)pDrawable)->devKind) >> 2;
816: xSrc = 0;
817: ySrc = 0;
818: }
819:
820: tileWidth = pTile->width;
821:
822: /* this replaces rotating the tile. Instead we just adjust the offset
823: * at which we start grabbing bits from the tile */
824: xSrc += pGC->patOrg.x;
825: ySrc += pGC->patOrg.y;
826:
827: while (n--)
828: {
829: iline = (ppt->y - ySrc) % pTile->height;
830: pdst = addrlBase + (ppt->y * nlwidth) + (ppt->x >> 5);
831: psrcT = (int *) pTile->devPrivate + (iline * tlwidth);
832: x = ppt->x;
833:
834: if (*pwidth)
835: {
836: width = *pwidth;
837: while(width > 0)
838: {
839: psrc = psrcT;
840: w = min(tileWidth, width);
841: if((rem = (x - xSrc) % tileWidth) != 0)
842: {
843: /* if we're in the middle of the tile, get
844: as many bits as will finish the span, or
845: as many as will get to the left edge of the tile,
846: or a longword worth, starting at the appropriate
847: offset in the tile.
848: */
849: w = min(min(tileWidth - rem, width), BITMAP_SCANLINE_UNIT);
850: endinc = rem / BITMAP_SCANLINE_UNIT;
851: getbits(psrc + endinc, rem & 0x1f, w, tmpSrc);
852: putbitsrop(tmpSrc, (x & 0x1f), w, pdst, rop);
853: if((x & 0x1f) + w >= 0x20)
854: pdst++;
855: }
856: else if(((x & 0x1f) + w) < 32)
857: {
858: /* doing < 32 bits is easy, and worth special-casing */
859: getbits(psrc, 0, w, tmpSrc);
860: putbitsrop(tmpSrc, x & 0x1f, w, pdst, rop);
861: }
862: else
863: {
864: /* start at the left edge of the tile,
865: and put down as much as we can
866: */
867: maskbits(x, w, startmask, endmask, nlMiddle);
868:
869: if (startmask)
870: nstart = 32 - (x & 0x1f);
871: else
872: nstart = 0;
873: if (endmask)
874: nend = (x + w) & 0x1f;
875: else
876: nend = 0;
877:
878: srcStartOver = nstart > 31;
879:
880: if(startmask)
881: {
882: getbits(psrc, 0, nstart, tmpSrc);
883: putbitsrop(tmpSrc, (x & 0x1f), nstart, pdst, rop);
884: pdst++;
885: if(srcStartOver)
886: psrc++;
887: }
888:
889: while(nlMiddle--)
890: {
891: getbits(psrc, nstart, 32, tmpSrc);
892: *pdst = DoRop(rop, tmpSrc, *pdst);
893: pdst++;
894: psrc++;
895: }
896: if(endmask)
897: {
898: getbits(psrc, nstart, nend, tmpSrc);
899: putbitsrop(tmpSrc, 0, nend, pdst, rop);
900: }
901: }
902: x += w;
903: width -= w;
904: }
905: }
906: ppt++;
907: pwidth++;
908: }
909: DEALLOCATE_LOCAL(pptFree);
910: DEALLOCATE_LOCAL(pwidthFree);
911: }
912:
913:
914: /* Fill spans with stipples that aren't 32 bits wide */
915: void
916: mfbUnnaturalStippleFS(pDrawable, pGC, nInit, pptInit, pwidthInit, fSorted)
917: DrawablePtr pDrawable;
918: GC *pGC;
919: int nInit; /* number of spans to fill */
920: DDXPointPtr pptInit; /* pointer to list of start points */
921: int *pwidthInit; /* pointer to list of n widths */
922: int fSorted;
923: {
924: /* next three parameters are post-clip */
925: int n; /* number of spans to fill */
926: register DDXPointPtr ppt; /* pointer to list of start points */
927: register int *pwidth; /* pointer to list of n widths */
928: int iline; /* first line of tile to use */
929: int *addrlBase; /* pointer to start of bitmap */
930: int nlwidth; /* width in longwords of bitmap */
931: register int *pdst; /* pointer to current word in bitmap */
932: register int *psrc; /* pointer to current word in tile */
933: register int startmask;
934: register int nlMiddle;
935: PixmapPtr pTile; /* pointer to tile we want to fill with */
936: int w, width, x, xSrc, ySrc, tmpSrc, srcStartOver, nstart, nend;
937: int endmask, tlwidth, rem, tileWidth, *psrcT, endinc, rop;
938: int *pwidthFree; /* copies of the pointers to free */
939: DDXPointPtr pptFree;
940:
941: if (!(pGC->planemask & 1))
942: return;
943:
944: n = nInit * miFindMaxBand(((mfbPrivGC *)(pGC->devPriv))->pCompositeClip);
945: pwidthFree = (int *)ALLOCATE_LOCAL(n * sizeof(int));
946: pptFree = (DDXPointRec *)ALLOCATE_LOCAL(n * sizeof(DDXPointRec));
947: if(!pptFree || !pwidthFree)
948: {
949: DEALLOCATE_LOCAL(pptFree);
950: DEALLOCATE_LOCAL(pwidthFree);
951: return;
952: }
953: pwidth = pwidthFree;
954: ppt = pptFree;
955: n = miClipSpans(((mfbPrivGC *)(pGC->devPriv))->pCompositeClip,
956: pptInit, pwidthInit, nInit,
957: ppt, pwidth, fSorted);
958:
959: pTile = pGC->stipple;
960: rop = ((mfbPrivGC *)(pGC->devPriv))->rop;
961: tlwidth = pTile->devKind >> 2;
962: if (pDrawable->type == DRAWABLE_WINDOW)
963: {
964: addrlBase = (int *)
965: (((PixmapPtr)(pDrawable->pScreen->devPrivate))->devPrivate);
966: nlwidth = (int)
967: (((PixmapPtr)(pDrawable->pScreen->devPrivate))->devKind) >> 2;
968: xSrc = ((WindowPtr)pDrawable)->absCorner.x;
969: ySrc = ((WindowPtr)pDrawable)->absCorner.y;
970: }
971: else
972: {
973: addrlBase = (int *)(((PixmapPtr)pDrawable)->devPrivate);
974: nlwidth = (int)(((PixmapPtr)pDrawable)->devKind) >> 2;
975: xSrc = 0;
976: ySrc = 0;
977: }
978:
979: tileWidth = pTile->width;
980:
981: /* this replaces rotating the stipple. Instead, we just adjust the offset
982: * at which we start grabbing bits from the stipple */
983: xSrc += pGC->patOrg.x;
984: ySrc += pGC->patOrg.y;
985: while (n--)
986: {
987: iline = (ppt->y - ySrc) % pTile->height;
988: pdst = addrlBase + (ppt->y * nlwidth) + (ppt->x >> 5);
989: psrcT = (int *) pTile->devPrivate + (iline * tlwidth);
990: x = ppt->x;
991:
992: if (*pwidth)
993: {
994: width = *pwidth;
995: while(width > 0)
996: {
997: psrc = psrcT;
998: w = min(tileWidth, width);
999: if((rem = (x - xSrc) % tileWidth) != 0)
1000: {
1001: /* if we're in the middle of the tile, get
1002: as many bits as will finish the span, or
1003: as many as will get to the left edge of the tile,
1004: or a longword worth, starting at the appropriate
1005: offset in the tile.
1006: */
1007: w = min(min(tileWidth - rem, width), BITMAP_SCANLINE_UNIT);
1008: endinc = rem / BITMAP_SCANLINE_UNIT;
1009: getbits(psrc + endinc, rem & 0x1f, w, tmpSrc);
1010: putbitsrrop(tmpSrc, (x & 0x1f), w, pdst, rop);
1011: if((x & 0x1f) + w >= 0x20)
1012: pdst++;
1013: }
1014:
1015: else if(((x & 0x1f) + w) < 32)
1016: {
1017: /* doing < 32 bits is easy, and worth special-casing */
1018: getbits(psrc, 0, w, tmpSrc);
1019: putbitsrrop(tmpSrc, x & 0x1f, w, pdst, rop);
1020: }
1021: else
1022: {
1023: /* start at the left edge of the tile,
1024: and put down as much as we can
1025: */
1026: maskbits(x, w, startmask, endmask, nlMiddle);
1027:
1028: if (startmask)
1029: nstart = 32 - (x & 0x1f);
1030: else
1031: nstart = 0;
1032: if (endmask)
1033: nend = (x + w) & 0x1f;
1034: else
1035: nend = 0;
1036:
1037: srcStartOver = nstart > 31;
1038:
1039: if(startmask)
1040: {
1041: getbits(psrc, 0, nstart, tmpSrc);
1042: putbitsrrop(tmpSrc, (x & 0x1f), nstart, pdst, rop);
1043: pdst++;
1044: if(srcStartOver)
1045: psrc++;
1046: }
1047:
1048: while(nlMiddle--)
1049: {
1050: getbits(psrc, nstart, 32, tmpSrc);
1051: *pdst = DoRRop(rop, tmpSrc, *pdst);
1052: pdst++;
1053: psrc++;
1054: }
1055: if(endmask)
1056: {
1057: getbits(psrc, nstart, nend, tmpSrc);
1058: putbitsrrop(tmpSrc, 0, nend, pdst, rop);
1059: }
1060: }
1061: x += w;
1062: width -= w;
1063: }
1064: }
1065: ppt++;
1066: pwidth++;
1067: }
1068: DEALLOCATE_LOCAL(pptFree);
1069: DEALLOCATE_LOCAL(pwidthFree);
1070: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.