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