OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 The Android Open Source Project |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkGeometry.h" | 8 #include "SkGeometry.h" |
9 #include "SkMatrix.h" | 9 #include "SkMatrix.h" |
10 | 10 |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
140 Sk2f P2 = Sk2f::Load(&src[2].fX); | 140 Sk2f P2 = Sk2f::Load(&src[2].fX); |
141 | 141 |
142 Sk2f B = P1 - P0; | 142 Sk2f B = P1 - P0; |
143 Sk2f A = P2 - P1 - B; | 143 Sk2f A = P2 - P1 - B; |
144 | 144 |
145 SkPoint result; | 145 SkPoint result; |
146 ((A * t2 + B+B) * t2 + P0).store(&result.fX); | 146 ((A * t2 + B+B) * t2 + P0).store(&result.fX); |
147 return result; | 147 return result; |
148 } | 148 } |
149 | 149 |
150 SkVector SkEvalQuadTangentAt(const SkPoint src[3], SkScalar t) { | |
151 SkASSERT(src); | |
152 SkASSERT(t >= 0 && t <= SK_Scalar1); | |
153 | |
154 Sk2f P0 = Sk2f::Load(&src[0].fX); | |
155 Sk2f P1 = Sk2f::Load(&src[1].fX); | |
156 Sk2f P2 = Sk2f::Load(&src[2].fX); | |
157 | |
158 Sk2f B = P1 - P0; | |
159 Sk2f A = P2 - P1 - B; | |
160 Sk2f T = A * Sk2f(t) + B; | |
161 | |
162 SkVector result; | |
163 (T + T).store(&result.fX); | |
164 return result; | |
165 } | |
166 | |
150 static void interp_quad_coords(const SkScalar* src, SkScalar* dst, SkScalar t) { | 167 static void interp_quad_coords(const SkScalar* src, SkScalar* dst, SkScalar t) { |
151 SkScalar ab = SkScalarInterp(src[0], src[2], t); | 168 SkScalar ab = SkScalarInterp(src[0], src[2], t); |
152 SkScalar bc = SkScalarInterp(src[2], src[4], t); | 169 SkScalar bc = SkScalarInterp(src[2], src[4], t); |
153 | 170 |
154 dst[0] = src[0]; | 171 dst[0] = src[0]; |
155 dst[2] = ab; | 172 dst[2] = ab; |
156 dst[4] = SkScalarInterp(ab, bc, t); | 173 dst[4] = SkScalarInterp(ab, bc, t); |
157 dst[6] = bc; | 174 dst[6] = bc; |
158 dst[8] = src[4]; | 175 dst[8] = src[4]; |
159 } | 176 } |
160 | 177 |
161 void SkChopQuadAt(const SkPoint src[3], SkPoint dst[5], SkScalar t) { | 178 void SkChopQuadAt(const SkPoint src[3], SkPoint dst[5], SkScalar t) { |
162 SkASSERT(t > 0 && t < SK_Scalar1); | 179 SkASSERT(t > 0 && t < SK_Scalar1); |
163 | 180 |
164 interp_quad_coords(&src[0].fX, &dst[0].fX, t); | 181 interp_quad_coords(&src[0].fX, &dst[0].fX, t); |
165 interp_quad_coords(&src[0].fY, &dst[0].fY, t); | 182 interp_quad_coords(&src[0].fY, &dst[0].fY, t); |
166 } | 183 } |
167 | 184 |
185 static Sk2s interp(Sk2s A, Sk2s B, Sk2s T) { | |
mtklein
2015/03/20 11:39:48
Interesting.
The x86 Windows warnings are telling
| |
186 return A + (B - A) * T; | |
187 } | |
188 | |
189 void SkChopQuadAt2(const SkPoint src[3], SkPoint dst[5], SkScalar t) { | |
190 SkASSERT(t > 0 && t < SK_Scalar1); | |
191 | |
192 Sk2s P0 = Sk2f::Load(&src[0].fX); | |
mtklein
2015/03/20 11:39:48
You might call these A,B,C to match AB and BC.
| |
193 Sk2s P1 = Sk2f::Load(&src[1].fX); | |
194 Sk2s P2 = Sk2f::Load(&src[2].fX); | |
195 Sk2s tt = Sk2s(t); | |
196 | |
197 Sk2s AB = interp(P0, P1, tt); | |
198 Sk2s BC = interp(P1, P2, tt); | |
199 | |
200 P0.store(&dst[0].fX); | |
201 AB.store(&dst[1].fX); | |
202 interp(AB, BC, tt).store(&dst[2].fX); | |
203 BC.store(&dst[3].fX); | |
204 P2.store(&dst[4].fX); | |
205 } | |
206 | |
168 void SkChopQuadAtHalf(const SkPoint src[3], SkPoint dst[5]) { | 207 void SkChopQuadAtHalf(const SkPoint src[3], SkPoint dst[5]) { |
169 SkScalar x01 = SkScalarAve(src[0].fX, src[1].fX); | 208 SkScalar x01 = SkScalarAve(src[0].fX, src[1].fX); |
170 SkScalar y01 = SkScalarAve(src[0].fY, src[1].fY); | 209 SkScalar y01 = SkScalarAve(src[0].fY, src[1].fY); |
171 SkScalar x12 = SkScalarAve(src[1].fX, src[2].fX); | 210 SkScalar x12 = SkScalarAve(src[1].fX, src[2].fX); |
172 SkScalar y12 = SkScalarAve(src[1].fY, src[2].fY); | 211 SkScalar y12 = SkScalarAve(src[1].fY, src[2].fY); |
173 | 212 |
174 dst[0] = src[0]; | 213 dst[0] = src[0]; |
175 dst[1].set(x01, y01); | 214 dst[1].set(x01, y01); |
176 dst[2].set(SkScalarAve(x01, x12), SkScalarAve(y01, y12)); | 215 dst[2].set(SkScalarAve(x01, x12), SkScalarAve(y01, y12)); |
177 dst[3].set(x12, y12); | 216 dst[3].set(x12, y12); |
(...skipping 1301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1479 matrix.preScale(SK_Scalar1, -SK_Scalar1); | 1518 matrix.preScale(SK_Scalar1, -SK_Scalar1); |
1480 } | 1519 } |
1481 if (userMatrix) { | 1520 if (userMatrix) { |
1482 matrix.postConcat(*userMatrix); | 1521 matrix.postConcat(*userMatrix); |
1483 } | 1522 } |
1484 for (int i = 0; i < conicCount; ++i) { | 1523 for (int i = 0; i < conicCount; ++i) { |
1485 matrix.mapPoints(dst[i].fPts, 3); | 1524 matrix.mapPoints(dst[i].fPts, 3); |
1486 } | 1525 } |
1487 return conicCount; | 1526 return conicCount; |
1488 } | 1527 } |
OLD | NEW |