manga-renderer 1.0.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 (148) hide show
  1. package/LICENSE +17 -0
  2. package/README.md +118 -0
  3. package/dist/index.d.ts +28 -0
  4. package/dist/index.js +184 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/lib/book/book.d.ts +133 -0
  7. package/dist/lib/book/book.js +329 -0
  8. package/dist/lib/book/book.js.map +1 -0
  9. package/dist/lib/book/envelope.d.ts +26 -0
  10. package/dist/lib/book/envelope.js +158 -0
  11. package/dist/lib/book/envelope.js.map +1 -0
  12. package/dist/lib/book/imagePacking.d.ts +10 -0
  13. package/dist/lib/book/imagePacking.js +213 -0
  14. package/dist/lib/book/imagePacking.js.map +1 -0
  15. package/dist/lib/book/layout.d.ts +41 -0
  16. package/dist/lib/book/layout.js +14 -0
  17. package/dist/lib/book/layout.js.map +1 -0
  18. package/dist/lib/book/notebook.d.ts +72 -0
  19. package/dist/lib/book/notebook.js +30 -0
  20. package/dist/lib/book/notebook.js.map +1 -0
  21. package/dist/lib/book/richChat.d.ts +36 -0
  22. package/dist/lib/book/richChat.js +87 -0
  23. package/dist/lib/book/richChat.js.map +1 -0
  24. package/dist/lib/book/storyboard.d.ts +125 -0
  25. package/dist/lib/book/storyboard.js +44 -0
  26. package/dist/lib/book/storyboard.js.map +1 -0
  27. package/dist/lib/layeredCanvas/dataModels/bubble.d.ts +96 -0
  28. package/dist/lib/layeredCanvas/dataModels/bubble.js +630 -0
  29. package/dist/lib/layeredCanvas/dataModels/bubble.js.map +1 -0
  30. package/dist/lib/layeredCanvas/dataModels/effect.d.ts +25 -0
  31. package/dist/lib/layeredCanvas/dataModels/effect.js +104 -0
  32. package/dist/lib/layeredCanvas/dataModels/effect.js.map +1 -0
  33. package/dist/lib/layeredCanvas/dataModels/film.d.ts +44 -0
  34. package/dist/lib/layeredCanvas/dataModels/film.js +172 -0
  35. package/dist/lib/layeredCanvas/dataModels/film.js.map +1 -0
  36. package/dist/lib/layeredCanvas/dataModels/frameTree.d.ts +99 -0
  37. package/dist/lib/layeredCanvas/dataModels/frameTree.js +861 -0
  38. package/dist/lib/layeredCanvas/dataModels/frameTree.js.map +1 -0
  39. package/dist/lib/layeredCanvas/dataModels/media.d.ts +39 -0
  40. package/dist/lib/layeredCanvas/dataModels/media.js +69 -0
  41. package/dist/lib/layeredCanvas/dataModels/media.js.map +1 -0
  42. package/dist/lib/layeredCanvas/layers/SampleLayer.d.ts +6 -0
  43. package/dist/lib/layeredCanvas/layers/SampleLayer.js +22 -0
  44. package/dist/lib/layeredCanvas/layers/SampleLayer.js.map +1 -0
  45. package/dist/lib/layeredCanvas/layers/arrayLayer.d.ts +49 -0
  46. package/dist/lib/layeredCanvas/layers/arrayLayer.js +364 -0
  47. package/dist/lib/layeredCanvas/layers/arrayLayer.js.map +1 -0
  48. package/dist/lib/layeredCanvas/layers/bubbleLayer.d.ts +97 -0
  49. package/dist/lib/layeredCanvas/layers/bubbleLayer.js +1418 -0
  50. package/dist/lib/layeredCanvas/layers/bubbleLayer.js.map +1 -0
  51. package/dist/lib/layeredCanvas/layers/floorLayer.d.ts +13 -0
  52. package/dist/lib/layeredCanvas/layers/floorLayer.js +64 -0
  53. package/dist/lib/layeredCanvas/layers/floorLayer.js.map +1 -0
  54. package/dist/lib/layeredCanvas/layers/frameLayer.d.ts +106 -0
  55. package/dist/lib/layeredCanvas/layers/frameLayer.js +1283 -0
  56. package/dist/lib/layeredCanvas/layers/frameLayer.js.map +1 -0
  57. package/dist/lib/layeredCanvas/layers/inlinePainterLayer.d.ts +33 -0
  58. package/dist/lib/layeredCanvas/layers/inlinePainterLayer.js +222 -0
  59. package/dist/lib/layeredCanvas/layers/inlinePainterLayer.js.map +1 -0
  60. package/dist/lib/layeredCanvas/layers/paperRendererLayer.d.ts +64 -0
  61. package/dist/lib/layeredCanvas/layers/paperRendererLayer.js +443 -0
  62. package/dist/lib/layeredCanvas/layers/paperRendererLayer.js.map +1 -0
  63. package/dist/lib/layeredCanvas/layers/undoLayer.d.ts +8 -0
  64. package/dist/lib/layeredCanvas/layers/undoLayer.js +24 -0
  65. package/dist/lib/layeredCanvas/layers/undoLayer.js.map +1 -0
  66. package/dist/lib/layeredCanvas/system/keyCache.d.ts +4 -0
  67. package/dist/lib/layeredCanvas/system/keyCache.js +61 -0
  68. package/dist/lib/layeredCanvas/system/keyCache.js.map +1 -0
  69. package/dist/lib/layeredCanvas/system/layeredCanvas.d.ts +172 -0
  70. package/dist/lib/layeredCanvas/system/layeredCanvas.js +597 -0
  71. package/dist/lib/layeredCanvas/system/layeredCanvas.js.map +1 -0
  72. package/dist/lib/layeredCanvas/system/paperArray.d.ts +29 -0
  73. package/dist/lib/layeredCanvas/system/paperArray.js +108 -0
  74. package/dist/lib/layeredCanvas/system/paperArray.js.map +1 -0
  75. package/dist/lib/layeredCanvas/tools/draw/bubbleGraphic.d.ts +7 -0
  76. package/dist/lib/layeredCanvas/tools/draw/bubbleGraphic.js +728 -0
  77. package/dist/lib/layeredCanvas/tools/draw/bubbleGraphic.js.map +1 -0
  78. package/dist/lib/layeredCanvas/tools/draw/clickableIcon.d.ts +42 -0
  79. package/dist/lib/layeredCanvas/tools/draw/clickableIcon.js +129 -0
  80. package/dist/lib/layeredCanvas/tools/draw/clickableIcon.js.map +1 -0
  81. package/dist/lib/layeredCanvas/tools/draw/drawFilmStack.d.ts +4 -0
  82. package/dist/lib/layeredCanvas/tools/draw/drawFilmStack.js +53 -0
  83. package/dist/lib/layeredCanvas/tools/draw/drawFilmStack.js.map +1 -0
  84. package/dist/lib/layeredCanvas/tools/draw/drawText.d.ts +8 -0
  85. package/dist/lib/layeredCanvas/tools/draw/drawText.js +45 -0
  86. package/dist/lib/layeredCanvas/tools/draw/drawText.js.map +1 -0
  87. package/dist/lib/layeredCanvas/tools/draw/richText.d.ts +15 -0
  88. package/dist/lib/layeredCanvas/tools/draw/richText.js +172 -0
  89. package/dist/lib/layeredCanvas/tools/draw/richText.js.map +1 -0
  90. package/dist/lib/layeredCanvas/tools/draw/selectionFrame.d.ts +5 -0
  91. package/dist/lib/layeredCanvas/tools/draw/selectionFrame.js +63 -0
  92. package/dist/lib/layeredCanvas/tools/draw/selectionFrame.js.map +1 -0
  93. package/dist/lib/layeredCanvas/tools/draw/typeSetting.d.ts +16 -0
  94. package/dist/lib/layeredCanvas/tools/draw/typeSetting.js +2 -0
  95. package/dist/lib/layeredCanvas/tools/draw/typeSetting.js.map +1 -0
  96. package/dist/lib/layeredCanvas/tools/draw/verticalText.d.ts +3 -0
  97. package/dist/lib/layeredCanvas/tools/draw/verticalText.js +230 -0
  98. package/dist/lib/layeredCanvas/tools/draw/verticalText.js.map +1 -0
  99. package/dist/lib/layeredCanvas/tools/focusKeeper.d.ts +8 -0
  100. package/dist/lib/layeredCanvas/tools/focusKeeper.js +15 -0
  101. package/dist/lib/layeredCanvas/tools/focusKeeper.js.map +1 -0
  102. package/dist/lib/layeredCanvas/tools/frameExamples.d.ts +382 -0
  103. package/dist/lib/layeredCanvas/tools/frameExamples.js +758 -0
  104. package/dist/lib/layeredCanvas/tools/frameExamples.js.map +1 -0
  105. package/dist/lib/layeredCanvas/tools/geometry/bubbleGeometry.d.ts +12 -0
  106. package/dist/lib/layeredCanvas/tools/geometry/bubbleGeometry.js +117 -0
  107. package/dist/lib/layeredCanvas/tools/geometry/bubbleGeometry.js.map +1 -0
  108. package/dist/lib/layeredCanvas/tools/geometry/convertPoint.d.ts +2 -0
  109. package/dist/lib/layeredCanvas/tools/geometry/convertPoint.js +25 -0
  110. package/dist/lib/layeredCanvas/tools/geometry/convertPoint.js.map +1 -0
  111. package/dist/lib/layeredCanvas/tools/geometry/geometry.d.ts +69 -0
  112. package/dist/lib/layeredCanvas/tools/geometry/geometry.js +408 -0
  113. package/dist/lib/layeredCanvas/tools/geometry/geometry.js.map +1 -0
  114. package/dist/lib/layeredCanvas/tools/geometry/geometry.vitest.d.ts +1 -0
  115. package/dist/lib/layeredCanvas/tools/geometry/geometry.vitest.js +58 -0
  116. package/dist/lib/layeredCanvas/tools/geometry/geometry.vitest.js.map +1 -0
  117. package/dist/lib/layeredCanvas/tools/geometry/quickHull.d.ts +10 -0
  118. package/dist/lib/layeredCanvas/tools/geometry/quickHull.js +91 -0
  119. package/dist/lib/layeredCanvas/tools/geometry/quickHull.js.map +1 -0
  120. package/dist/lib/layeredCanvas/tools/geometry/trapezoid.d.ts +18 -0
  121. package/dist/lib/layeredCanvas/tools/geometry/trapezoid.js +105 -0
  122. package/dist/lib/layeredCanvas/tools/geometry/trapezoid.js.map +1 -0
  123. package/dist/lib/layeredCanvas/tools/grid.d.ts +7 -0
  124. package/dist/lib/layeredCanvas/tools/grid.js +16 -0
  125. package/dist/lib/layeredCanvas/tools/grid.js.map +1 -0
  126. package/dist/lib/layeredCanvas/tools/haiku.d.ts +1 -0
  127. package/dist/lib/layeredCanvas/tools/haiku.js +17 -0
  128. package/dist/lib/layeredCanvas/tools/haiku.js.map +1 -0
  129. package/dist/lib/layeredCanvas/tools/imageUtil.d.ts +8 -0
  130. package/dist/lib/layeredCanvas/tools/imageUtil.js +58 -0
  131. package/dist/lib/layeredCanvas/tools/imageUtil.js.map +1 -0
  132. package/dist/lib/layeredCanvas/tools/kinsoku.d.ts +26 -0
  133. package/dist/lib/layeredCanvas/tools/kinsoku.js +124 -0
  134. package/dist/lib/layeredCanvas/tools/kinsoku.js.map +1 -0
  135. package/dist/lib/layeredCanvas/tools/misc.d.ts +25 -0
  136. package/dist/lib/layeredCanvas/tools/misc.js +46 -0
  137. package/dist/lib/layeredCanvas/tools/misc.js.map +1 -0
  138. package/dist/lib/layeredCanvas/tools/perfectFreehandUtil.d.ts +2 -0
  139. package/dist/lib/layeredCanvas/tools/perfectFreehandUtil.js +21 -0
  140. package/dist/lib/layeredCanvas/tools/perfectFreehandUtil.js.map +1 -0
  141. package/dist/lib/layeredCanvas/tools/pictureControl.d.ts +4 -0
  142. package/dist/lib/layeredCanvas/tools/pictureControl.js +24 -0
  143. package/dist/lib/layeredCanvas/tools/pictureControl.js.map +1 -0
  144. package/dist/lib/layeredCanvas/tools/rectHandle.d.ts +6 -0
  145. package/dist/lib/layeredCanvas/tools/rectHandle.js +17 -0
  146. package/dist/lib/layeredCanvas/tools/rectHandle.js.map +1 -0
  147. package/dist/tsconfig.tsbuildinfo +1 -0
  148. package/package.json +64 -0
@@ -0,0 +1,63 @@
1
+ import { trapezoidPath } from "../geometry/trapezoid";
2
+ import { extendRect, ensureMinRectSize, scale2D } from '../geometry/geometry';
3
+ import paper from 'paper';
4
+ const SHEET_MARGIN = 16;
5
+ export function drawSelectionFrame(ctx, color, trapezoid, nearLineWidth = 7, farLineWidth = 10, drawsCircles = true) {
6
+ ctx.save();
7
+ // まず白で枠を描く
8
+ ctx.strokeStyle = "rgba(255, 255, 255, 0.8)";
9
+ ctx.setLineDash([]);
10
+ ctx.lineWidth = farLineWidth;
11
+ ctx.beginPath();
12
+ trapezoidPath(ctx, trapezoid);
13
+ ctx.stroke();
14
+ // 指定された色で点線を描く
15
+ ctx.strokeStyle = color;
16
+ ctx.lineWidth = nearLineWidth;
17
+ ctx.setLineDash([20, 20]);
18
+ ctx.beginPath();
19
+ trapezoidPath(ctx, trapezoid);
20
+ ctx.stroke();
21
+ ctx.setLineDash([]);
22
+ const drawCircle = (p) => {
23
+ ctx.beginPath();
24
+ ctx.arc(p[0], p[1], farLineWidth, 0, Math.PI * 2);
25
+ ctx.fill();
26
+ ctx.stroke();
27
+ };
28
+ // 四隅に円を書く
29
+ if (drawsCircles) {
30
+ ctx.fillStyle = "rgba(255, 255, 255, 1)";
31
+ drawCircle(trapezoid.topLeft);
32
+ drawCircle(trapezoid.topRight);
33
+ drawCircle(trapezoid.bottomLeft);
34
+ drawCircle(trapezoid.bottomRight);
35
+ }
36
+ ctx.restore();
37
+ }
38
+ export function calculateSheetRect(rect, minSize, ymargin, rscale) {
39
+ const r = extendRect(rect, SHEET_MARGIN * rscale);
40
+ r[1] -= ymargin * rscale;
41
+ r[3] += ymargin * rscale * 2;
42
+ return ensureMinRectSize(scale2D(minSize, rscale), r);
43
+ }
44
+ export function drawSheet(ctx, corners, r, fillStyle) {
45
+ const paperr = new paper.Rectangle(...r);
46
+ const path1 = new paper.Path.Rectangle(paperr, [8, 8]);
47
+ const path2 = new paper.Path();
48
+ const points = [corners.topLeft, corners.topRight, corners.bottomRight, corners.bottomLeft];
49
+ for (let i = 0; i < points.length; i++) {
50
+ const p = points[i];
51
+ if (i === 0) {
52
+ path2.moveTo(p);
53
+ }
54
+ else {
55
+ path2.lineTo(p);
56
+ }
57
+ }
58
+ path2.closed = true;
59
+ const path3 = path1.subtract(path2);
60
+ ctx.fillStyle = fillStyle;
61
+ ctx.fill(new Path2D(path3.pathData));
62
+ }
63
+ //# sourceMappingURL=selectionFrame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectionFrame.js","sourceRoot":"","sources":["../../../../../src/lib/layeredCanvas/tools/draw/selectionFrame.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type RichFragment } from "./richText";
2
+ export interface Rectangle {
3
+ x: number;
4
+ y: number;
5
+ width: number;
6
+ height: number;
7
+ }
8
+ export interface RenderingText {
9
+ height: number;
10
+ width: number;
11
+ verticalLines?: RichFragment[][];
12
+ horizontalLines?: {
13
+ text: string;
14
+ }[];
15
+ }
16
+ export type DrawMethod = "fill" | "stroke";
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=typeSetting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typeSetting.js","sourceRoot":"","sources":["../../../../../src/lib/layeredCanvas/tools/draw/typeSetting.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import type { Rectangle, RenderingText, DrawMethod } from "./typeSetting";
2
+ export declare function drawVerticalText(context: CanvasRenderingContext2D, method: DrawMethod, r: Rectangle, text: string, baselineSkip: number, charSkip: number, rubySize: number, rubyDistance: number, m?: RenderingText, autoNewline?: boolean): void;
3
+ export declare function measureVerticalText(context: CanvasRenderingContext2D, maxHeight: number, text: string, baselineSkip: number, charSkip: number, autoNewline?: boolean): RenderingText;
@@ -0,0 +1,230 @@
1
+ import { kinsokuGenerator, isEmojiAt, leaderChars, trailerChars } from "../kinsoku";
2
+ import { parseMarkdownToJson, richTextIterator } from "./richText";
3
+ export function drawVerticalText(context, method, r, text, baselineSkip, charSkip, rubySize, rubyDistance, m, autoNewline) {
4
+ if (!m) {
5
+ m = measureVerticalText(context, r.height, text, baselineSkip, charSkip, autoNewline);
6
+ }
7
+ let cursorX = r.x + r.width - baselineSkip * 0.5; // center of the text
8
+ for (const line of m.verticalLines) {
9
+ let lineH = 0;
10
+ let prev = null;
11
+ for (const frag of line) {
12
+ let startH, endH;
13
+ ({ lineH, prev, startH, endH } = drawFragment(context, r, cursorX, lineH, charSkip, method, frag, 1, false, prev));
14
+ if (frag.ruby) {
15
+ /*
16
+ context.strokeStyle = "red";
17
+ context.beginPath();
18
+ context.moveTo(cursorX - baselineSkip * 0.5, r.y + startH);
19
+ context.lineTo(cursorX + baselineSkip * 0.5, r.y + startH);
20
+ context.stroke();
21
+ context.strokeStyle = "green";
22
+ context.beginPath();
23
+ context.moveTo(cursorX - baselineSkip * 0.5, r.y + endH);
24
+ context.lineTo(cursorX + baselineSkip * 0.5, r.y + endH);
25
+ context.stroke();
26
+ */
27
+ const region = endH - startH;
28
+ const rubyCharSkip = region / frag.ruby.length;
29
+ const rubyX = cursorX + baselineSkip * rubyDistance;
30
+ const rubyFragment = {
31
+ chars: frag.ruby,
32
+ color: frag.color
33
+ };
34
+ drawFragment(context, r, rubyX, startH, rubyCharSkip, method, rubyFragment, rubySize, true, null);
35
+ }
36
+ }
37
+ cursorX -= baselineSkip;
38
+ }
39
+ }
40
+ function drawLine(context, x, y, w, color) {
41
+ ;
42
+ context.strokeStyle = color;
43
+ context.beginPath();
44
+ context.moveTo(x, y);
45
+ context.lineTo(x + w, y);
46
+ context.stroke();
47
+ }
48
+ function drawFragment(context, r, cursorX, lineH, charSkip, method, frag, charScale, justify, prev) {
49
+ let startH = null;
50
+ let endH = null;
51
+ if (frag.romanHanging) {
52
+ const s = frag.chars.join('');
53
+ const tm = context.measureText(s);
54
+ const cw = tm.width;
55
+ const ch = tm.actualBoundingBoxAscent + tm.actualBoundingBoxDescent;
56
+ const adjustDown = charSkip * 0.15; // 日本語文字の平均的なdescent分のヒューリスティック;
57
+ if (startH === null) {
58
+ startH = lineH;
59
+ }
60
+ endH = lineH + cw;
61
+ context.save();
62
+ context.translate(cursorX - ch * 0.5, r.y + lineH + adjustDown);
63
+ context.rotate(90 * Math.PI / 180);
64
+ context.scale(charScale, charScale);
65
+ if (method === "fill") {
66
+ if (frag.color) {
67
+ context.fillStyle = frag.color;
68
+ }
69
+ context.fillText(s, 0, 0);
70
+ }
71
+ else if (method === "stroke") {
72
+ if (frag.color) {
73
+ context.strokeStyle = frag.color;
74
+ }
75
+ context.strokeText(s, 0, 0);
76
+ }
77
+ context.restore();
78
+ return { lineH: lineH + cw, prev, startH, endH };
79
+ }
80
+ function drawRotatedChar(angle, ax, ay, xscale, yscale, s) {
81
+ const tm = context.measureText(s);
82
+ const cw = tm.width;
83
+ const ch = tm.actualBoundingBoxAscent + tm.actualBoundingBoxDescent;
84
+ if (startH === null) {
85
+ startH = lineH + charSkip - tm.actualBoundingBoxAscent;
86
+ }
87
+ endH = lineH + charSkip + tm.actualBoundingBoxDescent;
88
+ const pivotX = cursorX;
89
+ const pivotY = r.y + lineH + charSkip * 0.5; // 空間の中央
90
+ context.save();
91
+ context.translate(pivotX, pivotY);
92
+ /*
93
+ drawLine(context, -charSkip * 0.5, 0, charSkip, "blue"); // 空間の中心
94
+ drawLine(context, -charSkip * 0.5, charSkip * 0.5, charSkip, "green");
95
+ */
96
+ context.scale(charScale, charScale);
97
+ context.translate(ax * charSkip, ay * charSkip); // オフセット
98
+ context.rotate(angle * Math.PI / 180);
99
+ context.scale(xscale, yscale);
100
+ // フォントAPIは左下から始まるので、文字の中心に合わせるために調整
101
+ context.translate(-cw * 0.5, charSkip * 0.5);
102
+ if (method === "fill") {
103
+ if (frag.color) {
104
+ context.fillStyle = frag.color;
105
+ }
106
+ context.fillText(s, 0, 0);
107
+ }
108
+ else if (method === "stroke") {
109
+ if (frag.color) {
110
+ context.strokeStyle = frag.color;
111
+ }
112
+ context.strokeText(s, 0, 0);
113
+ }
114
+ context.restore();
115
+ }
116
+ function drawChar(ax, ay, s) {
117
+ drawRotatedChar(0, ax, ay, 1, 1, s);
118
+ }
119
+ for (const c of frag.chars) {
120
+ // ヒューリスティック、源暎アンチックを基準にしているが、
121
+ // 源暎エムゴなどでは合わないこともあるので若干緩和している
122
+ lineH += limitedKerning(prev, c) * charSkip;
123
+ switch (true) {
124
+ case /[、。]/.test(c):
125
+ drawChar(0.6, -0.6, c);
126
+ break;
127
+ case /[“]/.test(c):
128
+ drawRotatedChar(0, 0.5, 0.5, -1, 1, "〝");
129
+ break;
130
+ case /[”]/.test(c):
131
+ drawRotatedChar(0, -0.4, -0.4, -1, 1, "〟");
132
+ break;
133
+ case /[ぁぃぅぇぉっゃゅょゎァィゥェォッャュョヵヶ]/.test(c):
134
+ drawChar(0.1, -0.1, c);
135
+ break;
136
+ case /[「『:;]/.test(c):
137
+ drawRotatedChar(90, 0.2, 0.1, 1, 1, c);
138
+ break;
139
+ case /[」』]/.test(c):
140
+ drawRotatedChar(90, 0.1, 0.3, 1, 1, c);
141
+ break;
142
+ case /[<(【〔≪{]/.test(c):
143
+ drawRotatedChar(90, 0.15, 0.15, 1, 1, c);
144
+ break;
145
+ case /[>)】〕≫}]/.test(c):
146
+ drawRotatedChar(90, 0.15, 0.15, 1, 1, c);
147
+ break;
148
+ case /[ー…―〰]/.test(c):
149
+ drawRotatedChar(90, -0.1, 0.1, 1, -1, c);
150
+ break;
151
+ case /[~]/.test(c):
152
+ drawRotatedChar(90, 0.1, 0.1, 1, 1, c);
153
+ break;
154
+ case isEmojiAt(c, 0):
155
+ drawChar(0, 0, c);
156
+ break;
157
+ default:
158
+ drawChar(0, 0, c);
159
+ break;
160
+ }
161
+ lineH += charSkip;
162
+ prev = c;
163
+ }
164
+ return { lineH, prev, startH: startH, endH: endH };
165
+ }
166
+ export function measureVerticalText(context, maxHeight, text, baselineSkip, charSkip, autoNewline) {
167
+ if (!autoNewline) {
168
+ maxHeight = Infinity;
169
+ }
170
+ function calcHeight(ca) {
171
+ let h = 0;
172
+ let prev = null;
173
+ for (const frag of ca) {
174
+ if (frag.romanHanging) {
175
+ const m = context.measureText(frag.chars.join(''));
176
+ h += m.width;
177
+ }
178
+ else {
179
+ for (const c of frag.chars) {
180
+ h += limitedKerning(prev, c);
181
+ h += charSkip;
182
+ prev = c;
183
+ }
184
+ }
185
+ }
186
+ return h;
187
+ }
188
+ const textLines = text.split('\n');
189
+ const a = [];
190
+ for (const line of textLines) {
191
+ const segments = parseMarkdownToJson(line);
192
+ const richIterator = richTextIterator(segments);
193
+ const iterator = kinsokuGenerator((s) => {
194
+ const h = calcHeight(s);
195
+ return { size: h, wrap: maxHeight < h };
196
+ }, maxHeight, richIterator, 0, (c) => c.chars.length == 1 && leaderChars.has(c.chars[0]), (c) => c.chars.length == 1 && trailerChars.has(c.chars[0]));
197
+ for (const result of iterator) {
198
+ a.push({ size: result.size, text: result.buffer });
199
+ }
200
+ }
201
+ return {
202
+ height: a.reduce((max, item) => Math.max(max, item.size), 0),
203
+ width: baselineSkip * a.length,
204
+ verticalLines: a.map(item => item.text)
205
+ };
206
+ }
207
+ function limitedKerning(c0, c1) {
208
+ if (!c0) {
209
+ if (/[「『(【〔“]/.test(c1)) {
210
+ return -0.3;
211
+ }
212
+ return 0;
213
+ }
214
+ if (/[、。」』)】〕”]/.test(c0)) {
215
+ if (/[「『(【〔“]/.test(c1)) {
216
+ return -0.5;
217
+ }
218
+ else if (/[、。]/.test(c1)) {
219
+ return -0.5;
220
+ }
221
+ return -0.4;
222
+ }
223
+ else {
224
+ if (/[「『(【〔“]/.test(c1)) {
225
+ return -0.4;
226
+ }
227
+ }
228
+ return 0;
229
+ }
230
+ //# sourceMappingURL=verticalText.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verticalText.js","sourceRoot":"","sources":["../../../../../src/lib/layeredCanvas/tools/draw/verticalText.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Layer } from "../system/layeredCanvas";
2
+ export declare class FocusKeeper {
3
+ subscribers: ((layer: Layer | null) => void)[];
4
+ constructor();
5
+ subscribe(f: (layer: Layer | null) => void): void;
6
+ unsubscribe(f: (layer: Layer) => void): void;
7
+ setFocus(layer: Layer | null): void;
8
+ }
@@ -0,0 +1,15 @@
1
+ export class FocusKeeper {
2
+ subscribers = [];
3
+ constructor() {
4
+ }
5
+ subscribe(f) {
6
+ this.subscribers.push(f);
7
+ }
8
+ unsubscribe(f) {
9
+ this.subscribers = this.subscribers.filter((s) => s !== f);
10
+ }
11
+ setFocus(layer) {
12
+ this.subscribers.forEach((s) => s(layer));
13
+ }
14
+ }
15
+ //# sourceMappingURL=focusKeeper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focusKeeper.js","sourceRoot":"","sources":["../../../../src/lib/layeredCanvas/tools/focusKeeper.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,WAAW;IACtB,WAAW,GAAsC,EAAE,CAAC;IAEpD;IAEA,CAAC;IAED,SAAS,CAAC,CAAgC;QACxC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED,WAAW,CAAC,CAAyB;QACnC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,QAAQ,CAAC,KAAmB;QAC1B,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5C,CAAC;CACF"}