|
|
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: mfbpushpxl.c,v 1.16 87/09/11 07:48:33 toddb Exp $ */
25:
26: #include "X.h"
27: #include "gcstruct.h"
28: #include "screenint.h"
29: #include "pixmapstr.h"
30: #include "miscstruct.h"
31: #include "maskbits.h"
32:
33: #define NPT 128
34:
35: /* mfbPushPixels -- squeegees the forground color of pGC through pBitMap
36: * into pDrawable. pBitMap is a stencil (dx by dy of it is used, it may
37: * be bigger) which is placed on the drawable at xOrg, yOrg. Where a 1 bit
38: * is set in the bitmap, the fill style is put onto the drawable using
39: * the GC's logical function. The drawable is not changed where the bitmap
40: * has a zero bit or outside the area covered by the stencil.
41: */
42: void
43: mfbPushPixels(pGC, pBitMap, pDrawable, dx, dy, xOrg, yOrg)
44: GCPtr pGC;
45: PixmapPtr pBitMap;
46: DrawablePtr pDrawable;
47: int dx, dy, xOrg, yOrg;
48: {
49: int h, dxDiv32, ibEnd;
50: unsigned int *pwLineStart;
51: register unsigned int *pw, *pwEnd;
52: register unsigned int mask;
53: register int ib, w;
54: register int ipt; /* index into above arrays */
55: Bool fInBox;
56: DDXPointRec pt[NPT];
57: int width[NPT];
58:
59: /* Now scan convert the pixmap and use the result to call fillspans in
60: * in the drawable with the original GC */
61: ipt = 0;
62: dxDiv32 = dx/32;
63: for(h = 0; h < dy; h++)
64: {
65:
66: pw = (unsigned int *)
67: (((char *)(pBitMap->devPrivate))+(h * pBitMap->devKind));
68: pwLineStart = pw;
69: /* Process all words which are fully in the pixmap */
70:
71: fInBox = FALSE;
72: pwEnd = pwLineStart + dxDiv32;
73: while(pw < pwEnd)
74: {
75: w = *pw;
76: mask = endtab[1];
77: for(ib = 0; ib < 32; ib++)
78: {
79: if(w & mask)
80: {
81: if(!fInBox)
82: {
83: pt[ipt].x = ((pw - pwLineStart) << 5) + ib + xOrg;
84: pt[ipt].y = h + yOrg;
85: /* start new box */
86: fInBox = TRUE;
87: }
88: }
89: else
90: {
91: if(fInBox)
92: {
93: width[ipt] = ((pw - pwLineStart) << 5) +
94: ib + xOrg - pt[ipt].x;
95: if (++ipt >= NPT)
96: {
97: (*pGC->FillSpans)(pDrawable, pGC, NPT, pt,
98: width, TRUE);
99: ipt = 0;
100: }
101: /* end box */
102: fInBox = FALSE;
103: }
104: }
105: mask = SCRRIGHT(mask, 1);
106: }
107: pw++;
108: }
109: ibEnd = dx & 0x1F;
110: if(ibEnd)
111: {
112: /* Process final partial word on line */
113: w = *pw;
114: mask = endtab[1];
115: for(ib = 0; ib < ibEnd; ib++)
116: {
117: if(w & mask)
118: {
119: if(!fInBox)
120: {
121: /* start new box */
122: pt[ipt].x = ((pw - pwLineStart) << 5) + ib + xOrg;
123: pt[ipt].y = h + yOrg;
124: fInBox = TRUE;
125: }
126: }
127: else
128: {
129: if(fInBox)
130: {
131: /* end box */
132: width[ipt] = ((pw - pwLineStart) << 5) +
133: ib + xOrg - pt[ipt].x;
134: if (++ipt >= NPT)
135: {
136: (*pGC->FillSpans)(pDrawable, pGC, NPT, pt,
137: width, TRUE);
138: ipt = 0;
139: }
140: fInBox = FALSE;
141: }
142: }
143: mask = SCRRIGHT(mask, 1);
144: }
145: }
146: /* If scanline ended with last bit set, end the box */
147: if(fInBox)
148: {
149: width[ipt] = ((pw - pwLineStart) << 5) + ib + xOrg - pt[ipt].x;
150: if (++ipt >= NPT)
151: {
152: (*pGC->FillSpans)(pDrawable, pGC, NPT, pt, width, TRUE);
153: ipt = 0;
154: }
155: }
156: }
157: /* Flush any remaining spans */
158: if (ipt)
159: {
160: (*pGC->FillSpans)(pDrawable, pGC, ipt, pt, width, TRUE);
161: }
162: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.