DirectWriteの概要

Peopleは、日常生活の中で常にテキストと通信します。 これは、増え続ける情報を人々が消費する主な方法です。 以前は、印刷されたコンテンツ(主にドキュメント、新聞、書籍など)を使用していた。 ますます、それは彼らのWindows PC上のオンラインコンテンツです。 一般的な Windows ユーザーは、コンピューター画面からの読み取りに多くの時間を費やしています。 Web をサーフィンしたり、電子メールをスキャンしたり、レポートを作成したり、スプレッドシートに入力したり、ソフトウェアを書いたりしている可能性がありますが、実際に行っていることは読み取りです。 テキストとフォントは Windows のユーザー エクスペリエンスのほぼすべての部分に浸透していますが、ほとんどのユーザーにとって、画面での読み取りは、印刷された出力を読むほど楽しいものではありません。

Windows アプリケーション開発者にとって、テキスト処理コードの記述は、読みやすさの向上、高度な書式設定とレイアウト制御、アプリケーションで表示する必要がある複数の言語のサポートの要件が増えたため、課題です。 最も基本的なテキスト処理システムでも、テキスト入力、レイアウト、表示、編集、およびコピーと貼り付けを許可する必要があります。 Windows ユーザーは一般的に、これらの基本的な機能以上のものを期待しています。複数のフォント、さまざまな段落スタイル、埋め込み画像、スペル チェック、その他の機能をサポートする単純なエディターも必要です。 また、最新の UI デザインは単一の形式 (プレーン テキスト) に限定されなくなりましたが、豊富なフォントとテキスト レイアウトでより優れたエクスペリエンスを提供する必要があります。

これは、windows アプリケーションで UI とドキュメントのテキスト エクスペリエンスを強化DirectWrite方法の概要です。

テキスト エクスペリエンスの向上

最新の Windows アプリケーションには、UI とドキュメントのテキストに対する高度な要件があります。 これには、読みやすさの向上、さまざまな言語とスクリプトのサポート、優れたレンダリング パフォーマンスが含まれます。 さらに、ほとんどの既存のアプリケーションでは、WindowsWin32 コード ベースへの既存の投資を繰り越す方法が必要です。

DirectWriteには、Windows アプリケーション開発者がアプリケーション内のテキスト エクスペリエンスを向上させることができる 3 つの機能が用意されています。レンダリング システムからの独立、高品質の文字体裁、および複数の機能レイヤー。

Rendering-Systemインディペンデンス

DirectWriteは、特定のグラフィックス テクノロジとは無関係です。 アプリケーションは、ニーズに最も適したレンダリング テクノロジを自由に使用できます。 これにより、アプリケーションの一部を GDI 経由でレンダリングし、Direct3D または Direct2D を介して他の部分をレンダリングし続ける柔軟性がアプリケーションに提供されます。 実際、アプリケーションは独自のレンダリング スタックを介してDirectWriteをレンダリングすることを選択できます。

High-Quality文字体裁

DirectWriteでは、OpenType Font テクノロジの進歩を利用して、Windows アプリケーション内で高品質の文字体裁を実現します。 DirectWrite フォント システムは、フォント列挙、フォント フォールバック、フォント キャッシュを処理するためのサービスを提供します。これらはすべて、フォントを処理するためにアプリケーションに必要です。

DirectWriteによって提供される OpenType サポートを使用すると、開発者はアプリケーションに高度な文字体裁機能と国際テキストのサポートを追加できます。

高度な文字体裁機能のサポート

DirectWriteを使用すると、アプリケーション開発者は、WinForms または GDI で使用できなかった OpenType フォントの機能のロックを解除できます。 DirectWrite IDWriteTypography オブジェクトは、スタイル代替や斜めなど、OpenType フォントの高度な機能の多くを公開します。 Microsoft Windows ソフトウェア開発キット (SDK) には、Pericles フォントや Pescadero フォントなどの豊富な機能を使用して設計された一連の サンプル OpenType フォントが用意されています。 OpenType の機能の詳細については、「OpenType フォントの機能」を参照してください。

国際テキストのサポート

DirectWriteでは、OpenType フォントを使用して、国際テキストを幅広くサポートできます。 サロゲート、BIDI、改行、UVS などの Unicode 機能がサポートされています。 言語ガイド付きスクリプトの項目化、番号の置換、グリフの整形により、スクリプト内のテキストのレイアウトとレンダリングが正しいことを確認できます。

現在、次の書体がサポートされています。

Note

*でマークされたスクリプトの場合、既定のシステム フォントはありません。 アプリケーションでは、これらのスクリプトをサポートするフォントをインストールする必要があります。

 

  • アラビア語
  • アルメニア語
  • ベンガル語
  • Bopomofo
  • 点字*
  • カナダ原住民の音節
  • チェロキー語
  • 中国語 (簡体字繁体字 & )
  • キリル文字
  • コプト*
  • デバナガリ
  • エチオピック
  • ジョージア語
  • グラゴリティック*
  • ギリシャ語
  • グジャラート語
  • グルムキー
  • ヘブライ語
  • 日本語
  • カンナダ語
  • クメール語
  • 韓国語
  • ラオス語
  • ラテン語
  • マラヤーラム語
  • モンゴル語
  • ミャンマー
  • 新タイ ロ文字
  • Ogham*
  • オディア語
  • 'Phags-pa
  • ルーン 文字*
  • シンハラ語
  • シリア語
  • タイ ロ文字
  • タミル語
  • テルグ語
  • ターナ
  • タイ語
  • チベット語
  • イ語

複数の機能レイヤー

DirectWriteは、機能の要素レイヤーを提供し、各レイヤーは次のレイヤーとシームレスに対話します。 API 設計により、アプリケーション開発者は、ニーズとスケジュールに応じて個々のレイヤーを自由に柔軟に導入できます。 次の図は、これらのレイヤー間の関係を示しています。

directwrite レイヤーの図と、それらがアプリケーションまたは UI フレームワークおよびグラフィックス API と通信する方法

テキスト レイアウト API は、DirectWriteから使用できる最高レベルの機能を提供します。 高度に書式設定されたテキスト文字列を測定、表示、操作するためのサービスをアプリケーションに提供します。 このテキスト API は、現在 Win32 の DrawText を使用して、書式設定されたテキストを使用して最新の UI を構築するアプリケーションで使用できます。

独自のレイアウト エンジンを実装するテキスト集中型アプリケーションでは、次のレイヤーであるスクリプト プロセッサを使用できます。 スクリプト プロセッサは、テキストのチャンクをスクリプト ブロックに分割し、Unicode 表現間のフォント内の適切なグリフ表現へのマッピングを処理して、スクリプトのテキストを正しい言語で正しく表示できるようにします。 テキスト レイアウト API レイヤーで使用されるレイアウト システムは、フォントおよびスクリプト処理システムに基づいて構築されます。

グリフ レンダリング レイヤーは、機能の最も低いレイヤーであり、独自のテキスト レイアウト エンジンを実装するアプリケーションにグリフ レンダリング機能を提供します。 グリフ レンダリング レイヤーは、カスタム レンダラーを実装するアプリケーションで、DirectWriteテキスト書式設定 API のコールバック関数を使用してグリフ描画の動作を変更する場合にも役立ちます。

DirectWriteフォント システムは、すべてのDirectWrite機能レイヤーで使用でき、アプリケーションがフォントとグリフの情報にアクセスできるようにします。 これは、一般的なフォント テクノロジとデータ形式を処理するように設計されています。 DirectWriteフォント モデルは、同じフォント ファミリ内の任意の数の重み、スタイル、ストレッチをサポートする一般的な文字体裁のプラクティスに従います。 このモデルは、WPF と CSS の後に続く同じモデルで、太さ (太字、ライトなど)、スタイル (アップライト、斜体、斜体) またはストレッチ (狭い、狭い、広いなど) のみが 1 つのフォント ファミリのメンバーと見なされることを指定します。

ClearType を使用したテキスト レンダリングの改善

画面上の読みやすさの向上は、すべての Windows アプリケーションにとって重要な要件です。 認知心理学の研究の証拠は、すべての文字を正確に認識できる必要があり、文字間の間隔も高速処理にとって重要であることを示しています。 対称的ではない文字や単語は醜いと認識され、読み取りエクスペリエンスが低下します。 Microsoft Advanced Reading Technologies グループの Kevin Larson は、Spectrum IEEE で公開されたテーマに関する記事を書きました。 この記事は「テキストの技術」と呼ばれています。

DirectWrite内のテキストは Microsoft ClearType を使用してレンダリングされ、テキストのわかりやすさと読みやすさが向上します。 ClearType は、最新の LCD ディスプレイには、個別に制御できるピクセルごとに RGB ストライプが含まれているという事実を利用しています。 DirectWriteでは、最初にWindows Presentation Foundationを使用して Windows Vista に含まれる ClearType の最新の機能強化を使用します。これにより、個々の文字だけでなく、文字間の間隔も評価できます。 これらの ClearType が強化される前は、"読み取り" サイズが 10 ポイントまたは 12 ポイントのテキストを表示するのが困難でした。文字の間に 1 ピクセルを入れるのは、多くの場合は少なすぎるか、2 ピクセルで、多くの場合は多すぎます。 サブピクセルで余分な解像度を使用すると、ページ全体の均等性と対称性を向上させる小数部の間隔が提供されます。

次の 2 つの図は、サブピクセルの配置を使用するときに、サブピクセル境界でグリフを開始する方法を示しています。

次の図は、サブピクセルの配置を使用しなかった ClearType レンダラーの GDI バージョンを使用してレンダリングされます。

サブピクセルの位置付けなしでレンダリングされた

次の図は、サブピクセルの配置を使用する ClearType レンダラーのDirectWriteバージョンを使用してレンダリングされます。

サブピクセル配置でレンダリングされた

2 番目の画像では、文字 h と n の間の間隔がより均等になり、文字 o は文字 n からさらに離れ、さらに文字 l と一緒に配置されることに注意してください。 また、文字lの茎がより自然に見える方法に注意してください。

サブピクセル ClearType の配置は、画面上で最も正確な文字の間隔を提供します。特に小さいサイズでは、サブピクセルとピクセル全体の差がグリフの幅のかなりの割合を表します。 これにより、テキストを理想的な解像度空間で測定し、サブピクセルの粒度で LCD カラー ストライプの自然な位置にレンダリングできます。 このテクノロジを使用して測定およびレンダリングされるテキストは、定義上、解像度に依存しません。つまり、さまざまなディスプレイ解像度の範囲で、テキストのまったく同じレイアウトが実現されます。

GDI ClearType レンダリングのどちらの種類とは異なり、サブピクセル ClearType は最も正確な文字幅を提供します。

Text String API では、既定でサブピクセル テキスト レンダリングが採用されています。つまり、現在の表示解像度とは無関係に理想的な解像度でテキストを測定し、真にスケーリングされたグリフの高度な幅と配置オフセットに基づいてグリフの配置結果を生成します。

大きなサイズのテキストの場合、DirectWriteでは、y 軸に沿ったアンチエイリアシングを有効にして、フォント デザイナーが意図したとおりにエッジを滑らかにし、文字をレンダリングすることもできます。 次の図は、y 方向のアンチエイリアシングを示しています。

gdi テキストとしてレンダリングされ、y 方向アンチエイリアシングを使用して directwrite テキストとしてレンダリングされる

DirectWriteテキストは既定でサブピクセル ClearType を使用して配置およびレンダリングされますが、他のレンダリング オプションも使用できます。 既存のアプリケーションの多くは、ほとんどの UI をレンダリングするために GDI を使用し、一部のアプリケーションでは、テキストレンダリングに引き続き GDI を使用するシステム編集コントロールが使用されています。 これらのアプリケーションDirectWriteテキストを追加する場合、テキストがアプリケーション全体で一貫した外観になるように、サブピクセル ClearType によって提供される読み取りエクスペリエンスの向上を犠牲にする必要がある場合があります。

これらの要件を満たすために、DirectWriteでは次のレンダリング オプションもサポートされています。

  • サブピクセル ClearType (既定値)。
  • 水平ディメンションと垂直ディメンションの両方でアンチエイリアシングを使用するサブピクセル ClearType。
  • エイリアス化されたテキスト。
  • GDI の自然な幅 (たとえば、Microsoft Word 読み取りビューで使用されます)。
  • GDI 互換幅 (東アジアの埋め込みビットマップを含む)。

これらの各レンダリング モードは、DirectWrite API と新しい Windows 7 受信トレイ ClearType チューナを使用して微調整できます。

注意

Windows 8以降は、ほとんどの場合、グレースケール テキストアンチエイリアシングを使用する必要があります。 詳細については、次のセクションを参照してください。

 

自然レイアウトのサポート

自然なレイアウトは解像度に依存しないため、拡大または縮小したり、ディスプレイの DPI に応じて文字の間隔を変更したりすることはありません。 2 つ目の利点は、フォントのデザインに対して間隔が当てはまる点です。 自然なレイアウトは、DirectWriteが自然なレンダリングをサポートすることで可能になります。つまり、個々のグリフをピクセルの一部に配置できます。

自然レイアウトは既定ですが、一部のアプリケーションでは GDI と同じ間隔と外観のテキストをレンダリングする必要があります。 このようなアプリケーションの場合、DirectWriteは GDI クラシックおよび GDI の自然な測定モードと対応するレンダリング モードを提供します。

上記のレンダリング モードは、ClearType またはグレースケールの 2 つのアンチエイリアシング モードのいずれかと組み合わせることができます。 ClearType アンチエイリアシングは、各ピクセルの赤、緑、青の色の値を個別に操作することで、より高い解像度をシミュレーションします。 グレースケールアンチエイリアシングでは、ピクセルごとに 1 つのカバレッジ (またはアルファ) 値のみが計算されます。 ClearType が既定ですが、Windows ストア アプリではグレースケールのアンチエイリアシングが推奨されます。これは、高速であり、標準のアンチエイリアシングと互換性があり、読み取り性が高いためです。

API の概要

IDWriteFactory インターフェイスは、DirectWrite機能を使用するための開始点です。 ファクトリは、一緒に使用できるオブジェクトのセットを作成するルート オブジェクトです。

テキストを描画またはヒット テストする前に、テキストを適切に書式設定し、指定した制約セットにレイアウトする必要があるため、書式設定とレイアウト操作は操作の前提条件です。 この目的のために IDWriteFactory を使用して作成できる 2 つの重要なオブジェクトは 、IDWriteTextFormatIDWriteTextLayout です。 IDWriteTextFormat オブジェクトは、テキストの段落の書式設定情報を表します。 IDWriteFactory::CreateTextLayout 関数は、入力文字列、入力する領域のディメンション、IDWriteTextFormat オブジェクトなどの関連する制約を受け取り、完全に分析され、書式設定された結果を IDWriteTextLayout に格納して、後続の操作で使用します。

アプリケーションは、Direct2D によって提供される DrawTextLayout 関数を使用するか、GDI、 Direct2D 、またはその他のグラフィックス システムを使用してグリフをレンダリングできるコールバック関数を実装することで、テキストをレンダリングできます。 1 つの書式指定テキストの場合、Direct2D の DrawText 関数を使用すると、最初に IDWriteTextLayout オブジェクトを作成しなくてもテキストを簡単に描画できます。

DirectWriteを使用した "Hello World" の書式設定と描画

次のコード例は、 アプリケーションが IDWriteTextFormat を使用して 1 つの段落を書式設定し、 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;
}

フォント システムへのアクセス

上記の例の IDWriteTextFormat インターフェイスを使用してテキスト文字列のフォント ファミリ名を指定するだけでなく、DirectWriteでは、フォント列挙によるフォントの選択をより詳細に制御し、埋め込みドキュメント フォントに基づいてカスタム フォント コレクションを作成できます。

IDWriteFontCollection オブジェクトは、フォント ファミリのコレクションです。 DirectWriteは、システム フォント コレクションと呼ばれる特殊なフォント コレクションを介して、システムにインストールされているフォントのセットにアクセスできます。 これは、IDWriteFactory オブジェクトの GetSystemFontCollection メソッドを呼び出すことによって取得されます。 アプリケーションでは、アプリケーション定義のコールバックによって列挙された一連のフォント (アプリケーションによってインストールされたプライベート フォント、またはドキュメントに埋め込まれたフォント) からカスタム フォント コレクションを作成することもできます。

その後、アプリケーションは GetFontFamily を 呼び出してコレクション内の特定の FontFamily オブジェクトにアクセスし、 IDWriteFontFamily::GetFirstMatchingFont を呼び出して特定の IDWriteFont オブジェクトにアクセスできます。 IDWriteFont オブジェクトは、フォント コレクション内のフォントを表し、プロパティといくつかの基本的なフォント メトリックを公開します。

IDWriteFontFace は、フォントを表し、フォントのメトリックの完全なセットを公開する別のオブジェクトです。 IDWriteFontFace は、フォント名から直接作成できます。アプリケーションにアクセスするためにフォント コレクションを取得する必要はありません。 特定のフォントの詳細を照会する必要がある Microsoft Word などのテキスト レイアウト アプリケーションに便利です。

次の図は、これらのオブジェクト間の関係を示しています。

フォント コレクション、フォント ファミリ、フォントフェイスの関係の図

IDWriteFontFace

IDWriteFontFace オブジェクトはフォントを表し、IDWriteFont オブジェクトよりもフォントに関する詳細情報を提供します。 IDWriteFontFace のフォントメトリックとグリフ メトリックは、テキスト レイアウトを実装するアプリケーションに役立ちます。

ほとんどのメインストリーム アプリケーションでは、これらの API を直接使用せず、 代わりに IDWriteFont を使用するか、フォント ファミリ名を直接指定します。

次の表は、2 つのオブジェクトの使用シナリオをまとめたものです。

カテゴリ 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 チューナ コントロール パネル アプレットを介して公開されます。

グリフのレンダリングには 2 つの API があり、1 つは Direct2D を介したハードウェアアクセラレータレンダリングを提供し、もう 1 つは GDI ビットマップへのソフトウェア レンダリングを提供します。 IDWriteTextLayout を使用し、IDWriteTextRenderer コールバックを実装するアプリケーションは、DrawGlyphRun コールバックに応答して、これらの関数のいずれかを呼び出すことができます。 また、独自のレイアウトを実装したり、グリフ レベルのデータを処理したりするアプリケーションでは、これらの API を使用できます。

  1. ID2DRenderTarget::D rawGlyphRun

    アプリケーションでは 、Direct2D API DrawGlyphRun を使用して、GPU を使用したテキスト レンダリング用のハードウェア アクセラレータを提供できます。 ハードウェア アクセラレーションは、グリフをグリフ実行にマージし、グリフ実行ビットマップをフィルター処理することから、表示される最終的な出力に ClearType ブレンド アルゴリズムを適用するまで、テキスト レンダリング パイプラインのすべてのフェーズに影響します。 これは、最適なレンダリング パフォーマンスを得るための推奨される API です。

  2. IDWriteBitmapRenderTarget::D rawGlyphRun

    アプリケーションでは 、IDWriteBitmapRenderTarget::D rawGlyphRun メソッドを使用して、32 bpp ビットマップに対するグリフの実行のソフトウェア レンダリングを実行できます。 IDWriteBitmapRenderTarget オブジェクトは、グリフのレンダリングに使用できるビットマップとメモリ デバイス コンテキストをカプセル化します。 この API は、GDI でレンダリングされる既存のコード ベースがあるため、GDI を使用する場合に便利です。

GDI を使用する既存のテキスト レイアウト コードを持つアプリケーションがあり、既存のレイアウト コードを保持するが、グリフをレンダリングする最後の手順のためだけにDirectWriteを使用する場合、IDWriteGdiInterop::CreateFontFaceFromHdc は 2 つの 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 に設定して、水平方向と垂直方向の両方のディメンションでアンチエイリアシングを使用してレンダリングを指定します。 これにより、曲線と対角線は柔らかさを犠牲にして滑らかに見え、通常は 16 ppem を超えるサイズで使用されます。

  • エイリアス化されたテキスト

    アプリケーションでは、 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 フォント システムとの間で移行できるようにする API を次に示します。

まとめ

閲覧エクスペリエンスの向上は、画面上でも紙の上でも、ユーザーに大きな価値があります。 DirectWriteは、アプリケーション開発者が Windows アプリケーションのテキスト エクスペリエンスを向上させるための使いやすさと階層型プログラミング モデルを提供します。 アプリケーションでは、DirectWriteを使用して、レイアウト API を使用して UI とドキュメント用に書式設定されたテキストをレンダリングできます。 より複雑なシナリオでは、アプリケーションでグリフを直接操作したり、フォントにアクセスしたり、DirectWriteの機能を利用して高品質の文字体裁を提供したりできます。

DirectWriteの相互運用性機能により、アプリケーション開発者は既存の Win32 コードベースを引き継がれ、アプリケーション内でDirectWriteを選択的に採用できます。