Lines Matching refs:pts
299 for (auto [verb, pts, weight] : SkPathPriv::Iterate(*this)) {
311 firstPt = prevPt = pts[0];
316 if (!SkPathPriv::AllPointsEq(pts, pointCount + 1)) {
323 orig.set(pts, *weight);
335 if (!check_edge_against_rect(prevPt, pts[nextPt], rect, direction)) {
339 prevPt = pts[nextPt];
391 const SkPoint* pts = fPathRef->points();
392 line[0] = pts[0];
393 line[1] = pts[1];
454 const SkPoint* pts = fPathRef->points();
455 return SkPathPriv::IsRectContour(*this, false, &currVerb, &pts, isClosed, direction, rect);
681 SkPoint* pts = ed.growForVerb(kQuad_Verb);
682 pts[0].set(x1, y1);
683 pts[1].set(x2, y2);
711 SkPoint* pts = ed.growForVerb(kConic_Verb, w);
712 pts[0].set(x1, y1);
713 pts[1].set(x2, y2);
735 SkPoint* pts = ed.growForVerb(kCubic_Verb);
736 pts[0].set(x1, y1);
737 pts[1].set(x2, y2);
738 pts[2].set(x3, y3);
817 SkPath& SkPath::addPoly(const SkPoint pts[], int count, bool close) {
828 ed.growForVerb(kMove_Verb)->set(pts[0].fX, pts[0].fY);
831 memcpy(p, &pts[1], (count-1) * sizeof(SkPoint));
1015 const SkPoint* pts = fPathRef->points() + startPtIndex;
1016 const SkPoint& first = *pts;
1018 if (first != pts[index]) {
1067 // The corner iterator pts are tracking "behind" the oval/radii pts.
1404 for (auto [verb, pts, w] : SkPathPriv::Iterate(*src)) {
1408 mapPtsProc(matrix, mappedPts, &pts[0], 1);
1422 mapPtsProc(matrix, mappedPts, &pts[1], 1);
1426 mapPtsProc(matrix, mappedPts, &pts[1], 2);
1430 mapPtsProc(matrix, mappedPts, &pts[1], 2);
1434 mapPtsProc(matrix, mappedPts, &pts[1], 3);
1457 const SkPoint* pts = path.fPathRef->pointsEnd() - 1;
1462 pts -= SkPathPriv::PtsInVerb(v);
1468 this->lineTo(pts[0]);
1471 this->quadTo(pts[1], pts[0]);
1474 this->conicTo(pts[1], pts[0], *--conicWeights);
1477 this->cubicTo(pts[2], pts[1], pts[0]);
1499 const SkPoint* pts = src->fPathRef->pointsEnd();
1509 --pts;
1510 this->moveTo(pts->fX, pts->fY);
1513 pts -= n;
1521 pts += 1; // so we see the point in "if (needMove)" above
1524 this->lineTo(pts[0]);
1527 this->quadTo(pts[1], pts[0]);
1530 this->conicTo(pts[1], pts[0], *--conicWeights);
1533 this->cubicTo(pts[2], pts[1], pts[0]);
1554 static void subdivide_cubic_to(SkPath* path, const SkPoint pts[4],
1559 SkChopCubicAtHalf(pts, tmp);
1563 path->cubicTo(pts[1], pts[2], pts[3]);
1593 SkPoint pts[4];
1596 while ((verb = iter.next(pts)) != kDone_Verb) {
1599 tmp.moveTo(pts[0]);
1602 tmp.lineTo(pts[1]);
1606 tmp.conicTo(pts[1], pts[2],
1607 SkConic::TransformW(pts, SK_Scalar1, matrix));
1610 tmp.conicTo(pts[1], pts[2],
1611 SkConic::TransformW(pts, iter.conicWeight(), matrix));
1614 subdivide_cubic_to(&tmp, pts);
1735 SkPath::Verb SkPath::Iter::autoClose(SkPoint pts[2]) {
1736 SkASSERT(pts);
1746 pts[0] = fLastPt;
1747 pts[1] = fMoveTo;
1752 pts[0] = fMoveTo;
1774 SkPoint* SK_RESTRICT pts = ptsParam;
1780 verb = this->autoClose(pts);
1790 pts[0] = *srcPts;
1796 pts[0] = fLastPt;
1797 pts[1] = srcPts[0];
1806 pts[0] = fLastPt;
1807 memcpy(&pts[1], srcPts, 2 * sizeof(SkPoint));
1812 pts[0] = fLastPt;
1813 memcpy(&pts[1], srcPts, 3 * sizeof(SkPoint));
1818 verb = this->autoClose(pts);
1837 SkPath::Verb SkPath::RawIter::next(SkPoint pts[4]) {
1854 memcpy(pts, iterPts, sizeof(SkPoint) * numPts);
1865 static void append_params(SkString* str, const char label[], const SkPoint pts[],
1870 const SkScalar* values = &pts[0].fX;
1903 SkPoint pts[4];
1915 while ((verb = iter.next(pts)) != kDone_Verb) {
1918 append_params(&builder, "path.moveTo", &pts[0], 1, asType);
1921 append_params(&builder, "path.lineTo", &pts[1], 1, asType);
1924 append_params(&builder, "path.quadTo", &pts[1], 2, asType);
1927 append_params(&builder, "path.conicTo", &pts[1], 2, asType, iter.conicWeight());
1930 append_params(&builder, "path.cubicTo", &pts[1], 3, asType);
2309 for (auto [verb, pts, wt] : SkPathPriv::Iterate(*this)) {
2313 state.setMovePt(pts[0]);
2333 if (!state.addPt(pts[i])) {
2372 const SkPoint* pts() const { return fCurrPt; }
2404 // skip pts of prev contour
2463 static int find_max_y(const SkPoint pts[], int count) {
2465 SkScalar max = pts[0].fY;
2468 SkScalar y = pts[i].fY;
2477 static int find_diff_pt(const SkPoint pts[], int index, int n, int inc) {
2484 if (pts[index] != pts[i]) { // found a different point, success!
2495 static int find_min_max_x_at_y(const SkPoint pts[], int index, int n,
2497 const SkScalar y = pts[index].fY;
2498 SkScalar min = pts[index].fX;
2503 if (pts[i].fY != y) {
2506 SkScalar x = pts[i].fX;
2556 const SkPoint* pts = iter.pts();
2558 int index = find_max_y(pts, n);
2559 if (pts[index].fY < ymax) {
2565 if (pts[(index + 1) % n].fY == pts[index].fY) {
2567 int minIndex = find_min_max_x_at_y(pts, index, n, &maxIndex);
2571 SkASSERT(pts[minIndex].fY == pts[index].fY);
2572 SkASSERT(pts[maxIndex].fY == pts[index].fY);
2573 SkASSERT(pts[minIndex].fX <= pts[maxIndex].fX);
2580 // but we try to find pts that form non-zero vectors from pts[index]
2583 // we have to guard our search (e.g. all the pts could be in the
2588 int prev = find_diff_pt(pts, index, n, n - 1);
2593 int next = find_diff_pt(pts, index, n, 1);
2595 cross = cross_prod(pts[prev], pts[index], pts[next]);
2599 if (0 == cross && pts[prev].fY == pts[index].fY && pts[next].fY == pts[index].fY) {
2601 cross = pts[index].fX - pts[next].fX;
2607 ymax = pts[index].fY;
2635 template <size_t N> static void find_minmax(const SkPoint pts[],
2638 min = max = pts[0].fX;
2640 min = std::min(min, pts[i].fX);
2641 max = std::max(max, pts[i].fX);
2655 static int winding_mono_cubic(const SkPoint pts[], SkScalar x, SkScalar y, int* onCurveCount) {
2656 SkScalar y0 = pts[0].fY;
2657 SkScalar y3 = pts[3].fY;
2668 if (checkOnCurve(x, y, pts[0], pts[3])) {
2678 find_minmax<4>(pts, &min, &max);
2688 if (!SkCubicClipper::ChopMonoAtY(pts, y, &t)) {
2691 SkScalar xt = eval_cubic_pts(pts[0].fX, pts[1].fX, pts[2].fX, pts[3].fX, t);
2693 if (x != pts[3].fX || y != pts[3].fY) { // don't test end points; they're start points
2701 static int winding_cubic(const SkPoint pts[], SkScalar x, SkScalar y, int* onCurveCount) {
2703 int n = SkChopCubicAtYExtrema(pts, dst);
2730 const SkPoint* pts = conic.fPts;
2731 SkScalar y0 = pts[0].fY;
2732 SkScalar y2 = pts[2].fY;
2743 if (checkOnCurve(x, y, pts[0], pts[2])) {
2752 SkScalar A = pts[2].fY;
2753 SkScalar B = pts[1].fY * conic.fW - y * conic.fW + y;
2754 SkScalar C = pts[0].fY;
2765 xt = pts[1 - dir].fX;
2768 xt = conic_eval_numerator(&pts[0].fX, conic.fW, t) / conic_eval_denominator(conic.fW, t);
2771 if (x != pts[2].fX || y != pts[2].fY) { // don't test end points; they're start points
2791 static int winding_conic(const SkPoint pts[], SkScalar x, SkScalar y, SkScalar weight,
2793 SkConic conic(pts, weight);
2797 bool isMono = is_mono_quad(pts[0].fY, pts[1].fY, pts[2].fY) || !conic.chopAtYExtrema(chopped);
2805 static int winding_mono_quad(const SkPoint pts[], SkScalar x, SkScalar y, int* onCurveCount) {
2806 SkScalar y0 = pts[0].fY;
2807 SkScalar y2 = pts[2].fY;
2818 if (checkOnCurve(x, y, pts[0], pts[2])) {
2827 if (pts[0].fX > x && pts[1].fX > x && pts[2].fX > x) {
2833 int n = SkFindUnitQuadRoots(pts[0].fY - 2 * pts[1].fY + pts[2].fY,
2834 2 * (pts[1].fY - pts[0].fY),
2835 pts[0].fY - y,
2843 xt = pts[1 - dir].fX;
2846 SkScalar C = pts[0].fX;
2847 SkScalar A = pts[2].fX - 2 * pts[1].fX + C;
2848 SkScalar B = 2 * (pts[1].fX - C);
2852 if (x != pts[2].fX || y != pts[2].fY) { // don't test end points; they're start points
2860 static int winding_quad(const SkPoint pts[], SkScalar x, SkScalar y, int* onCurveCount) {
2864 if (!is_mono_quad(pts[0].fY, pts[1].fY, pts[2].fY)) {
2865 n = SkChopQuadAtYExtrema(pts, dst);
2866 pts = dst;
2868 int w = winding_mono_quad(pts, x, y, onCurveCount);
2870 w += winding_mono_quad(&pts[2], x, y, onCurveCount);
2875 static int winding_line(const SkPoint pts[], SkScalar x, SkScalar y, int* onCurveCount) {
2876 SkScalar x0 = pts[0].fX;
2877 SkScalar y0 = pts[0].fY;
2878 SkScalar x1 = pts[1].fX;
2879 SkScalar y1 = pts[1].fY;
2892 if (checkOnCurve(x, y, pts[0], pts[1])) {
2899 SkScalar cross = (x1 - x0) * (y - pts[0].fY) - dy * (x - x0);
2905 if (x != x1 || y != pts[1].fY) {
2915 static void tangent_cubic(const SkPoint pts[], SkScalar x, SkScalar y,
2917 if (!between(pts[0].fY, y, pts[1].fY) && !between(pts[1].fY, y, pts[2].fY)
2918 && !between(pts[2].fY, y, pts[3].fY)) {
2921 if (!between(pts[0].fX, x, pts[1].fX) && !between(pts[1].fX, x, pts[2].fX)
2922 && !between(pts[2].fX, x, pts[3].fX)) {
2926 int n = SkChopCubicAtYExtrema(pts, dst);
2943 static void tangent_conic(const SkPoint pts[], SkScalar x, SkScalar y, SkScalar w,
2945 if (!between(pts[0].fY, y, pts[1].fY) && !between(pts[1].fY, y, pts[2].fY)) {
2948 if (!between(pts[0].fX, x, pts[1].fX) && !between(pts[1].fX, x, pts[2].fX)) {
2952 SkScalar A = pts[2].fY;
2953 SkScalar B = pts[1].fY * w - y * w + y;
2954 SkScalar C = pts[0].fY;
2961 SkScalar xt = conic_eval_numerator(&pts[0].fX, w, t) / conic_eval_denominator(w, t);
2965 SkConic conic(pts, w);
2970 static void tangent_quad(const SkPoint pts[], SkScalar x, SkScalar y,
2972 if (!between(pts[0].fY, y, pts[1].fY) && !between(pts[1].fY, y, pts[2].fY)) {
2975 if (!between(pts[0].fX, x, pts[1].fX) && !between(pts[1].fX, x, pts[2].fX)) {
2979 int n = SkFindUnitQuadRoots(pts[0].fY - 2 * pts[1].fY + pts[2].fY,
2980 2 * (pts[1].fY - pts[0].fY),
2981 pts[0].fY - y,
2985 SkScalar C = pts[0].fX;
2986 SkScalar A = pts[2].fX - 2 * pts[1].fX + C;
2987 SkScalar B = 2 * (pts[1].fX - C);
2992 tangents->push_back(SkEvalQuadTangentAt(pts, t));
2996 static void tangent_line(const SkPoint pts[], SkScalar x, SkScalar y,
2998 SkScalar y0 = pts[0].fY;
2999 SkScalar y1 = pts[1].fY;
3003 SkScalar x0 = pts[0].fX;
3004 SkScalar x1 = pts[1].fX;
3037 SkPoint pts[4];
3038 switch (iter.next(pts)) {
3043 w += winding_line(pts, x, y, &onCurveCount);
3046 w += winding_quad(pts, x, y, &onCurveCount);
3049 w += winding_conic(pts, x, y, iter.conicWeight(), &onCurveCount);
3052 w += winding_cubic(pts, x, y, &onCurveCount);
3079 SkPoint pts[4];
3081 switch (iter.next(pts)) {
3086 tangent_line(pts, x, y, &tangents);
3089 tangent_quad(pts, x, y, &tangents);
3092 tangent_conic(pts, x, y, iter.conicWeight(), &tangents);
3095 tangent_cubic(pts, x, y, &tangents);
3124 SkScalar w, SkPoint pts[], int pow2) {
3126 return conic.chopIntoQuadsPOW2(pts, pow2);
3175 // Check for two cases of rectangles: pts 0 and 3 form a vertical edge or a horizontal edge (
3176 // and pts 1 and 2 the opposite vertical or horizontal edge).
3342 for (auto [verb, pts, w] : SkPathPriv::Iterate(*this)) {
3346 extremas[0] = pts[0];
3350 extremas[0] = pts[1];
3354 count = compute_quad_extremas(pts, extremas);
3357 count = compute_conic_extremas(pts, *w, extremas);
3360 count = compute_cubic_extremas(pts, extremas);
3442 SkPath SkPath::Make(const SkPoint pts[], int pointCount,
3456 return SkPath(sk_sp<SkPathRef>(new SkPathRef(SkTDArray<SkPoint>(pts, info.points),
3491 SkPath SkPath::Polygon(const SkPoint pts[], int count, bool isClosed,
3493 return SkPathBuilder().addPolygon(pts, count, isClosed)
3511 const SkPoint* pts = *ptsPtr;
3523 savePts = pts;
3529 lastPt = pts;
3531 SkPoint lineEnd = SkPath::kClose_Verb == verb ? *firstPt : *pts++;
3598 firstPt = pts;
3605 lineStart = *pts++;
3645 const SkPoint* pts = path.fPathRef->points();
3648 if (!IsRectContour(path, true, &currVerb, &pts, nullptr, &testDirs[0], &testRects[0])) {
3651 if (IsRectContour(path, false, &currVerb, &pts, nullptr, &testDirs[1], &testRects[1])) {
3785 SkPoint pts[4];
3787 while ((verb = clipper->next(pts)) != SkPath::kDone_Verb) {
3789 rec->fResult.moveTo(pts[0]);
3790 rec->fPrev = pts[0];
3794 if (addLineTo || pts[0] != rec->fPrev) {
3795 rec->fResult.lineTo(pts[0]);
3800 rec->fResult.lineTo(pts[1]);
3801 rec->fPrev = pts[1];
3804 rec->fResult.quadTo(pts[1], pts[2]);
3805 rec->fPrev = pts[2];
3808 rec->fResult.cubicTo(pts[1], pts[2], pts[3]);
3809 rec->fPrev = pts[3];
3861 const SkPoint* pts = path.fPathRef->points();
3865 if (pts[i-1].fX != pts[i].fX && pts[i-1].fY != pts[i].fY) {