Skip to content

Commit 33e0471

Browse files
committed
refactor(painter): migrate internals to ResolvedLayout (SD-2836)
Switch DomPainter's internal state and helpers from raw Layout/Page to ResolvedLayout/ResolvedPage: * The six top-level legacy-Layout methods (beginPaintSnapshot, fullRender, patchLayout, renderHorizontal, renderBookMode, renderVirtualized) take ResolvedLayout. paint() drops the `const layout = input.sourceLayout` binding and calls every method with input.resolvedLayout. * The page-level helpers (renderPage, createPageState, patchPage, renderDecorationsForPage, renderDecorationSection, getDecorationAnchorPageOriginY, renderPageRuler, renderColumnSeparators) take ResolvedPage and read width/height/ margins/numberText/etc. directly. Drops every redundant `resolvedPage?: ResolvedPage | null` parameter. * `currentLayout: Layout | null` -> `ResolvedLayout | null`. Strips the `(page.size ?? layout.pageSize)` cascades inside virtualization + page-iteration code; uses ResolvedPage.width/.height directly. * Lifts `columns` and `columnRegions` onto ResolvedPage so the column-separator renderer can read them without falling back to raw Page. Couples PageDecorationProvider (planned PR2 work) since the painter now passes ResolvedPage to the third callback argument: * `PageDecorationProvider`'s `page?` parameter is `ResolvedPage`. * `HeaderFooterSessionManager.rebuildRegions` takes ResolvedLayout. `updateDecorationProviders(layout, resolvedLayout)` plumbed through PresentationEditor. * The provider closure body and internal helpers (`#stripFootnoteReserveFromBottomMargin`, `#computeExpectedSectionType`) now operate on ResolvedPage; `page?.size?.h` -> `page?.height`. * `buildLegacyPaintInput` always calls `resolveLayout` so the legacy paint(Layout) path produces ResolvedPages even when no body blocks/measures are supplied (preserves page-level metadata). Skips a "decoration item synthesis" describe block that exercises `paint(Layout)` + `setData` + `setResolvedLayout`. Those legacy entry points get deleted in the next commit; the block is being preserved as .skip so the deletion is visible in diff.
1 parent 4b52441 commit 33e0471

7 files changed

Lines changed: 100 additions & 128 deletions

File tree

packages/layout-engine/contracts/src/resolved-layout.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import type {
2+
ColumnLayout,
3+
ColumnRegion,
24
DrawingBlock,
35
FlowMode,
46
Fragment,
@@ -66,6 +68,10 @@ export type ResolvedPage = {
6668
};
6769
/** Page orientation. */
6870
orientation?: 'portrait' | 'landscape';
71+
/** Column layout configuration for this page (reflects page-start config). */
72+
columns?: ColumnLayout;
73+
/** Vertical column regions when continuous section breaks change column layout mid-page. */
74+
columnRegions?: ColumnRegion[];
6975
};
7076

7177
/** Union of all resolved paint item kinds. */

packages/layout-engine/layout-resolved/src/resolveLayout.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,8 @@ export function resolveLayout(input: ResolveLayoutInput): ResolvedLayout {
308308
const pages: ResolvedPage[] = layout.pages.map((page, pageIndex) => ({
309309
id: `page-${pageIndex}`,
310310
index: pageIndex,
311+
columns: page.columns,
312+
columnRegions: page.columnRegions,
311313
number: page.number,
312314
width: page.size?.w ?? layout.pageSize.w,
313315
height: page.size?.h ?? layout.pageSize.h,

packages/layout-engine/painters/dom/src/index.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10858,7 +10858,7 @@ describe('applyRunDataAttributes', () => {
1085810858
});
1085910859
});
1086010860

10861-
describe('decoration item synthesis', () => {
10861+
describe.skip('decoration item synthesis (legacy, deleted in PR2 of SD-2836)', () => {
1086210862
let mount: HTMLElement;
1086310863

1086410864
beforeEach(() => {

packages/layout-engine/painters/dom/src/index.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -235,9 +235,10 @@ function buildLegacyPaintInput(
235235
let resolvedLayout: ResolvedLayout;
236236
if (legacyState.resolvedLayout) {
237237
resolvedLayout = legacyState.resolvedLayout;
238-
} else if (legacyState.blocks.length === 0 && legacyState.measures.length === 0) {
239-
resolvedLayout = createEmptyResolvedLayout(flowMode, pageGap);
240238
} else {
239+
// resolveLayout handles empty blocks/measures gracefully and preserves
240+
// page-level metadata (size, margins, columns/columnRegions, etc.) needed
241+
// by the painter even when no body content has been provided yet.
241242
resolvedLayout = resolveLayout({
242243
layout,
243244
flowMode: flowMode ?? 'paginated',

0 commit comments

Comments
 (0)