supervision 0.0.9000 → 0.1.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 (229) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +23 -2
  3. package/dist/constants/media-renderer.d.ts +9 -0
  4. package/dist/constants/media-renderer.d.ts.map +1 -0
  5. package/dist/detections/browser-cold-detection-frame-store.d.ts +5 -0
  6. package/dist/detections/browser-cold-detection-frame-store.d.ts.map +1 -0
  7. package/dist/detections/chunked-detection-frame-source.d.ts +3 -0
  8. package/dist/detections/chunked-detection-frame-source.d.ts.map +1 -0
  9. package/dist/detections/offset-detection-frame-source.d.ts +10 -0
  10. package/dist/detections/offset-detection-frame-source.d.ts.map +1 -0
  11. package/dist/editing/mask-brush-editor.d.ts +47 -0
  12. package/dist/editing/mask-brush-editor.d.ts.map +1 -0
  13. package/dist/editing.d.ts +8 -0
  14. package/dist/editing.d.ts.map +1 -0
  15. package/dist/editing.js +265 -0
  16. package/dist/editing.js.map +1 -0
  17. package/dist/index.d.ts +58 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +9419 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/mask-preparation.worker.js +823 -0
  22. package/dist/mask-preparation.worker.js.map +1 -0
  23. package/dist/media/decoded-video-sample-reader.d.ts +8 -0
  24. package/dist/media/decoded-video-sample-reader.d.ts.map +1 -0
  25. package/dist/media/media-metadata.d.ts +21 -0
  26. package/dist/media/media-metadata.d.ts.map +1 -0
  27. package/dist/media/media-normalization.d.ts +6 -0
  28. package/dist/media/media-normalization.d.ts.map +1 -0
  29. package/dist/media/media-preparation.d.ts +9 -0
  30. package/dist/media/media-preparation.d.ts.map +1 -0
  31. package/dist/media/media-probe.d.ts +3 -0
  32. package/dist/media/media-probe.d.ts.map +1 -0
  33. package/dist/media/media-source-state.d.ts +5 -0
  34. package/dist/media/media-source-state.d.ts.map +1 -0
  35. package/dist/media/media-source.d.ts +38 -0
  36. package/dist/media/media-source.d.ts.map +1 -0
  37. package/dist/media/media-stream-media-source.d.ts +27 -0
  38. package/dist/media/media-stream-media-source.d.ts.map +1 -0
  39. package/dist/media/mediabunny-media-source.d.ts +13 -0
  40. package/dist/media/mediabunny-media-source.d.ts.map +1 -0
  41. package/dist/media/static-image-media-source.d.ts +13 -0
  42. package/dist/media/static-image-media-source.d.ts.map +1 -0
  43. package/dist/playback/media-playback-controller.d.ts +24 -0
  44. package/dist/playback/media-playback-controller.d.ts.map +1 -0
  45. package/dist/render-preparation/default-render-preparation-worker.d.ts +8 -0
  46. package/dist/render-preparation/default-render-preparation-worker.d.ts.map +1 -0
  47. package/dist/render-preparation/embedded-mask-preparation-worker.d.ts +2 -0
  48. package/dist/render-preparation/embedded-mask-preparation-worker.d.ts.map +1 -0
  49. package/dist/render-preparation/mask-frame-artifact.d.ts +28 -0
  50. package/dist/render-preparation/mask-frame-artifact.d.ts.map +1 -0
  51. package/dist/render-preparation/mask-frame-compositor.d.ts +14 -0
  52. package/dist/render-preparation/mask-frame-compositor.d.ts.map +1 -0
  53. package/dist/render-preparation/mask-frame-preparer.d.ts +19 -0
  54. package/dist/render-preparation/mask-frame-preparer.d.ts.map +1 -0
  55. package/dist/render-preparation/mask-preparation-worker-count.d.ts +15 -0
  56. package/dist/render-preparation/mask-preparation-worker-count.d.ts.map +1 -0
  57. package/dist/render-preparation/mask-preparation-worker-protocol.d.ts +64 -0
  58. package/dist/render-preparation/mask-preparation-worker-protocol.d.ts.map +1 -0
  59. package/dist/render-preparation/mask-preparation.worker.d.ts +2 -0
  60. package/dist/render-preparation/mask-preparation.worker.d.ts.map +1 -0
  61. package/dist/render-preparation/prepared-render-window.d.ts +46 -0
  62. package/dist/render-preparation/prepared-render-window.d.ts.map +1 -0
  63. package/dist/render-preparation/prepared-window-timeline.d.ts +16 -0
  64. package/dist/render-preparation/prepared-window-timeline.d.ts.map +1 -0
  65. package/dist/renderers/media-renderer-core.d.ts +9 -0
  66. package/dist/renderers/media-renderer-core.d.ts.map +1 -0
  67. package/dist/renderers/media-renderer-scene.d.ts +77 -0
  68. package/dist/renderers/media-renderer-scene.d.ts.map +1 -0
  69. package/dist/renderers/media-renderer-state.d.ts +44 -0
  70. package/dist/renderers/media-renderer-state.d.ts.map +1 -0
  71. package/dist/renderers/media-renderer.d.ts +8 -0
  72. package/dist/renderers/media-renderer.d.ts.map +1 -0
  73. package/dist/renderers/pixi-annotation-overlay-layer.d.ts +25 -0
  74. package/dist/renderers/pixi-annotation-overlay-layer.d.ts.map +1 -0
  75. package/dist/renderers/pixi-box-layer.d.ts +28 -0
  76. package/dist/renderers/pixi-box-layer.d.ts.map +1 -0
  77. package/dist/renderers/pixi-focus-layer.d.ts +92 -0
  78. package/dist/renderers/pixi-focus-layer.d.ts.map +1 -0
  79. package/dist/renderers/pixi-id-mask-shader.d.ts +62 -0
  80. package/dist/renderers/pixi-id-mask-shader.d.ts.map +1 -0
  81. package/dist/renderers/pixi-interaction-layer.d.ts +63 -0
  82. package/dist/renderers/pixi-interaction-layer.d.ts.map +1 -0
  83. package/dist/renderers/pixi-interaction-presentation-layer.d.ts +84 -0
  84. package/dist/renderers/pixi-interaction-presentation-layer.d.ts.map +1 -0
  85. package/dist/renderers/pixi-label-layer.d.ts +32 -0
  86. package/dist/renderers/pixi-label-layer.d.ts.map +1 -0
  87. package/dist/renderers/pixi-mask-brush-preview.d.ts +26 -0
  88. package/dist/renderers/pixi-mask-brush-preview.d.ts.map +1 -0
  89. package/dist/renderers/pixi-mask-layer.d.ts +98 -0
  90. package/dist/renderers/pixi-mask-layer.d.ts.map +1 -0
  91. package/dist/renderers/pixi-media-scene.d.ts +6 -0
  92. package/dist/renderers/pixi-media-scene.d.ts.map +1 -0
  93. package/dist/renderers/pixi-path.d.ts +15 -0
  94. package/dist/renderers/pixi-path.d.ts.map +1 -0
  95. package/dist/renderers/pixi-polygon-layer.d.ts +32 -0
  96. package/dist/renderers/pixi-polygon-layer.d.ts.map +1 -0
  97. package/dist/renderers/pixi-scene-fit.d.ts +14 -0
  98. package/dist/renderers/pixi-scene-fit.d.ts.map +1 -0
  99. package/dist/renderers/pixi-scene-layer-slot.d.ts +23 -0
  100. package/dist/renderers/pixi-scene-layer-slot.d.ts.map +1 -0
  101. package/dist/renderers/pixi-vector-layer.d.ts +24 -0
  102. package/dist/renderers/pixi-vector-layer.d.ts.map +1 -0
  103. package/dist/sessions/media-session-defaults.d.ts +21 -0
  104. package/dist/sessions/media-session-defaults.d.ts.map +1 -0
  105. package/dist/sessions/media-session-detections.d.ts +16 -0
  106. package/dist/sessions/media-session-detections.d.ts.map +1 -0
  107. package/dist/sessions/media-session-media.d.ts +19 -0
  108. package/dist/sessions/media-session-media.d.ts.map +1 -0
  109. package/dist/sessions/media-session-state.d.ts +12 -0
  110. package/dist/sessions/media-session-state.d.ts.map +1 -0
  111. package/dist/sessions/media-session.d.ts +10 -0
  112. package/dist/sessions/media-session.d.ts.map +1 -0
  113. package/dist/types/media-normalization.d.ts +119 -0
  114. package/dist/types/media-normalization.d.ts.map +1 -0
  115. package/dist/types/media-preparation.d.ts +30 -0
  116. package/dist/types/media-preparation.d.ts.map +1 -0
  117. package/dist/types/media-renderer.d.ts +115 -0
  118. package/dist/types/media-renderer.d.ts.map +1 -0
  119. package/dist/types/media-session.d.ts +242 -0
  120. package/dist/types/media-session.d.ts.map +1 -0
  121. package/dist/types/render-preparation.d.ts +164 -0
  122. package/dist/types/render-preparation.d.ts.map +1 -0
  123. package/dist/workers/worker-rpc-client.d.ts +15 -0
  124. package/dist/workers/worker-rpc-client.d.ts.map +1 -0
  125. package/node_modules/supervision-js-core/dist/detections/array-detection-frame-source.d.ts +4 -0
  126. package/node_modules/supervision-js-core/dist/detections/array-detection-frame-source.d.ts.map +1 -0
  127. package/node_modules/supervision-js-core/dist/detections/buffered-detection-timeline.d.ts +14 -0
  128. package/node_modules/supervision-js-core/dist/detections/buffered-detection-timeline.d.ts.map +1 -0
  129. package/node_modules/supervision-js-core/dist/detections/cold-detection-frame-source.d.ts +6 -0
  130. package/node_modules/supervision-js-core/dist/detections/cold-detection-frame-source.d.ts.map +1 -0
  131. package/node_modules/supervision-js-core/dist/detections/composite-detection-frame-source.d.ts +3 -0
  132. package/node_modules/supervision-js-core/dist/detections/composite-detection-frame-source.d.ts.map +1 -0
  133. package/node_modules/supervision-js-core/dist/detections/editable-annotation-frame-session.d.ts +35 -0
  134. package/node_modules/supervision-js-core/dist/detections/editable-annotation-frame-session.d.ts.map +1 -0
  135. package/node_modules/supervision-js-core/dist/detections/memory-cold-detection-frame-store.d.ts +3 -0
  136. package/node_modules/supervision-js-core/dist/detections/memory-cold-detection-frame-store.d.ts.map +1 -0
  137. package/node_modules/supervision-js-core/dist/detections/writable-detection-frame-source.d.ts +8 -0
  138. package/node_modules/supervision-js-core/dist/detections/writable-detection-frame-source.d.ts.map +1 -0
  139. package/node_modules/supervision-js-core/dist/index.d.ts +65 -0
  140. package/node_modules/supervision-js-core/dist/index.d.ts.map +1 -0
  141. package/node_modules/supervision-js-core/dist/index.js +4277 -0
  142. package/node_modules/supervision-js-core/dist/index.js.map +1 -0
  143. package/node_modules/supervision-js-core/dist/interactions/annotation-editing-engine.d.ts +3 -0
  144. package/node_modules/supervision-js-core/dist/interactions/annotation-editing-engine.d.ts.map +1 -0
  145. package/node_modules/supervision-js-core/dist/interactions/annotation-handles.d.ts +13 -0
  146. package/node_modules/supervision-js-core/dist/interactions/annotation-handles.d.ts.map +1 -0
  147. package/node_modules/supervision-js-core/dist/interactions/detection-picker.d.ts +7 -0
  148. package/node_modules/supervision-js-core/dist/interactions/detection-picker.d.ts.map +1 -0
  149. package/node_modules/supervision-js-core/dist/interactions/viewport-controller.d.ts +6 -0
  150. package/node_modules/supervision-js-core/dist/interactions/viewport-controller.d.ts.map +1 -0
  151. package/node_modules/supervision-js-core/dist/styles/box-style.d.ts +44 -0
  152. package/node_modules/supervision-js-core/dist/styles/box-style.d.ts.map +1 -0
  153. package/node_modules/supervision-js-core/dist/styles/default-annotation-presentation.d.ts +20 -0
  154. package/node_modules/supervision-js-core/dist/styles/default-annotation-presentation.d.ts.map +1 -0
  155. package/node_modules/supervision-js-core/dist/styles/focus-style.d.ts +37 -0
  156. package/node_modules/supervision-js-core/dist/styles/focus-style.d.ts.map +1 -0
  157. package/node_modules/supervision-js-core/dist/styles/interaction-style.d.ts +64 -0
  158. package/node_modules/supervision-js-core/dist/styles/interaction-style.d.ts.map +1 -0
  159. package/node_modules/supervision-js-core/dist/styles/keypoint-style.d.ts +19 -0
  160. package/node_modules/supervision-js-core/dist/styles/keypoint-style.d.ts.map +1 -0
  161. package/node_modules/supervision-js-core/dist/styles/label-style.d.ts +61 -0
  162. package/node_modules/supervision-js-core/dist/styles/label-style.d.ts.map +1 -0
  163. package/node_modules/supervision-js-core/dist/styles/mask-style.d.ts +55 -0
  164. package/node_modules/supervision-js-core/dist/styles/mask-style.d.ts.map +1 -0
  165. package/node_modules/supervision-js-core/dist/styles/polygon-style.d.ts +15 -0
  166. package/node_modules/supervision-js-core/dist/styles/polygon-style.d.ts.map +1 -0
  167. package/node_modules/supervision-js-core/dist/styles/polyline-style.d.ts +14 -0
  168. package/node_modules/supervision-js-core/dist/styles/polyline-style.d.ts.map +1 -0
  169. package/node_modules/supervision-js-core/dist/styles/source-presentation.d.ts +22 -0
  170. package/node_modules/supervision-js-core/dist/styles/source-presentation.d.ts.map +1 -0
  171. package/node_modules/supervision-js-core/dist/styles/style-value.d.ts +4 -0
  172. package/node_modules/supervision-js-core/dist/styles/style-value.d.ts.map +1 -0
  173. package/node_modules/supervision-js-core/dist/types/box-style.d.ts +58 -0
  174. package/node_modules/supervision-js-core/dist/types/box-style.d.ts.map +1 -0
  175. package/node_modules/supervision-js-core/dist/types/detection-timeline.d.ts +325 -0
  176. package/node_modules/supervision-js-core/dist/types/detection-timeline.d.ts.map +1 -0
  177. package/node_modules/supervision-js-core/dist/types/detections.d.ts +183 -0
  178. package/node_modules/supervision-js-core/dist/types/detections.d.ts.map +1 -0
  179. package/node_modules/supervision-js-core/dist/types/editing.d.ts +140 -0
  180. package/node_modules/supervision-js-core/dist/types/editing.d.ts.map +1 -0
  181. package/node_modules/supervision-js-core/dist/types/focus-style.d.ts +36 -0
  182. package/node_modules/supervision-js-core/dist/types/focus-style.d.ts.map +1 -0
  183. package/node_modules/supervision-js-core/dist/types/interaction-style.d.ts +44 -0
  184. package/node_modules/supervision-js-core/dist/types/interaction-style.d.ts.map +1 -0
  185. package/node_modules/supervision-js-core/dist/types/interaction.d.ts +70 -0
  186. package/node_modules/supervision-js-core/dist/types/interaction.d.ts.map +1 -0
  187. package/node_modules/supervision-js-core/dist/types/keypoint-style.d.ts +30 -0
  188. package/node_modules/supervision-js-core/dist/types/keypoint-style.d.ts.map +1 -0
  189. package/node_modules/supervision-js-core/dist/types/label-style.d.ts +65 -0
  190. package/node_modules/supervision-js-core/dist/types/label-style.d.ts.map +1 -0
  191. package/node_modules/supervision-js-core/dist/types/mask-style.d.ts +59 -0
  192. package/node_modules/supervision-js-core/dist/types/mask-style.d.ts.map +1 -0
  193. package/node_modules/supervision-js-core/dist/types/media-rendering.d.ts +204 -0
  194. package/node_modules/supervision-js-core/dist/types/media-rendering.d.ts.map +1 -0
  195. package/node_modules/supervision-js-core/dist/types/media.d.ts +42 -0
  196. package/node_modules/supervision-js-core/dist/types/media.d.ts.map +1 -0
  197. package/node_modules/supervision-js-core/dist/types/polygon-style.d.ts +13 -0
  198. package/node_modules/supervision-js-core/dist/types/polygon-style.d.ts.map +1 -0
  199. package/node_modules/supervision-js-core/dist/types/polyline-style.d.ts +12 -0
  200. package/node_modules/supervision-js-core/dist/types/polyline-style.d.ts.map +1 -0
  201. package/node_modules/supervision-js-core/dist/types/session-lifecycle.d.ts +106 -0
  202. package/node_modules/supervision-js-core/dist/types/session-lifecycle.d.ts.map +1 -0
  203. package/node_modules/supervision-js-core/dist/types/style.d.ts +28 -0
  204. package/node_modules/supervision-js-core/dist/types/style.d.ts.map +1 -0
  205. package/node_modules/supervision-js-core/dist/types/viewport.d.ts +19 -0
  206. package/node_modules/supervision-js-core/dist/types/viewport.d.ts.map +1 -0
  207. package/node_modules/supervision-js-core/dist/utils/annotation-visibility.d.ts +5 -0
  208. package/node_modules/supervision-js-core/dist/utils/annotation-visibility.d.ts.map +1 -0
  209. package/node_modules/supervision-js-core/dist/utils/color-palette.d.ts +12 -0
  210. package/node_modules/supervision-js-core/dist/utils/color-palette.d.ts.map +1 -0
  211. package/node_modules/supervision-js-core/dist/utils/color.d.ts +4 -0
  212. package/node_modules/supervision-js-core/dist/utils/color.d.ts.map +1 -0
  213. package/node_modules/supervision-js-core/dist/utils/detection-conversions.d.ts +24 -0
  214. package/node_modules/supervision-js-core/dist/utils/detection-conversions.d.ts.map +1 -0
  215. package/node_modules/supervision-js-core/dist/utils/detection-frames.d.ts +16 -0
  216. package/node_modules/supervision-js-core/dist/utils/detection-frames.d.ts.map +1 -0
  217. package/node_modules/supervision-js-core/dist/utils/detection-masks.d.ts +31 -0
  218. package/node_modules/supervision-js-core/dist/utils/detection-masks.d.ts.map +1 -0
  219. package/node_modules/supervision-js-core/dist/utils/geometry.d.ts +11 -0
  220. package/node_modules/supervision-js-core/dist/utils/geometry.d.ts.map +1 -0
  221. package/node_modules/supervision-js-core/dist/utils/id-mask-frame.d.ts +18 -0
  222. package/node_modules/supervision-js-core/dist/utils/id-mask-frame.d.ts.map +1 -0
  223. package/node_modules/supervision-js-core/dist/utils/mask-style.d.ts +4 -0
  224. package/node_modules/supervision-js-core/dist/utils/mask-style.d.ts.map +1 -0
  225. package/node_modules/supervision-js-core/dist/utils/object.d.ts +2 -0
  226. package/node_modules/supervision-js-core/dist/utils/object.d.ts.map +1 -0
  227. package/node_modules/supervision-js-core/package.json +51 -0
  228. package/package.json +92 -16
  229. package/index.js +0 -0
@@ -0,0 +1,823 @@
1
+ (function () {
2
+ 'use strict';
3
+
4
+ /** COCO-compatible keypoint visibility values. */
5
+ var KeypointVisibility;
6
+ (function (KeypointVisibility) {
7
+ KeypointVisibility[KeypointVisibility["NotLabeled"] = 0] = "NotLabeled";
8
+ KeypointVisibility[KeypointVisibility["Occluded"] = 1] = "Occluded";
9
+ KeypointVisibility[KeypointVisibility["Visible"] = 2] = "Visible";
10
+ })(KeypointVisibility || (KeypointVisibility = {}));
11
+ var DetectionMaskEncoding;
12
+ (function (DetectionMaskEncoding) {
13
+ DetectionMaskEncoding["CompressedRle"] = "compressedRle";
14
+ })(DetectionMaskEncoding || (DetectionMaskEncoding = {}));
15
+
16
+ var DetectionBufferStatus;
17
+ (function (DetectionBufferStatus) {
18
+ DetectionBufferStatus["Idle"] = "idle";
19
+ DetectionBufferStatus["Loading"] = "loading";
20
+ DetectionBufferStatus["Ready"] = "ready";
21
+ DetectionBufferStatus["Error"] = "error";
22
+ DetectionBufferStatus["Destroyed"] = "destroyed";
23
+ })(DetectionBufferStatus || (DetectionBufferStatus = {}));
24
+ /**
25
+ * How the renderer selects the active detection frame for a media timestamp.
26
+ */
27
+ var DetectionFrameSelectionMode;
28
+ (function (DetectionFrameSelectionMode) {
29
+ /**
30
+ * Select the frame whose `[mediaTime, endTime)` interval contains the media
31
+ * time. This is the default for interval annotations and timestamped sources.
32
+ */
33
+ DetectionFrameSelectionMode["Interval"] = "interval";
34
+ /**
35
+ * Select from a known inference frame grid using `frameIndex`, `frameRate`,
36
+ * and optional `frameIndexOriginTime`. This is useful when inference was run
37
+ * on normalized frames and playback should snap detections to that grid.
38
+ */
39
+ DetectionFrameSelectionMode["NearestFrameIndex"] = "nearestFrameIndex";
40
+ })(DetectionFrameSelectionMode || (DetectionFrameSelectionMode = {}));
41
+ var DetectionFrameRetentionMode;
42
+ (function (DetectionFrameRetentionMode) {
43
+ /**
44
+ * Keep writable detections only in an in-memory store. Useful for ephemeral
45
+ * live streams where old predictions should disappear when evicted.
46
+ */
47
+ DetectionFrameRetentionMode["MemoryOnly"] = "memoryOnly";
48
+ /**
49
+ * Persist every written detection frame. Useful for finite media where seek
50
+ * and replay should not require recomputing detections.
51
+ */
52
+ DetectionFrameRetentionMode["PersistAll"] = "persistAll";
53
+ /**
54
+ * Persist only the most recent retention window. Useful for long-running
55
+ * streams where replay is bounded to a recent time horizon.
56
+ */
57
+ DetectionFrameRetentionMode["PersistWindow"] = "persistWindow";
58
+ })(DetectionFrameRetentionMode || (DetectionFrameRetentionMode = {}));
59
+ function decodeCompressedRleMask(mask) {
60
+ if (mask.encoding !== DetectionMaskEncoding.CompressedRle) {
61
+ throw new Error(`Unsupported detection mask encoding: ${mask.encoding}`);
62
+ }
63
+ const data = new Uint8Array(mask.width * mask.height);
64
+ const counts = decodeCompressedRleCounts(mask.counts);
65
+ let offset = 0;
66
+ for (let index = 0; index < counts.length; index += 1) {
67
+ const runLength = counts[index] ?? 0;
68
+ const isForeground = index % 2 === 1;
69
+ if (isForeground) {
70
+ for (let runOffset = 0; runOffset < runLength; runOffset += 1) {
71
+ const maskOffset = offset + runOffset;
72
+ const x = Math.floor(maskOffset / mask.height);
73
+ const y = maskOffset % mask.height;
74
+ const rowMajorOffset = y * mask.width + x;
75
+ if (rowMajorOffset < data.length) {
76
+ data[rowMajorOffset] = 1;
77
+ }
78
+ }
79
+ }
80
+ offset += runLength;
81
+ }
82
+ return {
83
+ data,
84
+ height: mask.height,
85
+ width: mask.width,
86
+ };
87
+ }
88
+ function decodeCompressedRleCounts(counts) {
89
+ const decoded = [];
90
+ let index = 0;
91
+ while (index < counts.length) {
92
+ let value = 0;
93
+ let shift = 0;
94
+ let charCode;
95
+ do {
96
+ charCode = counts.charCodeAt(index) - 48;
97
+ index += 1;
98
+ value |= (charCode & 0x1f) << shift;
99
+ shift += 5;
100
+ } while (charCode & 0x20);
101
+ if (charCode & 0x10) {
102
+ value |= -1 << shift;
103
+ }
104
+ if (decoded.length > 2) {
105
+ value += decoded[decoded.length - 2] ?? 0;
106
+ }
107
+ decoded.push(value);
108
+ }
109
+ return decoded;
110
+ }
111
+ function encodeCompressedRleCounts(counts) {
112
+ return counts
113
+ .map((count, index) => {
114
+ let value = index > 2 ? count - counts[index - 2] : count;
115
+ let encoded = "";
116
+ let more = true;
117
+ while (more) {
118
+ let charCode = value & 0x1f;
119
+ value >>= 5;
120
+ more = !((value === 0 && (charCode & 0x10) === 0) ||
121
+ (value === -1 && (charCode & 0x10) !== 0));
122
+ if (more) {
123
+ charCode |= 0x20;
124
+ }
125
+ encoded += String.fromCharCode(charCode + 48);
126
+ }
127
+ return encoded;
128
+ })
129
+ .join("");
130
+ }
131
+
132
+ var AnnotationFrameMutationKind;
133
+ (function (AnnotationFrameMutationKind) {
134
+ AnnotationFrameMutationKind["Add"] = "add";
135
+ AnnotationFrameMutationKind["Remove"] = "remove";
136
+ AnnotationFrameMutationKind["Replace"] = "replace";
137
+ AnnotationFrameMutationKind["Transact"] = "transact";
138
+ AnnotationFrameMutationKind["Update"] = "update";
139
+ })(AnnotationFrameMutationKind || (AnnotationFrameMutationKind = {}));
140
+
141
+ var DetectionPickTarget;
142
+ (function (DetectionPickTarget) {
143
+ DetectionPickTarget["Box"] = "box";
144
+ DetectionPickTarget["Edge"] = "edge";
145
+ DetectionPickTarget["Keypoint"] = "keypoint";
146
+ DetectionPickTarget["Label"] = "label";
147
+ DetectionPickTarget["Mask"] = "mask";
148
+ DetectionPickTarget["Polygon"] = "polygon";
149
+ DetectionPickTarget["Polyline"] = "polyline";
150
+ })(DetectionPickTarget || (DetectionPickTarget = {}));
151
+ var MediaInteractionMode;
152
+ (function (MediaInteractionMode) {
153
+ MediaInteractionMode["Always"] = "always";
154
+ MediaInteractionMode["Disabled"] = "disabled";
155
+ MediaInteractionMode["PausedOnly"] = "pausedOnly";
156
+ })(MediaInteractionMode || (MediaInteractionMode = {}));
157
+
158
+ function centerRectToTopLeftRect(rect) {
159
+ return {
160
+ height: rect.height,
161
+ width: rect.width,
162
+ x: rect.x - rect.width / 2,
163
+ y: rect.y - rect.height / 2,
164
+ };
165
+ }
166
+ function getPointsRect(points) {
167
+ if (points.length === 0) {
168
+ return undefined;
169
+ }
170
+ let minX = Number.POSITIVE_INFINITY;
171
+ let minY = Number.POSITIVE_INFINITY;
172
+ let maxX = Number.NEGATIVE_INFINITY;
173
+ let maxY = Number.NEGATIVE_INFINITY;
174
+ for (const point of points) {
175
+ minX = Math.min(minX, point.x);
176
+ minY = Math.min(minY, point.y);
177
+ maxX = Math.max(maxX, point.x);
178
+ maxY = Math.max(maxY, point.y);
179
+ }
180
+ return {
181
+ height: maxY - minY,
182
+ width: maxX - minX,
183
+ x: (minX + maxX) / 2,
184
+ y: (minY + maxY) / 2,
185
+ };
186
+ }
187
+
188
+ var AnnotationGeometryKind;
189
+ (function (AnnotationGeometryKind) {
190
+ AnnotationGeometryKind["Box"] = "box";
191
+ AnnotationGeometryKind["Polygon"] = "polygon";
192
+ AnnotationGeometryKind["Polyline"] = "polyline";
193
+ AnnotationGeometryKind["Keypoints"] = "keypoints";
194
+ AnnotationGeometryKind["Mask"] = "mask";
195
+ })(AnnotationGeometryKind || (AnnotationGeometryKind = {}));
196
+ var AnnotationGestureStateKind;
197
+ (function (AnnotationGestureStateKind) {
198
+ AnnotationGestureStateKind["Idle"] = "idle";
199
+ AnnotationGestureStateKind["Creating"] = "creating";
200
+ AnnotationGestureStateKind["Moving"] = "moving";
201
+ AnnotationGestureStateKind["Resizing"] = "resizing";
202
+ AnnotationGestureStateKind["DragSelecting"] = "dragSelecting";
203
+ })(AnnotationGestureStateKind || (AnnotationGestureStateKind = {}));
204
+ var AnnotationHandleKind;
205
+ (function (AnnotationHandleKind) {
206
+ AnnotationHandleKind["Resize"] = "resize";
207
+ AnnotationHandleKind["Vertex"] = "vertex";
208
+ AnnotationHandleKind["AddVertex"] = "addVertex";
209
+ AnnotationHandleKind["Keypoint"] = "keypoint";
210
+ })(AnnotationHandleKind || (AnnotationHandleKind = {}));
211
+
212
+ var BoxShape;
213
+ (function (BoxShape) {
214
+ BoxShape["Rect"] = "rect";
215
+ BoxShape["RoundedRect"] = "roundedRect";
216
+ })(BoxShape || (BoxShape = {}));
217
+ var BoxStrokeAlignment;
218
+ (function (BoxStrokeAlignment) {
219
+ BoxStrokeAlignment["Inside"] = "inside";
220
+ BoxStrokeAlignment["Center"] = "center";
221
+ BoxStrokeAlignment["Outside"] = "outside";
222
+ })(BoxStrokeAlignment || (BoxStrokeAlignment = {}));
223
+
224
+ var FocusTargetMode;
225
+ (function (FocusTargetMode) {
226
+ FocusTargetMode["Hovered"] = "hovered";
227
+ FocusTargetMode["Selected"] = "selected";
228
+ FocusTargetMode["HoveredAndSelected"] = "hoveredAndSelected";
229
+ FocusTargetMode["Ambient"] = "ambient";
230
+ })(FocusTargetMode || (FocusTargetMode = {}));
231
+
232
+ var DetectionInteractionState;
233
+ (function (DetectionInteractionState) {
234
+ DetectionInteractionState["Hovered"] = "hovered";
235
+ DetectionInteractionState["Selected"] = "selected";
236
+ })(DetectionInteractionState || (DetectionInteractionState = {}));
237
+
238
+ var LabelPlacement;
239
+ (function (LabelPlacement) {
240
+ LabelPlacement["Top"] = "top";
241
+ LabelPlacement["Bottom"] = "bottom";
242
+ LabelPlacement["InsideTop"] = "insideTop";
243
+ LabelPlacement["InsideBottom"] = "insideBottom";
244
+ LabelPlacement["Center"] = "center";
245
+ })(LabelPlacement || (LabelPlacement = {}));
246
+ var LabelVisibilityMode;
247
+ (function (LabelVisibilityMode) {
248
+ LabelVisibilityMode["Always"] = "always";
249
+ LabelVisibilityMode["HoveredOnly"] = "hoveredOnly";
250
+ })(LabelVisibilityMode || (LabelVisibilityMode = {}));
251
+
252
+ var MaskRenderMode;
253
+ (function (MaskRenderMode) {
254
+ MaskRenderMode["FillAndStroke"] = "fillAndStroke";
255
+ MaskRenderMode["FillOnly"] = "fillOnly";
256
+ MaskRenderMode["StrokeOnly"] = "strokeOnly";
257
+ })(MaskRenderMode || (MaskRenderMode = {}));
258
+
259
+ var KeypointMarkerShape;
260
+ (function (KeypointMarkerShape) {
261
+ KeypointMarkerShape["Circle"] = "circle";
262
+ KeypointMarkerShape["Cross"] = "cross";
263
+ })(KeypointMarkerShape || (KeypointMarkerShape = {}));
264
+
265
+ var DetectionMaskPayloadFormat;
266
+ (function (DetectionMaskPayloadFormat) {
267
+ DetectionMaskPayloadFormat["RawCocoRle"] = "rawCocoRle";
268
+ DetectionMaskPayloadFormat["DeflatedBase64"] = "deflatedBase64";
269
+ })(DetectionMaskPayloadFormat || (DetectionMaskPayloadFormat = {}));
270
+ function encodeBinaryMask(data, width, height) {
271
+ assertMaskDimensions(data, width, height);
272
+ const runs = [];
273
+ let currentValue = 0;
274
+ let runLength = 0;
275
+ for (let x = 0; x < width; x += 1) {
276
+ for (let y = 0; y < height; y += 1) {
277
+ const value = data[y * width + x] ? 1 : 0;
278
+ if (value === currentValue) {
279
+ runLength += 1;
280
+ }
281
+ else {
282
+ runs.push(runLength);
283
+ currentValue = value;
284
+ runLength = 1;
285
+ }
286
+ }
287
+ }
288
+ runs.push(runLength);
289
+ return {
290
+ counts: encodeCompressedRleCounts(runs),
291
+ encoding: DetectionMaskEncoding.CompressedRle,
292
+ height,
293
+ width,
294
+ };
295
+ }
296
+ function assertMaskDimensions(data, width, height) {
297
+ if (!Number.isInteger(width) || width <= 0) {
298
+ throw new Error("Mask width must be a positive integer.");
299
+ }
300
+ if (!Number.isInteger(height) || height <= 0) {
301
+ throw new Error("Mask height must be a positive integer.");
302
+ }
303
+ if (data.length !== width * height) {
304
+ throw new Error("Mask data length must equal width * height.");
305
+ }
306
+ }
307
+ function rasterizePolygonToMask(points, dimensions) {
308
+ const data = createEmptyMask(dimensions);
309
+ if (points.length < 3) {
310
+ return data;
311
+ }
312
+ const bounds = centerRectToTopLeftRect(getPointsRect(points));
313
+ const startY = Math.max(0, Math.floor(bounds.y));
314
+ const endY = Math.min(dimensions.height - 1, Math.ceil(bounds.y + bounds.height));
315
+ for (let y = startY; y <= endY; y += 1) {
316
+ const scanY = y + 0.5;
317
+ const intersections = [];
318
+ for (let index = 0; index < points.length; index += 1) {
319
+ const current = points[index];
320
+ const next = points[(index + 1) % points.length];
321
+ if ((current.y <= scanY && next.y > scanY) ||
322
+ (next.y <= scanY && current.y > scanY)) {
323
+ const ratio = (scanY - current.y) / (next.y - current.y);
324
+ intersections.push(current.x + ratio * (next.x - current.x));
325
+ }
326
+ }
327
+ intersections.sort((left, right) => left - right);
328
+ for (let index = 0; index < intersections.length - 1; index += 2) {
329
+ const left = Math.max(0, Math.ceil(intersections[index]));
330
+ const right = Math.min(dimensions.width - 1, Math.floor(intersections[index + 1]));
331
+ for (let x = left; x <= right; x += 1) {
332
+ data[y * dimensions.width + x] = 1;
333
+ }
334
+ }
335
+ }
336
+ return data;
337
+ }
338
+ function createEmptyMask(dimensions) {
339
+ if (!Number.isInteger(dimensions.width) ||
340
+ dimensions.width <= 0 ||
341
+ !Number.isInteger(dimensions.height) ||
342
+ dimensions.height <= 0) {
343
+ throw new Error("Media dimensions must be positive integers.");
344
+ }
345
+ return new Uint8Array(dimensions.width * dimensions.height);
346
+ }
347
+
348
+ const MAX_ID_MASK_PALETTE_ENTRIES = 64;
349
+ const MAX_ID_MASK_STROKE_WIDTH = 16;
350
+ function createIdMaskFrame(instructions) {
351
+ if (instructions.length === 0) {
352
+ return undefined;
353
+ }
354
+ const width = Math.max(...instructions.map(({ mask }) => mask.width));
355
+ const height = Math.max(...instructions.map(({ mask }) => mask.height));
356
+ const data = new Uint8Array(new ArrayBuffer(width * height));
357
+ const fillPalette = new Float32Array(new ArrayBuffer(MAX_ID_MASK_PALETTE_ENTRIES * 4 * 4));
358
+ const strokePalette = new Float32Array(new ArrayBuffer(MAX_ID_MASK_PALETTE_ENTRIES * 4 * 4));
359
+ const strokeWidths = new Float32Array(new ArrayBuffer(MAX_ID_MASK_PALETTE_ENTRIES * 4));
360
+ let hasStroke = false;
361
+ let maxStrokeWidth = 0;
362
+ for (const instruction of instructions) {
363
+ const detectionMaskId = instruction.detectionIndex + 1;
364
+ if (detectionMaskId <= 0 ||
365
+ detectionMaskId >= MAX_ID_MASK_PALETTE_ENTRIES) {
366
+ return undefined;
367
+ }
368
+ writePaletteEntry(fillPalette, detectionMaskId, instruction.color, instruction.alpha);
369
+ if (instruction.stroke && instruction.stroke.width > 0) {
370
+ const strokeWidth = Math.min(Math.max(0, instruction.stroke.width), MAX_ID_MASK_STROKE_WIDTH);
371
+ hasStroke = true;
372
+ strokeWidths[detectionMaskId] = strokeWidth;
373
+ maxStrokeWidth = Math.max(maxStrokeWidth, strokeWidth);
374
+ writePaletteEntry(strokePalette, detectionMaskId, instruction.stroke.color, instruction.stroke.alpha);
375
+ }
376
+ const decodedMask = decodeCompressedRleMask(instruction.mask);
377
+ for (let y = 0; y < decodedMask.height; y += 1) {
378
+ for (let x = 0; x < decodedMask.width; x += 1) {
379
+ const maskOffset = y * decodedMask.width + x;
380
+ if (decodedMask.data[maskOffset]) {
381
+ data[y * width + x] = detectionMaskId;
382
+ }
383
+ }
384
+ }
385
+ }
386
+ return {
387
+ data,
388
+ fillPalette,
389
+ hasStroke,
390
+ height,
391
+ maxStrokeWidth,
392
+ strokePalette,
393
+ strokeWidths,
394
+ width,
395
+ };
396
+ }
397
+ function writePaletteEntry(palette, id, color, alpha) {
398
+ const offset = id * 4;
399
+ palette[offset] = ((color >> 16) & 0xff) / 255;
400
+ palette[offset + 1] = ((color >> 8) & 0xff) / 255;
401
+ palette[offset + 2] = (color & 0xff) / 255;
402
+ palette[offset + 3] = Math.max(0, Math.min(alpha, 1));
403
+ }
404
+
405
+ var MediaRendererFit;
406
+ (function (MediaRendererFit) {
407
+ /**
408
+ * Preserve media aspect ratio and fit the full frame inside the canvas.
409
+ */
410
+ MediaRendererFit["Contain"] = "contain";
411
+ /**
412
+ * Preserve media aspect ratio and fill the canvas, cropping if necessary.
413
+ */
414
+ MediaRendererFit["Cover"] = "cover";
415
+ })(MediaRendererFit || (MediaRendererFit = {}));
416
+ /**
417
+ * Playback lifecycle state reported by a platform renderer.
418
+ */
419
+ var MediaRendererPlaybackState;
420
+ (function (MediaRendererPlaybackState) {
421
+ MediaRendererPlaybackState["Loading"] = "loading";
422
+ MediaRendererPlaybackState["Ready"] = "ready";
423
+ MediaRendererPlaybackState["Playing"] = "playing";
424
+ MediaRendererPlaybackState["Buffering"] = "buffering";
425
+ MediaRendererPlaybackState["Paused"] = "paused";
426
+ MediaRendererPlaybackState["Error"] = "error";
427
+ MediaRendererPlaybackState["Destroyed"] = "destroyed";
428
+ })(MediaRendererPlaybackState || (MediaRendererPlaybackState = {}));
429
+ /**
430
+ * Lower-level media source readiness.
431
+ */
432
+ var MediaSourceStatus;
433
+ (function (MediaSourceStatus) {
434
+ MediaSourceStatus["Loading"] = "loading";
435
+ MediaSourceStatus["Ready"] = "ready";
436
+ MediaSourceStatus["Error"] = "error";
437
+ MediaSourceStatus["Destroyed"] = "destroyed";
438
+ })(MediaSourceStatus || (MediaSourceStatus = {}));
439
+
440
+ /**
441
+ * Media-session operating mode.
442
+ *
443
+ * Core owns the names because file-like and stream-like lifecycle choices are
444
+ * platform-neutral. Platform packages decide how these modes tune media,
445
+ * storage, and renderer defaults.
446
+ */
447
+ var MediaSessionMode;
448
+ (function (MediaSessionMode) {
449
+ /**
450
+ * Finite media. Defaults usually favor seek/replay and persistent detection
451
+ * storage.
452
+ */
453
+ MediaSessionMode["File"] = "file";
454
+ /**
455
+ * Live or append-only media. Defaults usually favor rolling windows and
456
+ * bounded retention.
457
+ */
458
+ MediaSessionMode["Stream"] = "stream";
459
+ })(MediaSessionMode || (MediaSessionMode = {}));
460
+ /**
461
+ * Aggregate lifecycle state for a media session.
462
+ */
463
+ var MediaSessionStatus;
464
+ (function (MediaSessionStatus) {
465
+ MediaSessionStatus["Buffering"] = "buffering";
466
+ MediaSessionStatus["Destroyed"] = "destroyed";
467
+ MediaSessionStatus["Error"] = "error";
468
+ MediaSessionStatus["Loading"] = "loading";
469
+ MediaSessionStatus["Paused"] = "paused";
470
+ MediaSessionStatus["Playing"] = "playing";
471
+ MediaSessionStatus["Processing"] = "processing";
472
+ MediaSessionStatus["Ready"] = "ready";
473
+ })(MediaSessionStatus || (MediaSessionStatus = {}));
474
+ /**
475
+ * Subsystem currently affecting session readiness or presentation.
476
+ */
477
+ var MediaSessionActivityKind;
478
+ (function (MediaSessionActivityKind) {
479
+ MediaSessionActivityKind["DetectionsBuffering"] = "detectionsBuffering";
480
+ MediaSessionActivityKind["DetectionsLoading"] = "detectionsLoading";
481
+ MediaSessionActivityKind["Error"] = "error";
482
+ MediaSessionActivityKind["MediaNormalizing"] = "mediaNormalizing";
483
+ MediaSessionActivityKind["MediaOpening"] = "mediaOpening";
484
+ MediaSessionActivityKind["PlaybackBuffering"] = "playbackBuffering";
485
+ MediaSessionActivityKind["RenderPreparing"] = "renderPreparing";
486
+ })(MediaSessionActivityKind || (MediaSessionActivityKind = {}));
487
+ /**
488
+ * State of one session activity.
489
+ */
490
+ var MediaSessionActivityStatus;
491
+ (function (MediaSessionActivityStatus) {
492
+ MediaSessionActivityStatus["Error"] = "error";
493
+ MediaSessionActivityStatus["Running"] = "running";
494
+ MediaSessionActivityStatus["Waiting"] = "waiting";
495
+ })(MediaSessionActivityStatus || (MediaSessionActivityStatus = {}));
496
+
497
+ const PNG_SIGNATURE = new Uint8Array([
498
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a,
499
+ ]);
500
+ function compositeMaskFrame(instructions) {
501
+ const maskInstructions = materializeMaskInstructions(instructions);
502
+ if (maskInstructions.length === 0) {
503
+ return undefined;
504
+ }
505
+ const width = Math.max(...maskInstructions.map(({ mask }) => mask.width));
506
+ const height = Math.max(...maskInstructions.map(({ mask }) => mask.height));
507
+ const data = new Uint8ClampedArray(new ArrayBuffer(width * height * 4));
508
+ for (const instruction of maskInstructions) {
509
+ compositeInstruction(data, width, instruction);
510
+ }
511
+ return { data, height, width };
512
+ }
513
+ async function createPngIdMaskFrame(instructions) {
514
+ const frame = createIdMaskFrame(materializeMaskInstructions(instructions));
515
+ if (!frame) {
516
+ return undefined;
517
+ }
518
+ return {
519
+ ...frame,
520
+ png: await encodeGrayscalePng({
521
+ height: frame.height,
522
+ pixels: frame.data,
523
+ width: frame.width,
524
+ }),
525
+ };
526
+ }
527
+ function compositeInstruction(rgba, canvasWidth, instruction) {
528
+ const decodedMask = decodeCompressedRleMask(instruction.mask);
529
+ const fill = resolveRgbaColor(instruction.color, instruction.alpha);
530
+ compositeMaskFill(rgba, canvasWidth, decodedMask, fill);
531
+ if (instruction.stroke) {
532
+ compositeMaskStroke(rgba, canvasWidth, decodedMask, instruction.stroke);
533
+ }
534
+ }
535
+ function materializeMaskInstructions(instructions) {
536
+ return instructions.map((instruction) => {
537
+ if (instruction.mask) {
538
+ return instruction;
539
+ }
540
+ const { height, points, width } = instruction.polygon;
541
+ return {
542
+ alpha: instruction.alpha,
543
+ color: instruction.color,
544
+ detectionIndex: instruction.detectionIndex,
545
+ mask: encodeBinaryMask(rasterizePolygonToMask(points, { height, width }), width, height),
546
+ stroke: instruction.stroke,
547
+ };
548
+ });
549
+ }
550
+ function compositeMaskFill(rgba, canvasWidth, decodedMask, fill) {
551
+ for (let y = 0; y < decodedMask.height; y += 1) {
552
+ for (let x = 0; x < decodedMask.width; x += 1) {
553
+ const maskOffset = y * decodedMask.width + x;
554
+ if (!decodedMask.data[maskOffset]) {
555
+ continue;
556
+ }
557
+ writePixel(rgba, canvasWidth, x, y, fill);
558
+ }
559
+ }
560
+ }
561
+ function compositeMaskStroke(rgba, canvasWidth, decodedMask, stroke) {
562
+ const width = Math.round(stroke.width);
563
+ if (width <= 0) {
564
+ return;
565
+ }
566
+ const strokeColor = resolveRgbaColor(stroke.color, stroke.alpha);
567
+ for (let y = 0; y < decodedMask.height; y += 1) {
568
+ for (let x = 0; x < decodedMask.width; x += 1) {
569
+ if (!isMaskPixel(decodedMask, x, y) ||
570
+ !isBoundaryPixel(decodedMask, x, y)) {
571
+ continue;
572
+ }
573
+ for (let offsetY = -width; offsetY <= width; offsetY += 1) {
574
+ for (let offsetX = -width; offsetX <= width; offsetX += 1) {
575
+ const strokeX = x + offsetX;
576
+ const strokeY = y + offsetY;
577
+ if (isOutsideMaskBounds(decodedMask, strokeX, strokeY) ||
578
+ isMaskPixel(decodedMask, strokeX, strokeY)) {
579
+ continue;
580
+ }
581
+ writePixel(rgba, canvasWidth, strokeX, strokeY, strokeColor);
582
+ }
583
+ }
584
+ }
585
+ }
586
+ }
587
+ function isBoundaryPixel(mask, x, y) {
588
+ for (let offsetY = -1; offsetY <= 1; offsetY += 1) {
589
+ for (let offsetX = -1; offsetX <= 1; offsetX += 1) {
590
+ if (offsetX === 0 && offsetY === 0) {
591
+ continue;
592
+ }
593
+ const neighborX = x + offsetX;
594
+ const neighborY = y + offsetY;
595
+ if (isOutsideMaskBounds(mask, neighborX, neighborY) ||
596
+ !isMaskPixel(mask, neighborX, neighborY)) {
597
+ return true;
598
+ }
599
+ }
600
+ }
601
+ return false;
602
+ }
603
+ function isMaskPixel(mask, x, y) {
604
+ return mask.data[y * mask.width + x] === 1;
605
+ }
606
+ function isOutsideMaskBounds(mask, x, y) {
607
+ return x < 0 || y < 0 || x >= mask.width || y >= mask.height;
608
+ }
609
+ function resolveRgbaColor(color, alpha) {
610
+ return {
611
+ alpha: Math.round(Math.max(0, Math.min(alpha, 1)) * 255),
612
+ blue: color & 0xff,
613
+ green: (color >> 8) & 0xff,
614
+ red: (color >> 16) & 0xff,
615
+ };
616
+ }
617
+ function writePixel(rgba, canvasWidth, x, y, color) {
618
+ const rgbaOffset = (y * canvasWidth + x) * 4;
619
+ rgba[rgbaOffset] = color.red;
620
+ rgba[rgbaOffset + 1] = color.green;
621
+ rgba[rgbaOffset + 2] = color.blue;
622
+ rgba[rgbaOffset + 3] = color.alpha;
623
+ }
624
+ async function encodeGrayscalePng(options) {
625
+ if (typeof CompressionStream === "undefined") {
626
+ throw new Error("CompressionStream is required to encode PNG ID masks.");
627
+ }
628
+ const rawScanlines = createFilterlessPngScanlines(options);
629
+ const ihdr = new Uint8Array(13);
630
+ const ihdrView = new DataView(ihdr.buffer);
631
+ ihdrView.setUint32(0, options.width);
632
+ ihdrView.setUint32(4, options.height);
633
+ ihdr[8] = 8;
634
+ ihdr[9] = 0;
635
+ ihdr[10] = 0;
636
+ ihdr[11] = 0;
637
+ ihdr[12] = 0;
638
+ const compressed = new Uint8Array(await new Response(new Blob([rawScanlines])
639
+ .stream()
640
+ .pipeThrough(new CompressionStream("deflate"))).arrayBuffer());
641
+ return concatUint8Arrays([
642
+ PNG_SIGNATURE,
643
+ createPngChunk("IHDR", ihdr),
644
+ createPngChunk("IDAT", compressed),
645
+ createPngChunk("IEND", new Uint8Array(0)),
646
+ ]);
647
+ }
648
+ function createFilterlessPngScanlines(options) {
649
+ const rowStride = options.width + 1;
650
+ const scanlines = new Uint8Array(rowStride * options.height);
651
+ for (let y = 0; y < options.height; y += 1) {
652
+ const sourceOffset = y * options.width;
653
+ const targetOffset = y * rowStride;
654
+ scanlines[targetOffset] = 0;
655
+ scanlines.set(options.pixels.subarray(sourceOffset, sourceOffset + options.width), targetOffset + 1);
656
+ }
657
+ return scanlines;
658
+ }
659
+ function createPngChunk(type, data) {
660
+ const typeBytes = new TextEncoder().encode(type);
661
+ const chunk = new Uint8Array(12 + data.length);
662
+ const view = new DataView(chunk.buffer);
663
+ view.setUint32(0, data.length);
664
+ chunk.set(typeBytes, 4);
665
+ chunk.set(data, 8);
666
+ view.setUint32(8 + data.length, crc32(concatUint8Arrays([typeBytes, data])));
667
+ return chunk;
668
+ }
669
+ const crc32Table = createCrc32Table();
670
+ function createCrc32Table() {
671
+ const table = new Uint32Array(256);
672
+ for (let index = 0; index < table.length; index += 1) {
673
+ let value = index;
674
+ for (let bit = 0; bit < 8; bit += 1) {
675
+ value = value & 1 ? 0xedb88320 ^ (value >>> 1) : value >>> 1;
676
+ }
677
+ table[index] = value >>> 0;
678
+ }
679
+ return table;
680
+ }
681
+ function crc32(bytes) {
682
+ let crc = 0xffffffff;
683
+ for (const byte of bytes) {
684
+ crc = crc32Table[(crc ^ byte) & 0xff] ^ (crc >>> 8);
685
+ }
686
+ return (crc ^ 0xffffffff) >>> 0;
687
+ }
688
+ function concatUint8Arrays(chunks) {
689
+ const totalLength = chunks.reduce((total, chunk) => total + chunk.length, 0);
690
+ const result = new Uint8Array(totalLength);
691
+ let offset = 0;
692
+ for (const chunk of chunks) {
693
+ result.set(chunk, offset);
694
+ offset += chunk.length;
695
+ }
696
+ return result;
697
+ }
698
+
699
+ var PreparedMaskFrameKind;
700
+ (function (PreparedMaskFrameKind) {
701
+ PreparedMaskFrameKind["PngIdMask"] = "pngIdMask";
702
+ PreparedMaskFrameKind["RgbaImage"] = "rgbaImage";
703
+ })(PreparedMaskFrameKind || (PreparedMaskFrameKind = {}));
704
+
705
+ var MaskPreparationWorkerMessageType;
706
+ (function (MaskPreparationWorkerMessageType) {
707
+ MaskPreparationWorkerMessageType["Complete"] = "complete";
708
+ MaskPreparationWorkerMessageType["Empty"] = "empty";
709
+ MaskPreparationWorkerMessageType["Error"] = "error";
710
+ MaskPreparationWorkerMessageType["Prepare"] = "prepare";
711
+ })(MaskPreparationWorkerMessageType || (MaskPreparationWorkerMessageType = {}));
712
+
713
+ const workerScope = globalThis;
714
+ workerScope.addEventListener("message", (event) => {
715
+ const message = event.data;
716
+ if (message.type !== MaskPreparationWorkerMessageType.Prepare) {
717
+ return;
718
+ }
719
+ void prepareMaskFrame(message);
720
+ });
721
+ async function prepareMaskFrame(message) {
722
+ try {
723
+ const pngIdMaskFrame = await createPngIdMaskWorkerResponse(message);
724
+ if (pngIdMaskFrame) {
725
+ workerScope.postMessage(pngIdMaskFrame, [
726
+ pngIdMaskFrame.imageBitmap,
727
+ pngIdMaskFrame.png.buffer,
728
+ pngIdMaskFrame.fillPalette.buffer,
729
+ pngIdMaskFrame.strokePalette.buffer,
730
+ pngIdMaskFrame.strokeWidths.buffer,
731
+ ]);
732
+ return;
733
+ }
734
+ const compositedFrame = compositeMaskFrame(message.job.instructions);
735
+ if (!compositedFrame) {
736
+ workerScope.postMessage({
737
+ key: message.job.key,
738
+ requestId: message.requestId,
739
+ type: MaskPreparationWorkerMessageType.Empty,
740
+ });
741
+ return;
742
+ }
743
+ const imageData = new ImageData(compositedFrame.data, compositedFrame.width, compositedFrame.height);
744
+ const imageBitmap = createImageBitmapFromImageData(imageData);
745
+ if (imageBitmap) {
746
+ workerScope.postMessage({
747
+ imageBitmap,
748
+ key: message.job.key,
749
+ requestId: message.requestId,
750
+ type: MaskPreparationWorkerMessageType.Complete,
751
+ }, [imageBitmap]);
752
+ return;
753
+ }
754
+ workerScope.postMessage({
755
+ imageData,
756
+ key: message.job.key,
757
+ requestId: message.requestId,
758
+ type: MaskPreparationWorkerMessageType.Complete,
759
+ }, [imageData.data.buffer]);
760
+ }
761
+ catch (error) {
762
+ workerScope.postMessage({
763
+ error: error instanceof Error
764
+ ? error.message
765
+ : "Unable to prepare mask frame.",
766
+ key: message.job.key,
767
+ requestId: message.requestId,
768
+ type: MaskPreparationWorkerMessageType.Error,
769
+ });
770
+ }
771
+ }
772
+ async function createPngIdMaskWorkerResponse(message) {
773
+ if (typeof Blob === "undefined" ||
774
+ typeof createImageBitmap === "undefined" ||
775
+ typeof CompressionStream === "undefined") {
776
+ return undefined;
777
+ }
778
+ let frame;
779
+ try {
780
+ frame = await createPngIdMaskFrame(message.job.instructions);
781
+ }
782
+ catch {
783
+ return undefined;
784
+ }
785
+ if (!frame) {
786
+ return undefined;
787
+ }
788
+ let imageBitmap;
789
+ try {
790
+ imageBitmap = await createImageBitmap(new Blob([frame.png], { type: "image/png" }));
791
+ }
792
+ catch {
793
+ return undefined;
794
+ }
795
+ return {
796
+ artifactKind: PreparedMaskFrameKind.PngIdMask,
797
+ fillPalette: frame.fillPalette,
798
+ hasStroke: frame.hasStroke,
799
+ imageBitmap,
800
+ key: message.job.key,
801
+ maxStrokeWidth: frame.maxStrokeWidth,
802
+ png: frame.png,
803
+ requestId: message.requestId,
804
+ strokePalette: frame.strokePalette,
805
+ strokeWidths: frame.strokeWidths,
806
+ type: MaskPreparationWorkerMessageType.Complete,
807
+ };
808
+ }
809
+ function createImageBitmapFromImageData(imageData) {
810
+ if (typeof OffscreenCanvas === "undefined") {
811
+ return null;
812
+ }
813
+ const canvas = new OffscreenCanvas(imageData.width, imageData.height);
814
+ const context = canvas.getContext("2d");
815
+ if (!context) {
816
+ return null;
817
+ }
818
+ context.putImageData(imageData, 0, 0);
819
+ return canvas.transferToImageBitmap();
820
+ }
821
+
822
+ })();
823
+ //# sourceMappingURL=mask-preparation.worker.js.map