UNPKG

skia-path2d

Version:

Extract the core code related to Path2D, PathStrore, and isPointInPath from Skia and rewrite it with typescript

151 lines (148 loc) 7.02 kB
import { Point } from './point'; import { FloatPoint, Ref, PointerArray } from './util'; import { Rect } from './rect'; import { Matrix2D } from './matrix'; export declare const kMaxConicToQuadPOW2 = 5; export declare const kMaxConicsForArc = 5; export declare enum SkCubicType { kSerpentine = 0, kLoop = 1, kLocalCusp = 2,// Cusp at a non-infinite parameter value with an inflection at t=infinity. kCuspAtInfinity = 3,// Cusp with a cusp at t=infinity and a local inflection. kQuadratic = 4, kLineOrPoint = 5 } export declare enum SkRotationDirection { kCW_SkRotationDirection = 0, kCCW_SkRotationDirection = 1 } /** Given a quadratic equation Ax^2 + Bx + C = 0, return 0, 1, 2 roots for the equation. */ /** From Numerical Recipes in C. Q = -1/2 (B + sign(B) sqrt[B*B - 4*A*C]) x1 = Q / A x2 = C / Q */ declare function SkFindUnitQuadRoots(A: number, B: number, C: number, roots: PointerArray<number>): number; declare function SkEvalQuadAt(src: Point[], t: number, pt?: Point, tangent?: Point): Point; declare function SkEvalQuadTangentAt(src: Point[], t: number): Point; declare function SkChopQuadAt(src: Point[], dst: Point[], t: number): void; /**返回一个新的、任意缩放的向量,将给定的向量平分。返回的平分线 将始终指向所提供矢量的内部。 */ declare function SkFindBisector(a: Point, b: Point): Point; declare function SkFindQuadMidTangent(src: Point[]): number; /** Quad'(t) = At + B, where A = 2(a - 2b + c) B = 2(b - a) Solve for t, only if it fits between 0 < t < 1 */ declare function SkFindQuadExtrema(a: number, b: number, c: number, tValue: PointerArray<number>): number; declare function SkChopQuadAtYExtrema(src: Point[], dst: Point[]): number; declare function SkFindQuadMaxCurvature(src: Point[]): number; declare function SkEvalCubicTangentAt(src: Point[], t: number, tangent?: Point): Point; declare function SkEvalCubicPosAt(src: Point[], t: number, out?: Point): Point; declare function SkEvalCubicAt(src: Point[], t: number, loc?: Point | null, tangent?: Point | null, curvature?: Point | null): void; /** Cubic'(t) = At^2 + Bt + C, where A = 3(-a + 3(b - c) + d) B = 6(a - 2b + c) C = 3(b - a) Solve for t, keeping only those that fit betwee 0 < t < 1 */ declare function SkFindCubicExtrema(a: number, b: number, c: number, d: number, tValues: PointerArray<number>): number; declare function SkChopCubicAt_3(src: Point[], dst: Point[], t: number): void; declare function SkChopCubicAt_4(src: Point[], dst: Point[], t0: number, t1: number): void; declare function SkChopCubicAt_5(src: Point[], dst: Point[], tValues: ArrayLike<number>, tCount: number): void; declare function SkChopCubicAtHalf(src: Point[], dst: Point[]): void; declare function SkFindCubicMidTangent(src: Point[]): number; /** Given 4 points on a cubic bezier, chop it into 1, 2, 3 beziers such that the resulting beziers are monotonic in Y. This is called by the scan converter. Depending on what is returned, dst[] is treated as follows: 0 dst[0..3] is the original cubic 1 dst[0..3] and dst[3..6] are the two new cubics 2 dst[0..3], dst[3..6], dst[6..9] are the three new cubics If dst == null, it is ignored and only the count is returned. */ declare function SkChopCubicAtYExtrema(src: Point[], dst: Point[]): number; declare function SkChopCubicAtXExtrema(src: Point[], dst: Point[]): number; /** http://www.faculty.idc.ac.il/arik/quality/appendixA.html Inflection means that curvature is zero. Curvature is [F' x F''] / [F'^3] So we solve F'x X F''y - F'y X F''y == 0 After some canceling of the cubic term, we get A = b - a B = c - 2b + a C = d - 3c + 3b - a (BxCy - ByCx)t^2 + (AxCy - AyCx)t + AxBy - AyBx == 0 */ declare function SkFindCubicInflections(src: Point[], tValues: number[]): number; /** * use for : eval(t) == A * t^2 + B * t + C */ export declare class SkQuadCoeff { static default(): SkQuadCoeff; fA: FloatPoint; fB: FloatPoint; fC: FloatPoint; constructor(); constructor(src?: Point[]); constructor(A?: FloatPoint | Point[], B?: FloatPoint, C?: FloatPoint); eval(tt: FloatPoint): FloatPoint; } declare function SkFindCubicMaxCurvature(src: Point[], tValues: number[]): number; declare function SkFindCubicCusp(src: Point[]): number; declare class SkConic { static default(): SkConic; static make(count: number): SkConic[]; fPts: Point[]; fW: number; constructor(); constructor(pts: Point[], w: number); constructor(p0: Point, p1: Point, p2: Point, w: number); copy(conic: SkConic): this; clone(): SkConic; set(pts: Point[], w: number): void; set(p0: Point, p1: Point, p2: Point, w: number): void; setW(w: number): void; chopAt_2(t: number, dst: SkConic[]): boolean; chopAt_3(t1: number, t2: number, dst: SkConic): void; evalAt(t: number): Point; evalAt_3(t: number, pt?: Point, tangent?: Point): void; evalTangentAt(t: number): Point; chop(dst: SkConic[]): void; computeAsQuadError(err: Point): void; asQuadTol(tol: number): boolean; computeQuadPOW2(tol: number): number; chopIntoQuadsPOW2(pts: PointerArray<Point>, pow2: number): number; findMidTangent(): number; findXExtrema(t: Ref<number>): 0 | 1; findYExtrema(t: Ref<number>): 0 | 1; chopAtXExtrema(dst: SkConic[]): boolean; chopAtYExtrema(dst: SkConic[]): boolean; computeTightBounds(bounds: Rect): void; computeFastBounds(bounds: Rect): void; TransformW(pts: Point[], w: number, matrix: Matrix2D): number; static BuildUnitArc(uStart: Point, uStop: Point, dir: SkRotationDirection, userMatrix: Matrix2D, dst: SkConic[]): number; } /** * 计算二次贝塞尔曲线极值点。 * @param src 控制点 * @param extremas 极值点 * @returns 极值点个数 */ declare function SkComputeQuadExtremas(src: Point[], extremas: Point[]): number; /** * 计算三次贝塞尔曲线极值点。 * @param src 控制点数组 * @param extremas 极值点数组 * @returns 极值点个数 */ declare function SkComputeCubicExtremas(src: Point[], extremas: Point[]): number; declare function SkComputeConicExtremas(src: Point[], w: number, extremas: Point[]): number; declare class SkAutoConicToQuads { fQuadCount: number; computeQuads(conic: SkConic, tol: number): Point[]; computeQuads(pts: Point[], weight: number, tol: number): Point[]; } export { SkAutoConicToQuads, SkConic, SkFindCubicExtrema, SkFindCubicMaxCurvature, SkFindBisector, SkFindCubicCusp, SkFindCubicInflections, SkFindCubicMidTangent, SkFindQuadExtrema, SkFindQuadMaxCurvature, SkFindQuadMidTangent, SkFindUnitQuadRoots, SkChopCubicAt_3, SkChopCubicAt_4, SkChopCubicAt_5, SkChopQuadAt, SkEvalQuadAt, SkEvalCubicAt, SkChopCubicAtHalf, SkChopCubicAtXExtrema, SkChopCubicAtYExtrema, SkChopQuadAtYExtrema, SkEvalQuadTangentAt, SkComputeQuadExtremas, SkComputeCubicExtremas, SkComputeConicExtremas, SkEvalCubicTangentAt, SkEvalCubicPosAt };