[cairo] Recording final move_to in copy_path()

Uli Schlachter psychon at znc.in
Wed Jan 15 11:59:02 PST 2014


On 15.01.2014 04:17, Behdad Esfahbod wrote:
> Currently if one does cairo_copy_path(), any final move_to in the path is not
> copied over.  This is unfortunate since copying the path and applying it later
> does not leave the current point the way it was before.
> Unless there's any objections, I'm going to push the following patch that
> fixes this:
> diff --git a/src/cairo-path-fixed.c b/src/cairo-path-fixed.c
> index 14913fd..4143307 100644
> --- a/src/cairo-path-fixed.c
> +++ b/src/cairo-path-fixed.c
> @@ -847,6 +847,9 @@ _cairo_path_fixed_interpret (const cairo_path_fixed_t
>         }
>      } cairo_path_foreach_buf_end (buf, path);
> +    if (path->has_current_point)
> +       return (*move_to) (closure, &path->current_point);
> +
>  }

This does not do what you want it to do, because cairo_move_to() implicitly
calls cairo_new_sub_path() (see _cairo_path_fixed_move_to()). This means that
e.g. no line join will be applied if the path is continued.

Thus, I guess you will need to some more complicated patch for this. Something
that checks path->has_current_point and also checks if patch->last_move_point ==
path->current_point (this is just a quick idea, no idea if it is correct).

> I know I should be adding a test for this, but...

But? :-P

Bruce Schneier can read and understand Perl programs.

More information about the cairo mailing list