1*4882a593Smuzhiyun /***********************************************************
2*4882a593Smuzhiyun
3*4882a593Smuzhiyun Copyright 1987, 1998 The Open Group
4*4882a593Smuzhiyun
5*4882a593Smuzhiyun Permission to use, copy, modify, distribute, and sell this software and its
6*4882a593Smuzhiyun documentation for any purpose is hereby granted without fee, provided that
7*4882a593Smuzhiyun the above copyright notice appear in all copies and that both that
8*4882a593Smuzhiyun copyright notice and this permission notice appear in supporting
9*4882a593Smuzhiyun documentation.
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun The above copyright notice and this permission notice shall be included in
12*4882a593Smuzhiyun all copies or substantial portions of the Software.
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15*4882a593Smuzhiyun IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*4882a593Smuzhiyun FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17*4882a593Smuzhiyun OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
18*4882a593Smuzhiyun AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19*4882a593Smuzhiyun CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun Except as contained in this notice, the name of The Open Group shall not be
22*4882a593Smuzhiyun used in advertising or otherwise to promote the sale, use or other dealings
23*4882a593Smuzhiyun in this Software without prior written authorization from The Open Group.
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun All Rights Reserved
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun Permission to use, copy, modify, and distribute this software and its
30*4882a593Smuzhiyun documentation for any purpose and without fee is hereby granted,
31*4882a593Smuzhiyun provided that the above copyright notice appear in all copies and that
32*4882a593Smuzhiyun both that copyright notice and this permission notice appear in
33*4882a593Smuzhiyun supporting documentation, and that the name of Digital not be
34*4882a593Smuzhiyun used in advertising or publicity pertaining to distribution of the
35*4882a593Smuzhiyun software without specific, written prior permission.
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
38*4882a593Smuzhiyun ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
39*4882a593Smuzhiyun DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
40*4882a593Smuzhiyun ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
41*4882a593Smuzhiyun WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
42*4882a593Smuzhiyun ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
43*4882a593Smuzhiyun SOFTWARE.
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun ******************************************************************/
46*4882a593Smuzhiyun #ifdef HAVE_DIX_CONFIG_H
47*4882a593Smuzhiyun #include <dix-config.h>
48*4882a593Smuzhiyun #endif
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun #include <X11/X.h>
51*4882a593Smuzhiyun #include <X11/Xprotostr.h>
52*4882a593Smuzhiyun #include "regionstr.h"
53*4882a593Smuzhiyun #include "gcstruct.h"
54*4882a593Smuzhiyun #include "pixmap.h"
55*4882a593Smuzhiyun #include "mi.h"
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun void
miPolyRectangle(DrawablePtr pDraw,GCPtr pGC,int nrects,xRectangle * pRects)58*4882a593Smuzhiyun miPolyRectangle(DrawablePtr pDraw, GCPtr pGC, int nrects, xRectangle *pRects)
59*4882a593Smuzhiyun {
60*4882a593Smuzhiyun int i;
61*4882a593Smuzhiyun xRectangle *pR = pRects;
62*4882a593Smuzhiyun DDXPointRec rect[5];
63*4882a593Smuzhiyun int bound_tmp;
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun #define MINBOUND(dst,eqn) bound_tmp = eqn; \
66*4882a593Smuzhiyun if (bound_tmp < -32768) \
67*4882a593Smuzhiyun bound_tmp = -32768; \
68*4882a593Smuzhiyun dst = bound_tmp;
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun #define MAXBOUND(dst,eqn) bound_tmp = eqn; \
71*4882a593Smuzhiyun if (bound_tmp > 32767) \
72*4882a593Smuzhiyun bound_tmp = 32767; \
73*4882a593Smuzhiyun dst = bound_tmp;
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun #define MAXUBOUND(dst,eqn) bound_tmp = eqn; \
76*4882a593Smuzhiyun if (bound_tmp > 65535) \
77*4882a593Smuzhiyun bound_tmp = 65535; \
78*4882a593Smuzhiyun dst = bound_tmp;
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun if (pGC->lineStyle == LineSolid && pGC->joinStyle == JoinMiter &&
81*4882a593Smuzhiyun pGC->lineWidth != 0) {
82*4882a593Smuzhiyun xRectangle *tmp, *t;
83*4882a593Smuzhiyun int ntmp;
84*4882a593Smuzhiyun int offset1, offset2, offset3;
85*4882a593Smuzhiyun int x, y, width, height;
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun ntmp = (nrects << 2);
88*4882a593Smuzhiyun offset2 = pGC->lineWidth;
89*4882a593Smuzhiyun offset1 = offset2 >> 1;
90*4882a593Smuzhiyun offset3 = offset2 - offset1;
91*4882a593Smuzhiyun tmp = xallocarray(ntmp, sizeof(xRectangle));
92*4882a593Smuzhiyun if (!tmp)
93*4882a593Smuzhiyun return;
94*4882a593Smuzhiyun t = tmp;
95*4882a593Smuzhiyun for (i = 0; i < nrects; i++) {
96*4882a593Smuzhiyun x = pR->x;
97*4882a593Smuzhiyun y = pR->y;
98*4882a593Smuzhiyun width = pR->width;
99*4882a593Smuzhiyun height = pR->height;
100*4882a593Smuzhiyun pR++;
101*4882a593Smuzhiyun if (width == 0 && height == 0) {
102*4882a593Smuzhiyun rect[0].x = x;
103*4882a593Smuzhiyun rect[0].y = y;
104*4882a593Smuzhiyun rect[1].x = x;
105*4882a593Smuzhiyun rect[1].y = y;
106*4882a593Smuzhiyun (*pGC->ops->Polylines) (pDraw, pGC, CoordModeOrigin, 2, rect);
107*4882a593Smuzhiyun }
108*4882a593Smuzhiyun else if (height < offset2 || width < offset1) {
109*4882a593Smuzhiyun if (height == 0) {
110*4882a593Smuzhiyun t->x = x;
111*4882a593Smuzhiyun t->width = width;
112*4882a593Smuzhiyun }
113*4882a593Smuzhiyun else {
114*4882a593Smuzhiyun MINBOUND(t->x, x - offset1)
115*4882a593Smuzhiyun MAXUBOUND(t->width, width + offset2)
116*4882a593Smuzhiyun }
117*4882a593Smuzhiyun if (width == 0) {
118*4882a593Smuzhiyun t->y = y;
119*4882a593Smuzhiyun t->height = height;
120*4882a593Smuzhiyun }
121*4882a593Smuzhiyun else {
122*4882a593Smuzhiyun MINBOUND(t->y, y - offset1)
123*4882a593Smuzhiyun MAXUBOUND(t->height, height + offset2)
124*4882a593Smuzhiyun }
125*4882a593Smuzhiyun t++;
126*4882a593Smuzhiyun }
127*4882a593Smuzhiyun else {
128*4882a593Smuzhiyun MINBOUND(t->x, x - offset1)
129*4882a593Smuzhiyun MINBOUND(t->y, y - offset1)
130*4882a593Smuzhiyun MAXUBOUND(t->width, width + offset2)
131*4882a593Smuzhiyun t->height = offset2;
132*4882a593Smuzhiyun t++;
133*4882a593Smuzhiyun MINBOUND(t->x, x - offset1)
134*4882a593Smuzhiyun MAXBOUND(t->y, y + offset3);
135*4882a593Smuzhiyun t->width = offset2;
136*4882a593Smuzhiyun t->height = height - offset2;
137*4882a593Smuzhiyun t++;
138*4882a593Smuzhiyun MAXBOUND(t->x, x + width - offset1);
139*4882a593Smuzhiyun MAXBOUND(t->y, y + offset3)
140*4882a593Smuzhiyun t->width = offset2;
141*4882a593Smuzhiyun t->height = height - offset2;
142*4882a593Smuzhiyun t++;
143*4882a593Smuzhiyun MINBOUND(t->x, x - offset1)
144*4882a593Smuzhiyun MAXBOUND(t->y, y + height - offset1)
145*4882a593Smuzhiyun MAXUBOUND(t->width, width + offset2)
146*4882a593Smuzhiyun t->height = offset2;
147*4882a593Smuzhiyun t++;
148*4882a593Smuzhiyun }
149*4882a593Smuzhiyun }
150*4882a593Smuzhiyun (*pGC->ops->PolyFillRect) (pDraw, pGC, t - tmp, tmp);
151*4882a593Smuzhiyun free((void *) tmp);
152*4882a593Smuzhiyun }
153*4882a593Smuzhiyun else {
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun for (i = 0; i < nrects; i++) {
156*4882a593Smuzhiyun rect[0].x = pR->x;
157*4882a593Smuzhiyun rect[0].y = pR->y;
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun MAXBOUND(rect[1].x, pR->x + (int) pR->width)
160*4882a593Smuzhiyun rect[1].y = rect[0].y;
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun rect[2].x = rect[1].x;
163*4882a593Smuzhiyun MAXBOUND(rect[2].y, pR->y + (int) pR->height);
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun rect[3].x = rect[0].x;
166*4882a593Smuzhiyun rect[3].y = rect[2].y;
167*4882a593Smuzhiyun
168*4882a593Smuzhiyun rect[4].x = rect[0].x;
169*4882a593Smuzhiyun rect[4].y = rect[0].y;
170*4882a593Smuzhiyun
171*4882a593Smuzhiyun (*pGC->ops->Polylines) (pDraw, pGC, CoordModeOrigin, 5, rect);
172*4882a593Smuzhiyun pR++;
173*4882a593Smuzhiyun }
174*4882a593Smuzhiyun }
175*4882a593Smuzhiyun }
176