postext 1.25.5 → 1.26.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.
Files changed (218) hide show
  1. package/dist/__tests__/cjk/headingNumberMark.test.d.ts +2 -0
  2. package/dist/__tests__/cjk/headingNumberMark.test.d.ts.map +1 -0
  3. package/dist/__tests__/cjk/headingNumberMark.test.js +108 -0
  4. package/dist/__tests__/cjk/headingNumberMark.test.js.map +1 -0
  5. package/dist/__tests__/cjk/japaneseDash.test.d.ts +2 -0
  6. package/dist/__tests__/cjk/japaneseDash.test.d.ts.map +1 -0
  7. package/dist/__tests__/cjk/japaneseDash.test.js +250 -0
  8. package/dist/__tests__/cjk/japaneseDash.test.js.map +1 -0
  9. package/dist/__tests__/cjk/japaneseSpacing.test.js +1 -1
  10. package/dist/__tests__/cjk/punctuation.test.js +5 -3
  11. package/dist/__tests__/cjk/punctuation.test.js.map +1 -1
  12. package/dist/__tests__/columnRuleBands.test.js +47 -0
  13. package/dist/__tests__/columnRuleBands.test.js.map +1 -1
  14. package/dist/__tests__/comics/canvas.test.js +38 -1
  15. package/dist/__tests__/comics/canvas.test.js.map +1 -1
  16. package/dist/__tests__/comics/html.test.js +16 -3
  17. package/dist/__tests__/comics/html.test.js.map +1 -1
  18. package/dist/__tests__/design/cjkDesignDash.test.js +7 -4
  19. package/dist/__tests__/design/cjkDesignDash.test.js.map +1 -1
  20. package/dist/__tests__/englishApostropheHyphenation.test.d.ts +2 -0
  21. package/dist/__tests__/englishApostropheHyphenation.test.d.ts.map +1 -0
  22. package/dist/__tests__/englishApostropheHyphenation.test.js +47 -0
  23. package/dist/__tests__/englishApostropheHyphenation.test.js.map +1 -0
  24. package/dist/__tests__/exports.test.js +1 -0
  25. package/dist/__tests__/exports.test.js.map +1 -1
  26. package/dist/__tests__/leaderMinRepeats.test.d.ts +2 -0
  27. package/dist/__tests__/leaderMinRepeats.test.d.ts.map +1 -0
  28. package/dist/__tests__/leaderMinRepeats.test.js +109 -0
  29. package/dist/__tests__/leaderMinRepeats.test.js.map +1 -0
  30. package/dist/__tests__/pipeline/footnoteRuntTracking.test.d.ts +2 -0
  31. package/dist/__tests__/pipeline/footnoteRuntTracking.test.d.ts.map +1 -0
  32. package/dist/__tests__/pipeline/footnoteRuntTracking.test.js +90 -0
  33. package/dist/__tests__/pipeline/footnoteRuntTracking.test.js.map +1 -0
  34. package/dist/__tests__/pipeline/orderedNumberAlign.test.d.ts +2 -0
  35. package/dist/__tests__/pipeline/orderedNumberAlign.test.d.ts.map +1 -0
  36. package/dist/__tests__/pipeline/orderedNumberAlign.test.js +108 -0
  37. package/dist/__tests__/pipeline/orderedNumberAlign.test.js.map +1 -0
  38. package/dist/__tests__/pipeline/trailingCapColumnNote.test.d.ts +2 -0
  39. package/dist/__tests__/pipeline/trailingCapColumnNote.test.d.ts.map +1 -0
  40. package/dist/__tests__/pipeline/trailingCapColumnNote.test.js +63 -0
  41. package/dist/__tests__/pipeline/trailingCapColumnNote.test.js.map +1 -0
  42. package/dist/__tests__/pipeline/trailingCapFloatHead.test.d.ts +2 -0
  43. package/dist/__tests__/pipeline/trailingCapFloatHead.test.d.ts.map +1 -0
  44. package/dist/__tests__/pipeline/trailingCapFloatHead.test.js +91 -0
  45. package/dist/__tests__/pipeline/trailingCapFloatHead.test.js.map +1 -0
  46. package/dist/__tests__/rtl/arabicLeadingNumbers.test.d.ts +2 -0
  47. package/dist/__tests__/rtl/arabicLeadingNumbers.test.d.ts.map +1 -0
  48. package/dist/__tests__/rtl/arabicLeadingNumbers.test.js +186 -0
  49. package/dist/__tests__/rtl/arabicLeadingNumbers.test.js.map +1 -0
  50. package/dist/__tests__/rtl/listMarkerDirection.test.d.ts +2 -0
  51. package/dist/__tests__/rtl/listMarkerDirection.test.d.ts.map +1 -0
  52. package/dist/__tests__/rtl/listMarkerDirection.test.js +197 -0
  53. package/dist/__tests__/rtl/listMarkerDirection.test.js.map +1 -0
  54. package/dist/__tests__/trackedLigatures.test.d.ts +2 -0
  55. package/dist/__tests__/trackedLigatures.test.d.ts.map +1 -0
  56. package/dist/__tests__/trackedLigatures.test.js +587 -0
  57. package/dist/__tests__/trackedLigatures.test.js.map +1 -0
  58. package/dist/__tests__/vectorRasterScale.test.d.ts +2 -0
  59. package/dist/__tests__/vectorRasterScale.test.d.ts.map +1 -0
  60. package/dist/__tests__/vectorRasterScale.test.js +304 -0
  61. package/dist/__tests__/vectorRasterScale.test.js.map +1 -0
  62. package/dist/bidi.d.ts +43 -3
  63. package/dist/bidi.d.ts.map +1 -1
  64. package/dist/bidi.js +29 -7
  65. package/dist/bidi.js.map +1 -1
  66. package/dist/canvas-backend/blockRender.d.ts.map +1 -1
  67. package/dist/canvas-backend/blockRender.js +43 -5
  68. package/dist/canvas-backend/blockRender.js.map +1 -1
  69. package/dist/canvas-backend/comic.d.ts +8 -4
  70. package/dist/canvas-backend/comic.d.ts.map +1 -1
  71. package/dist/canvas-backend/comic.js +13 -6
  72. package/dist/canvas-backend/comic.js.map +1 -1
  73. package/dist/canvas-backend/deviceScale.d.ts +31 -0
  74. package/dist/canvas-backend/deviceScale.d.ts.map +1 -0
  75. package/dist/canvas-backend/deviceScale.js +45 -0
  76. package/dist/canvas-backend/deviceScale.js.map +1 -0
  77. package/dist/canvas-backend/index.d.ts +5 -1
  78. package/dist/canvas-backend/index.d.ts.map +1 -1
  79. package/dist/canvas-backend/index.js.map +1 -1
  80. package/dist/canvas-backend/mirrorFrame.d.ts +14 -1
  81. package/dist/canvas-backend/mirrorFrame.d.ts.map +1 -1
  82. package/dist/canvas-backend/mirrorFrame.js +51 -7
  83. package/dist/canvas-backend/mirrorFrame.js.map +1 -1
  84. package/dist/canvas-backend/renderResourceBlock.d.ts +5 -3
  85. package/dist/canvas-backend/renderResourceBlock.d.ts.map +1 -1
  86. package/dist/canvas-backend/renderResourceBlock.js +39 -6
  87. package/dist/canvas-backend/renderResourceBlock.js.map +1 -1
  88. package/dist/canvas-backend/trackedText.d.ts +72 -0
  89. package/dist/canvas-backend/trackedText.d.ts.map +1 -0
  90. package/dist/canvas-backend/trackedText.js +166 -0
  91. package/dist/canvas-backend/trackedText.js.map +1 -0
  92. package/dist/canvas-backend/wordRuns.d.ts +6 -0
  93. package/dist/canvas-backend/wordRuns.d.ts.map +1 -1
  94. package/dist/canvas-backend/wordRuns.js +11 -1
  95. package/dist/canvas-backend/wordRuns.js.map +1 -1
  96. package/dist/columnRule.d.ts +2 -1
  97. package/dist/columnRule.d.ts.map +1 -1
  98. package/dist/columnRule.js +11 -3
  99. package/dist/columnRule.js.map +1 -1
  100. package/dist/comics/layoutPage.d.ts.map +1 -1
  101. package/dist/comics/layoutPage.js +54 -2
  102. package/dist/comics/layoutPage.js.map +1 -1
  103. package/dist/comics/lettering/__tests__/ellipsisFace.test.d.ts +2 -0
  104. package/dist/comics/lettering/__tests__/ellipsisFace.test.d.ts.map +1 -0
  105. package/dist/comics/lettering/__tests__/ellipsisFace.test.js +54 -0
  106. package/dist/comics/lettering/__tests__/ellipsisFace.test.js.map +1 -0
  107. package/dist/comics/lettering/__tests__/polish.test.js +8 -0
  108. package/dist/comics/lettering/__tests__/polish.test.js.map +1 -1
  109. package/dist/comics/lettering/__tests__/round4.test.d.ts +2 -0
  110. package/dist/comics/lettering/__tests__/round4.test.d.ts.map +1 -0
  111. package/dist/comics/lettering/__tests__/round4.test.js +212 -0
  112. package/dist/comics/lettering/__tests__/round4.test.js.map +1 -0
  113. package/dist/comics/lettering/letter.js +2 -2
  114. package/dist/comics/lettering/letter.js.map +1 -1
  115. package/dist/comics/lettering/placement.d.ts +10 -3
  116. package/dist/comics/lettering/placement.d.ts.map +1 -1
  117. package/dist/comics/lettering/placement.js +162 -22
  118. package/dist/comics/lettering/placement.js.map +1 -1
  119. package/dist/comics/lettering/text.d.ts.map +1 -1
  120. package/dist/comics/lettering/text.js +25 -3
  121. package/dist/comics/lettering/text.js.map +1 -1
  122. package/dist/comics/lettering/types.d.ts +29 -2
  123. package/dist/comics/lettering/types.d.ts.map +1 -1
  124. package/dist/defaults/orderedLists.d.ts +1 -0
  125. package/dist/defaults/orderedLists.d.ts.map +1 -1
  126. package/dist/defaults/orderedLists.js +7 -0
  127. package/dist/defaults/orderedLists.js.map +1 -1
  128. package/dist/design/bidiText.d.ts +5 -2
  129. package/dist/design/bidiText.d.ts.map +1 -1
  130. package/dist/design/bidiText.js +7 -4
  131. package/dist/design/bidiText.js.map +1 -1
  132. package/dist/design/layout.d.ts +5 -0
  133. package/dist/design/layout.d.ts.map +1 -1
  134. package/dist/design/layout.js +1 -1
  135. package/dist/design/layout.js.map +1 -1
  136. package/dist/html-backend.d.ts.map +1 -1
  137. package/dist/html-backend.js +32 -6
  138. package/dist/html-backend.js.map +1 -1
  139. package/dist/htmlComic.d.ts +2 -1
  140. package/dist/htmlComic.d.ts.map +1 -1
  141. package/dist/htmlComic.js +14 -1
  142. package/dist/htmlComic.js.map +1 -1
  143. package/dist/hyphenate.d.ts.map +1 -1
  144. package/dist/hyphenate.js +52 -0
  145. package/dist/hyphenate.js.map +1 -1
  146. package/dist/index.d.ts +3 -3
  147. package/dist/index.d.ts.map +1 -1
  148. package/dist/index.js +1 -1
  149. package/dist/index.js.map +1 -1
  150. package/dist/math/rasterCache.d.ts +7 -1
  151. package/dist/math/rasterCache.d.ts.map +1 -1
  152. package/dist/math/rasterCache.js +23 -11
  153. package/dist/math/rasterCache.js.map +1 -1
  154. package/dist/measure/bidiLines.d.ts +8 -0
  155. package/dist/measure/bidiLines.d.ts.map +1 -1
  156. package/dist/measure/bidiLines.js +13 -0
  157. package/dist/measure/bidiLines.js.map +1 -1
  158. package/dist/measure/cache.d.ts.map +1 -1
  159. package/dist/measure/cache.js +5 -3
  160. package/dist/measure/cache.js.map +1 -1
  161. package/dist/measure/cjkCompose.d.ts +10 -0
  162. package/dist/measure/cjkCompose.d.ts.map +1 -1
  163. package/dist/measure/cjkCompose.js +95 -19
  164. package/dist/measure/cjkCompose.js.map +1 -1
  165. package/dist/measure/cjkPunctuation.d.ts +10 -0
  166. package/dist/measure/cjkPunctuation.d.ts.map +1 -1
  167. package/dist/measure/cjkPunctuation.js +18 -1
  168. package/dist/measure/cjkPunctuation.js.map +1 -1
  169. package/dist/measure/hardBreaks.d.ts.map +1 -1
  170. package/dist/measure/hardBreaks.js +4 -1
  171. package/dist/measure/hardBreaks.js.map +1 -1
  172. package/dist/measure/leader.d.ts +6 -1
  173. package/dist/measure/leader.d.ts.map +1 -1
  174. package/dist/measure/leader.js +8 -3
  175. package/dist/measure/leader.js.map +1 -1
  176. package/dist/measure/plain.d.ts.map +1 -1
  177. package/dist/measure/plain.js +4 -2
  178. package/dist/measure/plain.js.map +1 -1
  179. package/dist/measure/rich.d.ts.map +1 -1
  180. package/dist/measure/rich.js +7 -4
  181. package/dist/measure/rich.js.map +1 -1
  182. package/dist/measure/types.d.ts +7 -0
  183. package/dist/measure/types.d.ts.map +1 -1
  184. package/dist/measure/types.js.map +1 -1
  185. package/dist/pipeline/build.d.ts.map +1 -1
  186. package/dist/pipeline/build.js +38 -5
  187. package/dist/pipeline/build.js.map +1 -1
  188. package/dist/pipeline/buildBlockKind.d.ts +5 -0
  189. package/dist/pipeline/buildBlockKind.d.ts.map +1 -1
  190. package/dist/pipeline/buildBlockKind.js +1 -0
  191. package/dist/pipeline/buildBlockKind.js.map +1 -1
  192. package/dist/pipeline/calloutLayout.d.ts.map +1 -1
  193. package/dist/pipeline/calloutLayout.js +8 -4
  194. package/dist/pipeline/calloutLayout.js.map +1 -1
  195. package/dist/pipeline/citations.d.ts.map +1 -1
  196. package/dist/pipeline/citations.js +52 -6
  197. package/dist/pipeline/citations.js.map +1 -1
  198. package/dist/pipeline/config.d.ts +6 -0
  199. package/dist/pipeline/config.d.ts.map +1 -1
  200. package/dist/pipeline/config.js +12 -1
  201. package/dist/pipeline/config.js.map +1 -1
  202. package/dist/pipeline/headerFooter.d.ts +2 -0
  203. package/dist/pipeline/headerFooter.d.ts.map +1 -1
  204. package/dist/pipeline/headerFooter.js +3 -1
  205. package/dist/pipeline/headerFooter.js.map +1 -1
  206. package/dist/pipeline/lists.d.ts +8 -0
  207. package/dist/pipeline/lists.d.ts.map +1 -1
  208. package/dist/pipeline/lists.js +18 -1
  209. package/dist/pipeline/lists.js.map +1 -1
  210. package/dist/pipeline/measureContentBlock.d.ts.map +1 -1
  211. package/dist/pipeline/measureContentBlock.js +3 -0
  212. package/dist/pipeline/measureContentBlock.js.map +1 -1
  213. package/dist/types.d.ts +13 -0
  214. package/dist/types.d.ts.map +1 -1
  215. package/dist/vdt.d.ts +9 -0
  216. package/dist/vdt.d.ts.map +1 -1
  217. package/dist/vdt.js.map +1 -1
  218. package/package.json +1 -1
@@ -0,0 +1,166 @@
1
+ import { needsBidi } from '../bidi';
2
+ import { graphemesOf } from '../measure/graphemes';
3
+ import { joiningScriptIn } from '../measure/joining';
4
+ import { paintAsOneRun } from './mirrorFrame';
5
+ /** Letter-spacing the words are probed with, px. */
6
+ const PROBE = 1;
7
+ /** Least difference, px, between a word's natural width and its width
8
+ * under letter-spacing (the spacing taken off) that counts as another
9
+ * shaping: above the noise of `measureText`, below any ligature. */
10
+ const TOLERANCE = 0.05;
11
+ /** Words remembered per font before the memory starts over. */
12
+ const MAX_WORDS = 8192;
13
+ /** Font string → what is known of each text set in it. */
14
+ const knownByFont = new Map();
15
+ function known(font) {
16
+ let k = knownByFont.get(font);
17
+ if (!k)
18
+ knownByFont.set(font, k = { otherwise: new Map(), words: new Map() });
19
+ return k;
20
+ }
21
+ /** Whether `text` may be painted in pieces at all: no right-to-left letter
22
+ * in it and no letter of a joining script (see the module comment). */
23
+ function divisible(text) {
24
+ return !needsBidi(text) && !joiningScriptIn(text);
25
+ }
26
+ function widthAt(ctx, text, spacing) {
27
+ ctx.letterSpacing = `${spacing}px`;
28
+ return ctx.measureText(text).width;
29
+ }
30
+ /** {@link shapedOtherwise}, measured: the context's `letterSpacing` is
31
+ * left at any value. */
32
+ function probe(ctx, text) {
33
+ const natural = widthAt(ctx, text, 0);
34
+ const one = widthAt(ctx, text, PROBE);
35
+ const two = widthAt(ctx, text, 2 * PROBE);
36
+ // What one more unit of spacing adds: the spacing after each letter.
37
+ const step = two - one;
38
+ // A measurer that takes no letter-spacing (a test stub, an old browser).
39
+ if (!(step > PROBE / 2))
40
+ return false;
41
+ return Math.abs(one - step - natural) > TOLERANCE;
42
+ }
43
+ function otherwise(ctx, font, text) {
44
+ const { otherwise: words } = known(font);
45
+ let changed = words.get(text);
46
+ if (changed === undefined) {
47
+ changed = probe(ctx, text);
48
+ if (words.size >= MAX_WORDS)
49
+ words.clear();
50
+ words.set(text, changed);
51
+ }
52
+ return changed;
53
+ }
54
+ function wordOf(ctx, font, text) {
55
+ if (!divisible(text))
56
+ return null;
57
+ const letters = graphemesOf(text);
58
+ if (letters.length < 2 || !otherwise(ctx, font, text))
59
+ return null;
60
+ // Two neighbours that shape otherwise under letter-spacing are a
61
+ // ligature; a third joins them the same way (f + f + i).
62
+ const groups = [];
63
+ let ligatures = 0;
64
+ for (let k = 0; k < letters.length;) {
65
+ let end = k + 1;
66
+ while (end < letters.length && otherwise(ctx, font, letters[end - 1] + letters[end]))
67
+ end++;
68
+ const ligature = end - k > 1;
69
+ const last = groups[groups.length - 1];
70
+ if (!ligature && last && !last.ligature)
71
+ last.end = end;
72
+ else
73
+ groups.push({ start: k, end, ligature });
74
+ if (ligature)
75
+ ligatures++;
76
+ k = end;
77
+ }
78
+ // Shaped otherwise as a whole but by no pair of neighbours: left as it was.
79
+ if (ligatures === 0)
80
+ return null;
81
+ ctx.letterSpacing = '0px';
82
+ const natural = (from, to) => ctx.measureText(letters.slice(from, to).join('')).width;
83
+ let glyphs = 0;
84
+ const pieces = groups.map((g) => {
85
+ // Up to the piece's first letter in the natural shaping, the kerning
86
+ // before it counted: the pieces meet as the whole word's letters do.
87
+ const offset = g.start === 0 ? 0 : natural(0, g.start + 1) - natural(g.start, g.start + 1);
88
+ const piece = { text: letters.slice(g.start, g.end).join(''), offset, glyphsBefore: glyphs, ligature: g.ligature };
89
+ glyphs += g.ligature ? 1 : g.end - g.start;
90
+ return piece;
91
+ });
92
+ return { pieces, natural: natural(0, letters.length), letters: letters.length };
93
+ }
94
+ /** {@link trackedPieces} with the word's measures. */
95
+ function trackedWord(ctx, text) {
96
+ if (text.length < 2 || !measures(ctx))
97
+ return null;
98
+ const font = ctx.font;
99
+ const { words } = known(font);
100
+ let word = words.get(text);
101
+ if (word === undefined) {
102
+ const spacing = ctx.letterSpacing;
103
+ word = wordOf(ctx, font, text);
104
+ ctx.letterSpacing = spacing;
105
+ if (words.size >= MAX_WORDS)
106
+ words.clear();
107
+ words.set(text, word);
108
+ }
109
+ return word;
110
+ }
111
+ /** Whether the context can be asked: it has a `letterSpacing` and measures. */
112
+ function measures(ctx) {
113
+ return 'letterSpacing' in ctx && typeof ctx.measureText === 'function';
114
+ }
115
+ /**
116
+ * Whether the browser shapes `text`, in the context's font, otherwise once
117
+ * a letter-spacing is set: its width at a letter-spacing, that spacing
118
+ * taken off, is not its natural width (it holds a ligature the
119
+ * letter-spacing turns off). False where the context measures no
120
+ * letter-spacing. The context's `letterSpacing` is put back as it was
121
+ * found.
122
+ */
123
+ export function shapedOtherwise(ctx, text) {
124
+ if (text.length < 2 || !measures(ctx))
125
+ return false;
126
+ const spacing = ctx.letterSpacing;
127
+ const changed = otherwise(ctx, ctx.font, text);
128
+ ctx.letterSpacing = spacing;
129
+ return changed;
130
+ }
131
+ /**
132
+ * The pieces a tracked word is painted in, in the context's font, or null
133
+ * when it is painted whole (the browser shapes it the same under
134
+ * letter-spacing, the context measures none, or the word holds a
135
+ * right-to-left or joining letter). The context's `letterSpacing` is put
136
+ * back as it was found.
137
+ */
138
+ export function trackedPieces(ctx, text) {
139
+ return trackedWord(ctx, text)?.pieces ?? null;
140
+ }
141
+ /**
142
+ * Paint a word of a tracked line with `paint` (the caller's `fillText`) at
143
+ * `x`, `y`: its left end on a left-to-right page, the start of its box in
144
+ * a mirrored frame. `tracking` is the context's `letterSpacing` on entry,
145
+ * px, and on return. A word that would lose its ligatures to it is painted
146
+ * in its {@link trackedPieces}, as one run (`paintAsOneRun`): its box is
147
+ * the one the frame turns a word painted whole about, its natural width
148
+ * and the tracking after each letter. Any other word with one `paint`.
149
+ */
150
+ export function fillTrackedWord(ctx, text, x, y, tracking, paint) {
151
+ const word = tracking !== 0 ? trackedWord(ctx, text) : null;
152
+ if (!word) {
153
+ paint(text, x, y);
154
+ return;
155
+ }
156
+ paintAsOneRun(ctx, x, word.natural + tracking * word.letters, () => {
157
+ for (const piece of word.pieces) {
158
+ if (piece.ligature)
159
+ ctx.letterSpacing = '0px';
160
+ paint(piece.text, x + piece.offset + tracking * piece.glyphsBefore, y);
161
+ if (piece.ligature)
162
+ ctx.letterSpacing = `${tracking}px`;
163
+ }
164
+ });
165
+ }
166
+ //# sourceMappingURL=trackedText.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trackedText.js","sourceRoot":"","sources":["../../src/canvas-backend/trackedText.ts"],"names":[],"mappings":"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"}
@@ -16,6 +16,12 @@ export type WordRun = NonNullable<VDTLineSegment['runs']>[number];
16
16
  * - a word set in several styles (`runs`, `كتا**ب**`) is painted whole in
17
17
  * the segment's style, then once more in each other run's style, clipped
18
18
  * to that run's stretch of the word ({@link paintWordRuns}).
19
+ *
20
+ * A left-to-right word of a tracked line that the browser would shape
21
+ * without its ligatures under letter-spacing is painted with them, as it
22
+ * was measured (`fillTrackedWord`, #663): in pieces, which a mirrored page
23
+ * turns back as one run (#685). A right-to-left word and a word of a
24
+ * joining script are never painted in pieces.
19
25
  */
20
26
  export declare function fillSegmentWord(ctx: CanvasRenderingContext2D, seg: VDTLineSegment, x: number, y: number, tracking: number, paint: (text: string, x: number, y: number) => void, runStyle: (run: WordRun) => {
21
27
  font: string;
@@ -1 +1 @@
1
- {"version":3,"file":"wordRuns.d.ts","sourceRoot":"","sources":["../../src/canvas-backend/wordRuns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAI7C,8EAA8E;AAC9E,MAAM,MAAM,OAAO,GAAG,WAAW,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAQlE;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,wBAAwB,EAC7B,GAAG,EAAE,cAAc,EACnB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,EACnD,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzD,IAAI,CAiBN;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,wBAAwB,EAC7B,GAAG,EAAE,cAAc,EACnB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,EACnD,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzD,IAAI,CAsCN"}
1
+ {"version":3,"file":"wordRuns.d.ts","sourceRoot":"","sources":["../../src/canvas-backend/wordRuns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAK7C,8EAA8E;AAC9E,MAAM,MAAM,OAAO,GAAG,WAAW,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAQlE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,wBAAwB,EAC7B,GAAG,EAAE,cAAc,EACnB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,EACnD,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzD,IAAI,CAkBN;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,wBAAwB,EAC7B,GAAG,EAAE,cAAc,EACnB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,EACnD,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzD,IAAI,CAsCN"}
@@ -1,5 +1,6 @@
1
1
  import { joiningScriptIn } from '../measure/joining';
2
2
  import { mirroredPaintActive } from './mirrorFrame';
3
+ import { fillTrackedWord } from './trackedText';
3
4
  /** How far above and below the baseline a run's clip reaches: past any
4
5
  * ascender, stacked vowel sign or descender. */
5
6
  const CLIP_REACH = 4096;
@@ -19,6 +20,12 @@ const MARK_RE = /\p{M}/u;
19
20
  * - a word set in several styles (`runs`, `كتا**ب**`) is painted whole in
20
21
  * the segment's style, then once more in each other run's style, clipped
21
22
  * to that run's stretch of the word ({@link paintWordRuns}).
23
+ *
24
+ * A left-to-right word of a tracked line that the browser would shape
25
+ * without its ligatures under letter-spacing is painted with them, as it
26
+ * was measured (`fillTrackedWord`, #663): in pieces, which a mirrored page
27
+ * turns back as one run (#685). A right-to-left word and a word of a
28
+ * joining script are never painted in pieces.
22
29
  */
23
30
  export function fillSegmentWord(ctx, seg, x, y, tracking, paint, runStyle) {
24
31
  const untracked = tracking !== 0 && joiningScriptIn(seg.text);
@@ -31,7 +38,10 @@ export function fillSegmentWord(ctx, seg, x, y, tracking, paint, runStyle) {
31
38
  ctx.direction = 'rtl';
32
39
  ctx.textAlign = 'left';
33
40
  }
34
- paint(seg.text, x, y);
41
+ if (tracking !== 0 && !untracked && !rtl && !seg.runs)
42
+ fillTrackedWord(ctx, seg.text, x, y, tracking, paint);
43
+ else
44
+ paint(seg.text, x, y);
35
45
  if (seg.runs)
36
46
  paintWordRuns(ctx, seg, x, y, paint, runStyle);
37
47
  if (rtl) {
@@ -1 +1 @@
1
- {"version":3,"file":"wordRuns.js","sourceRoot":"","sources":["../../src/canvas-backend/wordRuns.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wordRuns.js","sourceRoot":"","sources":["../../src/canvas-backend/wordRuns.ts"],"names":[],"mappings":"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"}
@@ -18,7 +18,8 @@ export interface ColumnRuleSegment {
18
18
  * — the ruling a compositor would draw. Under a page-span heading's opener
19
19
  * band it starts where the text does. A gutter between two columns that
20
20
  * hold nothing (a band closed before any text landed, the empty columns
21
- * left beside a closing page's text) is not ruled; a zero-height column
21
+ * left beside a closing page's text, the grid line a page-span opener
22
+ * leaves under its band before a page-span box) is not ruled; a zero-height column
22
23
  * (one a float filled) still bounds its gutters, which then run the length
23
24
  * of its neighbour — beside the float, never through it (#505). Bands are
24
25
  * visited in column order, which is band order because bands are always
@@ -1 +1 @@
1
- {"version":3,"file":"columnRule.d.ts","sourceRoot":"","sources":["../src/columnRule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAG7F;;sCAEsC;AACtC,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,GAAG,aAAa,CAIjH;AAED,6EAA6E;AAC7E,MAAM,WAAW,iBAAiB;IAChC,uCAAuC;IACvC,CAAC,EAAE,MAAM,CAAC;IACV,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAmBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,SAAS,SAAS,EAAE;AAC7B;+DAC+D;AAC/D,aAAa,CAAC,EAAE,SAAS,eAAe,EAAE,GACzC,iBAAiB,EAAE,CAyCrB;AAED;+CAC+C;AAC/C,MAAM,WAAW,mBAAmB;IAClC,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,6EAA6E;AAC7E,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,GAAG,mBAAmB,EAAE,CAIhG"}
1
+ {"version":3,"file":"columnRule.d.ts","sourceRoot":"","sources":["../src/columnRule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAG7F;;sCAEsC;AACtC,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,GAAG,aAAa,CAIjH;AAED,6EAA6E;AAC7E,MAAM,WAAW,iBAAiB;IAChC,uCAAuC;IACvC,CAAC,EAAE,MAAM,CAAC;IACV,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAmBD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,SAAS,SAAS,EAAE;AAC7B;+DAC+D;AAC/D,aAAa,CAAC,EAAE,SAAS,eAAe,EAAE,GACzC,iBAAiB,EAAE,CAgDrB;AAED;+CAC+C;AAC/C,MAAM,WAAW,mBAAmB;IAClC,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,6EAA6E;AAC7E,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,GAAG,mBAAmB,EAAE,CAIhG"}
@@ -33,7 +33,8 @@ function ruleTop(col) {
33
33
  * — the ruling a compositor would draw. Under a page-span heading's opener
34
34
  * band it starts where the text does. A gutter between two columns that
35
35
  * hold nothing (a band closed before any text landed, the empty columns
36
- * left beside a closing page's text) is not ruled; a zero-height column
36
+ * left beside a closing page's text, the grid line a page-span opener
37
+ * leaves under its band before a page-span box) is not ruled; a zero-height column
37
38
  * (one a float filled) still bounds its gutters, which then run the length
38
39
  * of its neighbour — beside the float, never through it (#505). Bands are
39
40
  * visited in column order, which is band order because bands are always
@@ -63,9 +64,16 @@ footnoteAreas) {
63
64
  byBand.set(band, [col]);
64
65
  }
65
66
  const tall = (col) => col.bbox.height > 0.5;
67
+ // A column that holds only the hidden heading of a page-span opener
68
+ // holds nothing the rule could stand beside: the opener band paints the
69
+ // heading, and the band closed under it before any text landed (a
70
+ // page-span box follows the opener, and the band ends on the grid line
71
+ // under the opener's foot). Ruled, that sliver printed a tick of rule
72
+ // between the opener and the box (#675).
73
+ const holdsNothing = (col) => col.blocks.every((b) => b.type === 'heading' && b.hidden === true);
66
74
  // A page with no text at all (a blank page) keeps its rules, as it did.
67
- const anyText = columns.some((c) => c.kind !== 'span' && c.blocks.length > 0);
68
- const empty = (col) => col.kind !== 'side' && col.blocks.length === 0;
75
+ const anyText = columns.some((c) => c.kind !== 'span' && !holdsNothing(c));
76
+ const empty = (col) => col.kind !== 'side' && holdsNothing(col);
69
77
  const segments = [];
70
78
  for (const cols of byBand.values()) {
71
79
  // Reading order is not always geometric order (a side column at the
@@ -1 +1 @@
1
- {"version":3,"file":"columnRule.js","sourceRoot":"","sources":["../src/columnRule.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"columnRule.js","sourceRoot":"","sources":["../src/columnRule.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"layoutPage.d.ts","sourceRoot":"","sources":["../../src/comics/layoutPage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,SAAS,EAAE,QAAQ,EAAE,0BAA0B,EAAE,oBAAoB,EAA4B,MAAM,UAAU,CAAC;AACpK,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAe,eAAe,EAAE,YAAY,EAAE,aAAa,EAAoB,OAAO,EAAY,MAAM,QAAQ,CAAC;AAU1K,OAAO,KAAK,EAAkD,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxG,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAElF,kDAAkD;AAClD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,cAAc,CAAC;IACzB,uEAAuE;IACvE,IAAI,EAAE,OAAO,CAAC;IACd,wDAAwD;IACxD,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,EAAE,WAAW,CAAC;IACtB,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACzC;kDAC8C;IAC9C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;2DACuD;IACvD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;yCACqC;IACrC,UAAU,CAAC,EAAE,WAAW,CAAC;CAC1B;AAED;;;;yEAIyE;AACzE,wBAAgB,eAAe,CAC7B,MAAM,EAAE,oBAAoB,EAC5B,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,WAAW,GAChB;IAAE,GAAG,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAoBrE;AAED;wCACwC;AACxC,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAKpF;AASD;;;;;;;;0DAQ0D;AAC1D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,oBAAoB,EAAE,QAAQ,EAAE,cAAc,GAAG,KAAK,GAAG,KAAK,CAQhJ;AAED;;;uDAGuD;AACvD,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO,GAAG,QAAQ,CAAC,EAC3C,SAAS,EAAE,KAAK,GAAG,KAAK,EACxB,GAAG,EAAE,MAAM,GACV;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAoB1E;AAgDD;iCACiC;AACjC,wBAAgB,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,gBAAgB,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,eAAe,GAAG,YAAY,CAAC,EAAE,MAAM,GAAE,oBAAmD,GAAG,WAAW,CAWtM;AAmBD;+BAC+B;AAC/B,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,cAAc,EAAE,CAEtF;AAED;wEACwE;AACxE,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,cAAc,EAAE,GAAG,IAAI,CAGrG;AAED;wCACwC;AACxC,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAGrE;AAED;;gEAEgE;AAChE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,oBAAoB,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAKtH;AAOD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,KAAK,EAAE,0BAA0B,CAAC;IAClC,MAAM,EAAE,oBAAoB,CAAC;IAC7B,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,IAAI,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,GAAG,MAAM,CAAC,CAAC;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;CACxC,GAAG,cAAc,CAsDjB;AAkID,uCAAuC;AACvC,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,eAAe,CAAC;IACxB,MAAM,EAAE,SAAS,aAAa,EAAE,CAAC;IACjC,uEAAuE;IACvE,YAAY,EAAE,SAAS,CAAC,gBAAgB,GAAG,SAAS,CAAC,EAAE,CAAC;IACxD,MAAM,EAAE,oBAAoB,CAAC;IAC7B,QAAQ,EAAE,cAAc,CAAC;IACzB,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACzC,SAAS,EAAE,KAAK,GAAG,KAAK,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;qDACiD;IACjD,KAAK,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IAC/B;gDAC4C;IAC5C,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB;;yDAEqD;IACrD,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,QAAQ,CAAC,EAAE,WAAW,CAAC;CACxB;AAqBD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG;IAAE,QAAQ,EAAE,eAAe,EAAE,CAAC;IAAC,QAAQ,EAAE,cAAc,EAAE,CAAA;CAAE,CAkFlH;AAED;;;qBAGqB;AACrB,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,cAAc,CAAC;IACzB,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,EAAE,WAAW,CAAC;IACtB,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACzC;kDAC8C;IAC9C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB;0DACsD;IACtD,KAAK,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IAC/B;2CACuC;IACvC,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAED,4BAA4B;AAC5B,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,gBAAgB,GAAG,YAAY,CAyB9F;AAED;4EAC4E;AAC5E,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,iBAAiB,GAAG,YAAY,CAmH9F"}
1
+ {"version":3,"file":"layoutPage.d.ts","sourceRoot":"","sources":["../../src/comics/layoutPage.ts"],"names":[],"mappings":"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"}
@@ -419,6 +419,27 @@ function buttedCaption(style, panel, at) {
419
419
  return style;
420
420
  return { ...style, strokeWidth: panel.border.width };
421
421
  }
422
+ /** Whether a balloon's outline is an oval or grows from one (a cloud, a
423
+ * burst): its box's corners are no part of it. */
424
+ function roundBalloon(comics, b) {
425
+ if (b.kind !== 'balloon' || !b.shape)
426
+ return false;
427
+ const shape = pickBalloonStyle(comics, b.style)?.shape;
428
+ return shape !== 'rectangle' && shape !== 'rounded' && shape !== 'none';
429
+ }
430
+ /** A balloon's tail as drawn, from its body to its tip (the body taken as
431
+ * the oval its box holds); undefined for a balloon with none. */
432
+ function drawnTail(b) {
433
+ if (!b.tailTip)
434
+ return undefined;
435
+ const c = { x: b.bbox.x + b.bbox.width / 2, y: b.bbox.y + b.bbox.height / 2 };
436
+ const dx = b.tailTip.x - c.x;
437
+ const dy = b.tailTip.y - c.y;
438
+ const k = Math.hypot(dx / (b.bbox.width / 2 || 1), dy / (b.bbox.height / 2 || 1));
439
+ if (!(k > 1))
440
+ return undefined;
441
+ return [{ x: c.x + dx / k, y: c.y + dy / k }, { x: b.tailTip.x, y: b.tailTip.y }];
442
+ }
422
443
  /** A box grown (negative `d`) or shrunk by `d` on every side. */
423
444
  function insetBox2(b, d) {
424
445
  return { x: b.x + d, y: b.y + d, width: b.width - 2 * d, height: b.height - 2 * d };
@@ -452,11 +473,39 @@ export function letterPanels(input) {
452
473
  const castById = new Map(comics.cast.map((c) => [c.id, c]));
453
474
  const balloons = [];
454
475
  const warnings = [];
476
+ const em = dimensionToPx(L.fontSize, dpi);
477
+ // What each panel's picture protects, on the page (#671): a balloon that
478
+ // leaves its panel keeps off the faces and avoid zones of the others.
479
+ const insets = panels.map((_, i) => panelSources[i]?.attrs.inset !== undefined);
480
+ const protectedArt = panels.map((panel, pi) => {
481
+ const resource = panel.art ? resources.get(panel.art.resourceId) : undefined;
482
+ if (!panel.art || !resource)
483
+ return [];
484
+ const under = panels.filter((q, qi) => qi > pi && insets[qi] && overlaps(q.bbox, panel.bbox)).map((q) => q.polygon);
485
+ const shown = (rect) => overlaps(rect, panel.bbox);
486
+ const entry = (rect, kind, guard = false) => ({ rect, kind, ...(guard ? { guard } : {}), within: panel.polygon, ...(under.length > 0 ? { under } : {}) });
487
+ return [
488
+ ...(resource.anchors ?? []).filter((a) => a.id !== 'sfx' && a.face).map((a) => entry(comicArtRectToPage(panel.art, a.face), 'face')),
489
+ ...(resource.avoid ?? []).map((r) => entry(comicArtRectToPage(panel.art, r), 'avoid')),
490
+ ...headGuards(panel, resource, em).map((g) => entry(g, 'avoid', true)),
491
+ ].filter((e) => shown(e.rect));
492
+ });
455
493
  panels.forEach((panel, pi) => {
456
494
  const src = panelSources[pi];
457
495
  if (!src || src.items.length === 0)
458
496
  return;
459
497
  const resource = panel.art ? resources.get(panel.art.resourceId) : undefined;
498
+ // A line that may leave the panel (`break`, a pin, drawn sound) can land
499
+ // on anything about it: it is told what the panels before it lettered
500
+ // and what the pictures around it protect, as far as it can reach (its
501
+ // middle stays in its panel). A panel with no such line is lettered
502
+ // from what pokes into it alone, whatever the rest of the page does.
503
+ const laidOver = panels.filter((q, qi) => qi > pi && insets[qi] && overlaps(q.bbox, panel.bbox)).map((q) => q.polygon);
504
+ const leaves = src.items.some((it) => it.break || it.at !== undefined || it.role === 'sfx');
505
+ const reach = leaves ? insetBox2(panel.bbox, -Math.max(panel.bbox.width, panel.bbox.height)) : panel.bbox;
506
+ const set = balloons.filter((b) => overlaps(b.bbox, reach));
507
+ const tails = set.map(drawnTail).filter((t) => t !== undefined);
508
+ const around = leaves ? protectedArt.flatMap((list, qi) => (qi === pi ? [] : list.filter((e) => overlaps(e.rect, reach)))) : [];
460
509
  const lp = {
461
510
  index: panel.index,
462
511
  polygon: panel.polygon,
@@ -468,17 +517,20 @@ export function letterPanels(input) {
468
517
  anchors: panelAnchors(panel, resource),
469
518
  avoid: [
470
519
  ...(panel.art ? (resource?.avoid ?? []).map((r) => comicArtRectToPage(panel.art, r)) : []),
471
- ...headGuards(panel, resource, dimensionToPx(L.fontSize, dpi)).map((g) => ({ ...g, guard: true })),
520
+ ...headGuards(panel, resource, em).map((g) => ({ ...g, guard: true })),
472
521
  ],
473
522
  keepOut: (input.avoid ?? []).filter((r) => overlaps(r, insetBox2(panel.bbox, -2 * insetPx))),
474
523
  softAvoid: [...softSafeArea(panel, resource), ...headZones(panel, resource), ...bodyZones(panel, resource)],
475
524
  ...(panel.border.style !== 'none' && panel.border.width > 0 ? { borderPx: panel.border.width } : {}),
476
525
  neighbours: panels.filter((q) => q !== panel).map((q) => q.bbox),
526
+ ...(laidOver.length > 0 ? { over: laidOver } : {}),
477
527
  ...(input.frame ? { limit: input.frame } : {}),
478
528
  ...(trim ? { trim, sheet: input.bleedBox ? intersect(input.bleedBox, union(trim, panel.bbox)) : trim } : {}),
479
529
  // What the panels before this one lettered: a balloon breaking out
480
530
  // of either panel never covers the other's.
481
- foreign: balloons.filter((b) => overlaps(b.bbox, panel.bbox)).map((b) => b.bbox),
531
+ foreign: set.map((b) => (roundBalloon(comics, b) ? { ...b.bbox, round: true } : b.bbox)),
532
+ ...(tails.length > 0 ? { foreignTails: tails } : {}),
533
+ ...(around.length > 0 ? { foreignArt: around } : {}),
482
534
  dpi,
483
535
  };
484
536
  const items = src.items.map((it, k) => {