@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.
- package/dist/all-components-bundle.js +487 -496
- package/dist/all-components-bundle.js.map +1 -1
- package/dist/all-components-bundle.min.js +1597 -1639
- package/dist/all-components-bundle.min.js.map +1 -1
- package/dist/esm/rich-text/mention-listbox/template.js +2 -2
- package/dist/esm/rich-text/mention-listbox/template.js.map +1 -1
- package/dist/esm/wafer-map/{modules/experimental → experimental}/computations.d.ts +25 -8
- package/dist/esm/wafer-map/{modules/experimental → experimental}/computations.js +87 -8
- package/dist/esm/wafer-map/experimental/computations.js.map +1 -0
- package/dist/esm/wafer-map/{modules/experimental → experimental}/hover-handler.d.ts +1 -1
- package/dist/esm/wafer-map/{modules/experimental → experimental}/hover-handler.js +3 -5
- package/dist/esm/wafer-map/experimental/hover-handler.js.map +1 -0
- package/dist/esm/wafer-map/experimental/worker-renderer.d.ts +24 -0
- package/dist/esm/wafer-map/experimental/worker-renderer.js +75 -0
- package/dist/esm/wafer-map/experimental/worker-renderer.js.map +1 -0
- package/dist/esm/wafer-map/index.d.ts +4 -3
- package/dist/esm/wafer-map/index.js +54 -18
- package/dist/esm/wafer-map/index.js.map +1 -1
- package/dist/esm/wafer-map/modules/computations.d.ts +1 -1
- package/dist/esm/wafer-map/modules/computations.js.map +1 -1
- package/dist/esm/wafer-map/modules/data-manager.d.ts +2 -1
- package/dist/esm/wafer-map/modules/data-manager.js.map +1 -1
- package/dist/esm/wafer-map/modules/prerendering.js.map +1 -1
- package/dist/esm/wafer-map/modules/wafer-map-update-tracker.d.ts +4 -0
- package/dist/esm/wafer-map/modules/wafer-map-update-tracker.js +37 -2
- package/dist/esm/wafer-map/modules/wafer-map-update-tracker.js.map +1 -1
- package/dist/esm/wafer-map/types.d.ts +0 -16
- package/dist/esm/wafer-map/types.js.map +1 -1
- package/dist/esm/wafer-map/workers/matrix-renderer.d.ts +1 -1
- package/dist/esm/wafer-map/workers/matrix-renderer.js +1 -1
- package/dist/esm/wafer-map/workers/matrix-renderer.js.map +1 -1
- package/dist/esm/wafer-map/workers/types.d.ts +39 -0
- package/dist/esm/wafer-map/workers/types.js +2 -0
- package/dist/esm/wafer-map/workers/types.js.map +1 -0
- package/package.json +1 -1
- package/dist/esm/listbox/index.d.ts +0 -12
- package/dist/esm/listbox/index.js +0 -15
- package/dist/esm/listbox/index.js.map +0 -1
- package/dist/esm/listbox/styles.d.ts +0 -1
- package/dist/esm/listbox/styles.js +0 -27
- package/dist/esm/listbox/styles.js.map +0 -1
- package/dist/esm/wafer-map/modules/experimental/computations.js.map +0 -1
- package/dist/esm/wafer-map/modules/experimental/data-manager.d.ts +0 -21
- package/dist/esm/wafer-map/modules/experimental/data-manager.js +0 -41
- package/dist/esm/wafer-map/modules/experimental/data-manager.js.map +0 -1
- package/dist/esm/wafer-map/modules/experimental/hover-handler.js.map +0 -1
- package/dist/esm/wafer-map/modules/experimental/prerendering.d.ts +0 -18
- package/dist/esm/wafer-map/modules/experimental/prerendering.js +0 -63
- package/dist/esm/wafer-map/modules/experimental/prerendering.js.map +0 -1
- package/dist/esm/wafer-map/modules/experimental/worker-renderer.d.ts +0 -13
- package/dist/esm/wafer-map/modules/experimental/worker-renderer.js +0 -96
- 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 {
|
|
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 &&
|
|
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;
|
|
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 '
|
|
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
|
|
13
|
-
get
|
|
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
|
|
18
|
-
private
|
|
19
|
-
private
|
|
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
|
-
|
|
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 {
|
|
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
|
|
17
|
-
return this.
|
|
23
|
+
get verticalCoefficient() {
|
|
24
|
+
return this._verticalCoefficient;
|
|
18
25
|
}
|
|
19
|
-
get
|
|
20
|
-
return this.
|
|
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
|
-
|
|
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.
|
|
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 { WaferMapOriginLocation } from '
|
|
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.
|
|
76
|
-
|
|
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":"AAAA,OAAO,EAAe,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGhD,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAIzE;;GAEG;AACH,MAAM,OAAO,cAAc;IAGvB,YAAoC,QAAkB;QAAlB,aAAQ,GAAR,QAAQ,CAAU;IAAG,CAAC;IAEnD,KAAK,CAAC,UAAU,CAAC,QAKvB;QACG,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE;YACnC,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAC;YACxD,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;YACrC,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,0BAA0B,EAAE,CAAC;YAChF,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,CAC/B,QAAQ,CAAC,eAAe,EAAE,CAAC,eAAe,CAAC,CAAC,CAC/C,CAAC;SACL;QACD,MAAM,IAAI,CAAC,cAAc,CAAC,mBAAmB,CACzC,QAAQ,CAAC,gBAAgB,CAC5B,CAAC;QACF,MAAM,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACjE,MAAM,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QACnE,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACjE,CAAC;IAEM,KAAK,CAAC,SAAS,CAAC,QAItB;QACG,MAAM,mBAAmB,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9D,MAAM,uBAAuB,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC;YACtD,QAAQ,CAAC,gBAAgB,CAAC,KAAK;YAC/B,QAAQ,CAAC,gBAAgB,CAAC,MAAM;SACnC,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC;YACzC,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,mBAAmB,EAAE;gBACjB,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK;gBACxD,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM;aAC5D;YACD,uBAAuB,EAAE;gBACrB,CAAC,EAAE,uBAAuB,CAAC,CAAC,CAAC;gBAC7B,CAAC,EAAE,uBAAuB,CAAC,CAAC,CAAC;aAChC;SACJ,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC;IAC1C,CAAC;IAEM,WAAW;QACd,IACI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,aAAa,KAAK,SAAS;eACnD,IAAI,CAAC,QAAQ,CAAC,SAAS,KAAK,SAAS,EAC1C;YACE,OAAO;SACV;QACD,IAAI,CAAC,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK;cACnE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,aAAa,CAAC,MAAM;cACrE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,QAAQ,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,KAAK,SAAS;YAC7D,CAAC,CAAC,eAAe,CAAC,IAAI;YACtB,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC;QAC3B,IAAI,CAAC,QAAQ,CAAC,cAAc,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;IAClE,CAAC;IAEO,uBAAuB;QAC3B,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,KAAK,SAAS,EAAE;YACtC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,eAAe,CACtD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAC3B,CAAC;YACF,IAAI,OAAO,KAAK,SAAS,EAAE;gBACvB,OAAO,EAAE,CAAC;aACb;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,aAAa,CACpD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAC3B,CAAC;YACF,IAAI,OAAO,KAAK,SAAS,EAAE;gBACvB,OAAO,EAAE,CAAC;aACb;YACD,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC;gBACnD,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI;gBAChD,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG;aAClD,CAAC,CAAC;YACH,OAAO,aAAa,gBAAgB,CAAC,CAAC,CAAC,KAAK,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC;SACtE;QACD,OAAO,EAAE,CAAC;IACd,CAAC;CACJ","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 './
|
|
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
|
|
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 './
|
|
12
|
+
import { WorkerRenderer } from './experimental/worker-renderer';
|
|
14
13
|
import { HoverHandler } from './modules/hover-handler';
|
|
15
|
-
import { HoverHandler as ExperimentalHoverHandler } from './
|
|
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.
|
|
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.
|
|
109
|
-
|
|
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.
|
|
115
|
-
|
|
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.
|
|
120
|
-
|
|
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
|
-
|
|
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();
|