Skip to content

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

Closed
planet6897 wants to merge 5 commits into
edwardkim:develfrom
planet6897:pr/task-485
Closed

Task #485: synam-001.hwp 분할 표 셀 마지막 줄 클립 정정#657
planet6897 wants to merge 5 commits into
edwardkim: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 (오늘 할일)
edwardkim added a commit that referenced this pull request May 8, 2026
closes #485

5 commits 단계별 보존 (옵션 A — 작업지시자 직접 결정):
- 3965b51 Stage 1: 본질 정밀 측정 — out-of-order + boundary epsilon 두 버그 식별
- 5f56c66 Stage 2a: out-of-order 정정 (limit_reached 플래그)
- 53effd1 Stage 2b: boundary epsilon (2.0px) 적용
- 8188e29 Stage 3: 회귀 검증 — 회귀 없음 + 후보 A/D 진입 불요
- 7e43269 Stage 4: 최종 보고서 + orders 갱신

본 환경 검증:
- cargo test --release ALL PASS (1165 lib + clippy clean)
- cherry-pick 충돌 0건
- 광범위 sweep 7 샘플 170 페이지: same=166 / diff=4
  - 정정 영역: synam-001 p15 / p20 / p21 (PR 본문 명시)
  - 추가 영향: synam-001 p5 (split table — 시각 판정 영역에서 점검)

PR: #657
컨트리뷰터: @planet6897 (15번째 사이클)
후속 분리: #656 (typeset/layout height 측정 모델 통일 — 본 PR 범위 외)
edwardkim added a commit that referenced this pull request May 8, 2026
PR #657 (Task #485): synam-001.hwp 분할 표 셀 마지막 줄 클립 정정
- merge commit: 595c02d (옵션 A — 5 commits 단계별 보존 no-ff merge)
- 두 분리 버그: Bug-1 out-of-order + Bug-2 boundary epsilon (2.0px)
- 정정: compute_cell_line_ranges 단일 함수 3 hunk (+28/-4 LOC)
- 본 환경 결정적 검증 1165 lib pass + clippy clean
- 광범위 sweep 7 샘플 170 페이지: same=166 / diff=4 (synam-001 p5/p15/p20/p21)
- 다른 6 샘플 (135 페이지) 회귀 0
- WASM 빌드 4,573,826 bytes
- 작업지시자 시각 판정 ★ 통과

후속 분리: Issue #656 (typeset/layout height 측정 모델 통일 — 본 PR 범위 외)
검증용 PDF 영구 보존: samples/synam-001.pdf

closes #485

산출물:
- mydocs/pr/archives/pr_657_review.md
- mydocs/pr/archives/pr_657_report.md
- mydocs/orders/20260508.md 갱신
@edwardkim

Copy link
Copy Markdown
Owner

@planet6897 님 15번째 사이클 PR 처리 완료입니다.

본 환경 검증 결과:

결정적 검증 통과:

  • `cargo test --release --lib` → 1165 passed (회귀 0)
  • `cargo clippy --release` → clean
  • cherry-pick simulation 충돌 0건

광범위 회귀 sweep (`scripts/svg_regression_diff.sh`, 7 샘플 170 페이지):
```
2010-01-06: same=6 / diff=0
aift: same=77 / diff=0
exam_eng: same=8 / diff=0
exam_kor: same=20 / diff=0
exam_math: same=20 / diff=0
exam_science: same=4 / diff=0
synam-001: same=31 / diff=4 (p5, p15, p20, p21)
TOTAL: same=166 / diff=4
```
→ 다른 6 샘플 (135 페이지) 회귀 0 ✅

핵심 케이스 영역의 본 환경 직접 재현 (SVG md5 비교):

페이지 devel PR 영향
synam-001 p15 `8e9f717d...` `e9c0b084...` 다름 ✅
synam-001 p20 `637f8012...` `9a55eda8...` 다름 ✅
synam-001 p21 `4c694fb1...` `d7f04cfb...` 다름 ✅

작업지시자 시각 판정 ★ 통과: WASM 빌드 (`pkg/rhwp_bg.wasm` 4,573,826 bytes) 후 rhwp-studio 영역에서 synam-001 p15/p20/p21 클립 해소 + p5 추가 영향 영역 정합 확인.

처리: 옵션 A — 5 commits 단계별 보존 no-ff merge.

  • merge commit: `595c02d6`
  • devel push: `7704e24a..3f42c9e`

본질 정정 영역의 정확성: `compute_cell_line_ranges` 단일 함수 영역의 3 hunk (+28/-4 LOC). 두 분리 버그 영역 (Bug-1 out-of-order + Bug-2 boundary epsilon 2.0px) 영역의 분리 영역의 분석 영역 정확.

후속 영역 분리 영역 정합: Issue #656 (typeset/layout height 측정 모델 통일) 영역 본 PR 범위 외 영역 명시 영역의 깔끔한 영역 분리 영역.

처리 보고서: `mydocs/pr/archives/pr_657_report.md`

closes #485

@edwardkim edwardkim closed this May 8, 2026
edwardkim added a commit that referenced this pull request May 8, 2026
본 commit 영역은 PR #662 영역의 Stage 3 (commit 7a8ce60) 영역의 본질 정정 영역을
PR #657 (Task #485) 영역의 limit_reached 플래그 영역과 통합 영역의 충돌 해결 영역.

본질 정정 (Task #656):
- abs_limit 그대로 사용 (Task #485 영역의 SPLIT_LIMIT_EPSILON = 2.0px 휴리스틱 제거)
- break 비교 시 마지막 visible 줄의 trail_ls 제외 (line_break_pos = cum + h)
  - cum 누적은 line_h (h+ls) 그대로 (이전 줄들의 ls 는 다음 줄 직전 spacing)
  - break 비교는 line_break_pos = cum + h (이 줄의 ls 제외) 로 비교
  - 이 줄이 visible 시 마지막 줄이면 trail_ls 미렌더 영역, abs_limit 안에 fit
- typeset 의 split_end_limit = avail_content 추정과 정합
- 셀 is_cell_last_line 분기 의 trail_ls 미렌더 모델과 동일 본질
- 폰트 무관 영역 (Task #485 의 epsilon 영역의 휴리스틱 마진 영역의 본질 대체)

보존 (Task #485 Bug-1):
- limit_reached 플래그 영역 (out-of-order 차단)
- atomic 단락 영역의 abs_limit 비교 (epsilon 제거 후)

본 정정 영역의 본질:
synam-001 p15 측정 영역:
  cum + h = 2244.00 ≤ abs_limit (2245.97) → 줄 fit
  cum + h + ls = 2252.80 > abs_limit → trail_ls 포함 시 6.83px 초과

→ epsilon 휴리스틱 영역 없이 line_break_pos 영역의 본질 비교 영역으로 정정.

원 commit: 7a8ce60 (Task #656 Stage 3 — base=devel 영역 분기 영역 충돌)
메인테이너 충돌 해결: PR #657 limit_reached 플래그 보존 + PR #662 본질 정정 통합

Refs #656
edwardkim added a commit that referenced this pull request May 8, 2026
…줄 클립 본질 정정

closes #656

4 commits 통합 (메인테이너 충돌 해결):
- 867abd3 Stage 1: 본질 정밀 측정 + 회귀 베이스 영역 구축
- 0b3f521 Stage 2: 단일 모델 통합 시도 — 회귀 발생, 후퇴 보고서
- 8555609 Stage 3: compute_cell_line_ranges break 조건 본질 정정 (메인테이너 충돌 해결)
- 30021e5 Stage 4: 광범위 회귀 검증 + 골든 갱신 + 최종 보고서

본질 정정 (Task #656):
- abs_limit 그대로 사용 (Task #485 영역의 SPLIT_LIMIT_EPSILON 2.0px 휴리스틱 제거)
- break 비교 시 마지막 visible 줄의 trail_ls 제외 (line_break_pos = cum + h)
  - cum 누적은 line_h (h+ls) 그대로
  - break 비교만 line_break_pos = cum + h 영역으로 정정
- typeset 의 split_end_limit = avail_content 추정과 정합
- 폰트 무관 영역 (epsilon 휴리스틱 본질 대체)

보존 (Task #485 Bug-1):
- limit_reached 플래그 영역 (out-of-order 차단)

본 환경 검증:
- cherry-pick: Stage 1+2 깨끗, Stage 3 충돌 → 메인테이너 통합 정정, Stage 4 orders 영역 ours
- cargo test --release ALL PASS (1165 lib + svg_snapshot 7/7)
- clippy clean
- 광범위 sweep 7 샘플 170 페이지: same=166 / diff=4 (synam-001 p5/p15/p20/p21)
- synam-001 p15 영역 본질 정정 영역의 영향 영역 본 환경 직접 재현 (md5 다름)

PR: #662
컨트리뷰터: @planet6897 (16번째 사이클)
선행 PR: #657 (Task #485) 영역의 epsilon 영역 본질 대체 영역
edwardkim added a commit that referenced this pull request May 8, 2026
PR #662 (Task #656): typeset/layout 모델 통일 — 분할 표 셀 마지막 visible 줄 클립 본질 정정
- merge commit: 93ddeca (옵션 1 — 메인테이너 충돌 해결 통합 머지)
- PR #657 (Task #485) epsilon 휴리스틱 영역 supersede 영역
- 통합 정정: epsilon 제거 + line_break_pos = cum + h (trail_ls 제외) + limit_reached 보존
- 본 환경 결정적 검증 1165 lib + svg_snapshot 7/7 + clippy clean
- 광범위 sweep 7 샘플 170 페이지: same=166 / diff=4 (synam-001 영향만)
- WASM 빌드 4,573,882 bytes
- 작업지시자 시각 판정 ★ 통과

closes #656

산출물:
- mydocs/pr/archives/pr_662_review.md
- mydocs/pr/archives/pr_662_report.md
- mydocs/orders/20260508.md 갱신
- 메모리 룰 갱신: feedback_pr_supersede_chain (머지+머지 패턴 신규 사례)
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.

2 participants