aboutsummaryrefslogtreecommitdiffstats
path: root/docs
diff options
context:
space:
mode:
authoreunhhu <[email protected]>2026-09-28 15:52:13 +0100
committereunhhu <[email protected]>2026-09-28 15:52:13 +0100
commita4ca275ad1b5edc15474407e2852f8fe9abaac4e (patch)
treef854692c7906627054a6b6ce98d8646bd678cb48 /docs
parent43a63f5aab95bf5fdfc4bce70286802854f7a07a (diff)
downloadvega-a4ca275ad1b5edc15474407e2852f8fe9abaac4e.tar.gz
vega-a4ca275ad1b5edc15474407e2852f8fe9abaac4e.zip
Set text in a stack of fonts: each grapheme cluster in the first that has it
vega_layout takes fonts in order of preference (VegaFonts). A grapheme cluster goes to the first font that has all its characters (default ignorables aside: shaping hides them); a cluster of Common and Inherited characters stays in the font before it when that one has it, so the spaces between Arabic words stay in the Arabic font; failing that, the first font with its first character, else the first font. Runs split where the font changes too. Positions are in the first font's units, a run's pen scaled as a whole so rounding does not add up. Callers can narrow what a font has (a symbol file holds only the glyphs its codes reach). vega_default_ignorable is shape.c's HarfBuzz 10.2 set, now public.
Diffstat (limited to 'docs')
-rw-r--r--docs/design/004-text.md14
1 files changed, 11 insertions, 3 deletions
diff --git a/docs/design/004-text.md b/docs/design/004-text.md
index 13f9d96..8325109 100644
--- a/docs/design/004-text.md
+++ b/docs/design/004-text.md
@@ -237,12 +237,20 @@ U+180B–180E만 넣고 네 번째 자유 이체 선택자(U+180F)를 빠뜨렸�
[text/layout.c](../../text/layout.c)는 검증한 부품을 UAX #9 3.4절과 UAX #14가 말하는 순서로 잇는다.
1. 문단의 수준(P2–I2). 제거된 문자는 앞 문자의 수준을 받는다.
-2. 문자마다 문자 체계. Common과 Inherited는 앞 문자의 것을 받고, 맨 앞이면 뒤에서 처음 나오는 것을 받는다.
+2. 문자마다 문자 체계. Common과 Inherited는 앞 문자의 것을 받고, 맨 앞이면 뒤에서 처음 나오는 것을 받는다. 그리고 자소
+ 클러스터(UAX #29)마다 글꼴. 클러스터 하나가 두 글꼴로 갈라지지 않는다.
3. 줄 바꿈 기회와, 문단을 한 번 셰이핑해 잰 문자마다의 폭.
4. 줄: 보이는 부분이 아직 들어가는 마지막 기회에서 바꾼다. 줄 끝의 공백은 줄 밖으로 걸린다. 들어가는 기회가 없으면 첫 기회에서
바꾼다. 줄로 다시 셰이핑하면 잰 것보다 넓을 수 있다(줄 끝 글자가 끝 꼴이 되는 아랍 문자). 그러면 앞 기회로 물러난다.
-5. 줄마다: 줄 끝에서 L1을 하고, 수준과 문자 체계가 같은 실행으로 나눠 다시 셰이핑하고(연결과 커닝이 줄과 함께 끝난다),
- 실행들을 L2 순서로 놓고, 글리프를 왼쪽부터 놓는다. 오른쪽에서 왼쪽으로 쓰는 문단의 줄은 오른쪽 끝에 맞춘다.
+5. 줄마다: 줄 끝에서 L1을 하고, 수준과 문자 체계와 글꼴이 같은 실행으로 나눠 다시 셰이핑하고(연결과 커닝이 줄과 함께
+ 끝난다), 실행들을 L2 순서로 놓고, 글리프를 왼쪽부터 놓는다. 오른쪽에서 왼쪽으로 쓰는 문단의 줄은 오른쪽 끝에 맞춘다.
+
+글꼴은 선호 순서의 목록이다(`VegaFonts`). 클러스터는 그 문자를 모두 가진 첫 글꼴로 간다. 기본 무시 문자(ZWJ, 이형 선택자
+등)는 셰이핑이 숨기므로 없어도 된다. Common과 Inherited만으로 된 클러스터(공백, 숫자, 문장 부호)는 앞 클러스터의 글꼴에
+있으면 그 글꼴에 남는다. 그래서 아랍 낱말 사이의 공백이 아랍 글꼴에 남아 실행이 공백마다 끊기지 않는다. 모두 가진 글꼴이
+없으면 첫 문자를 가진 첫 글꼴로, 그것도 없으면 첫 글꼴(의 .notdef)로 간다. "가졌다"는 기본으로 문자표이고, 부르는 쪽이 좁힐 수
+있다. 심볼 파일은 코드가 닿는 글리프만 담으므로, 픽셀 표면은 문자표에 있고 그 글리프가 파일에도 있는 문자만 가졌다고 한다.
+위치는 첫 글꼴의 단위다. 다른 단위(upem)의 글꼴은 실행 안의 펜을 통째로 바꿔 반올림이 쌓이지 않게 한다.
정답인 참조 구현이 없으므로(브라우저마다 다르다), [text/test-layout.c](../../text/test-layout.c)는 부품이 약속하는 것을 확인한다.
무작위 문단(라틴·아랍·히브리 낱말, 부호, 숫자, 괄호, 방향 표시, 줄 구분자)을 무작위 폭으로 짠다. 그리고 다음을 본다.