skia-path2d
Version:
Extract the core code related to Path2D, PathStrore, and isPointInPath from Skia and rewrite it with typescript
160 lines (159 loc) • 5.96 kB
TypeScript
import { PathBuilder } from './path_builder';
import { PathVerb } from './path_types';
import { Point as Vector2 } from './point';
import { Matrix2D } from './matrix';
export type PathVerbData = {
type: PathVerb;
p0?: Vector2;
p1?: Vector2;
p2?: Vector2;
p3?: Vector2;
};
export declare enum LineJoin {
Miter = "miter",
Round = "round",
Bevel = "bevel",
MiterClip = "miter-clip"
}
export declare enum LineCap {
Butt = "butt",
Round = "round",
Square = "square"
}
export declare enum FillRule {
NonZero = "nonzero",
EvenOdd = "evenodd"
}
export declare class PathSegmentsIter {
isAutoClose: boolean;
path: PathBuilder;
verbIndex: number;
pointsIndex: number;
lastMoveTo: Vector2;
lastPoint: Vector2;
constructor(options: {
isAutoClose?: boolean;
path: PathBuilder;
verbIndex: number;
pointsIndex: number;
lastMoveTo?: Vector2;
lastPoint?: Vector2;
});
get curVerb(): PathVerb;
get nextVerb(): PathVerb;
canNext(): boolean;
copy(source: PathSegmentsIter): this;
clone(): PathSegmentsIter;
[Symbol.iterator](): Iterator<PathVerbData>;
hasValidTangent(): boolean;
setAutoClose(value: boolean): void;
autoClose(): PathVerbData;
}
declare class SwappableBuilders {
inner: PathBuilder;
outer: PathBuilder;
constructor(inner: PathBuilder, outer: PathBuilder);
swap(): void;
}
type CapProc = (pivot: Vector2, // 上一个点
normal: Vector2, stop: Vector2, other_path: PathBuilder | null | undefined, path: PathBuilder) => void;
type JoinProc = (before_unit_normal: Vector2, //l0->l1 线段的,旋转-90度的单位法向量
pivot: Vector2, // 上一个lineTo点
after_unit_normal: Vector2, // l1->l2 线段的,旋转-90度的单位法向量
radius: number, // 线段宽的一半
inv_miter_limit: number, // 1/miter_limit
prev_is_line: boolean, // 上一个绘制命令是否是lineTo
curr_is_line: boolean, // 当前绘制命令是否是lineTo
builders: SwappableBuilders) => void;
declare class QuadConstruct {
static default(): QuadConstruct;
quad: Vector2[];
tangent_start: Vector2;
tangent_end: Vector2;
start_t: number;
mid_t: number;
end_t: number;
start_set: boolean;
end_set: boolean;
opposite_tangents: boolean;
init(start: number, end: number): boolean;
initWithStart(parent: QuadConstruct): boolean;
initWithEnd(parent: QuadConstruct): boolean;
}
declare enum StrokeType {
Outer = 1,// use sign-opposite values later to flip perpendicular axis
Inner = -1
}
declare enum ResultType {
Split = 0,// the caller should split the quad stroke in two
Degenerate = 1,// the caller should add a line
Quad = 2
}
declare enum IntersectRayType {
CtrlPt = 0,
ResultType = 1
}
export declare class PathStroker {
static computeResolutionScale(ts: Matrix2D): number;
radius: number;
inv_miter_limit: number;
res_scale: number;
inv_res_scale: number;
inv_res_scale_squared: number;
first_normal: Vector2;
prev_normal: Vector2;
first_unit_normal: Vector2;
prev_unit_normal: Vector2;
first_pt: Vector2;
prev_pt: Vector2;
first_outer_pt: Vector2;
first_outer_pt_index_in_contour: number;
segment_count: number;
prev_is_line: boolean;
capper: CapProc;
joiner: JoinProc;
inner: PathBuilder;
outer: PathBuilder;
cusper: PathBuilder;
stroke_type: StrokeType;
recursion_depth: number;
found_tangents: boolean;
join_completed: boolean;
get moveToPt(): Vector2;
builders(): SwappableBuilders;
close(is_line: boolean): void;
moveTo(p: Vector2): void;
finishContour(close: boolean, curr_is_line: boolean): void;
preJoinTo(p: Vector2, curr_is_line: boolean, normal: Vector2, unit_normal: Vector2): boolean;
postJoinTo(p: Vector2, normal: Vector2, unit_normal: Vector2): void;
initQuad(stroke_type: StrokeType, start: number, end: number, quad_points: QuadConstruct): void;
quadStroke(quad: Vector2[], quad_points: QuadConstruct): boolean;
compareQuadQuad(quad: Vector2[], quad_points: QuadConstruct): ResultType;
setRayPoints(tp: Vector2, dxy: Vector2, on_p: Vector2, tangent?: Vector2): void;
quadPerpRay(quad: Vector2[], t: number, tp: Vector2, on_p: Vector2, tangent?: Vector2): void;
strokeCloseEnough(stroke: Vector2[], ray: Vector2[], quad_points: QuadConstruct): ResultType;
intersectRay(intersect_ray_type: IntersectRayType, quad_points: QuadConstruct): ResultType;
addDegenerateLine(quad_points: QuadConstruct): void;
setCubicEndNormal(cubic: Vector2[], normal_ab: Vector2, unit_normal_ab: Vector2, normal_cd: Vector2, unit_normal_cd: Vector2): boolean | undefined;
lineTo(p: Vector2, iter?: PathSegmentsIter): void;
quadraticCurveTo(p1: Vector2, p2: Vector2): void;
bezierCurveTo(pt1: Vector2, pt2: Vector2, pt3: Vector2): void;
cubicStroke(cubic: Vector2[], quad_points: QuadConstruct): boolean;
cubicMidOnLine(cubic: Vector2[], quad_points: QuadConstruct): boolean;
cubicQuadMid(cubic: Vector2[], quad_points: QuadConstruct, mid: Vector2): void;
compareQuadCubic(cubic: Vector2[], quad_points: QuadConstruct): ResultType;
cubicQuadEnds(cubic: Vector2[], quad_points: QuadConstruct): void;
tangentsMeet(cubic: Vector2[], quad_points: QuadConstruct): ResultType;
cubicPerpRay(cubic: Vector2[], t: number, t_pt: Vector2, on_pt: Vector2, tangent?: Vector2): void;
stroke(path: PathBuilder, paint: {
strokeWidth: number;
miterLimit?: number;
lineCap?: LineCap;
lineJoin?: LineJoin;
}): PathBuilder;
strokeInner(path: PathBuilder, width: number, miterLimit: number, lineCap: LineCap, lineJoin: LineJoin, resScale: number): PathBuilder;
finish(is_line: boolean): PathBuilder;
hasOnlyMoveTo(): boolean;
isCurrentContourEmpty(): boolean;
}
export {};