feat: introduce skia renderer#165
Conversation
|
2d 벡터렌더링으로 Skia 와 thorvg 를 살펴보고 있었습니다. 고민이 됩니다. 문제는 폰트 렌더링입니다. skia 로 하면 많이 편하기는 한데 thorvg 는 우리나라 개발자분이 만든거라 thorvg 로 테스트 중이었습니다. |
- 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>
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>
|
오늘 시간을 좀 내서 올려주신 PR 보고 있습니다. 너무 많은 작업을 해주셔서 중간 리뷰 안 하면 제가 더 힘들어 질 것 같아서 말입니다. ㅎㅎ |
|
와우! |
|
이 pr은 닫는게 맞을 것 같습니다. |
|
너무 겸손의 말씀입니다. 지금 열심히 코드 리뷰하고 머지 테스트 중입니다. 개인적으로는 해보고 싶었던 시도였는데 못 하고 있었습니다.
계속 다듬어 나가면 rhwp 의 렌더링 피델리티에 큰 기점이 될 것으로 보고 있습니다.
틈틈이 이번주 머지 작업 후 게속 해서 진행하실 수 있도록 준비하겠습니다. 준비되면 이슈로 등록하겠습니다.
안드로이드 폰과 태블릿 사용자에게 정말 좋은 선물이 될 것 같아 기대됩니다.
현재 아이폰과 아이패드 사용자들은 고민 하다가 네이티브 그래픽스 포팅으로 방향을 잡았습니다. 브랜치는 os/devel 로 따 놓았습니다.
시간되시면 한 번 리뷰 부탁드립니다.
2026년 4월 21일 (화) 오후 5:34, Seohyun Lee ***@***.***>님이 작성:
… *seo-rii* left a comment (edwardkim/rhwp#165)
<#165?email_source=notifications&email_token=AAZIOGGO6DXW2KTSWV72VBL4W4W7ZA5CNFSNUABFM5UWIORPF5TWS5BNNB2WEL2JONZXKZKDN5WW2ZLOOQXTIMRYG4YDOMBYGQ42M4TFMFZW63VHMNXW23LFNZ2KKZLWMVXHJNLQOJPWG33NNVSW45C7N5YGK3S7MNWGSY3L#issuecomment-4287070849>
이 pr은 닫는게 맞을 것 같습니다.
사실 처음에는 단순히 렌더러 부분을 ir로 뜯어내서 백엔드만 따로 달면 될 줄 알고 단순히 에이전트로 코딩해서 기여를 넣으면 될 것
같아서 시작한 작업인데, 렌더러 차이 때문에 사소한 수정을 넣어야 할 부분이 너무 많아져서 이도 저도 아니게 된 것 같네요 ㅜㅜ
레포는 그대로 남겨 둘 예정이기 때문에 원하신다면 참고해서 기능 집어넣으셔도 될 것 같습니다. 지금 이대로는 에이전트한테 너무
일임해서 코드 구조가 망가진 것 같아서 pr을 넣기가 조금 그러네요... 다만 테스트 자체는 100여개 hwp 파일에 대해 모두
통과하는 것으로 보입니다.
죄송합니다 ㅜㅜ
—
Reply to this email directly, view it on GitHub
<#165?email_source=notifications&email_token=AAZIOGGO6DXW2KTSWV72VBL4W4W7ZA5CNFSNUABFM5UWIORPF5TWS5BNNB2WEL2JONZXKZKDN5WW2ZLOOQXTIMRYG4YDOMBYGQ42M4TFMFZW63VHMNXW23LFNZ2KKZLWMVXHJNLQOJPWG33NNVSW45C7N5YGK3S7MNWGSY3L#issuecomment-4287070849>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/AAZIOGBCGE7LLVOHG2P7EMD4W4W7ZAVCNFSM6AAAAACX3R4OIOVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHM2DEOBXGA3TAOBUHE>
.
You are receiving this because you commented.Message ID:
***@***.***>
|
|
그러면 코드 정리를 조금 더 한 다음에 pr을 작게 쪼개서 다시 열어보겠습니다! |
|
지금 하고 계신 일이 얼마나 중요한 작업인지 새삼 강조 드리고 싶습니다.
한글과 컴퓨터는 2026년에도 여전히 32 비트로 버티고 있습니다. 그리고 이걸 최신 기술로 리팩토링할 여지도 없다고 판단됩니다.
벡터 엔진 렌더링이 가져올 파급력을 이미 알고 계시기에 작업을 하신 걸로 알고있습니다.
느리더라도 천천히 하나씩 공략해 나가면 됩니다. 저도 rhwp 가 1,2년 해서는 않된다는 것을 알고 있습니다. 느린 호흡으로 가셔도
됩니다.
2026년 4월 22일 (수) 오후 5:07, Seohyun Lee ***@***.***>님이 작성:
… *seo-rii* left a comment (edwardkim/rhwp#165)
<#165?email_source=notifications&email_token=AAZIOGBTAC5IKUSDHRMREHT4XB4VRA5CNFSNUABFM5UWIORPF5TWS5BNNB2WEL2JONZXKZKDN5WW2ZLOOQXTIMRZGQ2TONRYGE22M4TFMFZW63VHMNXW23LFNZ2KKZLWMVXHJNLQOJPWG33NNVSW45C7N5YGK3S7MNWGSY3L#issuecomment-4294576815>
그러면 코드 정리를 조금 더 한 다음에 pr을 작게 쪼개서 다시 열어보겠습니다!
—
Reply to this email directly, view it on GitHub
<#165?email_source=notifications&email_token=AAZIOGBTAC5IKUSDHRMREHT4XB4VRA5CNFSNUABFM5UWIORPF5TWS5BNNB2WEL2JONZXKZKDN5WW2ZLOOQXTIMRZGQ2TONRYGE22M4TFMFZW63VHMNXW23LFNZ2KKZLWMVXHJNLQOJPWG33NNVSW45C7N5YGK3S7MNWGSY3L#issuecomment-4294576815>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/AAZIOGCHJTNNGP2I7YE25I34XB4VRAVCNFSM6AAAAACX3R4OIOVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHM2DEOJUGU3TMOBRGU>
.
You are receiving this because you commented.Message ID:
***@***.***>
|
|
@postmelee 이걸 조금 늦게 확인했네요 ㅜㅜ #364 확인했고 해당 내용까지 참고해서 pr 올렸습니다. 좋게 봐주셔서 정말 감사합니다! |
@seo-rii 안녕하세요, 감사합니다. |
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>
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>
본질: 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>
변경 요약
추후 네이티브 확장성을 위해서는 Skia와 같은 2d 렌더링 라이브러리를 도입하는 것이 좋을 것 같아 작업해 보았습니다.
매우 큰 변경 사항이고, ai로 생성한 커밋이기 때문에 일단 draft로 열었습니다. 래스터화 방식의 차이로 기존 렌더러와 테두리 부분에서 diff가 조금 발생하는데, 이에 대해서도 조금 더 작업 후에 draft 풀도록 하겠습니다.
관련 이슈
closes #
테스트
cargo test통과cargo clippy -- -D warnings통과스크린샷
변경 전후 비교가 필요한 경우 첨부해주세요.