@genome-spy/core 0.74.0 → 0.76.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 (143) hide show
  1. package/dist/bundle/{esm-CgfVIRJ-.js → esm-BimDEpBb.js} +1 -1
  2. package/dist/bundle/{esm-DtE8VqAv.js → esm-Bvlm1uVk.js} +1 -1
  3. package/dist/bundle/{esm-sIoQYZ21.js → esm-CngqBe45.js} +17 -17
  4. package/dist/bundle/{esm-DQiq2Zhd.js → esm-D_euN86T.js} +43 -43
  5. package/dist/bundle/index.es.js +6064 -5756
  6. package/dist/bundle/index.js +104 -103
  7. package/dist/schema.json +572 -12
  8. package/dist/src/config/defaults/markDefaults.d.ts.map +1 -1
  9. package/dist/src/config/defaults/markDefaults.js +1 -12
  10. package/dist/src/config/defaults/scaleDefaults.d.ts.map +1 -1
  11. package/dist/src/config/defaults/scaleDefaults.js +1 -0
  12. package/dist/src/config/markConfig.d.ts.map +1 -1
  13. package/dist/src/config/markConfig.js +16 -8
  14. package/dist/src/config/themes.d.ts.map +1 -1
  15. package/dist/src/config/themes.js +15 -2
  16. package/dist/src/data/sources/dataUtils.d.ts +25 -0
  17. package/dist/src/data/sources/dataUtils.d.ts.map +1 -1
  18. package/dist/src/data/sources/dataUtils.js +23 -0
  19. package/dist/src/data/sources/inlineSource.js +2 -2
  20. package/dist/src/data/sources/lazy/registerBuiltInLazySources.js +2 -2
  21. package/dist/src/data/sources/lazy/registerCoreLazySources.d.ts +2 -0
  22. package/dist/src/data/sources/lazy/registerCoreLazySources.d.ts.map +1 -0
  23. package/dist/src/data/sources/lazy/registerCoreLazySources.js +2 -0
  24. package/dist/src/data/sources/lazy/tabixSource.d.ts +7 -0
  25. package/dist/src/data/sources/lazy/tabixSource.d.ts.map +1 -1
  26. package/dist/src/data/sources/lazy/tabixSource.js +18 -0
  27. package/dist/src/data/sources/lazy/tabixTsvSource.d.ts +37 -0
  28. package/dist/src/data/sources/lazy/tabixTsvSource.d.ts.map +1 -0
  29. package/dist/src/data/sources/lazy/tabixTsvSource.js +163 -0
  30. package/dist/src/data/sources/urlSource.d.ts.map +1 -1
  31. package/dist/src/data/sources/urlSource.js +8 -3
  32. package/dist/src/encoder/encoder.d.ts +2 -2
  33. package/dist/src/encoder/encoder.d.ts.map +1 -1
  34. package/dist/src/genome/scaleLocus.d.ts.map +1 -1
  35. package/dist/src/genome/scaleLocus.js +8 -3
  36. package/dist/src/genomeSpy/interactionController.d.ts.map +1 -1
  37. package/dist/src/genomeSpy/interactionController.js +91 -51
  38. package/dist/src/genomeSpyBase.d.ts.map +1 -1
  39. package/dist/src/genomeSpyBase.js +4 -1
  40. package/dist/src/gl/dataToVertices.d.ts +12 -14
  41. package/dist/src/gl/dataToVertices.d.ts.map +1 -1
  42. package/dist/src/gl/dataToVertices.js +116 -95
  43. package/dist/src/gl/glslScaleGenerator.d.ts +3 -0
  44. package/dist/src/gl/glslScaleGenerator.d.ts.map +1 -1
  45. package/dist/src/gl/glslScaleGenerator.js +10 -8
  46. package/dist/src/gl/vertexRangeIndex.d.ts +23 -0
  47. package/dist/src/gl/vertexRangeIndex.d.ts.map +1 -0
  48. package/dist/src/gl/vertexRangeIndex.js +150 -0
  49. package/dist/src/gl/webGLHelper.d.ts +5 -2
  50. package/dist/src/gl/webGLHelper.d.ts.map +1 -1
  51. package/dist/src/gl/webGLHelper.js +20 -3
  52. package/dist/src/marks/__snapshots__/shaderSnapshot.test.js.snap +1082 -0
  53. package/dist/src/marks/link.vertex.glsl.js +1 -1
  54. package/dist/src/marks/mark.d.ts +1 -1
  55. package/dist/src/minimal.d.ts.map +1 -1
  56. package/dist/src/minimal.js +5 -4
  57. package/dist/src/paramRuntime/expressionCompiler.d.ts +2 -1
  58. package/dist/src/paramRuntime/expressionCompiler.d.ts.map +1 -1
  59. package/dist/src/paramRuntime/expressionCompiler.js +3 -2
  60. package/dist/src/paramRuntime/expressionRef.d.ts +4 -1
  61. package/dist/src/paramRuntime/expressionRef.d.ts.map +1 -1
  62. package/dist/src/paramRuntime/expressionRef.js +10 -3
  63. package/dist/src/paramRuntime/graphRuntime.d.ts.map +1 -1
  64. package/dist/src/paramRuntime/graphRuntime.js +15 -6
  65. package/dist/src/paramRuntime/paramRuntime.d.ts +8 -2
  66. package/dist/src/paramRuntime/paramRuntime.d.ts.map +1 -1
  67. package/dist/src/paramRuntime/paramRuntime.js +10 -5
  68. package/dist/src/paramRuntime/types.d.ts +1 -0
  69. package/dist/src/paramRuntime/types.d.ts.map +1 -1
  70. package/dist/src/paramRuntime/types.js +1 -0
  71. package/dist/src/paramRuntime/viewParamRuntime.d.ts +5 -4
  72. package/dist/src/paramRuntime/viewParamRuntime.d.ts.map +1 -1
  73. package/dist/src/paramRuntime/viewParamRuntime.js +17 -6
  74. package/dist/src/scale/scale.d.ts.map +1 -1
  75. package/dist/src/scale/scale.js +11 -2
  76. package/dist/src/scales/domainPlanner.d.ts +57 -11
  77. package/dist/src/scales/domainPlanner.d.ts.map +1 -1
  78. package/dist/src/scales/domainPlanner.js +183 -84
  79. package/dist/src/scales/scaleInstanceManager.d.ts.map +1 -1
  80. package/dist/src/scales/scaleInstanceManager.js +7 -2
  81. package/dist/src/scales/scalePropsResolver.d.ts +3 -3
  82. package/dist/src/scales/scalePropsResolver.d.ts.map +1 -1
  83. package/dist/src/scales/scalePropsResolver.js +28 -5
  84. package/dist/src/scales/scaleResolution.d.ts +12 -1
  85. package/dist/src/scales/scaleResolution.d.ts.map +1 -1
  86. package/dist/src/scales/scaleResolution.js +180 -21
  87. package/dist/src/scales/selectionDomainUtils.d.ts +10 -0
  88. package/dist/src/scales/selectionDomainUtils.d.ts.map +1 -1
  89. package/dist/src/scales/selectionDomainUtils.js +32 -3
  90. package/dist/src/screenshotExport.d.ts +23 -0
  91. package/dist/src/screenshotExport.d.ts.map +1 -0
  92. package/dist/src/screenshotExport.js +44 -0
  93. package/dist/src/screenshotHarness.d.ts.map +1 -1
  94. package/dist/src/screenshotHarness.js +26 -24
  95. package/dist/src/spec/axis.d.ts +2 -2
  96. package/dist/src/spec/channel.d.ts +34 -4
  97. package/dist/src/spec/data.d.ts +52 -0
  98. package/dist/src/spec/parameter.d.ts +6 -0
  99. package/dist/src/spec/scale.d.ts +13 -1
  100. package/dist/src/spec/transform.d.ts +6 -0
  101. package/dist/src/utils/expression.d.ts +16 -8
  102. package/dist/src/utils/expression.d.ts.map +1 -1
  103. package/dist/src/utils/expression.js +291 -11
  104. package/dist/src/view/axisGridView.d.ts.map +1 -1
  105. package/dist/src/view/axisGridView.js +2 -1
  106. package/dist/src/view/axisView.d.ts.map +1 -1
  107. package/dist/src/view/axisView.js +2 -1
  108. package/dist/src/view/facetView.d.ts.map +1 -1
  109. package/dist/src/view/facetView.js +2 -1
  110. package/dist/src/view/flowBuilder.d.ts +1 -1
  111. package/dist/src/view/flowBuilder.d.ts.map +1 -1
  112. package/dist/src/view/flowBuilder.js +11 -7
  113. package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
  114. package/dist/src/view/gridView/gridChild.js +9 -1
  115. package/dist/src/view/gridView/gridView.d.ts.map +1 -1
  116. package/dist/src/view/gridView/gridView.js +198 -32
  117. package/dist/src/view/gridView/scrollbar.d.ts.map +1 -1
  118. package/dist/src/view/gridView/scrollbar.js +5 -1
  119. package/dist/src/view/gridView/selectionRect.d.ts.map +1 -1
  120. package/dist/src/view/gridView/selectionRect.js +5 -1
  121. package/dist/src/view/gridView/separatorView.d.ts.map +1 -1
  122. package/dist/src/view/gridView/separatorView.js +5 -1
  123. package/dist/src/view/resolutionPlanner.d.ts +9 -0
  124. package/dist/src/view/resolutionPlanner.d.ts.map +1 -0
  125. package/dist/src/view/resolutionPlanner.js +302 -0
  126. package/dist/src/view/testUtils.d.ts +30 -3
  127. package/dist/src/view/testUtils.d.ts.map +1 -1
  128. package/dist/src/view/testUtils.js +51 -2
  129. package/dist/src/view/unitView.d.ts +1 -1
  130. package/dist/src/view/unitView.d.ts.map +1 -1
  131. package/dist/src/view/unitView.js +5 -152
  132. package/dist/src/view/view.d.ts.map +1 -1
  133. package/dist/src/view/view.js +2 -1
  134. package/dist/src/view/viewSelectors.d.ts +38 -10
  135. package/dist/src/view/viewSelectors.d.ts.map +1 -1
  136. package/dist/src/view/viewSelectors.js +67 -2
  137. package/dist/src/view/viewUtilTypes.d.ts +15 -0
  138. package/dist/src/view/viewUtils.d.ts.map +1 -1
  139. package/dist/src/view/viewUtils.js +10 -0
  140. package/package.json +2 -2
  141. package/LICENSE +0 -21
  142. /package/dist/bundle/{esm-BDFRLEuD.js → esm-C49STiCR.js} +0 -0
  143. /package/dist/bundle/{esm-CGX-qz1d.js → esm-CuVa5T98.js} +0 -0
@@ -676,7 +676,9 @@ export function getAttributeAndArrayTypes(scale, channel) {
676
676
  : { attributeType: "float", arrayConstructor: Float32Array };
677
677
 
678
678
  return Object.assign(props, {
679
- numComponents: +(props.attributeType.match(/^vec([234])$/)?.[1] ?? 1),
679
+ numComponents: +(
680
+ props.attributeType.match(/^(?:u)?vec([234])$/)?.[1] ?? 1
681
+ ),
680
682
  discrete,
681
683
  hp,
682
684
  largeHp,
@@ -701,9 +703,9 @@ export function isLargeGenome(domain) {
701
703
  return domain[1] > 2 ** 32;
702
704
  }
703
705
 
704
- const LOW_BITS = 12;
705
- const BS = 2 ** LOW_BITS;
706
- const BM = BS - 1;
706
+ export const HIGH_PRECISION_SPLIT_BITS = 12;
707
+ export const HIGH_PRECISION_SPLIT_BASE = 2 ** HIGH_PRECISION_SPLIT_BITS;
708
+ export const HIGH_PRECISION_SPLIT_MASK = HIGH_PRECISION_SPLIT_BASE - 1;
707
709
 
708
710
  /**
709
711
  * @param {number} x Must be an integer
@@ -712,7 +714,7 @@ const BM = BS - 1;
712
714
  export function splitHighPrecision(x, arr = []) {
713
715
  // Using a bitmask is MUCH faster than using modulo (at least on Chrome 112)
714
716
  // https://www.wikiwand.com/en/Modulo#Performance_issues
715
- const lo = x & BM;
717
+ const lo = x & HIGH_PRECISION_SPLIT_MASK;
716
718
  const hi = x - lo;
717
719
 
718
720
  arr[0] = hi;
@@ -726,8 +728,8 @@ export function splitHighPrecision(x, arr = []) {
726
728
  * @param {number[]} [arr]
727
729
  */
728
730
  export function splitLargeHighPrecision(x, arr = []) {
729
- const lo = x % BS;
730
- const hi = (x - lo) / BS;
731
+ const lo = x % HIGH_PRECISION_SPLIT_BASE;
732
+ const hi = (x - lo) / HIGH_PRECISION_SPLIT_BASE;
731
733
 
732
734
  arr[0] = hi;
733
735
  arr[1] = lo;
@@ -739,7 +741,7 @@ export function splitLargeHighPrecision(x, arr = []) {
739
741
  * @param {number} x
740
742
  */
741
743
  function exactSplitHighPrecision(x) {
742
- const lo = x % BS;
744
+ const lo = x % HIGH_PRECISION_SPLIT_BASE;
743
745
  const hi = x - lo;
744
746
 
745
747
  return [hi, lo];
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @callback VertexReader
3
+ * @param {number} vertexIndex
4
+ * @returns {number}
5
+ */
6
+ /**
7
+ * A binned index for vertex ranges that are already emitted into typed arrays.
8
+ * The readers operate on vertices, not source datums.
9
+ *
10
+ * The scan is run-based: consecutive vertices with the same effective x
11
+ * interval are collapsed into one range before binning.
12
+ *
13
+ * @param {number} size Number of bins
14
+ * @param {[number, number]} domain Domain of positions
15
+ * @param {VertexReader} readStart Reader for the start x value at a vertex
16
+ * @param {VertexReader} [readEnd=readStart] Reader for the end x value at a vertex
17
+ * @param {number} [startVertexIndex=0] First vertex index in the scanned range
18
+ * @param {number} [endVertexIndex=startVertexIndex] One past the last vertex index
19
+ * @returns {import("../utils/binnedIndex.js").Lookup | undefined}
20
+ */
21
+ export function createVertexRangeIndexer(size: number, domain: [number, number], readStart: VertexReader, readEnd?: VertexReader, startVertexIndex?: number, endVertexIndex?: number): import("../utils/binnedIndex.js").Lookup | undefined;
22
+ export type VertexReader = (vertexIndex: number) => number;
23
+ //# sourceMappingURL=vertexRangeIndex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vertexRangeIndex.d.ts","sourceRoot":"","sources":["../../../src/gl/vertexRangeIndex.js"],"names":[],"mappings":"AAKA;;;;GAIG;AAEH;;;;;;;;;;;;;;GAcG;AACH,+CARW,MAAM,UACN,CAAC,MAAM,EAAE,MAAM,CAAC,aAChB,YAAY,YACZ,YAAY,qBACZ,MAAM,mBACN,MAAM,GACJ,OAAO,yBAAyB,EAAE,MAAM,GAAG,SAAS,CA6HhE;yCA9IU,MAAM,KACJ,MAAM"}
@@ -0,0 +1,150 @@
1
+ import clamp from "../utils/clamp.js";
2
+
3
+ const MAX_INTEGER = 2 ** 31 - 1;
4
+ const MIN_INTEGER = -(2 ** 31);
5
+
6
+ /**
7
+ * @callback VertexReader
8
+ * @param {number} vertexIndex
9
+ * @returns {number}
10
+ */
11
+
12
+ /**
13
+ * A binned index for vertex ranges that are already emitted into typed arrays.
14
+ * The readers operate on vertices, not source datums.
15
+ *
16
+ * The scan is run-based: consecutive vertices with the same effective x
17
+ * interval are collapsed into one range before binning.
18
+ *
19
+ * @param {number} size Number of bins
20
+ * @param {[number, number]} domain Domain of positions
21
+ * @param {VertexReader} readStart Reader for the start x value at a vertex
22
+ * @param {VertexReader} [readEnd=readStart] Reader for the end x value at a vertex
23
+ * @param {number} [startVertexIndex=0] First vertex index in the scanned range
24
+ * @param {number} [endVertexIndex=startVertexIndex] One past the last vertex index
25
+ * @returns {import("../utils/binnedIndex.js").Lookup | undefined}
26
+ */
27
+ export function createVertexRangeIndexer(
28
+ size,
29
+ domain,
30
+ readStart,
31
+ readEnd = readStart,
32
+ startVertexIndex = 0,
33
+ endVertexIndex = startVertexIndex
34
+ ) {
35
+ if (endVertexIndex <= startVertexIndex) {
36
+ return undefined;
37
+ }
38
+
39
+ if (domain[1] <= domain[0]) {
40
+ return undefined;
41
+ }
42
+
43
+ const startIndices = new Array(size);
44
+ startIndices.fill(MAX_INTEGER);
45
+
46
+ const endIndices = new Array(size);
47
+ endIndices.fill(0);
48
+
49
+ const start = domain[0];
50
+ const domainLength = domain[1] - domain[0];
51
+ const divisor = domainLength / size;
52
+
53
+ /**
54
+ * @param {number} pos
55
+ * @param {boolean} end
56
+ */
57
+ const getBin = (pos, end) => {
58
+ const unfloored = (pos - start) / divisor;
59
+ const floored = Math.floor(unfloored);
60
+
61
+ // Special handling for the end coordinate because we are using half-open ranges.
62
+ return clamp(
63
+ end && floored == unfloored ? floored - 1 : floored,
64
+ 0,
65
+ size - 1
66
+ );
67
+ };
68
+
69
+ let lastIndex = MIN_INTEGER;
70
+ let lastStart = -Infinity;
71
+ let unordered = false;
72
+
73
+ /**
74
+ * @type {import("../utils/binnedIndex.js").Lookup}
75
+ */
76
+ const lookup = (queryStart, queryEnd, arr = [0, 0]) => {
77
+ const startBin = getBin(queryStart, false);
78
+ const endBin = getBin(queryEnd, true);
79
+ const startIndex = startIndices[startBin];
80
+ const endIndex = Math.max(endIndices[endBin], startIndex);
81
+
82
+ arr[0] = startIndex;
83
+ arr[1] = endIndex;
84
+ return arr;
85
+ };
86
+
87
+ for (let i = startVertexIndex; i < endVertexIndex; ) {
88
+ const runStart = i;
89
+ const runX = readStart(i);
90
+ const runX2 = readEnd(i);
91
+
92
+ i += 1;
93
+ while (
94
+ i < endVertexIndex &&
95
+ readStart(i) === runX &&
96
+ readEnd(i) === runX2
97
+ ) {
98
+ i += 1;
99
+ }
100
+
101
+ if (runStart > lastIndex) {
102
+ lastIndex = runStart;
103
+ } else {
104
+ unordered = true;
105
+ break;
106
+ }
107
+
108
+ if (runX < lastStart || runX2 < runX) {
109
+ unordered = true;
110
+ break;
111
+ }
112
+ lastStart = runX;
113
+
114
+ const startBin = getBin(runX, false);
115
+ const endBin = getBin(runX2, true);
116
+
117
+ for (let bin = startBin; bin <= endBin; bin++) {
118
+ if (startIndices[bin] > runStart) {
119
+ startIndices[bin] = runStart;
120
+ }
121
+
122
+ if (endIndices[bin] < i) {
123
+ endIndices[bin] = i;
124
+ }
125
+ }
126
+ }
127
+
128
+ if (unordered) {
129
+ return undefined;
130
+ }
131
+
132
+ for (let i = 1; i < endIndices.length; i++) {
133
+ if (endIndices[i] < endIndices[i - 1]) {
134
+ endIndices[i] = endIndices[i - 1];
135
+ }
136
+ }
137
+
138
+ let tail = true;
139
+
140
+ for (let i = startIndices.length - 1; i > 0; i--) {
141
+ if (tail && startIndices[i] == MAX_INTEGER) {
142
+ startIndices[i] = endIndices[i];
143
+ tail = false;
144
+ } else if (startIndices[i - 1] > startIndices[i]) {
145
+ startIndices[i - 1] = startIndices[i];
146
+ }
147
+ }
148
+
149
+ return lookup;
150
+ }
@@ -40,11 +40,12 @@ export default class WebGLHelper {
40
40
  * A function that returns the content size. If a dimension is undefined,
41
41
  * the canvas fills the container, otherwise the canvas is adjusted to the content size.
42
42
  * @param {WebGLContextAttributes} [webglContextAttributes]
43
+ * @param {() => void} [onCanvasResize]
43
44
  */
44
45
  constructor(container: HTMLElement, sizeSource?: () => {
45
46
  width: number;
46
47
  height: number;
47
- }, webglContextAttributes?: WebGLContextAttributes);
48
+ }, webglContextAttributes?: WebGLContextAttributes, onCanvasResize?: () => void);
48
49
  /**
49
50
  * @type {CanvasSizeHelper}
50
51
  */
@@ -58,6 +59,8 @@ export default class WebGLHelper {
58
59
  physicalWidth: number;
59
60
  physicalHeight: number;
60
61
  } | undefined;
62
+ /** @type {() => void} */
63
+ _onCanvasResize: () => void;
61
64
  /** @type {Map<string, WebGLShader>} */
62
65
  _shaderCache: Map<string, WebGLShader>;
63
66
  /** @type {WeakMap<import("../types/encoder.js").VegaScale, WebGLTexture>} */
@@ -79,7 +82,7 @@ export default class WebGLHelper {
79
82
  * @param {string | string[]} glsl
80
83
  */
81
84
  compileShader(type: number, glsl: string | string[]): WebGLShader;
82
- adjustGl(): void;
85
+ adjustGl(): boolean;
83
86
  finalize(): void;
84
87
  /**
85
88
  * Returns the canvas size in true display pixels
@@ -1 +1 @@
1
- {"version":3,"file":"webGLHelper.d.ts","sourceRoot":"","sources":["../../../src/gl/webGLHelper.js"],"names":[],"mappings":"AAybA;;;;GAIG;AACH,kCAJW,sBAAsB,gBACtB,WAAW,kBACX,WAAW;;;;;;EA8CrB;AAED;;;;;GAKG;AACH,0CALW,qBAAqB,WACrB,IAAI,CAAC,OAAO,SAAS,EAAE,cAAc,EAAE,KAAK,CAAC,OAC7C,MAAM,EAAE,GAAG,eAAe,YAC1B,YAAY,gBAYtB;AAED;;;;;;GAMG;AACH,qCALW,sBAAsB,mBACtB,OAAO,SAAS,EAAE,eAAe,KACjC,MAAM,KACN,MAAM,2BAWhB;AAED;;;;;GAKG;AACH,yCAJW,sBAAsB,mBACtB,OAAO,SAAS,EAAE,eAAe,SACjC,MAAM,UA4BhB;AA7gBD;IACI;;;;;;;OAOG;IACH,uBANW,WAAW,eACX,MAAM;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAC,2BAGrC,sBAAsB,EAsGhC;IA5FG;;OAEG;IACH,mBAFU,gBAAgB,CAEQ;IAElC;;OAEG;IACH,oBAFU;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAEjF;IAEnC,uCAAuC;IACvC,cADW,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CACN;IAE7B,6EAA6E;IAC7E,eADW,OAAO,CAAC,OAAO,qBAAqB,EAAE,SAAS,EAAE,YAAY,CAAC,CACvC;IAElC;;OAEG;IACH,mBAFU,OAAO,CAAC,OAAO,4BAA4B,EAAE,mBAAmB,EAAE,YAAY,CAAC,CAEnD;IA8CtC,0BAAoB;IACpB,2BAAY;IAGZ,oDAAoD;IACpD,2BADW,OAAO,SAAS,EAAE,iBAAiB,EAAE,CAQ/C;IACD,sDAGC;IAaL,uBAGC;IAED;;;;;OAKG;IACH,oBAHW,MAAM,QACN,MAAM,GAAG,MAAM,EAAE,eA2B3B;IAED,iBAgCC;IAED,iBAGC;IAED;;;;OAIG;IACH,oCAFW;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;;;MAI3C;IAED;;;;OAIG;IACH,kCAFW;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,UAI3C;IAED;;;OAGG;IACH;;;MAEC;IAED;;;;;;;;;OASG;IACH,+BAHW,OAAO,8BAA8B,EAAE,OAAO,WAC9C,OAAO,QA2GjB;IAED;;OAEG;IACH,kCAFW,OAAO,4BAA4B,EAAE,mBAAmB,0BAwClE;CACJ;6BAvX4B,uBAAuB"}
1
+ {"version":3,"file":"webGLHelper.d.ts","sourceRoot":"","sources":["../../../src/gl/webGLHelper.js"],"names":[],"mappings":"AA0cA;;;;GAIG;AACH,kCAJW,sBAAsB,gBACtB,WAAW,kBACX,WAAW;;;;;;EA8CrB;AAED;;;;;GAKG;AACH,0CALW,qBAAqB,WACrB,IAAI,CAAC,OAAO,SAAS,EAAE,cAAc,EAAE,KAAK,CAAC,OAC7C,MAAM,EAAE,GAAG,eAAe,YAC1B,YAAY,gBAYtB;AAED;;;;;;GAMG;AACH,qCALW,sBAAsB,mBACtB,OAAO,SAAS,EAAE,eAAe,KACjC,MAAM,KACN,MAAM,2BAWhB;AAED;;;;;GAKG;AACH,yCAJW,sBAAsB,mBACtB,OAAO,SAAS,EAAE,eAAe,SACjC,MAAM,UA4BhB;AA9hBD;IACI;;;;;;;;OAQG;IACH,uBAPW,WAAW,eACX,MAAM;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAC,2BAGrC,sBAAsB,mBACtB,MAAM,IAAI,EAoHpB;IArGG;;OAEG;IACH,mBAFU,gBAAgB,CAEQ;IAElC;;OAEG;IACH,oBAFU;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAEjF;IAEnC,yBAAyB;IACzB,iBADW,MAAM,IAAI,CAC8B;IAEnD,uCAAuC;IACvC,cADW,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CACN;IAE7B,6EAA6E;IAC7E,eADW,OAAO,CAAC,OAAO,qBAAqB,EAAE,SAAS,EAAE,YAAY,CAAC,CACvC;IAElC;;OAEG;IACH,mBAFU,OAAO,CAAC,OAAO,4BAA4B,EAAE,mBAAmB,EAAE,YAAY,CAAC,CAEnD;IA8CtC,0BAAoB;IACpB,2BAAY;IAGZ,oDAAoD;IACpD,2BADW,OAAO,SAAS,EAAE,iBAAiB,EAAE,CAQ/C;IACD,sDAGC;IAmBL,uBAGC;IAED;;;;;OAKG;IACH,oBAHW,MAAM,QACN,MAAM,GAAG,MAAM,EAAE,eA2B3B;IAED,oBAkCC;IAED,iBAGC;IAED;;;;OAIG;IACH,oCAFW;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;;;MAI3C;IAED;;;;OAIG;IACH,kCAFW;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,UAI3C;IAED;;;OAGG;IACH;;;MAEC;IAED;;;;;;;;;OASG;IACH,+BAHW,OAAO,8BAA8B,EAAE,OAAO,WAC9C,OAAO,QA2GjB;IAED;;OAEG;IACH,kCAFW,OAAO,4BAA4B,EAAE,mBAAmB,0BAwClE;CACJ;6BAxY4B,uBAAuB"}
@@ -41,8 +41,14 @@ export default class WebGLHelper {
41
41
  * A function that returns the content size. If a dimension is undefined,
42
42
  * the canvas fills the container, otherwise the canvas is adjusted to the content size.
43
43
  * @param {WebGLContextAttributes} [webglContextAttributes]
44
+ * @param {() => void} [onCanvasResize]
44
45
  */
45
- constructor(container, sizeSource, webglContextAttributes = {}) {
46
+ constructor(
47
+ container,
48
+ sizeSource,
49
+ webglContextAttributes = {},
50
+ onCanvasResize
51
+ ) {
46
52
  const resolvedSizeSource =
47
53
  sizeSource ??
48
54
  (() => ({
@@ -60,6 +66,9 @@ export default class WebGLHelper {
60
66
  */
61
67
  this._appliedCanvasSize = undefined;
62
68
 
69
+ /** @type {() => void} */
70
+ this._onCanvasResize = onCanvasResize ?? (() => {});
71
+
63
72
  /** @type {Map<string, WebGLShader>} */
64
73
  this._shaderCache = new Map();
65
74
 
@@ -138,7 +147,13 @@ export default class WebGLHelper {
138
147
  container,
139
148
  canvas,
140
149
  resolvedSizeSource,
141
- () => this.adjustGl()
150
+ () => {
151
+ // Assigning canvas.width/height clears the WebGL drawing buffer.
152
+ // The observer may fire after layout/render, so repaint immediately.
153
+ if (this.adjustGl()) {
154
+ this._onCanvasResize();
155
+ }
156
+ }
142
157
  );
143
158
 
144
159
  this.adjustGl();
@@ -193,7 +208,7 @@ export default class WebGLHelper {
193
208
  this._appliedCanvasSize.physicalWidth == physicalSize.width &&
194
209
  this._appliedCanvasSize.physicalHeight == physicalSize.height
195
210
  ) {
196
- return;
211
+ return false;
197
212
  }
198
213
 
199
214
  this.canvas.style.width = `${logicalSize.width}px`;
@@ -214,6 +229,8 @@ export default class WebGLHelper {
214
229
  physicalWidth: physicalSize.width,
215
230
  physicalHeight: physicalSize.height,
216
231
  };
232
+
233
+ return true;
217
234
  }
218
235
 
219
236
  finalize() {