ScriptShapeOpenType 関数 (usp10.h)

OpenType 情報を使用して Unicode 実行のグリフとビジュアル属性を生成します。 各実行は、この関数の 1 つの呼び出しで構成されます。

構文

HRESULT ScriptShapeOpenType(
  [in, optional] HDC                  hdc,
  [in, out]      SCRIPT_CACHE         *psc,
  [in, out]      SCRIPT_ANALYSIS      *psa,
  [in]           OPENTYPE_TAG         tagScript,
  [in]           OPENTYPE_TAG         tagLangSys,
  [in, optional] int                  *rcRangeChars,
  [in, optional] TEXTRANGE_PROPERTIES **rpRangeProperties,
  [in]           int                  cRanges,
  [in]           const WCHAR          *pwcChars,
  [in]           int                  cChars,
  [in]           int                  cMaxGlyphs,
  [out]          WORD                 *pwLogClust,
  [out]          SCRIPT_CHARPROP      *pCharProps,
  [out]          WORD                 *pwOutGlyphs,
  [out]          SCRIPT_GLYPHPROP     *pOutGlyphProps,
  [out]          int                  *pcGlyphs
);

パラメーター

[in, optional] hdc

デバイス コンテキストを処理します。 詳細については、「 キャッシュ」を参照してください。

[in, out] psc

スクリプト キャッシュを識別する SCRIPT_CACHE 構造体へのポインター。

[in, out] psa

ScriptItemizeOpenType の以前の呼び出しから取得したSCRIPT_ANALYSIS構造体へのポインター。 構造体はシェイプ エンジンを識別し、グリフを正しく形成できるようにします。

または、このパラメーターを NULL に設定して、フィルター処理されていない結果を受け取ることもできます。

[in] tagScript

書き込みシステムの OpenType スクリプト タグを定義する OPENTYPE_TAG 構造体。

[in] tagLangSys

書き込みシステムの OpenType 言語タグを含む OPENTYPE_TAG 構造体。

[in, optional] rcRangeChars

範囲の文字の配列。 配列要素の数は cRanges で示されます。 この配列の要素の値は、 cChars の値に加算されます。

[in, optional] rpRangeProperties

1 つの OpenType 特徴範囲を表す、 TEXTRANGE_PROPERTIES 構造体の配列。 構造体の数は、 cRanges パラメーターによって示されます。 rpRangeProperties の詳細については、「解説」セクションを参照してください。

[in] cRanges

OpenType 機能範囲の数。

[in] pwcChars

実行を含む Unicode 文字の配列へのポインター。

[in] cChars

Unicode 実行の文字数。

[in] cMaxGlyphs

生成するグリフの最大数。

[out] pwLogClust

この関数が論理 クラスター 情報の配列を取得するバッファーへのポインター。 各配列要素は、Unicode 文字の配列内の文字に対応します。 各要素の値は、実行の最初のグリフから、対応する文字を含むクラスター内の最初のグリフへのオフセットです。 SCRIPT_ANALYSIS構造体の fRTL メンバーが TRUE の場合、配列の読み取り時に要素が減少します。

[out] pCharProps

この関数が cChars によって示される長さの文字プロパティ値の配列を取得するバッファーへのポインター。

[out] pwOutGlyphs

この関数がグリフの配列を取得するバッファーへのポインター。

[out] pOutGlyphProps

この関数が取得した各グリフの属性の配列を取得するバッファーへのポインター。 値の長さは pcGlyphs の値と等しくなります。 グリフごとに 1 つのグリフ プロパティが示されるため、このパラメーターの値は cMaxGlyphs で指定された要素の数を示します。

[out] pcGlyphs

この関数が pwOutGlyphs に示されているグリフの数を取得する場所へのポインター。

戻り値

処理が正常に終了した場合は 0 を返します。 関数は、成功しない場合は 0 以外の HRESULT 値を返します。 すべてのエラーケースで、すべての出力配列値の内容は未定義です。

エラーの戻り値は次のとおりです。

  • E_OUTOFMEMORY。 cMaxGlyphs で示される出力バッファー長が不十分です。
  • E_PENDING。 psc パラメーターで指定されたスクリプト キャッシュには、文字列を整形するのに十分な情報が含まれていません。また、デバイス コンテキストが NULL として渡されているため、関数はシェイプ プロセスを完了できません。 アプリケーションは、実行用に正しいデバイス コンテキストを設定し、 hdc の適切なコンテキスト値と他のすべてのパラメーターを同じにして、この関数を再度呼び出す必要があります。
  • USP_E_SCRIPT_NOT_IN_FONT。 デバイス コンテキストに対応するフォントでは、必要なスクリプトはサポートされていません。 アプリケーションでは、 ScriptGetCMap または別のメソッドを使用してフォントを選択して、別のフォントを選択する必要があります。

解説

ScriptShapeOpenType は、以前の ScriptShape 関数よりも優先されます。 ScriptShapeOpenType の利点には、次のようなものがあります。

  • パラメーターは、フォント レイアウト テーブルの OpenType タグに直接対応します。
  • パラメーターは、各文字に適用される特徴を定義します。
  • 入力は実行に分割されます。 各実行には OpenType プロパティがあり、 ScriptShapeOpenType の 1 回の呼び出しで構成されます。
この関数がE_OUTOFMEMORYを返す場合、アプリケーションは、十分な大きさのバッファーが提供されるまで、連続して大きな出力バッファーを使用して ScriptShapeOpenType を繰り返し呼び出す可能性があります。 コード ポイントによって生成されるグリフの数は、スクリプトとフォントによって異なります。 単純なスクリプトの場合、Unicode コード ポイントによって 1 つのグリフが生成される場合があります。 ただし、複雑なスクリプト フォントでは、コンポーネントから文字を作成し、文字の数倍のグリフを生成する場合があります。 また、無効な文字表現など、無効なシーケンスを表すために余分なグリフが追加される特殊なケースもあります。 したがって、 pwOutGlyphs によって示されるバッファーのサイズに対する妥当な推測は、文字バッファーの長さの 1.5 倍に加えて、まれなケース (たとえば、無効なシーケンス表現など) に対して 16 個のグリフを追加します。

フォントまたはオペレーティング システムがグリフ インデックスをサポートできない場合、この関数は、SCRIPT_ANALYSIS構造体の fNoGlyphIndex メンバーを設定できます。

アプリケーションは ScriptShapeOpenType を 呼び出して、フォントが特定の文字列内の文字をサポートしているかどうかを判断できます。 関数がS_OKを返す場合、アプリケーションは不足しているグリフの出力をチェックする必要があります。 SCRIPT_ANALYSIS構造体で fLogicalOrderTRUE に設定されている場合、関数は常に元の Unicode 文字と同じ順序でグリフを生成します。 fLogicalOrderFALSE に設定されている場合、この関数は右から左への項目を逆の順序で生成するため、ExtTextOut を呼び出す前に ScriptTextOut を逆にする必要はありません。

SCRIPT_ANALYSISの eScript メンバーが SCRIPT_UNDEFINED に設定されている場合、シェーピングは無効になります。 この場合、 ScriptShapeOpenType はフォント cmap テーブルにあるグリフを表示します。 テーブルにグリフがない場合、関数はグリフが見つからないことを示します。

ScriptShapeOpenType は、実行内でクラスターを一様にシーケンスし、クラスター内でグリフを一様にシーケンスします。 ScriptItemizeOpenTypeSCRIPT_ANALYSISfRTL メンバーの値を使用して、シーケンス処理が左から右または右から左の値かどうかを識別します。

rpRangeProperties パラメーターの場合、TEXTRANGE_PROPERTIES 構造体は、OPENTYPE_FEATURE_RECORD構造体の配列を指します。 この配列は次のように使用されます。

  • rpRangeProperties に指定された配列の各要素は、範囲を記述します。
  • 特定のプロパティを共有するテキストのスパンは "入れ子" になり、入れ子になったスパンは OPENTYPE_FEATURE_RECORD情報を 共有できます。 たとえば、次の図に示します。
    • 一番上の数値の行は、それぞれ範囲、項目、および実行を表します。
    • ここで文字でラベル付けされた各スパンは、1 つの OpenType 機能を表します。 各範囲に分類される特徴は、その範囲の OPENTYPE_FEATURE_RECORD 配列に格納されます。
    • 範囲ごとに、 OPENTYPE_FEATURE_RECORD 構造体の配列は、その範囲を含むスパンの文字に対応します。
    • この図では、範囲 2 はスパン A、B、C の OPENTYPE_FEATURE_RECORD 構造体と間接的に関連付けられています。範囲 4 は、スパン A と D の構造体にのみ関連付けられています。
6 つのプロパティを使用して 8 つの単語を表示するテキスト行内の各単語の範囲、項目、実行、および特徴を示す図
メモ この図では、それぞれ 1 回の実行を表す ScriptShapeOpenType への多くの呼び出しを使用しています。
 
大事な Windows 8 以降: Windows 7 で実行する機能を維持するために、Uniscribe を使用するモジュールでは、ライブラリ リストで gdi32.lib の前に Usp10.lib を指定する必要があります。
 

次の例は、ScriptShapeOpenType が文字配列 (pwcChars) とグリフ配列 (pwOutGlyphs) から論理クラスター配列 (pwLogClust) を生成する方法を示しています。 実行には 4 つのクラスターがあります。

  • 最初のクラスター: 1 つのグリフで表される 1 文字
  • 2 番目のクラスター: 3 つのグリフで表される 1 文字
  • 3 番目のクラスター: 1 つのグリフで表される 3 つの文字
  • 4 番目のクラスター: 3 つのグリフで表される 2 つの文字
実行は、文字配列とグリフ配列で次のように記述されています。

文字配列:

  • |c1u1 |c2u1 |c3u1 c3u2 c3u3 |c4u1 c4u2 |
グリフ配列:
  • |c1g1 |c2g1 c2g2 c2g3 |c3g1 |c4g1 c4g2 c4g3 |
配列要素の表記は、次の項目で構成されます。
  • c<n> はクラスター n を意味します。
  • g<m> はグリフ m を意味します。
  • u<p> は Unicode コード ポイント p を意味します。
生成されたクラスター配列は、 文字を含むクラスターへのオフセットを格納します。 単位はグリフで表されます。
  • |0 |1 |4 4 4 |5 5 |

要件

   
サポートされている最小のクライアント Windows Vista [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows Server 2008 [デスクトップ アプリのみ]
対象プラットフォーム Windows
ヘッダー usp10.h
Library Usp10.lib
[DLL] Usp10.dll
再頒布可能パッケージ Windows XP Usp10.dll バージョン 1.600 以降

関連項目

テキストを Uniscribe で表示する

OPENTYPE_FEATURE_RECORD

SCRIPT_ANALYSIS

ScriptItemizeOpenType

ScriptPlaceOpenType

ScriptShape

ScriptTextOut

TEXTRANGE_PROPERTIES

Uniscribe 関数