@genome-spy/core 0.49.0 → 0.50.1

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 (68) hide show
  1. package/dist/bundle/index.es.js +2861 -2829
  2. package/dist/bundle/index.js +90 -89
  3. package/dist/schema.json +2175 -1430
  4. package/dist/src/genomeSpy.d.ts.map +1 -1
  5. package/dist/src/genomeSpy.js +12 -8
  6. package/dist/src/gl/includes/common.glsl.js +1 -1
  7. package/dist/src/marks/link.d.ts +8 -1
  8. package/dist/src/marks/link.d.ts.map +1 -1
  9. package/dist/src/marks/link.fragment.glsl.js +1 -1
  10. package/dist/src/marks/link.js +38 -32
  11. package/dist/src/marks/link.vertex.glsl.js +1 -1
  12. package/dist/src/marks/mark.d.ts +19 -16
  13. package/dist/src/marks/mark.d.ts.map +1 -1
  14. package/dist/src/marks/mark.js +41 -27
  15. package/dist/src/marks/markUtils.d.ts +25 -0
  16. package/dist/src/marks/markUtils.d.ts.map +1 -1
  17. package/dist/src/marks/markUtils.js +41 -1
  18. package/dist/src/marks/point.common.glsl.js +1 -1
  19. package/dist/src/marks/point.d.ts +8 -1
  20. package/dist/src/marks/point.d.ts.map +1 -1
  21. package/dist/src/marks/point.js +29 -24
  22. package/dist/src/marks/point.vertex.glsl.js +1 -1
  23. package/dist/src/marks/rect.d.ts +8 -1
  24. package/dist/src/marks/rect.d.ts.map +1 -1
  25. package/dist/src/marks/rect.js +19 -19
  26. package/dist/src/marks/rule.d.ts +8 -1
  27. package/dist/src/marks/rule.d.ts.map +1 -1
  28. package/dist/src/marks/rule.js +19 -16
  29. package/dist/src/marks/text.d.ts +10 -1
  30. package/dist/src/marks/text.d.ts.map +1 -1
  31. package/dist/src/marks/text.fragment.glsl.js +1 -1
  32. package/dist/src/marks/text.js +48 -46
  33. package/dist/src/marks/text.vertex.glsl.js +1 -1
  34. package/dist/src/spec/channel.d.ts +14 -1
  35. package/dist/src/spec/mark.d.ts +167 -87
  36. package/dist/src/spec/view.d.ts +115 -39
  37. package/dist/src/styles/genome-spy.css.d.ts +1 -1
  38. package/dist/src/styles/genome-spy.css.d.ts.map +1 -1
  39. package/dist/src/styles/genome-spy.css.js +1 -0
  40. package/dist/src/styles/genome-spy.scss +1 -0
  41. package/dist/src/tooltip/dataTooltipHandler.d.ts +1 -1
  42. package/dist/src/tooltip/dataTooltipHandler.d.ts.map +1 -1
  43. package/dist/src/tooltip/refseqGeneTooltipHandler.d.ts +1 -1
  44. package/dist/src/tooltip/refseqGeneTooltipHandler.d.ts.map +1 -1
  45. package/dist/src/view/axisResolution.d.ts +1 -1
  46. package/dist/src/view/axisResolution.d.ts.map +1 -1
  47. package/dist/src/view/axisResolution.js +1 -1
  48. package/dist/src/view/axisView.js +2 -2
  49. package/dist/src/view/flowBuilder.test.js +1 -1
  50. package/dist/src/view/gridView.js +1 -1
  51. package/dist/src/view/layout/flexLayout.d.ts +6 -0
  52. package/dist/src/view/layout/flexLayout.d.ts.map +1 -1
  53. package/dist/src/view/layout/flexLayout.js +9 -0
  54. package/dist/src/view/paramMediator.d.ts +7 -0
  55. package/dist/src/view/paramMediator.d.ts.map +1 -1
  56. package/dist/src/view/paramMediator.js +23 -0
  57. package/dist/src/view/paramMediator.test.js +20 -0
  58. package/dist/src/view/scaleResolution.d.ts +1 -7
  59. package/dist/src/view/scaleResolution.d.ts.map +1 -1
  60. package/dist/src/view/scaleResolution.js +24 -39
  61. package/dist/src/view/unitView.d.ts +3 -5
  62. package/dist/src/view/unitView.d.ts.map +1 -1
  63. package/dist/src/view/unitView.js +22 -4
  64. package/dist/src/view/view.js +1 -1
  65. package/dist/src/view/viewUtils.d.ts +1 -5
  66. package/dist/src/view/viewUtils.d.ts.map +1 -1
  67. package/dist/src/view/viewUtils.js +0 -7
  68. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"genomeSpy.d.ts","sourceRoot":"","sources":["../../src/genomeSpy.js"],"names":[],"mappings":"AA8CA;IACI;;;;;OAKG;IAEH;;;;;OAKG;IACH,uBAJW,WAAW,qDAEX,OAAO,qBAAqB,EAAE,YAAY,EA6FpD;IA1FG,uBAA0B;IAC1B,oDAAsB;IAItB,6BAA6B;IAC7B,uBADW,CAAC,MAAM,IAAI,CAAC,EAAE,CACM;IAE/B,sCAAsC;IACtC,wCAAgB;IAEhB,yBAAoC;IAEpC,4CAA4C;IAC5C,oBADW,QAAU,MAAM,KAAE,MAAM,EAAE,CAAC,EAAE,CACZ;IAE5B,mBAAoD;IAEpD,0BAA0B;IAC1B,aADW,WAAW,CACM;IAE5B;;;;;OAKG;IACH,qEAF0B,OAAO,CAE8B;IAE/D,2CAA2C;IAC3C,mBADW,4BAA4B,CACL;IAClC,2CAA2C;IAC3C,iBADW,4BAA4B,CACP;IAEhC,oDAAoD;IACpD,6BAAgC;IAEhC;;;OAGG;IACH,eAFU;QAAE,IAAI,EAAE,OAAO,iBAAiB,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,oBAAoB,EAAE,KAAK,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAEpF;IAE9B,uBAA+C;IAE/C;;;OAGG;IACH,oBAFU,IAAI,MAAM,EAAE,QAAU,aAAa,KAAE,IAAI,CAAC,EAAE,CAAC,CAEpB;IAEnC;;;;;;OAMG;IACH,yCAFkC,GAAG,KAAK,IAAI,GAEd;IAEhC;;;OAGG;IACH,kDAFkC,GAAG,KAAK,IAAI,GAEL;IAEzC,oFAAoF;IACpF,iBADW,OAAO,MAAM,EAAE,OAAO,6BAA6B,EAAE,cAAc,CAAC,CAK9E;IAED,mBAAmB;IACnB,2CAAyB;IAEzB;;;;OAIG;IACH;gBAF8B,OAAO,wBAAwB,EAAE,iBAAiB;iBAAW,MAAM;OAEnE;IAE9B;;OAEG;IACH,wBAFU,WAAW,CAEkB;IAEvC,oBAAoB;IACpB,kBADW,KAAK,CACiB;IA2CrC;;;OAGG;IACH,2CAFkB,MAAM,KAAK,GAAG,EAAE,QAIjC;IAED;;OAEG;IACH,+BAFW,MAAM,YAShB;IAED;;;;OAIG;IACH,sBAHW,MAAM,QACN,GAAG,EAAE,QAaf;IAED;;;;;OAKG;IACH,gBAHW,kBAAkB,YAClB,GAAG,QAQb;IAED;;;OAGG;IACH,iCAqDC;IA0DG,uBAQC;IAGD,mCAGE;IAOF,sCAEE;IAGF,iBAAyC;IAW7C;;OAEG;IACH,gBAuBC;IAED,sCA6MC;IAED;;;OAGG;IACH,UAFa,QAAQ,OAAO,CAAC,CA6B5B;IAED,4BA8JC;IAvIe,iCAAoC;IAyIpD;;;OAGG;IACH,kBAHW,MAAM,KACN,MAAM,QAqEhB;IAED;;;;;;;OAOG;IACH,oDAHuB,QAAQ,MAAM,GAAG,WAAW,GAAG,OAAO,KAAK,EAAE,cAAc,CAAC,QAYlF;IAED,sBA6CC;IAED,kBAIC;IAED,iCAOC;IAED,iCASC;IAED,qFAWC;;CACJ;;;;iCAj8BY,eAAe,GAAG,YAAY,GAAG,QAAQ,GAAG,gBAAgB;4BAP7B,uBAAuB;qBAZ9C,qBAAqB;wBAIlB,yBAAyB;yCARR,yDAAyD;oBAYvD,oBAAoB;kBAT7C,wBAAwB;wBALlB,qBAAqB;oBAVzB,uBAAuB;qBAQtB,oBAAoB"}
1
+ {"version":3,"file":"genomeSpy.d.ts","sourceRoot":"","sources":["../../src/genomeSpy.js"],"names":[],"mappings":"AA6CA;IACI;;;;;OAKG;IAEH;;;;;OAKG;IACH,uBAJW,WAAW,qDAEX,OAAO,qBAAqB,EAAE,YAAY,EA6FpD;IA1FG,uBAA0B;IAC1B,oDAAsB;IAItB,6BAA6B;IAC7B,uBADW,CAAC,MAAM,IAAI,CAAC,EAAE,CACM;IAE/B,sCAAsC;IACtC,wCAAgB;IAEhB,yBAAoC;IAEpC,4CAA4C;IAC5C,oBADW,QAAU,MAAM,KAAE,MAAM,EAAE,CAAC,EAAE,CACZ;IAE5B,mBAAoD;IAEpD,0BAA0B;IAC1B,aADW,WAAW,CACM;IAE5B;;;;;OAKG;IACH,qEAF0B,OAAO,CAE8B;IAE/D,2CAA2C;IAC3C,mBADW,4BAA4B,CACL;IAClC,2CAA2C;IAC3C,iBADW,4BAA4B,CACP;IAEhC,oDAAoD;IACpD,6BAAgC;IAEhC;;;OAGG;IACH,eAFU;QAAE,IAAI,EAAE,OAAO,iBAAiB,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,oBAAoB,EAAE,KAAK,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAEpF;IAE9B,uBAA+C;IAE/C;;;OAGG;IACH,oBAFU,IAAI,MAAM,EAAE,QAAU,aAAa,KAAE,IAAI,CAAC,EAAE,CAAC,CAEpB;IAEnC;;;;;;OAMG;IACH,yCAFkC,GAAG,KAAK,IAAI,GAEd;IAEhC;;;OAGG;IACH,kDAFkC,GAAG,KAAK,IAAI,GAEL;IAEzC,oFAAoF;IACpF,iBADW,OAAO,MAAM,EAAE,OAAO,6BAA6B,EAAE,cAAc,CAAC,CAK9E;IAED,mBAAmB;IACnB,2CAAyB;IAEzB;;;;OAIG;IACH;gBAF8B,OAAO,wBAAwB,EAAE,iBAAiB;iBAAW,MAAM;OAEnE;IAE9B;;OAEG;IACH,wBAFU,WAAW,CAEkB;IAEvC,oBAAoB;IACpB,kBADW,KAAK,CACiB;IA2CrC;;;OAGG;IACH,2CAFkB,MAAM,KAAK,GAAG,EAAE,QAIjC;IAED;;OAEG;IACH,+BAFW,MAAM,YAShB;IAED;;;;OAIG;IACH,sBAHW,MAAM,QACN,GAAG,EAAE,QAaf;IAED;;;;;OAKG;IACH,gBAHW,kBAAkB,YAClB,GAAG,QAQb;IAED;;;OAGG;IACH,iCAwDC;IA4DG,uBAQC;IAGD,mCAGE;IAOF,sCAEE;IAGF,iBAA0C;IAW9C;;OAEG;IACH,gBAuBC;IAED,sCA6MC;IAED;;;OAGG;IACH,UAFa,QAAQ,OAAO,CAAC,CA6B5B;IAED,4BA8JC;IAvIe,iCAAoC;IAyIpD;;;OAGG;IACH,kBAHW,MAAM,KACN,MAAM,QAqEhB;IAED;;;;;;;OAOG;IACH,oDAHuB,QAAQ,MAAM,GAAG,WAAW,GAAG,OAAO,KAAK,EAAE,cAAc,CAAC,QAYlF;IAED,sBA6CC;IAED,kBAIC;IAED,iCAOC;IAED,iCASC;IAED,qFAWC;;CACJ;;;;iCAt8BY,eAAe,GAAG,YAAY,GAAG,QAAQ,GAAG,gBAAgB;4BAP7B,uBAAuB;qBAZ9C,qBAAqB;wBAIlB,yBAAyB;yCARR,yDAAyD;oBAYvD,oBAAoB;kBAT7C,wBAAwB;wBALlB,qBAAqB;oBATzB,uBAAuB;qBAOtB,oBAAoB"}
@@ -10,7 +10,6 @@ import {
10
10
  checkForDuplicateScaleNames,
11
11
  setImplicitScaleNames,
12
12
  calculateCanvasSize,
13
- calculateViewRootSize,
14
13
  } from "./view/viewUtils.js";
15
14
  import UnitView from "./view/unitView.js";
16
15
 
@@ -288,6 +287,9 @@ export default class GenomeSpy {
288
287
  // Do some hacks to stop css animations of the loading indicators.
289
288
  // Otherwise they fire animation frames even when their opacity is zero.
290
289
  // TODO: Instead of this, replace the animated spinners with static images.
290
+ // Or even better, once more widely supported, use `allow-discrete`
291
+ // https://developer.mozilla.org/en-US/docs/Web/CSS/transition-behavior
292
+ // to enable transition of the display property.
291
293
  if (isSomethingVisible()) {
292
294
  this.loadingIndicatorsElement.style.display = "block";
293
295
  } else {
@@ -316,10 +318,12 @@ export default class GenomeSpy {
316
318
  this.renderAll();
317
319
  };
318
320
 
319
- // TODO: Size should be observed only if the content is not absolutely sized
320
- const resizeObserver = new ResizeObserver(resizeCallback);
321
- resizeObserver.observe(this.container);
322
- this._destructionCallbacks.push(() => resizeObserver.disconnect());
321
+ if (this.viewRoot.getSize().isGrowing()) {
322
+ // TODO: Size should be observed only if the content is not absolutely sized
323
+ const resizeObserver = new ResizeObserver(resizeCallback);
324
+ resizeObserver.observe(this.container);
325
+ this._destructionCallbacks.push(() => resizeObserver.disconnect());
326
+ }
323
327
 
324
328
  /** @type {() => void} */
325
329
  let remove = null;
@@ -362,7 +366,7 @@ export default class GenomeSpy {
362
366
  canvasWrapper,
363
367
  () =>
364
368
  this.viewRoot
365
- ? calculateCanvasSize(calculateViewRootSize(this.viewRoot))
369
+ ? calculateCanvasSize(this.viewRoot.getSize())
366
370
  : { width: undefined, height: undefined },
367
371
  this.spec.background,
368
372
  { powerPreference: this.options.powerPreference ?? "default" }
@@ -384,7 +388,7 @@ export default class GenomeSpy {
384
388
  });
385
389
  canvasWrapper.appendChild(this.loadingIndicatorsElement);
386
390
 
387
- this.tooltip = new Tooltip(canvasWrapper);
391
+ this.tooltip = new Tooltip(this.container);
388
392
 
389
393
  this.loadingMessageElement
390
394
  .querySelector(".message")
@@ -539,7 +543,7 @@ export default class GenomeSpy {
539
543
  );
540
544
 
541
545
  this.#canvasWrapper.style.flexGrow =
542
- calculateViewRootSize(this.viewRoot).height.grow > 0 ? "1" : "0";
546
+ this.viewRoot.getSize().height.grow > 0 ? "1" : "0";
543
547
 
544
548
  this.#initializeParameterBindings();
545
549
 
@@ -1,2 +1,2 @@
1
- const shader = "#define PI 3.141593\nuniform View{mediump vec2 uViewOffset;mediump vec2 uViewScale;mediump vec2 uViewportSize;lowp float uDevicePixelRatio;lowp float uViewOpacity;bool uPickingEnabled;};/***Maps a coordinate on the unit scale to a normalized device coordinate.*(0,0)is at the bottom left corner.*/vec4 unitToNdc(vec2 coord){return vec4((coord*uViewScale+uViewOffset)*2.0-1.0,0.0,1.0);}vec4 unitToNdc(float x,float y){return unitToNdc(vec2(x,y));}vec4 pixelsToNdc(vec2 coord){return unitToNdc(coord/uViewportSize);}vec4 pixelsToNdc(float x,float y){return pixelsToNdc(vec2(x,y));}float linearstep(float edge0,float edge1,float x){return clamp((x-edge0)/(edge1-edge0),0.0,1.0);}/***Specialized linearstep for doing antialiasing*/float distanceToRatio(float d){return clamp(d*uDevicePixelRatio+0.5,0.0,1.0);}vec4 distanceToColor(float d,vec4 fill,vec4 stroke,float halfStrokeWidth){if(halfStrokeWidth>0.0){float sd=abs(d)-halfStrokeWidth;return mix(stroke,d<=0.0 ? fill : vec4(0.0),distanceToRatio(sd));}else{return fill*distanceToRatio(-d);}}";
1
+ const shader = "#define PI 3.141593\nuniform View{mediump vec2 uViewOffset;mediump vec2 uViewScale;mediump vec2 uViewportSize;lowp float uDevicePixelRatio;lowp float uViewOpacity;bool uPickingEnabled;};/***Maps a coordinate on the unit scale to a normalized device coordinate.*(0,0)is at the bottom left corner.*/vec4 unitToNdc(vec2 coord){return vec4((coord*uViewScale+uViewOffset)*2.0-1.0,0.0,1.0);}vec4 unitToNdc(float x,float y){return unitToNdc(vec2(x,y));}vec4 pixelsToNdc(vec2 coord){return unitToNdc(coord/uViewportSize);}vec4 pixelsToNdc(float x,float y){return pixelsToNdc(vec2(x,y));}float linearstep(float edge0,float edge1,float x){return clamp((x-edge0)/(edge1-edge0),0.0,1.0);}/***Calculates a gamma for antialiasing opacity based on the color.*/float getGammaForColor(vec3 rgb){return mix(1.25,0.75,smoothstep(0.0,1.0,dot(rgb,vec3(0.299,0.587,0.114))));}/***Specialized linearstep for doing antialiasing*/float distanceToRatio(float d){return clamp(d*uDevicePixelRatio+0.5,0.0,1.0);}vec4 distanceToColor(float d,vec4 fill,vec4 stroke,float halfStrokeWidth){if(halfStrokeWidth>0.0){float sd=abs(d)-halfStrokeWidth;return mix(stroke,d<=0.0 ? fill : vec4(0.0),distanceToRatio(sd));}else{return fill*distanceToRatio(-d);}}";
2
2
  export default shader;
@@ -1,4 +1,11 @@
1
- export default class LinkMark extends Mark {
1
+ /**
2
+ * @extends {Mark<import("../spec/mark.js").LinkProps>}
3
+ */
4
+ export default class LinkMark extends Mark<import("../spec/mark.js").LinkProps> {
5
+ /**
6
+ * @param {import("../view/unitView.js").default} unitView
7
+ */
8
+ constructor(unitView: import("../view/unitView.js").default);
2
9
  /**
3
10
  * Only available if "WebGL Draft Extensions" is enabled in chrome://flags
4
11
  * But seems to work.
@@ -1 +1 @@
1
- {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../../src/marks/link.js"],"names":[],"mappings":"AAYA;IAgCQ;;;;;OAKG;IACH,yBAEC;IAoHD;;;;;;MAKC;CAwFR;iBA/PgB,WAAW"}
1
+ {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../../src/marks/link.js"],"names":[],"mappings":"AAYA;;GAEG;AACH;IACI;;OAEG;IACH,sBAFW,OAAO,qBAAqB,EAAE,OAAO,EAoC/C;IATG;;;;;OAKG;IACH,yBAEC;IAsHD;;;;;;MAKC;CA4FR;iBArQgB,WAAW"}
@@ -1,2 +1,2 @@
1
- const shader = "in vec4 vColor;in float vSize;in float vNormalLengthInPixels;out lowp vec4 fragColor;void main(void){float dpr=uDevicePixelRatio;float distance=abs(vNormalLengthInPixels);float opacity=clamp(((vSize/2.0-distance)*dpr),0.0,1.0);fragColor=vColor*opacity;if(uPickingEnabled){fragColor=vPickingColor;}}";
1
+ const shader = "in vec4 vColor;in float vSize;in float vNormalLengthInPixels;in float vGamma;out lowp vec4 fragColor;void main(void){float dpr=uDevicePixelRatio;float distance=abs(vNormalLengthInPixels);float opacity=clamp(((vSize/2.0-distance)*dpr),0.0,1.0);opacity=pow(opacity,vGamma);fragColor=vColor*opacity;if(uPickingEnabled){fragColor=vPickingColor;}}";
2
2
  export default shader;
@@ -10,6 +10,9 @@ import { isChannelDefWithScale } from "../encoder/encoder.js";
10
10
  const LINK_SHAPES = ["arc", "dome", "diagonal", "line"];
11
11
  const ORIENTS = ["vertical", "horizontal"];
12
12
 
13
+ /**
14
+ * @extends {Mark<import("../spec/mark.js").LinkProps>}
15
+ */
13
16
  export default class LinkMark extends Mark {
14
17
  /**
15
18
  * @param {import("../view/unitView.js").default} unitView
@@ -17,30 +20,27 @@ export default class LinkMark extends Mark {
17
20
  constructor(unitView) {
18
21
  super(unitView);
19
22
 
20
- Object.defineProperties(
21
- this.defaultProperties,
22
- Object.getOwnPropertyDescriptors({
23
- x: 0.0,
24
- x2: undefined,
25
- y: 0.0,
26
- y2: undefined,
27
- size: 1.0,
28
- color: "black",
29
- opacity: 1.0,
30
-
31
- segments: 101, // Performance is affected more by the fill rate, i.e. number of pixels
32
- arcHeightFactor: 1.0,
33
- minArcHeight: 1.5,
34
- minPickingSize: 3.0,
35
- clampApex: false,
36
- maxChordLength: 50000,
37
- arcFadingDistance: false,
38
- noFadingOnPointSelection: true,
39
-
40
- linkShape: "arc",
41
- orient: "vertical",
42
- })
43
- );
23
+ this.augmentDefaultProperties({
24
+ x: 0.0,
25
+ x2: undefined,
26
+ y: 0.0,
27
+ y2: undefined,
28
+ size: 1.0,
29
+ color: "black",
30
+ opacity: 1.0,
31
+
32
+ segments: 101, // Performance is affected more by the fill rate, i.e. number of pixels
33
+ arcHeightFactor: 1.0,
34
+ minArcHeight: 1.5,
35
+ minPickingSize: 3.0,
36
+ clampApex: false,
37
+ maxChordLength: 50000,
38
+ arcFadingDistance: false,
39
+ noFadingOnPointSelection: true,
40
+
41
+ linkShape: "arc",
42
+ orient: "vertical",
43
+ });
44
44
 
45
45
  /**
46
46
  * Only available if "WebGL Draft Extensions" is enabled in chrome://flags
@@ -53,6 +53,9 @@ export default class LinkMark extends Mark {
53
53
  );
54
54
  }
55
55
 
56
+ /**
57
+ * @returns {import("../spec/channel.js").Channel[]}
58
+ */
56
59
  getAttributes() {
57
60
  return [
58
61
  "uniqueId",
@@ -62,7 +65,6 @@ export default class LinkMark extends Mark {
62
65
  "y",
63
66
  "y2",
64
67
  "size",
65
- "height",
66
68
  "color",
67
69
  "opacity",
68
70
  ];
@@ -137,7 +139,7 @@ export default class LinkMark extends Mark {
137
139
  this.registerMarkUniformValue(
138
140
  "uSegmentBreaks",
139
141
  props.segments,
140
- (x) => x + 1
142
+ (x) => x
141
143
  );
142
144
  this.registerMarkUniformValue(
143
145
  "uNoFadingOnPointSelection",
@@ -205,6 +207,14 @@ export default class LinkMark extends Mark {
205
207
  render(options) {
206
208
  const gl = this.gl;
207
209
 
210
+ const getInstanceVertexCount = () => {
211
+ const breaks = /** @type {Float32Array} */ (
212
+ this.markUniformInfo.uniforms.uSegmentBreaks
213
+ )[0];
214
+
215
+ return (breaks + 1) * 2;
216
+ };
217
+
208
218
  return this._baseInstanceExt
209
219
  ? this.createRenderCallback((offset, count) => {
210
220
  // Using the following extension, which, however, is only a draft and
@@ -214,9 +224,7 @@ export default class LinkMark extends Mark {
214
224
  this._baseInstanceExt.drawArraysInstancedBaseInstanceWEBGL(
215
225
  gl.TRIANGLE_STRIP,
216
226
  0,
217
- /** @type {Float32Array} */ (
218
- this.markUniformInfo.uniforms.uSegmentBreaks
219
- )[0] * 2,
227
+ getInstanceVertexCount(),
220
228
  count,
221
229
  offset
222
230
  );
@@ -252,9 +260,7 @@ export default class LinkMark extends Mark {
252
260
  gl.drawArraysInstanced(
253
261
  gl.TRIANGLE_STRIP,
254
262
  0,
255
- /** @type {Float32Array} */ (
256
- this.markUniformInfo.uniforms.uSegmentBreaks
257
- )[0] * 2,
263
+ getInstanceVertexCount(),
258
264
  count
259
265
  );
260
266
  }, options);
@@ -1,2 +1,2 @@
1
- const shader = "out vec4 vColor;out float vSize;out float vNormalLengthInPixels;const int SHAPE_ARC=0;const int SHAPE_DOME=1;const int SHAPE_DIAGONAL=2;const int SHAPE_LINE=3;const int ORIENT_VERTICAL=0;const int ORIENT_HORIZONTAL=1;float distanceFromLine(vec2 pointOnLine1,vec2 pointOnLine2,vec2 point){vec2 a=point-pointOnLine1;vec2 b=pointOnLine2-pointOnLine1;vec2 proj=dot(a,b)/dot(b,b)*b;return length(a-proj);}bool isInsideViewport(vec2 point,float marginFactor){vec2 margin=uViewportSize*vec2(marginFactor);return point.x>=-margin.x&&point.x<=uViewportSize.x+margin.x&&point.y>=-margin.y&&point.y<=uViewportSize.y+margin.y;}void main(void){float pixelSize=1.0/uDevicePixelRatio;float opacity=getScaled_opacity()*uViewOpacity;vec2 p1,p2,p3,p4;vec2 a=applySampleFacet(vec2(getScaled_x(),getScaled_y()))*uViewportSize;vec2 b=applySampleFacet(vec2(getScaled_x2(),getScaled_y2()))*uViewportSize;if(uShape<=SHAPE_DOME){if(uShape==SHAPE_DOME){vec2 height=vec2(0.0);if(uOrient==ORIENT_VERTICAL){p1=vec2(min(a.x,b.x),b.y);p4=vec2(max(a.x,b.x),b.y);height=vec2(0.0,a.y-b.y);if(uClampApex){if(p4.x>0.0){p1.x=max(p1.x,-p4.x);}if(p1.x<uViewportSize.x){p4.x=min(p4.x,2.0*uViewportSize.x-p1.x);}}}else{p1=vec2(b.x,min(a.y,b.y));p4=vec2(b.x,max(a.y,b.y));height=vec2(a.x-b.x,0.0);if(uClampApex){if(p4.y>0.0){p1.y=max(p1.y,-p4.y);}if(p1.y<uViewportSize.y){p4.y=min(p4.y,2.0*uViewportSize.y-p1.y);}}}vec2 controlOffset=height/0.75;p2=p1+controlOffset;p3=p4+controlOffset;}if(uShape==SHAPE_ARC){p1=a;p4=b;vec2 chordVector=p4-p1;vec2 unitChordVector=normalize(chordVector);vec2 chordNormal=vec2(-unitChordVector.y,unitChordVector.x);float chordLength=length(chordVector);if(chordLength>uMaxChordLength){if(isInsideViewport(p1,2.0)){chordLength=uMaxChordLength;p4=p1+unitChordVector*uMaxChordLength;}else if(isInsideViewport(p4,2.0)){chordLength=uMaxChordLength;p1=p4-unitChordVector*uMaxChordLength;}}float height=max(chordLength/2.0*uArcHeightFactor,uMinArcHeight);vec2 controlOffset=chordNormal*height/0.75;p2=p1+controlOffset;p3=p4+controlOffset;}}else if(uShape==SHAPE_DIAGONAL){if(uOrient==ORIENT_VERTICAL){p1=a;p2=vec2(a.x,(a.y+b.y)/2.0);p3=vec2(b.x,(a.y+b.y)/2.0);p4=b;}else{p1=a;p2=vec2((a.x+b.x)/2.0,a.y);p3=vec2((a.x+b.x)/2.0,b.y);p4=b;}}else if(uShape==SHAPE_LINE){p1=a;p2=(a+b)/2.0;p3=p2;p4=b;}vec2 strip=vec2(float(gl_VertexID/2)/float(uSegmentBreaks),float(gl_VertexID % 2)-0.5);float t=smoothstep(0.0,1.0,strip.x);vec2 C1=p4-3.0*p3+3.0*p2-p1;vec2 C2=3.0*p3-6.0*p2+3.0*p1;vec2 C3=3.0*p2-3.0*p1;vec2 C4=p1;vec2 p;if(t==0.0){p=p1;}else if(t==1.0){p=p4;}else{p=C1*t*t*t+C2*t*t+C3*t+C4;}vec2 tangent=normalize(3.0*C1*t*t+2.0*C2*t+C3);vec2 normal=vec2(-tangent.y,tangent.x);float size=getScaled_size();if(size<pixelSize){opacity*=size/pixelSize;size=pixelSize;}float paddedSize=uPickingEnabled? max(size,uMinPickingSize): size+pixelSize;vNormalLengthInPixels=strip.y*paddedSize;if(uShape==SHAPE_ARC&&uArcFadingDistance[0]>0.0&&uArcFadingDistance[1]>0.0&&(!uNoFadingOnPointSelection||!isPointSelected())){float d=distanceFromLine(p1,p4,p);float distanceOpacity=smoothstep(uArcFadingDistance[1],uArcFadingDistance[0],d);opacity*=distanceOpacity;if(distanceOpacity<=0.0){vNormalLengthInPixels=0.0;}}p+=normal*vNormalLengthInPixels;gl_Position=pixelsToNdc(p);vec3 color=getScaled_color();vColor=vec4(color*opacity,opacity);vSize=paddedSize;setupPicking();}";
1
+ const shader = "out vec4 vColor;out float vSize;out float vNormalLengthInPixels;out float vGamma;const int SHAPE_ARC=0;const int SHAPE_DOME=1;const int SHAPE_DIAGONAL=2;const int SHAPE_LINE=3;const int ORIENT_VERTICAL=0;const int ORIENT_HORIZONTAL=1;float distanceFromLine(vec2 pointOnLine1,vec2 pointOnLine2,vec2 point){vec2 a=point-pointOnLine1;vec2 b=pointOnLine2-pointOnLine1;vec2 proj=dot(a,b)/dot(b,b)*b;return length(a-proj);}bool isInsideViewport(vec2 point,float marginFactor){vec2 margin=uViewportSize*vec2(marginFactor);return point.x>=-margin.x&&point.x<=uViewportSize.x+margin.x&&point.y>=-margin.y&&point.y<=uViewportSize.y+margin.y;}void main(void){float pixelSize=1.0/uDevicePixelRatio;float opacity=getScaled_opacity()*uViewOpacity;vec2 p1,p2,p3,p4;vec2 a=applySampleFacet(vec2(getScaled_x(),getScaled_y()))*uViewportSize;vec2 b=applySampleFacet(vec2(getScaled_x2(),getScaled_y2()))*uViewportSize;if(uShape<=SHAPE_DOME){if(uShape==SHAPE_DOME){vec2 height=vec2(0.0);if(uOrient==ORIENT_VERTICAL){p1=vec2(min(a.x,b.x),b.y);p4=vec2(max(a.x,b.x),b.y);height=vec2(0.0,a.y-b.y);if(uClampApex){if(p4.x>0.0){p1.x=max(p1.x,-p4.x);}if(p1.x<uViewportSize.x){p4.x=min(p4.x,2.0*uViewportSize.x-p1.x);}}}else{p1=vec2(b.x,min(a.y,b.y));p4=vec2(b.x,max(a.y,b.y));height=vec2(a.x-b.x,0.0);if(uClampApex){if(p4.y>0.0){p1.y=max(p1.y,-p4.y);}if(p1.y<uViewportSize.y){p4.y=min(p4.y,2.0*uViewportSize.y-p1.y);}}}vec2 controlOffset=height/0.75;p2=p1+controlOffset;p3=p4+controlOffset;}if(uShape==SHAPE_ARC){p1=a;p4=b;vec2 chordVector=p4-p1;vec2 unitChordVector=normalize(chordVector);vec2 chordNormal=vec2(-unitChordVector.y,unitChordVector.x);float chordLength=length(chordVector);if(chordLength>uMaxChordLength){if(isInsideViewport(p1,2.0)){chordLength=uMaxChordLength;p4=p1+unitChordVector*uMaxChordLength;}else if(isInsideViewport(p4,2.0)){chordLength=uMaxChordLength;p1=p4-unitChordVector*uMaxChordLength;}}float height=max(chordLength/2.0*uArcHeightFactor,uMinArcHeight);vec2 controlOffset=chordNormal*height/0.75;p2=p1+controlOffset;p3=p4+controlOffset;}}else if(uShape==SHAPE_DIAGONAL){if(uOrient==ORIENT_VERTICAL){p1=a;p2=vec2(a.x,(a.y+b.y)/2.0);p3=vec2(b.x,(a.y+b.y)/2.0);p4=b;}else{p1=a;p2=vec2((a.x+b.x)/2.0,a.y);p3=vec2((a.x+b.x)/2.0,b.y);p4=b;}}else if(uShape==SHAPE_LINE){p1=a;p2=(a+b)/2.0;p3=p2;p4=b;}vec2 strip=vec2(float(gl_VertexID/2)/float(uSegmentBreaks),float(gl_VertexID % 2)-0.5);float t=smoothstep(0.0,1.0,strip.x);vec2 C1=p4-3.0*p3+3.0*p2-p1;vec2 C2=3.0*p3-6.0*p2+3.0*p1;vec2 C3=3.0*p2-3.0*p1;vec2 C4=p1;vec2 p;if(t==0.0){p=p1;}else if(t==1.0){p=p4;}else{p=C1*t*t*t+C2*t*t+C3*t+C4;}vec2 tangent=normalize(3.0*C1*t*t+2.0*C2*t+C3);vec2 normal=vec2(-tangent.y,tangent.x);float size=getScaled_size();if(size<pixelSize){opacity*=size/pixelSize;size=pixelSize;}float paddedSize=uPickingEnabled? max(size,uMinPickingSize): size+pixelSize;vNormalLengthInPixels=strip.y*paddedSize;if(uShape==SHAPE_ARC&&uArcFadingDistance[0]>0.0&&uArcFadingDistance[1]>0.0&&(!uNoFadingOnPointSelection||!isPointSelected())){float d=distanceFromLine(p1,p4,p);float distanceOpacity=smoothstep(uArcFadingDistance[1],uArcFadingDistance[0],d);opacity*=distanceOpacity;if(distanceOpacity<=0.0){vNormalLengthInPixels=0.0;}}p+=normal*vNormalLengthInPixels;gl_Position=pixelsToNdc(p);vec3 color=getScaled_color();vColor=vec4(color*opacity,opacity);vGamma=getGammaForColor(color);vSize=paddedSize;setupPicking();}";
2
2
  export default shader;
@@ -12,9 +12,11 @@ export const SAMPLE_FACET_TEXTURE: "SAMPLE_FACET_TEXTURE";
12
12
  * @callback DrawFunction
13
13
  * @param {number} offset
14
14
  * @param {number} count
15
- *
16
15
  */
17
- export default class Mark {
16
+ /**
17
+ * @template {MarkProps} [P=MarkProps]
18
+ */
19
+ export default class Mark<P extends import("../spec/mark.js").MarkProps = import("../spec/mark.js").MarkProps> {
18
20
  /**
19
21
  * @param {import("../view/unitView.js").default} unitView
20
22
  */
@@ -69,25 +71,28 @@ export default class Mark {
69
71
  protected markUniformsAltered: boolean;
70
72
  /** @type {RangeMap<any>} keep track of facet locations within the vertex array */
71
73
  rangeMap: RangeMap<any>;
72
- /** @type {MarkProps} */
73
- defaultProperties: import("../spec/mark.js").MarkProps;
74
+ defaultProperties: P;
74
75
  /**
75
76
  * A properties object that contains the configured mark properties or
76
77
  * default values as fallback.
77
78
  *
78
- * TODO: Proper and comprehensive typings for mark properties
79
- *
80
- * @type {Partial<MarkProps>}
79
+ * @type {P}
81
80
  * @readonly
82
81
  */
83
- readonly properties: Partial<import("../spec/mark.js").MarkProps>;
82
+ readonly properties: P;
83
+ /**
84
+ * @param {Partial<P>} props
85
+ * @protected
86
+ */
87
+ protected augmentDefaultProperties(props: Partial<P>): void;
84
88
  get opaque(): boolean;
85
89
  /**
86
90
  * Returns attribute info for WebGL attributes that match visual channels.
87
91
  *
88
- * @returns {string[]}
92
+ * @returns {import("../spec/channel.js").Channel[]}
93
+ * @protected
89
94
  */
90
- getAttributes(): string[];
95
+ protected getAttributes(): import("../spec/channel.js").Channel[];
91
96
  /**
92
97
  * @returns {Channel[]}
93
98
  */
@@ -107,10 +112,10 @@ export default class Mark {
107
112
  * Handles dynamic properties that are not bound to uniforms but need
108
113
  * to trigger a graphics update, i.e., rebuild the vertex buffer.
109
114
  *
110
- * @param {(keyof MarkProps)[]} props
115
+ * @param {(keyof P)[]} props
111
116
  * @protected
112
117
  */
113
- protected setupExprRefsNeedingGraphicsUpdate(props: (keyof import("../spec/mark.js").MarkProps)[]): void;
118
+ protected setupExprRefsNeedingGraphicsUpdate(props: (keyof P)[]): void;
114
119
  /**
115
120
  * Returns the encoding spec supplemented with mark's default encodings
116
121
  *
@@ -118,7 +123,7 @@ export default class Mark {
118
123
  */
119
124
  get encoding(): import("../spec/channel.js").Encoding;
120
125
  getContext(): import("../types/viewContext.js").default;
121
- getType(): import("../spec/mark.js").MarkType;
126
+ getType(): "link" | "rect" | "text" | "point" | "rule";
122
127
  initializeData(): void;
123
128
  /**
124
129
  * Initialize encoders that encode fields of the data (or constants) to
@@ -195,9 +200,6 @@ export default class Mark {
195
200
  isReady(): import("twgl.js").ProgramInfo;
196
201
  /**
197
202
  * Returns true if this mark instance participates in picking.
198
- *
199
- * TODO: Check if tooltip is enabled,
200
- * TODO: Check if selection (when it's implemented) is enabled
201
203
  */
202
204
  isPickingParticipant(): boolean;
203
205
  /**
@@ -234,6 +236,7 @@ export default class Mark {
234
236
  /**
235
237
  * @param {DrawFunction} draw A function that draws a range of vertices
236
238
  * @param {import("./mark.js").MarkRenderingOptions} options
239
+ * @returns {function():void}
237
240
  */
238
241
  createRenderCallback(draw: DrawFunction, options: import("./mark.js").MarkRenderingOptions): () => void;
239
242
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"mark.d.ts","sourceRoot":"","sources":["../../../src/marks/mark.js"],"names":[],"mappings":";AAoDA,0DAA2D;AAC3D,0DAA2D;AAE3D;;;;;;;;;;;;GAYG;AACH;IAgBI;;OAEG;IACH,sBAFW,OAAO,qBAAqB,EAAE,OAAO,EAuG/C;IApGG,gDAAwB;IAExB,8EAA8E;IAC9E,uGAAyB;IAIzB;;;OAGG;IACH,sBAHU,OAAO,SAAS,EAAE,UAAU,GAAG;QAAE,iBAAiB,CAAC,EAAE,MAAM,CAAA;KAAE,CAG5C;IAE3B;;;;;;;OAOG;IACH,2BAHU,IAAI,MAAM,EAAE,MAAM,CAAC,CAGG;IAEhC;;;OAGG;IACH,uBAHU,OAAO,SAAS,EAAE,WAAW,CAGX;IAE5B;;;OAGG;IACH,2BAHU,OAAO,SAAS,EAAE,eAAe,CAGX;IAEhC;;;OAGG;IACH,2BAHU,OAAO,SAAS,EAAE,gBAAgB,CAGZ;IAEhC;;;;;OAKG;IACH,2BAHU,OAAO,SAAS,EAAE,gBAAgB,CAGZ;IAEhC;;;;;OAKG;IACH,uCAA+B;IAE/B,kFAAkF;IAClF,UADW,SAAS,GAAG,CAAC,CACM;IAG9B,wBAAwB;IACxB,uDAqBC;IAED;;;;;;;;OAQG;IACH,kEAKC;IAGL,sBAEC;IAED;;;;OAIG;IACH,iBAFa,MAAM,EAAE,CAKpB;IAED;;OAEG;IACH,+DAWC;IAED;;OAEG;IACH,4DAcC;IAED;;;;;OAKG;IACH,oGAEC;IAED;;;;;;OAMG;IACH,yGAkCC;IAED;;;;OAIG;IACH,sDAiDC;IAED,wDAEC;IAED,8CAEC;IAED,uBAEC;IAED;;;OAGG;IACH,2BAEC;IAED;;OAEG;IACH,oCAEC;IAED;;OAEG;IACH,2BAEC;IAED,sEAeC;IAED;;;;;;OAMG;IAEH,6CANW,MAAM,kBACN,MAAM,iBACN,MAAM,EAAE,QA8UlB;IALG;;;;;;MAIC;IAGL;;;;;;OAMG;IACH,uCA6CC;IAED;;;;;;OAMG;IACH,+CAHW,MAAM,UACK,GAAG,KAAE,IAAI,CAe9B;IAED;;;;;;;;;;OAUG;IACH,mDAJW,MAAM,sFAEsB,GAAG,QA6BzC;IAED;;OAEG;IACH,2BAwBC;IAED;;;OAGG;IACH,6BAFW,GAAG,QAyCb;IAED,yBAAyB;IACzB,uDAEC;IAED,yBAAyB;IACzB,iCAEC;IAED,gCAEC;IAED,+BAEC;IAED,yCAEC;IAED;;;;;OAKG;IACH,gCAcC;IAED;;OAEG;IACH,4CAOC;IAED;;;;;;;;OAQG;IAEH,uBAJW,OAAO,uBAAuB,EAAE,sBAAsB,GACpD,CAAC,MAAM,IAAI,CAAC,EAAE,CAsF1B;IAED;;;;;;OAMG;IACH,qCAJW,oBAAoB,GAClB,OAAO,CAqCnB;IAED;;;;;;;OAOG;IACH,gBAJW,oBAAoB,SACP,IAAI,CAM3B;IAED;;;OAGG;IACH,2BAHW,YAAY,WACZ,OAAO,WAAW,EAAE,oBAAoB,cAiElD;IAED;;;;;;OAMG;IACH,oBAJW,OAAO,6BAA6B,EAAE,OAAO,aAC7C,OAAO,6BAA6B,EAAE,OAAO,GAC3C,OAAO,CAuHnB;IAED;;;;;;;;;OASG;IACH,qBAJW,MAAM,KACN,OAAO,oBAAoB,EAAE,MAAM,GACjC,GAAG,CAIf;;CACJ;+BAvwCY,OAAO,uBAAuB,EAAE,gBAAgB;;;;;;wBAEnD,OAAO;;mCAEJ,gBAAgB,GAAG,qBAAqB;oCAG1C,MAAM,SACN,MAAM;AAiwCjB;;;GAGG;AACH;IACI,cAEC;IAkBD;;;OAGG;IACH,2BAFW,IAAI,CAAC,EAAE,OAAO,yBAAyB,EAAE,UAAU,CAAC,QAiB9D;CACJ;0BAj0CyB,WAAW"}
1
+ {"version":3,"file":"mark.d.ts","sourceRoot":"","sources":["../../../src/marks/mark.js"],"names":[],"mappings":"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"}
@@ -64,7 +64,10 @@ export const SAMPLE_FACET_TEXTURE = "SAMPLE_FACET_TEXTURE";
64
64
  * @callback DrawFunction
65
65
  * @param {number} offset
66
66
  * @param {number} count
67
- *
67
+ */
68
+
69
+ /**
70
+ * @template {MarkProps} [P=MarkProps]
68
71
  */
69
72
  export default class Mark {
70
73
  /**
@@ -146,9 +149,8 @@ export default class Mark {
146
149
  /** @type {RangeMap<any>} keep track of facet locations within the vertex array */
147
150
  this.rangeMap = new RangeMap();
148
151
 
149
- // TODO: Implement https://vega.github.io/vega-lite/docs/config.html
150
- /** @type {MarkProps} */
151
- this.defaultProperties = {
152
+ // TODO: Implement config: https://vega.github.io/vega-lite/docs/config.html
153
+ this.defaultProperties = /** @type {P} */ ({
152
154
  get clip() {
153
155
  // TODO: Cache once the scales have been resolved
154
156
  // TODO: Only check channels that are used
@@ -169,25 +171,34 @@ export default class Mark {
169
171
  * This property is intended for internal usage.
170
172
  */
171
173
  minBufferSize: 0,
172
- };
174
+ });
173
175
 
174
176
  /**
175
177
  * A properties object that contains the configured mark properties or
176
178
  * default values as fallback.
177
179
  *
178
- * TODO: Proper and comprehensive typings for mark properties
179
- *
180
- * @type {Partial<MarkProps>}
180
+ * @type {P}
181
181
  * @readonly
182
182
  */
183
183
  this.properties = coalesceProperties(
184
184
  typeof this.unitView.spec.mark == "object"
185
- ? () => /** @type {MarkProps} */ (this.unitView.spec.mark)
186
- : () => /** @type {MarkProps} */ ({}),
185
+ ? () => /** @type {P} */ (this.unitView.spec.mark)
186
+ : () => /** @type {P} */ ({}),
187
187
  () => this.defaultProperties
188
188
  );
189
189
  }
190
190
 
191
+ /**
192
+ * @param {Partial<P>} props
193
+ * @protected
194
+ */
195
+ augmentDefaultProperties(props) {
196
+ Object.defineProperties(
197
+ this.defaultProperties,
198
+ Object.getOwnPropertyDescriptors(props)
199
+ );
200
+ }
201
+
191
202
  get opaque() {
192
203
  return false;
193
204
  }
@@ -195,7 +206,8 @@ export default class Mark {
195
206
  /**
196
207
  * Returns attribute info for WebGL attributes that match visual channels.
197
208
  *
198
- * @returns {string[]}
209
+ * @returns {import("../spec/channel.js").Channel[]}
210
+ * @protected
199
211
  */
200
212
  getAttributes() {
201
213
  // override
@@ -251,7 +263,7 @@ export default class Mark {
251
263
  * Handles dynamic properties that are not bound to uniforms but need
252
264
  * to trigger a graphics update, i.e., rebuild the vertex buffer.
253
265
  *
254
- * @param {(keyof MarkProps)[]} props
266
+ * @param {(keyof P)[]} props
255
267
  * @protected
256
268
  */
257
269
  setupExprRefsNeedingGraphicsUpdate(props) {
@@ -951,13 +963,12 @@ export default class Mark {
951
963
 
952
964
  /**
953
965
  * Returns true if this mark instance participates in picking.
954
- *
955
- * TODO: Check if tooltip is enabled,
956
- * TODO: Check if selection (when it's implemented) is enabled
957
966
  */
958
967
  isPickingParticipant() {
959
- // TODO: Should check encoding instead
960
- if (this.properties.tooltip === null) {
968
+ if (
969
+ this.properties.tooltip === null &&
970
+ !this.unitView.paramMediator.hasPointSelections()
971
+ ) {
961
972
  // Disabled
962
973
  return false;
963
974
  }
@@ -1137,13 +1148,16 @@ export default class Mark {
1137
1148
  /**
1138
1149
  * @param {DrawFunction} draw A function that draws a range of vertices
1139
1150
  * @param {import("./mark.js").MarkRenderingOptions} options
1151
+ * @returns {function():void}
1140
1152
  */
1141
1153
  createRenderCallback(draw, options) {
1142
1154
  if (!this.bufferInfo) {
1143
- throw new ViewError(
1144
- `${this.getType()} mark has no data. This is bug.`,
1145
- this.unitView
1146
- );
1155
+ // This happens if the layout is computed before the data flow has propagated.
1156
+ // However, it's not a big deal, because this will be called again at the end
1157
+ // of the initialization process.
1158
+
1159
+ // Return no operation
1160
+ return () => undefined;
1147
1161
  }
1148
1162
 
1149
1163
  // eslint-disable-next-line consistent-this
@@ -1270,14 +1284,14 @@ export default class Mark {
1270
1284
  // Because glViewport accepts only integers, we subtract the rounding
1271
1285
  // errors from xyOffsets to guarantee that graphics in clipped
1272
1286
  // and non-clipped viewports align correctly
1273
- const roundedCoords = physicalGlCoords.map((x) => Math.round(x));
1274
- const [xError, yError] = physicalGlCoords.map(
1275
- (x, i) => x - roundedCoords[i]
1276
- );
1287
+ const roundedCoords =
1288
+ /** @type {[number, number, number, number]} */ (
1289
+ physicalGlCoords.map((x) => Math.floor(x))
1290
+ );
1291
+ const xError = physicalGlCoords[0] - roundedCoords[0];
1292
+ const yError = physicalGlCoords[1] - roundedCoords[1];
1277
1293
 
1278
- // @ts-ignore
1279
1294
  gl.viewport(...roundedCoords);
1280
- // @ts-ignore
1281
1295
  gl.scissor(...roundedCoords);
1282
1296
  gl.enable(gl.SCISSOR_TEST);
1283
1297
 
@@ -18,6 +18,31 @@ export function fixStroke(encoding: import("../spec/channel.js").Encoding, fille
18
18
  * @param {boolean} filled
19
19
  */
20
20
  export function fixFill(encoding: import("../spec/channel.js").Encoding, filled: boolean): void;
21
+ /**
22
+ * @param {import("../spec/mark.js").MarkProps} props
23
+ * @returns {props is import("../spec/mark.js").PointProps}
24
+ */
25
+ export function isPointProps(props: import("../spec/mark.js").MarkProps): props is import("../spec/mark.js").PointProps;
26
+ /**
27
+ * @param {import("../spec/mark.js").MarkProps} props
28
+ * @returns {props is import("../spec/mark.js").RectProps}
29
+ */
30
+ export function isRectProps(props: import("../spec/mark.js").MarkProps): props is import("../spec/mark.js").RectProps;
31
+ /**
32
+ * @param {import("../spec/mark.js").MarkProps} props
33
+ * @returns {props is import("../spec/mark.js").RuleProps}
34
+ */
35
+ export function isRuleProps(props: import("../spec/mark.js").MarkProps): props is import("../spec/mark.js").RuleProps;
36
+ /**
37
+ * @param {import("../spec/mark.js").MarkProps} props
38
+ * @returns {props is import("../spec/mark.js").TextProps}
39
+ */
40
+ export function isTextProps(props: import("../spec/mark.js").MarkProps): props is import("../spec/mark.js").TextProps;
41
+ /**
42
+ * @param {import("../spec/mark.js").MarkProps} props
43
+ * @returns {props is import("../spec/mark.js").LinkProps}
44
+ */
45
+ export function isLinkProps(props: import("../spec/mark.js").MarkProps): props is import("../spec/mark.js").LinkProps;
21
46
  export type Encoding = import("../spec/channel.js").Encoding;
22
47
  export type Channel = import("../spec/channel.js").Channel;
23
48
  //# sourceMappingURL=markUtils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"markUtils.d.ts","sourceRoot":"","sources":["../../../src/marks/markUtils.js"],"names":[],"mappings":"AAMA;;;;GAIG;AAEH;;;GAGG;AACH,wCAHW,QAAQ,WACR,OAAO,oBAAoB,EAAE,wBAAwB,QAoD/D;AAED;;;GAGG;AACH,oCAHW,OAAO,oBAAoB,EAAE,QAAQ,UACrC,OAAO,QAyBjB;AAED;;;GAGG;AACH,kCAHW,OAAO,oBAAoB,EAAE,QAAQ,UACrC,OAAO,QAyBjB;uBApHY,OAAO,oBAAoB,EAAE,QAAQ;sBACrC,OAAO,oBAAoB,EAAE,OAAO"}
1
+ {"version":3,"file":"markUtils.d.ts","sourceRoot":"","sources":["../../../src/marks/markUtils.js"],"names":[],"mappings":"AAMA;;;;GAIG;AAEH;;;GAGG;AACH,wCAHW,QAAQ,WACR,OAAO,oBAAoB,EAAE,wBAAwB,QAoD/D;AAED;;;GAGG;AACH,oCAHW,OAAO,oBAAoB,EAAE,QAAQ,UACrC,OAAO,QAyBjB;AAED;;;GAGG;AACH,kCAHW,OAAO,oBAAoB,EAAE,QAAQ,UACrC,OAAO,QAyBjB;AAED;;;GAGG;AACH,oCAHW,OAAO,iBAAiB,EAAE,SAAS,iDAK7C;AAED;;;GAGG;AACH,mCAHW,OAAO,iBAAiB,EAAE,SAAS,gDAK7C;AAED;;;GAGG;AACH,mCAHW,OAAO,iBAAiB,EAAE,SAAS,gDAK7C;AAED;;;GAGG;AACH,mCAHW,OAAO,iBAAiB,EAAE,SAAS,gDAK7C;AAED;;;GAGG;AACH,mCAHW,OAAO,iBAAiB,EAAE,SAAS,gDAK7C;uBA5JY,OAAO,oBAAoB,EAAE,QAAQ;sBACrC,OAAO,oBAAoB,EAAE,OAAO"}
@@ -37,7 +37,7 @@ export function fixPositional(encoding, channel) {
37
37
  if (!secondary) {
38
38
  if (primary.type == "quantitative") {
39
39
  // Bar plot, anchor the other end to zero
40
- secondary = { datum: 0 };
40
+ secondary = { datum: 0, contributesToScaleDomain: false };
41
41
  } else {
42
42
  secondary = { ...primary };
43
43
 
@@ -123,3 +123,43 @@ export function fixFill(encoding, filled) {
123
123
  }
124
124
  }
125
125
  }
126
+
127
+ /**
128
+ * @param {import("../spec/mark.js").MarkProps} props
129
+ * @returns {props is import("../spec/mark.js").PointProps}
130
+ */
131
+ export function isPointProps(props) {
132
+ return props.type === "point";
133
+ }
134
+
135
+ /**
136
+ * @param {import("../spec/mark.js").MarkProps} props
137
+ * @returns {props is import("../spec/mark.js").RectProps}
138
+ */
139
+ export function isRectProps(props) {
140
+ return props.type === "point";
141
+ }
142
+
143
+ /**
144
+ * @param {import("../spec/mark.js").MarkProps} props
145
+ * @returns {props is import("../spec/mark.js").RuleProps}
146
+ */
147
+ export function isRuleProps(props) {
148
+ return props.type === "point";
149
+ }
150
+
151
+ /**
152
+ * @param {import("../spec/mark.js").MarkProps} props
153
+ * @returns {props is import("../spec/mark.js").TextProps}
154
+ */
155
+ export function isTextProps(props) {
156
+ return props.type === "point";
157
+ }
158
+
159
+ /**
160
+ * @param {import("../spec/mark.js").MarkProps} props
161
+ * @returns {props is import("../spec/mark.js").LinkProps}
162
+ */
163
+ export function isLinkProps(props) {
164
+ return props.type === "point";
165
+ }
@@ -1,2 +1,2 @@
1
- const shader = "layout(std140)uniform Mark{/***The stroke should only grow inwards,e.g,the diameter/outline is not affected by the stroke width.*Thus,a point that has a zero size has no visible stroke. This allows strokes to be used with*geometric zoom,etc.*/uniform bool uInwardStroke;uniform mediump float uScaleFactor;uniform mediump float uZoomLevel;uniform highp float uSemanticThreshold;uniform mediump float uGradientStrength;\n#pragma markUniforms\n};";
1
+ const shader = "layout(std140)uniform Mark{/***The stroke should only grow inwards,e.g,the diameter/outline is not affected by the stroke width.*Thus,a point that has a zero size has no visible stroke. This allows strokes to be used with*geometric zoom,etc.*/uniform bool uInwardStroke;uniform float uMinPickingSize;uniform mediump float uScaleFactor;uniform mediump float uZoomLevel;uniform highp float uSemanticThreshold;uniform mediump float uGradientStrength;\n#pragma markUniforms\n};";
2
2
  export default shader;
@@ -1,4 +1,11 @@
1
- export default class PointMark extends Mark {
1
+ /**
2
+ * @extends {Mark<import("../spec/mark.js").PointProps>}
3
+ */
4
+ export default class PointMark extends Mark<import("../spec/mark.js").PointProps> {
5
+ /**
6
+ * @param {import("../view/unitView.js").default} unitView
7
+ */
8
+ constructor(unitView: import("../view/unitView.js").default);
2
9
  sampledSemanticScores: Float32Array;
3
10
  getSemanticThreshold(): number;
4
11
  #private;
@@ -1 +1 @@
1
- {"version":3,"file":"point.d.ts","sourceRoot":"","sources":["../../../src/marks/point.js"],"names":[],"mappings":"AAmBA;IA0HY,oCAMC;IAiET,+BAkBC;;CAgDJ;iBA3QgB,WAAW"}
1
+ {"version":3,"file":"point.d.ts","sourceRoot":"","sources":["../../../src/marks/point.js"],"names":[],"mappings":"AAmBA;;GAEG;AACH;IAGI;;OAEG;IACH,sBAFW,OAAO,qBAAqB,EAAE,OAAO,EA6C/C;IA0EO,oCAMC;IAkET,+BAkBC;;CAgDJ;iBAhRgB,WAAW"}