openpencil/tests/engine/render/canvas/labels/paragraph-cache.test.ts
Danila Poyarkov 35667d84b5
fix(canvas): edit section labels inline (#608)
* fix(canvas): edit section labels inline

- Vertically center shaped section titles using cached paragraph metrics\n- Add generalized canvas-label edit state and a reusable inline label control\n- Match dark and light label presentation while editing and commit renames with undo

* fix(canvas): align label contrast handling

Use shared WCAG contrast selection for rendered and edited canvas labels while retaining exact node-fill presentation in the editing overlay.

* fix(canvas): composite translucent label colors

Choose label foreground contrast after compositing translucent section fills against the active canvas background.
2026-08-30 22:24:08 +03:00

40 lines
1.4 KiB
TypeScript

import { beforeAll, describe, expect, test } from 'bun:test'
import { readFileSync } from 'node:fs'
import { initCanvasKit } from '#cli/headless'
import { LabelParagraphCache } from '#core/canvas/labels/paragraph-cache'
import { repoPath } from '#tests/helpers/paths'
let ck: Awaited<ReturnType<typeof initCanvasKit>>
beforeAll(async () => {
ck = await initCanvasKit()
})
describe('label paragraph cache', () => {
test('shapes labels with Inter and invalidates native paragraphs by font generation', () => {
const bytes = readFileSync(repoPath('public/Inter-Regular.ttf'))
const data = bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength)
const provider = ck.TypefaceFontProvider.Make()
provider.registerFont(data, 'Inter')
const cache = new LabelParagraphCache()
try {
const metrics = cache.measure(ck, provider, 'Primitives', 12, 200, ck.BLACK, 1)
expect(metrics.width).toBeGreaterThan(40)
expect(metrics.width).toBeLessThan(80)
expect(metrics.height).toBeGreaterThan(0)
expect(cache.size()).toBe(1)
cache.measure(ck, provider, 'Primitives', 12, 200, ck.BLACK, 1)
expect(cache.size()).toBe(1)
cache.measure(ck, provider, 'Primitives', 12, 200, ck.BLACK, 2)
expect(cache.size()).toBe(1)
} finally {
cache.clear()
provider.delete()
}
expect(cache.size()).toBe(0)
})
})