NTシステムデザインの技術メモ
PLplotメモ
最終更新:
ntaka206
-
view
Drawableにグラフ表示する時に幅が720pixel以上だとおかしくなる
Drawable(pixmap)のサイズをplspage()で指定しないとPLplotが正しいサイズでプロットしない
Width 720pixel以上でおかしくなる
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
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);