Skip to content

Task #1017: PageLayerTree BehindText/InFrontOfText z-order 합성 순서 적용#1163

Merged
edwardkim merged 3 commits into
edwardkim:develfrom
postmelee:local/task1017
May 29, 2026
Merged

Task #1017: PageLayerTree BehindText/InFrontOfText z-order 합성 순서 적용#1163
edwardkim merged 3 commits into
edwardkim:develfrom
postmelee:local/task1017

Conversation

@postmelee

@postmelee postmelee commented May 29, 2026

Copy link
Copy Markdown
Collaborator

요약

  • PageLayerTree paint op를 background -> behindText -> flow -> inFrontOfText replay plane으로 분류하는 공통 helper를 추가했습니다.
  • native Skia direct renderer와 CanvasKit direct renderer가 raw tree/leaf 순서가 아니라 HWP BehindText / InFrontOfText 의미에 맞춰 multi-pass replay 하도록 변경했습니다.
  • CanvasKit replay plan 진단에 replayPlane을 노출하고, samples/복학원서.hwp 기반 PageLayerTree replay에서 BehindText/InFrontOfText z-order 합성 정책 일반화 #1017 회귀 테스트를 추가했습니다.

Root cause

#1016에서 중앙 baked watermark image payload는 resolved 되었지만, #1017 fixture인 samples/복학원서.hwp에서는 해당 image op가 wrap=behindText임에도 raw PageLayerTree 순서상 본문 textRun 뒤에 위치했습니다.

기존 native Skia / CanvasKit direct replay는 tree/leaf raw order를 그대로 따라가므로, behindText watermark가 본문 텍스트 위의 흰 사각처럼 합성될 수 있었습니다.

변경

  • src/paint/replay_order.rs
    • PaintReplayPlanepaint_op_replay_plane() 추가
    • PageBackground, BehindText image, flow op, InFrontOfText image의 replay 순서 contract 정의
  • src/renderer/skia/renderer.rs
    • native Skia root replay를 plane별 multi-pass로 변경
    • text source id는 flow pass에서만 증가하도록 유지
  • rhwp-studio/src/view/canvaskit-renderer.ts
    • CanvasKit direct replay도 동일한 plane 순서로 root를 반복 replay
  • src/renderer/canvaskit_policy.rs
    • CanvasKit replay plan item에 replayPlane 진단 추가
  • tests/issue_1017.rs, rhwp-studio/tests/render-backend.test.ts

비교 이미지

Before (upstream/devel) After (PR #1163)
task1017-before-upstream-devel-full task1017-after-pr-full
중앙 baked watermark의 흰 배경이 본문 텍스트 위를 덮음 본문 텍스트가 watermark 위에 정상 표시됨

확인 포인트: baseline에서는 중앙 baked watermark의 흰 배경이 본문 텍스트 위를 덮지만, PR 적용 후에는 본문 텍스트가 watermark 위에 정상 표시됩니다.

검증

  • cargo fmt --all -- --check
  • cargo test
  • cargo clippy -- -D warnings
  • cargo test --features native-skia skia --lib
  • npm --prefix rhwp-studio test
  • cargo run --features native-skia --bin rhwp -- export-png samples/복학원서.hwp -p 0 -o output/task1017-final

최종 PNG에서 중앙 baked watermark가 본문 텍스트 뒤에 깔리고, 흰 사각 배경이 본문 위에 올라오지 않는 것을 확인했습니다.

관련 이슈: #1017

Closes #1017

@postmelee postmelee changed the title [codex] Apply replay planes for PageLayerTree z-order Task #1017: PageLayerTree BehindText/InFrontOfText z-order 합성 순서 적용 May 29, 2026
@postmelee postmelee marked this pull request as ready for review May 29, 2026 04:58
@edwardkim edwardkim self-requested a review May 29, 2026 06:36
@edwardkim edwardkim added the enhancement New feature or request label May 29, 2026
@edwardkim edwardkim added this to the v1.0.0 milestone May 29, 2026
@edwardkim edwardkim merged commit 832497a into edwardkim:devel May 29, 2026
7 checks passed
@edwardkim

Copy link
Copy Markdown
Owner

devel 에 머지했습니다 (832497a4). PageLayerTree replay plane(background → behindText → flow → inFrontOfText) 도입으로 native Skia(PNG)와 CanvasKit(웹캔버스)의 z-order 합성이 정정된 것을 확인했습니다.

머지 과정에서 두 가지를 정합했습니다:

별도로, SVG 렌더러(svg.rs)는 PaintOp replay 가 아니라 RenderNode 트리 순회 경로라 본 PR 의 plane 정정이 적용되지 않습니다. SVG 에서는 중앙 워터마크가 본문 위를 덮는 z-order 결함이 남아 별도 후속으로 정정할 예정입니다.

edwardkim added a commit that referenced this pull request May 29, 2026
PR #1163 (#1017) 머지 처리 보고서 archives 이동 + 오늘할일 갱신.
SVG 경로 z-order 누락은 후속 이슈 #1167 로 분리.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@postmelee postmelee deleted the local/task1017 branch June 3, 2026 03:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants