스타일을 넘나드는 리치 텍스트 마크
typed 리치 텍스트는 원본 논리 V와 canonical RV를 유지하면서, 같은 물리 행에서 선행 조합 기호를 실제 앞선 렌더링 글리프에 맞춰 배치합니다
베이스와 마크는 서로 다른 공급 regular, bold, italic, bold-italic 폰트 프로그램, 서로 다른 포인트 크기, 서로 다른 색을 쓸 수 있습니다
배치는 확장 positioning 룩업을 포함해 실제 GPOS mark-to-base, mark-to-ligature, mark-to-mark 어태치먼트를 읽습니다. 베이스 앵커는 자신의 폰트와 스케일을, 마크 앵커는 자신의 폰트와 스케일을 씁니다
문맥 아라비아어 접합은 스타일 경계를 넘어 계속 활성화되고, 어태치된 마크는 고립된 nominal 글리프 대신 접합 결과 베이스 글리프를 씁니다
선행 마크는 독립적인 자식 변환을 받으므로, 마크를 붙여도 뒤따르는 일반 텍스트가 움직이지 않고 논리 자간 어드밴스도 바뀌지 않습니다
리치 자식 폼은 음수 원점 조합 기호와 이탤릭 아웃라인을 포함한 글리프 오버행을 유지합니다. 소유 appearance가 위젯 클립, 회전, 문단 정렬을 공급합니다
어태치된 잉크는 행 범위 산정에 반영되므로 쌓인 마크도 필드 위쪽에 계속 보일 수 있습니다. 위젯보다 큰 분리 불가 클러스터는 기존 bounded 클리핑 동작을 유지합니다
일치하는 어태치먼트 커버리지가 없으면 실제 선택 TrueType 글리프 헤더 경계가 독립 포인트 크기 스케일과 네이티브 Unicode 조합 클래스로 배치 폴백을 공급합니다
폴백 배치는 위, 아래, 어태치, 좌/우, 이중 마크를 구분합니다. 같은 쪽 마크는 쌓이고 반대쪽 마크는 베이스 아웃라인으로 돌아가며, 일치하는 GPOS 앵커가 언제나 우선합니다
이중 조합 기호는 Unicode 행바꿈 클래스가 nonbreaking이어도 어태치먼트 후보로 남습니다. 논리 텍스트, 원본 스타일, 뒤따르는 자간 어드밴스는 그대로입니다
이중 마크의 폴백 엣지는 문단 안에 끼인 반대 방향 항목을 포함해 텍스트 항목의 실제 풀린 bidi 레벨을 따릅니다
폴백 경계는 실제 폰트가 선언한 아웃라인 헤더를 기술합니다. 임의 폰트 패밀리의 자동 재구성은 이 공급 폰트 계약 밖입니다
폰트 테이블 읽기는 실제 GPOS 테이블로 한정되고 취소를 관찰하며, 공급된 모든 스타일 폰트가 순회 예산을 나눠 씁니다. 잘못된 테이블 오프셋은 문서 필드가 바뀌기 전에 실패합니다
언힌팅된 PDF 아웃라인은 디바이스별 픽셀 조정 없이 디자인 좌표 앵커를 씁니다
인수 검증
HotPDFHeadlessRichMarkTests.pas는 실제 라틴, 아라비아어, 히브리어 마크 appearance, 쌓인 마크, 진짜 아라비아어 리가처, 혼합 크기·색, 래핑, 자간, 정렬, 회전을 저장하고 재로드합니다
Verify-HeadlessRichMarks.py는 fontTools로 실제 임베드 폰트 프로그램을 읽고 GPOS 앵커를 독립 계산하며, 소스 값과 스타일을 검증하고, 같은 실제 appearance에서 해당 마크만 빼고 렌더링해 각 마크가 보이는 MuPDF 픽셀에 기여하는지 확인합니다
HotPDFHeadlessRichMarkFallbackTests.pas와 Verify-HeadlessRichMarkFallback.py는 실제 GPOS 없는 폰트, 보이는 저장 appearance, raw 조합 클래스, 선택 글리프 경계, 취소를 검사합니다. 일치하는 앵커가 폴백 배치보다 우선권을 유지하는지도 검증합니다