diff --git a/package-lock.json b/package-lock.json index ece69ba9..0ee06ca1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,8 @@ "glsl-read-float": "^1.1.0", "lodash.merge": "^4.6.2", "rbush-3d": "^0.0.4", - "regl": "^2.1.0" + "regl": "^2.1.0", + "webgpu-utils": "^1.9.3" }, "devDependencies": { "@playwright/test": "^1.46.1", @@ -38,6 +39,7 @@ "@types/lodash.merge": "^4.6.9", "@typescript-eslint/eslint-plugin": "^7.0.2", "@typescript-eslint/parser": "^7.0.2", + "@webgpu/types": "^0.1.51", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-formatter-summary-chart": "^0.3.0", @@ -1672,6 +1674,13 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/@webgpu/types": { + "version": "0.1.51", + "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.51.tgz", + "integrity": "sha512-ktR3u64NPjwIViNCck+z9QeyN0iPkQCUOQ07ZCV1RzlkfP+olLTeEZ95O1QHS+v4w9vJeY9xj/uJuSphsHy5rQ==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/acorn": { "version": "7.4.1", "dev": true, @@ -7094,6 +7103,12 @@ } } }, + "node_modules/webgpu-utils": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/webgpu-utils/-/webgpu-utils-1.9.3.tgz", + "integrity": "sha512-b9QqW9Gc15ifpmn2zT/axIWjjVqX5WCpdnT19HQu5KZi22PApSwzjoaijLfzg3zYFw3wSDDUXMDT6lpCE/H9kw==", + "license": "MIT" + }, "node_modules/which": { "version": "2.0.2", "dev": true, @@ -8281,6 +8296,12 @@ "tinyrainbow": "^1.2.0" } }, + "@webgpu/types": { + "version": "0.1.51", + "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.51.tgz", + "integrity": "sha512-ktR3u64NPjwIViNCck+z9QeyN0iPkQCUOQ07ZCV1RzlkfP+olLTeEZ95O1QHS+v4w9vJeY9xj/uJuSphsHy5rQ==", + "dev": true + }, "acorn": { "version": "7.4.1", "dev": true @@ -12063,6 +12084,11 @@ "why-is-node-running": "^2.3.0" } }, + "webgpu-utils": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/webgpu-utils/-/webgpu-utils-1.9.3.tgz", + "integrity": "sha512-b9QqW9Gc15ifpmn2zT/axIWjjVqX5WCpdnT19HQu5KZi22PApSwzjoaijLfzg3zYFw3wSDDUXMDT6lpCE/H9kw==" + }, "which": { "version": "2.0.2", "dev": true, diff --git a/package.json b/package.json index 7483ccb6..93fa95c1 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,8 @@ "glsl-read-float": "^1.1.0", "lodash.merge": "^4.6.2", "rbush-3d": "^0.0.4", - "regl": "^2.1.0" + "regl": "^2.1.0", + "webgpu-utils": "^1.9.3" }, "devDependencies": { "@playwright/test": "^1.46.1", @@ -78,6 +79,7 @@ "@types/lodash.merge": "^4.6.9", "@typescript-eslint/eslint-plugin": "^7.0.2", "@typescript-eslint/parser": "^7.0.2", + "@webgpu/types": "^0.1.51", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-formatter-summary-chart": "^0.3.0", diff --git a/src/interaction.ts b/src/interaction.ts index a2231f4a..63e5a459 100644 --- a/src/interaction.ts +++ b/src/interaction.ts @@ -172,7 +172,7 @@ export class Zoom { if (event.sourceEvent) { (event.sourceEvent as Event).stopPropagation(); } - }); + }) canvas.call(zoomer); diff --git a/src/label_rendering.ts b/src/label_rendering.ts index 8d8feed1..2519e9f1 100644 --- a/src/label_rendering.ts +++ b/src/label_rendering.ts @@ -32,6 +32,7 @@ export class LabelMaker extends Renderer { public label_key?: string; public labelgroup: SVGGElement; private hovered: undefined | string; + private font: string = 'verdana'; public options: DS.LabelOptions = {}; /** * @@ -46,6 +47,11 @@ export class LabelMaker extends Renderer { ) { super(scatterplot.div!.node() as HTMLDivElement, scatterplot); this.options = options; + if (options.font) { + this.font = options.font; + // else verdana + } + this.canvas = scatterplot .elements![2].selectAll('canvas') .node() as HTMLCanvasElement; @@ -74,6 +80,7 @@ export class LabelMaker extends Renderer { 0.5, [0.5, 1e6], options.margin === undefined ? 30 : options.margin, + this.font ); /* this.tree.accessor = (x, y) => { @@ -264,7 +271,7 @@ export class LabelMaker extends Renderer { if (this.hovered === '' + d.minZ + d.minX) { emphasize += 2; } - context.font = `${datum.height * size_adjust + emphasize}pt verdana`; + context.font = `${datum.height * size_adjust + emphasize}pt ${this.font}`; context.shadowBlur = 12 + emphasize * 3; context.lineWidth = 3 + emphasize; @@ -380,13 +387,13 @@ function getContext(): CanvasRenderingContext2D { return context; } -function measure_text(d: RawPoint, pixel_ratio: number, margin: number) { +function measure_text(d: RawPoint, pixel_ratio: number, margin: number, font: string) { // Uses a global context that it calls into existence for measuring; // using the deepscatter // canvas gets too confused with state information. const context = getContext(); // Called for the side-effect of setting `d.aspect_ratio` on the passed item. - context.font = `${d.height}pt verdana`; + context.font = `${d.height}pt ${font}`; if (d.text === '') { return null; } @@ -427,6 +434,7 @@ class DepthTree extends RBush3D { public pixel_ratio: number; public rectangle_buffer: number; public margin: number; + public font: string; // public insertion_log = []; private _accessor: (p: Point) => [number, number] = (p) => [p.x, p.y]; @@ -440,12 +448,14 @@ class DepthTree extends RBush3D { scale_factor = 0.5, zoom = [0.1, 1000], margin = 10, // in screen pixels + font = 'verdana', ) { // scale factor used to determine how quickly points scale. // Not implemented. // size = exp(log(k) * scale_factor); super(); + this.font = font; this.scale_factor = scale_factor; this.mindepth = zoom[0]; this.maxdepth = zoom[1]; @@ -520,7 +530,7 @@ class DepthTree extends RBush3D { if (point['pixel_width'] === undefined) { measured = { ...point, - ...measure_text(point, this.pixel_ratio, this.margin), + ...measure_text(point, this.pixel_ratio, this.margin, this.font), }; } else { measured = point as Point; diff --git a/src/types.ts b/src/types.ts index abaa2bf4..55672859 100644 --- a/src/types.ts +++ b/src/types.ts @@ -516,6 +516,7 @@ export type LabelOptions = { useColorScale?: boolean; // Whether the colors of text should inherit from the active color scale. margin?: number; // The number of pixels around each box. Default 30. draggable_labels?: boolean; // Should labels be draggable in place? + font?: string // Font. Default verdana. }; export type Labelset = { diff --git a/tsconfig.json b/tsconfig.json index dd9df7b2..23043fe7 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -16,6 +16,7 @@ "outDir": "./dist", "rootDir": "./src", "lib": ["DOM"], + "types": ["@webgpu/types"], "noEmitOnError": true, "emitDeclarationOnly": true },