From 3497aef8189c43d1f007fd64b2109c8dd54bd517 Mon Sep 17 00:00:00 2001 From: Danila Poyarkov Date: Thu, 20 Aug 2026 08:47:33 +0300 Subject: [PATCH] refactor(canvas): normalize guide domain naming --- .../src/canvas/guides/{render.ts => draw.ts} | 0 packages/core/src/canvas/guides/geometry.ts | 47 ----------------- packages/core/src/canvas/guides/hit-test.ts | 51 +++++++++++++++++++ packages/core/src/canvas/index.ts | 3 +- .../core/src/canvas/renderer/overlay-pass.ts | 2 +- .../draw.test.ts} | 4 +- .../render/canvas/guides/geometry.test.ts | 7 +-- 7 files changed, 57 insertions(+), 57 deletions(-) rename packages/core/src/canvas/guides/{render.ts => draw.ts} (100%) create mode 100644 packages/core/src/canvas/guides/hit-test.ts rename tests/engine/render/canvas/{page-guides.test.ts => guides/draw.test.ts} (97%) diff --git a/packages/core/src/canvas/guides/render.ts b/packages/core/src/canvas/guides/draw.ts similarity index 100% rename from packages/core/src/canvas/guides/render.ts rename to packages/core/src/canvas/guides/draw.ts diff --git a/packages/core/src/canvas/guides/geometry.ts b/packages/core/src/canvas/guides/geometry.ts index 4341580cb..9e5d61cd6 100644 --- a/packages/core/src/canvas/guides/geometry.ts +++ b/packages/core/src/canvas/guides/geometry.ts @@ -18,14 +18,6 @@ export interface GuideScreenSegment { y2: number } -export interface GuideHit { - ownerId: string - guideId: string - axis: CanvasGuide['axis'] - position: number - distance: number -} - export function getGuideScreenSegment( graph: SceneGraph, owner: SceneNode, @@ -70,42 +62,3 @@ export function distanceToGuideSegment(x: number, y: number, segment: GuideScree : Math.max(0, Math.min(1, ((x - segment.x1) * dx + (y - segment.y1) * dy) / lengthSquared)) return Math.hypot(x - (segment.x1 + t * dx), y - (segment.y1 + t * dy)) } - -export function hitTestGuides( - graph: SceneGraph, - pageId: string, - viewport: GuideViewport, - x: number, - y: number, - tolerance = 5 -): GuideHit | null { - const page = graph.getNode(pageId) - if (!page) return null - let closest: GuideHit | null = null - - const visit = (owner: SceneNode) => { - for (const guide of owner.guides) { - const distance = distanceToGuideSegment( - x, - y, - getGuideScreenSegment(graph, owner, guide, viewport) - ) - if (distance <= tolerance && (!closest || distance < closest.distance)) { - closest = { - ownerId: owner.id, - guideId: guide.id, - axis: guide.axis, - position: guide.position, - distance - } - } - } - for (const childId of owner.childIds) { - const child = graph.getNode(childId) - if (child) visit(child) - } - } - - visit(page) - return closest -} diff --git a/packages/core/src/canvas/guides/hit-test.ts b/packages/core/src/canvas/guides/hit-test.ts new file mode 100644 index 000000000..7fa63c2be --- /dev/null +++ b/packages/core/src/canvas/guides/hit-test.ts @@ -0,0 +1,51 @@ +import type { SceneGraph, SceneNode } from '@open-pencil/scene-graph' +import type { CanvasGuide } from '@open-pencil/scene-graph/guides' + +import { distanceToGuideSegment, getGuideScreenSegment, type GuideViewport } from './geometry' + +export interface GuideHit { + ownerId: string + guideId: string + axis: CanvasGuide['axis'] + position: number + distance: number +} + +export function hitTestGuides( + graph: SceneGraph, + pageId: string, + viewport: GuideViewport, + x: number, + y: number, + tolerance = 5 +): GuideHit | null { + const page = graph.getNode(pageId) + if (!page) return null + let closest: GuideHit | null = null + + const visit = (owner: SceneNode) => { + for (const guide of owner.guides) { + const distance = distanceToGuideSegment( + x, + y, + getGuideScreenSegment(graph, owner, guide, viewport) + ) + if (distance <= tolerance && (!closest || distance < closest.distance)) { + closest = { + ownerId: owner.id, + guideId: guide.id, + axis: guide.axis, + position: guide.position, + distance + } + } + } + for (const childId of owner.childIds) { + const child = graph.getNode(childId) + if (child) visit(child) + } + } + + visit(page) + return closest +} diff --git a/packages/core/src/canvas/index.ts b/packages/core/src/canvas/index.ts index 90d8dd09e..4d474768a 100644 --- a/packages/core/src/canvas/index.ts +++ b/packages/core/src/canvas/index.ts @@ -7,10 +7,9 @@ export { export { distanceToGuideSegment, getGuideScreenSegment, - hitTestGuides, - type GuideHit, type GuideScreenSegment, type GuideViewport } from './guides/geometry' +export { hitTestGuides, type GuideHit } from './guides/hit-test' export type { GuideOverlayState, GuidePreview, GuideSelection } from './guides/types' export { SkiaRenderer, type RenderOverlays, type RulerTheme } from './renderer' diff --git a/packages/core/src/canvas/renderer/overlay-pass.ts b/packages/core/src/canvas/renderer/overlay-pass.ts index 4ffb573e6..063153259 100644 --- a/packages/core/src/canvas/renderer/overlay-pass.ts +++ b/packages/core/src/canvas/renderer/overlay-pass.ts @@ -2,7 +2,7 @@ import type { Canvas } from 'canvaskit-wasm' import type { SceneGraph } from '@open-pencil/scene-graph' -import { drawGuides } from '#core/canvas/guides/render' +import { drawGuides } from '#core/canvas/guides/draw' import type { RenderOverlays, SkiaRenderer } from '#core/canvas/renderer' function measurementVisible(overlays: RenderOverlays): boolean { diff --git a/tests/engine/render/canvas/page-guides.test.ts b/tests/engine/render/canvas/guides/draw.test.ts similarity index 97% rename from tests/engine/render/canvas/page-guides.test.ts rename to tests/engine/render/canvas/guides/draw.test.ts index 5e9fb5311..0e99d608c 100644 --- a/tests/engine/render/canvas/page-guides.test.ts +++ b/tests/engine/render/canvas/guides/draw.test.ts @@ -5,9 +5,9 @@ import type { Canvas } from 'canvaskit-wasm' import { SceneGraph } from '@open-pencil/scene-graph' import type { SceneNode } from '@open-pencil/scene-graph' -import { drawGuides } from '#core/canvas/guides/render' +import { drawGuides } from '#core/canvas/guides/draw' -import { createMockCanvas, createMockRenderer, mockCalls } from './effects/helpers' +import { createMockCanvas, createMockRenderer, mockCalls } from '../effects/helpers' function graphWithGuides(guides: SceneNode['guides']): SceneGraph { const page = { diff --git a/tests/engine/render/canvas/guides/geometry.test.ts b/tests/engine/render/canvas/guides/geometry.test.ts index 9b27a91c3..c9d0bd283 100644 --- a/tests/engine/render/canvas/guides/geometry.test.ts +++ b/tests/engine/render/canvas/guides/geometry.test.ts @@ -3,11 +3,8 @@ import { describe, expect, test } from 'bun:test' import { SceneGraph } from '@open-pencil/scene-graph' import type { SceneNode } from '@open-pencil/scene-graph' -import { - distanceToGuideSegment, - getGuideScreenSegment, - hitTestGuides -} from '#core/canvas/guides/geometry' +import { distanceToGuideSegment, getGuideScreenSegment } from '#core/canvas/guides/geometry' +import { hitTestGuides } from '#core/canvas/guides/hit-test' function pageWithGuide(): { graph: SceneGraph; page: SceneNode } { const page = {