diff options
| author | eunhhu <[email protected]> | 2026-09-28 13:03:50 +0100 |
|---|---|---|
| committer | eunhhu <[email protected]> | 2026-09-28 13:03:50 +0100 |
| commit | 202e6bf4677565c0cfbef5340119d0f9674bf17d (patch) | |
| tree | de23a6974e74784813556e51b52c0719b699b220 /docs | |
| parent | 0d2e04f1c9d05a598deb443ba067ef61e0b9cab3 (diff) | |
| download | vega-202e6bf4677565c0cfbef5340119d0f9674bf17d.tar.gz vega-202e6bf4677565c0cfbef5340119d0f9674bf17d.zip | |
Set paragraphs into lines: bidi, script runs, shaping, line breaking, visual order
text/layout.c puts the checked parts together: a paragraph's levels,
scripts resolved for Common and Inherited characters, break
opportunities, one shaping to measure, lines broken at the last
opportunity that fits (trailing spaces hang, and a line that shapes
wider than measured backs off), then per line L1, runs of one level and
one script shaped again, the runs in L2's order and their glyphs placed.
test-layout checks 30,000 random mixed-script paragraphs: lines cover
the text, mandatory breaks end lines, lines fit when they can, and
glyphs come in the order UAX #9 gives the characters. vega-symbols
paragraph draws a layout through the symbol file's glyphs.
Diffstat (limited to 'docs')
| -rw-r--r-- | docs/design/004-text.md | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/docs/design/004-text.md b/docs/design/004-text.md index b95a205..3e4dc99 100644 --- a/docs/design/004-text.md +++ b/docs/design/004-text.md @@ -123,3 +123,30 @@ advance, 오프셋 가운데 하나라도 다른 실행이 있으면 파일을 � - 기본·아랍·히브리 셰이퍼가 아닌 문자 체계: 인도계, 태국·라오, 한글 자모, 크메르, 미얀마, USE 문자 체계들, 시리아. - 이체 선택자(cmap 형식 14)는 싣지 않는다. 선택자는 숨기고 앞 글자는 기본 글리프로 둔다. +## 비례폭 글줄 + +[text/layout.c](../../text/layout.c)는 검증한 부품을 UAX #9 3.4절과 UAX #14가 말하는 순서로 잇는다. + +1. 문단의 수준(P2–I2). 제거된 문자는 앞 문자의 수준을 받는다. +2. 문자마다 문자 체계. Common과 Inherited는 앞 문자의 것을 받고, 맨 앞이면 뒤에서 처음 나오는 것을 받는다. +3. 줄 바꿈 기회와, 문단을 한 번 셰이핑해 잰 문자마다의 폭. +4. 줄: 보이는 부분이 아직 들어가는 마지막 기회에서 바꾼다. 줄 끝의 공백은 줄 밖으로 걸린다. 들어가는 기회가 없으면 첫 기회에서 + 바꾼다. 줄로 다시 셰이핑하면 잰 것보다 넓을 수 있다(줄 끝 글자가 끝 꼴이 되는 아랍 문자). 그러면 앞 기회로 물러난다. +5. 줄마다: 줄 끝에서 L1을 하고, 수준과 문자 체계가 같은 실행으로 나눠 다시 셰이핑하고(연결과 커닝이 줄과 함께 끝난다), + 실행들을 L2 순서로 놓고, 글리프를 왼쪽부터 놓는다. 오른쪽에서 왼쪽으로 쓰는 문단의 줄은 오른쪽 끝에 맞춘다. + +정답인 참조 구현이 없으므로(브라우저마다 다르다), [text/test-layout.c](../../text/test-layout.c)는 부품이 약속하는 것을 확인한다. +무작위 문단(라틴·아랍·히브리 낱말, 부호, 숫자, 괄호, 방향 표시, 줄 구분자)을 무작위 폭으로 짠다. 그리고 다음을 본다. + +- 줄이 문단을 순서대로 빈틈없이 덮는다. +- 필수 줄 바꿈마다 줄이 끝난다. +- 안에서 바꿀 기회가 있는 줄은 폭을 넘지 않는다. +- 글리프의 클러스터가 자기 줄 안에 있다. +- 글리프가 `vega_bidi_order`(줄 끝의 L1 뒤)가 문자를 놓는 순서대로 놓인다. + +3만 문단(565만 문자, 22.9만 줄)에서 어긋남이 없다. 문자당 776 ns다(재기 위한 셰이핑과 줄마다의 셰이핑 두 번, 양방향, 줄 바꿈 +포함). + +`vega-symbols paragraph`는 문단을 짜서 심볼로 그린다. 라틴(ffi·fi·fj 합자, AVAWA 커닝), 아랍(연결, lam-alef, 부호, +오른쪽 맞춤과 줄 사이의 순서), 히브리 부호, 섞인 문장(왼쪽에서 오른쪽 문장 안의 아랍 낱말과 괄호, 숫자)을 눈으로도 확인했다. + |
