[gimp/wip/gradient-edit: 18/35] app: add gimp_gradient_segment_range_merge()
- From: N/A <ell src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp/wip/gradient-edit: 18/35] app: add gimp_gradient_segment_range_merge()
- Date: Fri, 4 Aug 2017 14:51:17 +0000 (UTC)
commit 0f998968a95553473d5d40ae6676f17d8b2906f2
Author: Ell <ell_se yahoo com>
Date: Sun Jul 30 15:11:02 2017 -0400
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(+), 0 deletions(-)
---
diff --git a/app/core/gimpgradient.c b/app/core/gimpgradient.c
index 15a40b0..7bddff0 100644
--- a/app/core/gimpgradient.c
+++ b/app/core/gimpgradient.c
@@ -1792,6 +1792,70 @@ gimp_gradient_segment_range_delete (GimpGradient *gradient,
}
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->type = 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,
GimpGradientSegment *end_seg)
diff --git a/app/core/gimpgradient.h b/app/core/gimpgradient.h
index f9f9987..c550ba1 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,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]