@jbrowse/render-core 5.0.0-beta.2 → 5.0.0-beta.4

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 (114) hide show
  1. package/esm/RenderLifecycleMixin.d.ts +20 -1
  2. package/esm/RenderLifecycleMixin.js +25 -2
  3. package/esm/canvas2dUtils.d.ts +25 -0
  4. package/esm/canvas2dUtils.js +27 -0
  5. package/esm/colorRampLut.d.ts +4 -4
  6. package/esm/colorRampLut.js +4 -4
  7. package/esm/computePipeline.d.ts +13 -0
  8. package/esm/computePipeline.js +55 -0
  9. package/esm/coverageBand.d.ts +0 -1
  10. package/esm/coverageBand.js +0 -1
  11. package/esm/coverageBandBuffers.d.ts +0 -6
  12. package/esm/coverageBandBuffers.js +1 -13
  13. package/esm/createRenderingBackend.d.ts +14 -18
  14. package/esm/createRenderingBackend.js +4 -2
  15. package/esm/encodeMemo.d.ts +14 -0
  16. package/esm/encodeMemo.js +48 -0
  17. package/esm/gpuDevice.d.ts +9 -0
  18. package/esm/gpuDevice.js +12 -3
  19. package/esm/graphicsCapabilities.d.ts +18 -15
  20. package/esm/graphicsCapabilities.js +23 -16
  21. package/esm/hal/createHal.d.ts +1 -2
  22. package/esm/hal/createHal.js +14 -4
  23. package/esm/hal/deviceGpuCache.js +2 -2
  24. package/esm/hal/gpuHalBase.d.ts +1 -1
  25. package/esm/hal/gpuHalBase.js +2 -3
  26. package/esm/hal/mockHal.d.ts +0 -1
  27. package/esm/hal/mockHal.js +0 -10
  28. package/esm/hal/regionRegistry.d.ts +0 -1
  29. package/esm/hal/regionRegistry.js +3 -15
  30. package/esm/hal/types.d.ts +5 -1
  31. package/esm/hal/webgl2Hal.d.ts +1 -1
  32. package/esm/hal/webgl2Hal.js +2 -2
  33. package/esm/hal/webgpuHal.d.ts +2 -2
  34. package/esm/hal/webgpuHal.js +19 -16
  35. package/esm/installUpload.d.ts +4 -1
  36. package/esm/installUpload.js +7 -39
  37. package/esm/instanceCache.d.ts +10 -7
  38. package/esm/instanceCache.js +14 -15
  39. package/esm/mapUploadSync.d.ts +0 -8
  40. package/esm/mapUploadSync.js +0 -1
  41. package/esm/marks/colorFill.d.ts +17 -0
  42. package/esm/marks/colorFill.js +26 -0
  43. package/esm/marks/drawAgainstHit.d.ts +47 -0
  44. package/esm/marks/drawAgainstHit.js +140 -0
  45. package/esm/marks/glyphPaint.d.ts +16 -0
  46. package/esm/marks/glyphPaint.js +41 -0
  47. package/esm/marks/index.d.ts +9 -0
  48. package/esm/marks/index.js +6 -0
  49. package/esm/marks/markBackend.d.ts +87 -0
  50. package/esm/marks/markBackend.js +137 -0
  51. package/esm/marks/markHit.d.ts +25 -0
  52. package/esm/marks/markHit.js +46 -0
  53. package/esm/marks/markPaint.d.ts +13 -0
  54. package/esm/marks/markPaint.js +18 -0
  55. package/esm/marks/pointMark.d.ts +24 -0
  56. package/esm/marks/pointMark.js +91 -0
  57. package/esm/marks/spanMark.d.ts +45 -0
  58. package/esm/marks/spanMark.js +59 -0
  59. package/esm/marks/types.d.ts +216 -0
  60. package/esm/marks/types.js +146 -0
  61. package/esm/perRegionRenderingBackend.d.ts +15 -3
  62. package/esm/perRegionRenderingBackend.js +26 -3
  63. package/esm/regionDataMap.d.ts +2 -2
  64. package/esm/regionDataMap.js +2 -2
  65. package/esm/renderBlock.d.ts +14 -0
  66. package/esm/renderBlock.js +25 -0
  67. package/esm/renderingBackendBase.d.ts +11 -14
  68. package/esm/renderingBackendBase.js +7 -7
  69. package/esm/shaders/capsule.js.generated.d.ts +1 -0
  70. package/esm/shaders/capsule.js.generated.js +11 -0
  71. package/esm/shaders/coverageBar.generated.d.ts +2 -2
  72. package/esm/shaders/coverageBar.generated.js +2 -2
  73. package/esm/shaders/coverageMod.generated.d.ts +2 -2
  74. package/esm/shaders/coverageMod.generated.js +2 -2
  75. package/esm/shaders/coverageSnp.generated.d.ts +2 -2
  76. package/esm/shaders/coverageSnp.generated.js +2 -2
  77. package/esm/shaders/pointMark.consts.generated.d.ts +4 -0
  78. package/esm/shaders/pointMark.consts.generated.js +6 -0
  79. package/esm/shaders/pointMark.generated.d.ts +5 -0
  80. package/esm/shaders/pointMark.generated.js +7 -0
  81. package/esm/shaders/pointMark.iface.generated.d.ts +55 -0
  82. package/esm/shaders/pointMark.iface.generated.js +100 -0
  83. package/esm/shaders/pointMark.js.generated.d.ts +2 -0
  84. package/esm/shaders/pointMark.js.generated.js +19 -0
  85. package/esm/shaders/spanMark.generated.d.ts +4 -0
  86. package/esm/shaders/spanMark.generated.js +6 -0
  87. package/esm/shaders/spanMark.iface.generated.d.ts +58 -0
  88. package/esm/shaders/spanMark.iface.generated.js +122 -0
  89. package/esm/sharedBackendKey.d.ts +18 -0
  90. package/esm/{keyedRenderingBackend.js → sharedBackendKey.js} +5 -0
  91. package/esm/slangPass.d.ts +2 -0
  92. package/esm/slangPass.js +2 -0
  93. package/package.json +14 -4
  94. package/src/shaders/capsule.js.generated.ts +14 -0
  95. package/src/shaders/capsule.slang +12 -4
  96. package/src/shaders/colorPack.slang +5 -1
  97. package/src/shaders/coverageBand.slang +38 -15
  98. package/src/shaders/coverageBar.generated.ts +2 -2
  99. package/src/shaders/coverageBar.slang +9 -0
  100. package/src/shaders/coverageMod.generated.ts +2 -2
  101. package/src/shaders/coverageSnp.generated.ts +2 -2
  102. package/src/shaders/hpmath.slang +7 -1
  103. package/src/shaders/pointMark.consts.generated.ts +10 -0
  104. package/src/shaders/pointMark.generated.ts +12 -0
  105. package/src/shaders/pointMark.iface.generated.ts +146 -0
  106. package/src/shaders/pointMark.js.generated.ts +25 -0
  107. package/src/shaders/pointMark.slang +205 -0
  108. package/src/shaders/rowRect.slang +7 -8
  109. package/src/shaders/spanMark.generated.ts +10 -0
  110. package/src/shaders/spanMark.iface.generated.ts +168 -0
  111. package/src/shaders/spanMark.slang +22 -0
  112. package/esm/globalRenderingBackend.d.ts +0 -90
  113. package/esm/globalRenderingBackend.js +0 -53
  114. package/esm/keyedRenderingBackend.d.ts +0 -41
@@ -0,0 +1,122 @@
1
+ // AUTO-GENERATED by packages/shader-tools/src/shader-codegen from spanMark.slang.
2
+ // Do not edit. Run `pnpm gen:shaders` to regenerate.
3
+ export const BINDINGS = [
4
+ { index: 1, kind: 'uniform', name: 'u' },
5
+ ];
6
+ export const VERTS_PER_INSTANCE = 6;
7
+ export const UNIFORMS_SIZE_BYTES = 48;
8
+ // Word indices into a Float32Array view over the uniform buffer.
9
+ export const UNIFORM_OFFSET_F32 = {
10
+ bpRangeX: 0,
11
+ canvasHeight: 3,
12
+ minCellDenomPx: 4,
13
+ minCellPx: 5,
14
+ zero: 6,
15
+ rowHeight: 7,
16
+ rowProportion: 8,
17
+ scrollTop: 9,
18
+ };
19
+ export function writeUniforms(buf, uniforms) {
20
+ const f32 = new Float32Array(buf);
21
+ f32[0] = uniforms.bpRangeX[0];
22
+ f32[1] = uniforms.bpRangeX[1];
23
+ f32[2] = uniforms.bpRangeX[2];
24
+ f32[3] = uniforms.canvasHeight;
25
+ f32[4] = uniforms.minCellDenomPx;
26
+ f32[5] = uniforms.minCellPx;
27
+ f32[6] = uniforms.zero;
28
+ f32[7] = uniforms.rowHeight;
29
+ f32[8] = uniforms.rowProportion;
30
+ f32[9] = uniforms.scrollTop;
31
+ }
32
+ export const INSTANCE_STRIDE_BYTES = 16;
33
+ export const INSTANCE_STRIDE_WORDS = 4;
34
+ // Word indices into a Uint32Array view over the instance buffer.
35
+ export const INSTANCE_OFFSET_U32 = {
36
+ x: 0,
37
+ x2: 1,
38
+ row: 2,
39
+ color: 3,
40
+ };
41
+ export const VERTEX_ATTRIBUTES = [
42
+ { name: 'a_x', components: 1, type: 'uint', offsetBytes: 0, integer: true },
43
+ { name: 'a_x2', components: 1, type: 'uint', offsetBytes: 4, integer: true },
44
+ { name: 'a_row', components: 1, type: 'uint', offsetBytes: 8, integer: true },
45
+ { name: 'a_color', components: 1, type: 'uint', offsetBytes: 12, integer: true },
46
+ ];
47
+ export function packInstances(arrays, numInstances, buf = new ArrayBuffer(numInstances * INSTANCE_STRIDE_BYTES)) {
48
+ const u32 = new Uint32Array(buf);
49
+ const { x, x2, row, color } = arrays;
50
+ for (let i = 0; i < numInstances; i++) {
51
+ const o = i * INSTANCE_STRIDE_WORDS;
52
+ u32[o + 0] = x[i];
53
+ u32[o + 1] = x2[i];
54
+ u32[o + 2] = row[i];
55
+ u32[o + 3] = color[i];
56
+ }
57
+ return buf;
58
+ }
59
+ // Instance `i`'s `x`.
60
+ export function getInstanceX(u32, i) {
61
+ return u32[i * INSTANCE_STRIDE_WORDS];
62
+ }
63
+ export function setInstanceX(u32, i, v) {
64
+ u32[i * INSTANCE_STRIDE_WORDS] = v;
65
+ }
66
+ // Instance `i`'s `x2`.
67
+ export function getInstanceX2(u32, i) {
68
+ return u32[i * INSTANCE_STRIDE_WORDS + 1];
69
+ }
70
+ export function setInstanceX2(u32, i, v) {
71
+ u32[i * INSTANCE_STRIDE_WORDS + 1] = v;
72
+ }
73
+ // Instance `i`'s `row`.
74
+ export function getInstanceRow(u32, i) {
75
+ return u32[i * INSTANCE_STRIDE_WORDS + 2];
76
+ }
77
+ export function setInstanceRow(u32, i, v) {
78
+ u32[i * INSTANCE_STRIDE_WORDS + 2] = v;
79
+ }
80
+ // Instance `i`'s `color`.
81
+ export function getInstanceColor(u32, i) {
82
+ return u32[i * INSTANCE_STRIDE_WORDS + 3];
83
+ }
84
+ export function setInstanceColor(u32, i, v) {
85
+ u32[i * INSTANCE_STRIDE_WORDS + 3] = v;
86
+ }
87
+ // Appends instances one at a time, for an encoder that cannot say up front
88
+ // how many it will emit. Seed the constructor with an upper bound and the
89
+ // common path allocates exactly once; the doubling is a correctness
90
+ // backstop, not the expected route.
91
+ export class InstanceWriter {
92
+ buf;
93
+ u32;
94
+ capacity;
95
+ count = 0;
96
+ constructor(capacity) {
97
+ this.capacity = Math.max(1, capacity);
98
+ this.buf = new ArrayBuffer(this.capacity * INSTANCE_STRIDE_BYTES);
99
+ this.u32 = new Uint32Array(this.buf);
100
+ }
101
+ push(x, x2, row, color) {
102
+ if (this.count === this.capacity) {
103
+ this.capacity *= 2;
104
+ const grown = new ArrayBuffer(this.capacity * INSTANCE_STRIDE_BYTES);
105
+ new Uint8Array(grown).set(new Uint8Array(this.buf));
106
+ this.buf = grown;
107
+ this.u32 = new Uint32Array(grown);
108
+ }
109
+ const o = this.count * INSTANCE_STRIDE_WORDS;
110
+ this.u32[o] = x;
111
+ this.u32[o + 1] = x2;
112
+ this.u32[o + 2] = row;
113
+ this.u32[o + 3] = color;
114
+ this.count++;
115
+ }
116
+ // A right-sized COPY, not a subarray view — see the class comment. Skipped
117
+ // entirely when the seed turned out to be exact, which is the common path.
118
+ finish() {
119
+ const used = this.count * INSTANCE_STRIDE_BYTES;
120
+ return used === this.buf.byteLength ? this.buf : this.buf.slice(0, used);
121
+ }
122
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Stable 32-bit slot for a display on a backend it shares with siblings, hashed
3
+ * from its MST node id (djb2). Collisions are vanishingly rare at display
4
+ * cardinalities, and the alternative — coordinating integer slots between
5
+ * displays that don't know about each other — is worse.
6
+ *
7
+ * Key by this, never by the display's index in its parent's list. An index
8
+ * renumbers when a sibling is hidden or reordered, which hands the survivor a
9
+ * slot holding another display's bytes: the keyed diff sees a changed
10
+ * reference and re-uploads every later display's whole buffer, and any frame
11
+ * drawn between the two mistakes one display's geometry for another's.
12
+ *
13
+ * It is also how a display whose own cells are named rather than numbered
14
+ * reaches the per-region backend, whose keys are `displayedRegionIndex`: the
15
+ * multi-way stack's gutters and lanes are one map keyed by this off each
16
+ * layer's name.
17
+ */
18
+ export declare function sharedBackendKey(id: string): number;
@@ -9,6 +9,11 @@
9
9
  * slot holding another display's bytes: the keyed diff sees a changed
10
10
  * reference and re-uploads every later display's whole buffer, and any frame
11
11
  * drawn between the two mistakes one display's geometry for another's.
12
+ *
13
+ * It is also how a display whose own cells are named rather than numbered
14
+ * reaches the per-region backend, whose keys are `displayedRegionIndex`: the
15
+ * multi-way stack's gutters and lanes are one map keyed by this off each
16
+ * layer's name.
12
17
  */
13
18
  export function sharedBackendKey(id) {
14
19
  let h = 5381;
@@ -4,10 +4,12 @@ export interface ShaderModule {
4
4
  GLSL_VERTEX: string;
5
5
  GLSL_FRAGMENT: string;
6
6
  INSTANCE_STRIDE_BYTES: number;
7
+ UNIFORMS_SIZE_BYTES: number;
7
8
  VERTEX_ATTRIBUTES: readonly VertexAttributeLayout[];
8
9
  VERTS_PER_INSTANCE?: number;
9
10
  TOPOLOGY?: PipelineDescriptor['topology'];
10
11
  BLEND_STATE?: BlendState;
12
+ COVERAGE?: PipelineDescriptor['coverage'];
11
13
  TEXTURES?: readonly [TextureBinding, ...TextureBinding[]];
12
14
  BINDINGS?: readonly ShaderBinding[];
13
15
  }
package/esm/slangPass.js CHANGED
@@ -11,11 +11,13 @@ export function slangPass(opts) {
11
11
  glslVertex: opts.mod.GLSL_VERTEX,
12
12
  glslFragment: opts.mod.GLSL_FRAGMENT,
13
13
  instanceStride: opts.mod.INSTANCE_STRIDE_BYTES,
14
+ uniformByteSize: opts.mod.UNIFORMS_SIZE_BYTES,
14
15
  verticesPerInstance,
15
16
  blend: opts.blend ?? true,
16
17
  blendState: opts.blendState ?? opts.mod.BLEND_STATE,
17
18
  vertexAttributes: opts.mod.VERTEX_ATTRIBUTES,
18
19
  topology: opts.topology ?? opts.mod.TOPOLOGY,
20
+ coverage: opts.mod.COVERAGE,
19
21
  textures: opts.textures ?? opts.mod.TEXTURES,
20
22
  bindings: opts.mod.BINDINGS,
21
23
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jbrowse/render-core",
3
- "version": "5.0.0-beta.2",
3
+ "version": "5.0.0-beta.4",
4
4
  "type": "module",
5
5
  "description": "GPU/Canvas2D rendering primitives for JBrowse displays: the HAL, the draw-lifecycle mixin, per-region/global backend bases, and the React backend hooks",
6
6
  "keywords": [
@@ -33,17 +33,23 @@
33
33
  "./colorRampLut": "./esm/colorRampLut.js",
34
34
  "./contractReports": "./esm/contractReports.js",
35
35
  "./coverageBand": "./esm/coverageBand.js",
36
+ "./computePipeline": "./esm/computePipeline.js",
36
37
  "./coverageBandBuffers": "./esm/coverageBandBuffers.js",
37
38
  "./createRenderingBackend": "./esm/createRenderingBackend.js",
38
39
  "./displayPhase": "./esm/displayPhase.js",
39
- "./globalRenderingBackend": "./esm/globalRenderingBackend.js",
40
+ "./encodeMemo": "./esm/encodeMemo.js",
40
41
  "./gpuDevice": "./esm/gpuDevice.js",
41
42
  "./graphicsCapabilities": "./esm/graphicsCapabilities.js",
42
43
  "./hal": "./esm/hal/index.js",
43
44
  "./installUpload": "./esm/installUpload.js",
44
45
  "./instanceCache": "./esm/instanceCache.js",
45
46
  "./instancePass": "./esm/instancePass.js",
46
- "./keyedRenderingBackend": "./esm/keyedRenderingBackend.js",
47
+ "./marks": "./esm/marks/index.js",
48
+ "./marks/backend": "./esm/marks/markBackend.js",
49
+ "./marks/colorFill": "./esm/marks/colorFill.js",
50
+ "./marks/drawAgainstHit": "./esm/marks/drawAgainstHit.js",
51
+ "./marks/glyphPaint": "./esm/marks/glyphPaint.js",
52
+ "./marks/hit": "./esm/marks/markHit.js",
47
53
  "./namedReactions": "./esm/namedReactions.js",
48
54
  "./OverlayCanvas": "./esm/OverlayCanvas.js",
49
55
  "./perRegionRenderingBackend": "./esm/perRegionRenderingBackend.js",
@@ -51,9 +57,10 @@
51
57
  "./renderBlock": "./esm/renderBlock.js",
52
58
  "./renderingBackendBase": "./esm/renderingBackendBase.js",
53
59
  "./ScrollLockedOverlay": "./esm/ScrollLockedOverlay.js",
60
+ "./sharedBackendKey": "./esm/sharedBackendKey.js",
54
61
  "./shaders/antialias": "./esm/shaders/antialias.js.generated.js",
62
+ "./shaders/capsule": "./esm/shaders/capsule.js.generated.js",
55
63
  "./shaders/capsuleConsts": "./esm/shaders/capsule.generated.js",
56
- "./shaders/colorRampLutConsts": "./esm/shaders/colorRampLut.generated.js",
57
64
  "./shaders/coverageBar": "./esm/shaders/coverageBar.generated.js",
58
65
  "./shaders/coverageIndicator": "./esm/shaders/coverageIndicator.generated.js",
59
66
  "./shaders/coverageInterbase": "./esm/shaders/coverageInterbase.generated.js",
@@ -62,6 +69,9 @@
62
69
  "./shaders/hpmath": "./esm/shaders/hpmath.js.generated.js",
63
70
  "./shaders/pointGlyph": "./esm/shaders/pointGlyph.js.generated.js",
64
71
  "./shaders/pointGlyphConsts": "./esm/shaders/pointGlyph.generated.js",
72
+ "./shaders/pointMark": "./esm/shaders/pointMark.js.generated.js",
73
+ "./shaders/pointMarkIface": "./esm/shaders/pointMark.iface.generated.js",
74
+ "./shaders/pointMarkConsts": "./esm/shaders/pointMark.consts.generated.js",
65
75
  "./shaders/rowRect": "./esm/shaders/rowRect.js.generated.js",
66
76
  "./shaders/rowRectConsts": "./esm/shaders/rowRect.generated.js",
67
77
  "./shaders/scoreScale": "./esm/shaders/scoreScale.js.generated.js",
@@ -0,0 +1,14 @@
1
+ // AUTO-GENERATED by packages/shader-tools/src/shader-codegen from capsule.slang.
2
+ // Do not edit. Run `pnpm gen:shaders` to regenerate.
3
+
4
+ // Scalar twins of capsule.slang, transliterated from slangc's WGSL so
5
+ // the Canvas2D and SVG paths run the shader's own math. See adr-051.
6
+
7
+ function _max(a: number, b: number) {
8
+ return b > a || Number.isNaN(a) ? b : a
9
+ }
10
+
11
+ export function capsuleDistPx(alongPx: number, acrossPx: number, halfLenPx: number): number {
12
+ let _t0 = _max((Math.abs(alongPx) - halfLenPx), 0.0)
13
+ return Math.sqrt(((_t0 * _t0) + (acrossPx * acrossPx)))
14
+ }
@@ -15,6 +15,7 @@
15
15
  // comes off a clamp and the 2x2 quads straddling the cap/body junction would be
16
16
  // differentiating a discontinuity.
17
17
  //! export-consts: CAPSULE_MIN_LEN_PX
18
+ //! js-export: capsuleDistPx
18
19
  module capsule;
19
20
 
20
21
  import antialias;
@@ -54,9 +55,16 @@ public float2 capsuleQuadLocal(
54
55
  return float2(q.x * (halfLenPx + ext), q.y * ext);
55
56
  }
56
57
 
57
- // CSS-px distance from `local` (the segment's frame, center-anchored) to the
58
- // segment {(-halfLen,0)..(halfLen,0)}. Collapses to distance-from-origin for a
59
- // degenerate segment — the circular dot of radius halfWidth.
58
+ // CSS-px distance from a point in the segment's frame (center-anchored, x
59
+ // along, y across) to the segment {(-halfLen,0)..(halfLen,0)}. Collapses to
60
+ // distance-from-origin for a degenerate segment — the circular dot of radius
61
+ // halfWidth. Scalar so `//! js-export` can lift it: the dotplot's pick measures
62
+ // the cursor against the same capsule the fragment inks, end caps included.
63
+ public float capsuleDistPx(float alongPx, float acrossPx, float halfLenPx) {
64
+ float beyond = max(abs(alongPx) - halfLenPx, 0.0);
65
+ return sqrt(beyond * beyond + acrossPx * acrossPx);
66
+ }
67
+
60
68
  public float capsuleDist(float2 local, float halfLenPx) {
61
- return length(float2(max(abs(local.x) - halfLenPx, 0.0), local.y));
69
+ return capsuleDistPx(local.x, local.y, halfLenPx);
62
70
  }
@@ -15,7 +15,11 @@ module colorPack;
15
15
  //
16
16
  // Declare such a palette as `float4[N]` instead — a vector element needs no
17
17
  // wrapper struct, lowers correctly, AND costs the same 16 bytes per slot that
18
- // std140 was padding the uint to anyway, so packing bought nothing here. Packing
18
+ // std140 was padding the uint to anyway, so packing one colour per element
19
+ // bought nothing here. FOUR to a `uint4` element, read as `p[i >> 2][i & 3]`,
20
+ // does compile and does save — it is the only form that beats the padding — and
21
+ // on alignments' 23-colour palette it was measured and declined:
22
+ // agent-docs/ideas/size-the-uniform-ring-to-its-measured-occupancy.md. Packing
19
23
  // still earns its keep in VERTEX ATTRIBUTES, which is what this is for.
20
24
  public float4 unpackRGBA(uint c) {
21
25
  return float4(
@@ -21,10 +21,10 @@
21
21
  // have to land on the same pixels (adr-051). They live in
22
22
  // @jbrowse/alignments-core because that is where those painters are, and it
23
23
  // cannot depend on a plugin — nor, being upstream of it, on this package.
24
- //! js-export: covEffectiveHeightPx, covBottomOffsetPx, normalizeDepthScalar
24
+ //! js-export: covEffectiveHeightPx, covBottomOffsetPx, normalizeDepthScalar, covBarHeightPx, covSegBottomPx, covSegTopPx
25
25
  //! js-export-out: packages/alignments-core/src/coverageBandLayout.generated.ts
26
26
  //! consts-out: packages/alignments-core/src/indicatorTriangle.generated.ts
27
- //! js-skip: covExpandMinWidthX — a 1 CSS px floor over hpmath's expandToMinWidthX, which is where the rule and the reason it has no Canvas2D twin are recorded
27
+ //! js-skip: covExpandMinWidthX — the clip-space half of the rule; nothing outside a shader is in clip space, so what a painter wants is the px core, and coverageBar.slang exports that (hpmath's expandToMinWidthPx, into alignments-core's spanMinWidth.generated.ts) for fillSpanRect to place its left edge with
28
28
  module coverageBand;
29
29
 
30
30
  import colorPack;
@@ -186,9 +186,10 @@ public float covAreaTop(CoverageBandUniforms u) {
186
186
  return yPxToClipY(u.covTop, u.canvasH);
187
187
  }
188
188
 
189
- public float covBottom(CoverageBandUniforms u) {
190
- return covAreaTop(u)
191
- - (covBottomOffsetPx(u.covHeight, u.covYOffset) / u.canvasH) * 2.0;
189
+ // Screen-px Y of the bars' baseline: covBottomOffsetPx below wherever covTop
190
+ // put the band's top edge.
191
+ public float covBaselinePx(CoverageBandUniforms u) {
192
+ return u.covTop + covBottomOffsetPx(u.covHeight, u.covYOffset);
192
193
  }
193
194
 
194
195
  // Normalize a raw coverage depth to [0,1] over the domain [min, max], on the
@@ -221,15 +222,32 @@ public float covNormalizeDepth(float relDepth, CoverageBandUniforms u) {
221
222
  u.coverageSymlogConstant);
222
223
  }
223
224
 
224
- // Bar height scale: maps relDepth to a clip-space height multiplier. Shared by
225
- // every stacked-segment pass so the formula can't drift between them.
226
- public float covBarScale(float relDepth, CoverageBandUniforms u) {
227
- return covNormalizeDepth(relDepth, u) * covEffHeight(u) / u.canvasH * 2.0;
225
+ // How tall a bar of this normalized depth is drawn, in px — what every stacked
226
+ // fraction in the band is a fraction OF.
227
+ public float covBarHeightPx(float depthFraction, float effectiveHeightPx) {
228
+ return depthFraction * effectiveHeightPx;
229
+ }
230
+
231
+ // The two y edges of one stacked segment, in px. `yOffset` and `segHeight` are
232
+ // fractions of THIS position's bar, measured up from the baseline.
233
+ //
234
+ // Two scalars rather than one `float2`, unlike `rectSpanPx` / `arcRadiiPx`: a
235
+ // vec2 twin comes back as a `[number, number]` (adr-051's tuple convention) and
236
+ // these feed loops that run per covered bp under a no-allocation bar.
237
+ public float covSegBottomPx(float baselinePx, float yOffset,
238
+ float barHeightPx) {
239
+ return baselinePx - yOffset * barHeightPx;
240
+ }
241
+
242
+ public float covSegTopPx(float baselinePx, float yOffset, float segHeight,
243
+ float barHeightPx) {
244
+ return covSegBottomPx(baselinePx, yOffset, barHeightPx)
245
+ - segHeight * barHeightPx;
228
246
  }
229
247
 
230
248
  // Stacked-segment quad — the geometry of EVERY bar in the band. A `widthBp`-wide
231
249
  // rect whose bottom/top are the yOffset / yOffset+segHeight fractions of this
232
- // position's coverage bar (covBarScale(relDepth)).
250
+ // position's coverage bar.
233
251
  //
234
252
  // The three passes differ only in what they put in those parameters. The SNP and
235
253
  // modification segments are 1bp slices of a bar (widthBp 1, a partial y span);
@@ -238,16 +256,21 @@ public float covBarScale(float relDepth, CoverageBandUniforms u) {
238
256
  // so the band could shift under its own segments without anything catching it.
239
257
  // Passing `0.0, 1.0` is not a special case here, it is what "the whole bar"
240
258
  // spells.
259
+ //
260
+ // The y half is decided in px and converted once, the shape adr-051 asks for —
261
+ // so the three Canvas2D painters of this band call the same two functions.
241
262
  public float4 covSegQuad(uint position, uint widthBp, float yOffset,
242
263
  float segHeight, float relDepth, float2 local,
243
264
  CoverageBandUniforms u) {
244
265
  float2 xx = covExpandMinWidthX(
245
266
  covBpToClipX(position, u), covBpToClipX(position + widthBp, u), u.canvasW);
246
- float bottom = covBottom(u);
247
- float k = covBarScale(relDepth, u);
248
- float segBot = bottom + yOffset * k;
249
- float segTop = segBot + segHeight * k;
250
- return covFlippedQuad(xx.x, xx.y, segBot, segTop, local, u);
267
+ float basePx = covBaselinePx(u);
268
+ float barPx = covBarHeightPx(covNormalizeDepth(relDepth, u), covEffHeight(u));
269
+ return covFlippedQuad(
270
+ xx.x, xx.y,
271
+ yPxToClipY(covSegBottomPx(basePx, yOffset, barPx), u.canvasH),
272
+ yPxToClipY(covSegTopPx(basePx, yOffset, segHeight, barPx), u.canvasH),
273
+ local, u);
251
274
  }
252
275
 
253
276
  // SNP segment fill. colorType encodes 1=A 2=C 3=G 4=T 5=N; 5 and any other type
@@ -1,9 +1,9 @@
1
1
  // AUTO-GENERATED by packages/shader-tools/src/shader-codegen from coverageBar.slang.
2
2
  // Do not edit. Run `pnpm gen:shaders` to regenerate.
3
3
 
4
- export const WGSL_SOURCE = "struct CoverageBandUniforms_std140_0\n{\n @align(16) bpHi_0 : f32,\n @align(4) bpLo_0 : f32,\n @align(8) bpLen_0 : f32,\n @align(4) hpZero_0 : f32,\n @align(16) canvasW_0 : f32,\n @align(4) canvasH_0 : f32,\n @align(8) covHeight_0 : f32,\n @align(4) covYOffset_0 : f32,\n @align(16) covTop_0 : f32,\n @align(4) regionMaxDepth_0 : f32,\n @align(8) depthDomainMax_0 : f32,\n @align(4) depthDomainMin_0 : f32,\n @align(16) coverageSymlogConstant_0 : f32,\n @align(4) binSize_0 : f32,\n @align(8) interbaseHeight_0 : f32,\n @align(4) snpMinFreq_0 : f32,\n @align(16) reversed_0 : f32,\n @align(4) coverageScaleType_0 : i32,\n @align(8) colorCoverage_0 : u32,\n @align(4) colorBaseA_0 : u32,\n @align(16) colorBaseC_0 : u32,\n @align(4) colorBaseG_0 : u32,\n @align(8) colorBaseT_0 : u32,\n @align(4) colorBaseN_0 : u32,\n @align(16) colorInsertionIndicator_0 : u32,\n @align(4) colorSoftclipIndicator_0 : u32,\n @align(8) colorHardclipIndicator_0 : u32,\n};\n\n@binding(1) @group(0) var<uniform> u_0 : CoverageBandUniforms_std140_0;\nfn quadLocal_0( vid_0 : u32) -> vec2<f32>\n{\n var v_0 : u32 = vid_0 % u32(6);\n var _S1 : bool = v_0 == u32(0);\n var _S2 : bool;\n if(_S1)\n {\n _S2 = true;\n }\n else\n {\n _S2 = v_0 == u32(2);\n }\n if(_S2)\n {\n _S2 = true;\n }\n else\n {\n _S2 = v_0 == u32(3);\n }\n var _S3 : f32;\n if(_S2)\n {\n _S3 = 0.0f;\n }\n else\n {\n _S3 = 1.0f;\n }\n if(_S1)\n {\n _S2 = true;\n }\n else\n {\n _S2 = v_0 == u32(1);\n }\n if(_S2)\n {\n _S2 = true;\n }\n else\n {\n _S2 = v_0 == u32(4);\n }\n var _S4 : f32;\n if(_S2)\n {\n _S4 = 0.0f;\n }\n else\n {\n _S4 = 1.0f;\n }\n return vec2<f32>(_S3, _S4);\n}\n\nfn hpSplitUint_0( value_0 : u32) -> vec2<f32>\n{\n var lo_0 : u32 = (value_0 & (u32(4095)));\n return vec2<f32>(f32(value_0 - lo_0), f32(lo_0));\n}\n\nfn hpToClipX_0( splitPos_0 : vec2<f32>, bpRange_0 : vec3<f32>, hpZero_1 : f32) -> f32\n{\n var step_0 : f32 = 2.0f / bpRange_0.z;\n var _S5 : f32 = - (1.0f / hpZero_1);\n return dot(vec3<f32>(-1.0f, max(splitPos_0.x - bpRange_0.x, _S5), max(splitPos_0.y - bpRange_0.y, _S5)), vec3<f32>(1.0f, step_0, step_0));\n}\n\nfn covBpToClipX_0( bp_0 : u32, u_1 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return hpToClipX_0(hpSplitUint_0(bp_0), vec3<f32>((*u_1).bpHi_0, (*u_1).bpLo_0, (*u_1).bpLen_0), (*u_1).hpZero_0);\n}\n\nfn expandToMinWidthPx_0( x1_0 : f32, x2_0 : f32, minWidth_0 : f32) -> vec2<f32>\n{\n if((x2_0 - x1_0) < minWidth_0)\n {\n var mid_0 : f32 = (x1_0 + x2_0) * 0.5f;\n var _S6 : f32 = minWidth_0 * 0.5f;\n return vec2<f32>(mid_0 - _S6, mid_0 + _S6);\n }\n return vec2<f32>(x1_0, x2_0);\n}\n\nfn expandToMinWidthX_0( x1_1 : f32, x2_1 : f32, minWidthPx_0 : f32, canvasWidth_0 : f32) -> vec2<f32>\n{\n return expandToMinWidthPx_0(x1_1, x2_1, minWidthPx_0 * 2.0f / canvasWidth_0);\n}\n\nfn covExpandMinWidthX_0( x1_2 : f32, x2_2 : f32, canvasWidth_1 : f32) -> vec2<f32>\n{\n return expandToMinWidthX_0(x1_2, x2_2, 1.0f, canvasWidth_1);\n}\n\nfn yPxToClipY_0( yPx_0 : f32, canvasHeight_0 : f32) -> f32\n{\n return 1.0f - yPx_0 / canvasHeight_0 * 2.0f;\n}\n\nfn covAreaTop_0( u_2 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return yPxToClipY_0((*u_2).covTop_0, (*u_2).canvasH_0);\n}\n\nfn covBottomOffsetPx_0( covHeight_1 : f32, covYOffset_1 : f32) -> f32\n{\n return covHeight_1 - covYOffset_1;\n}\n\nfn covBottom_0( u_3 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n var _S7 : f32 = covAreaTop_0(&((*u_3)));\n return _S7 - covBottomOffsetPx_0((*u_3).covHeight_0, (*u_3).covYOffset_0) / (*u_3).canvasH_0 * 2.0f;\n}\n\nfn symlogTransform_0( x_0 : f32, c_0 : f32) -> f32\n{\n return f32((i32(sign((x_0))))) * log(1.0f + abs(x_0 / c_0));\n}\n\nfn normalizeScore_0( score_0 : f32, domainMin_0 : f32, domainMax_0 : f32, scaleType_0 : i32, symlogConstant_0 : f32) -> f32\n{\n if(scaleType_0 == i32(2))\n {\n var tMin_0 : f32 = symlogTransform_0(domainMin_0, symlogConstant_0);\n var tRange_0 : f32 = symlogTransform_0(domainMax_0, symlogConstant_0) - tMin_0;\n if(tRange_0 <= 0.0f)\n {\n return 0.0f;\n }\n return clamp((symlogTransform_0(score_0, symlogConstant_0) - tMin_0) / tRange_0, 0.0f, 1.0f);\n }\n if(scaleType_0 == i32(1))\n {\n var floorV_0 : f32;\n if(domainMin_0 > 0.0f)\n {\n floorV_0 = domainMin_0;\n }\n else\n {\n floorV_0 = 1.0f;\n }\n var logMin_0 : f32 = log2(floorV_0);\n var logRange_0 : f32 = log2(max(domainMax_0, floorV_0)) - logMin_0;\n if(logRange_0 <= 0.0f)\n {\n return 0.0f;\n }\n return clamp((log2(max(score_0, floorV_0)) - logMin_0) / logRange_0, 0.0f, 1.0f);\n }\n var range_0 : f32 = domainMax_0 - domainMin_0;\n if(range_0 <= 0.0f)\n {\n return 0.0f;\n }\n return clamp((score_0 - domainMin_0) / range_0, 0.0f, 1.0f);\n}\n\nfn normalizeDepthScalar_0( rawDepth_0 : f32, domainMin_1 : f32, domainMax_1 : f32, scaleType_1 : i32, symlogConstant_1 : f32) -> f32\n{\n return normalizeScore_0(rawDepth_0, domainMin_1, domainMax_1, scaleType_1, symlogConstant_1);\n}\n\nfn covNormalizeDepth_0( relDepth_0 : f32, u_4 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return normalizeDepthScalar_0(relDepth_0 * (*u_4).regionMaxDepth_0, (*u_4).depthDomainMin_0, (*u_4).depthDomainMax_0, (*u_4).coverageScaleType_0, (*u_4).coverageSymlogConstant_0);\n}\n\nfn covEffectiveHeightPx_0( covHeight_2 : f32, covYOffset_2 : f32) -> f32\n{\n return max(covHeight_2 - 2.0f * covYOffset_2, 0.0f);\n}\n\nfn covEffHeight_0( u_5 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return covEffectiveHeightPx_0((*u_5).covHeight_0, (*u_5).covYOffset_0);\n}\n\nfn covBarScale_0( relDepth_1 : f32, u_6 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n var _S8 : f32 = covNormalizeDepth_0(relDepth_1, &((*u_6)));\n var _S9 : f32 = covEffHeight_0(&((*u_6)));\n return _S8 * _S9 / (*u_6).canvasH_0 * 2.0f;\n}\n\nfn covFlipX_0( x_1 : f32, u_7 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return mix(x_1, - x_1, (*u_7).reversed_0);\n}\n\nfn covFlippedQuad_0( x0_0 : f32, x1_3 : f32, yBot_0 : f32, yTop_0 : f32, local_0 : vec2<f32>, u_8 : ptr<function, CoverageBandUniforms_std140_0>) -> vec4<f32>\n{\n var _S10 : f32 = covFlipX_0(mix(x0_0, x1_3, local_0.x), &((*u_8)));\n return vec4<f32>(_S10, mix(yBot_0, yTop_0, local_0.y), 0.0f, 1.0f);\n}\n\nfn covSegQuad_0( position_0 : u32, widthBp_0 : u32, yOffset_0 : f32, segHeight_0 : f32, relDepth_2 : f32, local_1 : vec2<f32>, u_9 : ptr<function, CoverageBandUniforms_std140_0>) -> vec4<f32>\n{\n var _S11 : f32 = covBpToClipX_0(position_0, &((*u_9)));\n var _S12 : f32 = covBpToClipX_0(position_0 + widthBp_0, &((*u_9)));\n var xx_0 : vec2<f32> = covExpandMinWidthX_0(_S11, _S12, (*u_9).canvasW_0);\n var _S13 : f32 = covBottom_0(&((*u_9)));\n var _S14 : f32 = covBarScale_0(relDepth_2, &((*u_9)));\n var segBot_0 : f32 = _S13 + yOffset_0 * _S14;\n var _S15 : vec4<f32> = covFlippedQuad_0(xx_0.x, xx_0.y, segBot_0, segBot_0 + segHeight_0 * _S14, local_1, &((*u_9)));\n return _S15;\n}\n\nfn unpackRGBA_0( c_1 : u32) -> vec4<f32>\n{\n return vec4<f32>(f32((((c_1 >> (u32(0)))) & (u32(255)))), f32((((c_1 >> (u32(8)))) & (u32(255)))), f32((((c_1 >> (u32(16)))) & (u32(255)))), f32((((c_1 >> (u32(24)))) & (u32(255))))) / vec4<f32>(255.0f);\n}\n\nstruct CoverageVsOut_0\n{\n @builtin(position) position_1 : vec4<f32>,\n @location(0) color_0 : vec4<f32>,\n};\n\nstruct vertexInput_0\n{\n @location(0) position_2 : u32,\n @location(1) relDepth_3 : f32,\n};\n\n@vertex\nfn vs_main( _S16 : vertexInput_0, @builtin(vertex_index) vid_1 : u32) -> CoverageVsOut_0\n{\n var o_0 : CoverageVsOut_0;\n var _S17 : u32 = u32(u_0.binSize_0);\n var _S18 : vec2<f32> = quadLocal_0(vid_1);\n var _S19 : CoverageBandUniforms_std140_0 = u_0;\n var _S20 : vec4<f32> = covSegQuad_0(_S16.position_2, _S17, 0.0f, 1.0f, _S16.relDepth_3, _S18, &(_S19));\n o_0.position_1 = _S20;\n o_0.color_0 = vec4<f32>(unpackRGBA_0(u_0.colorCoverage_0).xyz, 1.0f);\n return o_0;\n}\n\nstruct pixelOutput_0\n{\n @location(0) output_0 : vec4<f32>,\n};\n\nstruct pixelInput_0\n{\n @location(0) color_1 : vec4<f32>,\n};\n\n@fragment\nfn fs_main( _S21 : pixelInput_0, @builtin(position) position_3 : vec4<f32>) -> pixelOutput_0\n{\n var _S22 : pixelOutput_0 = pixelOutput_0( _S21.color_1 );\n return _S22;\n}\n\n"
4
+ export const WGSL_SOURCE = "struct CoverageBandUniforms_std140_0\n{\n @align(16) bpHi_0 : f32,\n @align(4) bpLo_0 : f32,\n @align(8) bpLen_0 : f32,\n @align(4) hpZero_0 : f32,\n @align(16) canvasW_0 : f32,\n @align(4) canvasH_0 : f32,\n @align(8) covHeight_0 : f32,\n @align(4) covYOffset_0 : f32,\n @align(16) covTop_0 : f32,\n @align(4) regionMaxDepth_0 : f32,\n @align(8) depthDomainMax_0 : f32,\n @align(4) depthDomainMin_0 : f32,\n @align(16) coverageSymlogConstant_0 : f32,\n @align(4) binSize_0 : f32,\n @align(8) interbaseHeight_0 : f32,\n @align(4) snpMinFreq_0 : f32,\n @align(16) reversed_0 : f32,\n @align(4) coverageScaleType_0 : i32,\n @align(8) colorCoverage_0 : u32,\n @align(4) colorBaseA_0 : u32,\n @align(16) colorBaseC_0 : u32,\n @align(4) colorBaseG_0 : u32,\n @align(8) colorBaseT_0 : u32,\n @align(4) colorBaseN_0 : u32,\n @align(16) colorInsertionIndicator_0 : u32,\n @align(4) colorSoftclipIndicator_0 : u32,\n @align(8) colorHardclipIndicator_0 : u32,\n};\n\n@binding(1) @group(0) var<uniform> u_0 : CoverageBandUniforms_std140_0;\nfn quadLocal_0( vid_0 : u32) -> vec2<f32>\n{\n var v_0 : u32 = vid_0 % u32(6);\n var _S1 : bool = v_0 == u32(0);\n var _S2 : bool;\n if(_S1)\n {\n _S2 = true;\n }\n else\n {\n _S2 = v_0 == u32(2);\n }\n if(_S2)\n {\n _S2 = true;\n }\n else\n {\n _S2 = v_0 == u32(3);\n }\n var _S3 : f32;\n if(_S2)\n {\n _S3 = 0.0f;\n }\n else\n {\n _S3 = 1.0f;\n }\n if(_S1)\n {\n _S2 = true;\n }\n else\n {\n _S2 = v_0 == u32(1);\n }\n if(_S2)\n {\n _S2 = true;\n }\n else\n {\n _S2 = v_0 == u32(4);\n }\n var _S4 : f32;\n if(_S2)\n {\n _S4 = 0.0f;\n }\n else\n {\n _S4 = 1.0f;\n }\n return vec2<f32>(_S3, _S4);\n}\n\nfn hpSplitUint_0( value_0 : u32) -> vec2<f32>\n{\n var lo_0 : u32 = (value_0 & (u32(4095)));\n return vec2<f32>(f32(value_0 - lo_0), f32(lo_0));\n}\n\nfn hpToClipX_0( splitPos_0 : vec2<f32>, bpRange_0 : vec3<f32>, hpZero_1 : f32) -> f32\n{\n var step_0 : f32 = 2.0f / bpRange_0.z;\n var _S5 : f32 = - (1.0f / hpZero_1);\n return dot(vec3<f32>(-1.0f, max(splitPos_0.x - bpRange_0.x, _S5), max(splitPos_0.y - bpRange_0.y, _S5)), vec3<f32>(1.0f, step_0, step_0));\n}\n\nfn covBpToClipX_0( bp_0 : u32, u_1 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return hpToClipX_0(hpSplitUint_0(bp_0), vec3<f32>((*u_1).bpHi_0, (*u_1).bpLo_0, (*u_1).bpLen_0), (*u_1).hpZero_0);\n}\n\nfn expandToMinWidthPx_0( x1_0 : f32, x2_0 : f32, minWidth_0 : f32) -> vec2<f32>\n{\n if((x2_0 - x1_0) < minWidth_0)\n {\n var mid_0 : f32 = (x1_0 + x2_0) * 0.5f;\n var _S6 : f32 = minWidth_0 * 0.5f;\n return vec2<f32>(mid_0 - _S6, mid_0 + _S6);\n }\n return vec2<f32>(x1_0, x2_0);\n}\n\nfn expandToMinWidthX_0( x1_1 : f32, x2_1 : f32, minWidthPx_0 : f32, canvasWidth_0 : f32) -> vec2<f32>\n{\n return expandToMinWidthPx_0(x1_1, x2_1, minWidthPx_0 * 2.0f / canvasWidth_0);\n}\n\nfn covExpandMinWidthX_0( x1_2 : f32, x2_2 : f32, canvasWidth_1 : f32) -> vec2<f32>\n{\n return expandToMinWidthX_0(x1_2, x2_2, 1.0f, canvasWidth_1);\n}\n\nfn covBottomOffsetPx_0( covHeight_1 : f32, covYOffset_1 : f32) -> f32\n{\n return covHeight_1 - covYOffset_1;\n}\n\nfn covBaselinePx_0( u_2 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return (*u_2).covTop_0 + covBottomOffsetPx_0((*u_2).covHeight_0, (*u_2).covYOffset_0);\n}\n\nfn symlogTransform_0( x_0 : f32, c_0 : f32) -> f32\n{\n return f32((i32(sign((x_0))))) * log(1.0f + abs(x_0 / c_0));\n}\n\nfn normalizeScore_0( score_0 : f32, domainMin_0 : f32, domainMax_0 : f32, scaleType_0 : i32, symlogConstant_0 : f32) -> f32\n{\n if(scaleType_0 == i32(2))\n {\n var tMin_0 : f32 = symlogTransform_0(domainMin_0, symlogConstant_0);\n var tRange_0 : f32 = symlogTransform_0(domainMax_0, symlogConstant_0) - tMin_0;\n if(tRange_0 <= 0.0f)\n {\n return 0.0f;\n }\n return clamp((symlogTransform_0(score_0, symlogConstant_0) - tMin_0) / tRange_0, 0.0f, 1.0f);\n }\n if(scaleType_0 == i32(1))\n {\n var floorV_0 : f32;\n if(domainMin_0 > 0.0f)\n {\n floorV_0 = domainMin_0;\n }\n else\n {\n floorV_0 = 1.0f;\n }\n var logMin_0 : f32 = log2(floorV_0);\n var logRange_0 : f32 = log2(max(domainMax_0, floorV_0)) - logMin_0;\n if(logRange_0 <= 0.0f)\n {\n return 0.0f;\n }\n return clamp((log2(max(score_0, floorV_0)) - logMin_0) / logRange_0, 0.0f, 1.0f);\n }\n var range_0 : f32 = domainMax_0 - domainMin_0;\n if(range_0 <= 0.0f)\n {\n return 0.0f;\n }\n return clamp((score_0 - domainMin_0) / range_0, 0.0f, 1.0f);\n}\n\nfn normalizeDepthScalar_0( rawDepth_0 : f32, domainMin_1 : f32, domainMax_1 : f32, scaleType_1 : i32, symlogConstant_1 : f32) -> f32\n{\n return normalizeScore_0(rawDepth_0, domainMin_1, domainMax_1, scaleType_1, symlogConstant_1);\n}\n\nfn covNormalizeDepth_0( relDepth_0 : f32, u_3 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return normalizeDepthScalar_0(relDepth_0 * (*u_3).regionMaxDepth_0, (*u_3).depthDomainMin_0, (*u_3).depthDomainMax_0, (*u_3).coverageScaleType_0, (*u_3).coverageSymlogConstant_0);\n}\n\nfn covEffectiveHeightPx_0( covHeight_2 : f32, covYOffset_2 : f32) -> f32\n{\n return max(covHeight_2 - 2.0f * covYOffset_2, 0.0f);\n}\n\nfn covEffHeight_0( u_4 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return covEffectiveHeightPx_0((*u_4).covHeight_0, (*u_4).covYOffset_0);\n}\n\nfn covBarHeightPx_0( depthFraction_0 : f32, effectiveHeightPx_0 : f32) -> f32\n{\n return depthFraction_0 * effectiveHeightPx_0;\n}\n\nfn covSegBottomPx_0( baselinePx_0 : f32, yOffset_0 : f32, barHeightPx_0 : f32) -> f32\n{\n return baselinePx_0 - yOffset_0 * barHeightPx_0;\n}\n\nfn yPxToClipY_0( yPx_0 : f32, canvasHeight_0 : f32) -> f32\n{\n return 1.0f - yPx_0 / canvasHeight_0 * 2.0f;\n}\n\nfn covSegTopPx_0( baselinePx_1 : f32, yOffset_1 : f32, segHeight_0 : f32, barHeightPx_1 : f32) -> f32\n{\n return covSegBottomPx_0(baselinePx_1, yOffset_1, barHeightPx_1) - segHeight_0 * barHeightPx_1;\n}\n\nfn covFlipX_0( x_1 : f32, u_5 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return mix(x_1, - x_1, (*u_5).reversed_0);\n}\n\nfn covFlippedQuad_0( x0_0 : f32, x1_3 : f32, yBot_0 : f32, yTop_0 : f32, local_0 : vec2<f32>, u_6 : ptr<function, CoverageBandUniforms_std140_0>) -> vec4<f32>\n{\n var _S7 : f32 = covFlipX_0(mix(x0_0, x1_3, local_0.x), &((*u_6)));\n return vec4<f32>(_S7, mix(yBot_0, yTop_0, local_0.y), 0.0f, 1.0f);\n}\n\nfn covSegQuad_0( position_0 : u32, widthBp_0 : u32, yOffset_2 : f32, segHeight_1 : f32, relDepth_1 : f32, local_1 : vec2<f32>, u_7 : ptr<function, CoverageBandUniforms_std140_0>) -> vec4<f32>\n{\n var _S8 : f32 = covBpToClipX_0(position_0, &((*u_7)));\n var _S9 : f32 = covBpToClipX_0(position_0 + widthBp_0, &((*u_7)));\n var xx_0 : vec2<f32> = covExpandMinWidthX_0(_S8, _S9, (*u_7).canvasW_0);\n var _S10 : f32 = covBaselinePx_0(&((*u_7)));\n var _S11 : f32 = covNormalizeDepth_0(relDepth_1, &((*u_7)));\n var _S12 : f32 = covEffHeight_0(&((*u_7)));\n var barPx_0 : f32 = covBarHeightPx_0(_S11, _S12);\n var _S13 : vec4<f32> = covFlippedQuad_0(xx_0.x, xx_0.y, yPxToClipY_0(covSegBottomPx_0(_S10, yOffset_2, barPx_0), (*u_7).canvasH_0), yPxToClipY_0(covSegTopPx_0(_S10, yOffset_2, segHeight_1, barPx_0), (*u_7).canvasH_0), local_1, &((*u_7)));\n return _S13;\n}\n\nfn unpackRGBA_0( c_1 : u32) -> vec4<f32>\n{\n return vec4<f32>(f32((((c_1 >> (u32(0)))) & (u32(255)))), f32((((c_1 >> (u32(8)))) & (u32(255)))), f32((((c_1 >> (u32(16)))) & (u32(255)))), f32((((c_1 >> (u32(24)))) & (u32(255))))) / vec4<f32>(255.0f);\n}\n\nstruct CoverageVsOut_0\n{\n @builtin(position) position_1 : vec4<f32>,\n @location(0) color_0 : vec4<f32>,\n};\n\nstruct vertexInput_0\n{\n @location(0) position_2 : u32,\n @location(1) relDepth_2 : f32,\n};\n\n@vertex\nfn vs_main( _S14 : vertexInput_0, @builtin(vertex_index) vid_1 : u32) -> CoverageVsOut_0\n{\n var o_0 : CoverageVsOut_0;\n var _S15 : u32 = u32(u_0.binSize_0);\n var _S16 : vec2<f32> = quadLocal_0(vid_1);\n var _S17 : CoverageBandUniforms_std140_0 = u_0;\n var _S18 : vec4<f32> = covSegQuad_0(_S14.position_2, _S15, 0.0f, 1.0f, _S14.relDepth_2, _S16, &(_S17));\n o_0.position_1 = _S18;\n o_0.color_0 = vec4<f32>(unpackRGBA_0(u_0.colorCoverage_0).xyz, 1.0f);\n return o_0;\n}\n\nstruct pixelOutput_0\n{\n @location(0) output_0 : vec4<f32>,\n};\n\nstruct pixelInput_0\n{\n @location(0) color_1 : vec4<f32>,\n};\n\n@fragment\nfn fs_main( _S19 : pixelInput_0, @builtin(position) position_3 : vec4<f32>) -> pixelOutput_0\n{\n var _S20 : pixelOutput_0 = pixelOutput_0( _S19.color_1 );\n return _S20;\n}\n\n"
5
5
 
6
- export const GLSL_VERTEX = "#version 300 es\nprecision highp float;\nprecision highp int;\nstruct CoverageBandUniforms_0\n{\n float bpHi_0;\n float bpLo_0;\n float bpLen_0;\n float hpZero_0;\n float canvasW_0;\n float canvasH_0;\n float covHeight_0;\n float covYOffset_0;\n float covTop_0;\n float regionMaxDepth_0;\n float depthDomainMax_0;\n float depthDomainMin_0;\n float coverageSymlogConstant_0;\n float binSize_0;\n float interbaseHeight_0;\n float snpMinFreq_0;\n float reversed_0;\n int coverageScaleType_0;\n uint colorCoverage_0;\n uint colorBaseA_0;\n uint colorBaseC_0;\n uint colorBaseG_0;\n uint colorBaseT_0;\n uint colorBaseN_0;\n uint colorInsertionIndicator_0;\n uint colorSoftclipIndicator_0;\n uint colorHardclipIndicator_0;\n};\n\n\nlayout(std140) uniform Uniforms\n{\n float bpHi_0;\n float bpLo_0;\n float bpLen_0;\n float hpZero_0;\n float canvasW_0;\n float canvasH_0;\n float covHeight_0;\n float covYOffset_0;\n float covTop_0;\n float regionMaxDepth_0;\n float depthDomainMax_0;\n float depthDomainMin_0;\n float coverageSymlogConstant_0;\n float binSize_0;\n float interbaseHeight_0;\n float snpMinFreq_0;\n float reversed_0;\n int coverageScaleType_0;\n uint colorCoverage_0;\n uint colorBaseA_0;\n uint colorBaseC_0;\n uint colorBaseG_0;\n uint colorBaseT_0;\n uint colorBaseN_0;\n uint colorInsertionIndicator_0;\n uint colorSoftclipIndicator_0;\n uint colorHardclipIndicator_0;\n}u_0;\n\nvec2 quadLocal_0(uint vid_0)\n{\n\n uint v_0 = vid_0 % 6U;\n\n bool _S1 = v_0 == 0U;\n\n bool _S2;\n\n if(_S1)\n {\n\n _S2 = true;\n\n }\n else\n {\n\n _S2 = v_0 == 2U;\n\n }\n\n if(_S2)\n {\n\n _S2 = true;\n\n }\n else\n {\n\n _S2 = v_0 == 3U;\n\n }\n\n float _S3;\n\n if(_S2)\n {\n\n _S3 = 0.0;\n\n }\n else\n {\n\n _S3 = 1.0;\n\n }\n if(_S1)\n {\n\n _S2 = true;\n\n }\n else\n {\n\n _S2 = v_0 == 1U;\n\n }\n\n if(_S2)\n {\n\n _S2 = true;\n\n }\n else\n {\n\n _S2 = v_0 == 4U;\n\n }\n\n float _S4;\n\n if(_S2)\n {\n\n _S4 = 0.0;\n\n }\n else\n {\n\n _S4 = 1.0;\n\n }\n\n return vec2(_S3, _S4);\n}\n\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 hpToClipX_0(vec2 splitPos_0, vec3 bpRange_0, float hpZero_1)\n{\n float step_0 = 2.0 / bpRange_0.z;\n float _S5 = - (1.0 / hpZero_1);\n\n return dot(vec3(-1.0, max(splitPos_0.x - bpRange_0.x, _S5), max(splitPos_0.y - bpRange_0.y, _S5)), vec3(1.0, step_0, step_0));\n}\n\n\nfloat covBpToClipX_0(uint bp_0, CoverageBandUniforms_0 u_1)\n{\n\n return hpToClipX_0(hpSplitUint_0(bp_0), vec3(u_1.bpHi_0, u_1.bpLo_0, u_1.bpLen_0), u_1.hpZero_0);\n}\n\n\nvec2 expandToMinWidthPx_0(float x1_0, float x2_0, float minWidth_0)\n{\n\n if((x2_0 - x1_0) < minWidth_0)\n {\n\n float mid_0 = (x1_0 + x2_0) * 0.5;\n float _S6 = minWidth_0 * 0.5;\n\n return vec2(mid_0 - _S6, mid_0 + _S6);\n }\n return vec2(x1_0, x2_0);\n}\n\nvec2 expandToMinWidthX_0(float x1_1, float x2_1, float minWidthPx_0, float canvasWidth_0)\n{\n\n return expandToMinWidthPx_0(x1_1, x2_1, minWidthPx_0 * 2.0 / canvasWidth_0);\n}\n\n\nvec2 covExpandMinWidthX_0(float x1_2, float x2_2, float canvasWidth_1)\n{\n\n return expandToMinWidthX_0(x1_2, x2_2, 1.0, canvasWidth_1);\n}\n\n\nfloat yPxToClipY_0(float yPx_0, float canvasHeight_0)\n{\n\n return 1.0 - yPx_0 / canvasHeight_0 * 2.0;\n}\n\n\nfloat covAreaTop_0(CoverageBandUniforms_0 u_2)\n{\n\n return yPxToClipY_0(u_2.covTop_0, u_2.canvasH_0);\n}\n\n\nfloat covBottomOffsetPx_0(float covHeight_1, float covYOffset_1)\n{\n\n return covHeight_1 - covYOffset_1;\n}\n\n\nfloat covBottom_0(CoverageBandUniforms_0 u_3)\n{\n\n return covAreaTop_0(u_3) - covBottomOffsetPx_0(u_3.covHeight_0, u_3.covYOffset_0) / u_3.canvasH_0 * 2.0;\n}\n\n\nfloat symlogTransform_0(float x_0, float c_0)\n{\n\n return float((int(sign((x_0))))) * log(1.0 + abs(x_0 / c_0));\n}\n\nfloat normalizeScore_0(float score_0, float domainMin_0, float domainMax_0, int scaleType_0, float symlogConstant_0)\n{\n\n if(scaleType_0 == 2)\n {\n\n float tMin_0 = symlogTransform_0(domainMin_0, symlogConstant_0);\n\n float tRange_0 = symlogTransform_0(domainMax_0, symlogConstant_0) - tMin_0;\n if(tRange_0 <= 0.0)\n {\n\n return 0.0;\n }\n return clamp((symlogTransform_0(score_0, symlogConstant_0) - tMin_0) / tRange_0, 0.0, 1.0);\n }\n if(scaleType_0 == 1)\n {\n\n float floorV_0;\n\n if(domainMin_0 > 0.0)\n {\n\n floorV_0 = domainMin_0;\n\n }\n else\n {\n\n floorV_0 = 1.0;\n\n }\n float logMin_0 = log2(floorV_0);\n\n float logRange_0 = log2(max(domainMax_0, floorV_0)) - logMin_0;\n if(logRange_0 <= 0.0)\n {\n\n return 0.0;\n }\n return clamp((log2(max(score_0, floorV_0)) - logMin_0) / logRange_0, 0.0, 1.0);\n }\n float range_0 = domainMax_0 - domainMin_0;\n if(range_0 <= 0.0)\n {\n\n return 0.0;\n }\n\n return clamp((score_0 - domainMin_0) / range_0, 0.0, 1.0);\n}\n\n\nfloat normalizeDepthScalar_0(float rawDepth_0, float domainMin_1, float domainMax_1, int scaleType_1, float symlogConstant_1)\n{\n\n return normalizeScore_0(rawDepth_0, domainMin_1, domainMax_1, scaleType_1, symlogConstant_1);\n}\n\n\nfloat covNormalizeDepth_0(float relDepth_0, CoverageBandUniforms_0 u_4)\n{\n return normalizeDepthScalar_0(relDepth_0 * u_4.regionMaxDepth_0, u_4.depthDomainMin_0, u_4.depthDomainMax_0, u_4.coverageScaleType_0, u_4.coverageSymlogConstant_0);\n}\n\n\nfloat covEffectiveHeightPx_0(float covHeight_2, float covYOffset_2)\n{\n\n return max(covHeight_2 - 2.0 * covYOffset_2, 0.0);\n}\n\n\nfloat covEffHeight_0(CoverageBandUniforms_0 u_5)\n{\n\n return covEffectiveHeightPx_0(u_5.covHeight_0, u_5.covYOffset_0);\n}\n\n\nfloat covBarScale_0(float relDepth_1, CoverageBandUniforms_0 u_6)\n{\n\n return covNormalizeDepth_0(relDepth_1, u_6) * covEffHeight_0(u_6) / u_6.canvasH_0 * 2.0;\n}\n\n\nfloat covFlipX_0(float x_1, CoverageBandUniforms_0 u_7)\n{\n\n return mix(x_1, - x_1, u_7.reversed_0);\n}\n\n\nvec4 covFlippedQuad_0(float x0_0, float x1_3, float yBot_0, float yTop_0, vec2 local_0, CoverageBandUniforms_0 u_8)\n{\n return vec4(covFlipX_0(mix(x0_0, x1_3, local_0.x), u_8), mix(yBot_0, yTop_0, local_0.y), 0.0, 1.0);\n}\n\n\nvec4 covSegQuad_0(uint position_0, uint widthBp_0, float yOffset_0, float segHeight_0, float relDepth_2, vec2 local_1, CoverageBandUniforms_0 u_9)\n{\n\n vec2 xx_0 = covExpandMinWidthX_0(covBpToClipX_0(position_0, u_9), covBpToClipX_0(position_0 + widthBp_0, u_9), u_9.canvasW_0);\n\n\n float k_0 = covBarScale_0(relDepth_2, u_9);\n float segBot_0 = covBottom_0(u_9) + yOffset_0 * k_0;\n\n return covFlippedQuad_0(xx_0.x, xx_0.y, segBot_0, segBot_0 + segHeight_0 * k_0, local_1, u_9);\n}\n\n\nvec4 unpackRGBA_0(uint c_1)\n{\n\n return vec4(float((c_1 >> 0U) & 255U), float((c_1 >> 8U) & 255U), float((c_1 >> 16U) & 255U), float((c_1 >> 24U) & 255U)) / 255.0;\n}\n\n\nout vec4 v_color;\n\n\nlayout(location = 0)\nin uint a_position;\n\n\nlayout(location = 1)\nin float a_relDepth;\n\n\nstruct CoverageVsOut_0\n{\n vec4 position_1;\n vec4 color_0;\n};\n\n\nvoid main()\n{\n\n CoverageVsOut_0 o_0;\n\n CoverageBandUniforms_0 _S7 = CoverageBandUniforms_0(u_0.bpHi_0, u_0.bpLo_0, u_0.bpLen_0, u_0.hpZero_0, u_0.canvasW_0, u_0.canvasH_0, u_0.covHeight_0, u_0.covYOffset_0, u_0.covTop_0, u_0.regionMaxDepth_0, u_0.depthDomainMax_0, u_0.depthDomainMin_0, u_0.coverageSymlogConstant_0, u_0.binSize_0, u_0.interbaseHeight_0, u_0.snpMinFreq_0, u_0.reversed_0, u_0.coverageScaleType_0, u_0.colorCoverage_0, u_0.colorBaseA_0, u_0.colorBaseC_0, u_0.colorBaseG_0, u_0.colorBaseT_0, u_0.colorBaseN_0, u_0.colorInsertionIndicator_0, u_0.colorSoftclipIndicator_0, u_0.colorHardclipIndicator_0);\n\n o_0.position_1 = covSegQuad_0(a_position, uint(u_0.binSize_0), 0.0, 1.0, a_relDepth, quadLocal_0(uint(gl_VertexID)), _S7);\n\n o_0.color_0 = vec4(unpackRGBA_0(u_0.colorCoverage_0).xyz, 1.0);\n CoverageVsOut_0 _S8 = o_0;\n\n gl_Position = o_0.position_1;\n\n v_color = _S8.color_0;\n\n return;\n}\n\n"
6
+ export const GLSL_VERTEX = "#version 300 es\nprecision highp float;\nprecision highp int;\nstruct CoverageBandUniforms_0\n{\n float bpHi_0;\n float bpLo_0;\n float bpLen_0;\n float hpZero_0;\n float canvasW_0;\n float canvasH_0;\n float covHeight_0;\n float covYOffset_0;\n float covTop_0;\n float regionMaxDepth_0;\n float depthDomainMax_0;\n float depthDomainMin_0;\n float coverageSymlogConstant_0;\n float binSize_0;\n float interbaseHeight_0;\n float snpMinFreq_0;\n float reversed_0;\n int coverageScaleType_0;\n uint colorCoverage_0;\n uint colorBaseA_0;\n uint colorBaseC_0;\n uint colorBaseG_0;\n uint colorBaseT_0;\n uint colorBaseN_0;\n uint colorInsertionIndicator_0;\n uint colorSoftclipIndicator_0;\n uint colorHardclipIndicator_0;\n};\n\n\nlayout(std140) uniform Uniforms\n{\n float bpHi_0;\n float bpLo_0;\n float bpLen_0;\n float hpZero_0;\n float canvasW_0;\n float canvasH_0;\n float covHeight_0;\n float covYOffset_0;\n float covTop_0;\n float regionMaxDepth_0;\n float depthDomainMax_0;\n float depthDomainMin_0;\n float coverageSymlogConstant_0;\n float binSize_0;\n float interbaseHeight_0;\n float snpMinFreq_0;\n float reversed_0;\n int coverageScaleType_0;\n uint colorCoverage_0;\n uint colorBaseA_0;\n uint colorBaseC_0;\n uint colorBaseG_0;\n uint colorBaseT_0;\n uint colorBaseN_0;\n uint colorInsertionIndicator_0;\n uint colorSoftclipIndicator_0;\n uint colorHardclipIndicator_0;\n}u_0;\n\nvec2 quadLocal_0(uint vid_0)\n{\n\n uint v_0 = vid_0 % 6U;\n\n bool _S1 = v_0 == 0U;\n\n bool _S2;\n\n if(_S1)\n {\n\n _S2 = true;\n\n }\n else\n {\n\n _S2 = v_0 == 2U;\n\n }\n\n if(_S2)\n {\n\n _S2 = true;\n\n }\n else\n {\n\n _S2 = v_0 == 3U;\n\n }\n\n float _S3;\n\n if(_S2)\n {\n\n _S3 = 0.0;\n\n }\n else\n {\n\n _S3 = 1.0;\n\n }\n if(_S1)\n {\n\n _S2 = true;\n\n }\n else\n {\n\n _S2 = v_0 == 1U;\n\n }\n\n if(_S2)\n {\n\n _S2 = true;\n\n }\n else\n {\n\n _S2 = v_0 == 4U;\n\n }\n\n float _S4;\n\n if(_S2)\n {\n\n _S4 = 0.0;\n\n }\n else\n {\n\n _S4 = 1.0;\n\n }\n\n return vec2(_S3, _S4);\n}\n\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 hpToClipX_0(vec2 splitPos_0, vec3 bpRange_0, float hpZero_1)\n{\n float step_0 = 2.0 / bpRange_0.z;\n float _S5 = - (1.0 / hpZero_1);\n\n return dot(vec3(-1.0, max(splitPos_0.x - bpRange_0.x, _S5), max(splitPos_0.y - bpRange_0.y, _S5)), vec3(1.0, step_0, step_0));\n}\n\n\nfloat covBpToClipX_0(uint bp_0, CoverageBandUniforms_0 u_1)\n{\n\n return hpToClipX_0(hpSplitUint_0(bp_0), vec3(u_1.bpHi_0, u_1.bpLo_0, u_1.bpLen_0), u_1.hpZero_0);\n}\n\n\nvec2 expandToMinWidthPx_0(float x1_0, float x2_0, float minWidth_0)\n{\n\n if((x2_0 - x1_0) < minWidth_0)\n {\n\n float mid_0 = (x1_0 + x2_0) * 0.5;\n float _S6 = minWidth_0 * 0.5;\n\n return vec2(mid_0 - _S6, mid_0 + _S6);\n }\n return vec2(x1_0, x2_0);\n}\n\nvec2 expandToMinWidthX_0(float x1_1, float x2_1, float minWidthPx_0, float canvasWidth_0)\n{\n\n return expandToMinWidthPx_0(x1_1, x2_1, minWidthPx_0 * 2.0 / canvasWidth_0);\n}\n\n\nvec2 covExpandMinWidthX_0(float x1_2, float x2_2, float canvasWidth_1)\n{\n\n return expandToMinWidthX_0(x1_2, x2_2, 1.0, canvasWidth_1);\n}\n\n\nfloat covBottomOffsetPx_0(float covHeight_1, float covYOffset_1)\n{\n\n return covHeight_1 - covYOffset_1;\n}\n\n\nfloat covBaselinePx_0(CoverageBandUniforms_0 u_2)\n{\n\n return u_2.covTop_0 + covBottomOffsetPx_0(u_2.covHeight_0, u_2.covYOffset_0);\n}\n\n\nfloat symlogTransform_0(float x_0, float c_0)\n{\n\n return float((int(sign((x_0))))) * log(1.0 + abs(x_0 / c_0));\n}\n\nfloat normalizeScore_0(float score_0, float domainMin_0, float domainMax_0, int scaleType_0, float symlogConstant_0)\n{\n\n if(scaleType_0 == 2)\n {\n\n float tMin_0 = symlogTransform_0(domainMin_0, symlogConstant_0);\n\n float tRange_0 = symlogTransform_0(domainMax_0, symlogConstant_0) - tMin_0;\n if(tRange_0 <= 0.0)\n {\n\n return 0.0;\n }\n return clamp((symlogTransform_0(score_0, symlogConstant_0) - tMin_0) / tRange_0, 0.0, 1.0);\n }\n if(scaleType_0 == 1)\n {\n\n float floorV_0;\n\n if(domainMin_0 > 0.0)\n {\n\n floorV_0 = domainMin_0;\n\n }\n else\n {\n\n floorV_0 = 1.0;\n\n }\n float logMin_0 = log2(floorV_0);\n\n float logRange_0 = log2(max(domainMax_0, floorV_0)) - logMin_0;\n if(logRange_0 <= 0.0)\n {\n\n return 0.0;\n }\n return clamp((log2(max(score_0, floorV_0)) - logMin_0) / logRange_0, 0.0, 1.0);\n }\n float range_0 = domainMax_0 - domainMin_0;\n if(range_0 <= 0.0)\n {\n\n return 0.0;\n }\n\n return clamp((score_0 - domainMin_0) / range_0, 0.0, 1.0);\n}\n\n\nfloat normalizeDepthScalar_0(float rawDepth_0, float domainMin_1, float domainMax_1, int scaleType_1, float symlogConstant_1)\n{\n\n return normalizeScore_0(rawDepth_0, domainMin_1, domainMax_1, scaleType_1, symlogConstant_1);\n}\n\n\nfloat covNormalizeDepth_0(float relDepth_0, CoverageBandUniforms_0 u_3)\n{\n return normalizeDepthScalar_0(relDepth_0 * u_3.regionMaxDepth_0, u_3.depthDomainMin_0, u_3.depthDomainMax_0, u_3.coverageScaleType_0, u_3.coverageSymlogConstant_0);\n}\n\n\nfloat covEffectiveHeightPx_0(float covHeight_2, float covYOffset_2)\n{\n\n return max(covHeight_2 - 2.0 * covYOffset_2, 0.0);\n}\n\n\nfloat covEffHeight_0(CoverageBandUniforms_0 u_4)\n{\n\n return covEffectiveHeightPx_0(u_4.covHeight_0, u_4.covYOffset_0);\n}\n\n\nfloat covBarHeightPx_0(float depthFraction_0, float effectiveHeightPx_0)\n{\n\n return depthFraction_0 * effectiveHeightPx_0;\n}\n\n\nfloat covSegBottomPx_0(float baselinePx_0, float yOffset_0, float barHeightPx_0)\n{\n return baselinePx_0 - yOffset_0 * barHeightPx_0;\n}\n\n\nfloat yPxToClipY_0(float yPx_0, float canvasHeight_0)\n{\n\n return 1.0 - yPx_0 / canvasHeight_0 * 2.0;\n}\n\n\nfloat covSegTopPx_0(float baselinePx_1, float yOffset_1, float segHeight_0, float barHeightPx_1)\n{\n return covSegBottomPx_0(baselinePx_1, yOffset_1, barHeightPx_1) - segHeight_0 * barHeightPx_1;\n}\n\n\nfloat covFlipX_0(float x_1, CoverageBandUniforms_0 u_5)\n{\n\n return mix(x_1, - x_1, u_5.reversed_0);\n}\n\n\nvec4 covFlippedQuad_0(float x0_0, float x1_3, float yBot_0, float yTop_0, vec2 local_0, CoverageBandUniforms_0 u_6)\n{\n return vec4(covFlipX_0(mix(x0_0, x1_3, local_0.x), u_6), mix(yBot_0, yTop_0, local_0.y), 0.0, 1.0);\n}\n\n\nvec4 covSegQuad_0(uint position_0, uint widthBp_0, float yOffset_2, float segHeight_1, float relDepth_1, vec2 local_1, CoverageBandUniforms_0 u_7)\n{\n\n vec2 xx_0 = covExpandMinWidthX_0(covBpToClipX_0(position_0, u_7), covBpToClipX_0(position_0 + widthBp_0, u_7), u_7.canvasW_0);\n\n float basePx_0 = covBaselinePx_0(u_7);\n float barPx_0 = covBarHeightPx_0(covNormalizeDepth_0(relDepth_1, u_7), covEffHeight_0(u_7));\n return covFlippedQuad_0(xx_0.x, xx_0.y, yPxToClipY_0(covSegBottomPx_0(basePx_0, yOffset_2, barPx_0), u_7.canvasH_0), yPxToClipY_0(covSegTopPx_0(basePx_0, yOffset_2, segHeight_1, barPx_0), u_7.canvasH_0), local_1, u_7);\n}\n\n\nvec4 unpackRGBA_0(uint c_1)\n{\n\n return vec4(float((c_1 >> 0U) & 255U), float((c_1 >> 8U) & 255U), float((c_1 >> 16U) & 255U), float((c_1 >> 24U) & 255U)) / 255.0;\n}\n\n\nout vec4 v_color;\n\n\nlayout(location = 0)\nin uint a_position;\n\n\nlayout(location = 1)\nin float a_relDepth;\n\n\nstruct CoverageVsOut_0\n{\n vec4 position_1;\n vec4 color_0;\n};\n\n\nvoid main()\n{\n\n CoverageVsOut_0 o_0;\n\n CoverageBandUniforms_0 _S7 = CoverageBandUniforms_0(u_0.bpHi_0, u_0.bpLo_0, u_0.bpLen_0, u_0.hpZero_0, u_0.canvasW_0, u_0.canvasH_0, u_0.covHeight_0, u_0.covYOffset_0, u_0.covTop_0, u_0.regionMaxDepth_0, u_0.depthDomainMax_0, u_0.depthDomainMin_0, u_0.coverageSymlogConstant_0, u_0.binSize_0, u_0.interbaseHeight_0, u_0.snpMinFreq_0, u_0.reversed_0, u_0.coverageScaleType_0, u_0.colorCoverage_0, u_0.colorBaseA_0, u_0.colorBaseC_0, u_0.colorBaseG_0, u_0.colorBaseT_0, u_0.colorBaseN_0, u_0.colorInsertionIndicator_0, u_0.colorSoftclipIndicator_0, u_0.colorHardclipIndicator_0);\n\n o_0.position_1 = covSegQuad_0(a_position, uint(u_0.binSize_0), 0.0, 1.0, a_relDepth, quadLocal_0(uint(gl_VertexID)), _S7);\n\n o_0.color_0 = vec4(unpackRGBA_0(u_0.colorCoverage_0).xyz, 1.0);\n CoverageVsOut_0 _S8 = o_0;\n\n gl_Position = o_0.position_1;\n\n v_color = _S8.color_0;\n\n return;\n}\n\n"
7
7
 
8
8
  export const GLSL_FRAGMENT = "#version 300 es\nprecision highp float;\nprecision highp int;\nlayout(location = 0)\nout vec4 entryPointParam_fs_main_0;\n\n\nin vec4 v_color;\n\n\nvoid main()\n{\n\n entryPointParam_fs_main_0 = v_color;\n\n return;\n}\n\n"
9
9
 
@@ -4,6 +4,15 @@
4
4
  // coverageBand.slang.
5
5
  //! targets: wgsl, glsl
6
6
  //! layout-out: packages/alignments-core/src/coverageLayout.generated.ts
7
+ // hpmath's midpoint min-width rule, lifted from the pass that draws through it
8
+ // (covSegQuad -> covExpandMinWidthX). It is authored in a module whose own
9
+ // js-export-out redirect is spoken for, and its twin is wanted in
10
+ // @jbrowse/alignments-core, which cannot import render-core — the case adr-051
11
+ // keeps "a shader may export a function it only imports" for. Consumer:
12
+ // `fillSpanRect`, the one Canvas2D spelling the band and the pileup's span
13
+ // marks share.
14
+ //! js-export: expandToMinWidthPx
15
+ //! js-export-out: packages/alignments-core/src/spanMinWidth.generated.ts
7
16
 
8
17
  import coverageBand;
9
18
  import colorPack;
@@ -1,9 +1,9 @@
1
1
  // AUTO-GENERATED by packages/shader-tools/src/shader-codegen from coverageMod.slang.
2
2
  // Do not edit. Run `pnpm gen:shaders` to regenerate.
3
3
 
4
- export const WGSL_SOURCE = "struct CoverageBandUniforms_std140_0\n{\n @align(16) bpHi_0 : f32,\n @align(4) bpLo_0 : f32,\n @align(8) bpLen_0 : f32,\n @align(4) hpZero_0 : f32,\n @align(16) canvasW_0 : f32,\n @align(4) canvasH_0 : f32,\n @align(8) covHeight_0 : f32,\n @align(4) covYOffset_0 : f32,\n @align(16) covTop_0 : f32,\n @align(4) regionMaxDepth_0 : f32,\n @align(8) depthDomainMax_0 : f32,\n @align(4) depthDomainMin_0 : f32,\n @align(16) coverageSymlogConstant_0 : f32,\n @align(4) binSize_0 : f32,\n @align(8) interbaseHeight_0 : f32,\n @align(4) snpMinFreq_0 : f32,\n @align(16) reversed_0 : f32,\n @align(4) coverageScaleType_0 : i32,\n @align(8) colorCoverage_0 : u32,\n @align(4) colorBaseA_0 : u32,\n @align(16) colorBaseC_0 : u32,\n @align(4) colorBaseG_0 : u32,\n @align(8) colorBaseT_0 : u32,\n @align(4) colorBaseN_0 : u32,\n @align(16) colorInsertionIndicator_0 : u32,\n @align(4) colorSoftclipIndicator_0 : u32,\n @align(8) colorHardclipIndicator_0 : u32,\n};\n\n@binding(1) @group(0) var<uniform> u_0 : CoverageBandUniforms_std140_0;\nfn quadLocal_0( vid_0 : u32) -> vec2<f32>\n{\n var v_0 : u32 = vid_0 % u32(6);\n var _S1 : bool = v_0 == u32(0);\n var _S2 : bool;\n if(_S1)\n {\n _S2 = true;\n }\n else\n {\n _S2 = v_0 == u32(2);\n }\n if(_S2)\n {\n _S2 = true;\n }\n else\n {\n _S2 = v_0 == u32(3);\n }\n var _S3 : f32;\n if(_S2)\n {\n _S3 = 0.0f;\n }\n else\n {\n _S3 = 1.0f;\n }\n if(_S1)\n {\n _S2 = true;\n }\n else\n {\n _S2 = v_0 == u32(1);\n }\n if(_S2)\n {\n _S2 = true;\n }\n else\n {\n _S2 = v_0 == u32(4);\n }\n var _S4 : f32;\n if(_S2)\n {\n _S4 = 0.0f;\n }\n else\n {\n _S4 = 1.0f;\n }\n return vec2<f32>(_S3, _S4);\n}\n\nfn hpSplitUint_0( value_0 : u32) -> vec2<f32>\n{\n var lo_0 : u32 = (value_0 & (u32(4095)));\n return vec2<f32>(f32(value_0 - lo_0), f32(lo_0));\n}\n\nfn hpToClipX_0( splitPos_0 : vec2<f32>, bpRange_0 : vec3<f32>, hpZero_1 : f32) -> f32\n{\n var step_0 : f32 = 2.0f / bpRange_0.z;\n var _S5 : f32 = - (1.0f / hpZero_1);\n return dot(vec3<f32>(-1.0f, max(splitPos_0.x - bpRange_0.x, _S5), max(splitPos_0.y - bpRange_0.y, _S5)), vec3<f32>(1.0f, step_0, step_0));\n}\n\nfn covBpToClipX_0( bp_0 : u32, u_1 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return hpToClipX_0(hpSplitUint_0(bp_0), vec3<f32>((*u_1).bpHi_0, (*u_1).bpLo_0, (*u_1).bpLen_0), (*u_1).hpZero_0);\n}\n\nfn expandToMinWidthPx_0( x1_0 : f32, x2_0 : f32, minWidth_0 : f32) -> vec2<f32>\n{\n if((x2_0 - x1_0) < minWidth_0)\n {\n var mid_0 : f32 = (x1_0 + x2_0) * 0.5f;\n var _S6 : f32 = minWidth_0 * 0.5f;\n return vec2<f32>(mid_0 - _S6, mid_0 + _S6);\n }\n return vec2<f32>(x1_0, x2_0);\n}\n\nfn expandToMinWidthX_0( x1_1 : f32, x2_1 : f32, minWidthPx_0 : f32, canvasWidth_0 : f32) -> vec2<f32>\n{\n return expandToMinWidthPx_0(x1_1, x2_1, minWidthPx_0 * 2.0f / canvasWidth_0);\n}\n\nfn covExpandMinWidthX_0( x1_2 : f32, x2_2 : f32, canvasWidth_1 : f32) -> vec2<f32>\n{\n return expandToMinWidthX_0(x1_2, x2_2, 1.0f, canvasWidth_1);\n}\n\nfn yPxToClipY_0( yPx_0 : f32, canvasHeight_0 : f32) -> f32\n{\n return 1.0f - yPx_0 / canvasHeight_0 * 2.0f;\n}\n\nfn covAreaTop_0( u_2 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return yPxToClipY_0((*u_2).covTop_0, (*u_2).canvasH_0);\n}\n\nfn covBottomOffsetPx_0( covHeight_1 : f32, covYOffset_1 : f32) -> f32\n{\n return covHeight_1 - covYOffset_1;\n}\n\nfn covBottom_0( u_3 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n var _S7 : f32 = covAreaTop_0(&((*u_3)));\n return _S7 - covBottomOffsetPx_0((*u_3).covHeight_0, (*u_3).covYOffset_0) / (*u_3).canvasH_0 * 2.0f;\n}\n\nfn symlogTransform_0( x_0 : f32, c_0 : f32) -> f32\n{\n return f32((i32(sign((x_0))))) * log(1.0f + abs(x_0 / c_0));\n}\n\nfn normalizeScore_0( score_0 : f32, domainMin_0 : f32, domainMax_0 : f32, scaleType_0 : i32, symlogConstant_0 : f32) -> f32\n{\n if(scaleType_0 == i32(2))\n {\n var tMin_0 : f32 = symlogTransform_0(domainMin_0, symlogConstant_0);\n var tRange_0 : f32 = symlogTransform_0(domainMax_0, symlogConstant_0) - tMin_0;\n if(tRange_0 <= 0.0f)\n {\n return 0.0f;\n }\n return clamp((symlogTransform_0(score_0, symlogConstant_0) - tMin_0) / tRange_0, 0.0f, 1.0f);\n }\n if(scaleType_0 == i32(1))\n {\n var floorV_0 : f32;\n if(domainMin_0 > 0.0f)\n {\n floorV_0 = domainMin_0;\n }\n else\n {\n floorV_0 = 1.0f;\n }\n var logMin_0 : f32 = log2(floorV_0);\n var logRange_0 : f32 = log2(max(domainMax_0, floorV_0)) - logMin_0;\n if(logRange_0 <= 0.0f)\n {\n return 0.0f;\n }\n return clamp((log2(max(score_0, floorV_0)) - logMin_0) / logRange_0, 0.0f, 1.0f);\n }\n var range_0 : f32 = domainMax_0 - domainMin_0;\n if(range_0 <= 0.0f)\n {\n return 0.0f;\n }\n return clamp((score_0 - domainMin_0) / range_0, 0.0f, 1.0f);\n}\n\nfn normalizeDepthScalar_0( rawDepth_0 : f32, domainMin_1 : f32, domainMax_1 : f32, scaleType_1 : i32, symlogConstant_1 : f32) -> f32\n{\n return normalizeScore_0(rawDepth_0, domainMin_1, domainMax_1, scaleType_1, symlogConstant_1);\n}\n\nfn covNormalizeDepth_0( relDepth_0 : f32, u_4 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return normalizeDepthScalar_0(relDepth_0 * (*u_4).regionMaxDepth_0, (*u_4).depthDomainMin_0, (*u_4).depthDomainMax_0, (*u_4).coverageScaleType_0, (*u_4).coverageSymlogConstant_0);\n}\n\nfn covEffectiveHeightPx_0( covHeight_2 : f32, covYOffset_2 : f32) -> f32\n{\n return max(covHeight_2 - 2.0f * covYOffset_2, 0.0f);\n}\n\nfn covEffHeight_0( u_5 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return covEffectiveHeightPx_0((*u_5).covHeight_0, (*u_5).covYOffset_0);\n}\n\nfn covBarScale_0( relDepth_1 : f32, u_6 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n var _S8 : f32 = covNormalizeDepth_0(relDepth_1, &((*u_6)));\n var _S9 : f32 = covEffHeight_0(&((*u_6)));\n return _S8 * _S9 / (*u_6).canvasH_0 * 2.0f;\n}\n\nfn covFlipX_0( x_1 : f32, u_7 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return mix(x_1, - x_1, (*u_7).reversed_0);\n}\n\nfn covFlippedQuad_0( x0_0 : f32, x1_3 : f32, yBot_0 : f32, yTop_0 : f32, local_0 : vec2<f32>, u_8 : ptr<function, CoverageBandUniforms_std140_0>) -> vec4<f32>\n{\n var _S10 : f32 = covFlipX_0(mix(x0_0, x1_3, local_0.x), &((*u_8)));\n return vec4<f32>(_S10, mix(yBot_0, yTop_0, local_0.y), 0.0f, 1.0f);\n}\n\nfn covSegQuad_0( position_0 : u32, widthBp_0 : u32, yOffset_0 : f32, segHeight_0 : f32, relDepth_2 : f32, local_1 : vec2<f32>, u_9 : ptr<function, CoverageBandUniforms_std140_0>) -> vec4<f32>\n{\n var _S11 : f32 = covBpToClipX_0(position_0, &((*u_9)));\n var _S12 : f32 = covBpToClipX_0(position_0 + widthBp_0, &((*u_9)));\n var xx_0 : vec2<f32> = covExpandMinWidthX_0(_S11, _S12, (*u_9).canvasW_0);\n var _S13 : f32 = covBottom_0(&((*u_9)));\n var _S14 : f32 = covBarScale_0(relDepth_2, &((*u_9)));\n var segBot_0 : f32 = _S13 + yOffset_0 * _S14;\n var _S15 : vec4<f32> = covFlippedQuad_0(xx_0.x, xx_0.y, segBot_0, segBot_0 + segHeight_0 * _S14, local_1, &((*u_9)));\n return _S15;\n}\n\nfn unpackRGBA_0( c_1 : u32) -> vec4<f32>\n{\n return vec4<f32>(f32((((c_1 >> (u32(0)))) & (u32(255)))), f32((((c_1 >> (u32(8)))) & (u32(255)))), f32((((c_1 >> (u32(16)))) & (u32(255)))), f32((((c_1 >> (u32(24)))) & (u32(255))))) / vec4<f32>(255.0f);\n}\n\nstruct CoverageVsOut_0\n{\n @builtin(position) position_1 : vec4<f32>,\n @location(0) color_0 : vec4<f32>,\n};\n\nstruct vertexInput_0\n{\n @location(0) position_2 : u32,\n @location(1) yOffset_1 : f32,\n @location(2) segHeight_1 : f32,\n @location(3) packedColor_0 : u32,\n @location(4) relDepth_3 : f32,\n};\n\n@vertex\nfn vs_main( _S16 : vertexInput_0, @builtin(vertex_index) vid_1 : u32) -> CoverageVsOut_0\n{\n var o_0 : CoverageVsOut_0;\n var _S17 : vec2<f32> = quadLocal_0(vid_1);\n var _S18 : CoverageBandUniforms_std140_0 = u_0;\n var _S19 : vec4<f32> = covSegQuad_0(_S16.position_2, u32(1), _S16.yOffset_1, _S16.segHeight_1, _S16.relDepth_3, _S17, &(_S18));\n o_0.position_1 = _S19;\n o_0.color_0 = unpackRGBA_0(_S16.packedColor_0);\n return o_0;\n}\n\nstruct pixelOutput_0\n{\n @location(0) output_0 : vec4<f32>,\n};\n\nstruct pixelInput_0\n{\n @location(0) color_1 : vec4<f32>,\n};\n\n@fragment\nfn fs_main( _S20 : pixelInput_0, @builtin(position) position_3 : vec4<f32>) -> pixelOutput_0\n{\n var _S21 : pixelOutput_0 = pixelOutput_0( _S20.color_1 );\n return _S21;\n}\n\n"
4
+ export const WGSL_SOURCE = "struct CoverageBandUniforms_std140_0\n{\n @align(16) bpHi_0 : f32,\n @align(4) bpLo_0 : f32,\n @align(8) bpLen_0 : f32,\n @align(4) hpZero_0 : f32,\n @align(16) canvasW_0 : f32,\n @align(4) canvasH_0 : f32,\n @align(8) covHeight_0 : f32,\n @align(4) covYOffset_0 : f32,\n @align(16) covTop_0 : f32,\n @align(4) regionMaxDepth_0 : f32,\n @align(8) depthDomainMax_0 : f32,\n @align(4) depthDomainMin_0 : f32,\n @align(16) coverageSymlogConstant_0 : f32,\n @align(4) binSize_0 : f32,\n @align(8) interbaseHeight_0 : f32,\n @align(4) snpMinFreq_0 : f32,\n @align(16) reversed_0 : f32,\n @align(4) coverageScaleType_0 : i32,\n @align(8) colorCoverage_0 : u32,\n @align(4) colorBaseA_0 : u32,\n @align(16) colorBaseC_0 : u32,\n @align(4) colorBaseG_0 : u32,\n @align(8) colorBaseT_0 : u32,\n @align(4) colorBaseN_0 : u32,\n @align(16) colorInsertionIndicator_0 : u32,\n @align(4) colorSoftclipIndicator_0 : u32,\n @align(8) colorHardclipIndicator_0 : u32,\n};\n\n@binding(1) @group(0) var<uniform> u_0 : CoverageBandUniforms_std140_0;\nfn quadLocal_0( vid_0 : u32) -> vec2<f32>\n{\n var v_0 : u32 = vid_0 % u32(6);\n var _S1 : bool = v_0 == u32(0);\n var _S2 : bool;\n if(_S1)\n {\n _S2 = true;\n }\n else\n {\n _S2 = v_0 == u32(2);\n }\n if(_S2)\n {\n _S2 = true;\n }\n else\n {\n _S2 = v_0 == u32(3);\n }\n var _S3 : f32;\n if(_S2)\n {\n _S3 = 0.0f;\n }\n else\n {\n _S3 = 1.0f;\n }\n if(_S1)\n {\n _S2 = true;\n }\n else\n {\n _S2 = v_0 == u32(1);\n }\n if(_S2)\n {\n _S2 = true;\n }\n else\n {\n _S2 = v_0 == u32(4);\n }\n var _S4 : f32;\n if(_S2)\n {\n _S4 = 0.0f;\n }\n else\n {\n _S4 = 1.0f;\n }\n return vec2<f32>(_S3, _S4);\n}\n\nfn hpSplitUint_0( value_0 : u32) -> vec2<f32>\n{\n var lo_0 : u32 = (value_0 & (u32(4095)));\n return vec2<f32>(f32(value_0 - lo_0), f32(lo_0));\n}\n\nfn hpToClipX_0( splitPos_0 : vec2<f32>, bpRange_0 : vec3<f32>, hpZero_1 : f32) -> f32\n{\n var step_0 : f32 = 2.0f / bpRange_0.z;\n var _S5 : f32 = - (1.0f / hpZero_1);\n return dot(vec3<f32>(-1.0f, max(splitPos_0.x - bpRange_0.x, _S5), max(splitPos_0.y - bpRange_0.y, _S5)), vec3<f32>(1.0f, step_0, step_0));\n}\n\nfn covBpToClipX_0( bp_0 : u32, u_1 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return hpToClipX_0(hpSplitUint_0(bp_0), vec3<f32>((*u_1).bpHi_0, (*u_1).bpLo_0, (*u_1).bpLen_0), (*u_1).hpZero_0);\n}\n\nfn expandToMinWidthPx_0( x1_0 : f32, x2_0 : f32, minWidth_0 : f32) -> vec2<f32>\n{\n if((x2_0 - x1_0) < minWidth_0)\n {\n var mid_0 : f32 = (x1_0 + x2_0) * 0.5f;\n var _S6 : f32 = minWidth_0 * 0.5f;\n return vec2<f32>(mid_0 - _S6, mid_0 + _S6);\n }\n return vec2<f32>(x1_0, x2_0);\n}\n\nfn expandToMinWidthX_0( x1_1 : f32, x2_1 : f32, minWidthPx_0 : f32, canvasWidth_0 : f32) -> vec2<f32>\n{\n return expandToMinWidthPx_0(x1_1, x2_1, minWidthPx_0 * 2.0f / canvasWidth_0);\n}\n\nfn covExpandMinWidthX_0( x1_2 : f32, x2_2 : f32, canvasWidth_1 : f32) -> vec2<f32>\n{\n return expandToMinWidthX_0(x1_2, x2_2, 1.0f, canvasWidth_1);\n}\n\nfn covBottomOffsetPx_0( covHeight_1 : f32, covYOffset_1 : f32) -> f32\n{\n return covHeight_1 - covYOffset_1;\n}\n\nfn covBaselinePx_0( u_2 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return (*u_2).covTop_0 + covBottomOffsetPx_0((*u_2).covHeight_0, (*u_2).covYOffset_0);\n}\n\nfn symlogTransform_0( x_0 : f32, c_0 : f32) -> f32\n{\n return f32((i32(sign((x_0))))) * log(1.0f + abs(x_0 / c_0));\n}\n\nfn normalizeScore_0( score_0 : f32, domainMin_0 : f32, domainMax_0 : f32, scaleType_0 : i32, symlogConstant_0 : f32) -> f32\n{\n if(scaleType_0 == i32(2))\n {\n var tMin_0 : f32 = symlogTransform_0(domainMin_0, symlogConstant_0);\n var tRange_0 : f32 = symlogTransform_0(domainMax_0, symlogConstant_0) - tMin_0;\n if(tRange_0 <= 0.0f)\n {\n return 0.0f;\n }\n return clamp((symlogTransform_0(score_0, symlogConstant_0) - tMin_0) / tRange_0, 0.0f, 1.0f);\n }\n if(scaleType_0 == i32(1))\n {\n var floorV_0 : f32;\n if(domainMin_0 > 0.0f)\n {\n floorV_0 = domainMin_0;\n }\n else\n {\n floorV_0 = 1.0f;\n }\n var logMin_0 : f32 = log2(floorV_0);\n var logRange_0 : f32 = log2(max(domainMax_0, floorV_0)) - logMin_0;\n if(logRange_0 <= 0.0f)\n {\n return 0.0f;\n }\n return clamp((log2(max(score_0, floorV_0)) - logMin_0) / logRange_0, 0.0f, 1.0f);\n }\n var range_0 : f32 = domainMax_0 - domainMin_0;\n if(range_0 <= 0.0f)\n {\n return 0.0f;\n }\n return clamp((score_0 - domainMin_0) / range_0, 0.0f, 1.0f);\n}\n\nfn normalizeDepthScalar_0( rawDepth_0 : f32, domainMin_1 : f32, domainMax_1 : f32, scaleType_1 : i32, symlogConstant_1 : f32) -> f32\n{\n return normalizeScore_0(rawDepth_0, domainMin_1, domainMax_1, scaleType_1, symlogConstant_1);\n}\n\nfn covNormalizeDepth_0( relDepth_0 : f32, u_3 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return normalizeDepthScalar_0(relDepth_0 * (*u_3).regionMaxDepth_0, (*u_3).depthDomainMin_0, (*u_3).depthDomainMax_0, (*u_3).coverageScaleType_0, (*u_3).coverageSymlogConstant_0);\n}\n\nfn covEffectiveHeightPx_0( covHeight_2 : f32, covYOffset_2 : f32) -> f32\n{\n return max(covHeight_2 - 2.0f * covYOffset_2, 0.0f);\n}\n\nfn covEffHeight_0( u_4 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return covEffectiveHeightPx_0((*u_4).covHeight_0, (*u_4).covYOffset_0);\n}\n\nfn covBarHeightPx_0( depthFraction_0 : f32, effectiveHeightPx_0 : f32) -> f32\n{\n return depthFraction_0 * effectiveHeightPx_0;\n}\n\nfn covSegBottomPx_0( baselinePx_0 : f32, yOffset_0 : f32, barHeightPx_0 : f32) -> f32\n{\n return baselinePx_0 - yOffset_0 * barHeightPx_0;\n}\n\nfn yPxToClipY_0( yPx_0 : f32, canvasHeight_0 : f32) -> f32\n{\n return 1.0f - yPx_0 / canvasHeight_0 * 2.0f;\n}\n\nfn covSegTopPx_0( baselinePx_1 : f32, yOffset_1 : f32, segHeight_0 : f32, barHeightPx_1 : f32) -> f32\n{\n return covSegBottomPx_0(baselinePx_1, yOffset_1, barHeightPx_1) - segHeight_0 * barHeightPx_1;\n}\n\nfn covFlipX_0( x_1 : f32, u_5 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return mix(x_1, - x_1, (*u_5).reversed_0);\n}\n\nfn covFlippedQuad_0( x0_0 : f32, x1_3 : f32, yBot_0 : f32, yTop_0 : f32, local_0 : vec2<f32>, u_6 : ptr<function, CoverageBandUniforms_std140_0>) -> vec4<f32>\n{\n var _S7 : f32 = covFlipX_0(mix(x0_0, x1_3, local_0.x), &((*u_6)));\n return vec4<f32>(_S7, mix(yBot_0, yTop_0, local_0.y), 0.0f, 1.0f);\n}\n\nfn covSegQuad_0( position_0 : u32, widthBp_0 : u32, yOffset_2 : f32, segHeight_1 : f32, relDepth_1 : f32, local_1 : vec2<f32>, u_7 : ptr<function, CoverageBandUniforms_std140_0>) -> vec4<f32>\n{\n var _S8 : f32 = covBpToClipX_0(position_0, &((*u_7)));\n var _S9 : f32 = covBpToClipX_0(position_0 + widthBp_0, &((*u_7)));\n var xx_0 : vec2<f32> = covExpandMinWidthX_0(_S8, _S9, (*u_7).canvasW_0);\n var _S10 : f32 = covBaselinePx_0(&((*u_7)));\n var _S11 : f32 = covNormalizeDepth_0(relDepth_1, &((*u_7)));\n var _S12 : f32 = covEffHeight_0(&((*u_7)));\n var barPx_0 : f32 = covBarHeightPx_0(_S11, _S12);\n var _S13 : vec4<f32> = covFlippedQuad_0(xx_0.x, xx_0.y, yPxToClipY_0(covSegBottomPx_0(_S10, yOffset_2, barPx_0), (*u_7).canvasH_0), yPxToClipY_0(covSegTopPx_0(_S10, yOffset_2, segHeight_1, barPx_0), (*u_7).canvasH_0), local_1, &((*u_7)));\n return _S13;\n}\n\nfn unpackRGBA_0( c_1 : u32) -> vec4<f32>\n{\n return vec4<f32>(f32((((c_1 >> (u32(0)))) & (u32(255)))), f32((((c_1 >> (u32(8)))) & (u32(255)))), f32((((c_1 >> (u32(16)))) & (u32(255)))), f32((((c_1 >> (u32(24)))) & (u32(255))))) / vec4<f32>(255.0f);\n}\n\nstruct CoverageVsOut_0\n{\n @builtin(position) position_1 : vec4<f32>,\n @location(0) color_0 : vec4<f32>,\n};\n\nstruct vertexInput_0\n{\n @location(0) position_2 : u32,\n @location(1) yOffset_3 : f32,\n @location(2) segHeight_2 : f32,\n @location(3) packedColor_0 : u32,\n @location(4) relDepth_2 : f32,\n};\n\n@vertex\nfn vs_main( _S14 : vertexInput_0, @builtin(vertex_index) vid_1 : u32) -> CoverageVsOut_0\n{\n var o_0 : CoverageVsOut_0;\n var _S15 : vec2<f32> = quadLocal_0(vid_1);\n var _S16 : CoverageBandUniforms_std140_0 = u_0;\n var _S17 : vec4<f32> = covSegQuad_0(_S14.position_2, u32(1), _S14.yOffset_3, _S14.segHeight_2, _S14.relDepth_2, _S15, &(_S16));\n o_0.position_1 = _S17;\n o_0.color_0 = unpackRGBA_0(_S14.packedColor_0);\n return o_0;\n}\n\nstruct pixelOutput_0\n{\n @location(0) output_0 : vec4<f32>,\n};\n\nstruct pixelInput_0\n{\n @location(0) color_1 : vec4<f32>,\n};\n\n@fragment\nfn fs_main( _S18 : pixelInput_0, @builtin(position) position_3 : vec4<f32>) -> pixelOutput_0\n{\n var _S19 : pixelOutput_0 = pixelOutput_0( _S18.color_1 );\n return _S19;\n}\n\n"
5
5
 
6
- export const GLSL_VERTEX = "#version 300 es\nprecision highp float;\nprecision highp int;\nstruct CoverageBandUniforms_0\n{\n float bpHi_0;\n float bpLo_0;\n float bpLen_0;\n float hpZero_0;\n float canvasW_0;\n float canvasH_0;\n float covHeight_0;\n float covYOffset_0;\n float covTop_0;\n float regionMaxDepth_0;\n float depthDomainMax_0;\n float depthDomainMin_0;\n float coverageSymlogConstant_0;\n float binSize_0;\n float interbaseHeight_0;\n float snpMinFreq_0;\n float reversed_0;\n int coverageScaleType_0;\n uint colorCoverage_0;\n uint colorBaseA_0;\n uint colorBaseC_0;\n uint colorBaseG_0;\n uint colorBaseT_0;\n uint colorBaseN_0;\n uint colorInsertionIndicator_0;\n uint colorSoftclipIndicator_0;\n uint colorHardclipIndicator_0;\n};\n\n\nlayout(std140) uniform Uniforms\n{\n float bpHi_0;\n float bpLo_0;\n float bpLen_0;\n float hpZero_0;\n float canvasW_0;\n float canvasH_0;\n float covHeight_0;\n float covYOffset_0;\n float covTop_0;\n float regionMaxDepth_0;\n float depthDomainMax_0;\n float depthDomainMin_0;\n float coverageSymlogConstant_0;\n float binSize_0;\n float interbaseHeight_0;\n float snpMinFreq_0;\n float reversed_0;\n int coverageScaleType_0;\n uint colorCoverage_0;\n uint colorBaseA_0;\n uint colorBaseC_0;\n uint colorBaseG_0;\n uint colorBaseT_0;\n uint colorBaseN_0;\n uint colorInsertionIndicator_0;\n uint colorSoftclipIndicator_0;\n uint colorHardclipIndicator_0;\n}u_0;\n\nvec2 quadLocal_0(uint vid_0)\n{\n\n uint v_0 = vid_0 % 6U;\n\n bool _S1 = v_0 == 0U;\n\n bool _S2;\n\n if(_S1)\n {\n\n _S2 = true;\n\n }\n else\n {\n\n _S2 = v_0 == 2U;\n\n }\n\n if(_S2)\n {\n\n _S2 = true;\n\n }\n else\n {\n\n _S2 = v_0 == 3U;\n\n }\n\n float _S3;\n\n if(_S2)\n {\n\n _S3 = 0.0;\n\n }\n else\n {\n\n _S3 = 1.0;\n\n }\n if(_S1)\n {\n\n _S2 = true;\n\n }\n else\n {\n\n _S2 = v_0 == 1U;\n\n }\n\n if(_S2)\n {\n\n _S2 = true;\n\n }\n else\n {\n\n _S2 = v_0 == 4U;\n\n }\n\n float _S4;\n\n if(_S2)\n {\n\n _S4 = 0.0;\n\n }\n else\n {\n\n _S4 = 1.0;\n\n }\n\n return vec2(_S3, _S4);\n}\n\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 hpToClipX_0(vec2 splitPos_0, vec3 bpRange_0, float hpZero_1)\n{\n float step_0 = 2.0 / bpRange_0.z;\n float _S5 = - (1.0 / hpZero_1);\n\n return dot(vec3(-1.0, max(splitPos_0.x - bpRange_0.x, _S5), max(splitPos_0.y - bpRange_0.y, _S5)), vec3(1.0, step_0, step_0));\n}\n\n\nfloat covBpToClipX_0(uint bp_0, CoverageBandUniforms_0 u_1)\n{\n\n return hpToClipX_0(hpSplitUint_0(bp_0), vec3(u_1.bpHi_0, u_1.bpLo_0, u_1.bpLen_0), u_1.hpZero_0);\n}\n\n\nvec2 expandToMinWidthPx_0(float x1_0, float x2_0, float minWidth_0)\n{\n\n if((x2_0 - x1_0) < minWidth_0)\n {\n\n float mid_0 = (x1_0 + x2_0) * 0.5;\n float _S6 = minWidth_0 * 0.5;\n\n return vec2(mid_0 - _S6, mid_0 + _S6);\n }\n return vec2(x1_0, x2_0);\n}\n\nvec2 expandToMinWidthX_0(float x1_1, float x2_1, float minWidthPx_0, float canvasWidth_0)\n{\n\n return expandToMinWidthPx_0(x1_1, x2_1, minWidthPx_0 * 2.0 / canvasWidth_0);\n}\n\n\nvec2 covExpandMinWidthX_0(float x1_2, float x2_2, float canvasWidth_1)\n{\n\n return expandToMinWidthX_0(x1_2, x2_2, 1.0, canvasWidth_1);\n}\n\n\nfloat yPxToClipY_0(float yPx_0, float canvasHeight_0)\n{\n\n return 1.0 - yPx_0 / canvasHeight_0 * 2.0;\n}\n\n\nfloat covAreaTop_0(CoverageBandUniforms_0 u_2)\n{\n\n return yPxToClipY_0(u_2.covTop_0, u_2.canvasH_0);\n}\n\n\nfloat covBottomOffsetPx_0(float covHeight_1, float covYOffset_1)\n{\n\n return covHeight_1 - covYOffset_1;\n}\n\n\nfloat covBottom_0(CoverageBandUniforms_0 u_3)\n{\n\n return covAreaTop_0(u_3) - covBottomOffsetPx_0(u_3.covHeight_0, u_3.covYOffset_0) / u_3.canvasH_0 * 2.0;\n}\n\n\nfloat symlogTransform_0(float x_0, float c_0)\n{\n\n return float((int(sign((x_0))))) * log(1.0 + abs(x_0 / c_0));\n}\n\nfloat normalizeScore_0(float score_0, float domainMin_0, float domainMax_0, int scaleType_0, float symlogConstant_0)\n{\n\n if(scaleType_0 == 2)\n {\n\n float tMin_0 = symlogTransform_0(domainMin_0, symlogConstant_0);\n\n float tRange_0 = symlogTransform_0(domainMax_0, symlogConstant_0) - tMin_0;\n if(tRange_0 <= 0.0)\n {\n\n return 0.0;\n }\n return clamp((symlogTransform_0(score_0, symlogConstant_0) - tMin_0) / tRange_0, 0.0, 1.0);\n }\n if(scaleType_0 == 1)\n {\n\n float floorV_0;\n\n if(domainMin_0 > 0.0)\n {\n\n floorV_0 = domainMin_0;\n\n }\n else\n {\n\n floorV_0 = 1.0;\n\n }\n float logMin_0 = log2(floorV_0);\n\n float logRange_0 = log2(max(domainMax_0, floorV_0)) - logMin_0;\n if(logRange_0 <= 0.0)\n {\n\n return 0.0;\n }\n return clamp((log2(max(score_0, floorV_0)) - logMin_0) / logRange_0, 0.0, 1.0);\n }\n float range_0 = domainMax_0 - domainMin_0;\n if(range_0 <= 0.0)\n {\n\n return 0.0;\n }\n\n return clamp((score_0 - domainMin_0) / range_0, 0.0, 1.0);\n}\n\n\nfloat normalizeDepthScalar_0(float rawDepth_0, float domainMin_1, float domainMax_1, int scaleType_1, float symlogConstant_1)\n{\n\n return normalizeScore_0(rawDepth_0, domainMin_1, domainMax_1, scaleType_1, symlogConstant_1);\n}\n\n\nfloat covNormalizeDepth_0(float relDepth_0, CoverageBandUniforms_0 u_4)\n{\n return normalizeDepthScalar_0(relDepth_0 * u_4.regionMaxDepth_0, u_4.depthDomainMin_0, u_4.depthDomainMax_0, u_4.coverageScaleType_0, u_4.coverageSymlogConstant_0);\n}\n\n\nfloat covEffectiveHeightPx_0(float covHeight_2, float covYOffset_2)\n{\n\n return max(covHeight_2 - 2.0 * covYOffset_2, 0.0);\n}\n\n\nfloat covEffHeight_0(CoverageBandUniforms_0 u_5)\n{\n\n return covEffectiveHeightPx_0(u_5.covHeight_0, u_5.covYOffset_0);\n}\n\n\nfloat covBarScale_0(float relDepth_1, CoverageBandUniforms_0 u_6)\n{\n\n return covNormalizeDepth_0(relDepth_1, u_6) * covEffHeight_0(u_6) / u_6.canvasH_0 * 2.0;\n}\n\n\nfloat covFlipX_0(float x_1, CoverageBandUniforms_0 u_7)\n{\n\n return mix(x_1, - x_1, u_7.reversed_0);\n}\n\n\nvec4 covFlippedQuad_0(float x0_0, float x1_3, float yBot_0, float yTop_0, vec2 local_0, CoverageBandUniforms_0 u_8)\n{\n return vec4(covFlipX_0(mix(x0_0, x1_3, local_0.x), u_8), mix(yBot_0, yTop_0, local_0.y), 0.0, 1.0);\n}\n\n\nvec4 covSegQuad_0(uint position_0, uint widthBp_0, float yOffset_0, float segHeight_0, float relDepth_2, vec2 local_1, CoverageBandUniforms_0 u_9)\n{\n\n vec2 xx_0 = covExpandMinWidthX_0(covBpToClipX_0(position_0, u_9), covBpToClipX_0(position_0 + widthBp_0, u_9), u_9.canvasW_0);\n\n\n float k_0 = covBarScale_0(relDepth_2, u_9);\n float segBot_0 = covBottom_0(u_9) + yOffset_0 * k_0;\n\n return covFlippedQuad_0(xx_0.x, xx_0.y, segBot_0, segBot_0 + segHeight_0 * k_0, local_1, u_9);\n}\n\n\nvec4 unpackRGBA_0(uint c_1)\n{\n\n return vec4(float((c_1 >> 0U) & 255U), float((c_1 >> 8U) & 255U), float((c_1 >> 16U) & 255U), float((c_1 >> 24U) & 255U)) / 255.0;\n}\n\n\nout vec4 v_color;\n\n\nlayout(location = 0)\nin uint a_position;\n\n\nlayout(location = 1)\nin float a_yOffset;\n\n\nlayout(location = 2)\nin float a_segHeight;\n\n\nlayout(location = 3)\nin uint a_packedColor;\n\n\nlayout(location = 4)\nin float a_relDepth;\n\n\nstruct CoverageVsOut_0\n{\n vec4 position_1;\n vec4 color_0;\n};\n\n\nvoid main()\n{\n\n CoverageVsOut_0 o_0;\n\n CoverageBandUniforms_0 _S7 = CoverageBandUniforms_0(u_0.bpHi_0, u_0.bpLo_0, u_0.bpLen_0, u_0.hpZero_0, u_0.canvasW_0, u_0.canvasH_0, u_0.covHeight_0, u_0.covYOffset_0, u_0.covTop_0, u_0.regionMaxDepth_0, u_0.depthDomainMax_0, u_0.depthDomainMin_0, u_0.coverageSymlogConstant_0, u_0.binSize_0, u_0.interbaseHeight_0, u_0.snpMinFreq_0, u_0.reversed_0, u_0.coverageScaleType_0, u_0.colorCoverage_0, u_0.colorBaseA_0, u_0.colorBaseC_0, u_0.colorBaseG_0, u_0.colorBaseT_0, u_0.colorBaseN_0, u_0.colorInsertionIndicator_0, u_0.colorSoftclipIndicator_0, u_0.colorHardclipIndicator_0);\n o_0.position_1 = covSegQuad_0(a_position, 1U, a_yOffset, a_segHeight, a_relDepth, quadLocal_0(uint(gl_VertexID)), _S7);\n\n o_0.color_0 = unpackRGBA_0(a_packedColor);\n CoverageVsOut_0 _S8 = o_0;\n\n gl_Position = o_0.position_1;\n\n v_color = _S8.color_0;\n\n return;\n}\n\n"
6
+ export const GLSL_VERTEX = "#version 300 es\nprecision highp float;\nprecision highp int;\nstruct CoverageBandUniforms_0\n{\n float bpHi_0;\n float bpLo_0;\n float bpLen_0;\n float hpZero_0;\n float canvasW_0;\n float canvasH_0;\n float covHeight_0;\n float covYOffset_0;\n float covTop_0;\n float regionMaxDepth_0;\n float depthDomainMax_0;\n float depthDomainMin_0;\n float coverageSymlogConstant_0;\n float binSize_0;\n float interbaseHeight_0;\n float snpMinFreq_0;\n float reversed_0;\n int coverageScaleType_0;\n uint colorCoverage_0;\n uint colorBaseA_0;\n uint colorBaseC_0;\n uint colorBaseG_0;\n uint colorBaseT_0;\n uint colorBaseN_0;\n uint colorInsertionIndicator_0;\n uint colorSoftclipIndicator_0;\n uint colorHardclipIndicator_0;\n};\n\n\nlayout(std140) uniform Uniforms\n{\n float bpHi_0;\n float bpLo_0;\n float bpLen_0;\n float hpZero_0;\n float canvasW_0;\n float canvasH_0;\n float covHeight_0;\n float covYOffset_0;\n float covTop_0;\n float regionMaxDepth_0;\n float depthDomainMax_0;\n float depthDomainMin_0;\n float coverageSymlogConstant_0;\n float binSize_0;\n float interbaseHeight_0;\n float snpMinFreq_0;\n float reversed_0;\n int coverageScaleType_0;\n uint colorCoverage_0;\n uint colorBaseA_0;\n uint colorBaseC_0;\n uint colorBaseG_0;\n uint colorBaseT_0;\n uint colorBaseN_0;\n uint colorInsertionIndicator_0;\n uint colorSoftclipIndicator_0;\n uint colorHardclipIndicator_0;\n}u_0;\n\nvec2 quadLocal_0(uint vid_0)\n{\n\n uint v_0 = vid_0 % 6U;\n\n bool _S1 = v_0 == 0U;\n\n bool _S2;\n\n if(_S1)\n {\n\n _S2 = true;\n\n }\n else\n {\n\n _S2 = v_0 == 2U;\n\n }\n\n if(_S2)\n {\n\n _S2 = true;\n\n }\n else\n {\n\n _S2 = v_0 == 3U;\n\n }\n\n float _S3;\n\n if(_S2)\n {\n\n _S3 = 0.0;\n\n }\n else\n {\n\n _S3 = 1.0;\n\n }\n if(_S1)\n {\n\n _S2 = true;\n\n }\n else\n {\n\n _S2 = v_0 == 1U;\n\n }\n\n if(_S2)\n {\n\n _S2 = true;\n\n }\n else\n {\n\n _S2 = v_0 == 4U;\n\n }\n\n float _S4;\n\n if(_S2)\n {\n\n _S4 = 0.0;\n\n }\n else\n {\n\n _S4 = 1.0;\n\n }\n\n return vec2(_S3, _S4);\n}\n\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 hpToClipX_0(vec2 splitPos_0, vec3 bpRange_0, float hpZero_1)\n{\n float step_0 = 2.0 / bpRange_0.z;\n float _S5 = - (1.0 / hpZero_1);\n\n return dot(vec3(-1.0, max(splitPos_0.x - bpRange_0.x, _S5), max(splitPos_0.y - bpRange_0.y, _S5)), vec3(1.0, step_0, step_0));\n}\n\n\nfloat covBpToClipX_0(uint bp_0, CoverageBandUniforms_0 u_1)\n{\n\n return hpToClipX_0(hpSplitUint_0(bp_0), vec3(u_1.bpHi_0, u_1.bpLo_0, u_1.bpLen_0), u_1.hpZero_0);\n}\n\n\nvec2 expandToMinWidthPx_0(float x1_0, float x2_0, float minWidth_0)\n{\n\n if((x2_0 - x1_0) < minWidth_0)\n {\n\n float mid_0 = (x1_0 + x2_0) * 0.5;\n float _S6 = minWidth_0 * 0.5;\n\n return vec2(mid_0 - _S6, mid_0 + _S6);\n }\n return vec2(x1_0, x2_0);\n}\n\nvec2 expandToMinWidthX_0(float x1_1, float x2_1, float minWidthPx_0, float canvasWidth_0)\n{\n\n return expandToMinWidthPx_0(x1_1, x2_1, minWidthPx_0 * 2.0 / canvasWidth_0);\n}\n\n\nvec2 covExpandMinWidthX_0(float x1_2, float x2_2, float canvasWidth_1)\n{\n\n return expandToMinWidthX_0(x1_2, x2_2, 1.0, canvasWidth_1);\n}\n\n\nfloat covBottomOffsetPx_0(float covHeight_1, float covYOffset_1)\n{\n\n return covHeight_1 - covYOffset_1;\n}\n\n\nfloat covBaselinePx_0(CoverageBandUniforms_0 u_2)\n{\n\n return u_2.covTop_0 + covBottomOffsetPx_0(u_2.covHeight_0, u_2.covYOffset_0);\n}\n\n\nfloat symlogTransform_0(float x_0, float c_0)\n{\n\n return float((int(sign((x_0))))) * log(1.0 + abs(x_0 / c_0));\n}\n\nfloat normalizeScore_0(float score_0, float domainMin_0, float domainMax_0, int scaleType_0, float symlogConstant_0)\n{\n\n if(scaleType_0 == 2)\n {\n\n float tMin_0 = symlogTransform_0(domainMin_0, symlogConstant_0);\n\n float tRange_0 = symlogTransform_0(domainMax_0, symlogConstant_0) - tMin_0;\n if(tRange_0 <= 0.0)\n {\n\n return 0.0;\n }\n return clamp((symlogTransform_0(score_0, symlogConstant_0) - tMin_0) / tRange_0, 0.0, 1.0);\n }\n if(scaleType_0 == 1)\n {\n\n float floorV_0;\n\n if(domainMin_0 > 0.0)\n {\n\n floorV_0 = domainMin_0;\n\n }\n else\n {\n\n floorV_0 = 1.0;\n\n }\n float logMin_0 = log2(floorV_0);\n\n float logRange_0 = log2(max(domainMax_0, floorV_0)) - logMin_0;\n if(logRange_0 <= 0.0)\n {\n\n return 0.0;\n }\n return clamp((log2(max(score_0, floorV_0)) - logMin_0) / logRange_0, 0.0, 1.0);\n }\n float range_0 = domainMax_0 - domainMin_0;\n if(range_0 <= 0.0)\n {\n\n return 0.0;\n }\n\n return clamp((score_0 - domainMin_0) / range_0, 0.0, 1.0);\n}\n\n\nfloat normalizeDepthScalar_0(float rawDepth_0, float domainMin_1, float domainMax_1, int scaleType_1, float symlogConstant_1)\n{\n\n return normalizeScore_0(rawDepth_0, domainMin_1, domainMax_1, scaleType_1, symlogConstant_1);\n}\n\n\nfloat covNormalizeDepth_0(float relDepth_0, CoverageBandUniforms_0 u_3)\n{\n return normalizeDepthScalar_0(relDepth_0 * u_3.regionMaxDepth_0, u_3.depthDomainMin_0, u_3.depthDomainMax_0, u_3.coverageScaleType_0, u_3.coverageSymlogConstant_0);\n}\n\n\nfloat covEffectiveHeightPx_0(float covHeight_2, float covYOffset_2)\n{\n\n return max(covHeight_2 - 2.0 * covYOffset_2, 0.0);\n}\n\n\nfloat covEffHeight_0(CoverageBandUniforms_0 u_4)\n{\n\n return covEffectiveHeightPx_0(u_4.covHeight_0, u_4.covYOffset_0);\n}\n\n\nfloat covBarHeightPx_0(float depthFraction_0, float effectiveHeightPx_0)\n{\n\n return depthFraction_0 * effectiveHeightPx_0;\n}\n\n\nfloat covSegBottomPx_0(float baselinePx_0, float yOffset_0, float barHeightPx_0)\n{\n return baselinePx_0 - yOffset_0 * barHeightPx_0;\n}\n\n\nfloat yPxToClipY_0(float yPx_0, float canvasHeight_0)\n{\n\n return 1.0 - yPx_0 / canvasHeight_0 * 2.0;\n}\n\n\nfloat covSegTopPx_0(float baselinePx_1, float yOffset_1, float segHeight_0, float barHeightPx_1)\n{\n return covSegBottomPx_0(baselinePx_1, yOffset_1, barHeightPx_1) - segHeight_0 * barHeightPx_1;\n}\n\n\nfloat covFlipX_0(float x_1, CoverageBandUniforms_0 u_5)\n{\n\n return mix(x_1, - x_1, u_5.reversed_0);\n}\n\n\nvec4 covFlippedQuad_0(float x0_0, float x1_3, float yBot_0, float yTop_0, vec2 local_0, CoverageBandUniforms_0 u_6)\n{\n return vec4(covFlipX_0(mix(x0_0, x1_3, local_0.x), u_6), mix(yBot_0, yTop_0, local_0.y), 0.0, 1.0);\n}\n\n\nvec4 covSegQuad_0(uint position_0, uint widthBp_0, float yOffset_2, float segHeight_1, float relDepth_1, vec2 local_1, CoverageBandUniforms_0 u_7)\n{\n\n vec2 xx_0 = covExpandMinWidthX_0(covBpToClipX_0(position_0, u_7), covBpToClipX_0(position_0 + widthBp_0, u_7), u_7.canvasW_0);\n\n float basePx_0 = covBaselinePx_0(u_7);\n float barPx_0 = covBarHeightPx_0(covNormalizeDepth_0(relDepth_1, u_7), covEffHeight_0(u_7));\n return covFlippedQuad_0(xx_0.x, xx_0.y, yPxToClipY_0(covSegBottomPx_0(basePx_0, yOffset_2, barPx_0), u_7.canvasH_0), yPxToClipY_0(covSegTopPx_0(basePx_0, yOffset_2, segHeight_1, barPx_0), u_7.canvasH_0), local_1, u_7);\n}\n\n\nvec4 unpackRGBA_0(uint c_1)\n{\n\n return vec4(float((c_1 >> 0U) & 255U), float((c_1 >> 8U) & 255U), float((c_1 >> 16U) & 255U), float((c_1 >> 24U) & 255U)) / 255.0;\n}\n\n\nout vec4 v_color;\n\n\nlayout(location = 0)\nin uint a_position;\n\n\nlayout(location = 1)\nin float a_yOffset;\n\n\nlayout(location = 2)\nin float a_segHeight;\n\n\nlayout(location = 3)\nin uint a_packedColor;\n\n\nlayout(location = 4)\nin float a_relDepth;\n\n\nstruct CoverageVsOut_0\n{\n vec4 position_1;\n vec4 color_0;\n};\n\n\nvoid main()\n{\n\n CoverageVsOut_0 o_0;\n\n CoverageBandUniforms_0 _S7 = CoverageBandUniforms_0(u_0.bpHi_0, u_0.bpLo_0, u_0.bpLen_0, u_0.hpZero_0, u_0.canvasW_0, u_0.canvasH_0, u_0.covHeight_0, u_0.covYOffset_0, u_0.covTop_0, u_0.regionMaxDepth_0, u_0.depthDomainMax_0, u_0.depthDomainMin_0, u_0.coverageSymlogConstant_0, u_0.binSize_0, u_0.interbaseHeight_0, u_0.snpMinFreq_0, u_0.reversed_0, u_0.coverageScaleType_0, u_0.colorCoverage_0, u_0.colorBaseA_0, u_0.colorBaseC_0, u_0.colorBaseG_0, u_0.colorBaseT_0, u_0.colorBaseN_0, u_0.colorInsertionIndicator_0, u_0.colorSoftclipIndicator_0, u_0.colorHardclipIndicator_0);\n o_0.position_1 = covSegQuad_0(a_position, 1U, a_yOffset, a_segHeight, a_relDepth, quadLocal_0(uint(gl_VertexID)), _S7);\n\n o_0.color_0 = unpackRGBA_0(a_packedColor);\n CoverageVsOut_0 _S8 = o_0;\n\n gl_Position = o_0.position_1;\n\n v_color = _S8.color_0;\n\n return;\n}\n\n"
7
7
 
8
8
  export const GLSL_FRAGMENT = "#version 300 es\nprecision highp float;\nprecision highp int;\nlayout(location = 0)\nout vec4 entryPointParam_fs_main_0;\n\n\nin vec4 v_color;\n\n\nvoid main()\n{\n\n entryPointParam_fs_main_0 = v_color;\n\n return;\n}\n\n"
9
9