大規模ソフトウェアを手探るその3 〜三角形描画ツールの実装〜

こんにちは。

次にやることとして、もともとある長方形描画ツールを上手く利用して三角形描画ツールを実装できないかと考えました。

 

まずは新しくツールを加えるにあたって左側のツールバー(下図)にそれ用のアイコンを追加させます。

f:id:sumesimeji:20151029105353p:plain

ui.cを眺めているとどうやらtoolbar4とtoolbar5がそれぞれツールバーの左側と右側に対応しているようで、

gtk_widget_set_size_request (toolbar4, 40, 284);

の40が横、284が縦の長さと考えるとつじつまが合います。

したがってそれぞれの縦の長さをアイコンの大きさと考えられる40だけ大きくして

gtk_widget_set_size_request (toolbar4, 40, 324);

とすると確かにツールバーが長くなりました(左下図:どうやら隠れていたアイコンも出てきたようです)。

f:id:sumesimeji:20151029111512p:plain  f:id:sumesimeji:20151029112401p:plain

あとは例えば楕円描画ツールのボタンの定義をそのままコピペすると、ちゃんとアイコンが追加されました(右上図)。

 

いよいよ三角形を描画する関数を書いていきます。長方形や直線などを描画する関数はshape.cに書かれていたので、そこを読んでいきます。

もともとは長方形描画ツールを流用する予定でしたが、これはクリックして押したままドラッグ→離すの操作で長方形領域を作って描画するというもので、今回実装したいツールとは描画の仕方が異なる(クリック→離すで点をうっていき、二点を線で結んでいく)ので結局1から書いていきました。

#if TRIANGLE
/*
 * Draw a triangle.
 */
static void
draw_triangle(gpaint_shape *shape, gboolean filled)
{
	//初期化
	if( tri_init_flag == 1 ){
		tripoints->x = -1;
		tripoints->y = -1;
		(tripoints+1)->x = -1;
		(tripoints+1)->y = -1;
		(tripoints+2)->x = -1;
		(tripoints+2)->y = -1;
		tri_init_flag = 0;
	}	
	//初期化ここまで

    GdkDrawable *d = GPAINT_TOOL(shape)->drawing->window;
    GdkGC *gc = GPAINT_TOOL(shape)->drawing->gc;
	//最初の点が空だった場合
	if( tripoints->x == -1 && tripoints->y == -1 ){
    		tripoints->x = shape->anchor.x;
    		tripoints->y = shape->anchor.y;
		point_num = 1;
	}
	//最初の点は埋まっているけど2つ目の点は空な場合
	else if( (tripoints + 1)->x == -1 && (tripoints + 1)->y == -1 ){
		(tripoints + 1)->x = shape->anchor.x;
    		(tripoints + 1)->y = shape->anchor.y;
		point_num = 2;
	}
	else if( (tripoints + 2)->x == -1 && (tripoints + 2)->y == -1 ){
		(tripoints + 2)->x = shape->anchor.x;
    		(tripoints + 2)->y = shape->anchor.y;
		point_num = 3;
	}
	

    gdk_draw_polygon(d, gc, filled, tripoints, point_num);
    if ( point_num == 3 )
    {
	const GdkPoint tripoints_copy[3] = {
			{ tripoints->x, tripoints->y },
			{ (tripoints+1)->x, (tripoints+1)->y },
			{ (tripoints+2)->x, (tripoints+2)->y }
	};
	gdk_draw_polygon(GPAINT_TOOL(shape)->drawing->backing_pixmap, gc, filled, tripoints_copy, 3);
		tri_init_flag = 1;
		point_num = 0;
    }
    drawing_modified(GPAINT_TOOL(shape)->drawing);
}
#endif

 

いろいろエラーを直し、最終的に上の形になりました。GdkというGTKのグラフィックス関係を担当するライブラリに便利な関数があったのでそれを用いています。

下のようにちゃんと三角形が描画されています。

f:id:sumesimeji:20151029120101p:plain

 

今回変更を加えたファイルはui.c、shape.c、shape.h、callbacks.h、tool_palette.c、pixmaps.c、pixmaps.h(アイコン画像変更のため)です。

 

次回でいよいよ最後で、ツールバーのアイコンの上にマウスをおくとそのツールの説明が表示されるツールチップ機能の実装について書きます。