Search code examples
pythongtk3

Static graphics in Gtk DrawingArea


I want to draw some static and some dynamic graphics on Gtk drawing area. In Gtk drawing area, on every call of queue_draw, it clears all the graphics already drawn, and for complex graphics this is very time consuming.

Is there a way that I specifically delete some graphics, and add a few new graphics while the already drawn graphics remains undeleted?

for example in image1, I want to keep black line unchanged unless drawing area window size changes, I want to keep 3 out of 5 red spots and add some new blue spots so that new image looks like image2.

If this question is already answered please share link.


Solution

  • I know 2 ways to solve your problem.

    1. Store paths. You can draw something (with line_to, arc, etc) on an empty cairo_t, then call cairo_copy_path and store that path somewhere. On next "draw" you should call cairo_append_path to apply that path.

    2. You can store entire cairo surfaces. For example, create cairo_image_surface, fill it and then use it like this:

      draw_surface (cairo_surface_t *src,
                    cairo_t         *dst,
                    gdouble          x,
                    gdouble          y)
      {
        cairo_surface_mark_dirty (src);
        cairo_save (dst);
        cairo_translate (dst, x, y);
        cairo_set_source_surface (dst, src, 0, 0);
        cairo_paint (dst);
        cairo_restore (dst);
      }