(57)【要約】【課題】  グラフィックモデルとそれに関連するその他の改良点を単純な形で効果的に使用することができるようにする。【解決手段】  インタフェースを介して、プログラミングコードは、バリデーションビジュアルオブジェクト、描画ビジュアルオブジェクト、およびサーフェスビジュアルオブジェクトを含む、描画サーフェスを表すビジュアルに、ジオメトリデータ、画像データ、アニメーションデータ、およびその他のデータなどの描画プリミティブを書き込む。【選択図】  図２
2010182324.tif 000002
【特許請求の範囲】
【請求項１】
プロセッサー、メモリーおよびグラフィックサブシステムを有するコンピューティング環境において、
前記プロセッサーが、グラフィック情報を含めるためのビジュアルであって、シーングラフが専用の複数のアプリケーションプログラムインタフェースを含むビジュアルで構築されるもの、を作成する要求を、定義されたインタフェースを介して受け取り、それに応答して前記メモリー上に前記ビジュアルを作成するステップと、
前記プロセッサーが、前記ビジュアルに前記グラフィック情報に関連するデータを追加するための描画コンテクストを当該ビジュアルに対して提供するステップと、
前記メモリーに、前記描画コンテクストを介して受け取られるデータを前記ビジュアルと関連して保持するステップと、
前記プロセッサーが、前記ビジュアルを含む前記シーングラフを処理して、前記グラフィックサブシステムにグラフィックデータを提供するステップと、
を備えたことを特徴とする方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、一般にはコンピュータシステムに関し、より詳細には、コンピュータシステムに表示するグラフィック情報およびその他のビデオ情報の処理に関する。
【背景技術】
【０００２】
現在、コンピュータシステムにおける従来の即時モデルによるグラフィックへのアクセスの限界に達しつつあるが、この理由の１つは、メモリーおよびバスの速度が主要なプロセッサーおよび／またはグラフィックプロセッサーの発達に見合うように上がらなかったことである。一般に、フレームを準備する現在の（例えばＷＭ＿ＰＡＩＮＴ）モデルは、複雑なグラフィック効果が求められる際にハードウェアのリフレッシュ速度についていくのにあまりに多くのデータ処理を必要とする。その結果、従来のグラフィックモデルで複雑なグラフィックス効果を試みると、視覚効果として知覚される変化が次のフレームに間に合うように完了されずに、この変化が異なるフレームにわたって付加され、視覚的に目立つ望ましくない結果が生じる場合がある。
【０００３】
グラフィック出力を制御する新しいモデルが記載される（例えば米国特許出願１０／１８４，７９５，米国特許出願１０／１８４，７９６および米国特許出願１０／１８５，７７５）。この新モデルは、グラフィック処理技術のいくつかの顕著な改良点を提供する。
例えば米国特許出願１０／１８４，７９５は一般に複数レベルからなるグラフィック処理システムおよび方法を対象とし、ここでは、（例えばオペレーティングシステムの）より高水準のコンポーネントが、低水準のコンポーネントに単純化したデータ構造および／またはグラフィックコマンドを渡すために、シーングラフを構築し、アニメーションパラメータを更新し、シーングラフのデータ構造をトラバースするという計算的に集約的な面を比較的低い動作速度で行う。高水準の処理によりデータが大幅に単純化されるので、低水準コンポーネントは、グラフィックスサブシステムのフレームリフレッシュレートに相当する速度など（高水準コンポーネントに比べて）高い速度で動作して、データを処理してグラフィックスサブシステムへの一定の出力データとすることができる。アニメーションを使用する場合は変化を加えてシーン全体を描き直す必要がなく、低水準の処理により必要に応じてパラメータ間隔を補間して、レンダリング時にフレームごとにわずかに変化したシーンを提供し、なめらかなアニメーションを提供する瞬時値を得ることができる。
【０００４】
また、グラフィックスを描画しようとするプログラムコード（例えばアプリケーションプログラムまたはオペレーティングシステムコンポーネント）がシーングラフ記述の特定面を選択的に変更し、他の面はそのままにしておくことができるように、可変の（アニメーション）値とパラメータ化したグラフコンテナを提供するパラメータ化されたシーングラフが記載される（例えば、米国特許出願１０／１８４，７９６参照）。プログラムコードは、シーングラフのすでに構築された部分を可能性としては異なるパラメータで再使用することもできる。理解できるように、パラメータ化および／または既存のシーングラフ部分の再使用を介して表示項目の外観を容易に変えられることにより、全グラフィック処理効率において相当の利得が得られる。
【０００５】
オブジェクトおよびデータを介してシーングラフに視覚情報を格納するためのキャッシングデータ構造とそれに関連する機構が記載される（例えば、米国特許出願１０／１８５，７７５参照）。データ構造は一般に、構造中の視覚情報をポピュレートし使用する方法をインテリジェントに制御する機構と関連付けられる。例えば、アプリケーションプログラムによって特別に要求されない限り、データ構造に格納された情報の大半には外部参照がなく、それによりその情報を最適化するか、その他の形で処理することが可能になる。理解できるように、この結果効率と資源の節減が得られる。例えばキャッシュデータ構造中のデータを処理して、ビットマップやその他の後処理結果などのよりコンパクトなフォーマットおよび／または後に行う反復的な処理の必要性が低減する別のフォーマットにすることができる。
【発明の開示】
【発明が解決しようとする課題】
【０００６】
上述の改良によりグラフィック処理技術において相当の恩恵が得られるが、プログラムがこの改良されたグラフィックモデルとそれに関連するその他の改良点を単純な形で効果的に使用するための方法がなお必要とされる。必要とされるのは、こうした改良されたグラフィックモデルによって提供される多くのファンクションとグラフィック処理能力をプログラムが利用し、それにより複雑なグラフィックスを効率的に出力するための包括的でありながら単純な方法である。
【課題を解決するための手段】
【０００７】
簡潔に述べると、本発明は、オブジェクトモデルと、プログラムコードの開発者が、グラフィックを生成するシーングラフデータ構造と一貫性をもってインタフェースを取れる形でそのオブジェクトモデルにアクセスするためのアプリケーションプログラムインタフェース（ＡＰＩ）とを提供する。このモデルおよびＡＰＩセットにおける基本オブジェクトはビジュアルであり、ビジュアルはユーザに対する仮想のサーフェスを表し、シーングラフはビジュアルオブジェクトで構築される。このようなビジュアルには、コンテナビジュアルオブジェクト、バリデーションビジュアルオブジェクト、描画ビジュアルオブジェクト、およびサーフェスビジュアルオブジェクトが含まれる。ビジュアル自体は、クリップオブジェクト、変換オブジェクトなどのリソースオブジェクトを保持することができ、一部のタイプのビジュアル（例えばＤｒａｗｉｎｇＶｉｓｕａｌ、ＶａｌｉｄａｔｉｏｎＶｉｓｕａｌ）は、画像、ブラシおよび／またはグラデーションなどのリソースオブジェクトを参照できる描画命令リストを保持することができる。
【０００８】
シーングラフ中の典型的なリソースオブジェクトは、一旦作成すると不変となり、すなわち一旦作成すると変更することができない。ビジュアルは一般にはリソースとみなさず、またビジュアルはある程度までは不変とみなさないことに留意されたい。例えば、プログラムコードは、あるビジュアルがポイントする変換を置き換えることができるが、変換自体を変えることはできない。これは変換が不変であるためである。オブジェクトは、コンストラクタで、またはコンパニオンビルダオブジェクトを使用して定義することができる。
【０００９】
プログラムコードは、アプリケーションプログラムインタフェースを介して、ジオメトリデータ、画像データ、アニメーションデータ、およびその他のデータなどの描画プリミティブをビジュアルに書き込む。例えば、プログラムコードは、線描画命令、ジオメトリ描画命令、ビットマップ描画命令などの描画プリミティブをビジュアル中に書き込む。これらの描画命令はしばしば、パスをどのように描画するかを記述するジオメトリデータのような複雑なデータと組み合わせられ、またビットマップ、ビデオなどのリソースを参照することができる。
【００１０】
コードは、変換、クリッピング、および不透明度のプロパティをビジュアルに指定することもでき、変換、不透明度およびヒットテストの識別をプッシュおよびポップするメソッドが提供される。さらに、ビジュアルはそれがどのようにヒットテストに関わるかを制御するフラグを有する。プログラムコードはまた、ビジュアルとインタフェースを取って子ビジュアルを追加し、それにより階層的なシーングラフを構築する。ビジュアルマネジャは、シーングラフを処理（例えばトラバースまたは送信）して、より低水準のグラフィックコンポーネントに豊かなグラフィックデータを提供する。
【００１１】
コンテナビジュアルは、子ビジュアルの集合を提供し、また一実装では階層を定義することができる唯一のビジュアルである。コンテナビジュアルの子の集合は、子ビジュアルの任意の挿入、除去および再順序付けを可能にする。
【００１２】
描画ビジュアルはオープン呼出しによって開かれ、その呼出しにより呼出し元に描画コンテクスト（例えば描画コンテクストオブジェクトへの参照）が戻される。一般に、描画コンテクストは、ビジュアルをポピュレートするのに使用される一時的なヘルパーオブジェクトである。そしてプログラムコードは、その描画コンテクストを使用してビジュアルに描画プリミティブを追加する。オープン呼出しはビジュアルの内容（子）をクリアすることができ、あるいはアペンド呼出しを使用してその現在のビジュアルに追加するためにビジュアルを開くことができる。描画パラメータとして静的な値を受け取る以外に、描画コンテクストはアニメーションオブジェクトで埋めることもできる。
【００１３】
バリデーションビジュアルは、プログラムコードがそれを埋めようとする場合ではなく、システムがそれを埋めることを要求する場合にその描画コンテクストが埋められる点を除いては描画ビジュアルと同様に動作する。サーフェスビジュアルは、ピクセルデータのビットマップを表示するために提供され、そのピクセルデータで埋められた描画コンテクストに対応するか、そのピクセルデータを提供するサーフェスビジュアルマネジャによってトラバースされる別のビジュアル部分グラフに対応することができる。システムは、サーフェスに直接描画することが可能な描画コンテクストの実装を提供し、ＳｕｒｆａｃｅＶｉｓｕａｌＭａｎａｇｅｒを使用してビジュアルのシーングラフをサーフェス中に合成することができる。他のタイプのビジュアルも記述される。
【００１４】
このように、描画コンテクストを使用して、ジオメトリ、画像データ、およびビデオデータを含む各種タイプのプリミティブをビジュアルに描画することができる。ジオメトリは、例えば長方形など、ストロークや塗りつぶしのないベクトルグラフィックのスケルトンを定義するクラスタイプである。各ジオメトリオブジェクトは、単純な形状（ＬｉｎｅＧｅｏｍｅｔｒｙ、ＥｌｌｉｐｓｅＧｅｏｍｅｔｒｙ、ＲｅｃｔａｎｇｌｅＧｅｏｍｅｔｒｙ）、複雑な単一の形状（ＰａｔｈＧｅｏｍｅｔｒｙ）、または指定の結合操作（例えば合併、交差など）を伴うそのような形状のリスト（ＧｅｏｍｅｔｒｙＬｉｓｔ）に対応する。これらのオブジェクトはクラス階層を形成する。また、ＤｒａｗＲｅｃｔａｎｇｌｅメソッドなど、頻繁に使用されるジオメトリタイプにはショートカットもある。
【００１５】
ジオメトリを描画する場合にはブラシまたはペンを指定することができる。ブラシオブジェクトは、平面をどのように図形的に埋めるかを定義し、ブラシオブジェクトのクラス階層がある。ペンは、ストロークされた領域をどのように埋めるかを記述する際に指定されるブラシも有する。特殊なタイプのブラシオブジェクト（ＶｉｓｕａｌＢｒｕｓｈ）は、ビジュアルを参照してそのブラシをどのように描画するかを定義することができる。
【００１６】
この他の恩恵および利点は、以下の詳細な説明を図面と併せて読むことにより明らかになろう。
【発明を実施するための最良の形態】
【００１７】
例示的動作環境
図１は、本発明を実装することができる適切なコンピューティングシステム環境１００の一例である。コンピューティングシステム環境１００は適切なコンピューティング環境の一例に過ぎず、本発明の使用または機能性の範囲について何らの限定を示唆するものではない。またコンピューティング環境１００は、例示的動作環境１００に示す構成要素の任意の１つまたは組み合わせに関連する依存性または必要性を有するものとも解釈すべきでない。
【００１８】
本発明は、数多くの他の汎用または特殊目的のコンピューティングシステム環境または構成で動作することができる。本発明に使用するのに適している可能性があるよく知られるコンピューティングシステム、環境、および／または構成の例には、これらに限定しないが、パーソナルコンピュータ、サーバコンピュータ、ハンドヘルドまたはラップトップデバイス、タブレットデバイス、マルチプロセッサーシステム、マイクロプロセッサーベースのシステム、セットトップボックス、プログラム可能な消費者家電製品、ネットワークＰＣ、ミニコンピュータ、メインフレームコンピュータ、上述のシステムまたはデバイスのいずれを含む分散コンピューティング環境などがある。
【００１９】
本発明は、コンピュータによって実行されるプログラムモジュールなどのコンピュータ実行可能命令との一般的な関係で説明することができる。一般に、プログラムモジュールには、特定タスクを行うか、あるいは特定の抽象データ型を実装するルーチン、プログラム、オブジェクト、コンポーネント、データ構造などが含まれる。本発明は、通信ネットワークを通じてつながれた遠隔の処理装置によってタスクを行う分散コンピューティング環境で実施することもできる。分散コンピューティング環境では、メモリー記憶装置を含むローカルおよびリモート両方のコンピュータ記憶媒体にプログラムモジュールを置くことができる。
【００２０】
図１を参照すると、本発明を実施する例示的システムは、コンピュータ１１０の形態の汎用コンピューティングデバイスを含む。コンピュータ１１０の構成要素には、これらに限定しないが、処理装置１２０、システムメモリー１３０、およびシステムメモリーを含む各種のシステム構成要素を処理装置１２０に結合するシステムバス１２１が含まれる。システムバス１２１は、各種のバスアーキテクチャの任意のものを使用したメモリーバスまたはメモリーコントローラ、ペリフェラルバス、およびローカルバスを含む数タイプのバス構造のいずれでもよい。例として、このようなアーキテクチャには、ＩＳＡ（Ｉｎｄｕｓｔｒｙ  Ｓｔａｎｄａｒｄ  Ａｒｃｈｉｔｅｃｔｕｒｅ）バス、ＭＣＡ（Ｍｉｃｒｏ  Ｃｈａｎｎｅｌ  Ａｒｃｈｉｔｅｃｔｕｒｅ）バス、ＥＩＳＡ（Ｅｎｈａｎｃｅｄ  ＩＳＡ）バス、ＶＥＳＡ（Ｖｉｄｅｏ  Ｅｌｅｃｔｒｏｎｉｃｓ  Ｓｔａｎｄａｒｄｓ  Ａｓｓｏｃｉａｔｉｏｎ）ローカルバス、ＡＧＰ（Ａｃｃｅｌｅｒａｔｅｄ  Ｇｒａｐｈｉｃｓ  Ｐｏｒｔ）バス、およびメザニンバスとも称されるＰＣＩ（Ｐｅｒｉｐｈｅｒａｌ  Ｃｏｍｐｏｎｅｎｔ  Ｉｎｔｅｒｃｏｎｎｅｃｔｓ）バスが含まれるが、これらに限定しない。
【００２１】
コンピュータ１１０は通例各種のコンピュータ可読媒体を含む。コンピュータ可読媒体は、コンピュータ１１０がアクセスすることができる任意の利用可能媒体でよく、揮発性および不揮発性の媒体、取り外し可能および取り外し不能媒体が含まれる。これに限定しないが、例としてコンピュータ可読媒体は、コンピュータ記憶媒体および通信媒体を含むことができる。コンピュータ記憶媒体は、コンピュータ可読命令、データ構造、プログラムモジュール、またはその他のデータなどの情報を記憶するための任意の方法または技術に実装された揮発性および不揮発性の媒体、取り外し可能および取り外し不能の媒体を含む。コンピュータ記憶媒体には、これらに限定しないが、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、フラッシュメモリーまたは他のメモリー技術、ＣＤ−ＲＯＭ、デジタル多用途ディスク（ＤＶＤ）または他の光ディスクストレージ、磁気カセット、磁気テープ、磁気ディスクストレージまたは他の磁気記憶装置、あるいは、所望の情報の記憶に用いることができ、コンピュータ１１０によるアクセスが可能な任意の他の媒体が含まれる。通信媒体は、通例、搬送波または他の搬送機構などの変調データ信号にコンピュータ可読命令、データ構造、プログラムモジュール、または他のデータを実施し、任意の情報伝達媒体を含む。用語「変調データ信号」とは、信号中に情報を符号化するような方法でその特性の１つまたは複数を設定または変化させた信号を意味する。例として、通信媒体には、配線ネットワークまたは直接配線接続などの配線媒体と、音響、ＲＦ、赤外線、および他の無線媒体などの無線媒体が含まれるが、これらに限定しない。上記の媒体のいずれの組み合わせもコンピュータ可読媒体の範囲に含めるべきである。
【００２２】
システムメモリー１３０には、読み取り専用メモリー（ＲＯＭ）１３１およびランダムアクセスメモリー（ＲＡＭ）１３２など、揮発性および／または不揮発性メモリーの形態のコンピュータ記憶媒体が含まれる。起動時などにコンピュータ１１０内の要素間の情報転送を助ける基本ルーチンを含む基本入出力システム１３３（ＢＩＯＳ）は、通例ＲＯＭ１３１に記憶される。ＲＡＭ１３２は通例、処理装置１２０から即座にアクセス可能な、および／または現在処理装置１２０によって操作中のデータおよび／またはプログラムモジュールを含む。これらに限定しないが、例として、図１にはオペレーティングシステム１３４、アプリケーションプログラム１３５、他のプログラムモジュール１３６、およびプログラムデータ１３７を示している。
【００２３】
コンピュータ１１０は、他の取り外し可能／取り外し不能、揮発性／不揮発性のコンピュータ記憶媒体も含むことができる。単なる例として、図１には、取り外し不能、不揮発性の磁気媒体の読み取りまたは書き込みを行うハードディスクドライブ１４１、取り外し可能、不揮発性の磁気ディスク１５２の読み取りまたは書き込みを行う磁気ディスクドライブ１５１、およびＣＤ−ＲＯＭや他の光媒体などの取り外し可能、不揮発性の光ディスク１５６の読み取りまたは書き込みを行う光ディスクドライブ１５５を示す。例示的動作環境で使用できるこの他の取り外し可能／取り外し不能、揮発性／不揮発性のコンピュータ記憶媒体には、これらに限定しないが、磁気テープカセット、フラッシュメモリーカード、デジタル多用途ディスク、デジタルビデオテープ、ソリッドステートＲＡＭ、ソリッドステートＲＯＭなどが含まれる。ハードディスクドライブ１４１は通例、インタフェース１４０などの取り外し不能のメモリーインタフェースを通じてシステムバス１２１に接続され、磁気ディスクドライブ１５１および光ディスクドライブ１５５は通例、インタフェース１５０など取り外し可能なメモリーインタフェースによってシステムバス１２１に接続される。
【００２４】
上記で説明し、図１に示すドライブとそれらに関連付けられたコンピュータ記憶媒体は、コンピュータ可読命令、データ構造、プログラムモジュール、およびコンピュータ１１０のその他のデータの記憶を提供する。例えば図１では、ハードディスクドライブ１４１にオペレーティングシステム１４４、アプリケーションプログラム１４５、他のプログラムモジュール１４６、およびプログラムデータ１４７の格納が示されている。これらのコンポーネントは、オペレーティングシステム１３４、アプリケーションプログラム１３５、他のプログラムモジュール１３６、およびプログラムデータ１３７と同じものでも、異なるものでもよいことに留意されたい。ここではオペレーティングシステム１４４、アプリケーションプログラム１４５、他のプログラムモジュール１４６、およびプログラムデータ１４７には、それらが少なくとも異なるコピーであることを表すために異なる参照符号を付けている。ユーザは、タブレット（電子デジタイザ）１６４、マイクロフォン１６３、キーボード１６２、および一般にはマウス、トラックボール、あるいはタッチパッドと称するポインティングデバイス１６１などの入力装置を通じてコンピュータ１１０にコマンドと情報を入力することができる。他の入力装置（図示せず）には、ジョイスティック、ゲームパッド、衛星放送受信アンテナ、スキャナなどがある。これらおよび他の入力装置は、システムバスに結合されたユーザ入力インタフェース１６０を通じて処理装置１２０に接続することが多いが、パラレルポート、ゲームポート、あるいはユニバーサルシリアルバス（ＵＳＢ）など他のインタフェースおよびバス構造によって接続することも可能である。モニタ１９１または他タイプの表示装置も、ビデオインタフェース１９０などのインタフェースを介してシステムバス１２１に接続される。モニタ１９１は、タッチスクリーンインタフェース１９２などのインタフェースを介して手書きなどのデジタル化された入力をコンピュータシステム１１０に入力することが可能なタッチスクリーンパネル１９３などと一体化してもよい。モニタおよび／またはタッチスクリーンパネルは、タブレットタイプのパーソナルコンピュータのように、コンピューティングデバイス１１０が組み込まれた筐体に物理的に結合することができ、その場合は基本的にタッチスクリーンパネル１９３がタブレット１６４として機能することに留意されたい。さらに、コンピューティングデバイス１１０などのコンピュータは、スピーカ１９５やプリンタ１９６など他の周辺出力装置も含むことができ、それらは出力周辺インタフェース１９４などを通じて接続することができる。
【００２５】
コンピュータ１１０は、リモートコンピュータ１８０など１つまたは複数のリモートコンピュータへの論理接続を使用するネットワーク環境で動作することができる。リモートコンピュータ１８０はパーソナルコンピュータ、サーバ、ルータ、ネットワークＰＣ、ピアデバイス、あるいはその他の一般的なネットワークノードでよく、図１にはメモリー記憶装置１８１しか示していないが、通例はコンピュータ１１０と関連して上記で挙げた要素の多くまたはすべてを含む。図１に示す論理接続には、構内ネットワーク（ＬＡＮ）１７１と広域ネットワーク（ＷＡＮ）１７３が含まれるが、他のネットワークを含むことも可能である。このようなネットワーキング環境は、オフィス、企業内のコンピュータネットワーク、イントラネット、およびインターネットに一般的に見られる。
【００２６】
ＬＡＮネットワーキング環境で使用する場合、コンピュータ１１０はネットワークインタフェースまたはアダプタ１７０を通じてＬＡＮ１７１に接続される。ＷＡＮネットワーキング環境で使用する場合、コンピュータ１１０は通例、インターネットなどのＷＡＮ１７３を通じて通信を確立するためのモデム１７２またはその他の手段を含む。モデム１７２は内蔵型でも外付け型でもよく、ユーザ入力インタフェース１６０または他の適切な機構を介してシステムバス１２１に接続することができる。ネットワーク環境では、コンピュータ１１０と関連して図示したプログラムモジュール、またはその一部は遠隔のメモリー記憶装置に格納することができる。これに限定しないが、例として図１ではリモートアプリケーションプログラム１８５がメモリー装置１８１に常駐していることが示されている。図のネットワーク接続は例示的なものであり、コンピュータ間に通信リンクを確立する他の手段を使用できることは理解されよう。
【００２７】
シーングラフデータ構造とのインタフェース
本発明の一態様は、一般には、アプリケーションやオペレーティングシステムコンポーネントなどのプログラムコードが、システムディスプレイにグラフィック出力をレンダリングするために描画命令またはその他の情報（例えば画像ビットマップ）をグラフィックコンポーネントに伝達できるようにすることを対象とする。このために、本発明は、プログラムが、シーングラフにデータ構造、描画プリミティブ（コマンド）、およびその他のグラフィック関連データをポピュレートできるようにする、例えばオブジェクトモデルとのアプリケーションプログラミングインタフェース（ＡＰＩ）の形態のいくつかの定義された関数およびメソッドを提供する。処理するとシーングラフは画面に表示されたグラフィックとなる。
【００２８】
図２は、本発明を実施することができる一般的な階層アーキテクチャ２００を表す。図２に表すように、プログラムコード２０２（例えばアプリケーションプログラムやオペレーティングシステムコンポーネントなど）は、本発明の一態様によれば、画像化２０４を介して、ベクトルグラフィック要素２０６を介して、および／またはビジュアルアプリケーションプログラミングインタフェース（ＡＰＩ）層２１２に直接置かれた関数／メソッド呼出しを介してなど、１つまたは複数の各種の方法でグラフィックデータを出力するように開発することができる。一般に、画像化２０４は、例えばビットマップなどの画像をロードし、編集し、保存する機構をプログラムコード２０２に提供する。下記のように、その画像はシステムの他部分によって使用することができ、またプリミティブ描画コードを使用して直接画像に描画する方法もある。ベクトルグラフィック要素２０６は、オブジェクトモデルの残りの部分との整合性を保ちながら、グラフィックを描画する別の方法を提供する（下記）。ベクトルグラフィック要素２０６はマークアップ言語によって作成することができ、要素／プロパティシステム２０８およびプレンゼンタシステム２１０は、ベクトルグラフィック要素２０６を処理してビジュアルＡＰＩ層２１２に対する適切な呼出しを行う。ベクトルグラフィックエレメント２０６、ならびにエレメント／プロパティシステム２０８およびプレゼンタシステム２１０については、上述（例えば、「Markup Language and Object Model for Vector Graphics」という名称の同時係属特許出願参照）に説明される。
【００２９】
一実装では、グラフィック層アーキテクチャ２００は高水準の合成およびアニメーションエンジン２１４を含み、このエンジンはキャッシングデータ構造２１６を含むか、あるいはその他の形で関連付けられる。キャッシングデータ構造２１６は、下記のように、定義されたオブジェクトモデルに従って管理される階層的に構成されたオブジェクトからなるシーングラフを含む。一般に、ビジュアルＡＰＩ層２１２は、プログラムコード２０２（およびプレゼンタシステム２１０）にキャッシングデータ構造２１６とのインタフェースを提供し、これにはオブジェクトを作成し、オブジェクトを開閉してオブジェクトにデータを提供するなどの能力が含まれる。すなわち高水準の合成およびアニメーションエンジン２１４は統一メディアＡＰＩ層２１２を公開し、開発者はこれによりグラフィックおよびグラフィック情報を表示する媒体についての意図を表し、基礎プラットフォームに十分な情報を提供することができ、プラットフォームはプログラムコードのためにハードウェア使用を最適化することができる。例えば、基礎プラットフォームは、キャッシング、リソースのネゴシエーション、および媒体の統合を受け持つ。
【００３０】
一実装では、高水準の合成およびアニメーションエンジン２１４は、命令ストリームおよび可能性としては他のデータ（例えばビットマップへのポインタ）を、高速な低水準の合成およびアニメーションエンジン２１８に渡す。本明細書で使用する場合、用語「高水準」および「低水準」は他のコンピューティングシナリオで使用されるものと同様の意味であり、一般には、あるソフトウェアコンポーネントがより高いコンポーネントに対して低いほどそのコンポーネントはハードウェアに近づく。したがって、例えば、高水準の合成およびアニメーションエンジン２１４から送られるグラフィック情報は、低水準の合成およびアニメーションエンジン２１８で受け取ることができ、低水準のエンジンではその情報を使用してハードウェア２２２を含むグラフィックサブシステムにグラフィックデータを送る。
【００３１】
高水準の合成およびアニメーションエンジン２１４はプログラムコード２０２と連動して、プログラムコード２０２によって提供されるグラフィックシーンを表すシーングラフを構築する。例えば、描画する各項目を描画命令によってロードすることができ、システムはその項目をシーングラフデータ構造２１６にキャッシュすることができる。下記で述べるように、このデータ構造２１６および描画内容を指定するにはいくつかの様々な方法がある。さらに、高水準の合成およびアニメーションエンジン２１４はタイミングおよびアニメーションシステム２２０と統合して、宣言型（あるいは他の形）のアニメーション制御（例えばアニメーションの間隔）とタイミング制御を提供する。このアニメーションシステムでは、例えば要素プロパティレベル２０８、ビジュアルＡＰＩ層２１２の内部、およびその他リソースのうち任意のものを含めて、基本的にシステム中のどこへでもアニメーション値を渡せることに留意されたい。タイミングシステムは、要素レベルおよびビジュアルレベルで公開される。
【００３２】
低水準の合成およびアニメーションエンジン２１８は、シーンの合成、アニメーション化、およびレンダリングを管理し、それをグラフィックサブシステム２２２に提供する。低水準のエンジン２１８は、複数アプリケーションのシーンのレンダリングを構成し、レンダリングコンポーネントを用いて実際のグラフィックレンダリングを画面に実装する。ただし場合によってはレンダリングの一部をより高いレベルで行うことが必要、および／または好都合である場合もあることに留意されたい。例えば、より低水準の層が複数アプリケーションからの要求にサービスするのに対して、より高水準の層はアプリケーション単位でインスタンス化されるが、これは、時間を要するレンダリングあるいはアプリケーション固有のレンダリングをより高いレベルで行い、ビットマップに対する参照をより低水準の層に渡す画像化機構２０４を介して可能になる。
【００３３】
図３および４に、それぞれビジュアルと称する基礎オブジェクトを含む例示的なシーングラフ３００および４００を示す。一般に、ビジュアルは、ユーザに対する仮想のサーフェスを表し、ディスプレイ上の視覚的な表現を有するオブジェクトからなる。図５に表すように基礎クラスのビジュアルは他のビジュアルタイプに基本ファンクションを提供し、すなわち、ビジュアルクラス５００は、ビジュアルタイプ（例えば５０１〜５０６）が派生する抽象的な基礎クラスである。
【００３４】
図３に表すように、最上位レベル（すなわちルート）のビジュアル３０２はビジュアルマネジャオブジェクト３０４に接続され、ビジュアルマネジャオブジェクト３０４も、プログラムコードに対してグラフィックデータが出力されるウィンドウ（ＨＷｎｄ）３０６または同様の単位との関係を（例えばハンドルを介して）有する。ＶｉｓｕａｌＭａｎａｇｅｒ３０４は、このウィンドウ３０６への最上位レベルのビジュアル（およびそのビジュアルの任意の子）の描画を管理する。図６に、ここに記載するグラフィックシステムのオブジェクトモデルの他オブジェクト６００のセットの１つとしてＶｉｓｕａｌＭａｎａｇｅｒを示している。
【００３５】
描画するには、ビジュアルマネジャ３０４はディスパッチャ３０８のスケジュールに従ってシーングラフを処理（例えばトラバースまたは送信）し、グラフィック命令およびその他のデータをそれに対応するウィンドウ３０６について低水準コンポーネント２１８（図２）に提供する。これについては概説される（例えば、特許文献１、２、および３参照）。通例、シーングラフの処理はディスパッチャ３０８により、より低水準のコンポーネント２１８および／またはグラフィックサブシステム２２２のリフレッシュレートに比べて相対的に低い速度でスケジュールされる。図３には、最上位（ルート）ビジュアル３０２の下に階層的に配置されたいくつかの子ビジュアル３１０〜３１５を示しているが、このうちの一部にはそれぞれ、描画コンテクスト３１６、３１７（一時的な性質であることを表すために点線の枠で示している）を介して、例えば描画プリミティブやその他のビジュアルを含む関連付けられた命令リスト３１８および３１９がポピュレートされている。ビジュアルは、次のビジュアルクラスの例に示すように他のプロパティ情報も含むことができる。
【００３６】
public abstract class Visual : VisualComponent
{
public Transform Transform { get; set; }
public float Opacity { get; set; }
public BlendMode BlendMode { get; set; }
public Geometry Clip { get; set; }
public bool Show { get; set; }
public HitTestResult HitTest(Point point);
public bool IsDescendant(Visual visual);
public static Point TransformToDescendant(
Visual reference,
Visual descendant,
Point point);
public static Point TransformFromDescendant(
Visual reference,
Visual descendant,
Point point);
public Rect CalculateBounds( ); // Loose bounds
public Rect CalculateTightBounds( ); //
public bool HitTestable { get; set; }
public bool HitTestIgnoreChildren { get; set; }
public bool HitTestFinal { get; set; }
}
【００３７】
このように、ビジュアルは、ｇｅｔメソッドを介して設定および／または書き込みが可能な変換、クリップ、不透明度、および恐らくはその他のプロパティを提供することにより各種サービスを提供する。また、ビジュアルは、下記のようにそれがヒットテストにどのように関連するかを制御するフラグも有する。Ｓｈｏｗプロパティはビジュアルを表示／隠蔽するのに使用され、例えば偽の場合はビジュアルは見えない状態になり、そうでない場合はビジュアルは見える状態となる。
【００３８】
変換プロパティによって設定される変換は、ビジュアルの部分グラフの座標系を定義する。変換前の座標系を変換前座標系と呼び、変換後の座標系を変換後座標系と呼ぶ。すなわち、変換のあるビジュアルは、変換ノードを親として有するビジュアルに相当する。図７に変換の一例を概略的に示し、ビジュアルに対する変換前座標系と変換後座標系を識別している。ビジュアルの変換を得る、または設定するには、Ｔｒａｎｓｆｏｒｍプロパティを使用することができる。
【００３９】
座標変換は、ビットマップ中で行う場合のように均一の方法であらゆるものに適用できることに留意されたい。これは変換が常にビットマップに適用されるという意味ではなく、レンダリングされるものが等しく変換の影響を受けることを意味することに留意されたい。例として、ユーザが１インチ（２．５４ｃｍ）幅の先の丸いペンで円を描画し、その円に２のＸ方向のスケールを適用する場合、ペンの幅は左と右では２インチになり、上部と下部ではわずか１インチになる。これは時に、（ジオメトリだけに作用するスケルトンまたはジオメトリスケールに対して）合成またはビットマップ変換と呼ばれる。図８Ａはスケーリング変換の表現であり、左に未変換の画像８００を示し、不均一のスケールをかけた変換後の画像８０２を右に示している。図８Ｂはスケーリング変換の表現であり、未変換の画像８００を左に示し、ジオメトリスケーリングをかけた変換後画像８０４を右に示している。
【００４０】
ビジュアルの座標変換に関しては、ＴｒａｎｓｆｏｒｍＴｏＤｅｓｃｅｎｄａｎｔが基準ビジュアルから子孫ビジュアルへと点を変換する。点は、基準ビジュアルの変換後の座標空間から、子孫ビジュアルの変換後の座標空間へと変換される。ＴｒａｎｓｆｏｒｍＦｒｏｍＤｅｓｃｅｎｄａｎｔは、子孫ビジュアルから親チェーンを遡り基準ビジュアルへと点を変換する。点は、子孫ビジュアルの変換後の座標空間から、基準ビジュアルの変換後の座標空間へと変換される。ＣａｌｃｕｌａｔｅＢｏｕｎｄｓメソッドは、変換後の座標空間におけるビジュアル内容のバウンディングボックスを戻す。座標変換中にビジュアルに対する変換をどのように解釈するかについて、より具体的な指定が可能な代替バージョンのＡＰＩがある可能性があることに留意されたい。例えば、基準ビジュアルおよび子孫ビジュアルに対する変換は考慮に入れても、入れなくともよい。したがって、この代替法では４つのオプションがあることになる。すなわち、座標は、変換前の空間から変換前の空間へ、変換前の空間から変換後の空間へ、変換後の空間から変換前の空間へ、そして変換後の空間から変換後の空間に変換することができる。これと同じ概念はヒットテストにも当てはまり、すなわちヒットテストは変換前または変換後の変換座標空間で開始することができ、ヒットテストの結果は、変換前の座標空間または変換後の座標空間における結果とすることができる。
【００４１】
クリッププロパティは、ビジュアルのクリッピング領域を設定（および入手）する。任意のジオメトリ（ジオメトリクラスについては下記で図１２を参照して説明する）をクリッピング領域として使用することができ、そのクリッピング領域を変換後の座標空間で適用する。一実装では、クリッピング領域のデフォルト設定はヌル、すなわちクリッピングなしであり、これは（−∞、−∞）から（＋∞、＋∞）までの無限の大きなクリッピング長方形と考えることができる。
【００４２】
Ｏｐａｃｉｔｙプロパティは、ビジュアルの不透明度値を入手／設定し、不透明度値および選択されたブレンドモードに基づいてビジュアルの内容を描画サーフェス上でブレンドする。ＢｌｅｎｄＭｏｄｅプロパティは、使用するブレンドモードの設定（または入手）に使用することができる。例えば不透明度（アルファ）値は０．０から１．０の間に設定することができ、線形のアルファブレンディングをモードとして設定する。例えば、色＝アルファ値＊前景色＋（１．０−アルファ値）＊背景色）となる。例えば、ぼかし、モノクロといった特殊効果プロパティなど他のサービスをビジュアル中に含めることができる。
【００４３】
各種サービス（変換、不透明度、クリッピングを含む）は描画コンテクストにプッシュおよびポップすることができ、またプッシュ／ポップ操作は、ポップ呼出しがプッシュ呼出しと一致するのであれば入れ子にすることができる。例えば、ＰｕｓｈＴｒａｎｓｆｏｒｍ（．．．）；ＰｕｓｈＯｐａｃｉｔｙ（．．．）；ＰｏｐＴｒａｎｓｆｏｒｍ（．．．）は、ＰｏｐＴｒａｎｓｆｏｒｍ呼出しの前にＰｏｐＯｐａｃｉｔｙを呼び出す必要があるので無効である。
【００４４】
ＰｕｓｈＴｒａｎｓｆｏｒｍメソッドは変換をプッシュする。以降の描画操作は、プッシュされた変換について実行される。ＰｏｐＴｒａｎｓｆｏｒｍは、対応するＰｕｓｈＴｒａｎｓｆｏｒｍの呼出しによってプッシュされた変換をポップする。
void PushTransform(Transform transform);
void PushTransform(Matrix matrix);
void PopTransform();
【００４５】
同様にＰｕｓｈＯｐａｃｉｔｙメソッドは不透明度値をプッシュする。以降の描画操作は、指定された不透明度値で一時的なサーフェス上にレンダリングされ、その後シーンに合成される。ＰｏｐＯｐａｃｉｔｙは、対応するＰｕｓｈＯｐａｃｉｔｙの呼出しによってプッシュされた不透明度をポップする。  
void PushOpacity(float opacity);
void PushOpacity(NumberAnimationBase opacity);
void PopOpacity();
ＰｕｓｈＣｌｉｐメソッドはクリッピングジオメトリをプッシュする。以降の描画操作はそのジオメトリに合わせてクリッピングされる。クリッピングは変換後の空間に適用される。ＰｏｐＣｌｉｐは、対応するＰｕｓｈＣｌｉｐの呼出しによってプッシュされたクリッピング領域をポップする。
void PushClip(Geometry clip);
void PopClip();
【００４６】
プッシュ操作は、ポップ操作がプッシュと対応するのであれば任意で入れ子にできることに留意されたい。例えば、次は有効である。
【００４７】
PushTransform(...);
DrawLine(...);
PushClip(...);
DrawLine(...);
PopClip( );
PushTransform(...);
DrawRect(...);
PopTransform( );
PopTransform( );
【００４８】
ヒットテストは変換後の座標空間で行われ、例えばペンやマウスのクリックが検出されたときにヒットする、ヒットテストが可能な各ビジュアルの識別を戻す。このインタフェースの代替バージョンでは、ヒットテストを開始するビジュアルに相対的な変換前の座標空間でヒットテストを開始できるようにすることができる。ヒットしたビジュアルは、右から左に深さ優先の順序で戻される。ヒットテストは各種のフラグで制御することができ、このフラグには、ビジュアルがヒットテスト可能であるかどうかを判定する（デフォルトは真）ＨｉｔＴｅｓｔａｂｌｅと、ビジュアルがヒットしたときにヒットテストを中止するかどうか、すなわちあるビジュアルがヒットし、そのビジュアルのＨｉｔＴｅｓｔＦｉｎａｌプロパティが真である場合に、ヒットテストを中止し、その時点までに収集された結果を戻すかどうかを判定する（デフォルトは偽）ＨｉｔＴｅｓｔＦｉｎａｌとが含まれる。別のフラグはＨｉｔＴｅｓｔＩｇｎｏｒｅＣｈｉｌｄｒｅｎであり、これは、ビジュアルにヒットテストを行う際にビジュアルの子を考慮すべきかどうかを判定する（デフォルトは偽）。
【００４９】
ＰｒｏｘｙＶｉｓｕａｌは、複数回シーングラフに追加することが可能なビジュアルである。ＰｒｏｘｙＶｉｓｕａｌによって参照されるビジュアルはいずれもルートから複数のパスで到達することができるので、リードサービス（ＴｒａｎｓｆｏｒｍＴｏＤｅｓｃｅｎｄａｎｔ、ＴｒａｎｓｆｏｒｍＦｒｏｍＤｅｓｃｅｎｄａｎｔ、およびＨｉｔＴｅｓｔ）は、ＰｒｏｘｙＶｉｓｕａｌを通じては機能しない。基本的には任意のビジュアルからそのビジュアルツリーのルートへの標準的なパスが１つあり、そのパスはＰｒｏｘｙＶｉｓｕａｌを含まない。
【００５０】
図５に表すようにオブジェクトモデルには各種タイプのビジュアルが定義され、これにはＣｏｎｔａｉｎｅｒＶｉｓｕａｌｓ５０１、ＤｒａｗｉｎｇＶｉｓｕａｌｓ５０２、ＶａｌｉｄａｔｉｏｎＶｉｓｕａｌｓ５０３、ＳｕｒｆａｃｅＶｉｓｕａｌｓ５０４、およびＨｗｎｄＶｉｓｕａｌｓ５０５が含まれる。次の表に、ＤｒａｗｉｎｇＶｉｓｕａｌのメソッド例を挙げる。
【００５１】
public class DrawingVisual : Visual
{
public DrawingVisual( );
public IDrawingContext Open( );
public IDrawingContext Append( );
}
【００５２】
ＤｒａｗｉｎｇＶｉｓｕａｌは、グラフィック内容（例えば線、テキスト、画像など）のコンテナである。ＤｒａｗｉｎｇＶｉｓｕａｌにビジュアルを追加することが可能であるが、実装によっては許されないことに留意されたい。ＤｒａｗｉｎｇＶｉｓｕａｌ５０２はＯｐｅｎメソッドを含み、このメソッドは、下記で述べるように例えば他のビジュアルや描画プリミティブをＤｒａｗｉｎｇＶｉｓｕａｌにポピュレートするのに使用することのできるＩＤｒａｗｉｎｇＣｏｎｔｅｘｔを戻す。一実装では、同じく下記で述べる様々な理由から、ＤｒａｗｉｎｇＶｉｓｕａｌはその描画コンテクストをポピュレートするのに一度だけしか開くことができない。すなわち、このようなＤｒａｗｉｎｇＶｉｓｕａｌは、その中に何を入れることができるかに関しては不変性である（ただしプログラムコードは、あるビジュアルがポイントするリソースオブジェクトを置き換えることができる）。ＤｒａｗｉｎｇＶｉｓｕａｌをポピュレートすると、例えば描画コンテクストでＣｌｏｓｅメソッドを使用してＤｒａｗｉｎｇＶｉｓｕａｌを閉じる。Ｏｐｅｎの呼出しによりビジュアルの内容（子）をすべてクリアすることができるが、代替の一実装では、現在のビジュアルに付加するような形で現在のビジュアルを開くＡｐｐｅｎｄメソッドが提供されることに留意されたい。換言すると、ＯｐｅｎＦｏｒＡｐｐｅｎｄの呼出しは、ＤｒａｗｉｎｇＶｉｓｕａｌの現在の内容がオープン時にクリアされない点を除いてはＯｐｅｎメソッドと同様に機能する。
【００５３】
次に示すのは、描画コンテクストを使用してビジュアルをポピュレートする一例である。
【００５４】
ContainerVisual cv1 = new ContainerVisual( );
DrawingVisual dv1 = new DrawingVisual( );
// Open a drawing context. The context
// will automatically be closed when
// exiting the using block. This will also
// replace any contents that might already
// be in dv1.
using (IDrawingContext dc = dv1.Open( ))
{
dc.DrawLine(new Pen(Brushes.Blue), new Point(...), new Point(...));
}
// Add dv1 to the child collection of cv1
cv1.Children.Add(dv1);
// Add another arbitrary visual to cv1
cv1.Children.Add(someOtherVisual);
// Create another DrawingVisual
DrawingVisual dv2 = new DrawingVisual( );
using (IDrawingContext dc = dv2.Open( ))
{
// This sets up a new coordinate system
// where everything is twice as big
dv.PushTransform(new Scale(2.0, 2.0));
// This line is drawn in the new scaled
// coordinate system.
dc.DrawLine(new Pen(Brushes.Red), new Point(...), new Point(...));
// This reverts to the original coordinate system.
dv.PopTransform( );
dc.DrawLine(new Pen(Brushes.Green), new Point(...), new Point(...));
}
// Add dv2 to the child collection of cv1;
cv1.Children.Add(dv2);
【００５５】
一般に、ＶａｌｉｄａｔｉｏｎＶｉｓｕａｌ５０３は、プログラムコードがそのポピュレートを必要とするときではなく、システムがそれを埋めることを要求したときにポピュレートされる点を除いては概念的にＤｒａｗｉｎｇＶｉｓｕａｌに類似する。例えば、高水準のコンポジションおよびアニメーションエンジン２１４（図２）は、シーングラフの一部が見えない状態であるときなどリソースが必要とされる際にはシーングラフデータを無効にすることができる（例えば、特許文献３に記載される）。例えば、一部の部分がスクロールされてディスプレイから消える、クリッピングされるなどの場合である。無効にしたシーングラフデータが後に必要となった場合は、呼び出されたプログラムコード２０２を呼び戻してそのシーングラフの無効部分を再描画（有効に）する。このために、典型的な使用シナリオの１つは、プログラムコードがＶａｌｉｄａｔｉｏｎＶｉｓｕａｌをサブクラス化し、ＯｎＶａｌｉｄａｔｅメソッドをオーバーライドするものである。システムがＯｎＶａｌｉｄａｔｅメソッドを呼び出すと描画コンテクストが渡され、プログラムはその描画コンテクストを使用して再度ＶａｌｉｄａｔｉｏｎＶｉｓｕａｌをポピュレートする。
【００５６】
下記の例に、例えばある色で線を描画するものなど単純なＶａｌｉｄａｔｉｏｎＶｉｓｕａｌを実装する一方法を示す。線の色はＳｅｔＣｏｌｏｒを呼び出すことによって変更することができる。ＶａｌｉｄａｔｉｏｎＶｉｓｕａｌの更新を強制するために、ＳｅｔＣｏｌｏｒはＩｎｖａｌｉｄａｔｅを呼び出して、グラフィックサブシステムにＶａｌｉｄａｔｉｏｎＶｉｓｕａｌを再度有効にさせる。
【００５７】
public class MyValidationVisual : ValidationVisual
{
public override void OnValidate(IDrawingContext dc)
{
dc.DrawLine(m_color,...);
}
public void SetColor(Color newColor)
{
m_color = color;
Invalidate( ); // Force a redraw of the ValidationVisual to
// reflect the color change.
}
private Color m_color
}
【００５８】
次の例は、ＶａｌｉｄａｔｉｏｎＶｉｓｕａｌの使用法を示す。
【００５９】
MyValidationVisual myVV = new MyValidationVisual( );
container.Children.Add(myVV);
myVV.SetColor(new Color(...));
【００６０】
図４に、ＣｏｎｔａｉｎｅｒＶｉｓｕａｌとＤｒａｗｉｎｇＶｉｓｕａｌがシーングラフ中で関連付けられ、描画プリミティブの形態の関連付けられたデータを（例えば対応する描画コンテクストに）有するシーングラフの例４００を示す。ＣｏｎｔａｉｎｅｒＶｉｓｕａｌはビジュアルのコンテナであり、ＣｏｎｔａｉｎｅｒＶｉｓｕａｌは互いに入れ子にすることができる。ＣｏｎｔａｉｎｅｒＶｉｓｕａｌの子は、ＶｉｓｕａｌＣｏｎｔａｉｎｅｒの子プロパティから戻されるＶｉｓｕａｌＣｏｌｌｅｃｔｉｏｎを用いて操作することができる。ＶｉｓｕａｌＣｏｌｌｅｃｔｉｏｎ中のビジュアルの順序によってビジュアルのレンダリング順序が決まり、すなわち、ビジュアルは最低のインデックスから最高のインデックスへと後ろから前へとレンダリングされる（ペインティングの順序）。例えば、あるコンテナビジュアルの下に赤、緑、青の長方形を階層的に表す３つの描画ビジュアルに適切なパラメータがある場合、次に示すコードにより３つの長方形が（右下へと平行移動して）描画され、赤い長方形が背面に、緑の長方形が中間に、そして青い長方形が前面に描画される。
【００６１】
VisualCollection vc = m_cv.Children;
vc.Add(new DrawingVisual ( ));
vc.Add(new DrawingVisual ( ));
vc.Add(new DrawingVisual ( ));
for (int i = 0; i < vc.Count; i++)
{
DrawingVisual v = (DrawingVisual) (vc[i]);
if (v != null)
{
v.Transform = Transform.CreateTranslation(i * 20.0f, i*20f);
IDrawingContext dc = v.Open( );
dc.DrawRectangle(
new Brush(colors [i]),
null,
new Point2D(0, 0),
new Point2D(100.0f, 100.0f));
v.Close(dc);
}
}
【００６２】
図５に表すように、別のタイプのビジュアルオブジェクトはＳｕｒｆａｃｅＶｉｓｕａｌ５０４である。一般には、図３に表すように、ＳｕｒｆａｃｅＶｉｓｕａｌオブジェクト３１５は、プログラムコード２０２（図２）からのアクセスが可能なインメモリーサーフェス（ビットマップ）３２２を参照する。クライアントプログラムコード２０２は自身のサーフェスメモリーを供給するか、またはサーフェスオブジェクトによりメモリーを割り当てるように要求することができる。
【００６３】
プログラムコード２０２は、ＳｕｒｆａｃｅＶｉｓｕａｌを開いて描画コンテクスト３２３を得るオプションを有し、プログラムコード２０２はその描画コンテクストにピクセルデータ３２４などを書き込み、そのピクセルを直接サーフェスに置くことができる。図３ではこれをサーフェスオブジェクト３２２、描画コンテクスト３２３（一時的な性質であることを表すために点線の枠で表している）、およびピクセルデータ３２４を結ぶ点線で表している。
【００６４】
プログラムコード２０２は、サーフェスビジュアルマネジャ３３０を作成し、ビジュアルの部分グラフ３３２にＳｕｒｆａｃｅＶｉｓｕａｌ３１５を関連付けるオプションも有する。図３ではこのオプションをサーフェスオブジェクト３２２とサーフェスビジュアルマネジャ３３０を結ぶ点線で表している。同じく図３に示すように、ビジュアル部分グラフ３３２は他のサーフェスビジュアルを入れ子にできることに留意されたい。サーフェスビジュアルマネジャ３３０（図６のセット６００に他オブジェクトの１タイプとしても示している）は、ビジュアル部分グラフ３３２をウォークしてＳｕｒｆａｃｅＶｉｓｕａｌビットマップ３２２を更新する。さらに、このトラバースはディスパッチャ３０８によってスケジュールされ、また効率のためにこのビットマップ３２２の更新頻度を制御するように抑制（ｔｈｒｏｔｔｌｅ）できることにも留意されたい。サーフェスビジュアルマネジャ３３０は、最上位レベルのビジュアルマネジャ３０２がシーングラフの残りの部分をウォークするたびに、および／またはそれと同じ速度でビジュアル部分グラフ３２２をトラバースしなくともよい。
【００６５】
したがって図９Ａから９Ｃを参照してさらに説明するように、サーフェスに関して、このグラフィックモデルは一般に、サーフェスへのビジュアルセットの合成、即時モードによるサーフェスへのベクトルおよびビットマッププリミティブのレンダリング、デスクトップまたは別のサーフェスへのサーフェスの合成、およびサーフェスリスト中のどのサーフェスを使用してそこへの合成および描画を行うかの制御を可能にする。サーフェスリストは、ビジュアルまたはグラフィック描画あるいはその両方の合成を格納するのに使用される物理（システムまたはビデオ）メモリーの１つまたは複数のサーフェス（すなわちフレーム／バッファ）の集合と定義される。サーフェスリストのサーフェスの１つを描画および／または合成が行われる現在のバックバッファに設定することができ、サーフェスリストのサーフェスの１つを別のレンダリングターゲット上に合成するのに用いる現在のプライマリまたはフロントバッファとして設定する。
【００６６】
サーフェスはいくつかの方法で使用することができる。例として図９Ａにサーフェスへの合成を示す。図９Ａでは、サーフェスビジュアルマネジャオブジェクト９００が、ビジュアルツリー９０４のレンダリングターゲットとしてのサーフェスリスト９０２を結び付けている。各合成サイクルに、現在サーフェスリストのアクティブなバックバッファとして機能しているサーフェスリストのサーフェス中にビジュアルを合成する。合成されるサーフェスには、インプロセスの合成シナリオのためにクライアント／高水準の合成エンジン２１４（図２）によって所有されるサーフェスや、クライアントがビットを必要とせず、低水準の合成エンジン２１８がサーフェスを別のレンダリングターゲット上に合成するためにそのビットを必要とするシナリオで低水準の合成エンジン２１８によって所有されるサーフェス、あるいはクライアントがサーフェスビットへのアクセスを必要とするが、低水準の合成エンジン２１８も他の合成作業のためにそのサーフェスを必要とするシナリオのクロスプロセスサーフェスが含まれる可能性がある。
【００６７】
合成は、ビジュアルマネジャに付加されるタイミングサービスによって制御される。タイミングサービスの一例は、次の例のように使用することが可能な手動モードである。
【００６８】
// create a manual timing service and attach a visual manager 
TimingService timingService = new ManualTimingService(visualManager);
// composite the visual tree to the current back buffer of the surface visualManager.Render( );
foreach (Tick tick in timingService)
{
// advance the back buffer to the next frame of the surface
surfaceList.NextFrame( );
// advance the time of the visual tree
timingService.Tick(tick);
// composite the visual tree to the current back buffer of surface
visualManager.Render( );
}
【００６９】
サーフェスを使用する別の方法は、コンテクストを介して即時モードでサーフェス上にレンダリングを行うものである。ビジュアル（サーフェスビジュアル）にサーフェスリストを付加することにより、現在そのサーフェスリストのアクティブなバックバッファとして機能しているサーフェスリストのサーフェスに即時モードでレンダリングすることが可能になる。上述のように、このレンダリングは、サーフェスビジュアルから描画コンテクストを入手し、そのコンテクストに描画コマンドを実行することによって行う。描画コンテクストを入手するとサーフェスがロックされ、そのサーフェスには他の合成操作を行えなくなることに留意されたい。各描画コマンドは直ちに実行され、ベクトルおよび他のサーフェスをそのサーフェスに描画（ブレンド）することができる。ただしそのサーフェスに他のビジュアルを描画することはできず、代わりに、上述のように（図９Ａなど）そのサーフェスにビジュアルマネジャを関連付けることにより他のビジュアルをそのサーフェス中に合成することができる。
【００７０】
// attach a surface list to a visual 
SurfaceVisual surfaceVisual = new SurfaceVisual(surfaceList);
// enable immediate-mode rendering to (and lock) back buffer Surface
BaseDrawingContext dc = surfaceVisual.Open( );
// draw a line (immediately) to the current back buffer of the Surface
dc.DrawLine (pen, startPoint, endPoint);
// unlock the surface - we're done with immediate-mode rendering surfaceVisual.Close(dc);
【００７１】
サーフェスの別の使用は、別のレンダリングターゲットにサーフェスを合成する場合である。このために、サーフェスリストがサーフェスビジュアルに付加されるとそのサーフェスをビジュアルツリーにノードとして付加することができ、現在プライマリまたはフロントバッファとして機能しているサーフェスリストのサーフェスを別のサーフェスまたはデスクトップに合成することができる。これを図９Ｂと次の例に示す。
【００７２】
// attach a surface list to a visual 
SurfaceVisual surfaceVisual = new SurfaceVisual(surfaceList);
// Add the surfaceVisual to a visual tree for compositing onto another
// render target
rootVisual.Add(surfaceVisual);
【００７３】
図９Ｃにサーフェスへの／サーフェスからのライブの合成を表し、ここではサーフェスリストのバックバッファサーフェスへの合成と、サーフェスリストのフロントバッファサーフェスからの（例えばデスクトップへの）合成が同時に行われるように上述のファンクションを組み合わせている。ティアリング（ｔｅａｒｉｎｇ）として知られる望ましくないビデオ効果を除去するために、サーフェスリストは、フロントバッファサーフェスとバックバッファサーフェスの少なくとも２つのサーフェスを持つべきことに留意されたい。図９Ｃで用いるサーフェスは恐らくは低水準エンジン２１８によって所有されるか、あるいは低水準エンジン２１８における合成をより良好に行わせるクロスプロセスサーフェスである。
【００７４】
次のコンストラクタの例に示すように、サーフェスは独立したオブジェクトとして構築される。
【００７５】
public class Surface
{
// create and allocate a blank surface without initial data
public Surface(int width,
int height,
int dpi,
PixelFormat pixelFormat,
SurfaceFlags flags)
// create a surface using the supplied memory 
public Surface(int width,
int height,
int dpi,
PixelFormat pixelFormat,
IntPtr pixels, // managed memory for the surface 
Int stride)
// create from a source (i.e. Clone)
public Surface(Surface sourceSurface,
SurfaceFlags flags)
// Create from File or URL
public Surface (String filename,
SurfaceFlags flags)
// Create from Stream
public Surface (System.IO.Stream stream,
SurfaceFlags flags)
// Create from HBITMAP (which can't be selected into an HDC)
public Surface (HBITMAP hbitmap, HPALETTE hPalette)
// Create from HICON
public Surface (HICON hicon)
// read-only properties
public Int Width {get; }
public Int Height {get; }
public Int Dpi {get; }
public PixelFormat Format{get; }
public int Stride{get; }
public IntPtr Buffer {get;}
}
public class SurfaceList
{
// Create a list of blank surfaces (without initial data).
public SurfaceList (int width,
int height,
int dpi,
PixelFormat pixelFormat,
int numSurfaces,
SurfaceFlags flags)
// Create a SurfaceList that uses the specified surfaces
// All the surfaces must have identical properties (w, h,
// dpi, etc).
public SurfaceList (Surface [ ] surfaces)
// change the front buffer to the first-in-line back buffer
public Flip( )
// advance the back buffer to the next surface
public Next( )
public int FrontBufferIndex {get; set;}
public int BackBufferIndex {get; set;}
public Surface GetFrontBuffer( )
public Surface GetBackBuffer( )
public Surface GetSurface(int surfaceIndex)
}
【００７６】
構築するとサーフェスおよび／またはサーフェスリストは、サーフェスビジュアルオブジェクトまたはビジュアルマネジャオブジェクトに付加することができる。
【００７７】
// Create a surface visual
public SurfaceDrawingVisual(Surface surface)
public SurfaceDrawingVisual(SurfaceList surfaceList)
// Create a visual manager with a surface render target
public VisualManager(Surface surface)
public VisualManager(SurfaceList surfaceList)
【００７８】
さらにサーフェスはデコーダからデータを得ることができ、および／または特定のファイルフォーマットに書き出すためにそれが持つデータをエンコーダに送ることができる。サーフェスはまた、効果インタフェースからデータを受け取ることができ、効果インタフェースにデータを送ることもできる。サーフェスは、サポートされるサーフェスフォーマットタイプの完全なセットにある任意のピクセルフォーマットに構築することができる。ただし指定されたピクセルフォーマットにはいくらかの調整を行うことができ、例えば、指定されたピクセルフォーマットが１ピクセル当たり３２ビット未満である場合は、そのフォーマットは１ピクセルにつき３２ビットにプロモートする。元のフォーマットのサーフェスにビットが要求されるときには、フォーマット変換フィルタを使用してそのサーフェスを要求されるピクセルフォーマットのバッファにコピーする。
【００７９】
図５に戻ると、さらに別のビジュアルはＨｗｎｄＶｉｓｕａｌ５０５であり、これはＷｉｎ３２の子ＨＷｎｄをシーングラフ中に配置する。より詳細には、レガシープログラムは今なお、従来のグラフィック技術に基づいて子ＨＷｎｄ（など）に描画するＷＭ＿ＰＡＩＮＴメソッド（など）を介して動作する。この新しいグラフィック処理モデルでそのようなプログラムをサポートするために、図１０Ａに表すように、ＨｗｎｄＶｉｓｕａｌは、Ｈｗｎｄをシーングラフに含め、親のビジュアルの位置が変更されるのに従って移動することを可能にする。ただし、既存のＨｗｎｄに伴う制限の結果、レンダリング時に子Ｈｗｎｄは他のウィンドウの上に置くことしかできず、上述の他のビジュアルのように回転、あるいはスケーリングすることができない。図１０Ｂに表すようにいくらかのクリッピングは可能であり、図１０Ｂでは、その親ビジュアルに対する相対的な移動の際にＨＷｎｄの表示された長方形がクリッピングされていることを点線で示している。
【００８０】
この他のタイプのビジュアル５０６も可能であり、このオブジェクトモデルは他のビジュアルを開発できるように拡張が可能である。例えば図１１に表すように、階層化されたビジュアル１１００により、アプリケーション開発者が複数のデータストリームを介してビジュアル中の情報を個別に制御することが可能になり、単一のデータストリームを有するビジュアルに比べてより精緻な制御の細分性が得られる。同様の制御細分性は、単一の親ビジュアルの下に別個の（例えば３つの）子ビジュアルを備えることによって達成することができるが、それにはプログラムコードが複数のビジュアルを操作することが必要となり、それは複数の層への索引を有する単一の階層化ビジュアルを操作するのに比べて複雑であることに留意されたい。
【００８１】
例として図１１では背景データ、内容データ、および境界線データが単一の階層化ビジュアルに含まれているが、それぞれ例えば０、１、または２のレイヤ値でインデックスを付けるように相互から分離されている。層は、どちらかの端に連結（ｔａｃｋ）するなど挿入するか、および／または削除することができ、階層化の順序（例えば図のように左から右）によって表示の際のＺオーダが間接的に定義される。セキュリティのために、子の内容および階層化ビジュアル中のその他のデータは列挙できないことに留意されたい。
【００８２】
この他のタイプのビジュアルには、コンテナビジュアルとリダイレクトされた子ＨＷｎｄビジュアルが含まれ、後者では内容がビットマップに描画され、サーフェスビジュアルに組み込まれる。３次元ビジュアルは、２次元ワールドと３次元ワールドの連結を可能にし、例えば３次元ワールド中へのビューを有する２次元のビジュアルを介してカメラ様のビューが可能である。
【００８３】
リソースオブジェクトの多くは一旦作成されると不変であり、すなわち一旦作成されると、スレディングの問題を単純化する、他のリソースオブジェクトによる破損を防止する、要素およびＡＰＩとの対話を単純化するなどの各種の理由から変更することができない。これにより一般にシステムが単純化されることに留意されたい。ただし、そのようなオブジェクトが可変であるシステムにすることは可能であるが、例えば依存グラフの管理が必要になることに留意されたい。そのようなオブジェクトが可変であるシステムにすることは可能であるが、例えば、プログラムコードがあるビジュアルに対するクリップセットを変更した場合にはそのビジュアルを再度レンダリングする必要が生じ、したがって通知／登録の機構が必要になる。例えば、ビジュアルに新しいクリップが割り当てられた場合、そのビジュアルは通知のためにそれ自体をそのクリップに登録する（例えばクリップ変更通知）。したがって、一実装では単純化のためにリソースオブジェクトを不変とする。
【００８４】
これらのリソースオブジェクトは、オブジェクトを作成する単純で一般的な方法であるコンストラクタを用いて定義するか、または後述のようにコンパニオンビルダオブジェクトを使用して定義することができる。例えばＳｏｌｉｄＣｏｌｏｒＢｒｕｓｈを作成するには（ブラシオブジェクトについては下記で説明する）、コンストラクタを使用することができる。
Brush MyBrush = new SolidColorBrush(Colors.Red);
【００８５】
ユーザはＢｒｕｓｈｅｓクラスの静的メンバを使用して所定の色のセットを得ることもできる。
【００８６】
不変オブジェクトは変更することができないので、オブジェクトを実質的に変更するには、ユーザは新しいオブジェクトを作成し、古いオブジェクトをそのオブジェクトに置き換える必要がある。このためにシステム中のリソースオブジェクトの多くはビルダパターンを利用することができ、この場合には可変なコンパニオンクラスであるビルダクラスを用いて不変オブジェクトを作成する。ユーザは、ビルダに設定されたパラメータをミラー化する不変オブジェクトを作成し、そのオブジェクトの新しいビルダを作成し、不変オブジェクトからそのビルダを初期化する。ユーザはその後必要に応じてビルダを変更する。これらを一旦行うと、ユーザはビルダを変更し、それを再使用して別の不変オブジェクトを作成することにより新しいオブジェクトを構築することができる。設定プロパティを有する不変オブジェクトを備えることが望ましく、また不変オブジェクトは変更することができず、プロパティ変更イベントを発生させることによって置き換えることしかできないことに留意されたい。
【００８７】
したがって、上述のようにコンストラクタを使用してＳｏｌｉｄＣｏｌｏｒＢｒｕｓｈを作成する代わりに、ＳｏｌｉｄＣｏｌｏｒＢｒｕｓｈＢｕｉｌｄｅｒを使用することができる。
SolidColorBrushBuilder  MyBuilder = new
SolidColorBrushBuilder();
MyBuilder.Color = Colors.Red;
Brush MyBrush = MyBuilder.ToBrush();
【００８８】
静的な値をとる大半のオブジェクトはアニメーションオブジェクトをとることもできる。例えば、ＤｒａｗｉｎｇＣｏｎｔｅｘｔでは、円の中心にＰｏｉｎｔＡｎｉｍａｔｉｏｎＢａｓｅをとるＤｒａｗＣｉｒｃｌｅに対するオーバーライドがある。このようにユーザはプリミティブレベルで豊かなアニメーション情報を指定することができる。リソースオブジェクトには、基本値に加えてアニメーションの集合が存在する。これらは合成され、それによりユーザが上記の例をアニメーションにしたい場合は、ブラシを構築する前に次の例のラインを指定することができる。
MyBuilder.ColorAnimation.Add(new ColorAnimation(...));
【００８９】
アニメーションパラメータを有するオブジェクトもそのアニメーションパラメータが静的であるため、やはり不変であることに留意されたい。ただしシーングラフを処理する（例えばトラバースする）と、アニメーションパラメータの意味は時間とともに変化し、動きのついた静的でないデータの外観を与える。
【００９０】
上述のように、ビジュアルは、Ｇｅｏｍｅｔｒｙ、ＩｍａｇｅＤａｔａ、およびＶｉｄｅｏＤａｔａを含む各種の描画プリミティブを各自の描画コンテクストにポピュレートすることによりその上に描画を行うことができる。さらに、このスタック全体を通じて共有されるリソースとクラスのセットがある。これにはＰｅｎｓ、Ｂｒｕｓｈｅｓ、Ｇｅｏｍｅｔｒｙ、Ｔｒａｎｓｆｏｒｍｓ、およびＥｆｆｅｃｔｓが含まれる。ＩＤｒａｗｉｎｇＣｏｎｔｅｘｔは、ＤｒａｗｉｎｇＶｉｓｕａｌ、ＶａｌｉｄａｔｉｏｎＶｉｓｕａｌをポピュレートするのに使用できる描画操作のセットを公開する。ＩＤｒａｗｉｎｇコンテクストとの基本インタフェースであるＩＳｕｒｆａｃｅＤｒａｗｉｎｇＣｏｎｔｅｘｔは、ＳｕｒｆａｃｅＶｉｓｕａｌをポピュレートするのに使用することができる。すなわち描画コンテクストは描画操作のセットを公開し、各描画操作に、引数として定数を受け取るメソッドと、引数としてアニメータを受け取るメソッドの２つのメソッドがある。
【００９１】
ＤｒａｗＬｉｎｅメソッドは、指定されたペンで始点から終点まで線を描画する。
【００９２】
public void DrawLine(Pen pen, Point start, Point end);
public void DrawLine(
Pen pen,
PointAnimationBase start,
PointAnimationBase end);
【００９３】
ＤｒａｗＲｏｕｎｄｅｄＲｅｃｔａｎｇｌｅメソッドは、指定されたブラシとペンで角が丸い長方形を描画する。ブラシとペンはヌルでよい。
【００９４】
public void DrawRoundedRectangle(
Brush brush,
Pen pen,
Point topLeft,
Size size,
float radius);
public void DrawRoundedRectangle(
Brush brush,
Pen pen,
PointAnimationBase topLeft,
SizeAnimationBase size,
NumberAnimationBase radius);
public void DrawRoundedRectangle(
Brush brush,
Pen pen,
Point topLeft,
Point bottomRight,
float rx,
float ry);
public void DrawRoundedRectangle(
Brush brush,
Pen pen,
PointAnimationBase topLeft,
PointAnimationBase bottomRight,
NumberAnimationBase radiusX,
NumberAnimationBase radiusY);
【００９５】
ＤｒａｗＧｅｏｍｅｔｒｙメソッドは、指定されたブラシとペンでパスを描画する。ブラシとペンはヌルでよい。
【００９６】
public void DrawGeometry(
Brush brush,
Pen pen,
Geometry geometry);
【００９７】
ＤｒａｗＲｅｃｔａｎｇｌｅメソッドは、指定されたブラシとペンで長方形を描画する。ブラシとペンはヌルでよい。
【００９８】
public void DrawRectangle(
Brush brush,
Pen pen,
Point topLeft,
Size size);
public void DrawRectangle(
Brush brush,
Pen pen,
PointAnimationBase topLeft,
SizeAnimationBase size);
【００９９】
ＤｒａｗＳｕｒｆａｃｅメソッドはサーフェスを描画する。
【０１００】
public void DrawSurface(
Surface surface,
Point topLeft,
Size size,
float opacity);
public void DrawSurface(
Surface image,
PointAnimationBase topLeft,
SizeAnimationBase size,
NumberAnimationBase opacity);
【０１０１】
Ｇｅｏｍｅｔｒｙは、ストロークまたは塗りつぶしのないベクトルグラフィックスケルトンを定義するクラスタイプである（図１２）。各ジオメトリオブジェクトは、単純な形（ＬｉｎｅＧｅｏｍｅｔｒｙ、ＥｌｌｉｐｓｅＧｅｏｍｅｔｒｙ、ＲｅｃｔａｎｇｌｅＧｅｏｍｅｔｒｙ）、複雑な単一の形状（ＰａｔｈＧｅｏｍｅｔｒｙ）、あるいは指定の結合操作（例えば合併、交差など）を有するそのような形状のリストＧｅｏｍｅｔｒｙＬｉｓｔである。これらのオブジェクトは、図１２に表すようにクラス階層を形成する。
【０１０２】
図１３に表すように、ＰａｔｈＧｅｏｍｅｔｒｙはＦｉｇｕｒｅオブジェクトの集合である。各Ｆｉｇｕｒｅオブジェクトは、その図形の形状を実際に定義する１つまたは複数のＳｅｇｍｅｎｔオブジェクトからなる。Ｆｉｇｕｒｅは、線分の集合を定義するＧｅｏｍｅｔｒｙの下位セクションである。この線分の集合は、２次元のＳｅｇｅｍｎｔオブジェクトの連結された単一のシリーズである。Ｆｉｇｕｒｅは、定義された領域を持つ閉じた形状か、または単に曲線を定義するが囲まれた領域は定義しない連結されたＳｅｇｍｅｎｔのシリーズである。
【０１０３】
ＰａｔｈＧｅｏｍｅｔｒｙの塗りつぶされた領域は、Ｆｉｌｌｅｄプロパティが真に設定された、含まれるＦｉｇｕｒｅを取り出し、ＦｉｌｌＭｏｄｅを適用して閉じた領域を決定することによって定義される。ＦｉｌｌＭｏｄｅの列挙では、Ｇｅｏｍｅｔｒｙに含まれるＦｉｇｕｒｅオブジェクトの交差領域をどのように組み合わせて、最終的なＧｅｏｍｅｔｒｙ領域を形成するかを指定することに留意されたい。「代替の」規則では、概念的にある点から無限まで任意の方向に光線を描画し、その形状の線分がその光線と交差する場所を調べることにより、その点がキャンバスの内側にあるかどうかを判定する。カウントゼロから開始し、ある線分が左から右へと光線と交差するたびに１を加え、パス線分が右から左に光線と交差するたびに１を引くことにより、交差の回数を数えた後にその結果がゼロであれば点はパスの外側にあることになる。それ以外の場合点は内側にある。「ワインディング」規則は、キャンバス上のある点が内側にあるかどうかを判定するものであり、概念的にある点から無限まで任意の方向に光線を描画し、その光線が交差する所与の形状からのパス線分の数を数えることによって機能する。その数が奇数である場合点は内側にあり、偶数であれば点は外側にあることになる。
【０１０４】
図１４に表すように、ジオメトリ（例えば長方形）を描画する際には下記のようにブラシまたはペンを指定することができる。さらに、ペンオブジェクトはブラシオブジェクトも有する。ブラシオブジェクトはある平面をどのようにグラフィック的に塗りつぶすかを定義し、ブラシオブジェクトのクラス階層がある。これを図１４では長方形とブラシ命令を含むビジュアルおよびパラメータを処理した結果得られる、塗りつぶされた長方形１４０２によって表している。
【０１０５】
下記で説明するように、一部のタイプのブラシ（グラデーションや９グリッドなど）は自身のサイズを調整する。使用する際にはそれらのブラシのサイズをバウンディングボックスから入手し、例えばブラシのＧｒａｄｉｅｎｔＵｎｉｔｓ／ＤｅｓｔｉｎａｔｉｏｎＵｎｉｔｓをＯｂｊｅｃｔＢｏｕｎｄｉｎｇＢｏｘに設定する場合には、描画するプリミティブのバウンディングボックスを使用する。それらのプロパティをＵｓｅｒＳｐａｃｅＯｎＵｓｅに設定した場合は、座標空間を使用する。
【０１０６】
Ｐｅｎオブジェクトは、次の例に表すように、Ｗｉｄｔｈ、ＬｉｎｅＪｏｉｎ、ＬｉｎｅＣａｐ、ＭｉｔｅｒＬｉｍｉｔ、ＤａｓｈＡｒｒａｙ、およびＤａｓｈＯｆｆｓｅｔのプロパティとともにＢｒｕｓｈを保持（ｈｏｌｄ  ｏｎｔｏ）する。
【０１０７】
public enum System.Windows.Media.PenLineCap
{
Butt, Round, Square
}
public enum System.Windows.Media.PenLineJoin
{
Miter, Round, Bevel
}
public class System.Windows.Media.Pen
{
// Constructors
public Pen(Color color, float width);
public Pen(Brush brush, float width);
// Properties
public float[ ] DashArray { get; }
public float DashOffset { get; }
public FloatAnimationCollection DashOffsetAnimations { get; }
public PenLineCap LineCap { get; }
public PenLineJoin LineJoin { get; }
public float MiterLimit { get; }
public FloatAnimationCollection MiterLimitAnimations { get; }
public float Opacity { get; }
public FloatAnimationCollection OpacityAnimations { get; }
public Brush Brush { get; }
public float Width { get; }
public FloatAnimationCollection WidthAnimations { get; }
}
public sealed class System.Windows.Media.PenBuilder : Builder
{
// Fields
// Constructors
public PenBuilder ( );
public PenBuilder(Color color);
public PenBuilder(Brush brush);
public PenBuilder(Pen pen);
// Properties
public float[ ] DashArray { get; set; }
public float DashOffset { get; set; }
public FloatAnimationCollectionBuilder DashOffsetAnimations { get; }
public PenLineCap LineCap { get; set; }
public PenLineJoin LineJoin { get; set; }
public float MiterLimit { get; set; }
public FloatAnimationCollectionBuilder MiterLimitAnimations { get; }
public float Opacity { get; set; }
public FloatAnimationCollectionBuilder OpacityAnimations { get; }
public Brush Brush { get; set; }
public float Width { get; set; }
public FloatAnimationCollectionBuilder WidthAnimations { get; }
// Methods
public Pen ToPen( );
}
【０１０８】
上記のように、本発明のグラフィックオブジェクトモデルはＢｒｕｓｈオブジェクトモデルを含み、これは一般には平面をピクセルで覆うという概念を対象とする。ブラシタイプの例を図１５の階層に表し、これはＢｒｕｓｈの基本クラスの下に、ＳｏｌｉｄＣｏｌｏｒＢｒｕｓｈ、ＧｒａｄｉｅｎｔＢｒｕｓｈ、ＩｍａｇｅＢｒｕｓｈ、ＶｉｓｕａｌＢｒｕｓｈ（ビジュアルを参照することができる）、およびＮｉｎｅＧｒｉｄＢｒｕｓｈを含む。ＧｒａｄｉｅｎｔＢｒｕｓｈはＬｉｎｅａｒＧｒａｄｉｅｎｔオブジェクトおよびＲａｄｉａｌＧｒａｄｉｅｎｔオブジェクトを含む。上述のように、Ｂｒｕｓｈオブジェクトは不変である。
【０１０９】
public abstract class System.Windows.Media.Brush
{
float Opacity { get; }
FloatAnimationCollection OpacityAnimations { get; }
}
【０１１０】
次にＢｒｕｓｈＢｕｉｌｄｅｒクラスの例を示す。
【０１１１】
public abstract class System.Windows.Media.BrushBuilder : Builder
{
public virtual Brush ToBrush ( );
public override sealed object CreateInstance ( );
{
return ToBrush ( );
}
float Opacity { get; set; }
FloatAnimationCollectionBuilder OpacityAnimations { get; }
}
【０１１２】
Ｂｒｕｓｈオブジェクトは、使用の際にそれらがどのように座標系に関係するか、および／またはそれらを用いる形状のバウンディングボックスにどのように関係するかを認識することができることに留意されたい。一般に、サイズなどの情報は、そのブラシを描画するオブジェクトから推測することができる。より詳細には、ブラシタイプの多くは、各自のパラメータの一部を指定するために座標系を使用する。この座標系は、ブラシを適用する形状の単純なバウンディングボックスに相対的に定義するか、あるいはそのブラシを使用する際にアクティブである座標空間に相対的なものにすることができる。これらをそれぞれＯｂｊｅｃｔＢｏｕｎｄｉｎｇＢｏｘモード、ＵｓｅｒＳｐａｃｅＯｎＵｓｅモードと称する。
【０１１３】
public enum System.Windows.Media.BrushMappingMode
{
ObjectBoundingBox,
UserSpaceOnUse,
}
【０１１４】
ＳｏｌｉｄＣｏｌｏｒＢｒｕｓｈオブジェクトは、識別された平面を一様な色で塗りつぶす。その色のアルファ成分がある場合は、Ｂｒｕｓｈの基本クラスにある対応する不透明度の属性と乗法的な（ｍｕｌｔｉｐｌｉｃａｔｉｖｅ）形で組み合わせる。次に示すのはＳｏｌｉｄＣｏｌｏｒＢｒｕｓｈオブジェクトの一例である。
【０１１５】
public sealed class System.Windows.Media.SolidColorBrush : Brush
{
// Constructors
public SolidColorBrush( ); // initialize to black
public SolidColorBrush(Color color);
public SolidColorBrush(System.Windows.Media.Animation.ColorComposer
colorComposer);
// Properties
public Color Color { get; }
public IEnumerator ColorAnimations { get; }
}
public class System.Windows.Media.SolidColorBrushBuilder : BrushBuilder
{
// Constructors
public SolidColorBrushBuilder( ) ;
public SolidColorBrushBuilder(Color color);
public SolidColorBrushBuilder(SolidColorBrush scp);
// Properties
public Color Color { get; set; }
public AnimationList ColorAnimations { get; }
// Methods
public virtual Brush ToBrush( );
}
【０１１６】
ＧｒａｄｉｅｎｔＢｒｕｓｈオブジェクトあるいは単にグラデーションは、グラデーション状の塗りつぶしを提供し、何らかの種の推移に従って色を指定するグラデーションの終点のセットを指定することにより描画される。グラデーションは、ガンマ２．２ＲＧＢ色空間のグラデーション終点間に線形の補間を行うことによって描画され、他のガンマまたは他の色空間（ＨＳＢ、ＣＭＹＫなど）での補間も可能な代替法である。２タイプのグラデーションオブジェクトには、線形グラデーションと放射グラデーションが含まれる。
【０１１７】
一般に、グラデーションはグラデーションの終点のリストで構成される。このグラデーションの終点はそれぞれ色（およびそれに含まれるアルファ値）とオフセットを含む。グラデーションの終点が指定されない場合は、ブラシは指定されたブラシが全くないかのように一様の透明な黒として描画される。指定されたグラデーションの終点が１つだけある場合、ブラシは指定された１色で一様な色として描画される。他のリソースクラスと同様に、グラデーションの終点クラス（例を下の表に挙げる）は不変である。
【０１１８】
public class System.Windows.Media.GradientStop
{
public GradientStop(Color color, float offset);
public Color Color { get; }
public AnimationEnumerator ColorAnimations { get; }
public float Offset { get; }
public AnimationEnumerator OffsetAnimations { get; }
}
public class System.Windows.Media.GradientStopBuilder : Builder
{
public GradientStopBuilder( );
public GradientStopBuilder(Color color, float offset);
public Color Color { get; set; }
public AnimationList ColorAnimations { get; }
public float Offset { get; set; }
public AnimationList OffsetAnimations { get; }
public GradientStop ToGradientStop( );
}
【０１１９】
また、次の例に示すように集合クラスもある。
【０１２０】
public class System.Windows.Media.GradientStopCollection : ICollection
{
public GradientStopCollection( ); // empty list
public GradientStopCollection(GradientStop[ ] GradientStops);
public GradientStopCollection(ICollection c);
// IEnumerable
public IEnumerator GetEnumerator( );
// ICollection
public void CopyTo (Array array, int index);
public bool ICollection.IsSynchronized { get { return false; } }
public int Count { get; }
public object ICollection.SyncRoot { get; }
// Extra functions
public GradientStop this [int index] { get; }
public bool Contains (GradientStop value);
public int IndexOf(GradientStop value); // returns first one
public int IndexOf(GradientStop value, int startIndex);
public int IndexOf(GradientStop value, int startIndex, int count);
public int LastIndexOf(GradientStop value);
public int LastIndexOf(GradientStop value, int startIndex);
public int LastIndexOf(GradientStop value, int startIndex, int count);
public GradientStopCollection GetRange(int index, int count);
}
public class System.Windows.Media.GradientStopCollectionBuilder : Builder,
IList
{
public GradientStopCollectionBuilder( );
public GradientStopCollectionBuilder(GradientStop [ ] GradientStops);
public GradientStopCollectionBuilder(ICollection c);
public GradientStopCollectionBuilder(GradientStopCollection
GradientStops);
// IEnumerable
public IEnumerator GetEnumerator( );
// ICollection
public void CopyTo(Array array, int index);
public bool ICollection.IsSynchronized { get { return false; } }
public int Count { get; }
public object ICollection.SyncRoot { get; }
// IList
public bool IsFixedSize { get { return false; } }
public bool IsReadOnly { get { return false; } }
public object IList.this [int index] { get; set; }
public int IList.Add(object value);
public void Clear( );
public bool IList.Contains(object value);
public int IList.IndexOf(object value); // returns first one
public void IList.Insert(int index, object value);
public void IList.Remove(object value); // removes first one
public void RemoveAt(int index);
// Extra functions
public GradientStop this [int index] { get; set; }
public int Add(GradientStop value);
public bool Contains(GradientStop value);
public int IndexOf(GradientStop value); // returns first one
public int IndexOf(GradientStop value, int startIndex);
public int IndexOf(GradientStop value, int startIndex, int count);
public int LastIndexOf(GradientStop value);
public int LastIndexOf(GradientStop value, int startIndex);
public int LastIndexOf(GradientStop value, int startIndex, int count);
public void Insert(int index, GradientStop value);
public void Remove(GradientStop value); // removes first one
public void AddRange(ICollection c);
public void InsertRange(int index, ICollection c);
public void RemoveRange(int index, int count);
public void SetRange(int index, ICollection c);
public GradientStopCollectionBuilder GetRange(int index, int count);
// Capacity is a hint. It will throw an exception if it is set less than
Count.
public int Capacity { get; set; }
// Builder overloads
public override object Build( );
public override void ResetBuilder( );
public override void SetBuilder(Object example);
public GradientStopCollection ToGradientStopCollection( );
}
【０１２１】
下の表に表すように、ＧｒａｄｉｅｎｔＳｐｒｅａｄＭｅｔｈｏｄは、指定されたベクトルまたは空間の外側にどのようにグラデーションを描画するかを指定する。３つの値があり、これには、終端の色（最初の色と最後の色）を使用して残りの空間を塗りつぶすｐａｄ、終点を逆の順序で繰り返し再実行して空間を反復的に塗りつぶすｒｅｆｌｅｃｔ、および空間が塗りつぶされるまで順に終点を繰り返すｒｅｐｅａｔがある。
【０１２２】
public enum System.Windows.Media.GradientSpreadMethod
{
Pad,
Reflect,
Repeat
}
【０１２３】
図１６にＧｒａｄｉｅｎｔＳｐｒｅａｄＭｅｔｈｏｄの例を示す。各形状は、白からグレーへと変化する線形グラデーションを有する。実線はグラデーションベクトルを表す。
【０１２４】
ＬｉｎｅａｒＧｒａｄｉｅｎｔは、ベクトルに沿った線形グラデーションのブラシを指定する。個々の終点は、そのベクトルに沿った色の終点を指定する。次の表に一例を示す。
【０１２５】
public class System.Windows.Media.LinearGradient : GradientBrush
{
// Sets up a gradient with two colors and a gradient vector
// specified to fill the object thegradient is applied to.
// This implies ObjectBoundingBox for the GradientUnits
// property
public LinearGradient(Color color1, Color color2, float angle);
public BrushMappingMode GradientUnits { get; }
public Transform GradientTransform { get; }
public GradientSpreadMethod SpreadMethod { get; }
// Gradient Vector
public Point VectorStart { get; }
public PointAnimationCollection VectorStartAnimations { get; }
public Point VectorEnd { get; }
public PointAnimationCollection VectorEndAnimations { get; }
// Gradient Stops
public GradientStopCollection GradientStops { get; }
}
public class System.Window.Media.LinearGradientBuilder :         GradientBrushBuilder
{
public LinearGradientBuilder( );
public LinearGradientBuilder(Color color1, Color color2, float angle);
public LinearGradientBuilder(LinearGradient lg);
// GradientUnits: Default is ObjectBoundingBox
public BrushMappingMode GradientUnits { get; set; }
// GradientTransform: Default is identity
public Transform GradientTransform { get; set; }
// SpreadMethod: Default is Pad
public GradientSpreadMethod SpreadMethod { get; set; }
// Gradient Vector
// Default vector is (0,0) - (1,0)
public Point VectorStart { get; set; }
public PointAnimationCollectionBuilder VectorStartAnimations { get;
set; }
public Point VectorEnd { get; set; }
public PointAnimationCollectionBuilder VectorEndAnimations { get;
set; }
// Gradient Stops
public void AddStop (Color color, float offeset);
public GradientStopCollectionBuilder GradientStops { get; set; } }
【０１２６】
ＲａｄｉａｌＧｒａｄｉｅｎｔは、プログラミングモデルの点では線形グラデーションと同様である。ただし、線形グラデーションがグラデーションベクトルを定義する始点と終点を有するのに対し、放射グラデーションは、円と、グラデーションの振る舞いを定義する焦点を有する。円はグラデーションの終点を定義し、すなわち１．０のグラデーション終点はその円の色を定義する。焦点はグラデーションの中心を定義する。０．０のグラデーション終点は、焦点の色を定義する。
【０１２７】
図１７に、白からグレーに変化する放射グラデーションを示す。外側の円はグラデーションの円を表し、点は焦点を表す。このグラデーション例ではＳｐｒｅａｄＭｅｔｈｏｄがＰａｄに設定されている。
【０１２８】
public class System.Windows.Media.RadialGradient : GradientBrush
{
// Sets up a gradient with two colors.
// This implies ObjectBoundingBox for the GradientUnits
// property along with a center at (0.5,0.5)
// a radius of 0.5 and a focal point at (0.5,0.5)
public RadialGradient(Color color1, Color color2);
public BrushMappingMode GradientUnits { get; }
public Transform GradientTransform { get; }
public GradientSpreadMethod SpreadMethod { get; }
// Gradient definition
public Point CircleCenter { get; }
public PointAnimationCollection CircleCenterAnimations { get; }
public float CircleRadius { get; }
public FloatAnimationCollection CircleRadiusAnimations { get; }
public Point Focus { get; }
public PointAnimationCollection FocusAnimations { get; }
// Gradient Stops
public GradientStopCollection GradientStops { get; }
}
public class System.Windows.Media.RadialGradientBuilder :
GradientBrushBuilder
{
public RadialGradientBuilder( );
public RadialGradient(Color color1, Color color2);
public RadialGradientBuilder(RadialGradient rg);
// GradientUnits: Default is ObjectBoundingBox
public BrushMappingMode GradientUnits { get; set; }
// GradientTransform: Default is identity
public Transform GradientTransform { get; set; }
// SpreadMethod: Default is Pad
public GradientSpreadMethod SpreadMethod { get; set; }
// Gradient definition
public Point CircleCenter { get; set; } //Default: (0.5, 0.5)
public PointAnimationCollectionBuilder CircleCenterAnimations { get;
set;}
public float CircleRadius { get; set; } // Default: 0.5
public FloatAnimationCollectionBuilder CircleRadiusAnimations { get;
set; }
public Point Focus { get;set; } // Default: (0.5, 0.5)
public PointAnimationCollectionBuilder FocusAnimations { get; set; }
// Gradient Stops
public void AddStop(Color color, float offset);
public GradientStopCollectionBuilder GradientStops { get; set; }
}
【０１２９】
図１５に表す別のブラシオブジェクトは、ＶｉｓｕａｌＢｒｕｓｈオブジェクトである。概念的に、ＶｉｓｕａｌＢｒｕｓｈは、反復されるタイル方法で塗りつぶしとしてビジュアルを描画する方法を提供する。図１４ではこれを、単一の円形状１４２０を指定するビジュアル（および任意の子ビジュアル）を参照するビジュアルブラシによって表しており、その円形状が長方形１４２２を埋めている。このようにＶｉｓｕａｌＢｒｕｓｈオブジェクトはビジュアルを参照してそのブラシをどのように描画するかを定義することができ、これによりビジュアルの複数の使用からあるタイプが導入される。このようにプログラムは任意のグラフィック「メタファイル」を使用して、ブラシまたはペンを介してある領域を埋めることができる。これは任意のグラフィックを記憶し、使用するための圧縮された形態なので、グラフィックリソースとして機能する。次にＶｉｓｕａｌＢｒｕｓｈオブジェクトの一例を示す。
【０１３０】
public class System.Windows.Media.VisualBrush : Brush
{
public VisualBrush(Visual v);
public BrushMappingMode DestinationUnits { get; }
public BrushMappingMode ContentUnits { get; }
public Transform Transform { get; }
public Rect ViewBox { get; }
public Stretch Stretch { get; }
public HorizontalAlign HorizontalAlign { get; }
public VerticalAlign VerticalAlign { get; }
public Point Origin { get; }
public PointAnimationCollection OriginAnimations { get; }
public Size Size { get; }
public SizeAnimationCollection SizeAnimations { get; }
// Visual
public Visual Visual { get; }
}
public class System.Windows.Media.VisualBrushBuilder : BrushBuilder
{
public VisualBrushBuilder( );
public VisualBrushBuilder(Visual v);
public VisualBrushBuilder(VisualBrush vb);
// DestinationUnits: Default is ObjectBoundingBox
public BrushMappingMode DestinationUnits { get; set; }
// ContentUnits: Default is ObjectBoundingBox
public BrushMappingMode ContentUnits { get; set; }
// Transform: Default is Identity
public Transform Transform { get; set; }
// ViewBox: Default is (0,0,0,0) -- unset and ignored
public Rect ViewBox { get; set; }
// Stretch: Default is None -- and ignored
//            because the ViewBox is not set
public Stretch Stretch { get; set; }
// HorizontalAlign: Default is Center and ignored
public HorizontalAlign HorizontalAlign { get; set; }
// VerticalAlign: Default is Center and ignored
public VerticalAlign VerticalAlign { get; set; }
// Origin: Default is (0,0)
public Point Origin { get; set; }
public PointAnimationCollectionBuilder OriginAnimations { get; set; }
// Size: Default is (1,1)
public Size Size { get; set; }
public SizeAnimationCollectionBuilder SizeAnimations { get; set; }
// Visual: Default is null -- nothing drawn
public Visual Visual { get; set; }
}
【０１３１】
ＶｉｓｕａｌＢｒｕｓｈの内容には本質的な制限がなく、無限の平面を効果的に記述する。その内容は各自の座標空間に存在し、ＶｉｓｕａｌＢｒｕｓｈで埋められる空間が適用時のローカル座標空間になる。内容空間は、ＶｉｅｗＢｏｘ、ＶｉｅｗＰｏｒｔ、Ａｌｉｇｎｍｅｎｔ、およびＳｔｒｅｔｃｈのプロパティに基づいてローカル空間にマッピングされる。ＶｉｅｗＢｏｘは内容空間で指定され、その長方形はＶｉｅｗＰｏｒｔ（ＯｒｉｇｉｎプロパティとＳｉｚｅプロパティを介して指定される）の長方形にマッピングされる。
【０１３２】
ＶｉｅｗＰｏｒｔは最終的に内容が描画される位置を定義し、そのブラシの基本タイルを作成する。ＤｅｓｔｉｎａｔｉｏｎＵｎｉｔｓの値がＵｓｅｒＳｐａｃｅＯｎＵｓｅである場合は、ＯｒｉｇｉｎおよびＳｉｚｅのプロパティは適用時のローカル空間におけるものとみなす。ＤｅｓｔｉｎａｔｉｏｎＵｎｉｔｓの値がＯｂｊｅｃｔＢｏｕｎｄｉｎｇＢｏｘである場合は、ＯｒｉｇｉｎおよびＳｉｚｅは座標空間にあるものとみなし、０，０がブラシされているオブジェクトのバウンディングボックスの左上隅になり、１，１が同じボックスの右下隅になる。例えば１００，１００から２００，２００に描画されたＲｅｃｔａｎｇｌｅＧｅｏｍｅｔｒｙを塗りつぶすとする。このような例では、ＤｅｓｔｉｎａｔｉｏｎＵｎｉｔｓがＵｓｅｒＳｐａｃｅＯｎＵｓｅである場合、１００，１００のＯｒｉｇｉｎと１００，１００のＳｉｚｅによって内容領域全体が記述されることになる。ＤｅｓｔｉｎａｔｉｏｎＵｎｉｔｓがＯｂｊｅｃｔＢｏｕｎｄｉｎｇＢｏｘである場合には、０，０のＯｒｉｇｉｎと１，１のＳｉｚｅによって内容領域全体が記述される。Ｓｉｚｅが空である場合、このＢｒｕｓｈでは何もレンダリングされない。
【０１３３】
ＶｉｅｗＢｏｘは内容空間中に指定される。この長方形は、ＡｌｉｇｎｍｅｎｔプロパティとＳｔｒｅｔｃｈプロパティに従ってＶｉｅｗＰｏｒｔ内に収まるように変形される。Ｓｔｒｅｔｃｈがなしの場合は、内容にスケーリングは適用されない。ＳｔｒｅｃｈがＦｉｌｌの場合には、ＶｉｅｗＢｏｘはＶｉｅｗＰｏｒｔと同じサイズになるようにＸ、Ｙの両方で別個にスケーリングされる。ＳｔｒｅｃｈがＵｎｉｆｏｒｍまたはＵｎｉｆｏｒｍＴｏＦｉｌｌである場合は、論理は同様であるが、ＸとＹの範囲が均一にスケーリングされ、内容の縦横比を保持する。ＳｔｒｅｔｃｈがＵｎｉｆｏｒｍである場合、ＶｉｅｗＢｏｘは、ＶｉｅｗＰｏｒｔのサイズと等しい、より制約された範囲になるようにスケーリングされる。ＳｔｒｅｔｃｈがＵｎｉｆｏｒｍＴｏＦｉｌｌである場合、ＶｉｅｗＢｏｘは、ＶｉｅｗＰｏｒｔのサイズと等しい、より制約されない範囲になるようにスケーリングされる。すなわち、ＵｎｉｆｏｒｍとＵｎｉｆｏｒｍＴｏＦｉｌｌはともに縦横比を保持するが、ＵｎｉｆｏｒｍはＶｉｅｗＢｏｘ全体がＶｉｅｗＰｏｒｔ内に入る（可能性としてはＶｉｅｗＢｏｘに覆われないＶｉｅｗＰｏｒｔの部分を残して）ようにし、ＵｎｉｆｏｒｍＴｏＦｉｌｌは、（可能性としてはＶｉｅｗＢｏｘの一部をＶｉｅｗＰｏｒｔの外側に出して）ＶｉｅｗＰｏｒｔ全体をＶｉｅｗＢｏｘで埋めるようにする。ＶｉｅｗＢｏｘが空である場合、Ｓｔｒｅｔｃｈは適用されない。それでも位置合わせは行われ、「点の」ＶｉｅｗＢｏｘを配置することに留意されたい。
【０１３４】
図１８に、様々な伸縮設定によってレンダリングしたグラフィックの単一のタイル１８００の表現を示し、これには伸縮を「なし」にセットした場合のタイル１８００が含まれる。タイル１８０２は伸縮を「Ｕｎｉｆｏｒｍ」に設定した場合の表現であり、タイル１８０４は伸縮を「ＵｎｉｆｏｒｍＴｏＦｉｌｌ」に設定した場合であり、タイル１８０６は伸縮を「Ｆｉｌｌ」に設定した場合の表現である。
【０１３５】
（ＤｅｓｔｉｎａｔｉｏｎＵｎｉｔｓに基づいて）ＶｉｅｗＰｏｒｔが決定され、（Ｓｔｒｅｔｃｈに基づいて）ＶｉｅｗＢｏｘのサイズが決定されると、ＶｉｅｗＢｏｘをＶｉｅｗＰｏｒｔの中に配置する必要がある。ＶｉｅｗＢｏｘがＶｉｅｗＰｏｒｔと同じサイズである場合（ＳｔｒｅｔｃｈがＦｉｌｌであるか、他の３つのＳｔｒｅｔｃｈ値の１つにより偶然同じサイズになった場合）は、ＶｉｅｗＰｏｒｔと同一になるようにＶｉｅｗＢｏｘをＯｒｉｇｉｎに配置する。それ以外の場合はＨｏｒｉｚｏｎｔａｌＡｌｉｇｎｍｅｎｔとＶｅｒｔｉｃａｌＡｌｉｇｎｍｅｎｔを検討する。これらのプロパティに基づいて、ＶｉｅｗＢｏｘをＸおよびＹ両方の範囲で位置合わせする。ＨｏｒｉｚｏｎｔａｌＡｌｉｇｎｍｅｎｔがＬｅｆｔである場合は、ＶｉｅｗＢｏｘの左端がＶｉｅｗＰｏｒｔの左端に置かれる。Ｃｅｎｔｅｒである場合は、ＶｉｅｗＢｏｘの中心がＶｉｅｗＰｏｒｔの中心に置かれ、Ｒｉｇｈｔである場合は右端が一致する。このプロセスをＹ方向の範囲に繰り返す。
【０１３６】
ＶｉｅｗＢｏｘが（０，０，０，０）である場合には未設定とみなし、それによりＣｏｎｔｅｎｔＵｎｉｔｓを検討する。ＣｏｎｔｅｎｔＵｎｉｔｓがＵｓｅｒＳｐａｃｅＯｎＵｓｅである場合はスケーリングまたはオフセットは行われず、変換を行わずに内容がＶｉｅｗＰｏｒｔに描画される。ＣｏｎｔｅｎｔＵｎｉｔｓがＯｂｊｅｃｔＢｏｕｎｄｉｎｇＢｏｘである場合は、内容の原点をＶｉｅｗＰｏｒｔ  Ｏｒｉｇｉｎに位置合わせし、そのオブジェクトのバウンディングボックスの幅と高さだけ内容をスケーリングする。
【０１３７】
ＶｉｓｕａｌＢｒｕｓｈで空間を塗りつぶす際は、上述のように内容がＶｉｅｗＰｏｒｔにマッピングされ、ＶｉｅｗＰｏｒｔに合わせてクリッピングされる。これにより塗りつぶしのための基本タイルが形成され、空間の残りの部分はＢｒｕｓｈのＴｉｌｅＭｏｄｅに基づいて埋められる。最後に、設定されている場合はＢｒｕｓｈの変換が適用され、これはすべての他のマッピング、スケーリング、オフセッティングなどの後に行われる。
【０１３８】
ＴｉｌｅＭｏｄｅの列挙は、ある空間をそのＢｒｕｓｈで塗りつぶすか、あるいはどのように塗りつぶすかを記述するのに使用される。タイリングが可能なＢｒｕｓｈにはタイル長方形が定義されており、そのタイルは塗りつぶす空間内に基本位置を有する。空間の残りは、ＴｉｌｅＭｏｄｅ値に基づいて塗りつぶされる。図１９に、「Ｎｏｎｅ」１９００、「Ｔｉｌｅ」１０９２、「ＦｌｉｐＸ」１９０４、「ＦｌｉｐＹ」１９０６、および「ＦｌｉｐＸＹ」１９０８を含む、各種のＴｉｌｅＭｏｄｅ設定によるグラフィック例の表現を示す。様々なグラフィック例の中で一番左上のタイルが基本タイルである。
【０１３９】
図２０に、このブラシのピクセルを生成するプロセスを表す。図２０に説明する論理はこの論理を実装する可能な１つの方法に過ぎないことを留意されたく、より効率的な方法を含めて他の方法が可能であることを理解されたい。例えばタイルを描画し、キャッシュしておいて反復のたびに内容を描画しないなど、より効率的なデータ処理方法があることが考えられる。ただし図２０には単純な説明を示している。
【０１４０】
一般には、パターンの内容を描画するたびに新しい座標系が作成される。各反復の原点とオフセットは、ＤｅｓｔｉｎａｔｉｏｎＵｎｉｔｓおよびＴｒａｎｓｆｏｒｍのプロパティを通じてフィルタリングされたＯｒｉｇｉｎおよびＳｉｚｅのプロパティによって指定される。
【０１４１】
座標枠はＤｅｓｔｉｎａｔｉｏｎＵｎｉｔｓプロパティに基づいて設定される。このために、ステップ２０００でＤｅｓｔｉｎａｔｉｏｎＵｎｉｔｓプロパティがＵｓｅｒＳｐａｃｅＯｎＵｓｅである場合には、ステップ２００２を介してそのブラシを使用した時点における現在の座標枠を開始座標枠とする。ステップ２００４でプロパティがＯｂｊｅｃｔＢｏｕｎｄｉｎｇＢｏｘでない場合は、ステップ２００４に表すようにそのブラシを適用するジオメトリのバウンディングボックスを使用して、バウンディングボックスの左上隅が（０，０）に、バウンディングボックスの左下隅が（１，１）にマッピングされるように新しい座標枠を設定する。いずれの場合もステップ２００６でその座標枠にＴｒａｎｓｆｏｒｍプロパティを適用し、基本的にはそれによりグリッドを定義する。
【０１４２】
図２１は、ＶｉｓｕａｌＢｒｕｓｈ中のタイルに定義されたＶｉｓｕａｌＢｒｕｓｈグリッドを表す。第１の円は単純なグリッドであり、第２の円は、４７のＸ方向にＳｋｅｗをかけたＴｒａｎｓｆｏｒｍを有する。
【０１４３】
ステップ２００８で、図２２に表すようにグリッドの各セルにビジュアルを描画し、ここでビジュアルは適切なデータを描画する。ステップ２０１０でＶｉｅｗＢｏｘが指定される場合は、ステップ２０１２を介してＶｉｅｗＢｏｘ、Ｓｔｒｅｔｃｈ、ＨｏｒｉｚｏｎｔａｌＡｌｉｇｎ、およびＶｅｒｔｉｃａｌＡｌｉｇｎの属性によって指定されるようにグリッドセルにビジュアルを収める。ＤｅｓｔｉｎａｔｉｏｎＵｎｉｔｓおよびＴｒａｎｓｆｏｒｍのプロパティを使用して、ビジュアルがグリッドボックス中に一列に並ぶように変換を補正する。
【０１４４】
ＶｉｅｗＢｏｘが指定されない場合は、ステップ２０１４で内容を描画するために新しい座標系を確立する。
【０１４５】
座標枠は、その原点が、描画する特定のグリッドセルの原点になるように設定する。
【０１４６】
ステップ２０１８で、そのタイルがセルの範囲の外側で描画されないようにＳｉｚｅプロパティに基づいてクリップを適用する。ＯｒｉｇｉｎおよびＳｉｚｅは、ＤｅｓｔｉｎａｔｉｏｎＵｎｉｔｓプロパティに基づいて適宜修正する。
【０１４７】
次いでＳｏｕｒｃｅＵｎｉｔｓプロパティに基づいて座標系を修正する。このために、ステップ２０２０でＳｏｕｒｃｅＵｎｉｔｓプロパティがＯｂｊｅｃｔＢｏｕｎｄｉｎｇＢｏｘである場合には、ステップ２０２６で該当するスケーリング変換を適用し、それ以外の場合はＵｓｅｒＳｐａｃｅＯｎＵｓｅになり、新しい変換は適用されない。ステップ２０２４でＴｒａｎｓｆｏｒｍプロパティを適用し、ステップ２０２６で内容を描画する。
【０１４８】
サイズの任意の部分がゼロである場合には何も描画されず、Ｓｔｒｅｔｃｈが「Ｎｏｎｅ」の場合には、新しい座標枠の１単位が古い座標枠の１単位と等しくなるようにビューボックスの変換が設定されることに留意されたい。変換は基本的に、位置合わせの属性とＶｉｅｗＢｏｘのサイズに基づいたオフセットになる。上述のように、ステップ２０１０および２０１２で、ＳｔｒｅｔｃｈとＡｌｉｇｎｍｅｎｔのプロパティは、指定されたＶｉｅｗＢｏｘがあるときにのみ適用される。ＶｉｅｗＢｏｘは内容の新しい座標系を指定し、Ｓｔｒｅｔｃｈはどのようにその内容をＶｉｅｗＢｏｘにマッピングするかを指定するのを助ける。位置合わせのオプションは、内容ではなくＶｉｅｗＢｏｘの位置を合わせる。したがって、例えばビューボックスが「０  ０  １０  １０」に設定され、−１０、−１０に何かが描画され、左上隅に位置を合わせる場合、それはクリッピングされて消えることになる。
【０１４９】
図１５に戻ると、ＩｍａｇｅＢｒｕｓｈはＶｉｓｕａｌＢｒｕｓｈの特殊なケースと考えることができる。プログラムはビジュアルを作成し、そのビジュアルに画像を入れ、それをＶｉｓｕａｌＢｒｕｓｈに付加することができるが、これを行うためのＡＰＩは煩雑になる可能性がある。必須の内容座標枠はないので、ＶｉｅｗＢｏｘおよびＣｏｎｔｅｎｔＵｎｉｔｓのプロパティメンバはもはや適用されない。
【０１５０】
public class System.Windows.Media.ImageBrush : Brush
{
public ImageBrush(ImageData image);
public BrushMappingMode DestinationUnits { get; }
public Transform Transform { get; }
public Stretch Stretch { get; }
public HorizontalAlign HorizontalAlign { get; }
public VerticalAlign VerticalAlign { get; }
public Point Origin { get; }
public PointAnimationCollection OriginAnimations { get; }
public Size Size { get; }
public SizeAnimationCollection SizeAnimations { get; }
public ImageData ImageData { get; }
}
public class System.Windows.Media.ImageBrushBuilder : BrushBuilder
{
public ImageBrushBuilder( );
public ImageBrushBuilder(ImageData image);
public ImageBrushBuilder(ImageBrush ib);
// DestinationUnits: Default is ObjectBoundingBox
public BrushMappingMode DestinationUnits { get; set; }
// Transform: Default is identity
public Transform Transform { get; set; }
// Stretch: Default is None
public Stretch Stretch { get; set; }
// HorizontalAlign: Default is Center
public HorizontalAlign HorizontalAlign { get; set; }
// VerticalAlign: Default is Center
public VerticalAlign VerticalAlign { get; set; }
// Origin: Default is (0,0)
public Point Origin { get; set; }
public PointAnimationCollectionBuilder OriginAnimations { get; set; }
// Size: Default is (1,1)
public Size Size { get; set; }
public SizeAnimationCollectionBuilder SizeAnimations { get; set; }
// ImageData: Default is null -- nothing drawn
public ImageData ImageData { get; set; }
}
【０１５１】
ＮｉｎｅＧｒｉｄＢｒｕｓｈは、サイズに基づいて画像がゆがめられる点を除いてはＩｍａｇｅＢｒｕｓｈに非常によく似る。基本的にＮｉｎｅＧｒｉｄＢｒｕｓｈはカスタムタイプのＳｔｒｅｔｃｈと考えてよく、ここでは画像の特定部分が伸縮するが、他の部分（例えば境界線）は伸縮しない。したがってＩｍａｇｅＢｒｕｓｈ中の画像のＳｉｚｅは単純なスケーリングを行わせるが、ＮｉｎｅＧｒｉｄＢｒｕｓｈは所望のサイズまでの不均一なスケーリングを生じさせる。ブラシを適用するときにスケーリングを行わない領域の単位はユーザ単位になり、すなわち、（ＮｉｎｅＧｒｉｄＢｒｕｓｈに存在する場合には）ＣｏｎｔｅｎｔＵｎｉｔｓがＵｓｅｒＵｎｉｔｓＯｎＵｓｅに設定されることになる。ＢｒｕｓｈのＴｒａｎｓｆｏｒｍプロパティを効果的に使用することができる。境界メンバは画像の端から数に含めることに留意されたい。
【０１５２】
例として図２３に、第１のインスタンス２３０２から第２のインスタンス２３０４に拡大した、４タイプの領域を含む９グリッドの画像を表す。図２３に表すように、境界線を同一に保つために領域「ａ」は水平方向に拡大し、領域「ｂ」は垂直方向に拡大し、領域「ｃ」は水平方向と垂直方向に拡大し、領域「ｄ」はサイズが変化しない。
【０１５３】
public class System.Windows.Media.NineGridBrush : Brush
{
public NineGridBrush(ImageData image,
int LeftBorder, int RightBorder,
int TopBorder, int BottomBorder);
public BrushMappingMode DestinationUnits { get; }
public Transform Transform { get; }
public Point Origin { get; }
public PointAnimationCollection OriginAnimations { get; }
public Size Size { get; }
public SizeAnimationCollection SizeAnimations { get; }
public int LeftBorder { get; }
public int RightBorder { get; }
public int TopBorder { get; }
public int BottomBorder { get; }
public ImageData ImageData { get; }
}
public class System.Window.Media.NineGridBrushBuilder : BrushBuilder
{
public NineGridBrushBuilder( );
public NineGridBrushBuilder (ImageData image,
int LeftBorder, int RightBorder,
int TopBorder, int BottomBorder);
public NineGridBrushBuilder (NineGridBrush ngb);
// DestinationUnits: Default is ObjectBoundingBox
public BrushMappingMode DestinationUnits { get; set; }
// Transform: Default is identity
public Transform Transform { get; set; }
// Origin: Default is (0,0)
public Point Origin { get; set; }
public PointAnimationCollectionBuilder OriginAnimations { get; set; }
// Size: Default is (1,1)
public Size Size { get; set; }
public SizeAnimationCollectionBuilder SizeAnimations { get; set; }
// *Border: default to 0
public int LeftBorder { get; set; }
public int RightBorder { get; set; }
public int TopBorder { get; set; }
public int BottomBorder { get; set; }
// ImageData: Default is null -- nothing drawn
public ImageData ImageData { get; set; }
}
【０１５４】
先に概説したように本発明のグラフィックオブジェクトモデルはＴｒａｎｓｆｏｒｍオブジェクトモデルを含み、これは、Ｔｒａｎｓｆｏｒｍの基本クラスの下に図２４の階層に表す変換タイプを含む。変換を構成するこの様々なタイプのコンポーネントは、ＴｒａｎｓｆｏｒｍＬｉｓｔ、ＴｒａｎｓｌａｔｅＴｒａｎｓｆｏｒｍ、ＲｏｔａｔｅＴｒａｎｓｆｏｒｍ、ＳｃａｌｅＴｒａｎｓｆｏｒｍ、ＳｋｅｗＴｒａｎｓｆｏｒｍ、およびＭａｔｒｉｘＴｒａｎｓｆｏｒｍを含むことができる。個々のプロパティはアニメーションにすることができ、例えばプログラム開発者はＲｏｔａｔｅＴｒａｎｓｆｏｒｍのＡｎｇｌｅプロパティをアニメーションにすることができる。
【０１５５】
２Ｄ計算のための行列は３ｘ３の行列として表される。必要とされる変換には、３ｘ３の完全な行列ではなく６つの値のみが必要とされる。これらの値に次のように名前を付け、定義する。
【０１５６】
【数１】
2010182324.tif 000003
【０１５７】
行列に点を乗算すると、その点が新しい座標系から１つ前の座標系に変換される。
【０１５８】
【数２】
2010182324.tif 000004
【０１５９】
変換は任意のレベルまで入れ子にすることができる。新しい変換を適用する際には、常にその変換は現在の変換行列にその変換を右から乗算した場合と同じになる。
【０１６０】
【数３】
2010182324.tif 000005
【０１６１】
ＡＰＩ中の大半の個所ではＭａｔｒｉｘを直接には受け取らず、代わりにアニメーションをサポートするＴｎｒａｓｆｏｒｍクラスを使用する。
【０１６２】
public struct System.Windows.Media.Matrix
{
// Construction and setting
public Matrix( ); // defaults to identity
public Matrix(
double m00, double m01,
double m10, double m11,
double m20, double m21);
// Identity
public static readonly Matrix Identity;
public void SetIdentity( );
public bool IsIdentity { get; }
public static Matrix operator *(Matrix matrix1, Matrix matrix2);
public static Point operator *(Matrix matrix, Point point);
// These function reinitialize the current matrix with
// the specified transform matrix.
public void SetTranslation(double dx, double dy);
public void SetTranslation(Size offset);
public void SetRotation(double angle); // degrees
public void SetRotation(double angle, Point center); // degrees
public void SetRotationRadians (double angle);
public void SetRotationRadians(double angle, Point center);
public void SetScaling(double sx, double sy);
public void SetScaling(double sx, double sy, Point center);
public void SetSkewX(double angle); // degrees
public void SetSkewY(double angle); // degrees
public void SetSkewXRadians(double angle);
public void SetSkewYRadians(double angle);
// These function post-multiply the current matrix
// with the specified transform
public void ApplyTranslation(double dx, double dy);
public void ApplyTranslation(Size offApply);
public void ApplyRotation(double angle); // degrees
public void ApplyRotation(double angle, Point center); // degrees
public void ApplyRotationRadian(double angle);
public void ApplyRotationRadian(double angle, Point center);
public void ApplyScaling(double sx, double sy);
public void ApplyScaling(double sx, double sy, Point center);
public void ApplySkewX(double angle); // degrees
public void ApplySkewY(double angle); // degrees
public void ApplySkewXRadians(double angle);
public void ApplySkewYRadians(double angle);
public void ApplyMatrix(Matrix matrix);
// Inversion stuff
public double Determinant { get; }
public bool IsInvertible { get; }
public void Invert( ); // Throws ArgumentException if ! IsInvertable
public static Matrix Invert(Matrix matrix);
// Individual members
public double M00 { get; set; }
public double M01 { get; set; }
public double M10 { get; set; }
public double M11 { get; set; }
public double M20 { get; set; }
public double M21 { get; set; }
};
【０１６３】
結論
上述の詳細な説明から分かるように、シーングラフとインタフェースを取る能力をプログラムコードに提供するシステム、方法、およびオブジェクトモデルが提供される。このシステム、方法、およびオブジェクトモデルは、使用が容易でありながら強力で柔軟性と拡張性を備える。
【０１６４】
本発明には様々な修正および代替の構成を行うことができるが、特定の例示的な実施形態を図示し、上記で詳細に説明した。ただし本発明をここに開示する特定の形態に限定する意図はなく、本発明の精神および範囲に該当するすべての修正、代替構成、および均等物を包含する意図であることを理解されたい。
【図面の簡単な説明】
【０１６５】
【図１】本発明を組み込むことが可能な例示的コンピュータシステムを表すブロック図である。
【図２】本発明を組み込むことが可能なグラフィック層アーキテクチャを概略的に表すブロック図である。
【図３】本発明の一態様による、ビジュアルのシーングラフと、シーングラフをトラバースしてグラフィックコマンドおよび他のデータを提供することによりシーングラフを処理する関連付けられたコンポーネントとを表す図である。
【図４】本発明の一態様によって構築されたコンテナビジュアル、描画ビジュアル、および関連付けられた描画プリミティブからなるシーングラフを表す図である。
【図５】本発明の一態様によるオブジェクトモデルのビジュアルクラスを表す図である。
【図６】本発明の一態様によるオブジェクトモデルの各種の他のオブジェクトを表す図である。
【図７】本発明の一態様によるビジュアルのデータの変換を表す図である。
【図８Ａ】本発明の一態様によるジオメトリスケールによるビジュアルデータの変換を表す図である。
【図８Ｂ】本発明の一態様による不均一スケールによるビジュアルデータ変換を表す図である。
【図９Ａ】本発明の一態様によるサーフェスビジュアルオブジェクトおよび他のビジュアルおよびコンポーネントのブロック図である。
【図９Ｂ】本発明の一態様によるサーフェスビジュアルオブジェクトおよび他のビジュアルおよびコンポーネントのブロック図である。
【図９Ｃ】本発明の一態様によるサーフェスビジュアルオブジェクトおよび他のビジュアルおよびコンポーネントのブロック図である。
【図１０Ａ】本発明の一態様によるＨＷｎｄビジュアルオブジェクトを表す図である。
【図１０Ｂ】本発明の一態様によるＨＷｎｄビジュアルオブジェクトを表す図である。
【図１１】本発明の一態様による階層化ビジュアルオブジェクトを表す図である。
【図１２】本発明の一態様によるオブジェクトモデルのジオメトリクラスを表す図である。
【図１３】本発明の一態様によるＰａｔｈＧｅｏｍｅｔｒｙ構造を表す図である。
【図１４】本発明の一態様による、プリミティブによって生成されるグラフィック例を示したビジュアルのシーングラフおよび描画プリミティブを表す図である。
【図１５】本発明の一態様によるオブジェクトモデルのブラシクラスを表す図である。
【図１６】本発明の一態様による線形グラデーションブラシオブジェクト中のデータから生成されるレンダリングされたグラフィックを表す図である。
【図１７】本発明の一態様による放射グラデーションブラシオブジェクト中のデータから生成されるレンダリングされたグラフィックを表す図である。
【図１８】本発明の一態様による様々な伸縮値から生成されるレンダリングされたグラフィックを表す図である。
【図１９】本発明の一態様による様々なタイル値から生成されるレンダリングされたグラフィックを表す図である。
【図２０】本発明の一態様による、ブラシオブジェクトを含むビジュアルを解釈してグラフィックを生成する論理を概説する流れ図である。
【図２１】本発明の一態様による、ビジュアルブラシオブジェクト中のデータから生成されるグリッドおよび変換後のグリッドを表す図である。
【図２２】本発明の一態様による、ビジュアルから描画されたレンダリング後のグラフィックを中に示したグリッドおよび変換後のグリッドを表す図である。
【図２３】本発明の一態様による、レンダリングされた９グリッドのブラシオブジェクトを表す図である。
【図２４】本発明の一態様によるオブジェクトモデルの変換クラスの表現の図である。
【符号の説明】
【０１６６】
１００  コンピューティングシステム環境
１１０、１８０  コンピュータ
１２０  処理装置
１２１  システムバス
１３０  システムメモリー
１３１  ＲＯＭ
１３２  ＲＡＭ
１３３  ＢＩＯＳ
１３４、１４４  オペレーティングシステム
１３５、１４５、１８５  アプリケーションプログラム
１３６、１４６  他のプログラムモジュール
１３７、１４７  プログラムデータ
１４０、１５０  インタフェース
１４１  ハードディスクドライブ
１５１  磁気ディスクドライブ
１５２  磁気ディスク
１５５  光ディスクドライブ
１５６  光ディスク
１６０  ユーザ入力インタフェース
１６１  ポインティングデバイス
１６２  キーボード
１６３  マイクロフォン
１６４  タブレット
１７０  ネットワークインタフェース（アダプタ）
１７１  ＬＡＮ
１７２  モデム
１７３  ＷＡＮ
１８１  メモリー記憶装置
１９０  ビデオインタフェース
１９１  モニタ
１９２  タッチスクリーンインタフェース
１９３  タッチスクリーンパネル
１９４  出力周辺インタフェース
１９５  スピーカ
１９６  プリンタ
２００  階層アーキテクチャ
２０２  プログラムコード
２０４  画像化
２０６  ベクトルグラフィック要素
２０８  要素／プロパティシステム
２１０  プレゼンタシステム
２１２  ビジュアルＡＰＩ層
２１４、２１８  合成およびアニメーションエンジン
２１６  データ構造
２２０  タイミングおよびアニメーションシステム
２２２  ハードウェア
３００、４００  シーングラフ
５００  ビジュアルクラス
３０２、３１０、３１５、５０１、５０２、５０３、５０４、５０５、５０６、１１００  ビジュアル
３０４  ビジュアルマネジャオブジェクト
３０６  Ｈｗｎｄ
３０８  ディスパッチャ
３１５  サーフェスビジュアル
３１６、３１７、３２３  描画コンテクスト
３１８、３１９  命令リスト
３２２  メモリーサーフェス（ビットマップ）
３２４  ピクセルデータ
３３０  サーフェスビジュアルマネジャ
３３２  部分グラフ
５０５  ＨｗｎｄＶｉｓｕａｌ
８００、８０２、８０４  画像
９００  サーフェスビジュアルマネジャオブジェクト
９０２  サーフェスリスト
９０４  ビジュアルツリー
１４２０  円形状
１４２２  長方形
１８００、１８０２、１８０４、１８０６  タイル
２３０２、２３０４  インスタンス
【図１】
2010182324.tif 000006
【図２】
2010182324.tif 000007
【図３】
2010182324.tif 000008
【図４】
2010182324.tif 000009
【図５】
2010182324.tif 000010
【図６】
2010182324.tif 000011
【図７】
2010182324.tif 000012
【図８Ａ】
2010182324.tif 000013
【図８Ｂ】
2010182324.tif 000014
【図９Ａ】
2010182324.tif 000015
【図９Ｂ】
2010182324.tif 000016
【図９Ｃ】
2010182324.tif 000017
【図１０Ａ】
2010182324.tif 000018
【図１０Ｂ】
2010182324.tif 000019
【図１１】
2010182324.tif 000020
【図１２】
2010182324.tif 000021
【図１３】
2010182324.tif 000022
【図１４】
2010182324.tif 000023
【図１５】
2010182324.tif 000024
【図１６】
2010182324.tif 000025
【図１７】
2010182324.tif 000026
【図１８】
2010182324.tif 000027
【図１９】
2010182324.tif 000028
【図２０】
2010182324.tif 000029
【図２１】
2010182324.tif 000030
【図２２】
2010182324.tif 000031
【図２３】
2010182324.tif 000032
【図２４】
2010182324.tif 000033