Skip to content

fix: HWPX preset lineSegArray line_spacing double-count 해소 — sample16-hwp5 +1 페이지 감소 (closes #969, partial #942)#989

Closed
jangster77 wants to merge 2 commits into
edwardkim:develfrom
jangster77:local/task969
Closed

fix: HWPX preset lineSegArray line_spacing double-count 해소 — sample16-hwp5 +1 페이지 감소 (closes #969, partial #942)#989
jangster77 wants to merge 2 commits into
edwardkim:develfrom
jangster77:local/task969

Conversation

@jangster77

Copy link
Copy Markdown
Collaborator

Summary

Root cause

HWPX 파서가 XML <hp:linesegarray>vertsize=1299 HU (= 13pt font), spacing=779 HU (= 60% extra) 를 IR LineSeg 로 emit (합 = 160% of font).

format_paragraph 의 composed branch (typeset.rs:~1190):

  1. raw_lh = composer.line_height = 17.32 px (= 1299 HU)
  2. max_fs = 17.33 px (CharShape font_size = 13pt)
  3. raw_lh < max_fs 판정 (1 HU 미만 차이) → recompute 진입
  4. lh = max_fs * 1.6 = 27.7 px (= 160% — 이미 ls 의 60% 흡수)
  5. 그러나 line_spacing = 10.4 px 별도 가산 → 합 38.1 px / line (= 220% double-count)

HWP5 (preset 없음) 는 composer 가 line_spacing=0 으로 두므로 double-count 없음 → 일관성 깨짐.

Fix

src/renderer/typeset.rs — composed branch:

let recompute_lh = max_fs > 0.0 && raw_lh < max_fs;
let lh = if recompute_lh {
    let computed = match ls_type {
        LineSpacingType::Percent   => max_fs * ls_val / 100.0,
        LineSpacingType::Fixed     => ls_val.max(max_fs),
        LineSpacingType::SpaceOnly => max_fs + ls_val,
        LineSpacingType::Minimum   => ls_val.max(max_fs),
    };
    computed.max(max_fs)
} else {
    raw_lh
};
// [Task #969] lh 재계산이 ParaShape ls_type 기반으로 일어났다면
// preset 의 line_spacing 은 이미 재계산된 lh 에 흡수된 값 → 별도 가산 시 double-count.
let line_spacing_px = if recompute_lh { 0.0 } else {
    hwpunit_to_px(line.line_spacing, self.dpi)
};
(lh, line_spacing_px)

Verification

  • cargo test --release 전체 통과 (lib 1288 + integration svg_snapshot 8 + tab_cross_run 1, exit 0)
  • cargo fmt --check 통과 (rustfmt policy 정합)
  • ✅ 240 샘플 페이지 수 변동: 타깃 1 + side effect 1 (hwpx-02.hwpx 6→5, PDF 권위 없음)
  • ✅ 골든 SVG snapshot 변동 없음
  • ✅ pi=395 fmt_total: 53.2 → 42.8 (HWP5 와 정합)

Residual + 후속

D6 는 +8 페이지 inflate 의 1/8 해소 (1 페이지). 잔존 +7 페이지는 format_paragraph 영역 밖:

  • typeset_paragraph page break 결정 로직
  • table path (pi=394 가 has_table=true 분기, drift log 누락)
  • wrap_around / vpos-reset 상태 머신

→ 별도 #988 로 분리.

부모 #942 의 증상 B/C (z-order, 다이어그램 분리) 는 #988 해소 시 자연 회복 기대.

Test plan

  • cargo test --release 통과 확인
  • cargo fmt --check 통과 확인
  • samples/hwp3-sample16-hwp5.hwpx 71 페이지 확인
  • 다른 HWPX 샘플 회귀 없음 확인 (hwpx-02.hwpx side effect 만 변동)
  • 시각 회귀 없음 확인 (작업지시자 판정)

🤖 Generated with Claude Code

…t 해소 (partial)

format_paragraph 의 composed branch 에서 ParaShape line_spacing_type
(Percent/Fixed/SpaceOnly/Minimum) 재계산이 발동할 때 preset LineSeg 의
line_spacing 을 별도 가산하던 double-count 버그 해소.

Root cause:
HWPX 파서가 <hp:linesegarray> 의 vertsize/spacing 을 IR LineSeg 로
emit (lh=1299 HU, ls=779 HU = 합 160% of 13pt font). composer 가
ComposedLine 으로 복사 → format_paragraph 가 `raw_lh < max_fs` 판정 →
lh = max_fs * 1.6 = 27.7 px 로 재계산 (이미 160% 포함) → 그러나
preset ls = 10.4 px 별도 가산 → 38.1 px / line (= 220% double-count).

Fix:
재계산이 발동했을 때 (recompute_lh = true) line_spacing = 0 으로 처리.
HWP5 (preset 없음, ls=0) 와 동일 동작 정합.

효과:
- HWPX sample16-hwp5: 72 → 71 페이지 (-1)
- HWP5/HWP3 변종: 변동 없음
- 240 샘플 회귀: 1 건 (hwpx-02.hwpx 6→5, side effect)
- cargo test --release 전체 통과

잔존:
+8 페이지 inflate 의 1/8 해소. 잔존 +7 페이지는 typeset_paragraph
page break / table path / wrap_around 영역 — 별도 edwardkim#988 분리.

부모 edwardkim#942 의 증상 B/C 는 D6 만으로 해소 안 됨 (drift 해소 필요).

closes edwardkim#969

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@edwardkim edwardkim self-requested a review May 19, 2026 03:55
@edwardkim edwardkim added the enhancement New feature or request label May 19, 2026
@edwardkim edwardkim added this to the v1.0.0 milestone May 19, 2026
edwardkim pushed a commit that referenced this pull request May 19, 2026
- cherry-pick 631cf97 검증: test 1487 passed, clippy 0, fmt 0, WASM ok
- sample16-hwp5 72→71, hwpx-02 6→5 페이지 수 정확
- 시각 판정 통과, HWPX preset 한정 격리 (HWP5 무영향)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim pushed a commit that referenced this pull request May 19, 2026
…ine_spacing double-count 해소

외부 기여 (jangster77). cherry-pick + 검증 + 시각 판정 통과.
- recompute_lh 시 line_spacing 별도 가산 차단 (HWPX preset double-count)
- sample16-hwp5 72→71, hwpx-02 6→5 (side effect)
- HWPX preset 한정 격리, HWP5 무영향
- test 1487 passed, clippy 0, fmt 0, WASM ok, 골든 svg 변동 없음
- 잔존 +7 페이지는 #988 분리

검토: mydocs/pr/archives/pr_989_review.md / 보고: pr_989_report.md

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@edwardkim

Copy link
Copy Markdown
Owner

cherry-pick 으로 origin/devel 반영 완료 (merge 09b1bdf).

검증: cargo test 1487 passed, clippy 0, fmt 0, WASM 빌드 성공.
sample16-hwp5 72→71, hwpx-02 6→5 페이지 수 정확. 시각 판정 통과.
HWPX preset 한정 격리 (HWP5 무영향). 기여 감사합니다.

보고: mydocs/pr/archives/pr_989_report.md

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants