[cairo] Recording final move_to in copy_path()

Behdad Esfahbod behdad at behdad.org
Wed Jan 15 19:26:42 PST 2014


On 14-01-16 03:59 AM, Uli Schlachter wrote:
> Hi,
> 
> 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);
>> +
>>      return CAIRO_STATUS_SUCCESS;
>>  }
> 
> 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).

Ah, good catch.  Thanks!  What about path->has_current_point and last_op ==
close_path?


>> I know I should be adding a test for this, but...
> 
> But? :-P

Was checking to see if any maintainer is paying attention ;).  Will add.

-- 
behdad
http://behdad.org/


More information about the cairo mailing list