1 hohndel 1.1 /*
2 * Copyright © 1998 Keith Packard
3 *
4 * Permission to use, copy, modify, distribute, and sell this software and its
5 * documentation for any purpose is hereby granted without fee, provided that
6 * the above copyright notice appear in all copies and that both that
7 * copyright notice and this permission notice appear in supporting
8 * documentation, and that the name of Keith Packard not be used in
9 * advertising or publicity pertaining to distribution of the software without
10 * specific, written prior permission. Keith Packard makes no
11 * representations about the suitability of this software for any purpose. It
12 * is provided "as is" without express or implied warranty.
13 *
14 * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16 * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20 * PERFORMANCE OF THIS SOFTWARE.
21 */
|
22 dawes 1.12 /* $XFree86: xc/programs/Xserver/fb/fbwindow.c,v 1.11 2003/11/10 18:21:47 tsi Exp $ */
|
23 hohndel 1.1
24 #include "fb.h"
|
25 dawes 1.5 #ifdef IN_MODULE
26 #include "xf86_ansic.h"
27 #endif
|
28 hohndel 1.1
29 Bool
30 fbCreateWindow(WindowPtr pWin)
31 {
|
32 keithp 1.6 #ifndef FB_NO_WINDOW_PIXMAPS
33 pWin->devPrivates[fbWinPrivateIndex].ptr =
34 (pointer) fbGetScreenPixmap(pWin->drawable.pScreen);
35 #endif
36 #ifdef FB_SCREEN_PRIVATE
37 if (pWin->drawable.bitsPerPixel == 32)
38 pWin->drawable.bitsPerPixel = fbGetScreenPrivate(pWin->drawable.pScreen)->win32bpp;
39 #endif
|
40 hohndel 1.1 return TRUE;
41 }
42
43 Bool
44 fbDestroyWindow(WindowPtr pWin)
45 {
46 return TRUE;
47 }
48
49 Bool
50 fbMapWindow(WindowPtr pWindow)
51 {
52 return TRUE;
53 }
54
55 Bool
56 fbPositionWindow(WindowPtr pWin, int x, int y)
57 {
58 return TRUE;
59 }
60
61 hohndel 1.1 Bool
62 fbUnmapWindow(WindowPtr pWindow)
63 {
64 return TRUE;
65 }
66
67 void
68 fbCopyWindowProc (DrawablePtr pSrcDrawable,
69 DrawablePtr pDstDrawable,
70 GCPtr pGC,
71 BoxPtr pbox,
72 int nbox,
73 int dx,
74 int dy,
75 Bool reverse,
76 Bool upsidedown,
77 Pixel bitplane,
78 void *closure)
79 {
80 FbBits *src;
81 FbStride srcStride;
82 hohndel 1.1 int srcBpp;
|
83 keithp 1.8 int srcXoff, srcYoff;
|
84 hohndel 1.1 FbBits *dst;
85 FbStride dstStride;
86 int dstBpp;
|
87 keithp 1.8 int dstXoff, dstYoff;
|
88 hohndel 1.1
|
89 keithp 1.8 fbGetDrawable (pSrcDrawable, src, srcStride, srcBpp, srcXoff, srcYoff);
90 fbGetDrawable (pDstDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
|
91 hohndel 1.1
92 while (nbox--)
93 {
|
94 keithp 1.8 fbBlt (src + (pbox->y1 + dy + srcYoff) * srcStride,
|
95 hohndel 1.1 srcStride,
|
96 keithp 1.8 (pbox->x1 + dx + srcXoff) * srcBpp,
|
97 hohndel 1.1
|
98 keithp 1.8 dst + (pbox->y1 + dstYoff) * dstStride,
|
99 hohndel 1.1 dstStride,
|
100 keithp 1.8 (pbox->x1 + dstXoff) * dstBpp,
|
101 hohndel 1.1
102 (pbox->x2 - pbox->x1) * dstBpp,
103 (pbox->y2 - pbox->y1),
104
105 GXcopy,
106 FB_ALLONES,
107 dstBpp,
108
109 reverse,
110 upsidedown);
111 pbox++;
112 }
113 }
114
115 void
116 fbCopyWindow(WindowPtr pWin,
117 DDXPointRec ptOldOrg,
118 RegionPtr prgnSrc)
119 {
120 RegionRec rgnDst;
121 int dx, dy;
122 hohndel 1.1 WindowPtr pwinRoot;
123
124 pwinRoot = WindowTable[pWin->drawable.pScreen->myNum];
125
126 dx = ptOldOrg.x - pWin->drawable.x;
127 dy = ptOldOrg.y - pWin->drawable.y;
128 REGION_TRANSLATE(pWin->drawable.pScreen, prgnSrc, -dx, -dy);
129
|
130 tsi 1.11 REGION_NULL (pWin->drawable.pScreen, &rgnDst);
|
131 hohndel 1.1
132 REGION_INTERSECT(pWin->drawable.pScreen, &rgnDst, &pWin->borderClip, prgnSrc);
133
134 fbCopyRegion ((DrawablePtr)pwinRoot, (DrawablePtr)pwinRoot,
135 0,
136 &rgnDst, dx, dy, fbCopyWindowProc, 0, 0);
137
138 REGION_UNINIT(pWin->drawable.pScreen, &rgnDst);
139 fbValidateDrawable (&pWin->drawable);
140 }
141
142 Bool
143 fbChangeWindowAttributes(WindowPtr pWin, unsigned long mask)
144 {
145 PixmapPtr pPixmap;
146
147 if (mask & CWBackPixmap)
148 {
149 if (pWin->backgroundState == BackgroundPixmap)
150 {
151 pPixmap = pWin->background.pixmap;
|
152 keithp 1.6 #ifdef FB_24_32BIT
153 if (pPixmap->drawable.bitsPerPixel != pWin->drawable.bitsPerPixel)
154 {
155 pPixmap = fb24_32ReformatTile (pPixmap,
156 pWin->drawable.bitsPerPixel);
157 if (pPixmap)
|
158 keithp 1.7 {
159 (*pWin->drawable.pScreen->DestroyPixmap) (pWin->background.pixmap);
|
160 keithp 1.6 pWin->background.pixmap = pPixmap;
|
161 keithp 1.7 }
|
162 keithp 1.6 }
163 #endif
|
164 hohndel 1.1 if (FbEvenTile (pPixmap->drawable.width *
165 pPixmap->drawable.bitsPerPixel))
166 fbPadPixmap (pPixmap);
167 }
168 }
169 if (mask & CWBorderPixmap)
170 {
171 if (pWin->borderIsPixel == FALSE)
172 {
173 pPixmap = pWin->border.pixmap;
|
174 keithp 1.6 #ifdef FB_24_32BIT
175 if (pPixmap->drawable.bitsPerPixel !=
176 pWin->drawable.bitsPerPixel)
177 {
178 pPixmap = fb24_32ReformatTile (pPixmap,
179 pWin->drawable.bitsPerPixel);
180 if (pPixmap)
|
181 keithp 1.7 {
182 (*pWin->drawable.pScreen->DestroyPixmap) (pWin->border.pixmap);
|
183 keithp 1.6 pWin->border.pixmap = pPixmap;
|
184 keithp 1.7 }
|
185 keithp 1.6 }
186 #endif
|
187 hohndel 1.1 if (FbEvenTile (pPixmap->drawable.width *
188 pPixmap->drawable.bitsPerPixel))
189 fbPadPixmap (pPixmap);
190 }
191 }
192 return TRUE;
193 }
194
195 void
196 fbFillRegionSolid (DrawablePtr pDrawable,
197 RegionPtr pRegion,
198 FbBits and,
199 FbBits xor)
200 {
201 FbBits *dst;
202 FbStride dstStride;
203 int dstBpp;
|
204 keithp 1.8 int dstXoff, dstYoff;
|
205 hohndel 1.1 int n = REGION_NUM_RECTS(pRegion);
206 BoxPtr pbox = REGION_RECTS(pRegion);
207
|
208 keithp 1.8 fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
|
209 hohndel 1.1
210 while (n--)
211 {
|
212 keithp 1.8 fbSolid (dst + (pbox->y1 + dstYoff) * dstStride,
|
213 hohndel 1.1 dstStride,
|
214 keithp 1.8 (pbox->x1 + dstXoff) * dstBpp,
|
215 hohndel 1.1 dstBpp,
216 (pbox->x2 - pbox->x1) * dstBpp,
217 pbox->y2 - pbox->y1,
218 and, xor);
219 fbValidateDrawable (pDrawable);
220 pbox++;
221 }
222 }
223
|
224 keithp 1.9 #ifdef PANORAMIX
225 #include "panoramiX.h"
226 #include "panoramiXsrv.h"
227 #endif
228
|
229 hohndel 1.1 void
230 fbFillRegionTiled (DrawablePtr pDrawable,
231 RegionPtr pRegion,
232 PixmapPtr pTile)
233 {
234 FbBits *dst;
235 FbStride dstStride;
236 int dstBpp;
|
237 keithp 1.8 int dstXoff, dstYoff;
|
238 hohndel 1.1 FbBits *tile;
239 FbStride tileStride;
|
240 keithp 1.8 int tileBpp;
241 int tileXoff, tileYoff; /* XXX assumed to be zero */
242 int tileWidth, tileHeight;
243 int n = REGION_NUM_RECTS(pRegion);
244 BoxPtr pbox = REGION_RECTS(pRegion);
|
245 keithp 1.9 int xRot = pDrawable->x;
246 int yRot = pDrawable->y;
247
248 #ifdef PANORAMIX
249 if(!noPanoramiXExtension)
250 {
251 int index = pDrawable->pScreen->myNum;
252 if(&WindowTable[index]->drawable == pDrawable)
253 {
254 xRot -= panoramiXdataPtr[index].x;
255 yRot -= panoramiXdataPtr[index].y;
256 }
257 }
258 #endif
|
259 keithp 1.8 fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
260 fbGetDrawable (&pTile->drawable, tile, tileStride, tileBpp, tileXoff, tileYoff);
|
261 hohndel 1.1 tileWidth = pTile->drawable.width;
262 tileHeight = pTile->drawable.height;
|
263 torrey 1.10 xRot += dstXoff;
264 yRot += dstYoff;
|
265 hohndel 1.1
266 while (n--)
267 {
|
268 keithp 1.8 fbTile (dst + (pbox->y1 + dstYoff) * dstStride,
|
269 hohndel 1.1 dstStride,
|
270 keithp 1.8 (pbox->x1 + dstXoff) * dstBpp,
|
271 hohndel 1.1 (pbox->x2 - pbox->x1) * dstBpp,
272 pbox->y2 - pbox->y1,
273 tile,
274 tileStride,
275 tileWidth * dstBpp,
276 tileHeight,
277 GXcopy,
278 FB_ALLONES,
279 dstBpp,
|
280 keithp 1.9 xRot * dstBpp,
281 yRot - pbox->y1);
|
282 hohndel 1.1 pbox++;
283 }
284 }
285
286 void
287 fbPaintWindow(WindowPtr pWin, RegionPtr pRegion, int what)
288 {
289 WindowPtr pBgWin;
290
291 switch (what) {
292 case PW_BACKGROUND:
293 switch (pWin->backgroundState) {
294 case None:
295 break;
296 case ParentRelative:
297 do {
298 pWin = pWin->parent;
299 } while (pWin->backgroundState == ParentRelative);
300 (*pWin->drawable.pScreen->PaintWindowBackground)(pWin, pRegion,
301 what);
302 break;
303 hohndel 1.1 case BackgroundPixmap:
304 fbFillRegionTiled (&pWin->drawable,
305 pRegion,
306 pWin->background.pixmap);
307 break;
308 case BackgroundPixel:
309 fbFillRegionSolid (&pWin->drawable,
310 pRegion,
311 0,
312 fbReplicatePixel (pWin->background.pixel,
313 pWin->drawable.bitsPerPixel));
314 break;
315 }
316 break;
317 case PW_BORDER:
318 if (pWin->borderIsPixel)
319 {
320 fbFillRegionSolid (&pWin->drawable,
321 pRegion,
322 0,
323 fbReplicatePixel (pWin->border.pixel,
324 hohndel 1.1 pWin->drawable.bitsPerPixel));
325 }
326 else
327 {
328 for (pBgWin = pWin;
329 pBgWin->backgroundState == ParentRelative;
330 pBgWin = pBgWin->parent);
331
332 fbFillRegionTiled (&pBgWin->drawable,
333 pRegion,
334 pWin->border.pixmap);
335 }
336 break;
337 }
338 fbValidateDrawable (&pWin->drawable);
339 }
|