[cairo] Re: new clipping change patch

Owen Taylor otaylor at redhat.com
Tue May 24 11:48:18 PDT 2005


On Mon, 2005-05-23 at 23:28 -0700, Keith Packard wrote:
> After our IRC discussion today, I went and rewrote the clipping code
> again to pull most of the clipping work into the gstate where it belongs.
> 
> The surface now just reflects state down to the backend, the only thing
> retained is the serial number for the clipping that was set.
> 
> Extents for the clip are kept up in the gstate; the surface will only
> return the extents for the entire object.
> 
> My email is dead until tomorrow sometime; bad things happened to my 
> home box this week and my ISP disabled my line as a result...
> 
> Patch available at http:/freedesktop.org/~keithp/cairo-serialclip-2.diff
> 
> I should be back on-line sometime tomorrow; failing that, I'll rework
> email so I can get at it somehow.

Hopefully this mail will get through to you one way or the other.

I like this version of the patch a lot more than the last one. 

Various comments:

 * I'm not sure the name change cairo_surface_set_clip_region() =>
   cairo_surface_clip_region() makes sense. It's still a setter...
   there are no plans to make clip_region() intersect with the
   current clip region.

 * The code goes through various gymnastics to make sure that when
   restoring to a previous clip serial, the same serial is used.
   I don't see why this is useful. I'd expect 
   _cairo_gstate_set_clip() to look like:

    if (_cairo_surface_get_clip_serial (surface) == gstate->clip.serial)
      return CAIRO_STATUS_SUCCESS;

    /* reestablish the clip */

    gstate->clip.serial = _cairo_surface_get_clip_serial (surface);

   And leave all updating of the serial internal to the surface.

   The "no clip gets 0 serial" optimization can still be done this
   way.

 * The duplication of rectangle intersection code one my time in
   _cairo_gstate_get_clip_extents() is painful. That really should
   be split out somewhere. (boolean return: FALSE on empty intersection)

   Or alternatively, for get_clip_extents(), do the intersection
   on regions not rectangles.

 * cairo-gstate.c:_get_mask_extents() immediately intersects the 
   result of get_clip_extents() with the clip region (as a region).
   Which is duplication one way or the other.
 
 * I don't understand the logic in _cairo_gstate_set_target_surface()
   calling _cairo_surface_get_next_clip_serial().

 * _cairo_xlib_surface_ensure_picture (surface, &surface->&src_picture);

  Maybe just split that into ensure_src_picture() and 
  ensure_dst_picture()?

 * In _cairo_xlib_surface_set_attributes(), the call to ensure_picture()
   is inserted between a call that sets status and the subsequent
   check of status. It should be inside the if (CAIRO_OK (status))

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: This is a digitally signed message part
Url : http://lists.freedesktop.org/archives/cairo/attachments/20050524/d3f6ef6b/attachment.pgp


More information about the cairo mailing list