Skip to content

fix: Layout 리팩터링 Phase 2 line_break_char_idx 다중화 누락 회귀 정정 (Task #518 재적용, closes #648)#650

Open
planet6897 wants to merge 2 commits intoedwardkim:develfrom
planet6897:pr-task648
Open

fix: Layout 리팩터링 Phase 2 line_break_char_idx 다중화 누락 회귀 정정 (Task #518 재적용, closes #648)#650
planet6897 wants to merge 2 commits intoedwardkim:develfrom
planet6897:pr-task648

Conversation

@planet6897
Copy link
Copy Markdown
Contributor

개요

이슈 #648 정정. Task #518 (Layout 리팩터링 Phase 2 — line_break_char_idx: Option<usize>line_break_char_indices: Vec<usize> 다중화) 의 원 commit b395e8e6 를 cherry-pick 재적용. 이슈 #496 본질 (B) ls[2..] break 미사용 결함 해결.

⚠️ 의존성 — 본 PR 은 PR #649 (Task #517) 선행 머지 필요

본 PR 의 LAYOUT_BREAK_INDICES 디버그 로깅은 PR #649 가 도입한 layout_debug_enabled() 헬퍼에 의존합니다. 따라서 PR #649 선행 머지 → 본 PR 자동 1 commit 축약 → 머지 순으로 진행 권장.

현재 본 PR 은 head=pr-task648 (= pr-task647 + Task #518 commit) 으로 구성되어 있어 GitHub 상에는 2 commit 으로 표시됩니다. PR #649 머지 후에는 본 PR diff 가 b395e8e6 단일 commit 으로 자동 축약됩니다.

회귀 메커니즘

이슈 #618 (Task #519) → PR #620, 이슈 #647 (Task #517) → PR #649 와 동일 패턴: 묶음 머지 a7e43f9 (Task #517/#518/#519/#520/#521/#523/#528)local/devel 에는 머지되었으나 stream/devel 으로 승격되지 않음.

$ git merge-base --is-ancestor b395e8e6 stream/devel
NOT in stream/devel

$ git grep -n "line_break_char_idx" stream/devel -- src/
stream/devel:src/renderer/layout/paragraph_layout.rs:265: let line_break_char_idx: Option<usize> = ...
stream/devel:src/renderer/layout/paragraph_layout.rs:398: if let Some(break_idx) = line_break_char_idx {

→ Task #518 이전 단일 break 시그니처 그대로.

변경 내역

원 commit b395e8e6git cherry-pick -x 로 그대로 적용 (충돌 없음).

핵심 변경 (src/renderer/layout/paragraph_layout.rs -40/+77):

항목 회귀 (이전) 정정
변수 line_break_char_idx: Option<usize> line_break_char_indices: Vec<usize>
사용 범위 ls[1] ls[1..] 모두
알고리즘 ctrl_gap 합산 (controls 많은 paragraph 에서 over-subtract → saturating 0 → 항상 None) char_offsets[i] >= ts 인 첫 i 직접 룩업
wrap 결정 단일 break_idx 검사 next_break 추적 + 다중 break 검사
디버그 LAYOUT_BREAK_INDICES 로깅 추가

검증

$ cargo build
Finished `dev` profile

$ cargo test --release --lib
test result: ok. 1141 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out

회귀 케이스 (원 commit 보고 인용): exam_science p2 pi=61 본문 1줄 column 폭 초과 → 3줄 정상 wrap (ls[1] break char 5 + ls[2] break char 28). 7 샘플 170 페이지 중 same=167 / diff=3 (exam_science 정확도 정정).

참고

planet6897 added 2 commits May 7, 2026 08:49
Stage 1: RHWP_LAYOUT_DEBUG=1 env logging
- paragraph_layout.rs 에 layout_debug_enabled() + layout_inline_table_paragraph 진단 로깅
- 출력: pi/sec/col_x/col_w/y_start/ls_count/tables + 각 ls/inline_tbl 상세
- env-var-checked → 기본 동작 변경 없음

Stage 2: scripts/svg_regression_diff.sh
- build mode: 두 ref 자동 빌드 + 광범위 비교
- diff mode: 두 디렉토리 byte 비교
- 기본 7 샘플 170 페이지 커버

검증:
- cargo test --release: 1103 passed
- svg_regression_diff.sh build devel HEAD: 170/170 byte 동일, diff=0
- exam_science p2 pi=61 logging: ls_count=3 tables=1 rows=2 확인

Phase 2~4 본질 정정의 측정·재현·검증 인프라 마련.

(cherry picked from commit 9c16a1b)
paragraph_layout.rs:layout_inline_table_paragraph 줄 나눔 위치 결정 정확도 향상.

핵심 변경:
- line_break_char_idx: Option<usize> → line_break_char_indices: Vec<usize>
  → ls[1..] 모두 사용 (이전엔 ls[1] 만)
- ctrl_gap 기반 algorithm → 직접 char_offsets 룩업
  → 이전: paragraph 전체 controls 합으로 over-subtract → controls 많은 paragraph 에서 saturating 0 으로 항상 None
  → 신규: char_offsets[i] >= ts 인 첫 i 가 break char index (간결 + 정확)
- wrap 조건에 next_break 추적 추가
- LAYOUT_BREAK_INDICES 디버그 로깅 추가

검증:
- edwardkim#496 재현 케이스 (exam_science p2 pi=61): 본문 1줄 column 폭 초과 → 3줄 정상 wrap
  ls[1] break (char 5) + ls[2] break (char 28) 적용
- 회귀: 7 샘플 170 페이지 중 same=167 / diff=3 (exam_science 정확도 정정)
  exam_kor/exam_eng/exam_math/synam-001/aift/2010-01-06 byte 동일
- cargo test --release --lib: 1103 passed

edwardkim#496 본질 (B) ls[2..] break 미사용 해결. (A) baseline 정렬 / (C) 인라인 vs 블록 은 Phase 3/4 영역.

(cherry picked from commit b395e8e)
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