フィルター効果モジュール レベル1

W3C作業草案,

このバージョン:
https://www.w3.org/TR/2018/WD-filter-effects-1-20181218/
最新公開バージョン:
https://www.w3.org/TR/filter-effects-1/
編集者草案:
https://drafts.fxtf.org/filter-effects-1/
以前のバージョン:
テストスイート:
http://test.csswg.org/suites/filter-effects/nightly-unstable/
課題追跡:
仕様内でインライン
GitHub課題
編集者:
(Adobe Inc.)
(Apple Inc.)
元編集者:
Vincent Hardy
(招待 専門家)
この仕様への編集提案:
GitHub 編集

概要

フィルター効果は、要素が文書に表示される前にその描画を処理する方法です。 通常、CSSやSVGによる要素の描画は、要素(子要素も含む)がバッファ(ラスター画像など)に描画され、そのバッファが親要素へ合成されると概念的に説明できます。フィルターは合成段階の前に効果を適用します。そのような効果の例としては、ぼかし、色の強度の変更、画像の歪みなどがあります。

元々SVGでの利用を目的として設計されたものですが、フィルター効果は画像バッファ上の操作であるため、CSSなどほぼすべての表示環境で利用可能です。フィルターはスタイル指示(filterプロパティ)によって発動します。本仕様書は、CSSでスタイルされたHTMLやSVGなどのコンテンツでフィルターを利用できるように説明しています。また、CSSのプロパティ値関数としてCSS<image>値を生成する関数も定義しています。

CSSは、構造化文書(HTMLやXMLなど)の画面表示や印刷などの描画を記述するための言語です。

この文書のステータス

このセクションは、公開時点での文書のステータスについて説明しています。他の文書が本書に取って代わる場合があります。現在のW3C出版物一覧および本技術レポートの最新改訂版は、https://www.w3.org/TR/のW3C技術レポート索引をご覧ください。

作業草案として公開されていることは、W3C会員による支持を意味しません。本書は草案文書であり、随時更新、差し替え、廃止される可能性があります。進行中の作業として以外の形で本書を引用するのは不適切です。

GitHub課題が、この仕様の議論には推奨されています。 課題を提出する際は、タイトルに「filter-effects」という語句を入れてください。できればこのように: 「[filter-effects] …コメント要約…」。 すべての課題とコメントはアーカイブされており、過去のアーカイブもあります。

本書は、CSS作業グループスタイル活動の一部)によって作成されました。

本書は、W3C特許方針の下で運営されるグループによって作成されました。 W3Cは、本グループの成果物に関連して提出された特許公開リストを公開しています。そのページには特許公開の手順も記載されています。ある個人が、本質的な請求項を含むと考える特許について実際に知っている場合、W3C特許方針第6節に従い情報を公開する必要があります。

本書は、2018年2月1日 W3Cプロセス文書に従って管理されています。

1. はじめに

このセクションは規定ではありません

フィルター効果は、要素が文書に描画される際に適用されるグラフィック操作です。これは画像ベースの効果であり、ゼロ個以上の画像を入力として受け取り、効果固有の複数のパラメータを持ち、最終的に画像を出力します。出力画像は、元の要素の代わりに文書に描画されたり、他のフィルター効果への入力画像として使用されたり、CSS画像値として提供されることがあります。

フィルター効果の簡単な例は「flood(塗りつぶし)」です。画像入力は不要ですが、色を定義するパラメータがあります。この効果は、指定した色で完全に塗りつぶされた画像を出力します。もう少し複雑な例は「inversion(反転)」で、1つの画像入力(通常は親要素に通常通り描画された要素の画像)を取り、各ピクセルの色値を反転させます。

フィルター効果は、複雑さの異なる2つのレベルで公開されています:

  1. 名前で指定された少数の定型フィルタ関数。これは強力ではありませんが、便利で理解しやすく、ぼかしなど一般的な効果を簡単に実現できます。定型フィルタは[CSS3-ANIMATIONS]でアニメーションすることもできます。

  2. マークアップで記述された個々のフィルター効果のグラフで、全体の効果を定義します。このグラフは入力に依存せず、どんなコンテンツにも効果を適用できます。個々の効果は単純でも、グラフ全体として複雑な効果を生み出せます。例を以下に示します。

この例では、画像に<grayscale()>フィルタ関数が適用されています。
#image {
    filter: grayscale(100%);
}
Example for grayscale filter applied to image

フィルタなし(左)と100%グレースケールフィルタ適用(右)の画像。

以下は個々のフィルター効果のグラフの例です。
Example Filter

フィルター適用オブジェクトの初期例。

この例をSVGで表示

上記の例で使われているフィルター効果を、左列に参照番号付きで、6つのフィルタプリミティブごとに示します:



1
2
3




4
5

6


<filter id="MyFilter" filterUnits="userSpaceOnUse" x="0" y="0" width="200" height="120">
  <desc>3Dライティング効果を生成します。</desc>
  <feGaussianBlur in="SourceAlpha" stdDeviation="4" result="blur"/>
  <feOffset in="blur" dx="4" dy="4" result="offsetBlur"/>
  <feSpecularLighting in="blur" surfaceScale="5" specularConstant=".75"
                      specularExponent="20" lighting-color="#bbbbbb"
                      result="specOut">
    <fePointLight x="-5000" y="-10000" z="20000"/>
  </feSpecularLighting>
  <feComposite in="specOut" in2="SourceAlpha" operator="in" result="specOut"/>
  <feComposite in="SourceGraphic" in2="specOut" operator="arithmetic"
               k1="0" k2="1" k3="1" k4="0" result="litPaint"/>
  <feMerge>
    <feMergeNode in="offsetBlur"/>
    <feMergeNode in="litPaint"/>
  </feMerge>
</filter>

以下の画像は、6つのフィルタ要素ごとの中間画像結果を示します:

filters01 - original source graphic

元のソースグラフィック

filters01 - after filter element 1

フィルタプリミティブ1適用後

filters01 - after filter element 2

フィルタプリミティブ2適用後

filters01 - after filter element 3

フィルタプリミティブ3適用後

filters01 - after filter element 4

フィルタプリミティブ4適用後

filters01 - after filter element 5

フィルタプリミティブ5適用後

filters01 - after filter element 6

フィルタプリミティブ6適用後

  1. フィルタプリミティブfeGaussianBlurは、入力SourceAlpha(ソースグラフィックのアルファチャンネル)を受け取り、結果を"blur"という一時バッファに格納します。"blur"はフィルタプリミティブ2・3両方の入力として使われます。

  2. フィルタプリミティブfeOffsetは、バッファ"blur"を、xとy方向に正方向へシフトし、新たなバッファ"offsetBlur"を生成します。この効果はドロップシャドウのようなものです。

  3. フィルタプリミティブfeSpecularLightingは、"blur"バッファを表面の高さモデルとして使い、単一の点光源によるライティング効果を生成します。結果はバッファ"specOut"に格納されます。

  4. フィルタプリミティブfeCompositeは、フィルタプリミティブ3の結果を元のソースグラフィックのアルファチャンネルでマスクし、中間結果が元のソースグラフィックより大きくならないようにします。

  5. フィルタプリミティブfeCompositeは、スペキュラライティングの結果を元のソースグラフィックと合成します。

  6. フィルタプリミティブfeMergeは2つのレイヤーを合成します。下層はフィルタプリミティブ2のドロップシャドウ結果、上層はフィルタプリミティブ5のスペキュラライティング結果です。

2. モジュールの相互作用

この仕様は、これらのプロパティが適用された要素の視覚的レンダリングに影響を与えるCSSプロパティ群を定義します。これらの効果は、視覚フォーマットモデル [CSS21]に従い、要素がサイズと配置を決定された後に適用されます。これらのプロパティの一部の値は、包含ブロックスタッキングコンテキストを生成します。

合成モデルはSVGの合成モデル[SVG11]に従います:最初にフィルター効果が適用され、その後にクリッピング、マスク、透過性[CSS3COLOR]が適用されます。これらの効果は、border [CSS3BG]などの他のCSS効果の後に適用されます。

この仕様の一部プロパティや要素定義はSVG 1.1の実装[SVG11]を必要とします。SVG非対応のUAは、color-interpolation-filtersflood-colorflood-opacitylighting-color各プロパティ、およびfilter要素、feMergeNode要素、転送関数要素フィルタプリミティブ要素を実装してはいけません。

3.

この仕様はCSSプロパティ定義規則 [CSS21]に従います。これらの仕様で定義されていない値型はCSS Values and Units Module Level 3 [CSS3VAL]で定義されています。

プロパティ定義で列挙されている値に加え、本仕様で定義されるすべてのプロパティはinheritキーワードも値として受け付けます。可読性のため、明示的に繰り返しません。

4. 用語集

この仕様で使われる用語は、このセクションで定義された意味を持ちます。

フィルタプリミティブ, filter-primitive

filter要素の出力を制御する要素群、特に:feSpotLightfeBlendfeColorMatrixfeComponentTransferfeCompositefeConvolveMatrixfeDiffuseLightingfeDisplacementMapfeDropShadowfeFloodfeGaussianBlurfeImagefeMergefeMorphologyfeOffsetfeSpecularLightingfeTilefeTurbulence

パススルーフィルタ

パススルーフィルタの出力はフィルタプリミティブの主入力と同じです。

5. グラフィックフィルター:filterプロパティ

filterプロパティの説明は以下の通りです:

名前: filter
値: none | <filter-value-list>
初期値: none
適用対象: すべての要素。SVGではコンテナ要素defs要素を除く)、すべてのグラフィックス要素、およびuse要素。
継承: no
パーセンテージ: n/a
算出値: 指定通り
正規順序: 文法通り
メディア: visual
アニメーション可能: フィルターのアニメーションの本文参照
<filter-value-list> = [ <filter-function> | <url> ]+
<url>

filter要素へのフィルタ参照。例:url(commonfilters.svg#filter)。フィルタが存在しないオブジェクトや参照先がfilter要素でない場合、フィルタチェーン全体が無視され、フィルタは適用されません。

<filter-function>

フィルタ関数参照。

none

フィルタ効果は適用されません。

none以外の値をfilterプロパティに指定すると、絶対/固定位置の子孫のための包含ブロックが生成されます(ただし現在の閲覧コンテキストの文書ルート要素でなければ)。関数リストは指定された順に適用されます。

リスト内の最初のフィルタ関数やfilter参照は、要素(SourceGraphic)を入力画像とします。以降の操作は前のフィルタ関数またはfilter参照の出力を入力画像とします。filter要素参照関数は代替入力を指定できますが、前の出力をSourceGraphicとして使います。

color-interpolation-filtersはFilter Functionsには影響しません。Filter FunctionsはsRGB色空間で動作しなければなりません。

none以外の算出値は、CSSopacityと同様にスタッキングコンテキスト [CSS21]が生成されます。要素の子孫はグループとしてまとめてレンダリングされ、フィルタ効果がグループ全体に適用されます。

filterプロパティは、filterが要素のborder box外に描画を生じる場合でも、対象要素のCSSボックスの形状には影響しません。

概念的には、描画のすべての部分がフィルタ操作の影響を受けます。これはフィルタが適用された要素およびその子孫の内容、背景、境界線、テキスト装飾、アウトライン、表示スクロール機構を含みます。フィルタ操作は要素のローカル座標系で適用されます。

合成モデルはSVG合成モデル [SVG11]に従い、最初にフィルタ効果、次にクリッピング、マスク、透過性が適用されます。SVGに従い、filterの適用はヒットテストに影響しません。

filterプロパティはSVG要素にとって表示属性です。

filterは固定背景画像に対してどう動作するか?<https://github.com/w3c/csswg-drafts/issues/238>

6. フィルタ関数

6.1. サポートされるフィルタ関数

<filter-function> = <blur()> | <brightness()> | <contrast()> | <drop-shadow()> |    
<grayscale()> | <hue-rotate()> | <invert()> | <opacity()> | <sepia()> | <saturate()>

特に定義がない限り、省略された値は補間時の初期値になります。

注: 一部のフィルタ関数では、省略された値のデフォルト値が補間時の初期値と異なります。制作者の利便性のため、<grayscale()><sepia()><invert()>の省略値は1(効果を100%適用)で、補間時の初期値0(効果なし)です。

blur() = blur( <length>? )

入力画像にガウスぼかしを適用します。渡されたパラメータはガウス関数の標準偏差値を定義します。パラメータはCSS長さで指定しますが、パーセンテージは認められません。この関数のマークアップ等価は下記を参照。

負の値は許可されません。

省略時のデフォルト値は0pxです。

補間時の初期値0pxです。

注: 標準偏差はbox-shadowのぼかし半径とは異なります。

brightness() = brightness( <number-percentage>? )

入力画像に線形乗算を適用し、明るさを増減します。値0%は完全に黒、100%は元画像のままです。それ以外は効果の線形乗算です。100%以上も可能でより明るくなります。マークアップ等価は下記

負の値は許可されません。

省略時のデフォルト値は1です。

補間時の初期値1です。

contrast() = contrast( <number-percentage>? )

入力画像のコントラストを調整します。値0%は完全な灰色、100%は元画像、100%以上はより強いコントラストです。マークアップ等価は下記

負の値は許可されません。

省略時のデフォルト値は1です。

補間時の初期値1です。

drop-shadow() = drop-shadow( <color>? && <length>{2,3} )

入力画像にドロップシャドウ効果を適用します。ドロップシャドウは入力画像のアルファマスクを指定色でぼかしてオフセットしたものを画像の下に合成します。値はbox-shadow [CSS3BG]同様ですが、3番目の長さがぼかし半径でなく標準偏差です。マークアップ等価は下記

省略値のデフォルトは長さが0、色はcolorプロパティから取得します。

補間時の初期値は長さすべて0、色はtransparentです。

注: spread値や複数シャドウはこの仕様レベルでは受け付けません。

注: 標準偏差はbox-shadowのぼかし半径とは異なります。

grayscale() = grayscale( <number-percentage>? )

入力画像をグレースケール化します。渡されたパラメータは変換の割合を定義します。100%は完全グレースケール、0%は元画像です。0%~100%は線形乗算です。100%以上は許可されますがUAは値を1に丸めます。マークアップ等価は下記

負の値は許可されません。

省略時のデフォルト値は1です。

補間時の初期値0です。

hue-rotate() = hue-rotate( [ <angle> | <zero> ]? )

入力画像の色相回転を行います。パラメータは色相円周上の度数を定義します。0degは元画像です。実装は360degを超えるアニメーションのため正規化してはいけません。マークアップ等価は下記

値がゼロなら単位識別子は省略できます。

省略時のデフォルト値は0degです。

補間時の初期値0degです。

invert() = invert( <number-percentage>? )

入力画像のサンプルを反転します。パラメータは変換割合です。100%で完全反転、0%は元画像。0%~100%は線形乗算。100%以上は許可されますがUAは値を1に丸めます。マークアップ等価は下記

負の値は許可されません。

省略時のデフォルト値は1です。

補間時の初期値0です。

opacity() = opacity( <number-percentage>? )

入力画像のサンプルに透明度を適用します。パラメータは変換割合です。0%だと完全な透明、100%だと元画像。0%~100%は線形乗算で、入力画像サンプルにamountを掛けます。100%以上も許可されますがUAは値を1に丸めます。マークアップ等価は下記

負の値は許可されません。

省略時のデフォルト値は1です。

補間時の初期値1です。

注: opacityフィルタ関数はopacityプロパティのショートハンドではありません。中間フィルタプリミティブ結果の透明度を設定できます。最後のフィルタプリミティブがopacityなら、opacityプロパティ値がさらに乗算されるため、より透明になる場合があります。

saturate() = saturate( <number-percentage>? )

入力画像を彩度化します。パラメータは変換割合です。0%は完全な無彩色、100%は元画像。それ以外は線形乗算。100%以上も可能で超彩度になります。マークアップ等価は下記

負の値は許可されません。

省略時のデフォルト値は1です。

補間時の初期値1です。

sepia() = sepia( <number-percentage>? )

入力画像をセピア化します。パラメータは変換割合です。100%で完全セピア、0%は元画像。0%~100%は線形乗算。100%以上は許可されますがUAは値を1に丸めます。マークアップ等価は下記

負の値は許可されません。

省略時のデフォルト値は1です。

補間時の初期値0です。

6.2. フィルタ関数の算出値

<filter-function>の値は指定通り算出されますが、以下の例外があります:

6.3. フィルタ関数の直列化

<filter-function>の直列化は個々の文法に従い、書かれた順序で、<calc()>式は可能な限り避け、フィルタ引数は指定通り直列化し、<calc()>変換は避け、スペース区切りトークンを単一スペースで連結し、カンマの後は必ずスペースを1つ入れます。

6.4. フィルタ関数の補間

<filter-function>値の補間は、以下のリストで最初に一致した条件の手順を実行します:

<blur()>

値は長さとして算出値で補間します。

<brightness()>
<contrast()>
<grayscale()>
<invert()>
<opacity()>
<saturate()>
<sepia()>

パーセンテージ値を数値に変換(0%は0、100%は1)。値は数値として算出値で補間します。

<hue-rotate()>

値は数値として算出値で補間します。

<drop-shadow()>

値はシャドウリストとして繰返しリストで補間します。

7. SVGフィルターソース:filter要素

名前: filter
カテゴリ: なし
内容モデル: 下記の要素を任意の順序・個数で含むことができます:
属性:
DOMインターフェース: SVGFilterElement

filter要素の説明は以下の通りです:

<number-optional-number> = <number> <number>?

属性定義:

filterUnits = "userSpaceOnUse | objectBoundingBox"

フィルター領域参照。

primitiveUnits = "userSpaceOnUse | objectBoundingBox"

各種長さ値およびフィルタプリミティブ内の座標系、およびフィルタプリミティブ部分領域属性の座標系を指定します。

primitiveUnitsuserSpaceOnUseの場合、フィルタ定義内の長さ値は、参照元要素のローカル座標系の値を表します(つまりfilterプロパティで参照される要素のユーザー座標系)。

primitiveUnitsobjectBoundingBoxの場合、フィルタ定義内の長さ値は参照元要素のバウンディングボックスの割合またはパーセンテージを表します(object bounding box units参照)。<number-optional-number>で指定された値が1つだけの場合、primitiveUnits計算前に展開されます。

primitiveUnitsの初期値はuserSpaceOnUseです。

アニメーション可能:はい

x = "<length-percentage>"

フィルター領域参照。

y = "<length-percentage>"

フィルター領域参照。

width = "<length-percentage>"

フィルター領域参照。

height = "<length-percentage>"

フィルター領域参照。

filterRes = "<number-optional-number>"

filterRes属性は仕様から削除されました。定義はSVG 1.1仕様を参照してください [SVG11]

プロパティはfilter要素の先祖から継承されますが、参照元要素からは継承されません

filter要素は直接レンダリングされません。その用途はfilterプロパティで参照されることのみです。displayプロパティはfilter要素には適用されません。そのため、filter要素はdisplayプロパティがnone以外でも直接レンダリングされず、filter要素はdisplayプロパティがnoneの場合でも参照可能です。

8. フィルター領域

filter要素は、所定のフィルター効果が適用されるキャンバス上のフィルター領域を定義でき、ラスター系フィルタプリミティブを処理するための中間連続階調画像の解像度も指定できます。filter要素には、フィルター領域を定義するために連携する以下の属性があります:

filterUnits

属性xywidthheightの座標系を定義します。

filterUnitsuserSpaceOnUseの場合、xywidthheightは、filter要素が参照された時点の現在のユーザー座標系(つまり、filter要素をfilterプロパティで参照する要素のユーザー座標系)の値を表します。

filterUnitsobjectBoundingBoxの場合、xywidthheightは、参照元要素のバウンディングボックスの割合またはパーセンテージを表します(object bounding box units参照)。

filterUnits属性の初期値はobjectBoundingBoxです。

アニメーション可能:はい

x, y, width, height

これらの属性は、このフィルターが適用されるキャンバス上の矩形領域を定義します。

これらの属性の座標系は、filterUnits属性の値によって決まります。

この矩形領域の境界は、指定したfilter要素に含まれる各フィルタプリミティブのハードクリッピング領域として機能します。したがって、フィルタプリミティブの効果が矩形領域の外まで広がる場合(例えばfeGaussianBlurフィルタプリミティブで非常に大きなstdDeviationを使用する場合など)、その効果の一部がクリップされます。

xおよびyの初期値は-10%です。

widthおよびheightの初期値は120%です。

ng of the element which referenced the filter.

アニメーション可能:はい

注: filterUnitsの2つの値(objectBoundingBoxuserSpaceOnUse)のどちらも、フィルター領域の座標系のX軸・Y軸が、フィルターを適用する要素のローカル座標系のX軸・Y軸とそれぞれ平行になります。

注: 実装によっては、フィルター領域がデバイスのピクセルに直接マッピングできる場合、高速なパフォーマンスが可能です。ディスプレイ装置で最良のパフォーマンスのため、領域をユーザーエージェントが背景とピクセル単位で揃えられるよう定義することを推奨します。特にフィルター効果のパフォーマンスのため、ユーザー座標系の回転や傾きを避けてください。

注: フィルター効果がオブジェクトのタイトなバウンディングボックスのすぐ外側にも影響する場合があるため、パディング領域が必要なことが多いです。そのため、xyには負のパーセンテージ値、widthheightには100%以上の値を指定できます。これは、フィルター領域のデフォルトがx="-10%" y="-10%" width="120%" height="120%"である理由です。

9. フィルタプリミティブ

9.1. 概要

このセクションでは、特定のフィルター効果を達成するために組み合わせ可能な様々なフィルタープリミティブについて説明します。

特に記載がない限り、すべての画像フィルターはプリマルチプライドRGBAサンプルに対して動作します。feColorMatrixfeComponentTransferのような一部のフィルターは、非プリマルチプライドデータでより自然に動作します。フィルター操作の間、すべての色値は一時的に現在のフィルターの必要な色乗算に変換されなければなりません。

注: すべての入力画像はプリマルチプライドRGBAであると仮定します。ユーザーエージェントは非プリマルチプライドデータバッファリングを用いてパフォーマンスを最適化しても構いません。

すべてのラスター効果フィルタリング操作は、1〜N個の入力RGBA画像、追加属性をパラメータとして受け取り、単一の出力RGBA画像を生成します。

各フィルタープリミティブから得られるRGBAの結果は、色値および不透明度値の許容範囲にクランプされます。例えば、特定のフィルタープリミティブの結果に負の色値や不透明度値が含まれていた場合、それらはゼロの色/不透明度まで調整されます。

特定のフィルタープリミティブがどの色空間で処理を行うかは、該当するフィルタープリミティブに設定されたプロパティcolor-interpolation-filtersの値によって決定されます。別のプロパティcolor-interpolationは、他の色操作の色空間を決定します。これら2つのプロパティは初期値が異なります(color-interpolation-filtersの初期値はlinearRGBであり、color-interpolationの初期値はsRGBです)。そのため、特定の結果を得るため(例:グラデーション補間とフィルタ処理の連携時など)には、特定の要素でcolor-interpolationlinearRGBに、またはcolor-interpolation-filterssRGBに明示的に設定する必要があります。以下の例ではcolor-interpolationcolor-interpolation-filtersは明示的に設定されていないため、これらのプロパティの初期値が適用されます。

時折、フィルタープリミティブによって未定義のピクセルが生じます。例えば、フィルタープリミティブfeOffsetは画像を下方向や右方向にシフトさせ、上部や左部に未定義ピクセルが残る場合があります。このような場合、未定義ピクセルは透明な黒に設定されます。

高品質なレンダリングを実現するため、すべてのフィルタープリミティブは、デバイス依存の座標空間(操作座標空間)で、デバイスのピクセル密度、ユーザー空間の変換、ズームを考慮して動作すべきです。プラットフォームに依存しない整列を提供するため、属性やプロパティ値は多くの場合、primitiveUnits属性で記述される座標系に相対的です。ユーザーエージェントはこれらの相対属性やプロパティを操作座標空間にスケールしなければなりません。

注: 高解像度デバイスでは、primitiveUnitsに相対的な属性やプロパティ値は通常スケールアップする必要があります。ユーザーエージェントはプラットフォーム資源が限られている場合、フィルタープリミティブの解像度を下げても構いません。

注: フィルタープリミティブfeConvolveMatrix光源の属性やプロパティ値の一部は、primitiveUnits属性で定義される座標空間から操作座標空間へ変換できません。

9.2. 共通フィルタプリミティブ属性

以下のフィルタプリミティブ属性は、すべてのフィルタプリミティブで利用できます:

属性定義:

x = "<length-percentage>"

与えられたフィルタプリミティブの計算と描画を制限する部分領域の最小x座標です。フィルタプリミティブ部分領域参照。

x属性の初期値は0%です。

アニメーション可能:はい

y = "<length-percentage>"

与えられたフィルタプリミティブの計算と描画を制限する部分領域の最小y座標です。フィルタプリミティブ部分領域参照。

y属性の初期値は0%です。

アニメーション可能:はい

width = "<length-percentage>"

与えられたフィルタプリミティブの計算と描画を制限する部分領域の幅です。フィルタプリミティブ部分領域参照。

負またはゼロ値は、与えられたフィルタプリミティブの効果を無効化します(結果は透明な黒画像)。

width属性の初期値は100%です。

アニメーション可能:はい

height = "<length-percentage>"

与えられたフィルタプリミティブの計算と描画を制限する部分領域の高さです。フィルタプリミティブ部分領域参照。

負またはゼロ値は、そのフィルタプリミティブの効果を無効化します(結果は透明な黒画像)。

height属性の初期値は100%です。

アニメーション可能:はい

result = "<filter-primitive-reference>"

<filter-primitive-reference>は、<custom-ident> [CSS3VAL]であり、このフィルタプリミティブの割り当て名です。指定された場合、処理結果のグラフィックは同一filter要素内の後続フィルタプリミティブのin属性で参照できます。値が指定されない場合、出力は次のフィルタプリミティブがin属性値を持たない場合にのみ暗黙的な入力として再利用されます。

ほとんどのフィルタプリミティブは他のフィルタプリミティブを入力として受け取ります。以下の属性は、他のフィルタプリミティブを参照するすべての入力属性の代表です:

属性定義:

in = "SourceGraphic | SourceAlpha | BackgroundImage | BackgroundAlpha | FillPaint | StrokePaint | <filter-primitive-reference>"

与えられたフィルタプリミティブの入力を識別します。値は6つのキーワードのいずれか、または同じfilter要素内の前のresult属性値と一致する文字列のいずれかです。値が指定されず、最初のフィルタプリミティブの場合は、SourceGraphicが入力となります。値が指定されず、後続のフィルタプリミティブの場合は、直前のフィルタプリミティブの結果が入力となります。

resultの値が同じfilter要素内で複数回出現した場合、そのresult参照は最も近い直前の属性値が使用されます。

結果への前方参照は許可されず、指定されなかったものとして扱われます。

存在しない結果への参照も指定されなかったものとして扱われます。

6つのキーワードの定義:

SourceGraphic

このキーワードは、filter要素への元入力となったグラフィックス要素を表します。ラスター効果フィルタプリミティブの場合、グラフィックス要素は画像空間内の初期クリアRGBAラスターにラスタライズされます。元グラフィックで未使用のピクセルはクリアのまま残されます。画像は線形RGBAピクセルでレンダリングされるよう指定されます。アルファチャンネルはSVGで指定されたアンチエイリアスを反映します(ラスターが線形の場合、画像のアルファチャンネルは各ピクセルの正確なカバレッジ率を表します)。

SourceAlpha

このキーワードは、filter要素への元入力となったグラフィックス要素を表します。SourceAlphaは、SourceGraphicと同じルールですが、アルファチャンネルのみが使用されます。入力画像はRGBチャンネルが暗黙的に黒、アルファチャンネルはSourceGraphicと同じです。

注: このオプションを使う場合、アルファチャンネル抽出のためにグラフィックス要素をラスタライズする実装もあります。

BackgroundImage

このキーワードは、フィルター領域の背後に位置する現在のアイソレーショングループで定義された背景を、filter要素が呼び出された時点で表します。isolationプロパティ[COMPOSITING-1]参照。

BackgroundAlpha

BackgroundImageと同様ですが、アルファチャンネルのみが使用されます。SourceAlphaおよびisolationプロパティ[COMPOSITING-1]参照。

FillPaint

このキーワードは、フィルター効果対象要素のfillプロパティ値を表します。FillPaint画像は概念的に無限範囲を持ちます。通常は全面不透明ですが、グラデーションやパターンなど塗り自体が透明または半透明部分を含む場合は不透明でないこともあります。fillがペイントサーバーを参照する場合、ペイントサーバーの座標系はフィルタ対象オブジェクトの座標系となります。例えばペイントサーバーがobjectBoundingBoxを必要とする場合、フィルタ対象オブジェクトのバウンディングボックスが参照サイズとなります。userSpaceOnUseなら、フィルタ対象オブジェクトのローカル座標系で最も近いビューポートが参照サイズになります。

StrokePaint

このキーワードは、フィルター効果対象要素のstrokeプロパティ値を表します。StrokePaint画像は概念的に無限範囲を持ちます。詳細は上記FillPaint参照。

アニメーション可能:はい

9.3. フィルタプリミティブツリー

入力が0または1個のフィルタプリミティブ同士はフィルタチェーンとして連結できます。例えば、2つ以上の<filter-value-list><filter-function>のフィルタプリミティブ表現はフィルタチェーンの例です。各フィルタプリミティブは直前のフィルタプリミティブの結果を入力とします。

filter要素のフィルタプリミティブ子要素の簡単な例。
<filter id="filter">
  <feColorMatrix type="hueRotate" values="45"/>
  <feOffset dx="10" dy="10"/>
  <feGaussianBlur stdDeviation="3"/>
</filter>

feColorMatrixfeOffsetfeGaussianBlurでフィルタチェーンを作成しています。

feColorMatrixSourceGraphicを入力とし、その結果がfeOffsetの入力となり、その結果がfeGaussianBlurの入力になります。

複数のフィルタプリミティブ入力を持つフィルタプリミティブもあります。in属性やresult属性を使うことで、複数のフィルタプリミティブを複雑なフィルタ構造に組み合わせることができます。フィルタプリミティブの前方参照制限のため、すべてのフィルタ構造はツリー(フィルタプリミティブツリー)として表現されます。フィルタプリミティブツリーのルートは、filter要素のフィルタプリミティブ子のうち最も後続のプリミティブです。

フィルタチェーンもフィルタプリミティブツリーで表現できるフィルタ構造の一つであり、以降フィルタチェーンもフィルタプリミティブツリーと呼びます。

filter要素は1つ以上のフィルタプリミティブツリーを持つことができます。最も後続のフィルタプリミティブ子が属するフィルタプリミティブツリーが主要フィルタプリミティブツリーです。

主要フィルタプリミティブツリーのみがフィルタ処理に寄与します。実装は他のツリーを無視することがあります。

filter要素にフィルタプリミティブツリーがなければ、フィルタが適用される要素はレンダリングされません。

複数のフィルタプリミティブツリーの例:
<filter id="filter">
  <-- The first filter primitive tree. Ignored for filter process. -->
  <feColorMatrix type="hueRotate" values="45"/>
  <feOffset dx="10" dy="10"/>
  <feGaussianBlur stdDeviation="3"/>
  <-- The primary filter primitive tree. -->
  <feFlood flood-color="green" result="flood"/>
  <feComposite operator="in" in="SourceAlpha" in2="flood"/>
</filter>

このフィルタには2つのフィルタプリミティブツリーがあり、フィルタプリミティブは:

  1. feColorMatrixfeOffsetfeGaussianBlurfeGaussianBlurがツリーのルート)と、

  2. feFloodfeCompositefeCompositeがツリーのルート)。

両方のフィルタプリミティブツリーは接続されていません。2番目、主要フィルタプリミティブツリーのみがフィルタ処理に寄与します。最初のツリーは実装によって無視されることがあります。

9.4. フィルタプリミティブ部分領域

すべてのフィルタプリミティブは、xywidthheight属性を持ち、これらが与えられたフィルタプリミティブの計算・描画を制限するフィルタプリミティブ部分領域を特定します。xywidthheight属性は、他のフィルタプリミティブの座標・長さ属性と同じ規則で定義されており、primitiveUnits属性で確立された座標系の値を表します。

xywidthheight属性のデフォルトは、すべての参照ノードに対して定義された部分領域の和(すなわち最も密着したバウンディングボックス)です。参照ノードがない場合(例えばfeImagefeTurbulence)、または参照ノードのいずれかが標準入力(SourceGraphicSourceAlphaBackgroundImageBackgroundAlphaFillPaintStrokePaint)の場合、またはX・Y方向に参照ノードを複製して通常より大きな結果を生成するfeTileの場合、デフォルトの部分領域は0%, 0%, 100%, 100%となり、特別にそのパーセンテージはフィルター領域の寸法に対して相対となるため、デフォルトのフィルタプリミティブ部分領域フィルター領域と同じになります。

もしフィルタプリミティブ部分領域の幅や高さが負またはゼロなら、そのフィルタプリミティブの効果は無効化されます。

フィルター領域は、フィルタプリミティブの入力画像に対してハードクリップ矩形として作用します。

フィルタプリミティブ部分領域は、フィルタプリミティブの結果に対してハードクリップ矩形として作用します。

すべての中間オフスクリーンは、フィルタプリミティブ部分領域フィルター領域の交差部分を超えないように定義されます。フィルター領域およびすべてのフィルタプリミティブ部分領域は、ピクセルの一部でもフィルター領域やフィルタプリミティブ部分領域に交差する場合、それらのピクセルを収容できるよう十分な大きさに設定します。

feTileは、前のフィルタプリミティブを参照し、参照されたフィルタプリミティブのフィルタプリミティブ部分領域に基づいてタイルをX・Y方向に並べ、自身のフィルタプリミティブ部分領域を埋めます。
<svg width="400" height="400" xmlns="http://www.w3.org/2000/svg">
  <defs>
    <filter id="flood" x="0" y="0" width="100%" height="100%" primitiveUnits="objectBoundingBox">
       <feFlood x="25%" y="25%" width="50%" height="50%"
          flood-color="green" flood-opacity="0.75"/>
    </filter>
    <filter id="blend" primitiveUnits="objectBoundingBox">
       <feBlend x="25%" y="25%" width="50%" height="50%"
          in2="SourceGraphic" mode="multiply"/>
    </filter>
    <filter id="merge" primitiveUnits="objectBoundingBox">
       <feMerge x="25%" y="25%" width="50%" height="50%">
        <feMergeNode in="SourceGraphic"/>
        <feMergeNode in="FillPaint"/>
       </feMerge>
    </filter>
  </defs>

  <g fill="none" stroke="blue" stroke-width="4">
     <rect width="200" height="200"/>
     <line x2="200" y2="200"/>
     <line x1="200" y2="200"/>
  </g>
  <circle fill="green" filter="url(#flood)" cx="100" cy="100" r="90"/>

  <g transform="translate(200 0)">
    <g fill="none" stroke="blue" stroke-width="4">
       <rect width="200" height="200"/>
       <line x2="200" y2="200"/>
       <line x1="200" y2="200"/>
    </g>
    <circle fill="green" filter="url(#blend)" cx="100" cy="100" r="90"/>
  </g>

  <g transform="translate(0 200)">
    <g fill="none" stroke="blue" stroke-width="4">
       <rect width="200" height="200"/>
       <line x2="200" y2="200"/>
       <line x1="200" y2="200"/>
    </g>
    <circle fill="green" fill-opacity="0.5" filter="url(#merge)" cx="100" cy="100" r="90"/>
  </g>
</svg>
Example for subregions

部分領域の例

この例をSVGで表示

上記の例では、それぞれクロスと円を持つ3つの矩形があります。各矩形内の円要素には異なるフィルタが適用されていますが、同じフィルタプリミティブ部分領域が指定されています。フィルタ出力はフィルタプリミティブ部分領域に制限されるため、円自体は表示されず、フィルタプリミティブ部分領域を構成する矩形のみが見えるはずです。

9.5. フィルタプリミティブ feBlend

名前: feBlend
カテゴリ: フィルタプリミティブ
内容モデル: 任意数の記述要素animatescriptset 要素を任意の順で含むことができます。
属性:
DOMインターフェース: SVGFEBlendElement

このフィルターは、一般的な画像編集ソフトウェアのブレンドモードを使って2つのオブジェクトを合成します。2つの入力画像をピクセルごとに合成します。([COMPOSITING-1]参照)

属性定義:

mode = "<blend-mode>"

「Compositing and Blending Level 1」[COMPOSITING-1]で定義されたブレンドモードのいずれか。入力inがソースCs、2番目の入力in2バックドロップCbを表します。このフィルタプリミティブの出力Cmは、CsCbのブレンド結果です。

mode属性の初期値はnormalです。

アニメーション可能:はい

no-composite = "no-composite"

no-composite属性が指定されている場合、指定されたブレンドモードはアルファ合成を行いません。合成なしの「mixing」式はBlending [COMPOSITING-1]参照。それ以外の場合、実装はmodeで指定されたブレンドモードとSource Over合成演算子を組み合わせます。合成ありの「mixing」式はBlending [COMPOSITING-1]参照。

注: この属性はSVG 1.1のfeBlend要素定義への追加です。no-compositeは、入力ソースとフィルタ対象の背景(例:BackgroundImageフィルタプリミティブ)をブレンドする際の「二重合成」効果を避けるために指定します。大半の用途ではno-composite属性の指定は不要です。

アニメーション可能:いいえ

in2 = "(in属性を参照)"

ブレンド操作の2番目の入力画像です。

アニメーション可能:はい

normalブレンドモード(アルファ合成あり)は、feCompositeフィルタプリミティブのoperator="over"と同等であり、feMergeの合成方法や、SVGにおけるフィルタ効果外のすべての合成に使われる単純アルファ合成手法と一致します。

<svg width="5cm" height="5cm" viewBox="0 0 500 500"
     xmlns="http://www.w3.org/2000/svg">
  <title>Example feBlend - Examples of feBlend modes</title>
  <desc>feBlendモードの例:5つのテキスト文字列をグラデーションにブレンドし、それぞれ異なるfeBlendモードで表示。</desc>
  <defs>
    <linearGradient id="MyGradient" gradientUnits="userSpaceOnUse"
            x1="100" y1="0" x2="300" y2="0">
      <stop offset="0" stop-color="#000000" />
      <stop offset=".33" stop-color="#ffffff" />
      <stop offset=".67" stop-color="#ff0000" />
      <stop offset="1" stop-color="#808080" />
    </linearGradient>
    <filter id="Normal">
      <feBlend mode="normal" in2="BackgroundImage" in="SourceGraphic"/>
    </filter>
    <filter id="Multiply">
      <feBlend mode="multiply" in2="BackgroundImage" in="SourceGraphic"/>
    </filter>
    <filter id="Screen">
      <feBlend mode="screen" in2="BackgroundImage" in="SourceGraphic"/>
    </filter>
    <filter id="Darken">
      <feBlend mode="darken" in2="BackgroundImage" in="SourceGraphic"/>
    </filter>
    <filter id="Lighten">
      <feBlend mode="lighten" in2="BackgroundImage" in="SourceGraphic"/>
    </filter>
  </defs>
  <rect fill="none" stroke="blue"
        x="1" y="1" width="498" height="498"/>
  <g isolation="isolate" >
    <rect x="100" y="20" width="300" height="460" fill="url(#MyGradient)" />
    <g font-family="Verdana" font-size="75" fill="#888888" fill-opacity=".6" >
      <text x="50" y="90" filter="url(#Normal)" >Normal</text>
      <text x="50" y="180" filter="url(#Multiply)" >Multiply</text>
      <text x="50" y="270" filter="url(#Screen)" >Screen</text>
      <text x="50" y="360" filter="url(#Darken)" >Darken</text>
      <text x="50" y="450" filter="url(#Lighten)" >Lighten</text>
    </g>
  </g>
</svg>
Example of feBlend

feBlendの例

この例をSVGで表示

9.6. フィルタプリミティブ feColorMatrix

名前: feColorMatrix
カテゴリ: フィルタプリミティブ
内容モデル: 任意数の記述要素animatescriptset 要素を任意の順序で含めることができます。
属性:
DOMインターフェース: SVGFEColorMatrixElement

このフィルターは行列変換を適用します:

R ' G ' B ' A ' 1 = a 00 a 01 a 02 a 03 a 04 a 10 a 11 a 12 a 13 a 14 a 20 a 21 a 22 a 23 a 24 a 30 a 31 a 32 a 33 a 34 0 0 0 0 1 R G B A 1 left [ stack {R' # G' # B' # A' # 1} right ] = left [ matrix { a_00 # a_01 # a_02 # a_03 # a_04 ## a_10 # a_11 # a_12 # a_13 # a_14 ## a_20 # a_21 # a_22 # a_23 # a_24 ## a_30 # a_31 # a_32 # a_33 # a_34 ## 0 # 0 # 0 # 0 # 1 } right ] cdot left[ stack { R # G # B # A # 1 } right]

入力グラフィックの各ピクセルのRGBA色値とアルファ値に対して、新しいRGBA色値とアルファ値のセットを生成します。

計算は非プリマルチプライド色値で行われます。

属性定義:

type = "matrix | saturate | hueRotate | luminanceToAlpha"

行列操作の種類を示します。キーワードmatrixは、完全な5x4行列値が指定されることを示します。他のキーワードは、よく使われる色操作を完全な行列を指定せずに簡単に利用できるショートカットです。

type属性の初期値はmatrixです。

アニメーション可能:はい。

values = "list of <number>s"

valuesの内容はtype属性の値によって異なります:

  • type="matrix"の場合、valuesは20個の行列値(a00 a01 a02 a03 a04 a10 a11 ... a34)で、空白またはカンマで区切ります。例えば単位行列は下記のように記述できます:

    type="matrix"
    values="1 0 0 0 0  0 1 0 0 0  0 0 1 0 0  0 0 0 1 0"
  • type="saturate"の場合、valuesは実数値1つです。saturate操作は以下の行列操作に相当します:

    R ' G ' B ' A ' 1 = 0.213 + 0.787s 0.715 0.715s 0.072 0.072s 0 0 0.213 0.213s 0.715 + 0.285s 0.072 0.072s 0 0 0.213 0.213s 0.715 0.715s 0.072 + 0.928s 0 0 0 0 0 1 0 0 0 0 0 1 R G B A 1 left [ stack {R' # G' # B' # A' # 1} right ] = left [ matrix { 0.213 + 0.787s # 0.715 - 0.715s # 0.072 - 0.072s # 0 # 0 ## 0.213 - 0.213s # 0.715 + 0.285s # 0.072 - 0.072s # 0 # 0 ## 0.213 - 0.213s # 0.715 - 0.715s # 0.072 + 0.928s # 0 # 0 ## 0 # 0 # 0 # 1 # 0 ## 0 # 0 # 0 # 0 # 1 } right ] cdot left[ stack { R # G # B # A # 1 } right]

    注: 0を指定すると完全に脱彩度(グレースケール)フィルターとなり、1では入力画像がそのまま出力されます。0~1以外の値は入力画像の彩度を下げたり上げたりします。

    注: 輝度係数の精度は以前の仕様文書 [Cmam] より向上しています。

  • type="hueRotate"の場合、valuesは実数値1つ(度数)です。hueRotate操作は以下の行列操作に相当します:

    R ' G ' B ' A ' 1 = a 00 a 01 a 02 0 0 a 10 a 11 a 12 0 0 a 20 a 21 a 22 0 0 0 0 0 1 0 0 0 0 0 1 R G B A 1 left [ stack {R' # G' # B' # A' # 1} right ] = left [ matrix { a_00 # a_01 # a_02 # 0 # 0 ## a_10 # a_11 # a_12 # 0 # 0 ## a_20 # a_21 # a_22 # 0 # 0 ## 0 # 0 # 0 # 1 # 0 ## 0 # 0 # 0 # 0 # 1 } right ] cdot left[ stack { R # G # B # A # 1 } right]

    a00、a01などの項は以下のように計算されます:

    a 00 a 01 a 02 a 10 a 11 a 12 a 20 a 21 a 22 = + 0.213 + 0.715 + 0.072 + 0.213 + 0.715 + 0.072 + 0.213 + 0.715 + 0.072 + cos ( hueRotate value ) + 0.787 0.715 0.072 0.213 + 0.285 0.072 0.213 0.715 + 0.928 + sin ( hueRotate value ) 0.213 0.715 + 0.928 + 0.143 + 0.140 0.283 0.787 + 0.715 + 0.072 left[ matrix { a_00 # a_01 # a_02 ## a_10 # a_11 # a_12 ## a_20 # a_21 # a_22 } right] = left[ matrix { +0.213 # +0.715 # +0.072 ## +0.213 # +0.715 # +0.072 ## +0.213 # +0.715 # +0.072 } right] + cos(hueRotate value)cdot left[ matrix { +0.787 # -0.715 # -0.072 ## -0.213 # +0.285 # -0.072 ## -0.213 # -0.715 # +0.928 } right] + sin(hueRotate value) cdot left[ matrix { -0.213 # -0.715 # +0.928 ## +0.143 # +0.140 # -0.283 ## -0.787 # +0.715 # +0.072 } right]

    したがって、色相行列の左上の項は次のようになります:

    a 00 = 0.2127 + cos ( hueRotate value ) 0.7873 sin ( hueRotate value ) 0.2127 a_00 = 0.2127 + cos(hueRotate value) cdot 0.7873 - sin(hueRotate value) cdot 0.2127
  • type="luminanceToAlpha"の場合、values属性は使用しません。luminanceToAlpha操作は以下の行列操作と同等です:

    R ' G ' B ' A ' 1 = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2126 0.7152 0.0722 0 0 0 0 0 0 1 R G B A 1 left [ stack {R' # G' # B' # A' # 1} right ] = left [ matrix { 0 # 0 # 0 # 0 # 0 ## 0 # 0 # 0 # 0 # 0 ## 0 # 0 # 0 # 0 # 0 ## 0.2126 # 0.7152 # 0.0722 # 0 # 0 ## 0 # 0 # 0 # 0 # 1 } right ] cdot left[ stack { R # G # B # A # 1 } right]

values属性の初期値

typeがmatrixの場合

デフォルトは単位行列

typeがsaturateの場合

デフォルトは1

typeがhueRotateの場合

デフォルトは0で、結果は単位行列になる

valuesリストのエントリ数がtypeで必要な数と一致しない場合、フィルタプリミティブはパススルーフィルタとして動作します。

アニメーション可能:はい。

<svg width="8cm" height="5cm" viewBox="0 0 800 500"
     xmlns="http://www.w3.org/2000/svg">
  <title>feColorMatrixの例 - feColorMatrix操作例</title>
  <desc>feColorMatrixの効果を示す5つのテキスト:
        参照用のフィルタなしテキスト、
        feColorMatrixのmatrixオプションでグレースケール変換、
        feColorMatrixのsaturateオプションの使用、
        feColorMatrixのhueRotateオプションの使用、
        feColorMatrixのluminanceToAlphaオプションの使用。</desc>
  <defs>
    <linearGradient id="MyGradient" gradientUnits="userSpaceOnUse"
            x1="100" y1="0" x2="500" y2="0">
      <stop offset="0" stop-color="#ff00ff" />
      <stop offset=".33" stop-color="#88ff88" />
      <stop offset=".67" stop-color="#2020ff" />
      <stop offset="1" stop-color="#d00000" />
    </linearGradient>
    <filter id="Matrix" filterUnits="objectBoundingBox"
            x="0%" y="0%" width="100%" height="100%">
      <feColorMatrix type="matrix" in="SourceGraphic"
           values=".33 .33 .33 0 0
                   .33 .33 .33 0 0
                   .33 .33 .33 0 0
                   .33 .33 .33 0 0"/>
    </filter>
    <filter id="Saturate40" filterUnits="objectBoundingBox"
            x="0%" y="0%" width="100%" height="100%">
      <feColorMatrix type="saturate" in="SourceGraphic" values="0.4"/>
    </filter>
    <filter id="HueRotate90" filterUnits="objectBoundingBox"
            x="0%" y="0%" width="100%" height="100%">
      <feColorMatrix type="hueRotate" in="SourceGraphic" values="90"/>
    </filter>
    <filter id="LuminanceToAlpha" filterUnits="objectBoundingBox"
            x="0%" y="0%" width="100%" height="100%">
      <feColorMatrix type="luminanceToAlpha" in="SourceGraphic" result="a"/>
      <feComposite in="SourceGraphic" in2="a" operator="in" />
    </filter>
  </defs>
  <rect fill="none" stroke="blue"
        x="1" y="1" width="798" height="498"/>
  <g font-family="Verdana" font-size="75"
            font-weight="bold" fill="url(#MyGradient)" >
    <rect x="100" y="0" width="500" height="20" />
    <text x="100" y="90">フィルタなし</text>
    <text x="100" y="190" filter="url(#Matrix)" >Matrix(グレースケール)</text>
    <text x="100" y="290" filter="url(#Saturate40)" >Saturate(彩度40%)</text>
    <text x="100" y="390" filter="url(#HueRotate90)" >HueRotate(色相90度)</text>
    <text x="100" y="490" filter="url(#LuminanceToAlpha)" >Luminance(輝度をアルファへ)</text>
  </g>
</svg>
Example

feColorMatrixの例

この例をSVGで表示

9.7. フィルタプリミティブ feComponentTransfer

名前: feComponentTransfer
カテゴリ: フィルタプリミティブ
内容モデル: 任意数の記述要素feFuncRfeFuncGfeFuncBfeFuncAscript要素を任意の順序で含むことができます。
属性:
DOMインターフェース: SVGFEComponentTransferElement

このフィルタプリミティブは、各成分ごとのデータ再マッピングを以下のように行います:

R' = feFuncR( R )G' = feFuncG( G )
B' = feFuncB( B )
A' = feFuncA( A )

すべてのピクセルに対して。これにより、明るさの調整、コントラストの調整、色バランスやしきい値処理などの操作が可能です。

計算は非プリマルチプライド色値で行われます。

feComponentTransfer要素の子要素は、4つのチャンネルの転送関数を指定します:

feFuncRfeFuncGfeFuncBfeFuncA要素の集合は、転送関数要素とも呼ばれます。

feComponentTransfer要素の処理には以下のルールが適用されます:

9.7.1. 転送関数 feFuncR

名前: feFuncR
カテゴリ: 転送関数要素
内容モデル: 任意数の記述要素animatescriptset 要素を任意の順序で含むことができます。
属性:
DOMインターフェース: SVGFEFuncRElement

以下の属性は転送関数要素の属性であり、 転送関数要素に適用されます。

属性定義:

type = "identity | table | discrete | linear | gamma"

成分転送関数の種類を示します。関数の種類によって他の属性の適用可否が決まります。

以下で、Cは元の成分(例: feFuncR)、C'は再マッピング後の成分で、どちらも閉区間[0,1]の値です。

  • identityの場合:

    C' = C
  • tableの場合、関数は属性tableValuesで指定された値間を線形補間して定義されます。テーブルにはn+1個の値(v0~vn)があり、n個の等間隔補間領域の開始値・終了値を指定します。補間は以下の式で行います:

    C < 1について、kを次のように見つけます:

    k/n <= C < (k+1)/n

    結果C'は、

    C' = vk + (C - k/n)*n * (vk+1 - vk)

    C = 1の場合:

    C' = vn.

  • discreteの場合、関数は属性tableValuesで指定されたステップ関数で定義されます。リストにはn個の値(v0~vn-1)があり、n個のステップからなる関数を示します。ステップ関数は以下の式で定義されます:

    C < 1について、kを次のように見つけます:

    k/n <= C < (k+1)/n

    結果C'は、

    C' = vk

    C = 1の場合:

    C' = vn-1.

  • linearの場合、関数は以下の一次式で定義されます:

    C' = slope * C + intercept

  • gammaの場合、関数は以下の指数関数で定義されます:

    C' = amplitude * pow(C, exponent) + offset

type属性の初期値はidentityです。

アニメーション可能:はい。

tableValues = "(リスト形式の <number>s)"

type="table"の場合、空白またはカンマ区切りの<number>のリストv0,v1,...vnで、ルックアップテーブルを定義します。空リストの場合、identity転送関数となります。

属性が指定されていない場合、空リストが与えられたものとして扱います。

アニメーション可能:はい。

slope = "<number>"

type="linear"の場合、一次関数の傾き。

slope属性の初期値は1です。

アニメーション可能:はい。

intercept = "<number>"

type="linear"の場合、一次関数の切片。

intercept属性の初期値は0です。

アニメーション可能:はい。

amplitude = "<number>"

type="gamma"の場合、ガンマ関数の振幅。

amplitude属性の初期値は1です。

アニメーション可能:はい。

exponent = "<number>"

type="gamma"の場合、ガンマ関数の指数。

exponent属性の初期値は1です。

アニメーション可能:はい。

offset = "<number>"

type="gamma"の場合、ガンマ関数のオフセット。

offset属性の初期値は0です。

アニメーション可能:はい。

<svg width="8cm" height="4cm" viewBox="0 0 800 400"
     xmlns="http://www.w3.org/2000/svg">
  <title>feComponentTransferの例 - feComponentTransfer操作例</title>
  <desc>feComponentTransferの効果を示す4つのテキスト:
        参照用のidentity関数、
        feComponentTransferのtableオプションの使用、
        feComponentTransferのlinearオプションの使用、
        feComponentTransferのgammaオプションの使用。</desc>
  <defs>
    <linearGradient id="MyGradient" gradientUnits="userSpaceOnUse"
            x1="100" y1="0" x2="600" y2="0">
      <stop offset="0" stop-color="#ff0000" />
      <stop offset=".33" stop-color="#00ff00" />
      <stop offset=".67" stop-color="#0000ff" />
      <stop offset="1" stop-color="#000000" />
    </linearGradient>
    <filter id="Identity" filterUnits="objectBoundingBox"
            x="0%" y="0%" width="100%" height="100%">
      <feComponentTransfer>
        <feFuncR type="identity"/>
        <feFuncG type="identity"/>
        <feFuncB type="identity"/>
        <feFuncA type="identity"/>
      </feComponentTransfer>
    </filter>
    <filter id="Table" filterUnits="objectBoundingBox"
            x="0%" y="0%" width="100%" height="100%">
      <feComponentTransfer>
        <feFuncR type="table" tableValues="0 0 1 1"/>
        <feFuncG type="table" tableValues="1 1 0 0"/>
        <feFuncB type="table" tableValues="0 1 1 0"/>
      </feComponentTransfer>
    </filter>
    <filter id="Linear" filterUnits="objectBoundingBox"
            x="0%" y="0%" width="100%" height="100%">
      <feComponentTransfer>
        <feFuncR type="linear" slope=".5" intercept=".25"/>
        <feFuncG type="linear" slope=".5" intercept="0"/>
        <feFuncB type="linear" slope=".5" intercept=".5"/>
      </feComponentTransfer>
    </filter>
    <filter id="Gamma" filterUnits="objectBoundingBox"
            x="0%" y="0%" width="100%" height="100%">
      <feComponentTransfer>
        <feFuncR type="gamma" amplitude="2" exponent="5" offset="0"/>
        <feFuncG type="gamma" amplitude="2" exponent="3" offset="0"/>
        <feFuncB type="gamma" amplitude="2" exponent="1" offset="0"/>
      </feComponentTransfer>
    </filter>
  </defs>
  <rect fill="none" stroke="blue"
        x="1" y="1" width="798" height="398"/>
  <g font-family="Verdana" font-size="75"
            font-weight="bold" fill="url(#MyGradient)" >
    <rect x="100" y="0" width="600" height="20" />
    <text x="100" y="90">Identity(恒等関数)</text>
    <text x="100" y="190" filter="url(#Table)" >TableLookup(テーブル補間)</text>
    <text x="100" y="290" filter="url(#Linear)" >LinearFunc(一次関数)</text>
    <text x="100" y="390" filter="url(#Gamma)" >GammaFunc(ガンマ関数)</text>
  </g>
</svg>
Example for feComponentTransfer

feComponentTransferの例

この例をSVGで表示

9.7.2. 転送関数 feFuncG

名前: feFuncG
カテゴリ: 転送関数要素
内容モデル: 任意数の記述要素animatescriptset 要素を任意の順序で含むことができます。
属性:
DOMインターフェース: SVGFEFuncGElement

属性値の定義についてはfeFuncRを参照してください。

9.7.3. 転送関数 feFuncB

名前: feFuncB
カテゴリ: 転送関数要素
内容モデル: 任意数の記述要素animatescriptset 要素を任意の順序で含むことができます。
属性:
DOMインターフェース: SVGFEFuncBElement

属性値の定義についてはfeFuncRを参照してください。

9.7.4. 転送関数 feFuncA

名前: feFuncA
カテゴリ: 転送関数要素
内容モデル: 任意数の記述要素animatescriptset 要素を任意の順序で含むことができます。
属性:
DOMインターフェース: SVGFEFuncAElement

属性値の定義についてはfeFuncRを参照してください。

9.8. フィルタプリミティブ feComposite

名前: feComposite
カテゴリ: フィルタプリミティブ
内容モデル: 任意数の記述要素animatescriptset 要素を任意の順序で含むことができます。
属性:
DOMインターフェース: SVGFECompositeElement

このフィルタは、Porter-Duff [PORTERDUFF] 合成演算のいずれか(overinatopoutxorlighter [COMPOSITING-1])を用いて、画像空間内の2つの入力画像の各ピクセルを合成します。さらに、成分ごとのarithmetic演算(結果は[0..1]範囲にクランプ)が利用できます。

arithmetic演算は、feDiffuseLightingfeSpecularLighting フィルタの出力をテクスチャデータと組み合わせる際に便利です。また、dissolveの実装にも役立ちます。arithmetic演算が選択された場合、各結果ピクセルは以下の式で計算されます:

result = k1*i1*i2 + k2*i1 + k3*i2 + k4

ここで:

このフィルタプリミティブでは、生成画像の範囲がフィルタプリミティブサブリージョンの説明通り拡大する場合があります。

属性定義:

operator = "over | in | out | atop | xor | lighter | arithmetic"

合成演算の種類を指定します。arithmetic以外のoperatorタイプは、[COMPOSITING-1]で説明されている対応演算と一致し、inがソース、in2がデスティネーションとなります。arithmetic演算は上記参照。

operator属性の初期値はoverです。

アニメーション可能:はい。

k1 = "<number>"

operator="arithmetic"の場合のみ有効。

k1属性の初期値は0です。

アニメーション可能:はい。

k2 = "<number>"

operator="arithmetic"の場合のみ有効。

k2属性の初期値は0です。

アニメーション可能:はい。

k3 = "<number>"

operator="arithmetic"の場合のみ有効。

k3属性の初期値は0です。

アニメーション可能:はい。

k4 = "<number>"

operator="arithmetic"の場合のみ有効。

k4属性の初期値は0です。

アニメーション可能:はい。

in2 = "(see in 属性参照)"

合成演算の2番目の入力画像。

アニメーション可能:はい。

注: Compositing and Blending [COMPOSITING-1] では、さらに多くの合成キーワードが定義されています。追加のキーワードの機能は、入力フィルタプリミティブ inin2 を切り替えることで実現できます。

<svg width="330" height="195" viewBox="0 0 1100 650"
     xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <title>feCompositeの例 - feComposite演算の例</title>
  <desc>異なる不透明度および背景クリア有無における
        6種類のfeComposite演算子を、重なった三角形ペア6組の4行で示します。</desc>
  <defs>
    <desc>6つの合成演算子それぞれに対して、6フィルタからなる2セットを定義します。
          1つ目のセットは不透明な白で塗りつぶして背景画像を消去します。
          2つ目のセットは背景を消去しないため、背景が見える場合があるほか、
          別の場合には背景画像が自身にブレンドされます(「二重カウント」)。</desc>
    <filter id="overFlood" filterUnits="objectBoundingBox" x="-5%" y="-5%" width="110%" height="110%">
      <feFlood flood-color="#ffffff" flood-opacity="1" result="flood"/>
      <feComposite in="SourceGraphic" in2="BackgroundImage" operator="over" result="comp"/>
      <feMerge> <feMergeNode in="flood"/> <feMergeNode in="comp"/> </feMerge>
    </filter>
    <filter id="inFlood" filterUnits="objectBoundingBox" x="-5%" y="-5%" width="110%" height="110%">
      <feFlood flood-color="#ffffff" flood-opacity="1" result="flood"/>
      <feComposite in="SourceGraphic" in2="BackgroundImage" operator="in" result="comp"/>
      <feMerge> <feMergeNode in="flood"/> <feMergeNode in="comp"/> </feMerge>
    </filter>
    <filter id="outFlood" filterUnits="objectBoundingBox" x="-5%" y="-5%" width="110%" height="110%">
      <feFlood flood-color="#ffffff" flood-opacity="1" result="flood"/>
      <feComposite in="SourceGraphic" in2="BackgroundImage" operator="out" result="comp"/>
      <feMerge> <feMergeNode in="flood"/> <feMergeNode in="comp"/> </feMerge>
    </filter>
    <filter id="atopFlood" filterUnits="objectBoundingBox" x="-5%" y="-5%" width="110%" height="110%">
      <feFlood flood-color="#ffffff" flood-opacity="1" result="flood"/>
      <feComposite in="SourceGraphic" in2="BackgroundImage" operator="atop" result="comp"/>
      <feMerge> <feMergeNode in="flood"/> <feMergeNode in="comp"/> </feMerge>
    </filter>
    <filter id="xorFlood" filterUnits="objectBoundingBox" x="-5%" y="-5%" width="110%" height="110%">
      <feFlood flood-color="#ffffff" flood-opacity="1" result="flood"/>
      <feComposite in="SourceGraphic" in2="BackgroundImage" operator="xor" result="comp"/>
      <feMerge> <feMergeNode in="flood"/> <feMergeNode in="comp"/> </feMerge>
    </filter>
    <filter id="arithmeticFlood" filterUnits="objectBoundingBox"
            x="-5%" y="-5%" width="110%" height="110%">
      <feFlood flood-color="#ffffff" flood-opacity="1" result="flood"/>
      <feComposite in="SourceGraphic" in2="BackgroundImage" result="comp"
                   operator="arithmetic" k1=".5" k2=".5" k3=".5" k4=".5"/>
      <feMerge> <feMergeNode in="flood"/> <feMergeNode in="comp"/> </feMerge>
    </filter>
    <filter id="overNoFlood" filterUnits="objectBoundingBox" x="-5%" y="-5%" width="110%" height="110%">
      <feComposite in="SourceGraphic" in2="BackgroundImage" operator="over" result="comp"/>
    </filter>
    <filter id="inNoFlood" filterUnits="objectBoundingBox" x="-5%" y="-5%" width="110%" height="110%">
      <feComposite in="SourceGraphic" in2="BackgroundImage" operator="in" result="comp"/>
    </filter>
    <filter id="outNoFlood" filterUnits="objectBoundingBox" x="-5%" y="-5%" width="110%" height="110%">
      <feComposite in="SourceGraphic" in2="BackgroundImage" operator="out" result="comp"/>
    </filter>
    <filter id="atopNoFlood" filterUnits="objectBoundingBox" x="-5%" y="-5%" width="110%" height="110%">
      <feComposite in="SourceGraphic" in2="BackgroundImage" operator="atop" result="comp"/>
    </filter>
    <filter id="xorNoFlood" filterUnits="objectBoundingBox" x="-5%" y="-5%" width="110%" height="110%">
      <feComposite in="SourceGraphic" in2="BackgroundImage" operator="xor" result="comp"/>
    </filter>
    <filter id="arithmeticNoFlood" filterUnits="objectBoundingBox"
            x="-5%" y="-5%" width="110%" height="110%">
      <feComposite in="SourceGraphic" in2="BackgroundImage" result="comp"
                   operator="arithmetic" k1=".5" k2=".5" k3=".5" k4=".5"/>
    </filter>
    <path id="Blue100" d="M 0 0 L 100 0 L 100 100 z" fill="#00ffff" />
    <path id="Red100" d="M 0 0 L 0 100 L 100 0 z" fill="#ff00ff" />
    <path id="Blue50" d="M 0 125 L 100 125 L 100 225 z" fill="#00ffff" fill-opacity=".5" />
    <path id="Red50" d="M 0 125 L 0 225 L 100 125 z" fill="#ff00ff" fill-opacity=".5" />
    <g id="TwoBlueTriangles">
      <use xlink:href="#Blue100"/>
      <use xlink:href="#Blue50"/>
    </g>
    <g id="BlueTriangles">
      <use transform="translate(275,25)" xlink:href="#TwoBlueTriangles"/>
      <use transform="translate(400,25)" xlink:href="#TwoBlueTriangles"/>
      <use transform="translate(525,25)" xlink:href="#TwoBlueTriangles"/>
      <use transform="translate(650,25)" xlink:href="#TwoBlueTriangles"/>
      <use transform="translate(775,25)" xlink:href="#TwoBlueTriangles"/>
      <use transform="translate(900,25)" xlink:href="#TwoBlueTriangles"/>
    </g>
  </defs>

  <rect fill="none" stroke="blue" x="1" y="1" width="1098" height="648"/>
  <g font-family="Verdana" font-size="40" shape-rendering="crispEdges">
    <desc>不透明な白い面の上に描画して背景を消すフィルタを用いて、例をレンダリングします。</desc>
    <g isolation="isolate">
      <text x="15" y="75">不透明度 1.0</text>
      <text x="15" y="115" font-size="27">(feFlood あり)</text>
      <text x="15" y="200">不透明度 0.5</text>
      <text x="15" y="240" font-size="27">(feFlood あり)</text>
      <use xlink:href="#BlueTriangles"/>
      <g transform="translate(275,25)">
        <use xlink:href="#Red100" filter="url(#overFlood)" />
        <use xlink:href="#Red50" filter="url(#overFlood)" />
        <text x="5" y="275">over</text>
      </g>
      <g transform="translate(400,25)">
        <use xlink:href="#Red100" filter="url(#inFlood)" />
        <use xlink:href="#Red50" filter="url(#inFlood)" />
        <text x="35" y="275">in</text>
      </g>
      <g transform="translate(525,25)">
        <use xlink:href="#Red100" filter="url(#outFlood)" />
        <use xlink:href="#Red50" filter="url(#outFlood)" />
        <text x="15" y="275">out</text>
      </g>
      <g transform="translate(650,25)">
        <use xlink:href="#Red100" filter="url(#atopFlood)" />
        <use xlink:href="#Red50" filter="url(#atopFlood)" />
        <text x="10" y="275">atop</text>
      </g>
      <g transform="translate(775,25)">
        <use xlink:href="#Red100" filter="url(#xorFlood)" />
        <use xlink:href="#Red50" filter="url(#xorFlood)" />
        <text x="15" y="275">xor</text>
      </g>
      <g transform="translate(900,25)">
        <use xlink:href="#Red100" filter="url(#arithmeticFlood)" />
        <use xlink:href="#Red50" filter="url(#arithmeticFlood)" />
        <text x="-25" y="275">arithmetic</text>
      </g>
    </g>
    <g transform="translate(0,325)" isolation="isolate">
    <desc>背景を消さないフィルタを用いて例をレンダリングします。
          その結果、背景が見え続ける場合があるほか、別の場合には背景画像が自身にブレンドされます(「二重カウント」)。</desc>
      <text x="15" y="75">不透明度 1.0</text>
      <text x="15" y="115" font-size="27">(feFlood なし)</text>
      <text x="15" y="200">不透明度 0.5</text>
      <text x="15" y="240" font-size="27">(feFlood なし)</text>
      <use xlink:href="#BlueTriangles"/>
      <g transform="translate(275,25)">
        <use xlink:href="#Red100" filter="url(#overNoFlood)" />
        <use xlink:href="#Red50" filter="url(#overNoFlood)" />
        <text x="5" y="275">over</text>
      </g>
      <g transform="translate(400,25)">
        <use xlink:href="#Red100" filter="url(#inNoFlood)" />
        <use xlink:href="#Red50" filter="url(#inNoFlood)" />
        <text x="35" y="275">in</text>
      </g>
      <g transform="translate(525,25)">
        <use xlink:href="#Red100" filter="url(#outNoFlood)" />
        <use xlink:href="#Red50" filter="url(#outNoFlood)" />
        <text x="15" y="275">out</text>
      </g>
      <g transform="translate(650,25)">
        <use xlink:href="#Red100" filter="url(#atopNoFlood)" />
        <use xlink:href="#Red50" filter="url(#atopNoFlood)" />
        <text x="10" y="275">atop</text>
      </g>
      <g transform="translate(775,25)">
        <use xlink:href="#Red100" filter="url(#xorNoFlood)" />
        <use xlink:href="#Red50" filter="url(#xorNoFlood)" />
        <text x="15" y="275">xor</text>
      </g>
      <g transform="translate(900,25)">
        <use xlink:href="#Red100" filter="url(#arithmeticNoFlood)" />
        <use xlink:href="#Red50" filter="url(#arithmeticNoFlood)" />
        <text x="-25" y="275">arithmetic</text>
      </g>
    </g>
  </g>
</svg>
feCompositeの例

feCompositeの例

この例をSVGで表示

9.9. フィルタプリミティブ feConvolveMatrix

名前: feConvolveMatrix
カテゴリ: フィルタプリミティブ
内容モデル: 任意の個数の 記述要素animatescriptset 要素を任意の順序で含む。
属性:
DOMインターフェース: SVGFEConvolveMatrixElement

feConvolveMatrixは行列畳み込みフィルター効果を適用します。畳み込みは入力画像のピクセルを隣接ピクセルと組み合わせて、結果画像を生成します。ぼかし、エッジ検出、シャープ化、エンボス、ベベルなど、幅広い画像処理操作が畳み込みによって実現可能です。

行列畳み込みはn×mの行列(畳み込みカーネル)に基づいており、入力画像のピクセル値がどのように隣接ピクセル値と組み合わされて結果ピクセル値を生成するかを記述します。各結果ピクセルは、カーネル行列を対応するソースピクセルとその隣接ピクセルに適用することで決定されます。各ピクセルの色値に適用される基本的な畳み込み式は以下の通りです:

color X , Y = i = 0 orderY 1 j = 0 orderX 1 source x targetX + j , y targetY + i kernalMatrix orderX j 1, orderY i 1 divisor + bias alpha x , y func color_{X , Y} = { sum from{i=0} to{func orderY -1} sum from{j=0} to{func orderX -1} func source_{x - func targetX + j , y - targetY + i} cdot func kernalMatrix_{func orderX - j - 1, func orderY - i - 1 }} over {func divisor} + func bias cdot func alpha_{x,y}

ここで「orderX」と「orderY」はorder属性のXおよびYの値を表し、「targetX」はtargetX属性の値を表し、「targetY」はtargetY属性の値を表し、「kernelMatrix」はkernelMatrix属性の値を表し、「divisor」はdivisor属性の値を表し、「bias」はbias属性の値を表します。

上記の式では、カーネル行列の値が適用される際、カーネル行列は畳み込み理論に一致するようにソース画像および出力画像に対して180度回転されることが多くのコンピュータグラフィックスの教科書で説明されています。

例を挙げると、入力画像が5ピクセル×5ピクセルで、その色チャンネルの1つの色値が以下のようであると仮定します:

0 20 40 235 235 100 120 140 235 235 200 220 240 235 235 255 255 255 255 255 255 255 255 255 255 left[ matrix {0 # 20 # 40 # 235 # 235 ## 100 # 120 # 140 # 235 # 235 ## 200 # 220 # 240 # 235 # 235 ## 255 # 255 # 255 # 255 # 255 ## 255 # 255 # 255 # 255 # 255} right]

そして、次のように3×3の畳み込みカーネルを定義します:

1 2 3 4 5 6 7 8 9 left[ matrix {1 # 2 # 3 ## 4 # 5 # 6 ## 7 # 8 # 9} right]

画像の2行目2列目の色値に注目しましょう(ソースピクセル値は120です)。 入力画像のピクセルグリッドがカーネルのピクセルグリッドと完全に一致する最も単純な場合を仮定し、 またdivisortargetX、 およびtargetY属性のデフォルト値を仮定すると、 結果として得られる色値は次のようになります:

resultChannel 2,2 = 9 0 + 8 20 + 7 40 + 6 100 + 5 120 + 4 140 + 3 200 + 2 220 + 1 240 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 func resultChannel_2,2 = {{9 cdot 0} + {8 cdot 20} + {7 cdot 40} + {6 cdot 100} + {5 cdot 120} + {4 cdot 140} + {3 cdot 200} + {2 cdot 220} + {1 cdot 240}} over {9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1}

行列畳み込みはピクセルに対して動作するため、本質的に解像度に依存します。feConvolveMatrixで解像度に依存しない結果を得るには、属性kernelUnitLengthに明示的な値を指定する必要があります。

kernelUnitLengthは他の属性と組み合わせて、フィルタ効果の座標系(すなわち、primitiveUnits属性によって確立される座標系)における暗黙のピクセルグリッドを定義します。入力画像は一時的にリスケールされ、ピクセルがkernelUnitLengthに一致するように調整されます。畳み込みはリサンプリングされた画像に対して行われます。畳み込みを適用した後、画像は元の解像度に再サンプリングされます。

畳み込みの前に画像をkernelUnitLengthで定義された座標系に合わせて再サンプリングする必要がある場合、または畳み込みの後にデバイス座標系に合わせて再サンプリングする必要がある場合には、高品質なビューアは適切な補間手法(例えばバイリニアやバイキュービック)を用いることが推奨されます。利用可能な補間器の速度に応じて、この選択はimage-renderingプロパティの設定に影響される可能性があります。実装によっては、適切な結果を得るのに再サンプリングが不要な場合(例えば、ドキュメントが縮小表示されてkernelUnitLengthがデバイスピクセルよりもかなり小さくなる場合など)には、再サンプリングを最小化または省略するアプローチを選択することがあります。

属性の定義:

order = "<number-optional-number>"

kernelMatrixの各次元におけるセル数を示します。指定する値は、ゼロより大きい<integer>でなければなりません。整数でない値は切り捨てられ(すなわち、ゼロ方向に最も近い整数に丸められ)ます。最初の数値<orderX>は行列の列数を示し、2番目の数値<orderY>は行列の行数を示します。<orderY>が指定されない場合は、<orderX>が既定値になります。

小さい値(例:3)のみを使用することが推奨されます。大きな値は非常に高いCPUオーバーヘッドを招き、通常はパフォーマンスへの影響を正当化できる結果をもたらしません。

初期値orderに対して3です。

アニメーション可能: はい。

kernelMatrix = "<list of numbers>"

畳み込み用のカーネル行列を構成する<number>のリストです。値は空白文字および/またはカンマで区切ります。リスト内のエントリ数は、<orderX>と<orderY>の積に等しくなければなりません。

orderX * orderYの結果が値リストのエントリ数と一致しない場合、このフィルタプリミティブはパススルーフィルタとして動作します。

値リスト内のエントリ数が不正な場合はどのように振る舞うべきか? <https://github.com/w3c/csswg-drafts/issues/237>

アニメーション可能: はい。

divisor = "<number>"

入力画像にkernelMatrixを適用して得られた数値を、divisorで割ることで、最終的な出力色値を得ます。行列値の総和をdivisorとすると、結果の全体的な色強度を均す効果が得られる傾向があります。指定されたdivisorが0の場合は、代わりに既定値が使用されます。

初期値は、kernelMatrix内のすべての値の総和です。ただし、その総和が0の場合はdivisorを1に設定します。

アニメーション可能: はい。

bias = "<number>"

入力画像にkernelMatrixを適用して数値を得てから、divisorを適用した後、各コンポーネントにbias属性の値を加えます。biasの用途の一つは、フィルタのゼロ応答を.5のグレー値にしたい場合です。biasプロパティはフィルタの出力範囲をシフトし、通常は0または1にクランプされてしまう値の表現を可能にします。

初期値bias)は0です。

アニメーション可能: はい。

targetX = "<integer>"

入力画像の特定の対象ピクセルに対して、畳み込み行列のX方向の位置を決定します。行列の最左列は列番号0です。値は 0 <= targetX < orderX を満たさなければなりません。既定では、畳み込み行列は入力画像の各ピクセルに対してX方向に中心配置されます(すなわち、targetX = floor ( orderX / 2 ))。

アニメーション可能: はい。

targetY = "<integer>"

入力画像の特定の対象ピクセルに対して、畳み込み行列のY方向の位置を決定します。行列の最上行は行番号0です。値は 0 <= targetY < orderY を満たさなければなりません。既定では、畳み込み行列は入力画像の各ピクセルに対してY方向に中心配置されます(すなわち、targetY = floor ( orderY / 2 ))。

アニメーション可能: はい。

edgeMode = "duplicate | wrap | none"

カーネルが入力画像の端または端付近に位置する際に行列演算を適用できるよう、必要に応じて入力画像をどのように色値で拡張するかを決定します。

duplicateは、入力画像の各境界に沿って、当該端にある色値を複製することで必要に応じて入力画像を拡張することを示します。

元の N×M 画像(m=M-1、n=N-1)の場合:

11 12 . . . 1 m 1 M 21 22 . . . 2 m 2 M . . . . . . . . . . . . . . . n 1 n 2 . . . nm nM N 1 N 2 . . . Nm NM left[ matrix {11 # 12 # { "." "." "."} # {1 m} # {1 M} ## 21 # 22 # { "." "." "."} # {2 m} # {2 M} ## { "." "." "."} # { "." "." "."} # { "." "." "."} # { "." "." "."} # { "." "." "."} ## {n 1} # {n 2} # { "." "." "."} # func nm # func nM ## {N 1} # {N 2} # { "." "." "."} # func Nm # func NM} right]

duplicate を使用して2ピクセル拡張:

11 11 11 12 1 m 1 M 1 M 1 M 11 11 11 12 1 m 1 M 1 M 1 M 11 11 11 12 1 m 1 M 1 M 1 M 21 21 21 22 2 m 2 M 2 M 2 M n 1 n 1 n 1 n 2 nm nM nM nM N 1 N 1 N 1 N 2 Nm NM NM NM N 1 N 1 N 1 N 2 Nm NM NM NM N 1 N 1 N 1 N 2 Nm NM NM NM left[ matrix {11 # 11 # 11 # 12 # dotslow # {1 m} # {1 M} # {1 M} # {1 M} ## 11 # 11 # 11 # 12 # dotslow # {1 m} # {1 M} # {1 M} # {1 M} ## 11 # 11 # 11 # 12 # dotslow # {1 m} # {1 M} # {1 M} # {1 M} ## 21 # 21 # 21 # 22 # dotslow # {2 m} # {2 M} # {2 M} # {2 M} ## dotslow # dotslow # dotslow # dotslow # dotslow # dotslow # dotslow # dotslow # dotslow ## {n 1} # {n 1} # {n 1} # {n 2} # dotslow # func nm # func nM # func nM # func nM ## {N 1} # {N 1} # {N 1} # {N 2} # dotslow # func Nm # func NM # func NM # func NM ## {N 1} # {N 1} # {N 1} # {N 2} # dotslow # func Nm # func NM # func NM # func NM ## {N 1} # {N 1} # {N 1} # {N 2} # dotslow # func Nm # func NM # func NM # func NM} right]

wrap は、入力画像が画像の反対側の端から色値を取り込むことで拡張されることを示します。

wrap を使用して2ピクセル拡張:

nm nM n1 n2 nm nM n1 n2 Nm NM N1 N2 Nm NM N1 N2 1m 1M 11 12 1m 1M 11 12 2m 2M 21 22 2m 2M 21 22 nm nM n1 n2 nm nM n1 n2 Nm NM N1 N2 Nm NM N1 N2 1m 1M 11 12 1m 1M 11 12 2m 2M 21 22 2m 2M 21 22 left[ matrix { nm # nM # n1 # n2 # dotslow # nm # nM # n1 # n2 ## Nm # NM # N1 # N2 # dotslow # Nm # NM # N1 # N2 ## 1m # 1M # 11 # 12 # dotslow # 1m # 1M # 11 # 12 ## 2m # 2M # 21 # 22 # dotslow # 2m # 2M # 21 # 22 ## dotslow # dotslow # dotslow # dotslow # dotslow # dotslow # dotslow # dotslow # dotslow ## nm # nM # n1 # n2 # dotslow # nm # nM # n1 # n2 ## Nm # NM # N1 # N2 # dotslow # Nm # NM # N1 # N2 ## 1m # 1M # 11 # 12 # dotslow # 1m # 1M # 11 # 12 ## 2m # 2M # 21 # 22 # dotslow # 2m # 2M # 21 # 22 } right]

noneは、入力画像がR、G、B、Aのピクセル値をゼロで拡張することを示します。

初期値edgeModeに対してduplicateです。

アニメーション可能: はい。

kernelUnitLength = "<number-optional-number>"

最初の数値は<dx>値を表します。2番目の数値は<dy>値を表します。<dy>値が指定されていない場合、<dx>値と同じ値がデフォルトとなります。primitiveUnits属性によって決定される単位(現在のフィルタ単位)で、kernelMatrix内の連続する列と行の間の意図された距離を示します。kernelUnitLengthに値を指定することで、カーネルが拡張可能な抽象座標系で定義されます。kernelUnitLengthが指定されていない場合、デフォルト値はオフスクリーンビットマップの1ピクセルであり、これはピクセルベースの座標系であるため、拡張性がない可能性があります。表示メディアやユーザーエージェント間での一貫性をある程度確保するために、kernelUnitLengthに値を指定する必要があります。一部の実装では、一時的なオフスクリーン画像のピクセルグリッドがカーネルのピクセルグリッドと整列する場合、最も一貫性のある結果と最速のパフォーマンスが得られます。

負の値またはゼロ値が指定された場合、デフォルト値が使用されます。

注: この属性は非推奨であり、削除される予定です。プラットフォームに依存しない結果を作成する信頼性のある方法を提供しません。この仕様の将来のバージョンでは、この使用ケースをカバーする予定です。

アニメーション可能: はい。

preserveAlpha = "false | true"

falseの値は、畳み込みがアルファチャネルを含むすべてのチャネルに適用されることを示します。この場合、特定のピクセルに対する畳み込み式ALPHAX,Yは以下の通りです:

ALPHAX,Y = (
SUM I=0 to [orderY-1] {
SUM J=0 to [orderX-1] {
SOURCE X-targetX+J, Y-targetY+I * kernelMatrixorderX-J-1, orderY-I-1
}
}
) / divisor + bias

値が"true"の場合、畳み込みは色チャネルのみに適用されます。この場合、フィルタは一時的に色成分値のプリマルチプライを解除し、カーネルを適用します。この場合、特定のピクセルに対する畳み込み式ALPHAX,Yは以下の通りです:

ALPHAX,Y = SOURCEX,Y

初期値preserveAlphaに対してfalseです。

アニメーション可能: はい。

9.10. フィルタプリミティブ feDiffuseLighting

名前: feDiffuseLighting
カテゴリ: フィルタプリミティブ
内容モデル: 任意の数の 記述要素script、および正確に1つの光源要素を任意の順序で含む。
属性:
DOMインターフェース: SVGFEDiffuseLightingElement

このフィルタプリミティブは、アルファチャンネルをバンプマップとして使用して画像に光を当てます。生成される画像は、アルファ=1.0の場所で光の色に基づいたRGBA不透明画像です。照明計算はPhong照明モデルの標準的な拡散成分に従います。生成される画像は、光の色、光の位置、入力バンプマップの表面形状に依存します。

このフィルタプリミティブによって生成される光マップは、arithmeticfeComposite合成法の乗算項を使用してテクスチャ画像と組み合わせることができます。複数の光源をシミュレートするには、これらの光マップを複数追加してからテクスチャ画像に適用します。

以下の式は3x3フィルタを使用します。これらはピクセルに基づいて動作するため、本質的に解像度依存です。feDiffuseLightingで解像度非依存の結果を得るには、属性kernelUnitLengthに明示的な値を指定する必要があります。

kernelUnitLengthは、他の属性と組み合わせて、フィルタ効果の座標系(すなわちprimitiveUnits属性によって確立される座標系)における暗黙的なピクセルグリッドを定義します。入力画像は一時的にリスケールされ、kernelUnitLengthとピクセルが一致するよう調整されます。3x3フィルタはリサンプリングされた画像に適用されます。フィルタ適用後、画像は元の解像度に再サンプリングされます。

注: 利用可能な補間の速度によって、この選択はimage-renderingプロパティ設定に影響される場合があります。

注: 実装によっては、適切な結果を得るためにリサンプリングが不要である場合(例えば、ドキュメントがズームアウトされて、kernelUnitLengthがデバイスピクセルよりもかなり小さい場合など)には、リサンプリングを最小化または排除するアプローチを選択することがあります。

以下の式では、Norm(Ax,Ay,Az)関数は次のように定義されます:

Norm ( A x , A y , A z ) = A x 2 + A y 2 + A z 2 Norm(A_x,A_y,A_z) = sqrt { A_x^2+A_y^2+A_z^2}

注: ユーザーエージェントは、極値の色値における時間差を回避するために「高速逆平方根」を使用してこの方程式を最適化する場合があります。タイミング攻撃に関する詳細については、プライバシーとセキュリティの考慮事項セクションを参照してください。

生成されるRGBA画像は次のように計算されます:

Dr = kd * N.L * Lr
Dg = kd * N.L * Lg
Db = kd * N.L * Lb
Da = 1.0

ここで

kd = 拡散照明定数
N = 表面法線単位ベクトル (xとyの関数)
L = 表面から光への単位ベクトル(点光やスポットライトの場合はxとyの関数)
Lr,Lg,Lb = 光のRGB成分(スポットライトの場合はxとyの関数)

Nはxとyの関数であり、表面勾配に依存して次のように計算されます:

入力アルファ画像I(x,y)で表現される表面は以下の通りです:

Z (x,y) = surfaceScale * I(x,y)

表面法線はSobel勾配3x3フィルタを使用して計算されます。与えられたピクセルが内部にあるかエッジにあるかによって異なるフィルタカーネルが使用されます。各ケースにおける式は次の通りです:

Nx (x,y) = - surfaceScale * FACTORx *
(Kx(0,0)*I(x-dx,y-dy) + Kx(1,0)*I(x,y-dy) + Kx(2,0)*I(x+dx,y-dy) +
Kx(0,1)*I(x-dx,y) + Kx(1,1)*I(x,y) + Kx(2,1)*I(x+dx,y) +
Kx(0,2)*I(x-dx,y+dy) + Kx(1,2)*I(x,y+dy) + Kx(2,2)*I(x+dx,y+dy))
Ny (x,y) = - surfaceScale * FACTORy *
(Ky(0,0)*I(x-dx,y-dy) + Ky(1,0)*I(x,y-dy) + Ky(2,0)*I(x+dx,y-dy) +
Ky(0,1)*I(x-dx,y) + Ky(1,1)*I(x,y) + Ky(2,1)*I(x+dx,y) +
Ky(0,2)*I(x-dx,y+dy) + Ky(1,2)*I(x,y+dy) + Ky(2,2)*I(x+dx,y+dy))
Nz (x,y) = 1.0

N = (Nx, Ny, Nz) / Norm((Nx,Ny,Nz))

これらの式では、dx および dyの値(例: I(x-dx,y-dy))は、特定の(x,y)位置における表面の傾斜を推定するためのデルタを表します。このデルタは、属性kernelUnitLengthの値(明示的または暗黙的)によって決定されます。

左上隅: 上部行: 右上隅:

FACTORx=2/(3*dx)
Kx =
| 0 0 0 |
| 0 -2 2 |
| 0 -1 1 |

FACTORy=2/(3*dy)
Ky =
| 0 0 0 |
| 0 -2 -1 |
| 0 2 1 |

FACTORx=1/(3*dx)
Kx =
| 0 0 0 |
| -2 0 2 |
| -1 0 1 |

FACTORy=1/(2*dy)
Ky =
| 0 0 0 |
| -1 -2 -1 |
| 1 2 1 |

FACTORx=2/(3*dx)
Kx =
| 0 0 0 |
| -2 2 0 |
| -1 1 0 |

FACTORy=2/(3*dy)
Ky =
| 0 0 0 |
| -1 -2 0 |
| 1 2 0 |

左列: 内部ピクセル: 右列:

FACTORx=1/(2*dx)
Kx =
| 0 -1 1 |
| 0 -2 2 |
| 0 -1 1 |

FACTORy=1/(3*dy)
Ky =
| 0 -2 -1 |
| 0 0 0 |
| 0 2 1 |

FACTORx=1/(4*dx)
Kx =
| -1 0 1 |
| -2 0 2 |
| -1 0 1 |

FACTORy=1/(4*dy)
Ky =
| -1 -2 -1 |
| 0 0 0 |
| 1 2 1 |

FACTORx=1/(2*dx)
Kx =
| -1 1 0|
| -2 2 0|
| -1 1 0|

FACTORy=1/(3*dy)
Ky =
| -1 -2 0 |
| 0 0 0 |
| 1 2 0 |

左下隅: 下部行: 右下隅:

FACTORx=2/(3*dx)
Kx =
| 0 -1 1 |
| 0 -2 2 |
| 0 0 0 |

FACTORy=2/(3*dy)
Ky =
| 0 -2 -1 |
| 0 2 1 |
| 0 0 0 |

FACTORx=1/(3*dx)
Kx =
| -1 0 1 |
| -2 0 2 |
| 0 0 0 |

FACTORy=1/(2*dy)
Ky =
| -1 -2 -1 |
| 1 2 1 |
| 0 0 0 |

FACTORx=2/(3*dx)
Kx =
| -1 1 0 |
| -2 2 0 |
| 0 0 0 |

FACTORy=2/(3*dy)
Ky =
| -1 -2 0 |
| 1 2 0 |
| 0 0 0 |

L(画像サンプルから光への単位ベクトル)は次のように計算されます:

無限光源の場合、Lは定数です:

Lx = cos(azimuth)*cos(elevation)
Ly = sin(azimuth)*cos(elevation)
Lz = sin(elevation)

点光およびスポットライトの場合、Lは位置の関数です:

Lx = Lightx - x
Ly = Lighty - y
Lz = Lightz - Z(x,y)

L = (Lx, Ly, Lz) / Norm(Lx, Ly, Lz)

ここで、Lightx、Lighty、Lightzは入力光源の位置を示します。

Lr,Lg,Lb(光の色ベクトル)は、スポットライトの場合にのみ位置の関数です:

Lr = Lightr*pow((-L.S),specularExponent)
Lg = Lightg*pow((-L.S),specularExponent)
Lb = Lightb*pow((-L.S),specularExponent)

ここで、Sは光からx-y平面上の点(pointsAtX, pointsAtY, pointsAtZ)への単位ベクトルです:

Sx = pointsAtX - Lightx
Sy = pointsAtY - Lighty
Sz = pointsAtZ - Lightz

S = (Sx, Sy, Sz) / Norm(Sx, Sy, Sz)

L.Sが正の場合、光は存在しません(Lr = Lg = Lb = 0)。limitingConeAngleが指定されている場合、-L.S < cos(limitingConeAngle)も光が存在しないことを示します。

属性の定義:

surfaceScale = "<number>"

Ain = 1のときの表面の高さ。

この属性が指定されていない場合、1の値が指定されたかのように効果が適用されます。

アニメーション可能: はい。

diffuseConstant = "<number>"

Phong照明モデルにおけるkd。SVGでは、これは非負の任意の数値で指定可能です。

この属性が指定されていない場合、1の値が指定されたかのように効果が適用されます。

アニメーション可能: はい。

kernelUnitLength = "<number-optional-number>"

最初の数値は<dx>値を表します。2番目の数値は<dy>値を表します。<dy>値が指定されていない場合、<dx>値と同じ値がデフォルトとなります。primitiveUnits属性によって決定される現在のフィルタ単位で、dxおよびdyの間隔を示します。表面法線計算式において、kernelUnitLengthに値を指定することで、カーネルが拡張可能な抽象座標系で定義されます。kernelUnitLengthが指定されていない場合、dxおよびdy値は、特定の(x,y)位置に対する非常に小さいデルタとして表現されるべきです。これは中間画像のオフスクリーンビットマップ(ピクセルベースの座標系)として実装される場合があり、拡張性がない可能性があります。表示メディアやユーザーエージェント間での一貫性をある程度確保するために、kernelUnitLengthに値を指定する必要があります。

負の値またはゼロ値が指定された場合、デフォルト値が使用されます。

注: この属性は非推奨であり、削除される予定です。プラットフォームに依存しない結果を作成する信頼性のある方法を提供しません。この仕様の将来のバージョンでは、この使用ケースをカバーする予定です。

アニメーション可能: はい。

光源は、子要素feDistantLightfePointLight、またはfeSpotLightのいずれかによって定義されます。光の色はプロパティlighting-colorで指定されます。

9.11. フィルタプリミティブ feDisplacementMap

名前: feDisplacementMap
カテゴリ: フィルタプリミティブ
内容モデル: 任意の数の 記述要素animatescriptset 要素を任意の順序で含む。
属性:
DOMインターフェース: SVGFEDisplacementMapElement

実装が仕様と一致しません。<https://github.com/w3c/csswg-drafts/issues/113>

このフィルタプリミティブは、in2からの画像のピクセル値を使用して、inからの画像を空間的に変位させます。実行される変換は次の通りです:

P'(x,y) ← P( x + scale * (XC(x,y) - .5), y + scale * (YC(x,y) - .5))

ここで、P(x,y) は入力画像in、P'(x,y) は出力画像です。XC(x,y) と YC(x,y) は、xChannelSelectoryChannelSelector によって指定されたチャンネルの成分値です。例えば、in2のR成分をx方向の変位制御に使用し、Image2のG成分をy方向の変位制御に使用する場合、xChannelSelectorを "R" に、yChannelSelectorを "G" に設定します。

変位マップin2は、実行されるマッピングの逆を定義します。

入力画像inは、このフィルタプリミティブに対してプリマルチプライされたままでなければなりません。in2からのピクセル値を使用した計算は、プリマルチプライされていない色値を使用して実行されます。

このフィルタは、入力に対して任意の非局所的な効果を持つ可能性があり、処理パイプラインにおいて大幅なバッファリングが必要になる場合があります。しかし、この形式では、任意の中間バッファリングの必要性は、xまたはyのいずれかの最大変位範囲を表すscaleによって決定できます。

このフィルタを適用する際、ソースピクセル位置はしばしば複数のソースピクセル間に位置することがあります。

注: 利用可能な補間の速度によって、この選択はimage-renderingプロパティ設定に影響される場合があります。

注: この仕様の将来のバージョンでは、ソース画像を歪める際に使用される補間方法を定義し、ユーザーエージェントのレンダリング結果の互換性を向上させる予定です。

color-interpolation-filtersプロパティは、in2ソース画像にのみ適用され、inソース画像には適用されません。inソース画像は現在のカラースペースにそのまま保持される必要があります。

属性の定義:

scale = "<number>"

変位スケールファクター。この量は、primitiveUnits属性によって確立された座標系で表現されます。

この属性の値が0の場合、この操作はソース画像に影響を与えません。

初期値scaleに対して0です。

アニメーション可能: はい。

xChannelSelector = "R | G | B | A"

in2からどのチャンネルを使用してin内のピクセルをx軸方向に変位させるかを示します。

初期値xChannelSelectorに対してAです。

アニメーション可能: はい。

yChannelSelector = "R | G | B | A"

in2からどのチャンネルを使用してin内のピクセルをy軸方向に変位させるかを示します。

初期値yChannelSelectorに対してAです。

アニメーション可能: はい。

in2 = "(in属性を参照)"

2番目の入力画像。この画像はin属性からの画像内のピクセルを変位させるために使用されます。in属性の定義を参照してください。

アニメーション可能: はい。

9.12. フィルタプリミティブ feDropShadow

名前: feDropShadow
カテゴリ: フィルタプリミティブ
内容モデル: 任意数の記述的要素animatescriptset 要素を任意の順序で含めることができます。
属性:
DOMインターフェイス: SVGFEDropShadowElement

このフィルターは入力画像のドロップシャドウを生成します。これは短縮フィルターであり、他のフィルタプリミティブを組み合わせて定義されています。実装によってより最適化されやすいことが期待されています。

feDropShadowフィルタプリミティブの結果は、次のものと同等です:

<feGaussianBlur in="alpha-channel-of-feDropShadow-in"   stdDeviation="stdDeviation-of-feDropShadow"/>
<feOffset dx="dx-of-feDropShadow"   dy="dy-of-feDropShadow" result="offsetblur"/>
<feFlood flood-color="flood-color-of-feDropShadow"  flood-opacity="flood-opacity-of-feDropShadow"/>
<feComposite in2="offsetblur" operator="in"/>
<feMerge>
  <feMergeNode/>
  <feMergeNode in="in-of-feDropShadow"/>
</feMerge>

上記をステップに分けると:

  1. feDropShadowフィルタプリミティブへの入力のアルファチャンネルと、feDropShadowstdDeviationを取得し、次のfeGaussianBlurが適用されたかのように処理します:

    <feGaussianBlur in="alpha-channel-of-feDropShadow-in" stdDeviation="stdDeviation-of-feDropShadow"/>
    
  2. ステップ1の結果を、dxおよび dyでオフセットします。これらはfeDropShadow要素で指定されており、次のfeOffsetがこれらのパラメータで適用されたのと同等です:

    <feOffset dx="dx-of-feDropShadow" dy="dy-of-feDropShadow" result="offsetblur"/>
    
  3. 次のfeFlood要素(flood-colorflood-opacityfeDropShadowで指定)を適用するかのように処理します:

    <feFlood flood-color="flood-color-of-feDropShadow" flood-opacity="flood-opacity-of-feDropShadow"/>
    
  4. ステップ3のfeFloodの結果と、ステップ2のfeOffsetの結果を、feCompositeフィルタプリミティブ(operator="in")で合成したかのように処理します:

    <feComposite in2="offsetblur" operator="in"/>
    
  5. 最後に、前のステップの結果を次のfeMergeが実行されたかのようにマージします:

    <feMerge>
      <feMergeNode/>
      <feMergeNode in="in-of-feDropShadow"/>
    </feMerge>
    

注: feDropShadowフィルタプリミティブの定義は同等のツリーに展開できるとされていますが、必ずしもそのように実装する必要はありません。ユーザーエージェントはすべてのステップを個別に処理することなく、効率的に最適化できることが期待されています。

DOMインターフェイスSVGFEDropShadowElement以外には、feDropShadowフィルタプリミティブの内部にアクセスする方法はありません。つまり、もしフィルタプリミティブが同等のツリーとして実装された場合でも、そのツリーはDOMに公開してはなりません。

属性定義:

dx = "<number>"

ドロップシャドウのx方向オフセット。

初期値dxに対して2です。

この属性は内部のdx属性(feOffset要素)に転送されます。

アニメーション可能: 可。

dy = "<number>"

ドロップシャドウのy方向オフセット。

初期値dyに対して2です。

この属性は内部のdy属性(feOffset要素)に転送されます。

アニメーション可能: 可。

stdDeviation = "<number-optional-number>"

ドロップシャドウのぼかし処理に用いる標準偏差。

初期値stdDeviationに対して2です。

この属性は内部のstdDeviation属性(feGaussianBlur要素)に転送されます。

アニメーション可能: 可。

9.13. フィルタプリミティブ feFlood

名前: feFlood
カテゴリ: フィルタプリミティブ
内容モデル: 任意数の記述的要素animatescriptset 要素を任意の順序で含めることができます。
属性:
DOMインターフェイス: SVGFEFloodElement

このフィルタプリミティブは、プロパティflood-colorおよびflood-opacityの色と不透明度で塗りつぶされた矩形を生成します。この矩形は、フィルタプリミティブサブリージョンfeFlood要素によって確立される)と同じ大きさです。

9.13.1. flood-colorプロパティ

名前: flood-color
値: <color>
初期値: black
適用対象: feFloodおよびfeDropShadow 要素
継承: いいえ
パーセンテージ: 該当なし
算出値: 指定通り
正規順序: 文法通り
メディア: 視覚
アニメーション可能: 算出値による

flood-colorプロパティは、現行のフィルタプリミティブサブリージョンを塗りつぶす色を指定します。

flood-colorプロパティはSVG要素のプレゼンテーション属性です。

9.13.2. flood-opacityプロパティ

名前: flood-opacity
値: <alpha-value>
初期値: 1
適用対象: feFloodおよびfeDropShadow 要素
継承: いいえ
パーセンテージ: 該当なし
算出値: 指定値を数値に変換し、[0,1]範囲にクランプ
正規順序: 文法通り
メディア: 視覚
アニメーション可能: 算出値による

flood-opacityプロパティは、フィルタプリミティブサブリージョン全体で使用される不透明度値を定義します。flood-color値がアルファチャンネルを含む場合、そのアルファチャンネルはこのflood-opacityプロパティの算出値と乗算されます。

flood-opacityプロパティはSVG要素のプレゼンテーション属性です。

9.14. フィルタプリミティブ feGaussianBlur

名前: feGaussianBlur
カテゴリ: フィルタプリミティブ
内容モデル: 任意数の記述的要素animatescriptset 要素を任意の順序で含めることができます。
属性:
DOMインターフェイス: SVGFEGaussianBlurElement

このフィルタプリミティブは入力画像にガウスぼかし処理を行います。

ガウスぼかしカーネルは正規化畳み込みの近似です:

G(x,y) = H(x)I(y)

ここで

H(x) = exp(-x2/ (2s2)) / sqrt(2π * s2)

および

I(y) = exp(-y2/ (2t2)) / sqrt(2π * t2)

ここで"s"はx方向の標準偏差、"t"はy方向の標準偏差であり、stdDeviationで指定されます。

stdDeviationの値は1つまたは2つの数値です。2つの場合、最初の数値は座標系のx軸方向の標準偏差、2つ目はY方向の標準偏差を表します。1つの場合、その値がXとY両方に使用されます。

stdDeviationが1つの値のみでも、分離可能な畳み込みとして実装できます。

"s"が大きい場合(s >= 2.0)、近似が利用できます: 3回連続したボックスぼかしで区分的二次畳み込みカーネルを構成すると、ガウスカーネルを約3%以内で近似できます。

let d = floor(s * 3 * sqrt(2 * π) / 4 + 0.5)

... dが奇数ならサイズ"d"のボックスぼかし3回を実行し、出力ピクセル中心で行います。

... dが偶数なら、サイズ"d"のボックスぼかし2回(1つ目は出力ピクセルと左隣のピクセル境界中心、2つ目は出力ピクセルと右隣のピクセル境界中心)、さらにサイズ"d+1"のボックスぼかし1回を出力ピクセル中心で行います。

この近似式は"t"にも対応します。

多くの場合、この処理はアルファ値のみの画像(例えば組み込み入力のSourceAlpha)に対して行われます。実装はこれに気付き、単一チャンネルの場合は最適化できます。ただしプライバシー上の懸念がある場合はこの最適化を行ってはなりません(詳細はプライバシーとセキュリティに関する考慮事項参照)。入力が無限に広がり、定数の場合(例: FillPaintで塗りが単色の場合)、この処理は効果がありません。入力が無限に広がり、フィルター結果が(塗りが単色の場合)feTileへの入力となる場合、フィルターは周期的境界条件で評価されます。

属性定義:

stdDeviation = "<number-optional-number>"

ぼかし処理に用いる標準偏差。2つの<number>を指定すると、最初はprimitiveUnits属性で定義される座標系のx軸方向の標準偏差、2つ目はY方向の標準偏差となります。1つの場合、その値はXとY両方に使用されます。

負またはゼロの場合はフィルタプリミティブの効果を無効化します(すなわち、結果はフィルターの入力画像となります)。

stdDeviationがXかYのいずれかのみ0の場合、ぼかしは非ゼロ方向にのみ適用されます。

初期値stdDeviationに対して0です。

アニメーション可能: 可。

edgeMode = "duplicate | wrap | none"

入力画像の端付近でカーネル処理を適用するために、画像をどのように拡張するかを決定します。

duplicateは、入力画像の端の色値を必要に応じて複製して拡張します。

元画像がN×Mの場合、m=M-1、n=N-1:

wrapは、画像の反対側の端から色値を取得して拡張します。

noneは、R,G,B,Aの全ピクセル値をゼロで拡張することを示します。

初期値edgeModeに対してnoneです。

アニメーション可能: 可。

この章の冒頭の例ではfeGaussianBlurフィルタプリミティブを利用してドロップシャドウ効果を生成しています。

9.15. フィルタプリミティブ feImage

名前: feImage
カテゴリ: フィルタプリミティブ
内容モデル: 任意数の記述的要素animateanimateTransformscriptset 要素を任意の順序で含めることができます。
属性:
DOMインターフェイス: SVGFEImageElement

このフィルタプリミティブは、このフィルター要素の外部のグラフィックを参照し、それを読み込んでレンダリングし、RGBAラスターとしてフィルタプリミティブの結果とします。

このフィルタプリミティブは外部画像を参照することも、別のSVG要素を参照することもできます。内蔵画像ソースSourceGraphicに似ていますが、グラフィックは外部ソースから取得されます。

hrefがJPEG、PNG、SVGなど単体の画像リソースを参照する場合、その画像リソースはimage要素の挙動に従ってレンダリングされます。それ以外の場合は参照されたリソースはuse要素の挙動に従ってレンダリングされます。いずれの場合も、現在のユーザー座標系はprimitiveUnits属性(filter要素)によって決まります。preserveAspectRatio属性の処理はfeImage要素とimage要素で同一です。

空画像(幅または高さがゼロ)、ダウンロード失敗、存在しない、表示できない(対応画像形式でないなど)参照の場合、フィルタプリミティブサブ領域は透明な黒で塗りつぶされます。

参照画像をデバイス座標系に合わせてリサンプリングする必要がある場合、高品質なビューアは適切な補間技法(バイリニアやバイキュービックなど)を利用することが推奨されます。 利用可能な補間の速度によっては、image-renderingプロパティの設定によってこの選択が影響される場合があります。

属性定義:

xlink:href = "<url>"

href属性を参照。

アニメーション可能: 可。

注: このxlink:href属性は廃止予定のため新しいコンテンツでは使用しないでください。後方互換性のためにのみ含まれます。新規作成ではhref属性を使用してください。

href = "<url>"

画像リソースまたは要素への<url>xlink:href属性とhref属性の両方が指定されている場合は、後者が優先されます。

アニメーション可能: 可。

preserveAspectRatio = "[defer] <align> [<meetOrSlice>]"

preserveAspectRatioを参照。

初期値preserveAspectRatioに対してxMidYMid meetです。

アニメーション可能: 可。

crossorigin = "anonymous | use-credentials"

crossorigin属性はCORS設定属性です。第三者サイトからクロスオリジンアクセスを許可する画像をfeDisplacementMapで利用できるようにします。定義はcrossorigin属性(imgタグ[HTML5])および本仕様のプライバシーとセキュリティに関する考慮事項を参照してください。

アニメーション可能: 不可。

以下の例は画像のオブジェクトへの配置方法を示します。左から右へ:

<svg width="600" height="250" viewBox="0 0 600 250"
     xmlns="http://www.w3.org/2000/svg"
     xmlns:xlink="http://www.w3.org/1999/xlink">
  <title>feImageの例 - feImageの使用例</title>
  <desc>feImageの使用例を3つ示します。1つ目はデフォルト描画、2つ目はボックスに合わせた画像、3つ目は画像の移動とクリップ。</desc>
  <defs>
    <filter id="Default">
      <feImage xlink:href="smiley.png" />
    </filter>
    <filter id="Fitted" primitiveUnits="objectBoundingBox">
      <feImage xlink:href="smiley.png"
         x="0" y="0" width="100%" height="100%"
         preserveAspectRatio="none"/>
    </filter>
    <filter id="Shifted">
      <feImage xlink:href="smiley.png"
         x="500" y="5"/>
    </filter>
  </defs>
  <rect fill="none" stroke="blue"
        x="1" y="1" width="598" height="248"/>
  <g>
    <rect x="50"  y="25" width="100" height="200" filter="url(#Default)"/>
    <rect x="50"  y="25" width="100" height="200" fill="none" stroke="green"/>
    <rect x="250" y="25" width="100" height="200" filter="url(#Fitted)"/>
    <rect x="250" y="25" width="100" height="200" fill="none" stroke="green"/>
    <rect x="450" y="25" width="100" height="200" filter="url(#Shifted)"/>
    <rect x="450" y="25" width="100" height="200" fill="none" stroke="green"/>
  </g>
</svg>
Example feImage — Examples of feImage use

feImageの例

この例をSVGで表示

9.16. フィルタプリミティブ feMerge

名前: feMerge
カテゴリ: フィルタプリミティブ
内容モデル: 任意数の記述的要素feMergeNodescript要素を任意の順序で含めることができます。
属性:
DOMインターフェイス: SVGFEMergeElement

このフィルタプリミティブは、入力画像レイヤーをover演算子で重ね合わせて合成します。最初のInput1(最初のfeMergeNode子要素)が下になり、最後の指定入力InputN(最後のfeMergeNode子要素)が上になります。

多くの効果は最終出力画像を作るために複数の中間レイヤーを生成します。このフィルターを使うことでそれらを1つの画像にまとめることができます。n-1個のComposite-filterで同様の処理も可能ですが、この形式で共通の操作として提供することで実装に柔軟性が得られます。

feMerge 要素には任意数のfeMergeNodeサブ要素を含めることができ、それぞれがin属性を持ちます。

feMergeの標準的な実装は、全体の効果を1つのRGBAレイヤーにレンダリングし、それを出力デバイスにレンダリングすることです。場合によっては(特に出力デバイスが連続階調デバイスの場合)、合成が可換であるため、1レイヤーずつ順に効果を評価して下から上へ個別にレンダリングすることで十分な近似が得られることもあります。

最上位の画像入力がSourceGraphicであり、このfeMergeがフィルター内の最後のフィルタプリミティブの場合は、そこまでのレイヤーをレンダリングした後、SourceGraphicをベクター記述から直接最上位にレンダリングすることが推奨されます。

この章の冒頭の例feMergeフィルタプリミティブを用いて2つの中間フィルター結果を合成しています。

9.16.1. マージノード feMergeNode

名前: feMergeNode
カテゴリ: なし
内容モデル: 任意数の記述的要素animatescriptset 要素を任意の順序で含めることができます。
属性:
DOMインターフェイス: SVGFEMergeNodeElement

9.17. フィルタプリミティブ feMorphology

名前: feMorphology
カテゴリ: フィルタプリミティブ
内容モデル: 任意数の記述的要素animatescriptset 要素を任意の順序で含めることができます。
属性:
DOMインターフェイス: SVGFEMorphologyElement

このフィルタプリミティブは、アートワークの「太らせ」または「細らせ」処理を行います。特にアルファチャンネルの太らせや細らせに有用です。

膨張(dilation)または収縮(erosion)カーネルは幅2*x-radius、高さ2*y-radiusの矩形です。膨張の場合、出力ピクセルは入力画像のカーネル矩形内の対応するR,G,B,A値のコンポーネントごとの最大値となります。収縮の場合、出力ピクセルはカーネル矩形内の対応するR,G,B,A値のコンポーネントごとの最小値となります。

多くの場合、この処理はアルファ値のみの画像(例えば組み込み入力のSourceAlpha)に対して行われます。その場合、実装は単一チャンネルの場合の最適化を行うことも可能です。ただしプライバシー上の懸念がある場合は、この最適化は行ってはなりません(詳細はプライバシーとセキュリティに関する考慮事項参照)。

入力が無限に広がり、定数の場合(例: FillPaintで塗りが単色の場合)、この処理は効果がありません。入力が無限に広がり、フィルター結果がfeTileへの入力となる場合、フィルターは周期的境界条件で評価されます。

feMorphologyはプリマルチプライドカラー値(アルファ値で乗算済み色値)を処理するため、常に色値はアルファチャンネル以下となります。

属性定義:

operator = "erode | dilate"

元画像を収縮(細らせ)または膨張(太らせ)するかを示すキーワード。

初期値operatorに対してerodeです。

アニメーション可能: 可。

radius = "<number-optional-number>"

この処理の半径(または半径群)。2つの<number>を指定すると、最初はx-radius、2つ目はy-radiusを表します。1つの場合はその値がXとY両方に使われます。値はprimitiveUnits属性(filter要素)で定義される座標系で指定します。

負またはゼロの場合はフィルタプリミティブの効果を無効化します(すなわち、結果はフィルターの入力画像となります)。

初期値radiusに対して0です。

アニメーション可能: 可。

<svg width="5cm" height="7cm" viewBox="0 0 700 500"
     xmlns="http://www.w3.org/2000/svg">
  <title>feMorphologyの例 - erodeとdilateの例</title>
  <desc>輪郭で描画された5つのテキスト文字列。
        1つ目はフィルターなし。2つ目と3つ目は「erode」使用。
        4つ目と5つ目は「dilate」使用。</desc>
  <defs>
    <filter id="Erode3">
      <feMorphology operator="erode" in="SourceGraphic" radius="3" />
    </filter>
    <filter id="Erode6">
      <feMorphology operator="erode" in="SourceGraphic" radius="6" />
    </filter>
    <filter id="Dilate3">
      <feMorphology operator="dilate" in="SourceGraphic" radius="3" />
    </filter>
    <filter id="Dilate6">
      <feMorphology operator="dilate" in="SourceGraphic" radius="6" />
    </filter>
  </defs>
  <rect fill="none" stroke="blue" stroke-width="2"
        x="1" y="1" width="698" height="498"/>
  <g isolation="isolate" >
    <g font-family="Verdana" font-size="75"
              fill="none" stroke="black" stroke-width="6" >
      <text x="50" y="90">フィルターなし</text>
      <text x="50" y="180" filter="url(#Erode3)" >Erode 半径 3</text>
      <text x="50" y="270" filter="url(#Erode6)" >Erode 半径 6</text>
      <text x="50" y="360" filter="url(#Dilate3)" >Dilate 半径 3</text>
      <text x="50" y="450" filter="url(#Dilate6)" >Dilate 半径 6</text>
    </g>
  </g>
</svg>
Example of feMorphology

feMorphologyの例

この例をSVGで表示

9.18. フィルタプリミティブ feOffset

名前: feOffset
カテゴリ: フィルタプリミティブ
内容モデル: 任意数の記述的要素animatescriptset 要素を任意の順序で含めることができます。
属性:
DOMインターフェイス: SVGFEOffsetElement

このフィルタプリミティブは、入力画像を画像空間内の現在位置から指定されたベクトル分だけオフセット(移動)します。

これはドロップシャドウなどの効果に重要です。

このフィルターを適用する際、出力位置がデバイス空間上で1ピクセル未満だけオフセットされる場合があります。 この場合、高品質ビューアは適切な補間技法(バイリニアやバイキュービックなど)を利用することが推奨されます。 この補間は特に動的ビューアで画像の動きが滑らかになるため推奨されます。静的ビューアではそれほど重要ではありません。著者の意図を判断するためにはimage-renderingプロパティ設定にも注意が必要です。

属性定義:

dx = "<number>"

入力グラフィックをx軸方向にオフセットする量。オフセット量はprimitiveUnits属性(filter要素)で定義される座標系で表されます。

初期値dxに対して0です。

アニメーション可能: 可。

dy = "<number>"

入力グラフィックをy軸方向にオフセットする量。オフセット量はprimitiveUnits属性(filter要素)で定義される座標系で表されます。

初期値dyに対して0です。

アニメーション可能: 可。

この章の冒頭の例feOffsetフィルタプリミティブを利用して、ドロップシャドウを元のソースグラフィックからずらしています。

9.19. フィルタプリミティブ feSpecularLighting

名前: feSpecularLighting
カテゴリ: フィルタプリミティブ
内容モデル: 任意数の記述的要素script、そして1つの光源要素が、任意の順序で含まれます。
属性:
DOMインターフェイス: SVGFESpecularLightingElement

このフィルタプリミティブは、アルファチャンネルをバンプマップとして利用して、ソースグラフィックに光を当てます。結果画像は光の色に基づいたRGBA画像となります。ライティング計算はBlinn-Phongライティングモデルの標準的な鏡面反射成分に従います。結果画像は光の色・光源位置・入力バンプマップの表面形状に依存します。ライティング計算の結果が加算されます。ビューアはz方向無限遠(すなわち、視線方向の単位ベクトルは常に(0,0,1))と仮定します。

注: このフィルタプリミティブは、ライティング計算の鏡面反射部分を含む画像を生成します。このマップは、arithmeticadd項(feCompositeメソッド)を使って、2つ目のフィルタプリミティブのテクスチャと合成することを想定しています。複数の光源をシミュレートする場合は、これらのライトマップを合成してからテクスチャ画像へ適用します。

結果のRGBA画像は次のように計算されます:

Sr = ks * pow(N.H, specularExponent) * Lr
Sg = ks * pow(N.H, specularExponent) * Lg
Sb = ks * pow(N.H, specularExponent) * Lb
Sa = max(Sr, Sg, Sb)

ここで

ks = 鏡面反射光定数
N = 表面法線の単位ベクトル、xとyの関数
H = 視線単位ベクトルと光源単位ベクトルの「中間」単位ベクトル

Lr,Lg,Lb = 光源のRGB成分

Nおよび(Lr, Lg, Lb)の定義はfeDiffuseLightingを参照してください。

Hの定義は、視線ベクトルE=(0,0,1)が一定であるという仮定に基づきます:

H = (L + E) / Norm(L+E)

ここでLは光源単位ベクトルです。

feDiffuseLightingとは異なり、feSpecularLighting フィルターは不透明ではない画像を生成します。これは鏡面反射結果(Sr,Sg,Sb,Sa)がテクスチャ画像へ加算されることを意図しているためです。結果のアルファチャンネルは色成分の最大値となり、鏡面光がゼロの箇所では画像への追加的なカバレージは加わらず、完全な白のハイライトでは不透明度が加算されます。

feDiffuseLightingfeSpecularLighting フィルターは併用されることが多いです。実装はこれを検知して両方のマップを一度に計算することも可能です。

属性定義:

surfaceScale = "<number>"

Ain = 1のときの表面の高さ。

初期値surfaceScaleに対して1です。

アニメーション可能: 可。

specularConstant = "<number>"

Phongライティングモデルのks。SVGでは0以上の任意の数値。

初期値specularConstantに対して1です。

アニメーション可能: 可。

specularExponent = "<number>"

鏡面成分の指数。大きいほど「光沢」が強くなります。

初期値specularExponentに対して1です。

アニメーション可能: 可。

kernelUnitLength = "<number-optional-number>"

最初の数値が<dx>値。2番目の数値が<dy>値です。

<dy>値を指定しない場合は<dx>値と同じになります。現在のフィルター単位(primitiveUnits属性で決定される単位)で、dxdyの意図する距離を示します(表面法線計算式参照)。kernelUnitLength値を指定すると、カーネルが抽象座標系でスケーラブルに定義されます。

kernelUnitLengthを指定しない場合、dxdyは、与えられた(x,y)位置に対して非常に小さなデルタを表すべきであり、場合によっては中間画像オフスクリーンビットマップの1ピクセルとして実装されることもあり、この場合はピクセルベース座標系となり、スケーラブルではない可能性があります。表示媒体やユーザーエージェント間で一定の一貫性を保つためには、kernelUnitLength値の指定が必要です。

アニメーション可能: 可。

光源は子要素のfeDistantLightfePointLight、またはfeSpotLightで定義します。光の色はプロパティlighting-colorで指定します。

この章の冒頭の例feSpecularLighting フィルタプリミティブを使って、非常に反射性が高い3D発光効果を実現しています。

9.20. フィルタプリミティブ feTile

名前: feTile
カテゴリ: フィルタプリミティブ
内容モデル: 任意数の記述的要素animatescriptset 要素を任意の順序で含めることができます。
属性:
DOMインターフェイス: SVGFETileElement

このフィルタプリミティブは、入力画像の繰り返しタイルパターンでターゲット矩形を塗りつぶします。ターゲット矩形はフィルタプリミティブサブリージョンfeTile要素によって確立される)の大きさです。

通常、入力画像は自身のフィルタプリミティブサブリージョンでタイル基準を定義します。feTileは基準タイルをX方向とY方向に複製し、ターゲット矩形全体を埋めます。各タイルの左上隅は(x + i*width, y + j*height)の位置になり、(x,y)は入力画像のフィルタプリミティブサブリージョンの左上、widthheightは入力画像のフィルタプリミティブサブリージョンの幅と高さ、ijは任意の整数値です。多くの場合、入力画像のフィルタプリミティブサブリージョンfeTileよりも小さくし、繰り返しパターン効果を得ます。

実装者は、タイル画像を構築する際にタイル間のアーティファクトを避けるため適切な対策を取る必要があります。特にユーザーからデバイスへの変換がシアーや回転を含む場合は注意が必要です。十分な配慮がなければ、補間によってタイル端のピクセルが、隣接タイルと重複するピクセルの相互作用で予期しない不透明度になる場合があります。

9.21. フィルタプリミティブ feTurbulence

名前: feTurbulence
カテゴリ: フィルタプリミティブ
内容モデル: 任意数の記述的要素animatescriptset 要素を任意の順序で含めることができます。
属性:
DOMインターフェイス: SVGFETurbulenceElement

このフィルタプリミティブは、Perlin乱流関数を使って画像を生成します。雲や大理石のような人工テクスチャの合成が可能です。Perlin乱流関数の詳細は「Texturing and Modeling」[TaM]参照。生成された画像は、このフィルタプリミティブのフィルタプリミティブサブリージョン全体を埋めます。

1オクターブだけ合成することで帯域制限ノイズを作ることも可能です。

以下のCコードは、このフィルター効果で使われている正確なアルゴリズムを示します。フィルタプリミティブサブリージョンは引数fTileX, fTileY, fTileWidth, fTileHeightとして渡されます。

fractalSumの場合、turbFunctionResultは-1から1の範囲(場合によってはこの範囲を超えることもあります)を目指します。色やアルファ値への変換には、colorValue = (turbFunctionResult + 1) / 2とし、0〜1にクランプします。

turbulenceの場合、turbFunctionResultは0から1の範囲(場合によってはこの範囲を超えることもあります)を目指します。色やアルファ値への変換には、colorValue = turbFunctionResultとし、0〜1にクランプします。

擬似乱数の適用順は次の通りです。初期seed値はseed属性で計算されます。その後、Rの格子点を計算し、前回生成した擬似乱数を基準にG、B、Aについて同様に格子点を計算します。

生成された色とアルファ値は、color-interpolation-filtersプロパティで決まる色空間になります:

/* 結果は範囲 [1, 2**31 - 2] になる。*/
アルゴリズム: r = (a * r) mod m
a = 16807、m = 2**31 - 1 = 2147483647
[Park & Miller], CACM 第31巻 第10号 p.1195, 1988年10月を参照
テスト: 初期seedが1のとき、10,000番目の生成値は1043618065になるべき。
*/
#define RAND_m 2147483647 /* 2**31 - 1 */
#define RAND_a 16807 /* 7**5; mの原始根 */
#define RAND_q 127773 /* m / a */
#define RAND_r 2836 /* m % a */
long setup_seed(long lSeed)
{
  if (lSeed <= 0) lSeed = -(lSeed % (RAND_m - 1)) + 1;
  if (lSeed > RAND_m - 1) lSeed = RAND_m - 1;
  return lSeed;
}
long random(long lSeed)
{
  long result;
  result = RAND_a * (lSeed % RAND_q) - RAND_r * (lSeed / RAND_q);
  if (result <= 0) result += RAND_m;
  return result;
}
#define BSize 0x100
#define BM 0xff
#define PerlinN 0x1000
#define NP 12 /* 2^PerlinN */
#define NM 0xfff
static uLatticeSelector[BSize + BSize + 2];
static double fGradient[4][BSize + BSize + 2][2];
struct StitchInfo
{
  int nWidth; // ステッチのためにラップする際に減算する量
  int nHeight;
  int nWrapX; // ラップの最小値
  int nWrapY;
};
static void init(long lSeed)
{
  double s;
  int i, j, k;
  lSeed = setup_seed(lSeed);
  for(k = 0; k < 4; k++)
  {
    for(i = 0; i < BSize; i++)
    {
      uLatticeSelector[i] = i;
      do {
         for (j = 0; j < 2; j++)
           fGradient[k][i][j] = (double)(((lSeed = random(lSeed)) % (BSize + BSize)) - BSize) / BSize;
      } while(fGradient[k][i][0] == 0 && fGradient[k][i][1] == 0);
      s = double(sqrt(fGradient[k][i][0] * fGradient[k][i][0] + fGradient[k][i][1] * fGradient[k][i][1]));
      if (s > 1) {
          i--; // 現在のランダムベクトルを破棄して再試行
          continue;
      }
      fGradient[k][i][0] /= s;
      fGradient[k][i][1] /= s;
    }
  }
  while(--i)
  {
    k = uLatticeSelector[i];
    uLatticeSelector[i] = uLatticeSelector[j = (lSeed = random(lSeed)) % BSize];
    uLatticeSelector[j] = k;
  }
  for(i = 0; i < BSize + 2; i++)
  {
    uLatticeSelector[BSize + i] = uLatticeSelector[i];
    for(k = 0; k < 4; k++)
      for(j = 0; j < 2; j++)
        fGradient[k][BSize + i][j] = fGradient[k][i][j];
  }
}
#define s_curve(t) ( t * t * (3. - 2. * t) )
#define lerp(t, a, b) ( a + t * (b - a) )
double noise2(int nColorChannel, double vec[2], StitchInfo *pStitchInfo)
{
  int bx0, bx1, by0, by1, b00, b10, b01, b11;
  double rx0, rx1, ry0, ry1, *q, sx, sy, a, b, t, u, v;
  register i, j;
  t = vec[0] + PerlinN;
  bx0 = (int)t;
  bx1 = bx0+1;
  rx0 = t - (int)t;
  rx1 = rx0 - 1.0f;
  t = vec[1] + PerlinN;
  by0 = (int)t;
  by1 = by0+1;
  ry0 = t - (int)t;
  ry1 = ry0 - 1.0f;
  // ステッチ時は格子点を適切に調整する。
  if(pStitchInfo != NULL)
  {
    if(bx0 >= pStitchInfo->nWrapX)
      bx0 -= pStitchInfo->nWidth;
    if(bx1 >= pStitchInfo->nWrapX)
      bx1 -= pStitchInfo->nWidth;
    if(by0 >= pStitchInfo->nWrapY)
      by0 -= pStitchInfo->nHeight;
    if(by1 >= pStitchInfo->nWrapY)
      by1 -= pStitchInfo->nHeight;
  }
  bx0 &= BM;
  bx1 &= BM;
  by0 &= BM;
  by1 &= BM;
  i = uLatticeSelector[bx0];
  j = uLatticeSelector[bx1];
  b00 = uLatticeSelector[i + by0];
  b10 = uLatticeSelector[j + by0];
  b01 = uLatticeSelector[i + by1];
  b11 = uLatticeSelector[j + by1];
  sx = double(s_curve(rx0));
  sy = double(s_curve(ry0));
  q = fGradient[nColorChannel][b00]; u = rx0 * q[0] + ry0 * q[1];
  q = fGradient[nColorChannel][b10]; v = rx1 * q[0] + ry0 * q[1];
  a = lerp(sx, u, v);
  q = fGradient[nColorChannel][b01]; u = rx0 * q[0] + ry1 * q[1];
  q = fGradient[nColorChannel][b11]; v = rx1 * q[0] + ry1 * q[1];
  b = lerp(sx, u, v);
  return lerp(sy, a, b);
}
double turbulence(int nColorChannel, double *point, double fBaseFreqX, double fBaseFreqY,
          int nNumOctaves, bool bFractalSum, bool bDoStitching,
          double fTileX, double fTileY, double fTileWidth, double fTileHeight)
{
  StitchInfo stitch;
  StitchInfo *pStitchInfo = NULL; // NULL の場合はステッチしない。
  // ステッチが必要な場合、基準周波数を調整する。
  if(bDoStitching)
  {
    // タイル状の乱流をステッチする際は、タイル境界が連続になるよう
    // 周波数を調整しなければならない。
    if(fBaseFreqX != 0.0)
    {
      double fLoFreq = double(floor(fTileWidth * fBaseFreqX)) / fTileWidth;
      double fHiFreq = double(ceil(fTileWidth * fBaseFreqX)) / fTileWidth;
      if(fBaseFreqX / fLoFreq < fHiFreq / fBaseFreqX)
        fBaseFreqX = fLoFreq;
      else
        fBaseFreqX = fHiFreq;
    }
    if(fBaseFreqY != 0.0)
    {
      double fLoFreq = double(floor(fTileHeight * fBaseFreqY)) / fTileHeight;
      double fHiFreq = double(ceil(fTileHeight * fBaseFreqY)) / fTileHeight;
      if(fBaseFreqY / fLoFreq < fHiFreq / fBaseFreqY)
        fBaseFreqY = fLoFreq;
      else
        fBaseFreqY = fHiFreq;
    }
    // 初期ステッチ値を設定。
    pStitchInfo = &stitch;
    stitch.nWidth = int(fTileWidth * fBaseFreqX + 0.5f);
    stitch.nWrapX = fTileX * fBaseFreqX + PerlinN + stitch.nWidth;
    stitch.nHeight = int(fTileHeight * fBaseFreqY + 0.5f);
    stitch.nWrapY = fTileY * fBaseFreqY + PerlinN + stitch.nHeight;
  }
  double fSum = 0.0f;
  double vec[2];
  vec[0] = point[0] * fBaseFreqX;
  vec[1] = point[1] * fBaseFreqY;
  double ratio = 1;
  for(int nOctave = 0; nOctave < nNumOctaves; nOctave++)
  {
    if(bFractalSum)
      fSum += double(noise2(nColorChannel, vec, pStitchInfo) / ratio);
    else
      fSum += double(fabs(noise2(nColorChannel, vec, pStitchInfo)) / ratio);
    vec[0] *= 2;
    vec[1] *= 2;
    ratio *= 2;
    if(pStitchInfo != NULL)
    {
      // ステッチ値を更新。乗算前に PerlinN を減算し、後で加算するのは、
      // 一度だけ減算するのと等価になるようにするため。
      stitch.nWidth *= 2;
      stitch.nWrapX = 2 * stitch.nWrapX - PerlinN;
      stitch.nHeight *= 2;
      stitch.nWrapY = 2 * stitch.nWrapY - PerlinN;
    }
  }
  return fSum;
}

属性定義:

baseFrequency = "<number-optional-number>"

ノイズ関数の基準周波数(複数可)。2つの<number>を指定すると、最初はX方向の基準周波数、2つ目はY方向の基準周波数。1つの場合はXとY両方に使われます。

初期値baseFrequencyに対して0です。

負値は未対応です。

アニメーション可能: 可。

numOctaves = "<integer>"

ノイズ関数のnumOctavesパラメータ。

初期値numOctavesに対して1です。

負値は未対応です。

アニメーション可能: 可。

注: 追加オクターブごとの色・アルファ値への寄与は前のオクターブの半分になります。一定以上では寄与が色解像度より小さくなります。UAは対応色深度に応じて指定値を制限する場合があります(例: 8bit色深度ならnumOctavesを最大9まで制限)。

seed = "<number>"

疑似乱数生成器の開始番号。

初期値seedに対して0です。

アルゴリズムに渡す際、まずゼロ方向への丸めで整数化します。

アニメーション可能: 可。

stitchTiles = "stitch | noStitch"

stitchTiles="noStitch"の場合、タイル境界で滑らかな遷移は行いません。境界の不連続が現れる場合があります。

stitchTiles="stitch"の場合、UAはbaseFrequency-x/y値を自動調整し、feTurbulenceノードの幅・高さ(=現サブリージョンの幅・高さ)が、最初のオクターブのPerlinタイル幅・高さの整数倍になるようにします。baseFrequencyは相対変化が最小となるよう上下調整。具体的には、frequencyからlowFreq=floor(width*frequency)/widthhiFreq=ceil(width*frequency)/widthを計算。frequency/lowFreq < hiFreq/frequencyならlowFreq、そうでなければhiFreqを使います。乱流値生成時、格子ベクトルは通常のPerlinノイズと同様に生成しますが、アクティブエリア(タイルサイズ)の右端・下端の格子点の場合は、反対側端のベクトルをコピーします。

初期値stitchTilesに対してnoStitchです。

アニメーション可能: 可。

type = "fractalNoise | turbulence"

ノイズ関数か乱流関数かを示します。

初期値typeに対してturbulenceです。

アニメーション可能: 可。

<svg width="450px" height="325px" viewBox="0 0 450 325"
     xmlns="http://www.w3.org/2000/svg">
  <title>feTurbulenceの例 - feTurbulenceの操作例</title>
  <desc>6つの矩形領域でfeTurbulenceの様々なパラメータ設定の効果を示します。</desc>
  <g  font-family="Verdana" text-anchor="middle" font-size="10" >
    <defs>
      <filter id="Turb1" filterUnits="objectBoundingBox"
              x="0%" y="0%" width="100%" height="100%">
        <feTurbulence type="turbulence" baseFrequency="0.05" numOctaves="2"/>
      </filter>
      <filter id="Turb2" filterUnits="objectBoundingBox"
              x="0%" y="0%" width="100%" height="100%">
        <feTurbulence type="turbulence" baseFrequency="0.1" numOctaves="2"/>
      </filter>
      <filter id="Turb3" filterUnits="objectBoundingBox"
              x="0%" y="0%" width="100%" height="100%">
        <feTurbulence type="turbulence" baseFrequency="0.05" numOctaves="8"/>
      </filter>
      <filter id="Turb4" filterUnits="objectBoundingBox"
              x="0%" y="0%" width="100%" height="100%">
        <feTurbulence type="fractalNoise" baseFrequency="0.1" numOctaves="4"/>
      </filter>
      <filter id="Turb5" filterUnits="objectBoundingBox"
              x="0%" y="0%" width="100%" height="100%">
        <feTurbulence type="fractalNoise" baseFrequency="0.4" numOctaves="4"/>
      </filter>
      <filter id="Turb6" filterUnits="objectBoundingBox"
              x="0%" y="0%" width="100%" height="100%">
        <feTurbulence type="fractalNoise" baseFrequency="0.1" numOctaves="1"/>
      </filter>
    </defs>

    <rect x="1" y="1" width="448" height="323"
          fill="none" stroke="blue" stroke-width="1"  />

    <rect x="25" y="25" width="100" height="75" filter="url(#Turb1)"  />
    <text x="75" y="117">type=turbulence</text>
    <text x="75" y="129">baseFrequency=0.05</text>
    <text x="75" y="141">numOctaves=2</text>

    <rect x="175" y="25" width="100" height="75" filter="url(#Turb2)"  />
    <text x="225" y="117">type=turbulence</text>
    <text x="225" y="129">baseFrequency=0.1</text>
    <text x="225" y="141">numOctaves=2</text>

    <rect x="325" y="25" width="100" height="75" filter="url(#Turb3)"  />
    <text x="375" y="117">type=turbulence</text>
    <text x="375" y="129">baseFrequency=0.05</text>
    <text x="375" y="141">numOctaves=8</text>

    <rect x="25" y="180" width="100" height="75" filter="url(#Turb4)"  />
    <text x="75" y="272">type=fractalNoise</text>
    <text x="75" y="284">baseFrequency=0.1</text>
    <text x="75" y="296">numOctaves=4</text>

    <rect x="175" y="180" width="100" height="75" filter="url(#Turb5)"  />
    <text x="225" y="272">type=fractalNoise</text>
    <text x="225" y="284">baseFrequency=0.4</text>
    <text x="225" y="296">numOctaves=4</text>

    <rect x="325" y="180" width="100" height="75" filter="url(#Turb6)"  />
    <text x="375" y="272">type=fractalNoise</text>
    <text x="375" y="284">baseFrequency=0.1</text>
    <text x="375" y="296">numOctaves=1</text>
  </g>
</svg>
feTurbulenceの例

feTurbulenceの例

この例をSVGで表示

10. color-interpolation-filters プロパティ

color-interpolation-filtersプロパティの説明は以下の通りです。

名前: color-interpolation-filters
値: auto | sRGB | linearRGB
初期値: linearRGB
適用対象: すべてのフィルタプリミティブ
継承: はい
パーセンテージ: 該当なし
算出値: 指定値通り
正規順序: 文法通り
メディア: visual
アニメーション可能: いいえ
auto

ユーザーエージェントがフィルター効果の色演算にsRGBまたはlinearRGB空間を選択できることを示します。著者が特定の色空間での色演算を要求しない場合に指定します。

sRGB

フィルター効果の色演算をsRGB色空間で行うことを示します。

linearRGB

フィルター効果の色演算を線形RGB色空間で行うことを示します。

color-interpolation-filtersプロパティは、フィルター効果によって行われる画像処理の色空間を指定します。

注: color-interpolation-filtersプロパティはフィルター操作のみ影響し、feOffsetfeImagefeTilefeFloodなどのフィルタプリミティブには効果がありません。

注: color-interpolation-filterscolor-interpolationとは初期値が異なります。color-interpolation-filtersの初期値はlinearRGBですが、color-interpolationsRGBです。つまり、デフォルトではフィルター効果の演算はlinearRGB色空間で行われ、他の色補間はデフォルトでsRGB色空間で行われます。

注: color-interpolation-filtersプロパティはフィルタ関数には影響しません。フィルタ関数はsRGB色空間で動作します。

color-interpolation-filtersプロパティはSVG要素用のプレゼンテーション属性です。

11. 光源要素とプロパティ

11.1. 概要

以下のセクションでは、光源を定義する要素、feDistantLightfePointLightfeSpotLight、および光の色を定義するプロパティlighting-colorについて説明します。

11.2. 光源要素 feDistantLight

名前: feDistantLight
カテゴリ: 光源
内容モデル: 任意数の記述的要素animatescriptset 要素を任意の順序で含めることができます。
属性:
DOMインターフェイス: SVGFEDistantLightElement

属性定義:

azimuth = "<number>"

XY平面上での光源の方向角(時計回り、x軸からの度数)。

azimuthの初期値は0です。

アニメーション可能: 可。

elevation = "<number>"

XY平面からZ軸方向への光源の方向角(度数)。正のZ軸はビューア側を指します。

elevationの初期値は0です。

アニメーション可能: 可。

以下の図は、XYZ座標系におけるazimuthおよびelevationが示す角度を表します。

azimuthとelevationが示す角度

azimuthとelevationが示す角度

11.3. 光源要素 fePointLight

名前: fePointLight
カテゴリ: 光源
内容モデル: 任意数の記述的要素animatescriptset 要素を任意の順序で含めることができます。
属性:
DOMインターフェイス: SVGFEPointLightElement

属性定義:

x = "<number>"

光源のX座標。座標系はprimitiveUnits属性でfilter 要素上に確立されます。

xの初期値は0です。

アニメーション可能: 可。

y = "<number>"

光源のY座標。座標系はprimitiveUnits属性でfilter 要素上に確立されます。

yの初期値は0です。

アニメーション可能: 可。

z = "<number>"

光源のZ座標。座標系はprimitiveUnits属性でfilter 要素上に確立されます(初期ローカル座標系では、正のZ軸はビューア側を指し、Z軸の1単位はX・Yの1単位と同じです)。

zの初期値は0です。

アニメーション可能: 可。

11.4. 光源要素 feSpotLight

名前: feSpotLight
カテゴリ: 光源
内容モデル: 任意数の記述的要素animatescriptset 要素を任意の順序で含めることができます。
属性:
DOMインターフェイス: SVGFESpotLightElement

属性定義:

x = "<number>"

光源のX座標。座標系はprimitiveUnits属性でfilter 要素上に確立されます。

xの初期値は0です。

アニメーション可能: 可。

y = "<number>"

光源のY座標。座標系はprimitiveUnits属性でfilter 要素上に確立されます。

yの初期値は0です。

アニメーション可能: 可。

z = "<number>"

光源のZ座標。座標系はprimitiveUnits属性でfilter 要素上に確立されます(初期ローカル座標系では、正のZ軸はビューア側を指し、Z軸の1単位はX・Yの1単位と同じです)。

zの初期値は0です。

アニメーション可能: 可。

pointsAtX = "<number>"

光源が指す点のX座標。座標系はprimitiveUnits属性でfilter 要素上に確立されます。

pointsAtXの初期値は0です。

アニメーション可能: 可。

pointsAtY = "<number>"

光源が指す点のY座標。座標系はprimitiveUnits属性でfilter 要素上に確立されます。

pointsAtYの初期値は0です。

アニメーション可能: 可。

pointsAtZ = "<number>"

光源が指す点のZ座標。座標系はprimitiveUnits属性でfilter 要素上に確立されます(初期ローカル座標系では、正のZ軸はビューア側を指し、Z軸の1単位はX・Yの1単位と同じです)。

pointsAtZの初期値は0です。

アニメーション可能: 可。

specularExponent = "<number>"

光源の集光具合を制御する指数値。

specularExponentの初期値は1です。

使用方法はフィルタプリミティブ <feDiffuseLighting>セクション参照。specularExponentを参照。

注: specularExponentfeSpotLight)は、specularExponentfeSpecularLighting)とは用途が異なります。

アニメーション可能: 可。

limitingConeAngle = "<number>"

光が投影される領域を制限するコーン角度。コーン外には光は投影されません。limitingConeAngleは、スポットライト軸(光源から指す点への軸)とコーンの間の角度(度数)を表します。ユーザーエージェントはコーンの境界でアンチエイリアス等の平滑化技法を適用するべきです。

値が指定されない場合、コーンによる制限はありません。

アニメーション可能: 可。

11.5. lighting-color プロパティ

名前: lighting-color
値: <color>
初期値: white
適用対象: feDiffuseLighting および feSpecularLighting 要素
継承: no
パーセンテージ: n/a
算出値: 指定通り
標準順序: 文法に準拠
メディア: ビジュアル
アニメーション可能: 算出値による

lighting-color プロパティは フィルタプリミティブ feDiffuseLighting および feSpecularLighting の光源の色を定義します。

lighting-color プロパティは SVG 要素の プレゼンテーション属性 です。

12. Filter CSS <image>

CSS <image> 値は CSS filter プロパティで規定されるフィルタ関数によってフィルタできます。本仕様は以下の構文を持つ <image> <filter()> 関数を導入します:

filter() = filter( [ <image> | <string> ], <filter-value-list> )

<filter()> 関数は2つの引数を取ります。第1引数は <image> です。第2引数は CSS filter プロパティで規定されるフィルタ関数リストです。この関数は <image> パラメータにフィルタルールを適用し、処理済み画像を返します。フィルタおよびフィルタ効果領域のサイズは入力 具体オブジェクトサイズ に従います。

注: 元画像の寸法と原点を保持する必要があるため、<drop-shadow()> のようなフィルタ効果は完全に不透明な画像では効果がない場合があります。

<blur()> 関数の場合、edgeMode 属性が feGaussianBlur 要素上で duplicate に設定されます。これにより、フィルタ入力画像の端でより滑らかな結果が得られます。

12.1. filter() の補間

開始画像と終了画像の両方が、使用されるフィルタ関数のみが異なる <filter()> である場合、セクション フィルタの補間 で説明されるように、フィルタ関数リスト同士を補間しなければなりません。そうでない場合は、一般的な <image> として補間されます。フィルタ関数の補間ができない場合、画像は一般的な <image> として補間されなければなりません。

13. 略式記法(filter 要素による定義)

13.1. フィルタプリミティブ表現

以下は各フィルタ関数の 'filter element' 要素による同等の表現です。関数のパラメータは [amount] のような角括弧でラベル付けされています。パーセンテージ値の場合は実数値に変換されます。

13.1.1. grayscale

<filter id="grayscale">
  <feColorMatrix type="matrix"
             values="
    (0.2126 + 0.7874 * [1 - amount]) (0.7152 - 0.7152  * [1 - amount]) (0.0722 - 0.0722 * [1 - amount]) 0 0
    (0.2126 - 0.2126 * [1 - amount]) (0.7152 + 0.2848  * [1 - amount]) (0.0722 - 0.0722 * [1 - amount]) 0 0
    (0.2126 - 0.2126 * [1 - amount]) (0.7152 - 0.7152  * [1 - amount]) (0.0722 + 0.9278 * [1 - amount]) 0 0
    0 0 0 1 0"/>
</filter>

13.1.2. sepia

<filter id="sepia">
  <feColorMatrix type="matrix"
             values="
    (0.393 + 0.607 * [1 - amount]) (0.769 - 0.769 * [1 - amount]) (0.189 - 0.189 * [1 - amount]) 0 0
    (0.349 - 0.349 * [1 - amount]) (0.686 + 0.314 * [1 - amount]) (0.168 - 0.168 * [1 - amount]) 0 0
    (0.272 - 0.272 * [1 - amount]) (0.534 - 0.534 * [1 - amount]) (0.131 + 0.869 * [1 - amount]) 0 0
    0 0 0 1 0"/>
</filter>

13.1.3. saturate

<filter id="saturate">
  <feColorMatrix type="saturate" values="[amount]"/>
</filter>

13.1.4. hue-rotate

<filter id="hue-rotate">
  <feColorMatrix type="hueRotate" values="[angle]"/>
</filter>

13.1.5. invert

<filter id="invert">
  <feComponentTransfer>
      <feFuncR type="table" tableValues="[amount] (1 - [amount])"/>
      <feFuncG type="table" tableValues="[amount] (1 - [amount])"/>
      <feFuncB type="table" tableValues="[amount] (1 - [amount])"/>
  </feComponentTransfer>
</filter>

13.1.6. opacity

<filter id="opacity">
  <feComponentTransfer>
      <feFuncA type="table" tableValues="0 [amount]"/>
  </feComponentTransfer>
</filter>

13.1.7. brightness

<filter id="brightness">
  <feComponentTransfer>
      <feFuncR type="linear" slope="[amount]"/>
      <feFuncG type="linear" slope="[amount]"/>
      <feFuncB type="linear" slope="[amount]"/>
  </feComponentTransfer>
</filter>

13.1.8. contrast

<filter id="contrast">
  <feComponentTransfer>
      <feFuncR type="linear" slope="[amount]" intercept="-(0.5 * [amount]) + 0.5"/>
      <feFuncG type="linear" slope="[amount]" intercept="-(0.5 * [amount]) + 0.5"/>
      <feFuncB type="linear" slope="[amount]" intercept="-(0.5 * [amount]) + 0.5"/>
  </feComponentTransfer>
</filter>

13.1.9. blur

<filter id="blur">
  <feGaussianBlur stdDeviation="[radius radius]" edgeMode="[edge mode]" >
</filter>

edge mode は filter プロパティの場合 none、CSS Image <filter()> 関数の場合 duplicate になります。

注: <blur()> 関数は UA 定義のフィルタ領域を拡張する場合があります。略式記法のフィルタ領域 を参照してください。

13.1.10. drop-shadow

<filter id="drop-shadow">
  <feGaussianBlur in="[alpha-channel-of-input]" stdDeviation="[radius]"/>
  <feOffset dx="[offset-x]" dy="[offset-y]" result="offsetblur"/>
  <feFlood flood-color="[color]"/>
  <feComposite in2="offsetblur" operator="in"/>
  <feMerge>
    <feMergeNode/>
    <feMergeNode in="[input-image]"/>
  </feMerge>
</filter>

注: <drop-shadow()> 関数は UA 定義のフィルタ領域を拡張する場合があります。略式記法のフィルタ領域 を参照してください。

13.2. 略式記法のフィルタ領域

前節でフィルタプリミティブによって実装されたすべての略式フィルタは、UA定義のフィルタ領域を持たなければなりません。フィルタ領域は、要素の視覚的コンテンツ(はみ出したコンテンツやスクロールバーなどのグラフィカルなコントロール要素、border/border-imagebox-shadowtext-shadowoutline を含む)全体をカバーしなければなりません。さらに、略式フィルタが <blur()><drop-shadow()> のようにこの可視領域を拡張する場合、その領域もカバーしなければなりません。

注: フィルタソースの扱いについては、フィルタ領域の項を参照してください。

14. フィルタのアニメーション

14.1. フィルタ関数リストの補間

1つのフィルタから別のフィルタへの補間では、次のリストにおける最初に一致する条件に対応する手順を実行しなければなりません:

両方のフィルタが <filter-value-list> で、<url> を含まず、各 <filter-function> の対応項目が両リストに存在する場合
<filter-function> のペアを、フィルタ関数の補間で規定されるルールに従って補間する。
両方のフィルタが <filter-value-list> で、<url> を含まず、各 <filter-function> の対応項目が両リストに存在するが、リストの長さが異なる場合
  1. 長いリストから不足している同等の <filter-function> を短いリストの末尾に追加する。追加された <filter-function> は補間の初期値に初期化する。
  2. <filter-function> のペアを、フィルタ関数の補間で規定されるルールに従って補間する。
一方のフィルタが none で、もう一方が <filter-value-list><url> を含まない)場合
  1. none をもう一方のフィルタの <filter-value-list> で置き換える。新しい <filter-function> は補間の初期値に初期化する。
  2. <filter-function> のペアを、フィルタ関数の補間で規定されるルールに従って補間する。
その他
離散補間を使用する。

フィルタ関数の距離を計算する。<https://github.com/w3c/csswg-drafts/issues/91>

14.2. 加算

独立した<filter-value-list>のアニメーションを組み合わせることができます。[SVG11]

基本値(base filter list)と加算値(added filter list)の2つのフィルタ値が与えられた場合、両リストを連結した ‘base filter list added filter list’ を返します。

次のSVGアニメーションは2つのanimate要素でfilterプロパティをアニメートしています。指定された両方のアニメーションは加算型で、期間は10sです。
<rect width="200px" filter="none" ...>
  <animate attributeName="filter" from="blur(0px)" to="blur(10px)" dur="10s"
           additive="sum"/>
  <animate attributeName="filter" from="sepia(0)" to="sepia(1)" dur="10s"
           additive="sum"/>
</rect>

5s後、使用値としてfilterblur(5px) sepia(0.5) となります。

14.3. 累積

2つのフィルタ値 VaVb を与えられた場合、フィルタ値 Vb を返します。

15. プライバシーおよびセキュリティに関する考慮事項

15.1. 汚染されたフィルタプリミティブ

フィルタ処理のタイミングが、フィルタされたコンテンツやその他のプライバシーに関する機微情報を含む可能性があるソースから導出されたピクセル値に依存しないことは重要です。

以下のフィルタプリミティブは、フィルタされたオブジェクト自体やCSSスタイルなどの他のソースから、プライバシーに関する機微情報を含む可能性のあるピクセル値にアクセスする場合があります。これらのプリミティブは「汚染された」としてフラグ付けされなければなりません。

  1. feFlood指定値flood-color プロパティが currentColor となる場合、

  2. feDropShadow指定値flood-color プロパティが currentColor となる場合、

  3. feDiffuseLighting指定値lighting-color プロパティが currentColor となる場合

  4. feSpecularLighting指定値lighting-color プロパティが currentColor となる場合、

  5. feImage<url> が要素を指す、または No-CORS モードでリソースを取得する場合

  6. 次のフィルタプリミティブ: SourceGraphicSourceAlphaBackgroundImageBackgroundAlphaFillPaintStrokePaint

feFloodfeDropShadowfeDiffuseLighting および feSpecularLighting は、プロパティ値として<color> を受け付けます。<color> には currentColor キーワードが含まれます。使用値としての currentColorcolor プロパティに由来します。color:visited 疑似セレクタで設定可能なため、プライバシーに関する機微情報を含む可能性があり、これらのプリミティブは汚染されたものとして扱われなければなりません。

feImage はクロスドメイン画像やSVG グラフィック要素などのドキュメント断片を参照できます。これらの参照はプライバシーに関する機微情報を含む可能性があるため、このプリミティブも汚染されたものとして扱われなければなりません。

フィルタプリミティブ SourceGraphicSourceAlphaBackgroundImageBackgroundAlphaFillPaintStrokePaint は、SVG グラフィック要素などのドキュメント断片や、color プロパティに直接または間接的に由来するスタイル情報を参照します。したがって、これらのプリミティブも汚染されたものとしてフラグ付けされなければなりません。

入力として「汚染された」フラグ付きフィルタプリミティブを持つすべてのフィルタプリミティブは、「汚染された」としてフラグ付けされなければなりません。

フィルタ処理は、入力フィルタプリミティブのいずれかが「汚染された」とフラグ付けされている場合、ピクセル値に関係なく常に同じ時間がかかるように実装しなければなりません。

注:本仕様は、ユーザーエージェントからの実装フィードバックに基づきフィルタプリミティブへの制限を強化しています。

15.2. feDisplacementMap の制限

feDisplacementMap が入力として「汚染された」フラグ付きフィルタプリミティブを持ち、その入力フィルタプリミティブが in2 により変位マップとして参照された場合、feDisplacementMap はフィルタ処理を実行せず、パススルーフィルタとして動作しなければなりません。

15.3. オリジンの制限

ユーザーエージェントは、CORS 対応フェッチメソッド([HTML5]仕様で定義)を filter プロパティの取得に使用しなければなりません。フェッチ時、ユーザーエージェントは「Anonymous」モードを使用し、リファラーソースをスタイルシートのURLに設定し、オリジンを含むドキュメントのURLに設定しなければなりません。ネットワークエラーとなった場合、値 none が指定されたものとして扱われます。

15.4. タイミング攻撃

上記の規則が守られない場合、攻撃者が情報を推測しタイミング攻撃を仕掛ける可能性があります。

タイミング攻撃とは、本来保護されているべきコンテンツについて、処理にかかる時間の差異を利用して情報を得る手法です。例えば、赤いピクセルの描画に緑のピクセルよりも時間がかかる場合、要素の内容に直接アクセスすることなく、おおまかな画像を再構成できるかもしれません。セキュリティ研究によれば、算術演算のタイミングの違いはハードウェアアーキテクチャやコンパイラによって引き起こされることがあります[ArTD]

付録A: 廃止されたenable-background プロパティ

SVG 1.1 は enable-background プロパティ [SVG11] を導入しました。このプロパティは フィルタ領域の下地を、filter 要素が呼び出された時点で定義します。このプロパティによって定義される概念は、現行標準のCSSの積層コンテキストモデルと互換性がないとされました。UAはSVG 1.1で定義された enable-background プロパティを実装することもできますが、本仕様やCSS Compositing and Blending [COMPOSITING-1]とは互換性がありません。

本仕様は enable-background プロパティをサポートしません。UAはその代わりに isolation プロパティをサポートしなければなりません[COMPOSITING-1]

付録B: DOMインターフェース

Interface SVGFilterElement

SVGFilterElement インターフェースは filter 要素に対応します。

interface SVGFilterElement : SVGElement {
  readonly attribute SVGAnimatedEnumeration filterUnits;
  readonly attribute SVGAnimatedEnumeration primitiveUnits;
  readonly attribute SVGAnimatedLength x;
  readonly attribute SVGAnimatedLength y;
  readonly attribute SVGAnimatedLength width;
  readonly attribute SVGAnimatedLength height;
};

SVGFilterElement includes SVGURIReference;
属性:
filterUnits 型: SVGAnimatedEnumeration、読み取り専用

指定された filterUnits 属性に対応します。対象の filter 要素で使用されます。値は SVGUnitTypes で定義された定数のいずれか。

primitiveUnits 型: SVGAnimatedEnumeration、読み取り専用

指定された primitiveUnits 属性に対応します。対象の filter 要素で使用されます。値は SVGUnitTypes で定義された定数のいずれかです。

x 型: SVGAnimatedLength、読み取り専用

指定された x 属性に対応します。対象の filter 要素で使用されます。

y 型: SVGAnimatedLength、読み取り専用

指定された y 属性に対応します。対象の filter 要素で使用されます。

width 型: SVGAnimatedLength、読み取り専用

指定された width 属性に対応します。対象の filter 要素で使用されます。

height 型: SVGAnimatedLength、読み取り専用

指定された height 属性に対応します。対象の filter 要素で使用されます。

インターフェース SVGFilterPrimitiveStandardAttributes

interface mixin SVGFilterPrimitiveStandardAttributes {
  readonly attribute SVGAnimatedLength x;
  readonly attribute SVGAnimatedLength y;
  readonly attribute SVGAnimatedLength width;
  readonly attribute SVGAnimatedLength height;
  readonly attribute SVGAnimatedString result;
};
属性:
x 型: SVGAnimatedLength、読み取り専用

指定された x 属性に対応します。対象の要素で使用されます。

y 型: SVGAnimatedLength、読み取り専用

指定された y 属性に対応します。対象の要素で使用されます。

width 型: SVGAnimatedLength、読み取り専用

指定された width 属性に対応します。対象の要素で使用されます。

height 型: SVGAnimatedLength、読み取り専用

指定された height 属性に対応します。対象の要素で使用されます。

result 型: SVGAnimatedString、読み取り専用

指定された result 属性に対応します。対象の要素で使用されます。

インターフェース SVGFEBlendElement

SVGFEBlendElement インターフェースは feBlend 要素に対応します。

interface SVGFEBlendElement : SVGElement {

  // Blend Mode Types
  const unsigned short SVG_FEBLEND_MODE_UNKNOWN = 0;
  const unsigned short SVG_FEBLEND_MODE_NORMAL = 1;
  const unsigned short SVG_FEBLEND_MODE_MULTIPLY = 2;
  const unsigned short SVG_FEBLEND_MODE_SCREEN = 3;
  const unsigned short SVG_FEBLEND_MODE_DARKEN = 4;
  const unsigned short SVG_FEBLEND_MODE_LIGHTEN = 5;
  const unsigned short SVG_FEBLEND_MODE_OVERLAY = 6;
  const unsigned short SVG_FEBLEND_MODE_COLOR_DODGE = 7;
  const unsigned short SVG_FEBLEND_MODE_COLOR_BURN = 8;
  const unsigned short SVG_FEBLEND_MODE_HARD_LIGHT = 9;
  const unsigned short SVG_FEBLEND_MODE_SOFT_LIGHT = 10;
  const unsigned short SVG_FEBLEND_MODE_DIFFERENCE = 11;
  const unsigned short SVG_FEBLEND_MODE_EXCLUSION = 12;
  const unsigned short SVG_FEBLEND_MODE_HUE = 13;
  const unsigned short SVG_FEBLEND_MODE_SATURATION = 14;
  const unsigned short SVG_FEBLEND_MODE_COLOR = 15;
  const unsigned short SVG_FEBLEND_MODE_LUMINOSITY = 16;

  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedString in2;
  readonly attribute SVGAnimatedEnumeration mode;
};

SVGFEBlendElement includes SVGFilterPrimitiveStandardAttributes;
「ブレンドモード型」グループの定数:
SVG_FEBLEND_MODE_UNKNOWN

型が定義済み型のいずれでもありません。この型の新しい値を定義したり、既存の値をこの型に変更したりすることは無効です。

SVG_FEBLEND_MODE_NORMAL

normal の値に対応します。

SVG_FEBLEND_MODE_MULTIPLY

multiply の値に対応します。

SVG_FEBLEND_MODE_SCREEN

screen の値に対応します。

SVG_FEBLEND_MODE_DARKEN

darken の値に対応します。

SVG_FEBLEND_MODE_LIGHTEN

lighten の値に対応します。

SVG_FEBLEND_MODE_OVERLAY

overlay の値に対応します。

SVG_FEBLEND_MODE_COLOR_DODGE

color-dodge の値に対応します。

SVG_FEBLEND_MODE_COLOR_BURN

color-burn の値に対応します。

SVG_FEBLEND_MODE_HARD_LIGHT

hard-light の値に対応します。

SVG_FEBLEND_MODE_SOFT_LIGHT

soft-light の値に対応します。

SVG_FEBLEND_MODE_DIFFERENCE

difference の値に対応します。

SVG_FEBLEND_MODE_EXCLUSION

exclusion の値に対応します。

SVG_FEBLEND_MODE_HUE

hue の値に対応します。

SVG_FEBLEND_MODE_SATURATION

saturation の値に対応します。

SVG_FEBLEND_MODE_COLOR

color の値に対応します。

SVG_FEBLEND_MODE_LUMINOSITY

luminosity の値に対応します。

属性:
in1 型: SVGAnimatedString、読み取り専用

指定された in 属性に対応します。対象の feBlend 要素で使用されます。

in2 型: SVGAnimatedString、読み取り専用

指定された in2 属性に対応します。対象の feBlend 要素で使用されます。

mode 型: SVGAnimatedEnumeration、読み取り専用

指定された mode 属性に対応します。対象の feBlend 要素で使用されます。値は本インターフェースで定義される SVG_FEBLEND_MODE_* 定数のいずれかです。

インターフェース SVGFEColorMatrixElement

SVGFEColorMatrixElement インターフェースは feColorMatrix 要素に対応します。

interface SVGFEColorMatrixElement : SVGElement {

  // Color Matrix Types
  const unsigned short SVG_FECOLORMATRIX_TYPE_UNKNOWN = 0;
  const unsigned short SVG_FECOLORMATRIX_TYPE_MATRIX = 1;
  const unsigned short SVG_FECOLORMATRIX_TYPE_SATURATE = 2;
  const unsigned short SVG_FECOLORMATRIX_TYPE_HUEROTATE = 3;
  const unsigned short SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA = 4;

  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedEnumeration type;
  readonly attribute SVGAnimatedNumberList values;
};

SVGFEColorMatrixElement includes SVGFilterPrimitiveStandardAttributes;
「カラーマトリックスタイプ」グループの定数:
SVG_FECOLORMATRIX_TYPE_UNKNOWN

タイプが事前定義されたタイプのいずれにも該当しません。このタイプの新しい値を定義したり、既存の値をこのタイプに切り替えようとすることは無効です。

SVG_FECOLORMATRIX_TYPE_MATRIX

matrixの値に対応します。

SVG_FECOLORMATRIX_TYPE_SATURATE

saturateの値に対応します。

SVG_FECOLORMATRIX_TYPE_HUEROTATE

hueRotateの値に対応します。

SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA

luminanceToAlphaの値に対応します。

属性:
in1, SVGAnimatedString, 読み取り専用

in属性に対応し、該当するfeColorMatrix要素で使用されます。

type, SVGAnimatedEnumeration, 読み取り専用

type属性に対応し、該当するfeColorMatrix要素で使用されます。値はこのインターフェースで定義されたSVG_FECOLORMATRIX_TYPE_*定数のいずれかとなります。

values, SVGAnimatedNumberList, 読み取り専用

values属性に対応し、該当するfeColorMatrix要素で使用されます。

SVGFEComponentTransferElement インターフェース

SVGFEComponentTransferElementインターフェースは、feComponentTransfer要素に対応します。

interface SVGFEComponentTransferElement : SVGElement {
  readonly attribute SVGAnimatedString in1;
};

SVGFEComponentTransferElement includes SVGFilterPrimitiveStandardAttributes;
属性:
in1, SVGAnimatedString, 読み取り専用

in属性に対応し、該当するfeComponentTransfer要素で使用されます。

SVGComponentTransferFunctionElement インターフェース

このインターフェースは、コンポーネント転送関数インターフェースで使用される基本インターフェースを定義します。

interface SVGComponentTransferFunctionElement : SVGElement {

  // Component Transfer Types
  const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN = 0;
  const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY = 1;
  const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_TABLE = 2;
  const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE = 3;
  const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_LINEAR = 4;
  const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_GAMMA = 5;

  readonly attribute SVGAnimatedEnumeration type;
  readonly attribute SVGAnimatedNumberList tableValues;
  readonly attribute SVGAnimatedNumber slope;
  readonly attribute SVGAnimatedNumber intercept;
  readonly attribute SVGAnimatedNumber amplitude;
  readonly attribute SVGAnimatedNumber exponent;
  readonly attribute SVGAnimatedNumber offset;
};
「コンポーネント転送タイプ」グループの定数:
SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN

タイプが事前定義されたタイプのいずれにも該当しません。このタイプの新しい値を定義したり、既存の値をこのタイプに切り替えようとすることは無効です。

SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY

identityの値に対応します。

SVG_FECOMPONENTTRANSFER_TYPE_TABLE

tableの値に対応します。

SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE

discreteの値に対応します。

SVG_FECOMPONENTTRANSFER_TYPE_LINEAR

linearの値に対応します。

SVG_FECOMPONENTTRANSFER_TYPE_GAMMA

gammaの値に対応します。

属性:
type, SVGAnimatedEnumeration, 読み取り専用

in属性に対応し、該当するfeComponentTransfer要素で使用されます。値はこのインターフェースで定義されたSVG_FECOMPONENTTRANSFER_TYPE_*定数のいずれかとなります。

tableValues, SVGAnimatedNumberList, 読み取り専用

tableValues属性に対応し、該当するfeComponentTransfer要素で使用されます。値はこのインターフェースで定義されたSVG_FECOLORMATRIX_TYPE_*定数のいずれかとなります。

slope, SVGAnimatedNumber, 読み取り専用

slope属性に対応し、該当するfeComponentTransfer要素で使用されます。

intercept, SVGAnimatedNumber, 読み取り専用

intercept属性に対応し、該当するfeComponentTransfer要素で使用されます。

amplitude, SVGAnimatedNumber, 読み取り専用

amplitude属性に対応し、該当するfeComponentTransfer要素で使用されます。

exponent, SVGAnimatedNumber, 読み取り専用

exponent属性に対応し、該当するfeComponentTransfer要素で使用されます。

offset, SVGAnimatedNumber, 読み取り専用

offset属性に対応し、該当するfeComponentTransfer要素で使用されます。

SVGFEFuncRElement インターフェース

SVGFEFuncRElementインターフェースは、feFuncR要素に対応します。

interface SVGFEFuncRElement : SVGComponentTransferFunctionElement {
};

SVGFEFuncGElement インターフェース

SVGFEFuncGElementインターフェースは、feFuncG要素に対応します。

interface SVGFEFuncGElement : SVGComponentTransferFunctionElement {
};

SVGFEFuncBElement インターフェース

SVGFEFuncBElementインターフェースは、feFuncB要素に対応します。

interface SVGFEFuncBElement : SVGComponentTransferFunctionElement {
};

SVGFEFuncAElement インターフェース

SVGFEFuncAElementインターフェースは、feFuncA要素に対応します。

interface SVGFEFuncAElement : SVGComponentTransferFunctionElement {
};

SVGFECompositeElement インターフェース

SVGFECompositeElementインターフェースは、feComposite要素に対応します。

interface SVGFECompositeElement : SVGElement {

  // Composite Operators
  const unsigned short SVG_FECOMPOSITE_OPERATOR_UNKNOWN = 0;
  const unsigned short SVG_FECOMPOSITE_OPERATOR_OVER = 1;
  const unsigned short SVG_FECOMPOSITE_OPERATOR_IN = 2;
  const unsigned short SVG_FECOMPOSITE_OPERATOR_OUT = 3;
  const unsigned short SVG_FECOMPOSITE_OPERATOR_ATOP = 4;
  const unsigned short SVG_FECOMPOSITE_OPERATOR_XOR = 5;
  const unsigned short SVG_FECOMPOSITE_OPERATOR_ARITHMETIC = 6;

  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedString in2;
  readonly attribute SVGAnimatedEnumeration operator;
  readonly attribute SVGAnimatedNumber k1;
  readonly attribute SVGAnimatedNumber k2;
  readonly attribute SVGAnimatedNumber k3;
  readonly attribute SVGAnimatedNumber k4;
};

SVGFECompositeElement includes SVGFilterPrimitiveStandardAttributes;
「合成演算子」グループの定数:
SVG_FECOMPOSITE_OPERATOR_UNKNOWN

タイプが事前定義されたタイプのいずれにも該当しません。このタイプの新しい値を定義したり、既存の値をこのタイプに切り替えようとすることは無効です。

SVG_FECOMPOSITE_OPERATOR_OVER

overの値に対応します。

SVG_FECOMPOSITE_OPERATOR_IN

inの値に対応します。

SVG_FECOMPOSITE_OPERATOR_OUT

outの値に対応します。

SVG_FECOMPOSITE_OPERATOR_ATOP

atopの値に対応します。

SVG_FECOMPOSITE_OPERATOR_XOR

xorの値に対応します。

SVG_FECOMPOSITE_OPERATOR_ARITHMETIC

arithmeticの値に対応します。

属性:
in1, SVGAnimatedString, 読み取り専用

in属性に対応し、該当するfeComposite要素で使用されます。

in2, SVGAnimatedString, 読み取り専用

in2属性に対応し、該当するfeComposite要素で使用されます。

operator, SVGAnimatedEnumeration, 読み取り専用

operator属性に対応し、該当するfeComposite要素で使用されます。

k1, SVGAnimatedNumber, 読み取り専用

k1属性に対応し、該当するfeComposite要素で使用されます。

k2, SVGAnimatedNumber, 読み取り専用

k2属性に対応し、該当するfeComposite要素で使用されます。

k3, SVGAnimatedNumber, 読み取り専用

k3属性に対応し、該当するfeComposite要素で使用されます。

k4, SVGAnimatedNumber, 読み取り専用

k4属性に対応し、該当するfeComposite要素で使用されます。

SVGFEConvolveMatrixElement インターフェース

SVGFEConvolveMatrixElementインターフェースは、feConvolveMatrix要素に対応します。

interface SVGFEConvolveMatrixElement : SVGElement {

  // Edge Mode Values
  const unsigned short SVG_EDGEMODE_UNKNOWN = 0;
  const unsigned short SVG_EDGEMODE_DUPLICATE = 1;
  const unsigned short SVG_EDGEMODE_WRAP = 2;
  const unsigned short SVG_EDGEMODE_NONE = 3;

  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedInteger orderX;
  readonly attribute SVGAnimatedInteger orderY;
  readonly attribute SVGAnimatedNumberList kernelMatrix;
  readonly attribute SVGAnimatedNumber divisor;
  readonly attribute SVGAnimatedNumber bias;
  readonly attribute SVGAnimatedInteger targetX;
  readonly attribute SVGAnimatedInteger targetY;
  readonly attribute SVGAnimatedEnumeration edgeMode;
  readonly attribute SVGAnimatedNumber kernelUnitLengthX;
  readonly attribute SVGAnimatedNumber kernelUnitLengthY;
  readonly attribute SVGAnimatedBoolean preserveAlpha;
};

SVGFEConvolveMatrixElement includes SVGFilterPrimitiveStandardAttributes;
「エッジモード値」グループの定数:
SVG_EDGEMODE_UNKNOWN

タイプが事前定義されたタイプのいずれにも該当しません。このタイプの新しい値を定義したり、既存の値をこのタイプに切り替えようとすることは無効です。

SVG_EDGEMODE_DUPLICATE

duplicateの値に対応します。

SVG_EDGEMODE_WRAP

wrapの値に対応します。

SVG_EDGEMODE_NONE

noneの値に対応します。

属性:
in1, SVGAnimatedString, 読み取り専用

in属性に対応し、該当するfeConvolveMatrix要素で使用されます。

orderX, SVGAnimatedInteger, 読み取り専用

order属性に対応し、該当するfeConvolveMatrix要素で使用されます。

orderY, SVGAnimatedInteger, 読み取り専用

order属性に対応し、該当するfeConvolveMatrix要素で使用されます。

kernelMatrix, SVGAnimatedNumberList, 読み取り専用

kernelMatrix属性に対応し、該当するfeConvolveMatrix要素で使用されます。

divisor, SVGAnimatedNumber, 読み取り専用

divisor属性に対応し、該当するfeConvolveMatrix要素で使用されます。

bias, SVGAnimatedNumber, 読み取り専用

bias属性に対応し、該当するfeConvolveMatrix要素で使用されます。

targetX, SVGAnimatedInteger, 読み取り専用

targetX属性に対応し、該当するfeConvolveMatrix要素で使用されます。

targetY, SVGAnimatedInteger, 読み取り専用

targetY属性に対応し、該当するfeConvolveMatrix要素で使用されます。

edgeMode, SVGAnimatedEnumeration, 読み取り専用

edgeMode属性に対応し、該当するfeConvolveMatrix要素で使用されます。

kernelUnitLengthX, SVGAnimatedNumber, 読み取り専用

kernelUnitLength属性に対応し、該当するfeConvolveMatrix要素で使用されます。

kernelUnitLengthY, SVGAnimatedNumber, 読み取り専用

kernelUnitLength属性に対応し、該当するfeConvolveMatrix要素で使用されます。

preserveAlpha, SVGAnimatedBoolean, 読み取り専用

preserveAlpha属性に対応し、該当するfeConvolveMatrix要素で使用されます。

SVGFEDiffuseLightingElement インターフェース

SVGFEDiffuseLightingElementインターフェースは、feDiffuseLighting要素に対応します。

interface SVGFEDiffuseLightingElement : SVGElement {
  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedNumber surfaceScale;
  readonly attribute SVGAnimatedNumber diffuseConstant;
  readonly attribute SVGAnimatedNumber kernelUnitLengthX;
  readonly attribute SVGAnimatedNumber kernelUnitLengthY;
};

SVGFEDiffuseLightingElement includes SVGFilterPrimitiveStandardAttributes;
属性:
in1, SVGAnimatedString, 読み取り専用

in属性に対応し、該当するfeDiffuseLighting要素で使用されます。

surfaceScale, SVGAnimatedNumber, 読み取り専用

surfaceScale属性に対応し、該当するfeDiffuseLighting要素で使用されます。

diffuseConstant, SVGAnimatedNumber, 読み取り専用

diffuseConstant属性に対応し、該当するfeDiffuseLighting要素で使用されます。

kernelUnitLengthX, SVGAnimatedNumber, 読み取り専用

kernelUnitLength属性に対応し、該当するfeDiffuseLighting要素で使用されます。

kernelUnitLengthY, SVGAnimatedNumber, 読み取り専用

kernelUnitLength属性に対応し、該当するfeDiffuseLighting要素で使用されます。

SVGFEDistantLightElement インターフェース

SVGFEDistantLightElementインターフェースは、feDistantLight要素に対応します。

interface SVGFEDistantLightElement : SVGElement {
  readonly attribute SVGAnimatedNumber azimuth;
  readonly attribute SVGAnimatedNumber elevation;
};
属性:
azimuth, SVGAnimatedNumber, 読み取り専用

azimuth属性に対応し、該当するfeDistantLight要素で使用されます。

elevation, SVGAnimatedNumber, 読み取り専用

elevation属性に対応し、該当するfeDistantLight要素で使用されます。

SVGFEPointLightElement インターフェース

SVGFEPointLightElementインターフェースは、fePointLight要素に対応します。

interface SVGFEPointLightElement : SVGElement {
  readonly attribute SVGAnimatedNumber x;
  readonly attribute SVGAnimatedNumber y;
  readonly attribute SVGAnimatedNumber z;
};
属性:
x, SVGAnimatedNumber, 読み取り専用

x属性に対応し、該当するfePointLight要素で使用されます。

y, SVGAnimatedNumber, 読み取り専用

y属性に対応し、該当するfePointLight要素で使用されます。

z, SVGAnimatedNumber, 読み取り専用

z属性に対応し、該当するfePointLight要素で使用されます。

SVGFESpotLightElement インターフェース

SVGFESpotLightElementインターフェースは、feSpotLight要素に対応します。

interface SVGFESpotLightElement : SVGElement {
  readonly attribute SVGAnimatedNumber x;
  readonly attribute SVGAnimatedNumber y;
  readonly attribute SVGAnimatedNumber z;
  readonly attribute SVGAnimatedNumber pointsAtX;
  readonly attribute SVGAnimatedNumber pointsAtY;
  readonly attribute SVGAnimatedNumber pointsAtZ;
  readonly attribute SVGAnimatedNumber specularExponent;
  readonly attribute SVGAnimatedNumber limitingConeAngle;
};
属性:
x, SVGAnimatedNumber, 読み取り専用

x属性に対応し、該当するfeSpotLight要素で使用されます。

y, SVGAnimatedNumber, 読み取り専用

y属性に対応し、該当するfeSpotLight要素で使用されます。

z, SVGAnimatedNumber, 読み取り専用

z属性に対応し、該当するfeSpotLight要素で使用されます。

pointsAtX, SVGAnimatedNumber, 読み取り専用

pointsAtX属性に対応し、該当するfeSpotLight要素で使用されます。

pointsAtY, SVGAnimatedNumber, 読み取り専用

pointsAtY属性に対応し、該当するfeSpotLight要素で使用されます。

pointsAtZ, SVGAnimatedNumber, 読み取り専用

pointsAtZ属性に対応し、該当するfeSpotLight要素で使用されます。

specularExponent, SVGAnimatedNumber, 読み取り専用

specularExponent属性に対応し、該当するfeSpotLight要素で使用されます。

limitingConeAngle, SVGAnimatedNumber, 読み取り専用

limitingConeAngle属性に対応し、該当するfeSpotLight要素で使用されます。

SVGFEDisplacementMapElement インターフェース

SVGFEDisplacementMapElementインターフェースは、feDisplacementMap要素に対応します。

interface SVGFEDisplacementMapElement : SVGElement {

  // Channel Selectors
  const unsigned short SVG_CHANNEL_UNKNOWN = 0;
  const unsigned short SVG_CHANNEL_R = 1;
  const unsigned short SVG_CHANNEL_G = 2;
  const unsigned short SVG_CHANNEL_B = 3;
  const unsigned short SVG_CHANNEL_A = 4;

  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedString in2;
  readonly attribute SVGAnimatedNumber scale;
  readonly attribute SVGAnimatedEnumeration xChannelSelector;
  readonly attribute SVGAnimatedEnumeration yChannelSelector;
};

SVGFEDisplacementMapElement includes SVGFilterPrimitiveStandardAttributes;
「チャンネルセレクター」グループの定数:
SVG_CHANNEL_UNKNOWN

タイプが事前定義されたタイプのいずれにも該当しません。このタイプの新しい値を定義したり、既存の値をこのタイプに切り替えようとすることは無効です。

SVG_CHANNEL_R

Rの値に対応します。

SVG_CHANNEL_G

Gの値に対応します。

SVG_CHANNEL_B

Bの値に対応します。

SVG_CHANNEL_A

Aの値に対応します。

属性:
in1, SVGAnimatedString, 読み取り専用

in属性に対応し、該当するfeDisplacementMap要素で使用されます。

in2, SVGAnimatedString, 読み取り専用

in2属性に対応し、該当するfeDisplacementMap要素で使用されます。

scale, SVGAnimatedNumber, 読み取り専用

scale属性に対応し、該当するfeDisplacementMap要素で使用されます。

xChannelSelector, SVGAnimatedEnumeration, 読み取り専用

xChannelSelector属性に対応し、該当するfeDisplacementMap要素で使用されます。値はこのインターフェースで定義されたSVG_CHANNEL_*定数のいずれかとなります。

yChannelSelector, SVGAnimatedEnumeration, 読み取り専用

yChannelSelector属性に対応し、該当するfeDisplacementMap要素で使用されます。値はこのインターフェースで定義されたSVG_CHANNEL_*定数のいずれかとなります。

SVGFEDropShadowElement インターフェース

SVGFEDropShadowElementインターフェースは、feDropShadow要素に対応します。

interface SVGFEDropShadowElement : SVGElement {
  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedNumber dx;
  readonly attribute SVGAnimatedNumber dy;
  readonly attribute SVGAnimatedNumber stdDeviationX;
  readonly attribute SVGAnimatedNumber stdDeviationY;

  void setStdDeviation(float stdDeviationX, float stdDeviationY);
};

SVGFEDropShadowElement includes SVGFilterPrimitiveStandardAttributes;
属性:
in1, SVGAnimatedString, 読み取り専用

in属性に対応し、該当するfeDropShadow要素で使用されます。

dx, SVGAnimatedNumber, 読み取り専用

dx属性に対応し、該当するfeDropShadow要素で使用されます。

dy, SVGAnimatedNumber, 読み取り専用

dy属性に対応し、該当するfeDropShadow要素で使用されます。

stdDeviationX, SVGAnimatedNumber, 読み取り専用

stdDeviation属性に対応し、該当するfeDropShadow要素で使用されます。属性stdDeviationのX成分を含みます。

stdDeviationY, SVGAnimatedNumber, 読み取り専用

stdDeviation属性に対応し、該当するfeDropShadow要素で使用されます。属性stdDeviationのY成分を含みます。

メソッド:
setStdDeviation(stdDeviationX, stdDeviationY)

属性stdDeviationの値を設定します。

stdDeviationX

属性stdDeviationのX成分です。

stdDeviationY

属性stdDeviationのY成分です。

SVGFEFloodElement インターフェース

SVGFEFloodElementインターフェースは、feFlood要素に対応します。

interface SVGFEFloodElement : SVGElement {
};

SVGFEFloodElement includes SVGFilterPrimitiveStandardAttributes;

SVGFEGaussianBlurElement インターフェース

SVGFEGaussianBlurElementインターフェースは、feGaussianBlur要素に対応します。

interface SVGFEGaussianBlurElement : SVGElement {

  // Edge Mode Values
  const unsigned short SVG_EDGEMODE_UNKNOWN = 0;
  const unsigned short SVG_EDGEMODE_DUPLICATE = 1;
  const unsigned short SVG_EDGEMODE_WRAP = 2;
  const unsigned short SVG_EDGEMODE_NONE = 3;

  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedNumber stdDeviationX;
  readonly attribute SVGAnimatedNumber stdDeviationY;
  readonly attribute SVGAnimatedEnumeration edgeMode;

  void setStdDeviation(float stdDeviationX, float stdDeviationY);
};

SVGFEGaussianBlurElement includes SVGFilterPrimitiveStandardAttributes;
「エッジモード値」グループの定数:
SVG_EDGEMODE_UNKNOWN

タイプが事前定義されたタイプのいずれにも該当しません。このタイプの新しい値を定義したり、既存の値をこのタイプに切り替えようとすることは無効です。

SVG_EDGEMODE_DUPLICATE

duplicateの値に対応します。

SVG_EDGEMODE_WRAP

wrapの値に対応します。

SVG_EDGEMODE_NONE

noneの値に対応します。

属性:
in1, SVGAnimatedString, 読み取り専用

in属性に対応し、該当するfeGaussianBlur要素で使用されます。

stdDeviationX, SVGAnimatedNumber, 読み取り専用

stdDeviation属性に対応し、該当するfeGaussianBlur要素で使用されます。属性stdDeviationのX成分を含みます。

stdDeviationY, SVGAnimatedNumber, 読み取り専用

stdDeviation属性に対応し、該当するfeGaussianBlur要素で使用されます。属性stdDeviationのY成分を含みます。

edgeMode, SVGAnimatedEnumeration, 読み取り専用

edgeMode属性に対応し、該当するfeGaussianBlur要素で使用されます。値はこのインターフェースで定義されたSVG_EDGEMODE_*定数のいずれかとなります。

メソッド:
setStdDeviation(stdDeviationX, stdDeviationY)

属性stdDeviationの値を設定します。

stdDeviationX

属性stdDeviationのX成分です。

stdDeviationY

属性stdDeviationのY成分です。

SVGFEImageElement インターフェース

SVGFEImageElementインターフェースは、feImage要素に対応します。

interface SVGFEImageElement : SVGElement {
  readonly attribute SVGAnimatedPreserveAspectRatio preserveAspectRatio;
  readonly attribute SVGAnimatedString crossOrigin;
};

SVGFEImageElement includes SVGFilterPrimitiveStandardAttributes;
SVGFEImageElement includes SVGURIReference;
属性:
preserveAspectRatio, SVGAnimatedPreserveAspectRatio, 読み取り専用

preserveAspectRatio属性に対応し、該当するfeImage要素で使用されます。

crossOrigin, SVGAnimatedString, 読み取り専用

crossOrigin IDL属性はcrossorigin内容属性を反映し、既知の値のみに制限されます。

SVGFEMergeElement インターフェース

SVGFEMergeElementインターフェースは、feMerge要素に対応します。

interface SVGFEMergeElement : SVGElement {
};

SVGFEMergeElement includes SVGFilterPrimitiveStandardAttributes;

SVGFEMergeNodeElement インターフェース

SVGFEMergeNodeElementインターフェースは、feMergeNode要素に対応します。

interface SVGFEMergeNodeElement : SVGElement {
  readonly attribute SVGAnimatedString in1;
};
属性:
in1, SVGAnimatedString, 読み取り専用

in属性に対応し、該当するfeMergeNode要素で使用されます。

インターフェイス SVGFEMorphologyElement

SVGFEMorphologyElement インターフェイスは feMorphology 要素に対応します。

interface SVGFEMorphologyElement : SVGElement {

  // Morphology Operators
  const unsigned short SVG_MORPHOLOGY_OPERATOR_UNKNOWN = 0;
  const unsigned short SVG_MORPHOLOGY_OPERATOR_ERODE = 1;
  const unsigned short SVG_MORPHOLOGY_OPERATOR_DILATE = 2;

  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedEnumeration operator;
  readonly attribute SVGAnimatedNumber radiusX;
  readonly attribute SVGAnimatedNumber radiusY;
};

SVGFEMorphologyElement includes SVGFilterPrimitiveStandardAttributes;
「Morphology Operators」グループの定数:
SVG_MORPHOLOGY_OPERATOR_UNKNOWN

型が事前定義された型のいずれにも該当しません。この型の新しい値を定義したり、既存の値をこの型に変更しようとするのは無効です。

SVG_MORPHOLOGY_OPERATOR_ERODE

erode値に対応します。

SVG_MORPHOLOGY_OPERATOR_DILATE

dilate値に対応します。

属性:
in1, SVGAnimatedString, 読み取り専用

与えられたfeMorphology要素のin属性に対応します。

operator, SVGAnimatedEnumeration, 読み取り専用

与えられたfeMorphology要素のoperator属性に対応します。このインターフェイスで定義されているSVG_MORPHOLOGY_OPERATOR_*定数のいずれかを取ります。

radiusX, SVGAnimatedNumber, 読み取り専用

与えられたfeMorphology要素のradius属性に対応します。radius属性のX成分を含みます。

radiusY, SVGAnimatedNumber, 読み取り専用

与えられたfeMorphology要素のradius属性に対応します。radius属性のY成分を含みます。

インターフェイス SVGFEOffsetElement

SVGFEOffsetElement インターフェイスは feOffset 要素に対応します。

interface SVGFEOffsetElement : SVGElement {
  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedNumber dx;
  readonly attribute SVGAnimatedNumber dy;
};

SVGFEOffsetElement includes SVGFilterPrimitiveStandardAttributes;
属性:
in1, SVGAnimatedString, 読み取り専用

与えられたfeOffset要素のin属性に対応します。

dx, SVGAnimatedNumber, 読み取り専用

与えられたfeOffset要素のdx属性に対応します。

dy, SVGAnimatedNumber, 読み取り専用

与えられたfeOffset要素のdy属性に対応します。

インターフェイス SVGFESpecularLightingElement

SVGFESpecularLightingElement インターフェイスは feSpecularLighting要素に対応します。

interface SVGFESpecularLightingElement : SVGElement {
  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedNumber surfaceScale;
  readonly attribute SVGAnimatedNumber specularConstant;
  readonly attribute SVGAnimatedNumber specularExponent;
  readonly attribute SVGAnimatedNumber kernelUnitLengthX;
  readonly attribute SVGAnimatedNumber kernelUnitLengthY;
};

SVGFESpecularLightingElement includes SVGFilterPrimitiveStandardAttributes;
属性:
in1, SVGAnimatedString, 読み取り専用

与えられたfeSpecularLighting要素のin属性に対応します。

surfaceScale, SVGAnimatedNumber, 読み取り専用

与えられたfeSpecularLighting要素のsurfaceScale属性に対応します。

specularConstant, SVGAnimatedNumber, 読み取り専用

与えられたfeSpecularLighting要素のspecularConstant属性に対応します。

specularExponent, SVGAnimatedNumber, 読み取り専用

与えられたfeSpecularLighting要素のspecularExponent属性に対応します。

kernelUnitLengthX, SVGAnimatedNumber, 読み取り専用

与えられたfeSpecularLighting要素のkernelUnitLength属性のX成分に対応します。

kernelUnitLengthY, SVGAnimatedNumber, 読み取り専用

与えられたfeSpecularLighting要素のkernelUnitLength属性のY成分に対応します。

インターフェイス SVGFETileElement

SVGFETileElement インターフェイスは feTile 要素に対応します。

interface SVGFETileElement : SVGElement {
  readonly attribute SVGAnimatedString in1;
};

SVGFETileElement includes SVGFilterPrimitiveStandardAttributes;
属性:
in1, SVGAnimatedString, 読み取り専用

与えられたfeTile要素のin属性に対応します。

インターフェイス SVGFETurbulenceElement

SVGFETurbulenceElement インターフェイスは feTurbulence 要素に対応します。

interface SVGFETurbulenceElement : SVGElement {

  // 乱流タイプ
  const unsigned short SVG_TURBULENCE_TYPE_UNKNOWN = 0;
  const unsigned short SVG_TURBULENCE_TYPE_FRACTALNOISE = 1;
  const unsigned short SVG_TURBULENCE_TYPE_TURBULENCE = 2;

  // ステッチオプション
  const unsigned short SVG_STITCHTYPE_UNKNOWN = 0;
  const unsigned short SVG_STITCHTYPE_STITCH = 1;
  const unsigned short SVG_STITCHTYPE_NOSTITCH = 2;

  readonly attribute SVGAnimatedNumber baseFrequencyX;
  readonly attribute SVGAnimatedNumber baseFrequencyY;
  readonly attribute SVGAnimatedInteger numOctaves;
  readonly attribute SVGAnimatedNumber seed;
  readonly attribute SVGAnimatedEnumeration stitchTiles;
  readonly attribute SVGAnimatedEnumeration type;
};

SVGFETurbulenceElement includes SVGFilterPrimitiveStandardAttributes;
「Turbulence Types」グループの定数:
SVG_TURBULENCE_TYPE_UNKNOWN

型が事前定義された型のいずれにも該当しません。この型の新しい値を定義したり、既存の値をこの型に変更しようとするのは無効です。

SVG_TURBULENCE_TYPE_FRACTALNOISE

fractalNoise値に対応します。

SVG_TURBULENCE_TYPE_TURBULENCE

turbulence値に対応します。

「Stitch Options」グループの定数:
SVG_STITCHTYPE_UNKNOWN

型が事前定義された型のいずれにも該当しません。この型の新しい値を定義したり、既存の値をこの型に変更しようとするのは無効です。

SVG_STITCHTYPE_STITCH

stitch値に対応します。

SVG_STITCHTYPE_NOSTITCH

noStitch値に対応します。

属性:
baseFrequencyX, SVGAnimatedNumber, 読み取り専用

与えられたfeTurbulence要素のbaseFrequency属性に対応します。baseFrequency属性のX成分を含みます。

baseFrequencyY, SVGAnimatedNumber, 読み取り専用

与えられたfeTurbulence要素のbaseFrequency属性に対応します。baseFrequency属性のY成分を含みます。

numOctaves, SVGAnimatedInteger, 読み取り専用

与えられたfeTurbulence要素のnumOctaves属性に対応します。

seed, SVGAnimatedNumber, 読み取り専用

与えられたfeTurbulence要素のseed属性に対応します。

stitchTiles, SVGAnimatedEnumeration, 読み取り専用

与えられたfeTurbulence要素のstitchTiles属性に対応します。このインターフェイスで定義されているSVG_TURBULENCE_TYPE_*定数のいずれかを取ります。

type, SVGAnimatedEnumeration, 読み取り専用

与えられたfeTurbulence要素のtype属性に対応します。このインターフェイスで定義されているSVG_STITCHTYPE_*定数のいずれかを取ります。

変更点

以下は2014年11月25日作業草案以降に加えられた主な変更点です。

以下は2013年11月26日作業草案以降に加えられた主な変更点です。

以下は2012年10月25日作業草案以降に加えられた主な変更点です。

詳細かつ長期的な変更についてはChangeLogをご覧ください。

謝辞

編集者は、Robert O’Callahan、Coralie Mercier、Chris Lilley、Nikos Andronikos、Stephen Chenney、Simon Fraser、Tavmjong Bah、Robert Longson、Cameron McCormack、Brad Kemper、Tab Atkins、Brian Birtles、Michael Mullany、Rik Cabanier、Anne van Kesteren、Boris Zbarsky、Kristopher Giesing、Stephen White、 Jasper van de Gronde、Kang-Hao Lu、Paul LeBeau、Debarshi Ray、Jarek Foksa、Sebastian Zartner、Yuqian Li、 Amelia Bellamy-Royds、Max Vujovic の慎重なレビュー、コメント、修正に感謝します。

適合性

文書の規約

適合性要件は、説明的な主張とRFC 2119の用語の組み合わせで表現されます。規範的な部分における“MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, “OPTIONAL”というキーワードはRFC 2119の定義通りに解釈されます。 ただし、可読性のため、本仕様書ではこれらの単語はすべて大文字では記載されません。

本仕様書のすべてのテキストは、明示的に非規範的と記載されている節、例、および注を除き、規範的です。[RFC2119]

本仕様書の例は「例えば」で始まるか、class="example"で規範的なテキストから区別されます。例えば、次のようになります:

これは参考例の一例です。

参考注記は「注」で始まり、class="note"で規範的なテキストから区別されます。例えば、次のようになります:

注:これは参考注記です。

勧告は、特別な注意を喚起するようにスタイルされた規範的なセクションであり、<strong class="advisement">で他の規範的テキストから区別され、次のようになります: UAはアクセシブルな代替手段を提供しなければなりません。

適合性クラス

本仕様への適合性は、次の3つの適合性クラスに対して定義されます:

スタイルシート
CSSスタイルシート
レンダラー
UA。スタイルシートの意味を解釈し、それらを使用する文書をレンダリングします。
オーサリングツール
UA。スタイルシートを書き出します。

スタイルシートが本仕様に適合しているとされるのは、本モジュールで定義された構文を用いるすべての文が、汎用CSS文法および本モジュールで定義される各機能の個別文法に従って有効である場合です。

レンダラーが本仕様に適合しているとされるのは、スタイルシートを適切な仕様で定義された通りに解釈することに加え、本仕様で定義されるすべての機能を正しく解析して適切に文書をレンダリングする場合です。ただし、デバイスの制限によりUAが文書を正しくレンダリングできない場合であっても、UAが非適合であるとはみなされません(例えば、UAはモノクロモニターで色をレンダリングする必要はありません)。

オーサリングツールが本仕様に適合しているとされるのは、汎用CSS文法および本モジュールの各機能の個別文法に従って構文的に正しいスタイルシートを書き出し、かつ本モジュールで記載されるスタイルシートのその他すべての適合要件を満たす場合です。

CSSの責任ある実装のための要件

以下の節では、CSSの実装を現在および将来の相互運用性を促進する形で責任を持って行うための、いくつかの適合性要件を定義します。

部分的な実装

著者が前方互換性のある構文解析規則を活用してフォールバック値を割り当てられるように、CSSレンダラーは、サポートできるレベルが有用でないat規則、プロパティ、プロパティ値、キーワード、その他の構文要素を無効として(そして適切に無視して)扱わなければなりません。 特に、ユーザーエージェントは単一の複数値プロパティ宣言内で、サポートされていない値のみを選択的に無視し、サポートされた値だけを適用してはなりません。 いずれかの値が無効(サポートされていない値は必ず無効)とみなされた場合、CSSでは宣言全体が無視されなければなりません。

不安定および独自機能の実装

将来の安定したCSS機能との衝突を避けるため、CSSWGはベストプラクティスに従って、不安定な機能や独自拡張のCSS実装を行うことを推奨します。

CRレベル機能の実装

仕様がCandidate Recommendation段階に到達したら、実装者は仕様に従って正しく実装されていることを示すことができるCRレベルの機能について、プリフィックスなしの実装を公開し、プリフィックス付きのバリアントは公開しないようにすべきです。

CSSの実装間で相互運用性を確立・維持するため、CSSワーキンググループは、実験的でないCSSレンダラーに対し、CSS機能のプリフィックスなし実装を公開する前に実装報告書(必要に応じてその実装報告書に使われたテストケースも)をW3Cに提出するよう求めています。W3Cに提出されたテストケースはCSSワーキンググループによるレビューと修正の対象となります。

テストケースおよび実装報告書の提出についての詳細は、CSSワーキンググループのWebサイトhttps://www.w3.org/Style/CSS/Test/をご覧ください。 質問はpublic-css-testsuite@w3.orgメーリングリストまでどうぞ。

索引

本仕様で定義されている用語

参照によって定義された用語

参考文献

規範的な参考文献

[COMPOSITING-1]
Rik Cabanier; Nikos Andronikos. Compositing and Blending Level 1. 2015年1月13日. CR. URL: https://www.w3.org/TR/compositing-1/
[CSS-CASCADE-4]
Elika Etemad; Tab Atkins Jr.. CSS Cascading and Inheritance Level 4. 2018年8月28日. CR. URL: https://www.w3.org/TR/css-cascade-4/
[CSS-COLOR-4]
Tab Atkins Jr.; Chris Lilley. CSS Color Module Level 4. 2016年7月5日. WD. URL: https://www.w3.org/TR/css-color-4/
[CSS-DISPLAY-3]
Tab Atkins Jr.; Elika Etemad. CSS Display Module Level 3. 2018年8月28日. CR. URL: https://www.w3.org/TR/css-display-3/
[CSS-FONTS-3]
John Daggett; Myles Maxfield; Chris Lilley. CSS Fonts Module Level 3. 2018年9月20日. REC. URL: https://www.w3.org/TR/css-fonts-3/
[CSS-FONTS-4]
John Daggett; Myles Maxfield; Chris Lilley. CSS Fonts Module Level 4. 2018年9月20日. WD. URL: https://www.w3.org/TR/css-fonts-4/
[CSS-MASKING-1]
Dirk Schulze; Brian Birtles; Tab Atkins Jr.. CSS Masking Module Level 1. 2014年8月26日. CR. URL: https://www.w3.org/TR/css-masking-1/
[CSS-OVERFLOW-3]
David Baron; Elika Etemad; Florian Rivoal. CSS Overflow Module Level 3. 2018年7月31日. WD. URL: https://www.w3.org/TR/css-overflow-3/
[CSS-POSITION-3]
Rossen Atanassov; Arron Eicholz. CSS Positioned Layout Module Level 3. 2016年5月17日. WD. URL: https://www.w3.org/TR/css-position-3/
[CSS-TEXT-3]
Elika Etemad; Koji Ishii; Florian Rivoal. CSS Text Module Level 3. 2018年12月12日. WD. URL: https://www.w3.org/TR/css-text-3/
[CSS-TEXT-DECOR-3]
Elika Etemad; Koji Ishii. CSS Text Decoration Module Level 3. 2018年7月3日. CR. URL: https://www.w3.org/TR/css-text-decor-3/
[CSS-TRANSFORMS-1]
Simon Fraser; 他. CSS Transforms Module Level 1. 2018年11月30日. WD. URL: https://www.w3.org/TR/css-transforms-1/
[CSS-UI-3]
Tantek Çelik; Florian Rivoal. CSS Basic User Interface Module Level 3 (CSS3 UI). 2018年6月21日. REC. URL: https://www.w3.org/TR/css-ui-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4. 2018年10月10日. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-WRITING-MODES-3]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 3. 2018年5月24日. CR. URL: https://www.w3.org/TR/css-writing-modes-3/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 4. 2018年5月24日. CR. URL: https://www.w3.org/TR/css-writing-modes-4/
[CSS21]
Bert Bos; 他. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011年6月7日. REC. URL: https://www.w3.org/TR/CSS2/
[CSS3-IMAGES]
Elika Etemad; Tab Atkins Jr.. CSS Image Values and Replaced Content Module Level 3. 2012年4月17日. CR. URL: https://www.w3.org/TR/css3-images/
[CSS3BG]
Bert Bos; Elika Etemad; Brad Kemper. CSS Backgrounds and Borders Module Level 3. 2017年10月17日. CR. URL: https://www.w3.org/TR/css-backgrounds-3/
[CSS3COLOR]
Tantek Çelik; Chris Lilley; David Baron. CSS Color Module Level 3. 2018年6月19日. REC. URL: https://www.w3.org/TR/css-color-3/
[CSS3VAL]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 3. 2018年8月14日. CR. URL: https://www.w3.org/TR/css-values-3/
[HTML]
Anne van Kesteren; 他. HTML標準. 現行標準. URL: https://html.spec.whatwg.org/multipage/
[HTML5]
Ian Hickson; 他. HTML5. 2018年3月27日. REC. URL: https://www.w3.org/TR/html5/
[MEDIAQUERIES-5]
Media Queries Level 5 URL: https://drafts.csswg.org/mediaqueries-5/
[RFC2119]
S. Bradner. RFCにおける要件レベルを示すキーワード. 1997年3月. Best Current Practice. URL: https://tools.ietf.org/html/rfc2119
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. Selectors Level 4. 2018年11月21日. WD. URL: https://www.w3.org/TR/selectors-4/
[SVG11]
Erik Dahlström; 他. スケーラブル・ベクター・グラフィックス(SVG) 1.1 (第2版). 2011年8月16日. REC. URL: https://www.w3.org/TR/SVG11/
[SVG2]
Amelia Bellamy-Royds; 他. スケーラブル・ベクター・グラフィックス(SVG) 2. 2018年10月4日. CR. URL: https://www.w3.org/TR/SVG2/
[WebIDL]
Cameron McCormack; Boris Zbarsky; Tobie Langel. Web IDL. 2016年12月15日. ED. URL: https://heycam.github.io/webidl/

参考情報

[ArTD]
B. Jacob. 演算タイミングの違い. URL: https://wiki.mozilla.org/User:Bjacob/ArithmeticTimingDifferences
[Cmam]
IEC. IEC 61966-2-1:1999 色測定および管理 - 第2-1部: 色管理 - デフォルトRGB色空間 - sRGB. URL: https://webstore.iec.ch/publication/6169
[CSS3-ANIMATIONS]
Dean Jackson; 他. CSS Animations Level 1. 2018年10月11日. WD. URL: https://www.w3.org/TR/css-animations-1/
[PORTERDUFF]
Thomas Porter; Tom Duff. 合成デジタル画像.
[TaM]
Ebert 他, AP Professional. テクスチャリングとモデリング. 1994年.

プロパティ索引

名前 初期値 適用対象 継承 %ages アニメーション可能 正規順序 算出値 メディア
color-interpolation-filters auto | sRGB | linearRGB linearRGB すべてのフィルタープリミティブ はい 該当なし いいえ 文法通り 指定された通り visual
filter none | <filter-value-list> none すべての要素。SVGではdefs要素を除くコンテナ要素、すべてのグラフィック要素、use要素に適用されます。 いいえ 該当なし フィルターのアニメーションの記述を参照 文法通り 指定された通り visual
flood-color <color> black feFlood要素およびfeDropShadow要素 いいえ 該当なし 色として 文法通り 指定された通り visual
flood-opacity <alpha-value> 1 feFlood要素およびfeDropShadow要素 いいえ 該当なし 数値またはパーセンテージとして 文法通り 指定値を0~1範囲にクランプした数値 visual
lighting-color <color> white feDiffuseLighting要素およびfeSpecularLighting要素 いいえ 該当なし 色として 文法通り 指定された通り visual

IDL索引

interface SVGFilterElement : SVGElement {
  readonly attribute SVGAnimatedEnumeration filterUnits;
  readonly attribute SVGAnimatedEnumeration primitiveUnits;
  readonly attribute SVGAnimatedLength x;
  readonly attribute SVGAnimatedLength y;
  readonly attribute SVGAnimatedLength width;
  readonly attribute SVGAnimatedLength height;
};

SVGFilterElement includes SVGURIReference;

interface mixin SVGFilterPrimitiveStandardAttributes {
  readonly attribute SVGAnimatedLength x;
  readonly attribute SVGAnimatedLength y;
  readonly attribute SVGAnimatedLength width;
  readonly attribute SVGAnimatedLength height;
  readonly attribute SVGAnimatedString result;
};

interface SVGFEBlendElement : SVGElement {

  // Blend Mode Types
  const unsigned short SVG_FEBLEND_MODE_UNKNOWN = 0;
  const unsigned short SVG_FEBLEND_MODE_NORMAL = 1;
  const unsigned short SVG_FEBLEND_MODE_MULTIPLY = 2;
  const unsigned short SVG_FEBLEND_MODE_SCREEN = 3;
  const unsigned short SVG_FEBLEND_MODE_DARKEN = 4;
  const unsigned short SVG_FEBLEND_MODE_LIGHTEN = 5;
  const unsigned short SVG_FEBLEND_MODE_OVERLAY = 6;
  const unsigned short SVG_FEBLEND_MODE_COLOR_DODGE = 7;
  const unsigned short SVG_FEBLEND_MODE_COLOR_BURN = 8;
  const unsigned short SVG_FEBLEND_MODE_HARD_LIGHT = 9;
  const unsigned short SVG_FEBLEND_MODE_SOFT_LIGHT = 10;
  const unsigned short SVG_FEBLEND_MODE_DIFFERENCE = 11;
  const unsigned short SVG_FEBLEND_MODE_EXCLUSION = 12;
  const unsigned short SVG_FEBLEND_MODE_HUE = 13;
  const unsigned short SVG_FEBLEND_MODE_SATURATION = 14;
  const unsigned short SVG_FEBLEND_MODE_COLOR = 15;
  const unsigned short SVG_FEBLEND_MODE_LUMINOSITY = 16;

  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedString in2;
  readonly attribute SVGAnimatedEnumeration mode;
};

SVGFEBlendElement includes SVGFilterPrimitiveStandardAttributes;

interface SVGFEColorMatrixElement : SVGElement {

  // Color Matrix Types
  const unsigned short SVG_FECOLORMATRIX_TYPE_UNKNOWN = 0;
  const unsigned short SVG_FECOLORMATRIX_TYPE_MATRIX = 1;
  const unsigned short SVG_FECOLORMATRIX_TYPE_SATURATE = 2;
  const unsigned short SVG_FECOLORMATRIX_TYPE_HUEROTATE = 3;
  const unsigned short SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA = 4;

  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedEnumeration type;
  readonly attribute SVGAnimatedNumberList values;
};

SVGFEColorMatrixElement includes SVGFilterPrimitiveStandardAttributes;

interface SVGFEComponentTransferElement : SVGElement {
  readonly attribute SVGAnimatedString in1;
};

SVGFEComponentTransferElement includes SVGFilterPrimitiveStandardAttributes;

interface SVGComponentTransferFunctionElement : SVGElement {

  // Component Transfer Types
  const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN = 0;
  const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY = 1;
  const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_TABLE = 2;
  const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE = 3;
  const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_LINEAR = 4;
  const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_GAMMA = 5;

  readonly attribute SVGAnimatedEnumeration type;
  readonly attribute SVGAnimatedNumberList tableValues;
  readonly attribute SVGAnimatedNumber slope;
  readonly attribute SVGAnimatedNumber intercept;
  readonly attribute SVGAnimatedNumber amplitude;
  readonly attribute SVGAnimatedNumber exponent;
  readonly attribute SVGAnimatedNumber offset;
};

interface SVGFEFuncRElement : SVGComponentTransferFunctionElement {
};

interface SVGFEFuncGElement : SVGComponentTransferFunctionElement {
};

interface SVGFEFuncBElement : SVGComponentTransferFunctionElement {
};

interface SVGFEFuncAElement : SVGComponentTransferFunctionElement {
};

interface SVGFECompositeElement : SVGElement {

  // Composite Operators
  const unsigned short SVG_FECOMPOSITE_OPERATOR_UNKNOWN = 0;
  const unsigned short SVG_FECOMPOSITE_OPERATOR_OVER = 1;
  const unsigned short SVG_FECOMPOSITE_OPERATOR_IN = 2;
  const unsigned short SVG_FECOMPOSITE_OPERATOR_OUT = 3;
  const unsigned short SVG_FECOMPOSITE_OPERATOR_ATOP = 4;
  const unsigned short SVG_FECOMPOSITE_OPERATOR_XOR = 5;
  const unsigned short SVG_FECOMPOSITE_OPERATOR_ARITHMETIC = 6;

  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedString in2;
  readonly attribute SVGAnimatedEnumeration operator;
  readonly attribute SVGAnimatedNumber k1;
  readonly attribute SVGAnimatedNumber k2;
  readonly attribute SVGAnimatedNumber k3;
  readonly attribute SVGAnimatedNumber k4;
};

SVGFECompositeElement includes SVGFilterPrimitiveStandardAttributes;

interface SVGFEConvolveMatrixElement : SVGElement {

  // Edge Mode Values
  const unsigned short SVG_EDGEMODE_UNKNOWN = 0;
  const unsigned short SVG_EDGEMODE_DUPLICATE = 1;
  const unsigned short SVG_EDGEMODE_WRAP = 2;
  const unsigned short SVG_EDGEMODE_NONE = 3;

  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedInteger orderX;
  readonly attribute SVGAnimatedInteger orderY;
  readonly attribute SVGAnimatedNumberList kernelMatrix;
  readonly attribute SVGAnimatedNumber divisor;
  readonly attribute SVGAnimatedNumber bias;
  readonly attribute SVGAnimatedInteger targetX;
  readonly attribute SVGAnimatedInteger targetY;
  readonly attribute SVGAnimatedEnumeration edgeMode;
  readonly attribute SVGAnimatedNumber kernelUnitLengthX;
  readonly attribute SVGAnimatedNumber kernelUnitLengthY;
  readonly attribute SVGAnimatedBoolean preserveAlpha;
};

SVGFEConvolveMatrixElement includes SVGFilterPrimitiveStandardAttributes;

interface SVGFEDiffuseLightingElement : SVGElement {
  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedNumber surfaceScale;
  readonly attribute SVGAnimatedNumber diffuseConstant;
  readonly attribute SVGAnimatedNumber kernelUnitLengthX;
  readonly attribute SVGAnimatedNumber kernelUnitLengthY;
};

SVGFEDiffuseLightingElement includes SVGFilterPrimitiveStandardAttributes;

interface SVGFEDistantLightElement : SVGElement {
  readonly attribute SVGAnimatedNumber azimuth;
  readonly attribute SVGAnimatedNumber elevation;
};

interface SVGFEPointLightElement : SVGElement {
  readonly attribute SVGAnimatedNumber x;
  readonly attribute SVGAnimatedNumber y;
  readonly attribute SVGAnimatedNumber z;
};

interface SVGFESpotLightElement : SVGElement {
  readonly attribute SVGAnimatedNumber x;
  readonly attribute SVGAnimatedNumber y;
  readonly attribute SVGAnimatedNumber z;
  readonly attribute SVGAnimatedNumber pointsAtX;
  readonly attribute SVGAnimatedNumber pointsAtY;
  readonly attribute SVGAnimatedNumber pointsAtZ;
  readonly attribute SVGAnimatedNumber specularExponent;
  readonly attribute SVGAnimatedNumber limitingConeAngle;
};

interface SVGFEDisplacementMapElement : SVGElement {

  // Channel Selectors
  const unsigned short SVG_CHANNEL_UNKNOWN = 0;
  const unsigned short SVG_CHANNEL_R = 1;
  const unsigned short SVG_CHANNEL_G = 2;
  const unsigned short SVG_CHANNEL_B = 3;
  const unsigned short SVG_CHANNEL_A = 4;

  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedString in2;
  readonly attribute SVGAnimatedNumber scale;
  readonly attribute SVGAnimatedEnumeration xChannelSelector;
  readonly attribute SVGAnimatedEnumeration yChannelSelector;
};

SVGFEDisplacementMapElement includes SVGFilterPrimitiveStandardAttributes;

interface SVGFEDropShadowElement : SVGElement {
  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedNumber dx;
  readonly attribute SVGAnimatedNumber dy;
  readonly attribute SVGAnimatedNumber stdDeviationX;
  readonly attribute SVGAnimatedNumber stdDeviationY;

  void setStdDeviation(float stdDeviationX, float stdDeviationY);
};

SVGFEDropShadowElement includes SVGFilterPrimitiveStandardAttributes;

interface SVGFEFloodElement : SVGElement {
};

SVGFEFloodElement includes SVGFilterPrimitiveStandardAttributes;

interface SVGFEGaussianBlurElement : SVGElement {

  // Edge Mode Values
  const unsigned short SVG_EDGEMODE_UNKNOWN = 0;
  const unsigned short SVG_EDGEMODE_DUPLICATE = 1;
  const unsigned short SVG_EDGEMODE_WRAP = 2;
  const unsigned short SVG_EDGEMODE_NONE = 3;

  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedNumber stdDeviationX;
  readonly attribute SVGAnimatedNumber stdDeviationY;
  readonly attribute SVGAnimatedEnumeration edgeMode;

  void setStdDeviation(float stdDeviationX, float stdDeviationY);
};

SVGFEGaussianBlurElement includes SVGFilterPrimitiveStandardAttributes;

interface SVGFEImageElement : SVGElement {
  readonly attribute SVGAnimatedPreserveAspectRatio preserveAspectRatio;
  readonly attribute SVGAnimatedString crossOrigin;
};

SVGFEImageElement includes SVGFilterPrimitiveStandardAttributes;
SVGFEImageElement includes SVGURIReference;

interface SVGFEMergeElement : SVGElement {
};

SVGFEMergeElement includes SVGFilterPrimitiveStandardAttributes;

interface SVGFEMergeNodeElement : SVGElement {
  readonly attribute SVGAnimatedString in1;
};

interface SVGFEMorphologyElement : SVGElement {

  // Morphology Operators
  const unsigned short SVG_MORPHOLOGY_OPERATOR_UNKNOWN = 0;
  const unsigned short SVG_MORPHOLOGY_OPERATOR_ERODE = 1;
  const unsigned short SVG_MORPHOLOGY_OPERATOR_DILATE = 2;

  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedEnumeration operator;
  readonly attribute SVGAnimatedNumber radiusX;
  readonly attribute SVGAnimatedNumber radiusY;
};

SVGFEMorphologyElement includes SVGFilterPrimitiveStandardAttributes;

interface SVGFEOffsetElement : SVGElement {
  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedNumber dx;
  readonly attribute SVGAnimatedNumber dy;
};

SVGFEOffsetElement includes SVGFilterPrimitiveStandardAttributes;

interface SVGFESpecularLightingElement : SVGElement {
  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedNumber surfaceScale;
  readonly attribute SVGAnimatedNumber specularConstant;
  readonly attribute SVGAnimatedNumber specularExponent;
  readonly attribute SVGAnimatedNumber kernelUnitLengthX;
  readonly attribute SVGAnimatedNumber kernelUnitLengthY;
};

SVGFESpecularLightingElement includes SVGFilterPrimitiveStandardAttributes;

interface SVGFETileElement : SVGElement {
  readonly attribute SVGAnimatedString in1;
};

SVGFETileElement includes SVGFilterPrimitiveStandardAttributes;

interface SVGFETurbulenceElement : SVGElement {

  // Turbulence Types
  const unsigned short SVG_TURBULENCE_TYPE_UNKNOWN = 0;
  const unsigned short SVG_TURBULENCE_TYPE_FRACTALNOISE = 1;
  const unsigned short SVG_TURBULENCE_TYPE_TURBULENCE = 2;

  // Stitch Options
  const unsigned short SVG_STITCHTYPE_UNKNOWN = 0;
  const unsigned short SVG_STITCHTYPE_STITCH = 1;
  const unsigned short SVG_STITCHTYPE_NOSTITCH = 2;

  readonly attribute SVGAnimatedNumber baseFrequencyX;
  readonly attribute SVGAnimatedNumber baseFrequencyY;
  readonly attribute SVGAnimatedInteger numOctaves;
  readonly attribute SVGAnimatedNumber seed;
  readonly attribute SVGAnimatedEnumeration stitchTiles;
  readonly attribute SVGAnimatedEnumeration type;
};

SVGFETurbulenceElement includes SVGFilterPrimitiveStandardAttributes;

課題索引

filterは固定背景画像に対してどのように動作しますか? <https://github.com/w3c/csswg-drafts/issues/238>
値リストのエントリー数が無効の場合、どのような挙動となりますか? <https://github.com/w3c/csswg-drafts/issues/237>
実装が仕様と一致しません。 <https://github.com/w3c/csswg-drafts/issues/113>
filter関数の距離の計算方法。 <https://github.com/w3c/csswg-drafts/issues/91>