Lines Matching defs:src

13 #include "src/core/SkGeometry.h"
14 #include "src/core/SkPointPriv.h"
115 void SkEvalQuadAt(const SkPoint src[3], SkScalar t, SkPoint* pt, SkVector* tangent) {
116 SkASSERT(src);
120 *pt = SkEvalQuadAt(src, t);
123 *tangent = SkEvalQuadTangentAt(src, t);
127 SkPoint SkEvalQuadAt(const SkPoint src[3], SkScalar t) {
128 return to_point(SkQuadCoeff(src).eval(t));
131 SkVector SkEvalQuadTangentAt(const SkPoint src[3], SkScalar t) {
135 if ((t == 0 && src[0] == src[1]) || (t == 1 && src[1] == src[2])) {
136 return src[2] - src[0];
138 SkASSERT(src);
141 Sk2s P0 = from_point(src[0]);
142 Sk2s P1 = from_point(src[1]);
143 Sk2s P2 = from_point(src[2]);
156 void SkChopQuadAt(const SkPoint src[3], SkPoint dst[5], SkScalar t) {
159 Sk2s p0 = from_point(src[0]);
160 Sk2s p1 = from_point(src[1]);
161 Sk2s p2 = from_point(src[2]);
174 void SkChopQuadAtHalf(const SkPoint src[3], SkPoint dst[5]) {
175 SkChopQuadAt(src, dst, 0.5f);
212 float SkFindQuadMidTangent(const SkPoint src[3]) {
218 SkVector tan0 = src[1] - src[0];
219 SkVector tan1 = src[2] - src[1];
260 int SkChopQuadAtYExtrema(const SkPoint src[3], SkPoint dst[5]) {
261 SkASSERT(src);
264 SkScalar a = src[0].fY;
265 SkScalar b = src[1].fY;
266 SkScalar c = src[2].fY;
271 SkChopQuadAt(src, dst, tValue);
279 dst[0].set(src[0].fX, a);
280 dst[1].set(src[1].fX, b);
281 dst[2].set(src[2].fX, c);
288 int SkChopQuadAtXExtrema(const SkPoint src[3], SkPoint dst[5]) {
289 SkASSERT(src);
292 SkScalar a = src[0].fX;
293 SkScalar b = src[1].fX;
294 SkScalar c = src[2].fX;
299 SkChopQuadAt(src, dst, tValue);
307 dst[0].set(a, src[0].fY);
308 dst[1].set(b, src[1].fY);
309 dst[2].set(c, src[2].fY);
325 SkScalar SkFindQuadMaxCurvature(const SkPoint src[3]) {
326 SkScalar Ax = src[1].fX - src[0].fX;
327 SkScalar Ay = src[1].fY - src[0].fY;
328 SkScalar Bx = src[0].fX - src[1].fX - src[1].fX + src[2].fX;
329 SkScalar By = src[0].fY - src[1].fY - src[1].fY + src[2].fY;
348 int SkChopQuadAtMaxCurvature(const SkPoint src[3], SkPoint dst[5]) {
349 SkScalar t = SkFindQuadMaxCurvature(src);
351 SkChopQuadAt(src, dst, t);
354 memcpy(dst, src, 3 * sizeof(SkPoint));
359 void SkConvertQuadToCubic(const SkPoint src[3], SkPoint dst[4]) {
361 Sk2s s0 = from_point(src[0]);
362 Sk2s s1 = from_point(src[1]);
363 Sk2s s2 = from_point(src[2]);
375 static SkVector eval_cubic_derivative(const SkPoint src[4], SkScalar t) {
377 Sk2s P0 = from_point(src[0]);
378 Sk2s P1 = from_point(src[1]);
379 Sk2s P2 = from_point(src[2]);
380 Sk2s P3 = from_point(src[3]);
388 static SkVector eval_cubic_2ndDerivative(const SkPoint src[4], SkScalar t) {
389 Sk2s P0 = from_point(src[0]);
390 Sk2s P1 = from_point(src[1]);
391 Sk2s P2 = from_point(src[2]);
392 Sk2s P3 = from_point(src[3]);
399 void SkEvalCubicAt(const SkPoint src[4], SkScalar t, SkPoint* loc,
401 SkASSERT(src);
405 *loc = to_point(SkCubicCoeff(src).eval(t));
411 if ((t == 0 && src[0] == src[1]) || (t == 1 && src[2] == src[3])) {
413 *tangent = src[2] - src[0];
415 *tangent = src[3] - src[1];
418 *tangent = src[3] - src[0];
421 *tangent = eval_cubic_derivative(src, t);
425 *curvature = eval_cubic_2ndDerivative(src, t);
454 void SkChopCubicAt(const SkPoint src[4], SkPoint dst[7], SkScalar t) {
459 memcpy(dst, src, sizeof(SkPoint) * 4);
460 dst[4] = dst[5] = dst[6] = src[3];
464 float2 p0 = skvx::bit_pun<float2>(src[0]);
465 float2 p1 = skvx::bit_pun<float2>(src[1]);
466 float2 p2 = skvx::bit_pun<float2>(src[2]);
467 float2 p3 = skvx::bit_pun<float2>(src[3]);
486 void SkChopCubicAt(const SkPoint src[4], SkPoint dst[10], float t0, float t1) {
492 SkChopCubicAt(src, dst, t0);
493 dst[7] = dst[8] = dst[9] = src[3];
499 p00.lo = p00.hi = skvx::bit_pun<float2>(src[0]);
500 p11.lo = p11.hi = skvx::bit_pun<float2>(src[1]);
501 p22.lo = p22.hi = skvx::bit_pun<float2>(src[2]);
502 p33.lo = p33.hi = skvx::bit_pun<float2>(src[3]);
525 void SkChopCubicAt(const SkPoint src[4], SkPoint dst[],
534 memcpy(dst, src, 4*sizeof(SkPoint));
544 SkChopCubicAt(src, dst, tt[0], tt[1]);
545 src = dst = dst + 6;
555 SkChopCubicAt(src, dst, t);
561 void SkChopCubicAtHalf(const SkPoint src[4], SkPoint dst[7]) {
562 SkChopCubicAt(src, dst, 0.5f);
606 float SkFindCubicMidTangent(const SkPoint src[4]) {
612 SkVector tan0 = (src[0] == src[1]) ? src[2] - src[0] : src[1] - src[0];
613 SkVector tan1 = (src[2] == src[3]) ? src[3] - src[1] : src[3] - src[2];
628 Sk4f C_x = fma(kM[0], src[0].fX,
629 fma(kM[1], src[1].fX,
630 fma(kM[2], src[2].fX, Sk4f(src[3].fX, 0,0,0))));
631 Sk4f C_y = fma(kM[0], src[0].fY,
632 fma(kM[1], src[1].fY,
633 fma(kM[2], src[2].fY, Sk4f(src[3].fY, 0,0,0))));
684 int SkChopCubicAtYExtrema(const SkPoint src[4], SkPoint dst[10]) {
686 int roots = SkFindCubicExtrema(src[0].fY, src[1].fY, src[2].fY,
687 src[3].fY, tValues);
689 SkChopCubicAt(src, dst, tValues, roots);
700 int SkChopCubicAtXExtrema(const SkPoint src[4], SkPoint dst[10]) {
702 int roots = SkFindCubicExtrema(src[0].fX, src[1].fX, src[2].fX,
703 src[3].fX, tValues);
705 SkChopCubicAt(src, dst, tValues, roots);
727 int SkFindCubicInflections(const SkPoint src[4], SkScalar tValues[]) {
728 SkScalar Ax = src[1].fX - src[0].fX;
729 SkScalar Ay = src[1].fY - src[0].fY;
730 SkScalar Bx = src[2].fX - 2 * src[1].fX + src[0].fX;
731 SkScalar By = src[2].fY - 2 * src[1].fY + src[0].fY;
732 SkScalar Cx = src[3].fX + 3 * (src[1].fX - src[2].fX) - src[0].fX;
733 SkScalar Cy = src[3].fY + 3 * (src[1].fY - src[2].fY) - src[0].fY;
741 int SkChopCubicAtInflections(const SkPoint src[], SkPoint dst[10]) {
743 int count = SkFindCubicInflections(src, tValues);
747 memcpy(dst, src, 4 * sizeof(SkPoint));
749 SkChopCubicAt(src, dst, tValues, count);
1007 static void formulate_F1DotF2(const SkScalar src[], SkScalar coeff[4]) {
1008 SkScalar a = src[2] - src[0];
1009 SkScalar b = src[4] - 2 * src[2] + src[0];
1010 SkScalar c = src[6] + 3 * (src[2] - src[4]) - src[0];
1029 int SkFindCubicMaxCurvature(const SkPoint src[4], SkScalar tValues[3]) {
1033 formulate_F1DotF2(&src[0].fX, coeffX);
1034 formulate_F1DotF2(&src[0].fY, coeffY);
1046 int SkChopCubicAtMaxCurvature(const SkPoint src[4], SkPoint dst[13],
1055 int rootCount = SkFindCubicMaxCurvature(src, roots);
1067 memcpy(dst, src, 4 * sizeof(SkPoint));
1069 SkChopCubicAt(src, dst, tValues, count);
1077 static SkScalar calc_cubic_precision(const SkPoint src[4]) {
1078 return (SkPointPriv::DistanceToSqd(src[1], src[0]) + SkPointPriv::DistanceToSqd(src[2], src[1])
1079 + SkPointPriv::DistanceToSqd(src[3], src[2])) * 1e-8f;
1082 // Returns true if both points src[testIndex], src[testIndex+1] are in the same half plane defined
1083 // by the line segment src[lineIndex], src[lineIndex+1].
1084 static bool on_same_side(const SkPoint src[4], int testIndex, int lineIndex) {
1085 SkPoint origin = src[lineIndex];
1086 SkVector line = src[lineIndex + 1] - origin;
1089 SkVector testLine = src[testIndex + index] - origin;
1098 SkScalar SkFindCubicCusp(const SkPoint src[4]) {
1103 if (src[0] == src[1]) {
1106 if (src[2] == src[3]) {
1111 if (on_same_side(src, 0, 2) || on_same_side(src, 2, 0)) {
1117 int roots = SkFindCubicMaxCurvature(src, maxCurvature);
1126 SkVector dPt = eval_cubic_derivative(src, testT);
1128 SkScalar precision = calc_cubic_precision(src);
1138 #include "src/pathops/SkPathOpsCubic.h"
1142 static bool cubic_dchop_at_intercept(const SkPoint src[4], SkScalar intercept, SkPoint dst[7],
1146 int count = (cubic.set(src).*method)(intercept, roots);
1157 bool SkChopMonoCubicAtY(SkPoint src[4], SkScalar y, SkPoint dst[7]) {
1158 return cubic_dchop_at_intercept(src, y, dst, &SkDCubic::horizontalIntersect);
1161 bool SkChopMonoCubicAtX(SkPoint src[4], SkScalar x, SkPoint dst[7]) {
1162 return cubic_dchop_at_intercept(src, x, dst, &SkDCubic::verticalIntersect);
1196 static void conic_deriv_coeff(const SkScalar src[],
1199 const SkScalar P20 = src[4] - src[0];
1200 const SkScalar P10 = src[2] - src[0];
1207 static bool conic_find_extrema(const SkScalar src[], SkScalar w, SkScalar* t) {
1209 conic_deriv_coeff(src, w, coeff);
1223 static void p3d_interp(const SkScalar src[7], SkScalar dst[7], SkScalar t) {
1224 SkScalar ab = SkScalarInterp(src[0], src[3], t);
1225 SkScalar bc = SkScalarInterp(src[3], src[6], t);
1231 static void ratquad_mapTo3D(const SkPoint src[3], SkScalar w, SkPoint3 dst[3]) {
1232 dst[0].set(src[0].fX * 1, src[0].fY * 1, 1);
1233 dst[1].set(src[1].fX * w, src[1].fY * w, w);
1234 dst[2].set(src[2].fX * 1, src[2].fY * 1, 1);
1237 static SkPoint project_down(const SkPoint3& src) {
1238 return {src.fX / src.fZ, src.fY / src.fZ};
1438 static SkPoint* subdivide(const SkConic& src, SkPoint pts[], int level) {
1442 memcpy(pts, &src.fPts[1], 2 * sizeof(SkPoint));
1446 src.chop(dst);
1447 const SkScalar startY = src.fPts[0].fY;
1448 SkScalar endY = src.fPts[2].fY;
1449 if (between(startY, src.fPts[1].fY, endY)) {
1624 SkPoint3 src[3], dst[3];
1626 ratquad_mapTo3D(pts, w, src);
1628 matrix.mapHomogeneousPoints(dst, src, 3);