OLD | NEW |
1 | 1 |
2 //---------------------------------------------------------------------------- | 2 //---------------------------------------------------------------------------- |
3 // Anti-Grain Geometry - Version 2.3 | 3 // Anti-Grain Geometry - Version 2.3 |
4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) | 4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) |
5 // | 5 // |
6 // Permission to copy, use, modify, sell and distribute this software | 6 // Permission to copy, use, modify, sell and distribute this software |
7 // is granted provided this copyright notice appears in all copies. | 7 // is granted provided this copyright notice appears in all copies. |
8 // This software is provided "as is" without express or implied | 8 // This software is provided "as is" without express or implied |
9 // warranty, and with no claim as to its suitability for any purpose. | 9 // warranty, and with no claim as to its suitability for any purpose. |
10 // | 10 // |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 } | 60 } |
61 da = FXSYS_acos(FXSYS_Div(width, width + FXSYS_Div(1.0f / 8, approximation_s
cale))) * 2; | 61 da = FXSYS_acos(FXSYS_Div(width, width + FXSYS_Div(1.0f / 8, approximation_s
cale))) * 2; |
62 out_vertices.add(coord_type(x + dx1, y + dy1)); | 62 out_vertices.add(coord_type(x + dx1, y + dy1)); |
63 if(!ccw) { | 63 if(!ccw) { |
64 if(a1 > a2) { | 64 if(a1 > a2) { |
65 a2 += 2 * FX_PI; | 65 a2 += 2 * FX_PI; |
66 } | 66 } |
67 a2 -= da / 4; | 67 a2 -= da / 4; |
68 a1 += da; | 68 a1 += da; |
69 while(a1 < a2) { | 69 while(a1 < a2) { |
70 out_vertices.add(coord_type(x + FXSYS_Mul(width, FXSYS_cos(a1)), | 70 out_vertices.add(coord_type(x + (width * FXSYS_cos(a1)), |
71 y + FXSYS_Mul(width, FXSYS_sin(a1)))); | 71 y + (width * FXSYS_sin(a1)))); |
72 a1 += da; | 72 a1 += da; |
73 } | 73 } |
74 } else { | 74 } else { |
75 if(a1 < a2) { | 75 if(a1 < a2) { |
76 a2 -= 2 * FX_PI; | 76 a2 -= 2 * FX_PI; |
77 } | 77 } |
78 a2 += da / 4; | 78 a2 += da / 4; |
79 a1 -= da; | 79 a1 -= da; |
80 while(a1 > a2) { | 80 while(a1 > a2) { |
81 out_vertices.add(coord_type(x + FXSYS_Mul(width, FXSYS_cos(a1)), | 81 out_vertices.add(coord_type(x + (width * FXSYS_cos(a1)), |
82 y + FXSYS_Mul(width, FXSYS_sin(a1)))); | 82 y + (width * FXSYS_sin(a1)))); |
83 a1 -= da; | 83 a1 -= da; |
84 } | 84 } |
85 } | 85 } |
86 out_vertices.add(coord_type(x + dx2, y + dy2)); | 86 out_vertices.add(coord_type(x + dx2, y + dy2)); |
87 } | 87 } |
88 template<class VertexConsumer> | 88 template<class VertexConsumer> |
89 void stroke_calc_miter(VertexConsumer& out_vertices, | 89 void stroke_calc_miter(VertexConsumer& out_vertices, |
90 const vertex_dist& v0, | 90 const vertex_dist& v0, |
91 const vertex_dist& v1, | 91 const vertex_dist& v1, |
92 const vertex_dist& v2, | 92 const vertex_dist& v2, |
93 FX_FLOAT dx1, FX_FLOAT dy1, | 93 FX_FLOAT dx1, FX_FLOAT dy1, |
94 FX_FLOAT dx2, FX_FLOAT dy2, | 94 FX_FLOAT dx2, FX_FLOAT dy2, |
95 FX_FLOAT width, | 95 FX_FLOAT width, |
96 line_join_e line_join, | 96 line_join_e line_join, |
97 FX_FLOAT miter_limit, | 97 FX_FLOAT miter_limit, |
98 FX_FLOAT approximation_scale) | 98 FX_FLOAT approximation_scale) |
99 { | 99 { |
100 typedef typename VertexConsumer::value_type coord_type; | 100 typedef typename VertexConsumer::value_type coord_type; |
101 FX_FLOAT xi = v1.x; | 101 FX_FLOAT xi = v1.x; |
102 FX_FLOAT yi = v1.y; | 102 FX_FLOAT yi = v1.y; |
103 bool miter_limit_exceeded = true; | 103 bool miter_limit_exceeded = true; |
104 if(calc_intersection(v0.x + dx1, v0.y - dy1, | 104 if(calc_intersection(v0.x + dx1, v0.y - dy1, |
105 v1.x + dx1, v1.y - dy1, | 105 v1.x + dx1, v1.y - dy1, |
106 v1.x + dx2, v1.y - dy2, | 106 v1.x + dx2, v1.y - dy2, |
107 v2.x + dx2, v2.y - dy2, | 107 v2.x + dx2, v2.y - dy2, |
108 &xi, &yi)) { | 108 &xi, &yi)) { |
109 FX_FLOAT d1 = calc_distance(v1.x, v1.y, xi, yi); | 109 FX_FLOAT d1 = calc_distance(v1.x, v1.y, xi, yi); |
110 FX_FLOAT lim = FXSYS_Mul(width, miter_limit); | 110 FX_FLOAT lim = width * miter_limit; |
111 if(d1 <= lim) { | 111 if(d1 <= lim) { |
112 out_vertices.add(coord_type(xi, yi)); | 112 out_vertices.add(coord_type(xi, yi)); |
113 miter_limit_exceeded = false; | 113 miter_limit_exceeded = false; |
114 } | 114 } |
115 } else { | 115 } else { |
116 FX_FLOAT x2 = v1.x + dx1; | 116 FX_FLOAT x2 = v1.x + dx1; |
117 FX_FLOAT y2 = v1.y - dy1; | 117 FX_FLOAT y2 = v1.y - dy1; |
118 if((FXSYS_Mul(x2 - v0.x, dy1) - FXSYS_Mul(v0.y - y2, dx1) < 0) != | 118 if ((((x2 - v0.x) * dy1) - ((v0.y - y2) * dx1) < 0) != |
119 (FXSYS_Mul(x2 - v2.x, dy1) - FXSYS_Mul(v2.y - y2, dx1) < 0)) { | 119 (((x2 - v2.x) * dy1) - ((v2.y - y2) * dx1) < 0)) { |
120 out_vertices.add(coord_type(v1.x + dx1, v1.y - dy1)); | 120 out_vertices.add(coord_type(v1.x + dx1, v1.y - dy1)); |
121 miter_limit_exceeded = false; | 121 miter_limit_exceeded = false; |
122 } | 122 } |
123 } | 123 } |
124 if(miter_limit_exceeded) { | 124 if(miter_limit_exceeded) { |
125 switch(line_join) { | 125 switch(line_join) { |
126 case miter_join_revert: | 126 case miter_join_revert: |
127 out_vertices.add(coord_type(v1.x + dx1, v1.y - dy1)); | 127 out_vertices.add(coord_type(v1.x + dx1, v1.y - dy1)); |
128 out_vertices.add(coord_type(v1.x + dx2, v1.y - dy2)); | 128 out_vertices.add(coord_type(v1.x + dx2, v1.y - dy2)); |
129 break; | 129 break; |
130 case miter_join_round: | 130 case miter_join_round: |
131 stroke_calc_arc(out_vertices, | 131 stroke_calc_arc(out_vertices, |
132 v1.x, v1.y, dx1, -dy1, dx2, -dy2, | 132 v1.x, v1.y, dx1, -dy1, dx2, -dy2, |
133 width, approximation_scale); | 133 width, approximation_scale); |
134 break; | 134 break; |
135 default: | 135 default: |
136 out_vertices.add(coord_type(v1.x + dx1 + FXSYS_Mul(dy1, miter_li
mit), | 136 out_vertices.add(coord_type(v1.x + dx1 + (dy1 * miter_limit), |
137 v1.y - dy1 + FXSYS_Mul(dx1, miter_li
mit))); | 137 v1.y - dy1 + (dx1 * miter_limit))); |
138 out_vertices.add(coord_type(v1.x + dx2 - FXSYS_Mul(dy2, miter_li
mit), | 138 out_vertices.add(coord_type(v1.x + dx2 - (dy2 * miter_limit), |
139 v1.y - dy2 - FXSYS_Mul(dx2, miter_li
mit))); | 139 v1.y - dy2 - (dx2 * miter_limit))); |
140 break; | 140 break; |
141 } | 141 } |
142 } | 142 } |
143 } | 143 } |
144 template<class VertexConsumer> | 144 template<class VertexConsumer> |
145 void stroke_calc_cap(VertexConsumer& out_vertices, | 145 void stroke_calc_cap(VertexConsumer& out_vertices, |
146 const vertex_dist& v0, | 146 const vertex_dist& v0, |
147 const vertex_dist& v1, | 147 const vertex_dist& v1, |
148 FX_FLOAT len, | 148 FX_FLOAT len, |
149 line_cap_e line_cap, | 149 line_cap_e line_cap, |
150 FX_FLOAT width, | 150 FX_FLOAT width, |
151 FX_FLOAT approximation_scale) | 151 FX_FLOAT approximation_scale) |
152 { | 152 { |
153 typedef typename VertexConsumer::value_type coord_type; | 153 typedef typename VertexConsumer::value_type coord_type; |
154 out_vertices.remove_all(); | 154 out_vertices.remove_all(); |
155 FX_FLOAT dx1 = FXSYS_Div(v1.y - v0.y, len); | 155 FX_FLOAT dx1 = FXSYS_Div(v1.y - v0.y, len); |
156 FX_FLOAT dy1 = FXSYS_Div(v1.x - v0.x, len); | 156 FX_FLOAT dy1 = FXSYS_Div(v1.x - v0.x, len); |
157 FX_FLOAT dx2 = 0; | 157 FX_FLOAT dx2 = 0; |
158 FX_FLOAT dy2 = 0; | 158 FX_FLOAT dy2 = 0; |
159 dx1 = FXSYS_Mul(dx1, width); | 159 dx1 = dx1 * width; |
160 dy1 = FXSYS_Mul(dy1, width); | 160 dy1 = dy1 * width; |
161 if(line_cap != round_cap) { | 161 if(line_cap != round_cap) { |
162 if(line_cap == square_cap) { | 162 if(line_cap == square_cap) { |
163 dx2 = dy1; | 163 dx2 = dy1; |
164 dy2 = dx1; | 164 dy2 = dx1; |
165 } | 165 } |
166 out_vertices.add(coord_type(v0.x - dx1 - dx2, v0.y + dy1 - dy2)); | 166 out_vertices.add(coord_type(v0.x - dx1 - dx2, v0.y + dy1 - dy2)); |
167 out_vertices.add(coord_type(v0.x + dx1 - dx2, v0.y - dy1 - dy2)); | 167 out_vertices.add(coord_type(v0.x + dx1 - dx2, v0.y - dy1 - dy2)); |
168 } else { | 168 } else { |
169 FX_FLOAT a1 = FXSYS_atan2(dy1, -dx1); | 169 FX_FLOAT a1 = FXSYS_atan2(dy1, -dx1); |
170 FX_FLOAT a2 = a1 + FX_PI; | 170 FX_FLOAT a2 = a1 + FX_PI; |
171 FX_FLOAT da = FXSYS_acos(FXSYS_Div(width, width + | 171 FX_FLOAT da = FXSYS_acos(FXSYS_Div(width, width + |
172 FXSYS_Div(1.0f / 8, approximation_sca
le))) * 2; | 172 FXSYS_Div(1.0f / 8, approximation_sca
le))) * 2; |
173 out_vertices.add(coord_type(v0.x - dx1, v0.y + dy1)); | 173 out_vertices.add(coord_type(v0.x - dx1, v0.y + dy1)); |
174 a1 += da; | 174 a1 += da; |
175 a2 -= da / 4; | 175 a2 -= da / 4; |
176 while(a1 < a2) { | 176 while(a1 < a2) { |
177 out_vertices.add(coord_type(v0.x + FXSYS_Mul(width, FXSYS_cos(a1)), | 177 out_vertices.add(coord_type(v0.x + (width * FXSYS_cos(a1)), |
178 v0.y + FXSYS_Mul(width, FXSYS_sin(a1))))
; | 178 v0.y + (width * FXSYS_sin(a1)))); |
179 a1 += da; | 179 a1 += da; |
180 } | 180 } |
181 out_vertices.add(coord_type(v0.x + dx1, v0.y - dy1)); | 181 out_vertices.add(coord_type(v0.x + dx1, v0.y - dy1)); |
182 } | 182 } |
183 } | 183 } |
184 template<class VertexConsumer> | 184 template<class VertexConsumer> |
185 void stroke_calc_join(VertexConsumer& out_vertices, | 185 void stroke_calc_join(VertexConsumer& out_vertices, |
186 const vertex_dist& v0, | 186 const vertex_dist& v0, |
187 const vertex_dist& v1, | 187 const vertex_dist& v1, |
188 const vertex_dist& v2, | 188 const vertex_dist& v2, |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
263 break; | 263 break; |
264 default: | 264 default: |
265 out_vertices.add(coord_type(v1.x + dx1, v1.y - dy1)); | 265 out_vertices.add(coord_type(v1.x + dx1, v1.y - dy1)); |
266 out_vertices.add(coord_type(v1.x + dx2, v1.y - dy2)); | 266 out_vertices.add(coord_type(v1.x + dx2, v1.y - dy2)); |
267 break; | 267 break; |
268 } | 268 } |
269 } | 269 } |
270 } | 270 } |
271 } | 271 } |
272 #endif | 272 #endif |
OLD | NEW |