@ni/nimble-components 29.1.7 → 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 (44) hide show
  1. package/dist/all-components-bundle.js +393 -340
  2. package/dist/all-components-bundle.js.map +1 -1
  3. package/dist/all-components-bundle.min.js +1377 -1377
  4. package/dist/all-components-bundle.min.js.map +1 -1
  5. package/dist/esm/wafer-map/{modules/experimental → experimental}/computations.d.ts +25 -8
  6. package/dist/esm/wafer-map/{modules/experimental → experimental}/computations.js +87 -8
  7. package/dist/esm/wafer-map/experimental/computations.js.map +1 -0
  8. package/dist/esm/wafer-map/{modules/experimental → experimental}/hover-handler.d.ts +1 -1
  9. package/dist/esm/wafer-map/{modules/experimental → experimental}/hover-handler.js +3 -5
  10. package/dist/esm/wafer-map/experimental/hover-handler.js.map +1 -0
  11. package/dist/esm/wafer-map/experimental/worker-renderer.d.ts +24 -0
  12. package/dist/esm/wafer-map/experimental/worker-renderer.js +75 -0
  13. package/dist/esm/wafer-map/experimental/worker-renderer.js.map +1 -0
  14. package/dist/esm/wafer-map/index.d.ts +4 -3
  15. package/dist/esm/wafer-map/index.js +54 -18
  16. package/dist/esm/wafer-map/index.js.map +1 -1
  17. package/dist/esm/wafer-map/modules/computations.d.ts +1 -1
  18. package/dist/esm/wafer-map/modules/computations.js.map +1 -1
  19. package/dist/esm/wafer-map/modules/data-manager.d.ts +2 -1
  20. package/dist/esm/wafer-map/modules/data-manager.js.map +1 -1
  21. package/dist/esm/wafer-map/modules/prerendering.js.map +1 -1
  22. package/dist/esm/wafer-map/modules/wafer-map-update-tracker.d.ts +4 -0
  23. package/dist/esm/wafer-map/modules/wafer-map-update-tracker.js +37 -2
  24. package/dist/esm/wafer-map/modules/wafer-map-update-tracker.js.map +1 -1
  25. package/dist/esm/wafer-map/types.d.ts +0 -16
  26. package/dist/esm/wafer-map/types.js.map +1 -1
  27. package/dist/esm/wafer-map/workers/matrix-renderer.d.ts +1 -1
  28. package/dist/esm/wafer-map/workers/matrix-renderer.js +1 -1
  29. package/dist/esm/wafer-map/workers/matrix-renderer.js.map +1 -1
  30. package/dist/esm/wafer-map/workers/types.d.ts +39 -0
  31. package/dist/esm/wafer-map/workers/types.js +2 -0
  32. package/dist/esm/wafer-map/workers/types.js.map +1 -0
  33. package/package.json +1 -1
  34. package/dist/esm/wafer-map/modules/experimental/computations.js.map +0 -1
  35. package/dist/esm/wafer-map/modules/experimental/data-manager.d.ts +0 -21
  36. package/dist/esm/wafer-map/modules/experimental/data-manager.js +0 -41
  37. package/dist/esm/wafer-map/modules/experimental/data-manager.js.map +0 -1
  38. package/dist/esm/wafer-map/modules/experimental/hover-handler.js.map +0 -1
  39. package/dist/esm/wafer-map/modules/experimental/prerendering.d.ts +0 -18
  40. package/dist/esm/wafer-map/modules/experimental/prerendering.js +0 -63
  41. package/dist/esm/wafer-map/modules/experimental/prerendering.js.map +0 -1
  42. package/dist/esm/wafer-map/modules/experimental/worker-renderer.d.ts +0 -13
  43. package/dist/esm/wafer-map/modules/experimental/worker-renderer.js +0 -96
  44. package/dist/esm/wafer-map/modules/experimental/worker-renderer.js.map +0 -1
@@ -1,3 +1,3 @@
1
1
  // eslint-disable-next-line no-template-curly-in-string
2
- export const workerCode = "var MatrixRenderer = (function (exports) {\n 'use strict';\n\n /**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n const proxyMarker = Symbol(\"Comlink.proxy\");\n const createEndpoint = Symbol(\"Comlink.endpoint\");\n const releaseProxy = Symbol(\"Comlink.releaseProxy\");\n const finalizer = Symbol(\"Comlink.finalizer\");\n const throwMarker = Symbol(\"Comlink.thrown\");\n const isObject = (val) => (typeof val === \"object\" && val !== null) || typeof val === \"function\";\n /**\n * Internal transfer handle to handle objects marked to proxy.\n */\n const proxyTransferHandler = {\n canHandle: (val) => isObject(val) && val[proxyMarker],\n serialize(obj) {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port1);\n return [port2, [port2]];\n },\n deserialize(port) {\n port.start();\n return wrap(port);\n },\n };\n /**\n * Internal transfer handler to handle thrown exceptions.\n */\n const throwTransferHandler = {\n canHandle: (value) => isObject(value) && throwMarker in value,\n serialize({ value }) {\n let serialized;\n if (value instanceof Error) {\n serialized = {\n isError: true,\n value: {\n message: value.message,\n name: value.name,\n stack: value.stack,\n },\n };\n }\n else {\n serialized = { isError: false, value };\n }\n return [serialized, []];\n },\n deserialize(serialized) {\n if (serialized.isError) {\n throw Object.assign(new Error(serialized.value.message), serialized.value);\n }\n throw serialized.value;\n },\n };\n /**\n * Allows customizing the serialization of certain values.\n */\n const transferHandlers = new Map([\n [\"proxy\", proxyTransferHandler],\n [\"throw\", throwTransferHandler],\n ]);\n function isAllowedOrigin(allowedOrigins, origin) {\n for (const allowedOrigin of allowedOrigins) {\n if (origin === allowedOrigin || allowedOrigin === \"*\") {\n return true;\n }\n if (allowedOrigin instanceof RegExp && allowedOrigin.test(origin)) {\n return true;\n }\n }\n return false;\n }\n function expose(obj, ep = globalThis, allowedOrigins = [\"*\"]) {\n ep.addEventListener(\"message\", function callback(ev) {\n if (!ev || !ev.data) {\n return;\n }\n if (!isAllowedOrigin(allowedOrigins, ev.origin)) {\n console.warn(`Invalid origin '${ev.origin}' for comlink proxy`);\n return;\n }\n const { id, type, path } = Object.assign({ path: [] }, ev.data);\n const argumentList = (ev.data.argumentList || []).map(fromWireValue);\n let returnValue;\n try {\n const parent = path.slice(0, -1).reduce((obj, prop) => obj[prop], obj);\n const rawValue = path.reduce((obj, prop) => obj[prop], obj);\n switch (type) {\n case \"GET\" /* MessageType.GET */:\n {\n returnValue = rawValue;\n }\n break;\n case \"SET\" /* MessageType.SET */:\n {\n parent[path.slice(-1)[0]] = fromWireValue(ev.data.value);\n returnValue = true;\n }\n break;\n case \"APPLY\" /* MessageType.APPLY */:\n {\n returnValue = rawValue.apply(parent, argumentList);\n }\n break;\n case \"CONSTRUCT\" /* MessageType.CONSTRUCT */:\n {\n const value = new rawValue(...argumentList);\n returnValue = proxy(value);\n }\n break;\n case \"ENDPOINT\" /* MessageType.ENDPOINT */:\n {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port2);\n returnValue = transfer(port1, [port1]);\n }\n break;\n case \"RELEASE\" /* MessageType.RELEASE */:\n {\n returnValue = undefined;\n }\n break;\n default:\n return;\n }\n }\n catch (value) {\n returnValue = { value, [throwMarker]: 0 };\n }\n Promise.resolve(returnValue)\n .catch((value) => {\n return { value, [throwMarker]: 0 };\n })\n .then((returnValue) => {\n const [wireValue, transferables] = toWireValue(returnValue);\n ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);\n if (type === \"RELEASE\" /* MessageType.RELEASE */) {\n // detach and deactive after sending release response above.\n ep.removeEventListener(\"message\", callback);\n closeEndPoint(ep);\n if (finalizer in obj && typeof obj[finalizer] === \"function\") {\n obj[finalizer]();\n }\n }\n })\n .catch((error) => {\n // Send Serialization Error To Caller\n const [wireValue, transferables] = toWireValue({\n value: new TypeError(\"Unserializable return value\"),\n [throwMarker]: 0,\n });\n ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);\n });\n });\n if (ep.start) {\n ep.start();\n }\n }\n function isMessagePort(endpoint) {\n return endpoint.constructor.name === \"MessagePort\";\n }\n function closeEndPoint(endpoint) {\n if (isMessagePort(endpoint))\n endpoint.close();\n }\n function wrap(ep, target) {\n return createProxy(ep, [], target);\n }\n function throwIfProxyReleased(isReleased) {\n if (isReleased) {\n throw new Error(\"Proxy has been released and is not useable\");\n }\n }\n function releaseEndpoint(ep) {\n return requestResponseMessage(ep, {\n type: \"RELEASE\" /* MessageType.RELEASE */,\n }).then(() => {\n closeEndPoint(ep);\n });\n }\n const proxyCounter = new WeakMap();\n const proxyFinalizers = \"FinalizationRegistry\" in globalThis &&\n new FinalizationRegistry((ep) => {\n const newCount = (proxyCounter.get(ep) || 0) - 1;\n proxyCounter.set(ep, newCount);\n if (newCount === 0) {\n releaseEndpoint(ep);\n }\n });\n function registerProxy(proxy, ep) {\n const newCount = (proxyCounter.get(ep) || 0) + 1;\n proxyCounter.set(ep, newCount);\n if (proxyFinalizers) {\n proxyFinalizers.register(proxy, ep, proxy);\n }\n }\n function unregisterProxy(proxy) {\n if (proxyFinalizers) {\n proxyFinalizers.unregister(proxy);\n }\n }\n function createProxy(ep, path = [], target = function () { }) {\n let isProxyReleased = false;\n const proxy = new Proxy(target, {\n get(_target, prop) {\n throwIfProxyReleased(isProxyReleased);\n if (prop === releaseProxy) {\n return () => {\n unregisterProxy(proxy);\n releaseEndpoint(ep);\n isProxyReleased = true;\n };\n }\n if (prop === \"then\") {\n if (path.length === 0) {\n return { then: () => proxy };\n }\n const r = requestResponseMessage(ep, {\n type: \"GET\" /* MessageType.GET */,\n path: path.map((p) => p.toString()),\n }).then(fromWireValue);\n return r.then.bind(r);\n }\n return createProxy(ep, [...path, prop]);\n },\n set(_target, prop, rawValue) {\n throwIfProxyReleased(isProxyReleased);\n // FIXME: ES6 Proxy Handler `set` methods are supposed to return a\n // boolean. To show good will, we return true asynchronously ¯\\_(ツ)_/¯\n const [value, transferables] = toWireValue(rawValue);\n return requestResponseMessage(ep, {\n type: \"SET\" /* MessageType.SET */,\n path: [...path, prop].map((p) => p.toString()),\n value,\n }, transferables).then(fromWireValue);\n },\n apply(_target, _thisArg, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const last = path[path.length - 1];\n if (last === createEndpoint) {\n return requestResponseMessage(ep, {\n type: \"ENDPOINT\" /* MessageType.ENDPOINT */,\n }).then(fromWireValue);\n }\n // We just pretend that `bind()` didn’t happen.\n if (last === \"bind\") {\n return createProxy(ep, path.slice(0, -1));\n }\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(ep, {\n type: \"APPLY\" /* MessageType.APPLY */,\n path: path.map((p) => p.toString()),\n argumentList,\n }, transferables).then(fromWireValue);\n },\n construct(_target, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(ep, {\n type: \"CONSTRUCT\" /* MessageType.CONSTRUCT */,\n path: path.map((p) => p.toString()),\n argumentList,\n }, transferables).then(fromWireValue);\n },\n });\n registerProxy(proxy, ep);\n return proxy;\n }\n function myFlat(arr) {\n return Array.prototype.concat.apply([], arr);\n }\n function processArguments(argumentList) {\n const processed = argumentList.map(toWireValue);\n return [processed.map((v) => v[0]), myFlat(processed.map((v) => v[1]))];\n }\n const transferCache = new WeakMap();\n function transfer(obj, transfers) {\n transferCache.set(obj, transfers);\n return obj;\n }\n function proxy(obj) {\n return Object.assign(obj, { [proxyMarker]: true });\n }\n function toWireValue(value) {\n for (const [name, handler] of transferHandlers) {\n if (handler.canHandle(value)) {\n const [serializedValue, transferables] = handler.serialize(value);\n return [\n {\n type: \"HANDLER\" /* WireValueType.HANDLER */,\n name,\n value: serializedValue,\n },\n transferables,\n ];\n }\n }\n return [\n {\n type: \"RAW\" /* WireValueType.RAW */,\n value,\n },\n transferCache.get(value) || [],\n ];\n }\n function fromWireValue(value) {\n switch (value.type) {\n case \"HANDLER\" /* WireValueType.HANDLER */:\n return transferHandlers.get(value.name).deserialize(value.value);\n case \"RAW\" /* WireValueType.RAW */:\n return value.value;\n }\n }\n function requestResponseMessage(ep, msg, transfers) {\n return new Promise((resolve) => {\n const id = generateUUID();\n ep.addEventListener(\"message\", function l(ev) {\n if (!ev.data || !ev.data.id || ev.data.id !== id) {\n return;\n }\n ep.removeEventListener(\"message\", l);\n resolve(ev.data);\n });\n if (ep.start) {\n ep.start();\n }\n ep.postMessage(Object.assign({ id }, msg), transfers);\n });\n }\n function generateUUID() {\n return new Array(4)\n .fill(0)\n .map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16))\n .join(\"-\");\n }\n\n /**\n * MatrixRenderer class is meant to be used within a Web Worker context,\n * using Comlink to facilitate communication between the main thread and the worker.\n * The MatrixRenderer class manages a matrix of dies, once an instance of MatrixRenderer is created,\n * it is exposed to the main thread using Comlink's `expose` method.\n * This setup is used in the wafer-map component to perform heavy computational duties\n */\n class MatrixRenderer {\n constructor() {\n this.columnIndexes = Int32Array.from([]);\n this.rowIndexes = Int32Array.from([]);\n this.values = Float64Array.from([]);\n this.scaledColumnIndex = Float64Array.from([]);\n this.scaledRowIndex = Float64Array.from([]);\n this.columnIndexPositions = Int32Array.from([]);\n this.scaleX = 1;\n this.scaleY = 1;\n this.baseX = 1;\n this.baseY = 1;\n this.dieDimensions = { width: 1, height: 1 };\n this.transform = { k: 1, x: 0, y: 0 };\n this.smallestMarginPossible = 20;\n this.margin = {\n top: this.smallestMarginPossible,\n right: this.smallestMarginPossible,\n bottom: this.smallestMarginPossible,\n left: this.smallestMarginPossible\n };\n }\n calculateXScaledIndex(columnIndex) {\n return this.scaleX * columnIndex + this.baseX + this.margin.left;\n }\n calculateYScaledIndex(rowIndex) {\n return this.scaleY * rowIndex + this.baseY + this.margin.top;\n }\n setColumnIndexes(columnIndexes) {\n this.columnIndexes = columnIndexes;\n if (columnIndexes.length === 0 || this.columnIndexes[0] === undefined) {\n return;\n }\n const scaledColumnIndex = [\n this.calculateXScaledIndex(this.columnIndexes[0])\n ];\n const columnPositions = [0];\n let prev = this.columnIndexes[0];\n for (let i = 1; i < this.columnIndexes.length; i++) {\n const xIndex = this.columnIndexes[i];\n if (xIndex && xIndex !== prev) {\n const scaledX = this.calculateXScaledIndex(this.columnIndexes[i]);\n scaledColumnIndex.push(scaledX);\n columnPositions.push(i);\n prev = xIndex;\n }\n }\n this.scaledColumnIndex = Float64Array.from(scaledColumnIndex);\n this.columnIndexPositions = Int32Array.from(columnPositions);\n }\n setRowIndexes(rowIndexesBuffer) {\n this.rowIndexes = rowIndexesBuffer;\n this.scaledRowIndex = new Float64Array(this.rowIndexes.length);\n for (let i = 0; i < this.rowIndexes.length; i++) {\n this.scaledRowIndex[i] = this.calculateYScaledIndex(this.rowIndexes[i]);\n }\n }\n setMargin(margin) {\n this.margin = margin;\n }\n setCanvasCorners(topLeft, bottomRight) {\n this.topLeftCanvasCorner = topLeft;\n this.bottomRightCanvasCorner = bottomRight;\n }\n setDiesDimensions(data) {\n this.dieDimensions = { width: data.width, height: data.height };\n }\n setScaling(scaleX, scaleY) {\n this.scaleX = scaleX;\n this.scaleY = scaleY;\n }\n setBases(baseX, baseY) {\n this.baseX = baseX;\n this.baseY = baseY;\n }\n setTransform(transform) {\n this.transform = transform;\n }\n setCanvas(canvas) {\n this.canvas = canvas;\n this.context = canvas.getContext('2d');\n }\n getMatrix() {\n return {\n columnIndexes: this.columnIndexes,\n rowIndexes: this.rowIndexes,\n values: this.values\n };\n }\n emptyMatrix() {\n this.columnIndexes = Int32Array.from([]);\n this.rowIndexes = Int32Array.from([]);\n this.values = Float64Array.from([]);\n }\n scaleCanvas() {\n this.context.translate(this.transform.x, this.transform.y);\n this.context.scale(this.transform.k, this.transform.k);\n }\n updateMatrix(data) {\n this.columnIndexes = Int32Array.from(data.columnIndexes);\n this.rowIndexes = Int32Array.from(data.rowIndexes);\n this.values = Float64Array.from(data.values);\n }\n setCanvasDimensions(data) {\n this.canvas.width = data.width;\n this.canvas.height = data.height;\n }\n getCanvasDimensions() {\n return {\n width: this.canvas.width,\n height: this.canvas.height\n };\n }\n clearCanvas() {\n this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);\n }\n drawWafer() {\n this.context.restore();\n this.context.save();\n this.clearCanvas();\n this.scaleCanvas();\n if (this.topLeftCanvasCorner === undefined\n || this.bottomRightCanvasCorner === undefined) {\n throw new Error('Canvas corners are not set');\n }\n for (let i = 0; i < this.scaledColumnIndex.length; i++) {\n const scaledX = this.scaledColumnIndex[i];\n if (!(scaledX >= this.topLeftCanvasCorner.x\n && scaledX < this.bottomRightCanvasCorner.x)) {\n continue;\n }\n // columnIndexPositions is used to get chunks to determine the start and end index of the column, it looks something like [0, 1, 4, 9, 12]\n // This means that the first column has a start index of 0 and an end index of 1, the second column has a start index of 1 and an end index of 4, and so on\n // scaledRowIndex is used when we reach the end of the columnIndexPositions, when columnIndexPositions is [0, 1, 4, 9, 12], scaledRowIndex is 13\n const columnEndIndex = this.columnIndexPositions[i + 1] !== undefined\n ? this.columnIndexPositions[i + 1]\n : this.scaledRowIndex.length;\n for (let columnStartIndex = this.columnIndexPositions[i]; columnStartIndex < columnEndIndex; columnStartIndex++) {\n const scaledY = this.scaledRowIndex[columnStartIndex];\n if (!(scaledY >= this.topLeftCanvasCorner.y\n && scaledY < this.bottomRightCanvasCorner.y)) {\n continue;\n }\n // Fill style is temporary green for all dies, will be replaced with a color based on the value of the die in a future implementation\n this.context.fillStyle = 'Green';\n this.context.fillRect(scaledX, scaledY, this.dieDimensions.width, this.dieDimensions.height);\n }\n }\n }\n }\n expose(MatrixRenderer);\n\n exports.MatrixRenderer = MatrixRenderer;\n\n return exports;\n\n})({});\n";
2
+ export const workerCode = "var MatrixRenderer = (function (exports) {\n 'use strict';\n\n /**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n const proxyMarker = Symbol(\"Comlink.proxy\");\n const createEndpoint = Symbol(\"Comlink.endpoint\");\n const releaseProxy = Symbol(\"Comlink.releaseProxy\");\n const finalizer = Symbol(\"Comlink.finalizer\");\n const throwMarker = Symbol(\"Comlink.thrown\");\n const isObject = (val) => (typeof val === \"object\" && val !== null) || typeof val === \"function\";\n /**\n * Internal transfer handle to handle objects marked to proxy.\n */\n const proxyTransferHandler = {\n canHandle: (val) => isObject(val) && val[proxyMarker],\n serialize(obj) {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port1);\n return [port2, [port2]];\n },\n deserialize(port) {\n port.start();\n return wrap(port);\n },\n };\n /**\n * Internal transfer handler to handle thrown exceptions.\n */\n const throwTransferHandler = {\n canHandle: (value) => isObject(value) && throwMarker in value,\n serialize({ value }) {\n let serialized;\n if (value instanceof Error) {\n serialized = {\n isError: true,\n value: {\n message: value.message,\n name: value.name,\n stack: value.stack,\n },\n };\n }\n else {\n serialized = { isError: false, value };\n }\n return [serialized, []];\n },\n deserialize(serialized) {\n if (serialized.isError) {\n throw Object.assign(new Error(serialized.value.message), serialized.value);\n }\n throw serialized.value;\n },\n };\n /**\n * Allows customizing the serialization of certain values.\n */\n const transferHandlers = new Map([\n [\"proxy\", proxyTransferHandler],\n [\"throw\", throwTransferHandler],\n ]);\n function isAllowedOrigin(allowedOrigins, origin) {\n for (const allowedOrigin of allowedOrigins) {\n if (origin === allowedOrigin || allowedOrigin === \"*\") {\n return true;\n }\n if (allowedOrigin instanceof RegExp && allowedOrigin.test(origin)) {\n return true;\n }\n }\n return false;\n }\n function expose(obj, ep = globalThis, allowedOrigins = [\"*\"]) {\n ep.addEventListener(\"message\", function callback(ev) {\n if (!ev || !ev.data) {\n return;\n }\n if (!isAllowedOrigin(allowedOrigins, ev.origin)) {\n console.warn(`Invalid origin '${ev.origin}' for comlink proxy`);\n return;\n }\n const { id, type, path } = Object.assign({ path: [] }, ev.data);\n const argumentList = (ev.data.argumentList || []).map(fromWireValue);\n let returnValue;\n try {\n const parent = path.slice(0, -1).reduce((obj, prop) => obj[prop], obj);\n const rawValue = path.reduce((obj, prop) => obj[prop], obj);\n switch (type) {\n case \"GET\" /* MessageType.GET */:\n {\n returnValue = rawValue;\n }\n break;\n case \"SET\" /* MessageType.SET */:\n {\n parent[path.slice(-1)[0]] = fromWireValue(ev.data.value);\n returnValue = true;\n }\n break;\n case \"APPLY\" /* MessageType.APPLY */:\n {\n returnValue = rawValue.apply(parent, argumentList);\n }\n break;\n case \"CONSTRUCT\" /* MessageType.CONSTRUCT */:\n {\n const value = new rawValue(...argumentList);\n returnValue = proxy(value);\n }\n break;\n case \"ENDPOINT\" /* MessageType.ENDPOINT */:\n {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port2);\n returnValue = transfer(port1, [port1]);\n }\n break;\n case \"RELEASE\" /* MessageType.RELEASE */:\n {\n returnValue = undefined;\n }\n break;\n default:\n return;\n }\n }\n catch (value) {\n returnValue = { value, [throwMarker]: 0 };\n }\n Promise.resolve(returnValue)\n .catch((value) => {\n return { value, [throwMarker]: 0 };\n })\n .then((returnValue) => {\n const [wireValue, transferables] = toWireValue(returnValue);\n ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);\n if (type === \"RELEASE\" /* MessageType.RELEASE */) {\n // detach and deactive after sending release response above.\n ep.removeEventListener(\"message\", callback);\n closeEndPoint(ep);\n if (finalizer in obj && typeof obj[finalizer] === \"function\") {\n obj[finalizer]();\n }\n }\n })\n .catch((error) => {\n // Send Serialization Error To Caller\n const [wireValue, transferables] = toWireValue({\n value: new TypeError(\"Unserializable return value\"),\n [throwMarker]: 0,\n });\n ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);\n });\n });\n if (ep.start) {\n ep.start();\n }\n }\n function isMessagePort(endpoint) {\n return endpoint.constructor.name === \"MessagePort\";\n }\n function closeEndPoint(endpoint) {\n if (isMessagePort(endpoint))\n endpoint.close();\n }\n function wrap(ep, target) {\n return createProxy(ep, [], target);\n }\n function throwIfProxyReleased(isReleased) {\n if (isReleased) {\n throw new Error(\"Proxy has been released and is not useable\");\n }\n }\n function releaseEndpoint(ep) {\n return requestResponseMessage(ep, {\n type: \"RELEASE\" /* MessageType.RELEASE */,\n }).then(() => {\n closeEndPoint(ep);\n });\n }\n const proxyCounter = new WeakMap();\n const proxyFinalizers = \"FinalizationRegistry\" in globalThis &&\n new FinalizationRegistry((ep) => {\n const newCount = (proxyCounter.get(ep) || 0) - 1;\n proxyCounter.set(ep, newCount);\n if (newCount === 0) {\n releaseEndpoint(ep);\n }\n });\n function registerProxy(proxy, ep) {\n const newCount = (proxyCounter.get(ep) || 0) + 1;\n proxyCounter.set(ep, newCount);\n if (proxyFinalizers) {\n proxyFinalizers.register(proxy, ep, proxy);\n }\n }\n function unregisterProxy(proxy) {\n if (proxyFinalizers) {\n proxyFinalizers.unregister(proxy);\n }\n }\n function createProxy(ep, path = [], target = function () { }) {\n let isProxyReleased = false;\n const proxy = new Proxy(target, {\n get(_target, prop) {\n throwIfProxyReleased(isProxyReleased);\n if (prop === releaseProxy) {\n return () => {\n unregisterProxy(proxy);\n releaseEndpoint(ep);\n isProxyReleased = true;\n };\n }\n if (prop === \"then\") {\n if (path.length === 0) {\n return { then: () => proxy };\n }\n const r = requestResponseMessage(ep, {\n type: \"GET\" /* MessageType.GET */,\n path: path.map((p) => p.toString()),\n }).then(fromWireValue);\n return r.then.bind(r);\n }\n return createProxy(ep, [...path, prop]);\n },\n set(_target, prop, rawValue) {\n throwIfProxyReleased(isProxyReleased);\n // FIXME: ES6 Proxy Handler `set` methods are supposed to return a\n // boolean. To show good will, we return true asynchronously ¯\\_(ツ)_/¯\n const [value, transferables] = toWireValue(rawValue);\n return requestResponseMessage(ep, {\n type: \"SET\" /* MessageType.SET */,\n path: [...path, prop].map((p) => p.toString()),\n value,\n }, transferables).then(fromWireValue);\n },\n apply(_target, _thisArg, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const last = path[path.length - 1];\n if (last === createEndpoint) {\n return requestResponseMessage(ep, {\n type: \"ENDPOINT\" /* MessageType.ENDPOINT */,\n }).then(fromWireValue);\n }\n // We just pretend that `bind()` didn’t happen.\n if (last === \"bind\") {\n return createProxy(ep, path.slice(0, -1));\n }\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(ep, {\n type: \"APPLY\" /* MessageType.APPLY */,\n path: path.map((p) => p.toString()),\n argumentList,\n }, transferables).then(fromWireValue);\n },\n construct(_target, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(ep, {\n type: \"CONSTRUCT\" /* MessageType.CONSTRUCT */,\n path: path.map((p) => p.toString()),\n argumentList,\n }, transferables).then(fromWireValue);\n },\n });\n registerProxy(proxy, ep);\n return proxy;\n }\n function myFlat(arr) {\n return Array.prototype.concat.apply([], arr);\n }\n function processArguments(argumentList) {\n const processed = argumentList.map(toWireValue);\n return [processed.map((v) => v[0]), myFlat(processed.map((v) => v[1]))];\n }\n const transferCache = new WeakMap();\n function transfer(obj, transfers) {\n transferCache.set(obj, transfers);\n return obj;\n }\n function proxy(obj) {\n return Object.assign(obj, { [proxyMarker]: true });\n }\n function toWireValue(value) {\n for (const [name, handler] of transferHandlers) {\n if (handler.canHandle(value)) {\n const [serializedValue, transferables] = handler.serialize(value);\n return [\n {\n type: \"HANDLER\" /* WireValueType.HANDLER */,\n name,\n value: serializedValue,\n },\n transferables,\n ];\n }\n }\n return [\n {\n type: \"RAW\" /* WireValueType.RAW */,\n value,\n },\n transferCache.get(value) || [],\n ];\n }\n function fromWireValue(value) {\n switch (value.type) {\n case \"HANDLER\" /* WireValueType.HANDLER */:\n return transferHandlers.get(value.name).deserialize(value.value);\n case \"RAW\" /* WireValueType.RAW */:\n return value.value;\n }\n }\n function requestResponseMessage(ep, msg, transfers) {\n return new Promise((resolve) => {\n const id = generateUUID();\n ep.addEventListener(\"message\", function l(ev) {\n if (!ev.data || !ev.data.id || ev.data.id !== id) {\n return;\n }\n ep.removeEventListener(\"message\", l);\n resolve(ev.data);\n });\n if (ep.start) {\n ep.start();\n }\n ep.postMessage(Object.assign({ id }, msg), transfers);\n });\n }\n function generateUUID() {\n return new Array(4)\n .fill(0)\n .map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16))\n .join(\"-\");\n }\n\n /**\n * MatrixRenderer class is meant to be used within a Web Worker context,\n * using Comlink to facilitate communication between the main thread and the worker.\n * The MatrixRenderer class manages a matrix of dies, once an instance of MatrixRenderer is created,\n * it is exposed to the main thread using Comlink's `expose` method.\n * This setup is used in the wafer-map component to perform heavy computational duties\n */\n class MatrixRenderer {\n constructor() {\n this.values = Float64Array.from([]);\n this.scaledColumnIndices = Float64Array.from([]);\n this.scaledRowIndices = Float64Array.from([]);\n this.columnIndicesPositions = Int32Array.from([]);\n this.renderConfig = {\n dieDimensions: {\n width: 0,\n height: 0\n },\n margin: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n },\n verticalCoefficient: 1,\n horizontalCoefficient: 1,\n horizontalConstant: 0,\n verticalConstant: 0,\n labelsFontSize: 0,\n colorScale: []\n };\n this.transformConfig = {\n transform: {\n k: 1,\n x: 0,\n y: 0\n },\n topLeftCanvasCorner: {\n x: 0,\n y: 0\n },\n bottomRightCanvasCorner: {\n x: 0,\n y: 0\n }\n };\n }\n calculateHorizontalScaledIndices(columnIndex) {\n return (this.renderConfig.horizontalCoefficient * columnIndex\n + this.renderConfig.horizontalConstant\n + this.renderConfig.margin.left);\n }\n calculateVerticalScaledIndices(rowIndex) {\n return (this.renderConfig.verticalCoefficient * rowIndex\n + this.renderConfig.verticalConstant\n + this.renderConfig.margin.top);\n }\n setColumnIndices(columnIndices) {\n if (columnIndices.length === 0 || columnIndices[0] === undefined) {\n return;\n }\n const scaledColumnIndex = [\n this.calculateHorizontalScaledIndices(columnIndices[0])\n ];\n const columnPositions = [0];\n let prev = columnIndices[0];\n for (let i = 1; i < columnIndices.length; i++) {\n const xIndex = columnIndices[i];\n if (xIndex && xIndex !== prev) {\n const scaledX = this.calculateHorizontalScaledIndices(columnIndices[i]);\n scaledColumnIndex.push(scaledX);\n columnPositions.push(i);\n prev = xIndex;\n }\n }\n this.scaledColumnIndices = Float64Array.from(scaledColumnIndex);\n this.columnIndicesPositions = Int32Array.from(columnPositions);\n }\n setRowIndices(rowIndices) {\n this.scaledRowIndices = new Float64Array(rowIndices.length);\n for (let i = 0; i < rowIndices.length; i++) {\n this.scaledRowIndices[i] = this.calculateVerticalScaledIndices(rowIndices[i]);\n }\n }\n setRenderConfig(renderConfig) {\n this.renderConfig = renderConfig;\n }\n setTransformConfig(transformData) {\n this.transformConfig = transformData;\n }\n setCanvas(canvas) {\n this.canvas = canvas;\n this.context = canvas.getContext('2d');\n }\n scaleCanvas() {\n this.context.translate(this.transformConfig.transform.x, this.transformConfig.transform.y);\n this.context.scale(this.transformConfig.transform.k, this.transformConfig.transform.k);\n }\n setCanvasDimensions(data) {\n this.canvas.width = data.width;\n this.canvas.height = data.height;\n }\n getCanvasDimensions() {\n return {\n width: this.canvas.width,\n height: this.canvas.height\n };\n }\n clearCanvas() {\n this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);\n }\n drawWafer() {\n this.context.restore();\n this.context.save();\n this.clearCanvas();\n this.scaleCanvas();\n for (let i = 0; i < this.scaledColumnIndices.length; i++) {\n const scaledX = this.scaledColumnIndices[i];\n if (!(scaledX >= this.transformConfig.topLeftCanvasCorner.x\n && scaledX < this.transformConfig.bottomRightCanvasCorner.x)) {\n continue;\n }\n // columnIndexPositions is used to get chunks to determine the start and end index of the column, it looks something like [0, 1, 4, 9, 12]\n // This means that the first column has a start index of 0 and an end index of 1, the second column has a start index of 1 and an end index of 4, and so on\n // scaledRowIndices is used when we reach the end of the columnIndexPositions, when columnIndexPositions is [0, 1, 4, 9, 12], scaledRowIndices is 13\n const columnEndIndex = this.columnIndicesPositions[i + 1] !== undefined\n ? this.columnIndicesPositions[i + 1]\n : this.scaledRowIndices.length;\n for (let columnStartIndex = this.columnIndicesPositions[i]; columnStartIndex < columnEndIndex; columnStartIndex++) {\n const scaledY = this.scaledRowIndices[columnStartIndex];\n if (!(scaledY >= this.transformConfig.topLeftCanvasCorner.y\n && scaledY < this.transformConfig.bottomRightCanvasCorner.y)) {\n continue;\n }\n // Fill style is temporary green for all dies, will be replaced with a color based on the value of the die in a future implementation\n this.context.fillStyle = 'Green';\n this.context.fillRect(scaledX, scaledY, this.renderConfig.dieDimensions.width, this.renderConfig.dieDimensions.height);\n }\n }\n }\n }\n expose(MatrixRenderer);\n\n exports.MatrixRenderer = MatrixRenderer;\n\n return exports;\n\n})({});\n";
3
3
  //# sourceMappingURL=matrix-renderer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"matrix-renderer.js","sourceRoot":"","sources":["../../../../src/wafer-map/workers/matrix-renderer.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,MAAM,CAAC,MAAM,UAAU,GAAG,i1oBAAi1oB,CAAC","sourcesContent":["// eslint-disable-next-line no-template-curly-in-string\nexport const workerCode = \"var MatrixRenderer = (function (exports) {\\n 'use strict';\\n\\n /**\\n * @license\\n * Copyright 2019 Google LLC\\n * SPDX-License-Identifier: Apache-2.0\\n */\\n const proxyMarker = Symbol(\\\"Comlink.proxy\\\");\\n const createEndpoint = Symbol(\\\"Comlink.endpoint\\\");\\n const releaseProxy = Symbol(\\\"Comlink.releaseProxy\\\");\\n const finalizer = Symbol(\\\"Comlink.finalizer\\\");\\n const throwMarker = Symbol(\\\"Comlink.thrown\\\");\\n const isObject = (val) => (typeof val === \\\"object\\\" && val !== null) || typeof val === \\\"function\\\";\\n /**\\n * Internal transfer handle to handle objects marked to proxy.\\n */\\n const proxyTransferHandler = {\\n canHandle: (val) => isObject(val) && val[proxyMarker],\\n serialize(obj) {\\n const { port1, port2 } = new MessageChannel();\\n expose(obj, port1);\\n return [port2, [port2]];\\n },\\n deserialize(port) {\\n port.start();\\n return wrap(port);\\n },\\n };\\n /**\\n * Internal transfer handler to handle thrown exceptions.\\n */\\n const throwTransferHandler = {\\n canHandle: (value) => isObject(value) && throwMarker in value,\\n serialize({ value }) {\\n let serialized;\\n if (value instanceof Error) {\\n serialized = {\\n isError: true,\\n value: {\\n message: value.message,\\n name: value.name,\\n stack: value.stack,\\n },\\n };\\n }\\n else {\\n serialized = { isError: false, value };\\n }\\n return [serialized, []];\\n },\\n deserialize(serialized) {\\n if (serialized.isError) {\\n throw Object.assign(new Error(serialized.value.message), serialized.value);\\n }\\n throw serialized.value;\\n },\\n };\\n /**\\n * Allows customizing the serialization of certain values.\\n */\\n const transferHandlers = new Map([\\n [\\\"proxy\\\", proxyTransferHandler],\\n [\\\"throw\\\", throwTransferHandler],\\n ]);\\n function isAllowedOrigin(allowedOrigins, origin) {\\n for (const allowedOrigin of allowedOrigins) {\\n if (origin === allowedOrigin || allowedOrigin === \\\"*\\\") {\\n return true;\\n }\\n if (allowedOrigin instanceof RegExp && allowedOrigin.test(origin)) {\\n return true;\\n }\\n }\\n return false;\\n }\\n function expose(obj, ep = globalThis, allowedOrigins = [\\\"*\\\"]) {\\n ep.addEventListener(\\\"message\\\", function callback(ev) {\\n if (!ev || !ev.data) {\\n return;\\n }\\n if (!isAllowedOrigin(allowedOrigins, ev.origin)) {\\n console.warn(`Invalid origin '${ev.origin}' for comlink proxy`);\\n return;\\n }\\n const { id, type, path } = Object.assign({ path: [] }, ev.data);\\n const argumentList = (ev.data.argumentList || []).map(fromWireValue);\\n let returnValue;\\n try {\\n const parent = path.slice(0, -1).reduce((obj, prop) => obj[prop], obj);\\n const rawValue = path.reduce((obj, prop) => obj[prop], obj);\\n switch (type) {\\n case \\\"GET\\\" /* MessageType.GET */:\\n {\\n returnValue = rawValue;\\n }\\n break;\\n case \\\"SET\\\" /* MessageType.SET */:\\n {\\n parent[path.slice(-1)[0]] = fromWireValue(ev.data.value);\\n returnValue = true;\\n }\\n break;\\n case \\\"APPLY\\\" /* MessageType.APPLY */:\\n {\\n returnValue = rawValue.apply(parent, argumentList);\\n }\\n break;\\n case \\\"CONSTRUCT\\\" /* MessageType.CONSTRUCT */:\\n {\\n const value = new rawValue(...argumentList);\\n returnValue = proxy(value);\\n }\\n break;\\n case \\\"ENDPOINT\\\" /* MessageType.ENDPOINT */:\\n {\\n const { port1, port2 } = new MessageChannel();\\n expose(obj, port2);\\n returnValue = transfer(port1, [port1]);\\n }\\n break;\\n case \\\"RELEASE\\\" /* MessageType.RELEASE */:\\n {\\n returnValue = undefined;\\n }\\n break;\\n default:\\n return;\\n }\\n }\\n catch (value) {\\n returnValue = { value, [throwMarker]: 0 };\\n }\\n Promise.resolve(returnValue)\\n .catch((value) => {\\n return { value, [throwMarker]: 0 };\\n })\\n .then((returnValue) => {\\n const [wireValue, transferables] = toWireValue(returnValue);\\n ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);\\n if (type === \\\"RELEASE\\\" /* MessageType.RELEASE */) {\\n // detach and deactive after sending release response above.\\n ep.removeEventListener(\\\"message\\\", callback);\\n closeEndPoint(ep);\\n if (finalizer in obj && typeof obj[finalizer] === \\\"function\\\") {\\n obj[finalizer]();\\n }\\n }\\n })\\n .catch((error) => {\\n // Send Serialization Error To Caller\\n const [wireValue, transferables] = toWireValue({\\n value: new TypeError(\\\"Unserializable return value\\\"),\\n [throwMarker]: 0,\\n });\\n ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);\\n });\\n });\\n if (ep.start) {\\n ep.start();\\n }\\n }\\n function isMessagePort(endpoint) {\\n return endpoint.constructor.name === \\\"MessagePort\\\";\\n }\\n function closeEndPoint(endpoint) {\\n if (isMessagePort(endpoint))\\n endpoint.close();\\n }\\n function wrap(ep, target) {\\n return createProxy(ep, [], target);\\n }\\n function throwIfProxyReleased(isReleased) {\\n if (isReleased) {\\n throw new Error(\\\"Proxy has been released and is not useable\\\");\\n }\\n }\\n function releaseEndpoint(ep) {\\n return requestResponseMessage(ep, {\\n type: \\\"RELEASE\\\" /* MessageType.RELEASE */,\\n }).then(() => {\\n closeEndPoint(ep);\\n });\\n }\\n const proxyCounter = new WeakMap();\\n const proxyFinalizers = \\\"FinalizationRegistry\\\" in globalThis &&\\n new FinalizationRegistry((ep) => {\\n const newCount = (proxyCounter.get(ep) || 0) - 1;\\n proxyCounter.set(ep, newCount);\\n if (newCount === 0) {\\n releaseEndpoint(ep);\\n }\\n });\\n function registerProxy(proxy, ep) {\\n const newCount = (proxyCounter.get(ep) || 0) + 1;\\n proxyCounter.set(ep, newCount);\\n if (proxyFinalizers) {\\n proxyFinalizers.register(proxy, ep, proxy);\\n }\\n }\\n function unregisterProxy(proxy) {\\n if (proxyFinalizers) {\\n proxyFinalizers.unregister(proxy);\\n }\\n }\\n function createProxy(ep, path = [], target = function () { }) {\\n let isProxyReleased = false;\\n const proxy = new Proxy(target, {\\n get(_target, prop) {\\n throwIfProxyReleased(isProxyReleased);\\n if (prop === releaseProxy) {\\n return () => {\\n unregisterProxy(proxy);\\n releaseEndpoint(ep);\\n isProxyReleased = true;\\n };\\n }\\n if (prop === \\\"then\\\") {\\n if (path.length === 0) {\\n return { then: () => proxy };\\n }\\n const r = requestResponseMessage(ep, {\\n type: \\\"GET\\\" /* MessageType.GET */,\\n path: path.map((p) => p.toString()),\\n }).then(fromWireValue);\\n return r.then.bind(r);\\n }\\n return createProxy(ep, [...path, prop]);\\n },\\n set(_target, prop, rawValue) {\\n throwIfProxyReleased(isProxyReleased);\\n // FIXME: ES6 Proxy Handler `set` methods are supposed to return a\\n // boolean. To show good will, we return true asynchronously ¯\\\\_(ツ)_/¯\\n const [value, transferables] = toWireValue(rawValue);\\n return requestResponseMessage(ep, {\\n type: \\\"SET\\\" /* MessageType.SET */,\\n path: [...path, prop].map((p) => p.toString()),\\n value,\\n }, transferables).then(fromWireValue);\\n },\\n apply(_target, _thisArg, rawArgumentList) {\\n throwIfProxyReleased(isProxyReleased);\\n const last = path[path.length - 1];\\n if (last === createEndpoint) {\\n return requestResponseMessage(ep, {\\n type: \\\"ENDPOINT\\\" /* MessageType.ENDPOINT */,\\n }).then(fromWireValue);\\n }\\n // We just pretend that `bind()` didn’t happen.\\n if (last === \\\"bind\\\") {\\n return createProxy(ep, path.slice(0, -1));\\n }\\n const [argumentList, transferables] = processArguments(rawArgumentList);\\n return requestResponseMessage(ep, {\\n type: \\\"APPLY\\\" /* MessageType.APPLY */,\\n path: path.map((p) => p.toString()),\\n argumentList,\\n }, transferables).then(fromWireValue);\\n },\\n construct(_target, rawArgumentList) {\\n throwIfProxyReleased(isProxyReleased);\\n const [argumentList, transferables] = processArguments(rawArgumentList);\\n return requestResponseMessage(ep, {\\n type: \\\"CONSTRUCT\\\" /* MessageType.CONSTRUCT */,\\n path: path.map((p) => p.toString()),\\n argumentList,\\n }, transferables).then(fromWireValue);\\n },\\n });\\n registerProxy(proxy, ep);\\n return proxy;\\n }\\n function myFlat(arr) {\\n return Array.prototype.concat.apply([], arr);\\n }\\n function processArguments(argumentList) {\\n const processed = argumentList.map(toWireValue);\\n return [processed.map((v) => v[0]), myFlat(processed.map((v) => v[1]))];\\n }\\n const transferCache = new WeakMap();\\n function transfer(obj, transfers) {\\n transferCache.set(obj, transfers);\\n return obj;\\n }\\n function proxy(obj) {\\n return Object.assign(obj, { [proxyMarker]: true });\\n }\\n function toWireValue(value) {\\n for (const [name, handler] of transferHandlers) {\\n if (handler.canHandle(value)) {\\n const [serializedValue, transferables] = handler.serialize(value);\\n return [\\n {\\n type: \\\"HANDLER\\\" /* WireValueType.HANDLER */,\\n name,\\n value: serializedValue,\\n },\\n transferables,\\n ];\\n }\\n }\\n return [\\n {\\n type: \\\"RAW\\\" /* WireValueType.RAW */,\\n value,\\n },\\n transferCache.get(value) || [],\\n ];\\n }\\n function fromWireValue(value) {\\n switch (value.type) {\\n case \\\"HANDLER\\\" /* WireValueType.HANDLER */:\\n return transferHandlers.get(value.name).deserialize(value.value);\\n case \\\"RAW\\\" /* WireValueType.RAW */:\\n return value.value;\\n }\\n }\\n function requestResponseMessage(ep, msg, transfers) {\\n return new Promise((resolve) => {\\n const id = generateUUID();\\n ep.addEventListener(\\\"message\\\", function l(ev) {\\n if (!ev.data || !ev.data.id || ev.data.id !== id) {\\n return;\\n }\\n ep.removeEventListener(\\\"message\\\", l);\\n resolve(ev.data);\\n });\\n if (ep.start) {\\n ep.start();\\n }\\n ep.postMessage(Object.assign({ id }, msg), transfers);\\n });\\n }\\n function generateUUID() {\\n return new Array(4)\\n .fill(0)\\n .map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16))\\n .join(\\\"-\\\");\\n }\\n\\n /**\\n * MatrixRenderer class is meant to be used within a Web Worker context,\\n * using Comlink to facilitate communication between the main thread and the worker.\\n * The MatrixRenderer class manages a matrix of dies, once an instance of MatrixRenderer is created,\\n * it is exposed to the main thread using Comlink's `expose` method.\\n * This setup is used in the wafer-map component to perform heavy computational duties\\n */\\n class MatrixRenderer {\\n constructor() {\\n this.columnIndexes = Int32Array.from([]);\\n this.rowIndexes = Int32Array.from([]);\\n this.values = Float64Array.from([]);\\n this.scaledColumnIndex = Float64Array.from([]);\\n this.scaledRowIndex = Float64Array.from([]);\\n this.columnIndexPositions = Int32Array.from([]);\\n this.scaleX = 1;\\n this.scaleY = 1;\\n this.baseX = 1;\\n this.baseY = 1;\\n this.dieDimensions = { width: 1, height: 1 };\\n this.transform = { k: 1, x: 0, y: 0 };\\n this.smallestMarginPossible = 20;\\n this.margin = {\\n top: this.smallestMarginPossible,\\n right: this.smallestMarginPossible,\\n bottom: this.smallestMarginPossible,\\n left: this.smallestMarginPossible\\n };\\n }\\n calculateXScaledIndex(columnIndex) {\\n return this.scaleX * columnIndex + this.baseX + this.margin.left;\\n }\\n calculateYScaledIndex(rowIndex) {\\n return this.scaleY * rowIndex + this.baseY + this.margin.top;\\n }\\n setColumnIndexes(columnIndexes) {\\n this.columnIndexes = columnIndexes;\\n if (columnIndexes.length === 0 || this.columnIndexes[0] === undefined) {\\n return;\\n }\\n const scaledColumnIndex = [\\n this.calculateXScaledIndex(this.columnIndexes[0])\\n ];\\n const columnPositions = [0];\\n let prev = this.columnIndexes[0];\\n for (let i = 1; i < this.columnIndexes.length; i++) {\\n const xIndex = this.columnIndexes[i];\\n if (xIndex && xIndex !== prev) {\\n const scaledX = this.calculateXScaledIndex(this.columnIndexes[i]);\\n scaledColumnIndex.push(scaledX);\\n columnPositions.push(i);\\n prev = xIndex;\\n }\\n }\\n this.scaledColumnIndex = Float64Array.from(scaledColumnIndex);\\n this.columnIndexPositions = Int32Array.from(columnPositions);\\n }\\n setRowIndexes(rowIndexesBuffer) {\\n this.rowIndexes = rowIndexesBuffer;\\n this.scaledRowIndex = new Float64Array(this.rowIndexes.length);\\n for (let i = 0; i < this.rowIndexes.length; i++) {\\n this.scaledRowIndex[i] = this.calculateYScaledIndex(this.rowIndexes[i]);\\n }\\n }\\n setMargin(margin) {\\n this.margin = margin;\\n }\\n setCanvasCorners(topLeft, bottomRight) {\\n this.topLeftCanvasCorner = topLeft;\\n this.bottomRightCanvasCorner = bottomRight;\\n }\\n setDiesDimensions(data) {\\n this.dieDimensions = { width: data.width, height: data.height };\\n }\\n setScaling(scaleX, scaleY) {\\n this.scaleX = scaleX;\\n this.scaleY = scaleY;\\n }\\n setBases(baseX, baseY) {\\n this.baseX = baseX;\\n this.baseY = baseY;\\n }\\n setTransform(transform) {\\n this.transform = transform;\\n }\\n setCanvas(canvas) {\\n this.canvas = canvas;\\n this.context = canvas.getContext('2d');\\n }\\n getMatrix() {\\n return {\\n columnIndexes: this.columnIndexes,\\n rowIndexes: this.rowIndexes,\\n values: this.values\\n };\\n }\\n emptyMatrix() {\\n this.columnIndexes = Int32Array.from([]);\\n this.rowIndexes = Int32Array.from([]);\\n this.values = Float64Array.from([]);\\n }\\n scaleCanvas() {\\n this.context.translate(this.transform.x, this.transform.y);\\n this.context.scale(this.transform.k, this.transform.k);\\n }\\n updateMatrix(data) {\\n this.columnIndexes = Int32Array.from(data.columnIndexes);\\n this.rowIndexes = Int32Array.from(data.rowIndexes);\\n this.values = Float64Array.from(data.values);\\n }\\n setCanvasDimensions(data) {\\n this.canvas.width = data.width;\\n this.canvas.height = data.height;\\n }\\n getCanvasDimensions() {\\n return {\\n width: this.canvas.width,\\n height: this.canvas.height\\n };\\n }\\n clearCanvas() {\\n this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);\\n }\\n drawWafer() {\\n this.context.restore();\\n this.context.save();\\n this.clearCanvas();\\n this.scaleCanvas();\\n if (this.topLeftCanvasCorner === undefined\\n || this.bottomRightCanvasCorner === undefined) {\\n throw new Error('Canvas corners are not set');\\n }\\n for (let i = 0; i < this.scaledColumnIndex.length; i++) {\\n const scaledX = this.scaledColumnIndex[i];\\n if (!(scaledX >= this.topLeftCanvasCorner.x\\n && scaledX < this.bottomRightCanvasCorner.x)) {\\n continue;\\n }\\n // columnIndexPositions is used to get chunks to determine the start and end index of the column, it looks something like [0, 1, 4, 9, 12]\\n // This means that the first column has a start index of 0 and an end index of 1, the second column has a start index of 1 and an end index of 4, and so on\\n // scaledRowIndex is used when we reach the end of the columnIndexPositions, when columnIndexPositions is [0, 1, 4, 9, 12], scaledRowIndex is 13\\n const columnEndIndex = this.columnIndexPositions[i + 1] !== undefined\\n ? this.columnIndexPositions[i + 1]\\n : this.scaledRowIndex.length;\\n for (let columnStartIndex = this.columnIndexPositions[i]; columnStartIndex < columnEndIndex; columnStartIndex++) {\\n const scaledY = this.scaledRowIndex[columnStartIndex];\\n if (!(scaledY >= this.topLeftCanvasCorner.y\\n && scaledY < this.bottomRightCanvasCorner.y)) {\\n continue;\\n }\\n // Fill style is temporary green for all dies, will be replaced with a color based on the value of the die in a future implementation\\n this.context.fillStyle = 'Green';\\n this.context.fillRect(scaledX, scaledY, this.dieDimensions.width, this.dieDimensions.height);\\n }\\n }\\n }\\n }\\n expose(MatrixRenderer);\\n\\n exports.MatrixRenderer = MatrixRenderer;\\n\\n return exports;\\n\\n})({});\\n\";\n"]}
1
+ {"version":3,"file":"matrix-renderer.js","sourceRoot":"","sources":["../../../../src/wafer-map/workers/matrix-renderer.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,MAAM,CAAC,MAAM,UAAU,GAAG,sqnBAAsqnB,CAAC","sourcesContent":["// eslint-disable-next-line no-template-curly-in-string\nexport const workerCode = \"var MatrixRenderer = (function (exports) {\\n 'use strict';\\n\\n /**\\n * @license\\n * Copyright 2019 Google LLC\\n * SPDX-License-Identifier: Apache-2.0\\n */\\n const proxyMarker = Symbol(\\\"Comlink.proxy\\\");\\n const createEndpoint = Symbol(\\\"Comlink.endpoint\\\");\\n const releaseProxy = Symbol(\\\"Comlink.releaseProxy\\\");\\n const finalizer = Symbol(\\\"Comlink.finalizer\\\");\\n const throwMarker = Symbol(\\\"Comlink.thrown\\\");\\n const isObject = (val) => (typeof val === \\\"object\\\" && val !== null) || typeof val === \\\"function\\\";\\n /**\\n * Internal transfer handle to handle objects marked to proxy.\\n */\\n const proxyTransferHandler = {\\n canHandle: (val) => isObject(val) && val[proxyMarker],\\n serialize(obj) {\\n const { port1, port2 } = new MessageChannel();\\n expose(obj, port1);\\n return [port2, [port2]];\\n },\\n deserialize(port) {\\n port.start();\\n return wrap(port);\\n },\\n };\\n /**\\n * Internal transfer handler to handle thrown exceptions.\\n */\\n const throwTransferHandler = {\\n canHandle: (value) => isObject(value) && throwMarker in value,\\n serialize({ value }) {\\n let serialized;\\n if (value instanceof Error) {\\n serialized = {\\n isError: true,\\n value: {\\n message: value.message,\\n name: value.name,\\n stack: value.stack,\\n },\\n };\\n }\\n else {\\n serialized = { isError: false, value };\\n }\\n return [serialized, []];\\n },\\n deserialize(serialized) {\\n if (serialized.isError) {\\n throw Object.assign(new Error(serialized.value.message), serialized.value);\\n }\\n throw serialized.value;\\n },\\n };\\n /**\\n * Allows customizing the serialization of certain values.\\n */\\n const transferHandlers = new Map([\\n [\\\"proxy\\\", proxyTransferHandler],\\n [\\\"throw\\\", throwTransferHandler],\\n ]);\\n function isAllowedOrigin(allowedOrigins, origin) {\\n for (const allowedOrigin of allowedOrigins) {\\n if (origin === allowedOrigin || allowedOrigin === \\\"*\\\") {\\n return true;\\n }\\n if (allowedOrigin instanceof RegExp && allowedOrigin.test(origin)) {\\n return true;\\n }\\n }\\n return false;\\n }\\n function expose(obj, ep = globalThis, allowedOrigins = [\\\"*\\\"]) {\\n ep.addEventListener(\\\"message\\\", function callback(ev) {\\n if (!ev || !ev.data) {\\n return;\\n }\\n if (!isAllowedOrigin(allowedOrigins, ev.origin)) {\\n console.warn(`Invalid origin '${ev.origin}' for comlink proxy`);\\n return;\\n }\\n const { id, type, path } = Object.assign({ path: [] }, ev.data);\\n const argumentList = (ev.data.argumentList || []).map(fromWireValue);\\n let returnValue;\\n try {\\n const parent = path.slice(0, -1).reduce((obj, prop) => obj[prop], obj);\\n const rawValue = path.reduce((obj, prop) => obj[prop], obj);\\n switch (type) {\\n case \\\"GET\\\" /* MessageType.GET */:\\n {\\n returnValue = rawValue;\\n }\\n break;\\n case \\\"SET\\\" /* MessageType.SET */:\\n {\\n parent[path.slice(-1)[0]] = fromWireValue(ev.data.value);\\n returnValue = true;\\n }\\n break;\\n case \\\"APPLY\\\" /* MessageType.APPLY */:\\n {\\n returnValue = rawValue.apply(parent, argumentList);\\n }\\n break;\\n case \\\"CONSTRUCT\\\" /* MessageType.CONSTRUCT */:\\n {\\n const value = new rawValue(...argumentList);\\n returnValue = proxy(value);\\n }\\n break;\\n case \\\"ENDPOINT\\\" /* MessageType.ENDPOINT */:\\n {\\n const { port1, port2 } = new MessageChannel();\\n expose(obj, port2);\\n returnValue = transfer(port1, [port1]);\\n }\\n break;\\n case \\\"RELEASE\\\" /* MessageType.RELEASE */:\\n {\\n returnValue = undefined;\\n }\\n break;\\n default:\\n return;\\n }\\n }\\n catch (value) {\\n returnValue = { value, [throwMarker]: 0 };\\n }\\n Promise.resolve(returnValue)\\n .catch((value) => {\\n return { value, [throwMarker]: 0 };\\n })\\n .then((returnValue) => {\\n const [wireValue, transferables] = toWireValue(returnValue);\\n ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);\\n if (type === \\\"RELEASE\\\" /* MessageType.RELEASE */) {\\n // detach and deactive after sending release response above.\\n ep.removeEventListener(\\\"message\\\", callback);\\n closeEndPoint(ep);\\n if (finalizer in obj && typeof obj[finalizer] === \\\"function\\\") {\\n obj[finalizer]();\\n }\\n }\\n })\\n .catch((error) => {\\n // Send Serialization Error To Caller\\n const [wireValue, transferables] = toWireValue({\\n value: new TypeError(\\\"Unserializable return value\\\"),\\n [throwMarker]: 0,\\n });\\n ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);\\n });\\n });\\n if (ep.start) {\\n ep.start();\\n }\\n }\\n function isMessagePort(endpoint) {\\n return endpoint.constructor.name === \\\"MessagePort\\\";\\n }\\n function closeEndPoint(endpoint) {\\n if (isMessagePort(endpoint))\\n endpoint.close();\\n }\\n function wrap(ep, target) {\\n return createProxy(ep, [], target);\\n }\\n function throwIfProxyReleased(isReleased) {\\n if (isReleased) {\\n throw new Error(\\\"Proxy has been released and is not useable\\\");\\n }\\n }\\n function releaseEndpoint(ep) {\\n return requestResponseMessage(ep, {\\n type: \\\"RELEASE\\\" /* MessageType.RELEASE */,\\n }).then(() => {\\n closeEndPoint(ep);\\n });\\n }\\n const proxyCounter = new WeakMap();\\n const proxyFinalizers = \\\"FinalizationRegistry\\\" in globalThis &&\\n new FinalizationRegistry((ep) => {\\n const newCount = (proxyCounter.get(ep) || 0) - 1;\\n proxyCounter.set(ep, newCount);\\n if (newCount === 0) {\\n releaseEndpoint(ep);\\n }\\n });\\n function registerProxy(proxy, ep) {\\n const newCount = (proxyCounter.get(ep) || 0) + 1;\\n proxyCounter.set(ep, newCount);\\n if (proxyFinalizers) {\\n proxyFinalizers.register(proxy, ep, proxy);\\n }\\n }\\n function unregisterProxy(proxy) {\\n if (proxyFinalizers) {\\n proxyFinalizers.unregister(proxy);\\n }\\n }\\n function createProxy(ep, path = [], target = function () { }) {\\n let isProxyReleased = false;\\n const proxy = new Proxy(target, {\\n get(_target, prop) {\\n throwIfProxyReleased(isProxyReleased);\\n if (prop === releaseProxy) {\\n return () => {\\n unregisterProxy(proxy);\\n releaseEndpoint(ep);\\n isProxyReleased = true;\\n };\\n }\\n if (prop === \\\"then\\\") {\\n if (path.length === 0) {\\n return { then: () => proxy };\\n }\\n const r = requestResponseMessage(ep, {\\n type: \\\"GET\\\" /* MessageType.GET */,\\n path: path.map((p) => p.toString()),\\n }).then(fromWireValue);\\n return r.then.bind(r);\\n }\\n return createProxy(ep, [...path, prop]);\\n },\\n set(_target, prop, rawValue) {\\n throwIfProxyReleased(isProxyReleased);\\n // FIXME: ES6 Proxy Handler `set` methods are supposed to return a\\n // boolean. To show good will, we return true asynchronously ¯\\\\_(ツ)_/¯\\n const [value, transferables] = toWireValue(rawValue);\\n return requestResponseMessage(ep, {\\n type: \\\"SET\\\" /* MessageType.SET */,\\n path: [...path, prop].map((p) => p.toString()),\\n value,\\n }, transferables).then(fromWireValue);\\n },\\n apply(_target, _thisArg, rawArgumentList) {\\n throwIfProxyReleased(isProxyReleased);\\n const last = path[path.length - 1];\\n if (last === createEndpoint) {\\n return requestResponseMessage(ep, {\\n type: \\\"ENDPOINT\\\" /* MessageType.ENDPOINT */,\\n }).then(fromWireValue);\\n }\\n // We just pretend that `bind()` didn’t happen.\\n if (last === \\\"bind\\\") {\\n return createProxy(ep, path.slice(0, -1));\\n }\\n const [argumentList, transferables] = processArguments(rawArgumentList);\\n return requestResponseMessage(ep, {\\n type: \\\"APPLY\\\" /* MessageType.APPLY */,\\n path: path.map((p) => p.toString()),\\n argumentList,\\n }, transferables).then(fromWireValue);\\n },\\n construct(_target, rawArgumentList) {\\n throwIfProxyReleased(isProxyReleased);\\n const [argumentList, transferables] = processArguments(rawArgumentList);\\n return requestResponseMessage(ep, {\\n type: \\\"CONSTRUCT\\\" /* MessageType.CONSTRUCT */,\\n path: path.map((p) => p.toString()),\\n argumentList,\\n }, transferables).then(fromWireValue);\\n },\\n });\\n registerProxy(proxy, ep);\\n return proxy;\\n }\\n function myFlat(arr) {\\n return Array.prototype.concat.apply([], arr);\\n }\\n function processArguments(argumentList) {\\n const processed = argumentList.map(toWireValue);\\n return [processed.map((v) => v[0]), myFlat(processed.map((v) => v[1]))];\\n }\\n const transferCache = new WeakMap();\\n function transfer(obj, transfers) {\\n transferCache.set(obj, transfers);\\n return obj;\\n }\\n function proxy(obj) {\\n return Object.assign(obj, { [proxyMarker]: true });\\n }\\n function toWireValue(value) {\\n for (const [name, handler] of transferHandlers) {\\n if (handler.canHandle(value)) {\\n const [serializedValue, transferables] = handler.serialize(value);\\n return [\\n {\\n type: \\\"HANDLER\\\" /* WireValueType.HANDLER */,\\n name,\\n value: serializedValue,\\n },\\n transferables,\\n ];\\n }\\n }\\n return [\\n {\\n type: \\\"RAW\\\" /* WireValueType.RAW */,\\n value,\\n },\\n transferCache.get(value) || [],\\n ];\\n }\\n function fromWireValue(value) {\\n switch (value.type) {\\n case \\\"HANDLER\\\" /* WireValueType.HANDLER */:\\n return transferHandlers.get(value.name).deserialize(value.value);\\n case \\\"RAW\\\" /* WireValueType.RAW */:\\n return value.value;\\n }\\n }\\n function requestResponseMessage(ep, msg, transfers) {\\n return new Promise((resolve) => {\\n const id = generateUUID();\\n ep.addEventListener(\\\"message\\\", function l(ev) {\\n if (!ev.data || !ev.data.id || ev.data.id !== id) {\\n return;\\n }\\n ep.removeEventListener(\\\"message\\\", l);\\n resolve(ev.data);\\n });\\n if (ep.start) {\\n ep.start();\\n }\\n ep.postMessage(Object.assign({ id }, msg), transfers);\\n });\\n }\\n function generateUUID() {\\n return new Array(4)\\n .fill(0)\\n .map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16))\\n .join(\\\"-\\\");\\n }\\n\\n /**\\n * MatrixRenderer class is meant to be used within a Web Worker context,\\n * using Comlink to facilitate communication between the main thread and the worker.\\n * The MatrixRenderer class manages a matrix of dies, once an instance of MatrixRenderer is created,\\n * it is exposed to the main thread using Comlink's `expose` method.\\n * This setup is used in the wafer-map component to perform heavy computational duties\\n */\\n class MatrixRenderer {\\n constructor() {\\n this.values = Float64Array.from([]);\\n this.scaledColumnIndices = Float64Array.from([]);\\n this.scaledRowIndices = Float64Array.from([]);\\n this.columnIndicesPositions = Int32Array.from([]);\\n this.renderConfig = {\\n dieDimensions: {\\n width: 0,\\n height: 0\\n },\\n margin: {\\n top: 0,\\n right: 0,\\n bottom: 0,\\n left: 0\\n },\\n verticalCoefficient: 1,\\n horizontalCoefficient: 1,\\n horizontalConstant: 0,\\n verticalConstant: 0,\\n labelsFontSize: 0,\\n colorScale: []\\n };\\n this.transformConfig = {\\n transform: {\\n k: 1,\\n x: 0,\\n y: 0\\n },\\n topLeftCanvasCorner: {\\n x: 0,\\n y: 0\\n },\\n bottomRightCanvasCorner: {\\n x: 0,\\n y: 0\\n }\\n };\\n }\\n calculateHorizontalScaledIndices(columnIndex) {\\n return (this.renderConfig.horizontalCoefficient * columnIndex\\n + this.renderConfig.horizontalConstant\\n + this.renderConfig.margin.left);\\n }\\n calculateVerticalScaledIndices(rowIndex) {\\n return (this.renderConfig.verticalCoefficient * rowIndex\\n + this.renderConfig.verticalConstant\\n + this.renderConfig.margin.top);\\n }\\n setColumnIndices(columnIndices) {\\n if (columnIndices.length === 0 || columnIndices[0] === undefined) {\\n return;\\n }\\n const scaledColumnIndex = [\\n this.calculateHorizontalScaledIndices(columnIndices[0])\\n ];\\n const columnPositions = [0];\\n let prev = columnIndices[0];\\n for (let i = 1; i < columnIndices.length; i++) {\\n const xIndex = columnIndices[i];\\n if (xIndex && xIndex !== prev) {\\n const scaledX = this.calculateHorizontalScaledIndices(columnIndices[i]);\\n scaledColumnIndex.push(scaledX);\\n columnPositions.push(i);\\n prev = xIndex;\\n }\\n }\\n this.scaledColumnIndices = Float64Array.from(scaledColumnIndex);\\n this.columnIndicesPositions = Int32Array.from(columnPositions);\\n }\\n setRowIndices(rowIndices) {\\n this.scaledRowIndices = new Float64Array(rowIndices.length);\\n for (let i = 0; i < rowIndices.length; i++) {\\n this.scaledRowIndices[i] = this.calculateVerticalScaledIndices(rowIndices[i]);\\n }\\n }\\n setRenderConfig(renderConfig) {\\n this.renderConfig = renderConfig;\\n }\\n setTransformConfig(transformData) {\\n this.transformConfig = transformData;\\n }\\n setCanvas(canvas) {\\n this.canvas = canvas;\\n this.context = canvas.getContext('2d');\\n }\\n scaleCanvas() {\\n this.context.translate(this.transformConfig.transform.x, this.transformConfig.transform.y);\\n this.context.scale(this.transformConfig.transform.k, this.transformConfig.transform.k);\\n }\\n setCanvasDimensions(data) {\\n this.canvas.width = data.width;\\n this.canvas.height = data.height;\\n }\\n getCanvasDimensions() {\\n return {\\n width: this.canvas.width,\\n height: this.canvas.height\\n };\\n }\\n clearCanvas() {\\n this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);\\n }\\n drawWafer() {\\n this.context.restore();\\n this.context.save();\\n this.clearCanvas();\\n this.scaleCanvas();\\n for (let i = 0; i < this.scaledColumnIndices.length; i++) {\\n const scaledX = this.scaledColumnIndices[i];\\n if (!(scaledX >= this.transformConfig.topLeftCanvasCorner.x\\n && scaledX < this.transformConfig.bottomRightCanvasCorner.x)) {\\n continue;\\n }\\n // columnIndexPositions is used to get chunks to determine the start and end index of the column, it looks something like [0, 1, 4, 9, 12]\\n // This means that the first column has a start index of 0 and an end index of 1, the second column has a start index of 1 and an end index of 4, and so on\\n // scaledRowIndices is used when we reach the end of the columnIndexPositions, when columnIndexPositions is [0, 1, 4, 9, 12], scaledRowIndices is 13\\n const columnEndIndex = this.columnIndicesPositions[i + 1] !== undefined\\n ? this.columnIndicesPositions[i + 1]\\n : this.scaledRowIndices.length;\\n for (let columnStartIndex = this.columnIndicesPositions[i]; columnStartIndex < columnEndIndex; columnStartIndex++) {\\n const scaledY = this.scaledRowIndices[columnStartIndex];\\n if (!(scaledY >= this.transformConfig.topLeftCanvasCorner.y\\n && scaledY < this.transformConfig.bottomRightCanvasCorner.y)) {\\n continue;\\n }\\n // Fill style is temporary green for all dies, will be replaced with a color based on the value of the die in a future implementation\\n this.context.fillStyle = 'Green';\\n this.context.fillRect(scaledX, scaledY, this.renderConfig.dieDimensions.width, this.renderConfig.dieDimensions.height);\\n }\\n }\\n }\\n }\\n expose(MatrixRenderer);\\n\\n exports.MatrixRenderer = MatrixRenderer;\\n\\n return exports;\\n\\n})({});\\n\";\n"]}
@@ -0,0 +1,39 @@
1
+ export interface Transform {
2
+ k: number;
3
+ x: number;
4
+ y: number;
5
+ }
6
+ export interface Dimensions {
7
+ width: number;
8
+ height: number;
9
+ }
10
+ export interface Position {
11
+ x: number;
12
+ y: number;
13
+ }
14
+ export interface Margin {
15
+ readonly top: number;
16
+ readonly right: number;
17
+ readonly bottom: number;
18
+ readonly left: number;
19
+ }
20
+ export interface IColorScaleMarker {
21
+ color: string;
22
+ value: number;
23
+ }
24
+ export type ColorScale = IColorScaleMarker[];
25
+ export interface RenderConfig {
26
+ dieDimensions: Dimensions;
27
+ margin: Margin;
28
+ verticalCoefficient: number;
29
+ horizontalCoefficient: number;
30
+ horizontalConstant: number;
31
+ verticalConstant: number;
32
+ labelsFontSize: number;
33
+ colorScale: ColorScale;
34
+ }
35
+ export interface TransformConfig {
36
+ transform: Transform;
37
+ topLeftCanvasCorner: Position;
38
+ bottomRightCanvasCorner: Position;
39
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/wafer-map/workers/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface Transform {\n k: number;\n x: number;\n y: number;\n}\nexport interface Dimensions {\n width: number;\n height: number;\n}\nexport interface Position {\n x: number;\n y: number;\n}\nexport interface Margin {\n readonly top: number;\n readonly right: number;\n readonly bottom: number;\n readonly left: number;\n}\nexport interface IColorScaleMarker {\n color: string;\n value: number;\n}\nexport type ColorScale = IColorScaleMarker[];\nexport interface RenderConfig {\n dieDimensions: Dimensions;\n margin: Margin;\n verticalCoefficient: number;\n horizontalCoefficient: number;\n horizontalConstant: number;\n verticalConstant: number;\n labelsFontSize: number;\n colorScale: ColorScale;\n}\nexport interface TransformConfig {\n transform: Transform;\n topLeftCanvasCorner: Position;\n bottomRightCanvasCorner: Position;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ni/nimble-components",
3
- "version": "29.1.7",
3
+ "version": "29.1.8",
4
4
  "description": "Styled web components for the NI Nimble Design System",
5
5
  "scripts": {
6
6
  "build": "npm run generate-icons && npm run generate-workers && npm run build-components && npm run bundle-components && npm run generate-scss",
@@ -1 +0,0 @@
1
- {"version":3,"file":"computations.js","sourceRoot":"","sources":["../../../../../src/wafer-map/modules/experimental/computations.ts"],"names":[],"mappings":"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","sourcesContent":["import { scaleLinear, ScaleLinear } from 'd3-scale';\nimport type { WaferMap } from '../..';\nimport { Dimensions, Margin, WaferMapOriginLocation } from '../../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 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 horizontalScale(): ScaleLinear<number, number> {\n return this._horizontalScale;\n }\n\n public get verticalScale(): ScaleLinear<number, number> {\n return this._verticalScale;\n }\n\n private _containerDimensions!: Dimensions;\n private _dieDimensions!: Dimensions;\n private _margin!: Margin;\n private _horizontalScale!: ScaleLinear<number, number>;\n private _verticalScale!: ScaleLinear<number, number>;\n private readonly defaultPadding = 0;\n private readonly baseMarginPercentage = 0.04;\n\n public constructor(private readonly wafermap: WaferMap) {}\n\n public update(): 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 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._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 }\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"]}
@@ -1,21 +0,0 @@
1
- import type { ScaleLinear } from 'd3-scale';
2
- import type { WaferMap } from '../..';
3
- import type { ColorScale, Dimensions, Margin } from '../../types';
4
- /**
5
- * Data Manager uses Computations and Prerendering modules in order and exposes the results
6
- */
7
- export declare class DataManager {
8
- private readonly wafermap;
9
- get containerDimensions(): Dimensions;
10
- get dieDimensions(): Dimensions;
11
- get margin(): Margin;
12
- get horizontalScale(): ScaleLinear<number, number>;
13
- get verticalScale(): ScaleLinear<number, number>;
14
- get labelsFontSize(): number;
15
- get colorScale(): ColorScale;
16
- private readonly computations;
17
- private readonly prerendering;
18
- constructor(wafermap: WaferMap);
19
- updateComputations(): void;
20
- updatePrerendering(): void;
21
- }
@@ -1,41 +0,0 @@
1
- import { Computations } from './computations';
2
- import { Prerendering } from './prerendering';
3
- /**
4
- * Data Manager uses Computations and Prerendering modules in order and exposes the results
5
- */
6
- export class DataManager {
7
- get containerDimensions() {
8
- return this.computations.containerDimensions;
9
- }
10
- get dieDimensions() {
11
- return this.computations.dieDimensions;
12
- }
13
- get margin() {
14
- return this.computations.margin;
15
- }
16
- get horizontalScale() {
17
- return this.computations.horizontalScale;
18
- }
19
- get verticalScale() {
20
- return this.computations.verticalScale;
21
- }
22
- get labelsFontSize() {
23
- return this.prerendering.labelsFontSize;
24
- }
25
- get colorScale() {
26
- return this.prerendering.colorScale;
27
- }
28
- constructor(wafermap) {
29
- this.wafermap = wafermap;
30
- this.computations = new Computations(wafermap);
31
- this.prerendering = new Prerendering(wafermap);
32
- }
33
- updateComputations() {
34
- this.computations.update();
35
- this.prerendering.update();
36
- }
37
- updatePrerendering() {
38
- this.prerendering.update();
39
- }
40
- }
41
- //# sourceMappingURL=data-manager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"data-manager.js","sourceRoot":"","sources":["../../../../../src/wafer-map/modules/experimental/data-manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAI9C;;GAEG;AACH,MAAM,OAAO,WAAW;IACpB,IAAW,mBAAmB;QAC1B,OAAO,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC;IACjD,CAAC;IAED,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC;IAC3C,CAAC;IAED,IAAW,MAAM;QACb,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;IACpC,CAAC;IAED,IAAW,eAAe;QACtB,OAAO,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC;IAC7C,CAAC;IAED,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC;IAC3C,CAAC;IAED,IAAW,cAAc;QACrB,OAAO,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC;IAC5C,CAAC;IAED,IAAW,UAAU;QACjB,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC;IACxC,CAAC;IAKD,YAAoC,QAAkB;QAAlB,aAAQ,GAAR,QAAQ,CAAU;QAClD,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC;IAEM,kBAAkB;QACrB,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;IAC/B,CAAC;IAEM,kBAAkB;QACrB,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;IAC/B,CAAC;CACJ","sourcesContent":["import type { ScaleLinear } from 'd3-scale';\nimport { Computations } from './computations';\nimport { Prerendering } from './prerendering';\nimport type { WaferMap } from '../..';\nimport type { ColorScale, Dimensions, Margin } from '../../types';\n\n/**\n * Data Manager uses Computations and Prerendering modules in order and exposes the results\n */\nexport class DataManager {\n public get containerDimensions(): Dimensions {\n return this.computations.containerDimensions;\n }\n\n public get dieDimensions(): Dimensions {\n return this.computations.dieDimensions;\n }\n\n public get margin(): Margin {\n return this.computations.margin;\n }\n\n public get horizontalScale(): ScaleLinear<number, number> {\n return this.computations.horizontalScale;\n }\n\n public get verticalScale(): ScaleLinear<number, number> {\n return this.computations.verticalScale;\n }\n\n public get labelsFontSize(): number {\n return this.prerendering.labelsFontSize;\n }\n\n public get colorScale(): ColorScale {\n return this.prerendering.colorScale;\n }\n\n private readonly computations: Computations;\n private readonly prerendering: Prerendering;\n\n public constructor(private readonly wafermap: WaferMap) {\n this.computations = new Computations(wafermap);\n this.prerendering = new Prerendering(wafermap);\n }\n\n public updateComputations(): void {\n this.computations.update();\n this.prerendering.update();\n }\n\n public updatePrerendering(): void {\n this.prerendering.update();\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"hover-handler.js","sourceRoot":"","sources":["../../../../../src/wafer-map/modules/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.experimentalDataManager.horizontalScale.invert(\n mousePosition.x\n - this.wafermap.experimentalDataManager.margin.left\n )\n );\n const y = yRoundFunction(\n this.wafermap.experimentalDataManager.verticalScale.invert(\n mousePosition.y\n - this.wafermap.experimentalDataManager.margin.top\n )\n );\n return { x, y };\n }\n return undefined;\n }\n}\n"]}
@@ -1,18 +0,0 @@
1
- import type { ColorScale } from '../../types';
2
- import type { WaferMap } from '../..';
3
- /**
4
- * Prerendering prepares render-ready dies data to be used by the rendering module
5
- */
6
- export declare class Prerendering {
7
- private readonly wafermap;
8
- get labelsFontSize(): number;
9
- get colorScale(): ColorScale;
10
- private _colorScale;
11
- private _labelsFontSize;
12
- private readonly fontSizeFactor;
13
- private readonly colorScaleResolution;
14
- constructor(wafermap: WaferMap);
15
- update(): void;
16
- private calculateColorScale;
17
- private calculateLabelsFontSize;
18
- }
@@ -1,63 +0,0 @@
1
- import { scaleLinear } from 'd3-scale';
2
- import { ticks } from 'd3-array';
3
- import { WaferMapColorScaleMode } from '../../types';
4
- /**
5
- * Prerendering prepares render-ready dies data to be used by the rendering module
6
- */
7
- export class Prerendering {
8
- get labelsFontSize() {
9
- return this._labelsFontSize;
10
- }
11
- get colorScale() {
12
- return this._colorScale;
13
- }
14
- constructor(wafermap) {
15
- this.wafermap = wafermap;
16
- this.fontSizeFactor = 0.8;
17
- this.colorScaleResolution = 10;
18
- }
19
- update() {
20
- this._labelsFontSize = this.calculateLabelsFontSize(this.wafermap.experimentalDataManager.dieDimensions, this.wafermap.maxCharacters);
21
- this._colorScale = this.calculateColorScale();
22
- }
23
- calculateColorScale() {
24
- if (this.wafermap.colorScaleMode === WaferMapColorScaleMode.linear) {
25
- const values = this.wafermap.colorScale.values.map(item => +item);
26
- const d3ColorScale = scaleLinear()
27
- .domain(values)
28
- .range(this.wafermap.colorScale.colors);
29
- let min = values[0];
30
- let max = values[0];
31
- values.forEach(value => {
32
- if (value < min) {
33
- min = value;
34
- }
35
- if (value > max) {
36
- max = value;
37
- }
38
- });
39
- // the linear color scale will not be infinite but will be limited by the color scale resolution
40
- const valueSamples = ticks(min, max, values.length * this.colorScaleResolution);
41
- return valueSamples.map(value => {
42
- return {
43
- color: d3ColorScale(value),
44
- value
45
- };
46
- });
47
- }
48
- // ordinal color categories have to be sorted by value
49
- return this.wafermap.colorScale.colors
50
- .map((color, index) => {
51
- return {
52
- color,
53
- value: +this.wafermap.colorScale.values[index]
54
- };
55
- })
56
- .sort((a, b) => a.value - b.value);
57
- }
58
- calculateLabelsFontSize(dieDimensions, maxCharacters) {
59
- return Math.min(dieDimensions.height, (dieDimensions.width / (Math.max(2, maxCharacters) * 0.5))
60
- * this.fontSizeFactor);
61
- }
62
- }
63
- //# sourceMappingURL=prerendering.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"prerendering.js","sourceRoot":"","sources":["../../../../../src/wafer-map/modules/experimental/prerendering.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAIrD;;GAEG;AACH,MAAM,OAAO,YAAY;IACrB,IAAW,cAAc;QACrB,OAAO,IAAI,CAAC,eAAe,CAAC;IAChC,CAAC;IAED,IAAW,UAAU;QACjB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IASD,YAAoC,QAAkB;QAAlB,aAAQ,GAAR,QAAQ,CAAU;QAHrC,mBAAc,GAAG,GAAG,CAAC;QACrB,yBAAoB,GAAG,EAAE,CAAC;IAEc,CAAC;IAEnD,MAAM;QACT,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,uBAAuB,CAC/C,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,aAAa,EACnD,IAAI,CAAC,QAAQ,CAAC,aAAa,CAC9B,CAAC;QACF,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAClD,CAAC;IAEO,mBAAmB;QACvB,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,KAAK,sBAAsB,CAAC,MAAM,EAAE;YAChE,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YAClE,MAAM,YAAY,GAAG,WAAW,EAAkB;iBAC7C,MAAM,CAAC,MAAM,CAAC;iBACd,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAC5C,IAAI,GAAG,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;YACrB,IAAI,GAAG,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;YACrB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;gBACnB,IAAI,KAAK,GAAG,GAAG,EAAE;oBACb,GAAG,GAAG,KAAK,CAAC;iBACf;gBACD,IAAI,KAAK,GAAG,GAAG,EAAE;oBACb,GAAG,GAAG,KAAK,CAAC;iBACf;YACL,CAAC,CAAC,CAAC;YACH,gGAAgG;YAChG,MAAM,YAAY,GAAG,KAAK,CACtB,GAAG,EACH,GAAG,EACH,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAC5C,CAAC;YACF,OAAO,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;gBAC5B,OAAO;oBACH,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC;oBAC1B,KAAK;iBACR,CAAC;YACN,CAAC,CAAC,CAAC;SACN;QACD,sDAAsD;QACtD,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM;aACjC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YAClB,OAAO;gBACH,KAAK;gBACL,KAAK,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAE;aAClD,CAAC;QACN,CAAC,CAAC;aACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IAEO,uBAAuB,CAC3B,aAAyB,EACzB,aAAqB;QAErB,OAAO,IAAI,CAAC,GAAG,CACX,aAAa,CAAC,MAAM,EACpB,CAAC,aAAa,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC;cACpD,IAAI,CAAC,cAAc,CAC5B,CAAC;IACN,CAAC;CACJ","sourcesContent":["import { scaleLinear } from 'd3-scale';\nimport { ticks } from 'd3-array';\nimport { WaferMapColorScaleMode } from '../../types';\nimport type { ColorScale, Dimensions } from '../../types';\nimport type { WaferMap } from '../..';\n\n/**\n * Prerendering prepares render-ready dies data to be used by the rendering module\n */\nexport class Prerendering {\n public get labelsFontSize(): number {\n return this._labelsFontSize;\n }\n\n public get colorScale(): ColorScale {\n return this._colorScale;\n }\n\n private _colorScale!: ColorScale;\n\n private _labelsFontSize!: number;\n\n private readonly fontSizeFactor = 0.8;\n private readonly colorScaleResolution = 10;\n\n public constructor(private readonly wafermap: WaferMap) {}\n\n public update(): void {\n this._labelsFontSize = this.calculateLabelsFontSize(\n this.wafermap.experimentalDataManager.dieDimensions,\n this.wafermap.maxCharacters\n );\n this._colorScale = this.calculateColorScale();\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,13 +0,0 @@
1
- import type { WaferMap } from '../..';
2
- /**
3
- * Responsible for drawing the dies inside the wafer map, adding dieText and scaling the canvas
4
- */
5
- export declare class WorkerRenderer {
6
- private readonly wafermap;
7
- private matrixRenderer;
8
- constructor(wafermap: WaferMap);
9
- setupWafer(): Promise<void>;
10
- drawWafer(): Promise<void>;
11
- renderHover(): void;
12
- private calculateHoverTransform;
13
- }
@@ -1,96 +0,0 @@
1
- import { transfer } from 'comlink';
2
- import { HoverDieOpacity } from '../../types';
3
- import { createMatrixRenderer } from '../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() {
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({
19
- width: this.wafermap.canvasWidth ?? 0,
20
- height: this.wafermap.canvasHeight ?? 0
21
- });
22
- await this.matrixRenderer.setDiesDimensions(this.wafermap.experimentalDataManager.dieDimensions);
23
- const scaleX = this.wafermap.experimentalDataManager.horizontalScale(1)
24
- - this.wafermap.experimentalDataManager.horizontalScale(0);
25
- const scaleY = this.wafermap.experimentalDataManager.verticalScale(1)
26
- - this.wafermap.experimentalDataManager.verticalScale(0);
27
- await this.matrixRenderer.setScaling(scaleX, scaleY);
28
- await this.matrixRenderer.setBases(this.wafermap.experimentalDataManager.horizontalScale(0), this.wafermap.experimentalDataManager.verticalScale(0));
29
- await this.matrixRenderer.setMargin(this.wafermap.experimentalDataManager.margin);
30
- if (this.wafermap.diesTable === undefined) {
31
- await this.matrixRenderer.setColumnIndexes(Int32Array.from([]));
32
- await this.matrixRenderer.setRowIndexes(Int32Array.from([]));
33
- return;
34
- }
35
- const columnIndexes = this.wafermap.diesTable
36
- .getChild('colIndex')
37
- .toArray();
38
- await this.matrixRenderer.setColumnIndexes(columnIndexes);
39
- const rowIndexes = this.wafermap.diesTable
40
- .getChild('rowIndex')
41
- .toArray();
42
- await this.matrixRenderer.setRowIndexes(rowIndexes);
43
- }
44
- async drawWafer() {
45
- await this.matrixRenderer.setTransform(this.wafermap.transform);
46
- const topLeftCanvasCorner = this.wafermap.transform.invert([0, 0]);
47
- const bottomRightCanvasCorner = this.wafermap.transform.invert([
48
- this.wafermap.canvasWidth,
49
- this.wafermap.canvasHeight
50
- ]);
51
- await this.matrixRenderer.setCanvasCorners({
52
- x: topLeftCanvasCorner[0]
53
- - this.wafermap.experimentalDataManager.dieDimensions.width,
54
- y: topLeftCanvasCorner[1]
55
- - this.wafermap.experimentalDataManager.dieDimensions.height
56
- }, {
57
- x: bottomRightCanvasCorner[0],
58
- y: bottomRightCanvasCorner[1]
59
- });
60
- await this.matrixRenderer.drawWafer();
61
- this.renderHover();
62
- }
63
- renderHover() {
64
- if (this.wafermap.experimentalDataManager.dieDimensions === undefined
65
- || this.wafermap.transform === undefined) {
66
- return;
67
- }
68
- this.wafermap.hoverWidth = this.wafermap.experimentalDataManager.dieDimensions.width
69
- * this.wafermap.transform.k;
70
- this.wafermap.hoverHeight = this.wafermap.experimentalDataManager.dieDimensions.height
71
- * this.wafermap.transform.k;
72
- this.wafermap.hoverOpacity = this.wafermap.hoverDie === undefined
73
- ? HoverDieOpacity.hide
74
- : HoverDieOpacity.show;
75
- this.wafermap.hoverTransform = this.calculateHoverTransform();
76
- }
77
- calculateHoverTransform() {
78
- if (this.wafermap.hoverDie !== undefined) {
79
- const scaledX = this.wafermap.experimentalDataManager.horizontalScale(this.wafermap.hoverDie.x);
80
- if (scaledX === undefined) {
81
- return '';
82
- }
83
- const scaledY = this.wafermap.experimentalDataManager.verticalScale(this.wafermap.hoverDie.y);
84
- if (scaledY === undefined) {
85
- return '';
86
- }
87
- const transformedPoint = this.wafermap.transform.apply([
88
- scaledX + this.wafermap.experimentalDataManager.margin.left,
89
- scaledY + this.wafermap.experimentalDataManager.margin.top
90
- ]);
91
- return `translate(${transformedPoint[0]}, ${transformedPoint[1]})`;
92
- }
93
- return '';
94
- }
95
- }
96
- //# sourceMappingURL=worker-renderer.js.map