11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2006 The Android Open Source Project 41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef SkGeometry_DEFINED 110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkGeometry_DEFINED 120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkMatrix.h" 140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1502a120cf9ec9791bc8fbe2b236551d1e3ab17d47Mike Reed/** An XRay is a half-line that runs from the specific point/origin to 1602a120cf9ec9791bc8fbe2b236551d1e3ab17d47Mike Reed +infinity in the X direction. e.g. XRay(3,5) is the half-line 1702a120cf9ec9791bc8fbe2b236551d1e3ab17d47Mike Reed (3,5)....(infinity, 5) 1802a120cf9ec9791bc8fbe2b236551d1e3ab17d47Mike Reed */ 1902a120cf9ec9791bc8fbe2b236551d1e3ab17d47Mike Reedtypedef SkPoint SkXRay; 2002a120cf9ec9791bc8fbe2b236551d1e3ab17d47Mike Reed 2140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger/** Given a line segment from pts[0] to pts[1], and an xray, return true if 2240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger they intersect. Optional outgoing "ambiguous" argument indicates 2340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger whether the answer is ambiguous because the query occurred exactly at 2440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger one of the endpoints' y coordinates, indicating that another query y 2540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger coordinate is preferred for robustness. 2602a120cf9ec9791bc8fbe2b236551d1e3ab17d47Mike Reed*/ 2787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerbool SkXRayCrossesLine(const SkXRay& pt, const SkPoint pts[2], 2887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger bool* ambiguous = NULL); 2902a120cf9ec9791bc8fbe2b236551d1e3ab17d47Mike Reed 300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** Given a quadratic equation Ax^2 + Bx + C = 0, return 0, 1, 2 roots for the 310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project equation. 320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/ 330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectint SkFindUnitQuadRoots(SkScalar A, SkScalar B, SkScalar C, SkScalar roots[2]); 340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/////////////////////////////////////////////////////////////////////////////// 360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** Set pt to the point on the src quadratic specified by t. t must be 380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 0 <= t <= 1.0 390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/ 4087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergervoid SkEvalQuadAt(const SkPoint src[3], SkScalar t, SkPoint* pt, 4187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger SkVector* tangent = NULL); 4287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergervoid SkEvalQuadAtHalf(const SkPoint src[3], SkPoint* pt, 4387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger SkVector* tangent = NULL); 440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** Given a src quadratic bezier, chop it at the specified t value, 460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project where 0 < t < 1, and return the two new quadratics in dst: 470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project dst[0..2] and dst[2..4] 480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/ 490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkChopQuadAt(const SkPoint src[3], SkPoint dst[5], SkScalar t); 500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** Given a src quadratic bezier, chop it at the specified t == 1/2, 520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project The new quads are returned in dst[0..2] and dst[2..4] 530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/ 540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkChopQuadAtHalf(const SkPoint src[3], SkPoint dst[5]); 550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** Given the 3 coefficients for a quadratic bezier (either X or Y values), look 570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project for extrema, and return the number of t-values that are found that represent 580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project these extrema. If the quadratic has no extrema betwee (0..1) exclusive, the 590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project function returns 0. 600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Returned count tValues[] 610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 0 ignored 620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1 0 < tValues[0] < 1 630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/ 640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectint SkFindQuadExtrema(SkScalar a, SkScalar b, SkScalar c, SkScalar tValues[1]); 650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** Given 3 points on a quadratic bezier, chop it into 1, 2 beziers such that 670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project the resulting beziers are monotonic in Y. This is called by the scan converter. 680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Depending on what is returned, dst[] is treated as follows 698e048c19870a898cecdde3b3c0d2d512e6f372c0Mike Reed 0 dst[0..2] is the original quad 708e048c19870a898cecdde3b3c0d2d512e6f372c0Mike Reed 1 dst[0..2] and dst[2..4] are the two new quads 710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/ 720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectint SkChopQuadAtYExtrema(const SkPoint src[3], SkPoint dst[5]); 738e048c19870a898cecdde3b3c0d2d512e6f372c0Mike Reedint SkChopQuadAtXExtrema(const SkPoint src[3], SkPoint dst[5]); 740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** Given 3 points on a quadratic bezier, divide it into 2 quadratics 760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if the point of maximum curvature exists on the quad segment. 770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Depending on what is returned, dst[] is treated as follows 780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1 dst[0..2] is the original quad 790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2 dst[0..2] and dst[2..4] are the two new quads 800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project If dst == null, it is ignored and only the count is returned. 810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/ 820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectint SkChopQuadAtMaxCurvature(const SkPoint src[3], SkPoint dst[5]); 830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 8402a120cf9ec9791bc8fbe2b236551d1e3ab17d47Mike Reed/** Given 3 points on a quadratic bezier, use degree elevation to 8502a120cf9ec9791bc8fbe2b236551d1e3ab17d47Mike Reed convert it into the cubic fitting the same curve. The new cubic 8602a120cf9ec9791bc8fbe2b236551d1e3ab17d47Mike Reed curve is returned in dst[0..3]. 8702a120cf9ec9791bc8fbe2b236551d1e3ab17d47Mike Reed*/ 88137a4ca42423bbb6d683067ea544c9a48f18f06cDerek SollenbergerSK_API void SkConvertQuadToCubic(const SkPoint src[3], SkPoint dst[4]); 8902a120cf9ec9791bc8fbe2b236551d1e3ab17d47Mike Reed 9087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger/////////////////////////////////////////////////////////////////////////////// 910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** Convert from parametric from (pts) to polynomial coefficients 930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project coeff[0]*T^3 + coeff[1]*T^2 + coeff[2]*T + coeff[3] 940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/ 950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkGetCubicCoeff(const SkPoint pts[4], SkScalar cx[4], SkScalar cy[4]); 960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** Set pt to the point on the src cubic specified by t. t must be 980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 0 <= t <= 1.0 990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/ 10087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergervoid SkEvalCubicAt(const SkPoint src[4], SkScalar t, SkPoint* locOrNull, 10187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger SkVector* tangentOrNull, SkVector* curvatureOrNull); 1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** Given a src cubic bezier, chop it at the specified t value, 1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project where 0 < t < 1, and return the two new cubics in dst: 1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project dst[0..3] and dst[3..6] 1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/ 1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkChopCubicAt(const SkPoint src[4], SkPoint dst[7], SkScalar t); 1081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/** Given a src cubic bezier, chop it at the specified t values, 1091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger where 0 < t < 1, and return the new cubics in dst: 1101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger dst[0..3],dst[3..6],...,dst[3*t_count..3*(t_count+1)] 1111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger*/ 1121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid SkChopCubicAt(const SkPoint src[4], SkPoint dst[], const SkScalar t[], 11387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger int t_count); 1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** Given a src cubic bezier, chop it at the specified t == 1/2, 1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project The new cubics are returned in dst[0..3] and dst[3..6] 1170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/ 1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkChopCubicAtHalf(const SkPoint src[4], SkPoint dst[7]); 1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** Given the 4 coefficients for a cubic bezier (either X or Y values), look 1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project for extrema, and return the number of t-values that are found that represent 1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project these extrema. If the cubic has no extrema betwee (0..1) exclusive, the 1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project function returns 0. 1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Returned count tValues[] 1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 0 ignored 1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1 0 < tValues[0] < 1 1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2 0 < tValues[0] < tValues[1] < 1 1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/ 12987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerint SkFindCubicExtrema(SkScalar a, SkScalar b, SkScalar c, SkScalar d, 13087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger SkScalar tValues[2]); 1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** Given 4 points on a cubic bezier, chop it into 1, 2, 3 beziers such that 1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project the resulting beziers are monotonic in Y. This is called by the scan converter. 1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Depending on what is returned, dst[] is treated as follows 1358e048c19870a898cecdde3b3c0d2d512e6f372c0Mike Reed 0 dst[0..3] is the original cubic 1368e048c19870a898cecdde3b3c0d2d512e6f372c0Mike Reed 1 dst[0..3] and dst[3..6] are the two new cubics 1378e048c19870a898cecdde3b3c0d2d512e6f372c0Mike Reed 2 dst[0..3], dst[3..6], dst[6..9] are the three new cubics 1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project If dst == null, it is ignored and only the count is returned. 1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/ 1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectint SkChopCubicAtYExtrema(const SkPoint src[4], SkPoint dst[10]); 1418e048c19870a898cecdde3b3c0d2d512e6f372c0Mike Reedint SkChopCubicAtXExtrema(const SkPoint src[4], SkPoint dst[10]); 1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** Given a cubic bezier, return 0, 1, or 2 t-values that represent the 1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project inflection points. 1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/ 1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectint SkFindCubicInflections(const SkPoint src[4], SkScalar tValues[2]); 1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/** Return 1 for no chop, 2 for having chopped the cubic at a single 1491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger inflection point, 3 for having chopped at 2 inflection points. 1501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger dst will hold the resulting 1, 2, or 3 cubics. 1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/ 1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectint SkChopCubicAtInflections(const SkPoint src[4], SkPoint dst[10]); 1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectint SkFindCubicMaxCurvature(const SkPoint src[4], SkScalar tValues[3]); 15587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerint SkChopCubicAtMaxCurvature(const SkPoint src[4], SkPoint dst[13], 15687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger SkScalar tValues[3] = NULL); 1570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 15802a120cf9ec9791bc8fbe2b236551d1e3ab17d47Mike Reed/** Given a monotonic cubic bezier, determine whether an xray intersects the 15902a120cf9ec9791bc8fbe2b236551d1e3ab17d47Mike Reed cubic. 16002a120cf9ec9791bc8fbe2b236551d1e3ab17d47Mike Reed By definition the cubic is open at the starting point; in other 16102a120cf9ec9791bc8fbe2b236551d1e3ab17d47Mike Reed words, if pt.fY is equivalent to cubic[0].fY, and pt.fX is to the 16202a120cf9ec9791bc8fbe2b236551d1e3ab17d47Mike Reed left of the curve, the line is not considered to cross the curve, 16302a120cf9ec9791bc8fbe2b236551d1e3ab17d47Mike Reed but if it is equal to cubic[3].fY then it is considered to 16402a120cf9ec9791bc8fbe2b236551d1e3ab17d47Mike Reed cross. 16540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger Optional outgoing "ambiguous" argument indicates whether the answer is 16640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger ambiguous because the query occurred exactly at one of the endpoints' y 16740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger coordinates, indicating that another query y coordinate is preferred 16840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger for robustness. 16902a120cf9ec9791bc8fbe2b236551d1e3ab17d47Mike Reed */ 17087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerbool SkXRayCrossesMonotonicCubic(const SkXRay& pt, const SkPoint cubic[4], 17187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger bool* ambiguous = NULL); 17202a120cf9ec9791bc8fbe2b236551d1e3ab17d47Mike Reed 17302a120cf9ec9791bc8fbe2b236551d1e3ab17d47Mike Reed/** Given an arbitrary cubic bezier, return the number of times an xray crosses 17402a120cf9ec9791bc8fbe2b236551d1e3ab17d47Mike Reed the cubic. Valid return values are [0..3] 17502a120cf9ec9791bc8fbe2b236551d1e3ab17d47Mike Reed By definition the cubic is open at the starting point; in other 17602a120cf9ec9791bc8fbe2b236551d1e3ab17d47Mike Reed words, if pt.fY is equivalent to cubic[0].fY, and pt.fX is to the 17702a120cf9ec9791bc8fbe2b236551d1e3ab17d47Mike Reed left of the curve, the line is not considered to cross the curve, 17802a120cf9ec9791bc8fbe2b236551d1e3ab17d47Mike Reed but if it is equal to cubic[3].fY then it is considered to 17902a120cf9ec9791bc8fbe2b236551d1e3ab17d47Mike Reed cross. 18040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger Optional outgoing "ambiguous" argument indicates whether the answer is 18140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger ambiguous because the query occurred exactly at one of the endpoints' y 18240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger coordinates or at a tangent point, indicating that another query y 18340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger coordinate is preferred for robustness. 18402a120cf9ec9791bc8fbe2b236551d1e3ab17d47Mike Reed */ 18587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerint SkNumXRayCrossingsForCubic(const SkXRay& pt, const SkPoint cubic[4], 18687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger bool* ambiguous = NULL); 18702a120cf9ec9791bc8fbe2b236551d1e3ab17d47Mike Reed 18887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger/////////////////////////////////////////////////////////////////////////////// 1890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectenum SkRotationDirection { 1910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kCW_SkRotationDirection, 1920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kCCW_SkRotationDirection 1930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}; 1940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** Maximum number of points needed in the quadPoints[] parameter for 1960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkBuildQuadArc() 1970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/ 1980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define kSkBuildQuadArcStorage 17 1990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** Given 2 unit vectors and a rotation direction, fill out the specified 2010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project array of points with quadratic segments. Return is the number of points 2020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project written to, which will be { 0, 3, 5, 7, ... kSkBuildQuadArcStorage } 2030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project matrix, if not null, is appled to the points before they are returned. 2050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/ 20687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerint SkBuildQuadArc(const SkVector& unitStart, const SkVector& unitStop, 20787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger SkRotationDirection, const SkMatrix*, SkPoint quadPoints[]); 2080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 210