diff options
Diffstat (limited to 'docs/design')
| -rw-r--r-- | docs/design/003-pixel-surface.md | 33 | ||||
| -rw-r--r-- | docs/design/004-text.md | 3 |
2 files changed, 34 insertions, 2 deletions
diff --git a/docs/design/003-pixel-surface.md b/docs/design/003-pixel-surface.md index 725f3b1..7e60e58 100644 --- a/docs/design/003-pixel-surface.md +++ b/docs/design/003-pixel-surface.md @@ -28,6 +28,29 @@ Raspberry Pi 5. todo 예제에 한글 항목 넷, 48×12칸, 20px: 실행 전체(3.6 MB 심볼 파일 열기, 글리프 약 40개 굽기, 그리기, PPM 쓰기)가 7 ms다. 192×45칸(1920×1350)은 프레임마다 12 ms다(그리기, 합성, 7.8 MB PPM을 `/dev/shm`에 쓰기). +## 조판: 격자가 놓고, 글꼴이 짠다 + +칸은 터미널의 단위다. 사람이 보는 화면에서 고정폭 칸에 한 글자씩 두면 아랍 문자는 이어지지 않고, 데바나가리는 결합자를 못 +만들고, 라틴은 커닝이 없다. 칸마다 그리는 길은 셰이핑([004](004-text.md))을 쓸 자리가 없다. 그렇다고 칸의 레이아웃을 버리고 +박스 레이아웃을 새로 두면 TUI와 GUI가 두 레이아웃이 된다. 그래서 레이아웃은 칸의 것을 그대로 쓰고, 글을 짜는 일만 픽셀이 한다. + +- `vega_draw`는 칸을 채우면서 쓴 글을 스팬으로도 남긴다(`VegaSpan`: 행, 받은 열 [column, end), 칸이 닿은 곳, UTF-8, 톤). + 같은 펜이 멈춘 자리에서 이어 쓴 스팬은 앞 스팬을 따른다(필드 이름과 값, 도움말 줄, 입력 줄). 펜을 옮겨 쓴 스팬(표의 열, + 목록의 라벨, 배지)은 제 열에서 새로 시작한다. 배지는 끝에 붙인다. +- 첫 글꼴이 셰이핑을 가지면(`--shape`로 만든 심볼 파일) 픽셀은 글을 짠다. 스팬과 그것을 따르는 스팬들이 한 줄의 글이 + 된다. 한 문단으로 짜므로(`vega_layout`, 방향은 첫 강한 문자에서) 양방향과 커닝이 스팬 경계를 넘는다. 글리프의 색은 그 + 문자가 온 스팬의 톤이다. 줄은 제 열에서 시작해, 스팬들의 끝과 행의 다음 스팬의 열 중 가까운 곳까지 쓸 수 있다. 넘치면 자소 + 클러스터 경계에서 자르고 말줄임표를 붙인다(이분 탐색, 들어가는 가장 긴 앞부분). 입력 줄에는 글 뒤에 커서를 그린다. +- 글꼴은 `--symbols`를 되풀이해 선호 순서로 준다(최대 8개). 클러스터마다 그것을 가진 첫 글꼴로 간다. 칸의 크기는 첫 글꼴의 + 숫자와 줄이다. 다른 글꼴의 글리프도 같은 기준선에 놓이고, 줄 밖으로 나가는 잉크(데바나가리의 아래 모음 부호 등)는 자르지 + 않는다. 첫 글꼴이 셰이핑을 갖지 않으면 전처럼 칸마다 그리되, 칸의 글자도 그것을 가진 첫 글꼴에서 가져온다. +- 셰이핑할 수 없는 줄(어느 글꼴도 그 문자 체계의 계획이 없다)은 그 스팬들의 칸으로 그린다. + +DejaVu Sans(라틴·아랍), Noto Sans CJK KR(한글), Noto Sans Devanagari를 20px로 쌓은 todo 화면에서 한글 항목, 결합한 아랍 +낱말, 데바나가리 결합자(स्त), 커닝(AV, Wa), 한 줄 안의 양방향("hello 123 مرحبا world"), 끝에 붙은 배지, 말줄임표, 커서를 +눈으로 확인했다. 100×50칸(1200×1200)에 여러 문자 체계의 줄 50개를 짜는 데 프레임마다 약 2.9 ms가 더 든다(칸으로 그리기 +대비, 40프레임 0.39 s 대 0.28 s, PPM 쓰기 포함). + ## 디스플레이(KMS) `vega display MODULE --symbols FONT.vsym [--size PX] [--card PATH] [--writeback WxH --out PREFIX] < script`: 같은 프레임을 @@ -62,8 +85,16 @@ SIGTERM)에서 멈춘다. `tests/check.py` 11번. 같은 스크립트를 `tui --dump`와 `pixels`로 돌려 글이 같고, 그림에서 빈 칸은 그 행의 배경(포커스 행은 제 색)뿐이며 글자가 있는 칸에는 잉크가 있다(프레임 둘, 칸 1,024개). +조판은 11번의 둘째 부분이다. DejaVu Sans, Noto Sans CJK KR, FreeSans(데바나가리)를 쌓는다. 목록에 혼자 있는 한 문자 체계의 +라벨(라틴 커닝, 한글, 아랍, 데바나가리)은 그것을 가진 글꼴 하나로 `vega-symbols paragraph`가 짠 그림과 픽셀마다 같다(커버리지 +±4, 57,408픽셀). 그래서 클러스터마다 맞는 글꼴로 가서 레이아웃이 말하는 대로 셰이핑되고 놓였다. 클러스터를 늘 첫 글꼴로 +보내는 변이를 넣으면 한글 라벨에서 잡는다. 여러 라벨에서는 행에 안 들어가는 라벨이 행 안에서 잘리고, 글이 없는 행은 비어 +있고, 입력 줄에 커서가 있다. + ## 다음 - 바뀐 칸만 다시 그리고 복사한다(TUI가 이미 칸마다 보인 것을 기억한다). 커밋을 기다리지 않고 페이지 넘김 이벤트로 맞춘다. - 입력: 한글 입력기(지금은 US 배열의 글자만 친다), 제스처(끌기로 스크롤). -- 비례 글꼴의 줄: 칸이 아닌 글자 폭으로 놓는 표와 문단. 합성은 GPU로(아틀라스, [002](002-symbol-format.md)). +- 조판의 캐시: 바뀌지 않은 줄은 다시 짜지 않는다(지금은 프레임마다 모든 줄을 짠다). 합성은 GPU로(아틀라스, + [002](002-symbol-format.md)). +- 칸이 아닌 글자 폭으로 놓는 표와 여러 줄 문단(지금은 한 줄을 받은 열 안에 짠다). diff --git a/docs/design/004-text.md b/docs/design/004-text.md index 8325109..4e8e7fb 100644 --- a/docs/design/004-text.md +++ b/docs/design/004-text.md @@ -261,7 +261,8 @@ U+180B–180E만 넣고 네 번째 자유 이체 선택자(U+180F)를 빠뜨렸� - 글리프의 클러스터가 자기 줄 안에 있다. - 글리프가 `vega_bidi_order`(줄 끝의 L1 뒤)가 문자를 놓는 순서대로 놓인다. -3만 문단(565만 문자, 22.9만 줄)에서 어긋남이 없다. 문자당 776 ns다(재기 위한 셰이핑과 줄마다의 셰이핑 두 번, 양방향, 줄 바꿈 +3만 문단(565만 문자, 22.9만 줄)에서 어긋남이 없다. 글꼴 목록은 픽셀 표면의 조판이 끝에서 끝까지 확인한다 +([003](003-pixel-surface.md)). 문자당 776 ns다(재기 위한 셰이핑과 줄마다의 셰이핑 두 번, 양방향, 줄 바꿈 포함). `vega-symbols paragraph`는 문단을 짜서 심볼로 그린다. 라틴(ffi·fi·fj 합자, AVAWA 커닝), 아랍(연결, lam-alef, 부호, |
