From d710773abaa58b6012be62307a08bed2a61ce979 Mon Sep 17 00:00:00 2001 From: Ell Date: Sun, 30 Jul 2017 15:11:02 -0400 Subject: [PATCH] app: add gimp_gradient_segment_range_merge() ... which merges a segment range into a single segment, that spans the entire range, and has the same endpoint colors. The merged segment's midpoint is at its center, and its blend function and coloring type are those of the range's segments if they're uniform, or the default ones otherwise. --- app/core/gimpgradient.c | 64 +++++++++++++++++++++++++++++++++++++++++ app/core/gimpgradient.h | 6 ++++ 2 files changed, 70 insertions(+) diff --git a/app/core/gimpgradient.c b/app/core/gimpgradient.c index 15a40b0cb2..4d99a8e730 100644 --- a/app/core/gimpgradient.c +++ b/app/core/gimpgradient.c @@ -1791,6 +1791,70 @@ gimp_gradient_segment_range_delete (GimpGradient *gradient, *final_end_seg = end_seg; } +void +gimp_gradient_segment_range_merge (GimpGradient *gradient, + GimpGradientSegment *start_seg, + GimpGradientSegment *end_seg, + GimpGradientSegment **final_start_seg, + GimpGradientSegment **final_end_seg) +{ + GimpGradientSegment *seg; + + g_return_if_fail (GIMP_IS_GRADIENT (gradient)); + + if (! end_seg) + end_seg = gimp_gradient_segment_get_last (start_seg); + + gimp_data_freeze (GIMP_DATA (gradient)); + + /* Copy the end segment's right position and color to the start segment */ + + start_seg->right = end_seg->right; + start_seg->right_color_type = end_seg->right_color_type; + start_seg->right_color = end_seg->right_color; + + /* Center the start segment's midpoint */ + + start_seg->middle = (start_seg->left + start_seg->right) / 2.0; + + /* Remove range segments past the start segment from the segment list */ + + start_seg->next = end_seg->next; + + if (start_seg->next) + start_seg->next->prev = start_seg; + + /* Merge the range's blend function and coloring type, and free the rest of + * the segments. + */ + + seg = end_seg; + + while (seg != start_seg) + { + GimpGradientSegment *prev = seg->prev; + + /* If the blend function and/or coloring type aren't uniform, reset them. */ + + if (seg->type != start_seg->type) + start_seg->type = GIMP_GRADIENT_SEGMENT_LINEAR; + + if (seg->color != start_seg->color) + start_seg->color = GIMP_GRADIENT_SEGMENT_RGB; + + gimp_gradient_segment_free (seg); + + seg = prev; + } + + if (final_start_seg) + *final_start_seg = start_seg; + if (final_end_seg) + *final_end_seg = start_seg; + + gimp_data_thaw (GIMP_DATA (gradient)); +} + void gimp_gradient_segment_range_recenter_handles (GimpGradient *gradient, GimpGradientSegment *start_seg, diff --git a/app/core/gimpgradient.h b/app/core/gimpgradient.h index f9f9987f0e..c550ba10e1 100644 --- a/app/core/gimpgradient.h +++ b/app/core/gimpgradient.h @@ -265,6 +265,12 @@ void gimp_gradient_segment_range_delete (GimpGradient *gradient, GimpGradientSegment **final_start_seg, GimpGradientSegment **final_end_seg); +void gimp_gradient_segment_range_merge (GimpGradient *gradient, + GimpGradientSegment *start_seg, + GimpGradientSegment *end_seg, + GimpGradientSegment **final_start_seg, + GimpGradientSegment **final_end_seg); + void gimp_gradient_segment_range_recenter_handles (GimpGradient *gradient, GimpGradientSegment *start_seg,