この章では、Solaris X サーバー上の X ウィンドウのビジュアルを説明します。この章で説明する内容は次のとおりです。
デフォルトのビジュアル
複数デプスデバイス上のビジュアル
ガンマ補正されたビジュアル
ビジュアルによるウィンドウプログラミングのヒント
1 つの表示デバイスで、1 つ以上の表示フォーマットをサポートできます。X ウィンドウシステムでは、ウィンドウサーバーがサポートする表示フォーマットを「ビジュアル」という形式でクライアントアプリケーションに通知します。ビジュアルとは、表示デバイスがサポートする表示フォーマットを記述したデータ構造体です。
X11 クライアントがウィンドウを作成する場合、そのウィンドウのビジュアルを指定します。ビジュアルは、ウィンドウ内の各ピクセルの表示特性を記述します。つまり、ウィンドウのビジュアルは表示デバイスのビデオハードウェアに対して、ウィンドウのピクセル値を解釈する方法を指示します。
システム内に構成されたディスプレイごとに、1 つずつ X11 スクリーンがあります。スクリーンごとに、サポートされるビジュアルのリストがサーバーによってクライアントアプリケーションにエクスポートされます。このビジュアルリストは、どの表示フォーマットをウィンドウの作成に使用できるかをクライアントアプリケーションに伝えます。
サーバーによって表示スクリーン用にエクスポートされるビジュアルは一定ではなく、スクリーンのデバイスハンドラに依存します。ビジュアルのエクスポートはデバイスハンドラに制御されるので、クライアントアプリケーションは、1、8、24 ビットのように従来のデプスとは異なるデプスを持つビジュアルなど、さまざまなビジュアルを処理できるように準備しなければなりません。デプスが 4、16、および奇数のビジュアルはエクスポートできない可能性があり、クライアントでそれを処理するように準備しなければなりません。
クライアントアプリケーションでは、Xlib ルーチン XGetVisualInfo(3) または XMatchVisualInfo(3) を呼び出して、スクリーン用にサポートされるビジュアルのリストを照会したり、ユーティリティ xdpyinfo(1) を使用してサポートされるビジュアルのリストを照会したりできます。X11 の色とビジュアルの概要については、このマニュアルの「はじめに」に掲載されている X11 のマニュアルを参照してください。
X11 スクリーンごとに、スクリーン用にエクスポートされるビジュアルのいずれかがデフォルトビジュアルとして指定されています。デフォルトビジュアルとは、スクリーンのルートウィンドウに割り当てられたビジュアルのことで、ほとんどのアプリケーションではこのビジュアルを使用してウィンドウを作成します。クライアントアプリケーションが起動すると、アプリケーションで別のビジュアルを指定しない限り、そのウィンドウにはデフォルトビジュアルが割り当てられます。
「組み込みデフォルトビジュアル」とは、Solaris X サーバー内でハードコード化されたビジュアルです。スクリーンごとに、そのスクリーンの表示デバイスの特性によって異なるデフォルトビジュアルがあります。openwin(1) の実行時に別のデフォルトビジュアルを指定しない限り、これがデフォルトビジュアルとなります。
ウィンドウサーバーが X11 接続ブロック内で返すデフォルトビジュアルを変更したいことがあります。デフォルトビジュアルでは実行できないクライアントプログラムを特定のビジュアルで実行させる場合などです。たとえば、TrueColor ビジュアルがデフォルトビジュアルとなっている 24 ビットデバイス上では、24 ビットカラーで実行できないアプリケーションを PseudoColor ビジュアルで実行させることができます。
複数デプスデバイスの開発担当者にとっては、デフォルトビジュアルを変更すると、アプリケーションの機能をさまざまな構成でテストできるので便利です。デフォルトビジュアルを変更する方法についての詳細は、xsun(1) のマニュアルページを参照してください。サーバーによってエクスポートされるデフォルトビジュアルとサポートされるビジュアルのリストは、XGetVisualInfo(3) を使用して X11 から検証できます。
Solaris X サーバーでは、同時に複数ピクセルデプスのウィンドウを表示できるデバイスがサポートされます。これらのデバイスを、「複数デプス」デバイスといいます。このようなデバイスのほとんどがデプスごとにビットプレーングループを持っているため、しばしば「複数プレーングループ (MPG)」デバイスと呼ばれます。
デプスごとに、1 つまたは複数のビジュアルがエクスポートされることがあります。ほとんどの MPG デバイスでは、エクスポートされた任意のビジュアルを使用してウィンドウを作成できます。TrueColor ビジュアルを推奨するアプリケーションの場合、開発担当者は TrueColor ビジュアルが使用可能かどうかを判断する必要があります。これは、PseudoColor がデフォルトビジュアルの場合でも、TrueColor ビジュアルを使用できることがあるからです。
この節では、さまざまなビジュアルをサポートするデバイスを対象に X11 アプリケーションのプログラムを作成する際、発生する問題について説明します。
X11 クライアントのプログラミングにおいて多い間違いは、デフォルトビジュアルにインデックスクラス (たとえば PseudoColor または StaticColor) があると仮定することです。しかし、デフォルトビジュアルがデバイスによっては 24 ビット TrueColor である可能性もあります。これらのデバイス上で実行する必要があるクライアントについては、そのデフォルトビジュアルの種類に対処できるように準備しておかなければなりません。
よくある誤りを以下に示します。
デフォルトデプスが 8 であると仮定する。
カラーマップが書き込み可能と仮定する。
XGetVisualInfo を使用して適切なビジュアルを探索せず、不適切なデフォルトビジュアルを使用する。
デバイスがクライアントから要求されたビジュアルをサポートしない場合は、次のエラーメッセージが戻されます。このエラーメッセージのうち、# は要求されたデプス番号を表し、n は要求された表示デバイスを表します。表 A-1 に示すサポートされるビジュアルとデバイスの組み合わせで、このメッセージが戻される場合は、インストールに問題があります。
Error: cannot provide a default depth #for device /dev/fbs/n
一般に、各種のデフォルトビジュアルが存在する中でクライアントの移植性を高めるためには、部分的な変更が必要とされます。
デフォルトビジュアル以外のビジュアルを使用してウィンドウを作成するときに、アプリケーションがウィンドウ属性構造内で border_pixel 値を設定しなければ、BadMatch エラーが発生します。これは一般的なプログラミングエラーで、デバッグが困難な場合があります。境界ピクセルの設定についての詳細は、XCreateWindow のマニュアルページを参照してください。
グラフィックスとダブルバッファリングの性能が十分に得られない場合 (加速不足など) は、OpenWindows が root としてインストールされていない可能性があります。
ビジュアルの線形性属性に応じて、表示されるカラーの彩度応答は異なります。ブラウン管 (CRT) モニターでは、表示されるカラーは実際に要求されたカラーよりも暗くなります。このような暗化現象の原因は、モニターの物理的構造にあります。デバイスによってはこの暗化現象を補正するビジュアルをサポートしています。これを「ガンマ補正」と呼びます。
ガンマ補正は、フレームバッファから出る色を変更し、モニターの応答を反転させることによって行われます。ガンマ補正ビジュアル全体の彩度は直線的に変化するので、ガンマ補正ビジュアルのことを線形ビジュアルといいます。ガンマ補正されていないビジュアルを非線形ビジュアルといいます。
線形性は、X11 ビジュアルの標準属性ではありません。しかし、一部のアプリケーションでは、視覚的な悪影響を避けるために線形ビジュアルが必要になります。たとえば、平滑化された線分を使用するグラフィックスアプリケーションでは、線形ビジュアルを使用しなければ、好ましくない「ローピング」アーティファクトが生じることがあります。このようなアプリケーションは線形アプリケーションと呼ばれます。カラーの最適な表示に非線形ビジュアルを必要とするアプリケーションは、非線形アプリケーションと呼ばれます。ほとんどの X11 アプリケーションは、非線形アプリケーションです。
ほとんどのデバイス上のデフォルトビジュアルは非線形です。したがって、線形アプリケーションはデフォルトビジュアルを使用せず、線形ビジュアルを常に明示的に探索しなければなりません。同様に、非線形アプリケーションの場合も、非線形ビジュアルを明示的に検索するとよいでしょう。これは一般にほとんどのデバイスのデフォルトなので不可欠ではありませんが、望ましい方針ということができます。
ビジュアルが線形かどうかを判断するには、アプリケーションはインタフェース XSolarisGetVisualGamma(3) を使用できます。ガンマ補正についての詳細は、Foley and Van Dam 著『Fundamentals of Computer Graphics』を参照してください。
ビジュアルを選択する方法としては、各種のビジュアル構成を処理できるようなアプリケーションを作成することをお勧めします。GX のような一部のデバイスでは、線形ビジュアルがサポートされません。また、単一の線形 24 ビット TrueColor ビジュアルだけをサポートするデバイスがあります。さらに、線形ビジュアルと非線形ビジュアルが同時にサポートされるデバイスもあります。一般に、移植性のあるアプリケーションを作成する最も賢明な方法は、これらすべての構成を細かく操作することです。希望の線形性を持つビジュアルが見つからない場合は、警告メッセージを出力するようにします。あるいは、線形アプリケーションで線形ビジュアルが見つからない場合は、便利なトリックとして、X11 に与えられたカラーをアプリケーション内で手作業で暗くする方法もあります。これは独自のガンマ補正を実行するのと同じことです。カラーをどの程度暗くするかは、XSolarisGetVisualGamma で戻されるガンマ値から判断できます。
XSolarisGetVisualGamma は、Solaris の「公開」インタフェースで、全面的にサポートされます。将来は、カラー管理システムでもこの機能が提供される可能性があります。そうすれば、この情報を取得する上で望ましい方法となります。しかし、それまでは XSolarisGetVisualGamma を使用してガンマ値を調べてください。このカラー管理システムが導入されると、XSolarisGetVisualGamma を使用するアプリケーションは修正しなくても引き続き動作し、実際にはカラー管理システムによって精度が高くなるという利点が得られます。