On Tue, 17 Aug 2010 12:26:04 +0100
James Morris <ja...@jwm-art.net> wrote:
> On 17 August 2010 11:23, Chris Vine <ch...@cvine.freeserve.co.uk>
> wrote:
> > Can you avoid redrawing the entire list of rectangles on each expose
> > event?
> 
> Yes this is what I'm hoping. Though I've been a bit mixed up with how
> Cairo and GTK work together.
> 
> > When drawing in an expose event callback, you would normally clip to
> > the rectangle representing the "dirty" area (the area enclosed by
> > event->area.x, event->area.y, event->area.width,
> > event->area.height). You could then only call
> > gdk_window_invalidate_rect() or gdk_window_invalidate_region() on
> > the particular parts of the particular GdkWindow object(s) which
> > need redrawing.
> 
> Right. I think I'm starting to see where I went wrong. Though say it
> is a real expose event (ie not due to the timeout) which has erased
> some rectangles. Do I need to redraw the dirty area with calls to
> cairo, that is, I will still need to maintain a list of rectangles
> that currently exist?

Yes.  You can just clip (mask) the area to be drawn to with something
like:

  cairo_rectangle (cr, event->area.x, event->area.y,
                   event->area.width, event->area.height);
  cairo_clip (cr);

After that you can draw to the cairo surface as normal but areas
outside the clipped area will be masked out and ignored.  I imagine it
would still be more efficient even so to ignore note rectangles which
you know have not been changed if you can (that would I imagine depend
on how complex they are) but I don't think there is any easy means of
determining, in the callback, what has generated the expose event.  In
other words, I don't think you can assume that any particular expose
event is not one generated artificially rather than one called up by
the window manager.  So you may need to examine the co-ordinates of any
one note rectangle with those of the "dirty" area of the event if you
wanted to make the implementation more efficient still.

> What about drawing via cairo to a pixbuf and using that for the (real)
> expose events?

You can convert pixels in pixbuf format to cairo image format, but I
don't see why that would be advantageous in your case. They use
different formats (RGB/RGBA, alpha not pre-multipled, for pixbuf, and
BGR/BGRA, with pre-multiplied alpha, for image surfaces). You would
also need to allow for endianness in converting, because image
surfaces are in 32-bit native endian format.

Draw to the surface directly, if you can, because it saves conversion,
and futzing around with endianness.  That is why gdk provides you with
a cairo context, incorporating a destination surface, for any
GdkDrawable.

I am not an expert on cairo drawing functions.  Others in the list
probably know considerably more.  I just know what I need to know for
the things I write.

Chris


_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to