@genome-spy/core 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/dist/index.js +224 -0
  2. package/dist/style.css +1 -0
  3. package/package.json +54 -0
  4. package/src/data/collector.js +178 -0
  5. package/src/data/collector.test.js +82 -0
  6. package/src/data/dataFlow.js +109 -0
  7. package/src/data/dataFlow.test.js +3 -0
  8. package/src/data/facetNode.js +17 -0
  9. package/src/data/flow.test.js +71 -0
  10. package/src/data/flowBatch.d.ts +40 -0
  11. package/src/data/flowNode.js +283 -0
  12. package/src/data/flowNode.test.js +49 -0
  13. package/src/data/flowOptimizer.js +117 -0
  14. package/src/data/flowOptimizer.test.js +192 -0
  15. package/src/data/flowTestUtils.js +63 -0
  16. package/src/data/formats/fasta.js +32 -0
  17. package/src/data/formats/fasta.test.js +26 -0
  18. package/src/data/sources/dataSource.js +22 -0
  19. package/src/data/sources/dataSourceFactory.js +24 -0
  20. package/src/data/sources/dataUtils.js +31 -0
  21. package/src/data/sources/dynamicCallbackSource.js +56 -0
  22. package/src/data/sources/dynamicSource.js +36 -0
  23. package/src/data/sources/inlineSource.js +69 -0
  24. package/src/data/sources/inlineSource.test.js +55 -0
  25. package/src/data/sources/namedSource.js +74 -0
  26. package/src/data/sources/sequenceSource.js +46 -0
  27. package/src/data/sources/sequenceSource.test.js +45 -0
  28. package/src/data/sources/urlSource.js +74 -0
  29. package/src/data/transforms/aggregate.js +69 -0
  30. package/src/data/transforms/clone.js +40 -0
  31. package/src/data/transforms/clone.test.js +10 -0
  32. package/src/data/transforms/coverage.js +187 -0
  33. package/src/data/transforms/coverage.test.js +122 -0
  34. package/src/data/transforms/filter.js +37 -0
  35. package/src/data/transforms/filter.test.js +17 -0
  36. package/src/data/transforms/filterScoredLabels.js +134 -0
  37. package/src/data/transforms/flattenCompressedExons.js +57 -0
  38. package/src/data/transforms/flattenDelimited.js +68 -0
  39. package/src/data/transforms/flattenDelimited.test.js +86 -0
  40. package/src/data/transforms/flattenSequence.js +39 -0
  41. package/src/data/transforms/flattenSequence.test.js +33 -0
  42. package/src/data/transforms/formula.js +39 -0
  43. package/src/data/transforms/formula.test.js +18 -0
  44. package/src/data/transforms/identifier.js +108 -0
  45. package/src/data/transforms/identifier.test.js +82 -0
  46. package/src/data/transforms/linearizeGenomicCoordinate.js +101 -0
  47. package/src/data/transforms/measureText.js +44 -0
  48. package/src/data/transforms/pileup.js +128 -0
  49. package/src/data/transforms/pileup.test.js +69 -0
  50. package/src/data/transforms/project.js +41 -0
  51. package/src/data/transforms/project.test.js +31 -0
  52. package/src/data/transforms/regexExtract.js +61 -0
  53. package/src/data/transforms/regexExtract.test.js +66 -0
  54. package/src/data/transforms/regexFold.js +141 -0
  55. package/src/data/transforms/regexFold.test.js +159 -0
  56. package/src/data/transforms/sample.js +101 -0
  57. package/src/data/transforms/sample.test.js +37 -0
  58. package/src/data/transforms/stack.js +137 -0
  59. package/src/data/transforms/stack.test.js +90 -0
  60. package/src/data/transforms/transformFactory.js +60 -0
  61. package/src/encoder/accessor.js +82 -0
  62. package/src/encoder/accessor.test.js +46 -0
  63. package/src/encoder/encoder.js +369 -0
  64. package/src/encoder/encoder.test.js +97 -0
  65. package/src/fonts/Lato-Regular.json +1267 -0
  66. package/src/fonts/Lato-Regular.png +0 -0
  67. package/src/fonts/OFL.txt +93 -0
  68. package/src/fonts/README.md +3 -0
  69. package/src/fonts/bmFont.d.ts +58 -0
  70. package/src/fonts/bmFontManager.js +357 -0
  71. package/src/fonts/bmFontMetrics.js +108 -0
  72. package/src/genome/genome.js +305 -0
  73. package/src/genome/genome.test.js +152 -0
  74. package/src/genome/genomeStore.js +54 -0
  75. package/src/genome/locusFormat.js +31 -0
  76. package/src/genome/scaleIndex.js +199 -0
  77. package/src/genome/scaleIndex.test.js +61 -0
  78. package/src/genome/scaleLocus.js +112 -0
  79. package/src/genome/scaleLocus.test.js +3 -0
  80. package/src/genomeSpy.js +753 -0
  81. package/src/gl/arrayBuilder.js +199 -0
  82. package/src/gl/dataToVertices.js +621 -0
  83. package/src/gl/includes/common.glsl +63 -0
  84. package/src/gl/includes/fp64-arithmetic.glsl +187 -0
  85. package/src/gl/includes/fp64-utils.js +132 -0
  86. package/src/gl/includes/picking.fragment.glsl +3 -0
  87. package/src/gl/includes/picking.vertex.glsl +29 -0
  88. package/src/gl/includes/sampleFacet.glsl +107 -0
  89. package/src/gl/includes/scales.glsl +79 -0
  90. package/src/gl/includes/scales_fp64.glsl +30 -0
  91. package/src/gl/link.fragment.glsl +18 -0
  92. package/src/gl/link.vertex.glsl +111 -0
  93. package/src/gl/point.fragment.glsl +123 -0
  94. package/src/gl/point.vertex.glsl +128 -0
  95. package/src/gl/rect.fragment.glsl +51 -0
  96. package/src/gl/rect.vertex.glsl +114 -0
  97. package/src/gl/rule.fragment.glsl +52 -0
  98. package/src/gl/rule.vertex.glsl +89 -0
  99. package/src/gl/text.fragment.glsl +31 -0
  100. package/src/gl/text.vertex.glsl +246 -0
  101. package/src/gl/webGLHelper.js +490 -0
  102. package/src/img/bowtie.svg +1 -0
  103. package/src/img/genomespy-favicon.svg +34 -0
  104. package/src/index.html +11 -0
  105. package/src/index.js +151 -0
  106. package/src/marks/link.js +189 -0
  107. package/src/marks/mark.js +867 -0
  108. package/src/marks/markUtils.js +109 -0
  109. package/src/marks/pointMark.js +279 -0
  110. package/src/marks/rectMark.js +236 -0
  111. package/src/marks/rule.js +231 -0
  112. package/src/marks/text.js +274 -0
  113. package/src/options.d.ts +9 -0
  114. package/src/scale/colorUtils.js +184 -0
  115. package/src/scale/glslScaleGenerator.js +462 -0
  116. package/src/scale/scale.js +441 -0
  117. package/src/scale/scale.test.js +323 -0
  118. package/src/scale/ticks.js +198 -0
  119. package/src/scale/ticks.test.js +39 -0
  120. package/src/singlePageApp.js +13 -0
  121. package/src/spec/axis.d.ts +296 -0
  122. package/src/spec/channel.d.ts +127 -0
  123. package/src/spec/data.d.ts +185 -0
  124. package/src/spec/font.d.ts +15 -0
  125. package/src/spec/genome.d.ts +35 -0
  126. package/src/spec/mark.d.ts +432 -0
  127. package/src/spec/root.d.ts +22 -0
  128. package/src/spec/scale.d.ts +265 -0
  129. package/src/spec/tooltip.d.ts +9 -0
  130. package/src/spec/transform.d.ts +479 -0
  131. package/src/spec/view.d.ts +215 -0
  132. package/src/styles/genome-spy.scss +153 -0
  133. package/src/tooltip/dataTooltipHandler.js +59 -0
  134. package/src/tooltip/refseqGeneTooltipHandler.js +77 -0
  135. package/src/tooltip/tooltipHandler.ts +12 -0
  136. package/src/types/filetypes.d.ts +4 -0
  137. package/src/types/flatqueue.d.ts +53 -0
  138. package/src/types/glsl.d.ts +4 -0
  139. package/src/types/object.d.ts +21 -0
  140. package/src/types/vega-scale.d.ts +60 -0
  141. package/src/utils/animator.js +83 -0
  142. package/src/utils/arrayUtils.js +55 -0
  143. package/src/utils/binnedRangeIndex.js +83 -0
  144. package/src/utils/clamp.js +8 -0
  145. package/src/utils/cloner.js +32 -0
  146. package/src/utils/cloner.test.js +23 -0
  147. package/src/utils/coalesce.js +11 -0
  148. package/src/utils/coalesce.test.js +15 -0
  149. package/src/utils/concatIterables.js +26 -0
  150. package/src/utils/concatIterables.test.js +7 -0
  151. package/src/utils/debounce.js +37 -0
  152. package/src/utils/domainArray.js +224 -0
  153. package/src/utils/domainArray.test.js +129 -0
  154. package/src/utils/eerp.js +13 -0
  155. package/src/utils/expression.js +32 -0
  156. package/src/utils/field.js +28 -0
  157. package/src/utils/fisheye.js +60 -0
  158. package/src/utils/formatObject.js +31 -0
  159. package/src/utils/html.js +23 -0
  160. package/src/utils/html.test.js +13 -0
  161. package/src/utils/indexer.js +43 -0
  162. package/src/utils/indexer.test.js +46 -0
  163. package/src/utils/inertia.js +124 -0
  164. package/src/utils/interactionEvent.js +33 -0
  165. package/src/utils/iterateNestedMaps.js +21 -0
  166. package/src/utils/iterateNestedMaps.test.js +32 -0
  167. package/src/utils/kWayMerge.js +42 -0
  168. package/src/utils/kWayMerge.test.js +25 -0
  169. package/src/utils/layout/flexLayout.js +336 -0
  170. package/src/utils/layout/flexLayout.test.js +296 -0
  171. package/src/utils/layout/padding.js +107 -0
  172. package/src/utils/layout/point.js +23 -0
  173. package/src/utils/layout/rectangle.js +282 -0
  174. package/src/utils/layout/rectangle.test.js +171 -0
  175. package/src/utils/mergeObjects.js +99 -0
  176. package/src/utils/mergeObjects.test.js +41 -0
  177. package/src/utils/numberExtractor.js +24 -0
  178. package/src/utils/numberExtractor.test.js +5 -0
  179. package/src/utils/point.js +14 -0
  180. package/src/utils/propertyCacher.js +70 -0
  181. package/src/utils/propertyCacher.test.js +84 -0
  182. package/src/utils/propertyCoalescer.js +37 -0
  183. package/src/utils/propertyCoalescer.test.js +21 -0
  184. package/src/utils/reservationMap.js +103 -0
  185. package/src/utils/reservationMap.test.js +19 -0
  186. package/src/utils/scaleNull.js +19 -0
  187. package/src/utils/setOperations.js +75 -0
  188. package/src/utils/smoothstep.js +10 -0
  189. package/src/utils/throttle.js +34 -0
  190. package/src/utils/topK.js +76 -0
  191. package/src/utils/topK.test.js +63 -0
  192. package/src/utils/transition.js +74 -0
  193. package/src/utils/ui/tooltip.js +189 -0
  194. package/src/utils/url.js +22 -0
  195. package/src/utils/variableTools.js +24 -0
  196. package/src/utils/variableTools.test.js +12 -0
  197. package/src/view/axisResolution.js +135 -0
  198. package/src/view/axisResolution.test.js +200 -0
  199. package/src/view/axisView.js +746 -0
  200. package/src/view/channel.js +5 -0
  201. package/src/view/concatView.js +296 -0
  202. package/src/view/containerView.js +141 -0
  203. package/src/view/decoratorView.js +510 -0
  204. package/src/view/facetView.js +488 -0
  205. package/src/view/flowBuilder.js +362 -0
  206. package/src/view/flowBuilder.test.js +124 -0
  207. package/src/view/importView.js +19 -0
  208. package/src/view/layerView.js +60 -0
  209. package/src/view/rendering.d.ts +44 -0
  210. package/src/view/renderingContext/compositeViewRenderingContext.js +51 -0
  211. package/src/view/renderingContext/deferredViewRenderingContext.js +174 -0
  212. package/src/view/renderingContext/layoutRecorderViewRenderingContext.js +128 -0
  213. package/src/view/renderingContext/simpleViewRenderingContext.js +62 -0
  214. package/src/view/renderingContext/svgViewRenderingContext.js +121 -0
  215. package/src/view/renderingContext/viewRenderingContext.js +41 -0
  216. package/src/view/scaleResolution.js +756 -0
  217. package/src/view/scaleResolution.test.js +571 -0
  218. package/src/view/scaleResolutionApi.d.ts +40 -0
  219. package/src/view/testUtils.js +48 -0
  220. package/src/view/unitView.js +368 -0
  221. package/src/view/view.js +589 -0
  222. package/src/view/view.test.js +213 -0
  223. package/src/view/viewContext.d.ts +57 -0
  224. package/src/view/viewFactory.js +179 -0
  225. package/src/view/viewFactory.test.js +16 -0
  226. package/src/view/viewUtils.js +420 -0
@@ -0,0 +1,246 @@
1
+ uniform float uSdfNumerator;
2
+
3
+ uniform vec2 uD; // dx & dy
4
+
5
+ in mediump vec2 vertexCoord;
6
+ in lowp vec2 textureCoord;
7
+
8
+ uniform vec4 uViewportEdgeFadeWidth;
9
+ uniform vec4 uViewportEdgeFadeDistance;
10
+
11
+ uniform bool uSqueeze;
12
+ uniform bool uLogoLetter;
13
+
14
+ // Width of the text (all letters)
15
+ in float width;
16
+
17
+ // x: -1, 0, 1 = left, center, right
18
+ // y: -1, 0, 1 = top, middle, bottom
19
+ uniform ivec2 uAlign;
20
+
21
+ #ifdef x2_DEFINED
22
+ uniform float uPaddingX;
23
+ uniform bool uFlushX;
24
+ #endif
25
+
26
+ #ifdef y2_DEFINED
27
+ uniform float uPaddingY;
28
+ uniform bool uFlushY;
29
+ #endif
30
+
31
+ out vec2 vTexCoord;
32
+ flat out vec4 vColor;
33
+ flat out float vSlope;
34
+ out float vEdgeFadeOpacity;
35
+
36
+ struct RangeResult {
37
+ float pos;
38
+ float scale;
39
+ };
40
+
41
+ float minValue(vec4 v) {
42
+ return min(min(v.x, v.y), min(v.z, v.w));
43
+ }
44
+
45
+ float maxValue(vec4 v) {
46
+ return max(max(v.x, v.y), max(v.z, v.w));
47
+ }
48
+
49
+ /**
50
+ * All measures are in [0, 1]
51
+ */
52
+ RangeResult positionInsideRange(float a, float b, float width, float padding,
53
+ int align, bool flush) {
54
+ float span = b - a;
55
+ float paddedWidth = width + 2.0 * padding;
56
+
57
+ // Is the text clearly outside the viewport
58
+ if (a > 1.0 || b < 0.0) {
59
+ return RangeResult(0.0, 0.0);
60
+ }
61
+
62
+ // How much extra space we have for adjusting the position so that the
63
+ // text stays inside the range.
64
+ float extra = max(0.0, span - paddedWidth);
65
+
66
+ float pos;
67
+
68
+ // Align the text and try to keep it inside the range and the viewport
69
+ if (align == 0) {
70
+ float centre = a + b;
71
+
72
+ if (flush) {
73
+ float leftOver = max(0.0, paddedWidth - centre);
74
+ centre += min(leftOver, extra);
75
+
76
+ float rightOver = max(0.0, paddedWidth + centre - 2.0);
77
+ centre -= min(rightOver, extra);
78
+ }
79
+
80
+ pos = centre / 2.0;
81
+
82
+ } else if (align < 0) {
83
+ float edge = a;
84
+
85
+ if (flush) {
86
+ float over = max(0.0, -edge);
87
+ edge += min(over, extra);
88
+ }
89
+
90
+ pos = edge + padding;
91
+
92
+ } else {
93
+ float edge = b;
94
+
95
+ if (flush) {
96
+ float over = max(0.0, edge - 1.0);
97
+ edge -= min(over, extra);
98
+ }
99
+
100
+ // TODO: If the text spans the whole viewport, try to keep it centered if possible.
101
+
102
+ pos = edge - padding;
103
+ }
104
+
105
+ // How the text should be scaled to make it fit inside the range (if it didn't fit).
106
+ float scale = clamp((span - padding) / paddedWidth, 0.0, 1.0);
107
+
108
+ // TODO: Fix padding in scale factor. Padding should stay constant
109
+ return RangeResult(pos, scale);
110
+ }
111
+
112
+ vec2 calculateRotatedDimensions(float width, mat2 rotationMatrix) {
113
+ vec2 a = abs(rotationMatrix * vec2(width / 2.0, 0.5));
114
+ vec2 b = abs(rotationMatrix * vec2(width / 2.0, -0.5));
115
+ return vec2(max(a.x, b.x), max(a.y, b.y)) * 2.0;
116
+ }
117
+
118
+ /** Needed when using ranged text */
119
+ ivec2 fixAlignForAngle(ivec2 align, float angleInDegrees) {
120
+ float a = mod(angleInDegrees + 45.0, 360.0);
121
+ int x = align.x;
122
+ int y = -align.y;
123
+
124
+ // TODO: Optimize by avoiding branching
125
+ if (a < 90.0) {
126
+ return ivec2(x, y);
127
+ } else if (a < 180.0) {
128
+ return ivec2(y, -x);
129
+ } else if (a < 270.0) {
130
+ return ivec2(-x, y);
131
+ } else {
132
+ return ivec2(-y, x);
133
+ }
134
+ }
135
+
136
+ void main(void) {
137
+ float opacity = getScaled_opacity() * uViewOpacity;
138
+ vec2 size = vec2(getScaled_size());
139
+ float x = getScaled_x();
140
+ float y = getScaled_y();
141
+
142
+ float scale = 1.0;
143
+
144
+ float angleInDegrees = getScaled_angle();
145
+ float angle = -angleInDegrees * PI / 180.0;
146
+
147
+ float sinTheta = sin(angle);
148
+ float cosTheta = cos(angle);
149
+ mat2 rotationMatrix = mat2(cosTheta, sinTheta, -sinTheta, cosTheta);
150
+
151
+ vec2 flushSize = calculateRotatedDimensions(width, rotationMatrix);
152
+
153
+ #if defined(x2_DEFINED) || defined(y2_DEFINED)
154
+ ivec2 align = fixAlignForAngle(uAlign, angleInDegrees);
155
+ #else
156
+ ivec2 align = uAlign;
157
+ #endif
158
+
159
+ #ifdef x2_DEFINED
160
+ float x2 = getScaled_x2();
161
+
162
+ if (uLogoLetter) {
163
+ size.x = (x2 - x) * uViewportSize.x;
164
+ x += (x2 - x) / 2.0;
165
+
166
+ } else {
167
+ float x2 = getScaled_x2();
168
+ RangeResult result = positionInsideRange(
169
+ min(x, x2), max(x, x2),
170
+ size.x * scale * flushSize.x / uViewportSize.x, uPaddingX / uViewportSize.x,
171
+ align.x, uFlushX);
172
+
173
+ x = result.pos;
174
+ scale *= result.scale;
175
+ }
176
+ #endif
177
+
178
+ // Position of the text origo
179
+ vec2 pos = applySampleFacet(vec2(x, y));
180
+
181
+ #ifdef y2_DEFINED
182
+ float y2 = getScaled_y2();
183
+ vec2 pos2 = applySampleFacet(vec2(x, y2));
184
+
185
+ if (uLogoLetter) {
186
+ size.y = (pos2.y - pos.y) * uViewportSize.y;
187
+ pos.y += (pos2.y - pos.y) / 2.0;
188
+
189
+ } else {
190
+ RangeResult result = positionInsideRange(
191
+ min(pos.y, pos2.y), max(pos.y, pos2.y),
192
+ size.y * scale * flushSize.y / uViewportSize.y, uPaddingY / uViewportSize.y,
193
+ align.y, uFlushY);
194
+
195
+ pos.y = result.pos;
196
+ scale *= result.scale;
197
+ }
198
+ #endif
199
+
200
+ if (scale < 1.0) {
201
+ if (uSqueeze) {
202
+ vec2 scaleFadeExtent = vec2(3.0, 6.0) / size;
203
+
204
+ if (scale < scaleFadeExtent[0]) {
205
+ gl_Position = vec4(0.0);
206
+ return;
207
+ }
208
+
209
+ size *= scale;
210
+ opacity *= linearstep(scaleFadeExtent[0], scaleFadeExtent[1], scale);
211
+
212
+ } else if (scale < 1.0) {
213
+ // Eliminate the text
214
+ gl_Position = vec4(0.0);
215
+ return;
216
+ }
217
+ }
218
+
219
+ // Position of the character vertex in relation to the text origo
220
+ vec2 charPos = rotationMatrix * (vertexCoord * size + uD);
221
+
222
+ // Position of the character vertex inside the unit viewport
223
+ vec2 unitPos = pos + charPos / uViewportSize;
224
+
225
+ gl_Position = unitToNdc(unitPos);
226
+
227
+ // Controls antialiasing of the SDF
228
+ vSlope = max(1.0, min(size.x, size.y) / uSdfNumerator);
229
+
230
+ vColor = vec4(getScaled_color() * opacity, opacity);
231
+
232
+ vTexCoord = textureCoord;
233
+
234
+ // Edge fading. The implementation is simplistic and fails with primitives that
235
+ // span the whole viewport. However, it works just fine with reasonable font sizes.
236
+ // x: top, y: right, z: bottom, w: left
237
+ if (maxValue(uViewportEdgeFadeDistance) > -pow(10.0, 10.0)) { // -Infinity would be nice
238
+ vEdgeFadeOpacity = minValue(
239
+ ((vec4(1.0, 1.0, 0.0, 0.0) + vec4(-1.0, -1.0, 1.0, 1.0) * unitPos.yxyx) *
240
+ uViewportSize.yxyx - uViewportEdgeFadeDistance) / uViewportEdgeFadeWidth);
241
+ } else {
242
+ vEdgeFadeOpacity = 1.0;
243
+ }
244
+
245
+ setupPicking();
246
+ }