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
30fbSetSpans (DrawablePtr	    pDrawable,
31	    GCPtr	    pGC,
32	    char	    *src,
33	    DDXPointPtr	    ppt,
34	    int		    *pwidth,
35	    int		    nspans,
36	    int		    fSorted)
37{
38    FbGCPrivPtr	    pPriv = fbGetGCPrivate (pGC);
39    RegionPtr	    pClip = fbGetCompositeClip(pGC);
40    FbBits	    *dst, *d, *s;
41    FbStride	    dstStride;
42    int		    dstBpp;
43    int		    dstXoff, dstYoff;
44    BoxPtr	    pbox;
45    int		    n;
46    int		    xoff;
47    int		    x1, x2;
48
49#ifdef FB_24_32BIT
50    if (pDrawable->bitsPerPixel != BitsPerPixel(pDrawable->depth))
51    {
52	fb24_32SetSpans (pDrawable, pGC, src, ppt, pwidth, nspans, fSorted);
53	return;
54    }
55#endif
56    fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
57    while (nspans--)
58    {
59	d = dst + (ppt->y + dstYoff) * dstStride;
60	xoff = (int) (((long) src) & (FB_MASK >> 3));
61	s = (FbBits *) (src - xoff);
62	xoff <<= 3;
63	n = RegionNumRects(pClip);
64	pbox = RegionRects (pClip);
65	while (n--)
66	{
67	    if (pbox->y1 > ppt->y)
68		break;
69	    if (pbox->y2 > ppt->y)
70	    {
71		x1 = ppt->x;
72		x2 = x1 + *pwidth;
73		if (pbox->x1 > x1)
74		    x1 = pbox->x1;
75		if (pbox->x2 < x2)
76		    x2 = pbox->x2;
77		if (x1 < x2)
78		    fbBlt ((FbBits *) s,
79			   0,
80			   (x1 - ppt->x) * dstBpp + xoff,
81			   d,
82			   dstStride,
83			   (x1 + dstXoff) * dstBpp,
84
85			   (x2 - x1) * dstBpp,
86			   1,
87			   pGC->alu,
88			   pPriv->pm,
89			   dstBpp,
90
91			   FALSE,
92			   FALSE);
93	    }
94	}
95	src += PixmapBytePad (*pwidth, pDrawable->depth);
96	ppt++;
97	pwidth++;
98    }
99    fbValidateDrawable (pDrawable);
100    fbFinishAccess (pDrawable);
101}
102
103