Re: Recording final move_to in copy_path()

Behdad Esfahbod <[email protected]>
Newsgroups gmane.comp.lib.cairo
Message-ID <[email protected]>
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).

Does this one look better?

diff --git a/src/cairo-path-fixed.c b/src/cairo-path-fixed.c
index 14913fd..390b43e 100644
--- a/src/cairo-path-fixed.c
+++ b/src/cairo-path-fixed.c
@@ -815,14 +815,16 @@ _cairo_path_fixed_interpret (const cairo_path_fixed_t
          *path,
                             void                               *closure)
 {
     const cairo_path_buf_t *buf;
-    cairo_status_t status;
+    cairo_path_op_t last_op = CAIRO_PATH_OP_CLOSE_PATH;

     cairo_path_foreach_buf_start (buf, path) {
        const cairo_point_t *points = buf->points;
        unsigned int i;
+       cairo_status_t status;

        for (i = 0; i < buf->num_ops; i++) {
-           switch (buf->op[i]) {
+           last_op = buf->op[i];
+           switch (last_op) {
            case CAIRO_PATH_OP_MOVE_TO:
                status = (*move_to) (closure, &points[0]);
                points += 1;
@@ -847,6 +849,9 @@ _cairo_path_fixed_interpret (const cairo_path_fixed_t
          *path,
        }
     } cairo_path_foreach_buf_end (buf, path);

+    if (path->has_current_point && last_op == CAIRO_PATH_OP_CLOSE_PATH)
+       return (*move_to) (closure, &path->current_point);
+
     return CAIRO_STATUS_SUCCESS;
 }

b
-- 
cairo mailing list
[email protected]
http://lists.cairographics.org/mailman/listinfo/cairo
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.