증상
`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 (행 단위 페이지 분할 허용)
흐름:
- `find_break_row(719, 0)` = 3 (rows 0,1,2 까지 페이지 5 에 배치 가능: 324 px ≤ 719)
- `snap_to_block_boundary(3)` = 2 (row 3 이 보호 블록 (2, 4) 에 속함 → 후퇴)
- 결과: 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 진단 결과 + 디버그 로그 측정 정확 확정
증상
`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 정보:
흐름:
핵심 모순
정정 방향 (옵션 2)
`snap_to_block_boundary` (+ 호출부) 에서 표 attr 의 RowBreak 플래그 검사 — RowBreak 표는 보호 블록 정책 비적용:
메모리 `feedback_hancom_compat_specific_over_general` 부합 — HWP 정책 정합 명시 가드.
회귀 검증 권장 영역
PR #401 v2 (Task #398) 의 보호 블록 정책이 다른 표에 미친 영향:
영향 범위
마일스톤
v1.0.0 (M100) — 조판 엔진 정합성
참고