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
fbFillSpans(DrawablePtr pDrawable,GCPtr pGC,int n,DDXPointPtr ppt,int * pwidth,int fSorted)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 }
88