Skip to content

HWP3: 혼합 단락(텍스트+Para-relative 그림) 내 텍스트/그림 겹침 (vpos 미사용) #425

@jangster77

Description

@jangster77

현상

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 기반 레이아웃 구현:

  1. compose_paragraph()에서 LINE_SEG의 vpos를 cumulative height 대신 사용
  2. 그림 범위 내 vpos를 가진 줄은 건너뜀 (TopAndBottom wrap)
  3. 그림 아래 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에서 발견, 별도 이슈로 분리.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions