@jbrowse/render-core 5.0.0-beta.13 → 5.0.0-beta.14

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 (153) hide show
  1. package/esm/OverlayCanvas.d.ts +3 -2
  2. package/esm/OverlayCanvas.js +4 -2
  3. package/esm/RenderCanvas.d.ts +4 -3
  4. package/esm/RenderCanvas.js +4 -2
  5. package/esm/ScrollLockedOverlay.d.ts +2 -2
  6. package/esm/ScrollLockedOverlay.js +3 -2
  7. package/esm/blockClipUtils.d.ts +5 -5
  8. package/esm/blockClipUtils.js +4 -3
  9. package/esm/canvas2dUtils.d.ts +15 -21
  10. package/esm/canvas2dUtils.js +25 -55
  11. package/esm/colorRampLut.d.ts +2 -2
  12. package/esm/colorRampLut.js +2 -2
  13. package/esm/coverageBand.d.ts +0 -1
  14. package/esm/coverageBand.js +0 -5
  15. package/esm/coverageBandBuffers.d.ts +8 -5
  16. package/esm/createRenderingBackend.d.ts +1 -1
  17. package/esm/displayPhase.d.ts +5 -9
  18. package/esm/displayPhase.js +2 -2
  19. package/esm/hal/mockHal.d.ts +3 -4
  20. package/esm/hal/mockHal.js +5 -4
  21. package/esm/hal/types.d.ts +5 -5
  22. package/esm/hal/webgl2Hal.d.ts +4 -1
  23. package/esm/hal/webgl2Hal.js +15 -6
  24. package/esm/hal/webgpuHal.js +2 -2
  25. package/esm/linkFeet.d.ts +4 -0
  26. package/esm/linkFeet.js +7 -0
  27. package/esm/marks/barMark.d.ts +1 -1
  28. package/esm/marks/colorFill.d.ts +4 -4
  29. package/esm/marks/colorFill.js +4 -4
  30. package/esm/marks/connectorMark.d.ts +48 -0
  31. package/esm/marks/connectorMark.js +285 -0
  32. package/esm/marks/drawAgainstHit.d.ts +1 -1
  33. package/esm/marks/drawAgainstHit.js +4 -4
  34. package/esm/marks/glyphPaint.d.ts +5 -4
  35. package/esm/marks/glyphPaint.js +17 -7
  36. package/esm/marks/index.d.ts +6 -3
  37. package/esm/marks/index.js +5 -3
  38. package/esm/marks/lineMark.d.ts +44 -10
  39. package/esm/marks/lineMark.js +20 -19
  40. package/esm/marks/linkMark.d.ts +22 -5
  41. package/esm/marks/linkMark.js +103 -25
  42. package/esm/marks/markBackend.d.ts +1 -1
  43. package/esm/marks/markBackend.js +1 -1
  44. package/esm/marks/markRamp.d.ts +11 -11
  45. package/esm/marks/markRamp.js +9 -9
  46. package/esm/marks/pointMark.d.ts +11 -5
  47. package/esm/marks/pointMark.js +34 -9
  48. package/esm/marks/rowLane.d.ts +3 -3
  49. package/esm/marks/rowLane.js +2 -2
  50. package/esm/marks/rowTable.d.ts +5 -5
  51. package/esm/marks/rowTable.js +4 -4
  52. package/esm/marks/ruleMark.js +1 -0
  53. package/esm/marks/spanMark.d.ts +4 -4
  54. package/esm/marks/types.d.ts +4 -4
  55. package/esm/marks/types.js +5 -0
  56. package/esm/perRegionRenderingBackend.d.ts +1 -1
  57. package/esm/perRegionRenderingBackend.js +1 -1
  58. package/esm/regionDataMap.d.ts +2 -2
  59. package/esm/regionDataMap.js +2 -2
  60. package/esm/shaders/capsule.js.generated.d.ts +1 -1
  61. package/esm/shaders/capsule.js.generated.js +2 -2
  62. package/esm/shaders/connectorMark.consts.generated.d.ts +11 -0
  63. package/esm/shaders/connectorMark.consts.generated.js +13 -0
  64. package/esm/shaders/{coverageIndicator.generated.d.ts → connectorMark.generated.d.ts} +2 -1
  65. package/esm/shaders/connectorMark.generated.js +8 -0
  66. package/esm/shaders/connectorMark.glsl.generated.d.ts +2 -0
  67. package/esm/shaders/connectorMark.glsl.generated.js +4 -0
  68. package/esm/shaders/connectorMark.iface.generated.d.ts +88 -0
  69. package/esm/shaders/connectorMark.iface.generated.js +1194 -0
  70. package/esm/shaders/connectorMark.js.generated.d.ts +5 -0
  71. package/esm/shaders/connectorMark.js.generated.js +47 -0
  72. package/esm/shaders/connectorMark.wgsl.generated.d.ts +1 -0
  73. package/esm/shaders/connectorMark.wgsl.generated.js +3 -0
  74. package/esm/shaders/coverageInterbase.glsl.generated.d.ts +1 -1
  75. package/esm/shaders/coverageInterbase.glsl.generated.js +1 -1
  76. package/esm/shaders/coverageInterbase.wgsl.generated.d.ts +1 -1
  77. package/esm/shaders/coverageInterbase.wgsl.generated.js +1 -1
  78. package/esm/shaders/curveDistance.js.generated.d.ts +3 -0
  79. package/esm/shaders/curveDistance.js.generated.js +104 -0
  80. package/esm/shaders/lineCenterMark.glsl.generated.d.ts +2 -2
  81. package/esm/shaders/lineCenterMark.glsl.generated.js +2 -2
  82. package/esm/shaders/lineCenterMark.wgsl.generated.d.ts +1 -1
  83. package/esm/shaders/lineCenterMark.wgsl.generated.js +1 -1
  84. package/esm/shaders/linkMark.consts.generated.d.ts +1 -0
  85. package/esm/shaders/linkMark.consts.generated.js +1 -0
  86. package/esm/shaders/linkMark.glsl.generated.d.ts +2 -2
  87. package/esm/shaders/linkMark.glsl.generated.js +2 -2
  88. package/esm/shaders/linkMark.js.generated.d.ts +2 -1
  89. package/esm/shaders/linkMark.js.generated.js +30 -1
  90. package/esm/shaders/linkMark.wgsl.generated.d.ts +1 -1
  91. package/esm/shaders/linkMark.wgsl.generated.js +1 -1
  92. package/esm/shaders/pointMark.glsl.generated.d.ts +1 -1
  93. package/esm/shaders/pointMark.glsl.generated.js +1 -1
  94. package/esm/shaders/pointMark.iface.generated.d.ts +10 -8
  95. package/esm/shaders/pointMark.iface.generated.js +18 -16
  96. package/esm/shaders/pointMark.wgsl.generated.d.ts +1 -1
  97. package/esm/shaders/pointMark.wgsl.generated.js +1 -1
  98. package/package.json +7 -4
  99. package/src/shaders/arcHull.test.ts +87 -0
  100. package/src/shaders/barMark.slang +2 -2
  101. package/src/shaders/capsule.js.generated.ts +2 -2
  102. package/src/shaders/capsule.slang +69 -24
  103. package/src/shaders/clipStrip.slang +1 -1
  104. package/src/shaders/colorPack.slang +2 -2
  105. package/src/shaders/colorRampLut.slang +7 -7
  106. package/src/shaders/connectorMark.consts.generated.ts +24 -0
  107. package/src/shaders/connectorMark.generated.ts +12 -0
  108. package/src/shaders/connectorMark.glsl.generated.ts +6 -0
  109. package/src/shaders/connectorMark.iface.generated.ts +1270 -0
  110. package/src/shaders/connectorMark.js.generated.ts +52 -0
  111. package/src/shaders/connectorMark.slang +287 -0
  112. package/src/shaders/connectorMark.wgsl.generated.ts +4 -0
  113. package/src/shaders/coverageBand.slang +10 -12
  114. package/src/shaders/coverageInterbase.glsl.generated.ts +1 -1
  115. package/src/shaders/coverageInterbase.slang +24 -21
  116. package/src/shaders/coverageInterbase.wgsl.generated.ts +1 -1
  117. package/src/shaders/coverageSnp.slang +1 -1
  118. package/src/shaders/curveDistance.js.generated.ts +100 -0
  119. package/src/shaders/curveDistance.slang +104 -1
  120. package/src/shaders/farDome.test.ts +117 -0
  121. package/src/shaders/hpClampFloor.test.ts +0 -4
  122. package/src/shaders/lineCenterMark.glsl.generated.ts +2 -2
  123. package/src/shaders/lineCenterMark.slang +14 -22
  124. package/src/shaders/lineCenterMark.wgsl.generated.ts +1 -1
  125. package/src/shaders/lineCommon.slang +10 -10
  126. package/src/shaders/lineStepMark.slang +5 -5
  127. package/src/shaders/linkMark.consts.generated.ts +2 -0
  128. package/src/shaders/linkMark.glsl.generated.ts +2 -2
  129. package/src/shaders/linkMark.js.generated.ts +27 -1
  130. package/src/shaders/linkMark.slang +58 -18
  131. package/src/shaders/linkMark.wgsl.generated.ts +1 -1
  132. package/src/shaders/markColor.slang +10 -10
  133. package/src/shaders/pointMark.glsl.generated.ts +1 -1
  134. package/src/shaders/pointMark.iface.generated.ts +19 -16
  135. package/src/shaders/pointMark.slang +12 -8
  136. package/src/shaders/pointMark.wgsl.generated.ts +1 -1
  137. package/src/shaders/rowRect.slang +3 -3
  138. package/src/shaders/rowTable.slang +7 -7
  139. package/src/shaders/scoreScale.slang +1 -1
  140. package/src/shaders/spanMark.slang +5 -5
  141. package/src/shaders/viewRegion.slang +13 -0
  142. package/esm/shaders/coverageIndicator.generated.js +0 -7
  143. package/esm/shaders/coverageIndicator.glsl.generated.d.ts +0 -2
  144. package/esm/shaders/coverageIndicator.glsl.generated.js +0 -4
  145. package/esm/shaders/coverageIndicator.iface.generated.d.ts +0 -85
  146. package/esm/shaders/coverageIndicator.iface.generated.js +0 -114
  147. package/esm/shaders/coverageIndicator.wgsl.generated.d.ts +0 -1
  148. package/esm/shaders/coverageIndicator.wgsl.generated.js +0 -3
  149. package/src/shaders/coverageIndicator.generated.ts +0 -11
  150. package/src/shaders/coverageIndicator.glsl.generated.ts +0 -6
  151. package/src/shaders/coverageIndicator.iface.generated.ts +0 -172
  152. package/src/shaders/coverageIndicator.slang +0 -61
  153. package/src/shaders/coverageIndicator.wgsl.generated.ts +0 -4
@@ -7,10 +7,24 @@ import { slangPass } from '../slangPass.js';
7
7
  import { abgrToCssRgba } from './colorFill.js';
8
8
  import { appendGlyph, glyphBox } from './glyphPaint.js';
9
9
  import { inkAtPoint, nearestInk } from './markHit.js';
10
- import { colorBits, paintColors, rampUniforms } from './markRamp.js';
10
+ import { colorBits, instanceColor, paintColors, rampUniforms, } from './markRamp.js';
11
11
  import { valueWindow } from './nearestMarkHit.js';
12
12
  import { bandHeightPx, rowColor, rowLane, rowSlot, rowTableKeys, rowTableTextures, } from './rowLane.js';
13
13
  import { valueScaleUniforms } from './valueScale.js';
14
+ const NO_VALUES = new Float32Array(0);
15
+ /** The channels cut down to instance `i`, for its own painter to trace alone. */
16
+ export function pointInstance(c, i) {
17
+ const { glyph } = c;
18
+ return {
19
+ x: c.x.subarray(i, i + 1),
20
+ x2: c.x2.subarray(i, i + 1),
21
+ y: c.y?.subarray(i, i + 1),
22
+ glyph: typeof glyph === 'number' ? glyph : glyph.subarray(i, i + 1),
23
+ row: c.row?.subarray(i, i + 1),
24
+ color: instanceColor(c.color, i),
25
+ count: 1,
26
+ };
27
+ }
14
28
  /**
15
29
  * The point shader's uniforms, which the rule shape draws through too:
16
30
  * `radiusPx` is half a glyph or half a rule's thickness.
@@ -29,6 +43,7 @@ export function writePointUniforms(scratch, clip, block, frame, params, shape) {
29
43
  // stretched ellipses on hi-DPI.
30
44
  viewportWidth: clip.scissorW,
31
45
  radiusPx: shape.radiusPx,
46
+ triangleRadiusYPx: shape.triangleRadiusYPx,
32
47
  rowHeight: bandHeightPx(params, frame.canvasHeight),
33
48
  rowOffsetPx: params.rowOffsetPx ?? 0,
34
49
  reverse: params.reverse ? 1 : 0,
@@ -43,11 +58,21 @@ export const pointMark = {
43
58
  id: 'point',
44
59
  pass: {
45
60
  ...slangPass({ id: 'point', mod: shader }),
46
- pack: c => shader.packInstances({ ...c, color: colorBits(c, c.count), row: rowLane(c.row, c.count) }, c.count),
61
+ pack: c => shader.packInstances({
62
+ x: c.x,
63
+ x2: c.x2,
64
+ y: c.y ?? (c.count === 0 ? NO_VALUES : new Float32Array(c.count)),
65
+ glyph: typeof c.glyph === 'number'
66
+ ? new Uint8Array(c.count).fill(c.glyph)
67
+ : c.glyph,
68
+ color: colorBits(c, c.count),
69
+ row: rowLane(c.row, c.count),
70
+ }, c.count),
47
71
  },
48
72
  writeUniforms(scratch, clip, block, frame, params) {
49
73
  writePointUniforms(scratch, clip, block, frame, params, {
50
74
  radiusPx: params.diameterPx / 2,
75
+ triangleRadiusYPx: (params.triangleHeightPx ?? params.diameterPx) / 2,
51
76
  rule: false,
52
77
  minWidthPx: 0,
53
78
  });
@@ -59,7 +84,7 @@ export const pointMark = {
59
84
  return;
60
85
  }
61
86
  const color = paintColors(channels, count, params.colorScale);
62
- const { diameterPx, domain, insetPx = 0, rowOffsetPx: top = 0, rowTable: table, } = params;
87
+ const { diameterPx, triangleHeightPx = diameterPx, domain, insetPx = 0, rowOffsetPx: top = 0, rowTable: table, } = params;
63
88
  const reverse = params.reverse ? 1 : 0;
64
89
  const band = bandHeightPx(params, frame.canvasHeight);
65
90
  const domainMin = domain[0];
@@ -81,8 +106,8 @@ export const pointMark = {
81
106
  ctx.fillStyle = abgrToCssRgba(abgr);
82
107
  }
83
108
  path.add();
84
- const yPx = pointRowYPx(rowBandTopPx(top, band, slot), band, reverse, pointYPx(y[i], domainMin, domainMax, band, st, insetPx, c));
85
- appendGlyph(ctx, glyph[i], (bpToPx(x[i]) + bpToPx(x2[i])) / 2, yPx, diameterPx);
109
+ const yPx = pointRowYPx(rowBandTopPx(top, band, slot), band, reverse, pointYPx(y ? y[i] : 0, domainMin, domainMax, band, st, insetPx, c));
110
+ appendGlyph(ctx, typeof glyph === 'number' ? glyph : glyph[i], (bpToPx(x[i]) + bpToPx(x2[i])) / 2, yPx, diameterPx, triangleHeightPx);
86
111
  }
87
112
  path.flush();
88
113
  },
@@ -93,12 +118,12 @@ export const pointMark = {
93
118
  if (slot === undefined) {
94
119
  return undefined;
95
120
  }
96
- const { diameterPx, domain, insetPx = 0 } = params;
121
+ const { diameterPx, triangleHeightPx, domain, insetPx = 0 } = params;
97
122
  const bpToPx = makeBpMapper(block);
98
123
  const band = bandHeightPx(params, frame.canvasHeight);
99
124
  const { valueScaleType: st, valueSymlogConstant: c } = valueScaleUniforms(params);
100
- const cy = pointRowYPx(rowBandTopPx(params.rowOffsetPx ?? 0, band, slot), band, params.reverse ? 1 : 0, pointYPx(y[i], domain[0], domain[1], band, st, insetPx, c));
101
- return glyphBox(glyph[i], (bpToPx(x[i]) + bpToPx(x2[i])) / 2, cy, diameterPx);
125
+ const cy = pointRowYPx(rowBandTopPx(params.rowOffsetPx ?? 0, band, slot), band, params.reverse ? 1 : 0, pointYPx(y ? y[i] : 0, domain[0], domain[1], band, st, insetPx, c));
126
+ return glyphBox(typeof glyph === 'number' ? glyph : glyph[i], (bpToPx(x[i]) + bpToPx(x2[i])) / 2, cy, diameterPx, triangleHeightPx);
102
127
  },
103
128
  // Its own rather than the one `ink` implies: a dense plot stacks glyphs
104
129
  // whose boxes all contain the cursor at distance 0, and the one under the
@@ -117,7 +142,7 @@ export const pointMark = {
117
142
  if (slot === undefined) {
118
143
  return undefined;
119
144
  }
120
- const cy = pointRowYPx(rowBandTopPx(top, band, slot), band, reverse, pointYPx(y[i], domainMin, domainMax, band, st, insetPx, c));
145
+ const cy = pointRowYPx(rowBandTopPx(top, band, slot), band, reverse, pointYPx(y ? y[i] : 0, domainMin, domainMax, band, st, insetPx, c));
121
146
  return inkAtPoint(xPx, yPx, (bpToPx(x[i]) + bpToPx(x2[i])) / 2, cy);
122
147
  });
123
148
  },
@@ -15,7 +15,7 @@ export interface RowParams {
15
15
  rowOffsetPx?: number;
16
16
  /**
17
17
  * The table `row` is read through as a key: its drawn slot, hidden, or a
18
- * colour override. Absent, `row` is the slot.
18
+ * color override. Absent, `row` is the slot.
19
19
  */
20
20
  rowTable?: RowTable;
21
21
  }
@@ -35,7 +35,7 @@ export declare function bandHeightPx(params: RowParams, canvasHeight: number): n
35
35
  export declare function keySlot(key: number, table: RowTable | undefined): number | undefined;
36
36
  /** The slot instance `i` is drawn on, undefined where the table hides its key. */
37
37
  export declare function rowSlot(row: Uint32Array | undefined, i: number, table: RowTable | undefined): number | undefined;
38
- /** Instance `i`'s key's colour override, undefined where it keeps its own. */
38
+ /** Instance `i`'s key's color override, undefined where it keeps its own. */
39
39
  export declare function rowColorOverride(row: Uint32Array | undefined, i: number, table: RowTable | undefined): number | undefined;
40
- /** The colour instance `i` is drawn in: its key's override, else `color`. */
40
+ /** The color instance `i` is drawn in: its key's override, else `color`. */
41
41
  export declare function rowColor(color: number, row: Uint32Array | undefined, i: number, table: RowTable | undefined): number;
@@ -33,13 +33,13 @@ export function keySlot(key, table) {
33
33
  export function rowSlot(row, i, table) {
34
34
  return keySlot(rowKey(row, i), table);
35
35
  }
36
- /** Instance `i`'s key's colour override, undefined where it keeps its own. */
36
+ /** Instance `i`'s key's color override, undefined where it keeps its own. */
37
37
  export function rowColorOverride(row, i, table) {
38
38
  const key = rowKey(row, i);
39
39
  const override = table && key < table.keys ? table.color[key] : NO_ROW_COLOR;
40
40
  return override >>> 24 === 0 ? undefined : override;
41
41
  }
42
- /** The colour instance `i` is drawn in: its key's override, else `color`. */
42
+ /** The color instance `i` is drawn in: its key's override, else `color`. */
43
43
  export function rowColor(color, row, i, table) {
44
44
  return rowColorOverride(row, i, table) ?? color;
45
45
  }
@@ -1,15 +1,15 @@
1
1
  import type { MarkTexels } from './types.ts';
2
2
  /** The `slot` a hidden key holds. */
3
3
  export declare const HIDDEN_ROW = 4294967295;
4
- /** The `color` a key with no override holds: alpha 0, the instance's own colour. */
4
+ /** The `color` a key with no override holds: alpha 0, the instance's own color. */
5
5
  export declare const NO_ROW_COLOR = 0;
6
6
  /**
7
7
  * The row axis as a pass reads it: each key's drawn slot or `HIDDEN_ROW`, its
8
- * packed ABGR colour override or `NO_ROW_COLOR`, and the RGBA8 texture the
8
+ * packed ABGR color override or `NO_ROW_COLOR`, and the RGBA8 texture the
9
9
  * vertex stage samples for the same answers (`shaders/rowTable.slang` has the
10
10
  * layout). One object, so the shader, the painter, the ink and the hit test
11
11
  * cannot place a key differently. Immutable: a reorder, focus, hide or
12
- * recolour builds a new one, and the backend uploads on identity.
12
+ * recolor builds a new one, and the backend uploads on identity.
13
13
  */
14
14
  export interface RowTable {
15
15
  readonly keys: number;
@@ -20,7 +20,7 @@ export interface RowTable {
20
20
  /**
21
21
  * The table for `slot[key]` and `color[key]`, both indexed by key: `slot` is
22
22
  * `HIDDEN_ROW` where the key draws nothing, `color` is `NO_ROW_COLOR` where the
23
- * instance keeps its own colour, an override alpha 0 being none. Both arrays
23
+ * instance keeps its own color, an override alpha 0 being none. Both arrays
24
24
  * are held, not copied. Each key's texel sits where the shader's own twins
25
25
  * put it.
26
26
  */
@@ -29,7 +29,7 @@ export declare function buildRowTable(slot: Uint32Array, color?: Uint32Array): R
29
29
  * The keys a display's rows carry across every region: a name's key is
30
30
  * assigned the first time it is asked for and never moves, so a region encoded
31
31
  * against the registry stays valid as later regions add names and the table
32
- * alone follows the reader's order, focus and colours. Grows only.
32
+ * alone follows the reader's order, focus and colors. Grows only.
33
33
  */
34
34
  export declare class RowKeys {
35
35
  private readonly index;
@@ -1,20 +1,20 @@
1
1
  import { rowTablePlaneHeight, rowTableTexelX, rowTableTexelY, rowTableWidth, } from '../shaders/rowTable.js.generated.js';
2
2
  /** The `slot` a hidden key holds. */
3
3
  export const HIDDEN_ROW = 0xffffffff;
4
- /** The `color` a key with no override holds: alpha 0, the instance's own colour. */
4
+ /** The `color` a key with no override holds: alpha 0, the instance's own color. */
5
5
  export const NO_ROW_COLOR = 0;
6
6
  const MAX_SLOT = 0xffffff;
7
7
  /**
8
8
  * The table for `slot[key]` and `color[key]`, both indexed by key: `slot` is
9
9
  * `HIDDEN_ROW` where the key draws nothing, `color` is `NO_ROW_COLOR` where the
10
- * instance keeps its own colour, an override alpha 0 being none. Both arrays
10
+ * instance keeps its own color, an override alpha 0 being none. Both arrays
11
11
  * are held, not copied. Each key's texel sits where the shader's own twins
12
12
  * put it.
13
13
  */
14
14
  export function buildRowTable(slot, color = new Uint32Array(slot.length)) {
15
15
  const keys = slot.length;
16
16
  if (color.length !== keys) {
17
- throw new Error(`buildRowTable: ${keys} slots but ${color.length} colours; both are per key`);
17
+ throw new Error(`buildRowTable: ${keys} slots but ${color.length} colors; both are per key`);
18
18
  }
19
19
  const width = rowTableWidth(keys);
20
20
  const plane = rowTablePlaneHeight(keys);
@@ -51,7 +51,7 @@ export function buildRowTable(slot, color = new Uint32Array(slot.length)) {
51
51
  * The keys a display's rows carry across every region: a name's key is
52
52
  * assigned the first time it is asked for and never moves, so a region encoded
53
53
  * against the registry stays valid as later regions add names and the table
54
- * alone follows the reader's order, focus and colours. Grows only.
54
+ * alone follows the reader's order, focus and colors. Grows only.
55
55
  */
56
56
  export class RowKeys {
57
57
  index = new Map();
@@ -59,6 +59,7 @@ export const ruleMark = {
59
59
  writeUniforms(scratch, clip, block, frame, params) {
60
60
  writePointUniforms(scratch, clip, block, frame, params, {
61
61
  radiusPx: params.sizePx / 2,
62
+ triangleRadiusYPx: params.sizePx / 2,
62
63
  rule: true,
63
64
  minWidthPx: params.minWidthPx,
64
65
  });
@@ -2,8 +2,8 @@ import type { ColorChannel } from './markRamp.ts';
2
2
  import type { RowTable } from './rowTable.ts';
3
3
  import type { MarkColorScale, MarkShape } from './types.ts';
4
4
  /**
5
- * The `span` shape's channels: a coloured rectangle from `x` to `x2` on the
6
- * band belonging to `row`, its colour packed or, under a colour scale, the
5
+ * The `span` shape's channels: a colored rectangle from `x` to `x2` on the
6
+ * band belonging to `row`, its color packed or, under a color scale, the
7
7
  * value it resolves from.
8
8
  */
9
9
  export interface SpanChannels extends ColorChannel {
@@ -14,7 +14,7 @@ export interface SpanChannels extends ColorChannel {
14
14
  count: number;
15
15
  }
16
16
  export interface SpanParams {
17
- /** The quantitative colour scale, for a span whose colour is a ramp or a threshold. */
17
+ /** The quantitative color scale, for a span whose color is a ramp or a threshold. */
18
18
  colorScale?: MarkColorScale;
19
19
  /** CSS px per row. */
20
20
  rowHeight: number;
@@ -36,7 +36,7 @@ export interface SpanParams {
36
36
  scrollTop: number;
37
37
  /**
38
38
  * The table `row` is read through as a key: its drawn slot, hidden, or a
39
- * colour override. Absent, `row` is the slot.
39
+ * color override. Absent, `row` is the slot.
40
40
  */
41
41
  rowTable?: RowTable;
42
42
  }
@@ -32,7 +32,7 @@ export interface MarkContext2D extends ClipContext2D {
32
32
  drawImage?(image: CanvasImageSource, sx: number, sy: number, sw: number, sh: number, dx: number, dy: number, dw: number, dh: number): void;
33
33
  }
34
34
  /**
35
- * A canvas a mark's pass samples in place of a colour ramp. Hand a fresh object
35
+ * A canvas a mark's pass samples in place of a color ramp. Hand a fresh object
36
36
  * per repaint: the backend uploads on identity.
37
37
  */
38
38
  export interface MarkImage {
@@ -60,7 +60,7 @@ export type MarkTextures = Readonly<Record<string, MarkTexture | undefined>>;
60
60
  export type MarkFrame = FrameDimensions;
61
61
  export type MarkValueScaleType = 'linear' | 'log' | 'symlog';
62
62
  /**
63
- * The colour scale a ramp channel's raw `colorValue`s resolve through each
63
+ * The color scale a ramp channel's raw `colorValue`s resolve through each
64
64
  * frame, with the 256-entry RGBA LUT the pass's sampler binds: straight, its
65
65
  * middle stop at the middle, and `mid`, where a diverging ramp puts that stop,
66
66
  * read through a uniform.
@@ -76,13 +76,13 @@ export interface MarkRamp {
76
76
  * A threshold a value channel's raw `colorValue`s resolve through each frame:
77
77
  * the ascending cut points, at most `MAX_COLOR_CUTS` of them, and one packed
78
78
  * ABGR per interval between them, `cuts.length + 1` in all. The cuts and
79
- * colours ride uniforms, so an edit moves them and uploads no instance bytes.
79
+ * colors ride uniforms, so an edit moves them and uploads no instance bytes.
80
80
  */
81
81
  export interface MarkThreshold {
82
82
  cuts: readonly number[];
83
83
  colors: Uint32Array;
84
84
  }
85
- /** The scale a quantitative colour channel resolves through: a ramp or a threshold. */
85
+ /** The scale a quantitative color channel resolves through: a ramp or a threshold. */
86
86
  export type MarkColorScale = MarkRamp | MarkThreshold;
87
87
  /** A horizontal strip of the canvas, in CSS px down from its top edge. */
88
88
  export interface MarkBand {
@@ -106,6 +106,11 @@ export function defineMark(spec) {
106
106
  hal.setScissor(clip.pxX, scissor.top, clip.pxW, scissor.height);
107
107
  }
108
108
  if (staged?.writer !== shape.writeUniforms || staged.params !== params) {
109
+ // A generated packer drops whatever lands past the end of a short
110
+ // buffer, which draws the pass from zeros with nothing said.
111
+ if (scratch.byteLength < shape.pass.uniformByteSize) {
112
+ throw new Error(`${shape.pass.id} writes ${shape.pass.uniformByteSize} bytes of uniforms into a ${scratch.byteLength}-byte scratch`);
113
+ }
109
114
  shape.writeUniforms(scratch, clip, block, state, p);
110
115
  hal.writeUniforms(scratch);
111
116
  if (staged) {
@@ -66,7 +66,7 @@ export declare abstract class Canvas2DPerRegionRenderingBackend<UploadData, Rend
66
66
  * `prepareCanvas`'s `clearRect` as the whole of it, which is transparent.
67
67
  * Synteny is the one display that overrides: its indel wedges pre-blend
68
68
  * against a KNOWN ground and only agree with the base ribbon beside them over
69
- * a destination that really is that colour.
69
+ * a destination that really is that color.
70
70
  */
71
71
  protected clearColor(_state: RenderState): ClearColor | undefined;
72
72
  /**
@@ -37,7 +37,7 @@ export class Canvas2DPerRegionRenderingBackend extends Canvas2DRenderingBackendB
37
37
  * `prepareCanvas`'s `clearRect` as the whole of it, which is transparent.
38
38
  * Synteny is the one display that overrides: its indel wedges pre-blend
39
39
  * against a KNOWN ground and only agree with the base ribbon beside them over
40
- * a destination that really is that colour.
40
+ * a destination that really is that color.
41
41
  */
42
42
  clearColor(_state) {
43
43
  return undefined;
@@ -7,8 +7,8 @@ export declare function isCheckedAtTheStore(map: ReadonlyMap<unknown, unknown>):
7
7
  * ADR-060.
8
8
  *
9
9
  * **Shallow, and that follows from an invariant the codebase already states**:
10
- * per-region values are freshly constructed and never mutated (agent-docs
11
- * CLAUDE.md; backends diff by reference identity). Nothing inside an entry can
10
+ * per-region values are freshly constructed and never mutated (ADR-060;
11
+ * backends diff by reference identity). Nothing inside an entry can
12
12
  * therefore change, so the deep enhancer's field-level atoms can never fire —
13
13
  * they are unreachable reactivity, not a safety margin. What they do cost is
14
14
  * paid on every insert and every read:
@@ -17,8 +17,8 @@ export function isCheckedAtTheStore(map) {
17
17
  * ADR-060.
18
18
  *
19
19
  * **Shallow, and that follows from an invariant the codebase already states**:
20
- * per-region values are freshly constructed and never mutated (agent-docs
21
- * CLAUDE.md; backends diff by reference identity). Nothing inside an entry can
20
+ * per-region values are freshly constructed and never mutated (ADR-060;
21
+ * backends diff by reference identity). Nothing inside an entry can
22
22
  * therefore change, so the deep enhancer's field-level atoms can never fire —
23
23
  * they are unreachable reactivity, not a safety margin. What they do cost is
24
24
  * paid on every insert and every read:
@@ -1 +1 @@
1
- export declare function capsuleDistPx(alongPx: number, acrossPx: number, halfLenPx: number): number;
1
+ export declare function capsuleDistPx(fromStartPx: number, fromEndPx: number, acrossPx: number): number;
@@ -5,7 +5,7 @@
5
5
  function _max(a, b) {
6
6
  return b > a || Number.isNaN(a) ? b : a;
7
7
  }
8
- export function capsuleDistPx(alongPx, acrossPx, halfLenPx) {
9
- let _t0 = _max((Math.abs(alongPx) - halfLenPx), 0.0);
8
+ export function capsuleDistPx(fromStartPx, fromEndPx, acrossPx) {
9
+ let _t0 = _max(_max(-fromStartPx, -fromEndPx), 0.0);
10
10
  return Math.sqrt(((_t0 * _t0) + (acrossPx * acrossPx)));
11
11
  }
@@ -0,0 +1,11 @@
1
+ export declare const CONNECTOR_CURVE_SEGMENTS = 48;
2
+ export declare const CONNECTOR_BOW = -1e+30;
3
+ export declare const CONNECTOR_MAX_REACH_PX = 110;
4
+ export declare const CONNECTOR_APEX_RATIO = 0.75;
5
+ export declare const CONNECTOR_MAX_HANDLE_PX = 200;
6
+ export declare const CONNECTOR_MINUS_1 = 1;
7
+ export declare const CONNECTOR_MINUS_2 = 2;
8
+ export declare const CONNECTOR_LEADING_2 = 4;
9
+ export declare const CONNECTOR_STRAIGHT = 8;
10
+ export declare const CONNECTOR_DASHED = 16;
11
+ export declare const CONNECTOR_ARROW = 32;
@@ -0,0 +1,13 @@
1
+ // AUTO-GENERATED by packages/shader-tools/src/shader-codegen from connectorMark.slang.
2
+ // Do not edit. Run `pnpm gen:shaders` to regenerate.
3
+ export const CONNECTOR_CURVE_SEGMENTS = 48;
4
+ export const CONNECTOR_BOW = -1e+30;
5
+ export const CONNECTOR_MAX_REACH_PX = 110;
6
+ export const CONNECTOR_APEX_RATIO = 0.75;
7
+ export const CONNECTOR_MAX_HANDLE_PX = 200;
8
+ export const CONNECTOR_MINUS_1 = 1;
9
+ export const CONNECTOR_MINUS_2 = 2;
10
+ export const CONNECTOR_LEADING_2 = 4;
11
+ export const CONNECTOR_STRAIGHT = 8;
12
+ export const CONNECTOR_DASHED = 16;
13
+ export const CONNECTOR_ARROW = 32;
@@ -1,3 +1,4 @@
1
1
  import type { ShaderSource } from '@jbrowse/render-core/hal';
2
- export * from './coverageIndicator.iface.generated.ts';
2
+ export * from './connectorMark.iface.generated.ts';
3
+ export * from './connectorMark.consts.generated.ts';
3
4
  export declare const SOURCE: ShaderSource;
@@ -0,0 +1,8 @@
1
+ // AUTO-GENERATED by packages/shader-tools/src/shader-codegen from connectorMark.slang.
2
+ // Do not edit. Run `pnpm gen:shaders` to regenerate.
3
+ export * from './connectorMark.iface.generated.js';
4
+ export * from './connectorMark.consts.generated.js';
5
+ export const SOURCE = {
6
+ wgsl: () => import('./connectorMark.wgsl.generated.js'),
7
+ glsl: () => import('./connectorMark.glsl.generated.js'),
8
+ };
@@ -0,0 +1,2 @@
1
+ export declare const GLSL_VERTEX = "#version 300 es\nprecision highp float;\nprecision highp int;\n\n\n\nlayout(std140) uniform Uniforms\n{\n float canvasHeight_0;\n float canvasWidth_0;\n float devicePixelRatio_0;\n float rowOffsetPx_0;\n float rowPitchPx_0;\n float maxHandlePx_0;\n float dashPx_0;\n float gapPx_0;\n float arrowPx_0;\n uint regionCount_0;\n float zero_0;\n vec4 ownEntry_0;\n vec4 regionTable_0[256];\n}u_0;\n\nvec2 hpSplitUint_0(uint value_0)\n{\n\n uint lo_0 = value_0 & 4095U;\n\n return vec2(float(value_0 - lo_0), float(lo_0));\n}\n\n\nfloat hpViewportOffsetBp_0(vec2 splitPos_0, vec3 bpRange_0, float hpZero_0)\n{\n\n float floorBp_0 = -3.00000000549775576e+38 + hpZero_0;\n\n\n return max(bpRange_0.x - splitPos_0.x, floorBp_0) + max(bpRange_0.y - splitPos_0.y, floorBp_0);\n}\n\n\nfloat viewRegionPx_0(uint bp_0, vec4 r_0, float hpZero_1)\n{\n\n return r_0.x - hpViewportOffsetBp_0(hpSplitUint_0(bp_0), vec3(r_0.y, r_0.z, 0.0), hpZero_1) * r_0.w;\n}\n\n\nfloat connectorBudgetPx_0(float dx_0, float dy_0)\n{\n\n float _S1 = min(abs(dy_0), 150.0);\n return sqrt(dx_0 * dx_0 + _S1 * _S1) * 0.30000001192092896;\n}\n\nfloat connectorHandlePx_0(float budget_0, float maxHandlePx_1)\n{\n\n return min(maxHandlePx_1, budget_0);\n}\n\n\n\n\nfloat connectorLiftPx_0(float budget_1, float dy_1, float bend_0)\n{\n\n float _S2;\n\n if(bend_0 < -1.00000001504746622e+29)\n {\n\n _S2 = min(budget_1, max(0.0, 30.0 - abs(dy_1)));\n\n }\n else\n {\n\n _S2 = - min(bend_0, 110.0) / 0.75;\n\n }\n\n return _S2;\n}\n\n\nfloat bitSet_0(uint bits_0, uint bit_0)\n{\n\n float _S3;\n if((bits_0 & bit_0) != 0U)\n {\n\n _S3 = 1.0;\n\n }\n else\n {\n\n _S3 = 0.0;\n\n }\n\n return _S3;\n}\n\n\nfloat connectorTangent_0(float strand_0, float leading_0, float reversed_0)\n{\n\n float _S4;\n if(leading_0 != 0.0)\n {\n\n _S4 = -1.0;\n\n }\n else\n {\n\n _S4 = 1.0;\n\n }\n\n float _S5 = strand_0 * _S4;\n\n if(reversed_0 != 0.0)\n {\n\n _S4 = -1.0;\n\n }\n else\n {\n\n _S4 = 1.0;\n\n }\n\n return _S5 * _S4;\n}\n\n\nstruct Cubic_0\n{\n vec2 p0_0;\n vec2 p1_0;\n vec2 p2_0;\n vec2 p3_0;\n};\n\n\nstruct ConnectorInstance_0\n{\n uint x_0;\n uint x2_0;\n uint x2Region_0;\n uint row_0;\n uint row2_0;\n float bend_1;\n float width_0;\n uint color_0;\n uint bits_1;\n};\n\n\nCubic_0 placeCubic_0(ConnectorInstance_0 inst_0, vec4 entry2_0)\n{\n\n Cubic_0 c_0;\n c_0.p0_0 = vec2(viewRegionPx_0(inst_0.x_0, u_0.ownEntry_0, u_0.zero_0), u_0.rowOffsetPx_0 + float(inst_0.row_0) * u_0.rowPitchPx_0);\n\n c_0.p3_0 = vec2(viewRegionPx_0(inst_0.x2_0, entry2_0, u_0.zero_0), u_0.rowOffsetPx_0 + float(inst_0.row2_0) * u_0.rowPitchPx_0);\n\n if(((inst_0.bits_1) & 8U) != 0U)\n {\n\n c_0.p1_0 = c_0.p0_0;\n c_0.p2_0 = c_0.p3_0;\n return c_0;\n }\n vec2 d_0 = c_0.p3_0 - c_0.p0_0;\n float _S6 = d_0.y;\n\n float budget_2 = connectorBudgetPx_0(d_0.x, _S6);\n float handle_0 = connectorHandlePx_0(budget_2, u_0.maxHandlePx_0);\n float lift_0 = connectorLiftPx_0(budget_2, _S6, inst_0.bend_1);\n float _S7 = 1.0 - 2.0 * bitSet_0(inst_0.bits_1, 1U);\n\n float _S8;\n if((u_0.ownEntry_0.w) < 0.0)\n {\n\n _S8 = 1.0;\n\n }\n else\n {\n\n _S8 = 0.0;\n\n }\n\n float t1_0 = connectorTangent_0(_S7, 0.0, _S8);\n\n float _S9 = 1.0 - 2.0 * bitSet_0(inst_0.bits_1, 2U);\n float _S10 = bitSet_0(inst_0.bits_1, 4U);\n if((entry2_0.w) < 0.0)\n {\n\n _S8 = 1.0;\n\n }\n else\n {\n\n _S8 = 0.0;\n\n }\n\n float t2_0 = connectorTangent_0(_S9, _S10, _S8);\n\n\n c_0.p1_0 = vec2(c_0.p0_0.x + handle_0 * t1_0, c_0.p0_0.y - lift_0);\n c_0.p2_0 = vec2(c_0.p3_0.x + handle_0 * t2_0, c_0.p3_0.y - lift_0);\n return c_0;\n}\n\n\nfloat connectorStrokePx_0(float width_1, float dpr_0)\n{\n\n return max(width_1, 1.5 / dpr_0);\n}\n\n\nfloat aaPx_0(float dpr_1)\n{\n\n return 1.0 / max(dpr_1, 1.0);\n}\n\n\nfloat aaHalfPx_0(float dpr_2)\n{\n\n return 0.5 * aaPx_0(dpr_2);\n}\n\n\nvec2 cubicDirection_0(Cubic_0 c_1, float t_0)\n{\n\n float s_0 = 1.0 - t_0;\n\n vec2 d_1 = 3.0 * s_0 * s_0 * (c_1.p1_0 - c_1.p0_0) + 6.0 * s_0 * t_0 * (c_1.p2_0 - c_1.p1_0) + 3.0 * t_0 * t_0 * (c_1.p3_0 - c_1.p2_0);\n float len_0 = length(d_1);\n if(len_0 > 9.99999997475242708e-07)\n {\n\n return d_1 / len_0;\n }\n\n vec2 chord_0 = c_1.p3_0 - c_1.p0_0;\n float chordLen_0 = length(chord_0);\n\n vec2 _S11;\n if(chordLen_0 > 9.99999997475242708e-07)\n {\n\n _S11 = chord_0 / chordLen_0;\n\n }\n else\n {\n\n _S11 = vec2(1.0, 0.0);\n\n }\n\n return _S11;\n}\n\n\nvec2 cubicAt_0(Cubic_0 c_2, float t_1)\n{\n\n float s_1 = 1.0 - t_1;\n float _S12 = 3.0 * s_1;\n\n return s_1 * s_1 * s_1 * c_2.p0_0 + _S12 * s_1 * t_1 * c_2.p1_0 + _S12 * t_1 * t_1 * c_2.p2_0 + t_1 * t_1 * t_1 * c_2.p3_0;\n}\n\n\nfloat lengthTo_0(Cubic_0 c_3, uint seg_0)\n{\n\n vec2 prev_0 = c_3.p0_0;\n\n uint k_0 = 1U;\n\n float total_0 = 0.0;\n\n\n for(;;)\n {\n\n if(k_0 <= seg_0)\n {\n }\n else\n {\n\n break;\n }\n\n vec2 next_0 = cubicAt_0(c_3, float(k_0) / 48.0);\n float total_1 = total_0 + length(next_0 - prev_0);\n\n uint _S13 = k_0 + 1U;\n\n prev_0 = next_0;\n\n k_0 = _S13;\n\n total_0 = total_1;\n\n }\n\n return total_0;\n}\n\nstruct StripVertex_0\n{\n vec2 screen_0;\n float across_0;\n float along_0;\n};\n\n\nStripVertex_0 curveVertex_0(Cubic_0 c_4, uint seg_1, float side_0, float hw_0, bool dashed_0)\n{\n\n float t_2 = float(seg_1) / 48.0;\n vec2 dir_0 = cubicDirection_0(c_4, t_2);\n StripVertex_0 v_0;\n float _S14 = side_0 * hw_0;\n\n v_0.across_0 = _S14;\n v_0.screen_0 = cubicAt_0(c_4, t_2) + vec2(- dir_0.y, dir_0.x) * _S14;\n\n float _S15;\n if(dashed_0)\n {\n\n _S15 = lengthTo_0(c_4, seg_1);\n\n }\n else\n {\n\n _S15 = 0.0;\n\n }\n\n v_0.along_0 = _S15;\n return v_0;\n}\n\n\n\nvec2 armEnd_0(Cubic_0 c_5, uint a_0, float strand2_0, bool reversed2_0)\n{\n\n float _S16;\n if(reversed2_0)\n {\n\n _S16 = - strand2_0;\n\n }\n else\n {\n\n _S16 = strand2_0;\n\n }\n\n float back_0 = _S16 * - u_0.arrowPx_0;\n if(a_0 == 0U)\n {\n\n _S16 = - u_0.arrowPx_0;\n\n }\n else\n {\n\n _S16 = u_0.arrowPx_0;\n\n }\n\n return c_5.p3_0 + vec2(back_0, _S16);\n}\n\nStripVertex_0 armCorner_0(Cubic_0 c_6, uint a_1, uint corner_0, float hw_1, float strand2_1, bool reversed2_1)\n{\n vec2 axis_0 = armEnd_0(c_6, a_1, strand2_1, reversed2_1) - c_6.p3_0;\n float _S17 = max(length(axis_0), 9.99999997475242708e-07);\n vec2 dir_1 = axis_0 / _S17;\n StripVertex_0 v_1;\n\n float at_0;\n if((corner_0 % 2U) == 0U)\n {\n\n at_0 = - hw_1;\n\n }\n else\n {\n\n at_0 = hw_1;\n\n }\n\n v_1.across_0 = at_0;\n v_1.along_0 = 0.0;\n if(corner_0 >= 2U)\n {\n\n at_0 = _S17;\n\n }\n else\n {\n\n at_0 = 0.0;\n\n }\n v_1.screen_0 = c_6.p3_0 + dir_1 * at_0 + vec2(- dir_1.y, dir_1.x) * v_1.across_0;\n return v_1;\n}\n\n\nfloat yPxToClipY_0(float yPx_0, float canvasHeight_1)\n{\n\n return 1.0 - yPx_0 / canvasHeight_1 * 2.0;\n}\n\n\nvec4 unpackRGBA_0(uint c_7)\n{\n\n return vec4(float((c_7 >> 0U) & 255U), float((c_7 >> 8U) & 255U), float((c_7 >> 16U) & 255U), float((c_7 >> 24U) & 255U)) / 255.0;\n}\n\n\nout vec4 v_color;\n\n\nout float v_across;\n\n\nout float v_along;\n\n\nflat out float v_halfWidthPx;\n\n\nflat out float v_dashed;\n\n\nlayout(location = 0)\nin uint a_x;\n\n\nlayout(location = 1)\nin uint a_x2;\n\n\nlayout(location = 2)\nin uint a_x2Region;\n\n\nlayout(location = 3)\nin uint a_row;\n\n\nlayout(location = 4)\nin uint a_row2;\n\n\nlayout(location = 5)\nin float a_bend;\n\n\nlayout(location = 6)\nin float a_width;\n\n\nlayout(location = 7)\nin uint a_color;\n\n\nlayout(location = 8)\nin uint a_bits;\n\n\nstruct VsOut_0\n{\n vec4 position_0;\n vec4 color_1;\n float across_1;\n float along_1;\n float halfWidthPx_0;\n float dashed_1;\n};\n\n\nvoid main()\n{\n\n bool placed_0 = a_x2Region < (u_0.regionCount_0);\n\n ConnectorInstance_0 _S18 = ConnectorInstance_0(a_x, a_x2, a_x2Region, a_row, a_row2, a_bend, a_width, a_color, a_bits);\n\n Cubic_0 c_8 = placeCubic_0(_S18, u_0.regionTable_0[min(a_x2Region, 255U)]);\n float halfWidth_0 = 0.5 * connectorStrokePx_0(a_width, u_0.devicePixelRatio_0);\n float hw_2 = halfWidth_0 + aaHalfPx_0(u_0.devicePixelRatio_0);\n bool dashed_2 = (a_bits & 16U) != 0U;\n bool arrow_0 = (a_bits & 32U) != 0U;\n float strand2_2 = 1.0 - 2.0 * bitSet_0(a_bits, 2U);\n bool reversed2_2 = (u_0.regionTable_0[min(a_x2Region, 255U)].w) < 0.0;\n\n StripVertex_0 v_2;\n\n bool onArm_0;\n\n float _S19;\n\n\n\n if(uint(gl_VertexID) < 98U)\n {\n\n uint _S20 = uint(gl_VertexID) / 2U;\n\n if((uint(gl_VertexID) % 2U) == 0U)\n {\n\n _S19 = -1.0;\n\n }\n else\n {\n\n _S19 = 1.0;\n\n }\n\n v_2 = curveVertex_0(c_8, _S20, _S19, hw_2, dashed_2);\n\n onArm_0 = false;\n\n }\n else\n {\n uint j_0 = uint(gl_VertexID) - 98U;\n uint a_2 = j_0 / 6U;\n uint k_1 = j_0 % 6U;\n\n StripVertex_0 start_0;\n\n\n\n if(a_2 == 0U)\n {\n\n start_0 = curveVertex_0(c_8, 48U, 1.0, hw_2, dashed_2);\n\n }\n else\n {\n\n if(arrow_0)\n {\n\n start_0 = armCorner_0(c_8, 0U, 3U, hw_2, strand2_2, reversed2_2);\n\n }\n else\n {\n\n start_0 = curveVertex_0(c_8, 48U, 1.0, hw_2, dashed_2);\n\n }\n\n }\n\n\n if(k_1 == 0U)\n {\n\n onArm_0 = true;\n\n }\n else\n {\n\n onArm_0 = !arrow_0;\n\n }\n\n if(onArm_0)\n {\n\n v_2 = start_0;\n\n onArm_0 = false;\n\n }\n else\n {\n\n uint _S21;\n\n\n if(k_1 <= 2U)\n {\n\n _S21 = 0U;\n\n }\n else\n {\n\n _S21 = k_1 - 2U;\n\n }\n\n v_2 = armCorner_0(c_8, a_2, _S21, hw_2, strand2_2, reversed2_2);\n\n onArm_0 = true;\n\n }\n\n }\n\n VsOut_0 o_0;\n\n vec4 _S22;\n\n if(placed_0)\n {\n\n _S22 = vec4(v_2.screen_0.x / u_0.canvasWidth_0 * 2.0 - 1.0, yPxToClipY_0(v_2.screen_0.y, u_0.canvasHeight_0), 0.0, 1.0);\n\n }\n else\n {\n\n _S22 = vec4(-2.0, -2.0, 0.0, 1.0);\n\n }\n\n o_0.position_0 = _S22;\n\n\n\n o_0.color_1 = unpackRGBA_0(a_color);\n o_0.across_1 = v_2.across_0;\n o_0.along_1 = v_2.along_0;\n o_0.halfWidthPx_0 = halfWidth_0;\n if(dashed_2)\n {\n\n onArm_0 = !onArm_0;\n\n }\n else\n {\n\n onArm_0 = false;\n\n }\n\n if(onArm_0)\n {\n\n _S19 = 1.0;\n\n }\n else\n {\n\n _S19 = 0.0;\n\n }\n\n o_0.dashed_1 = _S19;\n VsOut_0 _S23 = o_0;\n\n gl_Position = o_0.position_0;\n\n v_color = _S23.color_1;\n\n v_across = _S23.across_1;\n\n v_along = _S23.along_1;\n\n v_halfWidthPx = _S23.halfWidthPx_0;\n\n v_dashed = _S23.dashed_1;\n\n return;\n}\n\n";
2
+ export declare const GLSL_FRAGMENT = "#version 300 es\nprecision highp float;\nprecision highp int;\n\n\n\nlayout(std140) uniform Uniforms\n{\n float canvasHeight_0;\n float canvasWidth_0;\n float devicePixelRatio_0;\n float rowOffsetPx_0;\n float rowPitchPx_0;\n float maxHandlePx_0;\n float dashPx_0;\n float gapPx_0;\n float arrowPx_0;\n uint regionCount_0;\n float zero_0;\n vec4 ownEntry_0;\n vec4 regionTable_0[256];\n}u_0;\n\nfloat aaPx_0(float dpr_0)\n{\n\n return 1.0 / max(dpr_0, 1.0);\n}\n\n\nfloat aaRamp_0(float signedInk_0, float widthPx_0)\n{\n\n return clamp(signedInk_0 / widthPx_0 + 0.5, 0.0, 1.0);\n}\n\n\nfloat dashCoverageAt_0(float coord_0, float dashPx_1, float gapPx_1, float aaPx_1)\n{\n float period_0 = dashPx_1 + gapPx_1;\n float shifted_0 = coord_0 + gapPx_1 * 0.5;\n\n return aaRamp_0(dashPx_1 * 0.5 - abs(shifted_0 - period_0 * floor(shifted_0 / period_0) - period_0 * 0.5), aaPx_1);\n}\n\nfloat dashCoverage_0(float coord_1, float dashPx_2, float gapPx_2, float dpr_1)\n{\n\n return dashCoverageAt_0(coord_1, dashPx_2, gapPx_2, aaPx_0(dpr_1));\n}\n\n\nfloat edgeCoverage_0(float signedInkCssPx_0, float dpr_2)\n{\n\n return aaRamp_0(signedInkCssPx_0, aaPx_0(dpr_2));\n}\n\n\nlayout(location = 0)\nout vec4 entryPointParam_fs_main_0;\n\n\nin vec4 v_color;\n\n\nin float v_across;\n\n\nin float v_along;\n\n\nflat in float v_halfWidthPx;\n\n\nflat in float v_dashed;\n\n\nvoid main()\n{\n\n bool _S1;\n if(v_dashed > 0.5)\n {\n\n _S1 = (u_0.dashPx_0) > 0.0;\n\n }\n else\n {\n\n _S1 = false;\n\n }\n\n float dash_0;\n if(_S1)\n {\n\n dash_0 = dashCoverage_0(v_along, u_0.dashPx_0, u_0.gapPx_0, u_0.devicePixelRatio_0);\n\n }\n else\n {\n\n dash_0 = 1.0;\n\n }\n\n entryPointParam_fs_main_0 = vec4(v_color.xyz, v_color.w * (edgeCoverage_0(v_halfWidthPx - abs(v_across), u_0.devicePixelRatio_0) * dash_0));\n\n return;\n}\n\n";
@@ -0,0 +1,4 @@
1
+ // AUTO-GENERATED by packages/shader-tools/src/shader-codegen from connectorMark.slang.
2
+ // Do not edit. Run `pnpm gen:shaders` to regenerate.
3
+ export const GLSL_VERTEX = "#version 300 es\nprecision highp float;\nprecision highp int;\n\n\n\nlayout(std140) uniform Uniforms\n{\n float canvasHeight_0;\n float canvasWidth_0;\n float devicePixelRatio_0;\n float rowOffsetPx_0;\n float rowPitchPx_0;\n float maxHandlePx_0;\n float dashPx_0;\n float gapPx_0;\n float arrowPx_0;\n uint regionCount_0;\n float zero_0;\n vec4 ownEntry_0;\n vec4 regionTable_0[256];\n}u_0;\n\nvec2 hpSplitUint_0(uint value_0)\n{\n\n uint lo_0 = value_0 & 4095U;\n\n return vec2(float(value_0 - lo_0), float(lo_0));\n}\n\n\nfloat hpViewportOffsetBp_0(vec2 splitPos_0, vec3 bpRange_0, float hpZero_0)\n{\n\n float floorBp_0 = -3.00000000549775576e+38 + hpZero_0;\n\n\n return max(bpRange_0.x - splitPos_0.x, floorBp_0) + max(bpRange_0.y - splitPos_0.y, floorBp_0);\n}\n\n\nfloat viewRegionPx_0(uint bp_0, vec4 r_0, float hpZero_1)\n{\n\n return r_0.x - hpViewportOffsetBp_0(hpSplitUint_0(bp_0), vec3(r_0.y, r_0.z, 0.0), hpZero_1) * r_0.w;\n}\n\n\nfloat connectorBudgetPx_0(float dx_0, float dy_0)\n{\n\n float _S1 = min(abs(dy_0), 150.0);\n return sqrt(dx_0 * dx_0 + _S1 * _S1) * 0.30000001192092896;\n}\n\nfloat connectorHandlePx_0(float budget_0, float maxHandlePx_1)\n{\n\n return min(maxHandlePx_1, budget_0);\n}\n\n\n\n\nfloat connectorLiftPx_0(float budget_1, float dy_1, float bend_0)\n{\n\n float _S2;\n\n if(bend_0 < -1.00000001504746622e+29)\n {\n\n _S2 = min(budget_1, max(0.0, 30.0 - abs(dy_1)));\n\n }\n else\n {\n\n _S2 = - min(bend_0, 110.0) / 0.75;\n\n }\n\n return _S2;\n}\n\n\nfloat bitSet_0(uint bits_0, uint bit_0)\n{\n\n float _S3;\n if((bits_0 & bit_0) != 0U)\n {\n\n _S3 = 1.0;\n\n }\n else\n {\n\n _S3 = 0.0;\n\n }\n\n return _S3;\n}\n\n\nfloat connectorTangent_0(float strand_0, float leading_0, float reversed_0)\n{\n\n float _S4;\n if(leading_0 != 0.0)\n {\n\n _S4 = -1.0;\n\n }\n else\n {\n\n _S4 = 1.0;\n\n }\n\n float _S5 = strand_0 * _S4;\n\n if(reversed_0 != 0.0)\n {\n\n _S4 = -1.0;\n\n }\n else\n {\n\n _S4 = 1.0;\n\n }\n\n return _S5 * _S4;\n}\n\n\nstruct Cubic_0\n{\n vec2 p0_0;\n vec2 p1_0;\n vec2 p2_0;\n vec2 p3_0;\n};\n\n\nstruct ConnectorInstance_0\n{\n uint x_0;\n uint x2_0;\n uint x2Region_0;\n uint row_0;\n uint row2_0;\n float bend_1;\n float width_0;\n uint color_0;\n uint bits_1;\n};\n\n\nCubic_0 placeCubic_0(ConnectorInstance_0 inst_0, vec4 entry2_0)\n{\n\n Cubic_0 c_0;\n c_0.p0_0 = vec2(viewRegionPx_0(inst_0.x_0, u_0.ownEntry_0, u_0.zero_0), u_0.rowOffsetPx_0 + float(inst_0.row_0) * u_0.rowPitchPx_0);\n\n c_0.p3_0 = vec2(viewRegionPx_0(inst_0.x2_0, entry2_0, u_0.zero_0), u_0.rowOffsetPx_0 + float(inst_0.row2_0) * u_0.rowPitchPx_0);\n\n if(((inst_0.bits_1) & 8U) != 0U)\n {\n\n c_0.p1_0 = c_0.p0_0;\n c_0.p2_0 = c_0.p3_0;\n return c_0;\n }\n vec2 d_0 = c_0.p3_0 - c_0.p0_0;\n float _S6 = d_0.y;\n\n float budget_2 = connectorBudgetPx_0(d_0.x, _S6);\n float handle_0 = connectorHandlePx_0(budget_2, u_0.maxHandlePx_0);\n float lift_0 = connectorLiftPx_0(budget_2, _S6, inst_0.bend_1);\n float _S7 = 1.0 - 2.0 * bitSet_0(inst_0.bits_1, 1U);\n\n float _S8;\n if((u_0.ownEntry_0.w) < 0.0)\n {\n\n _S8 = 1.0;\n\n }\n else\n {\n\n _S8 = 0.0;\n\n }\n\n float t1_0 = connectorTangent_0(_S7, 0.0, _S8);\n\n float _S9 = 1.0 - 2.0 * bitSet_0(inst_0.bits_1, 2U);\n float _S10 = bitSet_0(inst_0.bits_1, 4U);\n if((entry2_0.w) < 0.0)\n {\n\n _S8 = 1.0;\n\n }\n else\n {\n\n _S8 = 0.0;\n\n }\n\n float t2_0 = connectorTangent_0(_S9, _S10, _S8);\n\n\n c_0.p1_0 = vec2(c_0.p0_0.x + handle_0 * t1_0, c_0.p0_0.y - lift_0);\n c_0.p2_0 = vec2(c_0.p3_0.x + handle_0 * t2_0, c_0.p3_0.y - lift_0);\n return c_0;\n}\n\n\nfloat connectorStrokePx_0(float width_1, float dpr_0)\n{\n\n return max(width_1, 1.5 / dpr_0);\n}\n\n\nfloat aaPx_0(float dpr_1)\n{\n\n return 1.0 / max(dpr_1, 1.0);\n}\n\n\nfloat aaHalfPx_0(float dpr_2)\n{\n\n return 0.5 * aaPx_0(dpr_2);\n}\n\n\nvec2 cubicDirection_0(Cubic_0 c_1, float t_0)\n{\n\n float s_0 = 1.0 - t_0;\n\n vec2 d_1 = 3.0 * s_0 * s_0 * (c_1.p1_0 - c_1.p0_0) + 6.0 * s_0 * t_0 * (c_1.p2_0 - c_1.p1_0) + 3.0 * t_0 * t_0 * (c_1.p3_0 - c_1.p2_0);\n float len_0 = length(d_1);\n if(len_0 > 9.99999997475242708e-07)\n {\n\n return d_1 / len_0;\n }\n\n vec2 chord_0 = c_1.p3_0 - c_1.p0_0;\n float chordLen_0 = length(chord_0);\n\n vec2 _S11;\n if(chordLen_0 > 9.99999997475242708e-07)\n {\n\n _S11 = chord_0 / chordLen_0;\n\n }\n else\n {\n\n _S11 = vec2(1.0, 0.0);\n\n }\n\n return _S11;\n}\n\n\nvec2 cubicAt_0(Cubic_0 c_2, float t_1)\n{\n\n float s_1 = 1.0 - t_1;\n float _S12 = 3.0 * s_1;\n\n return s_1 * s_1 * s_1 * c_2.p0_0 + _S12 * s_1 * t_1 * c_2.p1_0 + _S12 * t_1 * t_1 * c_2.p2_0 + t_1 * t_1 * t_1 * c_2.p3_0;\n}\n\n\nfloat lengthTo_0(Cubic_0 c_3, uint seg_0)\n{\n\n vec2 prev_0 = c_3.p0_0;\n\n uint k_0 = 1U;\n\n float total_0 = 0.0;\n\n\n for(;;)\n {\n\n if(k_0 <= seg_0)\n {\n }\n else\n {\n\n break;\n }\n\n vec2 next_0 = cubicAt_0(c_3, float(k_0) / 48.0);\n float total_1 = total_0 + length(next_0 - prev_0);\n\n uint _S13 = k_0 + 1U;\n\n prev_0 = next_0;\n\n k_0 = _S13;\n\n total_0 = total_1;\n\n }\n\n return total_0;\n}\n\nstruct StripVertex_0\n{\n vec2 screen_0;\n float across_0;\n float along_0;\n};\n\n\nStripVertex_0 curveVertex_0(Cubic_0 c_4, uint seg_1, float side_0, float hw_0, bool dashed_0)\n{\n\n float t_2 = float(seg_1) / 48.0;\n vec2 dir_0 = cubicDirection_0(c_4, t_2);\n StripVertex_0 v_0;\n float _S14 = side_0 * hw_0;\n\n v_0.across_0 = _S14;\n v_0.screen_0 = cubicAt_0(c_4, t_2) + vec2(- dir_0.y, dir_0.x) * _S14;\n\n float _S15;\n if(dashed_0)\n {\n\n _S15 = lengthTo_0(c_4, seg_1);\n\n }\n else\n {\n\n _S15 = 0.0;\n\n }\n\n v_0.along_0 = _S15;\n return v_0;\n}\n\n\n\nvec2 armEnd_0(Cubic_0 c_5, uint a_0, float strand2_0, bool reversed2_0)\n{\n\n float _S16;\n if(reversed2_0)\n {\n\n _S16 = - strand2_0;\n\n }\n else\n {\n\n _S16 = strand2_0;\n\n }\n\n float back_0 = _S16 * - u_0.arrowPx_0;\n if(a_0 == 0U)\n {\n\n _S16 = - u_0.arrowPx_0;\n\n }\n else\n {\n\n _S16 = u_0.arrowPx_0;\n\n }\n\n return c_5.p3_0 + vec2(back_0, _S16);\n}\n\nStripVertex_0 armCorner_0(Cubic_0 c_6, uint a_1, uint corner_0, float hw_1, float strand2_1, bool reversed2_1)\n{\n vec2 axis_0 = armEnd_0(c_6, a_1, strand2_1, reversed2_1) - c_6.p3_0;\n float _S17 = max(length(axis_0), 9.99999997475242708e-07);\n vec2 dir_1 = axis_0 / _S17;\n StripVertex_0 v_1;\n\n float at_0;\n if((corner_0 % 2U) == 0U)\n {\n\n at_0 = - hw_1;\n\n }\n else\n {\n\n at_0 = hw_1;\n\n }\n\n v_1.across_0 = at_0;\n v_1.along_0 = 0.0;\n if(corner_0 >= 2U)\n {\n\n at_0 = _S17;\n\n }\n else\n {\n\n at_0 = 0.0;\n\n }\n v_1.screen_0 = c_6.p3_0 + dir_1 * at_0 + vec2(- dir_1.y, dir_1.x) * v_1.across_0;\n return v_1;\n}\n\n\nfloat yPxToClipY_0(float yPx_0, float canvasHeight_1)\n{\n\n return 1.0 - yPx_0 / canvasHeight_1 * 2.0;\n}\n\n\nvec4 unpackRGBA_0(uint c_7)\n{\n\n return vec4(float((c_7 >> 0U) & 255U), float((c_7 >> 8U) & 255U), float((c_7 >> 16U) & 255U), float((c_7 >> 24U) & 255U)) / 255.0;\n}\n\n\nout vec4 v_color;\n\n\nout float v_across;\n\n\nout float v_along;\n\n\nflat out float v_halfWidthPx;\n\n\nflat out float v_dashed;\n\n\nlayout(location = 0)\nin uint a_x;\n\n\nlayout(location = 1)\nin uint a_x2;\n\n\nlayout(location = 2)\nin uint a_x2Region;\n\n\nlayout(location = 3)\nin uint a_row;\n\n\nlayout(location = 4)\nin uint a_row2;\n\n\nlayout(location = 5)\nin float a_bend;\n\n\nlayout(location = 6)\nin float a_width;\n\n\nlayout(location = 7)\nin uint a_color;\n\n\nlayout(location = 8)\nin uint a_bits;\n\n\nstruct VsOut_0\n{\n vec4 position_0;\n vec4 color_1;\n float across_1;\n float along_1;\n float halfWidthPx_0;\n float dashed_1;\n};\n\n\nvoid main()\n{\n\n bool placed_0 = a_x2Region < (u_0.regionCount_0);\n\n ConnectorInstance_0 _S18 = ConnectorInstance_0(a_x, a_x2, a_x2Region, a_row, a_row2, a_bend, a_width, a_color, a_bits);\n\n Cubic_0 c_8 = placeCubic_0(_S18, u_0.regionTable_0[min(a_x2Region, 255U)]);\n float halfWidth_0 = 0.5 * connectorStrokePx_0(a_width, u_0.devicePixelRatio_0);\n float hw_2 = halfWidth_0 + aaHalfPx_0(u_0.devicePixelRatio_0);\n bool dashed_2 = (a_bits & 16U) != 0U;\n bool arrow_0 = (a_bits & 32U) != 0U;\n float strand2_2 = 1.0 - 2.0 * bitSet_0(a_bits, 2U);\n bool reversed2_2 = (u_0.regionTable_0[min(a_x2Region, 255U)].w) < 0.0;\n\n StripVertex_0 v_2;\n\n bool onArm_0;\n\n float _S19;\n\n\n\n if(uint(gl_VertexID) < 98U)\n {\n\n uint _S20 = uint(gl_VertexID) / 2U;\n\n if((uint(gl_VertexID) % 2U) == 0U)\n {\n\n _S19 = -1.0;\n\n }\n else\n {\n\n _S19 = 1.0;\n\n }\n\n v_2 = curveVertex_0(c_8, _S20, _S19, hw_2, dashed_2);\n\n onArm_0 = false;\n\n }\n else\n {\n uint j_0 = uint(gl_VertexID) - 98U;\n uint a_2 = j_0 / 6U;\n uint k_1 = j_0 % 6U;\n\n StripVertex_0 start_0;\n\n\n\n if(a_2 == 0U)\n {\n\n start_0 = curveVertex_0(c_8, 48U, 1.0, hw_2, dashed_2);\n\n }\n else\n {\n\n if(arrow_0)\n {\n\n start_0 = armCorner_0(c_8, 0U, 3U, hw_2, strand2_2, reversed2_2);\n\n }\n else\n {\n\n start_0 = curveVertex_0(c_8, 48U, 1.0, hw_2, dashed_2);\n\n }\n\n }\n\n\n if(k_1 == 0U)\n {\n\n onArm_0 = true;\n\n }\n else\n {\n\n onArm_0 = !arrow_0;\n\n }\n\n if(onArm_0)\n {\n\n v_2 = start_0;\n\n onArm_0 = false;\n\n }\n else\n {\n\n uint _S21;\n\n\n if(k_1 <= 2U)\n {\n\n _S21 = 0U;\n\n }\n else\n {\n\n _S21 = k_1 - 2U;\n\n }\n\n v_2 = armCorner_0(c_8, a_2, _S21, hw_2, strand2_2, reversed2_2);\n\n onArm_0 = true;\n\n }\n\n }\n\n VsOut_0 o_0;\n\n vec4 _S22;\n\n if(placed_0)\n {\n\n _S22 = vec4(v_2.screen_0.x / u_0.canvasWidth_0 * 2.0 - 1.0, yPxToClipY_0(v_2.screen_0.y, u_0.canvasHeight_0), 0.0, 1.0);\n\n }\n else\n {\n\n _S22 = vec4(-2.0, -2.0, 0.0, 1.0);\n\n }\n\n o_0.position_0 = _S22;\n\n\n\n o_0.color_1 = unpackRGBA_0(a_color);\n o_0.across_1 = v_2.across_0;\n o_0.along_1 = v_2.along_0;\n o_0.halfWidthPx_0 = halfWidth_0;\n if(dashed_2)\n {\n\n onArm_0 = !onArm_0;\n\n }\n else\n {\n\n onArm_0 = false;\n\n }\n\n if(onArm_0)\n {\n\n _S19 = 1.0;\n\n }\n else\n {\n\n _S19 = 0.0;\n\n }\n\n o_0.dashed_1 = _S19;\n VsOut_0 _S23 = o_0;\n\n gl_Position = o_0.position_0;\n\n v_color = _S23.color_1;\n\n v_across = _S23.across_1;\n\n v_along = _S23.along_1;\n\n v_halfWidthPx = _S23.halfWidthPx_0;\n\n v_dashed = _S23.dashed_1;\n\n return;\n}\n\n";
4
+ export const GLSL_FRAGMENT = "#version 300 es\nprecision highp float;\nprecision highp int;\n\n\n\nlayout(std140) uniform Uniforms\n{\n float canvasHeight_0;\n float canvasWidth_0;\n float devicePixelRatio_0;\n float rowOffsetPx_0;\n float rowPitchPx_0;\n float maxHandlePx_0;\n float dashPx_0;\n float gapPx_0;\n float arrowPx_0;\n uint regionCount_0;\n float zero_0;\n vec4 ownEntry_0;\n vec4 regionTable_0[256];\n}u_0;\n\nfloat aaPx_0(float dpr_0)\n{\n\n return 1.0 / max(dpr_0, 1.0);\n}\n\n\nfloat aaRamp_0(float signedInk_0, float widthPx_0)\n{\n\n return clamp(signedInk_0 / widthPx_0 + 0.5, 0.0, 1.0);\n}\n\n\nfloat dashCoverageAt_0(float coord_0, float dashPx_1, float gapPx_1, float aaPx_1)\n{\n float period_0 = dashPx_1 + gapPx_1;\n float shifted_0 = coord_0 + gapPx_1 * 0.5;\n\n return aaRamp_0(dashPx_1 * 0.5 - abs(shifted_0 - period_0 * floor(shifted_0 / period_0) - period_0 * 0.5), aaPx_1);\n}\n\nfloat dashCoverage_0(float coord_1, float dashPx_2, float gapPx_2, float dpr_1)\n{\n\n return dashCoverageAt_0(coord_1, dashPx_2, gapPx_2, aaPx_0(dpr_1));\n}\n\n\nfloat edgeCoverage_0(float signedInkCssPx_0, float dpr_2)\n{\n\n return aaRamp_0(signedInkCssPx_0, aaPx_0(dpr_2));\n}\n\n\nlayout(location = 0)\nout vec4 entryPointParam_fs_main_0;\n\n\nin vec4 v_color;\n\n\nin float v_across;\n\n\nin float v_along;\n\n\nflat in float v_halfWidthPx;\n\n\nflat in float v_dashed;\n\n\nvoid main()\n{\n\n bool _S1;\n if(v_dashed > 0.5)\n {\n\n _S1 = (u_0.dashPx_0) > 0.0;\n\n }\n else\n {\n\n _S1 = false;\n\n }\n\n float dash_0;\n if(_S1)\n {\n\n dash_0 = dashCoverage_0(v_along, u_0.dashPx_0, u_0.gapPx_0, u_0.devicePixelRatio_0);\n\n }\n else\n {\n\n dash_0 = 1.0;\n\n }\n\n entryPointParam_fs_main_0 = vec4(v_color.xyz, v_color.w * (edgeCoverage_0(v_halfWidthPx - abs(v_across), u_0.devicePixelRatio_0) * dash_0));\n\n return;\n}\n\n";
@@ -0,0 +1,88 @@
1
+ import type { VertexAttributeLayout, ShaderBinding } from '@jbrowse/render-core/hal';
2
+ export declare const BINDINGS: readonly ShaderBinding[];
3
+ export declare const VERTS_PER_INSTANCE = 110;
4
+ export declare const TOPOLOGY: 'triangle-strip';
5
+ export declare const COVERAGE: 'analytic';
6
+ export declare const UNIFORMS_SIZE_BYTES = 4160;
7
+ export declare const UNIFORM_OFFSET_F32: {
8
+ readonly canvasHeight: 0;
9
+ readonly canvasWidth: 1;
10
+ readonly devicePixelRatio: 2;
11
+ readonly rowOffsetPx: 3;
12
+ readonly rowPitchPx: 4;
13
+ readonly maxHandlePx: 5;
14
+ readonly dashPx: 6;
15
+ readonly gapPx: 7;
16
+ readonly arrowPx: 8;
17
+ readonly zero: 10;
18
+ readonly ownEntry: 12;
19
+ };
20
+ export declare const UNIFORM_OFFSET_U32: {
21
+ readonly regionCount: 9;
22
+ };
23
+ export declare const UNIFORM_SLOT_ARRAYS: {
24
+ readonly regionTable: readonly [16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92, 96, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144, 148, 152, 156, 160, 164, 168, 172, 176, 180, 184, 188, 192, 196, 200, 204, 208, 212, 216, 220, 224, 228, 232, 236, 240, 244, 248, 252, 256, 260, 264, 268, 272, 276, 280, 284, 288, 292, 296, 300, 304, 308, 312, 316, 320, 324, 328, 332, 336, 340, 344, 348, 352, 356, 360, 364, 368, 372, 376, 380, 384, 388, 392, 396, 400, 404, 408, 412, 416, 420, 424, 428, 432, 436, 440, 444, 448, 452, 456, 460, 464, 468, 472, 476, 480, 484, 488, 492, 496, 500, 504, 508, 512, 516, 520, 524, 528, 532, 536, 540, 544, 548, 552, 556, 560, 564, 568, 572, 576, 580, 584, 588, 592, 596, 600, 604, 608, 612, 616, 620, 624, 628, 632, 636, 640, 644, 648, 652, 656, 660, 664, 668, 672, 676, 680, 684, 688, 692, 696, 700, 704, 708, 712, 716, 720, 724, 728, 732, 736, 740, 744, 748, 752, 756, 760, 764, 768, 772, 776, 780, 784, 788, 792, 796, 800, 804, 808, 812, 816, 820, 824, 828, 832, 836, 840, 844, 848, 852, 856, 860, 864, 868, 872, 876, 880, 884, 888, 892, 896, 900, 904, 908, 912, 916, 920, 924, 928, 932, 936, 940, 944, 948, 952, 956, 960, 964, 968, 972, 976, 980, 984, 988, 992, 996, 1000, 1004, 1008, 1012, 1016, 1020, 1024, 1028, 1032, 1036];
25
+ };
26
+ export declare function setUniformRegionTable(f32: Float32Array, i: number, v0: number, v1: number, v2: number, v3: number): void;
27
+ export interface Uniforms {
28
+ canvasHeight: number;
29
+ canvasWidth: number;
30
+ devicePixelRatio: number;
31
+ rowOffsetPx: number;
32
+ rowPitchPx: number;
33
+ maxHandlePx: number;
34
+ dashPx: number;
35
+ gapPx: number;
36
+ arrowPx: number;
37
+ regionCount: number;
38
+ zero: number;
39
+ ownEntry: [number, number, number, number];
40
+ regionTable: [[number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number]];
41
+ }
42
+ export declare function writeUniforms(buf: ArrayBuffer, uniforms: Uniforms): void;
43
+ export declare const INSTANCE_STRIDE_BYTES = 36;
44
+ export declare const INSTANCE_STRIDE_WORDS = 9;
45
+ export declare const INSTANCE_OFFSET_F32: {
46
+ readonly bend: 5;
47
+ readonly width: 6;
48
+ };
49
+ export declare const INSTANCE_OFFSET_U32: {
50
+ readonly x: 0;
51
+ readonly x2: 1;
52
+ readonly x2Region: 2;
53
+ readonly row: 3;
54
+ readonly row2: 4;
55
+ readonly color: 7;
56
+ readonly bits: 8;
57
+ };
58
+ export declare const VERTEX_ATTRIBUTES: readonly VertexAttributeLayout[];
59
+ export interface InstanceArrays {
60
+ x: ArrayLike<number>;
61
+ x2: ArrayLike<number>;
62
+ x2Region: ArrayLike<number>;
63
+ row: ArrayLike<number>;
64
+ row2: ArrayLike<number>;
65
+ bend: ArrayLike<number>;
66
+ width: ArrayLike<number>;
67
+ color: ArrayLike<number>;
68
+ bits: ArrayLike<number>;
69
+ }
70
+ export declare function packInstances(arrays: InstanceArrays, numInstances: number, buf?: ArrayBuffer): ArrayBuffer;
71
+ export declare function getInstanceX(u32: Uint32Array, i: number): number;
72
+ export declare function setInstanceX(u32: Uint32Array, i: number, v: number): void;
73
+ export declare function getInstanceX2(u32: Uint32Array, i: number): number;
74
+ export declare function setInstanceX2(u32: Uint32Array, i: number, v: number): void;
75
+ export declare function getInstanceX2Region(u32: Uint32Array, i: number): number;
76
+ export declare function setInstanceX2Region(u32: Uint32Array, i: number, v: number): void;
77
+ export declare function getInstanceRow(u32: Uint32Array, i: number): number;
78
+ export declare function setInstanceRow(u32: Uint32Array, i: number, v: number): void;
79
+ export declare function getInstanceRow2(u32: Uint32Array, i: number): number;
80
+ export declare function setInstanceRow2(u32: Uint32Array, i: number, v: number): void;
81
+ export declare function getInstanceBend(f32: Float32Array, i: number): number;
82
+ export declare function setInstanceBend(f32: Float32Array, i: number, v: number): void;
83
+ export declare function getInstanceWidth(f32: Float32Array, i: number): number;
84
+ export declare function setInstanceWidth(f32: Float32Array, i: number, v: number): void;
85
+ export declare function getInstanceColor(u32: Uint32Array, i: number): number;
86
+ export declare function setInstanceColor(u32: Uint32Array, i: number, v: number): void;
87
+ export declare function getInstanceBits(u32: Uint32Array, i: number): number;
88
+ export declare function setInstanceBits(u32: Uint32Array, i: number, v: number): void;