色の扱いの基本

ここでは、まず Xlib で色を扱うための基本的な考え方を解説します。 まず、色のデータを与える XColor と 色の表である Colormap について知る必要があります。 (以下の例は、最も典型的な 256色のディスプレイの場合です。 それ以外の場合の取り扱いについては、 次の節 を見てください。)


色を扱うための構造体 XColor

最初に XColor構造体を説明しましょう。 XColor構造体はインクルード・ファイル X11/Xlib.h の中で、 次のようなメンバーからなるデータの集まりとして定義されています。

 
typedef  struct _XColor {
                         unsigned long  pixel;
                         unsigned short  red, green, blue;
                         char  flag;
                         char  pad;
                        }  XColor;
 

このうち、特に重要なメンバーがカラーマップの登録番号を記憶する pixelと 色の3成分の値 red, green, blue です。 ( flag は3原色いずれかの成分を一時的にマスクしたりするのに使用します。 pad は構造体のサイズを調整する隙間で特に用途は決っていません。)

XColor構造体の使い方を調べてみましょう。 XColor構造体のデータとして、例えば iro という変数を使いたいとします。 それには次のように宣言します。

 
XColor  iro;
 

これで色のデータを1色分記憶する領域がメモリー上に確保されたことになります。 この構造体のメンバーにデータの値を入れるには次のようにします。

 
iro.red = 20000;
 

これで色の3原色のうちの赤色成分の値を与えることができます。 他の成分についても同様です。 3つの値をうまく調整すれば、絵の具の色を混ぜて作るのと似た考え方で 色を作り出すことができます。 (それぞれの成分は short型ですから 0 - 65535の範囲の値で指定します。)


カラーマップとピクセル番号

Xlibで色を扱うためには、もう一つ重要な構造体 Colormap が必要です。 ちょうど絵の具や色鉛筆の箱のセットのようなものと思えばいいでしょう。 この「絵の具箱」は単独のクライアントが独り占めできる資源ではありません。 カラーマップの実体はサーバーが管理するメモリー上にあり、 クライアントはなるべく仲良く利用し合わなければなりません。 サーバーの側では現在カラーマップ上にある色に対して、 どの色が何番目というように番号を付けて管理します。 たとえば 256色が使用できる ワークステーションの場合は、 カラーマップの色番号は 0〜255ということになります。 Xlibではこの色番号のことを 特に「ピクセル番号」または「ピクセル値」と呼びます。

カラーマップを使用するのにも、まず構造体の宣言をしなくてはなりません。 そして、使用したいカラーマップを指定するためのマクロを使用します。

 
Colormap  cmap;

cmap = DefaultColormap( dsp, 0 );
 

DefaultColormap()は、 現在の画面で使用されているカラーマップを変更せずそのまま使うという意味です。 デフォルトのカラーマップは必ず存在します。 通常のケースでは、クライアントがカラーマップをいちいち 生成する必要はありません。
また、Colormap は XColorと違ってサーバーが管理するデータです。 クライアント側の変数は、その ID 番号にすぎません。 (このような関係は Window の場合も同様でした。)


XColorとColormapを結び付ける

さて、XColorとして色のデータを用意しただけでは、 まだ自由に色を利用することはできません。 XColorはクライアントの側のデータで、 Colormapはサーバーの側のデータです。 そのままでは クライアントはカラーマップのピクセル値の情報を持ってはいません。 また、サーバーもクライアントがどんな色を欲しがっているのかわかりません。 クライアントから一度サーバーに問い合わせ、 使いたい色がカラーマップの何番目に登録されているのかを知る必要があります。 この仕事を行う関数が XAllocColor()です。

 
iro.red=65535; iro.green=0; iro.blue=65535;  /* ピンク色の RGBデータ */
XAllocColor( dsp, cmap, &iro );
 

引数として構造体のアドレス が与えられている点に注意してください。 この関数は、 構造体XColorのメンバーの値を受け取るだけでなく、 メンバーの値を書き変えて返すこともします。 関数が受け取るデータは、 使用する色の3原色の情報(iro.red, iro.green, iro.blue)です。 これらの値は関数を呼び出す前に与えておきます。 そのデータを元にカラーマップが調べられ、 登録番号(ピクセル値)がメンバー pixel に代入されて返ってくるのです。 一度ピクセル値がわかってしまえば、クライアントは カラーマップの色の指定を自由に行うことができます。 プログラムのそれ以後の部分では、 常にこのピクセル値を用いて色の操作を行うことになります。


XSetWindowBackground( dsp, win, iro.pixel );
上の例は、ウィンドウの背景色を設定し直します。