我有一个程序收集随时间变化的数据。我使用用Gtk3编写的程序实时显示数据。在“渲染”功能中,数据在屏幕外表面上绘制,然后在曝光事件中复制到绘图区域表面。
这保留了之前渲染操作的曲面,我想要做的是在右侧绘制新数据之前将图像向左移动一个步长。净效果应该是向左滚动的图像,新数据出现在右边缘。
到目前为止,我的尝试是创建一个新的曲面,使用旧曲面作为新曲面的源,并使用移位绘制它,然后使用类似的几个命令将新曲面绘制回原始曲面,在添加新数据之前。
它有点工作,但是当它向左移动时图像变得模糊,背景白色消失。
有没有办法让它保持清晰并实现我想要实现的目标?
BTW,我正在开发GNU / Linux,但该程序也可以在Windows上构建和运行。詹姆斯。
//Cairo context for the existing surface. cr = cairo_create (xy_surface); //create a similar surface to the existing surface cairo_surface_t *tmp_surf = cairo_surface_create_similar(xy_surface, CAIRO_CONTENT_COLOR, width-2, height); //create cairo context for the new surface cairo_t *tmp_cr = cairo_create (tmp_surf); source_x = ((gdouble)width * N_SAMPLES / sweep_rate) - 2; dest_x = 0.0; //Set the drawing source for the new surface to be the old surface cairo_set_source_surface (tmp_cr, xy_surface, dest_x - source_x, 0.0); cairo_rectangle (tmp_cr, dest_x, 0, width - 2 - source_x, height); cairo_set_operator(tmp_cr, CAIRO_OPERATOR_SOURCE); cairo_fill (tmp_cr); cairo_destroy(tmp_cr); //clear the existing surface cairo_set_source_rgb(cr, 1, 1, 1); cairo_paint(cr); cairo_set_operator(cr, CAIRO_OPERATOR_ATOP); cairo_set_source_surface(cr, tmp_surf, 0, 0); cairo_paint(cr); cairo_surface_destroy(tmp_surf);
答案 0 :(得分:4)
如果width
不均匀,您可以获得表面原点的.5
值,这意味着左右像素(向上舍入,向下舍入)将根据像素邻居的颜色部分绘制你的表面。
只需确保source_x
没有小数位,即在使用前执行rint (source_x)
。