From 899d28f83738f9471f00c1a0b5ac10abf6b54db8 Mon Sep 17 00:00:00 2001 From: Nicola Fontana Date: Sat, 29 Aug 2009 03:05:55 +0200 Subject: [PATCH] [AdgSegment] Added adg_segment_deep_copy() A new API to do a deep copy of a segment, that is copying the cairo data instead of the bare struct. The destination segment should be compatible with the original one, that is their num_data must be equals. --- adg/adg-segment.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ adg/adg-segment.h | 2 ++ 2 files changed, 50 insertions(+) diff --git a/adg/adg-segment.c b/adg/adg-segment.c index 1ed67b4a..212ed070 100644 --- a/adg/adg-segment.c +++ b/adg/adg-segment.c @@ -115,3 +115,51 @@ adg_segment_deep_dup(const AdgSegment *segment) return dest; } + +/** + * adg_segment_deep_copy: + * @segment: an #AdgSegment structure + * @src: the source segment to copy + * + * Makes a deep copy of @src to @segment. For a shallow copy, check out + * the cpml_segment_copy() API provided by the CPML library. + * + * This could seem a somewhat unusual operation because @segment should + * be "compatible" with @src: it is expected that they have the same + * num_data value. Anyway, it is convenient + * in some situation, such as when restoring the original data from a + * deep duplicated source: + * + * |[ + * AdgSegment *backup; + * + * backup = adg_segment_deep_dup(&segment); + * // Now &segment can be modified + * ... + * adg_segment_deep_copy(&segment, backup); + * g_free(backup); + * ]| + * + * The struct fields of @segment are left untouched and used only to + * check if it is compatible with @src. + * + * Returns: @segment + **/ +AdgSegment * +adg_segment_deep_copy(AdgSegment *segment, const AdgSegment *src) +{ + size_t n; + + g_return_val_if_fail(segment != NULL, segment); + g_return_val_if_fail(src != NULL, segment); + g_return_val_if_fail(segment->num_data == src->num_data, segment); + + if (src->num_data <= 0) + return segment; + + n = sizeof(cairo_path_data_t) * segment->num_data; + + memcpy(segment->data, src->data, n); + + return segment; +} diff --git a/adg/adg-segment.h b/adg/adg-segment.h index 0330aa68..514e77b7 100644 --- a/adg/adg-segment.h +++ b/adg/adg-segment.h @@ -36,6 +36,8 @@ typedef CpmlSegment AdgSegment; GType adg_segment_get_type (void) G_GNUC_CONST; AdgSegment * adg_segment_dup (const AdgSegment *segment); AdgSegment * adg_segment_deep_dup (const AdgSegment *segment); +AdgSegment * adg_segment_deep_copy (AdgSegment *segment, + const AdgSegment *src); G_END_DECLS -- 2.11.4.GIT