第3章:レンダリングモデル

SVG 2のレンダリングモデルは、Compositing and Blending仕様で定義されたルールに従います。

決定: シアトル/パリ 2012 F2F 3日目

担当者: Nikos (Action 3332)。

状態: 完了。

3.1. はじめに

SVGの実装は、本章で記述されたレンダリングモデルを、適合性要件の付録で修正された形で実装しなければなりません。 その付録では、実装が逸脱できる状況について説明しています。 実際には、出力デバイスの制限(例:サポートされる色範囲が限られている場合)や、 厳密な数理モデルの実装上の制約(例:現実的なパフォーマンスのため曲線を直線で近似する場合、近似は適合性要件に合う精度で十分)により、 ある程度のばらつきが許容されます。

適合性要件の付録では、実際の 実装がこの説明からどの程度逸脱できるかを記述しています。実際には、 実装は出力デバイスの制限(例:サポートされる色範囲が限られている場合)や、 厳密な数理モデルの実装上の制約(例:現実的なパフォーマンスのため曲線を直線で近似する場合、近似は適合性要件に合う精度で十分)により、 若干逸脱する場合があります

3.2. レンダリングツリー

SVG文書の最終的な描画表現の構成要素は、 文書モデル内の要素と1対1で対応しているわけではありません。 グラフィックの見た目は、代わりに並行した構造であるレンダリングツリーを反映し、 一部の要素が除外され、他の要素が繰り返されることがあります。

SVG名前空間の多くの要素は、 グラフィカル文書の構成要素を直接表すものではありません。 代わりに、グラフィカル効果やメタデータ、 他の要素を表現するための内容、 または特定条件下で表示される代替内容を定義します。 動的文書では、グラフィックの一部が インタラクションやアニメーションに応じて描画されたりされなかったりします。 これら描画されない要素は、レンダリングツリーには直接含まれません。

SVGはグラフィックの部分再利用をサポートするため、 一部の要素は複数回描画されます。 個々の描画は文脈依存のスタイリングを持ち、 異なるスケールや変形でラスタライズされる場合があります。

3.2.1. 定義

レンダリングツリー

レンダリングツリーは、SVG文書フラグメント内で描画される要素の集合です。 文書ツリーから、描画されない要素を除外し、 再利用グラフィックのために追加フラグメントを挿入することで生成されます。 グラフィックはレンダリングツリーの順序でペイント・合成されますが、 paint-orderプロパティによって並び替えられる場合があります。 視覚的なペイントを持たない要素もレンダリングツリーに含まれる場合があります。

描画要素

現在の文書のレンダリングツリーに直接表現を持つ要素。 use要素シャドウツリー内の インスタンスとして描画された要素を含みます。 再利用グラフィックの定義元として描画に影響するが、 自身は直接描画されない要素は含みません。 描画される要素と描画されない要素を参照してください。

描画されない要素

現在の文書のレンダリングツリーに直接表現を持たない要素。 ただし、再利用グラフィックやグラフィカル効果としてレンダリングツリーに影響を与える場合があります。 描画される要素と描画されない要素を参照してください。

再利用グラフィック

レンダリングツリーに含まれるが、文書モデル内に直接1つだけ対応する要素が存在しないグラフィックコンポーネント。 これらはシャドウDOM要素(use要素による再利用グラフィックなど)や、 グラフィカル効果の一部として生成される画像フラグメント(パターンやマスクなど)として表現される場合があります。

絶対に描画されない要素

文脈やdisplayスタイル値に関係なく、 決して直接描画されない要素型。 以下の要素が含まれます: clipPathdefsdesclinearGradientmarkermaskmetadatapatternradialGradientscriptstyletitle。 また、symbol要素で use要素シャドウツリーインスタンスルートでないものも含みます。

描画可能要素

描画ツリー内に、グラフィック・コンテナ・テキスト・音声・アニメーションとして 直接表現を持つことができる要素型。 以下の要素が含まれます: aaudiocanvascircleellipseforeignObjectgiframeimagelinepathpolygonpolylinerectsvgswitchtexttextPathtspanunknownusevideo。 また、symbol要素で use要素シャドウツリーインスタンスルートであるものも含みます。

描画可能要素は、ある文書や時点で描画される場合もあれば、されない場合もあります。

3.2.2. 描画される要素と描画されない要素

任意の時点で、すべてのSVG要素 (またはuse要素シャドウツリー内の要素インスタンス) は、描画されるか描画されないかのいずれかです。 要素が現在描画されているかどうかは、単に見た目だけでなく、インタラクティビティや幾何計算にも影響します。

要素が描画されないのは、次の4つの状況のいずれかです:

描画されない要素は:

描画されない要素は文書のアクセシビリティツリーに表現されません。 それでも文書モデルの一部であり、 スタイル継承とカスケードに関与します。

3.2.3. 可視性の制御:‘display’と‘visibility’ プロパティの効果

SVGは、通常描画される要素の可視表示を切り替えるために、2つのプロパティ displayvisibility を使用します。 これらは静的文書では見た目上似た効果を持ちますが、概念的には区別されます。

displayvisibility の定義についてはCSS 2.1仕様を参照してください。 [CSS2]

displaynoneに設定すると、 要素は描画されなくなります。 グラフィック要素テキスト内容要素コンテナ要素に対して displaynoneに設定すると、 その要素(およびその子孫)は レンダリングツリーの一部になりません。 displayは継承プロパティではないことに注意してください。

displaynone以外の値である要素は通常通り描画されます。

displayプロパティは 描画可能要素のみに適用されます。 絶対に描画されない要素や 条件付き処理で描画されない要素にdisplay: noneを設定しても効果はありません。

displayプロパティは 当該要素の直接処理にのみ影響し、他の要素から参照されることは妨げません。 例えば、display: nonepath要素に設定すると その要素は直接キャンバスに描画されなくなりますが、 textPath要素から参照されれば そのジオメトリはテキストパス処理に使用されます。

グラフィック要素use要素に対して、 visibilityhiddenまたは collapseに設定すると、 その要素は描画されません。 ただし、レンダリングツリーには残ります。 ポインターイベントに反応する場合もあり(pointer-eventsの値による)、 フォーカスを受け取る場合もあり(tabindexの値による)、 バウンディングボックス計算やクリッピングパスに寄与し、 テキストレイアウトにも影響します。

visibilityプロパティは グラフィック要素テキスト内容要素、 および a要素(テキスト内容要素の子の場合)にのみ直接影響します。 visibilityは継承プロパティなので、 use要素や コンテナ要素自体には効果がありませんが、 継承値は子孫要素に影響する場合があります。

3.2.4. グラフィックの再利用

文書のある部分(または他の文書)で定義されたグラフィック内容が、 他の要素の描画に利用される場合があります。 レンダリングの観点からはグラフィックの再利用には2種類あります:

シャドウDOM要素は通常の要素と同様に描画されます。 ホスト要素(例:use要素)がコンテナであり、 シャドウ内容がその子孫であるかのように振る舞います。 シャドウDOM要素のスタイルや幾何プロパティは、 ソース文書の対応要素とは独立して解決されます。 displayプロパティは シャドウ要素にも通常通り効果がありますが、 symbol要素には特別なルールがあります。

ブレンディングの観点では、 use要素は 非分離グループを形成します。

これに対して、 グラフィカル効果要素は自己完結したSVGフラグメントを生成し、 スタッキングコンテキストかつ 分離グループとして独立して描画されます。 このフラグメントのキャンバスはスケールされます。 グラフィカル効果要素の子内容はこのキャンバス上に描画・合成されます。 キャンバス全体は他のペイントレイヤーとの合成・ブレンド時にベクター画像として扱われます。

グラフィカル効果要素の子内容に対するdisplayプロパティは noneで設定した場合通常通り効果があり、そのサブツリーは描画に使われません。 ただし、グラフィカル効果要素やその祖先にdisplay: noneが設定されても 効果自体は変わりません。

3.3. ペインターモデル

SVGは「ペインターモデル」に基づいてレンダリングします。ペイント は出力デバイス上で連続的な操作で適用され、 各操作は出力デバイス上のある領域にペイントされ、 以前に描かれたペイントを覆い隠すこともあります。 各オブジェクトやグループがペイントされると、それは次のペイント操作の背景となります。 SVG 2は、各ペイント操作が背景とどのように相互作用するかを制御する 高度なブレンドモードおよび合成操作をサポートします。 これらのペイント操作のルールは Compositing and Blending Specificationで概説されています。

3.4. レンダリング順序

SVGの要素は三次元で配置されます。SVGビューポートの x軸・y軸上の位置に加えて、SVG要素はz軸上にも配置されます。z軸上の位置が、ペイントされる順序を決定します。

z軸上では、要素はスタッキングコンテキストにグループ化されます。

3.4.1. SVGにおけるスタッキングコンテキストの確立

SVG要素の子孫に対して新しいスタッキングコンテキストを確立しなければならないのは、次の場合です:

スタッキングコンテキストは、文書がレンダリングされる際に要素をどの順番で重ねて描画するか、 およびポインターイベントのターゲット決定時にどの要素が最上位かを定めるための概念的な道具です。 スタッキングコンテキストはDOMツリー内の要素の位置には影響せず、 存在の有無は要素の位置、サイズ、キャンバス上のX-Y平面での向きには影響しません。 影響するのはペイント順序のみです。

スタッキングコンテキストはさらにスタッキングコンテキストを含むことができます。 スタッキングコンテキストは親の視点から原子的であり、祖先スタッキングコンテキストの要素がその内部要素の間に割り込むことはできません。

各要素は1つのスタッキングコンテキストに属します。スタッキングコンテキスト内の要素は文書順で積み重ねられます。

foreignObject要素を除き、 SVG要素が作るスタッキングコンテキストの前後順は以下です:

  1. スタッキングコンテキストを形成する要素の背景と境界線(存在する場合)
  2. 子孫要素(ツリー順)

foreignObject要素はCSS用語で「固定位置の包含ブロック」を作るため、 foreignObject要素が作るスタッキングコンテキストの積み重ね順の正式なルールは CSS 2.1付録Eのルールです。

3.5. 要素の描画方法

個々のグラフィック要素は、 非分離グループとして扱われます。 (塗り、線などの)グラフィック要素を構成する各要素(図形とテキストの描画参照)は そのグループのメンバーとなります。グループの描画方法も参照してください。

3.6. グループの描画方法

g 要素(コンテナ要素参照)などのグループ化要素は、合成グループを作成します。 同様に、use 要素はシャドウ内容のための合成グループを作成します。 Compositing and Blending 仕様は、合成グループの描画方法を規定しています。 SVGでは、グループにエフェクト(例:不透明度、フィルター、マスキング)を適用できます。 これらの効果は、グループの変形が適用される直前に、グループの描画結果に適用され、その後グループが グループ背景 と合成・ブレンドされます。 グループにこれらの効果を適用すると、そのグループは分離(isolated)されます。

よって、合成グループの描画は次のステップに従います:
グループが分離されている場合:

  1. 初期背景を rgba(0,0,0,0)で初期化された新しいバッファに設定する
  2. グループ内の グラフィック要素g 要素の内容を 順序通り初期背景に描画する
  3. グループキャンバスを修正するフィルターや他の効果を適用する

    高品質なレンダリングのため、フィルタプリミティブやその他のビットマップ効果は 操作座標空間で適用される必要があります。

  4. グループの変形を適用する
  5. グループキャンバスを グループ背景 とブレンド・合成する
そうでない場合(グループが分離されていない場合):
  1. 初期背景グループ背景 に設定する
  2. グループ内の グラフィック要素g 要素の内容を 順序通り初期背景に描画する。 このとき、グループ変形は各要素が描画される際に適用される。

3.6.1. オブジェクトとグループの不透明度:‘opacity’プロパティの効果

opacity’の定義についてはCSS Color Module Level 3を参照。[css-color-3]

opacity プロパティは、特定の グラフィック要素またはコンテナ要素がキャンバスに描画される際の不透明度を指定します。コンテナ要素に適用される場合はグループの不透明度と呼ばれ、個々の描画要素に適用される場合はオブジェクトの不透明度と呼ばれます。両者の原理は同じです。

SVGには他にも不透明度関連のプロパティがいくつかあります:

これら4つの不透明度プロパティは中間レンダリング操作に関与します。 ただし、オブジェクトおよびグループの不透明度はポストプロセス的な操作と考えられます。 概念的には、opacityが適用されたオブジェクトやグループは RGBAオフスクリーン画像としてレンダリングされます。オフスクリーン画像全体が指定されたopacity値で均一にキャンバスにブレンドされます。 そのため、opacityの存在はグループを 分離させます。

opacity プロパティは以下のSVG要素に適用されます: svg, g, symbol, marker, a, switch, use, unknown および グラフィック要素

次の例は、オブジェクトとグループに対するopacityプロパティのさまざまな使い方を示します。

<svg xmlns="http://www.w3.org/2000/svg"
     width="600" height="175" viewBox="0 0 1200 350">

  <!-- 背景の青い矩形 -->
  <rect x="100" y="100" width="1000" height="150" fill="blue"/>

  <!-- 赤い円(不透明度1からほぼ透明まで) -->
  <circle cx="200" cy="100" r="50" fill="red" opacity="1"/>
  <circle cx="400" cy="100" r="50" fill="red" opacity=".8"/>
  <circle cx="600" cy="100" r="50" fill="red" opacity=".6"/>
  <circle cx="800" cy="100" r="50" fill="red" opacity=".4"/>
  <circle cx="1000" cy="100" r="50" fill="red" opacity=".2"/>

  <!-- 不透明グループ、不透明円 -->
  <g opacity="1">
    <circle cx="182.5" cy="250" r="50" fill="red" opacity="1"/>
    <circle cx="217.5" cy="250" r="50" fill="green" opacity="1"/>
  </g>
  <!-- グループ不透明度: .5、不透明円 -->
  <g opacity=".5">
    <circle cx="382.5" cy="250" r="50" fill="red" opacity="1"/>
    <circle cx="417.5" cy="250" r="50" fill="green" opacity="1"/>
  </g>
  <!-- 不透明グループ、半透明緑と赤 -->
  <g opacity="1">
    <circle cx="582.5" cy="250" r="50" fill="red" opacity=".5"/>
    <circle cx="617.5" cy="250" r="50" fill="green" opacity=".5"/>
  </g>
  <!-- 不透明グループ、半透明赤と緑 -->
  <g opacity="1">
    <circle cx="817.5" cy="250" r="50" fill="green" opacity=".5"/>
    <circle cx="782.5" cy="250" r="50" fill="red" opacity=".5"/>
  </g>
  <!-- グループ不透明度.5、半透明緑と赤 -->
  <g opacity=".5">
    <circle cx="982.5" cy="250" r="50" fill="red" opacity=".5"/>
    <circle cx="1017.5" cy="250" r="50" fill="green" opacity=".5"/>
  </g>
</svg>
異なるグループの円が背景にブレンドされる様子を示す画像。

各赤と緑の円グループは、まずオフスクリーン画像としてレンダリングされ、その後全体として背景の青い矩形に、指定されたopacity値でブレンドされます。

この例では、上段の円は不透明度が1.0から0.2まで変化しています。下段は5つのg要素で、それぞれ重なり合う赤と緑の円を含みます:

3.7. グラフィック要素の種類

SVGは、キャンバスに描画できるグラフィック要素として、3つの基本タイプをサポートしています:

3.7.1. 図形とテキストの描画

図形とテキストは、塗り(図形の内部にペイントを適用)と(図形の輪郭にペイントを適用)で描画できます。

一部の図形タイプでは、マーカー記号(図形・テキスト・画像の任意組み合わせで構成可能)を図形境界上の指定位置に描画できます。各マーカー記号は、そのグラフィック内容がマーカーを使う図形オブジェクト直後にSVG文書ツリーへ展開されたかのようにペイントされます。マーカー記号のグラフィック内容はグラフィック要素と同じ方法でレンダリングされます。マーカー記号はテキストには適用されません。

塗り・線・マーカーの描画順序はpaint-orderプロパティで決まります。デフォルトでは塗り→線→マーカーの順で、マーカーは形状輪郭上を図形の始点から終点まで順に描画されます。

塗りと線の操作は完全に独立しており、各操作は独自の不透明度設定などを持ちます。

SVGは塗りや線で使える多様な組込ペイントタイプをサポートしています。詳細はペイントサーバーで説明されています。

3.7.2. ラスター画像の描画

ラスター画像が描画される際、元のサンプルは標準的なアルゴリズムで「再サンプリング」され、出力デバイス上で必要な位置にサンプルが作られます。再サンプリングの要件については 適合性要件で説明されています。

HTMLの場合と同様[HTML, 10.4.2]、絶対URLと画像データが同じすべてのアニメーション画像は、グループとして同じタイムラインで同期描画されることが期待されます。タイムラインはグループ内で最も古い追加タイミングから始まります。

ユーザーエージェントがアニメ画像を表示するimg要素のアニメーションを再開する場合、そのimg要素のノード文書内で絶対URLと画像データが同じすべてのアニメ画像は、アニメーションを最初から再開することが期待されます。

3.8. 描画領域のフィルタリング

SVGは任意の描画操作にフィルタを適用できます。(Filter Effects参照)

この場合、結果はペイント操作が透明な黒で初期化された中間キャンバス(サイズはFilter Effectsで定められたルールに従う)に適用され、その後Filter Effectsで定義された処理によりフィルタされるのと同じでなければなりません。

3.9. クリッピングとマスキング

SVGは以下のクリッピング/マスキング機能をサポートします:

クリッピングとマスキングの両方は、CSS Maskingモジュール[css-masking-1]で規定されています。

3.10. 親コンポジット処理

SVG文書フラグメントは半透明にすることができます。

Compositing and Blending仕様に従い、 svg要素は常に分離グループを作成します。 SVG文書がトップレベル文書(他の文書に埋め込まれていない場合)の場合、ルートのsvg要素はページグループとみなされ、白(100%不透明)の背景と合成されます。 それ以外の場合、SVG文書や文書フラグメントは、親文書に不透明度を保ったまま合成されます。

3.11. ‘overflow’プロパティの効果

overflow’の定義についてはCascading Style Sheets Level 2 Revision 1 (CSS 2.1)仕様[CSS2]を参照してください。

overflowプロパティのSVGにおける挙動まとめ
要素 初期値 UAスタイルシート auto visible hidden scroll
文書ルートsvg visible n/a visible | scroll visible hidden scroll
その他のsvg visible hidden visible | scroll visible hidden scroll
text visible hidden visible visible hidden hidden
pattern visible hidden visible visible hidden hidden
marker visible hidden visible visible hidden hidden
symbol visible hidden visible visible hidden hidden
image visible hidden visible visible hidden hidden
iframe visible hidden visible | scroll visible hidden scroll
foreignObject visible hidden visible | scroll visible hidden scroll

overflowプロパティは、CSS 2.1で定義されている同じパラメータ値と意味を持ちます([CSS2]、11.1.1節)。ただし、以下の追加事項が適用されます:

overflowの初期値はautoですが、ユーザーエージェントスタイルシートでは、 スタンドアロン文書のルート要素でないsvg要素、 pattern要素、 marker要素は、 デフォルトでhiddenに上書きされます。