|
|
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:
25: #include "X.h"
26: #include "Xmd.h"
27: #include "servermd.h"
28:
29: #include "misc.h"
30: #include "region.h"
31: #include "gc.h"
32: #include "windowstr.h"
33: #include "pixmapstr.h"
34: #include "scrnintstr.h"
35:
36: #include "cfb.h"
37: #include "cfbmskbits.h"
38:
39: /* GetSpans -- for each span, gets bits from drawable starting at ppt[i]
40: * and continuing for pwidth[i] bits
41: * Each scanline returned will be server scanline padded, i.e., it will come
42: * out to an integral number of words.
43: */
44: unsigned int *
45: cfbGetSpans(pDrawable, wMax, ppt, pwidth, nspans)
46: DrawablePtr pDrawable; /* drawable from which to get bits */
47: int wMax; /* largest value of all *pwidths */
48: register DDXPointPtr ppt; /* points to start copying from */
49: int *pwidth; /* list of number of bits to copy */
50: int nspans; /* number of scanlines to copy */
51: {
52: register unsigned int *pdst; /* where to put the bits */
53: register unsigned int *psrc; /* where to get the bits */
54: register unsigned int tmpSrc; /* scratch buffer for bits */
55: unsigned int *psrcBase; /* start of src bitmap */
56: int widthSrc; /* width of pixmap in bytes */
57: register DDXPointPtr pptLast; /* one past last point to get */
58: int xEnd; /* last pixel to copy from */
59: register int nstart;
60: int nend;
61: int srcStartOver;
62: int startmask, endmask, nlMiddle, nl, srcBit;
63: int w;
64: unsigned int *pdstStart;
65: unsigned int *pdstNext;
66:
67: switch (pDrawable->depth) {
68: case 1:
69: return (mfbGetSpans(pDrawable, wMax, ppt, pwidth, nspans));
70: case 8:
71: break;
72: default:
73: FatalError("cfbGetSpans: invalid depth\n");
74: }
75: pptLast = ppt + nspans;
76:
77: if (pDrawable->type == DRAWABLE_WINDOW)
78: {
79: psrcBase = (unsigned int *)
80: (((PixmapPtr)(pDrawable->pScreen->devPrivate))->devPrivate);
81: widthSrc = (int)
82: ((PixmapPtr)(pDrawable->pScreen->devPrivate))->devKind;
83:
84: /* translation should be done by caller of this subroutine
85: pptT = ppt;
86: while(pptT < pptLast)
87: {
88: pptT->x += ((WindowPtr)pDrawable)->absCorner.x;
89: pptT->y += ((WindowPtr)pDrawable)->absCorner.y;
90: pptT++;
91: }
92: */
93: }
94: else
95: {
96: psrcBase = (unsigned int *)(((PixmapPtr)pDrawable)->devPrivate);
97: widthSrc = (int)(((PixmapPtr)pDrawable)->devKind);
98: }
99: pdstStart = (unsigned int *)Xalloc(nspans * PixmapBytePad(wMax, PSZ));
100: pdst = pdstStart;
101:
102: while(ppt < pptLast)
103: {
104: xEnd = min(ppt->x + *pwidth, widthSrc << (PWSH-2) );
105: psrc = psrcBase + (ppt->y * (widthSrc >> 2)) + (ppt->x >> PWSH);
106: w = xEnd - ppt->x;
107: srcBit = ppt->x & PIM;
108: /* This shouldn't be needed */
109: pdstNext = pdst + PixmapWidthInPadUnits(w, PSZ);
110:
111: if (srcBit + w <= PPW)
112: {
113: getbits(psrc, srcBit, w, tmpSrc);
114: /*XXX*/ putbits(tmpSrc, 0, w, pdst, -1);
115: pdst++;
116: }
117: else
118: {
119:
120: maskbits(ppt->x, w, startmask, endmask, nlMiddle);
121: if (startmask)
122: nstart = PPW - srcBit;
123: else
124: nstart = 0;
125: if (endmask)
126: nend = xEnd & PIM;
127: srcStartOver = srcBit + nstart > PLST;
128: if (startmask)
129: {
130: getbits(psrc, srcBit, nstart, tmpSrc);
131: /*XXX*/ putbits(tmpSrc, 0, nstart, pdst, -1);
132: if(srcStartOver)
133: psrc++;
134: }
135: nl = nlMiddle;
136: while (nl--)
137: {
138: tmpSrc = *psrc;
139: /*XXX*/ putbits(tmpSrc, nstart, PPW, pdst, -1);
140: psrc++;
141: pdst++;
142: }
143: if (endmask)
144: {
145: getbits(psrc, 0, nend, tmpSrc);
146: /*XXX*/ putbits(tmpSrc, nstart, nend, pdst, -1);
147: if(nstart + nend >= PPW)
148: pdst++;
149: }
150: #ifdef notdef
151: pdst++;
152: while(pdst < pdstNext)
153: {
154: *pdst++ = 0;
155: }
156: #else
157: pdst = pdstNext;
158: #endif notdef
159: }
160: ppt++;
161: }
162: return(pdstStart);
163: }
164:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.