(file) Return to fbwindow.c CVS log (file) (dir) Up to [XFree86 CVS] / xc / programs / Xserver / fb

  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              }

Powered by
ViewCVS 0.9.2