결함 본질
`hwp3-sample5.hwp` page 4 (HWP3 native): pi=74 그림 (User level programs/Kernel/Hardware 다이어그램, 126.4×94.5mm, Square wrap, tac=false) 의 우측에 wrap text (pi=75, "커널의 가장 밑바탕은...") 가 정상 배치되지 않고 그림 좌측 + 그림 위 + 그림 아래 에 산재. 한컴뷰어 와 시각 차이.
한컴뷰어 vs rhwp 비교
| 영역 |
한컴뷰어 (정답) |
rhwp (결함) |
| pi=74 그림 위치 |
body 좌측 |
body 좌측 ✓ |
| pi=75 텍스트 위치 |
그림 우측 wrap zone (단락 단위 흐름) |
그림 좌측+위+아래 산재, 그림과 겹침 |
데이터 검증 (`rhwp dump`)
```
--- 문단 0.74 --- cc=1, text_len=1, controls=1 [쪽나누기]
텍스트: ""
ls[0]: ts=0, vpos=0, lh=1440, th=900, bl=765, ls=0, cs=35460, sw=15564
[0] 그림: bin_id=1, common=35840×26788 (126.4×94.5mm), tac=false
위치: 가로=용지 오프셋=13.7mm, 세로=용지 오프셋=20.2mm
--- 문단 0.75 --- cc=415, text_len=415, controls=0
텍스트: "커널의 가장 밑바탕은 갖가지 종류의 하드웨어..."
ls[0]: ts=0, vpos=0, lh=1440, ..., cs=0, sw=0 ← ❌ wrap zone 미설정
ls[1]: ts=17, vpos=0, lh=1440, ..., cs=0, sw=0 ← ❌
ls[2]: ts=33, vpos=0, lh=1440, ..., cs=0, sw=0 ← ❌
ls[3]: ts=50, vpos=0, lh=1440, ..., cs=35460, sw=15564 ← ✓
ls[4~]: cs=35460, sw=15564 ← ✓
```
원인 추정
`src/parser/hwp3/mod.rs:1399-1407` (PR #589 보완6 머지 후) 의 `current_zone` 추적 로직:
```rust
let line_cs_sw = current_zone.and_then(|(cs, sw, pgy_start, pgy_end)| {
if pic_wrap_zone.is_some() || (linfo.pgy >= pgy_start && linfo.pgy < pgy_end) {
Some((cs, sw))
} else {
None
}
});
```
pi=75 의 첫 3 줄 `linfo.pgy` 값이 pi=74 그림의 wrap zone pgy 범위 (`pgy_start..pgy_end`) 밖 으로 판정되어 cs/sw=0 설정. 4번째 줄부터 pgy 가 wrap zone 안으로 진입하여 cs/sw 적용.
가능한 본질:
- HWP3 그림의 wrap zone pgy 범위 계산이 부정확 (`pic_wrap_zone` 의 pgy_start/pgy_end 산출)
- HWP3 LineSeg의 `pgy` 인코딩 의미 해석 오류
- `pic_wrap_zone.is_some()` 가드가 anchor 문단 (pi=74) 에만 적용되고 wrap text 문단 (pi=75) 은 line-level pgy 비교에 의존하는데, pi=74 와 pi=75 가 별개 문단이므로 pi=75 의 첫 줄 pgy 가 wrap zone 시작점보다 작을 가능성
영향 범위
- `samples/hwp3-sample5.hwp` page 4 (확인됨)
- 동일 패턴 (HWP3 Square wrap 그림 + 별도 wrap text 문단) 의 다른 페이지/파일 추정 영향
- `hwp3-sample5.hwp` page 8/16/22/27 등 (재검증 필요)
관련 PR / Task
분석 자료 (본 환경 jangster77 fork)
- `/tmp/hwp5_wrap_precomputed_analysis.md` — HWP5/HWPX wrap_precomputed 미적용 분석
- `/tmp/document_ir_wrap_zone_standard_review.md` — IR 표준 부재 본질
- `/tmp/document_ir_parser_relationship_analysis.md` — IR ↔ 각 파서 관계 16KB 분석
우선순위 / milestone
milestone: v1.0.0
priority: 시각 결함 (한컴뷰어 정합성 위배)
정정 방향 후보
본 분석은 정정 task 등록 후 본격적 옵션 비교 예정.
결함 본질
`hwp3-sample5.hwp` page 4 (HWP3 native): pi=74 그림 (User level programs/Kernel/Hardware 다이어그램, 126.4×94.5mm, Square wrap, tac=false) 의 우측에 wrap text (pi=75, "커널의 가장 밑바탕은...") 가 정상 배치되지 않고 그림 좌측 + 그림 위 + 그림 아래 에 산재. 한컴뷰어 와 시각 차이.
한컴뷰어 vs rhwp 비교
데이터 검증 (`rhwp dump`)
```
--- 문단 0.74 --- cc=1, text_len=1, controls=1 [쪽나누기]
텍스트: ""
ls[0]: ts=0, vpos=0, lh=1440, th=900, bl=765, ls=0, cs=35460, sw=15564
[0] 그림: bin_id=1, common=35840×26788 (126.4×94.5mm), tac=false
위치: 가로=용지 오프셋=13.7mm, 세로=용지 오프셋=20.2mm
--- 문단 0.75 --- cc=415, text_len=415, controls=0
텍스트: "커널의 가장 밑바탕은 갖가지 종류의 하드웨어..."
ls[0]: ts=0, vpos=0, lh=1440, ..., cs=0, sw=0 ← ❌ wrap zone 미설정
ls[1]: ts=17, vpos=0, lh=1440, ..., cs=0, sw=0 ← ❌
ls[2]: ts=33, vpos=0, lh=1440, ..., cs=0, sw=0 ← ❌
ls[3]: ts=50, vpos=0, lh=1440, ..., cs=35460, sw=15564 ← ✓
ls[4~]: cs=35460, sw=15564 ← ✓
```
원인 추정
`src/parser/hwp3/mod.rs:1399-1407` (PR #589 보완6 머지 후) 의 `current_zone` 추적 로직:
```rust
let line_cs_sw = current_zone.and_then(|(cs, sw, pgy_start, pgy_end)| {
if pic_wrap_zone.is_some() || (linfo.pgy >= pgy_start && linfo.pgy < pgy_end) {
Some((cs, sw))
} else {
None
}
});
```
pi=75 의 첫 3 줄 `linfo.pgy` 값이 pi=74 그림의 wrap zone pgy 범위 (`pgy_start..pgy_end`) 밖 으로 판정되어 cs/sw=0 설정. 4번째 줄부터 pgy 가 wrap zone 안으로 진입하여 cs/sw 적용.
가능한 본질:
영향 범위
관련 PR / Task
분석 자료 (본 환경 jangster77 fork)
우선순위 / milestone
milestone: v1.0.0
priority: 시각 결함 (한컴뷰어 정합성 위배)
정정 방향 후보
본 분석은 정정 task 등록 후 본격적 옵션 비교 예정.