void XSetRGBColormaps(display, w, std_colormap,
count, property)
Display *display;
Window w;
XStandardColormap *std_colormap;
int count;
Atom property;
Status XGetRGBColormaps(display, w, std_colormap_return,
count_return, property)
Display *display;
Window w;
XStandardColormap **std_colormap_return;
int *count_return;
Atom property;
関数 XSetRGBColormaps は指定したウィンドウの指定したプロパティの RGB カラーマップの定義を置 き換える。 そのプロパティがまだ存在しない場合、 XSetRGBColormaps は指定したウィンドウの指定したプロパティの RGB カラーマップの定義を 設定する。 プロパティは RGB_COLOR_MAP 型、フォーマット 32 で格納される。 RGB_DEFAULT_MAP のみが複数の定義を持つという ICCCM の規定は、関数を呼 び出す側で守る義務があることに注意せよ。
関数 XSetRGBColormaps を使うのは、通常はウィンドウかセッションマネージャだけである。 標準カラーマップは以下の手続きで作成する。
XSetRGBColormaps はエラー BadAlloc, BadAtom, BadWindow を起こすことがある。
XGetRGBColormaps は、指定したウィンドウの指定したプロパティ内の RGB カラーマップ定義を 返す。 プロパティが存在し、その型が RGB_COLOR_MAP、フォーマットが 32 であり、かつカラーマップ定義を含むのに十分な長さを持っていれば、 XGetRGBColormaps は返すカラーマップを割り当ててそのメモリ領域を埋め、0 でない ステータスを返す。 ビジュアル ID がない場合、 XGetRGBColormaps はウィンドウが配置されるスクリーンのデフォルトのビジュアルを仮定する。 kill ID が存在しない場合には None が仮定される。 これは、このリソースは解放できないことを示す。 これ以外の場合には、いずれのフィールドも設定されず、 XGetRGBColormaps はステータスとして 0 を返す。 RGB_DEFAULT_MAP だけが1つ以上の定義を含む ICCCM の制限を引き受けるのは 関数を呼び出す側の責任であることに注意せよ。
XGetRGBColormaps はエラー BadAtom BadWindow を起こすことがある。
#define | ReleaseByFreeingColormap |
( (XID) 1L)
|
typedef struct { Colormap colormap; unsigned long red_max; unsigned long red_mult; unsigned long green_max; unsigned long green_mult; unsigned long blue_max; unsigned long blue_mult; unsigned long base_pixel; VisualID visualid; XID killid; } XStandardColormap;
colormap メンバは、関数 XCreateColormap で作られるカラーマップである。 red_max, green_max, blue_max メンバは RGB の各値の最大値を与える。 それぞれの色係数の範囲は 0 以上、最大値以下である。 例えば、標準的なカラーマップの配置は 3/3/2である(赤に3プレーン、緑に3 プレーン、青に2プレーン)。 このカラーマップは red_max = 7, green_max = 7, blue_max = 3 となる。 216 色しか使わない別の配置としては、red_max = 5, green_max = 5, blue_max = 5 などが考えられる。
red_mult, green_mult, blue_mult メンバは完全なピクセル値を作るための倍 率を与える。 (詳しい情報については base_pixels メンバの説明を参照すること。) 3/3/2 の配置の場合には red_mult は 32, green_mult は 4, blue_mult は 1 となる。 6/6/6 の配置の場合には、red_mult は 36, green_mult は 6, blue_mult は 1 となる。
base_pixel メンバは、完全なピクセル値を作るために使われるベースピクセ ル値を与える。 通常、この base_pixel は関数 XAllocColorPlanes を呼び出して得る。 正しい範囲の RGB の各係数を与えると、対応するピクセル値は次の式で計算 できる。
(r * red_mult + g * green_mult + b * blue_mult + base_pixel) & 0xFFFFFFFF
GrayScale カラーマップについては、colormap, red_max, red_mult, base_pixel メンバ だけが定義される。 他のメンバは無視される。 GrayScale のピクセル値の計算には次の式を使用する。
(gray * red_mult + base_pixel) & 0xFFFFFFFF
負の乗数を表すには、その乗数の 2 の補数表現を unsigned long に変換し、 その結果を適切な _mult フィールドに保存すれば良い。 0xFFFFFFFF のマスクを掛ける段階で、得られた正の乗数を負の乗数に効 率的に変換することができる。 多くの計算機アーキテクチャでは、マスキングの処理は計算に使用される 整数のサイズに依存して自動的に行われる。
visualid メンバは、カラーマップを生成したビジュアルの ID 番号を与える。 killid メンバは、リソースIDを与える。 このリソースIDは、この標準カラーマップが保持しているセルをカラーマップ ID の解放によって解放するのか、指定されたリソースについての XKillClient の呼び出しによって行うのかを示す。 (この方法は、現在は存在しないカラーマップを割り当てる場合に必要である。)
XStandardColormap の情報を含むプロパティの型は RGB_COLOR_MAP である。