[cairo] global clip for a cairo context

Uli Schlachter psychon at znc.in
Sat Jan 2 06:25:53 PST 2016


Hi,

Am 02.01.2016 um 15:11 schrieb Enrico Weigelt, metux IT consult:
> is it possible to set a global clip onto an cairo context, which
> remains for the lifetime of the context (or until explicitly reset),
> so it will never ever paint outside these boundaries ?
> 
> I'm looking for a way to achieve clipping in my tiny widget toolkit.
> The individual widget's paint callback should get passed a cairo_t*,
> representing it's paint area, just like if it had its own surface.

sorry, but what's the difference to a "non-global" clip?

The only ways to unset the clip are through cairo_reset_clip() (the "explicit
reset") and through cairo_restore() (which restores the clip of the
corresponding cairo_save()).

So I'd guess that something like this should work for you:

  cairo_rectangle(cr, widget->x, widget->y, widget->width, widget->height);
  cairo_clip(cr);
  widget->paint_callback(cr)
  cairo_reset_clip(cr);

Cheers,
Uli

P.S.: Actually, I'd do something like this:

  cairo_save(cr);
  cairo_translate(cr, widget->x, widget->y);
  cairo_rectangle(cr, 0, 0, widget->width, widget->height);
  cairo_clip(cr);
  widget->paint_callback(cr, widget->width, widget->height);
  cairo_restore(cr);

This "feels nicer", widget can just assume that their top-left corner is at
point (0,0) and it also does the right thing when recursion occurs.
-- 
“Cold. Cold. Cold. Cold. Cold. Cold. Cold. Cold. Cold. Cold.” – Anna


More information about the cairo mailing list