|
|
1.1 root 1: /* $Header: mfbwindow.c,v 1.2 87/09/03 13:48:44 toddb Exp $ */
2: /***********************************************************
3: Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
4: and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
5:
6: All Rights Reserved
7:
8: Permission to use, copy, modify, and distribute this software and its
9: documentation for any purpose and without fee is hereby granted,
10: provided that the above copyright notice appear in all copies and that
11: both that copyright notice and this permission notice appear in
12: supporting documentation, and that the names of Digital or MIT not be
13: used in advertising or publicity pertaining to distribution of the
14: software without specific, written prior permission.
15:
16: DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
17: ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
18: DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
19: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
20: WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
21: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
22: SOFTWARE.
23:
24: ******************************************************************/
25:
26: #include "X.h"
27: #include "scrnintstr.h"
28: #include "windowstr.h"
29: #include "mfb.h"
30: #include "mistruct.h"
31: #include "regionstr.h"
32:
33: extern WindowRec WindowTable[];
34:
35: Bool mfbCreateWindow(pWin)
36: register WindowPtr pWin;
37: {
38: register mfbPrivWin *pPrivWin;
39:
40: pWin->ClearToBackground = miClearToBackground;
41: pWin->PaintWindowBackground = mfbPaintWindowNone;
42: pWin->PaintWindowBorder = mfbPaintWindowPR;
43:
44: pWin->CopyWindow = mfbCopyWindow;
45: if(!(pPrivWin = (mfbPrivWin *)Xalloc(sizeof(mfbPrivWin))))
46: return (FALSE);
47: pWin->devPrivate = (pointer)pPrivWin;
48: pPrivWin->pRotatedBorder = NullPixmap;
49: pPrivWin->pRotatedBackground = NullPixmap;
50: pPrivWin->fastBackground = 0;
51: pPrivWin->fastBorder = 0;
52:
53: /* backing store stuff
54: is this ever called with backing store turned on ???
55: */
56: if ((pWin->backingStore == WhenMapped) ||
57: (pWin->backingStore == Always))
58: {
59: }
60: else
61: {
62: }
63: return (TRUE);
64: }
65:
66: /* This always returns true, because Xfree can't fail. It might be possible
67: * on some devices for Destroy to fail */
68: Bool
69: mfbDestroyWindow(pWin)
70: WindowPtr pWin;
71: {
72: register mfbPrivWin *pPrivWin;
73:
74: pPrivWin = (mfbPrivWin *)(pWin->devPrivate);
75:
76: /* mfbDestroyPixmap() deals with any NULL pointers */
77: mfbDestroyPixmap(pPrivWin->pRotatedBorder);
78: mfbDestroyPixmap(pPrivWin->pRotatedBackground);
79: Xfree(pWin->devPrivate);
80: return (TRUE);
81: }
82:
83: Bool mfbMapWindow(pWindow)
84: WindowPtr pWindow;
85: {
86: return (TRUE);
87: }
88:
89: /* (x, y) is the upper left corner of the window on the screen
90: do we really need to pass this? (is it a;ready in pWin->absCorner?)
91: we only do the rotation for pixmaps that are 32 bits wide (padded
92: or otherwise.)
93: mfbChangeWindowAttributes() has already put a copy of the pixmap
94: in pPrivWin->pRotated*
95: */
96:
97: Bool
98: mfbPositionWindow(pWin, x, y)
99: register WindowPtr pWin;
100: int x, y;
101: {
102: register mfbPrivWin *pPrivWin;
103:
104: pPrivWin = (mfbPrivWin *)(pWin->devPrivate);
105: if (IS_VALID_PIXMAP(pWin->backgroundTile) &&
106: (pPrivWin->fastBackground != 0))
107: {
108: mfbXRotatePixmap(pPrivWin->pRotatedBackground,
109: pWin->absCorner.x - pPrivWin->oldRotate.x);
110: mfbYRotatePixmap(pPrivWin->pRotatedBackground,
111: pWin->absCorner.y - pPrivWin->oldRotate.y);
112: }
113:
114: if (IS_VALID_PIXMAP(pWin->borderTile) &&
115: (pPrivWin->fastBorder != 0))
116: {
117: mfbXRotatePixmap(pPrivWin->pRotatedBorder,
118: pWin->absCorner.x - pPrivWin->oldRotate.x);
119: mfbYRotatePixmap(pPrivWin->pRotatedBorder,
120: pWin->absCorner.y - pPrivWin->oldRotate.y);
121: }
122: if ( (IS_VALID_PIXMAP(pWin->borderTile) &&
123: (pPrivWin->fastBorder != 0))
124: ||
125: (IS_VALID_PIXMAP(pWin->backgroundTile) &&
126: (pPrivWin->fastBackground != 0)))
127: {
128: pPrivWin->oldRotate.x = pWin->absCorner.x;
129: pPrivWin->oldRotate.y = pWin->absCorner.y;
130: }
131: /* Again, we have no failure modes indicated by any of the routines
132: * we've called, so we have to assume it worked */
133: return (TRUE);
134: }
135:
136: Bool
137: mfbUnmapWindow(pWindow, x, y)
138: WindowPtr pWindow;
139: int x, y;
140: {
141: return (TRUE);
142: }
143:
144: /* UNCLEAN!
145: this code calls the bitblt helper code directly.
146:
147: mfbCopyWindow copies only the parts of the destination that are
148: visible in the source.
149: */
150:
151:
152: void
153: mfbCopyWindow(pWin, ptOldOrg, prgnSrc)
154: WindowPtr pWin;
155: DDXPointRec ptOldOrg;
156: RegionPtr prgnSrc;
157: {
158: DDXPointPtr pptSrc;
159: register DDXPointPtr ppt;
160: RegionPtr prgnDst;
161: register BoxPtr pbox;
162: register int dx, dy;
163: register int i, nbox;
164: WindowPtr pwinRoot;
165:
166: pwinRoot = &WindowTable[pWin->drawable.pScreen->myNum];
167:
168: prgnDst = (* pWin->drawable.pScreen->RegionCreate)(NULL,
169: pWin->borderClip->numRects);
170:
171: dx = ptOldOrg.x - pWin->absCorner.x;
172: dy = ptOldOrg.y - pWin->absCorner.y;
173: (* pWin->drawable.pScreen->TranslateRegion)(prgnSrc, -dx, -dy);
174: (* pWin->drawable.pScreen->Intersect)(prgnDst, pWin->borderClip, prgnSrc);
175:
176: pbox = prgnDst->rects;
177: nbox = prgnDst->numRects;
178: if(!(pptSrc = (DDXPointPtr )ALLOCATE_LOCAL( prgnDst->numRects *
179: sizeof(DDXPointRec))))
180: return;
181: ppt = pptSrc;
182:
183: for (i=0; i<nbox; i++, ppt++, pbox++)
184: {
185: ppt->x = pbox->x1 + dx;
186: ppt->y = pbox->y1 + dy;
187: }
188:
189: mfbDoBitblt(pwinRoot, pwinRoot, GXcopy, prgnDst, pptSrc);
190: DEALLOCATE_LOCAL(pptSrc);
191: (* pWin->drawable.pScreen->RegionDestroy)(prgnDst);
192: }
193:
194:
195:
196: /* swap in correct PaintWindow* routine. If we can use a fast output
197: routine (i.e. the pixmap is paddable to 32 bits), also pre-rotate a copy
198: of it in devPrivate.
199: */
200: Bool
201: mfbChangeWindowAttributes(pWin, mask)
202: register WindowPtr pWin;
203: register int mask;
204: {
205: register int index;
206: register mfbPrivWin *pPrivWin;
207:
208: pPrivWin = (mfbPrivWin *)(pWin->devPrivate);
209: while(mask)
210: {
211: index = ffs(mask) -1;
212: mask &= ~(index = 1 << index);
213: switch(index)
214: {
215: case CWBackingStore:
216: /*
217: if ((pWin->backingStore == WhenMapped) ||
218: (pWin->backingStore == Always))
219: {
220: }
221: else
222: {
223: }
224: */
225: break;
226:
227: case CWBackPixmap:
228: switch((int)pWin->backgroundTile)
229: {
230: case None:
231: pWin->PaintWindowBackground = mfbPaintWindowNone;
232: pPrivWin->fastBackground = 0;
233: break;
234: case ParentRelative:
235: pWin->PaintWindowBackground = mfbPaintWindowPR;
236: pPrivWin->fastBackground = 0;
237: break;
238: case USE_BACKGROUND_PIXEL:
239: pWin->PaintWindowBackground = mfbPaintWindowSolid;
240: pPrivWin->fastBackground = 0;
241: break;
242: default:
243: if(mfbPadPixmap(pWin->backgroundTile))
244: {
245: pPrivWin->fastBackground = 1;
246: pPrivWin->oldRotate.x = pWin->absCorner.x;
247: pPrivWin->oldRotate.y = pWin->absCorner.y;
248: if (pPrivWin->pRotatedBackground)
249: mfbDestroyPixmap(pPrivWin->pRotatedBackground);
250: pPrivWin->pRotatedBackground =
251: mfbCopyPixmap(pWin->backgroundTile);
252: mfbXRotatePixmap(pPrivWin->pRotatedBackground,
253: pWin->absCorner.x);
254: mfbYRotatePixmap(pPrivWin->pRotatedBackground,
255: pWin->absCorner.y);
256: pWin->PaintWindowBackground = mfbPaintWindow32;
257: }
258: else
259: {
260: pPrivWin->fastBackground = 0;
261: pWin->PaintWindowBackground = miPaintWindow;
262: }
263: break;
264: }
265: break;
266:
267: case CWBackPixel:
268: pWin->PaintWindowBackground = mfbPaintWindowSolid;
269: pPrivWin->fastBackground = 0;
270: break;
271:
272: case CWBorderPixmap:
273: switch((int)pWin->borderTile)
274: {
275: case None:
276: pWin->PaintWindowBorder = mfbPaintWindowNone;
277: pPrivWin->fastBorder = 0;
278: break;
279: case ParentRelative:
280: pWin->PaintWindowBorder = mfbPaintWindowPR;
281: pPrivWin->fastBorder = 0;
282: break;
283: case USE_BORDER_PIXEL:
284: pWin->PaintWindowBorder = mfbPaintWindowSolid;
285: pPrivWin->fastBorder = 0;
286: break;
287: default:
288: if(mfbPadPixmap(pWin->borderTile))
289: {
290: pPrivWin->fastBorder = 1;
291: pPrivWin->oldRotate.x = pWin->absCorner.x;
292: pPrivWin->oldRotate.y = pWin->absCorner.y;
293: if (pPrivWin->pRotatedBorder)
294: mfbDestroyPixmap(pPrivWin->pRotatedBorder);
295: pPrivWin->pRotatedBorder =
296: mfbCopyPixmap(pWin->borderTile);
297: mfbXRotatePixmap(pPrivWin->pRotatedBorder,
298: pWin->absCorner.x);
299: mfbYRotatePixmap(pPrivWin->pRotatedBorder,
300: pWin->absCorner.y);
301: pWin->PaintWindowBorder = mfbPaintWindow32;
302: }
303: else
304: {
305: pPrivWin->fastBorder = 0;
306: pWin->PaintWindowBorder = miPaintWindow;
307: }
308: break;
309: }
310: break;
311: case CWBorderPixel:
312: pWin->PaintWindowBorder = mfbPaintWindowSolid;
313: pPrivWin->fastBorder = 0;
314: break;
315:
316: }
317: }
318: /* Again, we have no failure modes indicated by any of the routines
319: * we've called, so we have to assume it worked */
320: return (TRUE);
321: }
322:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.