@jbrowse/render-core 5.0.0-beta.1 → 5.0.0-beta.11

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 (353) hide show
  1. package/esm/RenderCanvas.d.ts +3 -3
  2. package/esm/RenderCanvas.js +1 -1
  3. package/esm/RenderLifecycleMixin.d.ts +52 -20
  4. package/esm/RenderLifecycleMixin.js +89 -23
  5. package/esm/canvas2dUtils.d.ts +90 -23
  6. package/esm/canvas2dUtils.js +120 -37
  7. package/esm/colorRampLut.d.ts +5 -5
  8. package/esm/colorRampLut.js +6 -6
  9. package/esm/computePipeline.d.ts +14 -0
  10. package/esm/computePipeline.js +62 -0
  11. package/esm/contractReports.d.ts +54 -0
  12. package/esm/contractReports.js +112 -0
  13. package/esm/coverageBand.d.ts +13 -8
  14. package/esm/coverageBand.js +15 -5
  15. package/esm/coverageBandBuffers.d.ts +2 -9
  16. package/esm/coverageBandBuffers.js +1 -13
  17. package/esm/createRenderingBackend.d.ts +16 -20
  18. package/esm/createRenderingBackend.js +6 -4
  19. package/esm/displayPhase.d.ts +83 -104
  20. package/esm/displayPhase.js +42 -82
  21. package/esm/encodeMemo.d.ts +14 -0
  22. package/esm/encodeMemo.js +48 -0
  23. package/esm/gpuContextLostError.d.ts +30 -0
  24. package/esm/gpuContextLostError.js +40 -0
  25. package/esm/gpuDevice.d.ts +29 -10
  26. package/esm/gpuDevice.js +35 -16
  27. package/esm/graphicsCapabilities.d.ts +27 -19
  28. package/esm/graphicsCapabilities.js +41 -19
  29. package/esm/hal/createHal.d.ts +4 -5
  30. package/esm/hal/createHal.js +15 -5
  31. package/esm/hal/deviceGpuCache.d.ts +25 -30
  32. package/esm/hal/deviceGpuCache.js +85 -97
  33. package/esm/hal/gpuHalBase.d.ts +5 -4
  34. package/esm/hal/gpuHalBase.js +25 -14
  35. package/esm/hal/index.d.ts +2 -2
  36. package/esm/hal/index.js +1 -1
  37. package/esm/hal/mockHal.d.ts +15 -10
  38. package/esm/hal/mockHal.js +31 -18
  39. package/esm/hal/oomReporter.d.ts +7 -0
  40. package/esm/hal/oomReporter.js +10 -0
  41. package/esm/hal/passIds.d.ts +8 -7
  42. package/esm/hal/passIds.js +11 -10
  43. package/esm/hal/regionRegistry.d.ts +0 -1
  44. package/esm/hal/regionRegistry.js +3 -15
  45. package/esm/hal/types.d.ts +53 -18
  46. package/esm/hal/webgl2Hal.d.ts +23 -6
  47. package/esm/hal/webgl2Hal.js +158 -155
  48. package/esm/hal/webgpuHal.d.ts +29 -13
  49. package/esm/hal/webgpuHal.js +220 -153
  50. package/esm/installUpload.d.ts +16 -3
  51. package/esm/installUpload.js +13 -41
  52. package/esm/instanceCache.d.ts +10 -7
  53. package/esm/instanceCache.js +14 -15
  54. package/esm/instancePass.d.ts +2 -1
  55. package/esm/mapUploadSync.d.ts +2 -10
  56. package/esm/mapUploadSync.js +2 -3
  57. package/esm/marks/barMark.d.ts +30 -0
  58. package/esm/marks/barMark.js +149 -0
  59. package/esm/marks/colorFill.d.ts +17 -0
  60. package/esm/marks/colorFill.js +26 -0
  61. package/esm/marks/drawAgainstHit.d.ts +113 -0
  62. package/esm/marks/drawAgainstHit.js +407 -0
  63. package/esm/marks/ellipseDistance.d.ts +10 -0
  64. package/esm/marks/ellipseDistance.js +136 -0
  65. package/esm/marks/glyphPaint.d.ts +36 -0
  66. package/esm/marks/glyphPaint.js +77 -0
  67. package/esm/marks/index.d.ts +33 -0
  68. package/esm/marks/index.js +20 -0
  69. package/esm/marks/lineMark.d.ts +37 -0
  70. package/esm/marks/lineMark.js +416 -0
  71. package/esm/marks/linkMark.d.ts +76 -0
  72. package/esm/marks/linkMark.js +585 -0
  73. package/esm/marks/markBackend.d.ts +118 -0
  74. package/esm/marks/markBackend.js +196 -0
  75. package/esm/marks/markHit.d.ts +32 -0
  76. package/esm/marks/markHit.js +61 -0
  77. package/esm/marks/markInk.d.ts +18 -0
  78. package/esm/marks/markInk.js +71 -0
  79. package/esm/marks/markPaint.d.ts +14 -0
  80. package/esm/marks/markPaint.js +32 -0
  81. package/esm/marks/markPlan.d.ts +25 -0
  82. package/esm/marks/markPlan.js +20 -0
  83. package/esm/marks/markRamp.d.ts +74 -0
  84. package/esm/marks/markRamp.js +205 -0
  85. package/esm/marks/nearestMarkHit.d.ts +55 -0
  86. package/esm/marks/nearestMarkHit.js +158 -0
  87. package/esm/marks/pathRecorder.d.ts +14 -0
  88. package/esm/marks/pathRecorder.js +80 -0
  89. package/esm/marks/pointMark.d.ts +42 -0
  90. package/esm/marks/pointMark.js +125 -0
  91. package/esm/marks/rowLane.d.ts +39 -0
  92. package/esm/marks/rowLane.js +41 -0
  93. package/esm/marks/rowSpanIndex.d.ts +30 -0
  94. package/esm/marks/rowSpanIndex.js +151 -0
  95. package/esm/marks/rowTable.d.ts +41 -0
  96. package/esm/marks/rowTable.js +75 -0
  97. package/esm/marks/ruleMark.d.ts +21 -0
  98. package/esm/marks/ruleMark.js +91 -0
  99. package/esm/marks/spanMark.d.ts +42 -0
  100. package/esm/marks/spanMark.js +81 -0
  101. package/esm/marks/types.d.ts +261 -0
  102. package/esm/marks/types.js +175 -0
  103. package/esm/marks/valueScale.d.ts +23 -0
  104. package/esm/marks/valueScale.js +11 -0
  105. package/esm/namedReactions.d.ts +3 -4
  106. package/esm/namedReactions.js +3 -4
  107. package/esm/perRegionRenderingBackend.d.ts +21 -3
  108. package/esm/perRegionRenderingBackend.js +37 -3
  109. package/esm/regionDataMap.d.ts +2 -2
  110. package/esm/regionDataMap.js +25 -23
  111. package/esm/renderBlock.d.ts +14 -0
  112. package/esm/renderBlock.js +25 -0
  113. package/esm/renderingBackendBase.d.ts +20 -14
  114. package/esm/renderingBackendBase.js +12 -7
  115. package/esm/scoreScale.d.ts +27 -0
  116. package/esm/scoreScale.js +88 -0
  117. package/esm/shaders/barMark.generated.d.ts +3 -0
  118. package/esm/shaders/barMark.generated.js +7 -0
  119. package/esm/shaders/barMark.glsl.generated.d.ts +2 -0
  120. package/esm/shaders/barMark.glsl.generated.js +4 -0
  121. package/esm/shaders/barMark.iface.generated.d.ts +90 -0
  122. package/esm/shaders/barMark.iface.generated.js +205 -0
  123. package/esm/shaders/barMark.wgsl.generated.d.ts +1 -0
  124. package/esm/shaders/barMark.wgsl.generated.js +3 -0
  125. package/esm/shaders/capsule.js.generated.d.ts +1 -0
  126. package/esm/shaders/capsule.js.generated.js +11 -0
  127. package/esm/shaders/clipStrip.generated.d.ts +2 -0
  128. package/esm/shaders/clipStrip.generated.js +4 -0
  129. package/esm/shaders/clipStrip.js.generated.d.ts +1 -0
  130. package/esm/shaders/clipStrip.js.generated.js +21 -0
  131. package/esm/shaders/colorRampLut.js.generated.d.ts +1 -0
  132. package/esm/shaders/colorRampLut.js.generated.js +17 -0
  133. package/esm/shaders/coverageBar.generated.d.ts +2 -3
  134. package/esm/shaders/coverageBar.generated.js +4 -3
  135. package/esm/shaders/coverageBar.glsl.generated.d.ts +2 -0
  136. package/esm/shaders/coverageBar.glsl.generated.js +4 -0
  137. package/esm/shaders/coverageBar.iface.generated.js +1 -1
  138. package/esm/shaders/coverageBar.wgsl.generated.d.ts +1 -0
  139. package/esm/shaders/coverageBar.wgsl.generated.js +3 -0
  140. package/esm/shaders/coverageClip.generated.d.ts +3 -0
  141. package/esm/shaders/coverageClip.generated.js +7 -0
  142. package/esm/shaders/coverageClip.glsl.generated.d.ts +2 -0
  143. package/esm/shaders/coverageClip.glsl.generated.js +4 -0
  144. package/esm/shaders/coverageClip.iface.generated.d.ts +85 -0
  145. package/esm/shaders/coverageClip.iface.generated.js +114 -0
  146. package/esm/shaders/coverageClip.wgsl.generated.d.ts +1 -0
  147. package/esm/shaders/coverageClip.wgsl.generated.js +3 -0
  148. package/esm/shaders/coverageIndicator.generated.d.ts +2 -3
  149. package/esm/shaders/coverageIndicator.generated.js +4 -3
  150. package/esm/shaders/coverageIndicator.glsl.generated.d.ts +2 -0
  151. package/esm/shaders/coverageIndicator.glsl.generated.js +4 -0
  152. package/esm/shaders/coverageIndicator.iface.generated.js +1 -1
  153. package/esm/shaders/coverageIndicator.wgsl.generated.d.ts +1 -0
  154. package/esm/shaders/coverageIndicator.wgsl.generated.js +3 -0
  155. package/esm/shaders/coverageInterbase.generated.d.ts +2 -3
  156. package/esm/shaders/coverageInterbase.generated.js +4 -3
  157. package/esm/shaders/coverageInterbase.glsl.generated.d.ts +2 -0
  158. package/esm/shaders/coverageInterbase.glsl.generated.js +4 -0
  159. package/esm/shaders/coverageInterbase.iface.generated.js +1 -1
  160. package/esm/shaders/coverageInterbase.wgsl.generated.d.ts +1 -0
  161. package/esm/shaders/coverageInterbase.wgsl.generated.js +3 -0
  162. package/esm/shaders/coverageMod.generated.d.ts +2 -3
  163. package/esm/shaders/coverageMod.generated.js +4 -3
  164. package/esm/shaders/coverageMod.glsl.generated.d.ts +2 -0
  165. package/esm/shaders/coverageMod.glsl.generated.js +4 -0
  166. package/esm/shaders/coverageMod.iface.generated.js +1 -1
  167. package/esm/shaders/coverageMod.wgsl.generated.d.ts +1 -0
  168. package/esm/shaders/coverageMod.wgsl.generated.js +3 -0
  169. package/esm/shaders/coverageSnp.generated.d.ts +2 -3
  170. package/esm/shaders/coverageSnp.generated.js +4 -3
  171. package/esm/shaders/coverageSnp.glsl.generated.d.ts +2 -0
  172. package/esm/shaders/coverageSnp.glsl.generated.js +4 -0
  173. package/esm/shaders/coverageSnp.iface.generated.js +1 -1
  174. package/esm/shaders/coverageSnp.wgsl.generated.d.ts +1 -0
  175. package/esm/shaders/coverageSnp.wgsl.generated.js +3 -0
  176. package/esm/shaders/curveDistance.js.generated.d.ts +5 -0
  177. package/esm/shaders/curveDistance.js.generated.js +87 -0
  178. package/esm/shaders/hpmath.js.generated.d.ts +2 -1
  179. package/esm/shaders/hpmath.js.generated.js +5 -2
  180. package/esm/shaders/lineCenterMark.generated.d.ts +3 -0
  181. package/esm/shaders/lineCenterMark.generated.js +7 -0
  182. package/esm/shaders/lineCenterMark.glsl.generated.d.ts +2 -0
  183. package/esm/shaders/lineCenterMark.glsl.generated.js +4 -0
  184. package/esm/shaders/lineCenterMark.iface.generated.d.ts +104 -0
  185. package/esm/shaders/lineCenterMark.iface.generated.js +237 -0
  186. package/esm/shaders/lineCenterMark.wgsl.generated.d.ts +1 -0
  187. package/esm/shaders/lineCenterMark.wgsl.generated.js +3 -0
  188. package/esm/shaders/lineCommon.generated.d.ts +2 -0
  189. package/esm/shaders/lineCommon.generated.js +4 -0
  190. package/esm/shaders/lineStepMark.generated.d.ts +3 -0
  191. package/esm/shaders/lineStepMark.generated.js +7 -0
  192. package/esm/shaders/lineStepMark.glsl.generated.d.ts +2 -0
  193. package/esm/shaders/lineStepMark.glsl.generated.js +4 -0
  194. package/esm/shaders/lineStepMark.iface.generated.d.ts +98 -0
  195. package/esm/shaders/lineStepMark.iface.generated.js +225 -0
  196. package/esm/shaders/lineStepMark.wgsl.generated.d.ts +1 -0
  197. package/esm/shaders/lineStepMark.wgsl.generated.js +3 -0
  198. package/esm/shaders/linkMark.consts.generated.d.ts +14 -0
  199. package/esm/shaders/linkMark.consts.generated.js +16 -0
  200. package/esm/shaders/linkMark.generated.d.ts +4 -0
  201. package/esm/shaders/linkMark.generated.js +8 -0
  202. package/esm/shaders/linkMark.glsl.generated.d.ts +2 -0
  203. package/esm/shaders/linkMark.glsl.generated.js +4 -0
  204. package/esm/shaders/linkMark.iface.generated.d.ts +142 -0
  205. package/esm/shaders/linkMark.iface.generated.js +1829 -0
  206. package/esm/shaders/linkMark.js.generated.d.ts +7 -0
  207. package/esm/shaders/linkMark.js.generated.js +159 -0
  208. package/esm/shaders/linkMark.wgsl.generated.d.ts +1 -0
  209. package/esm/shaders/linkMark.wgsl.generated.js +3 -0
  210. package/esm/shaders/markColor.generated.d.ts +9 -0
  211. package/esm/shaders/markColor.generated.js +11 -0
  212. package/esm/shaders/pointGlyph.js.generated.d.ts +2 -0
  213. package/esm/shaders/pointGlyph.js.generated.js +15 -0
  214. package/esm/shaders/pointMark.consts.generated.d.ts +7 -0
  215. package/esm/shaders/pointMark.consts.generated.js +9 -0
  216. package/esm/shaders/pointMark.generated.d.ts +4 -0
  217. package/esm/shaders/pointMark.generated.js +8 -0
  218. package/esm/shaders/pointMark.glsl.generated.d.ts +2 -0
  219. package/esm/shaders/pointMark.glsl.generated.js +4 -0
  220. package/esm/shaders/pointMark.iface.generated.d.ts +98 -0
  221. package/esm/shaders/pointMark.iface.generated.js +219 -0
  222. package/esm/shaders/pointMark.js.generated.d.ts +3 -0
  223. package/esm/shaders/pointMark.js.generated.js +93 -0
  224. package/esm/shaders/pointMark.wgsl.generated.d.ts +1 -0
  225. package/esm/shaders/pointMark.wgsl.generated.js +3 -0
  226. package/esm/shaders/rowRect.generated.d.ts +0 -1
  227. package/esm/shaders/rowRect.generated.js +0 -1
  228. package/esm/shaders/rowTable.generated.d.ts +1 -0
  229. package/esm/shaders/rowTable.generated.js +3 -0
  230. package/esm/shaders/rowTable.js.generated.d.ts +5 -0
  231. package/esm/shaders/rowTable.js.generated.js +29 -0
  232. package/esm/shaders/scoreScale.generated.d.ts +2 -0
  233. package/esm/shaders/scoreScale.generated.js +4 -0
  234. package/esm/shaders/scoreScale.js.generated.d.ts +1 -0
  235. package/esm/shaders/scoreScale.js.generated.js +50 -23
  236. package/esm/shaders/spanMark.generated.d.ts +3 -0
  237. package/esm/shaders/spanMark.generated.js +7 -0
  238. package/esm/shaders/spanMark.glsl.generated.d.ts +2 -0
  239. package/esm/shaders/spanMark.glsl.generated.js +4 -0
  240. package/esm/shaders/spanMark.iface.generated.d.ts +81 -0
  241. package/esm/shaders/spanMark.iface.generated.js +215 -0
  242. package/esm/shaders/spanMark.wgsl.generated.d.ts +1 -0
  243. package/esm/shaders/spanMark.wgsl.generated.js +3 -0
  244. package/esm/sharedBackendKey.d.ts +18 -0
  245. package/esm/{keyedRenderingBackend.js → sharedBackendKey.js} +5 -0
  246. package/esm/slangPass.d.ts +17 -11
  247. package/esm/slangPass.js +12 -4
  248. package/esm/useGraphicsCapabilities.d.ts +1 -1
  249. package/esm/useGraphicsCapabilities.js +1 -1
  250. package/esm/useRenderingBackend.d.ts +13 -13
  251. package/esm/useRenderingBackend.js +58 -20
  252. package/esm/webgpuUtils.d.ts +3 -11
  253. package/esm/webgpuUtils.js +12 -33
  254. package/package.json +32 -7
  255. package/src/shaders/antialias.slang +46 -0
  256. package/src/shaders/arcHull.test.ts +267 -0
  257. package/src/shaders/barMark.generated.ts +11 -0
  258. package/src/shaders/barMark.glsl.generated.ts +6 -0
  259. package/src/shaders/barMark.iface.generated.ts +285 -0
  260. package/src/shaders/barMark.slang +167 -0
  261. package/src/shaders/barMark.wgsl.generated.ts +4 -0
  262. package/src/shaders/capsule.js.generated.ts +14 -0
  263. package/src/shaders/capsule.slang +13 -5
  264. package/src/shaders/clipStrip.generated.ts +6 -0
  265. package/src/shaders/clipStrip.js.generated.ts +22 -0
  266. package/src/shaders/clipStrip.slang +34 -0
  267. package/src/shaders/clipStrip.test.ts +39 -0
  268. package/src/shaders/colorPack.slang +5 -1
  269. package/src/shaders/colorRampLut.js.generated.ts +22 -0
  270. package/src/shaders/colorRampLut.slang +15 -1
  271. package/src/shaders/coverageBand.slang +64 -32
  272. package/src/shaders/coverageBar.generated.ts +6 -5
  273. package/src/shaders/coverageBar.glsl.generated.ts +6 -0
  274. package/src/shaders/coverageBar.iface.generated.ts +1 -1
  275. package/src/shaders/coverageBar.slang +10 -10
  276. package/src/shaders/coverageBar.wgsl.generated.ts +4 -0
  277. package/src/shaders/coverageClip.generated.ts +11 -0
  278. package/src/shaders/coverageClip.glsl.generated.ts +6 -0
  279. package/src/shaders/coverageClip.iface.generated.ts +172 -0
  280. package/src/shaders/coverageClip.slang +38 -0
  281. package/src/shaders/coverageClip.wgsl.generated.ts +4 -0
  282. package/src/shaders/coverageIndicator.generated.ts +6 -5
  283. package/src/shaders/coverageIndicator.glsl.generated.ts +6 -0
  284. package/src/shaders/coverageIndicator.iface.generated.ts +1 -1
  285. package/src/shaders/coverageIndicator.wgsl.generated.ts +4 -0
  286. package/src/shaders/coverageInterbase.generated.ts +6 -5
  287. package/src/shaders/coverageInterbase.glsl.generated.ts +6 -0
  288. package/src/shaders/coverageInterbase.iface.generated.ts +1 -1
  289. package/src/shaders/coverageInterbase.wgsl.generated.ts +4 -0
  290. package/src/shaders/coverageMod.generated.ts +6 -5
  291. package/src/shaders/coverageMod.glsl.generated.ts +6 -0
  292. package/src/shaders/coverageMod.iface.generated.ts +1 -1
  293. package/src/shaders/coverageMod.wgsl.generated.ts +4 -0
  294. package/src/shaders/coverageSnp.generated.ts +6 -5
  295. package/src/shaders/coverageSnp.glsl.generated.ts +6 -0
  296. package/src/shaders/coverageSnp.iface.generated.ts +1 -1
  297. package/src/shaders/coverageSnp.wgsl.generated.ts +4 -0
  298. package/src/shaders/curveDistance.js.generated.ts +91 -0
  299. package/src/shaders/curveDistance.slang +265 -0
  300. package/src/shaders/hpClampFloor.test.ts +87 -0
  301. package/src/shaders/hpmath.js.generated.ts +6 -2
  302. package/src/shaders/hpmath.slang +100 -48
  303. package/src/shaders/insetValueScale.test.ts +67 -0
  304. package/src/shaders/lineCenterMark.generated.ts +11 -0
  305. package/src/shaders/lineCenterMark.glsl.generated.ts +6 -0
  306. package/src/shaders/lineCenterMark.iface.generated.ts +328 -0
  307. package/src/shaders/lineCenterMark.slang +127 -0
  308. package/src/shaders/lineCenterMark.wgsl.generated.ts +4 -0
  309. package/src/shaders/lineCommon.generated.ts +6 -0
  310. package/src/shaders/lineCommon.slang +102 -0
  311. package/src/shaders/lineStepMark.generated.ts +11 -0
  312. package/src/shaders/lineStepMark.glsl.generated.ts +6 -0
  313. package/src/shaders/lineStepMark.iface.generated.ts +311 -0
  314. package/src/shaders/lineStepMark.slang +125 -0
  315. package/src/shaders/lineStepMark.wgsl.generated.ts +4 -0
  316. package/src/shaders/linkMark.consts.generated.ts +30 -0
  317. package/src/shaders/linkMark.generated.ts +12 -0
  318. package/src/shaders/linkMark.glsl.generated.ts +6 -0
  319. package/src/shaders/linkMark.iface.generated.ts +1954 -0
  320. package/src/shaders/linkMark.js.generated.ts +167 -0
  321. package/src/shaders/linkMark.slang +439 -0
  322. package/src/shaders/linkMark.wgsl.generated.ts +4 -0
  323. package/src/shaders/markColor.generated.ts +20 -0
  324. package/src/shaders/markColor.slang +128 -0
  325. package/src/shaders/pointGlyph.js.generated.ts +20 -0
  326. package/src/shaders/pointGlyph.slang +23 -7
  327. package/src/shaders/pointGlyphPad.test.ts +242 -0
  328. package/src/shaders/pointMark.consts.generated.ts +16 -0
  329. package/src/shaders/pointMark.generated.ts +12 -0
  330. package/src/shaders/pointMark.glsl.generated.ts +6 -0
  331. package/src/shaders/pointMark.iface.generated.ts +304 -0
  332. package/src/shaders/pointMark.js.generated.ts +99 -0
  333. package/src/shaders/pointMark.slang +227 -0
  334. package/src/shaders/pointMark.wgsl.generated.ts +4 -0
  335. package/src/shaders/rowRect.generated.ts +0 -2
  336. package/src/shaders/rowRect.slang +39 -58
  337. package/src/shaders/rowTable.generated.ts +4 -0
  338. package/src/shaders/rowTable.js.generated.ts +37 -0
  339. package/src/shaders/rowTable.slang +98 -0
  340. package/src/shaders/scoreScale.generated.ts +6 -0
  341. package/src/shaders/scoreScale.js.generated.ts +48 -23
  342. package/src/shaders/scoreScale.slang +49 -55
  343. package/src/shaders/sdEllipse.test.ts +211 -0
  344. package/src/shaders/spanMark.generated.ts +11 -0
  345. package/src/shaders/spanMark.glsl.generated.ts +6 -0
  346. package/src/shaders/spanMark.iface.generated.ts +289 -0
  347. package/src/shaders/spanMark.slang +77 -0
  348. package/src/shaders/spanMark.wgsl.generated.ts +4 -0
  349. package/src/shaders/valueScale.slang +26 -0
  350. package/src/shaders/wideCircleLeg.test.ts +85 -0
  351. package/esm/globalRenderingBackend.d.ts +0 -90
  352. package/esm/globalRenderingBackend.js +0 -53
  353. package/esm/keyedRenderingBackend.d.ts +0 -41
@@ -0,0 +1,304 @@
1
+ // AUTO-GENERATED by packages/shader-tools/src/shader-codegen from pointMark.slang.
2
+ // Do not edit. Run `pnpm gen:shaders` to regenerate.
3
+
4
+ import type { VertexAttributeLayout, ShaderBinding, TextureBinding } from '@jbrowse/render-core/hal'
5
+
6
+ export const BINDINGS: readonly ShaderBinding[] = [
7
+ { index: 1, kind: 'uniform', name: 'u', stages: ['vertex'] },
8
+ { index: 2, kind: 'texture', name: 'colorRamp', stages: ['vertex'] },
9
+ { index: 3, kind: 'sampler', name: 'colorRamp', stages: ['vertex'] },
10
+ { index: 4, kind: 'texture', name: 'rowTable', stages: ['vertex'] },
11
+ { index: 5, kind: 'sampler', name: 'rowTable', stages: ['vertex'] },
12
+ ]
13
+
14
+ export const VERTS_PER_INSTANCE = 6
15
+
16
+ export const UNIFORMS_SIZE_BYTES = 288
17
+
18
+ // Word indices into a Float32Array view over the uniform buffer.
19
+ export const UNIFORM_OFFSET_F32 = {
20
+ bpRangeX: 0,
21
+ canvasHeight: 3,
22
+ domainMin: 4,
23
+ domainMax: 5,
24
+ valueSymlogConstant: 7,
25
+ rampMin: 9,
26
+ rampMax: 10,
27
+ rampMidNorm: 11,
28
+ zero: 60,
29
+ viewportWidth: 61,
30
+ radiusPx: 62,
31
+ rowHeight: 63,
32
+ rowOffsetPx: 64,
33
+ insetPx: 66,
34
+ devicePixelRatio: 67,
35
+ minWidthPx: 70,
36
+ } as const
37
+
38
+ // Word indices into a Int32Array view over the uniform buffer.
39
+ export const UNIFORM_OFFSET_I32 = {
40
+ valueScaleType: 6,
41
+ rampMode: 8,
42
+ colorCutCount: 12,
43
+ reverse: 65,
44
+ rowTableKeys: 68,
45
+ rule: 69,
46
+ } as const
47
+
48
+
49
+ // Word indices of each array field’s elements, into a 4-byte-word
50
+ // view over the uniform buffer (Uint32Array or Float32Array — the
51
+ // field’s scalar type picks, same as UNIFORM_OFFSET_*). NOT
52
+ // consecutive: std140 pads every array element to 16 bytes.
53
+ export const UNIFORM_SLOT_ARRAYS = {
54
+ colorCuts: [16, 20] as const,
55
+ colorBands: [24, 28, 32, 36, 40, 44, 48, 52, 56] as const,
56
+ } as const
57
+
58
+ // Element `i` of the `colorCuts` uniform array (4 components).
59
+ export function setUniformColorCuts(
60
+ f32: Float32Array,
61
+ i: number,
62
+ v0: number,
63
+ v1: number,
64
+ v2: number,
65
+ v3: number,
66
+ ) {
67
+ const o = UNIFORM_SLOT_ARRAYS.colorCuts[i]!
68
+ f32[o] = v0
69
+ f32[o + 1] = v1
70
+ f32[o + 2] = v2
71
+ f32[o + 3] = v3
72
+ }
73
+
74
+ // Element `i` of the `colorBands` uniform array (4 components).
75
+ export function setUniformColorBands(
76
+ f32: Float32Array,
77
+ i: number,
78
+ v0: number,
79
+ v1: number,
80
+ v2: number,
81
+ v3: number,
82
+ ) {
83
+ const o = UNIFORM_SLOT_ARRAYS.colorBands[i]!
84
+ f32[o] = v0
85
+ f32[o + 1] = v1
86
+ f32[o + 2] = v2
87
+ f32[o + 3] = v3
88
+ }
89
+
90
+
91
+ export interface Uniforms {
92
+ bpRangeX: [number, number, number]
93
+ canvasHeight: number
94
+ domainMin: number
95
+ domainMax: number
96
+ valueScaleType: number
97
+ valueSymlogConstant: number
98
+ rampMode: number
99
+ rampMin: number
100
+ rampMax: number
101
+ rampMidNorm: number
102
+ colorCutCount: number
103
+ colorCuts: [[number, number, number, number], [number, number, number, number]]
104
+ colorBands: [[number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number]]
105
+ zero: number
106
+ viewportWidth: number
107
+ radiusPx: number
108
+ rowHeight: number
109
+ rowOffsetPx: number
110
+ reverse: number
111
+ insetPx: number
112
+ devicePixelRatio: number
113
+ rowTableKeys: number
114
+ rule: number
115
+ minWidthPx: number
116
+ }
117
+
118
+ export function writeUniforms(buf: ArrayBuffer, uniforms: Uniforms) {
119
+ const f32 = new Float32Array(buf)
120
+ const i32 = new Int32Array(buf)
121
+ f32[0] = uniforms.bpRangeX[0]
122
+ f32[1] = uniforms.bpRangeX[1]
123
+ f32[2] = uniforms.bpRangeX[2]
124
+ f32[3] = uniforms.canvasHeight
125
+ f32[4] = uniforms.domainMin
126
+ f32[5] = uniforms.domainMax
127
+ i32[6] = uniforms.valueScaleType
128
+ f32[7] = uniforms.valueSymlogConstant
129
+ i32[8] = uniforms.rampMode
130
+ f32[9] = uniforms.rampMin
131
+ f32[10] = uniforms.rampMax
132
+ f32[11] = uniforms.rampMidNorm
133
+ i32[12] = uniforms.colorCutCount
134
+ f32[16] = uniforms.colorCuts[0][0]
135
+ f32[17] = uniforms.colorCuts[0][1]
136
+ f32[18] = uniforms.colorCuts[0][2]
137
+ f32[19] = uniforms.colorCuts[0][3]
138
+ f32[20] = uniforms.colorCuts[1][0]
139
+ f32[21] = uniforms.colorCuts[1][1]
140
+ f32[22] = uniforms.colorCuts[1][2]
141
+ f32[23] = uniforms.colorCuts[1][3]
142
+ f32[24] = uniforms.colorBands[0][0]
143
+ f32[25] = uniforms.colorBands[0][1]
144
+ f32[26] = uniforms.colorBands[0][2]
145
+ f32[27] = uniforms.colorBands[0][3]
146
+ f32[28] = uniforms.colorBands[1][0]
147
+ f32[29] = uniforms.colorBands[1][1]
148
+ f32[30] = uniforms.colorBands[1][2]
149
+ f32[31] = uniforms.colorBands[1][3]
150
+ f32[32] = uniforms.colorBands[2][0]
151
+ f32[33] = uniforms.colorBands[2][1]
152
+ f32[34] = uniforms.colorBands[2][2]
153
+ f32[35] = uniforms.colorBands[2][3]
154
+ f32[36] = uniforms.colorBands[3][0]
155
+ f32[37] = uniforms.colorBands[3][1]
156
+ f32[38] = uniforms.colorBands[3][2]
157
+ f32[39] = uniforms.colorBands[3][3]
158
+ f32[40] = uniforms.colorBands[4][0]
159
+ f32[41] = uniforms.colorBands[4][1]
160
+ f32[42] = uniforms.colorBands[4][2]
161
+ f32[43] = uniforms.colorBands[4][3]
162
+ f32[44] = uniforms.colorBands[5][0]
163
+ f32[45] = uniforms.colorBands[5][1]
164
+ f32[46] = uniforms.colorBands[5][2]
165
+ f32[47] = uniforms.colorBands[5][3]
166
+ f32[48] = uniforms.colorBands[6][0]
167
+ f32[49] = uniforms.colorBands[6][1]
168
+ f32[50] = uniforms.colorBands[6][2]
169
+ f32[51] = uniforms.colorBands[6][3]
170
+ f32[52] = uniforms.colorBands[7][0]
171
+ f32[53] = uniforms.colorBands[7][1]
172
+ f32[54] = uniforms.colorBands[7][2]
173
+ f32[55] = uniforms.colorBands[7][3]
174
+ f32[56] = uniforms.colorBands[8][0]
175
+ f32[57] = uniforms.colorBands[8][1]
176
+ f32[58] = uniforms.colorBands[8][2]
177
+ f32[59] = uniforms.colorBands[8][3]
178
+ f32[60] = uniforms.zero
179
+ f32[61] = uniforms.viewportWidth
180
+ f32[62] = uniforms.radiusPx
181
+ f32[63] = uniforms.rowHeight
182
+ f32[64] = uniforms.rowOffsetPx
183
+ i32[65] = uniforms.reverse
184
+ f32[66] = uniforms.insetPx
185
+ f32[67] = uniforms.devicePixelRatio
186
+ i32[68] = uniforms.rowTableKeys
187
+ i32[69] = uniforms.rule
188
+ f32[70] = uniforms.minWidthPx
189
+ }
190
+
191
+ export const INSTANCE_STRIDE_BYTES = 24
192
+ export const INSTANCE_STRIDE_WORDS = 6
193
+
194
+ // Word indices into a Float32Array view over the instance buffer.
195
+ export const INSTANCE_OFFSET_F32 = {
196
+ y: 2,
197
+ } as const
198
+
199
+ // Word indices into a Uint32Array view over the instance buffer.
200
+ export const INSTANCE_OFFSET_U32 = {
201
+ x: 0,
202
+ x2: 1,
203
+ color: 3,
204
+ glyph: 4,
205
+ row: 5,
206
+ } as const
207
+
208
+ export const VERTEX_ATTRIBUTES: readonly VertexAttributeLayout[] = [
209
+ { name: 'a_x', components: 1, type: 'uint', offsetBytes: 0, integer: true },
210
+ { name: 'a_x2', components: 1, type: 'uint', offsetBytes: 4, integer: true },
211
+ { name: 'a_y', components: 1, type: 'float', offsetBytes: 8, integer: false },
212
+ { name: 'a_color', components: 1, type: 'uint', offsetBytes: 12, integer: true },
213
+ { name: 'a_glyph', components: 1, type: 'uint', offsetBytes: 16, integer: true },
214
+ { name: 'a_row', components: 1, type: 'uint', offsetBytes: 20, integer: true },
215
+ ]
216
+
217
+ export interface InstanceArrays {
218
+ x: ArrayLike<number>
219
+ x2: ArrayLike<number>
220
+ y: ArrayLike<number>
221
+ color: ArrayLike<number>
222
+ glyph: ArrayLike<number>
223
+ row: ArrayLike<number>
224
+ }
225
+
226
+ export function packInstances(
227
+ arrays: InstanceArrays,
228
+ numInstances: number,
229
+ buf: ArrayBuffer = new ArrayBuffer(numInstances * INSTANCE_STRIDE_BYTES),
230
+ ) {
231
+ const f32 = new Float32Array(buf)
232
+ const u32 = new Uint32Array(buf)
233
+ const { x, x2, y, color, glyph, row } = arrays
234
+ for (let i = 0; i < numInstances; i++) {
235
+ const o = i * INSTANCE_STRIDE_WORDS
236
+ u32[o + 0] = x[i]!
237
+ u32[o + 1] = x2[i]!
238
+ f32[o + 2] = y[i]!
239
+ u32[o + 3] = color[i]!
240
+ u32[o + 4] = glyph[i]!
241
+ u32[o + 5] = row[i]!
242
+ }
243
+ return buf
244
+ }
245
+
246
+ // Instance `i`'s `x`.
247
+ export function getInstanceX(u32: Uint32Array, i: number) {
248
+ return u32[i * INSTANCE_STRIDE_WORDS]!
249
+ }
250
+
251
+ export function setInstanceX(u32: Uint32Array, i: number, v: number) {
252
+ u32[i * INSTANCE_STRIDE_WORDS] = v
253
+ }
254
+
255
+ // Instance `i`'s `x2`.
256
+ export function getInstanceX2(u32: Uint32Array, i: number) {
257
+ return u32[i * INSTANCE_STRIDE_WORDS + 1]!
258
+ }
259
+
260
+ export function setInstanceX2(u32: Uint32Array, i: number, v: number) {
261
+ u32[i * INSTANCE_STRIDE_WORDS + 1] = v
262
+ }
263
+
264
+ // Instance `i`'s `y`.
265
+ export function getInstanceY(f32: Float32Array, i: number) {
266
+ return f32[i * INSTANCE_STRIDE_WORDS + 2]!
267
+ }
268
+
269
+ export function setInstanceY(f32: Float32Array, i: number, v: number) {
270
+ f32[i * INSTANCE_STRIDE_WORDS + 2] = v
271
+ }
272
+
273
+ // Instance `i`'s `color`.
274
+ export function getInstanceColor(u32: Uint32Array, i: number) {
275
+ return u32[i * INSTANCE_STRIDE_WORDS + 3]!
276
+ }
277
+
278
+ export function setInstanceColor(u32: Uint32Array, i: number, v: number) {
279
+ u32[i * INSTANCE_STRIDE_WORDS + 3] = v
280
+ }
281
+
282
+ // Instance `i`'s `glyph`.
283
+ export function getInstanceGlyph(u32: Uint32Array, i: number) {
284
+ return u32[i * INSTANCE_STRIDE_WORDS + 4]!
285
+ }
286
+
287
+ export function setInstanceGlyph(u32: Uint32Array, i: number, v: number) {
288
+ u32[i * INSTANCE_STRIDE_WORDS + 4] = v
289
+ }
290
+
291
+ // Instance `i`'s `row`.
292
+ export function getInstanceRow(u32: Uint32Array, i: number) {
293
+ return u32[i * INSTANCE_STRIDE_WORDS + 5]!
294
+ }
295
+
296
+ export function setInstanceRow(u32: Uint32Array, i: number, v: number) {
297
+ u32[i * INSTANCE_STRIDE_WORDS + 5] = v
298
+ }
299
+
300
+ // Combined `Sampler2D` bindings. Texture unit indices start at 0.
301
+ export const TEXTURES: readonly [TextureBinding, ...TextureBinding[]] = [
302
+ { name: 'colorRamp', glTextureUnit: 0, glUniformName: 'u_colorRamp', filter: 'linear' },
303
+ { name: 'rowTable', glTextureUnit: 1, glUniformName: 'u_rowTable', filter: 'nearest' },
304
+ ]
@@ -0,0 +1,99 @@
1
+ // AUTO-GENERATED by packages/shader-tools/src/shader-codegen from pointMark.slang.
2
+ // Do not edit. Run `pnpm gen:shaders` to regenerate.
3
+
4
+ // Scalar twins of pointMark.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 _clamp(x: number, lo: number, hi: number) {
8
+ return _min(_max(x, lo), hi)
9
+ }
10
+
11
+ function _max(a: number, b: number) {
12
+ return b > a || Number.isNaN(a) ? b : a
13
+ }
14
+
15
+ function _min(a: number, b: number) {
16
+ return b < a || Number.isNaN(a) ? b : a
17
+ }
18
+
19
+ function log1pf(x: number): number {
20
+ let u = (1.0 + x)
21
+ let _t0: number
22
+ if ((u == 1.0)) {
23
+ _t0 = x
24
+ } else {
25
+ _t0 = (Math.log(u) * (x / (u - 1.0)))
26
+ }
27
+ return _t0
28
+ }
29
+
30
+ function symlogTransform(x: number, c: number): number {
31
+ return ((((Math.sign(x)) | 0)) * log1pf(Math.abs((x / c))))
32
+ }
33
+
34
+ function normalizeScoreUnclamped(score: number, domainMin: number, domainMax: number, scaleType: number, symlogConstant: number): number {
35
+ let tMax: number
36
+ let tMin: number
37
+ let t: number
38
+ if ((scaleType == 2)) {
39
+ let _t0 = symlogTransform(score, symlogConstant)
40
+ let _t1 = symlogTransform(domainMin, symlogConstant)
41
+ tMax = symlogTransform(domainMax, symlogConstant)
42
+ tMin = _t1
43
+ t = _t0
44
+ } else {
45
+ if ((scaleType == 1)) {
46
+ if ((domainMin > 0.0)) {
47
+ tMax = domainMin
48
+ } else {
49
+ tMax = 1.0
50
+ }
51
+ let _t2 = Math.log2(_max(score, tMax))
52
+ let _t3 = Math.log2(tMax)
53
+ tMax = Math.log2(_max(domainMax, tMax))
54
+ tMin = _t3
55
+ t = _t2
56
+ } else {
57
+ tMax = domainMax
58
+ tMin = domainMin
59
+ t = score
60
+ }
61
+ }
62
+ let tRange = (tMax - tMin)
63
+ if ((tRange <= 0.0)) {
64
+ if ((t > tMin)) {
65
+ tMax = 1.0
66
+ } else {
67
+ tMax = 0.0
68
+ }
69
+ return tMax
70
+ }
71
+ return ((t - tMin) / tRange)
72
+ }
73
+
74
+ function normalizeScore(score: number, domainMin: number, domainMax: number, scaleType: number, symlogConstant: number): number {
75
+ return _clamp(normalizeScoreUnclamped(score, domainMin, domainMax, scaleType, symlogConstant), 0.0, 1.0)
76
+ }
77
+
78
+ export function valueToYPxScaled(value: number, domainMin: number, domainMax: number, h: number, scaleType: number, symlogConstant: number): number {
79
+ return ((1.0 - normalizeScore(value, domainMin, domainMax, scaleType, symlogConstant)) * h)
80
+ }
81
+
82
+ function insetValueYPx(value: number, domainMin: number, domainMax: number, h: number, scaleType: number, insetPx: number, symlogConstant: number): number {
83
+ let _t0 = _min(insetPx, (h * 0.5))
84
+ return (_t0 + valueToYPxScaled(value, domainMin, domainMax, (h - (2.0 * _t0)), scaleType, symlogConstant))
85
+ }
86
+
87
+ export function pointYPx(value: number, domainMin: number, domainMax: number, h: number, scaleType: number, insetPx: number, symlogConstant: number): number {
88
+ return insetValueYPx(value, domainMin, domainMax, h, scaleType, insetPx, symlogConstant)
89
+ }
90
+
91
+ export function pointRowYPx(bandTop: number, h: number, reverse: number, valueYPx: number): number {
92
+ let _t0: number
93
+ if ((reverse != 0)) {
94
+ _t0 = (h - valueYPx)
95
+ } else {
96
+ _t0 = valueYPx
97
+ }
98
+ return (bandTop + _t0)
99
+ }
@@ -0,0 +1,227 @@
1
+ // The `point` and `rule` shapes, at a y read off a per-instance value through
2
+ // `valueScale`. A point is one glyph at the centre of its x..x2 extent, the
3
+ // glyph channel picking a disc, an inverted triangle, a diamond or a square. A
4
+ // rule (`u.rule`) is a bar across the extent, `2 * radiusPx` thick and at least
5
+ // `minWidthPx` wide.
6
+ //
7
+ // Each is a 6-vertex quad; the fragment shader carves the glyph.
8
+ //
9
+ // `row` is read through the bound row table, as `spanMark` reads it: a key
10
+ // resolved to its band and colour, or dropped off clip space where the table
11
+ // hides it. A pass binding no table (`rowTableKeys` −1) draws `row` as the band.
12
+ //! targets: wgsl, glsl
13
+ //! export-consts: DIAMOND_GLYPH_SCALE, DIAMOND_MITER_REACHES, TRIANGLE_MITER_REACHES, GLYPH_DISC, GLYPH_TRIANGLE, GLYPH_DIAMOND, GLYPH_SQUARE
14
+ //! js-export: valueToYPxScaled, pointYPx, pointRowYPx
15
+ // `valueScale`'s twin is lifted here, once, for the bar shape too.
16
+
17
+ import antialias;
18
+ import hpmath;
19
+ import colorPack;
20
+ import markColor;
21
+ import pointGlyph;
22
+ import rowTable;
23
+ import valueScale;
24
+
25
+ public static const uint VERTS_PER_INSTANCE = 6u;
26
+
27
+ struct PointMarkInstance {
28
+ uint x : ATTR0;
29
+ uint x2 : ATTR1;
30
+ float y : ATTR2;
31
+ uint color : ATTR3;
32
+ uint glyph : ATTR4;
33
+ uint row : ATTR5;
34
+ };
35
+
36
+ struct Uniforms {
37
+ float3 bpRangeX;
38
+ float canvasHeight;
39
+ float domainMin;
40
+ float domainMax;
41
+ // `scoreScale`'s scale-type vocabulary, for the declared y scale.
42
+ int valueScaleType;
43
+ // Already resolved from the domain (`resolveSymlogConstant`); read by symlog alone.
44
+ float valueSymlogConstant;
45
+ // `markColor`'s: 0 packs the instance's colour, 1 and 2 read its slot as a
46
+ // value through the ramp below.
47
+ int rampMode;
48
+ float rampMin;
49
+ float rampMax;
50
+ float rampMidNorm;
51
+ // `markColor`'s threshold: how many cuts are in use, the cuts four to a
52
+ // vector, and the colour of each interval between them.
53
+ int colorCutCount;
54
+ float4 colorCuts[2];
55
+ float4 colorBands[MAX_COLOR_BANDS];
56
+ float zero;
57
+ float viewportWidth;
58
+ float radiusPx;
59
+ // CSS px per row band, the value scale ruling each on its own; the canvas
60
+ // height where every instance is on row 0 (ADR-126).
61
+ float rowHeight;
62
+ float rowOffsetPx;
63
+ // Whether the domain's minimum sits at the band's top.
64
+ int reverse;
65
+ // Ends of the value range, inset by `glyphPaint`'s `pointInsetPx` where the
66
+ // display wants its edge glyphs whole; 0 centres a point on the plot's edge.
67
+ float insetPx;
68
+ // Read by the glyph pad alone; every other length in this block is CSS px.
69
+ float devicePixelRatio;
70
+ int rowTableKeys;
71
+ int rule;
72
+ float minWidthPx;
73
+ };
74
+ [[vk::binding(1, 0)]] ConstantBuffer<Uniforms> u;
75
+ [[vk::binding(2, 0)]] Sampler2D<float4> colorRamp;
76
+ [[vk::binding(4, 0)]] Sampler2D<float4> rowTable;
77
+
78
+ float bpToClipX(uint bp, Uniforms u) {
79
+ return hpToClipX(hpSplitUint(bp), u.bpRangeX, u.zero);
80
+ }
81
+
82
+ struct VsOut {
83
+ float4 position : SV_Position;
84
+ float4 color : COLOR0;
85
+ float2 localPos : TEXCOORD0;
86
+ // Shape discriminator passed to the fragment shader: 0 = disc, 1 = diamond,
87
+ // 2 = inverted triangle, 3 = solid fill.
88
+ nointerpolation float shape : TEXCOORD1;
89
+ };
90
+
91
+ // Shape discriminators for the fragment shader. SMALL_POINT_MAX_DIAMETER and
92
+ // the disc SDF come from the shared pointGlyph module so they stay in lockstep
93
+ // with wiggle.slang.
94
+ static const float SHAPE_DISC = 0.0;
95
+ static const float SHAPE_DIAMOND = 1.0;
96
+ static const float SHAPE_TRI = 2.0;
97
+ // >2.5 in the fragment shader = flat solid fill (a rule, or the tiny square).
98
+ static const float SHAPE_BAR = 3.0;
99
+ // 1/sqrt(5): normalizes the two slanted edges of the inverted triangle so the
100
+ // edge functions read as true perpendicular distances for antialiasing.
101
+ static const float INV_SQRT5 = 0.4472136;
102
+ // The diamond is the shape's "singled out" glyph and draws visibly larger than
103
+ // the others, so it reads as the one that matters at a glance rather than as a
104
+ // colour swap. LocusZoom's lead-SNP convention, generalized.
105
+ static const float DIAMOND_GLYPH_SCALE = 1.6;
106
+
107
+ // How far past its boundary each glyph still inks where its quad binds, in ramp
108
+ // reaches. The disc's ramp is isotropic, so one. The diamond's quad binds on
109
+ // the four axes, where two L1 facets miter at a right angle: sqrt(2). The
110
+ // triangle's binds at its apex, where the two slanted edges miter much more
111
+ // sharply: sqrt(5), and padding one reach there cut the apex at alpha 0.276.
112
+ static const float DIAMOND_MITER_REACHES = 1.4142136;
113
+ static const float TRIANGLE_MITER_REACHES = 2.2360680;
114
+
115
+ // The shape's own anchor, the top of its row band. The vertex branch, the
116
+ // Canvas2D painter, the ink box and the hit test all read a value's y here.
117
+ float pointYPx(float value, float domainMin, float domainMax, float h, int scaleType, float insetPx, float symlogConstant) {
118
+ return insetValueYPx(value, domainMin, domainMax, h, scaleType, insetPx, symlogConstant);
119
+ }
120
+
121
+ // A value's canvas y in the row band starting at `bandTop`, `h` tall, from
122
+ // its `pointYPx`: mirrored within the band under a reversed scale.
123
+ public float pointRowYPx(float bandTop, float h, int reverse, float valueYPx) {
124
+ return bandTop + (reverse != 0 ? h - valueYPx : valueYPx);
125
+ }
126
+
127
+ // The glyph channel's values. The numbering is a contract between whatever
128
+ // packs the channel, the Canvas2D painter and the branches below, so it is
129
+ // authored once here and `//! export-consts`ed.
130
+ static const uint GLYPH_DISC = 0u;
131
+ static const uint GLYPH_TRIANGLE = 1u;
132
+ static const uint GLYPH_DIAMOND = 2u;
133
+ // A pixel-snapped filled square at any size, the small disc's crisp form.
134
+ static const uint GLYPH_SQUARE = 3u;
135
+
136
+ [shader("vertex")]
137
+ VsOut vs_main(PointMarkInstance inst, uint vid : SV_VertexID) {
138
+ uint v = vid % 6u;
139
+
140
+ // Two-triangle quad corner (0/1 per axis); shared with the whole fleet.
141
+ float2 q = quadLocal(v);
142
+ float2 local = q * 2.0 - 1.0;
143
+ bool xZero = q.x < 0.5;
144
+
145
+ VsOut o;
146
+ RowPlacement place = rowTableLookup(rowTable, inst.row, u.rowTableKeys,
147
+ markScaleColor(colorRamp, inst.color, u.rampMode, u.rampMin, u.rampMax, u.rampMidNorm, u.colorCutCount, u.colorCuts[0], u.colorCuts[1], u.colorBands));
148
+ if (place.hidden) {
149
+ o.position = float4(2.0, 2.0, 0.0, 1.0);
150
+ o.color = float4(0.0);
151
+ o.localPos = float2(0.0);
152
+ o.shape = SHAPE_BAR;
153
+ return o;
154
+ }
155
+
156
+ float startClipX = bpToClipX(inst.x, u);
157
+ float endClipX = bpToClipX(inst.x2, u);
158
+ float yPx = pointRowYPx(rowBandTopPx(u.rowOffsetPx, u.rowHeight, place.slot), u.rowHeight, u.reverse, pointYPx(inst.y, u.domainMin, u.domainMax, u.rowHeight, u.valueScaleType, u.insetPx, u.valueSymlogConstant));
159
+ float centerClipY = yPxToClipY(yPx, u.canvasHeight);
160
+
161
+ o.color = place.color;
162
+ float centerClipX = (startClipX + endClipX) * 0.5;
163
+ if (u.rule != 0) {
164
+ float farClipX = extendToMinWidthX(startClipX, endClipX, u.minWidthPx, u.viewportWidth);
165
+ float x = xZero ? min(startClipX, farClipX) : max(startClipX, farClipX);
166
+ float y = centerClipY + pxToClipLen(local.y * u.radiusPx, u.canvasHeight);
167
+ o.position = float4(x, y, 0.0, 1.0);
168
+ o.localPos = local;
169
+ o.shape = SHAPE_BAR;
170
+ } else if (inst.glyph == GLYPH_SQUARE || (inst.glyph == GLYPH_DISC && u.radiusPx * 2.0 <= SMALL_POINT_MAX_DIAMETER)) {
171
+ // tiny disc: pixel-snapped crisp filled square (no AA disc). The triangle
172
+ // and the diamond keep their distinct marker even when small.
173
+ float diamPx = u.radiusPx * 2.0;
174
+ o.position = crispSquareCornerClip(centerClipX, yPx, diamPx, q,
175
+ u.viewportWidth, u.canvasHeight);
176
+ o.localPos = local;
177
+ o.shape = SHAPE_BAR;
178
+ } else {
179
+ bool diamond = inst.glyph == GLYPH_DIAMOND;
180
+ float unitPx = u.radiusPx * (diamond ? DIAMOND_GLYPH_SCALE : 1.0);
181
+ float reaches = inst.glyph == GLYPH_TRIANGLE ? TRIANGLE_MITER_REACHES
182
+ : (diamond ? DIAMOND_MITER_REACHES : 1.0);
183
+ float expand = glyphExpand(unitPx, reaches, u.devicePixelRatio);
184
+ float halfPx = unitPx * expand;
185
+ float dx = pxToClipLen(local.x * halfPx, u.viewportWidth);
186
+ float dy = pxToClipLen(local.y * halfPx, u.canvasHeight);
187
+ o.position = float4(centerClipX + dx, centerClipY + dy, 0.0, 1.0);
188
+ o.localPos = local * expand;
189
+ o.shape = inst.glyph == GLYPH_TRIANGLE ? SHAPE_TRI
190
+ : (inst.glyph == GLYPH_DIAMOND ? SHAPE_DIAMOND : SHAPE_DISC);
191
+ }
192
+ return o;
193
+ }
194
+
195
+ [shader("fragment")]
196
+ float4 fs_main(VsOut fragIn) : SV_Target {
197
+ // Each glyph only picks its SDF here; the AA derivative is taken once after
198
+ // the branch, because WGSL rejects a derivative under a branch on a varying
199
+ // ("must only be called from uniform control flow"). shape is constant per
200
+ // primitive, so the shared ramp is exact.
201
+ float2 p = fragIn.localPos;
202
+ float coverage;
203
+ if (fragIn.shape > 2.5) {
204
+ // Extent bar: solid fill, no marker AA. A constant SDF has zero gradient,
205
+ // so the ramp below saturates to alpha 1.
206
+ coverage = 1.0;
207
+ } else if (fragIn.shape > 1.5) {
208
+ // Inverted triangle: top edge (-1,1)-(1,1), apex (0,-1). Each edge's signed
209
+ // distance is positive inside; the min is the SDF used for the AA fade.
210
+ float dTop = 1.0 - p.y;
211
+ float dLeft = (2.0 * p.x + p.y + 1.0) * INV_SQRT5;
212
+ float dRight = (-2.0 * p.x + p.y + 1.0) * INV_SQRT5;
213
+ coverage = min(dTop, min(dLeft, dRight));
214
+ } else if (fragIn.shape > 0.5) {
215
+ // Diamond (rhombus): L1-norm distance from center, positive inside, zero at
216
+ // the four edges.
217
+ coverage = 1.0 - (abs(p.x) + abs(p.y));
218
+ } else {
219
+ coverage = discCoverage(p);
220
+ }
221
+ // One output pixel of ramp, from the SDF's own gradient — which is what lets
222
+ // the four shapes above share a single line despite the diamond's L1 norm
223
+ // carrying a sqrt(2) the others don't. See antialias.slang's glyphEdgeAlpha.
224
+ float alpha = glyphEdgeAlpha(coverage);
225
+ if (alpha <= 0.0) discard;
226
+ return float4(fragIn.color.rgb, fragIn.color.a * alpha);
227
+ }
@@ -0,0 +1,4 @@
1
+ // AUTO-GENERATED by packages/shader-tools/src/shader-codegen from pointMark.slang.
2
+ // Do not edit. Run `pnpm gen:shaders` to regenerate.
3
+
4
+ export const WGSL_SOURCE = "struct Uniforms_std140_0\n{\n @align(16) bpRangeX_0 : vec3<f32>,\n @align(4) canvasHeight_0 : f32,\n @align(16) domainMin_0 : f32,\n @align(4) domainMax_0 : f32,\n @align(8) valueScaleType_0 : i32,\n @align(4) valueSymlogConstant_0 : f32,\n @align(16) rampMode_0 : i32,\n @align(4) rampMin_0 : f32,\n @align(8) rampMax_0 : f32,\n @align(4) rampMidNorm_0 : f32,\n @align(16) colorCutCount_0 : i32,\n @align(16) colorCuts_0 : array<vec4<f32>, i32(2)>,\n @align(16) colorBands_0 : array<vec4<f32>, i32(9)>,\n @align(16) zero_0 : f32,\n @align(4) viewportWidth_0 : f32,\n @align(8) radiusPx_0 : f32,\n @align(4) rowHeight_0 : f32,\n @align(16) rowOffsetPx_0 : f32,\n @align(4) reverse_0 : i32,\n @align(8) insetPx_0 : f32,\n @align(4) devicePixelRatio_0 : f32,\n @align(16) rowTableKeys_0 : i32,\n @align(4) rule_0 : i32,\n @align(8) minWidthPx_0 : f32,\n};\n\n@binding(1) @group(0) var<uniform> u_0 : Uniforms_std140_0;\n@binding(2) @group(0) var colorRamp_texture_0 : texture_2d<f32>;\n\n@binding(3) @group(0) var colorRamp_sampler_0 : sampler;\n\n@binding(4) @group(0) var rowTable_texture_0 : texture_2d<f32>;\n\n@binding(5) @group(0) var rowTable_sampler_0 : sampler;\n\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 unpackRGBA_0( c_0 : u32) -> vec4<f32>\n{\n return vec4<f32>(f32((((c_0 >> (u32(0)))) & (u32(255)))), f32((((c_0 >> (u32(8)))) & (u32(255)))), f32((((c_0 >> (u32(16)))) & (u32(255)))), f32((((c_0 >> (u32(24)))) & (u32(255))))) / vec4<f32>(255.0f);\n}\n\nfn rampMidT_0( t_0 : f32, mid_0 : f32) -> f32\n{\n var _S5 : f32 = max(mid_0, 1.0f - mid_0);\n return clamp((t_0 + (_S5 - mid_0)) / (2.0f * _S5), 0.0f, 1.0f);\n}\n\nfn rampColor_0( ramp_texture_0 : texture_2d<f32>, ramp_sampler_0 : sampler, t_1 : f32) -> vec4<f32>\n{\n return (textureSampleLevel((ramp_texture_0), (ramp_sampler_0), (vec2<f32>((clamp(t_1, 0.0f, 1.0f) * 255.0f + 0.5f) / 256.0f, 0.5f)), (0.0f)));\n}\n\nfn colorCutAt_0( i_0 : i32, cutsLo_0 : vec4<f32>, cutsHi_0 : vec4<f32>) -> f32\n{\n var _S6 : f32;\n if(i_0 < i32(4))\n {\n _S6 = cutsLo_0[i_0];\n }\n else\n {\n _S6 = cutsHi_0[i_0 - i32(4)];\n }\n return _S6;\n}\n\nfn thresholdBand_0( value_0 : f32, cutCount_0 : i32, cutsLo_1 : vec4<f32>, cutsHi_1 : vec4<f32>) -> i32\n{\n var band_0 : i32 = i32(0);\n var i_1 : i32 = i32(0);\n for(;;)\n {\n if(i_1 < cutCount_0)\n {\n }\n else\n {\n break;\n }\n if(value_0 >= (colorCutAt_0(i_1, cutsLo_1, cutsHi_1)))\n {\n band_0 = i_1 + i32(1);\n }\n i_1 = i_1 + i32(1);\n }\n return band_0;\n}\n\nfn log1pf_0( x_0 : f32) -> f32\n{\n var u_1 : f32 = 1.0f + x_0;\n var _S7 : f32;\n if(u_1 == 1.0f)\n {\n _S7 = x_0;\n }\n else\n {\n _S7 = log(u_1) * (x_0 / (u_1 - 1.0f));\n }\n return _S7;\n}\n\nfn symlogTransform_0( x_1 : f32, c_1 : f32) -> f32\n{\n return f32((i32(sign((x_1))))) * log1pf_0(abs(x_1 / c_1));\n}\n\nfn normalizeScoreUnclamped_0( score_0 : f32, domainMin_1 : f32, domainMax_1 : f32, scaleType_0 : i32, symlogConstant_0 : f32) -> f32\n{\n var tMax_0 : f32;\n var tMin_0 : f32;\n var t_2 : f32;\n if(scaleType_0 == i32(2))\n {\n var _S8 : f32 = symlogTransform_0(score_0, symlogConstant_0);\n var _S9 : f32 = symlogTransform_0(domainMin_1, symlogConstant_0);\n tMax_0 = symlogTransform_0(domainMax_1, symlogConstant_0);\n tMin_0 = _S9;\n t_2 = _S8;\n }\n else\n {\n if(scaleType_0 == i32(1))\n {\n if(domainMin_1 > 0.0f)\n {\n tMax_0 = domainMin_1;\n }\n else\n {\n tMax_0 = 1.0f;\n }\n var _S10 : f32 = log2(max(score_0, tMax_0));\n var _S11 : f32 = log2(tMax_0);\n tMax_0 = log2(max(domainMax_1, tMax_0));\n tMin_0 = _S11;\n t_2 = _S10;\n }\n else\n {\n tMax_0 = domainMax_1;\n tMin_0 = domainMin_1;\n t_2 = score_0;\n }\n }\n var tRange_0 : f32 = tMax_0 - tMin_0;\n if(tRange_0 <= 0.0f)\n {\n if(t_2 > tMin_0)\n {\n tMax_0 = 1.0f;\n }\n else\n {\n tMax_0 = 0.0f;\n }\n return tMax_0;\n }\n return (t_2 - tMin_0) / tRange_0;\n}\n\nfn normalizeScore_0( score_1 : f32, domainMin_2 : f32, domainMax_2 : f32, scaleType_1 : i32, symlogConstant_1 : f32) -> f32\n{\n return clamp(normalizeScoreUnclamped_0(score_1, domainMin_2, domainMax_2, scaleType_1, symlogConstant_1), 0.0f, 1.0f);\n}\n\nfn rowTableWidth_0( keys_0 : u32) -> u32\n{\n return max(min(keys_0, u32(2048)), u32(1));\n}\n\nfn rowTablePlaneHeight_0( keys_1 : u32) -> u32\n{\n var w_0 : u32 = rowTableWidth_0(keys_1);\n var _S12 : u32 = (keys_1 + w_0 - u32(1)) / w_0;\n return max(_S12, u32(1));\n}\n\nfn rowTableTexelX_0( key_0 : u32, keys_2 : u32) -> u32\n{\n var _S13 : u32 = key_0 % rowTableWidth_0(keys_2);\n return _S13;\n}\n\nfn rowTableTexelY_0( key_1 : u32, keys_3 : u32) -> u32\n{\n var _S14 : u32 = key_1 / rowTableWidth_0(keys_3);\n return _S14;\n}\n\nfn byteOf_0( channel_0 : f32) -> u32\n{\n return u32(channel_0 * 255.0f + 0.5f);\n}\n\nstruct RowPlacement_0\n{\n hidden_0 : bool,\n slot_0 : u32,\n color_0 : vec4<f32>,\n};\n\nfn rowTableLookup_0( table_texture_0 : texture_2d<f32>, table_sampler_0 : sampler, key_2 : u32, keys_4 : i32, own_0 : vec4<f32>) -> RowPlacement_0\n{\n var p_0 : RowPlacement_0;\n p_0.hidden_0 = false;\n p_0.slot_0 = key_2;\n p_0.color_0 = own_0;\n if(keys_4 < i32(0))\n {\n return p_0;\n }\n var n_0 : u32 = u32(keys_4);\n if(key_2 >= n_0)\n {\n p_0.hidden_0 = true;\n return p_0;\n }\n var h_0 : u32 = rowTablePlaneHeight_0(n_0);\n var _S15 : u32 = rowTableTexelX_0(key_2, n_0);\n var u_2 : f32 = (f32(_S15) + 0.5f) / f32(rowTableWidth_0(n_0));\n var rows_0 : f32 = f32(u32(2) * h_0);\n var y_0 : u32 = rowTableTexelY_0(key_2, n_0);\n var _S16 : vec4<f32> = (textureSampleLevel((table_texture_0), (table_sampler_0), (vec2<f32>(u_2, (f32(y_0) + 0.5f) / rows_0)), (0.0f)));\n if((_S16.w) < 0.5f)\n {\n p_0.hidden_0 = true;\n return p_0;\n }\n p_0.slot_0 = ((((byteOf_0(_S16.x)) | ((((byteOf_0(_S16.y)) << (u32(8))))))) | ((((byteOf_0(_S16.z)) << (u32(16))))));\n var _S17 : vec4<f32> = (textureSampleLevel((table_texture_0), (table_sampler_0), (vec2<f32>(u_2, (f32(y_0 + h_0) + 0.5f) / rows_0)), (0.0f)));\n var _S18 : vec4<f32>;\n if((_S17.w) > 0.0f)\n {\n _S18 = _S17;\n }\n else\n {\n _S18 = own_0;\n }\n p_0.color_0 = _S18;\n return p_0;\n}\n\nfn hpSplitUint_0( value_1 : u32) -> vec2<f32>\n{\n var lo_0 : u32 = (value_1 & (u32(4095)));\n return vec2<f32>(f32(value_1 - lo_0), f32(lo_0));\n}\n\nfn hpToClipX_0( splitPos_0 : vec2<f32>, bpRange_0 : vec3<f32>, hpZero_0 : f32) -> f32\n{\n var floorBp_0 : f32 = -3.00000000549775576e+38f + hpZero_0;\n var step_0 : f32 = 2.0f / bpRange_0.z;\n return dot(vec3<f32>(-1.0f, max(splitPos_0.x - bpRange_0.x, floorBp_0), max(splitPos_0.y - bpRange_0.y, floorBp_0)), vec3<f32>(1.0f, step_0, step_0));\n}\n\nfn rowBandTopPx_0( rowOffsetPx_1 : f32, rowHeight_1 : f32, slot_1 : u32) -> f32\n{\n return rowOffsetPx_1 + rowHeight_1 * f32(slot_1);\n}\n\nfn valueToYPxScaled_0( value_2 : f32, domainMin_3 : f32, domainMax_3 : f32, h_1 : f32, scaleType_2 : i32, symlogConstant_2 : f32) -> f32\n{\n return (1.0f - normalizeScore_0(value_2, domainMin_3, domainMax_3, scaleType_2, symlogConstant_2)) * h_1;\n}\n\nfn insetValueYPx_0( value_3 : f32, domainMin_4 : f32, domainMax_4 : f32, h_2 : f32, scaleType_3 : i32, insetPx_1 : f32, symlogConstant_3 : f32) -> f32\n{\n var _S19 : f32 = min(insetPx_1, h_2 * 0.5f);\n return _S19 + valueToYPxScaled_0(value_3, domainMin_4, domainMax_4, h_2 - 2.0f * _S19, scaleType_3, symlogConstant_3);\n}\n\nfn pointYPx_0( value_4 : f32, domainMin_5 : f32, domainMax_5 : f32, h_3 : f32, scaleType_4 : i32, insetPx_2 : f32, symlogConstant_4 : f32) -> f32\n{\n return insetValueYPx_0(value_4, domainMin_5, domainMax_5, h_3, scaleType_4, insetPx_2, symlogConstant_4);\n}\n\nfn pointRowYPx_0( bandTop_0 : f32, h_4 : f32, reverse_1 : i32, valueYPx_0 : f32) -> f32\n{\n var _S20 : f32;\n if(reverse_1 != i32(0))\n {\n _S20 = h_4 - valueYPx_0;\n }\n else\n {\n _S20 = valueYPx_0;\n }\n return bandTop_0 + _S20;\n}\n\nfn yPxToClipY_0( yPx_0 : f32, canvasHeight_1 : f32) -> f32\n{\n return 1.0f - yPx_0 / canvasHeight_1 * 2.0f;\n}\n\nfn pxToClipLen_0( px_0 : f32, size_0 : f32) -> f32\n{\n return px_0 * 2.0f / size_0;\n}\n\nfn extendToMinWidthPx_0( x1_0 : f32, x2_0 : f32, minWidth_0 : f32) -> f32\n{\n var dx_0 : f32 = x2_0 - x1_0;\n var _S21 : f32;\n if((abs(dx_0)) < minWidth_0)\n {\n if(dx_0 < 0.0f)\n {\n _S21 = - minWidth_0;\n }\n else\n {\n _S21 = minWidth_0;\n }\n _S21 = x1_0 + _S21;\n }\n else\n {\n _S21 = x2_0;\n }\n return _S21;\n}\n\nfn extendToMinWidthX_0( x1_1 : f32, x2_1 : f32, minWidthPx_1 : f32, canvasWidth_0 : f32) -> f32\n{\n return extendToMinWidthPx_0(x1_1, x2_1, pxToClipLen_0(minWidthPx_1, canvasWidth_0));\n}\n\nfn clipXToPx_0( clipX_0 : f32, canvasWidth_1 : f32) -> f32\n{\n return (clipX_0 + 1.0f) * 0.5f * canvasWidth_1;\n}\n\nfn crispSquareTopLeftPx_0( centerPx_0 : f32, diameterPx_0 : f32) -> f32\n{\n return floor(centerPx_0 - diameterPx_0 * 0.5f + 0.5f);\n}\n\nfn crispSquareCornerPx_0( centerPx_1 : vec2<f32>, diameterPx_1 : f32, q_0 : vec2<f32>) -> vec2<f32>\n{\n return vec2<f32>(crispSquareTopLeftPx_0(centerPx_1.x, diameterPx_1), crispSquareTopLeftPx_0(centerPx_1.y, diameterPx_1)) + q_0 * vec2<f32>(diameterPx_1);\n}\n\nfn pxToClipX_0( xPx_0 : f32, canvasWidth_2 : f32) -> f32\n{\n return xPx_0 / canvasWidth_2 * 2.0f - 1.0f;\n}\n\nfn crispSquareCornerClip_0( centerClipX_0 : f32, centerYPx_0 : f32, diameterPx_2 : f32, q_1 : vec2<f32>, viewportWidth_1 : f32, canvasHeight_2 : f32) -> vec4<f32>\n{\n var vPx_0 : vec2<f32> = crispSquareCornerPx_0(vec2<f32>(clipXToPx_0(centerClipX_0, viewportWidth_1), centerYPx_0), diameterPx_2, q_1);\n return vec4<f32>(pxToClipX_0(vPx_0.x, viewportWidth_1), yPxToClipY_0(vPx_0.y, canvasHeight_2), 0.0f, 1.0f);\n}\n\nfn aaPx_0( dpr_0 : f32) -> f32\n{\n return 1.0f / max(dpr_0, 1.0f);\n}\n\nfn aaHalfPx_0( dpr_1 : f32) -> f32\n{\n return 0.5f * aaPx_0(dpr_1);\n}\n\nfn glyphExpand_0( unitPx_0 : f32, reaches_0 : f32, dpr_2 : f32) -> f32\n{\n return 1.0f + reaches_0 * aaHalfPx_0(dpr_2) / max(unitPx_0, 0.00100000004749745f);\n}\n\nstruct VsOut_0\n{\n @builtin(position) position_0 : vec4<f32>,\n @location(0) color_1 : vec4<f32>,\n @location(2) localPos_0 : vec2<f32>,\n @interpolate(flat) @location(1) shape_0 : f32,\n};\n\nstruct vertexInput_0\n{\n @location(0) x_2 : u32,\n @location(1) x2_2 : u32,\n @location(2) y_1 : f32,\n @location(3) color_2 : u32,\n @location(4) glyph_0 : u32,\n @location(5) row_0 : u32,\n};\n\nfn markScaleColor_0( _S22 : texture_2d<f32>, _S23 : sampler, _S24 : u32, _S25 : i32, _S26 : f32, _S27 : f32, _S28 : f32, _S29 : i32, _S30 : vec4<f32>, _S31 : vec4<f32>) -> vec4<f32>\n{\n if(_S25 == i32(0))\n {\n return unpackRGBA_0(_S24);\n }\n if(_S24 == u32(2143289345))\n {\n return unpackRGBA_0(u32(4289703855));\n }\n var scaleType_5 : i32;\n if(((_S24 & (u32(2139095040)))) == u32(2139095040))\n {\n if(((_S24 & (u32(8388607)))) != u32(0))\n {\n return unpackRGBA_0(u32(4286611584));\n }\n var negative_0 : bool = ((_S24 & (u32(2147483648)))) != u32(0);\n if(_S25 == i32(3))\n {\n if(negative_0)\n {\n scaleType_5 = i32(0);\n }\n else\n {\n scaleType_5 = _S29;\n }\n return u_0.colorBands_0[scaleType_5];\n }\n var _S32 : f32;\n if(negative_0)\n {\n _S32 = 0.0f;\n }\n else\n {\n _S32 = 1.0f;\n }\n return rampColor_0(_S22, _S23, rampMidT_0(_S32, _S28));\n }\n var value_5 : f32 = (bitcast<f32>((_S24)));\n if(_S25 == i32(3))\n {\n return u_0.colorBands_0[thresholdBand_0(value_5, _S29, _S30, _S31)];\n }\n if(_S25 == i32(2))\n {\n scaleType_5 = i32(1);\n }\n else\n {\n scaleType_5 = i32(0);\n }\n return rampColor_0(_S22, _S23, rampMidT_0(normalizeScore_0(value_5, _S26, _S27, scaleType_5, 1.0f), _S28));\n}\n\nfn bpToClipX_0( _S33 : u32) -> f32\n{\n return hpToClipX_0(hpSplitUint_0(_S33), u_0.bpRangeX_0, u_0.zero_0);\n}\n\n@vertex\nfn vs_main( _S34 : vertexInput_0, @builtin(vertex_index) vid_1 : u32) -> VsOut_0\n{\n var q_2 : vec2<f32> = quadLocal_0(vid_1 % u32(6));\n var local_0 : vec2<f32> = q_2 * vec2<f32>(2.0f) - vec2<f32>(1.0f);\n var xZero_0 : bool = (q_2.x) < 0.5f;\n var o_0 : VsOut_0;\n var _S35 : RowPlacement_0 = rowTableLookup_0(rowTable_texture_0, rowTable_sampler_0, _S34.row_0, u_0.rowTableKeys_0, markScaleColor_0(colorRamp_texture_0, colorRamp_sampler_0, _S34.color_2, u_0.rampMode_0, u_0.rampMin_0, u_0.rampMax_0, u_0.rampMidNorm_0, u_0.colorCutCount_0, u_0.colorCuts_0[i32(0)], u_0.colorCuts_0[i32(1)]));\n if(_S35.hidden_0)\n {\n o_0.position_0 = vec4<f32>(2.0f, 2.0f, 0.0f, 1.0f);\n o_0.color_1 = vec4<f32>(0.0f);\n o_0.localPos_0 = vec2<f32>(0.0f);\n o_0.shape_0 = 3.0f;\n return o_0;\n }\n var _S36 : f32 = bpToClipX_0(_S34.x_2);\n var _S37 : f32 = bpToClipX_0(_S34.x2_2);\n var yPx_1 : f32 = pointRowYPx_0(rowBandTopPx_0(u_0.rowOffsetPx_0, u_0.rowHeight_0, _S35.slot_0), u_0.rowHeight_0, u_0.reverse_0, pointYPx_0(_S34.y_1, u_0.domainMin_0, u_0.domainMax_0, u_0.rowHeight_0, u_0.valueScaleType_0, u_0.insetPx_0, u_0.valueSymlogConstant_0));\n var centerClipY_0 : f32 = yPxToClipY_0(yPx_1, u_0.canvasHeight_0);\n o_0.color_1 = _S35.color_0;\n var centerClipX_1 : f32 = (_S36 + _S37) * 0.5f;\n var x_3 : f32;\n if((u_0.rule_0) != i32(0))\n {\n var farClipX_0 : f32 = extendToMinWidthX_0(_S36, _S37, u_0.minWidthPx_0, u_0.viewportWidth_0);\n if(xZero_0)\n {\n x_3 = min(_S36, farClipX_0);\n }\n else\n {\n x_3 = max(_S36, farClipX_0);\n }\n o_0.position_0 = vec4<f32>(x_3, centerClipY_0 + pxToClipLen_0(local_0.y * u_0.radiusPx_0, u_0.canvasHeight_0), 0.0f, 1.0f);\n o_0.localPos_0 = local_0;\n o_0.shape_0 = 3.0f;\n }\n else\n {\n var _S38 : bool;\n if((_S34.glyph_0) == u32(3))\n {\n _S38 = true;\n }\n else\n {\n if((_S34.glyph_0) == u32(0))\n {\n _S38 = (u_0.radiusPx_0 * 2.0f) <= 3.0f;\n }\n else\n {\n _S38 = false;\n }\n }\n if(_S38)\n {\n o_0.position_0 = crispSquareCornerClip_0(centerClipX_1, yPx_1, u_0.radiusPx_0 * 2.0f, q_2, u_0.viewportWidth_0, u_0.canvasHeight_0);\n o_0.localPos_0 = local_0;\n o_0.shape_0 = 3.0f;\n }\n else\n {\n var diamond_0 : bool = (_S34.glyph_0) == u32(2);\n var _S39 : f32 = u_0.radiusPx_0;\n if(diamond_0)\n {\n x_3 = 1.60000002384185791f;\n }\n else\n {\n x_3 = 1.0f;\n }\n var unitPx_1 : f32 = _S39 * x_3;\n var _S40 : bool = (_S34.glyph_0) == u32(1);\n if(_S40)\n {\n x_3 = 2.2360680103302002f;\n }\n else\n {\n if(diamond_0)\n {\n x_3 = 1.41421365737915039f;\n }\n else\n {\n x_3 = 1.0f;\n }\n }\n var expand_0 : f32 = glyphExpand_0(unitPx_1, x_3, u_0.devicePixelRatio_0);\n var halfPx_0 : f32 = unitPx_1 * expand_0;\n o_0.position_0 = vec4<f32>(centerClipX_1 + pxToClipLen_0(local_0.x * halfPx_0, u_0.viewportWidth_0), centerClipY_0 + pxToClipLen_0(local_0.y * halfPx_0, u_0.canvasHeight_0), 0.0f, 1.0f);\n o_0.localPos_0 = local_0 * vec2<f32>(expand_0);\n if(_S40)\n {\n x_3 = 2.0f;\n }\n else\n {\n if(diamond_0)\n {\n x_3 = 1.0f;\n }\n else\n {\n x_3 = 0.0f;\n }\n }\n o_0.shape_0 = x_3;\n }\n }\n return o_0;\n}\n\nfn discCoverage_0( localPos_1 : vec2<f32>) -> f32\n{\n return 1.0f - length(localPos_1);\n}\n\nfn aaGradient_0( d_0 : f32) -> f32\n{\n return max(length(vec2<f32>(dpdx(d_0), dpdy(d_0))), 0.00000999999974738f);\n}\n\nfn aaRamp_0( signedInk_0 : f32, widthPx_0 : f32) -> f32\n{\n return clamp(signedInk_0 / widthPx_0 + 0.5f, 0.0f, 1.0f);\n}\n\nfn glyphEdgeAlpha_0( coverage_0 : f32) -> f32\n{\n return aaRamp_0(coverage_0, aaGradient_0(coverage_0));\n}\n\nstruct pixelOutput_0\n{\n @location(0) output_0 : vec4<f32>,\n};\n\nstruct pixelInput_0\n{\n @location(0) color_3 : vec4<f32>,\n @location(2) localPos_2 : vec2<f32>,\n @interpolate(flat) @location(1) shape_1 : f32,\n};\n\n@fragment\nfn fs_main( _S41 : pixelInput_0, @builtin(position) position_1 : vec4<f32>) -> pixelOutput_0\n{\n var coverage_1 : f32;\n if((_S41.shape_1) > 2.5f)\n {\n coverage_1 = 1.0f;\n }\n else\n {\n if((_S41.shape_1) > 1.5f)\n {\n var _S42 : f32 = _S41.localPos_2.y;\n var _S43 : f32 = _S41.localPos_2.x;\n coverage_1 = min(1.0f - _S42, min((2.0f * _S43 + _S42 + 1.0f) * 0.44721359014511108f, (-2.0f * _S43 + _S42 + 1.0f) * 0.44721359014511108f));\n }\n else\n {\n if((_S41.shape_1) > 0.5f)\n {\n coverage_1 = 1.0f - (abs(_S41.localPos_2.x) + abs(_S41.localPos_2.y));\n }\n else\n {\n coverage_1 = discCoverage_0(_S41.localPos_2);\n }\n }\n }\n var alpha_0 : f32 = glyphEdgeAlpha_0(coverage_1);\n if(alpha_0 <= 0.0f)\n {\n discard;\n }\n var _S44 : pixelOutput_0 = pixelOutput_0( vec4<f32>(_S41.color_3.xyz, _S41.color_3.w * alpha_0) );\n return _S44;\n}\n\n"
@@ -3,6 +3,4 @@
3
3
 
4
4
  export const MIN_DRAWN_ROW_PX = 1
5
5
 
6
- export const MIN_DRAWN_CELL_PX = 1
7
-
8
6
  export const MULTI_ROW_MIN_CELL_PX = 2