Skip to content

Task #398 회귀: RowBreak 표가 rowspan 보호 블록 정책으로 일찍 분할 #474

@edwardkim

Description

@edwardkim

증상

`samples/k-water-rfp.hwp` 페이지 5: 표 pi=52 (4행 × 4열) 가 페이지 5 잔여 공간 (~719 px) 에 충분히 들어갈 수 있음에도 rows=0..2 (2행) 만 배치 + 잔여 ~482 px 비어있음 + rows=2..4 가 페이지 6 으로 밀림.

재현

```bash
rhwp dump-pages samples/k-water-rfp.hwp -p 4

페이지 5: used=196.3 px (사용량 21%), PartialTable rows=0..2

페이지 6: used=897.1 px, PartialTable rows=2..4 + 후속 콘텐츠 일부만

```

회귀 origin (bisect 확정)

commit `81db203` Task #398 Stage 2: 분할 호출부에 rowspan 블록 정책 적용 (PR #401 v2 머지)

본 commit 이 `engine.rs::split_table_rows` + `typeset.rs::paginate_table` 양쪽에 도입한 `snap_to_block_boundary` 가 회귀 발생 영역.

진단 정황

표 pi=52 정보:

  • 셀[8] r=2, c=0, rs=2 (rowspan=2): rows 2~3 을 묶음
  • 셀[14] r=3, c=3, paras=24, 텍스트 매우 김 → row 3 height = 729 px (페이지 1배 이상)
  • 표 attr = 0x04000006 = RowBreak (행 단위 페이지 분할 허용)

흐름:

  1. `find_break_row(719, 0)` = 3 (rows 0,1,2 까지 페이지 5 에 배치 가능: 324 px ≤ 719)
  2. `snap_to_block_boundary(3)` = 2 (row 3 이 보호 블록 (2, 4) 에 속함 → 후퇴)
  3. 결과: rows=0..2 만 배치 → 잔여 482 px 비어있음

핵심 모순

정정 방향 (옵션 2)

`snap_to_block_boundary` (+ 호출부) 에서 표 attr 의 RowBreak 플래그 검사 — RowBreak 표는 보호 블록 정책 비적용:

  • `engine.rs::split_table_rows` + `typeset.rs::paginate_table` 의 `snap_to_block_boundary` 호출 영역
  • `first_block_h` / `cur_block_protected` / `next_block_protected` 가드도 RowBreak 표 비적용

메모리 `feedback_hancom_compat_specific_over_general` 부합 — HWP 정책 정합 명시 가드.

회귀 검증 권장 영역

PR #401 v2 (Task #398) 의 보호 블록 정책이 다른 표에 미친 영향:

영향 범위

  • `src/renderer/typeset.rs::paginate_table`
  • `src/renderer/pagination/engine.rs::split_table_rows`
  • `src/renderer/height_measurer.rs::snap_to_block_boundary` (RowBreak 인지 가드)

마일스톤

v1.0.0 (M100) — 조판 엔진 정합성

참고

  • 회귀 origin commit: `81db203`
  • 회귀 origin PR: #401 v2
  • bisect 진단 결과 + 디버그 로그 측정 정확 확정

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions