[cairo] [PATCH] Path clipping
Kristian Høgsberg
krh at bitplanet.net
Mon Jun 13 14:07:03 PDT 2005
Keith Packard wrote:
> On Fri, 2005-06-03 at 15:29 -0400, Kristian Høgsberg wrote:
>
> +struct _cairo_clip_path {
> + unsigned int ref_count;
> + cairo_path_fixed_t path;
> + cairo_fill_rule_t fill_rule;
> + double tolerance;
> + cairo_clip_path_t *prev;
> +};
>
> I think tolerance should not be captured in this structure, rather the
> tolerance should come from the environment in which the clip is used.
> Right?
As discussed in IRC, I was mimicking the behaviour of the surface mask
clipping, where the tolerance setting is used at cairo_clip() time when
tesselating the clipping path. We should probably document
cairo_set_tolerance().
> +_cairo_surface_set_clip_path (cairo_surface_t *surface,
> + cairo_clip_path_t *clip_path,
> + unsigned int serial);
>
> I assume this sets the whole mess at once and avoids having to call
> _cairo_surface_clip_path multiple times? Is this a useful change?
I think it makes for a nice symmetry between
cairo_surface_set_clip_region() and cairo_surface_set_clip_path():
if (gstate->clip.path)
return _cairo_surface_set_clip_path (surface,
gstate->clip.path,
gstate->clip.serial);
if (gstate->clip.region)
return _cairo_surface_set_clip_region (surface,
gstate->clip.region,
gstate->clip.serial);
and the code has to live somewhere... is there a reason not to put the
code in cairo_surface_set_clip_path()?
>
> - if (surface->backend->clip_path) {
> - status = surface->backend->clip_path (surface, NULL);
> +
> + if (surface->backend->intersect_clip_path) {
> + status = surface->backend->intersect_clip_path (surface,
> + NULL,
> + CAIRO_FILL_RULE_WINDING,
> + 0);
>
> and in this case, the call is 'intersect_clip_path' instead of
> 'clip_path'. Is there some need to make the name longer?
'clip' is not a verb here. 'intersect' is the verb, it's the action
performed by the function, 'clip_path' is the object it performs the
action with. It is similar to 'set' and 'clip_region' in 'set_clip_region'.
> And, the '0' at the end is marking tolerance, I think this is probably
> the right place to have tolerance set. I think we can simply fetch it
> from the gstate above and pass it along, right?
Yeah, this would be a good place.
> Oh, and I'd like to see 0.0 for double constants...
Sure. Is this just a stylistic issue or is there some double promotion
issue I'm not aware of?
> Should the backend see the private clip structure so that we don't have
> to pass fill_rule along here?
Is this a problem? There's only four parameters to intersect_clip_path,
and there's a couple of fields in cairo_clip_path_t that the backend has
no use for.
cheers,
Kristian
More information about the cairo
mailing list