DirectWrite 소개
사람 일상 생활에서 항상 텍스트와 통신합니다. 이는 사람들이 점점 더 많은 양의 정보를 소비하는 기본 방법입니다. 과거에는 인쇄된 콘텐츠, 주로 문서, 신문, 책 등을 통해 사용되었습니다. 점점 더, 그것은 그들의 Windows PC에 온라인 콘텐츠. 일반적인 Windows 사용자는 컴퓨터 화면에서 읽는 데 많은 시간을 보냅니다. 웹 서핑, 전자 메일 스캔, 보고서 작성, 스프레드시트 작성 또는 소프트웨어 작성 중일 수 있지만 실제로 수행하는 작업은 읽기입니다. 텍스트와 글꼴이 Windows 사용자 환경의 거의 모든 부분에 스며들지만 대부분의 사용자에게는 인쇄된 출력을 읽는 것만큼 화면 읽기가 즐겁지 않습니다.
Windows 애플리케이션 개발자에게 텍스트 처리 코드를 작성하는 것은 더 나은 가독성, 정교한 서식 및 레이아웃 제어 및 애플리케이션이 표시해야 하는 여러 언어에 대한 지원을 위한 요구 사항이 증가하기 때문에 어려운 일입니다. 가장 기본적인 텍스트 처리 시스템에서도 텍스트 입력, 레이아웃, 표시, 편집 및 복사 및 붙여넣기를 허용해야 합니다. Windows 사용자는 일반적으로 이러한 기본 기능보다 훨씬 더 많은 것을 기대하므로 간단한 편집기에서도 여러 글꼴, 다양한 단락 스타일, 포함된 이미지, 맞춤법 검사 및 기타 기능을 지원해야 합니다. 최신 UI 디자인은 더 이상 단일 형식, 일반 텍스트로 제한되지 않지만 풍부한 글꼴 및 텍스트 레이아웃으로 더 나은 환경을 제공해야 합니다.
DirectWrite를 통해 Windows 애플리케이션이 UI 및 문서에 대한 텍스트 환경을 향상시킬 수 있는 방법을 소개합니다.
텍스트 환경 개선
최신 Windows 애플리케이션에는 UI 및 문서의 텍스트에 대한 정교한 요구 사항이 있습니다. 여기에는 더 나은 가독성, 다양한 언어 및 스크립트에 대한 지원, 뛰어난 렌더링 성능이 포함됩니다. 또한 대부분의 기존 애플리케이션은 WindowsWin32 코드 베이스에 기존 투자를 전달하는 방법이 필요합니다.
DirectWrite 는 Windows 애플리케이션 개발자가 애플리케이션 내에서 텍스트 환경을 개선할 수 있도록 하는 세 가지 기능인 렌더링 시스템으로부터의 독립성, 고품질 입력 체계 및 여러 기능 계층을 제공합니다.
Rendering-System Independence
DirectWrite 는 특정 그래픽 기술과 독립적입니다. 애플리케이션은 요구 사항에 가장 적합한 렌더링 기술을 자유롭게 사용할 수 있습니다. 이를 통해 애플리케이션은 Direct3D 또는 Direct2D를 통해 GDI 및 기타 파트를 통해 애플리케이션의 일부 부분을 계속 렌더링할 수 있습니다. 실제로 애플리케이션은 독점 렌더링 스택을 통해 DirectWrite를 렌더링하도록 선택할 수 있습니다.
고품질 입력 체계
DirectWrite는 OpenType 글꼴 기술의 고급 기능을 활용하여 Windows 애플리케이션 내에서 고품질 입력 체계를 사용하도록 설정합니다. DirectWrite 글꼴 시스템은 글꼴 열거형, 글꼴 대체 및 글꼴 캐싱을 처리하기 위한 서비스를 제공합니다. 이 서비스는 모두 애플리케이션에서 글꼴을 처리하는 데 필요합니다.
DirectWrite에서 제공하는 OpenType 지원을 통해 개발자는 애플리케이션에 고급 입력 기능 및 국제 텍스트 지원을 추가할 수 있습니다.
고급 입력 기능 지원
DirectWrite 를 사용하면 애플리케이션 개발자가 WinForms 또는 GDI에서 사용할 수 없는 OpenType 글꼴의 기능을 잠금 해제할 수 있습니다. DirectWrite IDWriteTypography 개체는 스타일 대체 및 스와시와 같은 OpenType 글꼴의 많은 고급 기능을 노출합니다. Microsoft Windows SDK(소프트웨어 개발 키트)는 Pericles 및 Pescadero 글꼴과 같은 풍부한 기능으로 디자인된 샘플 OpenType 글꼴 집합을 제공합니다. OpenType 기능에 관한 자세한 내용은 OpenType 글꼴 기능을 참조하세요.
국제 텍스트 지원
DirectWrite는 OpenType 글꼴을 사용하여 국제 텍스트를 광범위하게 지원할 수 있도록 합니다. 서로게이트, BIDI, 줄 바꿈 및 UVS와 같은 유니코드 기능이 지원됩니다. 언어 기반 스크립트 항목화, 숫자 대체 및 문자 모양 셰이핑은 모든 스크립트의 텍스트에 올바른 레이아웃과 렌더링이 있는지 확인합니다.
현재 지원되는 스크립트는 다음과 같습니다.
참고 항목
*로 표시된 스크립트의 경우 기본 시스템 글꼴이 없습니다. 애플리케이션은 이러한 스크립트를 지원하는 글꼴을 설치해야 합니다.
- 아랍어
- 아르메니아
- 벵골어(벵골어)
- Bopomofo
- 점자*
- 캐나다 원주민 강의 계획서
- 체로키어
- 중국어(간체 및 번체)
- 키릴 자모
- 콥트*
- 데바나가리어
- Ethiopic
- 그루지야어
- Glagolitic*
- 그리스어
- 구자라트어
- 굴묵키어
- 히브리어
- 일본어
- 칸나다어
- 크메르어
- 한국어
- 라오어
- 라틴어
- 말라얄람어
- 몽골어
- 미얀마
- 신타이 루에
- 오검*
- 오디아어
- 'Phags-pa
- 룬 문자*
- 싱할라어
- 시리아어
- 타이레
- 타밀어
- 텔루구어
- 타나 문자
- 태국어
- 티베트어
- 이순신
여러 기능 계층
DirectWrite 는 각 계층이 다음 계층과 원활하게 상호 작용하는 요소 계층의 기능을 제공합니다. API 디자인은 애플리케이션 개발자에게 요구 사항 및 일정에 따라 개별 계층을 채택할 수 있는 자유와 유연성을 제공합니다. 다음 다이어그램에서는 이러한 계층 간의 관계를 보여 줍니다.
텍스트 레이아웃 API는 DirectWrite에서 사용할 수 있는 가장 높은 수준의 기능을 제공합니다. 애플리케이션에서 서식이 풍부한 텍스트 문자열을 측정, 표시 및 상호 작용할 수 있는 서비스를 제공합니다. 이 텍스트 API는 현재 Win32의 DrawText를 사용하여 서식이 풍부한 텍스트가 있는 최신 UI를 빌드하는 애플리케이션에서 사용할 수 있습니다.
자체 레이아웃 엔진을 구현하는 텍스트 집약적 애플리케이션은 다음 계층인 스크립트 프로세서를 사용할 수 있습니다. 스크립트 프로세서는 텍스트 청크를 스크립트 블록으로 분할하고 유니코드 표현 간의 매핑을 글꼴의 적절한 문자 모양 표현으로 처리하므로 스크립트의 텍스트를 올바른 언어로 올바르게 표시할 수 있습니다. 텍스트 레이아웃 API 계층에서 사용하는 레이아웃 시스템은 글꼴 및 스크립트 처리 시스템을 기반으로 합니다.
문자 모양 렌더링 계층은 기능의 가장 낮은 계층이며 자체 텍스트 레이아웃 엔진을 구현하는 애플리케이션에 문자 모양 렌더링 기능을 제공합니다. 문자 모양 렌더링 계층은 DirectWrite 텍스트 서식 지정 API의 콜백 함수를 통해 문자 모양 그리기 동작을 수정하는 사용자 지정 렌더러를 구현하는 애플리케이션에도 유용합니다.
DirectWrite 글꼴 시스템은 모든 DirectWrite 기능 계층에서 사용할 수 있으며 애플리케이션이 글꼴 및 문자 모양 정보에 액세스할 수 있도록 합니다. 일반적인 글꼴 기술 및 데이터 형식을 처리하도록 설계되었습니다. DirectWrite 글꼴 모델은 동일한 글꼴 패밀리에서 여러 가중치, 스타일 및 늘이기를 지원하는 일반적인 입력 체계를 따릅니다. WPF 및 CSS가 뒤따르는 동일한 모델인 이 모델은 두께(굵게, 밝게 등), 스타일(직립, 기울임꼴 또는 경사) 또는 스트레치(좁은, 응축됨, 너비 등)만 다른 글꼴이 단일 글꼴 패밀리의 구성원으로 간주되도록 지정합니다.
ClearType을 사용하여 향상된 텍스트 렌더링
화면의 가독성 향상은 모든 Windows 애플리케이션에 대한 주요 요구 사항입니다. 인지 심리학 연구에서 증거는 우리가 정확하게 모든 문자를 인식 할 수 있어야하고 문자 사이의 간격도 빠른 처리에 중요하다는 것을 나타냅니다. 대칭이 아닌 문자와 단어는 못생긴 것으로 인식되고 읽기 환경을 저하합니다. 케빈 라슨, 마이크로 소프트 고급 독서 기술 그룹, 스펙트럼 IEEE에 게시 된 주제에 대한 기사를 썼다. 이 문서를 "텍스트 기술"이라고 합니다.
DirectWrite의 텍스트는 텍스트의 명확성과 가독성을 향상시키는 Microsoft ClearType을 사용하여 렌더링됩니다. ClearType은 최신 LCD 디스플레이에 개별적으로 제어할 수 있는 각 픽셀에 대한 RGB 스트라이프가 있다는 사실을 활용합니다. DirectWrite는 Windows Presentation Foundation과 함께 Windows Vista에 처음 포함된 ClearType의 최신 향상된 기능을 사용하여 개별 문자뿐만 아니라 문자 사이의 간격도 평가할 수 있습니다. 이러한 ClearType이 향상되기 전에는 "읽기" 크기가 10포인트 또는 12포인트인 텍스트를 표시하기가 어려웠습니다. 문자 사이에 1픽셀을 배치할 수 있었는데, 문자가 너무 적거나 너무 많은 2픽셀을 배치할 수 있었습니다. 하위 픽셀에서 추가 해상도를 사용하면 전체 페이지의 균등성과 대칭을 향상시키는 소수 간격을 제공합니다.
다음 두 그림은 하위 픽셀 위치 지정을 사용할 때 하위 픽셀 경계에서 문자 모양이 시작되는 방법을 보여 줍니다.
다음 그림은 하위 픽셀 위치 지정을 사용하지 않은 ClearType 렌더러의 GDI 버전을 사용하여 렌더링됩니다.
다음 그림은 하위 픽셀 위치 지정을 사용하는 ClearType 렌더러의 DirectWrite 버전을 사용하여 렌더링됩니다.
문자 h와 n 사이의 간격은 두 번째 이미지에서 더 균등하며 문자 o는 문자 n에서 더 멀리 간격이 지정되며 문자 l을 사용하는 경우에도 마찬가지입니다. 또한 l 문자의 줄기가 어떻게 더 자연스럽게 보이는지 유의하십시오.
하위 픽셀 ClearType 위치 지정은 화면에서 문자의 가장 정확한 간격을 제공하며, 특히 작은 크기에서는 하위 픽셀과 전체 픽셀의 차이가 문자 모양 너비의 상당한 비율을 나타냅니다. 텍스트를 이상적인 해상도 공간으로 측정하고 LCD 색 줄무늬의 자연스러운 위치에서 하위 픽셀 세분성으로 렌더링할 수 있습니다. 이 기술을 사용하여 측정되고 렌더링되는 텍스트는 정의상 해상도 독립적이므로 다양한 디스플레이 해상도 범위에서 정확히 동일한 텍스트 레이아웃이 구현됩니다.
두 가지 유형의 GDI ClearType 렌더링과 달리 하위 픽셀 ClearType은 가장 정확한 문자 너비를 제공합니다.
Text String API는 기본적으로 하위 픽셀 텍스트 렌더링을 채택합니다. 즉, 현재 디스플레이 해상도와 관계없이 이상적인 해상도로 텍스트를 측정하고 실제로 크기가 조정된 문자 모양 선진 너비 및 위치 오프셋에 따라 문자 모양 위치 지정 결과를 생성합니다.
큰 텍스트 의 경우 DirectWrite 를 사용하면 y축을 따라 앤티앨리어싱을 통해 가장자리를 더 매끄럽게 만들고 글꼴 디자이너가 의도한 대로 문자를 렌더링할 수 있습니다. 다음 그림에서는 y 방향 앤티앨리어싱을 보여 줍니다.
DirectWrite 텍스트는 기본적으로 하위 픽셀 ClearType을 사용하여 배치되고 렌더링되지만 다른 렌더링 옵션을 사용할 수 있습니다. 대부분의 기존 애플리케이션은 GDI를 사용하여 대부분의 UI를 렌더링하고, 일부 애플리케이션은 텍스트 렌더링에 GDI를 계속 사용하는 시스템 편집 컨트롤을 사용합니다. 이러한 애플리케이션에 DirectWrite 텍스트를 추가할 때는 애플리케이션 전체에서 텍스트가 일관된 모양이 되도록 하위 픽셀 ClearType에서 제공하는 읽기 환경 개선 사항을 희생해야 할 수 있습니다.
이러한 요구 사항을 충족하기 위해 DirectWrite 는 다음 렌더링 옵션도 지원합니다.
- 하위 픽셀 ClearType(기본값).
- 가로 및 세로 차원 모두에 앤티앨리어싱이 있는 하위 픽셀 ClearType입니다.
- 별칭이 지정된 텍스트입니다.
- GDI 자연 너비(예: Microsoft Word 읽기용 보기에서 사용).
- GDI 호환 폭(동아시아 포함 비트맵 포함)
이러한 각 렌더링 모드는 DirectWrite API 및 새 Windows 7 받은 편지함 ClearType 튜너를 통해 미세 조정할 수 있습니다.
참고 항목
Windows 8부터 대부분의 경우 회색조 텍스트 앤티앨리어싱을 사용해야 합니다. 자세한 내용은 다음 섹션을 참조하세요.
자연 레이아웃 지원
자연 레이아웃은 해상도와 독립적이므로 확대 또는 축소하거나 디스플레이의 DPI에 따라 문자 간격이 변경되지 않습니다. 보조 이점은 간격이 글꼴 디자인에 해당한다는 것입니다. 자연 레이아웃은 DirectWrite가 자연 렌더링을 지원하므로 개별 문자 모양을 픽셀의 일부에 배치할 수 있습니다.
자연 레이아웃이 기본값이지만 일부 애플리케이션은 GDI와 동일한 간격 및 모양으로 텍스트를 렌더링해야 합니다. 이러한 애플리케이션의 경우 DirectWrite는 GDI 클래식 및 GDI 자연 측정 모드와 해당 렌더링 모드를 제공합니다.
위의 렌더링 모드 중 하나를 ClearType 또는 회색조의 두 가지 앤티앨리어싱 모드 중 하나와 결합할 수 있습니다. ClearType 앤티앨리어싱 시뮬레이션은 각 픽셀의 빨강, 녹색 및 파랑 색 값을 개별적으로 조작하여 더 높은 해상도를 시뮬레이션합니다. 회색조 앤티앨리어싱은 각 픽셀에 대해 하나의 검사(또는 알파) 값만 계산합니다. ClearType은 기본값이지만 Windows 스토어 앱에는 회색조 앤티앨리어싱이 권장되는데, 이는 더 빠르고 표준 앤티앨리어싱과 호환되지만 읽기가 용이하기 때문입니다.
API 개요
IDWriteFactory 인터페이스는 DirectWrite 기능을 사용하기 위한 시작점입니다. 팩터리는 함께 사용할 수 있는 개체 집합을 만드는 루트 개체입니다.
텍스트 서식을 올바르게 지정하고 지정된 제약 조건 집합에 배치해야 그리거나 적중 테스트를 수행할 수 있으므로 서식 지정 및 레이아웃 작업은 작업의 필수 구성 요소입니다. 이 목적을 위해 IDWriteFactory를 사용하여 만들 수 있는 두 가지 주요 개체는 IDWriteTextFormat 및 IDWriteTextLayout입니다. IDWriteTextFormat 개체는 텍스트 단락의 서식 정보를 나타냅니다. IDWriteFactory::CreateTextLayout 함수는 입력 문자열, 채울 공간의 차원 및 IDWriteTextFormat 개체와 같은 관련 제약 조건을 사용하고, 완전히 분석되고 서식이 지정된 결과를 IDWriteTextLayout에 추가하여 후속 작업에 사용합니다.
그런 다음, 애플리케이션은 Direct2D에서 제공하는 DrawTextLayout 함수를 사용하거나 GDI, Direct2D 또는 기타 그래픽 시스템을 사용하여 문자 모양을 렌더링할 수 있는 콜백 함수를 구현하여 텍스트를 렌더링할 수 있습니다. 단일 서식 텍스트의 경우 Direct2D의 DrawText 함수는 먼저 IDWriteTextLayout 개체를 만들지 않고도 텍스트를 그리는 더 간단한 방법을 제공합니다.
DirectWrite를 사용하여 "헬로 월드" 서식 지정 및 그리기
다음 코드 예제에서는 애플리케이션이 IDWriteTextFormat을 사용하여 단일 단락의 서식을 지정하고 Direct2DDrawText 함수를 사용하여 그리는 방법을 보여줍니다.
HRESULT DemoApp::DrawHelloWorld(
ID2D1HwndRenderTarget* pIRenderTarget
)
{
HRESULT hr = S_OK;
ID2D1SolidColorBrush* pIRedBrush = NULL;
IDWriteTextFormat* pITextFormat = NULL;
IDWriteFactory* pIDWriteFactory = NULL;
if (SUCCEEDED(hr))
{
hr = DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED,
__uuidof(IDWriteFactory),
reinterpret_cast<IUnknown**>(&pIDWriteFactory));
}
if(SUCCEEDED(hr))
{
hr = pIDWriteFactory->CreateTextFormat(
L"Arial",
NULL,
DWRITE_FONT_WEIGHT_NORMAL,
DWRITE_FONT_STYLE_NORMAL,
DWRITE_FONT_STRETCH_NORMAL,
10.0f * 96.0f/72.0f,
L"en-US",
&pITextFormat
);
}
if(SUCCEEDED(hr))
{
hr = pIRenderTarget->CreateSolidColorBrush(
D2D1:: ColorF(D2D1::ColorF::Red),
&pIRedBrush
);
}
D2D1_RECT_F layoutRect = D2D1::RectF(0.f, 0.f, 100.f, 100.f);
// Actually draw the text at the origin.
if(SUCCEEDED(hr))
{
pIRenderTarget->DrawText(
L"Hello World",
wcslen(L"Hello World"),
pITextFormat,
layoutRect,
pIRedBrush
);
}
// Clean up.
SafeRelease(&pIRedBrush);
SafeRelease(&pITextFormat);
SafeRelease(&pIDWriteFactory);
return hr;
}
글꼴 시스템 액세스
DirectWrite는 위의 예제에서 IDWriteTextFormat 인터페이스를 사용하여 텍스트 문자열의 글꼴 패밀리 이름을 지정하는 것 외에도 글꼴 열거형을 통해 글꼴 선택을 보다 잘 제어하고 포함된 문서 글꼴을 기반으로 사용자 지정 글꼴 컬렉션을 만들 수 있는 기능을 제공합니다.
IDWriteFontCollection 개체는 글꼴 패밀리의 컬렉션입니다. DirectWrite는 시스템 글꼴 컬렉션이라는 특수 글꼴 컬렉션을 통해 시스템에 설치된 글꼴 집합에 대한 액세스를 제공합니다. IDWriteFactory 개체의 GetSystemFontCollection 메서드를 호출하여 가져옵니다. 애플리케이션은 애플리케이션에서 정의한 콜백( 즉, 애플리케이션에서 설치한 개인 글꼴 또는 문서에 포함된 글꼴)으로 열거된 글꼴 집합에서 사용자 지정 글꼴 컬렉션을 만들 수도 있습니다.
그런 다음 애플리케이션은 GetFontFamily를 호출하여 컬렉션 내의 특정 FontFamily 개체로 이동하고 IDWriteFontFamily::GetFirstMatchingFont를 호출하여 특정 IDWriteFont 개체로 가져올 수 있습니다. IDWriteFont 개체는 글꼴 컬렉션의 글꼴을 나타내며 속성과 몇 가지 기본 글꼴 메트릭을 노출합니다.
IDWriteFontFace는 글꼴을 나타내고 글꼴에 전체 메트릭 집합을 노출하는 또 다른 개체입니다. IDWriteFontFace는 글꼴 이름에서 직접 만들 수 있습니다. 애플리케이션은 액세스하기 위해 글꼴 컬렉션을 가져올 필요가 없습니다. 특정 글꼴에 대한 세부 정보를 쿼리해야 하는 Microsoft Word와 같은 텍스트 레이아웃 응용 프로그램에 유용합니다.
다음 다이어그램에서는 이러한 개체 간의 관계를 보여 줍니다.
IDWriteFontFace
IDWriteFontFace 개체는 글꼴을 나타내며 IDWriteFont 개체보다 글꼴에 대한 자세한 정보를 제공합니다. IDWriteFontFace의 글꼴 및 문자 모양 메트릭은 텍스트 레이아웃을 구현하는 애플리케이션에 유용합니다.
대부분의 기본stream 애플리케이션은 이러한 API를 직접 사용하지 않고 대신 IDWriteFont를 사용하거나 글꼴 패밀리 이름을 직접 지정합니다.
다음 표에서는 두 개체에 대한 사용 시나리오를 요약합니다.
범주 | IDWriteFont | IDWriteFontFace |
---|---|---|
글꼴 선택기 사용자 인터페이스와 같은 사용자 상호 작용을 지원하는 API: 설명 및 기타 정보 API | 예 | 아니요 |
글꼴 매핑을 지원하는 API: 패밀리, 스타일, 가중치, 스트레치, 문자 검사 | 예 | 아니요 |
DrawText API | 예 | 아니요 |
렌더링에 사용되는 API | 예 | 예 |
텍스트 레이아웃에 사용되는 API: 문자 모양 메트릭 등 | 예 | 예 |
UI 컨트롤 및 텍스트 레이아웃용 API: 글꼴 전체 메트릭 | 예 | 예 |
다음은 시스템 글꼴 컬렉션의 글꼴을 열거하는 애플리케이션 예제입니다.
#include <dwrite.h>
#include <string.h>
#include <stdio.h>
#include <new>
// SafeRelease inline function.
template <class T> inline void SafeRelease(T **ppT)
{
if (*ppT)
{
(*ppT)->Release();
*ppT = NULL;
}
}
void wmain()
{
IDWriteFactory* pDWriteFactory = NULL;
HRESULT hr = DWriteCreateFactory(
DWRITE_FACTORY_TYPE_SHARED,
__uuidof(IDWriteFactory),
reinterpret_cast<IUnknown**>(&pDWriteFactory)
);
IDWriteFontCollection* pFontCollection = NULL;
// Get the system font collection.
if (SUCCEEDED(hr))
{
hr = pDWriteFactory->GetSystemFontCollection(&pFontCollection);
}
UINT32 familyCount = 0;
// Get the number of font families in the collection.
if (SUCCEEDED(hr))
{
familyCount = pFontCollection->GetFontFamilyCount();
}
for (UINT32 i = 0; i < familyCount; ++i)
{
IDWriteFontFamily* pFontFamily = NULL;
// Get the font family.
if (SUCCEEDED(hr))
{
hr = pFontCollection->GetFontFamily(i, &pFontFamily);
}
IDWriteLocalizedStrings* pFamilyNames = NULL;
// Get a list of localized strings for the family name.
if (SUCCEEDED(hr))
{
hr = pFontFamily->GetFamilyNames(&pFamilyNames);
}
UINT32 index = 0;
BOOL exists = false;
wchar_t localeName[LOCALE_NAME_MAX_LENGTH];
if (SUCCEEDED(hr))
{
// Get the default locale for this user.
int defaultLocaleSuccess = GetUserDefaultLocaleName(localeName, LOCALE_NAME_MAX_LENGTH);
// If the default locale is returned, find that locale name, otherwise use "en-us".
if (defaultLocaleSuccess)
{
hr = pFamilyNames->FindLocaleName(localeName, &index, &exists);
}
if (SUCCEEDED(hr) && !exists) // if the above find did not find a match, retry with US English
{
hr = pFamilyNames->FindLocaleName(L"en-us", &index, &exists);
}
}
// If the specified locale doesn't exist, select the first on the list.
if (!exists)
index = 0;
UINT32 length = 0;
// Get the string length.
if (SUCCEEDED(hr))
{
hr = pFamilyNames->GetStringLength(index, &length);
}
// Allocate a string big enough to hold the name.
wchar_t* name = new (std::nothrow) wchar_t[length+1];
if (name == NULL)
{
hr = E_OUTOFMEMORY;
}
// Get the family name.
if (SUCCEEDED(hr))
{
hr = pFamilyNames->GetString(index, name, length+1);
}
if (SUCCEEDED(hr))
{
// Print out the family name.
wprintf(L"%s\n", name);
}
SafeRelease(&pFontFamily);
SafeRelease(&pFamilyNames);
delete [] name;
}
SafeRelease(&pFontCollection);
SafeRelease(&pDWriteFactory);
}
텍스트 렌더링
텍스트 렌더링 API를 사용하면 DirectWrite 글꼴의 문자 모양이 Direct2D 화면 또는 GDI 디바이스 독립적 비트맵으로 렌더링되거나 윤곽선 또는 비트맵으로 변환될 수 있습니다. DirectWrite의 ClearType 렌더링은 Windows의 이전 구현에 비해 선명도 및 대비가 향상된 하위 픽셀 위치 지정을 지원합니다. 또한 DirectWrite는 비트맵이 포함된 동아시아 글꼴과 관련된 시나리오를 지원하거나 사용자가 모든 형식의 글꼴 다듬기를 사용하지 않도록 설정한 경우 별칭이 지정된 흑백 텍스트를 지원합니다.
모든 옵션은 DirectWrite API를 통해 액세스할 수 있는 사용 가능한 모든 ClearType 노브에서 조정할 수 있으며 새로운 Windows 7 ClearType 튜너 제어판 애플릿을 통해서도 노출됩니다.
문자 모양을 렌더링하는 데 사용할 수 있는 두 가지 API가 있으며, 하나는 Direct2D를 통해 하드웨어 가속 렌더링을 제공하고 다른 하나는 GDI 비트맵에 소프트웨어 렌더링을 제공합니다. IDWriteTextLayout을 사용하고 IDWriteTextRenderer 콜백을 구현하는 애플리케이션은 DrawGlyphRun 콜백에 대한 응답으로 이러한 함수 중 하나를 호출할 수 있습니다. 또한 자체 레이아웃을 구현하거나 문자 모양 수준 데이터를 처리하는 애플리케이션은 이러한 API를 사용할 수 있습니다.
ID2DRenderTarget::D rawGlyphRun
애플리케이션은 Direct2D API DrawGlyphRun을 사용하여 GPU를 사용하여 텍스트 렌더링을 위한 하드웨어 가속을 제공할 수 있습니다. 하드웨어 가속은 문자 모양을 문자 모양 실행으로 병합하고 문자 모양 실행 비트맵을 필터링하는 것부터 ClearType 혼합 알고리즘을 최종 표시된 출력에 적용하는 것까지 텍스트 렌더링 파이프라인의 모든 단계에 영향을 줍니다. 최상의 렌더링 성능을 얻기 위한 권장 API입니다.
IDWriteBitmapRenderTarget::D rawGlyphRun
애플리케이션은 IDWriteBitmapRenderTarget::D rawGlyphRun 메서드를 사용하여 32-bpp 비트맵에 대한 문자 모양 실행의 소프트웨어 렌더링을 수행할 수 있습니다. IDWriteBitmapRenderTarget 개체는 문자 모양을 렌더링하는 데 사용할 수 있는 비트맵 및 메모리 디바이스 컨텍스트를 캡슐화합니다. 이 API는 GDI에서 렌더링되는 기존 코드 베이스가 있으므로 GDI를 유지하려는 경우에 유용합니다.
GDI를 사용하는 기존 텍스트 레이아웃 코드가 있는 애플리케이션이 있고 기존 레이아웃 코드를 유지하지만 문자 모양을 렌더링하는 마지막 단계에만 DirectWrite를 사용하려는 경우 IDWriteGdiInterop::CreateFontFaceFromHdc는 두 API 간의 브리지를 제공합니다. 이 함수를 호출하기 전에 애플리케이션은 IDWriteGdiInterop::CreateFontFaceFromHdc 함수를 사용하여 디바이스 컨텍스트에서 글꼴-얼굴 참조를 가져옵니다.
참고 항목
대부분의 시나리오에서 애플리케이션은 이러한 문자 모양 렌더링 API를 사용할 필요가 없습니다. 애플리케이션이 IDWriteTextLayout 개체를 만든 후 ID2D1RenderTarget::D rawTextLayout 메서드를 사용하여 텍스트를 렌더링할 수 있습니다.
사용자 지정 렌더링 모드
감마, ClearType 수준, 픽셀 기하 도형 및 향상된 대비와 같은 여러 매개 변수가 텍스트 렌더링에 영향을 미칩니다. 렌더링 매개 변수는 공용 IDWriteRenderingParams 인터페이스를 구현하는 개체에 의해 캡슐화됩니다. 렌더링 매개 변수 개체는 Windows 7의 ClearType 제어판 애플릿을 통해 지정된 하드웨어 속성 및/또는 사용자 기본 설정에 따라 자동으로 초기화됩니다. 일반적으로 클라이언트에서 DirectWrite 레이아웃 API를 사용하는 경우 DirectWrite는 지정된 측정 모드에 해당하는 렌더링 모드를 자동으로 선택합니다.
더 많은 제어를 원하는 애플리케이션은 IDWriteFactory::CreateCustomRenderingParams를 사용하여 다양한 렌더링 옵션을 구현할 수 있습니다. 이 함수를 사용하여 감마, 픽셀 기하 도형 및 향상된 대비를 설정할 수도 있습니다.
다음은 사용할 수 있는 다양한 렌더링 옵션입니다.
하위 픽셀 앤티앨리어싱
애플리케이션은 renderingMode 매개 변수를 DWRITE_RENDERING_MODE_NATURAL 설정하여 가로 차원에만 앤티앨리어싱을 사용하여 렌더링을 지정합니다.
가로 및 세로 차원의 하위 픽셀 앤티앨리어싱입니다.
애플리케이션은 renderingMode 매개 변수를 DWRITE_RENDERING_MODE_NATURAL_SYMMETRIC 설정하여 가로 및 세로 차원 모두에서 앤티앨리어싱을 사용하여 렌더링을 지정합니다. 이렇게 하면 곡선과 대각선이 부드러움을 희생하여 더 매끄럽게 보이고 일반적으로 16ppem 이상의 크기로 사용됩니다.
별칭 텍스트
애플리케이션은 renderingMode 매개 변수를 DWRITE_RENDERING_MODE_ALIASED 설정하여 별칭이 지정된 텍스트를 지정합니다.
회색조 텍스트
애플리케이션은 pixelGeometry 매개 변수를 DWRITE_PIXEL_GEOMETRY_FLAT 설정하여 회색조 텍스트를 지정합니다.
GDI 호환 폭(동아시아 포함 비트맵 포함)
애플리케이션은 renderingMode 매개 변수를 DWRITE_RENDERING_MODE_GDI_CLASSIC 설정하여 GDI 호환 너비 앤티앨리어싱을 지정합니다.
GDI 내추럴 너비
애플리케이션은 renderingMode 매개 변수를 DWRITE_RENDERING_MODE_GDI_NATURAL 설정하여 GDI 자연 너비 호환 앤티앨리어싱을 지정합니다.
개요 텍스트
큰 크기로 렌더링하는 경우 애플리케이션 개발자는 비트맵으로 래스터화하지 않고 글꼴 윤곽선을 사용하여 렌더링하는 것을 선호할 수 있습니다. 애플리케이션은 renderingMode 매개 변수를 DWRITE_RENDERING_MODE_OUTLINE 설정하여 렌더링이 래스터라이저를 우회하고 윤곽선을 직접 사용하도록 지정합니다.
GDI 상호 운용성
IDWriteGdiInterop 인터페이스는 GDI와의 상호 운용성을 제공합니다. 이를 통해 애플리케이션은 GDI 코드 베이스에 대한 기존 투자를 계속하고 렌더링 또는 레이아웃에 DirectWrite를 선택적으로 사용할 수 있습니다.
다음은 애플리케이션이 GDI 글꼴 시스템으로 또는 GDI 글꼴 시스템에서 마이그레이션할 수 있도록 하는 API입니다.
-
LOGFONT 구조체에 지정된 속성과 일치하는 IDWriteFont 개체를 만듭니다.
-
지정된 IDWriteFont의 GDI 호환 속성을 기반으로 LOGFONT 구조를 초기화합니다.
-
현재 선택한 HFONT에 해당하는 IDWriteFontFace 개체를 만듭니다.
결론
읽기 환경을 개선하는 것은 화면이나 종이에 있든 관계없이 사용자에게 큰 가치가 있습니다. DirectWrite 는 애플리케이션 개발자가 Windows 애플리케이션의 텍스트 환경을 개선하기 위해 사용 편의성과 계층화된 프로그래밍 모델을 제공합니다. 애플리케이션은 DirectWrite를 사용하여 레이아웃 API를 사용하여 UI 및 문서에 대해 서식이 풍부한 텍스트를 렌더링할 수 있습니다. 더 복잡한 시나리오의 경우 애플리케이션은 문자 모양, 액세스 글꼴 등을 직접 사용하고 DirectWrite의 기능을 활용하여 고품질 입력 체계를 제공할 수 있습니다.
DirectWrite의 상호 운용성 기능을 통해 애플리케이션 개발자는 기존 Win32 코드베이스를 전달하고 애플리케이션 내에서 DirectWrite를 선택적으로 채택할 수 있습니다.