XpmAttributes構造体は、Pixmapを作るときに何らかのデータを 渡す、または、作成したリソースの情報を取得するために使用します。
XlibのXSetWindowAttributes構造体やXGCValues構造体 と同様、使用する属性の集合を対応するビットの論理和として表します (ビットマップ、またはベクトルと呼ばれます。以降はベクトルと呼びます)。 ただし、Xlibのように構造体とベクトルを別の引数として渡すのではなく、 ベクトルが構造体のメンバになっています。 これは、関数内でベクトルが変化するからです。 属性ごとのビットマスクはX11/xpm.hの中で#defineされており、 これらを'|'演算子でつないで指定します。
データを渡す時は、対応するメンバに値を格納し、ベクトルのビットをセットして 関数を呼びます。
データを取得する場合、そのが値が構造体の中に即値で収まるような場合 (たとえば画像のサイズなど)、関数内で自動的に値がセットされ、 ベクトルの対応するビットが立ちます。 このような属性を使用する場合は、関数呼出し時にビットをセットする必要は ありません。属性が取得できない場合はビットがセットされないようです。
いくつかの属性は、即値ではなくデータへのポインタが格納されます。 このような属性の値を取得する場合、ベクトルのビットをセットしてから 関数を呼びます。エラーが起きなければ、メンバにデータへのポインタが 格納されます。エラーが起きた時はベクトルのビットがクリアされます。 このような属性は、ビットマスクのシンボル名が「XpmReturnほげほげ」 となっています。 データを格納する領域はライブラリ内で確保されます。この領域を解放する時は、 3.2節で説明するXpmFreeAttributes関数を使用します。
なお、「Xpmほげほげ」と「XpmReturnほげほげ」というシンボルは 同じ値を持ちますが、データを渡す時は前者、受け取る時は後者と使い分けるようです。 また、ポインタを使わない属性の場合、常に「Xpmほげほげ」を使い、 「XpmReturnほげほげ」は存在しません。 (前の版では「Xpmほげほげ」をセットし、「XpmReturnほげほげ」 でチェックすると書きましたが、そうではないようです。動作は同じですが。)
XpmAttributes構造体のメンバはかなり多いうえ、筆者もごく一部しか使った ことがないので、全てを書くのはやめ、
unsigned long valuemask;というメンバがベクトルを表わすということだけを示しておきます。 具体的なメンバとビットマスクは、以下の章およびマニュアルを参照してください。
関数呼出し時に動的に確保された領域を解放するときは、 XpmFreeAttributes関数を使用します。
attributesで示される構造体内のポインタが指す領域を解放します。int XpmFreeAttributes( XpmAttributes *attributes );
よく使用する属性を説明します。 「こんな事はできないのか?」というのがあればメールを下さい。 判れば加えます。
XpmAttributes attr; int err; int w,h; attr.valuemask = 0; err = XpmCreatePixmapFromData(disp,root,data_xpm,&pix,&mask,&attr); if( err == 0 ){ w = attr.width; h = attr.width; }
DefaultColormap(display,DefaultScreen(display))が使用される。
Colormap cmap; XpmAttributes attr; int err; cmap = XCreateColormap(disp,root,DefaultVisual(disp,DefaultScreen(disp)),AllocNone ); attr.valuemask = XpmColormap; attr.colormap = cmap; err = XpmCreatePixmapFromData(disp,root,data_xpm,&pix,&mask,&attr);
XpmAttributes attr; int err; int x,y; attr.valuemask = 0; err = XpmCreatePixmapFromData(disp,root,data_xpm,&pix,&mask,&attr); if( attr.valuemask & XpmHotspot ){ x = attr.x_hotspot; y = attr.y_hotspot; }else{ x = y = -1; }
Pixmapを破壊する時にカラーセルを解放するために使えると思う。
この属性はライブラリのバージョン3.4gで追加された。
前の版ではXpmReturnPixels,pixels,npixelsを使用すると書いたが、 これらは、XpmColorSymbols(Pixmap作成時に色を置き換える)を使用する場合、 新たに確保していないピクセル値を含む場合がある。
XpmAttributes attr; int err; int x,y; attr.valuemask = XpmReturnAllocPixels | XpmColormap; attr.colormap = cmap; err = XpmCreatePixmapFromData(disp,root,data_xpm,&pix,NULL,&attr); XFreePixmap(disp,pix); XFreeColors(disp,cmap,attr.alloc_pixels,attr.nalloc_pixels,0); XpmFreeAttributes(&attr);
closenessの範囲は0〜65535で、カラーセルの確保に失敗した時に 誤差がこの範囲内のカラーセルで代用するらしい。 ソースを見た感じでは、一番近い色を使用するようだ。
マニュアルによれば、40000が適当らしい。 ちなみに、悲観的な筆者は65535を指定している。これでXF86_VGA16でも安心(何がだ?)
XpmAttributes attr; int err; attr.valuemask = XpmCloseness; attr.closeness = 40000; err = XpmCreatePixmapFromData(disp,root,data_xpm,&pix,&mask,&attr);
(その1)よりも細かい指定をする。筆者は使ったことは無い。 グレイスケールの時の挙動は不明。
XpmAttributes attr; int err; attr.valuemask = XpmRGBCloseness; attr.red_closeness = 20000; attr.green_closeness = 10000; attr.blue_closeness = 65535; err = XpmCreatePixmapFromData(disp,root,data_xpm,&pix,&mask,&attr);