postext 1.19.3 → 1.20.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/dist/__tests__/comics/art.test.d.ts +2 -0
- package/dist/__tests__/comics/art.test.d.ts.map +1 -0
- package/dist/__tests__/comics/art.test.js +96 -0
- package/dist/__tests__/comics/art.test.js.map +1 -0
- package/dist/__tests__/comics/build.test.d.ts +2 -0
- package/dist/__tests__/comics/build.test.d.ts.map +1 -0
- package/dist/__tests__/comics/build.test.js +215 -0
- package/dist/__tests__/comics/build.test.js.map +1 -0
- package/dist/__tests__/comics/canvas.test.d.ts +2 -0
- package/dist/__tests__/comics/canvas.test.d.ts.map +1 -0
- package/dist/__tests__/comics/canvas.test.js +161 -0
- package/dist/__tests__/comics/canvas.test.js.map +1 -0
- package/dist/__tests__/comics/config.test.d.ts +2 -0
- package/dist/__tests__/comics/config.test.d.ts.map +1 -0
- package/dist/__tests__/comics/config.test.js +97 -0
- package/dist/__tests__/comics/config.test.js.map +1 -0
- package/dist/__tests__/comics/geometry.test.d.ts +2 -0
- package/dist/__tests__/comics/geometry.test.d.ts.map +1 -0
- package/dist/__tests__/comics/geometry.test.js +118 -0
- package/dist/__tests__/comics/geometry.test.js.map +1 -0
- package/dist/__tests__/comics/html.test.d.ts +2 -0
- package/dist/__tests__/comics/html.test.d.ts.map +1 -0
- package/dist/__tests__/comics/html.test.js +253 -0
- package/dist/__tests__/comics/html.test.js.map +1 -0
- package/dist/__tests__/comics/lettering.test.d.ts +2 -0
- package/dist/__tests__/comics/lettering.test.d.ts.map +1 -0
- package/dist/__tests__/comics/lettering.test.js +241 -0
- package/dist/__tests__/comics/lettering.test.js.map +1 -0
- package/dist/__tests__/comics/script.test.d.ts +2 -0
- package/dist/__tests__/comics/script.test.d.ts.map +1 -0
- package/dist/__tests__/comics/script.test.js +147 -0
- package/dist/__tests__/comics/script.test.js.map +1 -0
- package/dist/__tests__/comics/split.test.d.ts +2 -0
- package/dist/__tests__/comics/split.test.d.ts.map +1 -0
- package/dist/__tests__/comics/split.test.js +120 -0
- package/dist/__tests__/comics/split.test.js.map +1 -0
- package/dist/__tests__/comics/spread.test.d.ts +2 -0
- package/dist/__tests__/comics/spread.test.d.ts.map +1 -0
- package/dist/__tests__/comics/spread.test.js +161 -0
- package/dist/__tests__/comics/spread.test.js.map +1 -0
- package/dist/__tests__/comics/strip.test.d.ts +2 -0
- package/dist/__tests__/comics/strip.test.d.ts.map +1 -0
- package/dist/__tests__/comics/strip.test.js +231 -0
- package/dist/__tests__/comics/strip.test.js.map +1 -0
- package/dist/__tests__/exports.test.js +89 -0
- package/dist/__tests__/exports.test.js.map +1 -1
- package/dist/__tests__/parse/containers.test.js +1 -1
- package/dist/__tests__/parse/containers.test.js.map +1 -1
- package/dist/canvas-backend/comic.d.ts +32 -0
- package/dist/canvas-backend/comic.d.ts.map +1 -0
- package/dist/canvas-backend/comic.js +216 -0
- package/dist/canvas-backend/comic.js.map +1 -0
- package/dist/canvas-backend/headerFooter.d.ts +4 -1
- package/dist/canvas-backend/headerFooter.d.ts.map +1 -1
- package/dist/canvas-backend/headerFooter.js +3 -1
- package/dist/canvas-backend/headerFooter.js.map +1 -1
- package/dist/canvas-backend/index.d.ts.map +1 -1
- package/dist/canvas-backend/index.js +7 -1
- package/dist/canvas-backend/index.js.map +1 -1
- package/dist/comics/art.d.ts +72 -0
- package/dist/comics/art.d.ts.map +1 -0
- package/dist/comics/art.js +154 -0
- package/dist/comics/art.js.map +1 -0
- package/dist/comics/fonts.d.ts +20 -0
- package/dist/comics/fonts.d.ts.map +1 -0
- package/dist/comics/fonts.js +42 -0
- package/dist/comics/fonts.js.map +1 -0
- package/dist/comics/geometry.d.ts +87 -0
- package/dist/comics/geometry.d.ts.map +1 -0
- package/dist/comics/geometry.js +272 -0
- package/dist/comics/geometry.js.map +1 -0
- package/dist/comics/index.d.ts +29 -0
- package/dist/comics/index.d.ts.map +1 -0
- package/dist/comics/index.js +18 -0
- package/dist/comics/index.js.map +1 -0
- package/dist/comics/layoutPage.d.ts +156 -0
- package/dist/comics/layoutPage.d.ts.map +1 -0
- package/dist/comics/layoutPage.js +698 -0
- package/dist/comics/layoutPage.js.map +1 -0
- package/dist/comics/lettering/__tests__/harness.test.d.ts +2 -0
- package/dist/comics/lettering/__tests__/harness.test.d.ts.map +1 -0
- package/dist/comics/lettering/__tests__/harness.test.js +273 -0
- package/dist/comics/lettering/__tests__/harness.test.js.map +1 -0
- package/dist/comics/lettering/__tests__/letterPanel.test.d.ts +2 -0
- package/dist/comics/lettering/__tests__/letterPanel.test.d.ts.map +1 -0
- package/dist/comics/lettering/__tests__/letterPanel.test.js +224 -0
- package/dist/comics/lettering/__tests__/letterPanel.test.js.map +1 -0
- package/dist/comics/lettering/__tests__/polish.test.d.ts +2 -0
- package/dist/comics/lettering/__tests__/polish.test.d.ts.map +1 -0
- package/dist/comics/lettering/__tests__/polish.test.js +357 -0
- package/dist/comics/lettering/__tests__/polish.test.js.map +1 -0
- package/dist/comics/lettering/__tests__/round2.test.d.ts +2 -0
- package/dist/comics/lettering/__tests__/round2.test.d.ts.map +1 -0
- package/dist/comics/lettering/__tests__/round2.test.js +289 -0
- package/dist/comics/lettering/__tests__/round2.test.js.map +1 -0
- package/dist/comics/lettering/__tests__/round3.test.d.ts +2 -0
- package/dist/comics/lettering/__tests__/round3.test.d.ts.map +1 -0
- package/dist/comics/lettering/__tests__/round3.test.js +240 -0
- package/dist/comics/lettering/__tests__/round3.test.js.map +1 -0
- package/dist/comics/lettering/__tests__/shapeText.test.d.ts +2 -0
- package/dist/comics/lettering/__tests__/shapeText.test.d.ts.map +1 -0
- package/dist/comics/lettering/__tests__/shapeText.test.js +98 -0
- package/dist/comics/lettering/__tests__/shapeText.test.js.map +1 -0
- package/dist/comics/lettering/__tests__/shapes.test.d.ts +2 -0
- package/dist/comics/lettering/__tests__/shapes.test.d.ts.map +1 -0
- package/dist/comics/lettering/__tests__/shapes.test.js +137 -0
- package/dist/comics/lettering/__tests__/shapes.test.js.map +1 -0
- package/dist/comics/lettering/__tests__/stubMeasure.d.ts +5 -0
- package/dist/comics/lettering/__tests__/stubMeasure.d.ts.map +1 -0
- package/dist/comics/lettering/__tests__/stubMeasure.js +47 -0
- package/dist/comics/lettering/__tests__/stubMeasure.js.map +1 -0
- package/dist/comics/lettering/__tests__/text.test.d.ts +2 -0
- package/dist/comics/lettering/__tests__/text.test.d.ts.map +1 -0
- package/dist/comics/lettering/__tests__/text.test.js +86 -0
- package/dist/comics/lettering/__tests__/text.test.js.map +1 -0
- package/dist/comics/lettering/geom.d.ts +78 -0
- package/dist/comics/lettering/geom.d.ts.map +1 -0
- package/dist/comics/lettering/geom.js +376 -0
- package/dist/comics/lettering/geom.js.map +1 -0
- package/dist/comics/lettering/index.d.ts +7 -0
- package/dist/comics/lettering/index.d.ts.map +1 -0
- package/dist/comics/lettering/index.js +8 -0
- package/dist/comics/lettering/index.js.map +1 -0
- package/dist/comics/lettering/letter.d.ts +7 -0
- package/dist/comics/lettering/letter.d.ts.map +1 -0
- package/dist/comics/lettering/letter.js +496 -0
- package/dist/comics/lettering/letter.js.map +1 -0
- package/dist/comics/lettering/placement.d.ts +133 -0
- package/dist/comics/lettering/placement.d.ts.map +1 -0
- package/dist/comics/lettering/placement.js +1095 -0
- package/dist/comics/lettering/placement.js.map +1 -0
- package/dist/comics/lettering/presets.d.ts +15 -0
- package/dist/comics/lettering/presets.d.ts.map +1 -0
- package/dist/comics/lettering/presets.js +61 -0
- package/dist/comics/lettering/presets.js.map +1 -0
- package/dist/comics/lettering/shape-text.d.ts +72 -0
- package/dist/comics/lettering/shape-text.d.ts.map +1 -0
- package/dist/comics/lettering/shape-text.js +550 -0
- package/dist/comics/lettering/shape-text.js.map +1 -0
- package/dist/comics/lettering/shapes.d.ts +83 -0
- package/dist/comics/lettering/shapes.d.ts.map +1 -0
- package/dist/comics/lettering/shapes.js +512 -0
- package/dist/comics/lettering/shapes.js.map +1 -0
- package/dist/comics/lettering/text.d.ts +79 -0
- package/dist/comics/lettering/text.d.ts.map +1 -0
- package/dist/comics/lettering/text.js +488 -0
- package/dist/comics/lettering/text.js.map +1 -0
- package/dist/comics/lettering/types.d.ts +279 -0
- package/dist/comics/lettering/types.d.ts.map +1 -0
- package/dist/comics/lettering/types.js +9 -0
- package/dist/comics/lettering/types.js.map +1 -0
- package/dist/comics/page.d.ts +37 -0
- package/dist/comics/page.d.ts.map +1 -0
- package/dist/comics/page.js +285 -0
- package/dist/comics/page.js.map +1 -0
- package/dist/comics/paint.d.ts +65 -0
- package/dist/comics/paint.d.ts.map +1 -0
- package/dist/comics/paint.js +219 -0
- package/dist/comics/paint.js.map +1 -0
- package/dist/comics/script.d.ts +42 -0
- package/dist/comics/script.d.ts.map +1 -0
- package/dist/comics/script.js +302 -0
- package/dist/comics/script.js.map +1 -0
- package/dist/comics/split.d.ts +135 -0
- package/dist/comics/split.d.ts.map +1 -0
- package/dist/comics/split.js +514 -0
- package/dist/comics/split.js.map +1 -0
- package/dist/comics/spread.d.ts +36 -0
- package/dist/comics/spread.d.ts.map +1 -0
- package/dist/comics/spread.js +172 -0
- package/dist/comics/spread.js.map +1 -0
- package/dist/comics/strip.d.ts +77 -0
- package/dist/comics/strip.d.ts.map +1 -0
- package/dist/comics/strip.js +89 -0
- package/dist/comics/strip.js.map +1 -0
- package/dist/comics/transform.d.ts +37 -0
- package/dist/comics/transform.d.ts.map +1 -0
- package/dist/comics/transform.js +161 -0
- package/dist/comics/transform.js.map +1 -0
- package/dist/comics/types.d.ts +143 -0
- package/dist/comics/types.d.ts.map +1 -0
- package/dist/comics/types.js +13 -0
- package/dist/comics/types.js.map +1 -0
- package/dist/comics/warnings.d.ts +14 -0
- package/dist/comics/warnings.d.ts.map +1 -0
- package/dist/comics/warnings.js +94 -0
- package/dist/comics/warnings.js.map +1 -0
- package/dist/configWarnings.d.ts.map +1 -1
- package/dist/configWarnings.js +42 -0
- package/dist/configWarnings.js.map +1 -1
- package/dist/defaults/comics.d.ts +51 -0
- package/dist/defaults/comics.d.ts.map +1 -0
- package/dist/defaults/comics.js +385 -0
- package/dist/defaults/comics.js.map +1 -0
- package/dist/defaults/index.d.ts +1 -0
- package/dist/defaults/index.d.ts.map +1 -1
- package/dist/defaults/index.js +9 -0
- package/dist/defaults/index.js.map +1 -1
- package/dist/design/layout.d.ts +13 -1
- package/dist/design/layout.d.ts.map +1 -1
- package/dist/design/layout.js +17 -0
- package/dist/design/layout.js.map +1 -1
- package/dist/html-backend.d.ts +3 -0
- package/dist/html-backend.d.ts.map +1 -1
- package/dist/html-backend.js +44 -8
- package/dist/html-backend.js.map +1 -1
- package/dist/htmlComic.d.ts +69 -0
- package/dist/htmlComic.d.ts.map +1 -0
- package/dist/htmlComic.js +179 -0
- package/dist/htmlComic.js.map +1 -0
- package/dist/index.d.ts +8 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/parse/blockParser.d.ts.map +1 -1
- package/dist/parse/blockParser.js +25 -1
- package/dist/parse/blockParser.js.map +1 -1
- package/dist/parse/indexMarks.d.ts.map +1 -1
- package/dist/parse/indexMarks.js +3 -0
- package/dist/parse/indexMarks.js.map +1 -1
- package/dist/parse/types.d.ts +7 -1
- package/dist/parse/types.d.ts.map +1 -1
- package/dist/pipeline/build.d.ts.map +1 -1
- package/dist/pipeline/build.js +251 -9
- package/dist/pipeline/build.js.map +1 -1
- package/dist/pipeline/config.d.ts.map +1 -1
- package/dist/pipeline/config.js +4 -1
- package/dist/pipeline/config.js.map +1 -1
- package/dist/pipeline/contentWarnings.d.ts.map +1 -1
- package/dist/pipeline/contentWarnings.js +58 -0
- package/dist/pipeline/contentWarnings.js.map +1 -1
- package/dist/pipeline/floatSlots.js +1 -1
- package/dist/pipeline/floatSlots.js.map +1 -1
- package/dist/pipeline/headerFooter.d.ts +6 -2
- package/dist/pipeline/headerFooter.d.ts.map +1 -1
- package/dist/pipeline/headerFooter.js +11 -3
- package/dist/pipeline/headerFooter.js.map +1 -1
- package/dist/pipeline/pageRoles.d.ts +1 -0
- package/dist/pipeline/pageRoles.d.ts.map +1 -1
- package/dist/pipeline/pageRoles.js +3 -0
- package/dist/pipeline/pageRoles.js.map +1 -1
- package/dist/pipeline/placement.d.ts +3 -3
- package/dist/pipeline/placement.d.ts.map +1 -1
- package/dist/pipeline/placement.js +4 -4
- package/dist/pipeline/placement.js.map +1 -1
- package/dist/types.d.ts +338 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/vdt.d.ts +271 -2
- package/dist/vdt.d.ts.map +1 -1
- package/dist/vdt.js.map +1 -1
- package/dist/worker/fonts.d.ts +2 -1
- package/dist/worker/fonts.d.ts.map +1 -1
- package/dist/worker/fonts.js +11 -1
- package/dist/worker/fonts.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The picture of a comic panel (#556): which part of it shows in the cell.
|
|
3
|
+
*
|
|
4
|
+
* `cover` fills the cell: the visible window has the cell's aspect ratio
|
|
5
|
+
* and is as large as the picture allows; it is placed so the picture's
|
|
6
|
+
* safe area stays whole — centred on `focus` when one is given, else with
|
|
7
|
+
* the margins round the safe area cropped in proportion to their sizes
|
|
8
|
+
* (the rule of `safeAreaSource`), else centred. A cell whose shape cannot
|
|
9
|
+
* hold the safe area under a cover crop shows the smallest window that
|
|
10
|
+
* holds it, and the picture is letterboxed (the bands show the panel
|
|
11
|
+
* background). `contain` always shows the whole picture.
|
|
12
|
+
*
|
|
13
|
+
* The result is the window in picture fractions (`source`) and the box the
|
|
14
|
+
* whole picture covers on the page (`box`): renderers clip to the cell and
|
|
15
|
+
* draw the picture at `box`, as they draw a cropped figure
|
|
16
|
+
* (`uncroppedPictureBox`). A mirrored picture is flipped inside `box`.
|
|
17
|
+
*/
|
|
18
|
+
import { normalizeSafeArea } from '../pipeline/safeArea';
|
|
19
|
+
/** The cell aspect ratios (width / height) a picture can fill under a
|
|
20
|
+
* cover crop with its safe area whole: from the safe area's width over the
|
|
21
|
+
* whole height (`min`, a tall cell) to the whole width over the safe
|
|
22
|
+
* area's height (`max`, a wide one). Without a safe area any ratio. */
|
|
23
|
+
export function comicCropFeasibleRange(width, height, safeArea) {
|
|
24
|
+
const area = normalizeSafeArea(safeArea);
|
|
25
|
+
if (!area || width <= 0 || height <= 0)
|
|
26
|
+
return { min: 0, max: Infinity };
|
|
27
|
+
return { min: (area.width * width) / height, max: width / (area.height * height) };
|
|
28
|
+
}
|
|
29
|
+
/** Start of a window `size` long on an axis of length 1 that keeps
|
|
30
|
+
* `[a, a + s]`, the margins cropped in proportion to their sizes. */
|
|
31
|
+
function proportional(a, s, size) {
|
|
32
|
+
const margins = 1 - s;
|
|
33
|
+
if (margins <= 1e-9)
|
|
34
|
+
return (1 - size) / 2;
|
|
35
|
+
return Math.max(0, Math.min(1 - size, (a * (1 - size)) / margins));
|
|
36
|
+
}
|
|
37
|
+
/** Start of a window `size` long on one axis, centred on `c` but kept over
|
|
38
|
+
* the safe span `[a, a + s]` (when there is one and it fits) and inside
|
|
39
|
+
* `[0, 1]`. */
|
|
40
|
+
function centred(c, size, a, s) {
|
|
41
|
+
let start = c - size / 2;
|
|
42
|
+
if (a !== undefined && s !== undefined && s <= size) {
|
|
43
|
+
start = Math.min(start, a);
|
|
44
|
+
start = Math.max(start, a + s - size);
|
|
45
|
+
}
|
|
46
|
+
return Math.max(0, Math.min(1 - size, start));
|
|
47
|
+
}
|
|
48
|
+
function flipArea(area) {
|
|
49
|
+
return area ? { ...area, x: 1 - area.x - area.width } : undefined;
|
|
50
|
+
}
|
|
51
|
+
/** Which part of a picture shows in a cell, and where the whole picture
|
|
52
|
+
* goes. */
|
|
53
|
+
export function comicArtCrop(input) {
|
|
54
|
+
const { width: iw, height: ih, cell } = input;
|
|
55
|
+
const cw = Math.max(1e-6, cell.width);
|
|
56
|
+
const ch = Math.max(1e-6, cell.height);
|
|
57
|
+
const C = cw / ch;
|
|
58
|
+
const A = iw > 0 && ih > 0 ? iw / ih : C;
|
|
59
|
+
// Work in the drawn (possibly flipped) picture.
|
|
60
|
+
const area = input.mirrored ? flipArea(normalizeSafeArea(input.safeArea)) : normalizeSafeArea(input.safeArea);
|
|
61
|
+
const focus = input.focus ? { x: input.mirrored ? 1 - input.focus.x : input.focus.x, y: input.focus.y } : undefined;
|
|
62
|
+
// The window, in fractions of the drawn picture (may pass its edges).
|
|
63
|
+
let ww;
|
|
64
|
+
let wh;
|
|
65
|
+
let fallback = false;
|
|
66
|
+
if (input.fit === 'contain') {
|
|
67
|
+
// The smallest window of the cell's ratio holding the whole picture.
|
|
68
|
+
if (C >= A) {
|
|
69
|
+
wh = 1;
|
|
70
|
+
ww = C / A;
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
ww = 1;
|
|
74
|
+
wh = A / C;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
if (C >= A) {
|
|
79
|
+
ww = 1;
|
|
80
|
+
wh = A / C;
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
wh = 1;
|
|
84
|
+
ww = C / A;
|
|
85
|
+
}
|
|
86
|
+
if (area && (area.width > ww + 1e-9 || area.height > wh + 1e-9)) {
|
|
87
|
+
// The safe area does not fit a cover window: the smallest window of
|
|
88
|
+
// the cell's ratio that holds it.
|
|
89
|
+
fallback = true;
|
|
90
|
+
const sw = area.width;
|
|
91
|
+
const sh = area.height;
|
|
92
|
+
// In picture fractions, a window of ratio C: ww·A / wh = C.
|
|
93
|
+
if (sw * A / sh >= C) {
|
|
94
|
+
ww = sw;
|
|
95
|
+
wh = (sw * A) / C;
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
wh = sh;
|
|
99
|
+
ww = (sh * C) / A;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const place = (size, a, s, f) => {
|
|
104
|
+
if (size >= 1 - 1e-9)
|
|
105
|
+
return (1 - size) / 2; // the picture centred in a letterbox
|
|
106
|
+
if (f !== undefined)
|
|
107
|
+
return centred(f, size, a, s);
|
|
108
|
+
if (a !== undefined && s !== undefined)
|
|
109
|
+
return proportional(a, s, size);
|
|
110
|
+
return (1 - size) / 2;
|
|
111
|
+
};
|
|
112
|
+
const wx = place(ww, area?.x, area?.width, focus?.x);
|
|
113
|
+
const wy = place(wh, area?.y, area?.height, focus?.y);
|
|
114
|
+
const box = {
|
|
115
|
+
x: cell.x - (wx / ww) * cw,
|
|
116
|
+
y: cell.y - (wy / wh) * ch,
|
|
117
|
+
width: cw / ww,
|
|
118
|
+
height: ch / wh,
|
|
119
|
+
};
|
|
120
|
+
// The visible part, clamped to the picture, back in stored fractions.
|
|
121
|
+
const sx0 = Math.max(0, wx);
|
|
122
|
+
const sy0 = Math.max(0, wy);
|
|
123
|
+
const sx1 = Math.min(1, wx + ww);
|
|
124
|
+
const sy1 = Math.min(1, wy + wh);
|
|
125
|
+
let source = { x: sx0, y: sy0, width: sx1 - sx0, height: sy1 - sy0 };
|
|
126
|
+
if (input.mirrored)
|
|
127
|
+
source = { ...source, x: 1 - source.x - source.width };
|
|
128
|
+
const letterbox = ww > 1 + 1e-6 || wh > 1 + 1e-6;
|
|
129
|
+
return { source, box, letterbox, fallback };
|
|
130
|
+
}
|
|
131
|
+
/** Where a point of a panel's picture (`u`, `v`: fractions of the picture
|
|
132
|
+
* as stored) lands on the page; a mirrored picture flips `u`. Whether it
|
|
133
|
+
* shows is whether it lies inside the panel's polygon (`pointInPolygon`). */
|
|
134
|
+
export function comicArtPointToPage(art, u, v) {
|
|
135
|
+
const x = art.mirrored ? 1 - u : u;
|
|
136
|
+
return { x: art.box.x + x * art.box.width, y: art.box.y + v * art.box.height };
|
|
137
|
+
}
|
|
138
|
+
/** A rectangle of a panel's picture (fractions) on the page. */
|
|
139
|
+
export function comicArtRectToPage(art, r) {
|
|
140
|
+
const a = comicArtPointToPage(art, r.x, r.y);
|
|
141
|
+
const b = comicArtPointToPage(art, r.x + r.width, r.y + r.height);
|
|
142
|
+
return { x: Math.min(a.x, b.x), y: Math.min(a.y, b.y), width: Math.abs(b.x - a.x), height: Math.abs(b.y - a.y) };
|
|
143
|
+
}
|
|
144
|
+
/** The anchors of a picture that lie outside its safe area: a crop keeps
|
|
145
|
+
* the safe area and may cut them off. A picture without a safe area
|
|
146
|
+
* reports none (any crop may cut any point; the hint is about pictures
|
|
147
|
+
* whose safe area was drawn). */
|
|
148
|
+
export function anchorsOutsideSafeArea(anchors, safeArea) {
|
|
149
|
+
const area = normalizeSafeArea(safeArea);
|
|
150
|
+
if (!anchors || !area)
|
|
151
|
+
return [];
|
|
152
|
+
return anchors.filter((a) => a.x < area.x - 1e-9 || a.x > area.x + area.width + 1e-9 || a.y < area.y - 1e-9 || a.y > area.y + area.height + 1e-9);
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=art.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"art.js","sourceRoot":"","sources":["../../src/comics/art.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The faces a document's comic pages are lettered in (#559), for hosts
|
|
3
|
+
* that load fonts before a build: the lettering face, every balloon
|
|
4
|
+
* style's own face (the sound-effect face among them) and the cast's. The
|
|
5
|
+
* defaults follow the document language (`Comic Neue`, `Zen Antique` for
|
|
6
|
+
* Japanese, `Bangers` for sound effects…), so a book that never names them
|
|
7
|
+
* still needs them as soon as it has a `:::page`.
|
|
8
|
+
*/
|
|
9
|
+
import type { PostextConfig } from '../types';
|
|
10
|
+
/** Whether a Markdown text (or any of several, the chapters of a book)
|
|
11
|
+
* holds a comic page or strip. */
|
|
12
|
+
export declare function markdownHasComics(markdown: string | readonly string[] | undefined): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* The families the comic pages of a document letter with: none when the
|
|
15
|
+
* config has no `comics` section and no text given holds a comic block;
|
|
16
|
+
* else the lettering face, each balloon style's and each cast member's
|
|
17
|
+
* (defaults resolved for the document language), first seen first.
|
|
18
|
+
*/
|
|
19
|
+
export declare function comicFontFamilies(config: PostextConfig, markdown?: string | readonly string[]): string[];
|
|
20
|
+
//# sourceMappingURL=fonts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fonts.d.ts","sourceRoot":"","sources":["../../src/comics/fonts.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAO9C;mCACmC;AACnC,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,GAAG,OAAO,CAI3F;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CASxG"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The faces a document's comic pages are lettered in (#559), for hosts
|
|
3
|
+
* that load fonts before a build: the lettering face, every balloon
|
|
4
|
+
* style's own face (the sound-effect face among them) and the cast's. The
|
|
5
|
+
* defaults follow the document language (`Comic Neue`, `Zen Antique` for
|
|
6
|
+
* Japanese, `Bangers` for sound effects…), so a book that never names them
|
|
7
|
+
* still needs them as soon as it has a `:::page`.
|
|
8
|
+
*/
|
|
9
|
+
import { presentTag } from '../locale';
|
|
10
|
+
import { resolveComicsConfig } from '../defaults/comics';
|
|
11
|
+
/** A line that opens a comic block (`:::page`, `:::strip`). */
|
|
12
|
+
const COMIC_FENCE_LINE = /^[ \t]*:::(?:page|strip)(?=[\s{]|$)/m;
|
|
13
|
+
/** Whether a Markdown text (or any of several, the chapters of a book)
|
|
14
|
+
* holds a comic page or strip. */
|
|
15
|
+
export function markdownHasComics(markdown) {
|
|
16
|
+
if (markdown === undefined)
|
|
17
|
+
return false;
|
|
18
|
+
const texts = typeof markdown === 'string' ? [markdown] : markdown;
|
|
19
|
+
return texts.some((t) => COMIC_FENCE_LINE.test(t));
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* The families the comic pages of a document letter with: none when the
|
|
23
|
+
* config has no `comics` section and no text given holds a comic block;
|
|
24
|
+
* else the lettering face, each balloon style's and each cast member's
|
|
25
|
+
* (defaults resolved for the document language), first seen first.
|
|
26
|
+
*/
|
|
27
|
+
export function comicFontFamilies(config, markdown) {
|
|
28
|
+
if (!config.comics && !markdownHasComics(markdown))
|
|
29
|
+
return [];
|
|
30
|
+
const locale = presentTag(config.locale) ?? presentTag(config.bodyText?.hyphenation?.locale);
|
|
31
|
+
const comics = resolveComicsConfig(config.comics, locale);
|
|
32
|
+
const out = new Set();
|
|
33
|
+
out.add(comics.lettering.fontFamily);
|
|
34
|
+
for (const s of comics.balloonStyles)
|
|
35
|
+
if (s.fontFamily)
|
|
36
|
+
out.add(s.fontFamily);
|
|
37
|
+
for (const c of comics.cast)
|
|
38
|
+
if (c.fontFamily)
|
|
39
|
+
out.add(c.fontFamily);
|
|
40
|
+
return [...out];
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=fonts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fonts.js","sourceRoot":"","sources":["../../src/comics/fonts.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,+DAA+D;AAC/D,MAAM,gBAAgB,GAAG,sCAAsC,CAAC;AAEhE;mCACmC;AACnC,MAAM,UAAU,iBAAiB,CAAC,QAAgD;IAChF,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACzC,MAAM,KAAK,GAAG,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACnE,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACrD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAqB,EAAE,QAAqC;IAC5F,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IAC9D,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IAC7F,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACrC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,aAAa;QAAE,IAAI,CAAC,CAAC,UAAU;YAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAC9E,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI;QAAE,IAAI,CAAC,CAAC,UAAU;YAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The geometry of a comic page (#555): the frame cut into convex polygon
|
|
3
|
+
* cells by the lines of its split tree, gutters taken off, bleeding panels
|
|
4
|
+
* run out to the bleed box, and the split lines the Sandbox drags.
|
|
5
|
+
*
|
|
6
|
+
* Every line is placed against the bounding box of the cell its list
|
|
7
|
+
* splits, before gutters (a line at 30 % sits exactly at 30 %); each cell
|
|
8
|
+
* then loses half the gutter on every side it shares with another cell,
|
|
9
|
+
* measured across the line (a slanted line keeps its gutter width). Rows
|
|
10
|
+
* stack top to bottom; columns run from the start side, so a page read
|
|
11
|
+
* right to left (`'rtl'`) sets its first panel at the right, with the same
|
|
12
|
+
* source.
|
|
13
|
+
*/
|
|
14
|
+
import type { BoundingBox, VDTPoint } from '../vdt';
|
|
15
|
+
import { type ComicSplitAxis, type ComicSplitList } from './split';
|
|
16
|
+
/** A half-plane: the points where `nx·x + ny·y <= c`. */
|
|
17
|
+
export interface HalfPlane {
|
|
18
|
+
nx: number;
|
|
19
|
+
ny: number;
|
|
20
|
+
c: number;
|
|
21
|
+
}
|
|
22
|
+
/** A side of the frame (physical). */
|
|
23
|
+
export type ComicFrameSide = 'top' | 'bottom' | 'left' | 'right';
|
|
24
|
+
/** One leaf cell of the split, in reading order. */
|
|
25
|
+
export interface ComicCell {
|
|
26
|
+
/** The item path of the cell (indices walked down from the top list). */
|
|
27
|
+
path: number[];
|
|
28
|
+
/** The cell's outline, clockwise, gutters off, bleeding sides out. */
|
|
29
|
+
polygon: VDTPoint[];
|
|
30
|
+
bbox: BoundingBox;
|
|
31
|
+
/** An axis-aligned rectangle (round corners allowed). */
|
|
32
|
+
rect: boolean;
|
|
33
|
+
/** The frame sides the cell touches (before any bleed). */
|
|
34
|
+
touches: ComicFrameSide[];
|
|
35
|
+
/** The cell before gutters: the box its art anchors and a nested list's
|
|
36
|
+
* percentages are read against. */
|
|
37
|
+
raw: BoundingBox;
|
|
38
|
+
}
|
|
39
|
+
/** One split line, as the VDT carries it (without its source range). */
|
|
40
|
+
export interface ComicSplitLine {
|
|
41
|
+
path: number[];
|
|
42
|
+
boundary: number;
|
|
43
|
+
axis: ComicSplitAxis;
|
|
44
|
+
a: VDTPoint;
|
|
45
|
+
b: VDTPoint;
|
|
46
|
+
gutter: number;
|
|
47
|
+
parent: BoundingBox;
|
|
48
|
+
startPercent: number;
|
|
49
|
+
endPercent: number;
|
|
50
|
+
min: number;
|
|
51
|
+
max: number;
|
|
52
|
+
}
|
|
53
|
+
export interface ComicGeometryInput {
|
|
54
|
+
tree: ComicSplitList;
|
|
55
|
+
/** The box the panels are cut from (page px). */
|
|
56
|
+
frame: BoundingBox;
|
|
57
|
+
/** The box bleeding panels run out to (the trim, or the trim plus the
|
|
58
|
+
* bleed). */
|
|
59
|
+
bleedBox: BoundingBox;
|
|
60
|
+
direction: 'ltr' | 'rtl';
|
|
61
|
+
/** Gutter between tiers (rows) and between panels side by side
|
|
62
|
+
* (columns), px. */
|
|
63
|
+
gutter: {
|
|
64
|
+
rows: number;
|
|
65
|
+
columns: number;
|
|
66
|
+
};
|
|
67
|
+
/** The frame sides cell `index` (reading order) bleeds through when it
|
|
68
|
+
* touches them. */
|
|
69
|
+
bleed?: (index: number) => readonly ComicFrameSide[];
|
|
70
|
+
}
|
|
71
|
+
export interface ComicGeometry {
|
|
72
|
+
cells: ComicCell[];
|
|
73
|
+
lines: ComicSplitLine[];
|
|
74
|
+
}
|
|
75
|
+
/** Sutherland–Hodgman against one half-plane. */
|
|
76
|
+
export declare function clipPolygon(poly: readonly VDTPoint[], h: HalfPlane): VDTPoint[];
|
|
77
|
+
export declare function polygonBBox(poly: readonly VDTPoint[]): BoundingBox;
|
|
78
|
+
/** Whether `p` lies inside a convex polygon (on the edge counts). */
|
|
79
|
+
export declare function pointInPolygon(poly: readonly VDTPoint[], p: VDTPoint): boolean;
|
|
80
|
+
/** Physical side of a logical one on a page read in `direction`. */
|
|
81
|
+
export declare function physicalSide(side: string, direction: 'ltr' | 'rtl'): ComicFrameSide | undefined;
|
|
82
|
+
/**
|
|
83
|
+
* Cut the frame into the cells of a split tree, in reading order, and list
|
|
84
|
+
* its split lines.
|
|
85
|
+
*/
|
|
86
|
+
export declare function comicGeometry(input: ComicGeometryInput): ComicGeometry;
|
|
87
|
+
//# sourceMappingURL=geometry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../../src/comics/geometry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACpD,OAAO,EAAmB,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;AAEpF,yDAAyD;AACzD,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,EAAE,MAAM,CAAC;CACX;AAED,sCAAsC;AACtC,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAEjE,oDAAoD;AACpD,MAAM,WAAW,SAAS;IACxB,yEAAyE;IACzE,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,sEAAsE;IACtE,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,IAAI,EAAE,WAAW,CAAC;IAClB,yDAAyD;IACzD,IAAI,EAAE,OAAO,CAAC;IACd,2DAA2D;IAC3D,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B;wCACoC;IACpC,GAAG,EAAE,WAAW,CAAC;CAClB;AAED,wEAAwE;AACxE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,cAAc,CAAC;IACrB,CAAC,EAAE,QAAQ,CAAC;IACZ,CAAC,EAAE,QAAQ,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,WAAW,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,cAAc,CAAC;IACrB,iDAAiD;IACjD,KAAK,EAAE,WAAW,CAAC;IACnB;kBACc;IACd,QAAQ,EAAE,WAAW,CAAC;IACtB,SAAS,EAAE,KAAK,GAAG,KAAK,CAAC;IACzB;yBACqB;IACrB,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C;wBACoB;IACpB,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,SAAS,cAAc,EAAE,CAAC;CACtD;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAaD,iDAAiD;AACjD,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,QAAQ,EAAE,EAAE,CAAC,EAAE,SAAS,GAAG,QAAQ,EAAE,CAe/E;AAiBD,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,QAAQ,EAAE,GAAG,WAAW,CAalE;AASD,qEAAqE;AACrE,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,QAAQ,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAY9E;AAqFD,oEAAoE;AACpE,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,GAAG,KAAK,GAAG,cAAc,GAAG,SAAS,CAU/F;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,aAAa,CAwEtE"}
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The geometry of a comic page (#555): the frame cut into convex polygon
|
|
3
|
+
* cells by the lines of its split tree, gutters taken off, bleeding panels
|
|
4
|
+
* run out to the bleed box, and the split lines the Sandbox drags.
|
|
5
|
+
*
|
|
6
|
+
* Every line is placed against the bounding box of the cell its list
|
|
7
|
+
* splits, before gutters (a line at 30 % sits exactly at 30 %); each cell
|
|
8
|
+
* then loses half the gutter on every side it shares with another cell,
|
|
9
|
+
* measured across the line (a slanted line keeps its gutter width). Rows
|
|
10
|
+
* stack top to bottom; columns run from the start side, so a page read
|
|
11
|
+
* right to left (`'rtl'`) sets its first panel at the right, with the same
|
|
12
|
+
* source.
|
|
13
|
+
*/
|
|
14
|
+
import { comicSplitLines } from './split';
|
|
15
|
+
const EPS = 0.01;
|
|
16
|
+
function rectPolygon(r) {
|
|
17
|
+
return [
|
|
18
|
+
{ x: r.x, y: r.y },
|
|
19
|
+
{ x: r.x + r.width, y: r.y },
|
|
20
|
+
{ x: r.x + r.width, y: r.y + r.height },
|
|
21
|
+
{ x: r.x, y: r.y + r.height },
|
|
22
|
+
];
|
|
23
|
+
}
|
|
24
|
+
/** Sutherland–Hodgman against one half-plane. */
|
|
25
|
+
export function clipPolygon(poly, h) {
|
|
26
|
+
const out = [];
|
|
27
|
+
const f = (p) => h.nx * p.x + h.ny * p.y - h.c;
|
|
28
|
+
for (let i = 0; i < poly.length; i++) {
|
|
29
|
+
const p = poly[i];
|
|
30
|
+
const q = poly[(i + 1) % poly.length];
|
|
31
|
+
const fp = f(p);
|
|
32
|
+
const fq = f(q);
|
|
33
|
+
if (fp <= 1e-9)
|
|
34
|
+
out.push(p);
|
|
35
|
+
if ((fp < -1e-9 && fq > 1e-9) || (fp > 1e-9 && fq < -1e-9)) {
|
|
36
|
+
const t = fp / (fp - fq);
|
|
37
|
+
out.push({ x: p.x + t * (q.x - p.x), y: p.y + t * (q.y - p.y) });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return dedupe(out);
|
|
41
|
+
}
|
|
42
|
+
function dedupe(poly) {
|
|
43
|
+
const out = [];
|
|
44
|
+
for (const p of poly) {
|
|
45
|
+
const last = out[out.length - 1];
|
|
46
|
+
if (last && Math.abs(last.x - p.x) < 1e-6 && Math.abs(last.y - p.y) < 1e-6)
|
|
47
|
+
continue;
|
|
48
|
+
out.push(p);
|
|
49
|
+
}
|
|
50
|
+
if (out.length > 1) {
|
|
51
|
+
const first = out[0];
|
|
52
|
+
const last = out[out.length - 1];
|
|
53
|
+
if (Math.abs(last.x - first.x) < 1e-6 && Math.abs(last.y - first.y) < 1e-6)
|
|
54
|
+
out.pop();
|
|
55
|
+
}
|
|
56
|
+
return out;
|
|
57
|
+
}
|
|
58
|
+
export function polygonBBox(poly) {
|
|
59
|
+
if (poly.length === 0)
|
|
60
|
+
return { x: 0, y: 0, width: 0, height: 0 };
|
|
61
|
+
let x0 = Infinity;
|
|
62
|
+
let y0 = Infinity;
|
|
63
|
+
let x1 = -Infinity;
|
|
64
|
+
let y1 = -Infinity;
|
|
65
|
+
for (const p of poly) {
|
|
66
|
+
x0 = Math.min(x0, p.x);
|
|
67
|
+
y0 = Math.min(y0, p.y);
|
|
68
|
+
x1 = Math.max(x1, p.x);
|
|
69
|
+
y1 = Math.max(y1, p.y);
|
|
70
|
+
}
|
|
71
|
+
return { x: x0, y: y0, width: x1 - x0, height: y1 - y0 };
|
|
72
|
+
}
|
|
73
|
+
/** Whether a polygon is an axis-aligned rectangle. */
|
|
74
|
+
function isRect(poly) {
|
|
75
|
+
if (poly.length !== 4)
|
|
76
|
+
return false;
|
|
77
|
+
const b = polygonBBox(poly);
|
|
78
|
+
return poly.every((p) => (Math.abs(p.x - b.x) < EPS || Math.abs(p.x - b.x - b.width) < EPS) && (Math.abs(p.y - b.y) < EPS || Math.abs(p.y - b.y - b.height) < EPS));
|
|
79
|
+
}
|
|
80
|
+
/** Whether `p` lies inside a convex polygon (on the edge counts). */
|
|
81
|
+
export function pointInPolygon(poly, p) {
|
|
82
|
+
let sign = 0;
|
|
83
|
+
for (let i = 0; i < poly.length; i++) {
|
|
84
|
+
const a = poly[i];
|
|
85
|
+
const b = poly[(i + 1) % poly.length];
|
|
86
|
+
const cross = (b.x - a.x) * (p.y - a.y) - (b.y - a.y) * (p.x - a.x);
|
|
87
|
+
if (Math.abs(cross) < 1e-9)
|
|
88
|
+
continue;
|
|
89
|
+
const s = Math.sign(cross);
|
|
90
|
+
if (sign === 0)
|
|
91
|
+
sign = s;
|
|
92
|
+
else if (s !== sign)
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
/** A split line of a list over the box `parent`: its start-end and far-end
|
|
98
|
+
* points (where it meets the box) and its unit normal, pointing from the
|
|
99
|
+
* cell before the line to the cell after it. */
|
|
100
|
+
function lineOver(axis, parent, direction, startPercent, endPercent) {
|
|
101
|
+
let s;
|
|
102
|
+
let e;
|
|
103
|
+
let after;
|
|
104
|
+
if (axis === 'rows') {
|
|
105
|
+
// Across the page, from the start side to the other.
|
|
106
|
+
const sx = direction === 'ltr' ? parent.x : parent.x + parent.width;
|
|
107
|
+
const ex = direction === 'ltr' ? parent.x + parent.width : parent.x;
|
|
108
|
+
s = { x: sx, y: parent.y + (startPercent / 100) * parent.height };
|
|
109
|
+
e = { x: ex, y: parent.y + (endPercent / 100) * parent.height };
|
|
110
|
+
after = { x: 0, y: 1 };
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
// Down the page, measured from the start side.
|
|
114
|
+
const at = (p) => (direction === 'ltr' ? parent.x + (p / 100) * parent.width : parent.x + parent.width - (p / 100) * parent.width);
|
|
115
|
+
s = { x: at(startPercent), y: parent.y };
|
|
116
|
+
e = { x: at(endPercent), y: parent.y + parent.height };
|
|
117
|
+
after = { x: direction === 'ltr' ? 1 : -1, y: 0 };
|
|
118
|
+
}
|
|
119
|
+
const dx = e.x - s.x;
|
|
120
|
+
const dy = e.y - s.y;
|
|
121
|
+
const len = Math.hypot(dx, dy) || 1;
|
|
122
|
+
let n = { x: -dy / len, y: dx / len };
|
|
123
|
+
if (n.x * after.x + n.y * after.y < 0)
|
|
124
|
+
n = { x: -n.x, y: -n.y };
|
|
125
|
+
return { s, e, n };
|
|
126
|
+
}
|
|
127
|
+
/** The half-planes of the cell before (`side: -1`) or after (`+1`) a line,
|
|
128
|
+
* kept `inset` px away from it. */
|
|
129
|
+
function sideOf(line, side, inset) {
|
|
130
|
+
const d = line.n.x * line.s.x + line.n.y * line.s.y;
|
|
131
|
+
// Before: n·p <= d − inset; after: n·p >= d + inset, i.e. −n·p <= −d − inset.
|
|
132
|
+
return side < 0
|
|
133
|
+
? { nx: line.n.x, ny: line.n.y, c: d - inset }
|
|
134
|
+
: { nx: -line.n.x, ny: -line.n.y, c: -d - inset };
|
|
135
|
+
}
|
|
136
|
+
/** The part of segment `s`–`e` inside a convex polygon. */
|
|
137
|
+
function clipSegment(poly, s, e) {
|
|
138
|
+
let t0 = 0;
|
|
139
|
+
let t1 = 1;
|
|
140
|
+
// Orientation of the polygon (sign of its area).
|
|
141
|
+
let area = 0;
|
|
142
|
+
for (let i = 0; i < poly.length; i++) {
|
|
143
|
+
const a = poly[i];
|
|
144
|
+
const b = poly[(i + 1) % poly.length];
|
|
145
|
+
area += a.x * b.y - b.x * a.y;
|
|
146
|
+
}
|
|
147
|
+
const orient = area >= 0 ? 1 : -1;
|
|
148
|
+
for (let i = 0; i < poly.length; i++) {
|
|
149
|
+
const a = poly[i];
|
|
150
|
+
const b = poly[(i + 1) % poly.length];
|
|
151
|
+
// Inside: orient * cross(b − a, p − a) >= 0.
|
|
152
|
+
const g = (p) => orient * ((b.x - a.x) * (p.y - a.y) - (b.y - a.y) * (p.x - a.x));
|
|
153
|
+
const gs = g(s);
|
|
154
|
+
const ge = g(e);
|
|
155
|
+
if (gs < 0 && ge < 0)
|
|
156
|
+
return [s, s];
|
|
157
|
+
if (gs < 0)
|
|
158
|
+
t0 = Math.max(t0, gs / (gs - ge));
|
|
159
|
+
else if (ge < 0)
|
|
160
|
+
t1 = Math.min(t1, gs / (gs - ge));
|
|
161
|
+
}
|
|
162
|
+
const at = (t) => ({ x: s.x + t * (e.x - s.x), y: s.y + t * (e.y - s.y) });
|
|
163
|
+
return [at(t0), at(Math.max(t0, t1))];
|
|
164
|
+
}
|
|
165
|
+
/** Which frame sides a polygon has an edge on. */
|
|
166
|
+
function touchedSides(poly, frame) {
|
|
167
|
+
const on = (pred) => poly.filter(pred).length >= 2;
|
|
168
|
+
const out = [];
|
|
169
|
+
if (on((p) => Math.abs(p.y - frame.y) < EPS))
|
|
170
|
+
out.push('top');
|
|
171
|
+
if (on((p) => Math.abs(p.y - frame.y - frame.height) < EPS))
|
|
172
|
+
out.push('bottom');
|
|
173
|
+
if (on((p) => Math.abs(p.x - frame.x) < EPS))
|
|
174
|
+
out.push('left');
|
|
175
|
+
if (on((p) => Math.abs(p.x - frame.x - frame.width) < EPS))
|
|
176
|
+
out.push('right');
|
|
177
|
+
return out;
|
|
178
|
+
}
|
|
179
|
+
/** Physical side of a logical one on a page read in `direction`. */
|
|
180
|
+
export function physicalSide(side, direction) {
|
|
181
|
+
switch (side) {
|
|
182
|
+
case 'top': return 'top';
|
|
183
|
+
case 'bottom': return 'bottom';
|
|
184
|
+
case 'start': return direction === 'ltr' ? 'left' : 'right';
|
|
185
|
+
case 'end': return direction === 'ltr' ? 'right' : 'left';
|
|
186
|
+
case 'left': return 'left';
|
|
187
|
+
case 'right': return 'right';
|
|
188
|
+
default: return undefined;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Cut the frame into the cells of a split tree, in reading order, and list
|
|
193
|
+
* its split lines.
|
|
194
|
+
*/
|
|
195
|
+
export function comicGeometry(input) {
|
|
196
|
+
const { frame, direction, gutter, bleedBox } = input;
|
|
197
|
+
const leaves = [];
|
|
198
|
+
const lines = [];
|
|
199
|
+
const walk = (list, raw, planes, path, parentAxis) => {
|
|
200
|
+
const n = list.items.length;
|
|
201
|
+
if (n === 0)
|
|
202
|
+
return;
|
|
203
|
+
const axis = list.axis ?? (parentAxis === 'rows' ? 'columns' : 'rows');
|
|
204
|
+
const box = polygonBBox(raw);
|
|
205
|
+
const pos = comicSplitLines(list);
|
|
206
|
+
const g = axis === 'rows' ? gutter.rows : gutter.columns;
|
|
207
|
+
const lineAt = (b) => lineOver(axis, box, direction, pos.start[b], pos.end[b]);
|
|
208
|
+
const geo = Array.from({ length: n - 1 }, (_, b) => lineAt(b));
|
|
209
|
+
for (let b = 0; b < n - 1; b++) {
|
|
210
|
+
const l = geo[b];
|
|
211
|
+
const [a, e] = clipSegment(raw, l.s, l.e);
|
|
212
|
+
const prevS = b > 0 ? pos.start[b - 1] : 0;
|
|
213
|
+
const prevE = b > 0 ? pos.end[b - 1] : 0;
|
|
214
|
+
const nextS = b < n - 2 ? pos.start[b + 1] : 100;
|
|
215
|
+
const nextE = b < n - 2 ? pos.end[b + 1] : 100;
|
|
216
|
+
const s = pos.start[b];
|
|
217
|
+
const en = pos.end[b];
|
|
218
|
+
lines.push({
|
|
219
|
+
path,
|
|
220
|
+
boundary: b,
|
|
221
|
+
axis,
|
|
222
|
+
a,
|
|
223
|
+
b: e,
|
|
224
|
+
gutter: g,
|
|
225
|
+
parent: box,
|
|
226
|
+
startPercent: s,
|
|
227
|
+
endPercent: en,
|
|
228
|
+
min: Math.min(s, s + Math.max(prevS + 5 - s, prevE + 5 - en)),
|
|
229
|
+
max: Math.max(s, s + Math.min(nextS - 5 - s, nextE - 5 - en)),
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
for (let i = 0; i < n; i++) {
|
|
233
|
+
let childRaw = raw;
|
|
234
|
+
const childPlanes = [...planes];
|
|
235
|
+
if (i > 0) {
|
|
236
|
+
childRaw = clipPolygon(childRaw, sideOf(geo[i - 1], 1, 0));
|
|
237
|
+
childPlanes.push(sideOf(geo[i - 1], 1, g / 2));
|
|
238
|
+
}
|
|
239
|
+
if (i < n - 1) {
|
|
240
|
+
childRaw = clipPolygon(childRaw, sideOf(geo[i], -1, 0));
|
|
241
|
+
childPlanes.push(sideOf(geo[i], -1, g / 2));
|
|
242
|
+
}
|
|
243
|
+
const item = list.items[i];
|
|
244
|
+
const childPath = [...path, i];
|
|
245
|
+
if (item.children && item.children.items.length > 0)
|
|
246
|
+
walk(item.children, childRaw, childPlanes, childPath, axis);
|
|
247
|
+
else
|
|
248
|
+
leaves.push({ path: childPath, planes: childPlanes, raw: childRaw });
|
|
249
|
+
}
|
|
250
|
+
};
|
|
251
|
+
walk(input.tree, rectPolygon(frame), [], [], undefined);
|
|
252
|
+
const cells = leaves.map((leaf, index) => {
|
|
253
|
+
let poly = rectPolygon(frame);
|
|
254
|
+
for (const h of leaf.planes)
|
|
255
|
+
poly = clipPolygon(poly, h);
|
|
256
|
+
const touches = touchedSides(poly, frame);
|
|
257
|
+
const bleeds = new Set(input.bleed?.(index) ?? []);
|
|
258
|
+
const out = touches.filter((s) => bleeds.has(s));
|
|
259
|
+
if (out.length > 0) {
|
|
260
|
+
const top = out.includes('top') ? bleedBox.y : frame.y;
|
|
261
|
+
const bottom = out.includes('bottom') ? bleedBox.y + bleedBox.height : frame.y + frame.height;
|
|
262
|
+
const left = out.includes('left') ? bleedBox.x : frame.x;
|
|
263
|
+
const right = out.includes('right') ? bleedBox.x + bleedBox.width : frame.x + frame.width;
|
|
264
|
+
poly = rectPolygon({ x: left, y: top, width: right - left, height: bottom - top });
|
|
265
|
+
for (const h of leaf.planes)
|
|
266
|
+
poly = clipPolygon(poly, h);
|
|
267
|
+
}
|
|
268
|
+
return { path: leaf.path, polygon: poly, bbox: polygonBBox(poly), rect: isRect(poly), touches, raw: polygonBBox(leaf.raw) };
|
|
269
|
+
});
|
|
270
|
+
return { cells, lines };
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=geometry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometry.js","sourceRoot":"","sources":["../../src/comics/geometry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,eAAe,EAA4C,MAAM,SAAS,CAAC;AAgEpF,MAAM,GAAG,GAAG,IAAI,CAAC;AAEjB,SAAS,WAAW,CAAC,CAAc;IACjC,OAAO;QACL,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;QAClB,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;QAC5B,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE;QACvC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE;KAC9B,CAAC;AACJ,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,WAAW,CAAC,IAAyB,EAAE,CAAY;IACjE,MAAM,GAAG,GAAe,EAAE,CAAC;IAC3B,MAAM,CAAC,GAAG,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACnB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAE,CAAC;QACvC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAChB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAChB,IAAI,EAAE,IAAI,IAAI;YAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3D,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;YACzB,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AAED,SAAS,MAAM,CAAC,IAAgB;IAC9B,MAAM,GAAG,GAAe,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjC,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;YAAE,SAAS;QACrF,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACd,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC;QACtB,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;QAClC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI;YAAE,GAAG,CAAC,GAAG,EAAE,CAAC;IACxF,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAyB;IACnD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAClE,IAAI,EAAE,GAAG,QAAQ,CAAC;IAClB,IAAI,EAAE,GAAG,QAAQ,CAAC;IAClB,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC;IACnB,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC;IACnB,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACvB,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACvB,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACvB,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC;AAC3D,CAAC;AAED,sDAAsD;AACtD,SAAS,MAAM,CAAC,IAAyB;IACvC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACpC,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AACtK,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,cAAc,CAAC,IAAyB,EAAE,CAAW;IACnE,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACnB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAE,CAAC;QACvC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI;YAAE,SAAS;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAI,IAAI,KAAK,CAAC;YAAE,IAAI,GAAG,CAAC,CAAC;aACpB,IAAI,CAAC,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;IACpC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;iDAEiD;AACjD,SAAS,QAAQ,CACf,IAAoB,EACpB,MAAmB,EACnB,SAAwB,EACxB,YAAoB,EACpB,UAAkB;IAElB,IAAI,CAAW,CAAC;IAChB,IAAI,CAAW,CAAC;IAChB,IAAI,KAAe,CAAC;IACpB,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,qDAAqD;QACrD,MAAM,EAAE,GAAG,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QACpE,MAAM,EAAE,GAAG,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACpE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,YAAY,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QAClE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QAChE,KAAK,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACzB,CAAC;SAAM,CAAC;QACN,+CAA+C;QAC/C,MAAM,EAAE,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3I,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;QACzC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QACvD,KAAK,GAAG,EAAE,CAAC,EAAE,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACpD,CAAC;IACD,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACrB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACrB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,CAAC;IACtC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC;QAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACrB,CAAC;AAED;oCACoC;AACpC,SAAS,MAAM,CAAC,IAAkC,EAAE,IAAY,EAAE,KAAa;IAC7E,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,8EAA8E;IAC9E,OAAO,IAAI,GAAG,CAAC;QACb,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE;QAC9C,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC;AACtD,CAAC;AAED,2DAA2D;AAC3D,SAAS,WAAW,CAAC,IAAyB,EAAE,CAAW,EAAE,CAAW;IACtE,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,iDAAiD;IACjD,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACnB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAE,CAAC;QACvC,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACnB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAE,CAAC;QACvC,6CAA6C;QAC7C,MAAM,CAAC,GAAG,CAAC,CAAW,EAAE,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5F,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAChB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAChB,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC;YAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpC,IAAI,EAAE,GAAG,CAAC;YAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;aACzC,IAAI,EAAE,GAAG,CAAC;YAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IACrD,CAAC;IACD,MAAM,EAAE,GAAG,CAAC,CAAS,EAAY,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC7F,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,kDAAkD;AAClD,SAAS,YAAY,CAAC,IAAyB,EAAE,KAAkB;IACjE,MAAM,EAAE,GAAG,CAAC,IAA8B,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;IAC7E,MAAM,GAAG,GAAqB,EAAE,CAAC;IACjC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9D,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;QAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChF,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/D,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;QAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9E,OAAO,GAAG,CAAC;AACb,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,SAAwB;IACjE,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC;QACzB,KAAK,QAAQ,CAAC,CAAC,OAAO,QAAQ,CAAC;QAC/B,KAAK,OAAO,CAAC,CAAC,OAAO,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;QAC5D,KAAK,KAAK,CAAC,CAAC,OAAO,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QAC1D,KAAK,MAAM,CAAC,CAAC,OAAO,MAAM,CAAC;QAC3B,KAAK,OAAO,CAAC,CAAC,OAAO,OAAO,CAAC;QAC7B,OAAO,CAAC,CAAC,OAAO,SAAS,CAAC;IAC5B,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAAyB;IACrD,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IACrD,MAAM,MAAM,GAA+D,EAAE,CAAC;IAC9E,MAAM,KAAK,GAAqB,EAAE,CAAC;IACnC,MAAM,IAAI,GAAG,CAAC,IAAoB,EAAE,GAAe,EAAE,MAAmB,EAAE,IAAc,EAAE,UAAsC,EAAQ,EAAE;QACxI,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO;QACpB,MAAM,IAAI,GAAmB,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACvF,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;QACzD,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,CAAC;QACzF,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC;YAClB,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC,GAAG,CAAC;YAClD,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC,GAAG,CAAC;YAChD,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC;YACxB,MAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI;gBACJ,QAAQ,EAAE,CAAC;gBACX,IAAI;gBACJ,CAAC;gBACD,CAAC,EAAE,CAAC;gBACJ,MAAM,EAAE,CAAC;gBACT,MAAM,EAAE,GAAG;gBACX,YAAY,EAAE,CAAC;gBACf,UAAU,EAAE,EAAE;gBACd,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;gBAC7D,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;aAC9D,CAAC,CAAC;QACL,CAAC;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,IAAI,QAAQ,GAAG,GAAG,CAAC;YACnB,MAAM,WAAW,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;YAChC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACV,QAAQ,GAAG,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC5D,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAClD,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACd,QAAQ,GAAG,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBACzD,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC/C,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;YAC/B,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;;gBAC5G,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;IAExD,MAAM,KAAK,GAAgB,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACpD,IAAI,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QAC9B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM;YAAE,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACnD,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnB,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YACvD,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;YAC9F,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YACzD,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;YAC1F,IAAI,GAAG,WAAW,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC;YACnF,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM;gBAAE,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IAC9H,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC1B,CAAC"}
|