First import
[xorg_rtime.git] / xorg-server-1.4 / fb / fbsetsp.c
blob227ba4c6225a1984b56a4e9dfa3ccd803271df68
1 /*
2 * Copyright © 1998 Keith Packard
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.
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.
23 #ifdef HAVE_DIX_CONFIG_H
24 #include <dix-config.h>
25 #endif
27 #include "fb.h"
29 void
30 fbSetSpans (DrawablePtr pDrawable,
31 GCPtr pGC,
32 char *src,
33 DDXPointPtr ppt,
34 int *pwidth,
35 int nspans,
36 int fSorted)
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;
49 #ifdef FB_24_32BIT
50 if (pDrawable->bitsPerPixel != BitsPerPixel(pDrawable->depth))
52 fb24_32SetSpans (pDrawable, pGC, src, ppt, pwidth, nspans, fSorted);
53 return;
55 #endif
56 fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
57 while (nspans--)
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 = REGION_NUM_RECTS(pClip);
64 pbox = REGION_RECTS (pClip);
65 while (n--)
67 if (pbox->y1 > ppt->y)
68 break;
69 if (pbox->y2 > ppt->y)
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,
80 (x1 - ppt->x) * dstBpp + xoff,
82 dstStride,
83 (x1 + dstXoff) * dstBpp,
85 (x2 - x1) * dstBpp,
87 pGC->alu,
88 pPriv->pm,
89 dstBpp,
91 FALSE,
92 FALSE);
95 src += PixmapBytePad (*pwidth, pDrawable->depth);
96 ppt++;
97 pwidth++;
99 fbValidateDrawable (pDrawable);
100 fbFinishAccess (pDrawable);