Commit | Line | Data |
---|---|---|
a09e091a JB |
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 | ||
29 | void | |
30 | fbZeroLine(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt, DDXPointPtr ppt) | |
31 | { | |
32 | int x1, y1, x2, y2; | |
33 | int x, y; | |
34 | int dashOffset; | |
35 | ||
36 | x = pDrawable->x; | |
37 | y = pDrawable->y; | |
38 | x1 = ppt->x; | |
39 | y1 = ppt->y; | |
40 | dashOffset = pGC->dashOffset; | |
41 | while (--npt) { | |
42 | ++ppt; | |
43 | x2 = ppt->x; | |
44 | y2 = ppt->y; | |
45 | if (mode == CoordModePrevious) { | |
46 | x2 += x1; | |
47 | y2 += y1; | |
48 | } | |
49 | fbSegment(pDrawable, pGC, x1 + x, y1 + y, | |
50 | x2 + x, y2 + y, | |
51 | npt == 1 && pGC->capStyle != CapNotLast, &dashOffset); | |
52 | x1 = x2; | |
53 | y1 = y2; | |
54 | } | |
55 | } | |
56 | ||
57 | void | |
58 | fbZeroSegment(DrawablePtr pDrawable, GCPtr pGC, int nseg, xSegment * pSegs) | |
59 | { | |
60 | int dashOffset; | |
61 | int x, y; | |
62 | Bool drawLast = pGC->capStyle != CapNotLast; | |
63 | ||
64 | x = pDrawable->x; | |
65 | y = pDrawable->y; | |
66 | while (nseg--) { | |
67 | dashOffset = pGC->dashOffset; | |
68 | fbSegment(pDrawable, pGC, | |
69 | pSegs->x1 + x, pSegs->y1 + y, | |
70 | pSegs->x2 + x, pSegs->y2 + y, drawLast, &dashOffset); | |
71 | pSegs++; | |
72 | } | |
73 | } | |
74 | ||
75 | void | |
76 | fbFixCoordModePrevious(int npt, DDXPointPtr ppt) | |
77 | { | |
78 | int x, y; | |
79 | ||
80 | x = ppt->x; | |
81 | y = ppt->y; | |
82 | npt--; | |
83 | while (npt--) { | |
84 | ppt++; | |
85 | x = (ppt->x += x); | |
86 | y = (ppt->y += y); | |
87 | } | |
88 | } | |
89 | ||
90 | void | |
91 | fbPolyLine(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt, DDXPointPtr ppt) | |
92 | { | |
93 | void (*line) (DrawablePtr, GCPtr, int mode, int npt, DDXPointPtr ppt); | |
94 | ||
95 | if (pGC->lineWidth == 0) { | |
96 | line = fbZeroLine; | |
97 | if (pGC->fillStyle == FillSolid && | |
98 | pGC->lineStyle == LineSolid && | |
99 | RegionNumRects(fbGetCompositeClip(pGC)) == 1) { | |
100 | switch (pDrawable->bitsPerPixel) { | |
101 | case 8: | |
102 | line = fbPolyline8; | |
103 | break; | |
104 | case 16: | |
105 | line = fbPolyline16; | |
106 | break; | |
107 | case 24: | |
108 | line = fbPolyline24; | |
109 | break; | |
110 | case 32: | |
111 | line = fbPolyline32; | |
112 | break; | |
113 | } | |
114 | } | |
115 | } | |
116 | else { | |
117 | if (pGC->lineStyle != LineSolid) | |
118 | line = miWideDash; | |
119 | else | |
120 | line = miWideLine; | |
121 | } | |
122 | (*line) (pDrawable, pGC, mode, npt, ppt); | |
123 | } | |
124 | ||
125 | void | |
126 | fbPolySegment(DrawablePtr pDrawable, GCPtr pGC, int nseg, xSegment * pseg) | |
127 | { | |
128 | void (*seg) (DrawablePtr pDrawable, GCPtr pGC, int nseg, xSegment * pseg); | |
129 | ||
130 | if (pGC->lineWidth == 0) { | |
131 | seg = fbZeroSegment; | |
132 | if (pGC->fillStyle == FillSolid && | |
133 | pGC->lineStyle == LineSolid && | |
134 | RegionNumRects(fbGetCompositeClip(pGC)) == 1) { | |
135 | switch (pDrawable->bitsPerPixel) { | |
136 | case 8: | |
137 | seg = fbPolySegment8; | |
138 | break; | |
139 | case 16: | |
140 | seg = fbPolySegment16; | |
141 | break; | |
142 | case 24: | |
143 | seg = fbPolySegment24; | |
144 | break; | |
145 | case 32: | |
146 | seg = fbPolySegment32; | |
147 | break; | |
148 | } | |
149 | } | |
150 | } | |
151 | else { | |
152 | seg = miPolySegment; | |
153 | } | |
154 | (*seg) (pDrawable, pGC, nseg, pseg); | |
155 | } |