|
|
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: mfbimage.c,v 1.31 87/09/07 19:07:51 rws Exp $ */
25:
26: #include "X.h"
27:
28: #include "windowstr.h"
29: #include "pixmapstr.h"
30: #include "scrnintstr.h"
31: #include "gcstruct.h"
32:
33: #include "mfb.h"
34: #include "mi.h"
35: #include "Xmd.h"
36:
37: #include "maskbits.h"
38:
39: #include "servermd.h"
40:
41: /* Put and Get images on a monochrome frame buffer
42: *
43: * we do this by creating a temporary pixmap and making its
44: * pointer to bits point to the buffer read in from the client.
45: * this works because of the padding rules specified at startup
46: *
47: * Note that CopyArea must know how to copy a bitmap into the server-format
48: * temporary pixmap.
49: *
50: * For speed, mfbPutImage should allocate the temporary pixmap on the stack.
51: *
52: * even though an XYBitmap and an XYPixmap have the same
53: * format (for this device), PutImage has different semantics for the
54: * two. XYPixmap just does the copy; XYBitmap takes gc.fgPixel for
55: * a 1 bit, gc.bgPixel for a 0 bit, which we notice is exactly
56: * like CopyPlane.
57: *
58: * written by drewry, september 1986
59: */
60:
61:
62: void
63: mfbPutImage(dst, pGC, depth, x, y, w, h, leftPad, format, pImage)
64: DrawablePtr dst;
65: GCPtr pGC;
66: int depth, x, y, w, h;
67: int leftPad;
68: unsigned int format;
69: int *pImage;
70: {
71: pointer pbits;
72: PixmapPtr pFakePixmap;
73:
74: if (!(pGC->planemask & 1))
75: return;
76:
77: /* 0 may confuse CreatePixmap, and will sometimes be
78: passed by the mi text code
79: */
80: if ((w == 0) || (h == 0))
81: return;
82:
83: /* mfb is always depth 1 */
84: pFakePixmap = (PixmapPtr)mfbCreatePixmap(dst->pScreen, w+leftPad, h, 1);
85: if (!pFakePixmap)
86: {
87: ErrorF( "mfbPutImage can't make temp pixmap\n");
88: return;
89: }
90:
91: pbits = pFakePixmap->devPrivate;
92: pFakePixmap->devPrivate = (pointer)pImage;
93: ((mfbPrivGC *)(pGC->devPriv))->fExpose = FALSE;
94: if (format == XYPixmap)
95: (*pGC->CopyArea)(pFakePixmap, dst, pGC, leftPad, 0, w, h, x, y);
96: else
97: (*pGC->CopyPlane)(pFakePixmap, dst, pGC, leftPad, 0, w, h, x, y, 1);
98: ((mfbPrivGC*)(pGC->devPriv))->fExpose = TRUE;
99: pFakePixmap->devPrivate = pbits;
100: (*dst->pScreen->DestroyPixmap)(pFakePixmap);
101: }
102:
103:
104: /*
105: * pdstLine points to space allocated by caller, which he can do since
106: * he knows dimensions of the pixmap
107: * we can call mfbDoBitblt because the dispatcher has promised not to send us
108: * anything that would require going over the edge of the screen.
109: *
110: * XYPixmap and ZPixmap are the same for mfb.
111: * For any planemask with bit 0 == 0, just fill the dst with 0.
112: */
113: void
114: mfbGetImage( pDrawable, sx, sy, w, h, format, planeMask, pdstLine)
115: DrawablePtr pDrawable;
116: int sx, sy, w, h;
117: unsigned int format;
118: unsigned int planeMask;
119: pointer pdstLine;
120: {
121: int xorg, yorg;
122: PixmapPtr pPixmap;
123: BoxRec box;
124: DDXPointRec ptSrc;
125: RegionPtr prgnDst;
126: pointer pspare;
127:
128: if (planeMask & 0x1)
129: {
130: if (pDrawable->type == DRAWABLE_WINDOW)
131: {
132: xorg = ((WindowPtr)pDrawable)->absCorner.x;
133: yorg = ((WindowPtr)pDrawable)->absCorner.y;
134: }
135: else
136: {
137: xorg = 0;
138: yorg = 0;
139: }
140:
141: sx += xorg;
142: sy += yorg;
143:
144: pPixmap = (PixmapPtr)mfbCreatePixmap(pDrawable->pScreen, w, h, 1);
145: pspare = pPixmap->devPrivate;
146: pPixmap->devPrivate = pdstLine;
147: ptSrc.x = sx;
148: ptSrc.y = sy;
149: box.x1 = 0;
150: box.y1 = 0;
151: box.x2 = w;
152: box.y2 = h;
153:
154: prgnDst = (*pDrawable->pScreen->RegionCreate)(&box, 1);
155: mfbDoBitblt(pDrawable, pPixmap, GXcopy, prgnDst, &ptSrc);
156: (*pDrawable->pScreen->RegionDestroy)(prgnDst);
157: pPixmap->devPrivate = pspare;
158: mfbDestroyPixmap(pPixmap);
159: }
160: else
161: {
162: bzero(pdstLine, PixmapBytePad(w, 1) * h);
163: }
164: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.