DirectWrite の概要

日常生活におけるコミュニケーションでは、常にテキストを使用しています。テキストは、増加の一途をたどる情報を利用するための主な方法です。これまでテキストは、ドキュメント、新聞、書籍などの印刷物で使用されてきましたが、しだいに、Windows PC 上のオンライン コンテンツに使用されるようになってきています。一般的な Windows ユーザーは、コンピューターの画面上に表示されたデータを読むことに多くの時間を費やしています。Web サーフィン、電子メールの流し読み、レポートの構成、スプレッドシートへの記入、ソフトウェアの作成など、さまざまな作業を行っていますが、実際に行っているのはテキストを読むことです。テキストやフォントは Windows のユーザー エクスペリエンスのほぼすべての部分に使用されていますが、ほとんどのユーザーにとって、画面上に表示されたデータを読むことは、印刷物を読むことほど楽しいことではありません。

Windows アプリケーションの開発者にとって、テキストを処理するコードを作成するのは困難な作業です。というのも、読みやすくするための要件の増加、複雑な書式設定やレイアウトの制御、アプリケーションで表示する必要がある複数言語に対するサポートに対応する必要があるためです。最も基本的なテキスト処理システムでも、テキストの入力、レイアウト、表示、編集、およびコピーと貼り付けを実行できるようにする必要があります。Windowsユーザーは一般的に、このような基本的な機能以上を期待するため、単純なエディターであっても、複数のフォント、さまざまな段落スタイル、埋め込み画像、スペル チェックなどの機能をサポートする必要があります。最近の UI のデザインは、1 つの書式とプレーンテキストに限定されることはなくなり、豊富なフォントやテキスト レイアウトを使用してより優れたエクスペリエンスを実現する必要もあります。

ここでは、DirectWrite によって、Windows アプリケーションの UI やドキュメントのテキスト表示品質がどのように向上するかについて説明します。

テキスト表示品質の向上

最近の Windows アプリケーションでは、UI やドキュメント内のテキストに関する要件が複雑になっています。こうした要件には、読みやすさの向上、さまざまな言語やスクリプトのサポート、高度なレンダリング パフォーマンスなどがあります。さらに、既存のアプリケーションのほとんどが、WindowsWin32 コード ベースへのこれまでの投資を今後も利用する方法を必要としています。

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

レンダリング システムからの独立

DirectWrite は、特定のグラフィックス テクノロジに依存していません。そのため、アプリケーションでは、そのニーズに最適なレンダリング テクノロジを自由に使用できます。これにより、アプリケーションの一部には引き続き GDI を使用し、他の部分には Direct3D または Direct2D を使用するというように、柔軟なレンダリングを実現できます。実際には、アプリケーションは専用のレンダリング スタックを通じて DirectWrite をレンダリングすることもできます。

高品質の文字体裁

DirectWrite では、OpenType フォント テクノロジの進化を活かして、Windows アプリケーション内で高品質の文字体裁を実現できます。DirectWrite フォント システムでは、アプリケーションでフォントの処理に必要なフォントの列挙、代替、およびキャッシュを処理するためのサービスが提供されています。

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

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

DirectWrite を使用すると、アプリケーション開発者は、WinForms や GDI では使用できなかった OpenType フォントの機能を利用できるようになります。DirectWrite の IDWriteTypography オブジェクトでは、スタイル付きの代替文字やスワッシュなど、OpenType フォントの高度な機能の多くを公開しています。Microsoft Windows Software Development Kit (SDK) には、Pericles フォント、Pescadero フォントなど、豊富な機能を使用してデザインされた OpenType フォントのサンプル一式が用意されています。OpenType フォントの機能の詳細については、「OpenType フォントの機能」 (http://msdn.microsoft.com/en-us/library/ms745109.aspx) を参照してください。

各国語対応テキストのサポート

DirectWrite では、OpenType フォントを使用して、各国語対応テキストの幅広いサポートが可能になりました。サロゲート、BIDI、改行、UVS などの Unicode 機能がサポートされます。言語に合わせたスクリプトの記述、数字置換、グリフの形成により、スクリプト内のテキストのレイアウトおよびレンダリングは適切な状態になります。

現在サポートされているスクリプトは次のとおりです。

  * が付いたスクリプトについては、既定のシステム フォントがありません。アプリケーションでは、このようなスクリプトをサポートするフォントをインストールする必要があります。

  • アラビア語
  • アルメニア語
  • ベンガル語
  • 注音字母
  • ブライユ点字 *
  • カナダ先住民音節
  • チェロキー語
  • 中国語 (簡体字と繁体字)
  • キリル言語
  • コプト文字 *
  • デバナガリ文字
  • 古代エチオピア語
  • グルジア語
  • グラゴル文字 *
  • ギリシャ語
  • グジャラート語
  • グルムキー文字
  • ヘブライ語
  • 日本語
  • カンナダ語
  • クメール語
  • 韓国語
  • ラオス語
  • ラテン語
  • マラヤーラム語
  • モンゴル語
  • ミャンマー語
  • 新タイ ロ文字
  • オガム文字 *
  • オリヤー語
  • パスパ文字
  • ルーン文字 *
  • シンハラ語
  • シリア語
  • タイ ロ文字
  • タミール語
  • テルグ語
  • ターナ文字
  • タイ語
  • チベット語
  • イ文字

複数のレイヤーで構成される機能

DirectWrite には、複数のレイヤーで構成される機能が用意されており、各レイヤーは隣のレイヤーとシームレスに対話します。API のデザインにより、アプリケーション開発者は、ニーズやスケジュールに応じて、自由かつ柔軟に個別のレイヤーを採用できます。次の図は、こうしたレイヤーの関係を示しています。

 

API の図

 

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

独自のレイアウト エンジンを実装し、テキストを集中的に使用するアプリケーションでは、下位レイヤー (スクリプト プロセッサ) を使用することができます。スクリプト プロセッサでは、テキスト ブロックがスクリプト ブロックに分解され、スクリプトのテキストを適切な言語で正しく表示できるように、Unicode 表現からフォントの適切なグリフ表現へのマッピングが処理されます。テキスト レイアウト API レイヤーで使用されるレイアウト システムは、フォントとスクリプトを処理するシステムに基づいて構築されています。

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

DirectWrite フォント システムは、DirectWrite のすべての機能レイヤーで使用できるため、アプリケーションからフォントやグリフの情報にアクセスできるようになります。このシステムは、一般的なフォント テクノロジやデータ形式を処理するように設計されています。DirectWrite フォント モデルは、同じフォント ファミリ内のさまざまな太さ、スタイル、および伸縮をサポートする、一般的な文字体裁の慣例に従っています。このモデル (WPF および CSS でも採用されています) では、太さ (太い、細いなど)、スタイル (標準、イタリック、または斜体)、伸縮 (狭い、縮小、広いなど) のみが異なるフォントは、同じフォント ファミリのメンバーと見なされます。

ClearType によるテキスト レンダリングの向上

画面上での読みやすさの向上は、すべての Windows アプリケーションにとって重要な要件です。認知心理学の調査から、処理速度を上げるためには、すべての文字を正確に認識できる必要があるだけでなく、文字の間隔も重要であることがわかりました。均整がとれていない文字や単語は、見苦しいと認識され、読みやすさが低下します。Microsoft Advanced Reading Technologies グループの Kevin Larson は、この件について、Spectrum IEEE で発行された「テキストのテクノロジ」(英語の可能性あり) (http://www.spectrum.ieee.org/print/5049) というタイトルの興味深い記事を執筆しています。

DirectWrite のテキストは、Microsoft ClearType を使用してレンダリングされるため、テキストのわかりやすさと読みやすさが向上します。ClearType では、最新の LCD ディスプレイで、各ピクセルで個別に制御できる RGB ストライプが使用されているという点が活用されます。DirectWrite では、個々の文字だけでなく、文字間隔も評価できる ClearType の最新の拡張機能を使用しています (ClearType は、Windows Presentation Foundation を搭載した Windows Vista に最初に同梱されました)。この ClearType の拡張機能が開発されるまで、"読み取り" サイズが 10 ポイントまたは 12 ポイントのテキストを表示するのは困難でした。設定可能な文字間隔は、1 ピクセルか 2 ピクセルのいずれかで、前者の場合は小さすぎて、後者の場合は大きすぎるということが往々にしてありました。サブピクセルの解像度が上がると、間隔値を小数で指定できるようになるため、ページ全体の均一性や対称性が向上します。

次の 2 つの例では、サブピクセル配置を使用した場合にサブピクセル境界でグリフがどのように開始されるかを示しています。

 

"Hello" (サブピクセル配置を使用しないレンダリング)

 

上記の例は、サブピクセル配置を使用していない、GDI バージョンの ClearType レンダラーを使用してレンダリングされています。

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

 

"Hello" (サブピクセル配置を使用したレンダリング)

 

2 つ目の画像では、文字 h と n の間隔が 1 つ目の画像よりも均等になっていて、文字 o が文字 n から離れ、文字 l とより均等になるように配置されています。また、文字 l の縦線がより自然になっています。

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

GDI ClearType レンダリングのどちらの特色とも異なり、サブピクセルの ClearType では、文字の幅が非常に正確になります。

テキスト文字列 API では、既定で、サブピクセル テキスト レンダリングを採用しています。つまり、この API は、現在のディスプレイの解像度に関係なく最適な解像度でテキストを測定し、実際に拡大または縮小されたグリフのアドバンス幅と配置オフセットに基づいて、グリフの配置を行います。

大きなサイズのテキストの場合、DirectWrite を使用すると、Y 軸に沿ったアンチエイリアシングにより、縁がより滑らかになり、フォント設計者が意図したとおりに文字をレンダリングできます。Y 方向のアンチエイリアシングのスクリーン ショットを次に示します。

 

Y 方向にアンチエイリアスされたテキスト

 

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

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

  • サブピクセルの ClearType (既定)
  • 水平と垂直の両方向のアンチエイリアシングを使用したサブピクセルの ClearType
  • エイリアスされたテキスト
  • GDI 固有の幅 (たとえば Microsoft Word の全画面表示で使用されます)
  • GDI と互換性のある幅 (東アジア言語の埋め込みビットマップを含む)
このようなレンダリング モードはそれぞれ、DirectWrite API と Windows 7 付属の新しい ClearType チューナーを使用して細かく調整できます。

API の概要

IDWriteFactory インターフェイスは、DirectWrite 機能を使用する場合の出発点になります。ファクトリは、併用できる一連のオブジェクトを作成するルート オブジェクトです。

テキストの描画やヒット テストを実行する前に、指定された一連の制約に合わせて適切にテキストの書式設定とレイアウトを行う必要があるため、書式設定とレイアウトの操作は必須条件になります。この目的で IDWriteFactory を使用して作成できる 2 つの主なオブジェクトは、IDWriteTextFormat および IDWriteTextLayout です。IDWriteTextFormat オブジェクトは、テキスト段落の書式設定情報を表します。IDWriteFactory::CreateTextLayout 関数は、入力文字列と関連する制約 (塗りつぶす領域の大きさなど)、および IDWriteTextFormat オブジェクトを受け取り、完全な分析と書式設定を行った結果を IDWriteTextLayout に渡してその後の操作で使用します。

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

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

次のコード例では、アプリケーションから IDWriteTextFormat を使用して 1 つの段落の書式を設定し、Direct2D の DrawText 関数を使用してその段落を描画する方法を示しています。

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
        );
    }

    return hr;
}

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

DirectWrite では、上記の例のように IDWriteTextFormat インターフェイスを使用してテキスト文字列のフォント ファミリ名を指定する以外に、フォントの列挙、および埋め込まれたドキュメントのフォントに基づいてカスタム フォント コレクションを作成する機能により、アプリケーションでのフォントの選択をより細かく制御できます。

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

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

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

次の図は、このようなオブジェクトの関係を示しています。

 

フォント コレクション、フォント ファミリ、およびフォント フェイスの関係を示す図

 

IDWriteFontFace

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

ほとんどのメインストリーム アプリケーションでは、こうした API を直接使用するのではなく、IDWriteFont を使用したり、フォント ファミリ名を直接指定したりします。

次の表は、この 2 つのオブジェクトの使用シナリオを示しています。

カテゴリIDWriteFontIDWriteFontFace
フォントの選択ユーザー インターフェイスなどのユーザー操作をサポートする 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::DrawGlyphRun

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

  2. IDWriteBitmapRenderTarget::DrawGlyphRun

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

GDI を使用する既存のテキスト レイアウト コードがアプリケーションに含まれていて、その既存のレイアウト コードを保持しながら、グリフをレンダリングする最後の手順でのみ DirectWrite を使用する場合、IDWriteGdiInterop::CreateFontFaceFromHdc によって 2 つの API 間の橋渡しが行われます。この関数を呼び出す前に、アプリケーションでは IDWriteGdiInterop::CreateFontFaceFromHdc 関数を使用して、デバイス コンテキストからフォント フェイス参照を取得します。

  ほとんどのシナリオでは、アプリケーションはこのようなグリフ レンダリング API を使用する必要はありません。アプリケーションでは、IDWriteTextLayout オブジェクトを作成したら、ID2D1RenderTarget::DrawTextLayout メソッドを使用してテキストをレンダリングできます。

カスタム レンダリング モード

ガンマ、ClearType レベル、ピクセル ジオメトリ、拡張されたコントラストなど、さまざまなパラメーターがテキスト レンダリングに影響します。レンダリング パラメーターは、IDWriteRenderingParams パブリック インターフェイスを実装するオブジェクトによってカプセル化されます。レンダリング パラメーターのオブジェクトは、ハードウェアのプロパティや、Windows 7 の ClearType コントロール パネル アプレットで指定されたユーザーの基本設定に基づいて、自動的に初期化されます。通常、クライアントから DirectWrite レイアウト API を使用すると、DirectWrite により、指定された測定モードに対応するレンダリング モードが自動的に選択されます。

さらに詳細な制御を必要とするアプリケーションでは、IDWriteFactory::CreateCustomRenderingParams を使用して、異なるレンダリング オプションを実装できます。また、この関数を使用して、ガンマ、ClearType レベル、ピクセル ジオメトリ、拡張されたコントラストを設定することもできます。

使用できるレンダリング オプションには、次のようなものがあります。

  • サブピクセルの ClearType

    アプリケーションでは、renderingMode パラメーターに DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL を設定し、水平方向のみにアンチエイリアシングを使用した ClearType レンダリングを指定します。

  • 水平と垂直の両方向のアンチエイリアシングを使用したサブピクセル ClearType

    アプリケーションでは、renderingMode パラメーターに DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL_SYMMETRIC を設定し、水平と垂直の両方向のアンチエイリアシングを使用した ClearType レンダリングを指定します。これにより、曲線や斜線はぼかしが強くなる可能性がありますが、より滑らかに表示されます。また、これは通常 16 ppem 以上のサイズで使用されます。

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

    アプリケーションでは、renderingMode パラメーターに DWRITE_RENDERING_MODE_ALIASED を設定し、エイリアスされたテキストを指定します。

  • グレースケール テキスト

    アプリケーションでは、pixelGeometry パラメーターに DWRITE_PIXEL_GEOMETRY_FLAT を設定し、グレースケール テキストを指定します。

  • GDI と互換性のある幅 (東アジア言語の埋め込みビットマップを含む)

    アプリケーションでは、renderingMode パラメーターに DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC を設定し、GDI と幅の互換性がある ClearType を指定します。

  • GDI 固有の幅

    アプリケーションでは、renderingMode パラメーターに DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL を設定し、GDI 固有の幅と互換性がある ClearType を指定します。

  • アウトライン テキスト

    サイズが大きいレンダリングの場合、アプリケーション開発者は、ビットマップにラスタライズするのではなく、フォント アウトラインを使用してレンダリングするのが適していることがあります。アプリケーションでは、renderingMode パラメーターに DWRITE_RENDERING_MODE_OUTLINE を設定して、レンダリング時にラスタライザーをバイパスし、アウトラインを直接使用します。

GDI との相互運用性

IDWriteGdiInterop インターフェイスでは、GDI との相互運用性が提供されます。これにより、アプリケーションは、GDI コード ベースへの既存の投資を引き続き活用し、レンダリングまたはレイアウトで DirectWrite を選択的に使用できるようになります。

アプリケーションが GDI フォント システムとの間で移行できるようにする API を次に示します。

  • CreateFontFromLOGFONT

    LOGFONT 構造体で指定されたプロパティに一致する IDWriteFont オブジェクトを作成します。

  • ConvertFontToLOGFONT

    指定された IDWriteFont の GDI と互換性があるプロパティに基づいて、LOGFONT 構造体を初期化します。

  • ConvertFontFaceToLOGFONT

    指定された IDWriteFontFace の GDI と互換性があるプロパティに基づいて、LOGFONT 構造体を初期化します。

  • CreateFontFaceFromHdc

    現在選択されている HFONT に対応する IDWriteFontFace オブジェクトを作成します。

結論

読みやすさの向上は、画面に表示されるデータと印刷物のどちらでも、ユーザーにとって大きな価値があります。DirectWrite では、アプリケーション開発者が Windows アプリケーションのテキスト表示品質を向上するのに役立つ操作性と複数レイヤーのプログラミング モデルが提供されています。アプリケーションでは、DirectWrite を使用して、レイアウト API で UI とドキュメントの多彩な書式が設定されたテキストをレンダリングできます。より複雑なシナリオでは、アプリケーションは、グリフを直接操作したり、フォントにアクセスしたりできます。また、高品質の文字体裁を実現するために DirectWrite の機能を利用することもできます。

DirectWrite の相互運用機能により、アプリケーション開発者は、既存の Win32 コードベースを引き続き使用しながら、アプリケーションで DirectWrite を選択的に採用することができます。

 

 

コミュニティの追加

追加
表示:
© 2015 Microsoft