| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * Copyright 2012 Google Inc. | 2  * Copyright 2012 Google Inc. | 
| 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 #ifndef SkPathOpsCurve_DEFINE | 7 #ifndef SkPathOpsCurve_DEFINE | 
| 8 #define SkPathOpsCurve_DEFINE | 8 #define SkPathOpsCurve_DEFINE | 
| 9 | 9 | 
| 10 #include "SkIntersections.h" | 10 #include "SkIntersections.h" | 
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 101     return conic.ptAtT(t); | 101     return conic.ptAtT(t); | 
| 102 } | 102 } | 
| 103 | 103 | 
| 104 static SkDPoint dcubic_xy_at_t(const SkPoint a[4], SkScalar , double t) { | 104 static SkDPoint dcubic_xy_at_t(const SkPoint a[4], SkScalar , double t) { | 
| 105     SkDCubic cubic; | 105     SkDCubic cubic; | 
| 106     cubic.set(a); | 106     cubic.set(a); | 
| 107     return cubic.ptAtT(t); | 107     return cubic.ptAtT(t); | 
| 108 } | 108 } | 
| 109 | 109 | 
| 110 static SkDPoint (* const CurveDPointAtT[])(const SkPoint[], SkScalar , double ) 
     = { | 110 static SkDPoint (* const CurveDPointAtT[])(const SkPoint[], SkScalar , double ) 
     = { | 
| 111     NULL, | 111     nullptr, | 
| 112     dline_xy_at_t, | 112     dline_xy_at_t, | 
| 113     dquad_xy_at_t, | 113     dquad_xy_at_t, | 
| 114     dconic_xy_at_t, | 114     dconic_xy_at_t, | 
| 115     dcubic_xy_at_t | 115     dcubic_xy_at_t | 
| 116 }; | 116 }; | 
| 117 | 117 | 
| 118 static SkPoint fline_xy_at_t(const SkPoint a[2], SkScalar weight, double t) { | 118 static SkPoint fline_xy_at_t(const SkPoint a[2], SkScalar weight, double t) { | 
| 119     return dline_xy_at_t(a, weight, t).asSkPoint(); | 119     return dline_xy_at_t(a, weight, t).asSkPoint(); | 
| 120 } | 120 } | 
| 121 | 121 | 
| 122 static SkPoint fquad_xy_at_t(const SkPoint a[3], SkScalar weight, double t) { | 122 static SkPoint fquad_xy_at_t(const SkPoint a[3], SkScalar weight, double t) { | 
| 123     return dquad_xy_at_t(a, weight, t).asSkPoint(); | 123     return dquad_xy_at_t(a, weight, t).asSkPoint(); | 
| 124 } | 124 } | 
| 125 | 125 | 
| 126 static SkPoint fconic_xy_at_t(const SkPoint a[3], SkScalar weight, double t) { | 126 static SkPoint fconic_xy_at_t(const SkPoint a[3], SkScalar weight, double t) { | 
| 127     return dconic_xy_at_t(a, weight, t).asSkPoint(); | 127     return dconic_xy_at_t(a, weight, t).asSkPoint(); | 
| 128 } | 128 } | 
| 129 | 129 | 
| 130 static SkPoint fcubic_xy_at_t(const SkPoint a[4], SkScalar weight, double t) { | 130 static SkPoint fcubic_xy_at_t(const SkPoint a[4], SkScalar weight, double t) { | 
| 131     return dcubic_xy_at_t(a, weight, t).asSkPoint(); | 131     return dcubic_xy_at_t(a, weight, t).asSkPoint(); | 
| 132 } | 132 } | 
| 133 | 133 | 
| 134 static SkPoint (* const CurvePointAtT[])(const SkPoint[], SkScalar , double ) = 
     { | 134 static SkPoint (* const CurvePointAtT[])(const SkPoint[], SkScalar , double ) = 
     { | 
| 135     NULL, | 135     nullptr, | 
| 136     fline_xy_at_t, | 136     fline_xy_at_t, | 
| 137     fquad_xy_at_t, | 137     fquad_xy_at_t, | 
| 138     fconic_xy_at_t, | 138     fconic_xy_at_t, | 
| 139     fcubic_xy_at_t | 139     fcubic_xy_at_t | 
| 140 }; | 140 }; | 
| 141 | 141 | 
| 142 static SkDVector dline_dxdy_at_t(const SkPoint a[2], SkScalar , double ) { | 142 static SkDVector dline_dxdy_at_t(const SkPoint a[2], SkScalar , double ) { | 
| 143     SkDLine line; | 143     SkDLine line; | 
| 144     line.set(a); | 144     line.set(a); | 
| 145     return line[1] - line[0]; | 145     return line[1] - line[0]; | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
| 157     return conic.dxdyAtT(t); | 157     return conic.dxdyAtT(t); | 
| 158 } | 158 } | 
| 159 | 159 | 
| 160 static SkDVector dcubic_dxdy_at_t(const SkPoint a[4], SkScalar , double t) { | 160 static SkDVector dcubic_dxdy_at_t(const SkPoint a[4], SkScalar , double t) { | 
| 161     SkDCubic cubic; | 161     SkDCubic cubic; | 
| 162     cubic.set(a); | 162     cubic.set(a); | 
| 163     return cubic.dxdyAtT(t); | 163     return cubic.dxdyAtT(t); | 
| 164 } | 164 } | 
| 165 | 165 | 
| 166 static SkDVector (* const CurveDSlopeAtT[])(const SkPoint[], SkScalar , double )
      = { | 166 static SkDVector (* const CurveDSlopeAtT[])(const SkPoint[], SkScalar , double )
      = { | 
| 167     NULL, | 167     nullptr, | 
| 168     dline_dxdy_at_t, | 168     dline_dxdy_at_t, | 
| 169     dquad_dxdy_at_t, | 169     dquad_dxdy_at_t, | 
| 170     dconic_dxdy_at_t, | 170     dconic_dxdy_at_t, | 
| 171     dcubic_dxdy_at_t | 171     dcubic_dxdy_at_t | 
| 172 }; | 172 }; | 
| 173 | 173 | 
| 174 static SkVector fline_dxdy_at_t(const SkPoint a[2], SkScalar , double ) { | 174 static SkVector fline_dxdy_at_t(const SkPoint a[2], SkScalar , double ) { | 
| 175     return a[1] - a[0]; | 175     return a[1] - a[0]; | 
| 176 } | 176 } | 
| 177 | 177 | 
| 178 static SkVector fquad_dxdy_at_t(const SkPoint a[3], SkScalar weight, double t) { | 178 static SkVector fquad_dxdy_at_t(const SkPoint a[3], SkScalar weight, double t) { | 
| 179     return dquad_dxdy_at_t(a, weight, t).asSkVector(); | 179     return dquad_dxdy_at_t(a, weight, t).asSkVector(); | 
| 180 } | 180 } | 
| 181 | 181 | 
| 182 static SkVector fconic_dxdy_at_t(const SkPoint a[3], SkScalar weight, double t) 
     { | 182 static SkVector fconic_dxdy_at_t(const SkPoint a[3], SkScalar weight, double t) 
     { | 
| 183     return dconic_dxdy_at_t(a, weight, t).asSkVector(); | 183     return dconic_dxdy_at_t(a, weight, t).asSkVector(); | 
| 184 } | 184 } | 
| 185 | 185 | 
| 186 static SkVector fcubic_dxdy_at_t(const SkPoint a[4], SkScalar weight, double t) 
     { | 186 static SkVector fcubic_dxdy_at_t(const SkPoint a[4], SkScalar weight, double t) 
     { | 
| 187     return dcubic_dxdy_at_t(a, weight, t).asSkVector(); | 187     return dcubic_dxdy_at_t(a, weight, t).asSkVector(); | 
| 188 } | 188 } | 
| 189 | 189 | 
| 190 static SkVector (* const CurveSlopeAtT[])(const SkPoint[], SkScalar , double ) =
      { | 190 static SkVector (* const CurveSlopeAtT[])(const SkPoint[], SkScalar , double ) =
      { | 
| 191     NULL, | 191     nullptr, | 
| 192     fline_dxdy_at_t, | 192     fline_dxdy_at_t, | 
| 193     fquad_dxdy_at_t, | 193     fquad_dxdy_at_t, | 
| 194     fconic_dxdy_at_t, | 194     fconic_dxdy_at_t, | 
| 195     fcubic_dxdy_at_t | 195     fcubic_dxdy_at_t | 
| 196 }; | 196 }; | 
| 197 | 197 | 
| 198 static bool line_is_vertical(const SkPoint a[2], SkScalar , double startT, doubl
     e endT) { | 198 static bool line_is_vertical(const SkPoint a[2], SkScalar , double startT, doubl
     e endT) { | 
| 199     SkDLine line; | 199     SkDLine line; | 
| 200     line.set(a); | 200     line.set(a); | 
| 201     SkDPoint dst[2] = { line.ptAtT(startT), line.ptAtT(endT) }; | 201     SkDPoint dst[2] = { line.ptAtT(startT), line.ptAtT(endT) }; | 
| (...skipping 16 matching lines...) Expand all  Loading... | 
| 218 | 218 | 
| 219 static bool cubic_is_vertical(const SkPoint a[4], SkScalar , double startT, doub
     le endT) { | 219 static bool cubic_is_vertical(const SkPoint a[4], SkScalar , double startT, doub
     le endT) { | 
| 220     SkDCubic cubic; | 220     SkDCubic cubic; | 
| 221     cubic.set(a); | 221     cubic.set(a); | 
| 222     SkDCubic dst = cubic.subDivide(startT, endT); | 222     SkDCubic dst = cubic.subDivide(startT, endT); | 
| 223     return AlmostEqualUlps(dst[0].fX, dst[1].fX) && AlmostEqualUlps(dst[1].fX, d
     st[2].fX) | 223     return AlmostEqualUlps(dst[0].fX, dst[1].fX) && AlmostEqualUlps(dst[1].fX, d
     st[2].fX) | 
| 224             && AlmostEqualUlps(dst[2].fX, dst[3].fX); | 224             && AlmostEqualUlps(dst[2].fX, dst[3].fX); | 
| 225 } | 225 } | 
| 226 | 226 | 
| 227 static bool (* const CurveIsVertical[])(const SkPoint[], SkScalar , double , dou
     ble) = { | 227 static bool (* const CurveIsVertical[])(const SkPoint[], SkScalar , double , dou
     ble) = { | 
| 228     NULL, | 228     nullptr, | 
| 229     line_is_vertical, | 229     line_is_vertical, | 
| 230     quad_is_vertical, | 230     quad_is_vertical, | 
| 231     conic_is_vertical, | 231     conic_is_vertical, | 
| 232     cubic_is_vertical | 232     cubic_is_vertical | 
| 233 }; | 233 }; | 
| 234 | 234 | 
| 235 static void line_intersect_ray(const SkPoint a[2], SkScalar , const SkDLine& ray
     , | 235 static void line_intersect_ray(const SkPoint a[2], SkScalar , const SkDLine& ray
     , | 
| 236         SkIntersections* i) { | 236         SkIntersections* i) { | 
| 237     SkDLine line; | 237     SkDLine line; | 
| 238     line.set(a); | 238     line.set(a); | 
| (...skipping 16 matching lines...) Expand all  Loading... | 
| 255 | 255 | 
| 256 static void cubic_intersect_ray(const SkPoint a[4], SkScalar , const SkDLine& ra
     y, | 256 static void cubic_intersect_ray(const SkPoint a[4], SkScalar , const SkDLine& ra
     y, | 
| 257         SkIntersections* i) { | 257         SkIntersections* i) { | 
| 258     SkDCubic cubic; | 258     SkDCubic cubic; | 
| 259     cubic.set(a); | 259     cubic.set(a); | 
| 260     i->intersectRay(cubic, ray); | 260     i->intersectRay(cubic, ray); | 
| 261 } | 261 } | 
| 262 | 262 | 
| 263 static void (* const CurveIntersectRay[])(const SkPoint[] , SkScalar , const SkD
     Line& , | 263 static void (* const CurveIntersectRay[])(const SkPoint[] , SkScalar , const SkD
     Line& , | 
| 264         SkIntersections* ) = { | 264         SkIntersections* ) = { | 
| 265     NULL, | 265     nullptr, | 
| 266     line_intersect_ray, | 266     line_intersect_ray, | 
| 267     quad_intersect_ray, | 267     quad_intersect_ray, | 
| 268     conic_intersect_ray, | 268     conic_intersect_ray, | 
| 269     cubic_intersect_ray | 269     cubic_intersect_ray | 
| 270 }; | 270 }; | 
| 271 | 271 | 
| 272 static int line_intercept_h(const SkPoint a[2], SkScalar , SkScalar y, double* r
     oots) { | 272 static int line_intercept_h(const SkPoint a[2], SkScalar , SkScalar y, double* r
     oots) { | 
| 273     SkDLine line; | 273     SkDLine line; | 
| 274     roots[0] = SkIntersections::HorizontalIntercept(line.set(a), y); | 274     roots[0] = SkIntersections::HorizontalIntercept(line.set(a), y); | 
| 275     return between(0, roots[0], 1); | 275     return between(0, roots[0], 1); | 
| (...skipping 29 matching lines...) Expand all  Loading... | 
| 305     SkDCubic cubic; | 305     SkDCubic cubic; | 
| 306     return cubic.set(a).horizontalIntersect(y, roots); | 306     return cubic.set(a).horizontalIntersect(y, roots); | 
| 307 } | 307 } | 
| 308 | 308 | 
| 309 static int cubic_intercept_v(const SkPoint a[3], SkScalar , SkScalar x, double* 
     roots) { | 309 static int cubic_intercept_v(const SkPoint a[3], SkScalar , SkScalar x, double* 
     roots) { | 
| 310     SkDCubic cubic; | 310     SkDCubic cubic; | 
| 311     return cubic.set(a).verticalIntersect(x, roots); | 311     return cubic.set(a).verticalIntersect(x, roots); | 
| 312 } | 312 } | 
| 313 | 313 | 
| 314 static int (* const CurveIntercept[])(const SkPoint[] , SkScalar , SkScalar , do
     uble* ) = { | 314 static int (* const CurveIntercept[])(const SkPoint[] , SkScalar , SkScalar , do
     uble* ) = { | 
| 315     NULL, | 315     nullptr, | 
| 316     NULL, | 316     nullptr, | 
| 317     line_intercept_h, | 317     line_intercept_h, | 
| 318     line_intercept_v, | 318     line_intercept_v, | 
| 319     quad_intercept_h, | 319     quad_intercept_h, | 
| 320     quad_intercept_v, | 320     quad_intercept_v, | 
| 321     conic_intercept_h, | 321     conic_intercept_h, | 
| 322     conic_intercept_v, | 322     conic_intercept_v, | 
| 323     cubic_intercept_h, | 323     cubic_intercept_h, | 
| 324     cubic_intercept_v, | 324     cubic_intercept_v, | 
| 325 }; | 325 }; | 
| 326 | 326 | 
| 327 #endif | 327 #endif | 
| OLD | NEW | 
|---|