1706f2543Smrg
2706f2543Smrg#ifdef HAVE_XORG_CONFIG_H
3706f2543Smrg#include <xorg-config.h>
4706f2543Smrg#endif
5706f2543Smrg
6706f2543Smrg#include "misc.h"
7706f2543Smrg#include "xf86.h"
8706f2543Smrg#include "xf86_OSproc.h"
9706f2543Smrg
10706f2543Smrg#include <X11/X.h>
11706f2543Smrg#include "scrnintstr.h"
12706f2543Smrg#include "pixmapstr.h"
13706f2543Smrg#include "xf86str.h"
14706f2543Smrg#include "xaa.h"
15706f2543Smrg#include "xaalocal.h"
16706f2543Smrg
17706f2543Smrg/*
18706f2543Smrg   Much of this file based on code by
19706f2543Smrg	Harm Hanemaayer (H.Hanemaayer@inter.nl.net).
20706f2543Smrg*/
21706f2543Smrg
22706f2543Smrg
23706f2543Smrgvoid
24706f2543SmrgXAAPolyRectangleThinSolid(
25706f2543Smrg    DrawablePtr  pDrawable,
26706f2543Smrg    GCPtr        pGC,
27706f2543Smrg    int	         nRectsInit,
28706f2543Smrg    xRectangle  *pRectsInit )
29706f2543Smrg{
30706f2543Smrg    XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC);
31706f2543Smrg    int         nClipRects;     /* number of clip rectangles */
32706f2543Smrg    BoxPtr      pClipRects;     /* points to the list of clip rects */
33706f2543Smrg    int         xOrigin;        /* Drawables x origin */
34706f2543Smrg    int         yOrigin;        /* Drawables x origin */
35706f2543Smrg    xRectangle *pRect;          /* list of rects */
36706f2543Smrg    int         nRects;         /* running count of number of rects */
37706f2543Smrg    int         origX1, origY1; /* original rectangle's U/L corner */
38706f2543Smrg    int         origX2, origY2; /* original rectangle's L/R corner */
39706f2543Smrg    int         clippedX1;      /* clipped rectangle's left x */
40706f2543Smrg    int         clippedY1;      /* clipped rectangle's top y */
41706f2543Smrg    int         clippedX2;      /* clipped rectangle's right x */
42706f2543Smrg    int         clippedY2;      /* clipped rectangle's bottom y */
43706f2543Smrg    int         clipXMin;       /* upper left corner of clip rect */
44706f2543Smrg    int         clipYMin;       /* upper left corner of clip rect */
45706f2543Smrg    int         clipXMax;       /* lower right corner of clip rect */
46706f2543Smrg    int         clipYMax;       /* lower right corner of clip rect */
47706f2543Smrg    int         width, height;  /* width and height of rect */
48706f2543Smrg
49706f2543Smrg    nClipRects = RegionNumRects(pGC->pCompositeClip);
50706f2543Smrg    pClipRects = RegionRects(pGC->pCompositeClip);
51706f2543Smrg
52706f2543Smrg    if(!nClipRects) return;
53706f2543Smrg
54706f2543Smrg    xOrigin = pDrawable->x;
55706f2543Smrg    yOrigin = pDrawable->y;
56706f2543Smrg
57706f2543Smrg
58706f2543Smrg    (*infoRec->SetupForSolidLine)(infoRec->pScrn,
59706f2543Smrg			pGC->fgPixel, pGC->alu, pGC->planemask);
60706f2543Smrg
61706f2543Smrg
62706f2543Smrg    for ( ; nClipRects > 0;
63706f2543Smrg	  nClipRects--, pClipRects++ )
64706f2543Smrg    {
65706f2543Smrg        clipYMin = pClipRects->y1;
66706f2543Smrg        clipYMax = pClipRects->y2 - 1;
67706f2543Smrg        clipXMin = pClipRects->x1;
68706f2543Smrg        clipXMax = pClipRects->x2 - 1;
69706f2543Smrg
70706f2543Smrg	for (pRect = pRectsInit, nRects = nRectsInit;
71706f2543Smrg	     nRects > 0;
72706f2543Smrg	     nRects--, pRect++ )
73706f2543Smrg        {
74706f2543Smrg	    /* translate rectangle data over to the drawable */
75706f2543Smrg            origX1 = pRect->x + xOrigin;
76706f2543Smrg	    origY1 = pRect->y + yOrigin;
77706f2543Smrg            origX2 = origX1 + pRect->width;
78706f2543Smrg	    origY2 = origY1 + pRect->height;
79706f2543Smrg
80706f2543Smrg	    /* reject entire rectangle if completely outside clip rect */
81706f2543Smrg	    if ((origX1 > clipXMax) || (origX2 < clipXMin) ||
82706f2543Smrg		(origY1 > clipYMax) || (origY2 < clipYMin))
83706f2543Smrg	        continue;
84706f2543Smrg
85706f2543Smrg	    /* clip the rectangle */
86706f2543Smrg	    clippedX1 = max (origX1, clipXMin);
87706f2543Smrg	    clippedX2 = min (origX2, clipXMax);
88706f2543Smrg	    clippedY1 = max (origY1, clipYMin);
89706f2543Smrg	    clippedY2 = min (origY2, clipYMax);
90706f2543Smrg
91706f2543Smrg	    width = clippedX2 - clippedX1 + 1;
92706f2543Smrg
93706f2543Smrg	    if (origY1 >= clipYMin) {
94706f2543Smrg		(*infoRec->SubsequentSolidHorVertLine)(infoRec->pScrn,
95706f2543Smrg			clippedX1, clippedY1, width, DEGREES_0);
96706f2543Smrg
97706f2543Smrg		/* don't overwrite corner */
98706f2543Smrg		clippedY1++;
99706f2543Smrg	    }
100706f2543Smrg
101706f2543Smrg	    if ((origY2 <= clipYMax) && (origY1 != origY2)) {
102706f2543Smrg		(*infoRec->SubsequentSolidHorVertLine)(infoRec->pScrn,
103706f2543Smrg			clippedX1, clippedY2, width, DEGREES_0);
104706f2543Smrg
105706f2543Smrg		/* don't overwrite corner */
106706f2543Smrg		clippedY2--;
107706f2543Smrg	    }
108706f2543Smrg
109706f2543Smrg	    if (clippedY2 < clippedY1) continue;
110706f2543Smrg
111706f2543Smrg	    height = clippedY2 - clippedY1 + 1;
112706f2543Smrg
113706f2543Smrg	    /* draw vertical edges using lines if not clipped out */
114706f2543Smrg            if (origX1 >= clipXMin)
115706f2543Smrg		(*infoRec->SubsequentSolidHorVertLine)(infoRec->pScrn,
116706f2543Smrg			clippedX1, clippedY1, height, DEGREES_270);
117706f2543Smrg
118706f2543Smrg            if ((origX2 <= clipXMax) && (origX2 != origX1))
119706f2543Smrg		(*infoRec->SubsequentSolidHorVertLine)(infoRec->pScrn,
120706f2543Smrg			clippedX2, clippedY1, height, DEGREES_270);
121706f2543Smrg	}
122706f2543Smrg    }
123706f2543Smrg
124706f2543Smrg    SET_SYNC_FLAG(infoRec);
125706f2543Smrg}
126706f2543Smrg
127706f2543Smrg
128706f2543Smrg
129706f2543Smrg
130706f2543Smrg
131706f2543Smrg
132706f2543Smrg
133706f2543Smrg
134706f2543Smrg
135706f2543Smrg
136706f2543Smrg
137