Skip to content

Task #674: paragraph_layout 측정 corrected_line_height 보정 — 마지막 줄 시각 클립 정정 (closes #674)#678

Closed
jangster77 wants to merge 3 commits into
edwardkim:develfrom
jangster77:local/task674
Closed

Task #674: paragraph_layout 측정 corrected_line_height 보정 — 마지막 줄 시각 클립 정정 (closes #674)#678
jangster77 wants to merge 3 commits into
edwardkim:develfrom
jangster77:local/task674

Conversation

@jangster77

Copy link
Copy Markdown
Collaborator

요약

calc_para_lines_heightcorrected_line_height 보정 누락이 본질 결함. line_segs 부재 셀 paragraph 의 fallback line_height (5.33 px) 가 폰트 보정 (21.33 px) 안 받아 mechanical_offset 잘못 계산 → text_y_start 24 px 위로 밀림 → 마지막 줄 cell-clip 영역 초과 → 시각 클립.

closes #674

⚠️ 의존성 — PR #673 (Task #671) + PR #675 (Task #672) 선행 머지 권장

본 PR 은 Task #671 + #672 정정 위에서 분기. 두 PR 머지 후 본 PR 의 diff 가 Task #674 단일 분기 정정으로 자동 축약.

본질 진단

samples/계획서.hwp 셀 [21] (r=5, c=1) text_y_start 결정:

[T674] cell[5,1] cell_y=353.49 pad_top=1.88 pad_bottom=1.88
[T674]   has_nested=false first_line_vpos=None effective_valign=Center
[T674]   inner_height=64.00 total_content_height=16.00
[T674]   text_y_start=379.37 (cell_y+pad_top=355.37, diff=+24.00)

결함 메커니즘

calc_composed_paras_content_height
  ↓
calc_para_lines_height (corrected_line_height 누락!)
  → line.line_height (raw 5.33 px) 그대로 사용
  → 3줄 × 5.33 = 16.00 (잘못된 측정)
  ↓
total_content_height = 16.00
  ↓
mechanical_offset = (inner_height 64 - total 16) / 2 = 24.00 (Center 정렬)
  ↓
text_y_start = cell_y + pad_top + 24.00 = 379.37 (24 px 위로 밀림)
  ↓
줄 2 y = 422.04 (cell-clip-81 끝 421.25 초과 → SVG 클립)

본질 정정

src/renderer/layout/table_layout.rs:746 calc_para_lines_height 시그니처에 styles 추가 + corrected_line_height 보정 적용 (height_measurer.rs:570-587 와 동일 로직).

let raw_lh = hwpunit_to_px(line.line_height, self.dpi);
let max_fs = line.runs.iter()
    .map(|r| styles.char_styles.get(r.char_style_id as usize)
        .map(|cs| cs.font_size).unwrap_or(0.0))
    .fold(0.0f64, f64::max);
let h = crate::renderer::corrected_line_height(
    raw_lh, max_fs, cell_ls_type, cell_ls_val);

호출자 시그니처 정정:

  • calc_cell_paragraphs_content_height → calc_para_lines_height(styles 추가)
  • calc_composed_paras_content_height → calc_para_lines_height(styles 추가)

정정 효과

항목 BEFORE AFTER
line_height 보정 없음 (raw 5.33) corrected (21.33) ✅
total_content_height (3줄) 16.00 64.00
mechanical_offset (Center) 24.00 0.00
text_y_start 379.37 355.37
줄 2 y 422.04 (clip 초과) 397.71 (clip 안)

회귀 위험 영역 좁힘

  • 단일 함수 (calc_para_lines_height) 보정 적용
  • height_measurer 와 동일 로직 — 측정/layout 일관성 정합
  • 정상 line_segs 인코딩 paragraph: corrected 결과가 raw 와 비슷 → 영향 미미
  • 광범위 sweep 차이 0 입증

검증

검증 영역 결과
cargo build --release
cargo test --lib --release 1155 passed (회귀 0)
cargo test --release --test svg_snapshot 6/6
cargo test --release --test issue_546 1/1
cargo test --release --test issue_554 12/12
cargo clippy --release ✅ 0 warnings

광범위 페이지네이션 회귀 sweep

영역 결과
BEFORE 187 fixtures / 2013 pages
AFTER 187 fixtures / 2013 pages
차이 0

시각 판정 ★ 통과

samples/계획서.hwp 1페이지 표:

BEFORE (task672) AFTER (task674)
[13] "탈레스 HSM 관리 시스템 및 REST API" 2줄 정상 2줄 정상 (회귀 0) ✅
[21] "목적" 2줄 (마지막 줄 클립) 3줄 모두 표시
[52] "특허 취득" 2 paragraph (◦특허의뢰 누락) 3 paragraph 모두 표시
다른 셀 회귀 0 ✅

Task #671 ~ #674 시리즈 완성

Task 본질 영역 정정 위치
#671 셀 paragraph line_segs 부재 → compose_lines 단일 ComposedLine 압축 composer.rs (recompose_for_cell_width) + 6개 호출 위치
#672 TAC 표 비례 축소 (작은 차이도 발동) height_measurer.rs:822 임계값 가드
#674 calc_para_lines_height corrected_line_height 누락 table_layout.rs:746 시그니처 + 보정

3 task 시리즈 완성 — samples/계획서.hwp 시각 결함 완전 해소.

산출물

영역 파일
코드 정정 src/renderer/layout/table_layout.rs (calc_para_lines_height + 호출자)
거버넌스 산출물 mydocs/plans/task_m100_674{,_impl}.md, mydocs/working/task_m100_674_stage{1,2,3}.md, mydocs/report/task_m100_674_report.md

커밋 시퀀스 (3 단계)

  • Stage 1: 본질 진단 — 24 px 오프셋 식별
  • Stage 2: 본질 정정 — calc_para_lines_height 시그니처 + corrected_line_height 보정
  • Stage 3: 광범위 회귀 sweep + 최종 보고서 + orders 갱신

@jangster77

Copy link
Copy Markdown
Collaborator Author

참고로 머지가 완료되면 계획서.hwp 는 repository 에서 삭제 부탁드립니다. 실제 회사 문서라서, 공개하지 않는게 좋아서요.

edwardkim added a commit that referenced this pull request May 8, 2026
closes #672

3 commits 단계별 보존 (Task #672 영역만 — Task #671 영역 commits 영역은 PR #673 영역에서 이미 머지됨):
- 071e952 Stage 1: 본질 진단 + 임계값 평가
- b524c4f Stage 2: 본질 정정 — TAC 표 비례 축소 임계값 강화
- d071d37 Stage 3: 광범위 회귀 sweep + 최종 보고서 + orders 갱신

본질 정정:
- src/renderer/height_measurer.rs:805 영역 단일 분기
- 정정 전: raw > common + 1.0 (절대값 1px 임계값)
- 정정 후: raw > common + max(common * 2%, 1px)
- 본질: 측정 오차 / line_height 보정 부산물 영역의 미세한 불일치 영역에서 비례
  축소 발동 영역 → 셀 콘텐츠 클립 영역. 한컴 권위 영역: 작은 차이 영역
  비례 축소 안 함 (계획서.hwp 1.32% 차이 영역 3 줄 정상 표시).
- 187 fixture sweep 영역: ≤2% 7 건 면제, ≥5% 11 건 그대로 (의도적 압축 보존)

본 환경 검증:
- cherry-pick: Task #672 commits 만 (Task #671 commits 는 PR #673 영역에서 머지됨)
  - Stage 1+2 깨끗, Stage 3 orders 영역 ours
- cargo test --release ALL PASS (1165 lib + svg_snapshot 7/7 + issue_546/issue_554 13/13)
- clippy clean
- 광범위 sweep 7 샘플 170 페이지: same=167 / diff=3
  - 2010-01-06 p5 (1.97% 차이 면제)
  - synam-001 p19 / p31 (0.38~0.94% 차이 면제)

작업지시자 가설 점검:
PR #673 영역의 A1 (자동보정 셀 폭 정정) 영역만으로는 본 PR 영역의 본질 영역 미해결 영역.
두 영역의 본질 영역 다름:
- A1: LINE_SEG 채움 영역의 셀 폭 영역 정정 영역
- Task #672: HeightMeasurer 영역의 row_heights 비례 축소 영역의 임계값 영역

PR: #675
컨트리뷰터: @jangster77 (Taesup Jang) — 14번째 사이클 PR
잔존 분리: Issue #674 → PR #678 (paragraph_layout 줄 위치 vs row_heights 정합)
edwardkim added a commit that referenced this pull request May 8, 2026
PR #675 (Task #672): TAC 표 비례 축소 임계값 강화 — 작은 차이 (≤2%) 면제
- merge commit: 877e020 (3 commits 단계별 보존 no-ff merge)
- 본질: height_measurer.rs:805 영역 단일 분기 — TAC_SHRINK_THRESHOLD_RATIO = 0.02
- 187 fixture sweep: ≤2% 7 건 면제 / ≥5% 11 건 보존
- 본 환경 결정적 검증 1165 lib + svg_snapshot 7/7 + issue_546/issue_554 13/13 + clippy clean
- 광범위 sweep 7 샘플 170 페이지: same=167 / diff=3 (영향 영역만)
- WASM 빌드 4,589,098 bytes

작업지시자 가설 점검:
"#674 PR 메인테이너 자동보정으로 #675 문제 해결?" → ❌ 미정합
- 그대로 보기 영역 SVG md5 다름 (b66efd77 → cc174155, -706 bytes)
- 두 영역 본질 다름:
  - PR #673 + A1: LINE_SEG 채움 영역의 셀 폭 정정 (document.rs)
  - PR #675: HeightMeasurer row_heights 비례 축소 임계값 (height_measurer.rs)

작업지시자 시각 판정:
- 자동보정 영역 ★ 정합 (셀내 2줄 컨텐츠 한컴처럼 정렬)
- 그대로 보기 영역 클립핑 유지 (PR #678 영역 잔존)
작업지시자 결정: 머지 유지 영역 (PR #678 머지 시 자연 해소 영역)

잔존 분리: Issue #674 → PR #678 (paragraph_layout 줄 위치 vs row_heights)

closes #672

산출물:
- mydocs/pr/archives/pr_675_review.md
- mydocs/pr/archives/pr_675_report.md
- mydocs/orders/20260508.md 갱신
jangster77 added 3 commits May 8, 2026 19:25
수행계획서 / 구현계획서 작성 + Stage 1 진단 보고서.

본질 진단:
- samples/계획서.hwp 셀 [21] (r=5,c=1) 의 paragraph layout 시작 위치
  text_y_start = 379.37 (이론값 cell_y + pad_top = 355.37 보다 24px 큼)
- effective_valign=Center, total_content_height=16.00 (잘못!)
- mechanical_offset = (64 - 16) / 2 = 24.00 (Center 정렬 보정)

본질 결함 위치:
- table_layout.rs:746 calc_para_lines_height 가 line.line_height
  (raw 5.33 px) 그대로 사용 — corrected_line_height 보정 누락
- line_segs 부재 paragraph fallback line_height (400 HU = 5.33 px) 가
  폰트 크기 기반 보정 (21.33 px) 안 받음 → 3줄 × 5.33 = 16 잘못 측정
- height_measurer.rs / paragraph_layout.rs 는 corrected 값 사용 (정합)
  → table_layout.rs 의 calc_para_lines_height 만 누락

refs edwardkim#674
본질: calc_para_lines_height 가 line.line_height (raw 5.33 px) 그대로
사용 — corrected_line_height 보정 누락. height_measurer.rs / paragraph_layout
은 corrected 사용 (21.33 px). 측정/layout 불일치로 인해 line_segs 부재
paragraph 의 mechanical_offset (Center 정렬) 잘못 계산 → text_y_start
24px 위로 밀림 → 마지막 줄 cell-clip 영역 초과 → 시각 클립.

정정: table_layout.rs:746 calc_para_lines_height 시그니처에 styles 추가
+ corrected_line_height 보정 적용 (height_measurer.rs:570-587 와 동일).

호출자 시그니처 정정:
- calc_cell_paragraphs_content_height → calc_para_lines_height(styles 추가)
- calc_composed_paras_content_height → calc_para_lines_height(styles 추가)

정정 효과:
- total_content_height (3줄): 16.00 → 64.00 ✅
- mechanical_offset (Center): 24.00 → 0.00 ✅
- text_y_start: 379.37 → 355.37 (cell_y + pad_top, 정확) ✅
- 줄 2 y: 422.04 (clip 초과) → 397.71 (clip 안) ✅

검증:
- cargo test --lib --release: 1155 passed (회귀 0)
- svg_snapshot 6/6 / issue_546 1/1 / issue_554 12/12 / clippy 0
- 시각 판정 ★: 셀 [21] 3줄 모두 표시 + 셀 [52] 3 paragraph 모두 표시

refs edwardkim#674
광범위 페이지네이션 회귀 sweep:
- 187 fixtures / 2013 pages BEFORE/AFTER
- 차이 0 (회귀 위험 영역 완전 좁힘 입증)

본 task 본질 영역 정정 완료:
- calc_para_lines_height 시그니처 + corrected_line_height 보정 적용
- 측정/layout 일관성 정합 (height_measurer 와 동일 로직)
- 회귀 위험 좁힘 (정상 인코딩 paragraph 영향 미미)

시각 판정 ★ 통과:
- 셀 [21] "목적" 3줄 모두 표시 (마지막 줄 정상 표시)
- 셀 [52] "특허 취득" 3 paragraph 모두 표시
  (◦특허사무소 검토 / ◦자료제공 / ◦특허의뢰)
- 다른 셀 회귀 0

Task edwardkim#671 ~ edwardkim#674 시리즈 완성:
- edwardkim#671: 셀 paragraph line_segs 부재 → 줄겹침 (composer.rs)
- edwardkim#672: TAC 표 비례 축소 (height_measurer.rs:822 임계값)
- edwardkim#674: calc_para_lines_height corrected_line_height 누락 (table_layout.rs)

samples/계획서.hwp 시각 결함 완전 해소.

산출물:
- mydocs/report/task_m100_674_report.md — 최종 결과 보고서
- mydocs/working/task_m100_674_stage3.md — Stage 3 단계별 보고서
- mydocs/orders/20260507.md — Task edwardkim#674 상태 갱신

closes edwardkim#674
edwardkim added a commit that referenced this pull request May 8, 2026
…보정 — 마지막 줄 시각 클립 정정

closes #674

3 commits 단계별 보존 (Task #674 영역만 — Task #671/#672 영역 commits 영역은 PR #673/#675 영역에서 머지됨):
- fda8601 Stage 1: 본질 진단 — 24px 오프셋 식별
- f50297b Stage 2: 본질 정정 — calc_para_lines_height 보정
- 230099f Stage 3: 광범위 회귀 sweep + 최종 보고서 + orders 갱신

본질 정정:
- src/renderer/layout/table_layout.rs:746 영역 calc_para_lines_height 영역 시그니처 영역
  + corrected_line_height 영역 보정 적용 (height_measurer.rs 영역과 동일 로직)
- 호출자 영역 시그니처 정정: calc_cell_paragraphs_content_height + calc_composed_paras_content_height
- 본질: line_segs 부재 셀 paragraph 영역의 fallback line_height (raw 5.33px) 영역이
  폰트 보정 (corrected 21.33px) 영역 안 받아 영역 mechanical_offset 영역 잘못 계산 영역
  → text_y_start 영역 24px 위로 밀림 영역 → 마지막 줄 cell-clip 초과 영역 → 시각 클립 영역

본 환경 검증:
- cherry-pick: Task #674 commits 만 (Task #671/#672 영역은 PR #673/#675 영역에서 머지)
  - Stage 1+2 깨끗, Stage 3 orders 영역 ours
- cargo test --release ALL PASS (1165 lib + svg_snapshot 7/7 + issue_546/issue_554 13/13)
- clippy clean
- 광범위 sweep 7 샘플 170 페이지: same=170 / diff=0 ✅

Task #671 ~ #674 시리즈 완성:
- #671: 셀 paragraph line_segs 부재 영역 — composer.rs (recompose_for_cell_width)
- #672: TAC 표 비례 축소 영역 임계값 — height_measurer.rs:822 (2% 가드)
- #674: calc_para_lines_height corrected_line_height 영역 — table_layout.rs:746

PR: #678
컨트리뷰터: @jangster77 (Taesup Jang) — 15번째 사이클 PR (HWP 3.0 파서 영역의 핵심 영역)
선행 PR: #673 (Task #671) + #675 (Task #672) 영역 머지 영역 후 영역
edwardkim added a commit that referenced this pull request May 8, 2026
…즈 완성)

PR #678 (Task #674): paragraph_layout 측정 corrected_line_height 보정
- merge commit: f8b38cc (3 commits 단계별 보존 no-ff merge)
- 본질: calc_para_lines_height 영역의 corrected_line_height 보정 누락 영역
  → 24px 영역 mechanical_offset 잘못 계산 → text_y_start 24px 위로 밀림 → 클립
- 정정: table_layout.rs:746 영역 시그니처 + 보정 + 호출자 시그니처 정정
- 본 환경 결정적 검증 1165 lib + svg_snapshot 7/7 + issue_546/issue_554 13/13 + clippy clean
- 광범위 sweep 7 샘플 170 페이지: same=170 / diff=0 ✅
- WASM 빌드 4,589,700 bytes
- 작업지시자 시각 판정 ★ 통과 (그대로 보기 + 자동보정 영역 모두 정합)

🎉 Task #671~#674 시리즈 완성:
- PR #673 (#671) — 셀 paragraph line_segs 부재 영역 → composer.rs (recompose_for_cell_width)
- A1 (메인테이너) — 자동보정 col_width → cell_inner_width (document.rs)
- PR #675 (#672) — TAC 표 비례 축소 임계값 → height_measurer.rs (2% 가드)
- PR #678 (#674) — calc_para_lines_height corrected_line_height → table_layout.rs

@jangster77 (Taesup Jang) — 15번째 사이클 PR (HWP 3.0 파서 영역 핵심 컨트리뷰터)
한컴 LINE_SEG 비표준 영역의 자체 재계산 영역 정합 영역 도달 영역 (project_hancom_lineseg_behavior)

closes #674

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

Copy link
Copy Markdown
Owner

@jangster77 님 15번째 사이클 PR 처리 완료입니다 — Task #671~#674 시리즈 완성 🎉

본 환경 검증 결과:

결정적 검증 통과:

  • `cargo test --release` → ALL PASS (1165 lib + svg_snapshot 7/7 + issue_546/issue_554 13/13)
  • `cargo clippy --release` → clean

광범위 회귀 sweep (7 샘플 170 페이지): same=170 / diff=0 ✅

작업지시자 시각 판정 ★ 통과:

"웹 에디터 검증 통과입니다. 이제 그대로 보기에서도 조판이 정상 동작합니다."

→ 그대로 보기 + 자동보정 영역 모두 정합 영역. PR #675 영역의 잔존 영역 (그대로 보기 영역의 클립핑 영역) 영역 자연 해소 영역.

처리: 3 commits 단계별 보존 no-ff merge.

  • merge commit: `f8b38cca`
  • devel push: `99af3c9f..ff0c7d3`

Task #671~#674 시리즈 완성 — 4 단계 영역 본질 분리 영역의 누적 영역:

→ 한컴 LINE_SEG 비표준 영역의 자체 재계산 영역 정합 영역 도달 영역 (`samples/계획서.hwp` 영역의 본 환경 영역의 시각 결함 영역 완전 해소 영역).

본질 정정 영역의 정확성: `table_layout.rs:746` 영역 영역 `calc_para_lines_height` 영역 시그니처 영역에 `styles` 영역 추가 + `corrected_line_height` 영역 보정 적용 영역 (`height_measurer.rs` 영역과 동일 로직 영역). 호출자 영역 시그니처 정정 (calc_cell_paragraphs_content_height + calc_composed_paras_content_height).

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

@jangster77 영역의 4 단계 영역 본질 분리 영역의 깔끔한 영역 정합 영역 영역 영역 정합 영역 영역 깊이 영역 감사 영역. HWP 3.0 파서 영역에서 영역 본 시리즈 영역까지 영역 누적 기여 영역 정합 영역.

closes #674

@jangster77

Copy link
Copy Markdown
Collaborator Author

계획서.hwp 는 sample 에서 삭제 부탁드립니다. 실제 회사 문서라서, 공개하지 않는게 좋아서요.

@edwardkim

Copy link
Copy Markdown
Owner

계획서.hwp 는 sample 에서 삭제 부탁드립니다. 실제 회사 문서라서, 공개하지 않는게 좋아서요.

네. 삭제하겠습니다.

@jangster77

jangster77 commented May 8, 2026 via email

Copy link
Copy Markdown
Collaborator Author

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