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
23#ifdef HAVE_DIX_CONFIG_H
24#include <dix-config.h>
25#endif
26
27#include "fb.h"
28
29void
30fbGetSpans(DrawablePtr	pDrawable,
31	   int		wMax,
32	   DDXPointPtr	ppt,
33	   int		*pwidth,
34	   int		nspans,
35	   char		*pchardstStart)
36{
37    FbBits	    *src, *dst;
38    FbStride	    srcStride;
39    int		    srcBpp;
40    int		    srcXoff, srcYoff;
41    int		    xoff;
42
43    /*
44     * XFree86 DDX empties the root borderClip when the VT is
45     * switched away; this checks for that case
46     */
47    if (!fbDrawableEnabled(pDrawable))
48	return;
49
50#ifdef FB_24_32BIT
51    if (pDrawable->bitsPerPixel != BitsPerPixel(pDrawable->depth))
52    {
53	fb24_32GetSpans (pDrawable, wMax, ppt, pwidth, nspans, pchardstStart);
54	return;
55    }
56#endif
57
58    fbGetDrawable (pDrawable, src, srcStride, srcBpp, srcXoff, srcYoff);
59
60    while (nspans--)
61    {
62	xoff = (int) (((long) pchardstStart) & (FB_MASK >> 3));
63	dst = (FbBits *) (pchardstStart - xoff);
64	xoff <<= 3;
65	fbBlt (src + (ppt->y + srcYoff) * srcStride, srcStride,
66	       (ppt->x + srcXoff) * srcBpp,
67
68	       dst,
69	       1,
70	       xoff,
71
72	       *pwidth * srcBpp,
73	       1,
74
75	       GXcopy,
76	       FB_ALLONES,
77	       srcBpp,
78
79	       FALSE,
80	       FALSE);
81	pchardstStart += PixmapBytePad(*pwidth, pDrawable->depth);
82	ppt++;
83	pwidth++;
84    }
85
86    fbFinishAccess (pDrawable);
87}
88