Skip to content

render: harden PageLayerTree schema and resource keys#761

Closed
seo-rii wants to merge 1 commit into
edwardkim:develfrom
seo-rii:render-p8
Closed

render: harden PageLayerTree schema and resource keys#761
seo-rii wants to merge 1 commit into
edwardkim:develfrom
seo-rii:render-p8

Conversation

@seo-rii

@seo-rii seo-rii commented May 9, 2026

Copy link
Copy Markdown
Contributor

What

P8은 이후 text/image/cache 작업이 기대게 될 Layer IR contract를 먼저 단단하게 잡는 PR입니다.

  • paint/schema.rs를 추가해서 PageLayerTree JSON schema metadata를 한 곳에서 관리합니다.
  • resource key helper를 blake3 digest 기반으로 고정하고, key에 kind/algorithm/byte length/digest가 모두 들어가게 했습니다.
  • SvgLayerRendererWebCanvasRenderer가 renderer 직접 호출에서도 LayerOutputOptions를 소비하도록 보강했습니다.
  • WASM canvas scale guard를 공통 helper로 빼서 invalid page dimension과 oversized canvas를 명시적으로 막습니다.
  • schema/resource/output option/canvas scale contract 테스트를 추가했습니다.

Why

skia 브랜치의 다음 큰 묶음은 text replay, image effect, cache/diagnostics로 커지기 쉽습니다. 그 전에 schema version, resource key, output option 전달 규칙을 먼저 고정해 두는 편이 이후 PR에서 diff 원인을 좁히기 좋습니다.

이 PR은 렌더링 결과를 크게 바꾸는 단계라기보다는, 이후 backend 작업이 같은 contract 위에 올라가게 만드는 정리 단계입니다.

Non-goals

  • 실제 binary resource interning/public resource table transport까지 구현하지 않습니다.
  • native Skia text/image/cache replay 변경은 넣지 않습니다.
  • CanvasKit이나 rhwp-studio 쪽 resource transport는 후속 PR로 봅니다.

Tests

  • cargo test --lib resource_
  • cargo test --lib layer_tree_schema_contract_is_stable
  • cargo test --lib page_layer_tree_export
  • cargo test --lib normalize_canvas_scale
  • cargo test --lib render_page_consumes_layer_output_options
  • cargo clippy --lib -- -D warnings
  • cargo check --target wasm32-unknown-unknown --lib

Refs #536

@seo-rii seo-rii marked this pull request as ready for review May 10, 2026 07:35
edwardkim added a commit that referenced this pull request May 10, 2026
…esource keys (P8)

Skia native raster 트래킹 (Issue #536) 의 단계적 진전 — P4/P5/P6 후속 P8 (text/image/cache 작업 사전 정리):
- paint/schema.rs 신규 모듈 — LayerTreeSchema 단일 관리 (schema_version=1, resource_table_version=1, unit='px', coordinate_system='page-top-left')
- paint/resources.rs 함수 신규 — blake3 digest + image/svg_resource_key (kind:algorithm:byte_len:digest 형식)
- SvgLayerRenderer + WebCanvasRenderer 영역 LayerOutputOptions 직접 호출 경로 보강
- WASM canvas scale guard 공통 helper

인프라 도입: blake3 crate (Cargo.toml +1).

Non-goals (PR 본문 명시):
- binary resource interning 미구현
- native Skia text/image/cache replay 변경 부재
- CanvasKit / rhwp-studio resource transport 후속

결정적 검증 — 신규 테스트 6 PASS:
- resource_digest_is_stable_and_content_dependent
- resource_keys_include_kind_algorithm_length_and_digest
- layer_tree_schema_contract_is_stable
- normalize_canvas_scale_clamps_request_and_canvas_extent + rejects_invalid_page_dimensions
- render_page_consumes_layer_output_options

검증:
- cargo build --release ✅
- cargo test --release ALL GREEN
- cargo clippy --release --lib -- -D warnings 통과
- cargo check --target wasm32-unknown-unknown --lib 통과
- 광범위 sweep 170/170 same diff=0
- 시각 판정 면제 (작업지시자 결정 — contract 정리 단계 + 결정적 검증 + 회귀 가드)

Refs #536
@edwardkim

Copy link
Copy Markdown
Owner

@seo-rii 검토 완료했습니다. 감사합니다.

처리 결과

Merge commit: 88d7fd38 (devel)

본질

P8 단계 — 이후 text/image/cache 작업 의존할 Layer IR contract 정리. PR #599 (P4) → #626 (P5) → #720 (P6) 의 단계적 진전 (Issue #536 트래킹).

주요 변경

  • paint/schema.rs 신규 모듈 — LayerTreeSchema 단일 관리
  • paint/resources.rs 함수 신규 — blake3 digest + image/svg_resource_key (content-addressable)
  • SvgLayerRenderer + WebCanvasRenderer 영역 LayerOutputOptions 직접 호출 경로 보강
  • WASM canvas scale guard 공통 helper

검증

  • cargo build/test/clippy --release ALL GREEN (clippy -D warnings)
  • cargo check --target wasm32-unknown-unknown 통과
  • 신규 테스트 6 PASS (resource_/schema_contract/normalize_canvas_scale/render_page_consumes_layer_output_options)
  • 광범위 sweep 170/170 same diff=0
  • 시각 판정 면제 (contract 정리 단계 + 결정적 검증 + 회귀 가드)

5/10 사이클 — Skia native raster 트래킹의 단단한 기반 정리, 수고하셨습니다.

@edwardkim

Copy link
Copy Markdown
Owner

Merged. Merge commit: 88d7fd3

@edwardkim edwardkim closed this May 10, 2026
edwardkim added a commit that referenced this pull request May 10, 2026
PR #761 (Refs #536) 처리 보고서 + 검토 문서 archives 이동 + 5/10 orders 행 추가.
Skia native raster P8 — Layer IR contract 정리 (schema/resource keys hardening).

Merge commit: 88d7fd3
Cherry-pick: 5a41752
edwardkim added a commit that referenced this pull request May 10, 2026
P9 단계 — native Skia text replay 영역 기존 TextRunNode payload 영역 더 많이 소비. 단순 glyph drawing 영역 layer payload 의 text metadata 영역 가능 범위 영역 replay.

Skia native raster 트래킹 (Issue #536) 의 단계적 진전:
- P4 #599 → P5 #626 → P6 #720 → P8 #761 → P9 #769

P9 본질 보강:
- char overlap / tab leader / text decoration (underline/strike/overline)
- shade/shadow/outline-style effect
- emphasis dot (한글 강조점)
- vertical rotation (세로쓰기)
- output options 영역 control mark replay

인프라 도입 — text_replay.rs 모듈 분리 (P10 → P9 통합):
- src/renderer/skia/text_replay.rs 신규 (+748)
- renderer.rs 영역 page/layer replay orchestration 영역 집중
- src/renderer/skia/mod.rs 모듈 등록

본 환경 cherry-pick:
- 49b540a (P8) → empty (PR #761 머지 완료 영역 동일 본질) → skip
- 8f079b1 (P9 본질 1) → cherry-pick
- c74fb92 (P9 본질 2, split) → cherry-pick

Non-goals (PR 본문 명시):
- full text source table / glyph-run IR 미포함
- Skia 영역 기본 public render path 전환 부재
- targeted raster test 외 visual/pixel regression infrastructure 추가 부재

검증:
- cargo build/test/clippy --release ALL GREEN
- cargo test --features native-skia --lib skia → 28/28 PASS (신규 4건 + 기존 24건)
  - renders_char_overlap_text_run_as_ink
  - renders_decorated_text_as_ink
  - renders_tab_leader_for_empty_text_run
  - renders_output_control_marks_as_ink
- cargo clippy --release --features native-skia --lib -- -D warnings 통과
- 광범위 sweep 7 fixture / 170 페이지 / 회귀 0 (skia 만 영역 svg sweep 무영향 입증)
- 시각 판정 면제 (작업지시자 결정 — targeted raster + sweep 통과 + Skia 만 변경)

Refs #536
edwardkim added a commit that referenced this pull request May 10, 2026
5/10 + 5/11 사이클 누적 — 외부 기여자 다수 PR 30+ 머지.

Cargo.toml + rhwp-vscode/package.json + npm/editor/package.json + rhwp-studio/package.json: 0.7.10 → 0.7.11
rhwp-vscode/CHANGELOG.md: [0.7.11] 항목 추가

핵심 변경:
- Skia native raster P8 (#761) + P9 (#769) — Layer IR contract hardening + text replay parity
- HWP3 native 렌더링 (#753) — hwp3-sample10 8 단계 정정 + Git LFS pdf-large/ 신규
- 페이지네이션 정정 (#778) — Task #703 다단 컬럼 분배 회귀 정정
- rhwp-studio 인터랙션 (PR #781/#786/#787/#788) — scrollbar/수식/표 셀/도구 모음 결함 정정
- rhwp-studio editor 신규 기능 (PR #728/#748/#750/#760 등) — 표 편집 Undo/Redo + 다단 설정 + 다수 단축키
@edwardkim edwardkim mentioned this pull request May 10, 2026
4 tasks
edwardkim added a commit that referenced this pull request May 11, 2026
…ract (P11)

P11 단계 — P9 영역 영역 text replay parity 후속 영역 영역 Text IR v2 compatibility contract 추가.

Skia native raster Issue #536 트래킹 단계적 진전:
P4 #599 → P5 #626 → P6 #720 → P8 #761 → P9 #769 → P11 #797

중요: 본 PR 은 GlyphRun 을 기본 경로로 만드는 PR 이 아니라 TextRun v2 compatibility contract 를 완성하는 PR.

4 본질 원칙:
- Compatibility first — 모든 backend 가 TextRun fallback 으로 렌더링 가능
- Additive schema — schemaMinorVersion + feature negotiation (기존 consumer 미파괴)
- Source traceability — text_sources + TextRun.source span
- Placement/cluster metadata — paintStyle/projectionKind/orientation/placement/clusterBasis/clusters/legacyVisuals

신규 인프라:
- PaintOp::{CharOverlap, TextControlMark, TabLeader, TextDecoration} — explicit visual ops
- PageLayerTree.text_sources + TextSourceTable (export-local)
- TextRun.source span + 7 신규 metadata
- schemaMinorVersion + resourceTableMinorVersion + feature negotiation
- docs/text-ir-v2.md migration contract

Renderer 정정 — 4 backend 동기 (feedback_image_renderer_paths_separate 권위 사례):
- svg_layer.rs / canvas.rs / skia/renderer.rs / web_canvas.rs — 신규 special visual op skip (double-painting 방지)

Non-goals (Still designing):
- GlyphRun eligibility / font resource table / cluster basis / fallback diagnostics — P12+ 분리

검증:
- cargo build/test/clippy --release ALL GREEN (clippy -D warnings)
- native-skia 28/28 PASS (PR #769 인프라 보존)
- 광범위 sweep 7 fixture / 170 페이지 / 회귀 0 (Compatibility first 원칙 입증)
- 시각 판정 면제 (작업지시자 결정 — contract 정합 단계 + 결정적 검증 + sweep 통과)

Refs #536
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.

2 participants