@sliiu/present-renderer 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/COPYRIGHT +5 -0
- package/LICENSE +661 -0
- package/README.md +8 -2
- package/THIRD-PARTY-NOTICES.md +221 -0
- package/dist/cjs/arrow-geom.js +38 -0
- package/dist/cjs/canvas-backend.js +1368 -0
- package/dist/cjs/cell-borders.js +25 -0
- package/dist/cjs/chart-canvas.js +1059 -0
- package/dist/cjs/chart-ex-render.js +275 -0
- package/dist/cjs/chart-geom.js +313 -0
- package/dist/cjs/chart-svg.js +1110 -0
- package/dist/cjs/compose.js +74 -0
- package/dist/cjs/effect-clip.js +652 -0
- package/dist/cjs/entrance-hide.js +63 -0
- package/dist/cjs/font-stack.js +103 -0
- package/dist/cjs/hit-geom.js +50 -0
- package/dist/cjs/hybrid-backend.js +93 -0
- package/dist/cjs/hybrid-segments.js +54 -0
- package/dist/cjs/index.js +70 -0
- package/dist/cjs/linked-src.js +116 -0
- package/dist/cjs/metafile-preview.js +142 -0
- package/dist/cjs/model3d-frame.js +199 -0
- package/dist/cjs/model3d-render.js +78 -0
- package/dist/cjs/morph-transition.js +57 -0
- package/dist/cjs/node-affine.js +79 -0
- package/dist/cjs/ole-render.js +291 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/paint-canvas.js +701 -0
- package/dist/cjs/paint-svg.js +674 -0
- package/dist/cjs/scene-node.js +762 -0
- package/dist/cjs/selection.js +130 -0
- package/dist/cjs/shape-effects.js +66 -0
- package/dist/cjs/shape-front.js +38 -0
- package/dist/cjs/stage-chrome.js +15 -0
- package/dist/cjs/svg-backend.js +2172 -0
- package/dist/cjs/text-autofit.js +48 -0
- package/dist/cjs/text-hit.js +284 -0
- package/dist/cjs/text-layout.js +408 -0
- package/dist/cjs/text-shared.js +238 -0
- package/dist/cjs/text-stacked.js +82 -0
- package/dist/cjs/text-warp.js +377 -0
- package/dist/cjs/text-wordart.js +33 -0
- package/dist/cjs/video-frame.js +113 -0
- package/dist/cjs/webgl-model3d-backend.js +285 -0
- package/dist/cjs/webgl-shape-backend.js +360 -0
- package/dist/esm/arrow-geom.js +33 -0
- package/dist/esm/canvas-backend.js +1363 -0
- package/dist/esm/cell-borders.js +21 -0
- package/dist/esm/chart-canvas.js +1056 -0
- package/dist/esm/chart-ex-render.js +261 -0
- package/dist/esm/chart-geom.js +296 -0
- package/dist/esm/chart-svg.js +1107 -0
- package/dist/esm/compose.js +71 -0
- package/dist/esm/effect-clip.js +648 -0
- package/dist/esm/entrance-hide.js +59 -0
- package/dist/esm/font-stack.js +100 -0
- package/dist/esm/hit-geom.js +45 -0
- package/dist/esm/hybrid-backend.js +89 -0
- package/dist/esm/hybrid-segments.js +51 -0
- package/dist/esm/index.js +24 -0
- package/dist/esm/linked-src.js +109 -0
- package/dist/esm/metafile-preview.js +135 -0
- package/dist/esm/model3d-frame.js +158 -0
- package/dist/esm/model3d-render.js +73 -0
- package/dist/esm/morph-transition.js +54 -0
- package/dist/esm/node-affine.js +71 -0
- package/dist/esm/ole-render.js +286 -0
- package/dist/esm/paint-canvas.js +693 -0
- package/dist/esm/paint-svg.js +670 -0
- package/dist/esm/scene-node.js +750 -0
- package/dist/esm/selection.js +122 -0
- package/dist/esm/shape-effects.js +60 -0
- package/dist/esm/shape-front.js +35 -0
- package/dist/esm/stage-chrome.js +12 -0
- package/dist/esm/svg-backend.js +2168 -0
- package/dist/esm/text-autofit.js +44 -0
- package/dist/esm/text-hit.js +280 -0
- package/dist/esm/text-layout.js +400 -0
- package/dist/esm/text-shared.js +221 -0
- package/dist/esm/text-stacked.js +78 -0
- package/dist/esm/text-warp.js +371 -0
- package/dist/esm/text-wordart.js +30 -0
- package/dist/esm/video-frame.js +109 -0
- package/dist/esm/webgl-model3d-backend.js +248 -0
- package/dist/esm/webgl-shape-backend.js +323 -0
- package/dist/types/arrow-geom.d.ts +10 -0
- package/dist/types/canvas-backend.d.ts +55 -0
- package/dist/types/cell-borders.d.ts +9 -0
- package/dist/types/chart-canvas.d.ts +2 -0
- package/dist/types/chart-ex-render.d.ts +79 -0
- package/dist/types/chart-geom.d.ts +112 -0
- package/dist/types/chart-svg.d.ts +2 -0
- package/dist/types/compose.d.ts +2 -0
- package/dist/types/effect-clip.d.ts +10 -0
- package/dist/types/entrance-hide.d.ts +16 -0
- package/dist/types/font-stack.d.ts +9 -0
- package/dist/types/hit-geom.d.ts +15 -0
- package/dist/types/hybrid-backend.d.ts +21 -0
- package/dist/types/hybrid-segments.d.ts +11 -0
- package/dist/types/index.d.ts +24 -0
- package/dist/types/linked-src.d.ts +13 -0
- package/dist/types/metafile-preview.d.ts +11 -0
- package/dist/types/model3d-frame.d.ts +8 -0
- package/dist/types/model3d-render.d.ts +4 -0
- package/dist/types/morph-transition.d.ts +15 -0
- package/dist/types/node-affine.d.ts +22 -0
- package/dist/types/ole-render.d.ts +7 -0
- package/dist/types/paint-canvas.d.ts +22 -0
- package/dist/types/paint-svg.d.ts +19 -0
- package/dist/types/scene-node.d.ts +128 -0
- package/dist/types/selection.d.ts +22 -0
- package/dist/types/shape-effects.d.ts +13 -0
- package/dist/types/shape-front.d.ts +4 -0
- package/dist/types/stage-chrome.d.ts +8 -0
- package/dist/types/svg-backend.d.ts +88 -0
- package/dist/types/text-autofit.d.ts +7 -0
- package/dist/types/text-hit.d.ts +7 -0
- package/dist/types/text-layout.d.ts +35 -0
- package/dist/types/text-shared.d.ts +86 -0
- package/dist/types/text-stacked.d.ts +11 -0
- package/dist/types/text-warp.d.ts +37 -0
- package/dist/types/text-wordart.d.ts +18 -0
- package/dist/types/video-frame.d.ts +2 -0
- package/dist/types/webgl-model3d-backend.d.ts +25 -0
- package/dist/types/webgl-shape-backend.d.ts +33 -0
- package/package.json +43 -4
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type { Shape } from "@sliiu/present-core";
|
|
2
|
+
import { type Scene } from "./scene-node.js";
|
|
3
|
+
export interface SvgBackendOptions {
|
|
4
|
+
shapeFilter?: (s: Shape) => boolean;
|
|
5
|
+
transparent?: boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Thumbnail / sorter / presenter preview. Video, audio, and web embeds
|
|
8
|
+
* become static placeholders — no live `<iframe>` or media element.
|
|
9
|
+
* Cross-origin iframes swallow pointer events (the parent never sees the
|
|
10
|
+
* click) and would load YouTube/Vimeo in every visible thumbnail.
|
|
11
|
+
*/
|
|
12
|
+
preview?: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* 默认按幻灯片视口裁切。编辑器普通视图传 false,让伸出幻灯片的形状
|
|
15
|
+
* 画到周围的灰色工作区。放映、缩略图、阅读视图保持裁切。
|
|
16
|
+
*/
|
|
17
|
+
clipToSlide?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare class SvgBackend {
|
|
20
|
+
readonly root: SVGSVGElement;
|
|
21
|
+
private defs;
|
|
22
|
+
private bindings;
|
|
23
|
+
private scene;
|
|
24
|
+
private readonly uid;
|
|
25
|
+
private rafId;
|
|
26
|
+
private dispose;
|
|
27
|
+
private shapeFilter;
|
|
28
|
+
private preview;
|
|
29
|
+
private measureCtx;
|
|
30
|
+
private textFxSeq;
|
|
31
|
+
private textInnerFilters;
|
|
32
|
+
private getMeasureCtx;
|
|
33
|
+
constructor(scene: Scene, container: HTMLElement, opts?: SvgBackendOptions);
|
|
34
|
+
private scheduleRedraw;
|
|
35
|
+
/**
|
|
36
|
+
* 同步刷新当前 scene 到 DOM,并取消 pending rAF。
|
|
37
|
+
* 主要用于编辑器中切换/重建 backend 时,确保新 backend 的视觉在旧 backend
|
|
38
|
+
* 被销毁前已经写入 DOM,避免出现"先空一帧再绘制"的闪屏。
|
|
39
|
+
*/
|
|
40
|
+
flush(): void;
|
|
41
|
+
private mount;
|
|
42
|
+
private createShapeEl;
|
|
43
|
+
private redraw;
|
|
44
|
+
private applyShapeEffects;
|
|
45
|
+
private ensureEffectFilter;
|
|
46
|
+
private applyReflection;
|
|
47
|
+
/** 离屏 3D:用 baked PNG 替换矢量或文字。image 的未烘焙分支仍走 applyShapeAttrs。 */
|
|
48
|
+
private paintBaked3D;
|
|
49
|
+
private applyShapeAttrs;
|
|
50
|
+
private renderMedia;
|
|
51
|
+
private renderWebEmbed;
|
|
52
|
+
private renderPreviewPoster;
|
|
53
|
+
/** Static tile used when `preview` is on — no live iframe / video / audio. */
|
|
54
|
+
private renderMediaPlaceholder;
|
|
55
|
+
private renderText;
|
|
56
|
+
/**
|
|
57
|
+
* 艺术字:把已画出的墨迹外接矩形拉到形状框。
|
|
58
|
+
*/
|
|
59
|
+
private applyWordArtFit;
|
|
60
|
+
/** 字形墨迹,不含 em 方框上下的空档。getBBox 含整格,拉满后笔画仍缩在框里。 */
|
|
61
|
+
private wordArtInkBox;
|
|
62
|
+
private wordArtFallbackBox;
|
|
63
|
+
private renderTextWarped;
|
|
64
|
+
private renderTextHorizontal;
|
|
65
|
+
private layoutParagraphHoriz;
|
|
66
|
+
private distributeParagraphsAcrossColumns;
|
|
67
|
+
private renderHorizontalParagraph;
|
|
68
|
+
private renderTextStacked;
|
|
69
|
+
private renderStackedColumn;
|
|
70
|
+
/**
|
|
71
|
+
* Run-level innerShdw / reflection. Outer shadow and glow stay on the CSS
|
|
72
|
+
* filter from pickRunEffectsCssFilter. Inner shadow is an SVG filter; reflection
|
|
73
|
+
* is a mirrored <use> under the paragraph.
|
|
74
|
+
*/
|
|
75
|
+
private attachTextRunEffects;
|
|
76
|
+
private ensureTextInnerFilter;
|
|
77
|
+
private renderBullet;
|
|
78
|
+
private applyRunStyle;
|
|
79
|
+
private renderParaSegmented;
|
|
80
|
+
private renderTextRunsWithOverrides;
|
|
81
|
+
private applyImageClip;
|
|
82
|
+
private removeImageClip;
|
|
83
|
+
private applyImageStroke;
|
|
84
|
+
private applyCharClip;
|
|
85
|
+
private applyParaClip;
|
|
86
|
+
private applyClip;
|
|
87
|
+
destroy(): void;
|
|
88
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { TextShape } from "@sliiu/present-core";
|
|
2
|
+
export declare function scaleTextShapeForAutofit(s: TextShape, scale: number): TextShape;
|
|
3
|
+
/**
|
|
4
|
+
* normAutofit 文本溢出时返回缩小后的派生 shape;不溢出(或非 normAutofit)原样返回。
|
|
5
|
+
* measureTotalH 由调用方注入(svg / canvas 后端的段落排版逻辑不同但签名一致)。
|
|
6
|
+
*/
|
|
7
|
+
export declare function autofitTextShape(s: TextShape, innerH: number, measureTotalH: (shape: TextShape) => number): TextShape;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { HyperlinkRef, Shape, TextRun } from "@sliiu/present-core";
|
|
2
|
+
/**
|
|
3
|
+
* 按与渲染层相同的换行 / 对齐 / 边距,命中文字框内某个 run。
|
|
4
|
+
* 竖排堆叠走列布局;`vert`/`vert270`/`bodyRot` 先把点逆旋转到布局坐标系。
|
|
5
|
+
*/
|
|
6
|
+
export declare function hitTestTextRunAt(shape: Shape, x: number, y: number): TextRun | undefined;
|
|
7
|
+
export declare function runLinkAt(shape: Shape, x: number, y: number, slot: "hyperlink" | "hoverLink"): HyperlinkRef | undefined;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { FieldResolveContext, TextParagraph, TextRun } from "@sliiu/present-core";
|
|
2
|
+
export declare function isEastAsianChar(cp: number): boolean;
|
|
3
|
+
export declare function mapVisualAlign(align: NonNullable<TextParagraph["align"]>, rtl: boolean): "start" | "middle" | "end" | "justify";
|
|
4
|
+
export declare function mapVisualAlignWithAnchorCtr(s: {
|
|
5
|
+
anchorCtr?: boolean;
|
|
6
|
+
paragraphs?: {
|
|
7
|
+
length: number;
|
|
8
|
+
};
|
|
9
|
+
cellMeta?: unknown;
|
|
10
|
+
}, p: {
|
|
11
|
+
align?: TextParagraph["align"];
|
|
12
|
+
rtl?: boolean;
|
|
13
|
+
}): "start" | "middle" | "end" | "justify";
|
|
14
|
+
export type Token = {
|
|
15
|
+
text: string;
|
|
16
|
+
kind: "word" | "ws" | "cjk" | "tab";
|
|
17
|
+
};
|
|
18
|
+
/** Glue prohibited line-start / line-end characters to their CJK neighbour so they wrap together. */
|
|
19
|
+
export declare function applyKinsoku(tokens: Token[]): Token[];
|
|
20
|
+
/** eaLnBrk 为假:相邻汉字粘成一块,标点后面仍可断。调用前先走过禁则。 */
|
|
21
|
+
export declare function glueUnbrokenEastAsian(tokens: Token[]): Token[];
|
|
22
|
+
export interface VisualLine {
|
|
23
|
+
segments: Array<{
|
|
24
|
+
run: TextRun;
|
|
25
|
+
text: string;
|
|
26
|
+
width: number;
|
|
27
|
+
}>;
|
|
28
|
+
width: number;
|
|
29
|
+
/** 行末挂在边外的标点宽度。对齐用 width - hang。 */
|
|
30
|
+
hang: number;
|
|
31
|
+
height: number;
|
|
32
|
+
ascent: number;
|
|
33
|
+
maxFs: number;
|
|
34
|
+
}
|
|
35
|
+
export declare function wrapParagraphIntoLines(p: TextParagraph, maxWidth: number, fallbackFs: number, ctx: CanvasRenderingContext2D, firstLineMaxWidth: number, noWrap: boolean, fieldCtx?: FieldResolveContext, compatLnSpc?: boolean): VisualLine[];
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { BulletDef, ShapeEffect, TextParagraph } from "@sliiu/present-core";
|
|
2
|
+
/**
|
|
3
|
+
* §21.1.2.1.1 bodyPr@lIns/tIns/rIns/bIns 的 OOXML 缺省值:
|
|
4
|
+
* 左右 91440 EMU = 7.2pt ≈ 9.6px,上下 45720 EMU = 3.6pt ≈ 4.8px。
|
|
5
|
+
*/
|
|
6
|
+
export declare const DEFAULT_TEXT_INSETS: {
|
|
7
|
+
readonly l: 9.6;
|
|
8
|
+
readonly t: 4.8;
|
|
9
|
+
readonly r: 9.6;
|
|
10
|
+
readonly b: 4.8;
|
|
11
|
+
};
|
|
12
|
+
/** 未写 lnSpc 时的行框系数。§21.1.2.2.5 只说由字号决定,这里取 1.2。 */
|
|
13
|
+
export declare const DEFAULT_LINE_HEIGHT_FACTOR = 1.2;
|
|
14
|
+
/** 继承链都没写 sz 时的绘制字号(px)。schema 不给 sz 缺省值;Office 用 18pt。 */
|
|
15
|
+
export declare const FALLBACK_FONT_SIZE: number;
|
|
16
|
+
export type VertMode = NonNullable<import("@sliiu/present-core").TextShape["vert"]>;
|
|
17
|
+
/**
|
|
18
|
+
* §21.1.2.1.1 bodyPr@vert — 整框旋转角度。
|
|
19
|
+
* 仅 vert/vert270 走"外层 rotate"路径;其余竖排模式靠自定义竖排 layout。
|
|
20
|
+
*/
|
|
21
|
+
export declare function vertRotateDeg(v: VertMode | undefined): number;
|
|
22
|
+
export declare function isVerticalStack(v: VertMode | undefined): v is "wordArtVert" | "wordArtVertRtl" | "eaVert" | "mongolianVert";
|
|
23
|
+
/**
|
|
24
|
+
* 竖排堆叠的列推进方向。
|
|
25
|
+
* wordArtVertRtl = 从右到左(WPS「行顺序:从右到左」)。
|
|
26
|
+
* wordArtVert = 从左到右(WPS「行顺序:从左到右」)。rtlCol 对这两种 vert 无效。
|
|
27
|
+
*/
|
|
28
|
+
export declare function stackedColumnsLtr(vert: "wordArtVert" | "wordArtVertRtl" | "eaVert" | "mongolianVert", rtlCol?: boolean): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* §21.1.2.1.1 bodyPr@rot / @vert / @upright 叠加后,文字内容相对 slide 的总旋转角。
|
|
31
|
+
* 渲染端把 shape 自身的 rotation 加在 scene node 上、把 bodyRot+vert 加在文本组上,
|
|
32
|
+
* upright 再抵消掉 shape 的 rotation —— 三者之和就是文字最终看起来的旋转角度。
|
|
33
|
+
*/
|
|
34
|
+
export declare function textTotalRotationDeg(s: {
|
|
35
|
+
transform?: {
|
|
36
|
+
rotation?: number;
|
|
37
|
+
};
|
|
38
|
+
bodyRot?: number;
|
|
39
|
+
vert?: VertMode;
|
|
40
|
+
upright?: boolean;
|
|
41
|
+
}): number;
|
|
42
|
+
/** 段落缺省字号:取段内最大显式字号,全缺省时用 FALLBACK_FONT_SIZE。 */
|
|
43
|
+
export declare function paragraphFallbackFontSize(p: TextParagraph): number;
|
|
44
|
+
/**
|
|
45
|
+
* §21.1.2.2.5 spcPct 是最大字号的百分比:120000 = 1.2 × 字号,不再乘第二层系数。
|
|
46
|
+
* 未写 lnSpc 时用 DEFAULT_LINE_HEIGHT_FACTOR;compatLnSpc 时按 1 × 字号。
|
|
47
|
+
*/
|
|
48
|
+
export declare function lineHeightFactor(p: TextParagraph, compatLnSpc?: boolean): number;
|
|
49
|
+
/** 段落行高(px):显式 lineHeightPx 优先,否则按 §21.1.2.2.5 的百分比系数算。 */
|
|
50
|
+
export declare function paragraphLineHeightPx(p: TextParagraph, fallbackFs?: number, compatLnSpc?: boolean): number;
|
|
51
|
+
export interface BulletNumState {
|
|
52
|
+
lastLevel: number;
|
|
53
|
+
lastType: string;
|
|
54
|
+
count: number;
|
|
55
|
+
}
|
|
56
|
+
export declare function newBulletNumState(): BulletNumState;
|
|
57
|
+
/** §21.1.2.4.1 buAutoNum@type — 把序号按 ST_TextAutonumberScheme 格式化。 */
|
|
58
|
+
export declare function formatBulletNumber(n: number, type: string): string;
|
|
59
|
+
/**
|
|
60
|
+
* §21.1.2.4.5 buSzPts 优先于 §21.1.2.4.4 buSzPct;两者都缺省时跟随 run 字号(buSzTx)。
|
|
61
|
+
*/
|
|
62
|
+
export declare function bulletFontSize(bullet: BulletDef, runFs: number): number;
|
|
63
|
+
/**
|
|
64
|
+
* 推进自动编号状态机,返回该段 bullet 的显示文本。
|
|
65
|
+
* none / picture 返回 null(picture bullet 由各消费者自行绘制图片)。
|
|
66
|
+
*
|
|
67
|
+
* 编号连续性规则:连续的同 level buAutoNum 段落累加;一旦遇到 buChar / buNone /
|
|
68
|
+
* level 变化就重置,与 PowerPoint 表现一致。
|
|
69
|
+
*/
|
|
70
|
+
export declare function advanceBulletLabel(p: TextParagraph, state: BulletNumState): string | null;
|
|
71
|
+
export declare function hexWithAlpha(color: string, alpha: number): string;
|
|
72
|
+
/**
|
|
73
|
+
* §21.1.2.3.9 rPr/effectLst → CSS `filter` 串(drop-shadow 链式叠加)。
|
|
74
|
+
*
|
|
75
|
+
* `scale` 用来把 slide 单位换算成目标坐标系的 px:SVG 里 filter 走 user-space
|
|
76
|
+
* 会随 viewBox 自动缩放,所以后端传 1;HTML overlay(编辑器)按屏幕 px 绘制,
|
|
77
|
+
* 必须传当前 stageScale,否则缩放后阴影 / 光晕的偏移和模糊半径会明显不对。
|
|
78
|
+
*
|
|
79
|
+
* inner shadow 与 reflection 不走这条 CSS 链:SVG 用 feComposite / 镜像 <use>,
|
|
80
|
+
* Canvas 在 drawText 里单独画。这里若把 reflection 收成 drop-shadow,倒影会变成一团光。
|
|
81
|
+
*/
|
|
82
|
+
export declare function textEffectsCssFilter(effects: ShapeEffect[] | undefined, scale?: number): string | undefined;
|
|
83
|
+
/** 取 paragraph 内首个声明 effects 的 run 的 CSS filter(paragraph 级近似)。 */
|
|
84
|
+
export declare function pickRunEffectsCssFilter(runs: ReadonlyArray<{
|
|
85
|
+
effects?: ShapeEffect[];
|
|
86
|
+
}>, scale?: number): string | undefined;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { FieldResolveContext, TextParagraph, TextRun } from "@sliiu/present-core";
|
|
2
|
+
import type { ParaOverride } from "./scene-node.js";
|
|
3
|
+
export interface StackedGlyph {
|
|
4
|
+
ch: string;
|
|
5
|
+
run: TextRun;
|
|
6
|
+
fontSize: number;
|
|
7
|
+
stepY: number;
|
|
8
|
+
upright: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function buildStackedGlyphs(p: TextParagraph, para: ParaOverride | undefined, vert: "wordArtVert" | "wordArtVertRtl" | "eaVert" | "mongolianVert", fieldCtx?: FieldResolveContext): StackedGlyph[];
|
|
11
|
+
export declare function wrapGlyphsIntoColumns(glyphs: StackedGlyph[], maxH: number): StackedGlyph[][];
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { TextRun, TextShape } from "@sliiu/present-core";
|
|
2
|
+
export interface WarpSample {
|
|
3
|
+
x: number;
|
|
4
|
+
y: number;
|
|
5
|
+
angle: number;
|
|
6
|
+
/** Pour 内外路径间距(px)。有值时 glyph 沿法向拉伸填满环带。 */
|
|
7
|
+
radial?: number;
|
|
8
|
+
}
|
|
9
|
+
export interface WarpGlyph {
|
|
10
|
+
ch: string;
|
|
11
|
+
x: number;
|
|
12
|
+
y: number;
|
|
13
|
+
angle: number;
|
|
14
|
+
scaleY: number;
|
|
15
|
+
run: TextRun;
|
|
16
|
+
fontSize: number;
|
|
17
|
+
}
|
|
18
|
+
export declare function warpActive(s: TextShape): boolean;
|
|
19
|
+
/** 在文字框内生成 warp 基线采样(沿路径从左到右)。 */
|
|
20
|
+
export declare function sampleWarpPath(prst: string, box: {
|
|
21
|
+
x: number;
|
|
22
|
+
y: number;
|
|
23
|
+
w: number;
|
|
24
|
+
h: number;
|
|
25
|
+
}, avLst?: Record<string, number>): WarpSample[];
|
|
26
|
+
export declare function placeGlyphsOnWarp(glyphs: Array<{
|
|
27
|
+
ch: string;
|
|
28
|
+
width: number;
|
|
29
|
+
run: TextRun;
|
|
30
|
+
fontSize: number;
|
|
31
|
+
}>, samples: WarpSample[], prst?: string): WarpGlyph[];
|
|
32
|
+
export declare function flattenWarpGlyphs(s: TextShape, measure: (run: TextRun, text: string) => number): Array<{
|
|
33
|
+
ch: string;
|
|
34
|
+
width: number;
|
|
35
|
+
run: TextRun;
|
|
36
|
+
fontSize: number;
|
|
37
|
+
}>;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface WordArtBox {
|
|
2
|
+
x: number;
|
|
3
|
+
y: number;
|
|
4
|
+
w: number;
|
|
5
|
+
h: number;
|
|
6
|
+
}
|
|
7
|
+
export interface WordArtFit {
|
|
8
|
+
sx: number;
|
|
9
|
+
sy: number;
|
|
10
|
+
tx: number;
|
|
11
|
+
ty: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* 把已排好的墨迹框映射到形状框。
|
|
15
|
+
* 变换顺序是先缩放再平移:`x' = x * sx + tx`。
|
|
16
|
+
* 近乎 1:1 或比例离谱时返回 null,调用方保持原排版。
|
|
17
|
+
*/
|
|
18
|
+
export declare function wordArtFitTransform(ink: WordArtBox, box: WordArtBox): WordArtFit | null;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Shape } from "@sliiu/present-core";
|
|
2
|
+
import type { Scene } from "./scene-node.js";
|
|
3
|
+
export interface WebGLModel3DBackendOptions {
|
|
4
|
+
shapeFilter?: (s: Shape) => boolean;
|
|
5
|
+
interactive?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare class WebGLModel3DBackend {
|
|
8
|
+
private space;
|
|
9
|
+
private managed;
|
|
10
|
+
private dispose;
|
|
11
|
+
private k;
|
|
12
|
+
private rafId;
|
|
13
|
+
private readyResolvers;
|
|
14
|
+
constructor(scene: Scene, container: HTMLElement, opts?: WebGLModel3DBackendOptions);
|
|
15
|
+
private add;
|
|
16
|
+
private bindOrbit;
|
|
17
|
+
private syncWrapper;
|
|
18
|
+
private scheduleRender;
|
|
19
|
+
private renderAll;
|
|
20
|
+
private resolveReady;
|
|
21
|
+
orbitModel3D(shapeId: string, dLon: number, dLat: number): boolean;
|
|
22
|
+
flush(): void;
|
|
23
|
+
whenReady(): Promise<void>;
|
|
24
|
+
destroy(): void;
|
|
25
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Shape } from "@sliiu/present-core";
|
|
2
|
+
import type { Scene } from "./scene-node.js";
|
|
3
|
+
export interface WebGLShapeBackendOptions {
|
|
4
|
+
shapeFilter?: (s: Shape) => boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare class WebGLShapeBackend {
|
|
7
|
+
private scene;
|
|
8
|
+
private space;
|
|
9
|
+
private managed;
|
|
10
|
+
private dispose;
|
|
11
|
+
private dpr;
|
|
12
|
+
private k;
|
|
13
|
+
private rafId;
|
|
14
|
+
private ro;
|
|
15
|
+
private readyResolvers;
|
|
16
|
+
constructor(scene: Scene, container: HTMLElement, opts?: WebGLShapeBackendOptions);
|
|
17
|
+
private add;
|
|
18
|
+
/** 用(可能为空的)贴图构建 three 场景 + 相机,写回 managed 并触发首渲。 */
|
|
19
|
+
private buildManaged;
|
|
20
|
+
private getRenderer;
|
|
21
|
+
private scheduleSync;
|
|
22
|
+
private syncTransforms;
|
|
23
|
+
private syncOne;
|
|
24
|
+
private scheduleGlRender;
|
|
25
|
+
private glRenderAll;
|
|
26
|
+
private glRenderOne;
|
|
27
|
+
flush(): void;
|
|
28
|
+
/** 所有 3D shape 的贴图都加载完、场景已构建并首渲后 resolve(截图前等待用)。 */
|
|
29
|
+
whenReady(): Promise<void>;
|
|
30
|
+
private isReady;
|
|
31
|
+
private checkReady;
|
|
32
|
+
destroy(): void;
|
|
33
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,45 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sliiu/present-renderer",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"license": "AGPL-3.0-or-later",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/cjs/index.js",
|
|
7
|
+
"types": "./dist/types/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/types/index.d.ts",
|
|
11
|
+
"import": "./dist/esm/index.js",
|
|
12
|
+
"require": "./dist/cjs/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"scripts": {
|
|
16
|
+
"typecheck": "tsc --noEmit"
|
|
17
|
+
},
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"emf-converter": "^4.8.0",
|
|
20
|
+
"three": "^0.186.0",
|
|
21
|
+
"@sliiu/present-animation": "0.1.1",
|
|
22
|
+
"@sliiu/present-core": "0.1.1",
|
|
23
|
+
"@sliiu/present-three-bake": "0.1.1"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@types/three": "^0.186.0"
|
|
27
|
+
},
|
|
28
|
+
"module": "./dist/esm/index.js",
|
|
29
|
+
"repository": {
|
|
30
|
+
"type": "git",
|
|
31
|
+
"url": "git+https://github.com/sliiu/slimoffice.git",
|
|
32
|
+
"directory": "present/renderer"
|
|
33
|
+
},
|
|
34
|
+
"homepage": "https://github.com/sliiu/slimoffice/tree/main/present/renderer",
|
|
35
|
+
"bugs": {
|
|
36
|
+
"url": "https://github.com/sliiu/slimoffice/issues"
|
|
37
|
+
},
|
|
38
|
+
"files": [
|
|
39
|
+
"dist",
|
|
40
|
+
"README.md",
|
|
41
|
+
"LICENSE",
|
|
42
|
+
"COPYRIGHT",
|
|
43
|
+
"THIRD-PARTY-NOTICES.md"
|
|
44
|
+
]
|
|
45
|
+
}
|