Task #485: synam-001.hwp 분할 표 셀 마지막 줄 클립 정정#657
Conversation
…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 (오늘 할일)
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 범위 외)
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 갱신
|
@planet6897 님 15번째 사이클 PR 처리 완료입니다. 본 환경 검증 결과: 결정적 검증 통과:
광범위 회귀 sweep (`scripts/svg_regression_diff.sh`, 7 샘플 170 페이지): 핵심 케이스 영역의 본 환경 직접 재현 (SVG md5 비교):
작업지시자 시각 판정 ★ 통과: WASM 빌드 (`pkg/rhwp_bg.wasm` 4,573,826 bytes) 후 rhwp-studio 영역에서 synam-001 p15/p20/p21 클립 해소 + p5 추가 영향 영역 정합 확인. 처리: 옵션 A — 5 commits 단계별 보존 no-ff merge.
본질 정정 영역의 정확성: `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 |
본 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
…줄 클립 본질 정정 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 영역 본질 대체 영역
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 (머지+머지 패턴 신규 사례)
개요
이슈 #485 —
samples/synam-001.hwp15·20·21 페이지의 RowBreak 분할 표(PartialTable)에서 셀 마지막 줄이 본문 영역 하단 경계와 시각적으로 겹치며 글자 descender가 클립핑되던 결함을 정정.본질 정밀 측정 결과 두 개의 분리된 버그가 결합된 것으로 확인:
compute_cell_line_ranges의 inner break가 outer 루프를 빠져나오지 않아, 셀 마지막 단락(line_spacing 제외로 line_h 작아짐)이 abs_limit 안에 fit하여 시각 순서 역전 + 본문 경계 클립line_end_pos > abs_limit의 boundary 케이스에서02px 차이로 fit하면 cell-clip-rect bottom 침범정정
src/renderer/layout/table_layout.rs의compute_cell_line_ranges단일 함수 (3 hunk):limit_reached플래그 + outer 차단 (Bug-1) — abs_limit 도달 시 후속 단락 강제 미렌더, cell-last-line slip 제거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.rscompute_cell_line_ranges3 hunk (epsilon 상수 + limit_reached 플래그 + outer 차단)samples/synam-001.pdfmydocs/plans/task_m100_485.md,_impl.mdmydocs/working/task_m100_485_stage{1,2a,2b,3}.mdmydocs/report/task_m100_485_report.mdmydocs/orders/20260507.md검증
본 결함 해소
synam-001.hwpp15synam-001.hwpp20synam-001.hwpp21회귀 점검
자동 테스트
후속 작업
후보 A·D 의 본질인 typeset/layout height 측정 모델 통일 은 본 PR 범위 밖으로 분리 — 별도 이슈 #656 으로 등록.
Test plan
cargo test --release1231 passedsamples/synam-001.hwpp15/p20/p21 시각 검증 (PDF 대조)samples/kps-ai.hwpp56/67/68/69/70/72/73 회귀 점검 (Task kps-ai p56 외부 표 안 콘텐츠가 표 높이를 초과해 클립 (v0.7.3 대비 회귀) #362 의도 보존)samples/aift.hwp분할 표 회귀 점검closes #485