시리아어 / 몽골어 / 데바나가리 shaping 지원

다중 script 능력 표면(v2.119.53 - v2.119.55)

 

아랍어 shaping  자동 shaping 파이프라인  GSUB 엔진

HotPDF는 아랍어를 제외한 세 complex script, 즉 시리아어(U+0700-U+074F), 몽골어(U+1800-U+18AF), 데바나가리(U+0900-U+097F)에 joining 클래스/위치 분석/Indic 음절 범주 능력 표면을 노출합니다. 각 능력은 호출자가 기존 OpenType GSUB 엔진으로 올바른 shaping을 수행하게 하면서, 무거운 작업(클러스터 경계 탐지, BiDi 해석, GPOS positioning)은 HotPDF 범위 밖에 둡니다

 

시리아어 shaping 능력(v2.119.53)

두 새 메서드가 시리아어 joining 동작을 노출합니다:

 

function GetSyriacJoiningClass(CP: Cardinal): TJoiningClass;

function GetSyriacPosition(const Run: array of Cardinal; Index: Integer): TPosition;

 

시리아어는 아랍어와 같은 Right-Joining/Dual-Joining/Transparent/Non-Joining 4클래스 체계를 따릅니다. GetSyriacJoiningClass는 U+0700-U+074F 블록의 각 codepoint를 Unicode joining 속성에 따라 분류하고, GetSyriacPosition은 시리아어 run을 훑으며 각 문자를 인접 문자의 joining 클래스에 근거해 isolated/initial/medial/final 위치로 해석합니다

 

아랍어와 달리 시리아어 블록에는 Unicode에 미리 인코딩된 Presentation Forms가 없습니다. U+FB50-FDFF/U+FE70-FEFC Arabic Presentation Forms 블록에 해당하는 시리아어 영역이 없습니다. 따라서 소비자는 codepoint 재작성이 아니라 폰트가 정의한 GSUB lookup(보통 init/medi/fina/isol + rlig)으로 시리아어 shaping을 구동해야 합니다. 위 능력 계층은 호출자가 glyph마다 올바른 GSUB feature를 조회하는 데 필요한 위치 라벨을 제공합니다

 

몽골어 shaping 능력(v2.119.54)

몽골어용으로 짝을 이루는 두 메서드입니다:

 

function GetMongolianJoiningClass(CP: Cardinal): TJoiningClass;

function GetMongolianPosition(const Run: array of Cardinal; Index: Integer): TPosition;

 

커버리지는 기본 몽골어(U+1820-U+1842), Todo(U+1843-U+1877), Sibe(U+1880-U+18A8), 만주어, Ali Gali 확장을 포함합니다. Variation Selector FVS1/FVS2/FVS3(U+180B-U+180D), 소프트 하이픈 NIRUGU(U+180A), Ali Gali 모음 기호는 모두 Transparent(T클래스)로 분류되어 순회를 끊지 않고 joining에 참여합니다

 

시리아어처럼 몽골어에도 Unicode에 미리 인코딩된 Presentation Forms가 없습니다. 몽골어의 전통 세로 조판, 복잡한 글자 형태 변형 규칙, FVS 기반 형태 선택은 모두 폰트가 정의한 GSUB lookup(보통 init/medi/fina/isol + ccmp/rlig/locl)이 구동하는 것으로 기대되며, 능력 계층은 그 feature들을 조회할 위치 라벨을 호출자에게 줍니다

 

데바나가리 Indic shaping 능력(v2.119.55)

데바나가리는 아랍어/시리아어/몽골어와 근본적으로 다릅니다. 의미 단위가 단일 글자가 아니라 음절 클러스터(아크샤라)이고 클러스터 안 glyph의 렌더링 순서가 논리적 Unicode 순서와 다른 경우가 잦은 Indic 아부기다 문자입니다. 두 메서드가 데바나가리의 Indic 능력 계층을 노출합니다:

 

function GetDevanagariCategory(CP: Cardinal): TIndicCategory;

procedure ApplyDevanagariReorder(var Run: array of Cardinal);

 

GetDevanagariCategory는 U+0900-U+097F의 각 codepoint를 13가지 Indic 음절 범주(Base/Consonant/Vowel/Independent Vowel/Vowel Mark/Pre-base Matra/Above-base Matra/Below-base Matra/Halant Virama/Repha/Anusvara/Visarga/Other) 중 하나로 분류해, 호출자가 음절 경계를 탐지하고 클러스터 안 어느 위치를 재정렬해야 하는지 알아낼 수 있게 합니다

 

ApplyDevanagariReorder는 입력 run을 훑으며 데바나가리의 두 가지 주요 재정렬 규칙을 적용하는 사전 처리입니다. (1) Repha(음절 클러스터 시작의 Ra + Halant)는 클러스터 base 자음 뒤 위치로 옮겨 위첨자 갈고리로 그려지게 하고, (2) pre-base I-matra(U+093F DEVANAGARI VOWEL SIGN I)는 클러스터 base 자음 앞으로 옮겨 왼쪽 갈고리로 그려지게 합니다. 위첨자 matra, 아래첨자 matra, 결합 자음 형성 같은 다른 Indic 재정렬은 폰트별 lookup 테이블이 필요하므로 폰트의 GSUB 엔진에 맡깁니다

 

자동 통합(v2.119.67): sfIndicShaping in PDF.ShapingFeatures이면 세 BuildUnicode*FieldContent 헬퍼 안에서 ApplyDevanagariReorder가 사전 처리로 자동 적용됩니다. 이후 소비자 reader의 GSUB 엔진이 올바른 순서의 음절을 받아 자체 contextual shaping 규칙을 적용합니다. 자동 shaping 파이프라인을 보십시오

 

전형적인 워크플로(시리아어)

 

PDF.RegisterUnicodeTTF('Estrangelo', 'SyrCOMEdessa.otf');

PDF.SetGSUBScript('syrc');  // GSUB 엔진 문서 참조

for i := 0 to Length(Run) - 1 do

begin

  Pos := PDF.GetSyriacPosition(Run, i);  // init / medi / fina / isol

  // 위치에 맞는 치환 glyph을 GSUB로 조회

  // 출력 + MarkUnicodeGlyphUsed

end;

 

전형적인 워크플로(자동 재정렬이 있는 데바나가리)

 

PDF.RegisterUnicodeTTF('NotoDeva', 'NotoSansDevanagari-Regular.ttf');

PDF.ShapingFeatures := [sfIndicShaping];  // Repha + I-matra 자동 재정렬

PDF.CurrentPage.SetFont('NotoDeva', [], 14);

PDF.CurrentPage.UnicodeTextOut(50, 700, 0,

  UnicodeString(#$0939#$093F#$0928#$094D#$0926#$0940)); // "Hindi"

 

Unicode subset과 추출 헬퍼

RegisterToUnicodeReverseMapping은 shaped 또는 합성 glyph 출력의 소스 codepoint를 기록합니다. ClearToUnicodeReverseMappings는 테이블을 초기화하고, ToUnicodeReverseMappingCount는 크기를 보고하며, GetUnicodeGlyphForCodepoint은 Unicode codepoint의 등록 폰트 glyph ID를 반환하고, EnableShapingFeatureForSubset은 GSUB feature의 치환 glyph을 내장 subset에 포함하도록 표시합니다

 

범위와 한계

현재 생산자 측 통합

시리아어, 몽골어, 티베트어, Indic shaping은 이제 명시적인 API 참조 페이지를 갖습니다. 시리아어는 AutoShapeSyriac으로, 몽골어는 sfMongolianShaping으로, 티베트어는 sfTibetanShaping으로, Indic 재정렬은 sfIndicShaping으로, 완전한 Indic GSUB shaping은 sfIndicGSUB으로 켭니다. 상세 진입점은 티베트어/몽골어/시리아어 shaping 메서드와 Indic shaping 메서드에 문서화돼 있습니다

현재 범위에는 RTL cursive script인 N'Ko와 Adlam, 태국어/라오어 SARA AM·성조 기호 정렬, 히브리어 niqqud 정렬, 자바어 pre-base 기호도 포함됩니다. 이 경로는 script shaping 사전 처리 메서드에 문서화돼 있습니다

 

 

See also: 아랍어 / 페르시아어 / 우르두어 shaping 지원, 자동 shaping 파이프라인(Phase 8), OpenType GSUB 치환 엔진, THotPDF.AssignSyntheticCodepointForGID