ここでは実際に絵を書くときによく使われる描画関数をまとめておきましょ う。まずXウインドウでの座標ですがウインドウ上の左上を原点に右方向にX軸、 下方向にY軸が定義されています。値はピクセル単位で整数で与えます。
描画関数が必要とする情報は、ディスプレイに関する情報、ウィンドウ(こ れはDrawabl eと呼ばれる)に関する情報、グラフィックスコンテキストは常に 必要です。以下の解説では仮引数の型を次のように考えてください。
Display * display; Drawable drawable; GC gc; int x, y ...;
また座標などをまとめて与える構造体があります。
typedef struct { short x, y; } XPoint; typedef struct { short x, y; unsigned short width, height; } XRectangle; typedef struct { short x1, y1, x2, y2; } XSegment; typedef struct { short x, y; unsigned short width, height; short angle1, angle2 ; } Xarc;
それぞれ、点(XPoint)、矩形(XRectangle)、線分(XSegment)、円弧(XArc)を表 しています。
まず点を書きましょう。
XDrawPoint( display, drawable, gc, x, y ); XDrawPoints( display, drawable, gc, points, npoints, mode );
前者は点を一つ(x,y)に書きます。後者はXPoint構造体配列へのポインター pointsの指す点をnpoints個書きます。modeはCoordModeOrigin(点が絶対座標 で書いてある)、CoordModeP revious(点が一つ前の点からの相対座標で書いて ある。)のいずれかを指定します。
次は線分です。
XDrawLine( display, drawable, gc, x1, y1, x2, y2 ); XDrawLines( display, drawable, gc, points, npoints, mode ); XDrawSegments( display, drawable, gc, segments, nsegments );
最初のものは点(x1,y1)から(x2,y2)に線を引きます。次のはXPoint構造体配列 へのポインターpointsの指す点を順につないで一筆書きで線を引いていきます。 modeは絶対か相対でXDrawPointsのものと同じです。最後のものはXSegment構 造体配列へのポインターsegment sがさす線分をnsegments個切り離された線分 として描画します。
次は矩形です。
XDrawRectangle( display, drawable, gc, x, y, width, height ); XDrawRectangles( display, drawable, gc, rectangles, nrectangles );
前者は点(x,y)から幅width高さheightの矩形を書きます。高さというのは下方 向への長さということに注意してください。後者は同様にXRectanble構造体配 列へのポインターrect anglesの指す矩形をnrectangles個描画します。
円弧を書きましょう。
XDrawArc( display, drawable, gc, x, y, width, height, angle1, angle2 ); XDrawArcs( display, drawable, gc, arcs, narcs );
前者は点(x,y)から幅width、高さheightの円弧を角度範囲argcle1からangle2 の部分だけ描画します。点(x,y)は円弧の中心ではなく左上です。中心は (x+wiodth/2、y+height/2)になる勘定です。角度範囲は1度を64とした数字で 表し反時計周りです。0がX軸方向(右方向)で、90*64が90度。画面の上方向に なります。円を書くときはangle1が0angle2が360*64ということになります。 後者は例によってXArc構造体配列へのポインターargcが指す円弧をna rcs個描 画します。
つぎに塗りつぶしに行きましょう。
XFillPolygon( display, drawable, gc, points, npoints, shape, mode ); XFillRectangle( display, drawable, gc, x, y, width, height ); XFillRectangles( display, drawable, gc, rectangles, nrectangles ); XFillArc( display, drawable, gc, x, y, width, height, angle1, angle2 ); XFillArcs( display, drawable, gc, arcs, narcs );
最初のものはpointsにある点を結んで領域を作りその中を塗りつぶします。 (最初の点と最後の点が結ばれて図形が閉じます。)shapeはつぎの値を取りま す。どんな図形であるかをサーバに教えてパフォーマンスを向上させるための ものです。Complexは線が途中で交差するねじれたような図形を書く場合、 Nonconvexは交差はしていないが凹みがある場合、Con vexは凹みのないめでた い図形の場合に指定します。その時点で解からないときは難しいほうを与えま す。Complexです。
文字を書かせましょう。
XDrawString( display, drawable, gc, x, y, string, length );
座標(x,y)から文字列stringを長さlength文字分表示します。文字の描画には 他にも凝った表示をさせるものが色々用意されていますがここでは触れません。 これまでの情報でかなりのことが出来るはずです。