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