SkGeometry.h revision 7ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577
18a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/* libs/graphics/sgl/SkGeometry.h 28a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** 38a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** Copyright 2006, The Android Open Source Project 48a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** 58a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** Licensed under the Apache License, Version 2.0 (the "License"); 68a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** you may not use this file except in compliance with the License. 78a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** You may obtain a copy of the License at 88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** 98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** http://www.apache.org/licenses/LICENSE-2.0 108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** 118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** Unless required by applicable law or agreed to in writing, software 128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** distributed under the License is distributed on an "AS IS" BASIS, 138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** See the License for the specific language governing permissions and 158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** limitations under the License. 168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SkGeometry_DEFINED 198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkGeometry_DEFINED 208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkMatrix.h" 228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 23945a139553a9c9da03766213661d7f5fd6ed3042reed@android.com/** An XRay is a half-line that runs from the specific point/origin to 24945a139553a9c9da03766213661d7f5fd6ed3042reed@android.com +infinity in the X direction. e.g. XRay(3,5) is the half-line 25945a139553a9c9da03766213661d7f5fd6ed3042reed@android.com (3,5)....(infinity, 5) 26945a139553a9c9da03766213661d7f5fd6ed3042reed@android.com */ 27945a139553a9c9da03766213661d7f5fd6ed3042reed@android.comtypedef SkPoint SkXRay; 28945a139553a9c9da03766213661d7f5fd6ed3042reed@android.com 292e086190e55a01dc2f7b74df6f2828e8cac2b9abkbr@chromium.org/** Given a line segment from pts[0] to pts[1], and an xray, return true if 302e086190e55a01dc2f7b74df6f2828e8cac2b9abkbr@chromium.org they intersect. Optional outgoing "ambiguous" argument indicates 312e086190e55a01dc2f7b74df6f2828e8cac2b9abkbr@chromium.org whether the answer is ambiguous because the query occurred exactly at 322e086190e55a01dc2f7b74df6f2828e8cac2b9abkbr@chromium.org one of the endpoints' y coordinates, indicating that another query y 332e086190e55a01dc2f7b74df6f2828e8cac2b9abkbr@chromium.org coordinate is preferred for robustness. 34945a139553a9c9da03766213661d7f5fd6ed3042reed@android.com*/ 352e086190e55a01dc2f7b74df6f2828e8cac2b9abkbr@chromium.orgbool SkXRayCrossesLine(const SkXRay& pt, const SkPoint pts[2], bool* ambiguous = NULL); 36945a139553a9c9da03766213661d7f5fd6ed3042reed@android.com 378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Given a quadratic equation Ax^2 + Bx + C = 0, return 0, 1, 2 roots for the 388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com equation. 398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comint SkFindUnitQuadRoots(SkScalar A, SkScalar B, SkScalar C, SkScalar roots[2]); 418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/////////////////////////////////////////////////////////////////////////////// 438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Set pt to the point on the src quadratic specified by t. t must be 458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 0 <= t <= 1.0 468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkEvalQuadAt(const SkPoint src[3], SkScalar t, SkPoint* pt, SkVector* tangent = NULL); 488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkEvalQuadAtHalf(const SkPoint src[3], SkPoint* pt, SkVector* tangent = NULL); 498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Given a src quadratic bezier, chop it at the specified t value, 518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com where 0 < t < 1, and return the two new quadratics in dst: 528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com dst[0..2] and dst[2..4] 538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkChopQuadAt(const SkPoint src[3], SkPoint dst[5], SkScalar t); 558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Given a src quadratic bezier, chop it at the specified t == 1/2, 578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com The new quads are returned in dst[0..2] and dst[2..4] 588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkChopQuadAtHalf(const SkPoint src[3], SkPoint dst[5]); 608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Given the 3 coefficients for a quadratic bezier (either X or Y values), look 628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com for extrema, and return the number of t-values that are found that represent 638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com these extrema. If the quadratic has no extrema betwee (0..1) exclusive, the 648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com function returns 0. 658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com Returned count tValues[] 668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 0 ignored 678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1 0 < tValues[0] < 1 688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comint SkFindQuadExtrema(SkScalar a, SkScalar b, SkScalar c, SkScalar tValues[1]); 708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Given 3 points on a quadratic bezier, chop it into 1, 2 beziers such that 728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com the resulting beziers are monotonic in Y. This is called by the scan converter. 738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com Depending on what is returned, dst[] is treated as follows 74909994fbae0ffb532f42feac8859f8d86bbf64dereed@android.com 0 dst[0..2] is the original quad 75909994fbae0ffb532f42feac8859f8d86bbf64dereed@android.com 1 dst[0..2] and dst[2..4] are the two new quads 768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comint SkChopQuadAtYExtrema(const SkPoint src[3], SkPoint dst[5]); 7877f0ef726f1f8b6769ed2509171afce8bac00b23reed@android.comint SkChopQuadAtXExtrema(const SkPoint src[3], SkPoint dst[5]); 798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Given 3 points on a quadratic bezier, divide it into 2 quadratics 818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if the point of maximum curvature exists on the quad segment. 828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com Depending on what is returned, dst[] is treated as follows 838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1 dst[0..2] is the original quad 848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2 dst[0..2] and dst[2..4] are the two new quads 858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com If dst == null, it is ignored and only the count is returned. 868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comint SkChopQuadAtMaxCurvature(const SkPoint src[3], SkPoint dst[5]); 888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 89945a139553a9c9da03766213661d7f5fd6ed3042reed@android.com/** Given 3 points on a quadratic bezier, use degree elevation to 90945a139553a9c9da03766213661d7f5fd6ed3042reed@android.com convert it into the cubic fitting the same curve. The new cubic 91945a139553a9c9da03766213661d7f5fd6ed3042reed@android.com curve is returned in dst[0..3]. 92945a139553a9c9da03766213661d7f5fd6ed3042reed@android.com*/ 937ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.orgSK_API void SkConvertQuadToCubic(const SkPoint src[3], SkPoint dst[4]); 94945a139553a9c9da03766213661d7f5fd6ed3042reed@android.com 958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////////////////////////////////////////////////////////////////////////////////// 968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Convert from parametric from (pts) to polynomial coefficients 988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com coeff[0]*T^3 + coeff[1]*T^2 + coeff[2]*T + coeff[3] 998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkGetCubicCoeff(const SkPoint pts[4], SkScalar cx[4], SkScalar cy[4]); 1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Set pt to the point on the src cubic specified by t. t must be 1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 0 <= t <= 1.0 1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkEvalCubicAt(const SkPoint src[4], SkScalar t, SkPoint* locOrNull, SkVector* tangentOrNull, SkVector* curvatureOrNull); 1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Given a src cubic bezier, chop it at the specified t value, 1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com where 0 < t < 1, and return the two new cubics in dst: 1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com dst[0..3] and dst[3..6] 1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkChopCubicAt(const SkPoint src[4], SkPoint dst[7], SkScalar t); 1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkChopCubicAt(const SkPoint src[4], SkPoint dst[7], const SkScalar t[], int t_count); 1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Given a src cubic bezier, chop it at the specified t == 1/2, 1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com The new cubics are returned in dst[0..3] and dst[3..6] 1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkChopCubicAtHalf(const SkPoint src[4], SkPoint dst[7]); 1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Given the 4 coefficients for a cubic bezier (either X or Y values), look 1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com for extrema, and return the number of t-values that are found that represent 1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com these extrema. If the cubic has no extrema betwee (0..1) exclusive, the 1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com function returns 0. 1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com Returned count tValues[] 1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 0 ignored 1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1 0 < tValues[0] < 1 1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2 0 < tValues[0] < tValues[1] < 1 1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 1288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comint SkFindCubicExtrema(SkScalar a, SkScalar b, SkScalar c, SkScalar d, SkScalar tValues[2]); 1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Given 4 points on a cubic bezier, chop it into 1, 2, 3 beziers such that 1318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com the resulting beziers are monotonic in Y. This is called by the scan converter. 1328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com Depending on what is returned, dst[] is treated as follows 133909994fbae0ffb532f42feac8859f8d86bbf64dereed@android.com 0 dst[0..3] is the original cubic 134909994fbae0ffb532f42feac8859f8d86bbf64dereed@android.com 1 dst[0..3] and dst[3..6] are the two new cubics 135909994fbae0ffb532f42feac8859f8d86bbf64dereed@android.com 2 dst[0..3], dst[3..6], dst[6..9] are the three new cubics 1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com If dst == null, it is ignored and only the count is returned. 1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comint SkChopCubicAtYExtrema(const SkPoint src[4], SkPoint dst[10]); 139909994fbae0ffb532f42feac8859f8d86bbf64dereed@android.comint SkChopCubicAtXExtrema(const SkPoint src[4], SkPoint dst[10]); 1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Given a cubic bezier, return 0, 1, or 2 t-values that represent the 1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com inflection points. 1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comint SkFindCubicInflections(const SkPoint src[4], SkScalar tValues[2]); 1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Return 1 for no chop, or 2 for having chopped the cubic at its 1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com inflection point. 1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comint SkChopCubicAtInflections(const SkPoint src[4], SkPoint dst[10]); 1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comint SkFindCubicMaxCurvature(const SkPoint src[4], SkScalar tValues[3]); 1528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comint SkChopCubicAtMaxCurvature(const SkPoint src[4], SkPoint dst[13], SkScalar tValues[3] = NULL); 1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 154945a139553a9c9da03766213661d7f5fd6ed3042reed@android.com/** Given a monotonic cubic bezier, determine whether an xray intersects the 155945a139553a9c9da03766213661d7f5fd6ed3042reed@android.com cubic. 156945a139553a9c9da03766213661d7f5fd6ed3042reed@android.com By definition the cubic is open at the starting point; in other 157945a139553a9c9da03766213661d7f5fd6ed3042reed@android.com words, if pt.fY is equivalent to cubic[0].fY, and pt.fX is to the 158945a139553a9c9da03766213661d7f5fd6ed3042reed@android.com left of the curve, the line is not considered to cross the curve, 159945a139553a9c9da03766213661d7f5fd6ed3042reed@android.com but if it is equal to cubic[3].fY then it is considered to 160945a139553a9c9da03766213661d7f5fd6ed3042reed@android.com cross. 1612e086190e55a01dc2f7b74df6f2828e8cac2b9abkbr@chromium.org Optional outgoing "ambiguous" argument indicates whether the answer is 1622e086190e55a01dc2f7b74df6f2828e8cac2b9abkbr@chromium.org ambiguous because the query occurred exactly at one of the endpoints' y 1632e086190e55a01dc2f7b74df6f2828e8cac2b9abkbr@chromium.org coordinates, indicating that another query y coordinate is preferred 1642e086190e55a01dc2f7b74df6f2828e8cac2b9abkbr@chromium.org for robustness. 165945a139553a9c9da03766213661d7f5fd6ed3042reed@android.com */ 1662e086190e55a01dc2f7b74df6f2828e8cac2b9abkbr@chromium.orgbool SkXRayCrossesMonotonicCubic(const SkXRay& pt, const SkPoint cubic[4], bool* ambiguous = NULL); 167945a139553a9c9da03766213661d7f5fd6ed3042reed@android.com 168945a139553a9c9da03766213661d7f5fd6ed3042reed@android.com/** Given an arbitrary cubic bezier, return the number of times an xray crosses 169945a139553a9c9da03766213661d7f5fd6ed3042reed@android.com the cubic. Valid return values are [0..3] 170945a139553a9c9da03766213661d7f5fd6ed3042reed@android.com By definition the cubic is open at the starting point; in other 171945a139553a9c9da03766213661d7f5fd6ed3042reed@android.com words, if pt.fY is equivalent to cubic[0].fY, and pt.fX is to the 172945a139553a9c9da03766213661d7f5fd6ed3042reed@android.com left of the curve, the line is not considered to cross the curve, 173945a139553a9c9da03766213661d7f5fd6ed3042reed@android.com but if it is equal to cubic[3].fY then it is considered to 174945a139553a9c9da03766213661d7f5fd6ed3042reed@android.com cross. 1752e086190e55a01dc2f7b74df6f2828e8cac2b9abkbr@chromium.org Optional outgoing "ambiguous" argument indicates whether the answer is 1762e086190e55a01dc2f7b74df6f2828e8cac2b9abkbr@chromium.org ambiguous because the query occurred exactly at one of the endpoints' y 1772e086190e55a01dc2f7b74df6f2828e8cac2b9abkbr@chromium.org coordinates or at a tangent point, indicating that another query y 1782e086190e55a01dc2f7b74df6f2828e8cac2b9abkbr@chromium.org coordinate is preferred for robustness. 179945a139553a9c9da03766213661d7f5fd6ed3042reed@android.com */ 1802e086190e55a01dc2f7b74df6f2828e8cac2b9abkbr@chromium.orgint SkNumXRayCrossingsForCubic(const SkXRay& pt, const SkPoint cubic[4], bool* ambiguous = NULL); 181945a139553a9c9da03766213661d7f5fd6ed3042reed@android.com 1828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/////////////////////////////////////////////////////////////////////////////////////////// 1838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comenum SkRotationDirection { 1858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com kCW_SkRotationDirection, 1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com kCCW_SkRotationDirection 1878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 1888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Maximum number of points needed in the quadPoints[] parameter for 1908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkBuildQuadArc() 1918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 1928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define kSkBuildQuadArcStorage 17 1938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Given 2 unit vectors and a rotation direction, fill out the specified 1958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com array of points with quadratic segments. Return is the number of points 1968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com written to, which will be { 0, 3, 5, 7, ... kSkBuildQuadArcStorage } 1978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com matrix, if not null, is appled to the points before they are returned. 1998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 2008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comint SkBuildQuadArc(const SkVector& unitStart, const SkVector& unitStop, SkRotationDirection, 2018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const SkMatrix* matrix, SkPoint quadPoints[]); 2028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 204