NTシステムデザインの技術メモ

PLplotメモ

最終更新:

ntaka206

- view
管理者のみ編集可

Drawableにグラフ表示する時に幅が720pixel以上だとおかしくなる

Drawable(pixmap)のサイズをplspage()で指定しないとPLplotが正しいサイズでプロットしない
Width 720pixel以上でおかしくなる

plspage(0, 0, widget->allocation.width, widget->allocation.height, 0, 0);

コード例
typedef struct {
	GtkWidget *plotwindow;
	GdkPixmap *plotwindow_pixmap;
} MyPlot;

static void myplot_plot_start_win(MyPlot *p)
{
	struct {
		Display  *display;
		Drawable drawable;
	} xinfo;

	PDEBUGF("\n");
	if (p == NULL) {
		PDEBUG("p=NULL\n");
		return;
	}
	/* Allocate pixmap */
#if TO_PIXMAP==1
	GtkWidget *widget = p->plotwindow;
	if ( p->plotwindow_pixmap )
		gdk_pixmap_unref( p->plotwindow_pixmap );
	p->plotwindow_pixmap = gdk_pixmap_new( widget->window,
		widget->allocation.width, widget->allocation.height, -1 );
//PDEBUG("plotwindow_pixmap width=%d height=%d\n", widget->allocation.width, widget->allocation.height );
//gint w,h;
//gdk_drawable_get_size(p->plotwindow_pixmap, &w, &h);
//PDEBUG("plotwindow_pixmap width=%d height=%d\n", w, h);

	/* Clear the pixmap to a sensible background colour */
	gdk_draw_rectangle( p->plotwindow_pixmap,
		widget->style->black_gc, TRUE, 0, 0,
		widget->allocation.width, widget->allocation.height );
#endif
	// Drawable(pixmap)のサイズを指定しないとPLplotが正しいサイズでプロットしない
	// Width 720pixel以上でおかしくなる
	plspage(0, 0, widget->allocation.width, widget->allocation.height, 0, 0);

	// cairoの出力先をpixmapにする
	plsdev( "xcairo" );
	plsetopt( "drvopt", "external_drawable" );
	plinit();

#if TO_PIXMAP==1
	xinfo.display  = GDK_PIXMAP_XDISPLAY( p->plotwindow_pixmap );
	xinfo.drawable = GDK_PIXMAP_XID( p->plotwindow_pixmap );
#else
	xinfo.display  = GDK_WINDOW_XDISPLAY( (p->plotwindow->window) );
	xinfo.drawable = GDK_WINDOW_XID( (p->plotwindow->window) );
	GTK_WIDGET_UNSET_FLAGS(p->plotwindow, GTK_DOUBLE_BUFFERED);
#endif
	pl_cmd( PLESC_DEVINIT, &xinfo );
}

PLplotでcairo surfaceにプロットする

plspage()でサーフェースのサイズをPLplotに教える必要がある。
http://plplot.sourceforge.net/docbook-manual/plplot-html-5.9.6/plspage.html
// グラフ描画用のsurface作る unit=pixel
cairoSurface1 = cairo_image_surface_create(CAIRO_FORMAT_RGB24, export_width, export_height);
cairoContext1 = cairo_create(cairoSurface1);

// サーフェースのサイズを指定しないとPLplotが正しいサイズでプロットしない
plspage(0, 0, export_width, export_height, 0, 0);

plsdev("extcairo");
plinit();
pl_cmd(PLESC_DEVINIT, cairoContext1);

グラフを描画したcairo surfaceを別のsurfaceにコピーする

複数のグラフをsurfaceにまとめて描画したい時に。
plend();
// 子サーフェースから親サーフェースへコピー
// 親サーフェースの書き込み位置指定する
cairo_set_source_surface(cairoContext, cairoSurface1, 0, export_offset_y);	// user-space coordinate
cairo_paint(cairoContext);
目安箱バナー