modern-text
Version:
Measure and render text in a way that describes the DOM.
101 lines (98 loc) • 3.63 kB
text/typescript
import { Vector2, Vector2Like, BoundingBox } from 'modern-path2d';
import { C as Character } from './modern-text.DzKfafj6.mjs';
/** 逐字沿形状排布所需的曲线最小接口(实现了这三个方法即可当作变形曲线) */
interface DeformationCurve {
getPointAt: (u: number, output?: Vector2) => Vector2;
getTangent: (t: number, output?: Vector2) => Vector2;
getNormal: (t: number, output?: Vector2) => Vector2;
}
/** FFD 预设 `build` 的上下文 */
interface FfdContext {
/** 强度 1(intensities[0],已 /100) */
a: number;
/** 强度 2(intensities[1],已 /100) */
b: number;
baseWidth: number;
baseHeight: number;
lineHeight: number;
/** 沿当前书写方向调整控制点(内部处理横/竖轴向互换) */
adjust: (point: Vector2Like, dx: number, dy: number) => void;
}
/** Bend 预设 `transform` 的上下文(引擎已算好弯曲几何) */
interface BendContext {
/** 弯曲半径 */
lineHeight: number;
size: number;
center: {
x: number;
y: number;
};
centerDist: {
x: number;
y: number;
};
/** 起始角 */
centerDistAngle: number;
width: number;
height: number;
isHorizontal: boolean;
}
/** 逐字预设(offset / curve)的上下文 */
interface VerbatimContext {
/** 强度数组(已 /100) */
intensities: number[];
baseWidth: number;
lineHeight: number;
isHorizontal: boolean;
boundingBox: BoundingBox;
}
/** 逐字 `perChar` 回调拿到的字符信息 */
interface DeformationCharInfo {
paragraphIndex: number;
fragmentIndex: number;
characterIndex: number;
character: Character;
}
interface PresetBase {
/** 未显式提供 intensities 时使用的默认值 */
defaultIntensities?: number[];
}
/** FFD(自由变形)预设:网格规格 + 预处理开关 + 控制点构造 */
interface FfdPreset extends PresetBase {
engine: 'ffd';
/** true=贝塞尔 FFD(需平滑),false=线性 FFD */
bezier: boolean;
hBlocks: number;
vBlocks: number;
/** 变形前先把字形直线拆段 */
breakLine?: boolean;
/** 变形前把直线转二次贝塞尔 */
lineToQuad?: boolean;
build: (points: Vector2[], ctx: FfdContext) => void;
}
/** Bend(整体弯曲)预设 */
interface BendPreset extends PresetBase {
engine: 'bend';
/** true=竖向弯曲,false=横向,'auto'/省略=跟随书写方向 */
vertical?: boolean | 'auto';
transform: (ctx: BendContext) => (point: Vector2Like) => readonly [number, number];
}
/** 逐字沿曲线排布预设 */
interface CurvePreset extends PresetBase {
engine: 'curve';
/** 字符是否沿切线旋转,默认 true */
followTangent?: boolean;
/** 是否沿法线方向按 centerDiviation 外扩(多边形需要) */
expandAlongNormal?: boolean;
makeCurve: (ctx: VerbatimContext) => DeformationCurve;
}
/** 逐字位移/旋转预设 */
interface OffsetPreset extends PresetBase {
engine: 'offset';
/** 逐控制点变换;arg 为 perChar 的返回值 */
point: (point: Vector2Like, arg: any) => readonly [number, number];
/** 逐字计算参数(透传给 point 的 arg) */
perChar?: (ctx: VerbatimContext, info: DeformationCharInfo) => any;
}
type DeformationPreset = FfdPreset | BendPreset | CurvePreset | OffsetPreset;
export type { BendContext as B, CurvePreset as C, DeformationPreset as D, FfdContext as F, OffsetPreset as O, VerbatimContext as V, BendPreset as a, DeformationCharInfo as b, DeformationCurve as c, FfdPreset as d };