현상
HWP3 파일에서 텍스트와 Para-relative TopAndBottom 그림이 동일 단락에 존재하는 혼합 단락의 경우, 렌더러가 텍스트를 연속 reflow하여 그림 위에 겹쳐 표시됨.
재현: samples/hwp3-sample.hwp page 8, pi=76 (NAT에 의한 가상 서버의 구조)
원인
HWP3 저장 방식: 한컴은 각 텍스트 줄의 절대 위치(vpos)를 LINE_SEG에 사전 계산하여 저장한다. 그림 위/아래 텍스트 줄은 서로 다른 vpos 범위를 가지며, 그림 영역을 건너뛰도록 배치된다.
우리 렌더러: LINE_SEG vpos를 무시하고 텍스트를 연속 reflow(HWP5 방식)하여 배치하므로, 그림 vert_offset 이후 텍스트가 그림 위에 겹침.
분석 데이터 (hwp3-sample.hwp pi=76)
- 단락 시작 vpos: 365220 hunit
- 그림 vert_offset: 8400 hunit → 그림 상단 y = 373620 hunit
- 그림 높이: 36300 hunit → 그림 하단 y = 409920 hunit
- LINE_SEG:
- ls[0]
ls[5] (vpos 365220373220): 그림 위 — 정상
- ls[6]
ls[12] (vpos 374820384420): 그림 범위 내 — 겹침 발생
근본 수정 방법
LINE_SEG vpos를 사용하여 각 텍스트 줄을 절대 위치에 배치하는 vpos 기반 레이아웃 구현:
compose_paragraph()에서 LINE_SEG의 vpos를 cumulative height 대신 사용
- 그림 범위 내 vpos를 가진 줄은 건너뜀 (TopAndBottom wrap)
- 그림 아래 vpos를 가진 줄은
vert_offset + fig_height 이후에 배치
이 변경은 렌더러 레이아웃 엔진의 전면 수정을 필요로 하며 HWP3 전용 분기가 요구됨.
영향 범위
src/renderer/layout/paragraph_layout.rs — compose_paragraph()
src/renderer/layout/picture_footnote.rs — layout_body_picture()
src/renderer/pagination/engine.rs — 페이지네이터 높이 계산
알려진 기존 overflow (vpos 불일치로 인한 파생 문제)
| 위치 |
overflow |
| page 3 pi=41 Shape |
136px |
| page 8 pi=78 Shape |
124px |
| page 10 pi=97 Shape |
16px |
Task #417 Stage 2에서 발견, 별도 이슈로 분리.
현상
HWP3 파일에서 텍스트와 Para-relative TopAndBottom 그림이 동일 단락에 존재하는 혼합 단락의 경우, 렌더러가 텍스트를 연속 reflow하여 그림 위에 겹쳐 표시됨.
재현:
samples/hwp3-sample.hwppage 8, pi=76 (NAT에 의한 가상 서버의 구조)원인
HWP3 저장 방식: 한컴은 각 텍스트 줄의 절대 위치(vpos)를 LINE_SEG에 사전 계산하여 저장한다. 그림 위/아래 텍스트 줄은 서로 다른 vpos 범위를 가지며, 그림 영역을 건너뛰도록 배치된다.
우리 렌더러: LINE_SEG vpos를 무시하고 텍스트를 연속 reflow(HWP5 방식)하여 배치하므로, 그림 vert_offset 이후 텍스트가 그림 위에 겹침.
분석 데이터 (hwp3-sample.hwp pi=76)
ls[5] (vpos 365220373220): 그림 위 — 정상ls[12] (vpos 374820384420): 그림 범위 내 — 겹침 발생근본 수정 방법
LINE_SEG vpos를 사용하여 각 텍스트 줄을 절대 위치에 배치하는 vpos 기반 레이아웃 구현:
compose_paragraph()에서 LINE_SEG의 vpos를 cumulative height 대신 사용vert_offset + fig_height이후에 배치이 변경은 렌더러 레이아웃 엔진의 전면 수정을 필요로 하며 HWP3 전용 분기가 요구됨.
영향 범위
src/renderer/layout/paragraph_layout.rs— compose_paragraph()src/renderer/layout/picture_footnote.rs— layout_body_picture()src/renderer/pagination/engine.rs— 페이지네이터 높이 계산알려진 기존 overflow (vpos 불일치로 인한 파생 문제)
Task #417 Stage 2에서 발견, 별도 이슈로 분리.