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

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

Issue 1019773004: Port to real Sk2f. (Closed) Base URL: https://skia.googlesource.com/skia@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
« no previous file with comments | « src/core/Sk4x.h ('k') | tests/Sk4xTest.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 void SkEvalQuadAt(const SkPoint src[3], SkScalar t, SkPoint* pt, SkVector* tange nt) { 117 void SkEvalQuadAt(const SkPoint src[3], SkScalar t, SkPoint* pt, SkVector* tange nt) {
118 SkASSERT(src); 118 SkASSERT(src);
119 SkASSERT(t >= 0 && t <= SK_Scalar1); 119 SkASSERT(t >= 0 && t <= SK_Scalar1);
120 120
121 if (pt) { 121 if (pt) {
122 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));
123 } 123 }
124 if (tangent) { 124 if (tangent) {
125 tangent->set(eval_quad_derivative(&src[0].fX, t), 125 tangent->set(eval_quad_derivative(&src[0].fX, t),
126 eval_quad_derivative(&src[0].fY, t)); 126 eval_quad_derivative(&src[0].fY, t));
127 } 127 }
128 } 128 }
129 129
130 #include "Sk4x.h" 130 #include "Sk2x.h"
131 131
132 SkPoint SkEvalQuadAt(const SkPoint src[3], SkScalar t) { 132 SkPoint SkEvalQuadAt(const SkPoint src[3], SkScalar t) {
133 SkASSERT(src); 133 SkASSERT(src);
134 SkASSERT(t >= 0 && t <= SK_Scalar1); 134 SkASSERT(t >= 0 && t <= SK_Scalar1);
135 135
136 const Sk4f t2(t); 136 const Sk2f t2(t);
137 const Sk4f two(2); 137
138 138 Sk2f P0 = Sk2f::Load(&src[0].fX);
139 Sk4f P0 = Sk4f::Load2(&src[0].fX); 139 Sk2f P1 = Sk2f::Load(&src[1].fX);
140 Sk4f P1 = Sk4f::Load2(&src[1].fX); 140 Sk2f P2 = Sk2f::Load(&src[2].fX);
141 Sk4f P2 = Sk4f::Load2(&src[2].fX); 141
142 142 Sk2f A = P2.subtract(P1.add(P1)).add(P0);
143 Sk4f A = P2.subtract(P1.multiply(two)).add(P0); 143 Sk2f B = P1.subtract(P0);
144 Sk4f B = P1.subtract(P0).multiply(two); 144 B = B.add(B);
145 145
146 SkPoint result; 146 SkPoint result;
147 A.multiply(t2).add(B).multiply(t2).add(P0).store2(&result.fX); 147 A.multiply(t2).add(B).multiply(t2).add(P0).store(&result.fX);
148 return result; 148 return result;
149 } 149 }
150 150
151 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) {
152 SkScalar ab = SkScalarInterp(src[0], src[2], t); 152 SkScalar ab = SkScalarInterp(src[0], src[2], t);
153 SkScalar bc = SkScalarInterp(src[2], src[4], t); 153 SkScalar bc = SkScalarInterp(src[2], src[4], t);
154 154
155 dst[0] = src[0]; 155 dst[0] = src[0];
156 dst[2] = ab; 156 dst[2] = ab;
157 dst[4] = SkScalarInterp(ab, bc, t); 157 dst[4] = SkScalarInterp(ab, bc, t);
(...skipping 1224 matching lines...) Expand 10 before | Expand all | Expand 10 after
1382 return false; 1382 return false;
1383 } 1383 }
1384 1384
1385 SkScalar SkConic::TransformW(const SkPoint pts[], SkScalar w, 1385 SkScalar SkConic::TransformW(const SkPoint pts[], SkScalar w,
1386 const SkMatrix& matrix) { 1386 const SkMatrix& matrix) {
1387 if (!matrix.hasPerspective()) { 1387 if (!matrix.hasPerspective()) {
1388 return w; 1388 return w;
1389 } 1389 }
1390 1390
1391 SkP3D src[3], dst[3]; 1391 SkP3D src[3], dst[3];
1392 1392
1393 ratquad_mapTo3D(pts, w, src); 1393 ratquad_mapTo3D(pts, w, src);
1394 1394
1395 matrix.mapHomogeneousPoints(&dst[0].fX, &src[0].fX, 3); 1395 matrix.mapHomogeneousPoints(&dst[0].fX, &src[0].fX, 3);
1396 1396
1397 // w' = sqrt(w1*w1/w0*w2) 1397 // w' = sqrt(w1*w1/w0*w2)
1398 SkScalar w0 = dst[0].fZ; 1398 SkScalar w0 = dst[0].fZ;
1399 SkScalar w1 = dst[1].fZ; 1399 SkScalar w1 = dst[1].fZ;
1400 SkScalar w2 = dst[2].fZ; 1400 SkScalar w2 = dst[2].fZ;
1401 w = SkScalarSqrt((w1 * w1) / (w0 * w2)); 1401 w = SkScalarSqrt((w1 * w1) / (w0 * w2));
1402 return w; 1402 return w;
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
1480 matrix.preScale(SK_Scalar1, -SK_Scalar1); 1480 matrix.preScale(SK_Scalar1, -SK_Scalar1);
1481 } 1481 }
1482 if (userMatrix) { 1482 if (userMatrix) {
1483 matrix.postConcat(*userMatrix); 1483 matrix.postConcat(*userMatrix);
1484 } 1484 }
1485 for (int i = 0; i < conicCount; ++i) { 1485 for (int i = 0; i < conicCount; ++i) {
1486 matrix.mapPoints(dst[i].fPts, 3); 1486 matrix.mapPoints(dst[i].fPts, 3);
1487 } 1487 }
1488 return conicCount; 1488 return conicCount;
1489 } 1489 }
OLDNEW
« no previous file with comments | « src/core/Sk4x.h ('k') | tests/Sk4xTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698