From c1532610db5ab3164a9eb856e4e03835035e8978 Mon Sep 17 00:00:00 2001 From: Danila Poyarkov Date: Tue, 26 May 2026 18:30:08 +0300 Subject: [PATCH] fix(canvas): tighten Figma text and pattern fidelity --- packages/core/src/canvas/fills.ts | 70 +++++++++++++----- packages/core/src/kiwi/fig/codec/index.ts | 1 + .../core/src/kiwi/fig/node-change/convert.ts | 11 ++- .../core/src/kiwi/fig/node-change/paint.ts | 1 + .../src/kiwi/fig/node-change/serialize.ts | 6 +- .../src/kiwi/fig/node-change/style-runs.ts | 30 +++++--- .../kiwi/fig/node-change/text-data-export.ts | 29 ++++++-- .../core/src/scene-graph/node-defaults.ts | 2 + .../core/src/scene-graph/source-metadata.ts | 2 + packages/core/src/scene-graph/types.ts | 5 ++ packages/docs/development/roadmap.md | 8 +- tests/e2e/canvas/renderer-visuals.spec.ts | 3 +- ...ls-from-source-nodes-openpencil-darwin.png | Bin 51733 -> 50904 bytes .../io/fig/export/paint-schema-fields.test.ts | 2 + .../engine/io/fig/import/mask-oracle.test.ts | 12 +++ .../io/fig/import/paint-schema-fields.test.ts | 2 + .../io/fig/import/rich-text-oracle.test.ts | 29 ++++++++ tests/engine/render/canvas/image-fill.test.ts | 45 ++++++++++- .../canvas/schema-fill-fallback.test.ts | 6 +- tests/fixtures/figma-oracles/masks.json | 24 +++++- .../figma-oracles/rich-text-decoration.json | 3 + 21 files changed, 244 insertions(+), 47 deletions(-) diff --git a/packages/core/src/canvas/fills.ts b/packages/core/src/canvas/fills.ts index 91c744160..da8d7865e 100644 --- a/packages/core/src/canvas/fills.ts +++ b/packages/core/src/canvas/fills.ts @@ -1,7 +1,7 @@ import type { Canvas, Paint } from 'canvaskit-wasm' import type { SceneNode, SceneGraph, Fill } from '#core/scene-graph' -import type { Rect } from '#core/types' +import type { Rect, Vector } from '#core/types' import type { SkiaRenderer } from './renderer' import { makeSmoothRRectPath, nodeHasSmoothCorners } from './shapes' @@ -99,27 +99,62 @@ export function applyFill( return false } -function patternTileRect(source: SceneNode, fill: Fill): Rect { - const spacing = fill.patternSpacing ?? { x: fill.spacing ?? 0, y: fill.spacing ?? 0 } - return { - x: 0, - y: 0, - width: source.width * (1 + spacing.x), - height: source.height * (1 + spacing.y) - } +interface PatternTileLayout { + rect: Rect + scale: number + positions: Vector[] } -function recordPatternSource(r: SkiaRenderer, source: SceneNode, graph: SceneGraph) { - const bounds = r.ck.LTRBRect(0, 0, source.width, source.height) +function patternAlignmentOffset(alignment: Fill['horizontalAlignment'], gap: number): number { + if (alignment === 'CENTER') return gap / 2 + if (alignment === 'END') return gap + return 0 +} + +export function patternTileLayout(source: SceneNode, fill: Fill): PatternTileLayout { + const scale = fill.scale && fill.scale > 0 ? fill.scale : 1 + const spacing = fill.patternSpacing ?? { x: 0, y: 0 } + const scaledWidth = source.width * scale + const scaledHeight = source.height * scale + const gapX = scaledWidth * spacing.x + const gapY = scaledHeight * spacing.y + const width = scaledWidth + gapX + const height = scaledHeight + gapY + const x = patternAlignmentOffset(fill.horizontalAlignment, gapX) + const y = patternAlignmentOffset(fill.verticalAlignment, gapY) + const positions = [{ x, y }] + + if (fill.patternTileType === 'HORIZONTAL_HEXAGONAL') { + positions.push({ x: x + width / 2, y: y + height / 2 }) + } else if (fill.patternTileType === 'VERTICAL_HEXAGONAL') { + positions.push({ x: x + width / 2, y: y - height / 2 }) + } + + return { rect: { x: 0, y: 0, width, height }, scale, positions } +} + +function recordPatternSource( + r: SkiaRenderer, + source: SceneNode, + graph: SceneGraph, + layout: PatternTileLayout +) { + const bounds = r.ck.LTRBRect(0, 0, layout.rect.width, layout.rect.height) const recorder = new r.ck.PictureRecorder() const canvas = recorder.beginRecording(bounds) const rect = r.ck.LTRBRect(0, 0, source.width, source.height) const hasRadius = nodeHasSmoothCorners(source) || source.cornerRadius > 0 - for (const sourceFill of source.fills.filter((item) => item.visible)) { - if (sourceFill.type === 'PATTERN' && sourceFill.sourceNodeId === source.id) continue - if (!applyFill(r, sourceFill, source, graph)) continue - drawNodeFill(r, canvas, source, rect, hasRadius, sourceFill) + for (const position of layout.positions) { + canvas.save() + canvas.translate(position.x, position.y) + canvas.scale(layout.scale, layout.scale) + for (const sourceFill of source.fills.filter((item) => item.visible)) { + if (sourceFill.type === 'PATTERN' && sourceFill.sourceNodeId === source.id) continue + if (!applyFill(r, sourceFill, source, graph)) continue + drawNodeFill(r, canvas, source, rect, hasRadius, sourceFill) + } + canvas.restore() } const picture = recorder.finishRecordingAsPicture() @@ -138,8 +173,9 @@ function applyPatternFill( const source = graph.getNode(sourceId) if (!source || source.width <= 0 || source.height <= 0) return false - const picture = recordPatternSource(r, source, graph) - const tile = patternTileRect(source, fill) + const layout = patternTileLayout(source, fill) + const picture = recordPatternSource(r, source, graph, layout) + const tile = layout.rect const tileRect = r.ck.LTRBRect(tile.x, tile.y, tile.x + tile.width, tile.y + tile.height) const shader = picture.makeShader( r.ck.TileMode.Repeat, diff --git a/packages/core/src/kiwi/fig/codec/index.ts b/packages/core/src/kiwi/fig/codec/index.ts index d72dcbf24..6b4a0113c 100644 --- a/packages/core/src/kiwi/fig/codec/index.ts +++ b/packages/core/src/kiwi/fig/codec/index.ts @@ -203,6 +203,7 @@ export interface Paint { image?: { hash: string | Uint8Array } imageScaleMode?: string sourceNodeId?: GUID + scale?: number spacing?: number patternSpacing?: Vector patternTileType?: string diff --git a/packages/core/src/kiwi/fig/node-change/convert.ts b/packages/core/src/kiwi/fig/node-change/convert.ts index 40a80a77d..02d8c7893 100644 --- a/packages/core/src/kiwi/fig/node-change/convert.ts +++ b/packages/core/src/kiwi/fig/node-change/convert.ts @@ -307,13 +307,20 @@ function convertTextDecorationProps( nc: NodeChange ): Pick< SceneNode, - 'textDecoration' | 'textDecorationStyle' | 'textDecorationThickness' | 'textDecorationFills' + | 'textDecoration' + | 'textDecorationStyle' + | 'textDecorationThickness' + | 'textDecorationFills' + | 'textDecorationSkipInk' + | 'textUnderlineOffset' > { return { textDecoration: mapTextDecoration(nc.textDecoration as string), textDecorationStyle: (nc.textDecorationStyle ?? 'SOLID') as SceneNode['textDecorationStyle'], textDecorationThickness: nc.textDecorationThickness?.value ?? null, - textDecorationFills: convertFills(nc.textDecorationFillPaints) + textDecorationFills: convertFills(nc.textDecorationFillPaints), + textDecorationSkipInk: nc.textDecorationSkipInk ?? true, + textUnderlineOffset: nc.textUnderlineOffset?.value ?? null } } diff --git a/packages/core/src/kiwi/fig/node-change/paint.ts b/packages/core/src/kiwi/fig/node-change/paint.ts index 14199032c..915ef5d72 100644 --- a/packages/core/src/kiwi/fig/node-change/paint.ts +++ b/packages/core/src/kiwi/fig/node-change/paint.ts @@ -79,6 +79,7 @@ function applyImagePaintFields(fill: Fill, p: Paint): void { function applySchemaPaintFields(fill: Fill, p: Paint): void { if (p.sourceNodeId) fill.sourceNodeId = guidToString(p.sourceNodeId) + if (p.scale) fill.scale = p.scale if (p.spacing) fill.spacing = p.spacing if (p.patternSpacing) fill.patternSpacing = p.patternSpacing if (p.patternTileType) fill.patternTileType = p.patternTileType as Fill['patternTileType'] diff --git a/packages/core/src/kiwi/fig/node-change/serialize.ts b/packages/core/src/kiwi/fig/node-change/serialize.ts index fb0816997..46d51dc2d 100644 --- a/packages/core/src/kiwi/fig/node-change/serialize.ts +++ b/packages/core/src/kiwi/fig/node-change/serialize.ts @@ -218,6 +218,7 @@ function fillToKiwiPaint(f: SceneNode['fills'][number]): Paint { if (f.imageScaleMode) paint.imageScaleMode = f.imageScaleMode if (f.imageTransform) paint.transform = f.imageTransform if (f.sourceNodeId) paint.sourceNodeId = stringToGuid(f.sourceNodeId) + if (f.scale) paint.scale = f.scale if (f.spacing) paint.spacing = f.spacing if (f.patternSpacing) paint.patternSpacing = f.patternSpacing if (f.patternTileType) paint.patternTileType = f.patternTileType @@ -302,7 +303,7 @@ function serializeTextProps( nc.textUserLayoutVersion = 4 nc.textExplicitLayoutVersion = 1 nc.textBidiVersion = 1 - nc.textDecorationSkipInk = true + nc.textDecorationSkipInk = node.textDecorationSkipInk nc.fontVariantCommonLigatures = true nc.fontVariantContextualLigatures = true applyFontFeaturesToKiwi(nc, node.fontFeatures) @@ -322,6 +323,9 @@ function serializeTextProps( if (node.textDecorationThickness != null) { nc.textDecorationThickness = { value: node.textDecorationThickness, units: 'PIXELS' } } + if (node.textUnderlineOffset != null) { + nc.textUnderlineOffset = { value: node.textUnderlineOffset, units: 'PIXELS' } + } if (node.textDecorationFills.length > 0) { nc.textDecorationFillPaints = node.textDecorationFills.map(fillToKiwiPaint) } diff --git a/packages/core/src/kiwi/fig/node-change/style-runs.ts b/packages/core/src/kiwi/fig/node-change/style-runs.ts index 1ef720737..a3ad48761 100644 --- a/packages/core/src/kiwi/fig/node-change/style-runs.ts +++ b/packages/core/src/kiwi/fig/node-change/style-runs.ts @@ -7,6 +7,24 @@ import { convertFontVariations } from './font/variations' import { convertFills } from './paint' import { convertLetterSpacing, convertLineHeight, mapTextDecoration } from './text-values' +function applyTextDecorationOverride(style: CharacterStyleOverride, override: NodeChange): void { + const deco = override.textDecoration + if (deco) style.textDecoration = mapTextDecoration(deco) + if (override.textDecorationStyle) + style.textDecorationStyle = + override.textDecorationStyle as CharacterStyleOverride['textDecorationStyle'] + if (override.textDecorationThickness) + style.textDecorationThickness = override.textDecorationThickness.value ?? null + if (override.textDecorationSkipInk !== undefined) + style.textDecorationSkipInk = override.textDecorationSkipInk + if (override.textUnderlineOffset) + style.textUnderlineOffset = override.textUnderlineOffset.value ?? null + if (override.textDecorationFillPaints) { + const decorationFills = convertFills(override.textDecorationFillPaints) + if (decorationFills.length > 0) style.textDecorationFills = decorationFills + } +} + function convertStyleOverride( override: NodeChange, fallbackFontSize: number | undefined @@ -32,17 +50,7 @@ function convertStyleOverride( const lh = convertLineHeight(override.lineHeight, override.fontSize ?? fallbackFontSize) if (lh != null) style.lineHeight = lh } - const deco = override.textDecoration - if (deco) style.textDecoration = mapTextDecoration(deco) - if (override.textDecorationStyle) - style.textDecorationStyle = - override.textDecorationStyle as CharacterStyleOverride['textDecorationStyle'] - if (override.textDecorationThickness) - style.textDecorationThickness = override.textDecorationThickness.value ?? null - if (override.textDecorationFillPaints) { - const decorationFills = convertFills(override.textDecorationFillPaints) - if (decorationFills.length > 0) style.textDecorationFills = decorationFills - } + applyTextDecorationOverride(style, override) if (override.fillPaints) { const fills = convertFills(override.fillPaints) if (fills.length > 0) style.fills = fills diff --git a/packages/core/src/kiwi/fig/node-change/text-data-export.ts b/packages/core/src/kiwi/fig/node-change/text-data-export.ts index 6e1e9953b..0d93aae5d 100644 --- a/packages/core/src/kiwi/fig/node-change/text-data-export.ts +++ b/packages/core/src/kiwi/fig/node-change/text-data-export.ts @@ -12,6 +12,26 @@ export function fontVariationToKiwi(variation: SceneNode['fontVariations'][numbe : { axisTag, axisName: variation.axis, value: variation.value } } +function applyTextDecorationOverrideFields( + override: Record, + style: CharacterStyleOverride, + fillToKiwiPaint: (fill: SceneNode['fills'][number]) => Paint +): void { + if (style.textDecoration) override.textDecoration = style.textDecoration + if (style.textDecorationStyle) override.textDecorationStyle = style.textDecorationStyle + if (style.textDecorationThickness != null) { + override.textDecorationThickness = { value: style.textDecorationThickness, units: 'PIXELS' } + } + if (style.textDecorationSkipInk !== undefined) + override.textDecorationSkipInk = style.textDecorationSkipInk + if (style.textUnderlineOffset != null) { + override.textUnderlineOffset = { value: style.textUnderlineOffset, units: 'PIXELS' } + } + if (style.textDecorationFills && style.textDecorationFills.length > 0) { + override.textDecorationFillPaints = style.textDecorationFills.map(fillToKiwiPaint) + } +} + function textStyleOverrideToKiwi( id: number, style: CharacterStyleOverride, @@ -39,14 +59,7 @@ function textStyleOverrideToKiwi( if (style.lineHeight !== undefined && style.lineHeight !== null) { override.lineHeight = { value: style.lineHeight, units: 'PIXELS' } } - if (style.textDecoration) override.textDecoration = style.textDecoration - if (style.textDecorationStyle) override.textDecorationStyle = style.textDecorationStyle - if (style.textDecorationThickness != null) { - override.textDecorationThickness = { value: style.textDecorationThickness, units: 'PIXELS' } - } - if (style.textDecorationFills && style.textDecorationFills.length > 0) { - override.textDecorationFillPaints = style.textDecorationFills.map(fillToKiwiPaint) - } + applyTextDecorationOverrideFields(override, style, fillToKiwiPaint) if (style.fills && style.fills.length > 0) { override.fillPaints = style.fills.map(fillToKiwiPaint) } diff --git a/packages/core/src/scene-graph/node-defaults.ts b/packages/core/src/scene-graph/node-defaults.ts index a5240c635..4715d1d56 100644 --- a/packages/core/src/scene-graph/node-defaults.ts +++ b/packages/core/src/scene-graph/node-defaults.ts @@ -88,6 +88,8 @@ export function createDefaultNode( textDecorationStyle: 'SOLID', textDecorationThickness: null, textDecorationFills: [], + textDecorationSkipInk: true, + textUnderlineOffset: null, maxLines: null, styleRuns: [], fontVariations: [], diff --git a/packages/core/src/scene-graph/source-metadata.ts b/packages/core/src/scene-graph/source-metadata.ts index 26b263018..4f7df88cd 100644 --- a/packages/core/src/scene-graph/source-metadata.ts +++ b/packages/core/src/scene-graph/source-metadata.ts @@ -31,6 +31,8 @@ const RAW_NODE_FIELD_KEYS = new Set([ 'textDecorationStyle', 'textDecorationThickness', 'textDecorationFills', + 'textDecorationSkipInk', + 'textUnderlineOffset', 'lineHeight', 'leadingTrim', 'letterSpacing', diff --git a/packages/core/src/scene-graph/types.ts b/packages/core/src/scene-graph/types.ts index dee350ac6..c1d954768 100644 --- a/packages/core/src/scene-graph/types.ts +++ b/packages/core/src/scene-graph/types.ts @@ -145,6 +145,7 @@ export interface Fill { imageScaleMode?: ImageScaleMode imageTransform?: GradientTransform sourceNodeId?: string + scale?: number spacing?: number patternSpacing?: Vector patternTileType?: PatternTileType @@ -209,6 +210,8 @@ export interface CharacterStyleOverride { textDecorationStyle?: TextDecorationStyle textDecorationThickness?: number | null textDecorationFills?: Fill[] + textDecorationSkipInk?: boolean + textUnderlineOffset?: number | null fontSize?: number fontFamily?: string letterSpacing?: number @@ -358,6 +361,8 @@ export interface SceneNode { textDecorationStyle: TextDecorationStyle textDecorationThickness: number | null textDecorationFills: Fill[] + textDecorationSkipInk: boolean + textUnderlineOffset: number | null leadingTrim: LeadingTrim lineHeight: number | null letterSpacing: number diff --git a/packages/docs/development/roadmap.md b/packages/docs/development/roadmap.md index 40cd3b6e1..3712f2223 100644 --- a/packages/docs/development/roadmap.md +++ b/packages/docs/development/roadmap.md @@ -129,7 +129,7 @@ Figma's design documentation groups features into these areas: | Solid fills | ✅ | ✅ | ✅ | ✅ | ✅ | Color variables supported for common fill cases. | | Gradients | ✅ | ✅ | ✅ | ✅ | ✅ | Linear/radial/angular/diamond support; Figma edge cases may differ. | | Image fills | ✅ | ✅ | ◐ | ✅ | ✅ | Fill/fit/crop/tile support exists; imported crop/tile affine transforms are applied, but exact Figma parity is still partial. | -| Pattern / noise / custom fills | ✅ | ◐ | — | ✅ | — | Schema metadata imports/exports; Figma pattern fills with a referenced source node render as repeated source tiles. Noise/custom paints still render with a solid fallback pending real payload samples. | +| Pattern / noise / custom fills | ✅ | ◐ | — | ✅ | — | Schema metadata imports/exports; Figma pattern fills with a referenced source node render as repeated source tiles with scale, spacing, alignment, and basic hex offsets. Noise/custom paints still render with a solid fallback pending real payload samples. | | Video/GIF/media fills | ↩ | — | — | ↩ | — | Kiwi schema includes media paint/export enums, but OpenPencil has no video/GIF playback or media layer support. | | Layer/fill/effect blend modes | ✅ | ◐ | — | ✅ | ✅ | Canvas applies node, fill, and common shadow effect blend modes; Figma isolation edge cases remain partial. | | Opacity | ✅ | ✅ | ✅ | ✅ | ✅ | Node opacity uses save layers in the renderer. | @@ -195,7 +195,7 @@ OpenPencil deliberately preserves many Figma/Kiwi fields even when they are not | Version/sort/publish/library metadata | ↩ | — | ◐ | Assets UI shows a subset; publish/update workflow is missing. | | Variable and parameter consumption maps | ✅ | ◐ | ◐ | Filtered/preserved for safe round-trip; normalized bindings cover common cases. | | Page fields: background, page type, guides | ↩ | ◐ | — | Background color and background paints round-trip for imported pages; page type/guides mostly round-trip. Guides are not rendered/editable. | -| Text internals: `textData`, layout versions, font version, derived data | ✅ | ✅ | — | Important for text fidelity; most internals are not editable. Imported derived text data, leading trim, decoration style, underline decoration paint/offset/thickness, semantic font metadata, and raw OpenType feature toggles are preserved for round-trip when safe; decoration style/thickness/color and leading trim now render through CanvasKit. | +| Text internals: `textData`, layout versions, font version, derived data | ✅ | ✅ | — | Important for text fidelity; most internals are not editable. Imported derived text data, leading trim, decoration style, underline decoration paint/offset/thickness/skip-ink, semantic font metadata, and raw OpenType feature toggles are preserved for round-trip when safe; decoration style/thickness/color and leading trim now render through CanvasKit. | | `fontVariations` | ✅ | ✅ | — | Variable font axes are imported, rendered, and exported for text nodes and style runs. | | Raw paint/effect/vector/geometry payloads | ✅ | ✅ | ◐ | Converted fields render; raw payloads preserve Figma import/export details, including mask, background paint, layout grid, export setting, and prototype interaction metadata where safe. | @@ -205,8 +205,8 @@ These are parsed or visible in Figma docs and most likely to cause visible diffe 1. **Masks** — tune remaining exact Figma stack semantics beyond common alpha/vector/luminance and consecutive-mask paths. `tests/fixtures/figma-oracles/masks.json` records live Figma API values for alpha, vector, and luminance masks. 2. **Corner smoothing** — expand Figma fixture comparisons and tune remaining stroke/effect edge cases. -3. **Pattern/noise/custom fills** — tune first-class pattern rendering for hexagonal tiles, scale, and alignment. `tests/fixtures/figma-oracles/pattern-noise-custom-paints.json` captures a real async Figma `PATTERN` payload; real `NOISE` / `CUSTOM` payloads remain blocked on Figma-authored samples. -4. **Variable-font and rich text fixtures** — broaden real-file coverage for variable axes, derived text data, leading trim, decoration style, semantic font metadata, and raw OpenType feature metadata; `tests/fixtures/figma-oracles/rich-text-decoration.json` captures the first live Figma rich-text oracle. +3. **Pattern/noise/custom fills** — tune first-class pattern rendering for nested/effectful pattern sources and exact Figma hex spacing. `tests/fixtures/figma-oracles/pattern-noise-custom-paints.json` captures a real async Figma `PATTERN` payload; real `NOISE` / `CUSTOM` payloads remain blocked on Figma-authored samples. +4. **Variable-font and rich text fixtures** — broaden real-file coverage for variable axes, derived text data, leading trim, decoration style, underline offset/skip-ink, semantic font metadata, and raw OpenType feature metadata; `tests/fixtures/figma-oracles/rich-text-decoration.json` captures the first live Figma rich-text oracle. 5. **Boolean operation editing** — improve inspector/tooling workflows for imported boolean-operation nodes. 6. **Layout grids and guides** — render/edit page guides and Figma layout grids, or clearly keep them round-trip-only. 7. **Full component property and slot workflows** — support authoring, not just preserving imported payloads. diff --git a/tests/e2e/canvas/renderer-visuals.spec.ts b/tests/e2e/canvas/renderer-visuals.spec.ts index f929c4f7b..68837c671 100644 --- a/tests/e2e/canvas/renderer-visuals.spec.ts +++ b/tests/e2e/canvas/renderer-visuals.spec.ts @@ -295,7 +295,8 @@ test('pattern fills from source nodes', async () => { { type: 'PATTERN', sourceNodeId: source.id, - patternTileType: 'RECTANGULAR', + patternTileType: 'HORIZONTAL_HEXAGONAL', + scale: 1.25, patternSpacing: { x: 0.45, y: 0.35 }, horizontalAlignment: 'CENTER', verticalAlignment: 'CENTER', diff --git a/tests/e2e/canvas/renderer-visuals.spec.ts-snapshots/pattern-fills-from-source-nodes-openpencil-darwin.png b/tests/e2e/canvas/renderer-visuals.spec.ts-snapshots/pattern-fills-from-source-nodes-openpencil-darwin.png index 4f70a3862059028266fdec34666383de704daa7a..ac131ff739003eac06051bbda4b9465365353279 100644 GIT binary patch literal 50904 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ν{E$}umH4aU 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 D{UN0h literal 51733 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 diff --git a/tests/engine/io/fig/export/paint-schema-fields.test.ts b/tests/engine/io/fig/export/paint-schema-fields.test.ts index 26d18760b..6d7753c57 100644 --- a/tests/engine/io/fig/export/paint-schema-fields.test.ts +++ b/tests/engine/io/fig/export/paint-schema-fields.test.ts @@ -15,6 +15,7 @@ describe('Figma paint schema field export', () => { opacity: 0.75, visible: true, sourceNodeId: '12:34', + scale: 1.5, spacing: 6, patternSpacing: { x: 8, y: 12 }, patternTileType: 'VERTICAL_HEXAGONAL', @@ -46,6 +47,7 @@ describe('Figma paint schema field export', () => { expect(fills?.[0]).toMatchObject({ type: 'PATTERN', sourceNodeId: { sessionID: 12, localID: 34 }, + scale: 1.5, spacing: 6, patternSpacing: { x: 8, y: 12 }, patternTileType: 'VERTICAL_HEXAGONAL', diff --git a/tests/engine/io/fig/import/mask-oracle.test.ts b/tests/engine/io/fig/import/mask-oracle.test.ts index 8488e8fa3..d5828481e 100644 --- a/tests/engine/io/fig/import/mask-oracle.test.ts +++ b/tests/engine/io/fig/import/mask-oracle.test.ts @@ -13,6 +13,8 @@ interface MaskOracleEntry { interface MaskOracle { masks: MaskOracleEntry[] + nested: { children: MaskOracleEntry[] } + maskIsOutline: { pluginApiReadable: boolean; note: string } } function readOracle(): MaskOracle { @@ -57,4 +59,14 @@ describe('Figma mask oracle', () => { expect(changes[0].maskType).toBe(mask.maskType) } }) + + test('records nested live Figma mask stack order and maskIsOutline API gap', () => { + const oracle = readOracle() + + expect(oracle.nested.children.map(({ isMask, maskType }) => ({ isMask, maskType }))).toEqual([ + { isMask: true, maskType: 'LUMINANCE' }, + { isMask: false, maskType: 'ALPHA' } + ]) + expect(oracle.maskIsOutline.pluginApiReadable).toBe(false) + }) }) diff --git a/tests/engine/io/fig/import/paint-schema-fields.test.ts b/tests/engine/io/fig/import/paint-schema-fields.test.ts index 5c3195d0d..ca7774353 100644 --- a/tests/engine/io/fig/import/paint-schema-fields.test.ts +++ b/tests/engine/io/fig/import/paint-schema-fields.test.ts @@ -18,6 +18,7 @@ describe('Figma paint schema field import', () => { opacity: 0.75, visible: true, sourceNodeId, + scale: 1.5, spacing: 6, patternSpacing: { x: 8, y: 12 }, patternTileType: 'HORIZONTAL_HEXAGONAL', @@ -33,6 +34,7 @@ describe('Figma paint schema field import', () => { type: 'PATTERN', opacity: 0.75, sourceNodeId: '12:34', + scale: 1.5, spacing: 6, patternSpacing: { x: 8, y: 12 }, patternTileType: 'HORIZONTAL_HEXAGONAL', diff --git a/tests/engine/io/fig/import/rich-text-oracle.test.ts b/tests/engine/io/fig/import/rich-text-oracle.test.ts index 939ed958a..ce39aea77 100644 --- a/tests/engine/io/fig/import/rich-text-oracle.test.ts +++ b/tests/engine/io/fig/import/rich-text-oracle.test.ts @@ -3,6 +3,8 @@ import { readFileSync } from 'node:fs' import type { NodeChange, Paint } from '#core/kiwi/fig/codec' import { nodeChangeToProps } from '#core/kiwi/fig/node-change/convert' +import { sceneNodeToKiwi } from '#core/kiwi/fig/node-change/serialize' +import { SceneGraph } from '#core/scene-graph' interface OracleColor { r: number @@ -29,6 +31,8 @@ interface OracleRange { interface RichTextOracle { characters: string leadingTrim: string + textDecorationOffset: { unit: string; value: number } + textDecorationSkipInk: boolean ranges: OracleRange[] } @@ -79,6 +83,8 @@ describe('Figma rich text oracle', () => { value: secondRange.textDecorationThickness.value, units: 'PIXELS' }, + textUnderlineOffset: { value: oracle.textDecorationOffset.value, units: 'PIXELS' }, + textDecorationSkipInk: oracle.textDecorationSkipInk, textDecorationFillPaints: [oracleColorToPaint(secondRange.textDecorationColor)] } ] @@ -90,6 +96,8 @@ describe('Figma rich text oracle', () => { value: firstRange.textDecorationThickness.value, units: 'PIXELS' }, + textUnderlineOffset: { value: oracle.textDecorationOffset.value, units: 'PIXELS' }, + textDecorationSkipInk: oracle.textDecorationSkipInk, textDecorationFillPaints: [oracleColorToPaint(firstRange.textDecorationColor)], leadingTrim: oracle.leadingTrim } @@ -101,6 +109,8 @@ describe('Figma rich text oracle', () => { expect(props.textDecorationStyle).toBe('WAVY') expect(props.textDecorationThickness).toBe(2) expect(props.textDecorationFills[0]?.color).toEqual({ r: 1, g: 0, b: 0, a: 1 }) + expect(props.textUnderlineOffset).toBe(5) + expect(props.textDecorationSkipInk).toBe(false) expect(props.leadingTrim).toBe('CAP_HEIGHT') expect(props.styleRuns).toEqual([ { @@ -110,6 +120,8 @@ describe('Figma rich text oracle', () => { textDecoration: 'UNDERLINE', textDecorationStyle: 'DOTTED', textDecorationThickness: 3, + textDecorationSkipInk: false, + textUnderlineOffset: 5, textDecorationFills: [ { type: 'SOLID', @@ -123,4 +135,21 @@ describe('Figma rich text oracle', () => { } ]) }) + + test('exports captured Figma text decoration offset and skip-ink fields', () => { + const oracle = readOracle() + const graph = new SceneGraph() + const page = graph.getPages()[0] + const text = graph.createNode('TEXT', page.id, { + text: oracle.characters, + textDecoration: 'UNDERLINE', + textUnderlineOffset: oracle.textDecorationOffset.value, + textDecorationSkipInk: oracle.textDecorationSkipInk + }) + + const changes = sceneNodeToKiwi(text, { sessionID: 1, localID: 1 }, 0, { value: 2 }, graph, []) + + expect(changes[0].textUnderlineOffset).toEqual({ value: 5, units: 'PIXELS' }) + expect(changes[0].textDecorationSkipInk).toBe(false) + }) }) diff --git a/tests/engine/render/canvas/image-fill.test.ts b/tests/engine/render/canvas/image-fill.test.ts index a673a26d9..6d3536014 100644 --- a/tests/engine/render/canvas/image-fill.test.ts +++ b/tests/engine/render/canvas/image-fill.test.ts @@ -1,6 +1,6 @@ import { describe, expect, mock, test } from 'bun:test' -import { makeImageFillLocalMatrix } from '#core/canvas/fills' +import { makeImageFillLocalMatrix, patternTileLayout } from '#core/canvas/fills' import type { SkiaRenderer } from '#core/canvas/renderer' import type { Fill, SceneNode } from '#core/scene-graph' @@ -23,6 +23,49 @@ const node = { height: 80 } as SceneNode +describe('canvas pattern fills', () => { + test('uses scale, spacing, and alignment for rectangular pattern tiles', () => { + const layout = patternTileLayout( + { width: 20, height: 10 } as SceneNode, + { + type: 'PATTERN', + scale: 2, + patternSpacing: { x: 0.25, y: 0.5 }, + horizontalAlignment: 'CENTER', + verticalAlignment: 'END', + color: { r: 0, g: 0, b: 0, a: 1 }, + opacity: 1, + visible: true + } as Fill + ) + + expect(layout).toEqual({ + rect: { x: 0, y: 0, width: 50, height: 30 }, + scale: 2, + positions: [{ x: 5, y: 10 }] + }) + }) + + test('adds an offset source copy for hexagonal pattern tiles', () => { + const layout = patternTileLayout( + { width: 20, height: 10 } as SceneNode, + { + type: 'PATTERN', + patternTileType: 'HORIZONTAL_HEXAGONAL', + patternSpacing: { x: 0, y: 0 }, + color: { r: 0, g: 0, b: 0, a: 1 }, + opacity: 1, + visible: true + } as Fill + ) + + expect(layout.positions).toEqual([ + { x: 0, y: 0 }, + { x: 10, y: 5 } + ]) + }) +}) + describe('canvas image fills', () => { test('keeps untransformed tile fills in image pixel space', () => { const renderer = createRenderer() diff --git a/tests/engine/render/canvas/schema-fill-fallback.test.ts b/tests/engine/render/canvas/schema-fill-fallback.test.ts index 2be9d83ac..230aa26b1 100644 --- a/tests/engine/render/canvas/schema-fill-fallback.test.ts +++ b/tests/engine/render/canvas/schema-fill-fallback.test.ts @@ -13,7 +13,11 @@ function createRenderer() { const recorder = { beginRecording: mock(() => ({ drawRect: mock(() => undefined), - drawRRect: mock(() => undefined) + drawRRect: mock(() => undefined), + restore: mock(() => undefined), + save: mock(() => undefined), + scale: mock(() => undefined), + translate: mock(() => undefined) })), finishRecordingAsPicture: mock(() => picture), delete: mock(() => undefined) diff --git a/tests/fixtures/figma-oracles/masks.json b/tests/fixtures/figma-oracles/masks.json index 7a131b141..b7179dd6c 100644 --- a/tests/fixtures/figma-oracles/masks.json +++ b/tests/fixtures/figma-oracles/masks.json @@ -9,5 +9,27 @@ { "id": "296500:2240", "name": "Mask ALPHA", "isMask": true, "maskType": "ALPHA" }, { "id": "296500:2241", "name": "Mask VECTOR", "isMask": true, "maskType": "VECTOR" }, { "id": "296500:2242", "name": "Mask LUMINANCE", "isMask": true, "maskType": "LUMINANCE" } - ] + ], + "nested": { + "page": "OpenPencil nested mask oracle 2026-05-22", + "frameId": "296616:2249", + "children": [ + { + "id": "296616:2250", + "name": "Nested luminance mask", + "isMask": true, + "maskType": "LUMINANCE" + }, + { + "id": "296616:2251", + "name": "Nested masked content", + "isMask": false, + "maskType": "ALPHA" + } + ] + }, + "maskIsOutline": { + "pluginApiReadable": false, + "note": "The Kiwi schema has maskIsOutline and OpenPencil preserves it, but Figma Plugin API did not expose a readable maskIsOutline property in the live oracle." + } } diff --git a/tests/fixtures/figma-oracles/rich-text-decoration.json b/tests/fixtures/figma-oracles/rich-text-decoration.json index 01ce246b7..47463761d 100644 --- a/tests/fixtures/figma-oracles/rich-text-decoration.json +++ b/tests/fixtures/figma-oracles/rich-text-decoration.json @@ -8,6 +8,9 @@ }, "characters": "wavy red | dotted blue | cap trim", "leadingTrim": "CAP_HEIGHT", + "textDecorationOffset": { "unit": "PIXELS", "value": 5 }, + "textDecorationSkipInk": false, + "textDecorationOffsetOracleNodeId": "296619:2252", "ranges": [ { "start": 0,