1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/skia/trunk/src/pathops/SkPathOpsCurve.h Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,152 @@ 1.4 +/* 1.5 + * Copyright 2012 Google Inc. 1.6 + * 1.7 + * Use of this source code is governed by a BSD-style license that can be 1.8 + * found in the LICENSE file. 1.9 + */ 1.10 +#ifndef SkPathOpsCurve_DEFINE 1.11 +#define SkPathOpsCurve_DEFINE 1.12 + 1.13 +#include "SkPathOpsCubic.h" 1.14 +#include "SkPathOpsLine.h" 1.15 +#include "SkPathOpsQuad.h" 1.16 + 1.17 +static SkDPoint dline_xy_at_t(const SkPoint a[2], double t) { 1.18 + SkDLine line; 1.19 + line.set(a); 1.20 + return line.ptAtT(t); 1.21 +} 1.22 + 1.23 +static SkDPoint dquad_xy_at_t(const SkPoint a[3], double t) { 1.24 + SkDQuad quad; 1.25 + quad.set(a); 1.26 + return quad.ptAtT(t); 1.27 +} 1.28 + 1.29 +static SkDPoint dcubic_xy_at_t(const SkPoint a[4], double t) { 1.30 + SkDCubic cubic; 1.31 + cubic.set(a); 1.32 + return cubic.ptAtT(t); 1.33 +} 1.34 + 1.35 +static SkDPoint (* const CurveDPointAtT[])(const SkPoint[], double ) = { 1.36 + NULL, 1.37 + dline_xy_at_t, 1.38 + dquad_xy_at_t, 1.39 + dcubic_xy_at_t 1.40 +}; 1.41 + 1.42 +static SkPoint fline_xy_at_t(const SkPoint a[2], double t) { 1.43 + return dline_xy_at_t(a, t).asSkPoint(); 1.44 +} 1.45 + 1.46 +static SkPoint fquad_xy_at_t(const SkPoint a[3], double t) { 1.47 + return dquad_xy_at_t(a, t).asSkPoint(); 1.48 +} 1.49 + 1.50 +static SkPoint fcubic_xy_at_t(const SkPoint a[4], double t) { 1.51 + return dcubic_xy_at_t(a, t).asSkPoint(); 1.52 +} 1.53 + 1.54 +static SkPoint (* const CurvePointAtT[])(const SkPoint[], double ) = { 1.55 + NULL, 1.56 + fline_xy_at_t, 1.57 + fquad_xy_at_t, 1.58 + fcubic_xy_at_t 1.59 +}; 1.60 + 1.61 +static SkDVector dline_dxdy_at_t(const SkPoint a[2], double ) { 1.62 + SkDLine line; 1.63 + line.set(a); 1.64 + return line[1] - line[0]; 1.65 +} 1.66 + 1.67 +static SkDVector dquad_dxdy_at_t(const SkPoint a[3], double t) { 1.68 + SkDQuad quad; 1.69 + quad.set(a); 1.70 + return quad.dxdyAtT(t); 1.71 +} 1.72 + 1.73 +static SkDVector dcubic_dxdy_at_t(const SkPoint a[4], double t) { 1.74 + SkDCubic cubic; 1.75 + cubic.set(a); 1.76 + return cubic.dxdyAtT(t); 1.77 +} 1.78 + 1.79 +static SkDVector (* const CurveDSlopeAtT[])(const SkPoint[], double ) = { 1.80 + NULL, 1.81 + dline_dxdy_at_t, 1.82 + dquad_dxdy_at_t, 1.83 + dcubic_dxdy_at_t 1.84 +}; 1.85 + 1.86 +static SkVector fline_dxdy_at_t(const SkPoint a[2], double ) { 1.87 + return a[1] - a[0]; 1.88 +} 1.89 + 1.90 +static SkVector fquad_dxdy_at_t(const SkPoint a[3], double t) { 1.91 + return dquad_dxdy_at_t(a, t).asSkVector(); 1.92 +} 1.93 + 1.94 +static SkVector fcubic_dxdy_at_t(const SkPoint a[4], double t) { 1.95 + return dcubic_dxdy_at_t(a, t).asSkVector(); 1.96 +} 1.97 + 1.98 +static SkVector (* const CurveSlopeAtT[])(const SkPoint[], double ) = { 1.99 + NULL, 1.100 + fline_dxdy_at_t, 1.101 + fquad_dxdy_at_t, 1.102 + fcubic_dxdy_at_t 1.103 +}; 1.104 + 1.105 +static SkPoint quad_top(const SkPoint a[3], double startT, double endT) { 1.106 + SkDQuad quad; 1.107 + quad.set(a); 1.108 + SkDPoint topPt = quad.top(startT, endT); 1.109 + return topPt.asSkPoint(); 1.110 +} 1.111 + 1.112 +static SkPoint cubic_top(const SkPoint a[4], double startT, double endT) { 1.113 + SkDCubic cubic; 1.114 + cubic.set(a); 1.115 + SkDPoint topPt = cubic.top(startT, endT); 1.116 + return topPt.asSkPoint(); 1.117 +} 1.118 + 1.119 +static SkPoint (* const CurveTop[])(const SkPoint[], double , double ) = { 1.120 + NULL, 1.121 + NULL, 1.122 + quad_top, 1.123 + cubic_top 1.124 +}; 1.125 + 1.126 +static bool line_is_vertical(const SkPoint a[2], double startT, double endT) { 1.127 + SkDLine line; 1.128 + line.set(a); 1.129 + SkDPoint dst[2] = { line.ptAtT(startT), line.ptAtT(endT) }; 1.130 + return AlmostEqualUlps(dst[0].fX, dst[1].fX); 1.131 +} 1.132 + 1.133 +static bool quad_is_vertical(const SkPoint a[3], double startT, double endT) { 1.134 + SkDQuad quad; 1.135 + quad.set(a); 1.136 + SkDQuad dst = quad.subDivide(startT, endT); 1.137 + return AlmostEqualUlps(dst[0].fX, dst[1].fX) && AlmostEqualUlps(dst[1].fX, dst[2].fX); 1.138 +} 1.139 + 1.140 +static bool cubic_is_vertical(const SkPoint a[4], double startT, double endT) { 1.141 + SkDCubic cubic; 1.142 + cubic.set(a); 1.143 + SkDCubic dst = cubic.subDivide(startT, endT); 1.144 + return AlmostEqualUlps(dst[0].fX, dst[1].fX) && AlmostEqualUlps(dst[1].fX, dst[2].fX) 1.145 + && AlmostEqualUlps(dst[2].fX, dst[3].fX); 1.146 +} 1.147 + 1.148 +static bool (* const CurveIsVertical[])(const SkPoint[], double , double) = { 1.149 + NULL, 1.150 + line_is_vertical, 1.151 + quad_is_vertical, 1.152 + cubic_is_vertical 1.153 +}; 1.154 + 1.155 +#endif