この節で定義するオペレータは、Display PostScript 言語の拡張機能です。標準 DPS の一部ではないので、どの DPS 実装でも使用できるとは限りません。これらのオペレータに依存するアプリケーションには移植性がなく、これらのオペレータをサポートしないサーバー上では表示できません。
合成とは、Display PostScript システムを OpenStepTM において拡張した機能です。合成により、別々に描画されたイメージを組み合わせて最終的なイメージを生成できます。この拡張機能により、次のようにさまざまなイメージ処理機能が提供されます。
ある場所から別の場所へというように、PostScript を使用してイメージを単純にコピーする。
2 つのイメージを追加して、相互に重なり合って混ぜたように表示する。
組み合わせたイメージの一方または両方の透明部分を活用する多数の処理を定義する。イメージが合成されると、一方のイメージが透明なので、他方のイメージの一部を表示できる。
合成機能は、同じウィンドウ内でスクロールしてコピーするとき、またはあるドロアブル内で描画したイメージを取り出して別の領域に転送するときに使用できます。OpenStep アプリケーションでは、一般にイメージはピックスマップに格納され、必要に応じてウィンドウに合成されます。
イメージが部分的に透明な場合は、そのイメージの透明部分によって他方のどの部分が表示されるかを合成により調整できます。合成の各操作において、さまざまな方法で透明部分を利用します。通常の操作では、あるイメージが他のイメージの背景または前景となります。イメージの一部が透明な場合は、不透明な背景の上で合成できます。これにより、上になったイメージにある透明の「穴」を通して見えるようになります。また、操作によっては、あるイメージの透明部分を使用して、合成したイメージの対応部分を「消去」できます。ほとんどの処理では、両方のイメージの透明部分に基づいて合成を計算します。
透明部分を利用する合成では、さまざまな視覚効果を生み出すことができます。一部が透明な均一のグレイ領域を淡彩のように使用すると、一緒に合成したイメージの色を濃くすることができます。一部が透明なグレイのパッチを使用すると、別のイメージに陰を追加できます。2 つのイメージの透明部分を段階的に変更しながら繰り返し合成すると、一方からもう一方へのグラデーションを表示できます。また、固定した背景上で動画を合成できます。
イメージを合成する前に、それを描画しなければなりません。合成時に透明を活用するには、少なくとも 1 つのイメージを透明ペイントで描画する必要があります。
次の PostScript プログラムの抜粋は、合成オペレータの使用方法を示しています。このプログラムは、2 つの単純なイメージを作成して合成します。第 1 のイメージである宛先は、白地に作成される 0.8 のグレイの三角形です。第 2 のソースは、透明の背景上に作成される 0.6 のグレイの三角形です。
% 宛先三角形の作成 0.8 setgray 100 100 moveto 100 0 rlineto 0 -100 rlineto fill % ソースの背景を透明にする 0 setalpha 0 0 100 100 rectfill % ソース三角形の描画 1 setalpha 0.6 setgray 0 0 moveto 0 100 rlineto 100 0 rlineto fill % 結果の計算 0 0 100 100 null 100 0 Sover composite
8 番目の合成オペレータ、Sover では、ソースピクセルと宛先ピクセルの組み合わせ方が定義されます。この例では、ソースイメージのうち不透明な部分が宛先イメージ上に配置されます。結果的に生成されるイメージは、図 2-2 のようになります。
この節では、新しい DPS オペレータについて説明します。この情報は、PostScript のマニュアル『PostScript Language Reference Manual』と『Display PostScript System with X』で使用されている形式で掲載してあります。
setalpha coverage setalpha
現在のグラフィックス状態の coverage パラメータを coverage に設定します。coverage は 0 から 1 までの数値で、0 は透明に対応し、1 は不透明な状態に対応し、その間の値は部分的なカバレージに対応します。デフォルトは 1 です。これにより、合成により透けて見える背景の量が設定されます。カバレージ値が 0 より小さければ、coverage パラメータは 0 に設定されます。この値が 1 より大きければ、coverage パラメータは 1 に設定されます。
カバレージ値は、PostScript のマーキング操作によってペイントされる色に影響します。現在の色は、描画前にアルファ値によってあらかじめ乗算されます。この乗算は、現在の色が RGB 空間に変形された後で実行されます。
エラー stackunderflow, typecheck
参照 composite, currentalpha
currentalpha -currentalpha coverage
現在のグラフィックス状態の coverage パラメータを返します。
エラー なし
参照 composite, setalpha
composite srcx srcy width height srcgstate destx desty op composite
2 つのイメージ、ソースと宛先に含まれるピクセルのペア間で、op で指定された合成操作を実行します。ソースピクセルは srcgstate グラフィックス状態によって参照されるドロアブル内にあり、宛先ピクセルは現在のグラフィックス状態で指定されるドロアブル内にあります。srcgstate が NULL の場合、現在のグラフィックス状態が想定されます。
srcx、srcy、width、height で指定された矩形は、ソースイメージを定義します。この矩形の輪郭は、部分的な座標、縮尺、または回転軸によりピクセル境界をまたぐことができます。ソースに含まれるピクセルは、矩形の輪郭に囲まれるすべてのピクセルとなります。
宛先イメージは、ソースと同じサイズ、形状、向きを持っています。destx と desty は、ソースに対応する宛先の位置イメージを示します。2 つのグラフィックス状態の向きが異なる場合も、イメージの向きは同じで、合成してもイメージは回転されません。
両方のイメージは、それぞれのドロアブルの枠の矩形にクリップされます。宛先イメージは、現在のグラフィックス状態のクリッピングパスにさらにクリップされます。合成操作の結果によって宛先イメージが置換されます。
op は合成操作を指定します。操作後の各宛先イメージのピクセル (アルファ値) の色、dst' (dstA') は、次のように与えられます。
dst' = src * Fs(srcA, dstA, op) + dst * Fd(srcA, dstA, op)
dstA' = srcA * Fs(srcA, dstA, op) + dstA * Fs(srcA, dstA, op)
この場合、src と srcA はソースの色とアルファ値、dst と dstA は宛先の色とアルファ値、Fs と Fd は 表 2-2 に示す関数です。
表 2-2 は合成 op の選択肢を示します。各操作結果については、図 2-3 を参照してください。
エラー rangecheck, stackunderflow, typecheck
参照 compositerect, setalpha, setgray, sethsbcolor, setrgbcolor
表 2-2 合成式の係数
図 2-3 は、合成操作の結果を示します。
compositerect destx desty width height op compositerect -
一般に、このオペレータは合成オペレータと同じですが、現実のソースイメージはありません。宛先イメージは現在のグラフィックス状態になっています。destx、desty、width、height は、そのグラフィックス状態の現在の座標系で宛先イメージを記述します。宛先イメージに及ぼす効果は、これらがグラフィックス状態の現在の色とカバレージパラメータで指定された色とカバレージで塗りつぶされたソースイメージと同じです。op には、合成オペレータの op オペランドと同じ意味がありますが、さらに Highlight 操作を実行できます。
Highlight により、ピクセルのカバレージ値に関係なく、宛先矩形内の白の各ピクセルがライトグレイになり、ライトグレイの各ピクセルが白になります。ライトグレイは 2/3 として定義されます。これと同じ操作を繰り返すと、効果が逆転します (モノクロディスプレイ上では、Highlight によって各ピクセルが反転され、白は黒に、黒は白になります)。
Highlight 操作では、ピクセルのカバレージ構成要素の値は変化しません。ピクセルの色とカバレージの組み合わせを引き続き有効にしておくには、Highlight 操作を一時的なものにして、さらに合成する前に元に戻す必要があります。
compositerect の場合、宛先イメージに含まれるピクセルは、指定された矩形の輪郭で囲まれるピクセルです。宛先イメージは、現在のグラフィックス状態のウィンドウの枠の矩形とクリッピングパスにクリップされます。
エラー rangecheck, stackunderflow, typecheck
参照 composite, setalpha, setgray, sethsbcolor, setrbgcolor
dissolve srcx srcy width height srcgstate destx desty delta dissolve -
この操作には、ソースイメージと宛先イメージを混ぜる効果があります。最初の 7 つの引数では、合成するソースピクセルと宛先ピクセルを選択します。正確な混合割合は delta で指定されます。delta は、0.0 から 1.0 までの浮動小数点数です。混合されるイメージは次のようになります。
delta * source + (1-delta) * destination
srcgstate が NULL の場合、現在のグラフィックス状態が想定されます。
エラー stackunderflow, typecheck
参照 composite
合成 op の値は、PostScript の systemdict 内のアプリケーションに使用できます。定義は次のとおりです。
/Clear 0 def
/Copy 1 def
/Sover 2 def
/Sin 3 def
/Sout 4 def
/Satop 5 def
/Dover 6 def
/Din 7 def
/Dout 8 def
/Datop 9 def
/Xor 10 def
/PlusD 11 def
/Highlight 12 def
/PlusL 13 def
完全に不透明でない (1) か完全に透明でない (0) アルファ値は、慎重に使用する必要があります。半透明による合成操作では、DPS のカラーキューブとグレイランプ内で多数の色を使用できる場合にのみ、最高のイメージ品質が得られます。つまり、イメージ品質は、24 ビット TrueColor または 8 ビット StaticGray ビジュアルのときに最高で、8 ビットの PseudoColor ビジュアルでは貧弱になります。また、半透明ピクセルの場合は、余分な計算が必要になるので、合成操作の性能は大幅に低下します。
Highlight op で最高の結果を得るには、DPS のコンテキストのグレイランプ内のカラー数を次のようにする必要があります。
fract(((float) numgrays - 1)* 2. / 3.) == 0
つまり、(numgrays = 4, 7, 6, 8, 16, ....) となります。これにより、カラー 2/3 グレイはハーフトーンになりません。
DPS のカラーキューブとグレイランプ内で一般に使用可能なカラー数は限られているので、完全に不透明でない (1) か、完全に透明でない (0) アルファ値を持つイメージでは、最高のイメージ品質が得られません。
合成操作は、gstate で指定されたグレイランプまたはカラーキューブ内のピクセル値についてのみ定義されます。カラーキューブとグレイランプに含まれない値を持つピクセルを合成しても、期待した結果が得られないことがあります。
アルファ値が 0 または 1 に等しくない 1 ビットのドロアブルの場合、合成操作の結果は不定です。
op Highlight により、1 ビットのドロアブル上のピクセルの色が反転されます。
不透明ではないアルファを使用して描画されたドロアブルには、アルファチャネルという余分のピクセルが関連付けられています。X Window システムの操作はアルファチャネルには影響しませんが、次の例外があります。
アルファチャネルを持つウィンドウが露出されているときに、そのウィンドウの X 背景が定義されている場合 (background != None)、背景がペイントされると露出したピクセルのアルファ構成要素は alpha = 1 でペイントされる。
ウィンドウのサイズが変更されると、アルファチャネル記憶域のサイズが変更される。
erasepage オペレータは、グラフィックス状態の現在のドロアブルを不透明な白でペイントします。したがって、ドロアブル内のすべてのピクセルのアルファ値は 1 に等しくなり、アルファチャネル記憶域は削除されます。
デプスが等しくないドロアブルの合成は不定です。