Task #975: Fix PageBackground fill mode and RealPic watermark tone#1019
Conversation
…PaintOp::Image @postmelee — 이미지 변환(BMP/PCX→PNG) + 워터마크 JPEG→baked PNG 판정이 5+ renderer 별 사본(svg/canvas/web_canvas/skia/paint/json)에 분산되어 있던 것을 LayerBuilder 단계 단일 image_resolver::resolve_image_payload() 진입점으로 통합. 결과를 ResolvedImagePayload 로 패키지하여 PaintOp::Image.resolved: Option<Box<...>> 옵션 필드에 부착 (schema minor 12→13, 하위호환). 모든 renderer 는 resolved payload 소비만 — 재판정 없음. 옵션 A: 본질 커밋 3aeaa5b cherry-pick (작성자 postmelee 보존, orders/20260520.md --ours 1건 충돌 해소). 검증: cargo test 1307 + cargo test --test issue_938 3건(overlay/svg/PageLayerTree resolved watermark contract) + clippy -D + fmt 0 + WASM 4.83MB. 광범위 sweep 10 fixture (BEFORE devel ↔ AFTER): 복학원서(워터마크), sample16-hwp5/hwp3, hy-001 HWPX/HWP5, exam_kor/math, aift, biz_plan, test-image — **전부 diff=0** (SVG 출력 100% 동일). 광범위 표면(24파일, 7개 renderer 경로)에도 시각 결과 완전 보존 — feedback_image_renderer_ paths_separate 본질적 해소 + 시각 호환성 100% 모범 사례. 작업지시자 시각 판정 생략 통과 (sweep diff=0 정량 입증). PR scope 좁힘: z-order replay 일반화는 #1017로 분리 (PR 본문 명시). @postmelee 후속 #1019 (Task #975 PageBackground fill + RealPic watermark tone) OPEN 시리즈 연속.
|
검토 결과 수정 요청드립니다 (보류, PR/이슈 OPEN 유지). 검증 결과 — PR 자체는 견고, SVG 경로 정합 미완자기 검증 + sweep 모두 통과:
다만 작업지시자 시각 판정에서 devel 기존 SVG 경로 결함 확인 (BEFORE/AFTER 동일):
본 PR이 "renderer들이 같은 resolved image payload 공유 + tone 정합"을 본질로 하시므로 SVG 정합도 함께 포함되어야 한다는 판단입니다. 요청 사항
설계(2 fix 분리 + RealPic preset 4-param + 3x3 affine + PNG bake) 자체는 견고합니다. #1018 직후 적층에서 발견된 SVG 일관성을 함께 정합해주시면 좋겠습니다. 광범위한 작업 감사합니다. |
PR #1019 는 머지하지 않음. PR 자체(2 fix + 3 cherry-pick) 견고 + sweep 회귀 0 + rhwp-studio 시각 정상이나, 작업지시자 시각 판정으로 SVG 경로의 두 결함(워터마크 효과 미적용 + 흰색 투명 미처리, BEFORE/AFTER 동일 = devel 기존) 발견. 컨트리뷰터에게 최신 devel rebase + image_resolver 로 신규 helper 이동 + SVG 정합 추가 + fixture 명시 요청. PR/이슈 #975 OPEN 유지. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
@edwardkim 네 확인했습니다. 아직 RealPic 색상 워터마크 preset 정합 부분이 한컴 뷰어 색상과 차이가 있어 색상 보정부분 정확도 작업중입니다. 완료되면 PR draft -> open으로 전환하겠습니다. |
bff91da to
18622fb
Compare
18622fb to
ff04eb3
Compare
|
@edwardkim 후속 요청사항 1~4 기준으로 반영 완료했습니다. self-review에서 확인한 profile/opacity 정합도 추가로 보강했습니다.
검증:
PR 본문도 위 상태에 맞춰 업데이트했습니다. |
|
반영 완료했습니다.
추가로, 같은 샘플에서 차트 컨트롤이 포함된 2단 레이아웃은 아직 한컴 에디터와 배치가 다릅니다. 표 다음 차트가 현재 단에 들어가지 않을 때 오른쪽 단으로 이동해야 하는 별도 차트 컨트롤/다단 레이아웃 문제로 확인되어, #1019 범위 밖의 후속 이슈로 분리하겠습니다. |
2단(multicolumn) 문서에서 차트(OLE) 컨트롤이 한컴과 다르게 배치되는 결함 정정.
본질 (재현: samples/hwpx/143E433F503322BD33.hwpx, 정답지 pdf-large/hwpx/):
- 차트 80mm (한컴+spec SHAPE_COMPONENT+HWPX hp:sz 3중 일치)
- 한컴: 차트가 단0 끝 넘으면 단1 상단 이동 + 단0 빈 공간 텍스트 back-fill
정정:
1. 차트 단 이동 (typeset.rs typeset_table_paragraph)
- 비-TAC TopAndBottom vert=Para 차트(Shape/OLE)가 단 잔여 부족 시 advance_column.
- 종전 TAC 객체만 처리하여 비-TAC 차트는 높이 0 push (단 이동 누락).
2. 자리차지 텍스트 겹침 (layout.rs layout_shape_item)
- 비-TAC TopAndBottom Shape 의 result_y 를 차트 높이만큼 진행 → 후속 텍스트
가 차트 영역 겹치지 않음 (텍스트 첫 줄 y 154→486, 차트 bottom 415 아래).
3. 워터마크 효과 회귀 (svg.rs/web_canvas.rs/skia/renderer.rs, scope 확대)
- PR #1019(#975 RealPic) 가 RealPic 톤 프리셋 경로 추가하며, effect=RealPic +
톤 프리셋 아닌 배경 워터마크(brightness=contrast=0)가 opacity 누락.
- 페이지 배경 이미지는 본질적으로 워터마크 → RealPic 톤 프리셋 아닌 PageBackground
도 워터마크 opacity 적용 (3 렌더러 경로 정합).
검증:
- 작업지시자 한컴 시각 판정 통과 (차트 단1 상단 + 겹침 해소 + 워터마크 반투명)
- 회귀 가드 tests/issue_1156_chart_column_flow.rs (2 passed)
- cargo test --tests / svg_snapshot 8 / clippy --lib / fmt 통과
scope 밖: 차트 그림(MS Graph OLE2) 실제 그래프 렌더 (현재 placeholder 80mm).
closes #1156
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
관련 이슈
Refs #975
Related #976
요약
이 PR은 #975의 원래 문제였던 PageBackground/BorderFill 이미지가 fill mode를 무시하고 페이지 전체로 stretch 렌더링되는 문제를 수정합니다.
작업 중 추가로 확인된
effect=RealPic,brightness=-50,contrast=70색상 워터마크 preset도 함께 정합했습니다. 이 preset은 #976 계열의effect != RealPicJPEG grayscale/baked watermark와 다르게, 한컴 뷰어에서 색상을 보존한 밝은 워터마크 톤으로 보입니다.따라서 변경 범위는 아래 두 축으로 분리됩니다.
ImageFillMode정합왜 변경했나
#975 재현 샘플의 BorderFill image는 dump 기준으로
mode=Center를 보존하고 있었습니다.하지만 SVG/Web Canvas의 PageBackground 경로가
ImageFillMode를 사용하지 않고 항상 bbox 전체 렌더링을 해서, 원본 512x512 워터마크가 페이지 전체로 늘어났습니다.또한
effect=RealPic,brightness=-50,contrast=70인 색상 이미지 워터마크는 한컴 뷰어가 단순 brightness/contrast CSS filter나 #976 JPEG baked watermark와 다른 톤으로 처리합니다. 이 PR은 해당 preset을 별도 감지해 SVG와 Web Canvas가 같은 픽셀 변환 결과를 쓰도록 맞춥니다.변경 내용
1. PageBackground 이미지 fill mode 정합
PageBackgroundImage에brightness,contrast,effect를 보존하도록 확장render_page_background_image()helper로 분리FitToSize | None: 대상 bbox 전체 렌더링Center등 위치 모드: 원본 이미지 픽셀 크기 기준 배치draw_image_with_fill_mode()를 재사용2. RealPic 색상 워터마크 preset 정합
effect=RealPic,brightness=-50,contrast=70조합을 색상 워터마크 tone preset으로 판정image_resolver기반 PNG bake helper를 사용하도록 정리현재 적용 값은 파일명 분기가 아니라 동일 RealPic 색상 워터마크 preset 전체에 대한 공통값입니다.
3. SVG 경로 정합
메인테이너 피드백에 맞춰 SVG 경로도 같이 정리했습니다.
src/renderer/image_resolver.rs로 이동/통합메인테이너 피드백 반영 상태
#1019 (comment) 기준으로 아래 항목을 반영했습니다.
devel기준 rebase (upstream/devel@5a1c645a)svg.rs가 아니라image_resolver.rs로 이동/통합samples/에 추가해 복학원서(Task #938: 복학원서 JPEG 워터마크 배경 사각형 제거 및 톤 보정 #976) + RealPic preset 발동 fixture 회귀 가드 보강추가 fixture는 아래 파일로
samples/에 포함했습니다.samples/복학원서.hwp— Task #938: 복학원서 JPEG 워터마크 배경 사각형 제거 및 톤 보정 #976/복학원서.hwp s0:pi=0 의 BehindText 그림 컨트롤 출력 누락 #514/복학원서 워터마크 투명 배경이 사각 영역으로 렌더링됨 #938 PCX + non-RealPic JPEG baked watermark 경로samples/143E433F503322BD33.hwp— PageBackground 이미지 fill_mode(Center 등)가 전체 페이지 늘림으로 렌더링됨 #975 PageBackground RealPic preset 경로samples/253E164F57A1BC6934-empty.hwp— 추가 RealPic preset 2쪽 fixture범위 제외
effect != RealPic워터마크 및 #976의 JPEG baked watermark 경로는 유지하되, 이번 RealPic 색상 워터마크 경로와 분리했습니다.253E164F57A1BC6934.hwpexport 중 보이는 table overflow 경고는 기존 레이아웃 overflow이며, 워터마크 색상/배치 보정 범위가 아닙니다.테스트
최신
develrebase 후 재확인:cargo fmt --all -- --checkcargo test --lib renderer::svg::testscargo test --test issue_1019 --test issue_514 --test issue_938 --test issue_1156_rowbreak_fragment_fitcargo check --target wasm32-unknown-unknown --libgit diff --check최신 rebase 직전 같은 PR 브랜치에서 확인:
cargo test --lib realpic_watermark --offlinecargo test --test svg_snapshot --offlinecargo test --lib --offlinecargo check --target wasm32-unknown-unknown --lib --offlinedocker-compose --env-file .env.docker run --rm wasm통과한 주요 결과:
cargo test --lib renderer::svg::tests:31 passedcargo test --test issue_1019 --test issue_514 --test issue_938 --test issue_1156_rowbreak_fragment_fit:11 passedcargo check --target wasm32-unknown-unknown --lib:passedcargo test --lib realpic_watermark --offline:2 passedcargo test --test svg_snapshot --offline:8 passedcargo test --lib --offline:1312 passed; 0 failed; 2 ignoredpkg/rhwp_bg.wasm갱신 완료시각 검증
143E433F503322BD33.hwp
upstream/devel)253E164F57A1BC6934-empty.hwp
upstream/devel)문서
mydocs/plans/task_m100_975.mdmydocs/plans/task_m100_975_impl.mdmydocs/working/task_m100_975_stage1.mdmydocs/working/task_m100_975_stage3.mdmydocs/working/task_m100_975_stage4.mdmydocs/report/task_m100_975_report.md