51
51
#include "gimp-intl.h"
53
static GimpLayer * gimp_image_merge_layers (GimpImage *image,
56
GimpMergeType merge_type,
57
const gchar *undo_desc);
54
60
/* public functions */
57
gimp_image_merge_visible_layers (GimpImage *gimage,
63
gimp_image_merge_visible_layers (GimpImage *image,
58
64
GimpContext *context,
59
GimpMergeType merge_type)
65
GimpMergeType merge_type,
66
gboolean discard_invisible)
62
69
GSList *merge_list = NULL;
70
GSList *invisible_list = NULL;
63
71
gboolean had_floating_sel = FALSE;
64
72
GimpLayer *layer = NULL;
66
g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL);
74
g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
67
75
g_return_val_if_fail (GIMP_IS_CONTEXT (context), NULL);
69
77
/* if there's a floating selection, anchor it */
70
if (gimp_image_floating_sel (gimage))
78
if (gimp_image_floating_sel (image))
72
floating_sel_anchor (gimage->floating_sel);
80
floating_sel_anchor (image->floating_sel);
73
81
had_floating_sel = TRUE;
76
for (list = GIMP_LIST (gimage->layers)->list;
84
for (list = GIMP_LIST (image->layers)->list;
78
86
list = g_list_next (list))
80
layer = (GimpLayer *) list->data;
82
90
if (gimp_item_get_visible (GIMP_ITEM (layer)))
83
merge_list = g_slist_append (merge_list, layer);
92
merge_list = g_slist_append (merge_list, layer);
94
else if (discard_invisible)
96
invisible_list = g_slist_append (invisible_list, layer);
86
if (merge_list && merge_list->next)
88
gimp_set_busy (gimage->gimp);
90
layer = gimp_image_merge_layers (gimage, merge_list, context, merge_type,
102
const gchar *undo_desc = _("Merge Visible Layers");
104
gimp_set_busy (image->gimp);
108
gimp_image_undo_group_start (image,
109
GIMP_UNDO_GROUP_IMAGE_LAYERS_MERGE,
113
layer = gimp_image_merge_layers (image, merge_list, context, merge_type,
91
114
_("Merge Visible Layers"));
92
115
g_slist_free (merge_list);
94
gimp_unset_busy (gimage->gimp);
121
for (list = invisible_list; list; list = g_slist_next (list))
122
gimp_image_remove_layer (image, list->data);
124
gimp_image_undo_group_end (image);
125
g_slist_free (invisible_list);
129
gimp_unset_busy (image->gimp);
100
g_slist_free (merge_list);
102
/* If there was a floating selection, we have done something.
103
No need to warn the user. Return the active layer instead */
104
if (had_floating_sel)
105
return gimage->active_layer;
107
g_message (_("Not enough visible layers for a merge. "
108
"There must be at least two."));
134
return image->active_layer;
115
gimp_image_flatten (GimpImage *gimage,
138
gimp_image_flatten (GimpImage *image,
116
139
GimpContext *context)
119
142
GSList *merge_list = NULL;
120
143
GimpLayer *layer;
122
g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL);
145
g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
123
146
g_return_val_if_fail (GIMP_IS_CONTEXT (context), NULL);
125
gimp_set_busy (gimage->gimp);
148
gimp_set_busy (image->gimp);
127
150
/* if there's a floating selection, anchor it */
128
if (gimp_image_floating_sel (gimage))
129
floating_sel_anchor (gimage->floating_sel);
151
if (gimp_image_floating_sel (image))
152
floating_sel_anchor (image->floating_sel);
131
for (list = GIMP_LIST (gimage->layers)->list;
154
for (list = GIMP_LIST (image->layers)->list;
133
156
list = g_list_next (list))
135
layer = (GimpLayer *) list->data;
137
160
if (gimp_item_get_visible (GIMP_ITEM (layer)))
138
161
merge_list = g_slist_append (merge_list, layer);
141
layer = gimp_image_merge_layers (gimage, merge_list, context,
164
layer = gimp_image_merge_layers (image, merge_list, context,
142
165
GIMP_FLATTEN_IMAGE, _("Flatten Image"));
143
166
g_slist_free (merge_list);
145
gimp_image_alpha_changed (gimage);
168
gimp_image_alpha_changed (image);
147
gimp_unset_busy (gimage->gimp);
170
gimp_unset_busy (image->gimp);
153
gimp_image_merge_down (GimpImage *gimage,
176
gimp_image_merge_down (GimpImage *image,
154
177
GimpLayer *current_layer,
155
178
GimpContext *context,
156
179
GimpMergeType merge_type)
177
200
layer_list && !merge_list;
178
201
layer_list = g_list_next (layer_list))
180
layer = (GimpLayer *) layer_list->data;
203
layer = layer_list->data;
182
205
if (gimp_item_get_visible (GIMP_ITEM (layer)))
183
206
merge_list = g_slist_append (NULL, layer);
188
merge_list = g_slist_prepend (merge_list, current_layer);
190
gimp_set_busy (gimage->gimp);
192
layer = gimp_image_merge_layers (gimage, merge_list, context, merge_type,
209
merge_list = g_slist_prepend (merge_list, current_layer);
211
gimp_set_busy (image->gimp);
213
layer = gimp_image_merge_layers (image, merge_list, context, merge_type,
215
g_slist_free (merge_list);
217
gimp_unset_busy (image->gimp);
222
/* merging vectors */
225
gimp_image_merge_visible_vectors (GimpImage *image)
228
GSList *merge_list = NULL;
229
GSList *cur_item = NULL;
230
GimpVectors *vectors = NULL;
231
GimpVectors *target_vectors = NULL;
235
g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
237
for (list = GIMP_LIST (image->vectors)->list;
239
list = g_list_next (list))
241
vectors = list->data;
243
if (gimp_item_get_visible (GIMP_ITEM (vectors)))
244
merge_list = g_slist_append (merge_list, vectors);
247
if (merge_list && merge_list->next)
249
gimp_set_busy (image->gimp);
251
gimp_image_undo_group_start (image, GIMP_UNDO_GROUP_IMAGE_VECTORS_MERGE,
252
_("Merge Visible Paths"));
254
cur_item = merge_list;
255
vectors = GIMP_VECTORS (cur_item->data);
257
name = g_strdup (gimp_object_get_name (GIMP_OBJECT (vectors)));
258
target_vectors = GIMP_VECTORS (
259
gimp_item_duplicate (GIMP_ITEM (vectors),
262
pos = gimp_image_get_vectors_index (image, vectors);
263
gimp_image_remove_vectors (image, vectors);
264
cur_item = cur_item->next;
268
vectors = GIMP_VECTORS (cur_item->data);
269
gimp_vectors_add_strokes (vectors, target_vectors);
270
gimp_image_remove_vectors (image, vectors);
272
cur_item = g_slist_next (cur_item);
275
gimp_object_take_name (GIMP_OBJECT (target_vectors), name);
194
277
g_slist_free (merge_list);
196
gimp_unset_busy (gimage->gimp);
279
gimp_image_add_vectors (image, target_vectors, pos);
280
gimp_unset_busy (image->gimp);
282
gimp_image_undo_group_end (image);
284
return target_vectors;
202
g_message (_("There are not enough visible layers for a merge down."));
288
gimp_message (image->gimp, NULL, GIMP_MESSAGE_WARNING,
289
_("Not enough visible paths for a merge. "
290
"There must be at least two."));
208
gimp_image_merge_layers (GimpImage *gimage,
296
/* private functions */
299
gimp_image_merge_layers (GimpImage *image,
209
300
GSList *merge_list,
210
301
GimpContext *context,
211
302
GimpMergeType merge_type,
332
423
GIMP_ITEM (merge_layer)->offset_y = y1;
334
425
/* get the background for compositing */
335
gimp_image_get_background (gimage, GIMP_DRAWABLE (merge_layer),
426
gimp_image_get_background (image, context,
427
gimp_drawable_type (GIMP_DRAWABLE (merge_layer)),
338
430
/* init the pixel region */
339
431
pixel_region_init (&src1PR,
340
gimp_drawable_data (GIMP_DRAWABLE (merge_layer)),
432
gimp_drawable_get_tiles (GIMP_DRAWABLE (merge_layer)),
342
gimage->width, gimage->height,
434
image->width, image->height,
345
437
/* set the region to the background color */
428
520
/* configure the pixel regions */
429
521
pixel_region_init (&src1PR,
430
gimp_drawable_data (GIMP_DRAWABLE (merge_layer)),
522
gimp_drawable_get_tiles (GIMP_DRAWABLE (merge_layer)),
431
523
(x3 - x1), (y3 - y1), (x4 - x3), (y4 - y3),
433
525
pixel_region_init (&src2PR,
434
gimp_drawable_data (GIMP_DRAWABLE (layer)),
526
gimp_drawable_get_tiles (GIMP_DRAWABLE (layer)),
435
527
(x3 - off_x), (y3 - off_y),
436
528
(x4 - x3), (y4 - y3),
439
531
if (layer->mask && layer->mask->apply_mask)
441
pixel_region_init (&maskPR,
442
gimp_drawable_data (GIMP_DRAWABLE (layer->mask)),
443
(x3 - off_x), (y3 - off_y),
444
(x4 - x3), (y4 - y3),
535
tiles = gimp_drawable_get_tiles (GIMP_DRAWABLE (layer->mask));
537
pixel_region_init (&maskPR, tiles,
538
(x3 - off_x), (y3 - off_y), (x4 - x3), (y4 - y3),
473
568
/* if the type is flatten, remove all the remaining layers */
474
569
if (merge_type == GIMP_FLATTEN_IMAGE)
476
list = GIMP_LIST (gimage->layers)->list;
571
list = GIMP_LIST (image->layers)->list;
479
layer = (GimpLayer *) list->data;
481
576
list = g_list_next (list);
482
gimp_image_remove_layer (gimage, layer);
577
gimp_image_remove_layer (image, layer);
485
gimp_image_add_layer (gimage, merge_layer, position);
580
gimp_image_add_layer (image, merge_layer, position);
489
/* Add the layer to the gimage */
490
gimp_image_add_layer (gimage, merge_layer,
491
gimp_container_num_children (gimage->layers) - position + 1);
584
/* Add the layer to the image */
585
gimp_image_add_layer (image, merge_layer,
586
gimp_container_num_children (image->layers) - position + 1);
494
589
/* set the name after the original layers have been removed so we
495
590
* don't end up with #2 appended to the name
497
gimp_object_set_name (GIMP_OBJECT (merge_layer), name);
592
gimp_object_take_name (GIMP_OBJECT (merge_layer), name);
500
594
gimp_item_set_visible (GIMP_ITEM (merge_layer), TRUE, TRUE);
502
596
/* End the merge undo group */
503
gimp_image_undo_group_end (gimage);
597
gimp_image_undo_group_end (image);
505
599
gimp_drawable_update (GIMP_DRAWABLE (merge_layer),
510
604
return merge_layer;
513
/* merging vectors */
516
gimp_image_merge_visible_vectors (GimpImage *gimage)
519
GSList *merge_list = NULL;
520
GSList *cur_item = NULL;
521
GimpVectors *vectors = NULL;
522
GimpVectors *target_vectors = NULL;
526
g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL);
528
for (list = GIMP_LIST (gimage->vectors)->list;
530
list = g_list_next (list))
532
vectors = (GimpVectors *) list->data;
534
if (gimp_item_get_visible (GIMP_ITEM (vectors)))
535
merge_list = g_slist_append (merge_list, vectors);
538
if (merge_list && merge_list->next)
540
gimp_set_busy (gimage->gimp);
542
gimp_image_undo_group_start (gimage, GIMP_UNDO_GROUP_IMAGE_VECTORS_MERGE,
543
_("Merge Visible Paths"));
545
cur_item = merge_list;
546
vectors = GIMP_VECTORS (cur_item->data);
548
name = g_strdup (gimp_object_get_name (GIMP_OBJECT (vectors)));
549
target_vectors = GIMP_VECTORS (
550
gimp_item_duplicate (GIMP_ITEM (vectors),
553
pos = gimp_image_get_vectors_index (gimage, vectors);
554
gimp_image_remove_vectors (gimage, vectors);
555
cur_item = cur_item->next;
559
vectors = GIMP_VECTORS (cur_item->data);
560
gimp_vectors_add_strokes (vectors, target_vectors);
561
gimp_image_remove_vectors (gimage, vectors);
563
cur_item = g_slist_next (cur_item);
566
gimp_object_set_name (GIMP_OBJECT (target_vectors), name);
569
g_slist_free (merge_list);
571
gimp_image_add_vectors (gimage, target_vectors, pos);
572
gimp_unset_busy (gimage->gimp);
574
gimp_image_undo_group_end (gimage);
576
return target_vectors;
580
g_message (_("Not enough visible paths for a merge. "
581
"There must be at least two."));