Solaris X Window System 開発ガイド

第 2 章 DPS の機能と拡張

この章では、Solaris X サーバーの Display PostScript (DPS) 拡張機能について、次の項目を簡単に説明します。

DPS について

Display PostScript システムは、プリンタやタイプセッタ [この節は、Adobe 社『Programming the Display PostScript System with X』(Addison-Wesley Publishing Company, Inc., 1993) の第 4 章を基に記述してあり、著作権所有者の許可を得ています。] で標準となっている PostScript 言語と同じイメージ処理モデルを使用して、コンピュータの画面上にグラフィック情報を表示します。X アプリケーションは PostScript 言語を使用することにより、高い精度で線分や曲線を描画したり、イメージの回転や拡大・縮小処理を行ったり、入力データをグラフィックオブジェクトとして扱ったりできます。また、Display PostScript システムを使用する X アプリケーションは、Adobe タイプライブラリをすべて使用できます。

PostScript を搭載したプリンタやタイプセッタの特長は、デバイスや解像度に依存しない点です。対話処理用の画面でも、Display PostScript システムを使用すればこの恩恵にあずかります。DPS システムを利用するアプリケーションは、DPS システムがサポートするディスプレイ上であれば、プログラムを変更することなく同じ動作や表示を行えます。

DPS の動作

DPS システムにはいくつかのコンポーネントがあり、その中には PostScript インタプリタ、クライアントライブラリ、pswrap トランスレータがあります。クライアントライブラリは、アプリケーションと PostScript インタプリタ間のリンクを行うものです。

DPS 拡張機能を使用する各アプリケーションは、「コンテキスト」を 1 つ生成します。コンテキストは、ウィンドウが見えない画面領域のピックスマップに出力する一種の仮想 PostScript プリンタと考えることができ、専用のスタック、入出力機能、メモリー空間を備えています。PostScript インタプリタはサーバー中で単一のプロセスとして動作しますが、コンテキストが別々になっているため複数のアプリケーションで共有できます。

DPS システムでは 1 つのアプリケーションで複数のコンテキストを使用できますが、1 つのコンテキストで多くの描画領域を扱えるため、通常はコンテキストが 1 つあればそのアプリケーション内の全描画処理を十分まかなえます。しかし、1 つのクライアント内でコンテキストを 2 つ以上使用する方が好ましい場合もあります。たとえば、Encapsulated PostScript (EPS) ファイルを読み込む場合は、コンテキストを別にする方がよいでしょう。読み込んだ EPS ファイルに PostScript に関するエラーがあった場合、コンテキストを別にしておけばエラー回復処理が簡単になります。

アプリケーションは、クライアントライブラリの手続きを呼び出すことによって、画面上に描画します。この手続きは、PostScript インタプリタに送られて処理される PostScript 言語コードを生成します。DPS システムには、クライアントライブラリの他に pswrap トランスレータが組み込まれています。pswrap は、PostScript 言語のオペレータを使用して「ラップ」という C 言語手続きを生成します。「ラップ」は、アプリケーションプログラムから呼び出すことができます。

PostScript インタプリタは、タイムスライス単位でコンテキスト実行に関連するスケジューリングを行います。このインタプリタはコンテキスト間で切り替えられるので、複数のアプリケーションがインタプリタにアクセスできます。各コンテキストは、PostScript の仮想メモリー空間 (VM) の専用部分にアクセスします。VM には「共有 VM」と呼ばれる追加部分もあり、これは全コンテキスト間で共有され、システムフォントや他の共用リソースに使用します。「専用 VM」には、各コンテキスト専用のフォントを入れることができます。図 2-1 に DPS のコンポーネントと X との関係を示します。

図 2-1 DPS 拡張機能と X

Graphic

アプリケーションは、次のような手順で DPS システムとやり取りします。

  1. アプリケーションは PostScript 実行コンテキストを 1 つ生成し、サーバーとの通信チャネルを 1 つ確立します。

  2. アプリケーションは、クライアントライブラリの手続きとラップをコンテキストに送り、その応答を受け取ります。

  3. アプリケーションは終了する際、コンテキストを消滅させ、通信チャネルをクローズし、セッション中に使用したリソースを解放します。

コンテキストの構造は、全 DPS プラットフォーム間で共通です。ただし、コンテキストの作成と管理はプラットフォームごとに異なります。コンテキストとそれを処理するルーチンについては、『Client Library Reference Manual』と『Client Library Supplement for X』を参照してください。Display PostScript の開発者向けユーティリティについては、『Display PostScript Toolkit for X』を参照してください。

Solaris サーバーの DPS に対するフォント拡張項目

サーバーでは、DPS システムに対して次のようなフォントを拡張しています。

詳細は、第 4 章「フォントのサポート」を参照してください。

DPS ライブラリ

DPS ライブラリを表 2-1 に示します。これらライブラリの構成要素である .so ファイルと .a ファイルは、/usr/openwin/lib/usr/openwin/lib/libp のディレクトリに入っています。これらのライブラリの詳細については、『Programming the Display PostScript System with X』および『PostScript Language Reference Manual』を参照してください。

表 2-1 DPS ライブラリ
 ライブラリ 説明

libdps

DPS クライアントライブラリ 

libdpstk

DPS ツールキットライブラリ 

libpsres

PostScript 言語用リソース配置ライブラリ 

libdpstkXm

DPS Motif ツールキットライブラリ 

Adobe NX エージェントのサポート

libdps のコンテキスト作成ルーチン (XDPSCreateSimpleContextXDPSCreateContext) は、DPS/X の拡張機能に接続できない場合には、DPS NX エージェントへの接続を試みるようになっています。NX クライアントは、通常、ブート時または X ウィンドウの起動処理中に手動で起動しなければなりません。

Adobe Systems Inc. から入手できる Adobe DPS NX エージェントは、X ウィンドウサーバーや DPS/X クライアントとは別のプロセスです。DPS NX エージェントに接続すると、クライアントの DPS 呼び出しは中断され、標準の X プロトコル要求に変換されます。したがって、DPS の拡張機能がサポートされない X ウィンドウサーバー上でも、DPS クライアントを実行することができます。

DPS のセキュリティ

Solaris 環境では、少なくとも X コンソーシアムの X11R5 サンプルサーバーのセキュリティレベルが得られます。ただし、これを保証するために DPS では、PostScript のファイルオペレータからシステムファイルをアクセスできないようにすると同時に、機密保護コンテキストを生成する機能も提供しています。以下でこの 2 つの機能を説明します。

システムファイルのアクセス

PostScript 言語ではファイル操作によりディスクファイルなどのシステムデバイスにユーザーがアクセスできますが、これがセキュリティ上の重大な問題になります。そのため Solaris 環境ではデフォルト時、PostScript のファイルオペレータでシステムファイルをオープンしたり、アクセスしたりできないようにしています。

アプリケーションの場合は、サーバーではなくクライアントでファイル操作を実行する必要があります。したがって、クライアントには、サーバーに必要な全アクセス特権が必要というわけではありません。PostScript のファイルオペレータでシステムファイルをアクセスしたい場合は、サーバー起動時に -dpsfileops オプションを指定してください (Xsun(1) のマニュアルページを参照)。このオプションを指定しないでシステムファイルをアクセスすると、PostScript の「undefinedfilename」というエラーになります。サーバープロセスはスーパーユーザーによって所有されるので、この問題は CDE や xdm 環境では特に重要です。

機密保護コンテキストの生成

DPS のコンテキストは通常グローバルデータを使用できるため、あるコンテキストから別のコンテキストの動作を見ることができます。たとえば、あるコンテキストが作成中のドキュメントを、別のコンテキストから横取りすることもできるでしょう。この節では、Solaris 環境での機密保護コンテキストの生成方法を説明します。

PostScript リファレンスマニュアル第 2 版』の 7.1.1 節「コンテキストの作成」は、コンテキストが VM を共有するための方法として、次の 3 つを記載しています。

  1. 「ローカル VM とグローバル VM は、そのコンテキストに完全に固有である。」この機能はレベル 2 の新しいものですが、これに従って生成したコンテキストを「機密保護コンテキスト」といいます。

  2. 「ローカル VM はそのコンテキストに固有であるが、グローバル VM は他のコンテキストと共有されている。」XDPSCreateContextXDPSCreateSimpleContext でコンテキストを生成すると、通常こうなります。

  3. 「ローカル VM とグローバル VM は、他のコンテキストと共有されている。」XDPSCreateContextXDPSCreateSimpleContext で、パラメータの spaceNULL 以外を指定してコンテキストを生成するとこうなります。

    機密保護コンテキストを生成するには、XDPSCreateSecureContext を次のように使用してください。

    XDPSCreateSecureContext
    
    DPSContext XDPSCreateSecureContext(dpy, 			drawable, gc, x, y, eventmask,
    
    grayramp, ccube, actual,  			textProc, errorProc, space) 	Display *dpy;
    
    	Drawable drawable; 	GC gc; 	int x; 	int y; 	unsigned int eventmask;
    
    	XStandardColormap *grayramp; 	XStandardColormap *ccube; 	int actual;
    
    	DPSTextProc textProc; 	DPSErrorProc errorProc;   DPSSpace
    
    space;

パラメータの意味はすべて XDPSCreateContext のものと同じですが、生成されるコンテキストは専用の専用グローバル VM を 1 つ持ちます。パラメータの spaceNULL を指定しない場合は、機密保護コンテキストと一緒に生成する空間を指定しなければなりません。機密保護コンテキストと一緒に生成した空間を、非機密保護コンテキストの生成時に使用することはできません。機密保護コンテキストで非機密保護空間を指定したり、非機密保護コンテキストで機密保護空間を指定したりすると、アクセスエラーになります。

DPS で内部エラーが発生したときの対策

DPS は実行中に整合性検査を実施します。まれに内部エラーが発生する場合がありますが、そのような場合には、DPS アプリケーションはサーバーに接続することができません。このような状態になった場合は、Solaris 環境を再起動する必要があります。この状態でクライアントが DPS 拡張機能を使用してサーバーに接続しようとすると、次のエラーメッセージが表示されることがあります。

XError:

130 Request Major code 129

(Adobe-DPS_Extension)

Adobe 社からの情報の入手方法

インターネットまたは UUCP 電子メールを使用して Adobe の公開ファイルにアクセスできる場合は、Adobe 社の一般アクセス用ファイルサーバーを使用して、ソースコード例、AMF (Adobe Metric Font) ファイル、ドキュメンテーション、PPP (PostScript printer description) ファイル、プレスリリースを入手できます。

インターネットを利用する場合は、ファイル転送プログラム (ftp) を使用して、ftp.mv.us.adobe.com マシンからファイルをダウンロードしてください。入手したファイルの詳細については、README.first ファイルを参照してください。電子メールで情報を取得する方法については、『Programming the Display PostScript System with X』の「Preface」に記載されている「Public Access File Server」の節を参照してください。

DPS 合成オペレータ


注意 - 注意 -

この節で定義するオペレータは、Display PostScript 言語の拡張機能です。標準 DPS の一部ではないので、どの DPS 実装でも使用できるとは限りません。これらのオペレータに依存するアプリケーションには移植性がなく、これらのオペレータをサポートしないサーバー上では表示できません。


合成とは、Display PostScript システムを OpenStepTM において拡張した機能です。合成により、別々に描画されたイメージを組み合わせて最終的なイメージを生成できます。この拡張機能により、次のようにさまざまなイメージ処理機能が提供されます。

合成機能は、同じウィンドウ内でスクロールしてコピーするとき、またはあるドロアブル内で描画したイメージを取り出して別の領域に転送するときに使用できます。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 のようになります。

図 2-2 合成オペレータのサンプルプログラム

Graphic

オペレータについて

この節では、新しい 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 グラフィックス状態によって参照されるドロアブル内にあり、宛先ピクセルは現在のグラフィックス状態で指定されるドロアブル内にあります。srcgstateNULL の場合、現在のグラフィックス状態が想定されます。

srcxsrcywidthheight で指定された矩形は、ソースイメージを定義します。この矩形の輪郭は、部分的な座標、縮尺、または回転軸によりピクセル境界をまたぐことができます。ソースに含まれるピクセルは、矩形の輪郭に囲まれるすべてのピクセルとなります。

宛先イメージは、ソースと同じサイズ、形状、向きを持っています。destxdesty は、ソースに対応する宛先の位置イメージを示します。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)

この場合、srcsrcA はソースの色とアルファ値、dstdstA は宛先の色とアルファ値、FsFd表 2-2 に示す関数です。

表 2-2 は合成 op の選択肢を示します。各操作結果については、図 2-3 を参照してください。

エラー rangecheck, stackunderflow, typecheck

参照 compositerect, setalpha, setgray, sethsbcolor, setrgbcolor

表 2-2 合成式の係数

Op 

Fs 

Fd 

Clear

Copy

Sover

1 - srcA 

Sin

dstA 

Sout

1 - dstA 

Satop

dstA 

1 - srcA 

Dover

1 - dstA 

Din

srcA 

Dout

1 - srcA 

Datop

1 - dstA 

srcA 

Xor

1 - dstA 

1 - srcA 

PlusD [PlusD は一般の式には準拠していません。この式は dst'=(1-dst)+(1-src) です。この結果が 0 (黒) より小さい場合、結果は 0 となります。]

N/A 

N/A 

PlusL [PlusL の場合、加算によって飽和状態 (1) になります。つまり、(src+dst) >white) の場合、結果は白になります。]

図 2-3 は、合成操作の結果を示します。

図 2-3 合成操作の結果

Graphic

compositerect destx desty width height op compositerect -

一般に、このオペレータは合成オペレータと同じですが、現実のソースイメージはありません。宛先イメージは現在のグラフィックス状態になっています。destxdestywidthheight は、そのグラフィックス状態の現在の座標系で宛先イメージを記述します。宛先イメージに及ぼす効果は、これらがグラフィックス状態の現在の色とカバレージパラメータで指定された色とカバレージで塗りつぶされたソースイメージと同じです。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 描画操作との対話

不透明ではないアルファを使用して描画されたドロアブルには、アルファチャネルという余分のピクセルが関連付けられています。X Window システムの操作はアルファチャネルには影響しませんが、次の例外があります。

アルファチャネルの削除

erasepage オペレータは、グラフィックス状態の現在のドロアブルを不透明な白でペイントします。したがって、ドロアブル内のすべてのピクセルのアルファ値は 1 に等しくなり、アルファチャネル記憶域は削除されます。

デプスが等しくないドロアブル

デプスが等しくないドロアブルの合成は不定です。