Skip to content

HWPX ColorRef 상위 바이트 손실로 표 배경이 검게 렌더링됩니다 #606

@dicebattle

Description

@dicebattle

현상

HWPX 기반 문서를 SVG/PDF로 내보낼 때 일부 표의 내부 배경이 전부 검은색으로 렌더링됩니다. 두 샘플 모두 표의 선과 텍스트는 남아 있지만, 투명하거나 채우기 없음으로 처리되어야 할 셀 배경이 #000000 사각형으로 출력됩니다.

upstream devel 최신 커밋(0fcb372c069bf044b2439b15d8c7fd37589628d6) 기준으로도 아직 재현됩니다.

재현 방법

  1. HWPX 구조를 가진 HWP 샘플 문서를 준비합니다.
  2. devel 브랜치에서 CLI로 SVG/PDF를 내보냅니다.
    • cargo build --release --bin rhwp
    • target/release/rhwp export-svg 123kb.hwp -o /tmp/rhwp-devel-render/svg-123 -p 1
    • target/release/rhwp export-svg 74kb.hwp -o /tmp/rhwp-devel-render/svg-74 -p 0
    • target/release/rhwp export-pdf 123kb.hwp -o /tmp/rhwp-devel-render/pdf/123kb-devel.pdf
    • target/release/rhwp export-pdf 74kb.hwp -o /tmp/rhwp-devel-render/pdf/74kb-devel.pdf
  3. 문제가 발생하는 페이지를 확인합니다.
    • 123kb.hwp: 2페이지
    • 74kb.hwp: 1페이지

기대 결과

표 내부의 faceColor="#FF000000" / alpha="0" 조합은 검정 채우기가 아니라 투명 또는 채우기 없음으로 보여야 합니다. 표 내부 텍스트와 선이 흰 배경 위에서 보여야 합니다.

실제 결과

devel 기준 SVG에서 검정 사각형이 아래처럼 출력됩니다.

  • 123kb.hwp 2페이지: rect fill="#000000" 65개
  • 74kb.hwp 1페이지: rect fill="#000000" 31개

123kb.hwp 2페이지 비교

123kb.hwp page 2 before/after

74kb.hwp 1페이지 비교

74kb.hwp page 1 before/after

확인한 원인

HWPX faceColor#AARRGGBB 값을 파싱할 때 상위 바이트를 버리고 0x00BBGGRR로 변환하고 있습니다. 그래서 #FF0000000x00000000이 되고, 뒤쪽 렌더링 단계에서는 일반 검정색 채우기로 취급됩니다.

반면 style_resolver 쪽에는 ColorRef의 상위 바이트가 0이 아닌 경우 특수값 또는 확장값으로 보고 채우기 없음으로 처리하는 로직이 이미 있습니다. 따라서 #AARRGGBB0xAABBGGRR 형태로 보존하면 기존 로직이 의도대로 동작합니다.

수정 후보 검증 결과

별도 브랜치에서 #AARRGGBB의 상위 바이트를 보존하도록 바꿨을 때 두 샘플 모두 검정 배경이 사라졌습니다.

  • 123kb.hwp 2페이지: rect fill="#000000" 65개 → 0개
  • 74kb.hwp 1페이지: rect fill="#000000" 31개 → 0개

실행한 검증:

  • cargo test
  • cargo test --lib
  • cargo test --test svg_snapshot
  • cargo clippy -- -D warnings
  • 위 두 샘플의 SVG/PDF 내보내기 비교

환경

  • rhwp 버전: upstream devel 0fcb372c069bf044b2439b15d8c7fd37589628d6
  • 확인 경로: CLI export-svg, export-pdf
  • OS: macOS

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