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);