First import
[xorg_rtime.git] / xorg-server-1.4 / fb / fbarc.c
blob3f46bd4b273cec7822f52625fa84a8d890941064
1 /*
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>
25 #endif
27 #include "fb.h"
28 #include "mizerarc.h"
29 #include <limits.h>
31 typedef void (*FbArc) (FbBits *dst,
32 FbStride dstStride,
33 int dstBpp,
34 xArc *arc,
35 int dx,
36 int dy,
37 FbBits and,
38 FbBits xor);
40 void
41 fbPolyArc (DrawablePtr pDrawable,
42 GCPtr pGC,
43 int narcs,
44 xArc *parcs)
46 FbArc arc;
48 if (pGC->lineWidth == 0)
50 #ifndef FBNOPIXADDR
51 arc = 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;
58 #ifdef FB_24BIT
59 case 24: arc = fbArc24; break;
60 #endif
61 case 32: arc = fbArc32; break;
64 if (arc)
66 FbGCPrivPtr pPriv = fbGetGCPrivate (pGC);
67 FbBits *dst;
68 FbStride dstStride;
69 int dstBpp;
70 int dstXoff, dstYoff;
71 BoxRec box;
72 int x2, y2;
73 RegionPtr cclip;
75 cclip = fbGetCompositeClip (pGC);
76 fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
77 while (narcs--)
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;
95 box.x2 = x2;
96 y2 = box.y1 + (int)parcs->height + 1;
97 box.y2 = y2;
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);
103 else
104 miZeroPolyArc(pDrawable, pGC, 1, parcs);
106 else
107 miPolyArc(pDrawable, pGC, 1, parcs);
108 parcs++;
110 fbFinishAccess (pDrawable);
112 else
113 #endif
114 miZeroPolyArc (pDrawable, pGC, narcs, parcs);
116 else
117 miPolyArc (pDrawable, pGC, narcs, parcs);