postext 1.45.1 → 1.46.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.
- package/dist/__tests__/composed/layout.test.js +18 -0
- package/dist/__tests__/composed/layout.test.js.map +1 -1
- package/dist/__tests__/design/dottedText.test.d.ts +2 -0
- package/dist/__tests__/design/dottedText.test.d.ts.map +1 -0
- package/dist/__tests__/design/dottedText.test.js +202 -0
- package/dist/__tests__/design/dottedText.test.js.map +1 -0
- package/dist/__tests__/exports.test.js +2 -0
- package/dist/__tests__/exports.test.js.map +1 -1
- package/dist/__tests__/pipeline/flowColumns.test.js +8 -0
- package/dist/__tests__/pipeline/flowColumns.test.js.map +1 -1
- package/dist/__tests__/reshapedTracking.test.js +1 -1
- package/dist/__tests__/reshapedTracking.test.js.map +1 -1
- package/dist/__tests__/trackedLetters.test.js +1 -1
- package/dist/__tests__/trackedLetters.test.js.map +1 -1
- package/dist/__tests__/trackedLigatures.test.js +1 -1
- package/dist/__tests__/trackedLigatures.test.js.map +1 -1
- package/dist/canvas-backend/chip.d.ts.map +1 -1
- package/dist/canvas-backend/chip.js +7 -1
- package/dist/canvas-backend/chip.js.map +1 -1
- package/dist/canvas-backend/headerFooter.d.ts.map +1 -1
- package/dist/canvas-backend/headerFooter.js +10 -4
- package/dist/canvas-backend/headerFooter.js.map +1 -1
- package/dist/canvas-backend/textDots.d.ts +11 -0
- package/dist/canvas-backend/textDots.d.ts.map +1 -0
- package/dist/canvas-backend/textDots.js +36 -0
- package/dist/canvas-backend/textDots.js.map +1 -0
- package/dist/defaults/chipStyles.d.ts.map +1 -1
- package/dist/defaults/chipStyles.js +3 -0
- package/dist/defaults/chipStyles.js.map +1 -1
- package/dist/defaults/headerFooter.d.ts.map +1 -1
- package/dist/defaults/headerFooter.js +2 -0
- package/dist/defaults/headerFooter.js.map +1 -1
- package/dist/design/layout.d.ts +5 -0
- package/dist/design/layout.d.ts.map +1 -1
- package/dist/design/layout.js +54 -0
- package/dist/design/layout.js.map +1 -1
- package/dist/html-backend.d.ts.map +1 -1
- package/dist/html-backend.js +56 -3
- package/dist/html-backend.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/measure/rich.d.ts.map +1 -1
- package/dist/measure/rich.js +1 -0
- package/dist/measure/rich.js.map +1 -1
- package/dist/parse/types.d.ts +5 -0
- package/dist/parse/types.d.ts.map +1 -1
- package/dist/pipeline/calloutLayout.d.ts.map +1 -1
- package/dist/pipeline/calloutLayout.js +6 -2
- package/dist/pipeline/calloutLayout.js.map +1 -1
- package/dist/pipeline/chips.d.ts.map +1 -1
- package/dist/pipeline/chips.js +2 -0
- package/dist/pipeline/chips.js.map +1 -1
- package/dist/pipeline/columnsGroup.d.ts +5 -1
- package/dist/pipeline/columnsGroup.d.ts.map +1 -1
- package/dist/pipeline/columnsGroup.js +4 -3
- package/dist/pipeline/columnsGroup.js.map +1 -1
- package/dist/pipeline/headerFooter.d.ts.map +1 -1
- package/dist/pipeline/headerFooter.js +1 -0
- package/dist/pipeline/headerFooter.js.map +1 -1
- package/dist/textDots.d.ts +67 -0
- package/dist/textDots.d.ts.map +1 -0
- package/dist/textDots.js +393 -0
- package/dist/textDots.js.map +1 -0
- package/dist/types.d.ts +43 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/vdt.d.ts +12 -0
- package/dist/vdt.d.ts.map +1 -1
- package/dist/vdt.js.map +1 -1
- package/package.json +1 -1
package/dist/textDots.js
ADDED
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Letters as rows of dots, for a child to trace (#1017): the dots a text
|
|
3
|
+
* is painted with when its style sets `dotted` (a design text element, a
|
|
4
|
+
* chip style).
|
|
5
|
+
*
|
|
6
|
+
* The browser shapes and draws the text, so a joined script keeps its
|
|
7
|
+
* joins and an Arabic word its forms, and the dots are read off what it
|
|
8
|
+
* drew. The run is painted alone on a small canvas, `RASTER_PITCH` pixels
|
|
9
|
+
* to a dot spacing; the edge of its ink is traced (marching squares, at
|
|
10
|
+
* the half-coverage level); each point of the edge is moved half the
|
|
11
|
+
* stroke's width inward, onto the middle of the stroke; and the dots are
|
|
12
|
+
* laid along each edge at the spacing, the longest edge first, a dot kept
|
|
13
|
+
* only where no dot stands closer than `REJECT` spacings. The two edges of
|
|
14
|
+
* a stroke meet on its middle, so the second one adds nothing: one row of
|
|
15
|
+
* dots per stroke, whatever the weight (the thinnest weight of a face
|
|
16
|
+
* gives the most even rows). An edge too short to carry two dots is a
|
|
17
|
+
* mark of its own (the dot of an i, an accent): one dot at its middle, if
|
|
18
|
+
* that is ink (the eye of a small loop is not).
|
|
19
|
+
*
|
|
20
|
+
* The dots are a function of the run, its font, its tracking, direction
|
|
21
|
+
* and language, and of the spacing: cached under all of them. They are
|
|
22
|
+
* paint, not layout: the run keeps the width it was measured at.
|
|
23
|
+
*/
|
|
24
|
+
import { dimensionToPx } from './units';
|
|
25
|
+
import { fillContextText, measureContextText } from './canvas-backend/contextText';
|
|
26
|
+
/** Raster pixels to a dot spacing. */
|
|
27
|
+
const RASTER_PITCH = 12;
|
|
28
|
+
/** A candidate dot nearer than this many spacings to a dot already laid
|
|
29
|
+
* is dropped. */
|
|
30
|
+
const REJECT = 0.8;
|
|
31
|
+
/** The largest raster, either way, px. */
|
|
32
|
+
const MAX_SIDE = 8192;
|
|
33
|
+
/** Runs kept in the cache. */
|
|
34
|
+
const CACHE_SIZE = 2000;
|
|
35
|
+
const cache = new Map();
|
|
36
|
+
let scratch;
|
|
37
|
+
function scratchCanvas(width, height) {
|
|
38
|
+
if (scratch === undefined) {
|
|
39
|
+
let canvas;
|
|
40
|
+
if (typeof OffscreenCanvas !== 'undefined')
|
|
41
|
+
canvas = new OffscreenCanvas(1, 1);
|
|
42
|
+
else if (typeof document !== 'undefined')
|
|
43
|
+
canvas = document.createElement('canvas');
|
|
44
|
+
const ctx = canvas?.getContext('2d', { willReadFrequently: true });
|
|
45
|
+
// A context that cannot be read back (a test's stub) draws no dots.
|
|
46
|
+
scratch = canvas && ctx && typeof ctx.getImageData === 'function' ? { canvas, ctx } : null;
|
|
47
|
+
}
|
|
48
|
+
if (!scratch)
|
|
49
|
+
return null;
|
|
50
|
+
// Setting the size clears the canvas and resets its state.
|
|
51
|
+
scratch.canvas.width = width;
|
|
52
|
+
scratch.canvas.height = height;
|
|
53
|
+
return scratch.ctx;
|
|
54
|
+
}
|
|
55
|
+
/** Whether the run's font is loaded where it is painted: dots drawn from
|
|
56
|
+
* a fallback face are not kept. */
|
|
57
|
+
function fontReady(font, text) {
|
|
58
|
+
const fonts = globalThis.document?.fonts
|
|
59
|
+
?? globalThis.fonts;
|
|
60
|
+
if (!fonts || typeof fonts.check !== 'function')
|
|
61
|
+
return true;
|
|
62
|
+
try {
|
|
63
|
+
return fonts.check(font, text);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function setUp(ctx, req) {
|
|
70
|
+
ctx.font = req.font;
|
|
71
|
+
ctx.textBaseline = 'alphabetic';
|
|
72
|
+
ctx.textAlign = 'left';
|
|
73
|
+
if ('direction' in ctx)
|
|
74
|
+
ctx.direction = req.rtl ? 'rtl' : 'ltr';
|
|
75
|
+
if ('letterSpacing' in ctx)
|
|
76
|
+
ctx.letterSpacing = `${req.letterSpacingPx ?? 0}px`;
|
|
77
|
+
if ('lang' in ctx && req.lang)
|
|
78
|
+
ctx.lang = req.lang;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* The dots `req.text` is traced with, or `null` where there is no canvas
|
|
82
|
+
* to draw it on (the painter then fills the letters).
|
|
83
|
+
*/
|
|
84
|
+
export function textDots(req) {
|
|
85
|
+
if (!(req.spacingPx > 0) || req.text.trim() === '')
|
|
86
|
+
return { points: new Float32Array(0), width: 0 };
|
|
87
|
+
const key = `${req.font}\u0000${req.letterSpacingPx ?? 0}\u0000${req.rtl ? 1 : 0}\u0000${req.lang ?? ''}\u0000${req.spacingPx}\u0000${req.text}`;
|
|
88
|
+
const hit = cache.get(key);
|
|
89
|
+
if (hit)
|
|
90
|
+
return hit;
|
|
91
|
+
const probe = scratchCanvas(1, 1);
|
|
92
|
+
if (!probe)
|
|
93
|
+
return null;
|
|
94
|
+
setUp(probe, req);
|
|
95
|
+
const m = measureContextText(probe, req.text);
|
|
96
|
+
const ascent = Math.max(m.actualBoundingBoxAscent || 0, m.fontBoundingBoxAscent || 0);
|
|
97
|
+
const descent = Math.max(m.actualBoundingBoxDescent || 0, m.fontBoundingBoxDescent || 0);
|
|
98
|
+
// Ink past the advance on either side, within reason: Skia answers a
|
|
99
|
+
// right-to-left run's left bound with a number of no meaning.
|
|
100
|
+
const reach = (v) => (Number.isFinite(v) && Math.abs(v) <= m.width + ascent + descent ? v : 0);
|
|
101
|
+
const left = Math.min(0, -reach(m.actualBoundingBoxLeft));
|
|
102
|
+
const right = Math.max(m.width, reach(m.actualBoundingBoxRight));
|
|
103
|
+
const pad = req.spacingPx;
|
|
104
|
+
let scale = RASTER_PITCH / req.spacingPx;
|
|
105
|
+
const w0 = right - left + 2 * pad;
|
|
106
|
+
const h0 = ascent + descent + 2 * pad;
|
|
107
|
+
scale = Math.min(scale, MAX_SIDE / w0, MAX_SIDE / h0);
|
|
108
|
+
const W = Math.max(1, Math.ceil(w0 * scale));
|
|
109
|
+
const H = Math.max(1, Math.ceil(h0 * scale));
|
|
110
|
+
const ctx = scratchCanvas(W, H);
|
|
111
|
+
if (!ctx)
|
|
112
|
+
return null;
|
|
113
|
+
setUp(ctx, req);
|
|
114
|
+
ctx.setTransform(scale, 0, 0, scale, 0, 0);
|
|
115
|
+
ctx.fillStyle = '#000';
|
|
116
|
+
const ox = pad - left;
|
|
117
|
+
const oy = pad + ascent;
|
|
118
|
+
fillContextText(ctx, req.text, ox, oy);
|
|
119
|
+
const data = ctx.getImageData(0, 0, W, H).data;
|
|
120
|
+
const alpha = new Float32Array(W * H);
|
|
121
|
+
for (let i = 0; i < W * H; i++)
|
|
122
|
+
alpha[i] = data[i * 4 + 3] / 255;
|
|
123
|
+
const pitch = req.spacingPx * scale;
|
|
124
|
+
const raster = dotsOnRaster(alpha, W, H, pitch);
|
|
125
|
+
const points = new Float32Array(raster.length);
|
|
126
|
+
for (let i = 0; i < raster.length; i += 2) {
|
|
127
|
+
points[i] = raster[i] / scale - ox;
|
|
128
|
+
points[i + 1] = raster[i + 1] / scale - oy;
|
|
129
|
+
}
|
|
130
|
+
const out = { points, width: m.width };
|
|
131
|
+
if (fontReady(req.font, req.text)) {
|
|
132
|
+
if (cache.size >= CACHE_SIZE)
|
|
133
|
+
cache.delete(cache.keys().next().value);
|
|
134
|
+
cache.set(key, out);
|
|
135
|
+
}
|
|
136
|
+
return out;
|
|
137
|
+
}
|
|
138
|
+
/** Forget every run's dots (a face loaded or replaced under a name). */
|
|
139
|
+
export function clearTextDots() {
|
|
140
|
+
cache.clear();
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Dot centres (flat `x, y`, raster px) along the strokes of the ink in
|
|
144
|
+
* `alpha` (coverage 0…1, `W × H`), `pitch` px apart. Exported for tests.
|
|
145
|
+
*/
|
|
146
|
+
export function dotsOnRaster(alpha, W, H, pitch) {
|
|
147
|
+
const at = (x, y) => {
|
|
148
|
+
if (x < 0 || y < 0 || x > W - 1 || y > H - 1)
|
|
149
|
+
return 0;
|
|
150
|
+
const x0 = Math.floor(x);
|
|
151
|
+
const y0 = Math.floor(y);
|
|
152
|
+
const x1 = Math.min(W - 1, x0 + 1);
|
|
153
|
+
const y1 = Math.min(H - 1, y0 + 1);
|
|
154
|
+
const fx = x - x0;
|
|
155
|
+
const fy = y - y0;
|
|
156
|
+
const a = alpha[y0 * W + x0] * (1 - fx) + alpha[y0 * W + x1] * fx;
|
|
157
|
+
const b = alpha[y1 * W + x0] * (1 - fx) + alpha[y1 * W + x1] * fx;
|
|
158
|
+
return a * (1 - fy) + b * fy;
|
|
159
|
+
};
|
|
160
|
+
const contours = traceContours(alpha, W, H, 0.5);
|
|
161
|
+
// Longest first: the main strokes set the rhythm, the marks follow.
|
|
162
|
+
const measured = contours.map((c) => ({ c, length: polylineLength(c) })).sort((a, b) => b.length - a.length);
|
|
163
|
+
const dots = [];
|
|
164
|
+
const cell = pitch;
|
|
165
|
+
const grid = new Map();
|
|
166
|
+
const gridKey = (gx, gy) => gy * 65536 + gx;
|
|
167
|
+
const reject = REJECT * pitch;
|
|
168
|
+
const nearest = (x, y, r) => {
|
|
169
|
+
const gx = Math.floor(x / cell);
|
|
170
|
+
const gy = Math.floor(y / cell);
|
|
171
|
+
for (let dy = -1; dy <= 1; dy++) {
|
|
172
|
+
for (let dx = -1; dx <= 1; dx++) {
|
|
173
|
+
const list = grid.get(gridKey(gx + dx, gy + dy));
|
|
174
|
+
if (!list)
|
|
175
|
+
continue;
|
|
176
|
+
for (let i = 0; i < list.length; i += 2) {
|
|
177
|
+
const ex = list[i] - x;
|
|
178
|
+
const ey = list[i + 1] - y;
|
|
179
|
+
if (ex * ex + ey * ey < r * r)
|
|
180
|
+
return true;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return false;
|
|
185
|
+
};
|
|
186
|
+
const put = (x, y) => {
|
|
187
|
+
dots.push(x, y);
|
|
188
|
+
const k = gridKey(Math.floor(x / cell), Math.floor(y / cell));
|
|
189
|
+
const list = grid.get(k);
|
|
190
|
+
if (list)
|
|
191
|
+
list.push(x, y);
|
|
192
|
+
else
|
|
193
|
+
grid.set(k, [x, y]);
|
|
194
|
+
};
|
|
195
|
+
// How far the ink runs from (x, y) along (nx, ny): the stroke's width
|
|
196
|
+
// there, up to `limit`.
|
|
197
|
+
const depth = (x, y, nx, ny, limit) => {
|
|
198
|
+
let d = 0;
|
|
199
|
+
while (d < limit && at(x + nx * (d + 0.5), y + ny * (d + 0.5)) >= 0.5)
|
|
200
|
+
d += 0.5;
|
|
201
|
+
return d;
|
|
202
|
+
};
|
|
203
|
+
for (const { c, length } of measured) {
|
|
204
|
+
const n = c.length / 2;
|
|
205
|
+
if (length < 2 * pitch) {
|
|
206
|
+
// A mark too small for a row: one dot at its middle, if that is ink.
|
|
207
|
+
let cx = 0;
|
|
208
|
+
let cy = 0;
|
|
209
|
+
for (let i = 0; i < c.length; i += 2) {
|
|
210
|
+
cx += c[i];
|
|
211
|
+
cy += c[i + 1];
|
|
212
|
+
}
|
|
213
|
+
cx /= n;
|
|
214
|
+
cy /= n;
|
|
215
|
+
if (at(cx, cy) >= 0.5 && !nearest(cx, cy, 0.5 * pitch))
|
|
216
|
+
put(cx, cy);
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
const count = Math.max(1, Math.round(length / pitch));
|
|
220
|
+
const step = length / count;
|
|
221
|
+
let target = 0;
|
|
222
|
+
let walked = 0;
|
|
223
|
+
for (let i = 0; i < n && target < length - 1e-6; i++) {
|
|
224
|
+
const ax = c[2 * i];
|
|
225
|
+
const ay = c[2 * i + 1];
|
|
226
|
+
const j = (i + 1) % n;
|
|
227
|
+
const bx = c[2 * j];
|
|
228
|
+
const by = c[2 * j + 1];
|
|
229
|
+
const seg = Math.hypot(bx - ax, by - ay);
|
|
230
|
+
if (seg === 0)
|
|
231
|
+
continue;
|
|
232
|
+
while (target <= walked + seg && target < length - 1e-6) {
|
|
233
|
+
const t = (target - walked) / seg;
|
|
234
|
+
const px = ax + (bx - ax) * t;
|
|
235
|
+
const py = ay + (by - ay) * t;
|
|
236
|
+
// The normal into the ink: either side of the edge.
|
|
237
|
+
let nx = -(by - ay) / seg;
|
|
238
|
+
let ny = (bx - ax) / seg;
|
|
239
|
+
if (at(px + nx, py + ny) < at(px - nx, py - ny)) {
|
|
240
|
+
nx = -nx;
|
|
241
|
+
ny = -ny;
|
|
242
|
+
}
|
|
243
|
+
const d = depth(px, py, nx, ny, 3 * pitch);
|
|
244
|
+
const mx = px + nx * d / 2;
|
|
245
|
+
const my = py + ny * d / 2;
|
|
246
|
+
if (!nearest(mx, my, reject))
|
|
247
|
+
put(mx, my);
|
|
248
|
+
target += step;
|
|
249
|
+
}
|
|
250
|
+
walked += seg;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return dots;
|
|
254
|
+
}
|
|
255
|
+
function polylineLength(c) {
|
|
256
|
+
let length = 0;
|
|
257
|
+
const n = c.length / 2;
|
|
258
|
+
for (let i = 0; i < n; i++) {
|
|
259
|
+
const j = (i + 1) % n;
|
|
260
|
+
length += Math.hypot(c[2 * j] - c[2 * i], c[2 * j + 1] - c[2 * i + 1]);
|
|
261
|
+
}
|
|
262
|
+
return length;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* The closed edges of the ink at coverage `level` (marching squares over
|
|
266
|
+
* the pixel centres, each crossing placed by linear interpolation), as
|
|
267
|
+
* flat `x, y` polylines, the ink on their right (y down). The raster's
|
|
268
|
+
* border is taken as blank, so every edge closes.
|
|
269
|
+
*/
|
|
270
|
+
export function traceContours(alpha, W, H, level) {
|
|
271
|
+
// Cells span pixel centres (x, y) to (x + 1, y + 1), from −1 so that the
|
|
272
|
+
// border closes the edges. An edge point is keyed by the cell edge it
|
|
273
|
+
// crosses: horizontal edges `2 · id`, vertical ones `2 · id + 1`.
|
|
274
|
+
const CW = W + 2;
|
|
275
|
+
const size = 2 * CW * (H + 2);
|
|
276
|
+
const next = new Int32Array(size).fill(-1);
|
|
277
|
+
const px = new Float32Array(size);
|
|
278
|
+
const py = new Float32Array(size);
|
|
279
|
+
const keys = [];
|
|
280
|
+
const v = (x, y) => (x < 0 || y < 0 || x >= W || y >= H ? 0 : alpha[y * W + x]);
|
|
281
|
+
const id = (x, y) => (y + 1) * CW + (x + 1);
|
|
282
|
+
const cross = (key, ax, ay, va, bx, by, vb) => {
|
|
283
|
+
const t = va === vb ? 0.5 : (level - va) / (vb - va);
|
|
284
|
+
px[key] = ax + (bx - ax) * t;
|
|
285
|
+
py[key] = ay + (by - ay) * t;
|
|
286
|
+
return key;
|
|
287
|
+
};
|
|
288
|
+
const link = (from, to) => {
|
|
289
|
+
next[from] = to;
|
|
290
|
+
keys.push(from);
|
|
291
|
+
};
|
|
292
|
+
for (let y = -1; y < H; y++) {
|
|
293
|
+
for (let x = -1; x < W; x++) {
|
|
294
|
+
const a = v(x, y); // top left
|
|
295
|
+
const b = v(x + 1, y); // top right
|
|
296
|
+
const c = v(x + 1, y + 1); // bottom right
|
|
297
|
+
const d = v(x, y + 1); // bottom left
|
|
298
|
+
const code = (a >= level ? 8 : 0) | (b >= level ? 4 : 0) | (c >= level ? 2 : 0) | (d >= level ? 1 : 0);
|
|
299
|
+
if (code === 0 || code === 15)
|
|
300
|
+
continue;
|
|
301
|
+
const top = () => cross(2 * id(x, y), x, y, a, x + 1, y, b);
|
|
302
|
+
const right = () => cross(2 * id(x + 1, y) + 1, x + 1, y, b, x + 1, y + 1, c);
|
|
303
|
+
const bottom = () => cross(2 * id(x, y + 1), x, y + 1, d, x + 1, y + 1, c);
|
|
304
|
+
const left = () => cross(2 * id(x, y) + 1, x, y, a, x, y + 1, d);
|
|
305
|
+
// A saddle: the two corners of ink meet through the middle or not.
|
|
306
|
+
const joined = (a + b + c + d) / 4 >= level;
|
|
307
|
+
switch (code) {
|
|
308
|
+
case 1:
|
|
309
|
+
link(left(), bottom());
|
|
310
|
+
break;
|
|
311
|
+
case 2:
|
|
312
|
+
link(bottom(), right());
|
|
313
|
+
break;
|
|
314
|
+
case 3:
|
|
315
|
+
link(left(), right());
|
|
316
|
+
break;
|
|
317
|
+
case 4:
|
|
318
|
+
link(right(), top());
|
|
319
|
+
break;
|
|
320
|
+
case 5:
|
|
321
|
+
if (joined) {
|
|
322
|
+
link(left(), top());
|
|
323
|
+
link(right(), bottom());
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
link(left(), bottom());
|
|
327
|
+
link(right(), top());
|
|
328
|
+
}
|
|
329
|
+
break;
|
|
330
|
+
case 6:
|
|
331
|
+
link(bottom(), top());
|
|
332
|
+
break;
|
|
333
|
+
case 7:
|
|
334
|
+
link(left(), top());
|
|
335
|
+
break;
|
|
336
|
+
case 8:
|
|
337
|
+
link(top(), left());
|
|
338
|
+
break;
|
|
339
|
+
case 9:
|
|
340
|
+
link(top(), bottom());
|
|
341
|
+
break;
|
|
342
|
+
case 10:
|
|
343
|
+
if (joined) {
|
|
344
|
+
link(top(), right());
|
|
345
|
+
link(bottom(), left());
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
link(top(), left());
|
|
349
|
+
link(bottom(), right());
|
|
350
|
+
}
|
|
351
|
+
break;
|
|
352
|
+
case 11:
|
|
353
|
+
link(top(), right());
|
|
354
|
+
break;
|
|
355
|
+
case 12:
|
|
356
|
+
link(right(), left());
|
|
357
|
+
break;
|
|
358
|
+
case 13:
|
|
359
|
+
link(right(), bottom());
|
|
360
|
+
break;
|
|
361
|
+
case 14:
|
|
362
|
+
link(bottom(), left());
|
|
363
|
+
break;
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
const contours = [];
|
|
368
|
+
for (const start of keys) {
|
|
369
|
+
if (next[start] < 0)
|
|
370
|
+
continue;
|
|
371
|
+
const loop = [];
|
|
372
|
+
let k = start;
|
|
373
|
+
while (k >= 0 && next[k] >= 0) {
|
|
374
|
+
loop.push(px[k], py[k]);
|
|
375
|
+
const n = next[k];
|
|
376
|
+
next[k] = -1;
|
|
377
|
+
k = n;
|
|
378
|
+
}
|
|
379
|
+
if (loop.length >= 6)
|
|
380
|
+
contours.push(loop);
|
|
381
|
+
}
|
|
382
|
+
return contours;
|
|
383
|
+
}
|
|
384
|
+
/** A `TextDotsStyle` in px, em being `fontSizePx`: `0.1em` apart, `0.05em`
|
|
385
|
+
* across by default; a spacing never under the dot. */
|
|
386
|
+
export function resolveTextDots(style, dpi, fontSizePx) {
|
|
387
|
+
const spacing = style.spacing ? dimensionToPx(style.spacing, dpi, fontSizePx) : 0.1 * fontSizePx;
|
|
388
|
+
const size = style.size ? dimensionToPx(style.size, dpi, fontSizePx) : 0.05 * fontSizePx;
|
|
389
|
+
const sizePx = Number.isFinite(size) && size > 0 ? size : 0.05 * fontSizePx;
|
|
390
|
+
const spacingPx = Number.isFinite(spacing) && spacing > 0 ? Math.max(spacing, sizePx) : 0.1 * fontSizePx;
|
|
391
|
+
return { spacingPx, sizePx };
|
|
392
|
+
}
|
|
393
|
+
//# sourceMappingURL=textDots.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textDots.js","sourceRoot":"","sources":["../src/textDots.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -3755,6 +3755,11 @@ export interface ChipStyleConfig {
|
|
|
3755
3755
|
* not stretched by justification). Nothing is added at a line edge or
|
|
3756
3756
|
* against glued punctuation. Default `0.25em`. */
|
|
3757
3757
|
gap?: Dimension;
|
|
3758
|
+
/** Paint the chip's letters as dots to trace (see {@link TextDotsStyle};
|
|
3759
|
+
* em = the chip text). With no fill, no outline and no padding, a chip
|
|
3760
|
+
* is a dotted word in the line: `:chip[gato]{style="dots"}`. Absent:
|
|
3761
|
+
* filled. */
|
|
3762
|
+
dotted?: TextDotsStyle;
|
|
3758
3763
|
}
|
|
3759
3764
|
/**
|
|
3760
3765
|
* A named highlight style, selected by the inline `:mark[text]{style="<id>"}`
|
|
@@ -3828,6 +3833,8 @@ export interface ResolvedChipStyleConfig {
|
|
|
3828
3833
|
bold: boolean;
|
|
3829
3834
|
italic: boolean;
|
|
3830
3835
|
gap: Dimension;
|
|
3836
|
+
/** Unset: the letters are filled. */
|
|
3837
|
+
dotted?: TextDotsStyle;
|
|
3831
3838
|
}
|
|
3832
3839
|
/** Parity constraint for a forced page break.
|
|
3833
3840
|
*
|
|
@@ -6135,6 +6142,33 @@ export interface ElementBoxStyle {
|
|
|
6135
6142
|
* by an ellipsis, or clipped with ink past the box, is reported as a
|
|
6136
6143
|
* `designTextTruncated` content warning. */
|
|
6137
6144
|
export type TextOverflow = 'wrap' | 'ellipsis-start' | 'ellipsis-end' | 'ellipsis-middle' | 'clip';
|
|
6145
|
+
/**
|
|
6146
|
+
* Letters painted as round dots along the middle of their strokes, for a
|
|
6147
|
+
* child to trace (a handwriting workbook, #1017): the text is laid out as
|
|
6148
|
+
* it would be filled (same face, same widths) and only its ink changes.
|
|
6149
|
+
* The dots follow the face as the browser shapes it, so a joined school
|
|
6150
|
+
* script keeps its joins and an Arabic word its forms; a mark too small
|
|
6151
|
+
* for a row (the dot of an i, an accent, a vowel sign) becomes one dot.
|
|
6152
|
+
* Any weight works; the thinnest weight of a face gives the most even
|
|
6153
|
+
* rows. The PDF keeps the text, invisible, under the dots (search, copy,
|
|
6154
|
+
* tagging). The dots take the text colour.
|
|
6155
|
+
*/
|
|
6156
|
+
export interface TextDotsStyle {
|
|
6157
|
+
/** Distance between the centres of two dots along a stroke (em = the
|
|
6158
|
+
* text size). Default `0.1em`. */
|
|
6159
|
+
spacing?: Dimension;
|
|
6160
|
+
/** Diameter of a dot. Default `0.05em`. */
|
|
6161
|
+
size?: Dimension;
|
|
6162
|
+
}
|
|
6163
|
+
/** A design text set again after itself along its line (#1017): a row of
|
|
6164
|
+
* copies of a word to trace, a band of a repeated name. */
|
|
6165
|
+
export interface DesignTextRepeat {
|
|
6166
|
+
/** Room between two copies. Default `1em`. */
|
|
6167
|
+
gap?: Dimension;
|
|
6168
|
+
/** At most this many copies, the first included. Default: as many whole
|
|
6169
|
+
* copies as fit in the element's room. */
|
|
6170
|
+
count?: number;
|
|
6171
|
+
}
|
|
6138
6172
|
/** Outline drawn around the glyphs of a design text (a hollow display
|
|
6139
6173
|
* number, a title that stands off a photograph). */
|
|
6140
6174
|
export interface DesignTextStroke {
|
|
@@ -6266,6 +6300,15 @@ export interface DesignTextElement {
|
|
|
6266
6300
|
inlineMarks?: boolean;
|
|
6267
6301
|
/** Outline drawn around the glyphs (see `DesignTextStroke`). */
|
|
6268
6302
|
stroke?: DesignTextStroke;
|
|
6303
|
+
/** Paint the letters as dots to trace (see {@link TextDotsStyle}).
|
|
6304
|
+
* Absent: filled. Not on a vertical text. */
|
|
6305
|
+
dotted?: TextDotsStyle;
|
|
6306
|
+
/** Set a text of one line again after itself, `gap` apart, as many whole
|
|
6307
|
+
* times as its room holds (or `count`), from the start side of its
|
|
6308
|
+
* direction; the copies are one line, aligned as a whole (see
|
|
6309
|
+
* {@link DesignTextRepeat}). A text that wraps to several lines, a
|
|
6310
|
+
* vertical one or one with a drop cap is set once. */
|
|
6311
|
+
repeat?: DesignTextRepeat;
|
|
6269
6312
|
/** `'vertical-rl'`: the text is set vertically, top to bottom, lines
|
|
6270
6313
|
* right to left, with the characters upright (a running head down the
|
|
6271
6314
|
* fore-edge of a vertical book, a vertical title beside a horizontal
|