Skip to content

fix: HWPX ColorRef 상위 바이트 보존#607

Open
dicebattle wants to merge 1 commit intoedwardkim:develfrom
dicebattle:fix/hwpx-colorref-alpha-byte
Open

fix: HWPX ColorRef 상위 바이트 보존#607
dicebattle wants to merge 1 commit intoedwardkim:develfrom
dicebattle:fix/hwpx-colorref-alpha-byte

Conversation

@dicebattle
Copy link
Copy Markdown

변경 요약

HWPX 색상 문자열 #AARRGGBB를 HWP ColorRef로 변환할 때 상위 바이트를 버리지 않고 보존하도록 수정했습니다.

이번 문제에서는 faceColor="#FF000000" / alpha="0" 조합이 들어간 표 배경이 검정색으로 렌더링되고 있었습니다. 기존 파서는 #FF0000000x00000000으로 바꿨고, 이 값이 뒤쪽 렌더링 단계에서 일반 검정 채우기로 처리되었습니다.

style_resolver 쪽에는 이미 ColorRef의 상위 바이트가 0이 아닌 경우 특수값 또는 확장값으로 보고 채우기 없음으로 처리하는 로직이 있으므로, 파서에서 #AARRGGBB0xAABBGGRR 형태로 보존하게 바꾸는 것이 가장 작은 수정 범위라고 판단했습니다.

추가로 parse_color_str 단위 테스트에서 #FF000000, #FFFFFFFF, 반투명 예시의 상위 바이트 보존을 검증하도록 기대값을 갱신했습니다.

관련 이슈

closes #606

테스트

  • cargo test 통과
  • cargo clippy -- -D warnings 통과
  • 관련 샘플 파일로 SVG 내보내기 확인
    • 123kb.hwp 2페이지: rect fill="#000000" 65개 → 0개
    • 74kb.hwp 1페이지: rect fill="#000000" 31개 → 0개
  • 웹(WASM) 렌더링 확인 (이번 검증은 CLI export-svg / export-pdf 경로에서 수행했습니다)

추가로 실행한 검증:

  • cargo test --lib
  • cargo test --test svg_snapshot
  • cargo build --release --bin rhwp
  • target/release/rhwp export-pdf로 두 샘플 PDF 재생성 후 비교

스크린샷

123kb.hwp 2페이지

123kb.hwp page 2 before/after

74kb.hwp 1페이지

74kb.hwp page 1 before/after


이 PR의 코드 변경과 본문 작성에는 AI 도구(Codex)가 사용되었습니다.

edwardkim added a commit that referenced this pull request May 5, 2026
v0.7.9 후속 patch 사이클 (5/4 ~ 5/6).

## 신규 기능

- **CLI 바이너리 릴리즈** (Issue #608/#612, @almet 의 요청)
  - 4 플랫폼 GitHub Release 자산 첨부 (Linux x86_64 / macOS x86_64+aarch64 /
    Windows x86_64) + SHA-256 체크섬
- **PNG raster backend** (PR #599, @seo-rii) — render P4 단계
  - native Skia 기반 PageLayerTree → PNG export, native-skia feature gate
  - **AI 파이프라인 + VLM 연동 도입** (메인테이너 후속 정정):
    - --vlm-target claude (1568 longest edge / 1.15 MP, Claude Vision 정합)
    - --scale / --max-dimension (자동 scale 계산)
    - export-png CLI 명령 + 매뉴얼 (한글 + 영문 dual)
    - 한글 폰트 fallback chain + char 단위 fallback (공백 두부 정정) +
      --font-path 동적 로딩

## 외부 PR cherry-pick (13 PR / 7 컨트리뷰터)

- @planet6897 / Jaeook Ryu (협업): PR #587/#589/#561/#564/#570/#575/
  #580/#584/#592/#593/#567
- @oksure (Hyunwoo Park): PR #600 (closes #513)
- @seo-rii: PR #599 (refs #536)
- @cskwork / @johndoekim / @nameofSEOKWONHONG / @jangster77 — 사이클 누적

## 메인테이너 정정

Skia 폰트 영역 5개 정정 (한글 fallback / font-path / char-fallback /
VLM 옵션 / export-png CLI).

## 인프라

- CI 빌드 안정성 (Cargo.toml [[example]] required-features)
- 광범위 페이지네이션 회귀 sweep 도구 (164 fixture / 1,614 페이지 자동)

## 후속 이슈

- #613 (VLM 프리셋 확장)
- #614 (DPI 메타데이터)
- #615 (pua_oldhangul.rs U+F53A 한컴 정합)
- #598 (rhwp-studio 각주 삭제, 외부 컨트리뷰터 공개)

## 잔여 PR (v0.7.11 후속 patch)

PR #601, #602 (@oksure) / PR #607 (@dicebattle) / PR #609 (@jangster77,
Task #604) / PR #611 (@kihyunnn).

상세: CHANGELOG.md (한글) / CHANGELOG_EN.md (영문).
@edwardkim
Copy link
Copy Markdown
Owner

@dicebattle 님 안녕하세요. 첫 PR 환영합니다. 검토 진행 중 안내 한 가지 드립니다.

시각 판정 자료 영역

본 PR 의 본질 (#AARRGGBB 8자리 색상 상위 바이트 보존) + Issue #606 의 자기 진단 (PR 본문 전부 한글 + before/after 정량 측정 + 검증 결과까지) 모두 매우 정합하게 작성되어 있어 본 환경 결정적 검증 (cargo test 1140 passed / clippy 0 / svg_snapshot 6/6 / 광범위 페이지네이션 sweep 164 fixture 회귀 0) 통과를 확인했습니다.

다만 본 환경 samples/ 폴더에 123kb.hwp / 74kb.hwp 샘플이 없어 메인테이너 직접 시각 판정이 어려운 상황입니다. 본 환경 fixture 11개 (HWPX 6 + exam_* 5) 측정 결과 BEFORE/AFTER 모두 rect fill="#000000" 0건으로 동일하여, 이 결함이 발현되는 faceColor="#FF000000" + alpha="0" 조합 자체가 흔치 않은 엣지 케이스로 확인됩니다.

보완 요청 사항

본 PR 머지 전 가능하다면 다음 두 가지 함께 부탁드립니다:

  1. 샘플 파일 동봉123kb.hwp / 74kb.hwp 를 PR 에 포함해주시면 (samples/ 폴더 또는 별도 samples/issue-606/ 영역) 메인테이너가 직접 시각 판정 가능 + 본 사이클 회귀 차단 영역으로 영구 보존
  2. 한컴 버전 정보 — 두 샘플 파일이 한컴 한글 어떤 버전 (예: 2018 / 2020 / 2022 / 웹기안기 / 한컴오피스 X 등) 으로 작성/저장됐는지 알려주시면 좋겠습니다 (#AARRGGBB + alpha="0" 조합이 어떤 작성 환경에서 발현되는지 영역 정합)

이 두 자료가 추가되면 본 PR 의 본질 영역 (HWPX 8자리 색상 + 알파 채널) 회귀 차단 가드로 영구 보존되어, 향후 다른 영역 정정에서도 본 결함 재발 차단이 가능해집니다.

본 환경 측정 요약 (참고)

  • cargo test --lib --release: 1140 passed (회귀 0)
  • cargo clippy --release --lib: 0건
  • cargo test --release --test svg_snapshot --test issue_546 --test issue_554: 모두 통과
  • 광범위 페이지네이션 sweep: 164 fixture / 1,684 페이지 / 차이 0
  • Docker WASM 빌드: 4,588,198 bytes
  • 본 환경 11 fixture rect fill="#000000" 측정: BEFORE 0 / AFTER 0 (본 환경 미발현)

본 PR 의 진단 (HWP5 read_color_ref 는 4바이트 그대로 보존하는데 HWPX parse_color_str 만 상위 바이트 손실 → HWP5/HWPX 비정합) + 정정 (#AARRGGBB0xAABBGGRR 보존) 의 본질이 매우 정확합니다. style_resolver.rs:700(s.background_color >> 24) != 0 체크가 이미 의도된 fix 영역으로 자리잡고 있어 본 PR 의 작은 변경 (단일 함수 +9/-5) 으로 깨끗하게 해결되는 패턴이 우수합니다.

샘플 파일 + 한컴 버전 정보 추가 후 메인테이너 시각 판정 → 머지 단계로 진행하겠습니다. 수고하셨습니다.

@dicebattle
Copy link
Copy Markdown
Author

준비해서 보강하겠습니다. 코멘트 감사드립니다.

edwardkim added a commit that referenced this pull request May 6, 2026
- @dicebattle (Sunyong Lim) 첫 PR 검토
- Task #606 HWPX ColorRef 상위 바이트 보존 (단일 파일 +9/-5)
- 본 환경 검증: cargo test 1140 passed / clippy 0 / svg_snapshot 6/6
- 광범위 sweep: 164 fixture / 1,684 페이지 / 차이 0
- WASM: 4,588,198 bytes
- 본 환경 샘플 (123kb.hwp/74kb.hwp) 미존재 → 시각 판정 자료 부재
- 컨트리뷰터에게 샘플 동봉 + 한컴 버전 정보 보완 요청 댓글 등록

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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.

3 participants