@jbrowse/render-core 5.0.0-beta.1 → 5.0.0-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm/RenderCanvas.d.ts +2 -2
- package/esm/RenderLifecycleMixin.d.ts +52 -20
- package/esm/RenderLifecycleMixin.js +89 -23
- package/esm/canvas2dUtils.d.ts +90 -23
- package/esm/canvas2dUtils.js +119 -36
- package/esm/colorRampLut.d.ts +5 -5
- package/esm/colorRampLut.js +6 -6
- package/esm/computePipeline.d.ts +14 -0
- package/esm/computePipeline.js +62 -0
- package/esm/contractReports.d.ts +54 -0
- package/esm/contractReports.js +112 -0
- package/esm/coverageBand.d.ts +13 -8
- package/esm/coverageBand.js +15 -5
- package/esm/coverageBandBuffers.d.ts +2 -9
- package/esm/coverageBandBuffers.js +1 -13
- package/esm/createRenderingBackend.d.ts +14 -18
- package/esm/createRenderingBackend.js +4 -2
- package/esm/displayPhase.d.ts +83 -104
- package/esm/displayPhase.js +42 -82
- package/esm/encodeMemo.d.ts +14 -0
- package/esm/encodeMemo.js +48 -0
- package/esm/gpuContextLostError.d.ts +30 -0
- package/esm/gpuContextLostError.js +40 -0
- package/esm/gpuDevice.d.ts +29 -10
- package/esm/gpuDevice.js +35 -16
- package/esm/graphicsCapabilities.d.ts +27 -19
- package/esm/graphicsCapabilities.js +40 -18
- package/esm/hal/createHal.d.ts +4 -5
- package/esm/hal/createHal.js +14 -4
- package/esm/hal/deviceGpuCache.d.ts +25 -30
- package/esm/hal/deviceGpuCache.js +88 -97
- package/esm/hal/gpuHalBase.d.ts +5 -4
- package/esm/hal/gpuHalBase.js +25 -14
- package/esm/hal/index.d.ts +2 -2
- package/esm/hal/index.js +1 -1
- package/esm/hal/mockHal.d.ts +15 -10
- package/esm/hal/mockHal.js +31 -18
- package/esm/hal/oomReporter.d.ts +7 -0
- package/esm/hal/oomReporter.js +10 -0
- package/esm/hal/passIds.d.ts +8 -7
- package/esm/hal/passIds.js +11 -10
- package/esm/hal/regionRegistry.d.ts +0 -1
- package/esm/hal/regionRegistry.js +3 -15
- package/esm/hal/types.d.ts +55 -18
- package/esm/hal/webgl2Hal.d.ts +23 -6
- package/esm/hal/webgl2Hal.js +161 -155
- package/esm/hal/webgpuHal.d.ts +29 -13
- package/esm/hal/webgpuHal.js +221 -153
- package/esm/installUpload.d.ts +16 -3
- package/esm/installUpload.js +13 -41
- package/esm/instanceCache.d.ts +10 -7
- package/esm/instanceCache.js +14 -15
- package/esm/instancePass.d.ts +2 -1
- package/esm/mapUploadSync.d.ts +2 -10
- package/esm/mapUploadSync.js +2 -3
- package/esm/marks/barMark.d.ts +30 -0
- package/esm/marks/barMark.js +149 -0
- package/esm/marks/colorFill.d.ts +17 -0
- package/esm/marks/colorFill.js +26 -0
- package/esm/marks/drawAgainstHit.d.ts +113 -0
- package/esm/marks/drawAgainstHit.js +407 -0
- package/esm/marks/ellipseDistance.d.ts +10 -0
- package/esm/marks/ellipseDistance.js +136 -0
- package/esm/marks/glyphPaint.d.ts +36 -0
- package/esm/marks/glyphPaint.js +77 -0
- package/esm/marks/index.d.ts +33 -0
- package/esm/marks/index.js +20 -0
- package/esm/marks/lineMark.d.ts +37 -0
- package/esm/marks/lineMark.js +416 -0
- package/esm/marks/linkMark.d.ts +76 -0
- package/esm/marks/linkMark.js +585 -0
- package/esm/marks/markBackend.d.ts +118 -0
- package/esm/marks/markBackend.js +196 -0
- package/esm/marks/markHit.d.ts +32 -0
- package/esm/marks/markHit.js +61 -0
- package/esm/marks/markInk.d.ts +18 -0
- package/esm/marks/markInk.js +71 -0
- package/esm/marks/markPaint.d.ts +14 -0
- package/esm/marks/markPaint.js +32 -0
- package/esm/marks/markPlan.d.ts +25 -0
- package/esm/marks/markPlan.js +20 -0
- package/esm/marks/markRamp.d.ts +72 -0
- package/esm/marks/markRamp.js +197 -0
- package/esm/marks/nearestMarkHit.d.ts +55 -0
- package/esm/marks/nearestMarkHit.js +158 -0
- package/esm/marks/pathRecorder.d.ts +14 -0
- package/esm/marks/pathRecorder.js +80 -0
- package/esm/marks/pointMark.d.ts +42 -0
- package/esm/marks/pointMark.js +125 -0
- package/esm/marks/rowLane.d.ts +39 -0
- package/esm/marks/rowLane.js +41 -0
- package/esm/marks/rowSpanIndex.d.ts +29 -0
- package/esm/marks/rowSpanIndex.js +141 -0
- package/esm/marks/rowTable.d.ts +41 -0
- package/esm/marks/rowTable.js +75 -0
- package/esm/marks/ruleMark.d.ts +21 -0
- package/esm/marks/ruleMark.js +91 -0
- package/esm/marks/spanMark.d.ts +42 -0
- package/esm/marks/spanMark.js +81 -0
- package/esm/marks/types.d.ts +261 -0
- package/esm/marks/types.js +175 -0
- package/esm/marks/valueScale.d.ts +23 -0
- package/esm/marks/valueScale.js +11 -0
- package/esm/namedReactions.d.ts +3 -4
- package/esm/namedReactions.js +3 -4
- package/esm/perRegionRenderingBackend.d.ts +21 -3
- package/esm/perRegionRenderingBackend.js +37 -3
- package/esm/regionDataMap.d.ts +2 -2
- package/esm/regionDataMap.js +25 -23
- package/esm/renderBlock.d.ts +14 -0
- package/esm/renderBlock.js +25 -0
- package/esm/renderingBackendBase.d.ts +20 -14
- package/esm/renderingBackendBase.js +12 -7
- package/esm/scoreScale.d.ts +27 -0
- package/esm/scoreScale.js +88 -0
- package/esm/shaders/barMark.generated.d.ts +3 -0
- package/esm/shaders/barMark.generated.js +7 -0
- package/esm/shaders/barMark.glsl.generated.d.ts +2 -0
- package/esm/shaders/barMark.glsl.generated.js +4 -0
- package/esm/shaders/barMark.iface.generated.d.ts +90 -0
- package/esm/shaders/barMark.iface.generated.js +205 -0
- package/esm/shaders/barMark.wgsl.generated.d.ts +1 -0
- package/esm/shaders/barMark.wgsl.generated.js +3 -0
- package/esm/shaders/capsule.js.generated.d.ts +1 -0
- package/esm/shaders/capsule.js.generated.js +11 -0
- package/esm/shaders/clipStrip.generated.d.ts +2 -0
- package/esm/shaders/clipStrip.generated.js +4 -0
- package/esm/shaders/clipStrip.js.generated.d.ts +1 -0
- package/esm/shaders/clipStrip.js.generated.js +21 -0
- package/esm/shaders/colorRampLut.js.generated.d.ts +1 -0
- package/esm/shaders/colorRampLut.js.generated.js +17 -0
- package/esm/shaders/coverageBar.generated.d.ts +2 -3
- package/esm/shaders/coverageBar.generated.js +4 -3
- package/esm/shaders/coverageBar.glsl.generated.d.ts +2 -0
- package/esm/shaders/coverageBar.glsl.generated.js +4 -0
- package/esm/shaders/coverageBar.iface.generated.js +1 -1
- package/esm/shaders/coverageBar.wgsl.generated.d.ts +1 -0
- package/esm/shaders/coverageBar.wgsl.generated.js +3 -0
- package/esm/shaders/coverageClip.generated.d.ts +3 -0
- package/esm/shaders/coverageClip.generated.js +7 -0
- package/esm/shaders/coverageClip.glsl.generated.d.ts +2 -0
- package/esm/shaders/coverageClip.glsl.generated.js +4 -0
- package/esm/shaders/coverageClip.iface.generated.d.ts +85 -0
- package/esm/shaders/coverageClip.iface.generated.js +114 -0
- package/esm/shaders/coverageClip.wgsl.generated.d.ts +1 -0
- package/esm/shaders/coverageClip.wgsl.generated.js +3 -0
- package/esm/shaders/coverageIndicator.generated.d.ts +2 -3
- package/esm/shaders/coverageIndicator.generated.js +4 -3
- package/esm/shaders/coverageIndicator.glsl.generated.d.ts +2 -0
- package/esm/shaders/coverageIndicator.glsl.generated.js +4 -0
- package/esm/shaders/coverageIndicator.iface.generated.js +1 -1
- package/esm/shaders/coverageIndicator.wgsl.generated.d.ts +1 -0
- package/esm/shaders/coverageIndicator.wgsl.generated.js +3 -0
- package/esm/shaders/coverageInterbase.generated.d.ts +2 -3
- package/esm/shaders/coverageInterbase.generated.js +4 -3
- package/esm/shaders/coverageInterbase.glsl.generated.d.ts +2 -0
- package/esm/shaders/coverageInterbase.glsl.generated.js +4 -0
- package/esm/shaders/coverageInterbase.iface.generated.js +1 -1
- package/esm/shaders/coverageInterbase.wgsl.generated.d.ts +1 -0
- package/esm/shaders/coverageInterbase.wgsl.generated.js +3 -0
- package/esm/shaders/coverageMod.generated.d.ts +2 -3
- package/esm/shaders/coverageMod.generated.js +4 -3
- package/esm/shaders/coverageMod.glsl.generated.d.ts +2 -0
- package/esm/shaders/coverageMod.glsl.generated.js +4 -0
- package/esm/shaders/coverageMod.iface.generated.js +1 -1
- package/esm/shaders/coverageMod.wgsl.generated.d.ts +1 -0
- package/esm/shaders/coverageMod.wgsl.generated.js +3 -0
- package/esm/shaders/coverageSnp.generated.d.ts +2 -3
- package/esm/shaders/coverageSnp.generated.js +4 -3
- package/esm/shaders/coverageSnp.glsl.generated.d.ts +2 -0
- package/esm/shaders/coverageSnp.glsl.generated.js +4 -0
- package/esm/shaders/coverageSnp.iface.generated.js +1 -1
- package/esm/shaders/coverageSnp.wgsl.generated.d.ts +1 -0
- package/esm/shaders/coverageSnp.wgsl.generated.js +3 -0
- package/esm/shaders/curveDistance.js.generated.d.ts +5 -0
- package/esm/shaders/curveDistance.js.generated.js +87 -0
- package/esm/shaders/hpmath.js.generated.d.ts +2 -1
- package/esm/shaders/hpmath.js.generated.js +5 -2
- package/esm/shaders/lineCenterMark.generated.d.ts +3 -0
- package/esm/shaders/lineCenterMark.generated.js +7 -0
- package/esm/shaders/lineCenterMark.glsl.generated.d.ts +2 -0
- package/esm/shaders/lineCenterMark.glsl.generated.js +4 -0
- package/esm/shaders/lineCenterMark.iface.generated.d.ts +104 -0
- package/esm/shaders/lineCenterMark.iface.generated.js +237 -0
- package/esm/shaders/lineCenterMark.wgsl.generated.d.ts +1 -0
- package/esm/shaders/lineCenterMark.wgsl.generated.js +3 -0
- package/esm/shaders/lineCommon.generated.d.ts +2 -0
- package/esm/shaders/lineCommon.generated.js +4 -0
- package/esm/shaders/lineStepMark.generated.d.ts +3 -0
- package/esm/shaders/lineStepMark.generated.js +7 -0
- package/esm/shaders/lineStepMark.glsl.generated.d.ts +2 -0
- package/esm/shaders/lineStepMark.glsl.generated.js +4 -0
- package/esm/shaders/lineStepMark.iface.generated.d.ts +98 -0
- package/esm/shaders/lineStepMark.iface.generated.js +225 -0
- package/esm/shaders/lineStepMark.wgsl.generated.d.ts +1 -0
- package/esm/shaders/lineStepMark.wgsl.generated.js +3 -0
- package/esm/shaders/linkMark.consts.generated.d.ts +14 -0
- package/esm/shaders/linkMark.consts.generated.js +16 -0
- package/esm/shaders/linkMark.generated.d.ts +4 -0
- package/esm/shaders/linkMark.generated.js +8 -0
- package/esm/shaders/linkMark.glsl.generated.d.ts +2 -0
- package/esm/shaders/linkMark.glsl.generated.js +4 -0
- package/esm/shaders/linkMark.iface.generated.d.ts +142 -0
- package/esm/shaders/linkMark.iface.generated.js +1829 -0
- package/esm/shaders/linkMark.js.generated.d.ts +7 -0
- package/esm/shaders/linkMark.js.generated.js +159 -0
- package/esm/shaders/linkMark.wgsl.generated.d.ts +1 -0
- package/esm/shaders/linkMark.wgsl.generated.js +3 -0
- package/esm/shaders/markColor.generated.d.ts +9 -0
- package/esm/shaders/markColor.generated.js +11 -0
- package/esm/shaders/pointGlyph.js.generated.d.ts +2 -0
- package/esm/shaders/pointGlyph.js.generated.js +15 -0
- package/esm/shaders/pointMark.consts.generated.d.ts +7 -0
- package/esm/shaders/pointMark.consts.generated.js +9 -0
- package/esm/shaders/pointMark.generated.d.ts +4 -0
- package/esm/shaders/pointMark.generated.js +8 -0
- package/esm/shaders/pointMark.glsl.generated.d.ts +2 -0
- package/esm/shaders/pointMark.glsl.generated.js +4 -0
- package/esm/shaders/pointMark.iface.generated.d.ts +98 -0
- package/esm/shaders/pointMark.iface.generated.js +219 -0
- package/esm/shaders/pointMark.js.generated.d.ts +3 -0
- package/esm/shaders/pointMark.js.generated.js +93 -0
- package/esm/shaders/pointMark.wgsl.generated.d.ts +1 -0
- package/esm/shaders/pointMark.wgsl.generated.js +3 -0
- package/esm/shaders/rowRect.generated.d.ts +0 -1
- package/esm/shaders/rowRect.generated.js +0 -1
- package/esm/shaders/rowTable.generated.d.ts +1 -0
- package/esm/shaders/rowTable.generated.js +3 -0
- package/esm/shaders/rowTable.js.generated.d.ts +5 -0
- package/esm/shaders/rowTable.js.generated.js +29 -0
- package/esm/shaders/scoreScale.generated.d.ts +2 -0
- package/esm/shaders/scoreScale.generated.js +4 -0
- package/esm/shaders/scoreScale.js.generated.d.ts +1 -0
- package/esm/shaders/scoreScale.js.generated.js +50 -23
- package/esm/shaders/spanMark.generated.d.ts +3 -0
- package/esm/shaders/spanMark.generated.js +7 -0
- package/esm/shaders/spanMark.glsl.generated.d.ts +2 -0
- package/esm/shaders/spanMark.glsl.generated.js +4 -0
- package/esm/shaders/spanMark.iface.generated.d.ts +81 -0
- package/esm/shaders/spanMark.iface.generated.js +215 -0
- package/esm/shaders/spanMark.wgsl.generated.d.ts +1 -0
- package/esm/shaders/spanMark.wgsl.generated.js +3 -0
- package/esm/sharedBackendKey.d.ts +18 -0
- package/esm/{keyedRenderingBackend.js → sharedBackendKey.js} +5 -0
- package/esm/slangPass.d.ts +18 -11
- package/esm/slangPass.js +12 -4
- package/esm/useGraphicsCapabilities.d.ts +1 -1
- package/esm/useGraphicsCapabilities.js +1 -1
- package/esm/useRenderingBackend.d.ts +13 -13
- package/esm/useRenderingBackend.js +58 -20
- package/esm/webgpuUtils.d.ts +3 -11
- package/esm/webgpuUtils.js +12 -33
- package/package.json +32 -7
- package/src/shaders/antialias.slang +46 -0
- package/src/shaders/arcHull.test.ts +267 -0
- package/src/shaders/barMark.generated.ts +11 -0
- package/src/shaders/barMark.glsl.generated.ts +6 -0
- package/src/shaders/barMark.iface.generated.ts +285 -0
- package/src/shaders/barMark.slang +167 -0
- package/src/shaders/barMark.wgsl.generated.ts +4 -0
- package/src/shaders/capsule.js.generated.ts +14 -0
- package/src/shaders/capsule.slang +12 -4
- package/src/shaders/clipStrip.generated.ts +6 -0
- package/src/shaders/clipStrip.js.generated.ts +22 -0
- package/src/shaders/clipStrip.slang +34 -0
- package/src/shaders/clipStrip.test.ts +39 -0
- package/src/shaders/colorPack.slang +5 -1
- package/src/shaders/colorRampLut.js.generated.ts +22 -0
- package/src/shaders/colorRampLut.slang +15 -1
- package/src/shaders/coverageBand.slang +64 -32
- package/src/shaders/coverageBar.generated.ts +6 -5
- package/src/shaders/coverageBar.glsl.generated.ts +6 -0
- package/src/shaders/coverageBar.iface.generated.ts +1 -1
- package/src/shaders/coverageBar.slang +10 -10
- package/src/shaders/coverageBar.wgsl.generated.ts +4 -0
- package/src/shaders/coverageClip.generated.ts +11 -0
- package/src/shaders/coverageClip.glsl.generated.ts +6 -0
- package/src/shaders/coverageClip.iface.generated.ts +172 -0
- package/src/shaders/coverageClip.slang +38 -0
- package/src/shaders/coverageClip.wgsl.generated.ts +4 -0
- package/src/shaders/coverageIndicator.generated.ts +6 -5
- package/src/shaders/coverageIndicator.glsl.generated.ts +6 -0
- package/src/shaders/coverageIndicator.iface.generated.ts +1 -1
- package/src/shaders/coverageIndicator.wgsl.generated.ts +4 -0
- package/src/shaders/coverageInterbase.generated.ts +6 -5
- package/src/shaders/coverageInterbase.glsl.generated.ts +6 -0
- package/src/shaders/coverageInterbase.iface.generated.ts +1 -1
- package/src/shaders/coverageInterbase.wgsl.generated.ts +4 -0
- package/src/shaders/coverageMod.generated.ts +6 -5
- package/src/shaders/coverageMod.glsl.generated.ts +6 -0
- package/src/shaders/coverageMod.iface.generated.ts +1 -1
- package/src/shaders/coverageMod.wgsl.generated.ts +4 -0
- package/src/shaders/coverageSnp.generated.ts +6 -5
- package/src/shaders/coverageSnp.glsl.generated.ts +6 -0
- package/src/shaders/coverageSnp.iface.generated.ts +1 -1
- package/src/shaders/coverageSnp.wgsl.generated.ts +4 -0
- package/src/shaders/curveDistance.js.generated.ts +91 -0
- package/src/shaders/curveDistance.slang +265 -0
- package/src/shaders/hpClampFloor.test.ts +87 -0
- package/src/shaders/hpmath.js.generated.ts +6 -2
- package/src/shaders/hpmath.slang +100 -48
- package/src/shaders/insetValueScale.test.ts +67 -0
- package/src/shaders/lineCenterMark.generated.ts +11 -0
- package/src/shaders/lineCenterMark.glsl.generated.ts +6 -0
- package/src/shaders/lineCenterMark.iface.generated.ts +328 -0
- package/src/shaders/lineCenterMark.slang +127 -0
- package/src/shaders/lineCenterMark.wgsl.generated.ts +4 -0
- package/src/shaders/lineCommon.generated.ts +6 -0
- package/src/shaders/lineCommon.slang +102 -0
- package/src/shaders/lineStepMark.generated.ts +11 -0
- package/src/shaders/lineStepMark.glsl.generated.ts +6 -0
- package/src/shaders/lineStepMark.iface.generated.ts +311 -0
- package/src/shaders/lineStepMark.slang +125 -0
- package/src/shaders/lineStepMark.wgsl.generated.ts +4 -0
- package/src/shaders/linkMark.consts.generated.ts +30 -0
- package/src/shaders/linkMark.generated.ts +12 -0
- package/src/shaders/linkMark.glsl.generated.ts +6 -0
- package/src/shaders/linkMark.iface.generated.ts +1954 -0
- package/src/shaders/linkMark.js.generated.ts +167 -0
- package/src/shaders/linkMark.slang +439 -0
- package/src/shaders/linkMark.wgsl.generated.ts +4 -0
- package/src/shaders/markColor.generated.ts +20 -0
- package/src/shaders/markColor.slang +128 -0
- package/src/shaders/pointGlyph.js.generated.ts +20 -0
- package/src/shaders/pointGlyph.slang +23 -7
- package/src/shaders/pointGlyphPad.test.ts +242 -0
- package/src/shaders/pointMark.consts.generated.ts +16 -0
- package/src/shaders/pointMark.generated.ts +12 -0
- package/src/shaders/pointMark.glsl.generated.ts +6 -0
- package/src/shaders/pointMark.iface.generated.ts +304 -0
- package/src/shaders/pointMark.js.generated.ts +99 -0
- package/src/shaders/pointMark.slang +227 -0
- package/src/shaders/pointMark.wgsl.generated.ts +4 -0
- package/src/shaders/rowRect.generated.ts +0 -2
- package/src/shaders/rowRect.slang +39 -58
- package/src/shaders/rowTable.generated.ts +4 -0
- package/src/shaders/rowTable.js.generated.ts +37 -0
- package/src/shaders/rowTable.slang +98 -0
- package/src/shaders/scoreScale.generated.ts +6 -0
- package/src/shaders/scoreScale.js.generated.ts +48 -23
- package/src/shaders/scoreScale.slang +49 -55
- package/src/shaders/sdEllipse.test.ts +211 -0
- package/src/shaders/spanMark.generated.ts +11 -0
- package/src/shaders/spanMark.glsl.generated.ts +6 -0
- package/src/shaders/spanMark.iface.generated.ts +289 -0
- package/src/shaders/spanMark.slang +77 -0
- package/src/shaders/spanMark.wgsl.generated.ts +4 -0
- package/src/shaders/valueScale.slang +26 -0
- package/src/shaders/wideCircleLeg.test.ts +85 -0
- package/esm/globalRenderingBackend.d.ts +0 -90
- package/esm/globalRenderingBackend.js +0 -53
- package/esm/keyedRenderingBackend.d.ts +0 -41
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// A quantitative mark's value → canvas y: `scoreScale`'s normalizer, flipped
|
|
2
|
+
// so a bigger value sits higher. Only the scale lives here; each shape keeps
|
|
3
|
+
// its own anchor (ADR-097). `pointMark.slang` lifts the JS twin.
|
|
4
|
+
//! js-skip: valueToYPx — the linear case of valueToYPxScaled, whose twin pointMark.slang lifts; a shader reading it alone (the score example's scoreBarHeightPx) lifts the caller it sits inside
|
|
5
|
+
//! js-skip: insetValueYPx — its two consumers lift it under their own anchors, pointMark.slang as pointYPx and linkMark.slang as linkValuePx, and those are the spellings the painters and hit tests read; a third twin would be one nothing calls
|
|
6
|
+
module valueScale;
|
|
7
|
+
|
|
8
|
+
import scoreScale;
|
|
9
|
+
|
|
10
|
+
public float valueToYPxScaled(float value, float domainMin, float domainMax, float h, int scaleType, float symlogConstant) {
|
|
11
|
+
return (1.0 - normalizeScore(value, domainMin, domainMax, scaleType, symlogConstant)) * h;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
public float valueToYPx(float value, float domainMin, float domainMax, float h) {
|
|
15
|
+
return valueToYPxScaled(value, domainMin, domainMax, h, 0, 1.0);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// The same scale over a range inset by `insetPx` at BOTH ends, so an edge
|
|
19
|
+
// instance's glyph stays whole. Still range and not anchor: the result is px
|
|
20
|
+
// below the band's top and each shape places it (ADR-097). Past `h * 0.5` the
|
|
21
|
+
// clamp is load-bearing — without it the range goes negative and the scale
|
|
22
|
+
// runs backwards.
|
|
23
|
+
public float insetValueYPx(float value, float domainMin, float domainMax, float h, int scaleType, float insetPx, float symlogConstant) {
|
|
24
|
+
float inset = min(insetPx, h * 0.5);
|
|
25
|
+
return inset + valueToYPxScaled(value, domainMin, domainMax, h - 2.0 * inset, scaleType, symlogConstant);
|
|
26
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import {
|
|
2
|
+
wideCircleLeg,
|
|
3
|
+
wideCircleLegStep,
|
|
4
|
+
} from './curveDistance.js.generated.ts'
|
|
5
|
+
import { LINK_CURVE_SEGMENTS } from './linkMark.consts.generated.ts'
|
|
6
|
+
|
|
7
|
+
const SWEEP = 0.3
|
|
8
|
+
|
|
9
|
+
function legs(segments: number) {
|
|
10
|
+
const right: number[] = []
|
|
11
|
+
const left: number[] = []
|
|
12
|
+
for (let seg = 0; seg <= segments; seg++) {
|
|
13
|
+
const [side, b] = wideCircleLeg(seg, segments, SWEEP)
|
|
14
|
+
;(side > 0 ? right : left).push(b)
|
|
15
|
+
}
|
|
16
|
+
return { right, left }
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Odd counts included: the left leg is spread over `segments - half - 1`, and
|
|
20
|
+
// spelling that `half - 1` instead overshoots the sweep on every odd strip
|
|
21
|
+
// (65 segments reached 1.032x it) and divides by zero at 3.
|
|
22
|
+
test.each([LINK_CURVE_SEGMENTS, 8, 7, 6, 5, 4, 3])(
|
|
23
|
+
'both legs of a %i-segment strip rise from the foot to the full sweep',
|
|
24
|
+
segments => {
|
|
25
|
+
const { right, left } = legs(segments)
|
|
26
|
+
expect(right[0]).toBe(0)
|
|
27
|
+
expect(left.at(-1)).toBe(0)
|
|
28
|
+
expect(Math.max(...right)).toBeCloseTo(SWEEP, 12)
|
|
29
|
+
expect(Math.max(...left)).toBeCloseTo(SWEEP, 12)
|
|
30
|
+
// And NO further: the hull is padded for `legSweep`, so a leg running past
|
|
31
|
+
// it leaves the band through a chord nothing sized.
|
|
32
|
+
expect(Math.max(...right, ...left)).toBeLessThanOrEqual(SWEEP)
|
|
33
|
+
},
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
// Reaching the sweep is half the contract; arriving in equal steps is the other
|
|
37
|
+
// half, and it is the load-bearing one. `legSweepAngle` exists so that every
|
|
38
|
+
// chord's sagitta stays under a pixel across the band — a leg that front-loads
|
|
39
|
+
// its segments near the foot satisfies every endpoint assertion above and
|
|
40
|
+
// leaves one huge chord at the band edge, which is the taper the whole sweep
|
|
41
|
+
// rule was written to kill.
|
|
42
|
+
test.each([LINK_CURVE_SEGMENTS, 8, 7, 4, 3])(
|
|
43
|
+
'a %i-segment strip steps each leg by a constant angle',
|
|
44
|
+
segments => {
|
|
45
|
+
const { right, left } = legs(segments)
|
|
46
|
+
for (const leg of [right, [...left].reverse()]) {
|
|
47
|
+
const steps = leg.slice(1).map((b, i) => b - leg[i]!)
|
|
48
|
+
for (const step of steps) {
|
|
49
|
+
expect(step).toBeCloseTo(steps[0]!, 12)
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
test('each leg is monotonic from its foot, the left one mirrored', () => {
|
|
56
|
+
const { right, left } = legs(LINK_CURVE_SEGMENTS)
|
|
57
|
+
for (let i = 1; i < right.length; i++) {
|
|
58
|
+
expect(right[i]).toBeGreaterThan(right[i - 1]!)
|
|
59
|
+
}
|
|
60
|
+
for (let i = 1; i < left.length; i++) {
|
|
61
|
+
expect(left[i]).toBeLessThan(left[i - 1]!)
|
|
62
|
+
}
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
// The hull circumscribes each chord by half this step, so a step read off the
|
|
66
|
+
// wrong leg leaves the other leg's chords sagging.
|
|
67
|
+
test.each([LINK_CURVE_SEGMENTS, 8, 7, 4, 3])(
|
|
68
|
+
'wideCircleLegStep is the step of the leg a %i-segment strip puts seg on',
|
|
69
|
+
segments => {
|
|
70
|
+
for (let seg = 0; seg < segments; seg++) {
|
|
71
|
+
const [side, b] = wideCircleLeg(seg, segments, SWEEP)
|
|
72
|
+
const [nextSide, next] = wideCircleLeg(seg + 1, segments, SWEEP)
|
|
73
|
+
if (side === nextSide) {
|
|
74
|
+
expect(wideCircleLegStep(seg, segments, SWEEP)).toBeCloseTo(
|
|
75
|
+
Math.abs(next - b),
|
|
76
|
+
12,
|
|
77
|
+
)
|
|
78
|
+
expect(wideCircleLegStep(seg + 1, segments, SWEEP)).toBeCloseTo(
|
|
79
|
+
Math.abs(next - b),
|
|
80
|
+
12,
|
|
81
|
+
)
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
)
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
import { Canvas2DRenderingBackendBase, GpuRenderingBackendBase } from './renderingBackendBase.ts';
|
|
2
|
-
import type { FrameDimensions, RenderingBackend } from './renderingBackendBase.ts';
|
|
3
|
-
/**
|
|
4
|
-
* Shared contract for monolithic GPU backends (HiC, LD, multi-variant
|
|
5
|
-
* matrix) — displays with no region partitioning. One payload under the
|
|
6
|
-
* `data` key, one draw per frame. Render receives the data directly so
|
|
7
|
-
* Canvas2D backends stay stateless; GPU backends use `upload` to push bytes
|
|
8
|
-
* into a HAL buffer and ignore the `data` arg at render time.
|
|
9
|
-
*
|
|
10
|
-
* A display with a second upload beside the payload — HiC's and LD's colour
|
|
11
|
-
* ramp texture, derived from a setting rather than the fetch — widens `Key`
|
|
12
|
-
* and `Cell` so `upload` takes both cells and tells them apart, while `render`
|
|
13
|
-
* is still handed the payload alone.
|
|
14
|
-
*/
|
|
15
|
-
export interface GlobalRenderingBackend<UploadData, RenderState, Key extends string = 'data', Cell = UploadData> extends RenderingBackend {
|
|
16
|
-
upload(key: Key, data: Cell): void;
|
|
17
|
-
release(key: Key): void;
|
|
18
|
-
/**
|
|
19
|
-
* Paint one frame and report whether real content reached the canvas — the
|
|
20
|
-
* monolithic twin of `PerRegionRenderingBackend.renderBlocks`, and it answers
|
|
21
|
-
* for the same reason. `RenderLifecycleMixin` flips `canvasDrawn` (the loading
|
|
22
|
-
* scrim, `data-display-drawn`, every browser test's wait) only on `true`, so a
|
|
23
|
-
* tick that drew nothing must say so.
|
|
24
|
-
*
|
|
25
|
-
* **This used to return `void`, and the answer was the display's to give.**
|
|
26
|
-
* Each of the three wrote the same six lines — "data is here, so return
|
|
27
|
-
* `true`" — beside a renderer whose own guard was strictly narrower: a color
|
|
28
|
-
* ramp that had not arrived, a zero instance count, an empty HAL buffer. Two
|
|
29
|
-
* expressions of one fact, and the one that could see what actually happened
|
|
30
|
-
* was not the one being asked. LD's model even carried a comment explaining
|
|
31
|
-
* the workaround, which is the usual sign that a signature is wrong rather
|
|
32
|
-
* than a caller.
|
|
33
|
-
*/
|
|
34
|
-
render(data: UploadData | null, state: RenderState): boolean;
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Canvas2D-side base for `GlobalRenderingBackend` implementations. Inherits the
|
|
38
|
-
* `canvas` + 2D context (and no-op `dispose`) from
|
|
39
|
-
* `Canvas2DRenderingBackendBase`; stubs `upload` (no-op — data flows through
|
|
40
|
-
* `render`).
|
|
41
|
-
*
|
|
42
|
-
* `render` is concrete and runs `prepareCanvas` (DPR-aware backing-store sizing)
|
|
43
|
-
* before handing off to the abstract `draw`, exactly as
|
|
44
|
-
* `Canvas2DPerRegionRenderingBackend` does — so a renderer here can no more
|
|
45
|
-
* forget it and paint blurry on hi-DPI than one over there can. All three
|
|
46
|
-
* subclasses opened with that same call and none of them had to.
|
|
47
|
-
*
|
|
48
|
-
* A null payload still prepares (and so clears) the canvas, then skips the
|
|
49
|
-
* draw: that is the frame where a refetch is in flight and the old picture must
|
|
50
|
-
* not stay up.
|
|
51
|
-
*/
|
|
52
|
-
export declare abstract class Canvas2DGlobalRenderingBackend<UploadData, RenderState extends FrameDimensions, Key extends string = 'data', Cell = UploadData> extends Canvas2DRenderingBackendBase implements GlobalRenderingBackend<UploadData, RenderState, Key, Cell> {
|
|
53
|
-
upload(_key: Key, _cell: Cell): void;
|
|
54
|
-
release(_key: Key): void;
|
|
55
|
-
render(data: UploadData | null, state: RenderState): boolean;
|
|
56
|
-
/**
|
|
57
|
-
* Paint `data` into `this.ctx` (already DPR-prepared) and answer whether
|
|
58
|
-
* anything reached it. Delegates to the plugin's pure `drawXxxBlocks`
|
|
59
|
-
* function, the one SVG export shares.
|
|
60
|
-
*/
|
|
61
|
-
protected abstract draw(data: UploadData, state: RenderState): boolean;
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* GPU-side base for `GlobalRenderingBackend` implementations. Inherits the
|
|
65
|
-
* `hal` reference, the pre-allocated uniform scratch buffer, and the
|
|
66
|
-
* HAL-delegating `dispose` from `GpuRenderingBackendBase`. Subclasses implement
|
|
67
|
-
* `upload` and `draw`.
|
|
68
|
-
*
|
|
69
|
-
* `render` is the frame scaffold the per-region base has always had and this
|
|
70
|
-
* one did not: resize the backing store, `beginFrame`/`endFrame`, and hand the
|
|
71
|
-
* middle to `draw`. **The pairing is the point.** `beginFrame` is what clears
|
|
72
|
-
* the canvas, so a frame that draws nothing still has to open and close one or
|
|
73
|
-
* the last picture stays up — and with each subclass writing its own scaffold,
|
|
74
|
-
* that invariant held three times by hand.
|
|
75
|
-
*
|
|
76
|
-
* `release` is a no-op by default: a payload leaving the map is answered by
|
|
77
|
-
* `render` being handed `null`, and `beginFrame` clears the last picture. A
|
|
78
|
-
* subclass whose buffers are worth freeing early overrides it.
|
|
79
|
-
*/
|
|
80
|
-
export declare abstract class GpuGlobalRenderingBackend<UploadData, RenderState extends FrameDimensions, Key extends string = 'data', Cell = UploadData> extends GpuRenderingBackendBase implements GlobalRenderingBackend<UploadData, RenderState, Key, Cell> {
|
|
81
|
-
abstract upload(key: Key, data: Cell): void;
|
|
82
|
-
release(): void;
|
|
83
|
-
render(data: UploadData | null, state: RenderState): boolean;
|
|
84
|
-
/**
|
|
85
|
-
* Write uniforms and issue the draw passes for one frame, inside an already-
|
|
86
|
-
* open `beginFrame`/`endFrame`. Return whether anything was drawn — a buffer
|
|
87
|
-
* the upload has not filled yet is the ordinary reason not to.
|
|
88
|
-
*/
|
|
89
|
-
protected abstract draw(data: UploadData, state: RenderState): boolean;
|
|
90
|
-
}
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import { prepareCanvas } from './canvas2dUtils.js';
|
|
2
|
-
import { Canvas2DRenderingBackendBase, GpuRenderingBackendBase, } from './renderingBackendBase.js';
|
|
3
|
-
/**
|
|
4
|
-
* Canvas2D-side base for `GlobalRenderingBackend` implementations. Inherits the
|
|
5
|
-
* `canvas` + 2D context (and no-op `dispose`) from
|
|
6
|
-
* `Canvas2DRenderingBackendBase`; stubs `upload` (no-op — data flows through
|
|
7
|
-
* `render`).
|
|
8
|
-
*
|
|
9
|
-
* `render` is concrete and runs `prepareCanvas` (DPR-aware backing-store sizing)
|
|
10
|
-
* before handing off to the abstract `draw`, exactly as
|
|
11
|
-
* `Canvas2DPerRegionRenderingBackend` does — so a renderer here can no more
|
|
12
|
-
* forget it and paint blurry on hi-DPI than one over there can. All three
|
|
13
|
-
* subclasses opened with that same call and none of them had to.
|
|
14
|
-
*
|
|
15
|
-
* A null payload still prepares (and so clears) the canvas, then skips the
|
|
16
|
-
* draw: that is the frame where a refetch is in flight and the old picture must
|
|
17
|
-
* not stay up.
|
|
18
|
-
*/
|
|
19
|
-
export class Canvas2DGlobalRenderingBackend extends Canvas2DRenderingBackendBase {
|
|
20
|
-
upload(_key, _cell) { }
|
|
21
|
-
release(_key) { }
|
|
22
|
-
render(data, state) {
|
|
23
|
-
prepareCanvas(this.canvas, this.ctx, state.canvasWidth, state.canvasHeight);
|
|
24
|
-
return data !== null && this.draw(data, state);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* GPU-side base for `GlobalRenderingBackend` implementations. Inherits the
|
|
29
|
-
* `hal` reference, the pre-allocated uniform scratch buffer, and the
|
|
30
|
-
* HAL-delegating `dispose` from `GpuRenderingBackendBase`. Subclasses implement
|
|
31
|
-
* `upload` and `draw`.
|
|
32
|
-
*
|
|
33
|
-
* `render` is the frame scaffold the per-region base has always had and this
|
|
34
|
-
* one did not: resize the backing store, `beginFrame`/`endFrame`, and hand the
|
|
35
|
-
* middle to `draw`. **The pairing is the point.** `beginFrame` is what clears
|
|
36
|
-
* the canvas, so a frame that draws nothing still has to open and close one or
|
|
37
|
-
* the last picture stays up — and with each subclass writing its own scaffold,
|
|
38
|
-
* that invariant held three times by hand.
|
|
39
|
-
*
|
|
40
|
-
* `release` is a no-op by default: a payload leaving the map is answered by
|
|
41
|
-
* `render` being handed `null`, and `beginFrame` clears the last picture. A
|
|
42
|
-
* subclass whose buffers are worth freeing early overrides it.
|
|
43
|
-
*/
|
|
44
|
-
export class GpuGlobalRenderingBackend extends GpuRenderingBackendBase {
|
|
45
|
-
release() { }
|
|
46
|
-
render(data, state) {
|
|
47
|
-
this.hal.resize(state.canvasWidth, state.canvasHeight);
|
|
48
|
-
this.hal.beginFrame(0, 0, 0, 0);
|
|
49
|
-
const painted = data !== null && this.draw(data, state);
|
|
50
|
-
this.hal.endFrame();
|
|
51
|
-
return painted;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import type { RenderingBackend } from './renderingBackendBase.ts';
|
|
2
|
-
/**
|
|
3
|
-
* Shared contract for **keyed shared-canvas** backends — one canvas painting
|
|
4
|
-
* several displays at once, each holding its own uploaded buffer under its own
|
|
5
|
-
* key. Dotplot (a key per display in the view) and multi-LGV synteny (a key per
|
|
6
|
-
* track level) are the two.
|
|
7
|
-
*
|
|
8
|
-
* The third shape beside per-region and monolithic, and genuinely neither:
|
|
9
|
-
* per-region drives off `renderBlocks(blocks, regions, state)` with the model's
|
|
10
|
-
* data map handed back each frame, and monolithic is one payload under the `data` key
|
|
11
|
-
* with no key at all. These key their uploads and render every key in one
|
|
12
|
-
* frame from state the caller assembled, so they own the map.
|
|
13
|
-
*
|
|
14
|
-
* Unlike the other two this is an interface with no abstract class under it:
|
|
15
|
-
* the shared *state* (`hal` + uniform scratch, or `canvas` + 2D context) is
|
|
16
|
-
* `GpuRenderingBackendBase` / `Canvas2DRenderingBackendBase`, which every keyed
|
|
17
|
-
* backend extends, and there is no shared *behavior* on top — the render loops
|
|
18
|
-
* genuinely differ. An empty abstract class between them would only be a place
|
|
19
|
-
* to look.
|
|
20
|
-
*/
|
|
21
|
-
export interface KeyedRenderingBackend<UploadData, RenderState> extends RenderingBackend {
|
|
22
|
-
/** CSS-pixel size of the shared canvas. */
|
|
23
|
-
resize(width: number, height: number): void;
|
|
24
|
-
upload(key: number, data: UploadData): void;
|
|
25
|
-
release(key: number): void;
|
|
26
|
-
/** Paint every key the state names. */
|
|
27
|
-
render(state: RenderState): void;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Stable 32-bit slot for a display on a backend it shares with siblings, hashed
|
|
31
|
-
* from its MST node id (djb2). Collisions are vanishingly rare at display
|
|
32
|
-
* cardinalities, and the alternative — coordinating integer slots between
|
|
33
|
-
* displays that don't know about each other — is worse.
|
|
34
|
-
*
|
|
35
|
-
* Key by this, never by the display's index in its parent's list. An index
|
|
36
|
-
* renumbers when a sibling is hidden or reordered, which hands the survivor a
|
|
37
|
-
* slot holding another display's bytes: the keyed diff sees a changed
|
|
38
|
-
* reference and re-uploads every later display's whole buffer, and any frame
|
|
39
|
-
* drawn between the two mistakes one display's geometry for another's.
|
|
40
|
-
*/
|
|
41
|
-
export declare function sharedBackendKey(id: string): number;
|