postext 1.35.0 → 1.36.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 (158) hide show
  1. package/dist/__bench__/composedPage.bench.test.d.ts +2 -0
  2. package/dist/__bench__/composedPage.bench.test.d.ts.map +1 -0
  3. package/dist/__bench__/composedPage.bench.test.js +95 -0
  4. package/dist/__bench__/composedPage.bench.test.js.map +1 -0
  5. package/dist/__tests__/composed/fit.test.d.ts +2 -0
  6. package/dist/__tests__/composed/fit.test.d.ts.map +1 -0
  7. package/dist/__tests__/composed/fit.test.js +405 -0
  8. package/dist/__tests__/composed/fit.test.js.map +1 -0
  9. package/dist/__tests__/composed/layout.test.js +2 -1
  10. package/dist/__tests__/composed/layout.test.js.map +1 -1
  11. package/dist/__tests__/composed/pageMemo.test.d.ts +2 -0
  12. package/dist/__tests__/composed/pageMemo.test.d.ts.map +1 -0
  13. package/dist/__tests__/composed/pageMemo.test.js +128 -0
  14. package/dist/__tests__/composed/pageMemo.test.js.map +1 -0
  15. package/dist/__tests__/composed/sourceMap.test.d.ts +2 -0
  16. package/dist/__tests__/composed/sourceMap.test.d.ts.map +1 -0
  17. package/dist/__tests__/composed/sourceMap.test.js +369 -0
  18. package/dist/__tests__/composed/sourceMap.test.js.map +1 -0
  19. package/dist/__tests__/composed/templateFrameRects.test.d.ts +2 -0
  20. package/dist/__tests__/composed/templateFrameRects.test.d.ts.map +1 -0
  21. package/dist/__tests__/composed/templateFrameRects.test.js +37 -0
  22. package/dist/__tests__/composed/templateFrameRects.test.js.map +1 -0
  23. package/dist/__tests__/design/imageAltText.test.js +2 -1
  24. package/dist/__tests__/design/imageAltText.test.js.map +1 -1
  25. package/dist/__tests__/exports.test.js +22 -0
  26. package/dist/__tests__/exports.test.js.map +1 -1
  27. package/dist/__tests__/pipeline/contourWrap.test.d.ts +2 -0
  28. package/dist/__tests__/pipeline/contourWrap.test.d.ts.map +1 -0
  29. package/dist/__tests__/pipeline/contourWrap.test.js +412 -0
  30. package/dist/__tests__/pipeline/contourWrap.test.js.map +1 -0
  31. package/dist/__tests__/toc.test.js +3 -2
  32. package/dist/__tests__/toc.test.js.map +1 -1
  33. package/dist/bundle/codec.d.ts +16 -0
  34. package/dist/bundle/codec.d.ts.map +1 -1
  35. package/dist/bundle/codec.js +44 -2
  36. package/dist/bundle/codec.js.map +1 -1
  37. package/dist/bundle/index.d.ts +1 -1
  38. package/dist/bundle/index.d.ts.map +1 -1
  39. package/dist/bundle/index.js +1 -1
  40. package/dist/bundle/index.js.map +1 -1
  41. package/dist/canvas-backend/composed.d.ts.map +1 -1
  42. package/dist/canvas-backend/composed.js +5 -2
  43. package/dist/canvas-backend/composed.js.map +1 -1
  44. package/dist/composed/contour.d.ts +21 -0
  45. package/dist/composed/contour.d.ts.map +1 -0
  46. package/dist/composed/contour.js +34 -0
  47. package/dist/composed/contour.js.map +1 -0
  48. package/dist/composed/geometry.d.ts +8 -0
  49. package/dist/composed/geometry.d.ts.map +1 -1
  50. package/dist/composed/geometry.js +26 -0
  51. package/dist/composed/geometry.js.map +1 -1
  52. package/dist/composed/ids.d.ts +22 -0
  53. package/dist/composed/ids.d.ts.map +1 -0
  54. package/dist/composed/ids.js +32 -0
  55. package/dist/composed/ids.js.map +1 -0
  56. package/dist/composed/pageMemo.d.ts +72 -0
  57. package/dist/composed/pageMemo.d.ts.map +1 -0
  58. package/dist/composed/pageMemo.js +287 -0
  59. package/dist/composed/pageMemo.js.map +1 -0
  60. package/dist/composed/paint.d.ts +21 -7
  61. package/dist/composed/paint.d.ts.map +1 -1
  62. package/dist/composed/paint.js +33 -5
  63. package/dist/composed/paint.js.map +1 -1
  64. package/dist/composed/reflowLog.d.ts +11 -1
  65. package/dist/composed/reflowLog.d.ts.map +1 -1
  66. package/dist/composed/reflowLog.js +45 -2
  67. package/dist/composed/reflowLog.js.map +1 -1
  68. package/dist/composed/slotChecks.d.ts.map +1 -1
  69. package/dist/composed/slotChecks.js +3 -1
  70. package/dist/composed/slotChecks.js.map +1 -1
  71. package/dist/composed/sourceMap.d.ts +118 -0
  72. package/dist/composed/sourceMap.d.ts.map +1 -0
  73. package/dist/composed/sourceMap.js +668 -0
  74. package/dist/composed/sourceMap.js.map +1 -0
  75. package/dist/composed/spread.d.ts.map +1 -1
  76. package/dist/composed/spread.js +10 -11
  77. package/dist/composed/spread.js.map +1 -1
  78. package/dist/composed/templates.d.ts +1 -0
  79. package/dist/composed/templates.d.ts.map +1 -1
  80. package/dist/composed/templates.js +4 -0
  81. package/dist/composed/templates.js.map +1 -1
  82. package/dist/composed/types.d.ts +15 -32
  83. package/dist/composed/types.d.ts.map +1 -1
  84. package/dist/composed/validate.d.ts.map +1 -1
  85. package/dist/composed/validate.js +3 -2
  86. package/dist/composed/validate.js.map +1 -1
  87. package/dist/composed/wrap.d.ts.map +1 -1
  88. package/dist/composed/wrap.js +7 -1
  89. package/dist/composed/wrap.js.map +1 -1
  90. package/dist/contour/index.d.ts +134 -0
  91. package/dist/contour/index.d.ts.map +1 -0
  92. package/dist/contour/index.js +354 -0
  93. package/dist/contour/index.js.map +1 -0
  94. package/dist/contour/png.d.ts +16 -0
  95. package/dist/contour/png.d.ts.map +1 -0
  96. package/dist/contour/png.js +173 -0
  97. package/dist/contour/png.js.map +1 -0
  98. package/dist/html-backend.js +2 -2
  99. package/dist/html-backend.js.map +1 -1
  100. package/dist/index.d.ts +12 -5
  101. package/dist/index.d.ts.map +1 -1
  102. package/dist/index.js +13 -3
  103. package/dist/index.js.map +1 -1
  104. package/dist/measure/rich.d.ts.map +1 -1
  105. package/dist/measure/rich.js +2 -0
  106. package/dist/measure/rich.js.map +1 -1
  107. package/dist/parse/blockParser.d.ts.map +1 -1
  108. package/dist/parse/blockParser.js +44 -3
  109. package/dist/parse/blockParser.js.map +1 -1
  110. package/dist/parse/types.d.ts +20 -0
  111. package/dist/parse/types.d.ts.map +1 -1
  112. package/dist/pipeline/build.d.ts.map +1 -1
  113. package/dist/pipeline/build.js +108 -8
  114. package/dist/pipeline/build.js.map +1 -1
  115. package/dist/pipeline/buildMeasurement.d.ts +7 -2
  116. package/dist/pipeline/buildMeasurement.d.ts.map +1 -1
  117. package/dist/pipeline/buildMeasurement.js +10 -5
  118. package/dist/pipeline/buildMeasurement.js.map +1 -1
  119. package/dist/pipeline/calloutLayout.d.ts +20 -14
  120. package/dist/pipeline/calloutLayout.d.ts.map +1 -1
  121. package/dist/pipeline/calloutLayout.js +20 -2
  122. package/dist/pipeline/calloutLayout.js.map +1 -1
  123. package/dist/pipeline/composedLayout.d.ts +36 -5
  124. package/dist/pipeline/composedLayout.d.ts.map +1 -1
  125. package/dist/pipeline/composedLayout.js +553 -68
  126. package/dist/pipeline/composedLayout.js.map +1 -1
  127. package/dist/pipeline/contentWarnings.d.ts.map +1 -1
  128. package/dist/pipeline/contentWarnings.js +13 -4
  129. package/dist/pipeline/contentWarnings.js.map +1 -1
  130. package/dist/pipeline/floatPlacement.d.ts +2 -0
  131. package/dist/pipeline/floatPlacement.d.ts.map +1 -1
  132. package/dist/pipeline/floatPlacement.js +1 -0
  133. package/dist/pipeline/floatPlacement.js.map +1 -1
  134. package/dist/pipeline/frameLayout.d.ts +3 -3
  135. package/dist/pipeline/frameLayout.d.ts.map +1 -1
  136. package/dist/pipeline/headerFooter.d.ts +9 -0
  137. package/dist/pipeline/headerFooter.d.ts.map +1 -1
  138. package/dist/pipeline/headerFooter.js +56 -4
  139. package/dist/pipeline/headerFooter.js.map +1 -1
  140. package/dist/pipeline/measureContentBlock.d.ts.map +1 -1
  141. package/dist/pipeline/measureContentBlock.js +1 -0
  142. package/dist/pipeline/measureContentBlock.js.map +1 -1
  143. package/dist/pipeline/outline.d.ts.map +1 -1
  144. package/dist/pipeline/outline.js +2 -0
  145. package/dist/pipeline/outline.js.map +1 -1
  146. package/dist/pipeline/textWrap.d.ts +4 -1
  147. package/dist/pipeline/textWrap.d.ts.map +1 -1
  148. package/dist/pipeline/textWrap.js +17 -3
  149. package/dist/pipeline/textWrap.js.map +1 -1
  150. package/dist/pipeline/toc.d.ts.map +1 -1
  151. package/dist/pipeline/toc.js +1 -0
  152. package/dist/pipeline/toc.js.map +1 -1
  153. package/dist/types.d.ts +64 -2
  154. package/dist/types.d.ts.map +1 -1
  155. package/dist/vdt.d.ts +155 -11
  156. package/dist/vdt.d.ts.map +1 -1
  157. package/dist/vdt.js.map +1 -1
  158. package/package.json +1 -1
@@ -0,0 +1,354 @@
1
+ import { decodePngAlpha, isPng } from './png';
2
+ export { decodePngAlpha, isPng } from './png';
3
+ /** `ResourceContour.threshold` when unset. */
4
+ export const DEFAULT_CONTOUR_THRESHOLD = 0.5;
5
+ /** The most rows a picture is cut into. */
6
+ export const MAX_CONTOUR_ROWS = 256;
7
+ /** The threshold a contour reads its alpha channel at, 0 to 1. */
8
+ export function contourThreshold(contour) {
9
+ const t = contour?.threshold;
10
+ return typeof t === 'number' && Number.isFinite(t) ? Math.min(1, Math.max(0, t)) : DEFAULT_CONTOUR_THRESHOLD;
11
+ }
12
+ /** Whether the contour's polygon can be used: three points or more, all
13
+ * finite. */
14
+ export function contourPolygon(contour) {
15
+ const pts = contour?.points;
16
+ if (!Array.isArray(pts) || pts.length < 3)
17
+ return undefined;
18
+ return pts.every((p) => p && Number.isFinite(p.x) && Number.isFinite(p.y)) ? pts : undefined;
19
+ }
20
+ /** Whether a resource's shape is read from its alpha channel: a bitmap
21
+ * with no polygon whose contour does not turn the alpha channel off. */
22
+ export function contourWantsAlpha(resource) {
23
+ return resource.kind === 'bitmap' && !contourPolygon(resource.contour) && resource.contour?.alpha !== false;
24
+ }
25
+ const round4 = (n) => Math.round(n * 10000) / 10000;
26
+ /**
27
+ * Trace an alpha raster at `threshold` (0 to 1): the picture is cut into
28
+ * at most {@link MAX_CONTOUR_ROWS} rows, and each row keeps the leftmost
29
+ * and rightmost edge of the pixels at least that opaque.
30
+ */
31
+ export function traceAlpha(raster, threshold, fileId) {
32
+ const { width, height, alpha } = raster;
33
+ const rows = Math.max(1, Math.min(height, MAX_CONTOUR_ROWS));
34
+ // A pixel belongs to the shape from this opacity on (at least 1: a fully
35
+ // transparent pixel never does).
36
+ const min = Math.max(1, Math.ceil(threshold * 255));
37
+ const spans = [];
38
+ for (let r = 0; r < rows; r++) {
39
+ const y0 = Math.floor((r * height) / rows);
40
+ const y1 = Math.max(y0 + 1, Math.floor(((r + 1) * height) / rows));
41
+ let lo = width;
42
+ let hi = -1;
43
+ for (let y = y0; y < y1; y++) {
44
+ const row = y * width;
45
+ for (let x = 0; x < lo; x++) {
46
+ if (alpha[row + x] >= min) {
47
+ lo = x;
48
+ break;
49
+ }
50
+ }
51
+ for (let x = width - 1; x > hi; x--) {
52
+ if (alpha[row + x] >= min) {
53
+ hi = x;
54
+ break;
55
+ }
56
+ }
57
+ }
58
+ if (hi < lo)
59
+ spans.push(-1, -1);
60
+ else
61
+ spans.push(round4(lo / width), round4((hi + 1) / width));
62
+ }
63
+ return { fileId, threshold, rows, spans };
64
+ }
65
+ /** The alpha raster of RGBA pixels; `null` when every pixel is opaque. */
66
+ export function alphaOfRgba(pixels) {
67
+ const { width, height, data } = pixels;
68
+ const alpha = new Uint8Array(width * height);
69
+ let any = false;
70
+ for (let i = 0; i < alpha.length; i++) {
71
+ const a = data[i * 4 + 3];
72
+ alpha[i] = a;
73
+ if (a < 255)
74
+ any = true;
75
+ }
76
+ return any ? { width, height, alpha } : null;
77
+ }
78
+ /** The pixel rows the browser decoder reads at most (a large picture is
79
+ * traced from a smaller copy: rows are cut at 256 anyway). */
80
+ const DECODE_MAX = 1024;
81
+ async function decodeInBrowser(bytes, mime) {
82
+ const g = globalThis;
83
+ if (!g.createImageBitmap || !g.OffscreenCanvas || typeof Blob === 'undefined')
84
+ return undefined;
85
+ try {
86
+ const bitmap = await g.createImageBitmap(new Blob([bytes], { type: mime }));
87
+ const scale = Math.min(1, DECODE_MAX / Math.max(bitmap.width, bitmap.height));
88
+ const w = Math.max(1, Math.round(bitmap.width * scale));
89
+ const h = Math.max(1, Math.round(bitmap.height * scale));
90
+ const ctx = new g.OffscreenCanvas(w, h).getContext('2d');
91
+ if (!ctx)
92
+ return undefined;
93
+ ctx.drawImage(bitmap, 0, 0, w, h);
94
+ bitmap.close?.();
95
+ return ctx.getImageData(0, 0, w, h);
96
+ }
97
+ catch {
98
+ return undefined;
99
+ }
100
+ }
101
+ /**
102
+ * Trace the alpha channel of a bitmap resource from its file's bytes, for
103
+ * `contour.traced` (#883). A PNG is read here, in any host; another format
104
+ * goes through `options.decode` (by default the browser's decoder, where
105
+ * there is one). `null`: the picture has no transparency (a JPEG, an
106
+ * opaque PNG): it has no shape and runs round its box. `undefined`: the
107
+ * resource asks for no alpha contour, or the file cannot be read here.
108
+ */
109
+ export async function traceResourceContour(resource, bytes, mime, options = {}) {
110
+ if (!contourWantsAlpha(resource) || !resource.bitmap)
111
+ return undefined;
112
+ const fileId = resource.bitmap.fileId;
113
+ const threshold = contourThreshold(resource.contour);
114
+ const u8 = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);
115
+ if (isPng(u8)) {
116
+ const raster = decodePngAlpha(u8);
117
+ if (raster)
118
+ return traceAlpha(raster, threshold, fileId);
119
+ if (raster === null)
120
+ return null;
121
+ }
122
+ if (/jpe?g/i.test(mime))
123
+ return null;
124
+ const pixels = await (options.decode ?? decodeInBrowser)(u8, mime);
125
+ if (!pixels)
126
+ return undefined;
127
+ const raster = alphaOfRgba(pixels);
128
+ return raster ? traceAlpha(raster, threshold, fileId) : null;
129
+ }
130
+ /** The resource with `contour.traced` set to `trace` (or cleared). */
131
+ export function withContourTrace(resource, trace) {
132
+ const { traced: _old, ...rest } = resource.contour ?? {};
133
+ void _old;
134
+ return { ...resource, contour: trace ? { ...rest, traced: trace } : rest };
135
+ }
136
+ /** Whether a trace was made from the resource's file at its threshold. */
137
+ function traceFits(resource, trace) {
138
+ if (!trace || !resource.bitmap || trace.fileId !== resource.bitmap.fileId)
139
+ return false;
140
+ if (Math.abs(trace.threshold - contourThreshold(resource.contour)) > 1e-6)
141
+ return false;
142
+ return Number.isInteger(trace.rows) && trace.rows > 0 && Array.isArray(trace.spans) && trace.spans.length === trace.rows * 2;
143
+ }
144
+ const polygonCache = new WeakMap();
145
+ /** A polygon (fractions of the picture) as rows: per row the extent of the
146
+ * polygon's intersection with it. */
147
+ export function polygonRows(points, rows = MAX_CONTOUR_ROWS) {
148
+ const cached = rows === MAX_CONTOUR_ROWS ? polygonCache.get(points) : undefined;
149
+ if (cached)
150
+ return cached;
151
+ const spans = [];
152
+ const n = points.length;
153
+ for (let r = 0; r < rows; r++) {
154
+ const y0 = r / rows;
155
+ const y1 = (r + 1) / rows;
156
+ let lo = Infinity;
157
+ let hi = -Infinity;
158
+ // The band's intersection with the polygon is bounded across by the
159
+ // edges clipped to the band (a vertex inside it included).
160
+ for (let i = 0; i < n; i++) {
161
+ const a = points[i];
162
+ const b = points[(i + 1) % n];
163
+ const top = Math.min(a.y, b.y);
164
+ const bottom = Math.max(a.y, b.y);
165
+ if (bottom < y0 || top > y1)
166
+ continue;
167
+ const xs = [];
168
+ if (Math.abs(b.y - a.y) < 1e-12) {
169
+ xs.push(a.x, b.x);
170
+ }
171
+ else {
172
+ const at = (y) => a.x + ((b.x - a.x) * (y - a.y)) / (b.y - a.y);
173
+ xs.push(at(Math.max(top, y0)), at(Math.min(bottom, y1)));
174
+ }
175
+ for (const x of xs) {
176
+ if (x < lo)
177
+ lo = x;
178
+ if (x > hi)
179
+ hi = x;
180
+ }
181
+ }
182
+ if (hi < lo)
183
+ spans.push(-1, -1);
184
+ else
185
+ spans.push(round4(Math.max(0, Math.min(1, lo))), round4(Math.max(0, Math.min(1, hi))));
186
+ }
187
+ const out = { rows, spans };
188
+ if (rows === MAX_CONTOUR_ROWS)
189
+ polygonCache.set(points, out);
190
+ return out;
191
+ }
192
+ /**
193
+ * The shape of a resource in rows, when it has one: its polygon, else the
194
+ * alpha channel its host traced (a trace of this file at this threshold).
195
+ * `undefined`: no shape is known (an SVG with no polygon, a bitmap whose
196
+ * alpha channel was not traced, or has no transparency).
197
+ */
198
+ export function contourRowsOf(resource) {
199
+ const poly = contourPolygon(resource.contour);
200
+ if (poly)
201
+ return polygonRows(poly);
202
+ if (!contourWantsAlpha(resource))
203
+ return undefined;
204
+ const trace = resource.contour?.traced;
205
+ return traceFits(resource, trace) ? trace : undefined;
206
+ }
207
+ /**
208
+ * The shape of a picture set on the page as `rb` (its body at
209
+ * `rb.bodyRect` from the block's origin, showing `rb.bodySource` of the
210
+ * picture: the crop within its safe area), in page px: the shape's rows
211
+ * inside the crop, scaled to the body; and `box` (page px), the rest of
212
+ * the figure (its caption and note under the picture) as bands of its own
213
+ * width. `undefined` when the resource
214
+ * has no known shape.
215
+ */
216
+ export function contourOnPage(resource, rb, box, options) {
217
+ const shape = contourRowsOf(resource);
218
+ if (!shape)
219
+ return undefined;
220
+ const body = { x: rb.bodyRect.x + (options.originX ?? 0), y: rb.bodyRect.y + (options.originY ?? 0), width: rb.bodyRect.width, height: rb.bodyRect.height };
221
+ if (!(body.width > 0) || !(body.height > 0))
222
+ return undefined;
223
+ const crop = rb.bodySource ?? { x: 0, y: 0, width: 1, height: 1 };
224
+ if (!(crop.width > 0) || !(crop.height > 0))
225
+ return undefined;
226
+ const spans = [];
227
+ const push = (s) => {
228
+ const last = spans[spans.length - 1];
229
+ if (last && Math.abs(last.left - s.left) < 0.01 && Math.abs(last.right - s.right) < 0.01 && Math.abs(last.y + last.height - s.y) < 0.01) {
230
+ last.height = s.y + s.height - last.y;
231
+ }
232
+ else {
233
+ spans.push(s);
234
+ }
235
+ };
236
+ const cropRight = crop.x + crop.width;
237
+ const cropBottom = crop.y + crop.height;
238
+ for (let r = 0; r < shape.rows; r++) {
239
+ const l = shape.spans[r * 2];
240
+ const rr = shape.spans[r * 2 + 1];
241
+ if (l < 0 || rr < 0)
242
+ continue;
243
+ const sy0 = Math.max(crop.y, r / shape.rows);
244
+ const sy1 = Math.min(cropBottom, (r + 1) / shape.rows);
245
+ if (sy1 <= sy0)
246
+ continue;
247
+ const sl = Math.max(crop.x, l);
248
+ const sr = Math.min(cropRight, rr);
249
+ if (sr <= sl)
250
+ continue;
251
+ let u0 = (sl - crop.x) / crop.width;
252
+ let u1 = (sr - crop.x) / crop.width;
253
+ if (options.mirrored)
254
+ [u0, u1] = [1 - u1, 1 - u0];
255
+ const y = body.y + ((sy0 - crop.y) / crop.height) * body.height;
256
+ const yEnd = body.y + ((sy1 - crop.y) / crop.height) * body.height;
257
+ push({ y, height: yEnd - y, left: body.x + u0 * body.width, right: body.x + u1 * body.width });
258
+ }
259
+ if (box) {
260
+ // The caption and note keep their box: the figure's width, above or
261
+ // under the picture.
262
+ const bx = box.x;
263
+ const by = box.y;
264
+ const bottom = by + box.height;
265
+ if (body.y > by + 0.5)
266
+ spans.unshift({ y: by, height: body.y - by, left: bx, right: bx + box.width });
267
+ const bodyBottom = body.y + body.height;
268
+ if (bottom > bodyBottom + 0.5)
269
+ push({ y: bodyBottom, height: bottom - bodyBottom, left: bx, right: bx + box.width });
270
+ }
271
+ return { spans, margin: Math.max(0, options.margin), ...(options.quantum && options.quantum > 0 ? { quantum: options.quantum } : {}) };
272
+ }
273
+ /** A contour moved by `(dx, dy)`. */
274
+ export function shiftContour(c, dx, dy) {
275
+ return { ...c, spans: c.spans.map((s) => ({ y: s.y + dy, height: s.height, left: s.left + dx, right: s.right + dx })) };
276
+ }
277
+ /** A contour scaled by `s` about `(ox, oy)`: a frame's content laid out
278
+ * at another scale than it is painted (#858). `margin: false` keeps the
279
+ * margin (and the CJK quantum) as they are: they are page px already. */
280
+ export function scaleContourAbout(c, ox, oy, s, margin = true) {
281
+ return {
282
+ spans: c.spans.map((sp) => ({ y: oy + (sp.y - oy) * s, height: sp.height * s, left: ox + (sp.left - ox) * s, right: ox + (sp.right - ox) * s })),
283
+ margin: margin ? c.margin * s : c.margin,
284
+ ...(c.quantum !== undefined ? { quantum: margin ? c.quantum * s : c.quantum } : {}),
285
+ };
286
+ }
287
+ /** The contour's bounds, its margin included. */
288
+ export function contourBounds(c) {
289
+ if (c.spans.length === 0)
290
+ return undefined;
291
+ let x0 = Infinity;
292
+ let y0 = Infinity;
293
+ let x1 = -Infinity;
294
+ let y1 = -Infinity;
295
+ for (const s of c.spans) {
296
+ x0 = Math.min(x0, s.left);
297
+ x1 = Math.max(x1, s.right);
298
+ y0 = Math.min(y0, s.y);
299
+ y1 = Math.max(y1, s.y + s.height);
300
+ }
301
+ const m = c.margin;
302
+ return { x: x0 - m, y: y0 - m, width: x1 - x0 + 2 * m, height: y1 - y0 + 2 * m };
303
+ }
304
+ /** The shape's extent across the band `[top, bottom]` of the page: the
305
+ * spans that lie within its margin of it. `undefined`: the band passes
306
+ * clear of the shape. */
307
+ export function contourExtent(c, top, bottom) {
308
+ let left = Infinity;
309
+ let right = -Infinity;
310
+ const m = c.margin;
311
+ for (const s of c.spans) {
312
+ if (s.y + s.height <= top - m + 0.01 || s.y >= bottom + m - 0.01)
313
+ continue;
314
+ if (s.left < left)
315
+ left = s.left;
316
+ if (s.right > right)
317
+ right = s.right;
318
+ }
319
+ return right > left ? { left: left - m, right: right + m } : undefined;
320
+ }
321
+ /**
322
+ * The insets of lines `from` to `to` (0-based, of a text whose line 0's
323
+ * top is at `y0`, lines `lineHeight` apart) beside a shape at `side` of a
324
+ * measure `[x, x + width]`: each line is set short by the room the shape
325
+ * takes across its band (its margin included), none where it passes clear
326
+ * of it. Line numbers in the steps count from `firstLine`.
327
+ */
328
+ export function contourInsetSteps(c, side, x, width, y0, lineHeight, from, to, firstLine = 0) {
329
+ const steps = [];
330
+ const right = x + width;
331
+ for (let li = from; li <= to; li++) {
332
+ const top = y0 + li * lineHeight;
333
+ const ext = contourExtent(c, top, top + lineHeight);
334
+ let inset = 0;
335
+ if (ext)
336
+ inset = side === 'left' ? ext.right - x : right - ext.left;
337
+ inset = Math.max(0, Math.min(width, inset));
338
+ if (c.quantum && inset > 0)
339
+ inset = Math.min(width, Math.ceil((inset - 0.01) / c.quantum) * c.quantum);
340
+ if (inset <= 0.01)
341
+ continue;
342
+ const last = steps[steps.length - 1];
343
+ const startInsetPx = side === 'left' ? inset : 0;
344
+ const endInsetPx = side === 'right' ? inset : 0;
345
+ if (last && last.toLine === firstLine + li - 1 && Math.abs(last.startInsetPx - startInsetPx) < 0.01 && Math.abs(last.endInsetPx - endInsetPx) < 0.01) {
346
+ last.toLine = firstLine + li;
347
+ }
348
+ else {
349
+ steps.push({ fromLine: firstLine + li, toLine: firstLine + li, startInsetPx, endInsetPx });
350
+ }
351
+ }
352
+ return steps;
353
+ }
354
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/contour/index.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,cAAc,EAAE,KAAK,EAAoB,MAAM,OAAO,CAAC;AAEhE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAoB,MAAM,OAAO,CAAC;AAEhE,8CAA8C;AAC9C,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,CAAC;AAC7C,2CAA2C;AAC3C,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAUpC,kEAAkE;AAClE,MAAM,UAAU,gBAAgB,CAAC,OAAoC;IACnE,MAAM,CAAC,GAAG,OAAO,EAAE,SAAS,CAAC;IAC7B,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC;AAC/G,CAAC;AAED;cACc;AACd,MAAM,UAAU,cAAc,CAAC,OAAoC;IACjE,MAAM,GAAG,GAAG,OAAO,EAAE,MAAM,CAAC;IAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5D,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/F,CAAC;AAED;yEACyE;AACzE,MAAM,UAAU,iBAAiB,CAAC,QAAkB;IAClD,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,KAAK,KAAK,KAAK,CAAC;AAC9G,CAAC;AAED,MAAM,MAAM,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC;AAEpE;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,MAAmB,EAAE,SAAiB,EAAE,MAAc;IAC/E,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAC7D,yEAAyE;IACzE,iCAAiC;IACjC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC;IACpD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;QAC3C,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QACnE,IAAI,EAAE,GAAG,KAAK,CAAC;QACf,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;QACZ,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7B,MAAM,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC;YACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5B,IAAI,KAAK,CAAC,GAAG,GAAG,CAAC,CAAE,IAAI,GAAG,EAAE,CAAC;oBAAC,EAAE,GAAG,CAAC,CAAC;oBAAC,MAAM;gBAAC,CAAC;YAChD,CAAC;YACD,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpC,IAAI,KAAK,CAAC,GAAG,GAAG,CAAC,CAAE,IAAI,GAAG,EAAE,CAAC;oBAAC,EAAE,GAAG,CAAC,CAAC;oBAAC,MAAM;gBAAC,CAAC;YAChD,CAAC;QACH,CAAC;QACD,IAAI,EAAE,GAAG,EAAE;YAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;;YAC3B,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAC5C,CAAC;AASD,0EAA0E;AAC1E,MAAM,UAAU,WAAW,CAAC,MAAkB;IAC5C,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC;IAC7C,IAAI,GAAG,GAAG,KAAK,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAE,CAAC;QAC3B,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACb,IAAI,CAAC,GAAG,GAAG;YAAE,GAAG,GAAG,IAAI,CAAC;IAC1B,CAAC;IACD,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/C,CAAC;AASD;+DAC+D;AAC/D,MAAM,UAAU,GAAG,IAAI,CAAC;AAExB,KAAK,UAAU,eAAe,CAAC,KAAiB,EAAE,IAAY;IAC5D,MAAM,CAAC,GAAG,UAGT,CAAC;IACF,IAAI,CAAC,CAAC,CAAC,iBAAiB,IAAI,CAAC,CAAC,CAAC,eAAe,IAAI,OAAO,IAAI,KAAK,WAAW;QAAE,OAAO,SAAS,CAAC;IAChG,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC,CAAC,KAAiB,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACxF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9E,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC;QACxD,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC;QACzD,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,CAAC,GAAG;YAAE,OAAO,SAAS,CAAC;QAC3B,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;QACjB,OAAO,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,QAAkB,EAClB,KAA+B,EAC/B,IAAY,EACZ,UAA+B,EAAE;IAEjC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IACvE,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;IACtC,MAAM,SAAS,GAAG,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,EAAE,GAAG,KAAK,YAAY,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IACvE,IAAI,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,CAAC,CAAC;QAClC,IAAI,MAAM;YAAE,OAAO,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;QACzD,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;IACnC,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,eAAe,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACnE,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACnC,OAAO,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/D,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,gBAAgB,CAAC,QAAkB,EAAE,KAAsC;IACzF,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC;IACzD,KAAK,IAAI,CAAC;IACV,OAAO,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC7E,CAAC;AAED,0EAA0E;AAC1E,SAAS,SAAS,CAAC,QAAkB,EAAE,KAA+B;IACpE,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxF,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,GAAG,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI;QAAE,OAAO,KAAK,CAAC;IACxF,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;AAC/H,CAAC;AAED,MAAM,YAAY,GAAG,IAAI,OAAO,EAAoD,CAAC;AAErF;sCACsC;AACtC,MAAM,UAAU,WAAW,CAAC,MAA2C,EAAE,IAAI,GAAG,gBAAgB;IAC9F,MAAM,MAAM,GAAG,IAAI,KAAK,gBAAgB,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChF,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9B,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;QACpB,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;QAC1B,IAAI,EAAE,GAAG,QAAQ,CAAC;QAClB,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC;QACnB,oEAAoE;QACpE,2DAA2D;QAC3D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;YACrB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAClC,IAAI,MAAM,GAAG,EAAE,IAAI,GAAG,GAAG,EAAE;gBAAE,SAAS;YACtC,MAAM,EAAE,GAAa,EAAE,CAAC;YACxB,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC;gBAChC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACN,MAAM,EAAE,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBAChF,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3D,CAAC;YACD,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;gBACnB,IAAI,CAAC,GAAG,EAAE;oBAAE,EAAE,GAAG,CAAC,CAAC;gBACnB,IAAI,CAAC,GAAG,EAAE;oBAAE,EAAE,GAAG,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;QACD,IAAI,EAAE,GAAG,EAAE;YAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;;YAC3B,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9F,CAAC;IACD,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC5B,IAAI,IAAI,KAAK,gBAAgB;QAAE,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7D,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,QAAkB;IAC9C,MAAM,IAAI,GAAG,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,IAAI;QAAE,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC;QAAE,OAAO,SAAS,CAAC;IACnD,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACvC,OAAO,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACxD,CAAC;AAiBD;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAC3B,QAAkB,EAClB,EAA0D,EAC1D,GAA4B,EAC5B,OAA6B;IAE7B,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACtC,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;IAC5J,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9D,MAAM,IAAI,GAAG,EAAE,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAClE,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9D,MAAM,KAAK,GAAqB,EAAE,CAAC;IACnC,MAAM,IAAI,GAAG,CAAC,CAAiB,EAAQ,EAAE;QACvC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACrC,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC;YACxI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,CAAC;IACH,CAAC,CAAC;IACF,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;IACtC,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC;QAC9B,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAE,CAAC;QACnC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC;YAAE,SAAS;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,GAAG,IAAI,GAAG;YAAE,SAAS;QACzB,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACnC,IAAI,EAAE,IAAI,EAAE;YAAE,SAAS;QACvB,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QACpC,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QACpC,IAAI,OAAO,CAAC,QAAQ;YAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;QAClD,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QAChE,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QACnE,IAAI,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACjG,CAAC;IACD,IAAI,GAAG,EAAE,CAAC;QACR,oEAAoE;QACpE,qBAAqB;QACrB,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;QACjB,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;QACjB,MAAM,MAAM,GAAG,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;QAC/B,IAAI,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG;YAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QACtG,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QACxC,IAAI,MAAM,GAAG,UAAU,GAAG,GAAG;YAAE,IAAI,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;IACvH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AACzI,CAAC;AAED,qCAAqC;AACrC,MAAM,UAAU,YAAY,CAAC,CAAsB,EAAE,EAAU,EAAE,EAAU;IACzE,OAAO,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;AAC1H,CAAC;AAED;;0EAE0E;AAC1E,MAAM,UAAU,iBAAiB,CAAC,CAAsB,EAAE,EAAU,EAAE,EAAU,EAAE,CAAS,EAAE,MAAM,GAAG,IAAI;IACxG,OAAO;QACL,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChJ,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM;QACxC,GAAG,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpF,CAAC;AACJ,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,aAAa,CAAC,CAAsB;IAClD,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3C,IAAI,EAAE,GAAG,QAAQ,CAAC;IAClB,IAAI,EAAE,GAAG,QAAQ,CAAC;IAClB,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC;IACnB,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC;IACnB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;QACxB,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1B,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;QAC3B,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACvB,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IACD,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACnB,OAAO,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;AACnF,CAAC;AAED;;0BAE0B;AAC1B,MAAM,UAAU,aAAa,CAAC,CAAsB,EAAE,GAAW,EAAE,MAAc;IAC/E,IAAI,IAAI,GAAG,QAAQ,CAAC;IACpB,IAAI,KAAK,GAAG,CAAC,QAAQ,CAAC;IACtB,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACnB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,GAAG,CAAC,GAAG,IAAI;YAAE,SAAS;QAC3E,IAAI,CAAC,CAAC,IAAI,GAAG,IAAI;YAAE,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QACjC,IAAI,CAAC,CAAC,KAAK,GAAG,KAAK;YAAE,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;IACvC,CAAC;IACD,OAAO,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACzE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,CAAsB,EACtB,IAAsB,EACtB,CAAS,EACT,KAAa,EACb,EAAU,EACV,UAAkB,EAClB,IAAY,EACZ,EAAU,EACV,SAAS,GAAG,CAAC;IAEb,MAAM,KAAK,GAAoB,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC;IACxB,KAAK,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,UAAU,CAAC;QACjC,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,UAAU,CAAC,CAAC;QACpD,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,GAAG;YAAE,KAAK,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC;QACpE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAC5C,IAAI,CAAC,CAAC,OAAO,IAAI,KAAK,GAAG,CAAC;YAAE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;QACvG,IAAI,KAAK,IAAI,IAAI;YAAE,SAAS;QAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACrC,MAAM,YAAY,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAChD,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,GAAG,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,GAAG,IAAI,EAAE,CAAC;YACrJ,IAAI,CAAC,MAAM,GAAG,SAAS,GAAG,EAAE,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,GAAG,EAAE,EAAE,MAAM,EAAE,SAAS,GAAG,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,16 @@
1
+ /** One byte of opacity per pixel, row by row (0 transparent, 255 opaque). */
2
+ export interface AlphaRaster {
3
+ width: number;
4
+ height: number;
5
+ alpha: Uint8Array;
6
+ }
7
+ /** Whether `bytes` start as a PNG file. */
8
+ export declare function isPng(bytes: Uint8Array): boolean;
9
+ /**
10
+ * The opacity of every pixel of a PNG. `null` when the picture has no
11
+ * transparency at all (no alpha channel and no `tRNS` chunk: every pixel
12
+ * is opaque); `undefined` when the file cannot be read here (not a PNG,
13
+ * damaged, interlaced).
14
+ */
15
+ export declare function decodePngAlpha(input: ArrayBuffer | Uint8Array): AlphaRaster | null | undefined;
16
+ //# sourceMappingURL=png.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"png.d.ts","sourceRoot":"","sources":["../../src/contour/png.ts"],"names":[],"mappings":"AAQA,6EAA6E;AAC7E,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,UAAU,CAAC;CACnB;AAMD,2CAA2C;AAC3C,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAIhD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,UAAU,GAAG,WAAW,GAAG,IAAI,GAAG,SAAS,CA2H9F"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * The alpha channel of a PNG, read synchronously (#883): the shape a
3
+ * contour wrap runs round is traced from it in any host, the browser's
4
+ * layout worker and Node alike, with no canvas. Only what the trace needs
5
+ * is decoded: the opacity of every pixel.
6
+ */
7
+ import { unzlibSync } from 'fflate';
8
+ const SIGNATURE = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];
9
+ /** Channels per pixel by colour type. */
10
+ const CHANNELS = { 0: 1, 2: 3, 3: 1, 4: 2, 6: 4 };
11
+ /** Whether `bytes` start as a PNG file. */
12
+ export function isPng(bytes) {
13
+ if (bytes.length < 8)
14
+ return false;
15
+ for (let i = 0; i < 8; i++)
16
+ if (bytes[i] !== SIGNATURE[i])
17
+ return false;
18
+ return true;
19
+ }
20
+ /**
21
+ * The opacity of every pixel of a PNG. `null` when the picture has no
22
+ * transparency at all (no alpha channel and no `tRNS` chunk: every pixel
23
+ * is opaque); `undefined` when the file cannot be read here (not a PNG,
24
+ * damaged, interlaced).
25
+ */
26
+ export function decodePngAlpha(input) {
27
+ const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);
28
+ if (!isPng(bytes))
29
+ return undefined;
30
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
31
+ let width = 0;
32
+ let height = 0;
33
+ let depth = 0;
34
+ let type = -1;
35
+ let interlace = 0;
36
+ let trns;
37
+ const idat = [];
38
+ let at = 8;
39
+ while (at + 8 <= bytes.length) {
40
+ const len = view.getUint32(at);
41
+ const name = String.fromCharCode(bytes[at + 4], bytes[at + 5], bytes[at + 6], bytes[at + 7]);
42
+ const data = bytes.subarray(at + 8, at + 8 + len);
43
+ if (data.length < len)
44
+ return undefined;
45
+ if (name === 'IHDR') {
46
+ width = view.getUint32(at + 8);
47
+ height = view.getUint32(at + 12);
48
+ depth = bytes[at + 16];
49
+ type = bytes[at + 17];
50
+ interlace = bytes[at + 20];
51
+ }
52
+ else if (name === 'tRNS') {
53
+ trns = data;
54
+ }
55
+ else if (name === 'IDAT') {
56
+ idat.push(data);
57
+ }
58
+ else if (name === 'IEND') {
59
+ break;
60
+ }
61
+ at += 12 + len;
62
+ }
63
+ const channels = CHANNELS[type];
64
+ if (!channels || width <= 0 || height <= 0 || idat.length === 0 || interlace !== 0)
65
+ return undefined;
66
+ if (![1, 2, 4, 8, 16].includes(depth))
67
+ return undefined;
68
+ const hasAlpha = type === 4 || type === 6;
69
+ if (!hasAlpha && !trns)
70
+ return null;
71
+ let total = 0;
72
+ for (const d of idat)
73
+ total += d.length;
74
+ const packed = new Uint8Array(total);
75
+ let off = 0;
76
+ for (const d of idat) {
77
+ packed.set(d, off);
78
+ off += d.length;
79
+ }
80
+ let raw;
81
+ try {
82
+ raw = unzlibSync(packed);
83
+ }
84
+ catch {
85
+ return undefined;
86
+ }
87
+ const bitsPerPixel = channels * depth;
88
+ const stride = Math.ceil((width * bitsPerPixel) / 8);
89
+ const bpp = Math.max(1, bitsPerPixel >> 3);
90
+ if (raw.length < (stride + 1) * height)
91
+ return undefined;
92
+ const alpha = new Uint8Array(width * height);
93
+ let prev = new Uint8Array(stride);
94
+ let cur = new Uint8Array(stride);
95
+ const sample = (row, index) => {
96
+ // The `index`-th sample of the row, at the file's bit depth.
97
+ if (depth === 8)
98
+ return row[index];
99
+ if (depth === 16)
100
+ return (row[index * 2] << 8) | row[index * 2 + 1];
101
+ const bit = index * depth;
102
+ const byte = row[bit >> 3];
103
+ const shift = 8 - depth - (bit & 7);
104
+ return (byte >> shift) & ((1 << depth) - 1);
105
+ };
106
+ const max = (1 << depth) - 1;
107
+ const keyOf = (i) => (trns && trns.length >= (i + 1) * 2 ? (trns[i * 2] << 8) | trns[i * 2 + 1] : -1);
108
+ const key = type === 0 ? keyOf(0) : -1;
109
+ const keyRgb = type === 2 ? [keyOf(0), keyOf(1), keyOf(2)] : undefined;
110
+ for (let y = 0; y < height; y++) {
111
+ const base = y * (stride + 1);
112
+ const filter = raw[base];
113
+ for (let i = 0; i < stride; i++) {
114
+ const x = raw[base + 1 + i];
115
+ const a = i >= bpp ? cur[i - bpp] : 0;
116
+ const b = prev[i];
117
+ const c = i >= bpp ? prev[i - bpp] : 0;
118
+ let v;
119
+ switch (filter) {
120
+ case 0:
121
+ v = x;
122
+ break;
123
+ case 1:
124
+ v = x + a;
125
+ break;
126
+ case 2:
127
+ v = x + b;
128
+ break;
129
+ case 3:
130
+ v = x + ((a + b) >> 1);
131
+ break;
132
+ case 4: {
133
+ const p = a + b - c;
134
+ const pa = Math.abs(p - a);
135
+ const pb = Math.abs(p - b);
136
+ const pc = Math.abs(p - c);
137
+ v = x + (pa <= pb && pa <= pc ? a : pb <= pc ? b : c);
138
+ break;
139
+ }
140
+ default: return undefined;
141
+ }
142
+ cur[i] = v & 0xff;
143
+ }
144
+ const row = y * width;
145
+ for (let px = 0; px < width; px++) {
146
+ let o;
147
+ if (type === 6)
148
+ o = sample(cur, px * 4 + 3);
149
+ else if (type === 4)
150
+ o = sample(cur, px * 2 + 1);
151
+ else if (type === 3) {
152
+ const idx = sample(cur, px);
153
+ alpha[row + px] = trns && idx < trns.length ? trns[idx] : 255;
154
+ continue;
155
+ }
156
+ else if (type === 0) {
157
+ o = sample(cur, px) === key ? 0 : max;
158
+ }
159
+ else {
160
+ const r = sample(cur, px * 3);
161
+ const g = sample(cur, px * 3 + 1);
162
+ const bl = sample(cur, px * 3 + 2);
163
+ o = keyRgb && r === keyRgb[0] && g === keyRgb[1] && bl === keyRgb[2] ? 0 : max;
164
+ }
165
+ alpha[row + px] = depth === 8 ? o : Math.round((o / max) * 255);
166
+ }
167
+ const t = prev;
168
+ prev = cur;
169
+ cur = t;
170
+ }
171
+ return { width, height, alpha };
172
+ }
173
+ //# sourceMappingURL=png.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"png.js","sourceRoot":"","sources":["../../src/contour/png.ts"],"names":[],"mappings":"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"}
@@ -25,7 +25,7 @@ import { isHlsMimeType, mediaFragment, videoElementAttributes, videoEmbedAllow }
25
25
  import { renderComicHtml } from './htmlComic';
26
26
  import { comicBlockOnSheet, pageComics } from './comics/transform';
27
27
  import { altWithLabels } from './composed/labelText';
28
- import { composedFrameBlockIds, composedPaintOrder, composedReadingOrder, composedSheetClip, frameClips, frameMatrix } from './composed/paint';
28
+ import { composedFrameBlockIds, composedPaintOrder, composedReadingOrder, composedSheetClip, frameClips, frameContentRect, frameMatrix } from './composed/paint';
29
29
  import { taskBoxSvgBody, taskBoxText } from './taskBox';
30
30
  /**
31
31
  * Declarations of every box of CJK text measured with no punctuation
@@ -3050,7 +3050,7 @@ function composedFrameOpen(frame, z, facing = false) {
3050
3050
  if (m)
3051
3051
  decls.push('transform-origin:0 0', `transform:matrix(${m.map(frameNum).join(',')})`);
3052
3052
  if (frameClips(frame)) {
3053
- const { x, y, width, height } = frame.rect;
3053
+ const { x, y, width, height } = frameContentRect(frame);
3054
3054
  const [l, t, r, b] = [x, y, x + width, y + height].map(frameNum);
3055
3055
  decls.push(`clip-path:polygon(${l}px ${t}px,${r}px ${t}px,${r}px ${b}px,${l}px ${b}px)`);
3056
3056
  }