Task #606: HWPX ColorRef 상위 바이트(alpha) 보존 — 표 배경 검정 렌더링 수정#744
Conversation
parse_color_str에서 #AARRGGBB 파싱 시 alpha 바이트를 버리고 0x00BBGGRR로 변환하던 문제를 0xAABBGGRR로 보존하도록 수정. style_resolver의 기존 로직(상위 바이트 비제로 → 채우기 없음)이 의도대로 동작하여 투명 배경이 검정으로 렌더링되는 결함 해소. 직렬화 경로(color_hex, color_ref_to_hwpx)도 alpha 비제로 시 #AARRGGBB 형식으로 출력하도록 수정하여 라운드트립 보존. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
HWPX 색상 문자열(faceColor="#AARRGGBB") 파싱/직렬화 과정에서 상위 바이트(예약/alpha 바이트)가 소실되어, 일부 표 배경이 검정으로 렌더링되는 문제(#606)를 해결하기 위한 변경입니다.
Changes:
parse_color_str가#AARRGGBB입력을0xAABBGGRR로 변환하도록 상위 바이트를 보존- HWPX 직렬화 시 상위 바이트가 0이 아닌 ColorRef를
#AARRGGBB로 출력 - 관련 테스트를 갱신하고 케이스를 추가
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 3 comments.
| File | Description |
|---|---|
src/parser/hwpx/utils.rs |
#AARRGGBB 파싱 시 상위 바이트를 보존하도록 수정 + 테스트 보강 |
src/serializer/hwpx/header.rs |
ColorRef를 HWPX hex로 직렬화할 때 상위 바이트 보존 출력 지원 |
src/serializer/hwpx/section.rs |
섹션 직렬화에서 ColorRef를 #RRGGBB/#AARRGGBB로 출력하도록 확장 |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| if a == 0 { | ||
| format!("#{:02X}{:02X}{:02X}", r, g, b) | ||
| } else { | ||
| format!("#{:02X}{:02X}{:02X}{:02X}", a, r, g, b) | ||
| } |
|
|
||
| fn color_hex(c: ColorRef) -> String { | ||
| // ColorRef = u32. HWP는 BGR 저장. HWPX는 RGB "#RRGGBB". | ||
| // ColorRef = u32. HWP는 0xAABBGGRR 저장. HWPX는 "#RRGGBB" 또는 "#AARRGGBB". |
| // AARRGGBB → 0xAABBGGRR (alpha 보존) | ||
| if let Ok(v) = u32::from_str_radix(hex, 16) { | ||
| let a = (v >> 24) & 0xFF; | ||
| let r = (v >> 16) & 0xFF; | ||
| let g = (v >> 8) & 0xFF; | ||
| let b = v & 0xFF; | ||
| return b << 16 | g << 8 | r; | ||
| return a << 24 | b << 16 | g << 8 | r; |
- color_hex()에 0xFFFFFFFF 센티넬 → "none" 반환 추가 (section.rs의 color_ref_to_hwpx와 일관성 확보) - parse_color() 문서를 alpha 보존 동작에 맞게 수정 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
Copilot 리뷰 반영 (3ff9c56):
|
…더링 정정 PR #744 (@oksure) 옵션 A 처리 — 2 commits cherry-pick + no-ff merge. 본질 정정 (3 files, +26/-8): - src/parser/hwpx/utils.rs (+8/-5): parse_color_str — #AARRGGBB → 0xAABBGGRR (alpha 보존) - src/serializer/hwpx/header.rs (+12/-2): color_hex — alpha 비제로 시 #AARRGGBB 출력 + 0xFFFFFFFF 투명 센티넬 처리 - src/serializer/hwpx/section.rs (+6/-1): color_ref_to_hwpx — 동일 alpha 보존 출력 결함 본질 (Issue #606): - HWPX 문서의 faceColor="#FF000000" (alpha=0xFF, 채우기 없음) 영역 영역 0x00000000 (검정) 으로 파싱 - style_resolver의 ColorRef 상위 바이트 비제로 → "채우기 없음" 분기 도달 부재 - 표 배경 검정색 렌더링 발생 Copilot 리뷰 반영 (commit 2e5e993): color_hex 투명 센티넬 처리 + 문서 수정 PR supersede (a) 패턴: - PR #607 (@dicebattle, 4/29 OPEN, 첫 PR) — parser 만 정정 (+9/-5, 1 file) - PR #744 (@oksure, 5/9) — parser + serializer 양방향 정합 (+26/-8, 3 files) — PR #607 본질 완전 포함 + 확장 - 작업지시자 결정 시 PR #607 supersede close (정중 한국어 댓글 + supersede 명시) 자기 검증: - cherry-pick 충돌 0건 - cargo build/test --release ✅ ALL GREEN - parser/hwpx/utils tests ✅ 3 PASS (test_parse_color_str_with_alpha 신규 케이스 포함) - 광범위 sweep 7 fixture / 170 페이지 / 회귀 0 ✅ (HWPX 만 영향, HWP 변환본 무관) closes #606 관련: PR #607 (supersede)
- mydocs/pr/archives/pr_744_review.md: 검토 문서 archives 이동 - mydocs/pr/archives/pr_744_report.md: 처리 보고서 작성 · HWPX ColorRef alpha 보존 (Issue #606 closes) · PR supersede (a) 패턴 — PR #607 (@dicebattle) 본질 완전 포함 + serializer 양방향 정합 추가 · utils tests 3 PASS + 광범위 sweep 170/170 same · 시각 판정 면제 합리 (단위 테스트 결정적 검증) - mydocs/orders/20260510.md: PR #744 항목 추가 (5/10 사이클 영역 영역 16건 처리)
|
@oksure 님, 검토 + 머지 완료했습니다. 처리 결과옵션 A (2 commits cherry-pick + no-ff merge `a4b368a5`) 로 처리. 충돌 0건. 자기 검증
PR supersede (a) 패턴PR #607 (@dicebattle, 4/29 OPEN, parser 만 정정) 영역이 본 PR #744 가 본질 (parser alpha 보존) 완전 포함 + serializer 양방향 정합 추가 영역 close+통합 머지 처리합니다 (`feedback_pr_supersede_chain` (a) 패턴 정합). 시각 판정 면제단위 테스트 결정적 검증 + 양방향 라운드트립 정합 → 시각 판정 면제 합리. 처리 보고서: `mydocs/pr/archives/pr_744_report.md`. @oksure 님 20+ 사이클 컨트리뷰션 영역 — 5/10 사이클 영역 영역 PR #720/#723/#725/#728/#729/#730/#732/#734/#735/#737/#738/#739/#740/#742/#743/#744 영역 16건 처리 완료 영역. |
문제
HWPX 문서의
faceColor="#FF000000"(alpha=0xFF, 채우기 없음)이0x00000000(검정)으로 파싱되어 표 배경이 검정색으로 렌더링됩니다.근본 원인
parse_color_str이#AARRGGBB8자리 입력에서 상위 alpha 바이트를 버리고0x00BBGGRR로 변환합니다.style_resolver는 ColorRef 상위 바이트가 비제로이면 "채우기 없음"으로 처리하는 로직이 이미 있으나, alpha가 소실되어 이 분기에 도달하지 못합니다.수정 내용
src/parser/hwpx/utils.rs—parse_color_str:#AARRGGBB→0xAABBGGRR(alpha 보존)src/serializer/hwpx/header.rs—color_hex: alpha 비제로 시#AARRGGBB출력src/serializer/hwpx/section.rs—color_ref_to_hwpx: 동일하게 alpha 보존 출력test_parse_color_str_with_alpha수정 및 케이스 추가검증
cargo test— 전체 통과cargo clippy -- -D warnings— 경고 0건Closes #606
감사합니다.