postext 1.19.2 → 1.20.0

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 (251) hide show
  1. package/dist/__tests__/comics/art.test.d.ts +2 -0
  2. package/dist/__tests__/comics/art.test.d.ts.map +1 -0
  3. package/dist/__tests__/comics/art.test.js +96 -0
  4. package/dist/__tests__/comics/art.test.js.map +1 -0
  5. package/dist/__tests__/comics/build.test.d.ts +2 -0
  6. package/dist/__tests__/comics/build.test.d.ts.map +1 -0
  7. package/dist/__tests__/comics/build.test.js +215 -0
  8. package/dist/__tests__/comics/build.test.js.map +1 -0
  9. package/dist/__tests__/comics/canvas.test.d.ts +2 -0
  10. package/dist/__tests__/comics/canvas.test.d.ts.map +1 -0
  11. package/dist/__tests__/comics/canvas.test.js +161 -0
  12. package/dist/__tests__/comics/canvas.test.js.map +1 -0
  13. package/dist/__tests__/comics/config.test.d.ts +2 -0
  14. package/dist/__tests__/comics/config.test.d.ts.map +1 -0
  15. package/dist/__tests__/comics/config.test.js +97 -0
  16. package/dist/__tests__/comics/config.test.js.map +1 -0
  17. package/dist/__tests__/comics/geometry.test.d.ts +2 -0
  18. package/dist/__tests__/comics/geometry.test.d.ts.map +1 -0
  19. package/dist/__tests__/comics/geometry.test.js +118 -0
  20. package/dist/__tests__/comics/geometry.test.js.map +1 -0
  21. package/dist/__tests__/comics/html.test.d.ts +2 -0
  22. package/dist/__tests__/comics/html.test.d.ts.map +1 -0
  23. package/dist/__tests__/comics/html.test.js +253 -0
  24. package/dist/__tests__/comics/html.test.js.map +1 -0
  25. package/dist/__tests__/comics/lettering.test.d.ts +2 -0
  26. package/dist/__tests__/comics/lettering.test.d.ts.map +1 -0
  27. package/dist/__tests__/comics/lettering.test.js +241 -0
  28. package/dist/__tests__/comics/lettering.test.js.map +1 -0
  29. package/dist/__tests__/comics/script.test.d.ts +2 -0
  30. package/dist/__tests__/comics/script.test.d.ts.map +1 -0
  31. package/dist/__tests__/comics/script.test.js +147 -0
  32. package/dist/__tests__/comics/script.test.js.map +1 -0
  33. package/dist/__tests__/comics/split.test.d.ts +2 -0
  34. package/dist/__tests__/comics/split.test.d.ts.map +1 -0
  35. package/dist/__tests__/comics/split.test.js +120 -0
  36. package/dist/__tests__/comics/split.test.js.map +1 -0
  37. package/dist/__tests__/comics/spread.test.d.ts +2 -0
  38. package/dist/__tests__/comics/spread.test.d.ts.map +1 -0
  39. package/dist/__tests__/comics/spread.test.js +161 -0
  40. package/dist/__tests__/comics/spread.test.js.map +1 -0
  41. package/dist/__tests__/comics/strip.test.d.ts +2 -0
  42. package/dist/__tests__/comics/strip.test.d.ts.map +1 -0
  43. package/dist/__tests__/comics/strip.test.js +231 -0
  44. package/dist/__tests__/comics/strip.test.js.map +1 -0
  45. package/dist/__tests__/exports.test.js +89 -0
  46. package/dist/__tests__/exports.test.js.map +1 -1
  47. package/dist/__tests__/parse/containers.test.js +1 -1
  48. package/dist/__tests__/parse/containers.test.js.map +1 -1
  49. package/dist/canvas-backend/comic.d.ts +32 -0
  50. package/dist/canvas-backend/comic.d.ts.map +1 -0
  51. package/dist/canvas-backend/comic.js +216 -0
  52. package/dist/canvas-backend/comic.js.map +1 -0
  53. package/dist/canvas-backend/headerFooter.d.ts +4 -1
  54. package/dist/canvas-backend/headerFooter.d.ts.map +1 -1
  55. package/dist/canvas-backend/headerFooter.js +3 -1
  56. package/dist/canvas-backend/headerFooter.js.map +1 -1
  57. package/dist/canvas-backend/index.d.ts.map +1 -1
  58. package/dist/canvas-backend/index.js +7 -1
  59. package/dist/canvas-backend/index.js.map +1 -1
  60. package/dist/comics/art.d.ts +72 -0
  61. package/dist/comics/art.d.ts.map +1 -0
  62. package/dist/comics/art.js +154 -0
  63. package/dist/comics/art.js.map +1 -0
  64. package/dist/comics/fonts.d.ts +20 -0
  65. package/dist/comics/fonts.d.ts.map +1 -0
  66. package/dist/comics/fonts.js +42 -0
  67. package/dist/comics/fonts.js.map +1 -0
  68. package/dist/comics/geometry.d.ts +87 -0
  69. package/dist/comics/geometry.d.ts.map +1 -0
  70. package/dist/comics/geometry.js +272 -0
  71. package/dist/comics/geometry.js.map +1 -0
  72. package/dist/comics/index.d.ts +29 -0
  73. package/dist/comics/index.d.ts.map +1 -0
  74. package/dist/comics/index.js +18 -0
  75. package/dist/comics/index.js.map +1 -0
  76. package/dist/comics/layoutPage.d.ts +156 -0
  77. package/dist/comics/layoutPage.d.ts.map +1 -0
  78. package/dist/comics/layoutPage.js +697 -0
  79. package/dist/comics/layoutPage.js.map +1 -0
  80. package/dist/comics/lettering/__tests__/harness.test.d.ts +2 -0
  81. package/dist/comics/lettering/__tests__/harness.test.d.ts.map +1 -0
  82. package/dist/comics/lettering/__tests__/harness.test.js +273 -0
  83. package/dist/comics/lettering/__tests__/harness.test.js.map +1 -0
  84. package/dist/comics/lettering/__tests__/letterPanel.test.d.ts +2 -0
  85. package/dist/comics/lettering/__tests__/letterPanel.test.d.ts.map +1 -0
  86. package/dist/comics/lettering/__tests__/letterPanel.test.js +224 -0
  87. package/dist/comics/lettering/__tests__/letterPanel.test.js.map +1 -0
  88. package/dist/comics/lettering/__tests__/polish.test.d.ts +2 -0
  89. package/dist/comics/lettering/__tests__/polish.test.d.ts.map +1 -0
  90. package/dist/comics/lettering/__tests__/polish.test.js +357 -0
  91. package/dist/comics/lettering/__tests__/polish.test.js.map +1 -0
  92. package/dist/comics/lettering/__tests__/round2.test.d.ts +2 -0
  93. package/dist/comics/lettering/__tests__/round2.test.d.ts.map +1 -0
  94. package/dist/comics/lettering/__tests__/round2.test.js +289 -0
  95. package/dist/comics/lettering/__tests__/round2.test.js.map +1 -0
  96. package/dist/comics/lettering/__tests__/shapeText.test.d.ts +2 -0
  97. package/dist/comics/lettering/__tests__/shapeText.test.d.ts.map +1 -0
  98. package/dist/comics/lettering/__tests__/shapeText.test.js +98 -0
  99. package/dist/comics/lettering/__tests__/shapeText.test.js.map +1 -0
  100. package/dist/comics/lettering/__tests__/shapes.test.d.ts +2 -0
  101. package/dist/comics/lettering/__tests__/shapes.test.d.ts.map +1 -0
  102. package/dist/comics/lettering/__tests__/shapes.test.js +137 -0
  103. package/dist/comics/lettering/__tests__/shapes.test.js.map +1 -0
  104. package/dist/comics/lettering/__tests__/stubMeasure.d.ts +5 -0
  105. package/dist/comics/lettering/__tests__/stubMeasure.d.ts.map +1 -0
  106. package/dist/comics/lettering/__tests__/stubMeasure.js +47 -0
  107. package/dist/comics/lettering/__tests__/stubMeasure.js.map +1 -0
  108. package/dist/comics/lettering/__tests__/text.test.d.ts +2 -0
  109. package/dist/comics/lettering/__tests__/text.test.d.ts.map +1 -0
  110. package/dist/comics/lettering/__tests__/text.test.js +86 -0
  111. package/dist/comics/lettering/__tests__/text.test.js.map +1 -0
  112. package/dist/comics/lettering/geom.d.ts +78 -0
  113. package/dist/comics/lettering/geom.d.ts.map +1 -0
  114. package/dist/comics/lettering/geom.js +376 -0
  115. package/dist/comics/lettering/geom.js.map +1 -0
  116. package/dist/comics/lettering/index.d.ts +7 -0
  117. package/dist/comics/lettering/index.d.ts.map +1 -0
  118. package/dist/comics/lettering/index.js +8 -0
  119. package/dist/comics/lettering/index.js.map +1 -0
  120. package/dist/comics/lettering/letter.d.ts +7 -0
  121. package/dist/comics/lettering/letter.d.ts.map +1 -0
  122. package/dist/comics/lettering/letter.js +397 -0
  123. package/dist/comics/lettering/letter.js.map +1 -0
  124. package/dist/comics/lettering/placement.d.ts +117 -0
  125. package/dist/comics/lettering/placement.d.ts.map +1 -0
  126. package/dist/comics/lettering/placement.js +889 -0
  127. package/dist/comics/lettering/placement.js.map +1 -0
  128. package/dist/comics/lettering/presets.d.ts +15 -0
  129. package/dist/comics/lettering/presets.d.ts.map +1 -0
  130. package/dist/comics/lettering/presets.js +61 -0
  131. package/dist/comics/lettering/presets.js.map +1 -0
  132. package/dist/comics/lettering/shape-text.d.ts +72 -0
  133. package/dist/comics/lettering/shape-text.d.ts.map +1 -0
  134. package/dist/comics/lettering/shape-text.js +550 -0
  135. package/dist/comics/lettering/shape-text.js.map +1 -0
  136. package/dist/comics/lettering/shapes.d.ts +83 -0
  137. package/dist/comics/lettering/shapes.d.ts.map +1 -0
  138. package/dist/comics/lettering/shapes.js +512 -0
  139. package/dist/comics/lettering/shapes.js.map +1 -0
  140. package/dist/comics/lettering/text.d.ts +79 -0
  141. package/dist/comics/lettering/text.d.ts.map +1 -0
  142. package/dist/comics/lettering/text.js +488 -0
  143. package/dist/comics/lettering/text.js.map +1 -0
  144. package/dist/comics/lettering/types.d.ts +270 -0
  145. package/dist/comics/lettering/types.d.ts.map +1 -0
  146. package/dist/comics/lettering/types.js +9 -0
  147. package/dist/comics/lettering/types.js.map +1 -0
  148. package/dist/comics/page.d.ts +37 -0
  149. package/dist/comics/page.d.ts.map +1 -0
  150. package/dist/comics/page.js +285 -0
  151. package/dist/comics/page.js.map +1 -0
  152. package/dist/comics/paint.d.ts +65 -0
  153. package/dist/comics/paint.d.ts.map +1 -0
  154. package/dist/comics/paint.js +219 -0
  155. package/dist/comics/paint.js.map +1 -0
  156. package/dist/comics/script.d.ts +42 -0
  157. package/dist/comics/script.d.ts.map +1 -0
  158. package/dist/comics/script.js +302 -0
  159. package/dist/comics/script.js.map +1 -0
  160. package/dist/comics/split.d.ts +135 -0
  161. package/dist/comics/split.d.ts.map +1 -0
  162. package/dist/comics/split.js +514 -0
  163. package/dist/comics/split.js.map +1 -0
  164. package/dist/comics/spread.d.ts +36 -0
  165. package/dist/comics/spread.d.ts.map +1 -0
  166. package/dist/comics/spread.js +172 -0
  167. package/dist/comics/spread.js.map +1 -0
  168. package/dist/comics/strip.d.ts +77 -0
  169. package/dist/comics/strip.d.ts.map +1 -0
  170. package/dist/comics/strip.js +89 -0
  171. package/dist/comics/strip.js.map +1 -0
  172. package/dist/comics/transform.d.ts +37 -0
  173. package/dist/comics/transform.d.ts.map +1 -0
  174. package/dist/comics/transform.js +161 -0
  175. package/dist/comics/transform.js.map +1 -0
  176. package/dist/comics/types.d.ts +143 -0
  177. package/dist/comics/types.d.ts.map +1 -0
  178. package/dist/comics/types.js +13 -0
  179. package/dist/comics/types.js.map +1 -0
  180. package/dist/comics/warnings.d.ts +14 -0
  181. package/dist/comics/warnings.d.ts.map +1 -0
  182. package/dist/comics/warnings.js +94 -0
  183. package/dist/comics/warnings.js.map +1 -0
  184. package/dist/configWarnings.d.ts.map +1 -1
  185. package/dist/configWarnings.js +42 -0
  186. package/dist/configWarnings.js.map +1 -1
  187. package/dist/defaults/comics.d.ts +51 -0
  188. package/dist/defaults/comics.d.ts.map +1 -0
  189. package/dist/defaults/comics.js +385 -0
  190. package/dist/defaults/comics.js.map +1 -0
  191. package/dist/defaults/index.d.ts +1 -0
  192. package/dist/defaults/index.d.ts.map +1 -1
  193. package/dist/defaults/index.js +9 -0
  194. package/dist/defaults/index.js.map +1 -1
  195. package/dist/design/layout.d.ts +13 -1
  196. package/dist/design/layout.d.ts.map +1 -1
  197. package/dist/design/layout.js +17 -0
  198. package/dist/design/layout.js.map +1 -1
  199. package/dist/html-backend.d.ts +3 -0
  200. package/dist/html-backend.d.ts.map +1 -1
  201. package/dist/html-backend.js +44 -8
  202. package/dist/html-backend.js.map +1 -1
  203. package/dist/htmlComic.d.ts +69 -0
  204. package/dist/htmlComic.d.ts.map +1 -0
  205. package/dist/htmlComic.js +179 -0
  206. package/dist/htmlComic.js.map +1 -0
  207. package/dist/index.d.ts +8 -2
  208. package/dist/index.d.ts.map +1 -1
  209. package/dist/index.js +4 -0
  210. package/dist/index.js.map +1 -1
  211. package/dist/parse/blockParser.d.ts.map +1 -1
  212. package/dist/parse/blockParser.js +25 -1
  213. package/dist/parse/blockParser.js.map +1 -1
  214. package/dist/parse/indexMarks.d.ts.map +1 -1
  215. package/dist/parse/indexMarks.js +3 -0
  216. package/dist/parse/indexMarks.js.map +1 -1
  217. package/dist/parse/types.d.ts +7 -1
  218. package/dist/parse/types.d.ts.map +1 -1
  219. package/dist/pipeline/build.d.ts.map +1 -1
  220. package/dist/pipeline/build.js +251 -9
  221. package/dist/pipeline/build.js.map +1 -1
  222. package/dist/pipeline/config.d.ts.map +1 -1
  223. package/dist/pipeline/config.js +4 -1
  224. package/dist/pipeline/config.js.map +1 -1
  225. package/dist/pipeline/contentWarnings.d.ts.map +1 -1
  226. package/dist/pipeline/contentWarnings.js +58 -0
  227. package/dist/pipeline/contentWarnings.js.map +1 -1
  228. package/dist/pipeline/floatSlots.js +1 -1
  229. package/dist/pipeline/floatSlots.js.map +1 -1
  230. package/dist/pipeline/headerFooter.d.ts +6 -2
  231. package/dist/pipeline/headerFooter.d.ts.map +1 -1
  232. package/dist/pipeline/headerFooter.js +11 -3
  233. package/dist/pipeline/headerFooter.js.map +1 -1
  234. package/dist/pipeline/pageRoles.d.ts +1 -0
  235. package/dist/pipeline/pageRoles.d.ts.map +1 -1
  236. package/dist/pipeline/pageRoles.js +3 -0
  237. package/dist/pipeline/pageRoles.js.map +1 -1
  238. package/dist/pipeline/placement.d.ts +3 -3
  239. package/dist/pipeline/placement.d.ts.map +1 -1
  240. package/dist/pipeline/placement.js +4 -4
  241. package/dist/pipeline/placement.js.map +1 -1
  242. package/dist/types.d.ts +338 -1
  243. package/dist/types.d.ts.map +1 -1
  244. package/dist/vdt.d.ts +271 -2
  245. package/dist/vdt.d.ts.map +1 -1
  246. package/dist/vdt.js.map +1 -1
  247. package/dist/worker/fonts.d.ts +2 -1
  248. package/dist/worker/fonts.d.ts.map +1 -1
  249. package/dist/worker/fonts.js +11 -1
  250. package/dist/worker/fonts.js.map +1 -1
  251. package/package.json +1 -1
@@ -0,0 +1,83 @@
1
+ import { type PathCmd } from './geom';
2
+ import type { LetteringStyle, Point, Rect } from './types';
3
+ /** A balloon body: its outline, the polygon standing for it, its box. */
4
+ export interface Body {
5
+ cmds: PathCmd[];
6
+ /** Outer outline as a polygon (the tips of a burst, the bumps of a
7
+ * cloud), clockwise on the page. */
8
+ hull: Point[];
9
+ /** The smooth core the decoration grows from (the valleys of a burst or
10
+ * a cloud); the hull itself for plain shapes. Tails leave from it. */
11
+ core: Point[];
12
+ bbox: Rect;
13
+ centre: Point;
14
+ /** Lengths that shape the tail (em of the text). */
15
+ em: number;
16
+ /** Superellipse semi-axes of the core, when it is one. */
17
+ axes?: {
18
+ a: number;
19
+ b: number;
20
+ };
21
+ /** A burst: `hull` alternates valley, spike tip, valley… (a tail then
22
+ * grows out of a spike, see {@link buildTail}). */
23
+ star?: true;
24
+ }
25
+ /** The smallest-area superellipse `|x/a|^n + |y/b|^n <= 1` about `c` that
26
+ * holds every point. */
27
+ export declare function fitSuperellipse(points: readonly Point[], c: Point, n: number): {
28
+ a: number;
29
+ b: number;
30
+ };
31
+ /** Build the body of a balloon around its text's ink (`ink`, page px). */
32
+ export declare function buildBody(ink: readonly Rect[], em: number, style: LetteringStyle, seed: string): Body;
33
+ /** A body moved by (dx, dy). */
34
+ export declare function translateBody(body: Body, dx: number, dy: number): Body;
35
+ /** How a tail is drawn. */
36
+ export interface TailOptions {
37
+ /** The target lies on the panel border (an off-panel speaker): the tip
38
+ * runs right to it. */
39
+ offPanel?: boolean;
40
+ /** Stroke width, px: how far inside the body the tail starts. */
41
+ strokeWidth: number;
42
+ /** Bend sign for a curved tail (+1 / -1): Kurlander's tails curve away
43
+ * from the reading side. */
44
+ bend?: number;
45
+ /** The speaker's face: the tip stops short of it, so that the tail
46
+ * points at the mouth without running over the face. */
47
+ face?: Rect;
48
+ }
49
+ /** A tail as path commands, and its tip. */
50
+ export interface Tail {
51
+ cmds: PathCmd[];
52
+ tip: Point;
53
+ /** Where it leaves the body. */
54
+ base: Point;
55
+ /** The body's outline to draw with this tail, when the tail replaces a
56
+ * part of it (a burst's tail is the spike it grows from: the spike is
57
+ * left out, so no notch is left between the tail and the spike). */
58
+ body?: PathCmd[];
59
+ }
60
+ /**
61
+ * The tail of `body` toward `target` (SPEC D3.2): it leaves the body
62
+ * perpendicular to the wall where the line from the centre to the target
63
+ * crosses it, aims at the target, tapers, and stops `tailReach` of the way
64
+ * there (never closer than `tailGap`), or at the border for an off-panel
65
+ * speaker. Undefined when the target is inside the body or too close.
66
+ */
67
+ export declare function buildTail(body: Body, target: Point, style: LetteringStyle, opts: TailOptions): Tail | undefined;
68
+ /**
69
+ * How long a tail runs from the body's wall toward a target `gap` px away:
70
+ * `tailReach` of the way (Blambot's half to three fifths), never closer to
71
+ * the target than `tailGap`, and never stopping farther from it than 2.5
72
+ * em — a balloon set far from its speaker gets a longer tail, so that every
73
+ * tip ends about as near its mouth (Kurlander's tails end together). An
74
+ * off-panel tail runs to the border.
75
+ */
76
+ export declare function tailLength(gap: number, em: number, style: Pick<LetteringStyle, 'tailReach' | 'tailGap'>, offPanel: boolean): number;
77
+ /** A neck joining two bodies of one speaker (a connector, SPEC D3.2): it
78
+ * runs from centre to centre, narrow in the middle, and starts inside
79
+ * both bodies. */
80
+ export declare function buildNeck(a: Body, b: Body, strokeWidth: number): PathCmd[];
81
+ /** The dash pattern of a style, px (absent: solid). */
82
+ export declare function dashOf(style: LetteringStyle): number[] | undefined;
83
+ //# sourceMappingURL=shapes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shapes.d.ts","sourceRoot":"","sources":["../../../src/comics/lettering/shapes.ts"],"names":[],"mappings":"AAYA,OAAO,EAGL,KAAK,OAAO,EACb,MAAM,QAAQ,CAAC;AAChB,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE3D,yEAAyE;AACzE,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB;yCACqC;IACrC,IAAI,EAAE,KAAK,EAAE,CAAC;IACd;2EACuE;IACvE,IAAI,EAAE,KAAK,EAAE,CAAC;IACd,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,KAAK,CAAC;IACd,oDAAoD;IACpD,EAAE,EAAE,MAAM,CAAC;IACX,0DAA0D;IAC1D,IAAI,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChC;wDACoD;IACpD,IAAI,CAAC,EAAE,IAAI,CAAC;CACb;AAgCD;yBACyB;AACzB,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAyBvG;AAmDD,0EAA0E;AAC1E,wBAAgB,SAAS,CAAC,GAAG,EAAE,SAAS,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAkBrG;AA0GD,gCAAgC;AAChC,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAUtE;AA2BD,2BAA2B;AAC3B,MAAM,WAAW,WAAW;IAC1B;4BACwB;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iEAAiE;IACjE,WAAW,EAAE,MAAM,CAAC;IACpB;iCAC6B;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;6DACyD;IACzD,IAAI,CAAC,EAAE,IAAI,CAAC;CACb;AAED,4CAA4C;AAC5C,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,GAAG,EAAE,KAAK,CAAC;IACX,gCAAgC;IAChC,IAAI,EAAE,KAAK,CAAC;IACZ;;yEAEqE;IACrE,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,CA8D/G;AAqED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,WAAW,GAAG,SAAS,CAAC,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,CAKnI;AAiDD;;mBAEmB;AACnB,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,EAAE,CAsB1E;AAED,uDAAuD;AACvD,wBAAgB,MAAM,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,EAAE,GAAG,SAAS,CAKlE"}
@@ -0,0 +1,512 @@
1
+ // Balloon outlines (SPEC D3.2), built around the text block already set:
2
+ // the text's ink, grown by a constant air, is what the body must hold.
3
+ // Every outline is a list of path commands in page px (M L C Z), and a
4
+ // polygon (`hull`) that stands for it in the geometry (tail exits,
5
+ // collisions, bounds). Jitter (burst spikes, cloud scallops, wobble) is
6
+ // seeded from the balloon id.
7
+ //
8
+ // Paint model (Comicraft's layer method): a group's outline is one
9
+ // compound path — bodies, tails, necks — stroked at twice the stroke width
10
+ // and then filled, so overlapping subpaths merge into one outline with no
11
+ // path booleans. Every tail and neck therefore starts inside its body.
12
+ import { add, boundsOf, circleCmds, dist, lerp, norm, perp, polygonCmds, rayExit, resampleClosed, roundedRectCmds, scale, seededRandom, smoothClosedCmds, smoothOpenCmds, sub, hashString, perimeter, translateCmds, } from './geom';
13
+ /** Samples of the corners of `ink` rects grown by `air` with round corners
14
+ * (the Minkowski sum with a disc): what an outline must hold. */
15
+ function airPoints(ink, air) {
16
+ const out = [];
17
+ const steps = 6;
18
+ for (const r of ink) {
19
+ const corners = [
20
+ [{ x: r.x + r.width, y: r.y }, -Math.PI / 2],
21
+ [{ x: r.x + r.width, y: r.y + r.height }, 0],
22
+ [{ x: r.x, y: r.y + r.height }, Math.PI / 2],
23
+ [{ x: r.x, y: r.y }, Math.PI],
24
+ ];
25
+ for (const [c, a0] of corners) {
26
+ for (let k = 0; k <= steps; k++) {
27
+ const a = a0 + (k / steps) * (Math.PI / 2);
28
+ out.push({ x: c.x + air * Math.cos(a), y: c.y + air * Math.sin(a) });
29
+ }
30
+ }
31
+ }
32
+ return out;
33
+ }
34
+ /** The smallest-area superellipse `|x/a|^n + |y/b|^n <= 1` about `c` that
35
+ * holds every point. */
36
+ export function fitSuperellipse(points, c, n) {
37
+ let maxDx = 0;
38
+ let maxDy = 0;
39
+ for (const p of points) {
40
+ maxDx = Math.max(maxDx, Math.abs(p.x - c.x));
41
+ maxDy = Math.max(maxDy, Math.abs(p.y - c.y));
42
+ }
43
+ maxDx = Math.max(maxDx, 1);
44
+ maxDy = Math.max(maxDy, 1);
45
+ let best = { a: maxDx * 2, b: maxDy * 2, area: Number.POSITIVE_INFINITY };
46
+ const b0 = maxDy * 1.0005;
47
+ for (let i = 0; i <= 90; i++) {
48
+ const b = b0 * Math.pow(4, i / 90);
49
+ let a = 0;
50
+ for (const p of points) {
51
+ const t = 1 - Math.pow(Math.abs(p.y - c.y) / b, n);
52
+ if (t <= 1e-9) {
53
+ a = Number.POSITIVE_INFINITY;
54
+ break;
55
+ }
56
+ a = Math.max(a, Math.abs(p.x - c.x) / Math.pow(t, 1 / n));
57
+ }
58
+ if (a * b < best.area)
59
+ best = { a, b, area: a * b };
60
+ }
61
+ return { a: best.a, b: best.b };
62
+ }
63
+ /** Points of a superellipse, clockwise on the page from its right end,
64
+ * each pushed out by `wobble(t)` of its radius. */
65
+ function superellipsePoints(c, a, b, n, count, wobble) {
66
+ const out = [];
67
+ for (let i = 0; i < count; i++) {
68
+ const t = (i / count) * Math.PI * 2;
69
+ const ct = Math.cos(t);
70
+ const st = Math.sin(t);
71
+ const k = wobble ? 1 + wobble(t) : 1;
72
+ out.push({
73
+ x: c.x + k * a * Math.sign(ct) * Math.pow(Math.abs(ct), 2 / n),
74
+ y: c.y + k * b * Math.sign(st) * Math.pow(Math.abs(st), 2 / n),
75
+ });
76
+ }
77
+ return out;
78
+ }
79
+ /** A seeded low-frequency wobble: a sum of three sines, `amount` of the
80
+ * radius at most. */
81
+ function wobbleOf(seed, amount) {
82
+ if (!amount)
83
+ return undefined;
84
+ const rnd = seededRandom(hashString(`${seed}#wobble`));
85
+ const waves = [2, 3, 5].map((k) => ({ k, phase: rnd() * Math.PI * 2, amp: (0.5 + rnd() * 0.5) / k }));
86
+ const total = waves.reduce((s, w) => s + w.amp, 0);
87
+ return (t) => (amount * waves.reduce((s, w) => s + w.amp * Math.sin(w.k * t + w.phase), 0)) / total;
88
+ }
89
+ function inkCentre(ink) {
90
+ const b = boundsOf(ink.flatMap((r) => [{ x: r.x, y: r.y }, { x: r.x + r.width, y: r.y + r.height }]));
91
+ return { x: b.x + b.width / 2, y: b.y + b.height / 2 };
92
+ }
93
+ function inkBounds(ink) {
94
+ return boundsOf(ink.flatMap((r) => [{ x: r.x, y: r.y }, { x: r.x + r.width, y: r.y + r.height }]));
95
+ }
96
+ /** The core superellipse of an oval-like body: air all round, `extra` more
97
+ * for the decoration that grows inward (none: decorations grow out). */
98
+ function coreEllipse(p, extra = 0) {
99
+ const n = p.style.roundness ?? 2.2;
100
+ const c = inkCentre(p.ink);
101
+ const { a, b } = fitSuperellipse(airPoints(p.ink, p.style.padding + extra), c, n);
102
+ return { c, a, b, n };
103
+ }
104
+ function finish(cmds, hull, core, em, centre, axes) {
105
+ return { cmds, hull, core, bbox: boundsOf(hull), centre, em, ...(axes ? { axes } : {}) };
106
+ }
107
+ /** Build the body of a balloon around its text's ink (`ink`, page px). */
108
+ export function buildBody(ink, em, style, seed) {
109
+ const p = { ink, em, style, seed };
110
+ switch (style.shape) {
111
+ case 'rectangle':
112
+ case 'rounded':
113
+ case 'none':
114
+ return rectBody(p);
115
+ case 'cloud':
116
+ return cloudBody(p);
117
+ case 'burst':
118
+ return burstBody(p);
119
+ case 'wavy':
120
+ return wavyBody(p);
121
+ case 'electric':
122
+ return electricBody(p);
123
+ default:
124
+ return ovalBody(p);
125
+ }
126
+ }
127
+ function ovalBody(p) {
128
+ const { c, a, b, n } = coreEllipse(p);
129
+ const wob = wobbleOf(p.seed, p.style.wobble ?? 0);
130
+ const pts = superellipsePoints(c, a, b, n, 72, wob);
131
+ return finish(smoothClosedCmds(pts), pts, pts, p.em, c, { a, b });
132
+ }
133
+ function rectBody(p) {
134
+ const ib = inkBounds(p.ink);
135
+ const air = p.style.shape === 'none' ? Math.max(0, p.style.halo ?? 0) : p.style.padding;
136
+ const r = { x: ib.x - air, y: ib.y - air, width: ib.width + 2 * air, height: ib.height + 2 * air };
137
+ const hull = [{ x: r.x, y: r.y }, { x: r.x + r.width, y: r.y }, { x: r.x + r.width, y: r.y + r.height }, { x: r.x, y: r.y + r.height }];
138
+ const centre = { x: r.x + r.width / 2, y: r.y + r.height / 2 };
139
+ if (p.style.shape === 'none')
140
+ return finish([], hull, hull, p.em, centre);
141
+ const radius = p.style.shape === 'rounded' ? (p.style.radius ?? Math.min(0.6 * p.em, r.height / 2)) : 0;
142
+ return finish(roundedRectCmds(r, radius), hull, hull, p.em, centre);
143
+ }
144
+ /** A thought cloud: scallops bulging out of a core superellipse whose
145
+ * valleys keep the air. */
146
+ function cloudBody(p) {
147
+ const { c, a, b, n } = coreEllipse(p);
148
+ const core = superellipsePoints(c, a, b, n, 96);
149
+ const rnd = seededRandom(hashString(`${p.seed}#cloud`));
150
+ const per = perimeter(core);
151
+ const count = Math.max(7, Math.round(per / (1.9 * p.em)));
152
+ const valleys = resampleClosed(core, count, rnd());
153
+ // Jitter the valleys along the outline a little (seeded).
154
+ const jittered = valleys.map((v, i) => {
155
+ const next = valleys[(i + 1) % count];
156
+ return { p: lerp(v.p, next.p, (rnd() - 0.5) * 0.25), n: v.n };
157
+ });
158
+ const cmds = [{ op: 'M', pts: [jittered[0].p] }];
159
+ const hull = [];
160
+ for (let i = 0; i < count; i++) {
161
+ const v0 = jittered[i].p;
162
+ const v1 = jittered[(i + 1) % count].p;
163
+ const chord = dist(v0, v1);
164
+ const mid = lerp(v0, v1, 0.5);
165
+ // Outward: away from the centre, through the chord's middle.
166
+ const out = norm(sub(mid, c));
167
+ const h = chord * (0.36 + rnd() * 0.12);
168
+ const t = norm(sub(v1, v0));
169
+ const c1 = add(add(v0, scale(out, h * 1.25)), scale(t, -chord * 0.06));
170
+ const c2 = add(add(v1, scale(out, h * 1.25)), scale(t, chord * 0.06));
171
+ cmds.push({ op: 'C', pts: [c1, c2, v1] });
172
+ hull.push(v0, add(mid, scale(out, h * 0.95)));
173
+ }
174
+ cmds.push({ op: 'Z', pts: [] });
175
+ return finish(cmds, hull, core, p.em, c, { a, b });
176
+ }
177
+ /** A burst: spikes all pointing away from the centre, of seeded length,
178
+ * between valleys on a core superellipse. */
179
+ function burstBody(p) {
180
+ const { c, a, b, n } = coreEllipse(p);
181
+ const core = superellipsePoints(c, a, b, n, 96);
182
+ const rnd = seededRandom(hashString(`${p.seed}#burst`));
183
+ const per = perimeter(core);
184
+ const count = p.style.burstPoints && p.style.burstPoints >= 5
185
+ ? Math.round(p.style.burstPoints)
186
+ : Math.max(9, Math.min(26, Math.round(per / (2.1 * p.em))));
187
+ // A ratio of the body's size, at most 1.3 em: the spikes of a long shout
188
+ // stay the size of a short one's (they mark the kind; the room they take
189
+ // is the panel's).
190
+ const depth = p.style.burstDepth ?? (p.style.burstDepthRatio ? Math.min(p.style.burstDepthRatio * (a + b) / 2, 1.3 * p.em) : 1.1 * p.em);
191
+ const valleys = resampleClosed(core, count, rnd());
192
+ const pts = [];
193
+ for (let i = 0; i < count; i++) {
194
+ const v0 = valleys[i];
195
+ const v1 = valleys[(i + 1) % count];
196
+ pts.push(v0.p);
197
+ const mid = lerp(v0.p, v1.p, 0.35 + rnd() * 0.3);
198
+ const radial = norm(sub(mid, c));
199
+ const dir = norm(add(radial, scale(norm(add(v0.n, v1.n)), 0.6)));
200
+ pts.push(add(mid, scale(dir, depth * (0.55 + rnd() * 0.9))));
201
+ }
202
+ return { ...finish(polygonCmds(pts), pts, core, p.em, c, { a, b }), star: true };
203
+ }
204
+ /** A wavy (deflated, wobbly) outline: a slow wave on the core. */
205
+ function wavyBody(p) {
206
+ const amp = 0.16 * p.em;
207
+ const { c, a, b, n } = coreEllipse(p);
208
+ const core = superellipsePoints(c, a, b, n, 96);
209
+ const per = perimeter(core);
210
+ const waves = Math.max(6, Math.round(per / (1.7 * p.em)));
211
+ const samples = resampleClosed(core, waves * 8);
212
+ const pts = samples.map((s, i) => add(s.p, scale(s.n, amp * (1 + Math.sin((i / 8) * Math.PI * 2)))));
213
+ return finish(smoothClosedCmds(pts), pts, core, p.em, c, { a, b });
214
+ }
215
+ /** An electric (radio, phone) outline: an even zig-zag on the core. */
216
+ function electricBody(p) {
217
+ const amp = 0.24 * p.em;
218
+ const { c, a, b, n } = coreEllipse(p);
219
+ const core = superellipsePoints(c, a, b, n, 96);
220
+ const per = perimeter(core);
221
+ const count = Math.max(24, 2 * Math.round(per / (0.9 * p.em)));
222
+ const samples = resampleClosed(core, count);
223
+ const pts = samples.map((s, i) => add(s.p, scale(s.n, i % 2 === 0 ? 0 : amp)));
224
+ return finish(polygonCmds(pts), pts, core, p.em, c, { a, b });
225
+ }
226
+ /** A body moved by (dx, dy). */
227
+ export function translateBody(body, dx, dy) {
228
+ const mv = (q) => ({ x: q.x + dx, y: q.y + dy });
229
+ return {
230
+ ...body,
231
+ cmds: translateCmds(body.cmds, dx, dy),
232
+ hull: body.hull.map(mv),
233
+ core: body.core.map(mv),
234
+ bbox: { ...body.bbox, x: body.bbox.x + dx, y: body.bbox.y + dy },
235
+ centre: mv(body.centre),
236
+ };
237
+ }
238
+ /** Where the ray from the body's centre toward `toward` leaves `poly`, and
239
+ * the outward normal there. */
240
+ function exitOf(body, poly, toward) {
241
+ const u = norm(sub(toward, body.centre));
242
+ const t = rayExit(body.centre, u, poly);
243
+ if (t === undefined)
244
+ return undefined;
245
+ const p = add(body.centre, scale(u, t));
246
+ // Normal: from the outline around the exit (a chord of the polygon).
247
+ let best = 0;
248
+ let bestD = Number.POSITIVE_INFINITY;
249
+ for (let i = 0; i < poly.length; i++) {
250
+ const d = dist(poly[i], p);
251
+ if (d < bestD) {
252
+ bestD = d;
253
+ best = i;
254
+ }
255
+ }
256
+ const a = poly[(best - 2 + poly.length) % poly.length];
257
+ const b = poly[(best + 2) % poly.length];
258
+ const e = norm(sub(b, a));
259
+ let n = { x: e.y, y: -e.x };
260
+ if (n.x * u.x + n.y * u.y < 0)
261
+ n = scale(n, -1);
262
+ return { p, n };
263
+ }
264
+ /**
265
+ * The tail of `body` toward `target` (SPEC D3.2): it leaves the body
266
+ * perpendicular to the wall where the line from the centre to the target
267
+ * crosses it, aims at the target, tapers, and stops `tailReach` of the way
268
+ * there (never closer than `tailGap`), or at the border for an off-panel
269
+ * speaker. Undefined when the target is inside the body or too close.
270
+ */
271
+ export function buildTail(body, target, style, opts) {
272
+ const kind = style.tail;
273
+ if (kind === 'none')
274
+ return undefined;
275
+ const ex = exitOf(body, body.core, target);
276
+ if (!ex)
277
+ return undefined;
278
+ const em = body.em;
279
+ const gap = dist(ex.p, target);
280
+ if (dist(body.centre, target) <= dist(body.centre, ex.p) + 0.2 * em)
281
+ return undefined;
282
+ const aim = norm(sub(target, ex.p));
283
+ let len = tailLength(gap, em, style, opts.offPanel === true);
284
+ if (opts.face && !opts.offPanel) {
285
+ // Stop before the face (the target, a mouth, lies inside it).
286
+ const entry = rayEnterRect(ex.p, aim, opts.face);
287
+ if (entry !== undefined)
288
+ len = Math.min(len, entry - 0.35 * em);
289
+ }
290
+ if (len < 0.8 * em)
291
+ len = Math.min(gap, 0.8 * em);
292
+ if (len <= 0.2 * em)
293
+ return undefined;
294
+ const tip = add(ex.p, scale(aim, len));
295
+ if (kind === 'bubbles')
296
+ return bubbleTail(ex, tip, em);
297
+ if (body.star && (kind === 'wedge' || kind === 'curved')) {
298
+ const spiked = spikeTail(body, ex.p, tip, kind, opts.bend ?? 0);
299
+ if (spiked)
300
+ return spiked;
301
+ }
302
+ const inset = 2 * opts.strokeWidth + 0.15 * em;
303
+ const halfBase = Math.max(0.5 * opts.strokeWidth + 1, style.tailWidth / 2);
304
+ if (kind === 'zigzag')
305
+ return zigzagTail(ex, tip, halfBase, inset, em);
306
+ // The centre line: a quadratic from the wall, leaving along the normal,
307
+ // to the tip (straight for a wedge).
308
+ const ctrl = kind === 'wedge'
309
+ ? lerp(ex.p, tip, 0.5)
310
+ : add(add(ex.p, scale(ex.n, Math.min(len * 0.5, 1.6 * em))), scale(perp(aim), (opts.bend ?? 0) * Math.min(len * 0.12, 0.6 * em)));
311
+ const at = (t) => add(add(scale(ex.p, (1 - t) ** 2), scale(ctrl, 2 * t * (1 - t))), scale(tip, t * t));
312
+ const dAt = (t) => norm(add(scale(sub(ctrl, ex.p), 2 * (1 - t)), scale(sub(tip, ctrl), 2 * t)));
313
+ const steps = 10;
314
+ const left = [];
315
+ const right = [];
316
+ for (let i = 0; i < steps; i++) {
317
+ const t = i / steps;
318
+ const c = at(t);
319
+ const side = perp(dAt(t));
320
+ const w = halfBase * Math.pow(1 - t, 0.9);
321
+ left.push(add(c, scale(side, w)));
322
+ right.push(add(c, scale(side, -w)));
323
+ }
324
+ // The base runs into the body along the wall's tangent.
325
+ const tangent = perp(ex.n);
326
+ const inner = sub(ex.p, scale(ex.n, inset));
327
+ const innerL = add(inner, scale(tangent, halfBase));
328
+ const innerR = add(inner, scale(tangent, -halfBase));
329
+ // Orient the sides with the tangent so that the polygon does not twist.
330
+ const flip = (left[0].x - right[0].x) * tangent.x + (left[0].y - right[0].y) * tangent.y < 0;
331
+ const L = flip ? right : left;
332
+ const R = flip ? left : right;
333
+ const cmds = [
334
+ { op: 'M', pts: [innerL] },
335
+ { op: 'L', pts: [L[0]] },
336
+ ...smoothOpenCmds([...L, tip]),
337
+ ...smoothOpenCmds([tip, ...[...R].reverse()]),
338
+ { op: 'L', pts: [innerR] },
339
+ { op: 'Z', pts: [] },
340
+ ];
341
+ return { cmds, tip, base: ex.p };
342
+ }
343
+ /**
344
+ * A burst's tail: the spike the centre→exit ray runs through is drawn out
345
+ * to the tip from its two valleys, and left out of the body. A tail with a
346
+ * base of its own would leave narrow notches between its sides and the
347
+ * spikes beside it, which the doubled outline fills with ink.
348
+ */
349
+ function spikeTail(body, exit, tip, kind, bend) {
350
+ const hull = body.hull;
351
+ const count = Math.floor(hull.length / 2);
352
+ if (count < 3)
353
+ return undefined;
354
+ const u = norm(sub(exit, body.centre));
355
+ // The spike whose valleys straddle the ray (the angle from the ray to
356
+ // the first valley and to the second change sign), the nearest one.
357
+ const cross = (q) => u.x * (q.y - body.centre.y) - u.y * (q.x - body.centre.x);
358
+ const along = (q) => u.x * (q.x - body.centre.x) + u.y * (q.y - body.centre.y);
359
+ let k = -1;
360
+ for (let i = 0; i < count; i++) {
361
+ const v0 = hull[2 * i];
362
+ const v1 = hull[(2 * i + 2) % hull.length];
363
+ if (along(v0) <= 0 && along(v1) <= 0)
364
+ continue;
365
+ if (cross(v0) * cross(v1) <= 0) {
366
+ k = i;
367
+ break;
368
+ }
369
+ }
370
+ if (k < 0)
371
+ return undefined;
372
+ const v0 = hull[2 * k];
373
+ const v1 = hull[(2 * k + 2) % hull.length];
374
+ const len = dist(exit, tip);
375
+ // Curved: both sides bend the same way, as a curved tail does.
376
+ const side = (from) => {
377
+ if (kind === 'wedge')
378
+ return [{ op: 'L', pts: [tip] }];
379
+ const mid = lerp(from, tip, 0.5);
380
+ const ctrl = add(mid, scale(perp(norm(sub(tip, from))), bend * len * 0.12));
381
+ return [{ op: 'C', pts: [lerp(from, ctrl, 2 / 3), lerp(tip, ctrl, 2 / 3), tip] }];
382
+ };
383
+ const back = (to) => {
384
+ if (kind === 'wedge')
385
+ return [{ op: 'L', pts: [to] }];
386
+ const mid = lerp(to, tip, 0.5);
387
+ const ctrl = add(mid, scale(perp(norm(sub(tip, to))), bend * len * 0.12));
388
+ return [{ op: 'C', pts: [lerp(tip, ctrl, 2 / 3), lerp(to, ctrl, 2 / 3), to] }];
389
+ };
390
+ const cmds = [{ op: 'M', pts: [v0] }, ...side(v0), ...back(v1), { op: 'Z', pts: [] }];
391
+ // The body without that spike: valley to valley.
392
+ const outline = hull.filter((_, i) => i !== 2 * k + 1);
393
+ return { cmds, tip, base: lerp(v0, v1, 0.5), body: polygonCmds(outline) };
394
+ }
395
+ /** Distance along the unit ray from `o` to where it enters `r` (0 when
396
+ * `o` is inside), or undefined when it misses. */
397
+ function rayEnterRect(o, u, r) {
398
+ let t0 = 0;
399
+ let t1 = Number.POSITIVE_INFINITY;
400
+ for (const [p, d, lo, hi] of [[o.x, u.x, r.x, r.x + r.width], [o.y, u.y, r.y, r.y + r.height]]) {
401
+ if (Math.abs(d) < 1e-12) {
402
+ if (p < lo || p > hi)
403
+ return undefined;
404
+ continue;
405
+ }
406
+ let a = (lo - p) / d;
407
+ let b = (hi - p) / d;
408
+ if (a > b)
409
+ [a, b] = [b, a];
410
+ t0 = Math.max(t0, a);
411
+ t1 = Math.min(t1, b);
412
+ }
413
+ return t0 <= t1 ? t0 : undefined;
414
+ }
415
+ /**
416
+ * How long a tail runs from the body's wall toward a target `gap` px away:
417
+ * `tailReach` of the way (Blambot's half to three fifths), never closer to
418
+ * the target than `tailGap`, and never stopping farther from it than 2.5
419
+ * em — a balloon set far from its speaker gets a longer tail, so that every
420
+ * tip ends about as near its mouth (Kurlander's tails end together). An
421
+ * off-panel tail runs to the border.
422
+ */
423
+ export function tailLength(gap, em, style, offPanel) {
424
+ if (offPanel)
425
+ return gap;
426
+ const minGap = style.tailGap ?? 0.5 * em;
427
+ const rest = Math.min(Math.max(gap * (1 - (style.tailReach ?? 0.55)), minGap), Math.max(minGap, 2.5 * em));
428
+ return Math.max(0, gap - rest);
429
+ }
430
+ /** A thought tail: three circles shrinking toward the head. */
431
+ function bubbleTail(ex, tip, em) {
432
+ const radii = [0.42 * em, 0.3 * em, 0.2 * em];
433
+ const dir = norm(sub(tip, ex.p));
434
+ const total = dist(ex.p, tip);
435
+ // Gaps between the circles, scaled to the length the tail has.
436
+ const natural = radii[0] + 0.25 * em + 2 * radii[1] + 0.25 * em + radii[2] + 0.25 * em + radii[0] * 0.3;
437
+ const k = Math.max(0.6, Math.min(1.6, total / natural));
438
+ const cmds = [];
439
+ let at = 0.25 * em * k + radii[0];
440
+ let last = ex.p;
441
+ radii.forEach((r, i) => {
442
+ const c = add(ex.p, scale(dir, at));
443
+ cmds.push(...circleCmds(c, r));
444
+ last = c;
445
+ if (i + 1 < radii.length)
446
+ at += r + 0.3 * em * k + radii[i + 1];
447
+ });
448
+ return { cmds, tip: last, base: ex.p };
449
+ }
450
+ /** A lightning tail (radio, phone): a tapered zig-zag. */
451
+ function zigzagTail(ex, tip, halfBase, inset, em) {
452
+ const dir = norm(sub(tip, ex.p));
453
+ const side = perp(dir);
454
+ const len = dist(ex.p, tip);
455
+ const kink = Math.min(0.8 * em, len * 0.22);
456
+ const centre = [
457
+ sub(ex.p, scale(dir, inset)),
458
+ ex.p,
459
+ add(add(ex.p, scale(dir, len * 0.35)), scale(side, kink)),
460
+ add(add(ex.p, scale(dir, len * 0.6)), scale(side, -kink)),
461
+ tip,
462
+ ];
463
+ const widths = [halfBase, halfBase, halfBase * 0.8, halfBase * 0.55, 0];
464
+ const left = [];
465
+ const right = [];
466
+ for (let i = 0; i < centre.length; i++) {
467
+ const a = centre[Math.max(0, i - 1)];
468
+ const b = centre[Math.min(centre.length - 1, i + 1)];
469
+ const s = perp(norm(sub(b, a)));
470
+ left.push(add(centre[i], scale(s, widths[i])));
471
+ right.push(add(centre[i], scale(s, -widths[i])));
472
+ }
473
+ const pts = [...left.slice(0, -1), tip, ...right.slice(0, -1).reverse()];
474
+ return { cmds: polygonCmds(pts), tip, base: ex.p };
475
+ }
476
+ /** A neck joining two bodies of one speaker (a connector, SPEC D3.2): it
477
+ * runs from centre to centre, narrow in the middle, and starts inside
478
+ * both bodies. */
479
+ export function buildNeck(a, b, strokeWidth) {
480
+ const ea = exitOf(a, a.core, b.centre);
481
+ const eb = exitOf(b, b.core, a.centre);
482
+ if (!ea || !eb)
483
+ return [];
484
+ const em = Math.min(a.em, b.em);
485
+ const dir = norm(sub(eb.p, ea.p));
486
+ const side = perp(dir);
487
+ const inset = 2 * strokeWidth + 0.5 * em;
488
+ const pa = sub(ea.p, scale(dir, inset));
489
+ const pb = add(eb.p, scale(dir, inset));
490
+ const wEnd = 0.55 * em;
491
+ const wMid = 0.32 * em;
492
+ const mid = lerp(ea.p, eb.p, 0.5);
493
+ const leftPts = [add(pa, scale(side, wEnd)), add(ea.p, scale(side, wEnd * 0.9)), add(mid, scale(side, wMid)), add(eb.p, scale(side, wEnd * 0.9)), add(pb, scale(side, wEnd))];
494
+ const rightPts = [add(pb, scale(side, -wEnd)), add(eb.p, scale(side, -wEnd * 0.9)), add(mid, scale(side, -wMid)), add(ea.p, scale(side, -wEnd * 0.9)), add(pa, scale(side, -wEnd))];
495
+ return [
496
+ { op: 'M', pts: [leftPts[0]] },
497
+ ...smoothOpenCmds(leftPts),
498
+ { op: 'L', pts: [rightPts[0]] },
499
+ ...smoothOpenCmds(rightPts),
500
+ { op: 'Z', pts: [] },
501
+ ];
502
+ }
503
+ /** The dash pattern of a style, px (absent: solid). */
504
+ export function dashOf(style) {
505
+ if (!style.dash)
506
+ return undefined;
507
+ if (Array.isArray(style.dash))
508
+ return style.dash.length ? [...style.dash] : undefined;
509
+ const w = Math.max(0.5, style.strokeWidth);
510
+ return [3 * w, 2 * w];
511
+ }
512
+ //# sourceMappingURL=shapes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shapes.js","sourceRoot":"","sources":["../../../src/comics/lettering/shapes.ts"],"names":[],"mappings":"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"}