cairo_status_t _cairo_path_fixed_init_copy (cairo_path_fixed_t *path, cairo_path_fixed_t *other) { cairo_path_buf_t *buf, *other_buf; _cairo_path_fixed_init (path); path->current_point = other->current_point; path->has_current_point = other->has_current_point; path->has_curve_to = other->has_curve_to; path->last_move_point = other->last_move_point; path->buf_head->num_ops = other->buf_head->num_ops; path->buf_head->num_points = other->buf_head->num_points; memcpy (path->buf_head->op, other->buf_head->op, other->buf_head->num_ops * sizeof (other->buf_head->op[0])); memcpy (path->buf_head->points, other->buf_head->points, other->buf_head->num_points * sizeof (other->buf_head->points[0])); for (other_buf = other->buf_head->next; other_buf; other_buf = other_buf->next) { buf = _cairo_path_buf_create (); if (buf == NULL) { _cairo_path_fixed_fini (path); return CAIRO_STATUS_NO_MEMORY; } memcpy (buf, other_buf, sizeof (cairo_path_buf_t)); _cairo_path_fixed_add_buf (path, buf); } return CAIRO_STATUS_SUCCESS; }
cairo_status_t _cairo_path_fixed_init_copy (cairo_path_fixed_t *path, cairo_path_fixed_t *other) { cairo_path_buf_t *buf, *other_buf; unsigned int num_points, num_ops, buf_size; _cairo_path_fixed_init (path); path->current_point = other->current_point; path->has_current_point = other->has_current_point; path->has_curve_to = other->has_curve_to; path->last_move_point = other->last_move_point; path->buf_head.base.num_ops = other->buf_head.base.num_ops; path->buf_head.base.num_points = other->buf_head.base.num_points; path->buf_head.base.buf_size = other->buf_head.base.buf_size; memcpy (path->buf_head.op, other->buf_head.base.op, other->buf_head.base.num_ops * sizeof (other->buf_head.op[0])); memcpy (path->buf_head.points, other->buf_head.points, other->buf_head.base.num_points * sizeof (other->buf_head.points[0])); num_points = num_ops = 0; for (other_buf = other->buf_head.base.next; other_buf != NULL; other_buf = other_buf->next) { num_ops += other_buf->num_ops; num_points += other_buf->num_points; } buf_size = MAX (num_ops, (num_points + 1) / 2); if (buf_size) { buf = _cairo_path_buf_create (buf_size); if (buf == NULL) { _cairo_path_fixed_fini (path); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } for (other_buf = other->buf_head.base.next; other_buf != NULL; other_buf = other_buf->next) { memcpy (buf->op + buf->num_ops, other_buf->op, other_buf->num_ops * sizeof (buf->op[0])); buf->num_ops += other_buf->num_ops; memcpy (buf->points + buf->num_points, other_buf->points, other_buf->num_points * sizeof (buf->points[0])); buf->num_points += other_buf->num_points; } _cairo_path_fixed_add_buf (path, buf); } return CAIRO_STATUS_SUCCESS; }
static cairo_status_t _cairo_path_fixed_add (cairo_path_fixed_t *path, cairo_path_op_t op, cairo_point_t *points, int num_points) { cairo_path_buf_t *buf = path->buf_tail; if (buf->num_ops + 1 > buf->buf_size || buf->num_points + num_points > 2 * buf->buf_size) { buf = _cairo_path_buf_create (buf->buf_size * 2); if (buf == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); _cairo_path_fixed_add_buf (path, buf); } _cairo_path_buf_add_op (buf, op); _cairo_path_buf_add_points (buf, points, num_points); return CAIRO_STATUS_SUCCESS; }
static cairo_status_t _cairo_path_fixed_add (cairo_path_fixed_t *path, cairo_path_op_t op, cairo_point_t *points, int num_points) { if ((unsigned int) path->buf_tail->num_ops + 1 > CAIRO_PATH_BUF_SIZE || (unsigned int) path->buf_tail->num_points + num_points > CAIRO_PATH_BUF_SIZE) { cairo_path_buf_t *buf; buf = _cairo_path_buf_create (); if (buf == NULL) return CAIRO_STATUS_NO_MEMORY; _cairo_path_fixed_add_buf (path, buf); } _cairo_path_buf_add_op (path->buf_tail, op); _cairo_path_buf_add_points (path->buf_tail, points, num_points); return CAIRO_STATUS_SUCCESS; }
cairo_status_t _cairo_path_fixed_init_copy (cairo_path_fixed_t *path, const cairo_path_fixed_t *other) { cairo_path_buf_t *buf, *other_buf; unsigned int num_points, num_ops; VG (VALGRIND_MAKE_MEM_UNDEFINED (path, sizeof (cairo_path_fixed_t))); cairo_list_init (&path->buf.base.link); path->buf.base.op = path->buf.op; path->buf.base.points = path->buf.points; path->buf.base.size_ops = ARRAY_LENGTH (path->buf.op); path->buf.base.size_points = ARRAY_LENGTH (path->buf.points); path->current_point = other->current_point; path->last_move_point = other->last_move_point; path->has_last_move_point = other->has_last_move_point; path->has_current_point = other->has_current_point; path->has_curve_to = other->has_curve_to; path->is_rectilinear = other->is_rectilinear; path->maybe_fill_region = other->maybe_fill_region; path->is_empty_fill = other->is_empty_fill; path->extents = other->extents; path->buf.base.num_ops = other->buf.base.num_ops; path->buf.base.num_points = other->buf.base.num_points; memcpy (path->buf.op, other->buf.base.op, other->buf.base.num_ops * sizeof (other->buf.op[0])); memcpy (path->buf.points, other->buf.points, other->buf.base.num_points * sizeof (other->buf.points[0])); num_points = num_ops = 0; for (other_buf = cairo_path_buf_next (cairo_path_head (other)); other_buf != cairo_path_head (other); other_buf = cairo_path_buf_next (other_buf)) { num_ops += other_buf->num_ops; num_points += other_buf->num_points; } if (num_ops) { buf = _cairo_path_buf_create (num_ops, num_points); if (unlikely (buf == NULL)) { _cairo_path_fixed_fini (path); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } for (other_buf = cairo_path_buf_next (cairo_path_head (other)); other_buf != cairo_path_head (other); other_buf = cairo_path_buf_next (other_buf)) { memcpy (buf->op + buf->num_ops, other_buf->op, other_buf->num_ops * sizeof (buf->op[0])); buf->num_ops += other_buf->num_ops; memcpy (buf->points + buf->num_points, other_buf->points, other_buf->num_points * sizeof (buf->points[0])); buf->num_points += other_buf->num_points; } _cairo_path_fixed_add_buf (path, buf); } return CAIRO_STATUS_SUCCESS; }