다음을 통해 공유


OpenType 변수 글꼴

이 항목에서는 OpenType 변수 글꼴, DirectWrite 및 Direct2D에서의 지원 및 앱에서 사용하는 방법에 대해 설명합니다. 

OpenType 변수 글꼴이란?

OpenType 글꼴 형식 사양의 버전 1.8에는 OpenType 글꼴 변형이라는 형식에 대한 새로운 확장이 도입되었습니다. 이러한 확장을 사용하는 글꼴을 OpenType 변수 글꼴이라고 합니다. OpenType 변수 글꼴은 여러 디자인 간에 연속 보간을 사용하여 여러 글꼴처럼 동작할 수 있는 단일 글꼴로, 모두 단일 글꼴 내에 정의됩니다.

OpenType 변수 글꼴은 두께 또는 너비와 같은 하나 이상의 독립적인 축을 따라 디자인의 연속 변형을 정의할 수 있습니다.

 

문자 'G'를 사용하여 OpenType 변수 글꼴을 표시하고 가로 너비 축과 세로 두께 축을 따라 다양한 변형을 표시합니다.

글꼴 개발자는 지정된 글꼴에 사용할 변형 축 집합을 결정합니다. 이러한 축에는 가중치 및 너비와 같은 잘 알려진(또는 "등록된") 변형 축 집합이 포함될 수 있지만 글꼴 개발자가 정의한 임의의 사용자 지정 변형 축을 포함할 수도 있습니다.  

글꼴에 대한 변형 축 집합을 선택하면 글꼴 개발자는 글꼴에 대한 디자인 변형의 추상 n차원 공간을 정의합니다. 텍스트 엔진은 텍스트를 배치하고 렌더링하기 위한 연속 공간 내에서 잠재적으로 모든 위치 또는 "instance"을 지정할 수 있습니다. 

글꼴 개발자는 디자인 변형 공간 내의 특정 인스턴스에 이름을 선택하고 할당할 수도 있습니다. 이를 "명명된 인스턴스"라고 합니다. 예를 들어 가중치 변형이 있는 글꼴은 매우 가볍고 매우 무거운 스트로크 간의 연속 변형을 지원할 수 있으며, 글꼴 개발자는 해당 연속체를 따라 특정 가중치를 선택하고 "밝게", "일반" 및 "세미볼드"와 같은 이름을 할당했습니다. 

OpenType 변수 글꼴 형식은 기존 OpenType 글꼴에 있는 데이터 테이블과 다양한 인스턴스에 대해 다양한 데이터 항목의 값이 변경되는 방식을 설명하는 특정 추가 테이블을 사용합니다. 형식은 한 변형 instance "기본 instance"로 지정합니다. 이 변형은 기존 테이블을 사용하여 기본값을 가져옵니다. 다른 모든 인스턴스는 기본 데이터와 다른 델타 데이터에 따라 달라집니다. 예를 들어 'glyf' 테이블에는 기본 instance 사용되는 도형인 명목 문자 모양에 대한 Bezier-curve 설명이 있을 수 있으며, 'gvar' 테이블은 문자 모양에 대한 Bezier 컨트롤 포인트가 다른 인스턴스에 대해 조정되는 방법을 설명합니다. 마찬가지로 다른 글꼴 값에는 명목 값과 다른 인스턴스에 대해 해당 값이 변경되는 방식을 설명하는 델타 데이터가 있을 수 있습니다. 예를 들어 x 높이 및 기타 글꼴 전체 메트릭 또는 문자 모양별 마크 앵커링 위치 및 커닝 조정이 있습니다. 

변수 글꼴은 임의 변형 축 집합을 지원할 수 있으므로 글꼴 디자이너가 글꼴 패밀리를 만드는 방법을 보다 직접적으로 반영하는 확장 가능한 글꼴 패밀리 모델이 필요합니다. 글꼴 패밀리는 디자인이 다를 수 있는 임의의 숫자(글꼴 개발자가 결정)를 사용하여 일정한 패밀리 이름과 특정 디자인 특성으로 정의됩니다. 하나의 글꼴 패밀리는 가중치 변형으로 만들 수 있지만 x 높이, 세리프 크기, "funkiness" 또는 개발자가 원하는 글꼴에 대한 변형을 사용하여 다른 글꼴 패밀리를 만들 수 있습니다. 이 모델에서 글꼴 얼굴 선택은 일반 또는 "기본 설정" 또는 "입력", 패밀리 이름 및 키-값 쌍 집합을 사용하여 가장 잘 설명되며, 각 쌍은 일종의 변형 및 특정 값을 나타내며 일반적으로 변형 종류는 확장 가능한 집합입니다. 글꼴 패밀리의 일반적인 개념은 가변이 아닌 기존 글꼴뿐만 아니라 가변 글꼴에도 적용할 수 있습니다. 예를 들어 이 일반적인 타이포그래피 패밀리 모델에서 제품군 "Selawik VF"는 "Semilight Banner Sans"와 같은 인스턴스와 함께 무게, 광학 크기 및 세리프 디자인에 대한 변형이 있을 수 있습니다. 

그러나 기존 DirectWrite API를 포함한 일부 기존 소프트웨어 구현은 글꼴 패밀리의 모델이 더 제한적이라고 가정하여 설계할 수 있습니다. 예를 들어 일부 애플리케이션에서는 글꼴 패밀리에 보통, 굵게, 기울임꼴 및 굵게 기울임꼴 변형이 있을 수 있다고 가정할 수 있습니다. 기존 IDWriteFontCollectionIDWriteFontFamily 인터페이스는 가중치/스트레치/스타일("WSS") 패밀리 모델을 가정하므로 DWRITE_FONT_WEIGHT, DWRITE_FONT_STRETCH 또는 DWRITE_FONT_STYLE 열거형을 매개 변수로 사용하여 패밀리 내의 변형을 지정할 수 있습니다. 이전 예제에서 광학 크기 및 세리프 축은 WSS 모델의 변형 패밀리 내부 축으로 처리되지 않습니다. 

가변 글꼴을 완벽하게 지원하려면 글꼴에 의해 결정된 대로 잠재적으로 여러 매개 변수를 사용하여 패밀리 멤버를 지정할 수 있는 API가 필요합니다. 그러나 기존 API 디자인은 변수 글꼴에 정의된 명명된 인스턴스를 더 제한된 글꼴 패밀리 모델에 프로젝션하여 가변 글꼴에 대한 부분 지원을 제공할 수 있습니다. 이전 예제에서 "Selawik VF Semilight Banner Sans"는 WSS 모델에 "Semilight"를 가중치 변형으로 사용하여 "Selawik VF 배너 Sans" 제품군으로 프로젝팅할 수 있습니다. 

또 다른 예제에서는 무게 및 광학 크기 변형이 있는 Sitka와 같은 입력 글꼴 패밀리를 고려합니다. 가족 내의 명명된 변형에는 Sitka Text Regular 및 Sitka 배너 굵게(기타 많은 항목 포함)가 포함됩니다. 타이포그래피 패밀리 이름은 "Sitka"이며, 타이포그래피 패밀리 모델의 이러한 변형에 대한 얼굴 이름은 "텍스트 일반" 및 "배너 굵게"입니다. 4개 멤버 및 WSS 제품군 모델은 제품군 내에서 광학 크기 변형을 허용하지 않으므로 광학 크기 구분은 가족 수준의 구분처럼 취급되어야 합니다. 다음 표에서는 Sitka 입력 체계 패밀리에서 선택한 글꼴을 WSS 패밀리 모델에서 처리하는 방법을 보여 줍니다.

타이포그래픽 패밀리 모델

WSS 제품군 모델

패밀리

Face

패밀리

Face

싯카

텍스트 일반

Sitka 텍스트

주기적

싯카

배너 굵게

Sitka 배너

굵게

싯카

캡션 기울임꼴

Sitka 캡션

기울임꼴

 

입력 체계 패밀리 모델에서 WSS 패밀리 모델로 이름 프로젝션은 변수가 없는 글꼴 및 변수 글꼴의 명명된 인스턴스에 적용할 수 있습니다. 그러나 변수 글꼴의 연속 디자인 변형 공간에서 이름이 지정되지 않은 다른 인스턴스의 경우 이 작업을 수행할 수 없습니다. 이러한 이유로 가변 글꼴의 전체 기능을 지원하려면 제약이 없는 변형 축 및 축 값 집합 측면에서 입력 체계 패밀리 내의 얼굴을 참조하도록 설계된 API가 필요합니다. 

DirectWrite OpenType 변수 글꼴 지원

Windows 10 크리에이터스 업데이트 릴리스를 기준으로 OpenType 변수 글꼴 형식은 여전히 매우 새로운 형식이며 글꼴 공급업체, 플랫폼 및 앱은 여전히 새 형식을 구현하는 중입니다. 이 업데이트는 DirectWrite 이 형식에 대한 초기 구현을 제공합니다. 

DirectWrite 내부는 OpenType 변수 글꼴을 지원하도록 업데이트되었습니다. 현재 API를 사용하여 변수 글꼴의 명명된 인스턴스를 지원합니다. 이 지원은 명명된 인스턴스 열거, 명명된 instance 선택, 레이아웃 및 셰이핑에 사용, 렌더링 및 인쇄에 이르기까지 전체 워크플로에 사용할 수 있습니다. 특정 작업에 GDI 텍스트 interop을 사용하는 앱의 이점을 위해 기존 GDI API에도 유사한 지원이 추가되었습니다. 

Windows 10 크리에이터스 업데이트 DirectWrite 가변 글꼴의 연속 변형 기능을 활용하는 임의의 인스턴스를 지원하지 않습니다.

많은 작업에서 변수 글꼴의 명명된 인스턴스 DirectWrite 동작은 변수가 아닌 글꼴의 동작과 구별할 수 없습니다. 또한 기존 DirectWrite API를 사용하여 지원이 제공되므로 변수 글꼴의 명명된 인스턴스는 변경 없이 많은 기존 DirectWrite 앱에서도 작동할 수 있습니다. 그러나 특정 상황에서는 예외가 적용될 수 있습니다.

  • 앱이 특정 작업에 대해 글꼴 데이터를 직접 처리하는 경우 예를 들어 앱이 글꼴 파일에서 직접 문자 모양 윤곽선 데이터를 읽는 경우 특정 시각적 효과를 만듭니다.
  • 앱이 특정 작업에 타사 라이브러리를 사용하는 경우 예를 들어 앱이 레이아웃에 DirectWrite 사용하여 최종 문자 모양 인덱스와 위치를 가져오는 경우 렌더링에 타사 라이브러리를 사용합니다.
  • 앱이 글꼴 데이터를 문서에 포함하거나 다른 방법으로 글꼴 데이터를 다운스트림 프로세스에 전달하는 경우

가변 글꼴을 지원하지 않는 구현을 사용하여 작업을 수행하는 경우 이러한 작업으로 인해 예상된 결과가 생성되지 않을 수 있습니다. 예를 들어 문자 모양 위치는 변수 글꼴의 명명된 instance 대해 계산될 수 있지만 문자 모양은 다른 명명된 instance 가정하여 렌더링될 수 있습니다. 애플리케이션 구현에 따라 결과가 일부 컨텍스트에서 작동할 수 있지만 다른 라이브러리를 사용할 수 있는 다른 컨텍스트에서는 작동하지 않을 수 있습니다. 예를 들어 텍스트가 화면에 올바르게 표시될 수 있지만 인쇄할 때는 표시되지 않습니다. DirectWrite 사용하여 엔드 투 엔드 워크플로를 구현하는 경우 변수 글꼴의 명명된 인스턴스에 대한 올바른 동작이 예상될 수 있습니다. 

기존 DirectWrite API는 가중치/스트레치/스타일 모델을 사용하여 얼굴 선택을 지원하므로 다른 변형 축을 사용하는 글꼴의 명명된 인스턴스는 위에서 설명한 대로 일반적인 입력 체계 패밀리 모델에서 WSS 모델로 프로젝션됩니다. 이는 DWrite에서 가중치, 스트레치 또는 스타일 특성을 지정하는 얼굴 이름 토큰과 다른 변형 축과 관련된 토큰을 구분하는 데 사용하는 축 값 하위 테이블이 있는 "스타일 특성"('STAT') 테이블을 포함한 변수 글꼴을 사용합니다.  

변수 글꼴에 OpenType 사양의 가변 글꼴에 필요한 대로 'STAT' 테이블이 포함되지 않은 경우 DirectWrite 글꼴을 기본 instance 포함하는 비변수 글꼴로 처리합니다.  

글꼴에 'STAT' 테이블이 포함되어 있지만 적절한 축-값 하위 테이블이 포함되지 않은 경우 얼굴 이름이 동일한 여러 얼굴이 있는 등 예기치 않은 결과가 발생할 수 있습니다. 이러한 글꼴은 현재 지원되지 않습니다. 

OpenType 사양을 사용하면 문자 모양 윤곽선 데이터를 TrueType 개요 및 힌트 형식을 사용하는 'glyf' 테이블 사용 또는 컴팩트 글꼴 형식("CFF") 표현을 사용하는 'CFF' 테이블의 두 가지 형식 중 하나로 나타낼 수 있습니다. TrueType 윤곽선이 있는 변수 글꼴에서 'glyf' 테이블은 계속 사용되며 개요의 변형 데이터를 제공하는 'gvar' 테이블로 보완됩니다. 즉, TrueType 개요가 있는 변수 글꼴의 기본 instance 가변 글꼴이 지원되지 않는 이전 소프트웨어에서 지원되는 기존 OpenType 테이블만 사용합니다. 그러나 CFF 윤곽선이 있는 변수 글꼴에서 'CFF' 테이블은 기본 개요 데이터와 관련 변형 데이터를 한 테이블에 캡슐화하는 'CFF2' 테이블로 대체됩니다. CFF 데이터는 TrueType 데이터에 사용되는 별도의 래스터라이저에 의해 처리되며 ,'CFF2' 테이블에는 'CFF2' 지원이 있는 업데이트된 CFF 래스터라이저가 필요합니다. 이전 CFF 래스터라이저에서는 'CFF2' 테이블을 처리할 수 없습니다. CFF 개요 데이터가 있는 변수 글꼴의 경우 기본 instance 이전 소프트웨어에서도 작동하지 않습니다. 

Windows 10 크리에이터스 업데이트 DirectWrite 'CFF2' 테이블을 사용하여 CFF 개요 데이터가 있는 변수 글꼴을 지원하지 않습니다. 

OpenType 변수 글꼴 사용

OpenType 변수 글꼴은 위에서 설명한 현재 제한 사항에 유의하여 사용하기 쉬울 수 있습니다.

  • 현재는 변수 글꼴의 명명된 인스턴스만 지원됩니다.
  • 현재는 TrueType 문자 모양 윤곽선 데이터(CFF 윤곽선 아님)를 사용하는 변수 글꼴만 지원됩니다. 
  • 가중치, 스트레치 또는 스타일 이외의 디자인 변형 축을 사용하는 글꼴의 경우 명명된 인스턴스가 WSS 패밀리 모델에 프로젝션되어 일부 명명된 인스턴스가 별도의 패밀리로 표시될 수 있습니다(가변이 아닌 글꼴의 경우 과거와 같이). 이를 지원하려면 변수 글꼴에 적절한 축-값 하위 테이블이 포함된 'STAT' 테이블이 있어야 합니다.
  • 변수 글꼴의 명명된 인스턴스는 DirectWrite API에서 지원되지만 변수 글꼴을 지원하지 않는 이전 구현에서 특정 작업이 수행되면 잘못된 결과가 발생할 수 있습니다. 
  • 특정 DirectWrite API는 얼굴을 선택할 때 두께, 늘이기 및 스타일 특성을 지정하기 위해 DWRITE_FONT_WEIGHT, DWRITE_FONT_STRETCH 및 DWRITE_FONT_STYLE 열거형을 사용합니다. 변수 글꼴이 해당 변형 축을 사용하지만 더 세분성이 필요한 명명된 인스턴스가 많은 경우 명명된 모든 인스턴스를 해당 API에서 선택할 수 있는 것은 아닙니다.

이러한 요구 사항을 준수하는 OpenType 변수 글꼴은 다른 OpenType 글꼴과 마찬가지로 Windows 셸에서 설치할 수 있으며 앱에서 만든 사용자 지정 글꼴 집합에도 사용할 수 있습니다.  

시스템에 설치되면 변수 글꼴의 모든 명명된 인스턴스가 IDWriteFontFamily3::GetSystemFontSet 메서드를 호출하여 반환된 글꼴 집합에 포함됩니다. 글꼴 집합은 패밀리 그룹화 계층 구조가 없는 플랫 목록이지만 집합의 각 항목에는 WSS 패밀리 모델을 기반으로 하는 패밀리 이름 속성이 있습니다. 글꼴 집합은 IDWriteFontSet::GetMatchingFonts 메서드를 사용하여 instance 라는 특정 변수 글꼴에 대해 필터링할 수 있습니다. 그러나 familyName 을 사용하는 GetMatchingFonts 오버로드를 사용하는 경우 지정된 familyName은 WSS 글꼴 패밀리 모델을 준수하는 이름을 사용해야 합니다. 글꼴 집합에서 발생하는 WSS 호환 패밀리 이름의 전체 목록은 DWRITE_FONT_PROPERTY_ID_FAMILY_NAME 사용하여 IDWriteFontSet::GetPropertyValues 메서드를 사용하여 가져올 수 있습니다.  

마찬가지로 변수 글꼴의 명명된 인스턴스는 모두 IDWriteFactory::GetSystemFontCollection 메서드에서 반환된 글꼴 컬렉션에 표시됩니다. 글꼴 컬렉션의 요소는 WSS 모델을 기반으로 하는 글꼴 패밀리이므로 변수 글꼴의 명명된 인스턴스는 컬렉션에서 둘 이상의 글꼴 패밀리의 멤버로 표시될 수 있습니다. IDWriteFontCollection::FindFamilyName 메서드를 사용하는 경우 familyName 매개 변수는 WSS 호환 패밀리 이름이어야 합니다. 글꼴 컬렉션에서 WSS 호환 패밀리 이름을 모두 찾으려면 앱이 각 패밀리를 반복하고 IDWriteFontFamily::GetFamilyNames를 호출할 수 있지만, 해당 글꼴 집합을 가져오고 위에서 설명한 대로 GetPropertyValues 메서드를 사용하는 것이 더 쉬울 수 있습니다. 

사용자 지정 글꼴로 작업할 때 사용자 지정 글꼴 집합 항목에 설명된 다양한 방법을 사용하여 글꼴 집합을 만들 수 있습니다. 사용자 지정 글꼴 집합에 변수 글꼴을 추가하려면 변수 글꼴을 지원하고 단일 호출에서 변수 글꼴의 명명된 인스턴스를 모두 추가하므로 IDWriteFontSetBuilder1::AddFontFile 메서드를 사용하는 것이 좋습니다. 현재는 IDWriteFontSetBuilder::AddFontFaceReference 메서드를 사용하여 사용자 지정 변수 글꼴의 개별 명명된 인스턴스를 글꼴 집합에 추가할 수 없습니다. 변수 글꼴 파일에서 명명된 인스턴스 중 원하는 인스턴스를 지정하는 글꼴 얼굴 참조를 만들 방법이 없기 때문에 이때는 없습니다. 즉, 현재 사용자 지정 속성이 할당된 사용자 지정 글꼴 집합에 사용자 지정 글꼴의 명명된 인스턴스를 추가할 방법이 없습니다. 즉, 현재 사용자 지정 변수 글꼴을 원격 글꼴에 대한 DirectWrite API와 함께 쉽게 사용할 수 없습니다. 그러나 가변 글꼴의 명명된 인스턴스가 시스템 글꼴 집합에 포함된 경우 명명된 각 instance 대한 글꼴 얼굴 참조가 이미 존재하며 사용자 지정 속성 값 사용을 포함하여 사용자 지정 글꼴 집합에 추가할 수 있습니다. 자세한 내용은 사용자 지정 글꼴 집합 항목을 참조하세요. 

가변 글꼴로 작업할 때 DirectWrite DWRITE_FONT_WEIGHTDWRITE_FONT_STRETCH 열거형은 OpenType 사양에 정의된 두께 및 너비 변형 축과 밀접하게 연결되지만 동일하지는 않습니다. 첫째, 모든 변형 축의 숫자 눈금은 항상 소수 값을 지원하는 반면 fontWeight 및 fontStretch는 정수만 사용합니다. OpenType 가중치 축 눈금은 fontWeight에서도 지원되는 1에서 1000 사이의 값을 사용합니다. 따라서 변형 가중치 축 값에서 fontWeight로의 변경은 비교적 미미합니다. 명명된 instance 대해 보고된 fontWeight는 글꼴 내에서 명명된 instance 정의하는 데 사용되는 정확한 값에서 반올림될 수 있습니다. DirectWrite fontStretch와 OpenType 너비 축 눈금의 구분이 더 큽니다. DirectWrite OpenType OS/2 테이블의 usWidthClass 값에 따라 1에서 9 사이의 값을 사용하고 OpenType 너비 축 눈금은 일반 너비의 백분율을 나타내는 양수 값을 사용합니다. OpenType 사양의 usWidthClass 설명서에서는 값 1에서 9 사이의 매핑과 일반 값의 백분율을 제공합니다. 명명된 instance 대해 보고된 fontStretch 값은 너비 축 값에서 변환할 때 반올림을 포함할 수 있습니다. 

IDWriteTextFormat을 만들 때 글꼴 컬렉션 및 WSS 호환 글꼴 속성(패밀리 이름, 가중치, 늘이기 및 스타일)을 지정해야 합니다. IDWriteTextLayout 텍스트 범위에서 글꼴 서식 속성을 설정할 때도 적용됩니다. 속성은 IDWriteFontFace3 개체 또는 특정 명명된 instance 나타내는 IDWriteFontIDWriteFontFamily 개체에서 가져올 수 있습니다. 위에서 관찰한 대로 GetWeight 및 GetStretch 메서드에서 반환된 값은 명명된 instance 정의하는 데 사용되는 실제 축 값에 대해 근사치로 반올림될 수 있지만, DirectWrite 속성 조합을 원하는 명명된 instance 다시 매핑합니다. 

마찬가지로 앱이 IDWriteFontFallbackBuilder 를 사용하여 사용자 지정 글꼴 대체 데이터를 만드는 경우 WSS 호환 패밀리 이름을 사용하는 문자 범위 매핑에 대해 패밀리가 지정됩니다. DirectWrite 내의 글꼴 대체는 시작 패밀리의 변형과 가장 가까운 대체 패밀리 내에서 변형을 선택하는 DirectWrite 있는 패밀리를 기반으로 합니다. 가중치, 스트레치 및 스타일 이외의 차원을 포함하는 변형의 경우 사용자 지정 대체 데이터가 특별히 만들어지지 않는 한, "캡션" 광학 크기 변형과 같은 특정 비 WSS 특성이 있는 패밀리에 대한 대체 매핑을 제공하지 않는 한 현재 DirectWrite 대체 패밀리 내에서 이러한 변형을 선택할 수 없습니다.