@ni/nimble-components 29.1.6 → 29.1.8

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 (52) hide show
  1. package/dist/all-components-bundle.js +487 -496
  2. package/dist/all-components-bundle.js.map +1 -1
  3. package/dist/all-components-bundle.min.js +1597 -1639
  4. package/dist/all-components-bundle.min.js.map +1 -1
  5. package/dist/esm/rich-text/mention-listbox/template.js +2 -2
  6. package/dist/esm/rich-text/mention-listbox/template.js.map +1 -1
  7. package/dist/esm/wafer-map/{modules/experimental → experimental}/computations.d.ts +25 -8
  8. package/dist/esm/wafer-map/{modules/experimental → experimental}/computations.js +87 -8
  9. package/dist/esm/wafer-map/experimental/computations.js.map +1 -0
  10. package/dist/esm/wafer-map/{modules/experimental → experimental}/hover-handler.d.ts +1 -1
  11. package/dist/esm/wafer-map/{modules/experimental → experimental}/hover-handler.js +3 -5
  12. package/dist/esm/wafer-map/experimental/hover-handler.js.map +1 -0
  13. package/dist/esm/wafer-map/experimental/worker-renderer.d.ts +24 -0
  14. package/dist/esm/wafer-map/experimental/worker-renderer.js +75 -0
  15. package/dist/esm/wafer-map/experimental/worker-renderer.js.map +1 -0
  16. package/dist/esm/wafer-map/index.d.ts +4 -3
  17. package/dist/esm/wafer-map/index.js +54 -18
  18. package/dist/esm/wafer-map/index.js.map +1 -1
  19. package/dist/esm/wafer-map/modules/computations.d.ts +1 -1
  20. package/dist/esm/wafer-map/modules/computations.js.map +1 -1
  21. package/dist/esm/wafer-map/modules/data-manager.d.ts +2 -1
  22. package/dist/esm/wafer-map/modules/data-manager.js.map +1 -1
  23. package/dist/esm/wafer-map/modules/prerendering.js.map +1 -1
  24. package/dist/esm/wafer-map/modules/wafer-map-update-tracker.d.ts +4 -0
  25. package/dist/esm/wafer-map/modules/wafer-map-update-tracker.js +37 -2
  26. package/dist/esm/wafer-map/modules/wafer-map-update-tracker.js.map +1 -1
  27. package/dist/esm/wafer-map/types.d.ts +0 -16
  28. package/dist/esm/wafer-map/types.js.map +1 -1
  29. package/dist/esm/wafer-map/workers/matrix-renderer.d.ts +1 -1
  30. package/dist/esm/wafer-map/workers/matrix-renderer.js +1 -1
  31. package/dist/esm/wafer-map/workers/matrix-renderer.js.map +1 -1
  32. package/dist/esm/wafer-map/workers/types.d.ts +39 -0
  33. package/dist/esm/wafer-map/workers/types.js +2 -0
  34. package/dist/esm/wafer-map/workers/types.js.map +1 -0
  35. package/package.json +1 -1
  36. package/dist/esm/listbox/index.d.ts +0 -12
  37. package/dist/esm/listbox/index.js +0 -15
  38. package/dist/esm/listbox/index.js.map +0 -1
  39. package/dist/esm/listbox/styles.d.ts +0 -1
  40. package/dist/esm/listbox/styles.js +0 -27
  41. package/dist/esm/listbox/styles.js.map +0 -1
  42. package/dist/esm/wafer-map/modules/experimental/computations.js.map +0 -1
  43. package/dist/esm/wafer-map/modules/experimental/data-manager.d.ts +0 -21
  44. package/dist/esm/wafer-map/modules/experimental/data-manager.js +0 -41
  45. package/dist/esm/wafer-map/modules/experimental/data-manager.js.map +0 -1
  46. package/dist/esm/wafer-map/modules/experimental/hover-handler.js.map +0 -1
  47. package/dist/esm/wafer-map/modules/experimental/prerendering.d.ts +0 -18
  48. package/dist/esm/wafer-map/modules/experimental/prerendering.js +0 -63
  49. package/dist/esm/wafer-map/modules/experimental/prerendering.js.map +0 -1
  50. package/dist/esm/wafer-map/modules/experimental/worker-renderer.d.ts +0 -13
  51. package/dist/esm/wafer-map/modules/experimental/worker-renderer.js +0 -96
  52. package/dist/esm/wafer-map/modules/experimental/worker-renderer.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import { html, ref, slotted } from '@microsoft/fast-element';
2
- import { Listbox } from '../../listbox';
2
+ import { ListboxElement } from '@microsoft/fast-foundation';
3
3
  import { anchoredRegionTag } from '../../anchored-region';
4
4
  // prettier-ignore
5
5
  export const template = html `
@@ -23,7 +23,7 @@ export const template = html `
23
23
  ?disabled="${x => x.disabled}"
24
24
  >
25
25
  <slot
26
- ${slotted({ filter: (n) => n instanceof HTMLElement && Listbox.slottedOptionFilter(n), flatten: true, property: 'slottedOptions' })}
26
+ ${slotted({ filter: (n) => n instanceof HTMLElement && ListboxElement.slottedOptionFilter(n), flatten: true, property: 'slottedOptions' })}
27
27
  >
28
28
  </slot>
29
29
  </div>
@@ -1 +1 @@
1
- {"version":3,"file":"template.js","sourceRoot":"","sources":["../../../../src/rich-text/mention-listbox/template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAE7D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,kBAAkB;AAClB,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAwB;;WAEzC,iBAAiB;cACd,GAAG,CAAC,QAAQ,CAAC;;;;;;;;;uBASJ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;;;;;0BAKT,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAmB,CAAC;6BAC5C,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ;;;sBAGtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,CAAO,EAAE,EAAE,CAAC,CAAC,YAAY,WAAW,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC;;;;YAIjJ,iBAAiB;;CAE5B,CAAC","sourcesContent":["import { html, ref, slotted } from '@microsoft/fast-element';\nimport type { RichTextMentionListbox } from '.';\nimport { Listbox } from '../../listbox';\nimport { anchoredRegionTag } from '../../anchored-region';\n\n// prettier-ignore\nexport const template = html<RichTextMentionListbox>`\n <template>\n <${anchoredRegionTag}\n ${ref('region')}\n class=\"anchored-region\"\n fixed-placement\n auto-update-mode=\"auto\"\n vertical-default-position=\"bottom\"\n vertical-positioning-mode=\"locktodefault\"\n horizontal-default-position=\"center\"\n horizontal-positioning-mode=\"locktodefault\"\n horizontal-scaling=\"anchor\"\n ?hidden=\"${x => !x.open}\">\n <div\n class=\"listbox\"\n part=\"listbox\"\n role=\"listbox\"\n @click=\"${(x, c) => x.clickHandler(c.event as MouseEvent)}\"\n ?disabled=\"${x => x.disabled}\"\n >\n <slot\n ${slotted({ filter: (n: Node) => n instanceof HTMLElement && Listbox.slottedOptionFilter(n), flatten: true, property: 'slottedOptions' })}\n >\n </slot>\n </div>\n </${anchoredRegionTag}>\n </template>\n`;\n"]}
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../../../../src/rich-text/mention-listbox/template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,kBAAkB;AAClB,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAwB;;WAEzC,iBAAiB;cACd,GAAG,CAAC,QAAQ,CAAC;;;;;;;;;uBASJ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;;;;;0BAKT,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAmB,CAAC;6BAC5C,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ;;;sBAGtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,CAAO,EAAE,EAAE,CAAC,CAAC,YAAY,WAAW,IAAI,cAAc,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC;;;;YAIxJ,iBAAiB;;CAE5B,CAAC","sourcesContent":["import { html, ref, slotted } from '@microsoft/fast-element';\nimport { ListboxElement } from '@microsoft/fast-foundation';\nimport type { RichTextMentionListbox } from '.';\nimport { anchoredRegionTag } from '../../anchored-region';\n\n// prettier-ignore\nexport const template = html<RichTextMentionListbox>`\n <template>\n <${anchoredRegionTag}\n ${ref('region')}\n class=\"anchored-region\"\n fixed-placement\n auto-update-mode=\"auto\"\n vertical-default-position=\"bottom\"\n vertical-positioning-mode=\"locktodefault\"\n horizontal-default-position=\"center\"\n horizontal-positioning-mode=\"locktodefault\"\n horizontal-scaling=\"anchor\"\n ?hidden=\"${x => !x.open}\">\n <div\n class=\"listbox\"\n part=\"listbox\"\n role=\"listbox\"\n @click=\"${(x, c) => x.clickHandler(c.event as MouseEvent)}\"\n ?disabled=\"${x => x.disabled}\"\n >\n <slot\n ${slotted({ filter: (n: Node) => n instanceof HTMLElement && ListboxElement.slottedOptionFilter(n), flatten: true, property: 'slottedOptions' })}\n >\n </slot>\n </div>\n </${anchoredRegionTag}>\n </template>\n`;\n"]}
@@ -1,25 +1,40 @@
1
1
  import { ScaleLinear } from 'd3-scale';
2
- import type { WaferMap } from '../..';
3
- import { Dimensions, Margin } from '../../types';
2
+ import type { WaferMap } from '..';
3
+ import type { ColorScale, Dimensions, Margin } from '../workers/types';
4
4
  /**
5
5
  * Computations calculates and stores different measures which are used in the Wafermap
6
6
  */
7
7
  export declare class Computations {
8
8
  private readonly wafermap;
9
+ get horizontalScale(): ScaleLinear<number, number>;
10
+ get verticalScale(): ScaleLinear<number, number>;
9
11
  get containerDimensions(): Dimensions;
10
12
  get dieDimensions(): Dimensions;
11
13
  get margin(): Margin;
12
- get horizontalScale(): ScaleLinear<number, number>;
13
- get verticalScale(): ScaleLinear<number, number>;
14
+ get verticalCoefficient(): number;
15
+ get horizontalCoefficient(): number;
16
+ get horizontalConstant(): number;
17
+ get verticalConstant(): number;
18
+ get labelsFontSize(): number;
19
+ get colorScale(): ColorScale;
20
+ private _horizontalScale;
21
+ private _verticalScale;
14
22
  private _containerDimensions;
15
23
  private _dieDimensions;
16
24
  private _margin;
17
- private _horizontalScale;
18
- private _verticalScale;
19
- private readonly defaultPadding;
25
+ private _verticalCoefficient;
26
+ private _horizontalCoefficient;
27
+ private _horizontalConstant;
28
+ private _verticalConstant;
29
+ private _labelsFontSize;
30
+ private _colorScale;
20
31
  private readonly baseMarginPercentage;
32
+ private readonly fontSizeFactor;
33
+ private readonly colorScaleResolution;
21
34
  constructor(wafermap: WaferMap);
22
- update(): void;
35
+ componentResizeUpdate(): void;
36
+ inputDataUpdate(): void;
37
+ colorAndTextUpdate(): void;
23
38
  private gridDimensionsValidAndDefined;
24
39
  private calculateGridDimensionsFromBoundingBox;
25
40
  private calculateGridDimensionsFromDies;
@@ -27,4 +42,6 @@ export declare class Computations {
27
42
  private createHorizontalScale;
28
43
  private createVerticalScale;
29
44
  private calculateMarginAddition;
45
+ private calculateColorScale;
46
+ private calculateLabelsFontSize;
30
47
  }
@@ -1,9 +1,16 @@
1
1
  import { scaleLinear } from 'd3-scale';
2
- import { WaferMapOriginLocation } from '../../types';
2
+ import { ticks } from 'd3-array';
3
+ import { WaferMapColorScaleMode, WaferMapOriginLocation } from '../types';
3
4
  /**
4
5
  * Computations calculates and stores different measures which are used in the Wafermap
5
6
  */
6
7
  export class Computations {
8
+ get horizontalScale() {
9
+ return this._horizontalScale;
10
+ }
11
+ get verticalScale() {
12
+ return this._verticalScale;
13
+ }
7
14
  get containerDimensions() {
8
15
  return this._containerDimensions;
9
16
  }
@@ -13,18 +20,31 @@ export class Computations {
13
20
  get margin() {
14
21
  return this._margin;
15
22
  }
16
- get horizontalScale() {
17
- return this._horizontalScale;
23
+ get verticalCoefficient() {
24
+ return this._verticalCoefficient;
18
25
  }
19
- get verticalScale() {
20
- return this._verticalScale;
26
+ get horizontalCoefficient() {
27
+ return this._horizontalCoefficient;
28
+ }
29
+ get horizontalConstant() {
30
+ return this._horizontalConstant;
31
+ }
32
+ get verticalConstant() {
33
+ return this._verticalConstant;
34
+ }
35
+ get labelsFontSize() {
36
+ return this._labelsFontSize;
37
+ }
38
+ get colorScale() {
39
+ return this._colorScale;
21
40
  }
22
41
  constructor(wafermap) {
23
42
  this.wafermap = wafermap;
24
- this.defaultPadding = 0;
25
43
  this.baseMarginPercentage = 0.04;
44
+ this.fontSizeFactor = 0.8;
45
+ this.colorScaleResolution = 10;
26
46
  }
27
- update() {
47
+ componentResizeUpdate() {
28
48
  const canvasDimensions = {
29
49
  width: this.wafermap.canvasWidth,
30
50
  height: this.wafermap.canvasHeight
@@ -43,7 +63,14 @@ export class Computations {
43
63
  left: canvasDiameter * this.baseMarginPercentage
44
64
  };
45
65
  this._margin = this.calculateMarginAddition(baseMargin, canvasMargin);
46
- this._containerDimensions = this.calculateContainerDimensions(canvasDimensions, this._margin);
66
+ this._containerDimensions = this.calculateContainerDimensions(canvasDimensions, this.margin);
67
+ this.inputDataUpdate();
68
+ }
69
+ inputDataUpdate() {
70
+ if (this._containerDimensions === undefined) {
71
+ this.componentResizeUpdate();
72
+ return;
73
+ }
47
74
  const containerDiameter = Math.min(this._containerDimensions.width, this._containerDimensions.height);
48
75
  const gridDimensions = this.gridDimensionsValidAndDefined()
49
76
  ? this.calculateGridDimensionsFromBoundingBox()
@@ -53,10 +80,23 @@ export class Computations {
53
80
  this._horizontalScale = this.createHorizontalScale(originLocation, gridDimensions, containerDiameter);
54
81
  // this scale is used for positioning the dies on the canvas
55
82
  this._verticalScale = this.createVerticalScale(originLocation, gridDimensions, containerDiameter);
83
+ this._horizontalCoefficient = this._horizontalScale(1) - this._horizontalScale(0);
84
+ this._verticalCoefficient = this._verticalScale(1) - this._verticalScale(0);
85
+ this._horizontalConstant = this._horizontalScale(0);
86
+ this._verticalConstant = this._verticalScale(0);
56
87
  this._dieDimensions = {
57
88
  width: Math.abs(this._horizontalScale(0) - this._horizontalScale(1)),
58
89
  height: Math.abs(this._verticalScale(0) - this._verticalScale(1))
59
90
  };
91
+ this.colorAndTextUpdate();
92
+ }
93
+ colorAndTextUpdate() {
94
+ if (this._dieDimensions === undefined) {
95
+ this.inputDataUpdate();
96
+ return;
97
+ }
98
+ this._labelsFontSize = this.calculateLabelsFontSize(this._dieDimensions, this.wafermap.maxCharacters);
99
+ this._colorScale = this.calculateColorScale();
60
100
  }
61
101
  gridDimensionsValidAndDefined() {
62
102
  return (!this.wafermap.validity.invalidGridDimensions
@@ -151,5 +191,44 @@ export class Computations {
151
191
  left: baseMargin.left + addedMargin.left
152
192
  };
153
193
  }
194
+ calculateColorScale() {
195
+ if (this.wafermap.colorScaleMode === WaferMapColorScaleMode.linear) {
196
+ const values = this.wafermap.colorScale.values.map(item => +item);
197
+ const d3ColorScale = scaleLinear()
198
+ .domain(values)
199
+ .range(this.wafermap.colorScale.colors);
200
+ let min = values[0];
201
+ let max = values[0];
202
+ values.forEach(value => {
203
+ if (value < min) {
204
+ min = value;
205
+ }
206
+ if (value > max) {
207
+ max = value;
208
+ }
209
+ });
210
+ // the linear color scale will not be infinite but will be limited by the color scale resolution
211
+ const valueSamples = ticks(min, max, values.length * this.colorScaleResolution);
212
+ return valueSamples.map(value => {
213
+ return {
214
+ color: d3ColorScale(value),
215
+ value
216
+ };
217
+ });
218
+ }
219
+ // ordinal color categories have to be sorted by value
220
+ return this.wafermap.colorScale.colors
221
+ .map((color, index) => {
222
+ return {
223
+ color,
224
+ value: +this.wafermap.colorScale.values[index]
225
+ };
226
+ })
227
+ .sort((a, b) => a.value - b.value);
228
+ }
229
+ calculateLabelsFontSize(dieDimensions, maxCharacters) {
230
+ return Math.min(dieDimensions.height, (dieDimensions.width / (Math.max(2, maxCharacters) * 0.5))
231
+ * this.fontSizeFactor);
232
+ }
154
233
  }
155
234
  //# sourceMappingURL=computations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computations.js","sourceRoot":"","sources":["../../../../src/wafer-map/experimental/computations.ts"],"names":[],"mappings":"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","sourcesContent":["import { scaleLinear, ScaleLinear } from 'd3-scale';\nimport { ticks } from 'd3-array';\nimport type { WaferMap } from '..';\nimport { WaferMapColorScaleMode, WaferMapOriginLocation } from '../types';\nimport type { ColorScale, Dimensions, Margin } from '../workers/types';\n\ninterface GridDimensions {\n origin: {\n x: number,\n y: number\n };\n rows: number;\n cols: number;\n}\n\n/**\n * Computations calculates and stores different measures which are used in the Wafermap\n */\nexport class Computations {\n public get horizontalScale(): ScaleLinear<number, number> {\n return this._horizontalScale;\n }\n\n public get verticalScale(): ScaleLinear<number, number> {\n return this._verticalScale;\n }\n\n public get containerDimensions(): Dimensions {\n return this._containerDimensions;\n }\n\n public get dieDimensions(): Dimensions {\n return this._dieDimensions;\n }\n\n public get margin(): Margin {\n return this._margin;\n }\n\n public get verticalCoefficient(): number {\n return this._verticalCoefficient;\n }\n\n public get horizontalCoefficient(): number {\n return this._horizontalCoefficient;\n }\n\n public get horizontalConstant(): number {\n return this._horizontalConstant;\n }\n\n public get verticalConstant(): number {\n return this._verticalConstant;\n }\n\n public get labelsFontSize(): number {\n return this._labelsFontSize;\n }\n\n public get colorScale(): ColorScale {\n return this._colorScale;\n }\n\n private _horizontalScale!: ScaleLinear<number, number>;\n private _verticalScale!: ScaleLinear<number, number>;\n private _containerDimensions!: Dimensions;\n private _dieDimensions!: Dimensions;\n private _margin!: Margin;\n private _verticalCoefficient!: number;\n private _horizontalCoefficient!: number;\n private _horizontalConstant!: number;\n private _verticalConstant!: number;\n private _labelsFontSize!: number;\n private _colorScale!: ColorScale;\n\n private readonly baseMarginPercentage = 0.04;\n private readonly fontSizeFactor = 0.8;\n private readonly colorScaleResolution = 10;\n\n public constructor(private readonly wafermap: WaferMap) {}\n\n public componentResizeUpdate(): void {\n const canvasDimensions = {\n width: this.wafermap.canvasWidth,\n height: this.wafermap.canvasHeight\n };\n const canvasDiameter = Math.min(\n canvasDimensions.width,\n canvasDimensions.height\n );\n const canvasMargin = {\n top: (canvasDimensions.height - canvasDiameter) / 2,\n right: (canvasDimensions.width - canvasDiameter) / 2,\n bottom: (canvasDimensions.height - canvasDiameter) / 2,\n left: (canvasDimensions.width - canvasDiameter) / 2\n };\n const baseMargin = {\n top: canvasDiameter * this.baseMarginPercentage,\n right: canvasDiameter * this.baseMarginPercentage,\n bottom: canvasDiameter * this.baseMarginPercentage,\n left: canvasDiameter * this.baseMarginPercentage\n };\n this._margin = this.calculateMarginAddition(baseMargin, canvasMargin);\n this._containerDimensions = this.calculateContainerDimensions(\n canvasDimensions,\n this.margin\n );\n this.inputDataUpdate();\n }\n\n public inputDataUpdate(): void {\n if (this._containerDimensions === undefined) {\n this.componentResizeUpdate();\n return;\n }\n const containerDiameter = Math.min(\n this._containerDimensions.width,\n this._containerDimensions.height\n );\n const gridDimensions = this.gridDimensionsValidAndDefined()\n ? this.calculateGridDimensionsFromBoundingBox()\n : this.calculateGridDimensionsFromDies();\n // this scale is used for positioning the dies on the canvas\n const originLocation = this.wafermap.originLocation;\n this._horizontalScale = this.createHorizontalScale(\n originLocation,\n gridDimensions,\n containerDiameter\n );\n // this scale is used for positioning the dies on the canvas\n this._verticalScale = this.createVerticalScale(\n originLocation,\n gridDimensions,\n containerDiameter\n );\n this._horizontalCoefficient = this._horizontalScale(1) - this._horizontalScale(0);\n this._verticalCoefficient = this._verticalScale(1) - this._verticalScale(0);\n this._horizontalConstant = this._horizontalScale(0);\n this._verticalConstant = this._verticalScale(0);\n\n this._dieDimensions = {\n width: Math.abs(\n this._horizontalScale(0) - this._horizontalScale(1)\n ),\n height: Math.abs(this._verticalScale(0) - this._verticalScale(1))\n };\n this.colorAndTextUpdate();\n }\n\n public colorAndTextUpdate(): void {\n if (this._dieDimensions === undefined) {\n this.inputDataUpdate();\n return;\n }\n this._labelsFontSize = this.calculateLabelsFontSize(\n this._dieDimensions,\n this.wafermap.maxCharacters\n );\n this._colorScale = this.calculateColorScale();\n }\n\n private gridDimensionsValidAndDefined(): boolean {\n return (\n !this.wafermap.validity.invalidGridDimensions\n && typeof this.wafermap.gridMinX === 'number'\n && typeof this.wafermap.gridMinY === 'number'\n && typeof this.wafermap.gridMaxX === 'number'\n && typeof this.wafermap.gridMinX === 'number'\n );\n }\n\n private calculateGridDimensionsFromBoundingBox(): GridDimensions {\n const gridDimensions = { origin: { x: 0, y: 0 }, rows: 0, cols: 0 };\n if (\n typeof this.wafermap.gridMaxY === 'number'\n && typeof this.wafermap.gridMinY === 'number'\n && typeof this.wafermap.gridMaxX === 'number'\n && typeof this.wafermap.gridMinX === 'number'\n ) {\n gridDimensions.origin.x = this.wafermap.gridMinX;\n gridDimensions.origin.y = this.wafermap.gridMinY;\n gridDimensions.rows = this.wafermap.gridMaxY - this.wafermap.gridMinY + 1;\n gridDimensions.cols = this.wafermap.gridMaxX - this.wafermap.gridMinX + 1;\n }\n return gridDimensions;\n }\n\n private calculateGridDimensionsFromDies(): GridDimensions {\n if (this.wafermap.diesTable === undefined) {\n return { origin: { x: 0, y: 0 }, rows: 0, cols: 0 };\n }\n\n const colIndex = this.wafermap.diesTable\n .getChild('colIndex')!\n .toArray();\n const rowIndex = this.wafermap.diesTable\n .getChild('rowIndex')!\n .toArray();\n\n const minPoint = { x: colIndex[0]!, y: rowIndex[0]! };\n const maxPoint = { x: colIndex[0]!, y: rowIndex[0]! };\n\n // will replace iterating with arquero after fixing issues: https://github.com/uwdata/arquero/pull/346\n for (let i = 0; i < colIndex.length; i++) {\n if (colIndex[i]! < minPoint.x) {\n minPoint.x = colIndex[i]!;\n }\n if (colIndex[i]! > maxPoint.x) {\n maxPoint.x = colIndex[i]!;\n }\n if (rowIndex[i]! < minPoint.y) {\n minPoint.y = rowIndex[i]!;\n }\n if (rowIndex[i]! > maxPoint.y) {\n maxPoint.y = rowIndex[i]!;\n }\n }\n\n return {\n origin: minPoint,\n rows: maxPoint.y - minPoint.y + 1,\n cols: maxPoint.x - minPoint.x + 1\n };\n }\n\n private calculateContainerDimensions(\n canvasDimensions: Dimensions,\n margin: Margin\n ): Dimensions {\n return {\n width: canvasDimensions.width - margin.left - margin.right,\n height: canvasDimensions.height - margin.top - margin.bottom\n };\n }\n\n private createHorizontalScale(\n originLocation: WaferMapOriginLocation,\n grid: GridDimensions,\n containerWidth: number\n ): ScaleLinear<number, number> {\n const scale = scaleLinear<number, number>();\n if (\n originLocation === WaferMapOriginLocation.bottomLeft\n || originLocation === WaferMapOriginLocation.topLeft\n ) {\n return scale\n .domain([grid.origin.x, grid.origin.x + grid.cols])\n .range([0, containerWidth]);\n }\n return scale\n .domain([grid.origin.x - 1, grid.origin.x + grid.cols - 1])\n .range([containerWidth, 0]);\n }\n\n private createVerticalScale(\n originLocation: WaferMapOriginLocation,\n grid: GridDimensions,\n containerHeight: number\n ): ScaleLinear<number, number> {\n const scale = scaleLinear<number, number>();\n // html canvas has top-left origin https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Drawing_shapes#the_grid\n // we need to flip the vertical scale\n if (\n originLocation === WaferMapOriginLocation.bottomLeft\n || originLocation === WaferMapOriginLocation.bottomRight\n ) {\n return scale\n .domain([grid.origin.y - 1, grid.origin.y + grid.rows - 1])\n .range([containerHeight, 0]);\n }\n return scale\n .domain([grid.origin.y, grid.origin.y + grid.rows])\n .range([0, containerHeight]);\n }\n\n private calculateMarginAddition(\n baseMargin: Margin,\n addedMargin: Margin\n ): Margin {\n return {\n top: baseMargin.top + addedMargin.top,\n right: baseMargin.right + addedMargin.right,\n bottom: baseMargin.bottom + addedMargin.bottom,\n left: baseMargin.left + addedMargin.left\n };\n }\n\n private calculateColorScale(): ColorScale {\n if (this.wafermap.colorScaleMode === WaferMapColorScaleMode.linear) {\n const values = this.wafermap.colorScale.values.map(item => +item);\n const d3ColorScale = scaleLinear<string, string>()\n .domain(values)\n .range(this.wafermap.colorScale.colors);\n let min = values[0]!;\n let max = values[0]!;\n values.forEach(value => {\n if (value < min) {\n min = value;\n }\n if (value > max) {\n max = value;\n }\n });\n // the linear color scale will not be infinite but will be limited by the color scale resolution\n const valueSamples = ticks(\n min,\n max,\n values.length * this.colorScaleResolution\n );\n return valueSamples.map(value => {\n return {\n color: d3ColorScale(value),\n value\n };\n });\n }\n // ordinal color categories have to be sorted by value\n return this.wafermap.colorScale.colors\n .map((color, index) => {\n return {\n color,\n value: +this.wafermap.colorScale.values[index]!\n };\n })\n .sort((a, b) => a.value - b.value);\n }\n\n private calculateLabelsFontSize(\n dieDimensions: Dimensions,\n maxCharacters: number\n ): number {\n return Math.min(\n dieDimensions.height,\n (dieDimensions.width / (Math.max(2, maxCharacters) * 0.5))\n * this.fontSizeFactor\n );\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { WaferMap } from '../..';
1
+ import type { WaferMap } from '..';
2
2
  /**
3
3
  * HoverHandler deals with user interactions and events like hovering
4
4
  */
@@ -1,4 +1,4 @@
1
- import { WaferMapOriginLocation } from '../../types';
1
+ import { WaferMapOriginLocation } from '../types';
2
2
  /**
3
3
  * HoverHandler deals with user interactions and events like hovering
4
4
  */
@@ -72,10 +72,8 @@ export class HoverHandler {
72
72
  ? Math.ceil
73
73
  : Math.floor;
74
74
  // go to x and y scale to get the x,y values of the die.
75
- const x = xRoundFunction(this.wafermap.experimentalDataManager.horizontalScale.invert(mousePosition.x
76
- - this.wafermap.experimentalDataManager.margin.left));
77
- const y = yRoundFunction(this.wafermap.experimentalDataManager.verticalScale.invert(mousePosition.y
78
- - this.wafermap.experimentalDataManager.margin.top));
75
+ const x = xRoundFunction(this.wafermap.computations.horizontalScale.invert(mousePosition.x - this.wafermap.computations.margin.left));
76
+ const y = yRoundFunction(this.wafermap.computations.verticalScale.invert(mousePosition.y - this.wafermap.computations.margin.top));
79
77
  return { x, y };
80
78
  }
81
79
  return undefined;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hover-handler.js","sourceRoot":"","sources":["../../../../src/wafer-map/experimental/hover-handler.ts"],"names":[],"mappings":"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","sourcesContent":["import type { WaferMap } from '..';\nimport { PointCoordinates, WaferMapOriginLocation } from '../types';\n\n/**\n * HoverHandler deals with user interactions and events like hovering\n */\nexport class HoverHandler {\n public constructor(private readonly wafermap: WaferMap) {}\n\n /**\n * @internal\n */\n public connect(): void {\n this.wafermap.addEventListener('mousemove', this.onMouseMove);\n this.wafermap.addEventListener('mouseout', this.onMouseOut);\n }\n\n /**\n * @internal\n */\n public disconnect(): void {\n this.wafermap.removeEventListener('mousemove', this.onMouseMove);\n this.wafermap.removeEventListener('mouseout', this.onMouseOut);\n }\n\n private readonly onMouseMove = (event: MouseEvent): void => {\n if (!this.wafermap.isExperimentalUpdate()) {\n return;\n }\n // get original mouse position in case we are in zoom.\n const invertedPoint = this.wafermap.transform.invert([\n event.offsetX,\n event.offsetY\n ]);\n const dieCoordinates = this.calculateDieCoordinates({\n x: invertedPoint[0],\n y: invertedPoint[1]\n });\n if (dieCoordinates === undefined) {\n this.wafermap.hoverDie = undefined;\n return;\n }\n const colIndex = this.wafermap\n .diesTable!.getChild('colIndex')!\n .toArray();\n const rowIndex = this.wafermap\n .diesTable!.getChild('rowIndex')!\n .toArray();\n\n // will replace iterating with arquero filtering after fixing errors\n for (let i = 0; i < colIndex.length; i++) {\n if (\n colIndex[i] === dieCoordinates.x\n && rowIndex[i] === dieCoordinates.y\n ) {\n this.wafermap.hoverDie = {\n index: i,\n x: dieCoordinates.x,\n y: dieCoordinates.y\n };\n return;\n }\n }\n this.wafermap.hoverDie = undefined;\n };\n\n private readonly onMouseOut = (_event: MouseEvent): void => {\n this.wafermap.hoverDie = undefined;\n };\n\n private calculateDieCoordinates(\n mousePosition: PointCoordinates\n ): PointCoordinates | undefined {\n if (this.wafermap.isExperimentalUpdate()) {\n const originLocation = this.wafermap.originLocation;\n const xRoundFunction = originLocation === WaferMapOriginLocation.bottomLeft\n || originLocation === WaferMapOriginLocation.topLeft\n ? Math.floor\n : Math.ceil;\n const yRoundFunction = originLocation === WaferMapOriginLocation.bottomLeft\n || originLocation === WaferMapOriginLocation.bottomRight\n ? Math.ceil\n : Math.floor;\n // go to x and y scale to get the x,y values of the die.\n const x = xRoundFunction(\n this.wafermap.computations.horizontalScale.invert(\n mousePosition.x - this.wafermap.computations.margin.left\n )\n );\n const y = yRoundFunction(\n this.wafermap.computations.verticalScale.invert(\n mousePosition.y - this.wafermap.computations.margin.top\n )\n );\n return { x, y };\n }\n return undefined;\n }\n}\n"]}
@@ -0,0 +1,24 @@
1
+ import type { ZoomTransform } from 'd3-zoom';
2
+ import type { WaferMap } from '..';
3
+ import type { Dimensions, RenderConfig } from '../workers/types';
4
+ /**
5
+ * Responsible for drawing the dies inside the wafer map, adding dieText and scaling the canvas
6
+ */
7
+ export declare class WorkerRenderer {
8
+ private readonly wafermap;
9
+ private matrixRenderer;
10
+ constructor(wafermap: WaferMap);
11
+ setupWafer(snapshot: {
12
+ canvasDimensions: Dimensions;
13
+ renderConfig: RenderConfig;
14
+ columnIndices: Int32Array;
15
+ rowIndices: Int32Array;
16
+ }): Promise<void>;
17
+ drawWafer(snapshot: {
18
+ canvasDimensions: Dimensions;
19
+ dieDimensions: Dimensions;
20
+ transform: ZoomTransform;
21
+ }): Promise<void>;
22
+ renderHover(): void;
23
+ private calculateHoverTransform;
24
+ }
@@ -0,0 +1,75 @@
1
+ import { transfer } from 'comlink';
2
+ import { HoverDieOpacity } from '../types';
3
+ import { createMatrixRenderer } from '../modules/create-matrix-renderer';
4
+ /**
5
+ * Responsible for drawing the dies inside the wafer map, adding dieText and scaling the canvas
6
+ */
7
+ export class WorkerRenderer {
8
+ constructor(wafermap) {
9
+ this.wafermap = wafermap;
10
+ }
11
+ async setupWafer(snapshot) {
12
+ if (this.matrixRenderer === undefined) {
13
+ const { matrixRenderer } = await createMatrixRenderer();
14
+ this.matrixRenderer = matrixRenderer;
15
+ const offscreenCanvas = this.wafermap.workerCanvas.transferControlToOffscreen();
16
+ await this.matrixRenderer.setCanvas(transfer(offscreenCanvas, [offscreenCanvas]));
17
+ }
18
+ await this.matrixRenderer.setCanvasDimensions(snapshot.canvasDimensions);
19
+ await this.matrixRenderer.setRenderConfig(snapshot.renderConfig);
20
+ await this.matrixRenderer.setColumnIndices(snapshot.columnIndices);
21
+ await this.matrixRenderer.setRowIndices(snapshot.rowIndices);
22
+ }
23
+ async drawWafer(snapshot) {
24
+ const topLeftCanvasCorner = snapshot.transform.invert([0, 0]);
25
+ const bottomRightCanvasCorner = snapshot.transform.invert([
26
+ snapshot.canvasDimensions.width,
27
+ snapshot.canvasDimensions.height
28
+ ]);
29
+ await this.matrixRenderer.setTransformConfig({
30
+ transform: snapshot.transform,
31
+ topLeftCanvasCorner: {
32
+ x: topLeftCanvasCorner[0] - snapshot.dieDimensions.width,
33
+ y: topLeftCanvasCorner[1] - snapshot.dieDimensions.height
34
+ },
35
+ bottomRightCanvasCorner: {
36
+ x: bottomRightCanvasCorner[0],
37
+ y: bottomRightCanvasCorner[1]
38
+ }
39
+ });
40
+ await this.matrixRenderer.drawWafer();
41
+ }
42
+ renderHover() {
43
+ if (this.wafermap.computations.dieDimensions === undefined
44
+ || this.wafermap.transform === undefined) {
45
+ return;
46
+ }
47
+ this.wafermap.hoverWidth = this.wafermap.computations.dieDimensions.width
48
+ * this.wafermap.transform.k;
49
+ this.wafermap.hoverHeight = this.wafermap.computations.dieDimensions.height
50
+ * this.wafermap.transform.k;
51
+ this.wafermap.hoverOpacity = this.wafermap.hoverDie === undefined
52
+ ? HoverDieOpacity.hide
53
+ : HoverDieOpacity.show;
54
+ this.wafermap.hoverTransform = this.calculateHoverTransform();
55
+ }
56
+ calculateHoverTransform() {
57
+ if (this.wafermap.hoverDie !== undefined) {
58
+ const scaledX = this.wafermap.computations.horizontalScale(this.wafermap.hoverDie.x);
59
+ if (scaledX === undefined) {
60
+ return '';
61
+ }
62
+ const scaledY = this.wafermap.computations.verticalScale(this.wafermap.hoverDie.y);
63
+ if (scaledY === undefined) {
64
+ return '';
65
+ }
66
+ const transformedPoint = this.wafermap.transform.apply([
67
+ scaledX + this.wafermap.computations.margin.left,
68
+ scaledY + this.wafermap.computations.margin.top
69
+ ]);
70
+ return `translate(${transformedPoint[0]}, ${transformedPoint[1]})`;
71
+ }
72
+ return '';
73
+ }
74
+ }
75
+ //# sourceMappingURL=worker-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-renderer.js","sourceRoot":"","sources":["../../../../src/wafer-map/experimental/worker-renderer.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Remote, transfer } from 'comlink';\nimport type { ZoomTransform } from 'd3-zoom';\nimport type { WaferMap } from '..';\nimport { HoverDieOpacity } from '../types';\nimport { createMatrixRenderer } from '../modules/create-matrix-renderer';\nimport type { MatrixRenderer } from '../../../build/generate-workers/dist/esm/source/matrix-renderer';\nimport type { Dimensions, RenderConfig } from '../workers/types';\n\n/**\n * Responsible for drawing the dies inside the wafer map, adding dieText and scaling the canvas\n */\nexport class WorkerRenderer {\n private matrixRenderer!: Remote<MatrixRenderer>;\n\n public constructor(private readonly wafermap: WaferMap) {}\n\n public async setupWafer(snapshot: {\n canvasDimensions: Dimensions,\n renderConfig: RenderConfig,\n columnIndices: Int32Array,\n rowIndices: Int32Array\n }): Promise<void> {\n if (this.matrixRenderer === undefined) {\n const { matrixRenderer } = await createMatrixRenderer();\n this.matrixRenderer = matrixRenderer;\n const offscreenCanvas = this.wafermap.workerCanvas.transferControlToOffscreen();\n await this.matrixRenderer.setCanvas(\n transfer(offscreenCanvas, [offscreenCanvas])\n );\n }\n await this.matrixRenderer.setCanvasDimensions(\n snapshot.canvasDimensions\n );\n await this.matrixRenderer.setRenderConfig(snapshot.renderConfig);\n await this.matrixRenderer.setColumnIndices(snapshot.columnIndices);\n await this.matrixRenderer.setRowIndices(snapshot.rowIndices);\n }\n\n public async drawWafer(snapshot: {\n canvasDimensions: Dimensions,\n dieDimensions: Dimensions,\n transform: ZoomTransform\n }): Promise<void> {\n const topLeftCanvasCorner = snapshot.transform.invert([0, 0]);\n const bottomRightCanvasCorner = snapshot.transform.invert([\n snapshot.canvasDimensions.width,\n snapshot.canvasDimensions.height\n ]);\n await this.matrixRenderer.setTransformConfig({\n transform: snapshot.transform,\n topLeftCanvasCorner: {\n x: topLeftCanvasCorner[0] - snapshot.dieDimensions.width,\n y: topLeftCanvasCorner[1] - snapshot.dieDimensions.height\n },\n bottomRightCanvasCorner: {\n x: bottomRightCanvasCorner[0],\n y: bottomRightCanvasCorner[1]\n }\n });\n await this.matrixRenderer.drawWafer();\n }\n\n public renderHover(): void {\n if (\n this.wafermap.computations.dieDimensions === undefined\n || this.wafermap.transform === undefined\n ) {\n return;\n }\n this.wafermap.hoverWidth = this.wafermap.computations.dieDimensions.width\n * this.wafermap.transform.k;\n this.wafermap.hoverHeight = this.wafermap.computations.dieDimensions.height\n * this.wafermap.transform.k;\n this.wafermap.hoverOpacity = this.wafermap.hoverDie === undefined\n ? HoverDieOpacity.hide\n : HoverDieOpacity.show;\n this.wafermap.hoverTransform = this.calculateHoverTransform();\n }\n\n private calculateHoverTransform(): string {\n if (this.wafermap.hoverDie !== undefined) {\n const scaledX = this.wafermap.computations.horizontalScale(\n this.wafermap.hoverDie.x\n );\n if (scaledX === undefined) {\n return '';\n }\n const scaledY = this.wafermap.computations.verticalScale(\n this.wafermap.hoverDie.y\n );\n if (scaledY === undefined) {\n return '';\n }\n const transformedPoint = this.wafermap.transform.apply([\n scaledX + this.wafermap.computations.margin.left,\n scaledY + this.wafermap.computations.margin.top\n ]);\n return `translate(${transformedPoint[0]}, ${transformedPoint[1]})`;\n }\n return '';\n }\n}\n"]}
@@ -2,11 +2,11 @@ import { FoundationElement } from '@microsoft/fast-foundation';
2
2
  import { ZoomTransform } from 'd3-zoom';
3
3
  import type { Table } from 'apache-arrow';
4
4
  import { DataManager } from './modules/data-manager';
5
- import { DataManager as ExperimentalDataManager } from './modules/experimental/data-manager';
6
5
  import { RenderingModule } from './modules/rendering';
7
6
  import { HoverDie, HoverDieOpacity, WaferMapColorScale, WaferMapColorScaleMode, WaferMapDie, WaferMapOrientation, WaferMapOriginLocation, WaferMapValidity, type WaferRequiredFields } from './types';
8
7
  import { WaferMapUpdateTracker } from './modules/wafer-map-update-tracker';
9
- import { WorkerRenderer } from './modules/experimental/worker-renderer';
8
+ import { WorkerRenderer } from './experimental/worker-renderer';
9
+ import { Computations } from './experimental/computations';
10
10
  declare global {
11
11
  interface HTMLElementTagNameMap {
12
12
  'nimble-wafer-map': WaferMap;
@@ -51,7 +51,7 @@ export declare class WaferMap<T extends WaferRequiredFields = WaferRequiredField
51
51
  * @internal
52
52
  */
53
53
  readonly zoomContainer: HTMLElement;
54
- readonly experimentalDataManager: ExperimentalDataManager;
54
+ readonly computations: Computations;
55
55
  dataManager: DataManager;
56
56
  readonly workerRenderer: WorkerRenderer;
57
57
  renderer: RenderingModule;
@@ -121,6 +121,7 @@ export declare class WaferMap<T extends WaferRequiredFields = WaferRequiredField
121
121
  * @internal
122
122
  */
123
123
  isExperimentalUpdate(): boolean;
124
+ private createSnapshot;
124
125
  private validate;
125
126
  private createResizeObserver;
126
127
  private originLocationChanged;
@@ -5,15 +5,15 @@ import { zoomIdentity } from 'd3-zoom';
5
5
  import { template } from './template';
6
6
  import { styles } from './styles';
7
7
  import { DataManager } from './modules/data-manager';
8
- import { DataManager as ExperimentalDataManager } from './modules/experimental/data-manager';
9
8
  import { RenderingModule } from './modules/rendering';
10
9
  import { HoverDieOpacity, WaferMapColorScaleMode, WaferMapOrientation, WaferMapOriginLocation } from './types';
11
10
  import { WaferMapUpdateTracker } from './modules/wafer-map-update-tracker';
12
11
  import { WaferMapValidator } from './modules/wafer-map-validator';
13
- import { WorkerRenderer } from './modules/experimental/worker-renderer';
12
+ import { WorkerRenderer } from './experimental/worker-renderer';
14
13
  import { HoverHandler } from './modules/hover-handler';
15
- import { HoverHandler as ExperimentalHoverHandler } from './modules/experimental/hover-handler';
14
+ import { HoverHandler as ExperimentalHoverHandler } from './experimental/hover-handler';
16
15
  import { ZoomHandler } from './modules/zoom-handler';
16
+ import { Computations } from './experimental/computations';
17
17
  /**
18
18
  * A nimble-styled WaferMap
19
19
  */
@@ -35,7 +35,7 @@ export class WaferMap extends FoundationElement {
35
35
  this.dieLabelsHidden = false;
36
36
  this.dieLabelsSuffix = '';
37
37
  this.colorScaleMode = WaferMapColorScaleMode.linear;
38
- this.experimentalDataManager = new ExperimentalDataManager(this.asRequiredFieldsWaferMap);
38
+ this.computations = new Computations(this.asRequiredFieldsWaferMap);
39
39
  this.dataManager = new DataManager(this.asRequiredFieldsWaferMap);
40
40
  this.workerRenderer = new WorkerRenderer(this.asRequiredFieldsWaferMap);
41
41
  this.renderer = new RenderingModule(this.asRequiredFieldsWaferMap);
@@ -105,24 +105,22 @@ export class WaferMap extends FoundationElement {
105
105
  return;
106
106
  }
107
107
  if (this.waferMapUpdateTracker.requiresEventsUpdate) {
108
- if (this.waferMapUpdateTracker.requiresContainerDimensionsUpdate
109
- || this.waferMapUpdateTracker.requiresScalesUpdate) {
110
- this.experimentalDataManager.updateComputations();
111
- await this.workerRenderer.setupWafer();
112
- await this.workerRenderer.drawWafer();
108
+ if (this.waferMapUpdateTracker.requiresComponentResizeUpdate) {
109
+ this.computations.componentResizeUpdate();
113
110
  }
114
- else if (this.waferMapUpdateTracker.requiresLabelsFontSizeUpdate
115
- || this.waferMapUpdateTracker.requiresDiesRenderInfoUpdate) {
116
- this.experimentalDataManager.updatePrerendering();
117
- await this.workerRenderer.drawWafer();
111
+ else if (this.waferMapUpdateTracker.requiresInputDataUpdate) {
112
+ this.computations.inputDataUpdate();
118
113
  }
119
- else if (this.waferMapUpdateTracker.requiresDrawnWaferUpdate) {
120
- await this.workerRenderer.drawWafer();
114
+ else if (this.waferMapUpdateTracker.requiresColorAndTextUpdate) {
115
+ this.computations.colorAndTextUpdate();
121
116
  }
117
+ const snapshot = this.createSnapshot();
118
+ if (this.waferMapUpdateTracker.requiresWorkerWaferSetup) {
119
+ await this.workerRenderer.setupWafer(snapshot);
120
+ }
121
+ await this.workerRenderer.drawWafer(snapshot);
122
122
  }
123
- else if (this.waferMapUpdateTracker.requiresRenderHoverUpdate) {
124
- this.workerRenderer.renderHover();
125
- }
123
+ this.workerRenderer.renderHover();
126
124
  }
127
125
  /**
128
126
  * @internal
@@ -169,6 +167,44 @@ export class WaferMap extends FoundationElement {
169
167
  isExperimentalUpdate() {
170
168
  return this.diesTable !== undefined;
171
169
  }
170
+ createSnapshot() {
171
+ const canvasDimensions = {
172
+ width: this.canvasWidth ?? 0,
173
+ height: this.canvasHeight ?? 0
174
+ };
175
+ const renderConfig = {
176
+ dieDimensions: this.computations.dieDimensions,
177
+ margin: this.computations.margin,
178
+ verticalCoefficient: this.computations.verticalCoefficient,
179
+ horizontalCoefficient: this.computations.horizontalCoefficient,
180
+ horizontalConstant: this.computations.horizontalConstant,
181
+ verticalConstant: this.computations.verticalConstant,
182
+ labelsFontSize: this.computations.labelsFontSize,
183
+ colorScale: this.computations.colorScale
184
+ };
185
+ const dieDimensions = this.computations.dieDimensions;
186
+ const transform = this.transform;
187
+ if (this.diesTable === undefined) {
188
+ return {
189
+ canvasDimensions,
190
+ renderConfig,
191
+ dieDimensions,
192
+ transform,
193
+ columnIndices: Int32Array.from([]),
194
+ rowIndices: Int32Array.from([])
195
+ };
196
+ }
197
+ const columnIndices = this.diesTable.getChild('colIndex').toArray();
198
+ const rowIndices = this.diesTable.getChild('rowIndex').toArray();
199
+ return {
200
+ canvasDimensions,
201
+ renderConfig,
202
+ columnIndices,
203
+ rowIndices,
204
+ dieDimensions,
205
+ transform
206
+ };
207
+ }
172
208
  validate() {
173
209
  this.waferMapValidator.validateGridDimensions();
174
210
  this.waferMapValidator.validateDiesTableSchema();