Chromium Code Reviews| 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 |