2 * Copyright © 1998 Keith Packard
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.
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.
23 #ifdef HAVE_DIX_CONFIG_H
24 #include <dix-config.h>
31 typedef void (*FbArc
) (FbBits
*dst
,
41 fbPolyArc (DrawablePtr pDrawable
,
48 if (pGC
->lineWidth
== 0)
52 if (pGC
->lineStyle
== LineSolid
&& pGC
->fillStyle
== FillSolid
)
54 switch (pDrawable
->bitsPerPixel
)
56 case 8: arc
= fbArc8
; break;
57 case 16: arc
= fbArc16
; break;
59 case 24: arc
= fbArc24
; break;
61 case 32: arc
= fbArc32
; break;
66 FbGCPrivPtr pPriv
= fbGetGCPrivate (pGC
);
75 cclip
= fbGetCompositeClip (pGC
);
76 fbGetDrawable (pDrawable
, dst
, dstStride
, dstBpp
, dstXoff
, dstYoff
);
79 if (miCanZeroArc (parcs
))
81 box
.x1
= parcs
->x
+ pDrawable
->x
;
82 box
.y1
= parcs
->y
+ pDrawable
->y
;
84 * Because box.x2 and box.y2 get truncated to 16 bits, and the
85 * RECT_IN_REGION test treats the resulting number as a signed
86 * integer, the RECT_IN_REGION test alone can go the wrong way.
87 * This can result in a server crash because the rendering
88 * routines in this file deal directly with cpu addresses
89 * of pixels to be stored, and do not clip or otherwise check
90 * that all such addresses are within their respective pixmaps.
91 * So we only allow the RECT_IN_REGION test to be used for
92 * values that can be expressed correctly in a signed short.
94 x2
= box
.x1
+ (int)parcs
->width
+ 1;
96 y2
= box
.y1
+ (int)parcs
->height
+ 1;
98 if ( (x2
<= SHRT_MAX
) && (y2
<= SHRT_MAX
) &&
99 (RECT_IN_REGION(pDrawable
->pScreen
, cclip
, &box
) == rgnIN
) )
100 (*arc
) (dst
, dstStride
, dstBpp
,
101 parcs
, pDrawable
->x
+ dstXoff
, pDrawable
->y
+ dstYoff
,
102 pPriv
->and, pPriv
->xor);
104 miZeroPolyArc(pDrawable
, pGC
, 1, parcs
);
107 miPolyArc(pDrawable
, pGC
, 1, parcs
);
110 fbFinishAccess (pDrawable
);
114 miZeroPolyArc (pDrawable
, pGC
, narcs
, parcs
);
117 miPolyArc (pDrawable
, pGC
, narcs
, parcs
);