Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(579)

Side by Side Diff: src/core/SkGeometry.cpp

Issue 1011493003: alt SkEvalQuadAt that returns its answer, using Sk2f (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
107 #endif 107 #endif
108 } 108 }
109 109
110 static SkScalar eval_quad_derivative(const SkScalar src[], SkScalar t) { 110 static SkScalar eval_quad_derivative(const SkScalar src[], SkScalar t) {
111 SkScalar A = src[4] - 2 * src[2] + src[0]; 111 SkScalar A = src[4] - 2 * src[2] + src[0];
112 SkScalar B = src[2] - src[0]; 112 SkScalar B = src[2] - src[0];
113 113
114 return 2 * SkScalarMulAdd(A, t, B); 114 return 2 * SkScalarMulAdd(A, t, B);
115 } 115 }
116 116
117 static SkScalar eval_quad_derivative_at_half(const SkScalar src[]) { 117 void SkEvalQuadAt(const SkPoint src[3], SkScalar t, SkPoint* pt, SkVector* tange nt) {
118 SkScalar A = src[4] - 2 * src[2] + src[0];
119 SkScalar B = src[2] - src[0];
120 return A + 2 * B;
121 }
122
123 void SkEvalQuadAt(const SkPoint src[3], SkScalar t, SkPoint* pt,
124 SkVector* tangent) {
125 SkASSERT(src); 118 SkASSERT(src);
126 SkASSERT(t >= 0 && t <= SK_Scalar1); 119 SkASSERT(t >= 0 && t <= SK_Scalar1);
127 120
128 if (pt) { 121 if (pt) {
129 pt->set(eval_quad(&src[0].fX, t), eval_quad(&src[0].fY, t)); 122 pt->set(eval_quad(&src[0].fX, t), eval_quad(&src[0].fY, t));
130 } 123 }
131 if (tangent) { 124 if (tangent) {
132 tangent->set(eval_quad_derivative(&src[0].fX, t), 125 tangent->set(eval_quad_derivative(&src[0].fX, t),
133 eval_quad_derivative(&src[0].fY, t)); 126 eval_quad_derivative(&src[0].fY, t));
134 } 127 }
135 } 128 }
136 129
137 void SkEvalQuadAtHalf(const SkPoint src[3], SkPoint* pt, SkVector* tangent) { 130 #include "Sk4x.h"
131
132 SkPoint SkEvalQuadAt(const SkPoint src[3], SkScalar t) {
138 SkASSERT(src); 133 SkASSERT(src);
134 SkASSERT(t >= 0 && t <= SK_Scalar1);
139 135
140 if (pt) { 136 const Sk4f t2(t);
141 SkScalar x01 = SkScalarAve(src[0].fX, src[1].fX); 137 const Sk4f two(2);
142 SkScalar y01 = SkScalarAve(src[0].fY, src[1].fY); 138
143 SkScalar x12 = SkScalarAve(src[1].fX, src[2].fX); 139 Sk4f P0 = Sk4f::Load2(&src[0].fX);
144 SkScalar y12 = SkScalarAve(src[1].fY, src[2].fY); 140 Sk4f P1 = Sk4f::Load2(&src[1].fX);
145 pt->set(SkScalarAve(x01, x12), SkScalarAve(y01, y12)); 141 Sk4f P2 = Sk4f::Load2(&src[2].fX);
146 } 142
147 if (tangent) { 143 Sk4f A = P2.subtract(P1.multiply(two)).add(P0);
148 tangent->set(eval_quad_derivative_at_half(&src[0].fX), 144 Sk4f B = P1.subtract(P0).multiply(two);
149 eval_quad_derivative_at_half(&src[0].fY)); 145
150 } 146 SkPoint result;
147 A.multiply(t2).add(B).multiply(t2).add(P0).store2(&result.fX);
148 return result;
151 } 149 }
152 150
153 static void interp_quad_coords(const SkScalar* src, SkScalar* dst, SkScalar t) { 151 static void interp_quad_coords(const SkScalar* src, SkScalar* dst, SkScalar t) {
154 SkScalar ab = SkScalarInterp(src[0], src[2], t); 152 SkScalar ab = SkScalarInterp(src[0], src[2], t);
155 SkScalar bc = SkScalarInterp(src[2], src[4], t); 153 SkScalar bc = SkScalarInterp(src[2], src[4], t);
156 154
157 dst[0] = src[0]; 155 dst[0] = src[0];
158 dst[2] = ab; 156 dst[2] = ab;
159 dst[4] = SkScalarInterp(ab, bc, t); 157 dst[4] = SkScalarInterp(ab, bc, t);
160 dst[6] = bc; 158 dst[6] = bc;
(...skipping 1321 matching lines...) Expand 10 before | Expand all | Expand 10 after
1482 matrix.preScale(SK_Scalar1, -SK_Scalar1); 1480 matrix.preScale(SK_Scalar1, -SK_Scalar1);
1483 } 1481 }
1484 if (userMatrix) { 1482 if (userMatrix) {
1485 matrix.postConcat(*userMatrix); 1483 matrix.postConcat(*userMatrix);
1486 } 1484 }
1487 for (int i = 0; i < conicCount; ++i) { 1485 for (int i = 0; i < conicCount; ++i) {
1488 matrix.mapPoints(dst[i].fPts, 3); 1486 matrix.mapPoints(dst[i].fPts, 3);
1489 } 1487 }
1490 return conicCount; 1488 return conicCount;
1491 } 1489 }
OLDNEW
« bench/GeometryBench.cpp ('K') | « src/core/SkGeometry.h ('k') | tests/GeometryTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698