Skip to content

Commit 53056dc

Browse files
DanMeonclaude
andcommitted
ci: 후보 A patch 로 교체 — match_family_style 사전 필터링
후보 B (CTFontManagerSetAutoActivationSetting) 가 효과 없음을 확인. 검증 에이전트의 회의 — 해당 API 가 타사 font manager activation 알림 용일 뿐 libFontRegistryUI downloadable lookup 은 안 끔 — 이 직접 검증됨. 후보 A 로 교체. font_mgr.family_names() 로 시스템 폰트 family set 을 SkiaLayerRenderer 생성 시 캐시하고, match_family_style 호출 전 에 멤버십 체크해 missing family 는 skip. CoreText 의 downloadable lookup path 자체에 진입하지 않게 함. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 24b4b19 commit 53056dc

2 files changed

Lines changed: 40 additions & 17 deletions

File tree

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ jobs:
170170
with:
171171
python-version: "3.12"
172172
- run: uv sync --no-install-project --group all
173-
# * 실험 patch: macOS 만 SkiaLayerRenderer::new() 진입에 CoreText auto-activation 비활성화. external/rhwp 자체에는 commit 하지 않고 runtime 에만 apply.
173+
# * 실험 patch: macOS family lookup 에 시스템 폰트 사전 필터링 적용 — match_family_style 호출 전에 멤버십 체크해 missing family 를 CoreText 에 던지지 않음. external/rhwp 자체에는 commit 하지 않고 runtime 에만 apply.
174174
- name: Apply experimental CoreText fix (macOS only)
175175
if: runner.os == 'macOS'
176176
run: |
Lines changed: 39 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,47 @@
11
diff --git a/src/renderer/skia/renderer.rs b/src/renderer/skia/renderer.rs
2-
index eea1f807..33407294 100644
2+
index eea1f807..5193fedf 100644
33
--- a/src/renderer/skia/renderer.rs
44
+++ b/src/renderer/skia/renderer.rs
5-
@@ -26,6 +26,19 @@ pub struct SkiaLayerRenderer {
5+
@@ -2,7 +2,7 @@ use skia_safe::{
6+
font, paint, surfaces, Canvas, Color, EncodedImageFormat, Font, FontMgr, FontStyle, Paint,
7+
PathBuilder, PathEffect, Rect, Typeface,
8+
};
9+
-use std::collections::HashMap;
10+
+use std::collections::{HashMap, HashSet};
11+
12+
use crate::error::HwpError;
13+
use crate::model::image::ImageEffect;
14+
@@ -22,13 +22,20 @@ pub struct SkiaLayerRenderer {
15+
/// key = primary face name (Typeface::family_name), value = Typeface.
16+
/// SVG 의 `--font-path` 와 같은 패턴으로 ttfs 디렉토리의 한컴 전용 폰트 (HY견명조 등) 도 사용 가능.
17+
custom_typefaces: HashMap<String, Typeface>,
18+
+ /// [diagnostic patch] 시스템 폰트 family list 사전 캐시 — macOS 의
19+
+ /// CoreText downloadable-font lookup IPC hang 회피용. match_family_style
20+
+ /// 호출 전에 멤버십 체크해 missing family 를 CoreText 에 던지지 않음.
21+
+ system_families: HashSet<String>,
22+
}
623

724
impl SkiaLayerRenderer {
825
pub fn new() -> Self {
9-
+ // [diagnostic patch from rhwp-python ci/patches/macos-coretext-fix.patch]
10-
+ // macOS 의 CoreText downloadable-font lookup IPC (fontd mach port) 무한 대기 회피 시도.
11-
+ #[cfg(target_os = "macos")]
12-
+ unsafe {
13-
+ extern "C" {
14-
+ fn CTFontManagerSetAutoActivationSetting(
15-
+ bundle_id: *const core::ffi::c_void,
16-
+ setting: u32,
17-
+ );
18-
+ }
19-
+ // kCTFontManagerAutoActivationDisabled = 1
20-
+ CTFontManagerSetAutoActivationSetting(core::ptr::null(), 1);
21-
+ }
26+
+ let font_mgr = FontMgr::default();
27+
+ let system_families: HashSet<String> = font_mgr.family_names().collect();
2228
Self {
23-
font_mgr: FontMgr::default(),
29+
- font_mgr: FontMgr::default(),
30+
+ font_mgr,
2431
custom_typefaces: HashMap::new(),
32+
+ system_families,
33+
}
34+
}
35+
36+
@@ -326,6 +333,11 @@ impl SkiaLayerRenderer {
37+
}
38+
}
39+
for family in &families {
40+
+ // [diagnostic patch] macOS 의 CoreText downloadable lookup IPC
41+
+ // hang 회피 — 시스템에 없는 family 는 match_family_style 에 던지지 않음.
42+
+ if !self.system_families.contains(family.as_str()) {
43+
+ continue;
44+
+ }
45+
if let Some(tf) = self.font_mgr.match_family_style(family, font_style) {
46+
push(&mut chain, &mut seen, tf);
47+
}

0 commit comments

Comments
 (0)