Skip to content

Task #485: synam-001.hwp 분할 표 셀 마지막 줄 클립 정정#657

Open
planet6897 wants to merge 5 commits intoedwardkim:develfrom
planet6897:pr/task-485
Open

Task #485: synam-001.hwp 분할 표 셀 마지막 줄 클립 정정#657
planet6897 wants to merge 5 commits intoedwardkim:develfrom
planet6897:pr/task-485

Conversation

@planet6897
Copy link
Copy Markdown
Contributor

개요

이슈 #485samples/synam-001.hwp 15·20·21 페이지의 RowBreak 분할 표(PartialTable)에서 셀 마지막 줄이 본문 영역 하단 경계와 시각적으로 겹치며 글자 descender가 클립핑되던 결함을 정정.

본질 정밀 측정 결과 두 개의 분리된 버그가 결합된 것으로 확인:

  • Bug-1 (out-of-order): compute_cell_line_ranges의 inner break가 outer 루프를 빠져나오지 않아, 셀 마지막 단락(line_spacing 제외로 line_h 작아짐)이 abs_limit 안에 fit하여 시각 순서 역전 + 본문 경계 클립
  • Bug-2 (boundary epsilon): line_end_pos > abs_limit의 boundary 케이스에서 02px 차이로 fit하면 cell-clip-rect bottom 침범

정정

src/renderer/layout/table_layout.rscompute_cell_line_ranges 단일 함수 (3 hunk):

  1. limit_reached 플래그 + outer 차단 (Bug-1) — abs_limit 도달 시 후속 단락 강제 미렌더, cell-last-line slip 제거
  2. SPLIT_LIMIT_EPSILON = 2.0px 도입 (Bug-2) — effective_limit = abs_limit - ε 로 break/exceed 비교, descender 여유분 + 부동소수점 오차 흡수

이슈 본문에서 제안된 후보 1 (typeset split_end_limit 산정 정정) 과 후보 3 (layout vpos correction drop)은 미적용 — 본질이 layout 측에서 충분히 정정됨.

변경 파일

파일 변경
src/renderer/layout/table_layout.rs compute_cell_line_ranges 3 hunk (epsilon 상수 + limit_reached 플래그 + outer 차단)
samples/synam-001.pdf 검증용 PDF 추가
mydocs/plans/task_m100_485.md, _impl.md 수행/구현 계획서
mydocs/working/task_m100_485_stage{1,2a,2b,3}.md 단계별 보고서
mydocs/report/task_m100_485_report.md 최종 보고서
mydocs/orders/20260507.md 오늘 할일 갱신

검증

본 결함 해소

페이지 결함 정정 후
synam-001.hwp p15 pi=84 (cell-last, line_h=14.667) slip → 클립 slip 차단 → 클립 해소 ✓
synam-001.hwp p20 pi=169 (cell-last, line_h=13.333) slip → 클립 slip 차단 → 클립 해소 ✓
synam-001.hwp p21 pi=108 (gap=0.947 NEAR) → 클립 epsilon 마진으로 차단 → 클립 해소 ✓

회귀 점검

영역 결과
Task #362 (kps-ai.hwp p56/67/68/69/70/72/73) 정상 (의도 보존)
Task #431 (synam-001 빈 페이지 미발생) 정상 (의도 보존)
Task #398 (rowspan 보호 블록) 정상
Task #474 (RowBreak 표 분할) 정상
aift.hwp 분할 표 (p10~p14) 정상
전 샘플 export-svg (155개 파일) 0 fail

자동 테스트

cargo test --release: 1231 passed, 0 failed, 2 ignored

후속 작업

후보 A·D 의 본질인 typeset/layout height 측정 모델 통일 은 본 PR 범위 밖으로 분리 — 별도 이슈 #656 으로 등록.

Test plan

closes #485

planet6897 added 5 commits May 7, 2026 13:04
…n 두 버그 식별

- 수행계획서/구현 계획서/Stage1 보고서 작성
- p15/p20/p21 trace 측정 (RHWP_T485_TRACE)
- 본질: cell-last-line slip (Bug-1) + epsilon 부재 (Bug-2)
- Stage 2 분할 제안 (2a: outer break, 2b: epsilon)
compute_cell_line_ranges 의 inner break 가 outer 루프를 빠져나오지 않아
후속 단락이 같은 cum 으로 재평가되어, 셀의 마지막 단락(line_spacing 제외로
line_h 작아짐)이 abs_limit 안에 fit 하여 시각 순서 역전 + 본문 경계 클립을
일으키던 결함 정정.

- limit_reached 플래그 도입 (abs_limit 도달 후 후속 단락 강제 차단)
- 일반 분기: line_end_pos > abs_limit 시 limit_reached = true + break
- atomic 분기: exceeds_limit 시 limit_reached = true

검증:
- p15: pi=84 (cell-last, line_h=14.667) slip 차단 → 클립 해소
- p20: pi=169 (cell-last, line_h=13.333) slip 차단 → 클립 해소
- p21: Bug-2 영역 (gap=0.947 NEAR) 잔존 — Stage 2b 에서 처리
- cargo test: 1125 passed (전 테스트 통과)
abs_limit 와 cell-clip-rect bottom 의 미세 어긋남 + 글자 descender 여유분으로
line_end_pos 가 abs_limit 와 ~0~2px 차이로 fit 하면 본문 경계를 시각적으로
침범하던 결함 정정.

- SPLIT_LIMIT_EPSILON = 2.0px 도입
- effective_limit = abs_limit - epsilon (break/exceed 비교에 사용)
- 일반 분기와 atomic 분기 모두 적용

검증:
- p21 pi=108 (gap=0.947) 차단 → 클립 해소
- p15/p20: 마지막 줄 gap=16.6/14.5px ≫ ε, 영향 없음 (Stage 2a 효과 유지)
- cargo test: 1199 passed
- 회귀: kps-ai.hwp p56/67/68/69/70/72/73 정상 (Task edwardkim#362/edwardkim#431 의도 보존)
- p15/p20/p21 클립 해소 재확인
- synam-001.hwp p13~p23 분할 표 흐름 정상
- kps-ai.hwp Task edwardkim#362 정정 영역 (p56/p67/p68/p69/p70/p72/p73) 정상
- aift.hwp p10~p14 분할 표 정상
- 전 샘플 (155개) export-svg OK
- cargo test 1199 passed

후보 A (typeset split_end_limit epsilon) 진입 불요 — 본질이 layout 측에서 정정됨
후보 D (vpos correction drop) 진입 불요 — 선행 collapse 위험 + 본 정정으로 충분
- mydocs/report/task_m100_485_report.md
- mydocs/orders/20260507.md (오늘 할일)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant