Commit | Line | Data |
---|---|---|
a09e091a JB |
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 | ||
29 | void | |
30 | fbFillSpans(DrawablePtr pDrawable, | |
31 | GCPtr pGC, int n, DDXPointPtr ppt, int *pwidth, int fSorted) | |
32 | { | |
33 | RegionPtr pClip = fbGetCompositeClip(pGC); | |
34 | BoxPtr pextent, pbox; | |
35 | int nbox; | |
36 | int extentX1, extentX2, extentY1, extentY2; | |
37 | int fullX1, fullX2, fullY1; | |
38 | int partX1, partX2; | |
39 | ||
40 | pextent = RegionExtents(pClip); | |
41 | extentX1 = pextent->x1; | |
42 | extentY1 = pextent->y1; | |
43 | extentX2 = pextent->x2; | |
44 | extentY2 = pextent->y2; | |
45 | while (n--) { | |
46 | fullX1 = ppt->x; | |
47 | fullY1 = ppt->y; | |
48 | fullX2 = fullX1 + (int) *pwidth; | |
49 | ppt++; | |
50 | pwidth++; | |
51 | ||
52 | if (fullY1 < extentY1 || extentY2 <= fullY1) | |
53 | continue; | |
54 | ||
55 | if (fullX1 < extentX1) | |
56 | fullX1 = extentX1; | |
57 | ||
58 | if (fullX2 > extentX2) | |
59 | fullX2 = extentX2; | |
60 | ||
61 | if (fullX1 >= fullX2) | |
62 | continue; | |
63 | ||
64 | nbox = RegionNumRects(pClip); | |
65 | if (nbox == 1) { | |
66 | fbFill(pDrawable, pGC, fullX1, fullY1, fullX2 - fullX1, 1); | |
67 | } | |
68 | else { | |
69 | pbox = RegionRects(pClip); | |
70 | while (nbox--) { | |
71 | if (pbox->y1 <= fullY1 && fullY1 < pbox->y2) { | |
72 | partX1 = pbox->x1; | |
73 | if (partX1 < fullX1) | |
74 | partX1 = fullX1; | |
75 | partX2 = pbox->x2; | |
76 | if (partX2 > fullX2) | |
77 | partX2 = fullX2; | |
78 | if (partX2 > partX1) { | |
79 | fbFill(pDrawable, pGC, | |
80 | partX1, fullY1, partX2 - partX1, 1); | |
81 | } | |
82 | } | |
83 | pbox++; | |
84 | } | |
85 | } | |
86 | } | |
87 | } |