开罗图像不在 GtkDrawingArea 上绘画
Cairo image not painting on GtkDrawingArea
我正在制作一个 Gtk2 程序,将预先计算的数据热图图像渲染到 GtkDrawingArea。程序一般是这样的:
- 在 Cairo 图像表面生成热图图像;
- 连接 GtkDrawingArea 的公开事件;
- 在暴露回调中,调用了以下函数:
在第一个函数中,将之前的绘图清除为纯灰色:
cairo_t* cr = gdk_cairo_create(widget->window);
cairo_set_source_rgb(cr, 0.5, 0.5, 0.5);
cairo_paint(cr);
cairo_destroy(cr);
在第二个函数中,绘制预渲染图像:
cairo_t* cr = gdk_cairo_create(widget->window);
cairo_set_source_surface(cr, buffer_surface, 0, 0);
cairo_paint(cr);
cairo_destroy(cr);
在第三个函数中,绘制一些矢量指示:
cairo_t* cr = gdk_cairo_create(widget->window);
cairo_move_to(cr, xxx, xxx);
cairo_line_to(cr, xxx, xxx);
cairo_line_to(cr, xxx, xxx);
cairo_line_to(cr, xxx, xxx);
......
cairo_stroke(cr);
cairo_destroy(cr);
但是只有第1和第3个函数有效,第2个函数中的图像绘制没有显示:生成的GtkDrawingArea只有中灰色背景和黑色线条。
我确定源图像表面充满了内容,因为我已将其导出到 png 文件并且它确实有内容。为什么它没有显示在 GUI 中?
这是由于 Cairo 图像表面和 GDK 之间的颜色深度不匹配造成的 window。我在 32 位 ARGB 中创建了图像表面,但 window 是 RGB。我将图像表面从ARGB修改为RGB后,一切都解决了。
我正在制作一个 Gtk2 程序,将预先计算的数据热图图像渲染到 GtkDrawingArea。程序一般是这样的:
- 在 Cairo 图像表面生成热图图像;
- 连接 GtkDrawingArea 的公开事件;
- 在暴露回调中,调用了以下函数:
在第一个函数中,将之前的绘图清除为纯灰色:
cairo_t* cr = gdk_cairo_create(widget->window);
cairo_set_source_rgb(cr, 0.5, 0.5, 0.5);
cairo_paint(cr);
cairo_destroy(cr);
在第二个函数中,绘制预渲染图像:
cairo_t* cr = gdk_cairo_create(widget->window);
cairo_set_source_surface(cr, buffer_surface, 0, 0);
cairo_paint(cr);
cairo_destroy(cr);
在第三个函数中,绘制一些矢量指示:
cairo_t* cr = gdk_cairo_create(widget->window);
cairo_move_to(cr, xxx, xxx);
cairo_line_to(cr, xxx, xxx);
cairo_line_to(cr, xxx, xxx);
cairo_line_to(cr, xxx, xxx);
......
cairo_stroke(cr);
cairo_destroy(cr);
但是只有第1和第3个函数有效,第2个函数中的图像绘制没有显示:生成的GtkDrawingArea只有中灰色背景和黑色线条。
我确定源图像表面充满了内容,因为我已将其导出到 png 文件并且它确实有内容。为什么它没有显示在 GUI 中?
这是由于 Cairo 图像表面和 GDK 之间的颜色深度不匹配造成的 window。我在 32 位 ARGB 中创建了图像表面,但 window 是 RGB。我将图像表面从ARGB修改为RGB后,一切都解决了。