Skip to content

feat: introduce skia renderer#165

Closed
seo-rii wants to merge 55 commits into
edwardkim:develfrom
seo-rii:skia
Closed

feat: introduce skia renderer#165
seo-rii wants to merge 55 commits into
edwardkim:develfrom
seo-rii:skia

Conversation

@seo-rii

@seo-rii seo-rii commented Apr 16, 2026

Copy link
Copy Markdown
Contributor

변경 요약

추후 네이티브 확장성을 위해서는 Skia와 같은 2d 렌더링 라이브러리를 도입하는 것이 좋을 것 같아 작업해 보았습니다.

  1. 렌더링 파이프라인을 프론트엔드와 백엔드 경계로 분리했습니다.
  2. 백엔드 렌더러 계층에 기존 렌더러와 Skia 렌더러를 함께 둘 수 있도록 구조를 정리했습니다.
  3. 브라우저 환경에서 동작하는 CanvasKit 기반 웹 렌더러를 추가했습니다.
  4. 브라우저 렌더링과 Skia 렌더링의 결과를 비교할 수 있도록 시각 회귀 테스트를 보강했습니다.
  5. 한글 폰트 및 generic fallback 처리, 심볼/통화 문자 fallback, 렌더링 모드 설정을 정리해 CanvasKit 결과가 기존 렌더링과 최대한 가깝게 나오도록 조정했습니다.
  6. 관련 문서를 업데이트했습니다.

매우 큰 변경 사항이고, ai로 생성한 커밋이기 때문에 일단 draft로 열었습니다. 래스터화 방식의 차이로 기존 렌더러와 테두리 부분에서 diff가 조금 발생하는데, 이에 대해서도 조금 더 작업 후에 draft 풀도록 하겠습니다.

관련 이슈

closes #

테스트

  • cargo test 통과
  • cargo clippy -- -D warnings 통과
  • 관련 샘플 파일로 SVG 내보내기 확인
  • 웹(WASM) 렌더링 확인 (해당하는 경우)

스크린샷

변경 전후 비교가 필요한 경우 첨부해주세요.

@edwardkim

Copy link
Copy Markdown
Owner

2d 벡터렌더링으로 Skia 와 thorvg 를 살펴보고 있었습니다. 고민이 됩니다. 문제는 폰트 렌더링입니다. skia 로 하면 많이 편하기는 한데 thorvg 는 우리나라 개발자분이 만든거라 thorvg 로 테스트 중이었습니다.
일단 맥용 네이티브 부터 하려고 잠시 미루고 있었는데 직접 skia 로 해보셨다니 대단하십니다. 저도 시간내서 살펴보겠습니다.

seunghan91 added a commit to seunghan91/rhwp that referenced this pull request Apr 16, 2026
- task_m100_164_report.md: 4 stage + 검증 인프라 + 라운드트립 결과 종합
- orders/20260417.md: 오늘할일 등록, Task edwardkim#165/166/167 후속 이슈 제안

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim added a commit that referenced this pull request Apr 20, 2026
2026-04-20~21 사이클 정리:

PR 처리 9건:
- admin merge 5: #209 #214 #215 #221 #224
- cherry-pick + close 2: #213 (+중복 #210 close), #181 (+golden 재생성)
- dependabot close 2: #211 #212 (devel 수동 bump + target-branch=devel 설정)
- 보류 1: #165 skia (별도 사이클)

이슈 close 7: #173 #195 #202 #205 #207 #210 #222
신규 이슈 등록 1: #204 (표 Undo/Redo)

Chrome Web Store / Edge Add-ons v0.2.1 심사 통과 (2026-04-21).

local/task205 폐기: PR #209+#214 가 중복 처리하여 잔여 고유 기여 분리 곤란.

기여자 7명 감사 기록.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@edwardkim

Copy link
Copy Markdown
Owner

오늘 시간을 좀 내서 올려주신 PR 보고 있습니다. 너무 많은 작업을 해주셔서 중간 리뷰 안 하면 제가 더 힘들어 질 것 같아서 말입니다. ㅎㅎ
코드 리뷰 후 피드백 드리겠습니다.

@edwardkim

Copy link
Copy Markdown
Owner

와우!

@seo-rii

seo-rii commented Apr 21, 2026

Copy link
Copy Markdown
Contributor Author

이 pr은 닫는게 맞을 것 같습니다.
사실 처음에는 단순히 렌더러 부분을 ir로 뜯어내서 백엔드만 따로 달면 될 줄 알고 단순히 에이전트로 코딩해서 기여를 넣으면 될 것 같아서 시작한 작업인데, 렌더러 차이 때문에 사소한 수정을 넣어야 할 부분이 너무 많아져서 이도 저도 아니게 된 것 같네요 ㅜㅜ
레포는 그대로 남겨 둘 예정이기 때문에 원하신다면 참고해서 기능 집어넣으셔도 될 것 같습니다. 지금 이대로는 에이전트한테 너무 일임해서 코드 구조가 망가진 것 같아서 pr을 넣기가 조금 그러네요... 다만 테스트 자체는 100여개 hwp 파일에 대해 모두 통과하는 것으로 보입니다.
죄송합니다 ㅜㅜ

@seo-rii seo-rii closed this Apr 21, 2026
@edwardkim

edwardkim commented Apr 21, 2026 via email

Copy link
Copy Markdown
Owner

@seo-rii

seo-rii commented Apr 22, 2026

Copy link
Copy Markdown
Contributor Author

그러면 코드 정리를 조금 더 한 다음에 pr을 작게 쪼개서 다시 열어보겠습니다!

@edwardkim

edwardkim commented Apr 22, 2026 via email

Copy link
Copy Markdown
Owner

@postmelee

Copy link
Copy Markdown
Collaborator

@seo-rii 님 안녕하세요!

진행하신 작업 정말 인상 깊게 봤습니다. 대단하십니다.

#364 에서 현재 PR에서 진행하신 부분을 참고해 파편화하여 하나씩 진행하려합니다. 참고해서 진행해도 괜찮을까요?

@seo-rii

seo-rii commented Apr 28, 2026

Copy link
Copy Markdown
Contributor Author

@postmelee 이걸 조금 늦게 확인했네요 ㅜㅜ #364 확인했고 해당 내용까지 참고해서 pr 올렸습니다. 좋게 봐주셔서 정말 감사합니다!

@postmelee

Copy link
Copy Markdown
Collaborator

@postmelee 이걸 조금 늦게 확인했네요 ㅜㅜ #364 확인했고 해당 내용까지 참고해서 pr 올렸습니다. 좋게 봐주셔서 정말 감사합니다!

@seo-rii 안녕하세요,
작업해주셔서 감사합니다. 저도 제가 이어서 진행하는 것 보다 @seo-rii 님이 진행하시는 것이 본래 기능 추가 의도와 코드 방향성이 더 좋을 것 같다고 생각했습니다.

감사합니다.

edwardkim added a commit that referenced this pull request Apr 30, 2026
mydocs/feedback/:
  - manual_currency_audit.md (매뉴얼 현행화 감사 결정 요청 — 2026-04-23)
  - open_issues_priority.md (열린 이슈 37건 우선순위 — 2026-04-22)
  - pr165_merge_decisions.md (PR #165 Skia + Layered Renderer 머지 충돌 결정 — 2026-04-21)
  - self_censor_audit.md (외부 공개 문서 자기검열 감사 — 2026-04-22)

mydocs/pr/:
  - archives/pr_256_review.md + review_impl.md (PR #256 검토 + 구현 계획)
  - pr_273_review.md (PR #273 Task #267 right tab 처리 검토)

이전 사이클 작성 후 미커밋 보관 — devel 머지 + push 진행 시 함께 커밋.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
jangster77 pushed a commit to jangster77/rhwp that referenced this pull request Apr 30, 2026
mydocs/feedback/:
  - manual_currency_audit.md (매뉴얼 현행화 감사 결정 요청 — 2026-04-23)
  - open_issues_priority.md (열린 이슈 37건 우선순위 — 2026-04-22)
  - pr165_merge_decisions.md (PR edwardkim#165 Skia + Layered Renderer 머지 충돌 결정 — 2026-04-21)
  - self_censor_audit.md (외부 공개 문서 자기검열 감사 — 2026-04-22)

mydocs/pr/:
  - archives/pr_256_review.md + review_impl.md (PR edwardkim#256 검토 + 구현 계획)
  - pr_273_review.md (PR edwardkim#273 Task edwardkim#267 right tab 처리 검토)

이전 사이클 작성 후 미커밋 보관 — devel 머지 + push 진행 시 함께 커밋.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim added a commit that referenced this pull request May 9, 2026
본질: PR #599 (P4 PNG raster backend) + PR #626 (P5 equation replay) 후속의
P6 단계. native Skia 경로 영역 의 RawSvg leaf 영역 placeholder fallback 영역
→ 실제 raster (resvg + tiny-skia 영역) 정합.

기존 (renderer.rs:763): PaintOp::RawSvg { bbox, .. } => draw_placeholder(*bbox, "svg")
정정: rasterize_svg_fragment_to_png + draw_image_bytes 영역 재사용 영역.

신규 함수 (image_conv.rs +82 LOC):
- draw_svg_fragment(canvas, fragment, x, y, w, h, sampling) -> bool
- rasterize_svg_fragment_to_png(fragment, w, h) -> Option<Vec<u8>>
- svg_parse_options() -> usvg::Options<'static>

renderer.rs:760+ (line +88/-6):
- PaintOp::RawSvg { bbox, raw } 영역 의 draw_svg_fragment 호출
- invalid SVG 영역 fallback placeholder 영역 보존

보안 가드 (영향 좁힘):
- MAX_SVG_FRAGMENT_BYTES = 4 MB (fragment 크기 가드)
- MAX_SVG_RASTER_PIXELS = 67M (8192x8192 영역 raster 가드)
- resolve_string = Box::new(|_, _| None) (external href 차단 — file:// / http://
  / https:// 등)
- resolve_data = usvg 기본 data: URI resolver (data: URI 만 허용)
- resources_dir = None (디렉터리 자동 탐색 차단)
- Wrapper SVG: <svg xmlns="..." width="..." height="..." viewBox="...">{fragment}</svg>

의존성 (Cargo.toml):
- native-skia feature 영역 의 dep:resvg 추가
- resvg = { version = "0.45", optional = true }

회귀 가드 테스트 (2건 신규):
- renders_raw_svg_fragment_as_colored_ink: green rect 100+ green 픽셀 검증
- raw_svg_replay_does_not_load_external_file_hrefs: 외부 file href 영역 red 0
  픽셀 검증 (보안 가드 작동 입증)

영향 범위:
- native Skia PNG/VLM 경로 영역 의 차트/OLE/내장 SVG 영역 fragment 영역 실제 렌더링
- WASM/browser SVG / CanvasKit / form replay 영역 무영향 (별건)
- 다른 PaintOp 영역 (Image, Equation, Path, Text 등) 무영향

비목표 명시 (PR 본문):
- browser/WASM SVG replay / CanvasKit raw SVG replay
- full SVG security policy 설계
- network/file resource loading
- animated SVG / SVG filter 전체 parity
- form native replay / VLM preset 확장 (#613)
- PNG DPI metadata (#614)

검증:
- cargo test --release: lib 1173 + 통합 ALL GREEN, failed 0
- cargo test --release --features native-skia skia --lib: 24/24 PASS (신규 2건
  회귀 가드 + 기존 22건)
- cargo clippy --release --features native-skia --lib -- -D warnings: 통과
- 광범위 sweep 7 fixture / 170 페이지 / 회귀 0 (Skia 영역 무관 영역, native-skia
  미사용 영역 sweep 정합 확정)

@seo-rii 7번째 사이클 PR (Skia 영역 트래킹 #536 영역 의 단계적 진전 영역).
PR #165 (skia 도입) → #419 (PageLayerTree) → #456 (Canvas 라우팅) → #498
(visual diff) → #599 (P4 PNG) → #626 (P5 equation) → #720 (P6 raw SVG).

refs #536

Co-Authored-By: seorii <me@seorii.page>
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